hfxc226 %!s(int64=3) %!d(string=hai) anos
pai
achega
d9b530d32f

+ 0 - 83
platform-activiti/src/main/java/com/platform/activiti/controller/ActivitiController.java

@@ -125,43 +125,6 @@ public class ActivitiController {
     @Autowired
     ProcessEngineConfiguration processEngineConfiguration;
 
-    /**
-     * 同步用户 角色 用户角色到activiti表中
-     */
-    @PostMapping(value = "/sync")
-    @ResponseBody
-    public R sync() {
-        try {
-            List<SysUser> userList = userMapper.selectAll();
-            for (SysUser user : userList) {
-                User au = new UserEntity();
-                au.setId(user.getUserId());
-                au.setFirstName(user.getRealName());
-                identityService.deleteUser(au.getId());
-                identityService.saveUser(au);
-            }
-            List<SysRole> sysRoleList = roleMapper.selectAll();
-            for (SysRole role : sysRoleList) {
-                Group group = new GroupEntity();
-                group.setId(role.getRoleId());
-                group.setName(role.getRoleName());
-                identityService.deleteGroup(group.getId());
-                identityService.saveGroup(group);
-            }
-            List<SysUserRole> roleUserList = sysUserRoleMapper.selectAll();
-
-            for (SysUserRole sysRoleUser : roleUserList) {
-                identityService.deleteMembership(sysRoleUser.getUserId(), sysRoleUser.getRoleId());
-                identityService.createMembership(sysRoleUser.getUserId(), sysRoleUser.getRoleId());
-            }
-            return R.success(ResultCode.SYNC_SUCCESS);
-        } catch (Exception e) {
-            e.printStackTrace();
-            log.error("同步失败:" + e.getMessage());
-            return R.error(ResultCode.SYNC_FAIL.getDescription());
-        }
-    }
-
     /**
      * 添加模型
      */
@@ -645,52 +608,6 @@ public class ActivitiController {
         return R.success(records);
     }
 
-    /**
-     * 根据 执行对象id获取审批信息
-     *
-     * @param userId
-     * @return
-     */
-    @ResponseBody
-    @GetMapping("/audit/history/user/{userId}")
-    public R userHistory(@PathVariable("userId") String userId) {
-        //保证运行ing
-        List<ActApplyInfo> infos = new ArrayList<>();
-        List<Task> tasks = this.taskService.createTaskQuery().taskCandidateOrAssigned(userId).orderByTaskCreateTime().desc().list();
-        if (CollectionUtil.isNotEmpty(tasks)) {
-            tasks.forEach(item -> {
-                String taskId = item.getId();
-
-                Map<String, Object> map = taskService.getVariables(taskId);
-                ActApplyInfo applyInfo = (ActApplyInfo) map.get("data");
-                applyInfo.setProcessInstanceId(item.getProcessInstanceId());
-                applyInfo.setTaskId(item.getId());
-
-                /**如果是自己*/
-                if (userId.equals(applyInfo.getUserId())) {
-                    applyInfo.setSelf(true);
-                }
-                infos.add(applyInfo);
-            });
-        }
-        List<HistoricTaskInstance> list = historyService.createHistoricTaskInstanceQuery().taskAssignee(userId).orderByTaskCreateTime().desc().list();
-        if (CollectionUtil.isNotEmpty(list)) {
-            list.forEach(item -> {
-                String taskId = item.getId();
-                ActApplyInfo applyInfo = (ActApplyInfo) item.getProcessVariables().get("data");
-                applyInfo.setProcessInstanceId(item.getProcessInstanceId());
-                applyInfo.setTaskId(item.getId());
-
-                /**如果是自己*/
-                if (userId.equals(applyInfo.getUserId())) {
-                    applyInfo.setSelf(true);
-                }
-                infos.add(applyInfo);
-            });
-        }
-        return R.success(infos);
-    }
-
     /**
      * 获取图片:根据流程定义(流程实例,请调用下面方法)
      *

+ 24 - 0
platform-common/src/main/java/com/platform/common/bean/BaseActivitiDTO.java

@@ -0,0 +1,24 @@
+package com.platform.common.bean;
+
+import com.platform.common.model.OauthUser;
+import com.platform.common.model.UserInfo;
+import com.platform.common.util.SecurityUtils;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+import java.util.List;
+
+/**
+ * @Description
+ * @Author chenyuehu
+ * @Date 2019/5/15
+ * @Version Copyright (c) 2019,北京乾元坤和科技有限公司 All rights reserved.
+ */
+@Data
+@Accessors(chain = true)
+public class BaseActivitiDTO implements Serializable {
+    String id;
+
+}

+ 5 - 0
platform-dao/src/main/java/com/platform/dao/entity/activiti/ActivitiUserModel.java

@@ -29,6 +29,11 @@ public class ActivitiUserModel implements Serializable {
      */
     @Id
     private String id;
+    /**
+     * 找不到不到人员,是否自动审核并且跳过(审批人员默认设置为超级管理员)
+     */
+    @Transient
+    private Boolean autoJump;
     /**
      * 模型id
      */

+ 8 - 7
platform-rest/src/main/java/com/platform/rest/controller/activiti/SbScrapActivitiController.java

@@ -5,6 +5,7 @@ import com.platform.common.util.R;
 import com.platform.dao.dto.sb.SbScrapFormDTO;
 import com.platform.rest.log.annotation.SysLog;
 import com.platform.service.business.SbScrapActivitiBusinessService;
+import com.platform.service.business.impl.SbScrapActivitiServiceImpl;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.activiti.engine.runtime.ProcessInstance;
@@ -22,7 +23,7 @@ import org.springframework.web.bind.annotation.*;
 @RequestMapping("/activiti/sb/scrap")
 public class SbScrapActivitiController {
 
-    private final SbScrapActivitiBusinessService sbScrapActivitiBusinessService;
+    private final SbScrapActivitiServiceImpl sbScrapActivitiServiceImpl;
 
     /**
      * 启动:将设备id和表单id设置到businessKey中
@@ -32,7 +33,7 @@ public class SbScrapActivitiController {
     @SysLog("设备报废提交审批")
     @PutMapping("/start")
     public R start(@RequestBody ActAuditRequest actAuditRequest) {
-        sbScrapActivitiBusinessService.start(actAuditRequest);
+        sbScrapActivitiServiceImpl.start(actAuditRequest);
         return new R<>("设备报废申请已提交");
     }
 
@@ -44,7 +45,7 @@ public class SbScrapActivitiController {
     @SysLog("设备报废审核")
     @PutMapping("/audit")
     public R audit(@RequestBody ActAuditRequest actAuditRequest) {
-        sbScrapActivitiBusinessService.audit(actAuditRequest);
+        sbScrapActivitiServiceImpl.audit(actAuditRequest);
         return new R<>();
     }
 
@@ -56,7 +57,7 @@ public class SbScrapActivitiController {
     @SysLog("设备报废终止审核")
     @PutMapping("/stop")
     public R stop(@RequestBody ActAuditRequest actAuditRequest) {
-        sbScrapActivitiBusinessService.stop(actAuditRequest);
+        sbScrapActivitiServiceImpl.stop(actAuditRequest);
         return new R<>();
     }
 
@@ -68,7 +69,7 @@ public class SbScrapActivitiController {
     @SysLog("设备报废转签")
     @PutMapping("/claim")
     public R claim(@RequestBody ActAuditRequest actAuditRequest) {
-        sbScrapActivitiBusinessService.claim(actAuditRequest);
+        sbScrapActivitiServiceImpl.claim(actAuditRequest);
         return new R<>("已签收,请办理");
     }
 
@@ -80,7 +81,7 @@ public class SbScrapActivitiController {
     @SysLog("设备报废转签")
     @PutMapping("/assign")
     public R assign(@RequestBody ActAuditRequest actAuditRequest) {
-        sbScrapActivitiBusinessService.assign(actAuditRequest);
+        sbScrapActivitiServiceImpl.assign(actAuditRequest);
         return new R<>("已转签");
     }
 
@@ -92,7 +93,7 @@ public class SbScrapActivitiController {
     @SysLog("设备报废审核历史")
     @GetMapping("/history/{processInstanceId}")
     public R history(@PathVariable("processInstanceId") String processInstanceId) {
-        return new R(sbScrapActivitiBusinessService.history(processInstanceId));
+        return new R(sbScrapActivitiServiceImpl.history(processInstanceId));
     }
 
 }

+ 9 - 4
platform-service/src/main/java/com/platform/service/activiti/strategy/ActivitiAssignStrategyRole.java

@@ -19,6 +19,7 @@ import org.dom4j.Element;
 import org.springframework.stereotype.Service;
 import org.springframework.util.CollectionUtils;
 
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
@@ -51,7 +52,7 @@ public class ActivitiAssignStrategyRole implements ActivitiAssignStrategy<String
             log.info(candidateUsers.getValue());
             element.remove(candidateUsers);
         }
-        element.addAttribute("activiti:candidateUsers", getIds(activitiUserModel));
+        element.addAttribute("activiti:candidateUsers", StringUtils.join(getIds(activitiUserModel), ","));
 
         // 指定角色的,就不会指定人员,需要清除
         Attribute assignee = element.attribute("assignee");
@@ -63,10 +64,13 @@ public class ActivitiAssignStrategyRole implements ActivitiAssignStrategy<String
 
     @Override
     public void handleAssign(Task task, Map<String, String> map, ActivitiUserModel activitiUserModel) {
-        taskService.addCandidateUser(task.getId(), getIds(activitiUserModel));
+        List<String> idList = getIds(activitiUserModel);
+        for(String id: idList){
+            taskService.addCandidateUser(task.getId(), id);
+        }
     }
 
-    public String getIds(ActivitiUserModel activitiUserModel){
+    public List<String> getIds(ActivitiUserModel activitiUserModel){
         String roleId = activitiUserModel.getRoleId();
         SysUserDTO sysUserDTO = new SysUserDTO();
         sysUserDTO.setRoleIds(Arrays.asList(roleId));
@@ -79,6 +83,7 @@ public class ActivitiAssignStrategyRole implements ActivitiAssignStrategy<String
             throw new BusinessException("查询不到角色对应人员,请先设置,角色名称:" + sysRoleVO.getRoleName());
         }
         List<String> ids = sysUserVOList.stream().map(SysUserVO::getUserId).collect(Collectors.toList());
-        return StringUtils.join(ids, ",");
+        log.info("ids: " + ids);
+        return ids;
     }
 }

+ 11 - 0
platform-service/src/main/java/com/platform/service/activiti/strategy/ActivitiAssignStrategyUser.java

@@ -1,10 +1,14 @@
 package com.platform.service.activiti.strategy;
 
+import com.platform.common.exception.BusinessException;
 import com.platform.dao.entity.activiti.ActivitiUserModel;
+import com.platform.dao.entity.upms.SysUser;
 import com.platform.dao.enums.ActivitiUserModelTypeEnum;
+import com.platform.dao.mapper.upms.SysUserMapper;
 import com.platform.service.activiti.ActivitiAssignStrategy;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import org.activiti.engine.TaskService;
 import org.activiti.engine.task.Task;
 import org.dom4j.Attribute;
 import org.dom4j.Element;
@@ -19,6 +23,8 @@ import java.util.Map;
 @AllArgsConstructor
 @Slf4j
 public class ActivitiAssignStrategyUser implements ActivitiAssignStrategy<String> {
+    private SysUserMapper sysUserMapper;
+    private final TaskService taskService;
     /**
      * @see ActivitiUserModelTypeEnum
      * @return 策略能处理的类型
@@ -46,6 +52,11 @@ public class ActivitiAssignStrategyUser implements ActivitiAssignStrategy<String
 
     @Override
     public void handleAssign(Task task, Map<String, String> map, ActivitiUserModel activitiUserModel) {
+        SysUser sysUser = sysUserMapper.selectByPrimaryKey(activitiUserModel.getAssignee());
+        if(sysUser == null){
+            throw new BusinessException("找不到指定用户,无法设置,用户id:" + activitiUserModel.getAssignee());
+        }
         task.setAssignee(activitiUserModel.getAssignee());
+        taskService.saveTask(task);
     }
 }

+ 96 - 0
platform-service/src/main/java/com/platform/service/business/ActivitiBaseService.java

@@ -0,0 +1,96 @@
+package com.platform.service.business;
+
+import cn.hutool.core.collection.CollectionUtil;
+import com.platform.activiti.dao.entity.ActApplyInfo;
+import com.platform.activiti.dao.entity.ActAuditRecord;
+import com.platform.activiti.dao.entity.ActAuditRequest;
+import com.platform.activiti.enums.ActApplyEnum;
+import com.platform.common.constant.CommonConstants;
+import com.platform.common.enums.ResultCode;
+import com.platform.common.exception.BusinessException;
+import com.platform.common.model.UserInfo;
+import com.platform.common.util.SecurityUtils;
+import com.platform.dao.entity.activiti.ActivitiUserModel;
+import com.platform.dao.entity.sb.SbInfo;
+import com.platform.dao.entity.upms.SysUser;
+import com.platform.dao.enums.SbInfoStatusEnum;
+import com.platform.service.activiti.ActivitiAssignStrategy;
+import com.platform.service.activiti.ActivitiUserModelService;
+import com.platform.service.sb.SbInfoService;
+import com.platform.service.sb.SbScrapFormService;
+import com.platform.service.upms.SysUserService;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.activiti.engine.*;
+import org.activiti.engine.history.HistoricDetail;
+import org.activiti.engine.history.HistoricProcessInstance;
+import org.activiti.engine.history.HistoricVariableUpdate;
+import org.activiti.engine.repository.Model;
+import org.activiti.engine.runtime.ProcessInstance;
+import org.activiti.engine.task.Task;
+import org.apache.commons.lang.StringUtils;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.time.LocalDateTime;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * @Description 工作流业务
+ * @Author chenyuehu
+ * @Date 2020/11/19
+ * @Version Copyright (c) 2019,合肥乾元坤合科技有限公司 All rights reserved.
+ */
+public interface ActivitiBaseService {
+
+    void start(ActAuditRequest actAuditRequest);
+
+    /**
+     * 审批,第一个审批人为发起人,自动审批。
+     * 审批设置对象:ActApplyInfo
+     *
+     * @param actAuditRequest
+     */
+    void audit(ActAuditRequest actAuditRequest);
+
+    /**
+     * 终止审核
+     * 审批设置对象:ActApplyInfo
+     *
+     * @param actAuditRequest
+     */
+    void stop(ActAuditRequest actAuditRequest) ;
+
+    /**
+     * 签收
+     * 审批设置对象:ActApplyInfo
+     *
+     * @param actAuditRequest
+     */
+    void claim(ActAuditRequest actAuditRequest);
+
+    /**
+     * 转签
+     * 审批设置对象:ActApplyInfo
+     *
+     * @param actAuditRequest
+     */
+    void assign(ActAuditRequest actAuditRequest);
+
+    /**
+     * 审核历史:都在ActRecord里面
+     * 审批设置对象:ActApplyInfo
+     *
+     * @param processInstanceId
+     */
+    List<ActAuditRecord> history(String processInstanceId);
+
+    /**
+     * 判定流程是否结束
+     *
+     * @param actAuditRequest
+     * @return
+     */
+    boolean doCheckLast(ActAuditRequest actAuditRequest);
+}

+ 3 - 23
platform-service/src/main/java/com/platform/service/business/SbScrapActivitiBusinessService.java

@@ -48,7 +48,6 @@ import java.util.stream.Collectors;
 public class SbScrapActivitiBusinessService {
 
     private SbScrapFormService sbScrapFormService;
-    private SbInfoService sbInfoService;
     private RepositoryService repositoryService;
     private final IdentityService identityService;
     private final RuntimeService runtimeService;
@@ -123,7 +122,7 @@ public class SbScrapActivitiBusinessService {
         Task nextTask = taskService.createTaskQuery().processInstanceId(instance.getId()).orderByTaskCreateTime().desc().singleResult();
         Map<String, String> maps = new HashMap<>();
         maps.put("userId", user.getUserId());
-        modifyTaskAssign(model.getId(), maps, nextTask, list);
+        //modifyTaskAssign(model.getId(), maps, nextTask, list);
 
         // 更新业务数据
         sbScrapFormService.updateByActivitiStart(instance.getId(), actAuditRequest.getId());
@@ -179,7 +178,7 @@ public class SbScrapActivitiBusinessService {
                 Map<String, String> maps = new HashMap<>();
                 maps.put("userId", user.getUserId());
                 Task nextTask = taskService.createTaskQuery().processInstanceId(task.getProcessInstanceId()).orderByTaskCreateTime().desc().singleResult();
-                modifyTaskAssign(model.getId(), maps, nextTask, list);
+                //modifyTaskAssign(model.getId(), maps, nextTask, list);
             }
         }
 
@@ -295,24 +294,5 @@ public class SbScrapActivitiBusinessService {
         }
     }
 
-    /**
-     * 修改审批节点:每次审批后,包括第一次提交,来更新下一次任务的审批人信息。不能更新xml。更新xml只适合部根据发起人所属部门的情况
-     * 每次上一个节点审批后,设置下一个审批人员信息,并记录到task的变量里面
-     *
-     * @param modeId
-     * @param map,发起人信息,为了设置
-     * @param list
-     * @throws Exception
-     */
-    public void modifyTaskAssign(String modeId, Map<String, String> map, Task task, List<ActivitiUserModel> list) {
-        Model model = repositoryService.getModel(modeId);
-        ActivitiUserModel userTaskModel =
-                list.stream().filter(u -> u.getId().equals(task.getTaskDefinitionKey())).collect(Collectors.toList()).get(0);
-        Integer type = userTaskModel.getType();
-        ActivitiAssignStrategy activitiAssignStrategy =
-                activitiAssignStrategyList.stream().filter(strategy -> strategy.getType().equals(type)).collect(Collectors.toList()).get(0);
-        activitiAssignStrategy.handleAssign(task, map, userTaskModel);
-        userTaskModel.setDeploymentId(model.getDeploymentId());
-        activitiUserModelService.updateBatch(list);
-    }
+
 }

+ 348 - 0
platform-service/src/main/java/com/platform/service/business/impl/ActivitiBaseServiceAbstract.java

@@ -0,0 +1,348 @@
+package com.platform.service.business.impl;
+
+import cn.hutool.core.collection.CollectionUtil;
+import com.platform.activiti.dao.entity.ActApplyInfo;
+import com.platform.activiti.dao.entity.ActAuditRecord;
+import com.platform.activiti.dao.entity.ActAuditRequest;
+import com.platform.activiti.enums.ActApplyEnum;
+import com.platform.common.constant.CommonConstants;
+import com.platform.common.enums.ResultCode;
+import com.platform.common.exception.BusinessException;
+import com.platform.common.model.UserInfo;
+import com.platform.common.util.SecurityUtils;
+import com.platform.dao.entity.activiti.ActivitiUserModel;
+import com.platform.dao.entity.upms.SysUser;
+import com.platform.service.activiti.ActivitiAssignStrategy;
+import com.platform.service.activiti.ActivitiUserModelService;
+import com.platform.service.business.ActivitiBaseService;
+import com.platform.service.sb.SbInfoService;
+import com.platform.service.sb.SbScrapFormService;
+import com.platform.service.upms.SysUserService;
+import lombok.AllArgsConstructor;
+import org.activiti.engine.*;
+import org.activiti.engine.history.HistoricDetail;
+import org.activiti.engine.history.HistoricProcessInstance;
+import org.activiti.engine.history.HistoricVariableUpdate;
+import org.activiti.engine.repository.Model;
+import org.activiti.engine.runtime.ProcessInstance;
+import org.activiti.engine.task.Task;
+import org.apache.commons.lang.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.time.LocalDateTime;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * @Description 工作流业务
+ * @Author chenyuehu
+ * @Date 2020/11/19
+ * @Version Copyright (c) 2019,合肥乾元坤合科技有限公司 All rights reserved.
+ */
+@AllArgsConstructor
+public abstract class ActivitiBaseServiceAbstract implements ActivitiBaseService {
+    @Autowired
+    private RepositoryService repositoryService;
+    @Autowired
+    private IdentityService identityService;
+    @Autowired
+    private RuntimeService runtimeService;
+    @Autowired
+    private HistoryService historyService;
+    @Autowired
+    private TaskService taskService;
+    @Autowired
+    private SysUserService sysUserService;
+
+    @Autowired
+    private ActivitiUserModelService activitiUserModelService;
+    /**
+     * 通过spring获取所有策略类
+     */
+    @Autowired
+    private List<ActivitiAssignStrategy> activitiAssignStrategyList;
+
+    protected ActivitiBaseServiceAbstract() {
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void start(ActAuditRequest actAuditRequest) {
+        doCheck(actAuditRequest);
+        doStart(actAuditRequest);
+        doUpdate(actAuditRequest);
+    }
+
+    protected abstract void doCheck(ActAuditRequest actAuditRequest);
+
+    protected abstract void doUpdate(ActAuditRequest actAuditRequest);
+
+    protected void doStart(ActAuditRequest actAuditRequest) {
+        UserInfo user = SecurityUtils.getUserInfo();
+        // 设置发起对象,保存到流程实例中
+        ActApplyInfo applyInfo = new ActApplyInfo(actAuditRequest.getId(),
+                ActApplyEnum.SB_INFO_SCRAP.getName(), ActApplyEnum.SB_INFO_SCRAP.getKey(),
+                0,
+                LocalDateTime.now());
+        Map<String, Object> map = new HashMap<>(1);
+
+        applyInfo.setUserId(user.getUserId());
+        applyInfo.setUserName(user.getRealName());
+        map.put("data", applyInfo);
+        map.put("userId", applyInfo.getUserId());
+        // 设置流程启动人信息,为了后面查询我的发起列表
+        identityService.setAuthenticatedUserId(user.getUserId());
+        ProcessInstance instance = null;
+        if (StringUtils.isBlank(actAuditRequest.getProcessInstanceId())) {
+            instance = runtimeService.startProcessInstanceByKey(ActApplyEnum.SB_INFO_SCRAP.getKey(), actAuditRequest.getId(), map);
+        } else { // 再次提交审批的,之前被拒绝的
+            ProcessInstance instanceExsit = runtimeService.createProcessInstanceQuery()
+                    .processInstanceId(actAuditRequest.getProcessInstanceId()).singleResult();
+            if (instanceExsit == null) {
+                instance = runtimeService.startProcessInstanceByKey(ActApplyEnum.SB_INFO_SCRAP.getKey(), actAuditRequest.getId(), map);
+                actAuditRequest.setProcessInstanceId(instance.getId());
+            } else {
+                instance = runtimeService.startProcessInstanceById(actAuditRequest.getProcessInstanceId(), actAuditRequest.getId(), map);
+            }
+        }
+
+
+        // 第一个审批人为发起人,为自动审批。
+        // 设置审批对象,保存到task实例中,每次审核都要更新追加这个对象
+        Task task = taskService.createTaskQuery().processInstanceId(actAuditRequest.getProcessInstanceId()).orderByTaskCreateTime().desc().singleResult();
+
+        List<ActAuditRecord> records = new ArrayList<>();
+        records.add(new ActAuditRecord(user.getUserId(), user.getRealName(), "提交",
+                LocalDateTime.now(), true, task.getId(), task.getName()));
+        Map<String, Object> data = new HashMap<>();
+        data.put(CommonConstants.ACT_AUDIT_RECORD, records);
+        data.put("result", 1);
+        task.setAssignee(user.getUserId());
+        taskService.addComment(task.getId(), actAuditRequest.getProcessInstanceId(), "提交");
+        taskService.complete(task.getId(), data);
+        // 分配下一个节点的审批人信息
+        // 设置各个节点审批人员信息
+        Model model = repositoryService.createModelQuery().modelKey(ActApplyEnum.SB_INFO_SCRAP.getKey()).singleResult();
+        List<ActivitiUserModel> list = activitiUserModelService.getModelByModelId(model.getId());
+        if (CollectionUtil.isEmpty(list)) {
+            throw new BusinessException("审批节点未设置,请先设置");
+        }
+        Task nextTask = taskService.createTaskQuery().processInstanceId(actAuditRequest.getProcessInstanceId()).orderByTaskCreateTime().desc().singleResult();
+        Map<String, String> maps = new HashMap<>();
+        maps.put("userId", user.getUserId());
+        modifyTaskAssign(model.getId(), maps, nextTask, list);
+    }
+
+    /**
+     * 审批,第一个审批人为发起人,自动审批。
+     * 审批设置对象:ActApplyInfo
+     *
+     * @param actAuditRequest
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void audit(ActAuditRequest actAuditRequest) {
+        UserInfo user = SecurityUtils.getUserInfo();
+        if (doAudit(actAuditRequest)) {
+            if (!doCheckLast(actAuditRequest)) {
+                // 分配下一个节点的审批人信息
+                Model model = repositoryService.createModelQuery().modelKey(ActApplyEnum.SB_INFO_SCRAP.getKey()).singleResult();
+                List<ActivitiUserModel> list = activitiUserModelService.getModelByModelId(model.getId());
+                if (CollectionUtil.isEmpty(list)) {
+                    throw new BusinessException("审批节点未设置,请先设置");
+                }
+                Map<String, String> maps = new HashMap<>();
+                maps.put("userId", user.getUserId());
+                Task nextTask = taskService.createTaskQuery().processInstanceId(actAuditRequest.getProcessInstanceId()).orderByTaskCreateTime().desc().singleResult();
+                modifyTaskAssign(model.getId(), maps, nextTask, list);
+            } else {
+                doFinish(actAuditRequest);
+            }
+        } else {
+            doRefuse(actAuditRequest);
+        }
+    }
+
+    protected abstract void doRefuse(ActAuditRequest actAuditRequest);
+
+    protected abstract void doFinish(ActAuditRequest actAuditRequest);
+
+    @Transactional(rollbackFor = Exception.class)
+    protected boolean doAudit(ActAuditRequest actAuditRequest) {
+        UserInfo user = SecurityUtils.getUserInfo();
+        // 设置发起对象,保存到流程实例中
+        String taskId = actAuditRequest.getTaskId();
+        Map<String, Object> map = new HashMap<>();
+        Integer result = 0;
+        if (actAuditRequest.getAuditFlag()) {
+            result = 1;// 同意
+        } else {
+            result = 0;// 拒绝
+        }
+        map.put("result", result);
+        Task task = taskService.createTaskQuery().taskId(taskId).singleResult();
+        Map<String, Object> variables = taskService.getVariables(taskId);
+        List<ActAuditRecord> records = new ArrayList<>();
+        Object o = variables.get(CommonConstants.ACT_AUDIT_RECORD);
+        if (o != null) {
+            records = (List<ActAuditRecord>) o;
+        }
+
+        records.add(0, new ActAuditRecord(user.getUserId(), user.getRealName(), actAuditRequest.getRefuseReason(),
+                LocalDateTime.now(), result == 0 ? false : true, taskId, task.getName()));
+        map.put(CommonConstants.ACT_AUDIT_RECORD, records);
+        taskService.addComment(taskId, actAuditRequest.getProcessInstanceId(), actAuditRequest.getRefuseReason());
+        taskService.complete(taskId, map);
+        // 审批拒绝,则不用判断是否结束。审批同意则要判断是否流程结束,结束则更新报废单状态和设备状态
+        return result == 0 ? false : true;
+
+    }
+
+    /**
+     * 终止审核
+     * 审批设置对象:ActApplyInfo
+     *
+     * @param actAuditRequest
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void stop(ActAuditRequest actAuditRequest) {
+        String processInstanceId = actAuditRequest.getProcessInstanceId();
+        if (StringUtils.isNotEmpty(processInstanceId)) {
+            ProcessInstance instance = runtimeService.createProcessInstanceQuery()
+                    .processInstanceId(processInstanceId).singleResult();
+            if (instance != null) {
+                runtimeService.deleteProcessInstance(processInstanceId, "终止审批");
+                historyService.deleteHistoricProcessInstance(processInstanceId);
+            }else{
+                List<ProcessInstance> instanceList = runtimeService.createProcessInstanceQuery()
+                        .processInstanceBusinessKey(actAuditRequest.getId()).list();
+                for(ProcessInstance processInstance:instanceList){
+                    runtimeService.deleteProcessInstance(processInstance.getId(), "终止审批");
+                    historyService.deleteHistoricProcessInstance(processInstance.getId());
+                }
+            }
+        }
+        doStop(actAuditRequest);
+    }
+
+    protected abstract void doStop(ActAuditRequest actAuditRequest);
+
+    /**
+     * 签收
+     * 审批设置对象:ActApplyInfo
+     *
+     * @param actAuditRequest
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void claim(ActAuditRequest actAuditRequest) {
+        String taskId = actAuditRequest.getTaskId();
+        String userId = SecurityUtils.getUserInfo().getUserId();
+        if (StringUtils.isEmpty(taskId)) {
+            throw new BusinessException("taskId为空,请选择");
+        }
+        taskService.setAssignee(taskId, userId);
+    }
+
+    /**
+     * 转签
+     * 审批设置对象:ActApplyInfo
+     *
+     * @param actAuditRequest
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void assign(ActAuditRequest actAuditRequest) {
+        String taskId = actAuditRequest.getTaskId();
+        String userId = actAuditRequest.getChangeUser();
+        if (StringUtils.isEmpty(taskId)) {
+            throw new BusinessException("taskId为空,请选择");
+        }
+        if (StringUtils.isEmpty(userId)) {
+            throw new BusinessException("请设置转签人员");
+        }
+        SysUser sysUser = sysUserService.getModelById(userId);
+        if (sysUser == null) {
+            throw new BusinessException("用户不存在,请选择其他人员");
+        }
+        taskService.setAssignee(taskId, userId);
+    }
+
+    /**
+     * 审核历史:都在ActRecord里面
+     * 审批设置对象:ActApplyInfo
+     *
+     * @param processInstanceId
+     */
+    @Override
+    public List<ActAuditRecord> history(String processInstanceId) {
+        ProcessInstance instance = runtimeService.createProcessInstanceQuery()
+                .processInstanceId(processInstanceId).singleResult();
+        //保证运行ing
+        List<ActAuditRecord> records = new ArrayList<>();
+        if (instance != null) {
+            Task task = this.taskService.createTaskQuery().processInstanceId(processInstanceId).singleResult();
+            Map<String, Object> variables = taskService.getVariables(task.getId());
+            Object o = variables.get(CommonConstants.ACT_AUDIT_RECORD);
+            if (o != null) {
+                /*获取历史审核信息*/
+                records = (List<ActAuditRecord>) o;
+            }
+        } else {
+            List<HistoricDetail> list = historyService.createHistoricDetailQuery().
+                    processInstanceId(processInstanceId).orderByTime().desc().list();
+            if (CollectionUtil.isNotEmpty(list)) {
+                HistoricDetail historicDetail = list.get(0);
+                HistoricVariableUpdate variable = (HistoricVariableUpdate) historicDetail;
+                String variableName = variable.getVariableName();
+                if (CommonConstants.ACT_AUDIT_RECORD.equals(variableName)) {
+                    records.clear();
+                    records.addAll((List<ActAuditRecord>) variable.getValue());
+                }
+            }
+        }
+        return records;
+    }
+
+    /**
+     * 判定流程是否结束
+     *
+     * @param actAuditRequest
+     * @return
+     */
+    @Override
+    public boolean doCheckLast(ActAuditRequest actAuditRequest) {
+        HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery().processInstanceId(actAuditRequest.getProcessInstanceId()).singleResult();
+        if (Objects.isNull(historicProcessInstance)) {
+            return true;
+        }
+        if (Objects.isNull(historicProcessInstance.getEndTime())) {
+            return false;
+        } else {
+            return true;
+        }
+    }
+
+    /**
+     * 修改审批节点:每次审批后,包括第一次提交,来更新下一次任务的审批人信息。不能更新xml。更新xml只适合部根据发起人所属部门的情况
+     * 每次上一个节点审批后,设置下一个审批人员信息,并记录到task的变量里面
+     *
+     * @param modeId
+     * @param map,发起人信息,为了设置
+     * @param list
+     * @throws Exception
+     */
+    public void modifyTaskAssign(String modeId, Map<String, String> map, Task task, List<ActivitiUserModel> list) {
+        Model model = repositoryService.getModel(modeId);
+        ActivitiUserModel userTaskModel =
+                list.stream().filter(u -> u.getId().equals(task.getTaskDefinitionKey())).collect(Collectors.toList()).get(0);
+        Integer type = userTaskModel.getType();
+        ActivitiAssignStrategy activitiAssignStrategy =
+                activitiAssignStrategyList.stream().filter(strategy -> strategy.getType().equals(type)).collect(Collectors.toList()).get(0);
+        activitiAssignStrategy.handleAssign(task, map, userTaskModel);
+        userTaskModel.setDeploymentId(model.getDeploymentId());
+        // activitiUserModelService.updateBatch(list);
+    }
+}

+ 146 - 0
platform-service/src/main/java/com/platform/service/business/impl/SbScrapActivitiServiceImpl.java

@@ -0,0 +1,146 @@
+package com.platform.service.business.impl;
+
+import cn.hutool.core.collection.CollectionUtil;
+import com.platform.activiti.dao.entity.ActApplyInfo;
+import com.platform.activiti.dao.entity.ActAuditRecord;
+import com.platform.activiti.dao.entity.ActAuditRequest;
+import com.platform.activiti.enums.ActApplyEnum;
+import com.platform.common.constant.CommonConstants;
+import com.platform.common.enums.ResultCode;
+import com.platform.common.exception.BusinessException;
+import com.platform.common.model.UserInfo;
+import com.platform.common.util.SecurityUtils;
+import com.platform.dao.entity.activiti.ActivitiUserModel;
+import com.platform.dao.entity.sb.SbInfo;
+import com.platform.dao.entity.sb.SbScrapForm;
+import com.platform.dao.entity.upms.SysUser;
+import com.platform.dao.enums.ActivitiFormStatusEnum;
+import com.platform.dao.enums.SbInfoStatusEnum;
+import com.platform.dao.mapper.sb.SbInfoMapper;
+import com.platform.dao.mapper.sb.SbScrapFormMapper;
+import com.platform.service.activiti.ActivitiAssignStrategy;
+import com.platform.service.activiti.ActivitiUserModelService;
+import com.platform.service.business.ActivitiBaseService;
+import com.platform.service.sb.SbInfoService;
+import com.platform.service.sb.SbScrapFormService;
+import com.platform.service.upms.SysUserService;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.activiti.engine.*;
+import org.activiti.engine.history.HistoricDetail;
+import org.activiti.engine.history.HistoricProcessInstance;
+import org.activiti.engine.history.HistoricVariableUpdate;
+import org.activiti.engine.repository.Model;
+import org.activiti.engine.runtime.ProcessInstance;
+import org.activiti.engine.task.Task;
+import org.apache.commons.lang.StringUtils;
+import org.springframework.stereotype.Service;
+
+import java.time.LocalDateTime;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * @Description 工作流业务
+ * @Author chenyuehu
+ * @Date 2020/11/19
+ * @Version Copyright (c) 2019,合肥乾元坤合科技有限公司 All rights reserved.
+ */
+@Slf4j
+@AllArgsConstructor
+@Service("sbScrapActivitiServiceImpl")
+public class SbScrapActivitiServiceImpl extends ActivitiBaseServiceAbstract {
+
+    private SbScrapFormMapper sbScrapFormMapper;
+    private SbInfoMapper sbInfoMapper;
+
+    /**
+     * 检查业务是否可以发起,比如检查业务状态等
+     *
+     * @param actAuditRequest
+     */
+    @Override
+    protected void doCheck(ActAuditRequest actAuditRequest) {
+        SbScrapForm sbScrapForm = sbScrapFormMapper.selectByPrimaryKey(actAuditRequest.getId());
+        if (sbScrapForm == null) {
+            throw new BusinessException("报废单不存在");
+        }
+        if (!sbScrapForm.getStatus().equals(1)) {
+            throw new BusinessException("只要草稿状态下的报废单,才可以提交申请");
+        }
+        SbInfo sbInfo = sbInfoMapper.selectByPrimaryKey(sbScrapForm.getSbId());
+        if (sbInfo == null) {
+            throw new BusinessException("设备不存在");
+        }
+        if (sbInfo.getStatus().equals(SbInfoStatusEnum.IN_SCRAP.getValue()) || sbInfo.getStatus().equals(SbInfoStatusEnum.SCRAPED.getValue()) || sbInfo.getStatus().equals(SbInfoStatusEnum.IN_USE.getValue())) {
+            throw new BusinessException("设备状态无法报废");
+        }
+    }
+
+    /**
+     * 更新业务
+     *
+     * @param actAuditRequest
+     */
+    @Override
+    protected void doUpdate(ActAuditRequest actAuditRequest) {
+        SbScrapForm updInfo = sbScrapFormMapper.selectByPrimaryKey(actAuditRequest.getId());
+        updInfo.setId(actAuditRequest.getId());
+        updInfo.setStatus(ActivitiFormStatusEnum.EXECUTING.getValue());
+        updInfo.setProcessInstanceId(actAuditRequest.getProcessInstanceId());
+        sbScrapFormMapper.updateByPrimaryKeySelective(updInfo);
+
+        SbInfo sbInfo = new SbInfo();
+        sbInfo.setStatus(SbInfoStatusEnum.IN_SCRAP.getValue());
+        sbInfo.setId(updInfo.getSbId());
+        sbInfoMapper.updateByPrimaryKeySelective(sbInfo);
+    }
+
+    /**
+     * 拒绝业务
+     *
+     * @param actAuditRequest
+     */
+    @Override
+    protected void doRefuse(ActAuditRequest actAuditRequest) {
+        SbScrapForm updInfo = sbScrapFormMapper.selectByPrimaryKey(actAuditRequest.getId());
+        updInfo.setStatus(ActivitiFormStatusEnum.REFUSE.getValue());
+        sbScrapFormMapper.updateByPrimaryKeySelective(updInfo);
+    }
+
+    /**
+     * 完成业务
+     *
+     * @param actAuditRequest
+     */
+    @Override
+    protected void doFinish(ActAuditRequest actAuditRequest) {
+        SbScrapForm updInfo = sbScrapFormMapper.selectByPrimaryKey(actAuditRequest.getId());
+        updInfo.setStatus(ActivitiFormStatusEnum.FINISH.getValue());
+        sbScrapFormMapper.updateByPrimaryKeySelective(updInfo);
+
+        SbInfo sbInfo = new SbInfo();
+        sbInfo.setStatus(SbInfoStatusEnum.SCRAPED.getValue());
+        sbInfo.setId(updInfo.getSbId());
+        sbInfoMapper.updateByPrimaryKeySelective(sbInfo);
+    }
+
+    /**
+     * 终止业务
+     *
+     * @param actAuditRequest
+     */
+    @Override
+    protected void doStop(ActAuditRequest actAuditRequest) {
+        SbScrapForm updInfo = sbScrapFormMapper.selectByPrimaryKey(actAuditRequest.getId());
+        updInfo.setId(actAuditRequest.getId());
+        updInfo.setProcessInstanceId(null);
+        updInfo.setStatus(ActivitiFormStatusEnum.NOT_EXECUTE.getValue());
+        sbScrapFormMapper.updateByPrimaryKeySelective(updInfo);
+
+        SbInfo sbInfo = new SbInfo();
+        sbInfo.setStatus(SbInfoStatusEnum.IN_STORE.getValue());
+        sbInfo.setId(updInfo.getSbId());
+        sbInfoMapper.updateByPrimaryKeySelective(sbInfo);
+    }
+}

+ 10 - 4
platform-service/src/main/java/com/platform/service/sb/impl/SbScrapFormServiceImpl.java

@@ -151,16 +151,22 @@ public class SbScrapFormServiceImpl extends BaseServiceImpl<SbScrapFormMapper, S
      */
     @Override
     public void updateByActivitiFinish(String id, boolean flag) {
-        SbScrapForm updInfo = mapper.selectByPrimaryKey(id);
-        updInfo.setId(id);
-        updInfo.setStatus(flag ? ActivitiFormStatusEnum.FINISH.getValue() : ActivitiFormStatusEnum.REFUSE.getValue());
-        mapper.updateByPrimaryKeySelective(updInfo);
 
         if (flag) {
+            SbScrapForm updInfo = mapper.selectByPrimaryKey(id);
+            updInfo.setId(id);
+            updInfo.setStatus(ActivitiFormStatusEnum.FINISH.getValue());
+            mapper.updateByPrimaryKeySelective(updInfo);
+
             SbInfo sbInfo = new SbInfo();
             sbInfo.setStatus(SbInfoStatusEnum.SCRAPED.getValue());
             sbInfo.setId(updInfo.getSbId());
             sbInfoMapper.updateByPrimaryKeySelective(sbInfo);
+        }else{
+            SbScrapForm updInfo = mapper.selectByPrimaryKey(id);
+            updInfo.setId(id);
+            updInfo.setStatus( ActivitiFormStatusEnum.REFUSE.getValue());
+            mapper.updateByPrimaryKeySelective(updInfo);
         }
     }