Explorar o código

新增项目变更计划申请和详情

wangliang hai 1 ano
pai
achega
2ae49ad0cb

+ 8 - 0
sop-business/src/main/java/com/qmth/sop/business/activiti/service/ActivitiService.java

@@ -95,6 +95,14 @@ public interface ActivitiService {
      */
     public Boolean flowEnd(Long flowId);
 
+    /**
+     * 流程批量终止
+     *
+     * @param flowIds
+     * @return
+     */
+    public Boolean flowEnd(List<Long> flowIds);
+
     /**
      * 获取流程详细信息接口
      *

+ 17 - 0
sop-business/src/main/java/com/qmth/sop/business/activiti/service/impl/ActivitiServiceImpl.java

@@ -12,6 +12,7 @@ import com.qmth.sop.business.cache.CommonCacheService;
 import com.qmth.sop.business.entity.*;
 import com.qmth.sop.business.mapper.SysUserMapper;
 import com.qmth.sop.business.service.*;
+import com.qmth.sop.common.contant.SpringContextHolder;
 import com.qmth.sop.common.contant.SystemConstant;
 import com.qmth.sop.common.enums.*;
 import com.qmth.sop.common.lock.MemoryLock;
@@ -606,6 +607,22 @@ public class ActivitiServiceImpl implements ActivitiService {
         return true;
     }
 
+    /**
+     * 流程批量终止
+     *
+     * @param flowIds
+     * @return
+     */
+    @Override
+    @Transactional
+    public Boolean flowEnd(List<Long> flowIds) {
+        ActivitiService activitiService = SpringContextHolder.getBean(ActivitiService.class);
+        for (Long l : flowIds) {
+            activitiService.flowEnd(l);
+        }
+        return true;
+    }
+
     /**
      * 获取流程详细信息接口
      *

+ 23 - 0
sop-business/src/main/java/com/qmth/sop/business/entity/TBProjectExchange.java

@@ -5,6 +5,7 @@ import com.fasterxml.jackson.databind.annotation.JsonSerialize;
 import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
 import com.qmth.sop.common.contant.SystemConstant;
 import com.qmth.sop.common.enums.DelayWarnTypeEnum;
+import com.qmth.sop.common.enums.ProjectExchangeApproveEnum;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 
@@ -57,6 +58,12 @@ public class TBProjectExchange implements Serializable {
     @ApiModelProperty(value = "变更内容json")
     private String contentJson;
 
+    @ApiModelProperty(value = "处理结果,FINISH:已完成,NOT_UPDATE:经沟通,取消变更,PARTIAL_UPDATE:经沟通,部分变更")
+    private ProjectExchangeApproveEnum result;
+
+    @ApiModelProperty(value = "变更备注")
+    private String remark;
+
     @ApiModelProperty(value = "是否启用,0:停用,1:启用")
     private Boolean enable;
 
@@ -77,6 +84,22 @@ public class TBProjectExchange implements Serializable {
     @JsonSerialize(using = ToStringSerializer.class)
     private List<String> approveUserIds;
 
+    public ProjectExchangeApproveEnum getResult() {
+        return result;
+    }
+
+    public void setResult(ProjectExchangeApproveEnum result) {
+        this.result = result;
+    }
+
+    public String getRemark() {
+        return remark;
+    }
+
+    public void setRemark(String remark) {
+        this.remark = remark;
+    }
+
     public String getFlowDeploymentId() {
         return flowDeploymentId;
     }

+ 21 - 3
sop-business/src/main/java/com/qmth/sop/business/service/TBProjectExchangeService.java

@@ -4,9 +4,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.qmth.sop.business.bean.result.ProjectExchangeResult;
 import com.qmth.sop.business.entity.TBProjectExchange;
-import com.qmth.sop.common.enums.DelayWarnTypeEnum;
-import com.qmth.sop.common.enums.ProductTypeEnum;
-import com.qmth.sop.common.enums.ProjectExchangeFlowStatusEnum;
+import com.qmth.sop.common.enums.*;
 
 import java.util.Map;
 
@@ -45,4 +43,24 @@ public interface TBProjectExchangeService extends IService<TBProjectExchange> {
      * @return
      */
     IPage<ProjectExchangeResult> list(IPage<Map> iPage, Long serviceId, Long createUserId, DelayWarnTypeEnum type, ProductTypeEnum customType, ProjectExchangeFlowStatusEnum flowStatus, String customName, String exchangeNo, Long startTime, Long endTime);
+
+    /**
+     * 项目计划变更审核接口
+     *
+     * @param taskId
+     * @param flowApprove
+     * @param projectExchangeApprove
+     * @param remark
+     * @param userId
+     * @return
+     */
+    Boolean flowApprove(Long taskId, FlowApprovePassEnum flowApprove, ProjectExchangeApproveEnum projectExchangeApprove, String remark, Long userId) throws InterruptedException;
+
+    /**
+     * 项目计划变更详情接口
+     *
+     * @param id
+     * @return
+     */
+    Object view(Long id);
 }

+ 53 - 4
sop-business/src/main/java/com/qmth/sop/business/service/impl/TBProjectExchangeServiceImpl.java

@@ -1,5 +1,6 @@
 package com.qmth.sop.business.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.qmth.sop.business.activiti.service.ActivitiService;
@@ -12,11 +13,10 @@ import com.qmth.sop.business.mapper.TBProjectExchangeMapper;
 import com.qmth.sop.business.service.TBProjectExchangeService;
 import com.qmth.sop.business.service.TFCustomFlowEntityService;
 import com.qmth.sop.common.contant.SystemConstant;
-import com.qmth.sop.common.enums.DelayWarnTypeEnum;
-import com.qmth.sop.common.enums.FlowApprovePassEnum;
-import com.qmth.sop.common.enums.ProductTypeEnum;
-import com.qmth.sop.common.enums.ProjectExchangeFlowStatusEnum;
+import com.qmth.sop.common.enums.*;
 import com.qmth.sop.common.util.ServletUtil;
+import org.activiti.engine.TaskService;
+import org.activiti.engine.task.Task;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
@@ -25,6 +25,7 @@ import javax.annotation.Resource;
 import java.util.Arrays;
 import java.util.Map;
 import java.util.Objects;
+import java.util.Optional;
 
 /**
  * <p>
@@ -43,6 +44,9 @@ public class TBProjectExchangeServiceImpl extends ServiceImpl<TBProjectExchangeM
     @Resource
     TFCustomFlowEntityService tfCustomFlowEntityService;
 
+    @Resource
+    TaskService taskService;
+
     /**
      * 新增项目变更计划申请
      *
@@ -83,4 +87,49 @@ public class TBProjectExchangeServiceImpl extends ServiceImpl<TBProjectExchangeM
         createUserId = Objects.isNull(createUserId) ? sysUser.getId() : createUserId;
         return this.baseMapper.list(iPage, serviceId, createUserId, Objects.nonNull(type) ? type.name() : null, Objects.nonNull(customType) ? customType.name() : null, Objects.nonNull(flowStatus) ? flowStatus.name() : null, customName, exchangeNo, startTime, endTime);
     }
+
+    /**
+     * 项目计划变更审核接口
+     *
+     * @param taskId
+     * @param flowApprove
+     * @param projectExchangeApprove
+     * @param remark
+     * @param userId
+     * @return
+     * @throws InterruptedException
+     */
+    @Override
+    @Transactional
+    public Boolean flowApprove(Long taskId, FlowApprovePassEnum flowApprove, ProjectExchangeApproveEnum projectExchangeApprove, String remark, Long userId) throws InterruptedException {
+        SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
+        userId = Objects.nonNull(sysUser) ? sysUser.getId() : userId;
+        Task task = taskService.createTaskQuery().taskId(String.valueOf(taskId)).singleResult();
+        Optional.ofNullable(task).orElseThrow(() -> ExceptionResultEnum.FLOW_TASK_NO_DATA.exception());
+
+        TFCustomFlowEntity tfCustomFlowEntity = tfCustomFlowEntityService.getOne(new QueryWrapper<TFCustomFlowEntity>().lambda().eq(TFCustomFlowEntity::getFlowId, Long.parseLong(task.getProcessInstanceId())));
+        activitiService.taskApprove(new FlowApproveParam(taskId, flowApprove, Arrays.asList(String.valueOf(userId)), tfCustomFlowEntity.getCrmNo(), projectExchangeApprove.getTitle() + ";" + remark));
+
+        TBProjectExchange tbProjectExchange = this.getOne(new QueryWrapper<TBProjectExchange>().lambda().eq(TBProjectExchange::getExchangeNo, tfCustomFlowEntity.getCode()));
+        Optional.ofNullable(tbProjectExchange).orElseThrow(() -> ExceptionResultEnum.PROJECT_EXCHANGE_NO_DATA.exception());
+
+        tbProjectExchange.setResult(projectExchangeApprove);
+        tbProjectExchange.setRemark(remark);
+        return this.updateById(tbProjectExchange);
+    }
+
+    /**
+     * 项目计划变更详情接口
+     *
+     * @param id
+     * @return
+     */
+    @Override
+    public Object view(Long id) {
+        TBProjectExchange tbProjectExchange = this.getById(id);
+        Optional.ofNullable(tbProjectExchange).orElseThrow(() -> ExceptionResultEnum.PROJECT_EXCHANGE_NO_DATA.exception());
+
+        //TODO 需要根据crm单号取crm相关信息
+        return tbProjectExchange;
+    }
 }

+ 17 - 2
sop-business/src/main/resources/db/log/wangliang_update_log.sql

@@ -800,9 +800,18 @@ VALUES(3027, '流程控件查询接口', '/api/admin/widget/flow/select', 'URL',
 INSERT INTO sys_privilege
 (id, name, url, `type`, parent_id, `sequence`, property, related, enable, default_auth, front_display)
 VALUES(3028, '控件查询列表接口', '/api/admin/widget/list', 'URL', 64, 27, 'SYS', NULL, 1, 1, 0);
+INSERT INTO sys_privilege
+(id, name, url, `type`, parent_id, `sequence`, property, related, enable, default_auth, front_display)
+VALUES(3029, '批量结束流程接口', '/api/admin/flow/batch/delete', 'URL', 64, 28, 'SYS', NULL, 1, 1, 0);
+INSERT INTO sys_privilege
+(id, name, url, `type`, parent_id, `sequence`, property, related, enable, default_auth, front_display)
+VALUES(3030, '项目变更计划审核接口', '/api/admin/project/exchange/flow/approve', 'URL', 40, 3, 'AUTH', NULL, 1, 1, 0);
+INSERT INTO sys_privilege
+(id, name, url, `type`, parent_id, `sequence`, property, related, enable, default_auth, front_display)
+VALUES(3031, '项目变更计划详情接口', '/api/admin/project/exchange/view', 'URL', 40, 4, 'AUTH', NULL, 1, 1, 0);
 
 UPDATE sys_privilege
-SET name='处理申请', url='Finish', `type`='LINK', parent_id=44, `sequence`=1, property='AUTH', related=NULL, enable=1, default_auth=0, front_display=1
+SET name='处理申请', url='Finish', `type`='LINK', parent_id=44, `sequence`=1, property='AUTH', related='3030,3031', enable=1, default_auth=0, front_display=1
 WHERE id=3024;
 
 
@@ -810,4 +819,10 @@ ALTER TABLE t_b_project_exchange DROP COLUMN account_manager_id;
 
 ALTER TABLE t_b_project_exchange DROP COLUMN custom_type;
 
-ALTER TABLE t_b_project_exchange DROP COLUMN custom_name;
+ALTER TABLE t_b_project_exchange DROP COLUMN custom_name;
+
+ALTER TABLE t_b_project_exchange ADD result VARCHAR(20)
+    COMMENT '处理结果,FINISH:已完成,NOT_UPDATE:经沟通,取消变更,PARTIAL_UPDATE:经沟通,部分变更' NULL after content_json;
+
+ALTER TABLE t_b_project_exchange ADD remark VARCHAR(500)
+    COMMENT '变更备注' NULL after result;

+ 1 - 1
sop-common/src/main/java/com/qmth/sop/common/enums/DelayWarnTypeEnum.java

@@ -9,7 +9,7 @@ package com.qmth.sop.common.enums;
  */
 public enum DelayWarnTypeEnum {
 
-    PLAN("关键信息及计划变更"),
+    PLAN("项目信息及计划变更"),
 
     CANCEL("项目取消");
 

+ 2 - 0
sop-common/src/main/java/com/qmth/sop/common/enums/ExceptionResultEnum.java

@@ -77,6 +77,8 @@ public enum ExceptionResultEnum {
 
     DING_NO_DATA(HttpStatus.INTERNAL_SERVER_ERROR, 5000025, "没有考勤数据"),
 
+    PROJECT_EXCHANGE_NO_DATA(HttpStatus.INTERNAL_SERVER_ERROR, 5000026, "没有项目计划变更申请数据"),
+
     /**
      * 401
      */

+ 22 - 3
sop-server/src/main/java/com/qmth/sop/server/api/TBProjectExchangeController.java

@@ -7,9 +7,7 @@ import com.qmth.sop.business.bean.result.ProjectExchangeResult;
 import com.qmth.sop.business.entity.TBProjectExchange;
 import com.qmth.sop.business.service.TBProjectExchangeService;
 import com.qmth.sop.common.contant.SystemConstant;
-import com.qmth.sop.common.enums.DelayWarnTypeEnum;
-import com.qmth.sop.common.enums.ProductTypeEnum;
-import com.qmth.sop.common.enums.ProjectExchangeFlowStatusEnum;
+import com.qmth.sop.common.enums.*;
 import com.qmth.sop.common.util.Result;
 import com.qmth.sop.common.util.ResultUtil;
 import io.swagger.annotations.*;
@@ -66,4 +64,25 @@ public class TBProjectExchangeController {
                        @ApiParam(value = "页数", required = true) @RequestParam @Min(SystemConstant.PAGE_SIZE_MIN) @Max(SystemConstant.PAGE_SIZE_MAX) Integer pageSize) {
         return ResultUtil.ok(tbProjectExchangeService.list(new Page<>(pageNumber, pageSize), serviceId, createUserId, type, customType, flowStatus, customName, exchangeNo, startTime, endTime));
     }
+
+    @ApiOperation(value = "项目变更计划审核接口")
+    @RequestMapping(value = "/flow/approve", method = RequestMethod.POST)
+    @ApiResponses({@ApiResponse(code = 200, message = "返回信息", response = Object.class)})
+    public Result flowApprove(@ApiParam(value = "流程任务id", required = true) @RequestParam Long taskId,
+                              @ApiParam(value = "流程审批", required = true) @RequestParam FlowApprovePassEnum flowApprove,
+                              @ApiParam(value = "审核结果", required = true) @RequestParam ProjectExchangeApproveEnum projectExchangeApprove,
+                              @ApiParam(value = "flow备注") @RequestParam(required = false) String remark,
+                              @ApiParam(value = "审核用户id") @RequestParam(required = false) Long userId) throws InterruptedException {
+        if (flowApprove != FlowApprovePassEnum.PASS && flowApprove != FlowApprovePassEnum.DRAFT) {
+            throw ExceptionResultEnum.PARAMS_ERROR.exception("流程审批只能为通过或草稿");
+        }
+        return ResultUtil.ok(tbProjectExchangeService.flowApprove(taskId, flowApprove, projectExchangeApprove, remark, userId));
+    }
+
+    @ApiOperation(value = "项目变更计划详情接口")
+    @RequestMapping(value = "/view", method = RequestMethod.POST)
+    @ApiResponses({@ApiResponse(code = 200, message = "返回信息", response = Object.class)})
+    public Result view(@ApiParam(value = "主键", required = true) @RequestParam Long id) {
+        return ResultUtil.ok(tbProjectExchangeService.view(id));
+    }
 }

+ 8 - 0
sop-server/src/main/java/com/qmth/sop/server/api/TFCustomFlowController.java

@@ -28,6 +28,7 @@ import javax.validation.constraints.Max;
 import javax.validation.constraints.Min;
 import java.io.IOException;
 import java.util.Arrays;
+import java.util.List;
 import java.util.Objects;
 
 /**
@@ -112,6 +113,13 @@ public class TFCustomFlowController {
         return ResultUtil.ok(activitiService.flowEnd(flowId));
     }
 
+    @ApiOperation(value = "批量结束流程接口")
+    @RequestMapping(value = "/batch/delete", method = RequestMethod.POST)
+    @ApiResponses({@ApiResponse(code = 200, message = "返回信息", response = Object.class)})
+    public Result batchDelete(@ApiParam(value = "流程id数组", required = true) @RequestBody List<Long> flowIds) {
+        return ResultUtil.ok(activitiService.flowEnd(flowIds));
+    }
+
     @ApiOperation(value = "流程转办接口")
     @RequestMapping(value = "/task/approver/exchange", method = RequestMethod.POST)
     @ApiResponses({@ApiResponse(code = 200, message = "返回信息", response = Object.class)})