From 418d29b85d943f57b5600d84acf9cf6ca0ce9173 Mon Sep 17 00:00:00 2001
From: hyingbo <1363390067@qq.com>
Date: 星期四, 17 七月 2025 09:46:29 +0800
Subject: [PATCH] 工作流关闭

---
 lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/GuideCardBatchServiceImpl.java |  349 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 342 insertions(+), 7 deletions(-)

diff --git a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/GuideCardBatchServiceImpl.java b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/GuideCardBatchServiceImpl.java
index 183133e..100a954 100644
--- a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/GuideCardBatchServiceImpl.java
+++ b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/GuideCardBatchServiceImpl.java
@@ -1,21 +1,43 @@
 package org.jeecg.modules.dnc.service.impl;
 
+import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import org.apache.shiro.SecurityUtils;
+import org.flowable.common.engine.api.FlowableException;
+import org.flowable.engine.TaskService;
+import org.flowable.identitylink.api.IdentityLink;
+import org.flowable.task.api.Task;
+import org.jeecg.common.api.vo.Result;
 import org.jeecg.common.system.vo.LoginUser;
 import org.jeecg.common.util.DateUtils;
 import org.jeecg.modules.dnc.constant.DocAttributionTypeEnum;
 import org.jeecg.modules.dnc.entity.*;
 import org.jeecg.modules.dnc.mapper.GuideCardBatchMapper;
+import org.jeecg.modules.dnc.response.ActivitiCode;
+import org.jeecg.modules.dnc.response.CommonCode;
+import org.jeecg.modules.dnc.response.UcenterCode;
 import org.jeecg.modules.dnc.service.*;
+import org.jeecg.modules.dnc.utils.ValidateUtil;
+import org.jeecg.modules.dncFlow.constant.GuideCardBatchEnum;
+import org.jeecg.modules.dncFlow.entity.DispatchFile;
+import org.jeecg.modules.dncFlow.vo.AssignEquipmentFileStreamVo;
+import org.jeecg.modules.dncFlow.vo.GuideCardBatchFlowTaskVo;
+import org.jeecg.modules.flowable.apithird.business.entity.FlowMyBusiness;
+import org.jeecg.modules.flowable.apithird.business.service.IFlowMyBusinessService;
+import org.jeecg.modules.flowable.apithird.service.FlowCallBackServiceI;
+import org.jeecg.modules.flowable.apithird.service.FlowCommonService;
+import org.jeecg.modules.flowable.service.IFlowDefinitionService;
+import org.jeecg.modules.flowable.service.IFlowTaskService;
 import org.jeecg.modules.system.service.ISysDictService;
+import org.jeecg.modules.system.service.ISysUserRoleService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.transaction.interceptor.TransactionAspectSupport;
 
-import java.util.Date;
-import java.util.List;
+import javax.annotation.Resource;
+import java.util.*;
 
 /**
  * @Description: nc鏂囦欢瀵瑰簲鏁版帶绋嬪簭鍔犲伐纭琛�
@@ -23,17 +45,14 @@
  * @Date:   2025-05-27
  * @Version: V1.0
  */
-@Service
-public class GuideCardBatchServiceImpl extends ServiceImpl<GuideCardBatchMapper, GuideCardBatch> implements IGuideCardBatchService {
+@Service("IGuideCardBatchService")
+public class GuideCardBatchServiceImpl extends ServiceImpl<GuideCardBatchMapper, GuideCardBatch> implements IGuideCardBatchService , FlowCallBackServiceI {
 
     @Autowired
     private ISysDictService sysDictService;
 
     @Autowired
     private IDocInfoService docInfoService;
-
-    @Autowired
-    private IDocRelativeService docRelativeService;
 
     @Autowired
     private IPartsInfoService partsInfoService;
@@ -47,6 +66,18 @@
     @Autowired
     private IDeviceTypeService deviceTypeService;
 
+    @Resource
+    private FlowCommonService flowCommonService;
+    @Resource
+    private IFlowDefinitionService flowDefinitionService;
+    @Autowired
+    private IFlowTaskService flowTaskService;
+    @Autowired
+    private TaskService taskService;
+    @Autowired
+    private IFlowMyBusinessService flowMyBusinessService;
+    @Autowired
+    private ISysUserRoleService sysUserRoleService;
     /**
      * 鐢熸垚娴佹按鍙�
      * @param code
@@ -143,4 +174,308 @@
         guideCardBatch.setCreateTime(new Date());
         return this.save(guideCardBatch);
     }
+
+    /**
+     * 鍙戣捣纭娴佺▼
+     * @param id
+     * @return
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Result<?> startGuideCardBatch(String id){
+        LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();
+        //鑾峰彇绋嬪簭鍔犲伐纭琛�
+        GuideCardBatch guideCardBatch=this.getById(id);
+        if (guideCardBatch==null) {
+            return Result.ok("鏈壘鍒板搴旂殑绋嬪簭鍔犲伐纭琛�");
+        }
+        Result result=reStartDispatchFile(id);
+        if (result==null) {
+            //濉厖鏁版嵁
+            guideCardBatch.setCompiler(user.getUsername());
+            guideCardBatch.setCompilerTime(new Date());
+            guideCardBatch.setFlowStatus(GuideCardBatchEnum.VERIFY.getCode());
+            this.updateById(guideCardBatch);
+            System.out.println("绋嬪簭鍔犲伐纭琛� 纭娴佺▼锛�" + guideCardBatch.getId());
+            flowCommonService.initActBusiness("娴佹按鍙凤細"+guideCardBatch.getSerialNumber()+" 绋嬪簭鍔犲伐纭琛ㄨ繘琛岀‘璁ゆ祦绋�",
+                    guideCardBatch.getId(), "IGuideCardBatchService", "nc_guide_card_batch", null);
+            Map<String, Object> variables = new HashMap<>();
+            variables.put("dataId", guideCardBatch.getId());
+            variables.put("organization", "鐢ㄦ埛"+user.getRealname()+"鍙戣捣娴佺▼");
+            variables.put("comment",  "鐢ㄦ埛"+user.getRealname()+"鍙戣捣娴佺▼");
+            variables.put("proofreading",true);
+            Result flowResult= flowDefinitionService.startProcessInstanceByKey("nc_guide_card_batch", variables);
+            if (!flowResult.isSuccess()) {
+                guideCardBatch.setCompiler(null);
+                guideCardBatch.setCompilerTime(null);
+                this.updateById(guideCardBatch);
+            }
+            return flowResult;
+        }else {
+            return result;
+        }
+    }
+
+
+    /**
+     * 閲嶆柊鍚姩
+     * @param id
+     */
+    @Override
+    @Transactional(rollbackFor = {Exception.class})
+    public Result<?> reStartDispatchFile(String id) {
+        GuideCardBatch guideCardBatch=this.getById(id);
+        if (guideCardBatch!=null){
+            if (!guideCardBatch.getFlowStatus().equals(GuideCardBatchEnum.VERIFY.getCode())){
+                //閲嶆柊鍚姩娴佺▼
+                try {
+                    // 1. 鑾峰彇褰撳墠鐢ㄦ埛骞舵牎楠岀櫥褰曠姸鎬�
+                    LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();
+                    if (user == null) {
+                        return Result.error("鐢ㄦ埛鏈櫥褰�");
+                    }
+
+                    // 2. 鏌ヨ娴佺▼涓氬姟璁板綍锛堝鐞嗙┖缁撴灉锛�
+                    List<FlowMyBusiness> businessList = flowMyBusinessService.list(
+                            new QueryWrapper<FlowMyBusiness>()
+                                    .eq("data_id", guideCardBatch.getId())
+                    );
+                    if (businessList.isEmpty()) {
+                        return Result.error("娴佺▼璁板綍涓嶅瓨鍦�");
+                    }
+                    FlowMyBusiness flowMyBusiness = businessList.get(0);
+
+                    // 3. 鏍¢獙鐢ㄦ埛鏄惁涓哄�欓�夊鐞嗕汉
+                    List<String> todoUsers = JSON.parseArray(flowMyBusiness.getTodoUsers(), String.class);
+                    if (todoUsers == null || !todoUsers.contains(user.getUsername())) {
+                        return Result.error("鐢ㄦ埛鏃犳潈鎿嶄綔姝や换鍔�");
+                    }
+
+                    // 4. 璁ら浠诲姟锛堝鐞嗗凡琚棰嗙殑鎯呭喌锛�
+                    String taskId = flowMyBusiness.getTaskId();
+                    Task task = taskService.createTaskQuery().taskId(taskId).singleResult();
+                    if (task == null) {
+                        return Result.error("浠诲姟涓嶅瓨鍦ㄦ垨宸插畬鎴�");
+                    }
+                    if (task.getAssignee() != null && !task.getAssignee().equals(user.getUsername())) {
+                        return Result.error("浠诲姟宸茶浠栦汉璁ら");
+                    }
+                    taskService.claim(taskId, user.getUsername());
+
+                    // 5. 瀹屾垚浠诲姟骞朵紶閫掑彉閲�
+                    Map<String, Object> variables = new HashMap<>();
+                    variables.put("dataId", flowMyBusiness.getDataId());
+                    variables.put("organization","閲嶆柊鍙戣捣娴佺▼");
+                    variables.put("assignee", user.getUsername());
+                    variables.put("comment", "閲嶆柊鍙戣捣娴佺▼");
+                    taskService.complete(taskId, variables);
+
+                    // 6. 鑾峰彇涓嬩竴浠诲姟骞舵洿鏂颁笟鍔¤褰�
+                    List<Task> nextTasks = taskService.createTaskQuery()
+                            .processInstanceId(flowMyBusiness.getProcessInstanceId())
+                            .list();
+                    if (!nextTasks.isEmpty()) {
+                        Task nextTask = nextTasks.get(0); // 鍋囪鍙栫涓�涓换鍔�
+                        flowMyBusiness.setTaskId(nextTask.getId());
+                        flowMyBusiness.setTaskName(nextTask.getName());
+
+                        // 鍔ㄦ�佽幏鍙栦笅涓�鑺傜偣鍊欓�変汉锛堢ず渚嬶級
+                        List<String> nextTodoUsers = getNextTaskCandidates(nextTask.getId());
+                        flowMyBusiness.setTodoUsers(JSON.toJSONString(nextTodoUsers));
+                    } else {
+                        // 娴佺▼宸茬粨鏉燂紝娓呯┖浠诲姟淇℃伅
+                        flowMyBusiness.setTaskId(null);
+                        flowMyBusiness.setTaskName(null);
+                        flowMyBusiness.setTodoUsers(null);
+                    }
+                    flowMyBusinessService.updateById(flowMyBusiness);
+                    guideCardBatch.setFlowStatus(GuideCardBatchEnum.VERIFY.getCode());
+                    this.updateById(guideCardBatch);
+                    return Result.ok("娴佺▼閲嶅惎鎴愬姛");
+                } catch (FlowableException e) {
+                    return Result.error("娴佺▼鎿嶄綔澶辫触: " + e.getMessage());
+                } catch (Exception e) {
+                    return Result.error("绯荤粺閿欒: " + e.getMessage());
+                }
+            }else {
+                return null;
+            }
+        }
+        return Result.error("鏁版嵁涓嶅瓨鍦�");
+    }
+
+    // 杈呭姪鏂规硶锛氳幏鍙栦笅涓�浠诲姟鐨勬墍鏈夊�欓�変俊鎭紙澶勭悊浜恒�佸�欓�夌敤鎴枫�佸�欓�夌粍锛�
+    private List<String> getNextTaskCandidates(String taskId) {
+        List<IdentityLink> links = taskService.getIdentityLinksForTask(taskId);
+        List<String> candidates = new ArrayList<>();
+
+        // 1. 鑾峰彇鐩存帴澶勭悊浜猴紙assignee锛�
+        links.stream()
+                .filter(link -> "assignee".equals(link.getType()))
+                .map(IdentityLink::getUserId)
+                .filter(Objects::nonNull)
+                .forEach(candidates::add);
+
+        // 2. 鑾峰彇鍊欓�夌敤鎴峰拰鍊欓�夌粍
+        links.stream()
+                .filter(link -> "candidate".equals(link.getType()))
+                .forEach(link -> {
+                    if (link.getUserId() != null) {
+                        // 鍊欓�夌敤鎴风洿鎺ユ坊鍔�
+                        candidates.add(link.getUserId());
+                    } else if (link.getGroupId() != null) {
+                        // 鍊欓�夌粍杞崲涓哄疄闄呯敤鎴凤紙绀轰緥閫昏緫锛岄渶鏍规嵁涓氬姟瀹炵幇锛�
+                        List<String> groupUsers = convertGroupToUsers(link.getGroupId());
+                        candidates.addAll(groupUsers);
+                    }
+                });
+
+        return candidates;
+    }
+
+    // 绀轰緥鏂规硶锛氬皢鍊欓�夌粍ID杞崲涓虹敤鎴峰垪琛紙闇�鑷畾涔夊疄鐜帮級
+    private List<String> convertGroupToUsers(String groupId) {
+        // 瀹為檯涓氬姟涓皟鐢ㄦ湇鍔℃帴鍙h幏鍙栫粍鎴愬憳
+        return sysUserRoleService.getUserNameByRoleId(groupId);
+    }
+
+
+    /**
+     * 娴佺▼鑺傜偣瀹℃牳
+     * @param guideCardBatchFlowTaskVo
+     * @return
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Result<?> auditGuideCardBatch(GuideCardBatchFlowTaskVo guideCardBatchFlowTaskVo){
+        LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();
+        try {
+            // 鍙傛暟鏍¢獙
+            if (!ValidateUtil.validateString(guideCardBatchFlowTaskVo.getTaskId()) || !ValidateUtil.validateString(guideCardBatchFlowTaskVo.getDataId())) {
+                return Result.error(CommonCode.INVALID_PARAM.toString());
+            }
+            String userId = user.getId();
+            guideCardBatchFlowTaskVo.setAssignee(user.getUsername());
+            if (!ValidateUtil.validateString(userId)) {
+                return Result.error(UcenterCode.UCENTER_ACCOUNT_NOT_EXIST.toString());
+            }
+
+            // 鏁版嵁鏌ヨ
+            GuideCardBatch guideCardBatch = this.getById(guideCardBatchFlowTaskVo.getDataId());
+            if (guideCardBatch == null) {
+                return Result.error(CommonCode.INVALID_PARAM.toString());
+            }
+            DocInfo docInfo = docInfoService.getById(guideCardBatch.getDocId());
+            if (docInfo == null) {
+                return Result.error(ActivitiCode.ACT_DOC_ERROR.toString());
+            }
+
+            // 2. 鏌ヨ娴佺▼涓氬姟璁板綍锛堝鐞嗙┖缁撴灉锛�
+            List<FlowMyBusiness> businessList = flowMyBusinessService.list(
+                    new QueryWrapper<FlowMyBusiness>()
+                            .eq("process_instance_id", guideCardBatchFlowTaskVo.getInstanceId())
+            );
+            if (businessList.isEmpty()) {
+                return Result.error("娴佺▼璁板綍涓嶅瓨鍦�");
+            }
+            FlowMyBusiness flowMyBusiness = businessList.get(0);
+
+            // 3. 鏍¢獙鐢ㄦ埛鏄惁涓哄�欓�夊鐞嗕汉
+            List<String> todoUsers = JSON.parseArray(flowMyBusiness.getTodoUsers(), String.class);
+            if (todoUsers == null || !todoUsers.contains(user.getUsername())) {
+                return Result.error("鐢ㄦ埛鏃犳潈鎿嶄綔姝や换鍔�");
+            }
+
+            // 4. 璁ら浠诲姟锛堝鐞嗗凡琚棰嗙殑鎯呭喌锛�
+            String taskId = flowMyBusiness.getTaskId();
+            Task task = taskService.createTaskQuery().taskId(taskId).singleResult();
+            if (task == null) {
+                return Result.error("浠诲姟涓嶅瓨鍦ㄦ垨宸插畬鎴�");
+            }
+            if (task.getAssignee() != null && !task.getAssignee().equals(user.getUsername())) {
+                return Result.error("浠诲姟宸茶浠栦汉璁ら");
+            }
+            taskService.claim(taskId, user.getUsername());
+
+            // 璁剧疆娴佺▼鍙橀噺
+            Map<String, Object> values = new HashMap<>();
+            values.put("dataId", guideCardBatch.getId());
+            values.put("assignee", userId);
+            values.put("comment", guideCardBatchFlowTaskVo.getComment());
+            values.put("organization", guideCardBatchFlowTaskVo.getComment());
+            if (guideCardBatchFlowTaskVo.getCheckType() != null) {
+                values.put("checkType", guideCardBatchFlowTaskVo.getCheckType());
+            }
+            if (guideCardBatchFlowTaskVo.getConfirmType() != null) {
+                values.put("confirmType", guideCardBatchFlowTaskVo.getConfirmType());
+            }
+            if (guideCardBatchFlowTaskVo.getApproveType() != null) {
+                values.put("approveType", guideCardBatchFlowTaskVo.getApproveType());
+            }
+            guideCardBatchFlowTaskVo.setValues(values);
+            // 瀹屾垚娴佺▼浠诲姟
+            Result result = flowTaskService.complete(guideCardBatchFlowTaskVo);
+            if (result.isSuccess()) {
+                if (guideCardBatchFlowTaskVo.getCheckType() != null) {
+                    if (guideCardBatchFlowTaskVo.getCheckType()){
+                        guideCardBatch.setFlowStatus(GuideCardBatchEnum.CONFIRM.getCode());
+                        guideCardBatch.setProofreader(user.getUsername());
+                        guideCardBatch.setProofreaderTime(new Date());
+                    }else {
+                        guideCardBatch.setFlowStatus(GuideCardBatchEnum.PREPARE.getCode());
+                    }
+                }
+                if (guideCardBatchFlowTaskVo.getConfirmType() != null) {
+                    if (guideCardBatchFlowTaskVo.getConfirmType()){
+                        guideCardBatch.setFlowStatus(GuideCardBatchEnum.APPROVE.getCode());
+                        guideCardBatch.setOperator(user.getUsername());
+                        guideCardBatch.setInspectionTime(new Date());
+                        guideCardBatch.setInspectionOpinion(guideCardBatchFlowTaskVo.getInspectionOpinion());
+                    }else {
+                        guideCardBatch.setFlowStatus(GuideCardBatchEnum.PREPARE.getCode());
+                    }
+                }
+                if (guideCardBatchFlowTaskVo.getApproveType() != null) {
+                    if (guideCardBatchFlowTaskVo.getApproveType()){
+                        guideCardBatch.setFlowStatus(GuideCardBatchEnum.COMPLETE.getCode());
+                        guideCardBatch.setApprover(user.getUsername());
+                        guideCardBatch.setApproverTime(new Date());
+                    }else {
+                        guideCardBatch.setFlowStatus(GuideCardBatchEnum.PREPARE.getCode());
+                        }
+                }
+                this.updateById(guideCardBatch);
+            } else {
+                return result;
+            }
+            return Result.OK("鎿嶄綔鎴愬姛");
+        } catch (Exception e) {
+            // 璁剧疆浜嬪姟鍥炴粴
+            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+            return Result.error("鎿嶄綔澶辫触锛�" + e.getMessage());
+        }
+    }
+
+    @Override
+    public void afterFlowHandle(FlowMyBusiness business) {
+        business.getTaskNameId();//鎺ヤ笅鏉ュ鎵圭殑鑺傜偣
+        business.getValues();//鍓嶇浼犺繘鏉ョ殑鍙傛暟
+        business.getActStatus();
+    }
+
+    @Override
+    public Object getBusinessDataById(String dataId) {
+        return this.getById(dataId);
+    }
+
+    @Override
+    public Map<String, Object> flowValuesOfTask(String taskNameId, Map<String, Object> values) {
+        return null;
+    }
+
+    @Override
+    public List<String> flowCandidateUsernamesOfTask(String taskNameId, Map<String, Object> values) {
+        //涓氬姟鏄惁骞查娴佺▼锛屼笟鍔″共棰勶紝娴佺▼骞查锛屾寚瀹氫汉鍛樿繘琛屽鐞�
+        return null;
+    }
 }

--
Gitblit v1.9.3