|
|
|
|
@ -1,9 +1,12 @@
|
|
|
|
|
package org.dromara.oa.erp.service.impl;
|
|
|
|
|
|
|
|
|
|
import cn.hutool.core.collection.CollUtil;
|
|
|
|
|
import cn.hutool.core.convert.Convert;
|
|
|
|
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
|
|
import org.apache.dubbo.config.annotation.DubboReference;
|
|
|
|
|
import org.apache.seata.spring.annotation.GlobalTransactional;
|
|
|
|
|
import org.dromara.common.core.enums.BusinessStatusEnum;
|
|
|
|
|
import org.dromara.common.core.exception.ServiceException;
|
|
|
|
|
import org.dromara.common.core.utils.MapstructUtils;
|
|
|
|
|
import org.dromara.common.core.utils.StringUtils;
|
|
|
|
|
@ -14,6 +17,7 @@ import com.github.yulichang.toolkit.JoinWrappers;
|
|
|
|
|
import com.github.yulichang.wrapper.MPJLambdaWrapper;
|
|
|
|
|
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
|
|
|
|
import lombok.RequiredArgsConstructor;
|
|
|
|
|
import org.dromara.common.tenant.helper.TenantHelper;
|
|
|
|
|
import org.dromara.oa.erp.domain.ErpTimesheetDept;
|
|
|
|
|
import org.dromara.oa.erp.domain.ErpTimesheetProject;
|
|
|
|
|
import org.dromara.oa.erp.domain.bo.ErpTimesheetDeptBo;
|
|
|
|
|
@ -24,6 +28,8 @@ import org.dromara.oa.erp.service.IErpTimesheetDeptService;
|
|
|
|
|
import org.dromara.oa.erp.service.IErpTimesheetProjectService;
|
|
|
|
|
import org.dromara.workflow.api.RemoteWorkflowService;
|
|
|
|
|
import org.dromara.workflow.api.domain.RemoteStartProcess;
|
|
|
|
|
import org.dromara.workflow.api.event.ProcessEvent;
|
|
|
|
|
import org.springframework.context.event.EventListener;
|
|
|
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
import org.dromara.oa.erp.domain.bo.ErpTimesheetInfoBo;
|
|
|
|
|
import org.dromara.oa.erp.domain.vo.ErpTimesheetInfoVo;
|
|
|
|
|
@ -32,10 +38,8 @@ import org.dromara.oa.erp.mapper.ErpTimesheetInfoMapper;
|
|
|
|
|
import org.dromara.oa.erp.service.IErpTimesheetInfoService;
|
|
|
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
|
|
|
|
|
|
|
|
import java.util.HashMap;
|
|
|
|
|
import java.util.List;
|
|
|
|
|
import java.util.Map;
|
|
|
|
|
import java.util.Collection;
|
|
|
|
|
import java.util.*;
|
|
|
|
|
import java.util.stream.Collectors;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 工时填报Service业务层处理
|
|
|
|
|
@ -45,6 +49,7 @@ import java.util.Collection;
|
|
|
|
|
*/
|
|
|
|
|
@RequiredArgsConstructor
|
|
|
|
|
@Service
|
|
|
|
|
@Slf4j
|
|
|
|
|
public class ErpTimesheetInfoServiceImpl implements IErpTimesheetInfoService {
|
|
|
|
|
|
|
|
|
|
private final ErpTimesheetInfoMapper baseMapper;
|
|
|
|
|
@ -240,42 +245,110 @@ public class ErpTimesheetInfoServiceImpl implements IErpTimesheetInfoService {
|
|
|
|
|
@Override
|
|
|
|
|
@GlobalTransactional(rollbackFor = Exception.class) // 开启全局事务
|
|
|
|
|
public ErpTimesheetInfoVo submitAndFlowStart(ErpTimesheetInfoBo bo) {
|
|
|
|
|
|
|
|
|
|
ErpTimesheetInfo add = MapstructUtils.convert(bo, ErpTimesheetInfo.class);
|
|
|
|
|
validEntityBeforeSave(add);
|
|
|
|
|
|
|
|
|
|
if (bo.getTimesheetId() == null) {
|
|
|
|
|
this.insertByBo(bo);
|
|
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
this.updateByBo(bo);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 准备启动流程参数
|
|
|
|
|
// 后端发起需要忽略权限
|
|
|
|
|
if (bo.getVariables() == null) {
|
|
|
|
|
bo.setVariables(new HashMap<>());
|
|
|
|
|
}
|
|
|
|
|
bo.getVariables().put("ignore", true);
|
|
|
|
|
Map<String, Object> variables = bo.getVariables();
|
|
|
|
|
|
|
|
|
|
// --- 处理部门工时审批人 ---
|
|
|
|
|
List<ErpTimesheetDeptBo> deptList = bo.getTimesheetDeptList();
|
|
|
|
|
List<String> deptApprovers = new ArrayList<>();
|
|
|
|
|
if (CollUtil.isNotEmpty(deptList)) {
|
|
|
|
|
deptApprovers = deptList.stream()
|
|
|
|
|
.map(ErpTimesheetDeptBo::getApproverId)
|
|
|
|
|
.filter(Objects::nonNull)
|
|
|
|
|
.map(String::valueOf)
|
|
|
|
|
.distinct()
|
|
|
|
|
.collect(Collectors.toList());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// deptApprovers (审批人列表)
|
|
|
|
|
variables.put("deptApprovers", deptApprovers);
|
|
|
|
|
// hasDeptWork (是否有部门工时) - true/false
|
|
|
|
|
variables.put("hasDeptWork", CollUtil.isNotEmpty(deptApprovers));
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// --- 处理项目工时审批人 ---
|
|
|
|
|
List<ErpTimesheetProjectBo> projectList = bo.getTimesheetProjectList();
|
|
|
|
|
List<String> projectApprovers = new ArrayList<>();
|
|
|
|
|
if (CollUtil.isNotEmpty(projectList)) {
|
|
|
|
|
projectApprovers = projectList.stream()
|
|
|
|
|
.map(ErpTimesheetProjectBo::getApproverId)
|
|
|
|
|
.filter(Objects::nonNull)
|
|
|
|
|
.map(String::valueOf)
|
|
|
|
|
.distinct()
|
|
|
|
|
.collect(Collectors.toList());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
variables.put("projectApprovers", projectApprovers);
|
|
|
|
|
variables.put("hasProjectWork", CollUtil.isNotEmpty(projectApprovers));
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
RemoteStartProcess startProcess = new RemoteStartProcess();
|
|
|
|
|
startProcess.setBusinessId(bo.getTimesheetId().toString());
|
|
|
|
|
startProcess.setFlowCode(bo.getFlowCode());
|
|
|
|
|
startProcess.setVariables(bo.getVariables());
|
|
|
|
|
startProcess.setVariables(variables);
|
|
|
|
|
startProcess.setBizExt(bo.getBizExt());
|
|
|
|
|
|
|
|
|
|
// 确保 BizExt 里也有 BusinessId
|
|
|
|
|
if (bo.getBizExt() != null) {
|
|
|
|
|
bo.getBizExt().setBusinessId(startProcess.getBusinessId());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 调用远程服务启动流程
|
|
|
|
|
// startCompleteTask 表示“启动并自动完成第一个发起节点”,直接流转到下一个审批人
|
|
|
|
|
boolean flagOne = remoteWorkflowService.startCompleteTask(startProcess);
|
|
|
|
|
|
|
|
|
|
if (!flagOne) {
|
|
|
|
|
boolean flag = remoteWorkflowService.startCompleteTask(startProcess);
|
|
|
|
|
if (!flag) {
|
|
|
|
|
throw new ServiceException("流程发起异常");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return MapstructUtils.convert(add, ErpTimesheetInfoVo.class);
|
|
|
|
|
return MapstructUtils.convert(baseMapper.selectById(bo.getTimesheetId()), ErpTimesheetInfoVo.class);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 总体流程监听(例如: 草稿,撤销,退回,作废,终止,已完成等)
|
|
|
|
|
*
|
|
|
|
|
* @param processEvent 参数
|
|
|
|
|
*/
|
|
|
|
|
@EventListener(condition = "#processEvent.flowCode == 'OATS'")
|
|
|
|
|
public void processHandler(ProcessEvent processEvent) {
|
|
|
|
|
TenantHelper.dynamic(processEvent.getTenantId(), () -> {
|
|
|
|
|
log.info("【工时填报流程监听】开始处理: key={}, status={}", processEvent.getFlowCode(), processEvent.getStatus());
|
|
|
|
|
|
|
|
|
|
Long timeSheetId = Convert.toLong(processEvent.getBusinessId());
|
|
|
|
|
ErpTimesheetInfo timeSheetInfo = baseMapper.selectById(timeSheetId);
|
|
|
|
|
|
|
|
|
|
if (timeSheetInfo == null) {
|
|
|
|
|
log.error("未找到对应的工时单据,id={}", timeSheetId);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
timeSheetInfo.setFlowStatus(processEvent.getStatus());
|
|
|
|
|
String status = processEvent.getStatus();
|
|
|
|
|
|
|
|
|
|
// A. 审批中 (Waiting)
|
|
|
|
|
if (BusinessStatusEnum.WAITING.getStatus().equals(status)) {
|
|
|
|
|
timeSheetInfo.setTimesheetStatus("2");
|
|
|
|
|
}
|
|
|
|
|
// B. 流程结束/审批通过 (Finish)
|
|
|
|
|
else if (BusinessStatusEnum.FINISH.getStatus().equals(status)) {
|
|
|
|
|
timeSheetInfo.setTimesheetStatus("3");
|
|
|
|
|
}
|
|
|
|
|
// C. 驳回/撤销
|
|
|
|
|
else if (BusinessStatusEnum.BACK.getStatus().equals(status)
|
|
|
|
|
|| BusinessStatusEnum.CANCEL.getStatus().equals(status)) {
|
|
|
|
|
timeSheetInfo.setTimesheetStatus("1");
|
|
|
|
|
}
|
|
|
|
|
// D. 作废/终止
|
|
|
|
|
else if (BusinessStatusEnum.INVALID.getStatus().equals(status)
|
|
|
|
|
|| BusinessStatusEnum.TERMINATION.getStatus().equals(status)) {
|
|
|
|
|
timeSheetInfo.setTimesheetStatus("4");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
baseMapper.updateById(timeSheetInfo);
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|