|
@@ -1,35 +1,217 @@
|
|
|
package cn.iocoder.yudao.module.bpm.service.oa.leave;
|
|
package cn.iocoder.yudao.module.bpm.service.oa.leave;
|
|
|
|
|
|
|
|
|
|
+import cn.hutool.core.collection.CollectionUtil;
|
|
|
|
|
+import cn.hutool.core.util.IdUtil;
|
|
|
|
|
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
|
|
|
|
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
|
|
|
|
+import cn.iocoder.yudao.module.bpm.api.task.BpmProcessInstanceApi;
|
|
|
|
|
+import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO;
|
|
|
import cn.iocoder.yudao.module.bpm.controller.admin.oa.leave.vo.OaLeavePageReqVO;
|
|
import cn.iocoder.yudao.module.bpm.controller.admin.oa.leave.vo.OaLeavePageReqVO;
|
|
|
import cn.iocoder.yudao.module.bpm.controller.admin.oa.leave.vo.OaLeaveSaveReqVO;
|
|
import cn.iocoder.yudao.module.bpm.controller.admin.oa.leave.vo.OaLeaveSaveReqVO;
|
|
|
|
|
+import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.BpmTaskApproveReqVO;
|
|
|
|
|
+import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.BpmTaskReturnReqVO;
|
|
|
import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.leave.OaLeaveDO;
|
|
import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.leave.OaLeaveDO;
|
|
|
import cn.iocoder.yudao.module.bpm.dal.mysql.oa.leave.OaLeaveMapper;
|
|
import cn.iocoder.yudao.module.bpm.dal.mysql.oa.leave.OaLeaveMapper;
|
|
|
|
|
+import cn.iocoder.yudao.module.bpm.service.task.BpmTaskService;
|
|
|
|
|
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
|
|
|
|
|
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
|
|
|
+import org.apache.commons.lang3.StringUtils;
|
|
|
|
|
+import org.flowable.engine.TaskService;
|
|
|
|
|
+import org.flowable.task.api.Task;
|
|
|
import org.springframework.stereotype.Service;
|
|
import org.springframework.stereotype.Service;
|
|
|
-import javax.annotation.Resource;
|
|
|
|
|
|
|
+import org.springframework.transaction.annotation.Transactional;
|
|
|
import org.springframework.validation.annotation.Validated;
|
|
import org.springframework.validation.annotation.Validated;
|
|
|
|
|
|
|
|
-import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
|
|
|
|
-import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
|
|
|
|
-
|
|
|
|
|
-
|
|
|
|
|
|
|
+import javax.annotation.Resource;
|
|
|
|
|
+import java.time.LocalDateTime;
|
|
|
|
|
+import java.util.Date;
|
|
|
|
|
+import java.util.HashMap;
|
|
|
|
|
+import java.util.List;
|
|
|
|
|
+import java.util.Map;
|
|
|
|
|
|
|
|
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
|
|
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
|
|
|
-import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.*;
|
|
|
|
|
|
|
+import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.OA_HOLIDAY_NOT_EXISTS;
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
|
* 请假流程信息 Service 实现类
|
|
* 请假流程信息 Service 实现类
|
|
|
*
|
|
*
|
|
|
- * @author 芋道源码
|
|
|
|
|
|
|
+ * @author dp
|
|
|
*/
|
|
*/
|
|
|
@Service
|
|
@Service
|
|
|
@Validated
|
|
@Validated
|
|
|
-public class OaLeaveServiceImpl implements OaLeaveService {
|
|
|
|
|
|
|
+public class OaLeaveServiceImpl extends ServiceImpl<OaLeaveMapper, OaLeaveDO> implements OaLeaveService {
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * OA 离职对应的流程定义 KEY
|
|
|
|
|
+ */
|
|
|
|
|
+ public static final String PROCESS_KEY = "oa_leave";
|
|
|
|
|
+
|
|
|
|
|
|
|
|
@Resource
|
|
@Resource
|
|
|
private OaLeaveMapper oaLeaveMapper;
|
|
private OaLeaveMapper oaLeaveMapper;
|
|
|
|
|
|
|
|
|
|
+ @Resource
|
|
|
|
|
+ private BpmProcessInstanceApi processInstanceApi;
|
|
|
|
|
+
|
|
|
|
|
+ @Resource
|
|
|
|
|
+ private BpmTaskService bpmTaskService;
|
|
|
|
|
+
|
|
|
|
|
+ @Resource
|
|
|
|
|
+ private TaskService taskService;
|
|
|
|
|
+
|
|
|
|
|
+ @Override
|
|
|
|
|
+ @Transactional
|
|
|
|
|
+ public Long startOaLeave(Long userId, OaLeaveSaveReqVO createReqVO) {
|
|
|
|
|
+ //判断是否已经发起流程
|
|
|
|
|
+ Boolean auditPass = createReqVO.getAuditPass();
|
|
|
|
|
+ // 创建单据uuid
|
|
|
|
|
+ String uuid = IdUtil.fastSimpleUUID();
|
|
|
|
|
+ OaLeaveDO oaLeave = BeanUtils.toBean(createReqVO, OaLeaveDO.class);
|
|
|
|
|
+ if (StringUtils.isBlank(oaLeave.getLeaveId())) {
|
|
|
|
|
+ oaLeave.setLeaveId(uuid);
|
|
|
|
|
+ }
|
|
|
|
|
+ // 保存或更新表单信息
|
|
|
|
|
+ this.saveOrUpdate(oaLeave);
|
|
|
|
|
+
|
|
|
|
|
+ // 提交
|
|
|
|
|
+ if (auditPass) {
|
|
|
|
|
+ // 发起 BPM 流程
|
|
|
|
|
+ Map<String, Object> processInstanceVariables = new HashMap<>();
|
|
|
|
|
+ processInstanceVariables.put("auditPass", auditPass);
|
|
|
|
|
+ //添加审批人信息
|
|
|
|
|
+ Map<String, List<Long>> startUserSelectAssignees = new HashMap<>();
|
|
|
|
|
+ startUserSelectAssignees.put("approver", createReqVO.getStartUserSelectAssignees());
|
|
|
|
|
+ String processInstanceId = processInstanceApi
|
|
|
|
|
+ .createProcessInstance(userId,
|
|
|
|
|
+ new BpmProcessInstanceCreateReqDTO()
|
|
|
|
|
+ .setProcessDefinitionKey(PROCESS_KEY)
|
|
|
|
|
+ .setVariables(processInstanceVariables)
|
|
|
|
|
+ .setBusinessKey(String.valueOf(oaLeave.getId()))
|
|
|
|
|
+ .setStartUserSelectAssignees(startUserSelectAssignees));
|
|
|
|
|
+
|
|
|
|
|
+ //获取下一个审批人
|
|
|
|
|
+ Task task = taskService.createTaskQuery().processInstanceId(processInstanceId).singleResult();
|
|
|
|
|
+
|
|
|
|
|
+ // 将工作流的编号,单据状态 最后一次审批时间 当前审批人 更新到 OA 转正中
|
|
|
|
|
+ oaLeaveMapper.updateById(new OaLeaveDO()
|
|
|
|
|
+ .setId(oaLeave.getId())
|
|
|
|
|
+ .setProcInstId(processInstanceId)
|
|
|
|
|
+ .setAuditStatus("1")
|
|
|
|
|
+ .setLeaveId(uuid)
|
|
|
|
|
+ .setFinalAuditDate(LocalDateTime.now())
|
|
|
|
|
+ .setCurrentAuditEmployeeId(Long.valueOf(task.getAssignee())));
|
|
|
|
|
+
|
|
|
|
|
+ // TODO 发送通知
|
|
|
|
|
+
|
|
|
|
|
+ }else {
|
|
|
|
|
+ // 暂存,不发起流程
|
|
|
|
|
+ // 将单据状态 更新到 OA转正中
|
|
|
|
|
+ oaLeaveMapper.updateById(new OaLeaveDO()
|
|
|
|
|
+ .setId(oaLeave.getId())
|
|
|
|
|
+ .setAuditStatus("0"));
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // TODO 保存或更新附件uuid
|
|
|
|
|
+ if (CollectionUtil.isNotEmpty(createReqVO.getFileIdList())) {
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 返回
|
|
|
|
|
+ return oaLeave.getId();
|
|
|
|
|
+ }
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public Long completeTrueOaLeave(Long userId, BpmTaskApproveReqVO reqVO) {
|
|
|
|
|
+ Task currentTask = bpmTaskService.getTask(reqVO.getId());
|
|
|
|
|
+ // 审批同意
|
|
|
|
|
+ bpmTaskService.approveTask(userId, reqVO);
|
|
|
|
|
+
|
|
|
|
|
+ Task nextTask = taskService.createTaskQuery().processInstanceId(currentTask.getProcessInstanceId()).singleResult();
|
|
|
|
|
+ if (nextTask != null) {
|
|
|
|
|
+ LambdaUpdateWrapper<OaLeaveDO> updateWrapper = new LambdaUpdateWrapper<>();
|
|
|
|
|
+ updateWrapper.set(OaLeaveDO::getAuditStatus, "2")
|
|
|
|
|
+ .set(OaLeaveDO::getCurrentAuditEmployeeId, nextTask.getAssignee())
|
|
|
|
|
+ .set(OaLeaveDO::getFinalAuditDate, new Date())
|
|
|
|
|
+ .eq(OaLeaveDO::getProcInstId, currentTask.getProcessInstanceId());
|
|
|
|
|
+ oaLeaveMapper.update(updateWrapper);
|
|
|
|
|
+ } else {
|
|
|
|
|
+ LambdaUpdateWrapper<OaLeaveDO> updateWrapper = new LambdaUpdateWrapper<>();
|
|
|
|
|
+ updateWrapper.set(OaLeaveDO::getAuditStatus, "3")
|
|
|
|
|
+ .set(OaLeaveDO::getCurrentAuditEmployeeId, null)
|
|
|
|
|
+ .set(OaLeaveDO::getFinalAuditDate, new Date())
|
|
|
|
|
+ .eq(OaLeaveDO::getProcInstId, currentTask.getProcessInstanceId());
|
|
|
|
|
+ oaLeaveMapper.update(updateWrapper);
|
|
|
|
|
+
|
|
|
|
|
+ // TODO 复制业务单据信息到业务模块单据表
|
|
|
|
|
+
|
|
|
|
|
+ }
|
|
|
|
|
+ // 发送通知
|
|
|
|
|
+
|
|
|
|
|
+ // 返回
|
|
|
|
|
+ return 1L;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public Long completeFalseOaLeave(Long userId, BpmTaskApproveReqVO reqVO) {
|
|
|
|
|
+
|
|
|
|
|
+ Task currentTask = bpmTaskService.getTask(reqVO.getId());
|
|
|
|
|
+
|
|
|
|
|
+ BpmTaskReturnReqVO reqVO2 = BeanUtils.toBean(reqVO, BpmTaskReturnReqVO.class);
|
|
|
|
|
+ reqVO2.setTargetTaskDefinitionKey("modifyApply");
|
|
|
|
|
+ bpmTaskService.returnTask(userId, reqVO2);
|
|
|
|
|
+
|
|
|
|
|
+ Task nextTask = taskService.createTaskQuery().processInstanceId(currentTask.getProcessInstanceId()).singleResult();
|
|
|
|
|
+
|
|
|
|
|
+ // 更新单据状态,当前处理人,最后处理时间
|
|
|
|
|
+ LambdaUpdateWrapper<OaLeaveDO> updateWrapper = new LambdaUpdateWrapper<>();
|
|
|
|
|
+ updateWrapper.set(OaLeaveDO::getCurrentAuditEmployeeId, nextTask.getAssignee())
|
|
|
|
|
+ .set(OaLeaveDO::getFinalAuditDate, new Date())
|
|
|
|
|
+ .set(OaLeaveDO::getAuditStatus, "0")
|
|
|
|
|
+ .eq(OaLeaveDO::getProcInstId, currentTask.getProcessInstanceId());
|
|
|
|
|
+ oaLeaveMapper.update(updateWrapper);
|
|
|
|
|
+
|
|
|
|
|
+ // 发送通知
|
|
|
|
|
+
|
|
|
|
|
+ // 返回
|
|
|
|
|
+ return 1L;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public Long updateCompleteOaLeave(Long userId, OaLeaveSaveReqVO createReqVO, BpmTaskApproveReqVO reqVO) {
|
|
|
|
|
+ // 判断是否已经发起流程
|
|
|
|
|
+ Boolean auditPass = createReqVO.getAuditPass();
|
|
|
|
|
+
|
|
|
|
|
+ OaLeaveDO oaLeave = BeanUtils.toBean(createReqVO, OaLeaveDO.class);
|
|
|
|
|
+
|
|
|
|
|
+ Task currentTask = taskService.createTaskQuery().processInstanceId(oaLeave.getProcInstId()).singleResult();
|
|
|
|
|
+
|
|
|
|
|
+ //审批通过
|
|
|
|
|
+ bpmTaskService.approveTask(userId, reqVO);
|
|
|
|
|
+
|
|
|
|
|
+ // 提交
|
|
|
|
|
+ if (auditPass) {
|
|
|
|
|
+ Task nextTask = taskService.createTaskQuery().processInstanceId(currentTask.getProcessInstanceId()).singleResult();
|
|
|
|
|
+
|
|
|
|
|
+ oaLeave.setAuditStatus("1");
|
|
|
|
|
+ oaLeave.setCurrentAuditEmployeeId(Long.valueOf(nextTask.getAssignee()));
|
|
|
|
|
+ oaLeave.setFinalAuditDate(LocalDateTime.now());
|
|
|
|
|
+ oaLeaveMapper.updateById(oaLeave);
|
|
|
|
|
+
|
|
|
|
|
+ } else {
|
|
|
|
|
+ OaLeaveDO oaLeaveClose = new OaLeaveDO();
|
|
|
|
|
+ oaLeaveClose.setId(oaLeave.getId());
|
|
|
|
|
+ oaLeaveClose.setAuditStatus("4");
|
|
|
|
|
+ oaLeaveClose.setCurrentAuditEmployeeId(null);
|
|
|
|
|
+ oaLeaveClose.setFinalAuditDate(LocalDateTime.now());
|
|
|
|
|
+ oaLeaveMapper.updateById(oaLeaveClose);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ return oaLeave.getId();
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
@Override
|
|
@Override
|
|
|
- public Integer createOaLeave(OaLeaveSaveReqVO createReqVO) {
|
|
|
|
|
|
|
+ public Long createOaLeave(OaLeaveSaveReqVO createReqVO) {
|
|
|
// 插入
|
|
// 插入
|
|
|
OaLeaveDO oaLeave = BeanUtils.toBean(createReqVO, OaLeaveDO.class);
|
|
OaLeaveDO oaLeave = BeanUtils.toBean(createReqVO, OaLeaveDO.class);
|
|
|
oaLeaveMapper.insert(oaLeave);
|
|
oaLeaveMapper.insert(oaLeave);
|
|
@@ -47,21 +229,21 @@ public class OaLeaveServiceImpl implements OaLeaveService {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
@Override
|
|
|
- public void deleteOaLeave(Integer id) {
|
|
|
|
|
|
|
+ public void deleteOaLeave(Long id) {
|
|
|
// 校验存在
|
|
// 校验存在
|
|
|
validateOaLeaveExists(id);
|
|
validateOaLeaveExists(id);
|
|
|
// 删除
|
|
// 删除
|
|
|
oaLeaveMapper.deleteById(id);
|
|
oaLeaveMapper.deleteById(id);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- private void validateOaLeaveExists(Integer id) {
|
|
|
|
|
|
|
+ private void validateOaLeaveExists(Long id) {
|
|
|
if (oaLeaveMapper.selectById(id) == null) {
|
|
if (oaLeaveMapper.selectById(id) == null) {
|
|
|
- throw exception(OA_LEAVE_NOT_EXISTS);
|
|
|
|
|
|
|
+ throw exception(OA_HOLIDAY_NOT_EXISTS);
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
@Override
|
|
|
- public OaLeaveDO getOaLeave(Integer id) {
|
|
|
|
|
|
|
+ public OaLeaveDO getOaLeave(Long id) {
|
|
|
return oaLeaveMapper.selectById(id);
|
|
return oaLeaveMapper.selectById(id);
|
|
|
}
|
|
}
|
|
|
|
|
|