From 91dc0135a3e89e3a54866d184743e305ee54ce26 Mon Sep 17 00:00:00 2001
From: xiangpei <xiangpei@timesnew.cn>
Date: 星期二, 18 二月 2025 17:10:21 +0800
Subject: [PATCH] 发起协同办理

---
 business/src/main/java/com/ycl/domain/form/TaskTeamWorkForm.java           |   54 ++++++++++
 common/src/main/java/com/ycl/common/enums/business/TeamWorkStatusEnum.java |   29 +++++
 business/src/main/java/com/ycl/service/impl/ProjectProcessServiceImpl.java |   64 ++++++++++--
 flowable/src/main/java/com/ycl/service/common/TaskCommonService.java       |   28 +++++
 business/src/main/java/com/ycl/controller/ProjectProcessController.java    |    7 +
 business/src/main/java/com/ycl/service/ProjectProcessService.java          |    8 +
 business/src/main/java/com/ycl/domain/json/TeamWorkData.java               |   38 +++++++
 business/src/main/java/com/ycl/service/ProcessLogService.java              |    9 +
 business/src/main/java/com/ycl/service/impl/ProcessLogServiceImpl.java     |   15 +++
 9 files changed, 239 insertions(+), 13 deletions(-)

diff --git a/business/src/main/java/com/ycl/controller/ProjectProcessController.java b/business/src/main/java/com/ycl/controller/ProjectProcessController.java
index fa4096b..113ae18 100644
--- a/business/src/main/java/com/ycl/controller/ProjectProcessController.java
+++ b/business/src/main/java/com/ycl/controller/ProjectProcessController.java
@@ -120,6 +120,13 @@
         return projectProcessService.taskSupervise(form);
     }
 
+    @PostMapping("/detail/task/teamwork")
+    @ApiOperation(value = "鍙戣捣鍗忓悓鍔炵悊", notes = "鍙戣捣鍗忓悓鍔炵悊")
+//    @PreAuthorize("@ss.hasPermi('projectProcess:detail')")
+    public Result taskTeamwork(@Validated @RequestBody TaskTeamWorkForm form) {
+        return projectProcessService.taskTeamwork(form);
+    }
+
     @PostMapping("/detail/task/hangup")
     @ApiOperation(value = "鎸傝捣浠诲姟", notes = "鎸傝捣浠诲姟")
 //    @PreAuthorize("@ss.hasPermi('projectProcess:detail')")
diff --git a/business/src/main/java/com/ycl/domain/form/TaskTeamWorkForm.java b/business/src/main/java/com/ycl/domain/form/TaskTeamWorkForm.java
new file mode 100644
index 0000000..751f964
--- /dev/null
+++ b/business/src/main/java/com/ycl/domain/form/TaskTeamWorkForm.java
@@ -0,0 +1,54 @@
+package com.ycl.domain.form;
+
+import com.ycl.common.enums.business.HandlerTypeEnum;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author锛歺p
+ * @date锛�2024/12/13 13:51
+ */
+@Data
+@ApiModel("浠诲姟鍗忓悓鍔炵悊琛ㄥ崟")
+public class TaskTeamWorkForm {
+
+    /**
+     * 褰撳墠浠诲姟id
+     *
+     */
+    @ApiModelProperty("浠诲姟id")
+    private String taskId;
+
+    @ApiModelProperty("椤圭洰id")
+    private Long projectId;
+
+    /**
+     * 娴佺▼瀹炰緥id
+     *
+     */
+    @ApiModelProperty("娴佺▼瀹炰緥id")
+    private String processInsId;
+
+    /**
+     * 鍗忓悓浜虹被鍨�
+     */
+    @ApiModelProperty("鍗忓悓浜虹被鍨�")
+    private HandlerTypeEnum handlerType;
+
+    /**
+     * 鍗忓悓浜篿d
+     */
+    @ApiModelProperty("鍗忓悓浜篿d")
+    private List<Long> handlerIds;
+
+    /**
+     * 琛ㄥ崟淇℃伅
+     */
+    @ApiModelProperty("琛ㄥ崟淇℃伅")
+    private Map<String, Object> variables;
+
+}
diff --git a/business/src/main/java/com/ycl/domain/json/TeamWorkData.java b/business/src/main/java/com/ycl/domain/json/TeamWorkData.java
new file mode 100644
index 0000000..d8fc891
--- /dev/null
+++ b/business/src/main/java/com/ycl/domain/json/TeamWorkData.java
@@ -0,0 +1,38 @@
+package com.ycl.domain.json;
+
+import com.ycl.common.enums.business.HandlerTypeEnum;
+import com.ycl.common.enums.business.TeamWorkStatusEnum;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * 鍗忓悓鍔炵悊鏁版嵁
+ *
+ * @author锛歺p
+ * @date锛�2025/2/18 14:55
+ */
+@Data
+public class TeamWorkData {
+
+    /**
+     * 鍗忓悓浜虹被鍨�
+     */
+    private HandlerTypeEnum handlerType;
+
+    /**
+     * 鍗忓悓浜篿d
+     */
+    private List<Long> handlerIds;
+
+    /**
+     * 鐘舵��
+     */
+    private TeamWorkStatusEnum status;
+
+    public TeamWorkData(HandlerTypeEnum handlerType, List<Long> handlerIds, TeamWorkStatusEnum status) {
+        this.handlerType = handlerType;
+        this.handlerIds = handlerIds;
+        this.status = status;
+    }
+}
diff --git a/business/src/main/java/com/ycl/service/ProcessLogService.java b/business/src/main/java/com/ycl/service/ProcessLogService.java
index 923854c..6d45f83 100644
--- a/business/src/main/java/com/ycl/service/ProcessLogService.java
+++ b/business/src/main/java/com/ycl/service/ProcessLogService.java
@@ -79,6 +79,15 @@
     Boolean taskIsHangup(String taskId, String processInsId);
 
     /**
+     * 妫�鏌ヤ换鍔℃槸鍚﹀崗鍚屽姙鐞嗕簡
+     *
+     * @param taskId 浠诲姟id
+     * @param processInsId 娴佺▼瀹炰緥id
+     * @return   true 鍗忓悓鍔炵悊浜�   false娌″崗鍚屽姙鐞�
+     */
+    Boolean taskIsTeamwork(String taskId, String processInsId);
+
+    /**
      * 娴佺▼鎺ㄨ繘鏃ュ織
      *
      * @param query
diff --git a/business/src/main/java/com/ycl/service/ProjectProcessService.java b/business/src/main/java/com/ycl/service/ProjectProcessService.java
index d839669..2b20e0e 100644
--- a/business/src/main/java/com/ycl/service/ProjectProcessService.java
+++ b/business/src/main/java/com/ycl/service/ProjectProcessService.java
@@ -128,4 +128,12 @@
      * @return
      */
     Result cancelTaskHangup(TaskHangupForm form);
+
+    /**
+     * 浠诲姟鍙戣捣鍗忓悓鍔炵悊
+     *
+     * @param form
+     * @return
+     */
+    Result taskTeamwork(TaskTeamWorkForm form);
 }
diff --git a/business/src/main/java/com/ycl/service/impl/ProcessLogServiceImpl.java b/business/src/main/java/com/ycl/service/impl/ProcessLogServiceImpl.java
index 7997fbd..0ad7599 100644
--- a/business/src/main/java/com/ycl/service/impl/ProcessLogServiceImpl.java
+++ b/business/src/main/java/com/ycl/service/impl/ProcessLogServiceImpl.java
@@ -148,6 +148,21 @@
     }
 
     @Override
+    public Boolean taskIsTeamwork(String taskId, String processInsId) {
+        ProcessLog log = new LambdaQueryChainWrapper<>(baseMapper)
+                .eq(ProcessLog::getProcessInsId, processInsId)
+                .eq(ProcessLog::getTaskId, taskId)
+                .eq(ProcessLog::getEventType, ProcessLogEventTypeEnum.TEAM_WORK)
+                .one();
+        if (Objects.isNull(log)) {
+            return Boolean.FALSE;
+        } else {
+            // 鍒ゆ柇鍗忓悓浜烘槸鍚﹀叏閮ㄥ畬鎴愪簡鍗忓悓銆俆ODO
+        }
+        return null;
+    }
+
+    @Override
     public Result projectProcessLogPage(ProcessLogQuery query) {
         List<ProcessLogVO> list = baseMapper.projectProcessLogPage(query);
         // json鍙嶅簭鍒楀寲
diff --git a/business/src/main/java/com/ycl/service/impl/ProjectProcessServiceImpl.java b/business/src/main/java/com/ycl/service/impl/ProjectProcessServiceImpl.java
index 6ac5ced..57d89f5 100644
--- a/business/src/main/java/com/ycl/service/impl/ProjectProcessServiceImpl.java
+++ b/business/src/main/java/com/ycl/service/impl/ProjectProcessServiceImpl.java
@@ -1,7 +1,6 @@
 package com.ycl.service.impl;
 
 
-import com.alibaba.fastjson2.JSON;
 import com.alibaba.fastjson2.JSONArray;
 import com.alibaba.fastjson2.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
@@ -11,20 +10,15 @@
 import com.ycl.common.constant.ProcessConstants;
 import com.ycl.common.constant.ProcessOverTimeConstants;
 import com.ycl.common.core.domain.entity.SysDept;
+import com.ycl.common.core.domain.entity.SysDictData;
 import com.ycl.common.core.domain.entity.SysRole;
 import com.ycl.common.core.domain.entity.SysUser;
-import com.ycl.common.enums.business.HandlerTypeEnum;
-import com.ycl.common.enums.business.ProcessLogEventTypeEnum;
-import com.ycl.common.enums.business.SuperviseTypeEnum;
-import com.ycl.common.enums.business.TaskStatusEnum;
+import com.ycl.common.enums.business.*;
 import com.ycl.common.utils.SecurityUtils;
 import com.ycl.constant.TaskTypeConstant;
 import com.ycl.domain.entity.*;
 import com.ycl.domain.form.*;
-import com.ycl.domain.json.DelegateData;
-import com.ycl.domain.json.HangupData;
-import com.ycl.domain.json.JumpData;
-import com.ycl.domain.json.SuperviseData;
+import com.ycl.domain.json.*;
 import com.ycl.domain.vo.CustomerTaskVO;
 import com.ycl.domain.vo.IndexCustomerTaskVO;
 import com.ycl.domain.vo.ProjectProcessDetailVO;
@@ -38,6 +32,7 @@
 import com.ycl.domain.query.ProjectProcessQuery;
 import com.ycl.service.common.TaskCommonService;
 import com.ycl.system.service.ISysDeptService;
+import com.ycl.system.service.ISysDictTypeService;
 import com.ycl.system.service.ISysRoleService;
 import com.ycl.system.service.ISysUserService;
 import lombok.Synchronized;
@@ -93,6 +88,7 @@
     private final ApplicationEventPublisher publisher;
     private final ISysDeptService deptService;
     private final ProcessLogService processLogService;
+    private final ISysDictTypeService dictTypeService;
 
     /**
      * 鍒嗛〉鏌ヨ
@@ -167,10 +163,7 @@
     @Override
     @Transactional(rollbackFor = Exception.class)
     public Result startProcess(Long projectId, String processDefId) {
-        ProjectInfo project = new LambdaQueryChainWrapper<>(projectInfoMapper)
-                .select(ProjectInfo::getCreateBy)
-                .eq(ProjectInfo::getId, projectId)
-                .one();
+        ProjectInfo project = projectInfoMapper.selectById(projectId);
         if (Objects.isNull(project)) {
             throw new RuntimeException("椤圭洰涓嶅瓨鍦�");
         }
@@ -731,6 +724,51 @@
         return Result.ok("鎿嶄綔鎴愬姛");
     }
 
+    @Override
+    public Result taskTeamwork(TaskTeamWorkForm form) {
+        Task task = taskService.createTaskQuery().taskId(form.getTaskId()).singleResult();
+        if (Objects.isNull(task)) {
+            return Result.error("浠诲姟涓嶅瓨鍦�");
+        }
+        ProjectProcess projectProcess = new LambdaQueryChainWrapper<>(projectProcessMapper)
+                .eq(ProjectProcess::getProcessInsId, task.getProcessInstanceId())
+                .eq(ProjectProcess::getProcessDefId, task.getProcessDefinitionId())
+                .one();
+        if (Objects.isNull(projectProcess)) {
+            return Result.error("椤圭洰娴佺▼鏈粦瀹�");
+        }
+        // 1. 淇濆瓨鍙戣捣浜哄~鍐欑殑琛ㄥ崟鏁版嵁锛屼絾涓嶇洿鎺ュ畬鎴愯浠诲姟銆傛彁浜ゅ悗浠诲姟澶勭悊浜哄繀椤荤瓑鍒板崗鍚屼汉澶勭悊瀹屼箣鍚庢墠鑳藉畬鎴愪换鍔�
+        Map<String, Object> processVariables = new HashMap<>();
+        //鏌ュ嚭瀛楀吀涓渶瑕佹敞鍏ョ殑瀛楁淇℃伅
+        List<String> dictList = dictTypeService.selectDictDataByType("flow_variables").stream().map(SysDictData::getDictValue).collect(Collectors.toList());
+        Map<String, Object> newV = new HashMap<>(2);
+        if (!org.springframework.util.CollectionUtils.isEmpty(form.getVariables())) {
+            for (String key : form.getVariables().keySet()) {
+                newV.put(task.getTaskDefinitionKey() + "&" + key, form.getVariables().get(key));
+                //瀛楀吀閲屾湁灏辨斁鍏ユ祦绋嬪彉閲忎腑
+                if (org.apache.commons.collections4.CollectionUtils.isNotEmpty(dictList) && dictList.contains(key)) {
+                    processVariables.put(key,form.getVariables().get(key));
+                }
+            }
+        }
+        if( !processVariables.isEmpty() ) {
+            taskService.setVariables(form.getTaskId(), processVariables);
+        }
+
+        // 2. 淇濆瓨鏃ュ織
+        publisher.publishEvent(new TaskLogEvent(this,
+                null,
+                SecurityUtils.getUserId(),
+                form.getProjectId(),
+                form.getProcessInsId(),
+                form.getTaskId(),
+                task.getName(),
+                ProcessLogEventTypeEnum.TEAM_WORK,
+                new TeamWorkData(form.getHandlerType(), form.getHandlerIds(), TeamWorkStatusEnum.NOT_FINISHED)
+        ));
+        return Result.ok("鎿嶄綔鎴愬姛");
+    }
+
     /**
      * 鏌ヨ寰呭姙浠诲姟
      *
diff --git a/common/src/main/java/com/ycl/common/enums/business/TeamWorkStatusEnum.java b/common/src/main/java/com/ycl/common/enums/business/TeamWorkStatusEnum.java
new file mode 100644
index 0000000..5cf4920
--- /dev/null
+++ b/common/src/main/java/com/ycl/common/enums/business/TeamWorkStatusEnum.java
@@ -0,0 +1,29 @@
+package com.ycl.common.enums.business;
+
+import com.fasterxml.jackson.annotation.JsonValue;
+import lombok.Getter;
+
+/**
+ * 鍗忓悓鍔炵悊鐘舵��
+ *
+ * @author锛歺p
+ * @date锛�2024/11/29 11:13
+ */
+@Getter
+public enum TeamWorkStatusEnum {
+
+    NOT_FINISHED("NOT_FINISHED", "鏈紑濮�"),
+    FINISHED("FINISHED", "宸插畬鎴�"),
+
+    ;
+
+    private final String value;
+
+    @JsonValue
+    private final String desc;
+
+    TeamWorkStatusEnum(String value, String desc) {
+        this.value = value;
+        this.desc = desc;
+    }
+}
diff --git a/flowable/src/main/java/com/ycl/service/common/TaskCommonService.java b/flowable/src/main/java/com/ycl/service/common/TaskCommonService.java
index ef455a5..240eba2 100644
--- a/flowable/src/main/java/com/ycl/service/common/TaskCommonService.java
+++ b/flowable/src/main/java/com/ycl/service/common/TaskCommonService.java
@@ -2,6 +2,7 @@
 
 import com.alibaba.fastjson2.JSONObject;
 import com.ycl.common.constant.ProcessConstants;
+import com.ycl.common.core.domain.entity.SysDictData;
 import com.ycl.common.core.domain.entity.SysUser;
 import com.ycl.common.enums.FlowComment;
 import com.ycl.common.enums.business.TaskStatusEnum;
@@ -10,6 +11,8 @@
 import com.ycl.domain.vo.FormDetailVO;
 import com.ycl.flow.FindNextNodeUtil;
 import com.ycl.service.ISysFormService;
+import com.ycl.system.service.ISysDictDataService;
+import com.ycl.system.service.ISysDictTypeService;
 import com.ycl.system.service.ISysUserService;
 import lombok.RequiredArgsConstructor;
 import org.flowable.bpmn.model.*;
@@ -44,6 +47,7 @@
     private final TaskService taskService;
     private final HistoryService historyService;
     private final ISysUserService sysUserService;
+    private final ISysDictTypeService sysDictDService;
 
     /**
      * 閫氳繃褰撳墠鑺傜偣瀹氫箟key锛岃幏鍙栧叾涓婁竴涓妭鐐圭殑淇℃伅锛屽鏋滃墠闈㈡槸骞惰鐨勪細杩斿洖澶氫釜(鍖呭惈褰撳墠鑺傜偣)
@@ -324,4 +328,28 @@
         return roleIds;
     }
 
+    /**
+     * 澶勭悊娴佺▼涓殑鍙橀噺
+     *
+     * @param variables
+     * @param taskDefKey
+     * @return
+     */
+    public Map<String, Object> handleVar(Map<String, Object> variables, String taskDefKey) {
+        Map<String, Object> processVariables = new HashMap<>();
+        //鏌ュ嚭瀛楀吀涓渶瑕佹敞鍏ョ殑瀛楁淇℃伅
+        List<String> dictList = sysDictDService.selectDictDataByType("flow_variables").stream().map(SysDictData::getDictValue).collect(Collectors.toList());
+        Map<String, Object> newV = new HashMap<>(2);
+        if (!org.springframework.util.CollectionUtils.isEmpty(variables)) {
+            for (String key : variables.keySet()) {
+                newV.put(taskDefKey + "&" + key, variables.get(key));
+                //瀛楀吀閲屾湁灏辨斁鍏ユ祦绋嬪彉閲忎腑
+                if (!org.apache.commons.collections4.CollectionUtils.isEmpty(dictList) && dictList.contains(key)) {
+                    processVariables.put(key,variables.get(key));
+                }
+            }
+        }
+        return processVariables;
+    }
+
 }

--
Gitblit v1.8.0