From 4cd71c0be46a461432989ae7c5d6d56d9e7bbbed Mon Sep 17 00:00:00 2001
From: xiangpei <xiangpei@timesnew.cn>
Date: 星期一, 17 二月 2025 13:54:31 +0800
Subject: [PATCH] 查询待办任务时,判断是否挂起状态。增加一个临时导入项目的接口

---
 flowable/src/main/java/com/ycl/domain/vo/FormDetailVO.java              |   12 +++
 flowable/src/main/java/com/ycl/common/constant/ProcessConstants.java    |    2 
 business/src/main/java/com/ycl/controller/ProjectInfoController.java    |   31 +++++++
 business/src/main/java/com/ycl/domain/excel/ProjectTempImport.java      |   47 +++++++++++
 flowable/src/main/java/com/ycl/service/common/TaskCommonService.java    |    2 
 business/src/main/java/com/ycl/service/impl/FlowTaskServiceImpl.java    |    9 ++
 system/src/main/java/com/ycl/system/mapper/SysDeptMapper.java           |    2 
 business/src/main/java/com/ycl/listener/excel/CurrencyDataListener.java |  105 ++++++++++++++++++++++++++
 system/src/main/resources/mapper/system/SysDeptMapper.xml               |    4 +
 9 files changed, 214 insertions(+), 0 deletions(-)

diff --git a/business/src/main/java/com/ycl/controller/ProjectInfoController.java b/business/src/main/java/com/ycl/controller/ProjectInfoController.java
index ee060f8..33bd028 100644
--- a/business/src/main/java/com/ycl/controller/ProjectInfoController.java
+++ b/business/src/main/java/com/ycl/controller/ProjectInfoController.java
@@ -1,18 +1,25 @@
 package com.ycl.controller;
 
+import com.alibaba.excel.EasyExcel;
 import com.ycl.common.base.Result;
 import com.ycl.common.exception.base.BaseException;
 import com.ycl.common.group.Add;
 import com.ycl.common.group.Update;
 import com.ycl.common.utils.ProjectCodeGenerator;
+import com.ycl.common.utils.bean.BeanUtils;
 import com.ycl.common.utils.excel.OutputExcelUtils;
+import com.ycl.domain.entity.ProjectInfo;
 import com.ycl.domain.excel.ProjectExcelTemplate;
+import com.ycl.domain.excel.ProjectTempImport;
 import com.ycl.domain.form.DocumentInfoForm;
 import com.ycl.domain.form.ProjectForm;
 import com.ycl.domain.form.ProjectInfoForm;
 import com.ycl.domain.query.ProjectExportQuery;
 import com.ycl.domain.query.ProjectInfoQuery;
+import com.ycl.listener.excel.CurrencyDataListener;
 import com.ycl.service.ProjectInfoService;
+import com.ycl.system.mapper.SysDeptMapper;
+import com.ycl.system.service.ISysDeptService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.RequiredArgsConstructor;
@@ -23,8 +30,10 @@
 import javax.servlet.http.HttpServletResponse;
 import javax.validation.constraints.NotEmpty;
 import java.io.IOException;
+import java.math.BigDecimal;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.function.Consumer;
 
 /**
  * 椤圭洰绠$悊鍩虹淇℃伅琛� 鍓嶇鎺у埗鍣�
@@ -40,6 +49,28 @@
 public class ProjectInfoController {
 
     private final ProjectInfoService projectInfoService;
+    private final SysDeptMapper deptMapper;
+
+    @PostMapping("/import/temp")
+    @ApiOperation(value = "涓存椂瀵煎叆", notes = "涓存椂瀵煎叆")
+//    @PreAuthorize("hasAuthority('projectInfo:add')")
+    public Result importTemp(@RequestPart("file") MultipartFile file) throws IOException {
+        Consumer<List<ProjectTempImport>> consumer = (data) -> {
+            for (ProjectTempImport project : data) {
+                ProjectInfo projectInfo = new ProjectInfo();
+                BeanUtils.copyProperties(project, projectInfo);
+                projectInfo.setYearInvestAmount(project.getTzje());
+                // 澶勭悊涓氫富鍗曚綅銆佷富绠¢儴闂╥d
+                Long yzId = deptMapper.selectByName(project.getProjectOwnerUnit());
+                projectInfo.setProjectOwnerUnit(yzId);
+                Long zgId = deptMapper.selectByName(project.getCompetentDepartment());
+                projectInfo.setCompetentDepartment(zgId + "");
+                projectInfoService.save(projectInfo);
+            }
+        };
+        EasyExcel.read(file.getInputStream(), ProjectTempImport.class, new CurrencyDataListener(consumer)).headRowNumber(1).doReadAll();
+        return Result.ok();
+    }
 
     @PostMapping
     @ApiOperation(value = "娣诲姞", notes = "娣诲姞")
diff --git a/business/src/main/java/com/ycl/domain/excel/ProjectTempImport.java b/business/src/main/java/com/ycl/domain/excel/ProjectTempImport.java
new file mode 100644
index 0000000..398e299
--- /dev/null
+++ b/business/src/main/java/com/ycl/domain/excel/ProjectTempImport.java
@@ -0,0 +1,47 @@
+package com.ycl.domain.excel;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 椤圭洰涓存椂瀵煎叆妯℃澘
+ *
+ * @author锛歺p
+ * @date锛�2025/2/17 11:24
+ */
+@Data
+public class ProjectTempImport {
+
+    @ExcelProperty(value = "椤圭洰鍚嶇О")
+    private String projectName;
+
+    @ExcelProperty(value = "椤圭洰绫诲瀷")
+    private String projectType;
+
+    @ExcelProperty(value = "寤鸿鍐呭")
+    private String content;
+
+    @ExcelProperty(value = "涓氫富鍗曚綅")
+    private String projectOwnerUnit;
+
+    @ExcelProperty(value = "涓荤閮ㄩ棬")
+    private String competentDepartment;
+
+    @ExcelProperty(value = "璁″垝寮�宸ユ椂闂�")
+    private Date planStartTime;
+
+    @ExcelProperty(value = "璁″垝绔e伐鏃堕棿")
+    private Date planCompleteTime;
+
+    @ExcelProperty("骞村害鎶曡祫閲戦")
+    private BigDecimal tzje;
+
+    @ExcelProperty("琛屼笟涓荤閮ㄩ棬")
+    private String hyzgbm;
+
+    @ExcelProperty(value = "琛屾斂鍖哄垝")
+    private String area;
+}
diff --git a/business/src/main/java/com/ycl/listener/excel/CurrencyDataListener.java b/business/src/main/java/com/ycl/listener/excel/CurrencyDataListener.java
new file mode 100644
index 0000000..94862a5
--- /dev/null
+++ b/business/src/main/java/com/ycl/listener/excel/CurrencyDataListener.java
@@ -0,0 +1,105 @@
+package com.ycl.listener.excel;
+
+import com.alibaba.excel.context.AnalysisContext;
+import com.alibaba.excel.metadata.data.ReadCellData;
+import com.alibaba.excel.read.listener.ReadListener;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.function.Consumer;
+
+/**
+ * easyExcel 澶氳〃閫氱敤璇诲彇鐩戝惉鍣�
+ *
+ * @author xp
+ */
+public class CurrencyDataListener<T> implements ReadListener<T> {
+
+
+    private Consumer consumer;
+
+    /**
+     * 姣忛殧100鏉″瓨鍌ㄦ暟鎹簱锛岀劧鍚庢竻鐞唋ist 锛屾柟渚垮唴瀛樺洖鏀�
+     */
+    private static final int BATCH_COUNT = 100;
+
+    /**
+     * 缂撳瓨鐨勬暟鎹�
+     */
+    private List<T> cachedDataList = new ArrayList<>(BATCH_COUNT);
+
+    private final static Logger log = LoggerFactory.getLogger(CurrencyDataListener.class);
+
+    public CurrencyDataListener(Consumer<List<T>> consumer) {
+        this.consumer = consumer;
+    }
+
+    /**
+     * 璇诲彇鍑虹幇寮傚父澶勭悊
+     *
+     * @param e
+     * @param analysisContext
+     * @throws Exception
+     */
+    @Override
+    public void onException(Exception e, AnalysisContext analysisContext) throws Exception {
+
+    }
+
+    /**
+     * 澶勭悊琛ㄥご
+     *  @param map
+     * @param analysisContext
+     */
+    @Override
+    public void invokeHead(Map<Integer, ReadCellData<?>> map, AnalysisContext analysisContext) {
+
+    }
+
+    /**
+     * 璇诲彇鏁版嵁,姣忎竴鏉℃暟鎹В鏋愰兘浼氭潵璋冪敤
+     *
+     * @param data
+     * @param analysisContext
+     */
+    @Override
+    public void invoke(T data, AnalysisContext analysisContext) {
+        cachedDataList.add(data);
+        // 杈惧埌BATCH_COUNT浜嗭紝闇�瑕佸幓瀛樺偍涓�娆℃暟鎹簱锛岄槻姝㈡暟鎹嚑涓囨潯鏁版嵁鍦ㄥ唴瀛橈紝瀹规槗OOM
+        if (cachedDataList.size() >= BATCH_COUNT) {
+            try {
+                // 蹇呴』瑕佹崟鑾峰紓甯革紝鍚﹀垯鍒楄〃涓嶄細娓呯┖
+                saveData();
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+            // 瀛樺偍瀹屾垚娓呯悊 list
+            cachedDataList = new ArrayList<>(BATCH_COUNT);
+        }
+    }
+
+    /**
+     * 璇诲彇瀹屾垚
+     *
+     * @param analysisContext
+     */
+    @Override
+    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
+        saveData();
+        log.info("鎵�鏈夋暟鎹В鏋愬畬鎴愶紒");
+    }
+
+    @Override
+    public boolean hasNext(AnalysisContext analysisContext) {
+        return true;
+    }
+
+    private void saveData() {
+        log.info("{}鏉℃暟鎹紝寮�濮嬪瓨鍌ㄦ暟鎹簱锛�", cachedDataList.size());
+        consumer.accept(cachedDataList);
+        log.info("瀛樺偍鏁版嵁搴撴垚鍔燂紒");
+    }
+}
diff --git a/business/src/main/java/com/ycl/service/impl/FlowTaskServiceImpl.java b/business/src/main/java/com/ycl/service/impl/FlowTaskServiceImpl.java
index 268b945..c8fd1ba 100644
--- a/business/src/main/java/com/ycl/service/impl/FlowTaskServiceImpl.java
+++ b/business/src/main/java/com/ycl/service/impl/FlowTaskServiceImpl.java
@@ -15,6 +15,7 @@
 import com.ycl.common.core.domain.entity.SysUser;
 import com.ycl.common.enums.FlowComment;
 import com.ycl.common.enums.business.ProcessLogEventTypeEnum;
+import com.ycl.common.enums.business.TaskStatusEnum;
 import com.ycl.common.exception.CustomException;
 import com.ycl.common.utils.SecurityUtils;
 import com.ycl.domain.dto.FlowCommentDto;
@@ -1254,6 +1255,14 @@
             parameters = taskService.getVariables(taskId);
         }
         List<FormDetailVO> beforeNodes = this.getBeforeNodeForm(parameters, task.getFormKey(), task.getName(), task.getProcessDefinitionId(), task.getTaskDefinitionKey(), Boolean.FALSE);
+        // 鍒ゆ柇褰撳墠浠诲姟鏄惁琚寕璧蜂腑
+        beforeNodes.stream().forEach(node -> {
+            if (node.getCurrent()) {
+                if (processLogService.taskIsHangup(taskId, task.getProcessInstanceId())) {
+                    node.setTaskStatus(TaskStatusEnum.HANGUP);
+                }
+            }
+        });
         return AjaxResult.success(beforeNodes);
     }
 
diff --git a/flowable/src/main/java/com/ycl/common/constant/ProcessConstants.java b/flowable/src/main/java/com/ycl/common/constant/ProcessConstants.java
index 9f5e5ee..dc066bc 100644
--- a/flowable/src/main/java/com/ycl/common/constant/ProcessConstants.java
+++ b/flowable/src/main/java/com/ycl/common/constant/ProcessConstants.java
@@ -104,6 +104,8 @@
 
     public static final String EXTENSION_PROPERTY_CAN_WAIT_TEXT = "鏄惁鍏佽瀹圭己";
 
+    public static final String EXTENSION_PROPERTY_CAN_HANGUP_TEXT = "鏄惁鍏佽鎸傝捣";
+
     public static final String EXTENSION_PROPERTY_VALUE = "鏄�";
 
 
diff --git a/flowable/src/main/java/com/ycl/domain/vo/FormDetailVO.java b/flowable/src/main/java/com/ycl/domain/vo/FormDetailVO.java
index eaa4c20..3528539 100644
--- a/flowable/src/main/java/com/ycl/domain/vo/FormDetailVO.java
+++ b/flowable/src/main/java/com/ycl/domain/vo/FormDetailVO.java
@@ -1,6 +1,7 @@
 package com.ycl.domain.vo;
 
 import com.alibaba.fastjson2.JSONObject;
+import com.ycl.common.enums.business.TaskStatusEnum;
 import lombok.Data;
 
 import java.util.Map;
@@ -34,6 +35,17 @@
     private boolean canWait;
 
     /**
+     * 鏄惁鍏佽鎸傝捣
+     *
+     */
+    private boolean canHangup;
+
+    /**
+     * 浠诲姟鐨勭姸鎬侊細鎸傝捣銆佸缂�
+     */
+    private TaskStatusEnum taskStatus;
+
+    /**
      * 鍓嶇疆鑺傜偣瀹氫箟id
      *
      */
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 9debdb2..ef455a5 100644
--- a/flowable/src/main/java/com/ycl/service/common/TaskCommonService.java
+++ b/flowable/src/main/java/com/ycl/service/common/TaskCommonService.java
@@ -105,6 +105,8 @@
         }
         formDetailVO.setCanJump(this.checkHasExeProperty(currentElement.getExtensionElements().get("properties"), ProcessConstants.EXTENSION_PROPERTY_CAN_JUMP_TEXT));
         formDetailVO.setCanWait(this.checkHasExeProperty(currentElement.getExtensionElements().get("properties"), ProcessConstants.EXTENSION_PROPERTY_CAN_WAIT_TEXT));
+        formDetailVO.setCanHangup(this.checkHasExeProperty(currentElement.getExtensionElements().get("properties"), ProcessConstants.EXTENSION_PROPERTY_CAN_HANGUP_TEXT));
+
         defKeys.add(formDetailVO);
         this.beforeNodeInfo(currentElement, defKeys);
 
diff --git a/system/src/main/java/com/ycl/system/mapper/SysDeptMapper.java b/system/src/main/java/com/ycl/system/mapper/SysDeptMapper.java
index 49894b1..6d587cf 100644
--- a/system/src/main/java/com/ycl/system/mapper/SysDeptMapper.java
+++ b/system/src/main/java/com/ycl/system/mapper/SysDeptMapper.java
@@ -120,4 +120,6 @@
 
     String selectAncestors(Long userId);
 
+
+    Long selectByName(@Param("name") String projectOwnerUnit);
 }
diff --git a/system/src/main/resources/mapper/system/SysDeptMapper.xml b/system/src/main/resources/mapper/system/SysDeptMapper.xml
index e0faa04..b21db8d 100644
--- a/system/src/main/resources/mapper/system/SysDeptMapper.xml
+++ b/system/src/main/resources/mapper/system/SysDeptMapper.xml
@@ -100,6 +100,10 @@
 		where SU.user_id = #{userId}
 	</select>
 
+	<select id="selectByName" parameterType="string" resultType="long">
+		SELECT dept_id FROM sys_dept WHERE dept_name = #{name} and del_flag = '0' limit 1
+	</select>
+
     <insert id="insertDept" parameterType="SysDept">
  		insert into sys_dept(
  			<if test="deptId != null and deptId != 0">dept_id,</if>

--
Gitblit v1.8.0