package cc.flyflow.biz.service.impl;
import cc.flyflow.biz.api.ApiStrategyFactory;
import cc.flyflow.biz.constants.ProcessInstanceRecordStatusEnum;
import cc.flyflow.biz.entity.Process;
import cc.flyflow.biz.entity.*;
import cc.flyflow.biz.service.*;
import cc.flyflow.biz.utils.CoreHttpUtil;
import cc.flyflow.biz.vo.FormGroupVo;
import cc.flyflow.biz.vo.ProcessDataQueryVO;
import cc.flyflow.biz.vo.ProcessInstanceCopyVo;
import cc.flyflow.biz.vo.ProcessInstanceRecordVO;
import cc.flyflow.common.constants.NodeUserTypeEnum;
import cc.flyflow.common.constants.ProcessInstanceConstant;
import cc.flyflow.common.dto.*;
import cc.flyflow.common.dto.flow.FormItemVO;
import cc.flyflow.common.dto.flow.Node;
import cc.flyflow.common.dto.flow.node.parent.SuperUserRootNode;
import cc.flyflow.common.dto.third.DeptDto;
import cc.flyflow.common.dto.third.UserDto;
import cc.flyflow.common.service.biz.IRemoteService;
import cc.flyflow.common.utils.JsonUtil;
import cc.flyflow.common.utils.TenantUtil;
import cn.dev33.satoken.stp.StpUtil;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.lang.Dict;
import cn.hutool.core.util.StrUtil;
import cn.hutool.extra.spring.SpringUtil;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.github.yulichang.toolkit.JoinWrappers;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.*;
import java.util.stream.Collectors;
@Service
@Slf4j
public class CombinationGroupServiceImpl implements ICombinationGroupService {
@Resource
private IProcessGroupService processGroupService;
@Resource
private IUserService userService;
@Resource
private IDeptUserService deptUserService;
@Resource
private IProcessMainService processMainService;
@Resource
private IProcessService processService;
@Resource
private IProcessStarterService processStarterService;
@Resource
private IRemoteService remoteService;
@Resource
private IProcessInstanceRecordService processInstanceRecordService;
@Resource
private IProcessNodeDataService processNodeDataService;
@Resource
private IProcessInstanceCopyService processCopyService;
/**
* 根据部门id集合和角色id集合 获取用户列表
*
* @param deptIdList 部门id集合
* @param roleIdList 角色key集合
* @return
*/
@Override
public R<List<String>> queryUserListByDeptIdListAndRoleIdList(List<String> deptIdList, List<String> roleIdList) {
MPJLambdaWrapper<User> wrapper = JoinWrappers.lambda(User.class)
.distinct()
.select(User::getId);
if (CollUtil.isNotEmpty(deptIdList)) {
wrapper.innerJoin(DeptUser.class, DeptUser::getUserId, User::getId)
.in(DeptUser::getDeptId, deptIdList);
}
if (CollUtil.isNotEmpty(roleIdList)) {
wrapper.innerJoin(UserRole.class, UserRole::getUserId, User::getId)
.in(UserRole::getRoleId, roleIdList);
}
List<String> userIdList = userService.selectJoinList(String.class, wrapper);
return R.success(userIdList);
}
/**
* 查询表单组包含流程
*
* @param hidden
* @return 表单组数据
*/
@Override
public R<List<FormGroupVo>> listGroupWithProcess(Boolean hidden) {
List<FormGroupVo> formGroupVos = new LinkedList<>();
List<ProcessGroup> processGroupList = processGroupService.lambdaQuery()
.eq(ProcessGroup::getTenantId, TenantUtil.get())
.orderByDesc(ProcessGroup::getSort).list();
processGroupList.forEach(group -> {
FormGroupVo formGroupVo = FormGroupVo.builder()
.id((group.getId()))
.name(group.getGroupName())
.items(new LinkedList<>())
.build();
formGroupVos.add(formGroupVo);
List<Process> processList = processService.lambdaQuery()
.eq(Process::getGroupId, group.getId())
.eq(Process::getTenantId, TenantUtil.get())
.eq(hidden != null, Process::getHidden, hidden)
.eq(Process::getStop, false)
.orderByAsc(Process::getSort).orderByDesc(Process::getCreateTime).list();
processList.forEach(process -> {
formGroupVo.getItems().add(FormGroupVo.FlowVo.builder()
.flowId(process.getFlowId())
.rangeShow(process.getRangeShow())
.name(process.getName())
.logo(process.getLogo())
.remark(process.getRemark())
.stop(process.getStop())
.uniqueId(process.getUniqueId())
.updated(process.getUpdateTime())
.build());
});
});
return R.success(formGroupVos);
}
/**
* 查询流程组和主流程
*
* @return
*/
@Override
public R<List<FormGroupVo>> listGroupWithProcessMain() {
List<FormGroupVo> formGroupVos = new LinkedList<>();
List<ProcessGroup> processGroupList = processGroupService.lambdaQuery()
.eq(ProcessGroup::getTenantId, TenantUtil.get())
.orderByDesc(ProcessGroup::getSort).list();
processGroupList.forEach(group -> {
FormGroupVo formGroupVo = FormGroupVo.builder()
.id((group.getId()))
.name(group.getGroupName())
.items(new LinkedList<>())
.build();
formGroupVos.add(formGroupVo);
List<ProcessMain> processMainList = processMainService.lambdaQuery()
.eq(ProcessMain::getTenantId, TenantUtil.get())
.eq(ProcessMain::getGroupId, group.getId())
.eq(ProcessMain::getTenantId, TenantUtil.get())
.orderByAsc(ProcessMain::getSort).orderByDesc(ProcessMain::getCreateTime).list();
processMainList.forEach(processMain -> {
List<Process> processList = processService.lambdaQuery()
.eq(Process::getUniqueId, processMain.getUniqueId())
.eq(Process::getTenantId, TenantUtil.get())
.eq(Process::getHidden
, false).orderByDesc(Process::getUpdateTime).list();
Process process = null;
{
process = processList.stream().filter(w -> !w.getStop()).findAny().orElse(null);
if (process == null) {
process = processList.get(0);
}
}
Boolean reportEnable = false;
formGroupVo.getItems().add(FormGroupVo.FlowVo.builder()
.flowId(process.getFlowId())
.uniqueId(process.getUniqueId())
.rangeShow(processMain.getRangeShow())
.name(processMain.getName())
.remark(process.getRemark())
.logo(processMain.getLogo())
.reportEnable(reportEnable)
.stop(process.getStop())
.uniqueId(processMain.getUniqueId())
.updated(processMain.getUpdateTime())
.build());
});
});
return R.success(formGroupVos);
}
/**
* 搜索流程
*
* @param word 关键词
* @return
*/
@Override
public R<List<FormGroupVo.FlowVo>> searchFlowList(String word) {