Bläddra i källkod

请假流程审批接口

dongpo 1 år sedan
förälder
incheckning
7211a6a4bb

+ 49 - 21
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/holiday/OaHolidayController.java

@@ -1,34 +1,33 @@
 package cn.iocoder.yudao.module.bpm.controller.admin.oa.holiday;
 
+import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
+import cn.iocoder.yudao.framework.common.pojo.CommonResult;
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
 import cn.iocoder.yudao.module.bpm.controller.admin.oa.holiday.vo.OaHolidayPageReqVO;
 import cn.iocoder.yudao.module.bpm.controller.admin.oa.holiday.vo.OaHolidayRespVO;
 import cn.iocoder.yudao.module.bpm.controller.admin.oa.holiday.vo.OaHolidaySaveReqVO;
-import org.springframework.web.bind.annotation.*;
-import javax.annotation.Resource;
-import org.springframework.validation.annotation.Validated;
-import org.springframework.security.access.prepost.PreAuthorize;
-import io.swagger.v3.oas.annotations.tags.Tag;
-import io.swagger.v3.oas.annotations.Parameter;
+import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.BpmTaskApproveReqVO;
+import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.holiday.OaHolidayDO;
+import cn.iocoder.yudao.module.bpm.service.oa.holiday.OaHolidayService;
 import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
 
-import javax.validation.*;
-import javax.servlet.http.*;
-import java.util.*;
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.Valid;
 import java.io.IOException;
+import java.util.List;
 
-import cn.iocoder.yudao.framework.common.pojo.PageParam;
-import cn.iocoder.yudao.framework.common.pojo.PageResult;
-import cn.iocoder.yudao.framework.common.pojo.CommonResult;
-import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
-
-import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
-
-import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
-import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.*;
-
-import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.holiday.OaHolidayDO;
-import cn.iocoder.yudao.module.bpm.service.oa.holiday.OaHolidayService;
+import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
 
 @Tag(name = "管理后台 - 请假流程信息")
 @RestController
@@ -39,6 +38,35 @@ public class OaHolidayController {
     @Resource
     private OaHolidayService oaHolidayService;
 
+    @PostMapping("/start")
+    @Operation(summary = "提交或暂存请假流程信息")
+    @PreAuthorize("@ss.hasPermission('bpm:oa-Holiday:start')")
+    public CommonResult<Long> startOaHoliday(@Valid @RequestBody OaHolidaySaveReqVO createReqVO) {
+        return success(oaHolidayService.startOaHoliday(getLoginUserId(), createReqVO));
+    }
+
+    @PostMapping("/completeTure")
+    @Operation(summary = "审批同意请假流程信息")
+    @PreAuthorize("@ss.hasPermission('bpm:oa-entry:complete-true')")
+    public CommonResult<Long> completeTrueOaHoliday(@Valid @RequestBody BpmTaskApproveReqVO reqVO) {
+        return success(oaHolidayService.completeTrueOaHoliday(getLoginUserId(), reqVO));
+    }
+
+    @PostMapping("/completeFalse")
+    @Operation(summary = "驳回或撤回请假流程信息")
+    @PreAuthorize("@ss.hasPermission('bpm:oa-entry:complete-false')")
+    public CommonResult<Long> completeFalseOaHoliday(@Valid @RequestBody BpmTaskApproveReqVO reqVO) {
+        return success(oaHolidayService.completeFalseOaHoliday(getLoginUserId(), reqVO));
+    }
+
+    @PostMapping("/updateComplete")
+    @Operation(summary = "驳回和撤回后再次提交或关闭请假流程信息")
+    @PreAuthorize("@ss.hasPermission('bpm:oa-entry:update-complete')")
+    public CommonResult<Long> updateCompleteOaHoliday(@Valid @RequestBody OaHolidaySaveReqVO createReqVO) {
+        return success(oaHolidayService.updateCompleteOaHoliday(getLoginUserId(), createReqVO, createReqVO.getBpmTaskApproveReqVO()));
+    }
+
+
     @PostMapping("/create")
     @Operation(summary = "创建请假流程信息")
     @PreAuthorize("@ss.hasPermission('bpm:oa-holiday:create')")

+ 15 - 0
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/holiday/vo/OaHolidaySaveReqVO.java

@@ -1,5 +1,6 @@
 package cn.iocoder.yudao.module.bpm.controller.admin.oa.holiday.vo;
 
+import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.BpmTaskApproveReqVO;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.*;
 import java.util.*;
@@ -89,4 +90,18 @@ public class OaHolidaySaveReqVO {
     @Schema(description = "数据来源,0流程添加、1手动添加")
     private String infoSource;
 
+
+    @Schema(description = "审批,true 通过,false 驳回", example = "true")
+    private Boolean auditPass;
+
+    @Schema(description = "发起人自选审批人 Map", example = " [1, 1]")
+    private List<Long> startUserSelectAssignees;
+
+    @Schema(description = "附件主键id", example = "[1, 2]")
+    private List<Long> fileIdList;
+
+    @Schema(description = "审批信息")
+    private BpmTaskApproveReqVO bpmTaskApproveReqVO;
+
+
 }

+ 15 - 4
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/holiday/OaHolidayService.java

@@ -1,18 +1,29 @@
 package cn.iocoder.yudao.module.bpm.service.oa.holiday;
 
-import javax.validation.*;
-
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.module.bpm.controller.admin.oa.holiday.vo.OaHolidayPageReqVO;
 import cn.iocoder.yudao.module.bpm.controller.admin.oa.holiday.vo.OaHolidaySaveReqVO;
+import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.BpmTaskApproveReqVO;
 import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.holiday.OaHolidayDO;
-import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+import javax.validation.Valid;
 
 /**
  * 请假流程信息 Service 接口
  *
  * @author dp
  */
-public interface OaHolidayService {
+public interface OaHolidayService extends IService<OaHolidayDO> {
+
+    Long startOaHoliday(Long userId, @Valid OaHolidaySaveReqVO createReqVO);
+
+    Long completeTrueOaHoliday(Long userId, BpmTaskApproveReqVO reqVO);
+
+    Long completeFalseOaHoliday(Long userId, BpmTaskApproveReqVO reqVO);
+
+    Long updateCompleteOaHoliday(Long userId, @Valid OaHolidaySaveReqVO createReqVO, @Valid BpmTaskApproveReqVO reqVO);
+
 
     /**
      * 创建请假流程信息

+ 191 - 8
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/holiday/OaHolidayServiceImpl.java

@@ -1,19 +1,36 @@
 package cn.iocoder.yudao.module.bpm.service.oa.holiday;
 
+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.holiday.vo.OaHolidayPageReqVO;
 import cn.iocoder.yudao.module.bpm.controller.admin.oa.holiday.vo.OaHolidaySaveReqVO;
+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.holiday.OaHolidayDO;
+import cn.iocoder.yudao.module.bpm.dal.mysql.oa.holiday.OaHolidayMapper;
+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 javax.annotation.Resource;
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.validation.annotation.Validated;
 
-import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.holiday.OaHolidayDO;
-import cn.iocoder.yudao.framework.common.pojo.PageResult;
-import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
-
-import cn.iocoder.yudao.module.bpm.dal.mysql.oa.holiday.OaHolidayMapper;
+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.module.bpm.enums.ErrorCodeConstants.*;
+import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.OA_HOLIDAY_NOT_EXISTS;
 
 /**
  * 请假流程信息 Service 实现类
@@ -22,11 +39,177 @@ import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.*;
  */
 @Service
 @Validated
-public class OaHolidayServiceImpl implements OaHolidayService {
+public class OaHolidayServiceImpl extends ServiceImpl<OaHolidayMapper, OaHolidayDO> implements OaHolidayService {
+
+
+    /**
+     * OA 离职对应的流程定义 KEY
+     */
+    public static final String PROCESS_KEY = "oa_holiday";
+
 
     @Resource
     private OaHolidayMapper oaHolidayMapper;
 
+    @Resource
+    private BpmProcessInstanceApi processInstanceApi;
+
+    @Resource
+    private BpmTaskService bpmTaskService;
+
+    @Resource
+    private TaskService taskService;
+
+    @Override
+    @Transactional
+    public Long startOaHoliday(Long userId, OaHolidaySaveReqVO createReqVO) {
+        //判断是否已经发起流程
+        Boolean auditPass = createReqVO.getAuditPass();
+        // 创建单据uuid
+        String uuid = IdUtil.fastSimpleUUID();
+        OaHolidayDO oaHoliday = BeanUtils.toBean(createReqVO, OaHolidayDO.class);
+        if (StringUtils.isBlank(oaHoliday.getHolidayId())) {
+            oaHoliday.setHolidayId(uuid);
+        }
+        // 保存或更新表单信息
+        this.saveOrUpdate(oaHoliday);
+
+        // 提交
+        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(oaHoliday.getId()))
+                                    .setStartUserSelectAssignees(startUserSelectAssignees));
+
+            //获取下一个审批人
+            Task task = taskService.createTaskQuery().processInstanceId(processInstanceId).singleResult();
+
+            // 将工作流的编号,单据状态 最后一次审批时间 当前审批人  更新到 OA 转正中
+            oaHolidayMapper.updateById(new OaHolidayDO()
+                    .setId(oaHoliday.getId())
+                    .setProcInstId(processInstanceId)
+                    .setAuditStatus("1")
+                    .setHolidayId(uuid)
+                    .setFinalAuditDate(LocalDateTime.now())
+                    .setCurrentAuditEmployeeId(Long.valueOf(task.getAssignee())));
+
+            // TODO 发送通知
+
+        }else {
+            // 暂存,不发起流程
+            // 将单据状态 更新到 OA转正中
+            oaHolidayMapper.updateById(new OaHolidayDO()
+                    .setId(oaHoliday.getId())
+                    .setAuditStatus("0"));
+        }
+
+        // TODO 保存或更新附件uuid
+        if (CollectionUtil.isNotEmpty(createReqVO.getFileIdList())) {
+        }
+
+        // 返回
+        return oaHoliday.getId();
+    }
+    @Override
+    public Long completeTrueOaHoliday(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<OaHolidayDO> updateWrapper = new LambdaUpdateWrapper<>();
+            updateWrapper.set(OaHolidayDO::getAuditStatus, "2")
+                    .set(OaHolidayDO::getCurrentAuditEmployeeId, nextTask.getAssignee())
+                    .set(OaHolidayDO::getFinalAuditDate, new Date())
+                    .eq(OaHolidayDO::getProcInstId, currentTask.getProcessInstanceId());
+            oaHolidayMapper.update(updateWrapper);
+        } else {
+            LambdaUpdateWrapper<OaHolidayDO> updateWrapper = new LambdaUpdateWrapper<>();
+            updateWrapper.set(OaHolidayDO::getAuditStatus, "3")
+                    .set(OaHolidayDO::getCurrentAuditEmployeeId, null)
+                    .set(OaHolidayDO::getFinalAuditDate, new Date())
+                    .eq(OaHolidayDO::getProcInstId, currentTask.getProcessInstanceId());
+            oaHolidayMapper.update(updateWrapper);
+
+            // TODO 复制业务单据信息到业务模块单据表
+
+        }
+        // 发送通知
+
+        // 返回
+        return 1L;
+    }
+
+    @Override
+    public Long completeFalseOaHoliday(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<OaHolidayDO> updateWrapper = new LambdaUpdateWrapper<>();
+        updateWrapper.set(OaHolidayDO::getCurrentAuditEmployeeId, nextTask.getAssignee())
+                .set(OaHolidayDO::getFinalAuditDate, new Date())
+                .set(OaHolidayDO::getAuditStatus, "0")
+                .eq(OaHolidayDO::getProcInstId, currentTask.getProcessInstanceId());
+        oaHolidayMapper.update(updateWrapper);
+
+        // 发送通知
+
+        // 返回
+        return 1L;
+    }
+
+    @Override
+    public Long updateCompleteOaHoliday(Long userId, OaHolidaySaveReqVO createReqVO, BpmTaskApproveReqVO reqVO) {
+        // 判断是否已经发起流程
+        Boolean auditPass = createReqVO.getAuditPass();
+
+        OaHolidayDO oaHoliday = BeanUtils.toBean(createReqVO, OaHolidayDO.class);
+
+        Task currentTask = taskService.createTaskQuery().processInstanceId(oaHoliday.getProcInstId()).singleResult();
+
+        //审批通过
+        bpmTaskService.approveTask(userId, reqVO);
+
+        // 提交
+        if (auditPass) {
+            Task nextTask = taskService.createTaskQuery().processInstanceId(currentTask.getProcessInstanceId()).singleResult();
+
+            oaHoliday.setAuditStatus("1");
+            oaHoliday.setCurrentAuditEmployeeId(Long.valueOf(nextTask.getAssignee()));
+            oaHoliday.setFinalAuditDate(LocalDateTime.now());
+            oaHolidayMapper.updateById(oaHoliday);
+
+        } else {
+            OaHolidayDO oaHolidayClose = new OaHolidayDO();
+            oaHolidayClose.setId(oaHoliday.getId());
+            oaHolidayClose.setAuditStatus("4");
+            oaHolidayClose.setCurrentAuditEmployeeId(null);
+            oaHolidayClose.setFinalAuditDate(LocalDateTime.now());
+            oaHolidayMapper.updateById(oaHolidayClose);
+        }
+
+        return oaHoliday.getId();
+    }
+
+
+
     @Override
     public Long createOaHoliday(OaHolidaySaveReqVO createReqVO) {
         // 插入