From 839919c37a00a55bc57b21bcf519a113fcbd37ba Mon Sep 17 00:00:00 2001
From: xiangpei <xiangpei@timesnew.cn>
Date: 星期六, 22 二月 2025 17:22:37 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'

---
 business/src/main/resources/mapper/ProjectInfoMapper.xml                      |   13 ++++
 flowable/src/main/java/com/ycl/service/impl/ProcessCodingServiceImpl.java     |   21 ++++++
 flowable/src/main/java/com/ycl/service/ProcessCodingService.java              |    3 +
 business/src/main/java/com/ycl/service/impl/ProcessConfigInfoServiceImpl.java |    1 
 flowable/src/main/java/com/ycl/mapper/ProcessCodingMapper.java                |    2 
 start/src/main/resources/application.yml                                      |    1 
 business/src/main/resources/mapper/ProjectPlanExamineRecordMapper.xml         |    2 
 business/src/main/java/com/ycl/mapper/ProjectInfoMapper.java                  |    4 +
 flowable/src/main/resources/mapper/ProcessCodingMapper.xml                    |    3 +
 business/src/main/java/com/ycl/service/ProcessConfigInfoService.java          |    2 
 business/src/main/java/com/ycl/service/impl/ProjectInfoServiceImpl.java       |   65 +++++++++++++++++----
 business/src/main/java/com/ycl/service/impl/ProjectProcessServiceImpl.java    |   44 ++++++++++++--
 business/src/main/java/com/ycl/task/FlowableTask.java                         |   13 ++--
 flowable/src/main/java/com/ycl/domain/entity/ProcessCoding.java               |    5 +
 14 files changed, 151 insertions(+), 28 deletions(-)

diff --git a/business/src/main/java/com/ycl/mapper/ProjectInfoMapper.java b/business/src/main/java/com/ycl/mapper/ProjectInfoMapper.java
index f3b4467..8667a1f 100644
--- a/business/src/main/java/com/ycl/mapper/ProjectInfoMapper.java
+++ b/business/src/main/java/com/ycl/mapper/ProjectInfoMapper.java
@@ -1,5 +1,6 @@
 package com.ycl.mapper;
 
+import com.baomidou.mybatisplus.annotation.InterceptorIgnore;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.ycl.common.annotation.DataScope;
@@ -34,6 +35,7 @@
     *  鍒嗛〉
     */
     @DataScope(deptAlias = "d")
+    @InterceptorIgnore(tenantLine = "true")
     IPage getPage(@Param("query") ProjectInfoQuery query, IPage page);
 
     @DataScope(deptAlias = "d")
@@ -42,4 +44,6 @@
     List<ProjectVO> selectProjectDetailByIds(@Param("dataIdList") List<Long> dataIdList);
 
     ProjectInfo queryById(Integer recordId);
+
+    List<ProjectInfo> checkProjectNameAndIdIsUnique(@Param("id")Long id,@Param("name") String name,@Param("code")String code);
 }
diff --git a/business/src/main/java/com/ycl/service/ProcessConfigInfoService.java b/business/src/main/java/com/ycl/service/ProcessConfigInfoService.java
index a1171e5..ef7df88 100644
--- a/business/src/main/java/com/ycl/service/ProcessConfigInfoService.java
+++ b/business/src/main/java/com/ycl/service/ProcessConfigInfoService.java
@@ -1,5 +1,6 @@
 package com.ycl.service;
 
+import com.ycl.domain.entity.ProcessCoding;
 import com.ycl.domain.entity.ProcessConfigInfo;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.ycl.common.base.Result;
@@ -45,4 +46,5 @@
      * @return
      */
     Result getPage(ProcessConfigInfoQuery query);
+
 }
diff --git a/business/src/main/java/com/ycl/service/impl/ProcessConfigInfoServiceImpl.java b/business/src/main/java/com/ycl/service/impl/ProcessConfigInfoServiceImpl.java
index d16c1be..2a3c314 100644
--- a/business/src/main/java/com/ycl/service/impl/ProcessConfigInfoServiceImpl.java
+++ b/business/src/main/java/com/ycl/service/impl/ProcessConfigInfoServiceImpl.java
@@ -117,4 +117,5 @@
         }
         return Result.ok().data(page.getRecords()).total(page.getTotal());
     }
+
 }
diff --git a/business/src/main/java/com/ycl/service/impl/ProjectInfoServiceImpl.java b/business/src/main/java/com/ycl/service/impl/ProjectInfoServiceImpl.java
index 4213e49..47ece3d 100644
--- a/business/src/main/java/com/ycl/service/impl/ProjectInfoServiceImpl.java
+++ b/business/src/main/java/com/ycl/service/impl/ProjectInfoServiceImpl.java
@@ -113,8 +113,11 @@
         entity.setCreateBy(userId);
         entity.setUpdateBy(userId);
         //濡傛灉鏄偍澶囬」鐩�(鏈紑宸ラ」鐩�)涓嶉渶瑕佸鏍�
-        if(ProjectConstant.COMMIT.equals(entity.getUsedStatus()) && ProjectStatusEnum.PENDDING.getType().equals(entity.getProjectStatus())){
+        if (ProjectConstant.COMMIT.equals(entity.getUsedStatus()) && ProjectStatusEnum.PENDDING.getType().equals(entity.getProjectStatus())) {
             entity.setUsedStatus(ProjectConstant.PASS);
+        }
+        if(!checkProjectNameAndIdIsUnique(entity,null)){
+            return Result.error("椤圭洰鍚嶆垨椤圭洰鐮佸凡瀛樺湪");
         }
         baseMapper.insert(entity);
         addPlan(entity.getId()); //娣诲姞璁″垝琛�
@@ -127,12 +130,39 @@
         fileService.saveBatch(fileList);
 
         //娣诲姞椤圭洰涓爣鍗曚綅
-        saveUnit(entity.getId(),form.getWinUnitList());
+        saveUnit(entity.getId(), form.getWinUnitList());
         //娣诲姞骞村害鎶曡祫璁″垝
-        saveYearPlan(entity.getId(),form.getYearPlanList());
+        saveYearPlan(entity.getId(), form.getYearPlanList());
         return Result.ok("娣诲姞鎴愬姛").data(entity.getId());
     }
 
+    /**
+     * 鍒ゆ柇椤圭洰鍚嶅拰椤圭洰鐮佹槸鍚﹀敮涓�
+     * @param entity from true 鏉ヨ嚜add() false 鏉ヨ嚜edit()
+     * @return
+     */
+    public boolean  checkProjectNameAndIdIsUnique(ProjectInfo entity,Long updateId){
+        QueryWrapper<ProjectInfo> queryWrapper = new QueryWrapper<ProjectInfo>();
+        if (updateId == null) {
+
+            queryWrapper.eq("project_name", entity.getProjectName());
+
+            if (StringUtils.isNotEmpty(entity.getProjectCode())) {
+                queryWrapper.or();
+                queryWrapper.eq("project_code", entity.getProjectCode());
+            }
+
+            List<ProjectInfo> project = projectInfoMapper.selectList(queryWrapper);
+
+            return project == null || project.isEmpty();
+        }else {
+
+            List<ProjectInfo> project = projectInfoMapper.checkProjectNameAndIdIsUnique(updateId,entity.getProjectName(),entity.getProjectCode());
+
+            return project == null || project.isEmpty();
+        }
+
+    }
 
     public void addPlan(Long projectInfoId) {
         Plan plan = new Plan();
@@ -154,6 +184,7 @@
     @Override
     public Result update(ProjectInfoForm form) {
         ProjectInfo entity = baseMapper.selectById(form.getId());
+
         // 涓虹┖鎶汭llegalArgumentException锛屽仛鍏ㄥ眬寮傚父澶勭悊
         Assert.notNull(entity, "璁板綍涓嶅瓨鍦�");
         ProjectInfoForm.getEntityByForm(form, entity);
@@ -162,6 +193,9 @@
         //濡傛灉鏄偍澶囬」鐩�(鏈紑宸ラ」鐩�)涓嶉渶瑕佸鏍�
         if (ProjectConstant.COMMIT.equals(entity.getUsedStatus()) && ProjectStatusEnum.PENDDING.getType().equals(entity.getProjectStatus())) {
             entity.setUsedStatus(ProjectConstant.PASS);
+        }
+        if(!checkProjectNameAndIdIsUnique(entity,form.getId())){
+            return Result.error("椤圭洰鍚嶆垨椤圭洰鐮佸凡瀛樺湪");
         }
         //鏇存柊椤圭洰淇℃伅
         baseMapper.updateById(entity);
@@ -437,7 +471,8 @@
                 city.add(item);
             } else if (ImportanceTypeEnum.SHEHONG_KEY.getType().equals(item.getImportanceType())) {
                 county.add(item);
-            } else if (ImportanceTypeEnum.NORMAL.getType().equals(item.getImportanceType())) {
+            } else // if  (ImportanceTypeEnum.NORMAL.getType().equals(item.getImportanceType()))
+            {
                 normal.add(item);
             }
         });
@@ -445,22 +480,22 @@
         proPhaseCountVO.add(new IndexProPhaseCountVO("鍌ㄥ瑙勫垝闃舵", reserve.size(), reserve.stream().
                 filter(item -> !StringUtils.isEmpty(item.getTotalInvestment()))
                 .map(item -> new BigDecimal(item.getTotalInvestment()).setScale(2, RoundingMode.HALF_UP))
-                .reduce(BigDecimal.ZERO, BigDecimal::add).divide(new BigDecimal("100000000"), 2, RoundingMode.HALF_UP).toString(), "鍌�"));
+                .reduce(BigDecimal.ZERO, BigDecimal::add).divide(new BigDecimal("10000"), 2, RoundingMode.HALF_UP).toString(), "鍌�"));
 
         proPhaseCountVO.add(new IndexProPhaseCountVO("椤圭洰鍓嶆湡闃舵", previous.size(), previous.stream().
                 filter(item -> !StringUtils.isEmpty(item.getTotalInvestment()))
                 .map(item -> new BigDecimal(item.getTotalInvestment()).setScale(2, RoundingMode.HALF_UP))
-                .reduce(BigDecimal.ZERO, BigDecimal::add).divide(new BigDecimal("100000000"), 2, RoundingMode.HALF_UP).toString(), "鏂�"));
+                .reduce(BigDecimal.ZERO, BigDecimal::add).divide(new BigDecimal("10000"), 2, RoundingMode.HALF_UP).toString(), "鏂�"));
 
         proPhaseCountVO.add(new IndexProPhaseCountVO("瀹炴柦闃舵", implement.size(), implement.stream().
                 filter(item -> !StringUtils.isEmpty(item.getTotalInvestment()))
                 .map(item -> new BigDecimal(item.getTotalInvestment()).setScale(2, RoundingMode.HALF_UP))
-                .reduce(BigDecimal.ZERO, BigDecimal::add).divide(new BigDecimal("100000000"), 2, RoundingMode.HALF_UP).toString(), "寤�"));
+                .reduce(BigDecimal.ZERO, BigDecimal::add).divide(new BigDecimal("10000"), 2, RoundingMode.HALF_UP).toString(), "寤�"));
 
         proPhaseCountVO.add(new IndexProPhaseCountVO("绔e伐鎶曠敤闃舵", finish.size(), finish.stream().
                 filter(item -> !StringUtils.isEmpty(item.getTotalInvestment()))
                 .map(item -> new BigDecimal(item.getTotalInvestment()).setScale(2, RoundingMode.HALF_UP))
-                .reduce(BigDecimal.ZERO, BigDecimal::add).divide(new BigDecimal("100000000"), 2, RoundingMode.HALF_UP).toString(), "绔�"));
+                .reduce(BigDecimal.ZERO, BigDecimal::add).divide(new BigDecimal("10000"), 2, RoundingMode.HALF_UP).toString(), "绔�"));
 
         indexCountVO.setProPhaseCountVO(proPhaseCountVO);
 
@@ -468,22 +503,22 @@
         impTypeCountVO.add(new IndexImpTypeCountVO("涓�鑸」鐩�", normal.size(), normal.stream().
                 filter(item -> !StringUtils.isEmpty(item.getTotalInvestment()))
                 .map(item -> new BigDecimal(item.getTotalInvestment()).setScale(2, RoundingMode.HALF_UP))
-                .reduce(BigDecimal.ZERO, BigDecimal::add).divide(new BigDecimal("100000000"), 2, RoundingMode.HALF_UP).toString(), "鏅�"));
+                .reduce(BigDecimal.ZERO, BigDecimal::add).divide(new BigDecimal("10000"), 2, RoundingMode.HALF_UP).toString(), "鏅�"));
 
         impTypeCountVO.add(new IndexImpTypeCountVO("鍘块噸鐐归」鐩�", county.size(), county.stream().
                 filter(item -> !StringUtils.isEmpty(item.getTotalInvestment()))
                 .map(item -> new BigDecimal(item.getTotalInvestment()).setScale(2, RoundingMode.HALF_UP))
-                .reduce(BigDecimal.ZERO, BigDecimal::add).divide(new BigDecimal("100000000"), 2, RoundingMode.HALF_UP).toString(), "鍘�"));
+                .reduce(BigDecimal.ZERO, BigDecimal::add).divide(new BigDecimal("10000"), 2, RoundingMode.HALF_UP).toString(), "鍘�"));
 
         impTypeCountVO.add(new IndexImpTypeCountVO("甯傞噸鐐归」鐩�", city.size(), city.stream().
                 filter(item -> !StringUtils.isEmpty(item.getTotalInvestment()))
                 .map(item -> new BigDecimal(item.getTotalInvestment()).setScale(2, RoundingMode.HALF_UP))
-                .reduce(BigDecimal.ZERO, BigDecimal::add).divide(new BigDecimal("100000000"), 2, RoundingMode.HALF_UP).toString(), "甯�"));
+                .reduce(BigDecimal.ZERO, BigDecimal::add).divide(new BigDecimal("10000"), 2, RoundingMode.HALF_UP).toString(), "甯�"));
 
         impTypeCountVO.add(new IndexImpTypeCountVO("鐪侀噸鐐归」鐩�", province.size(), province.stream().
                 filter(item -> !StringUtils.isEmpty(item.getTotalInvestment()))
                 .map(item -> new BigDecimal(item.getTotalInvestment()).setScale(2, RoundingMode.HALF_UP))
-                .reduce(BigDecimal.ZERO, BigDecimal::add).divide(new BigDecimal("100000000"), 2, RoundingMode.HALF_UP).toString(), "鐪�"));
+                .reduce(BigDecimal.ZERO, BigDecimal::add).divide(new BigDecimal("10000"), 2, RoundingMode.HALF_UP).toString(), "鐪�"));
         indexCountVO.setImpTypeCountVO(impTypeCountVO);
         return indexCountVO;
     }
@@ -774,12 +809,14 @@
     @Transactional(rollbackFor = Exception.class)
     public Result editProject(ProjectForm form) {
         if (ObjectUtil.isNotNull(form.getProjectInfoForm())) {
+
             if (ObjectUtil.isNull(form.getProjectInfoForm().getId())) {
                 //鏂板
-                ((ProjectInfoServiceImpl) AopContext.currentProxy()).add(form.getProjectInfoForm());
+                return ((ProjectInfoServiceImpl) AopContext.currentProxy()).add(form.getProjectInfoForm());
+
             } else {
                 //鏇存柊
-                ((ProjectInfoServiceImpl) AopContext.currentProxy()).update(form.getProjectInfoForm());
+                return ((ProjectInfoServiceImpl) AopContext.currentProxy()).update(form.getProjectInfoForm());
             }
         }
         if (ObjectUtil.isNotNull(form.getProjectInvestmentInfoForm())) {
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 bc3f826..6ce896f 100644
--- a/business/src/main/java/com/ycl/service/impl/ProjectProcessServiceImpl.java
+++ b/business/src/main/java/com/ycl/service/impl/ProjectProcessServiceImpl.java
@@ -89,6 +89,7 @@
     private final ISysDeptService deptService;
     private final ProcessLogService processLogService;
     private final ISysDictTypeService dictTypeService;
+    private final ProcessConfigInfoService processConfigInfoService;
 
     /**
      * 鍒嗛〉鏌ヨ
@@ -406,6 +407,20 @@
             if (processLogService.taskIsHangup(task.getId(), task.getProcessInstanceId())) {
                 taskVO.setTaskStatus(TaskStatusEnum.HANGUP);
             }
+
+            // 璁$畻鍔炵悊鏃堕棿
+            ProcessCoding processCoding = processCodingService.getByTaskId(task.getId());
+            if (processCoding != null) {
+                if (StringUtils.isNotBlank(processCoding.getOvertime())) {
+                    Long overtime = getTime(processCoding.getOvertime());
+
+                    long durationTime = ((new Date()).getTime() - processCoding.getStartTaskTime().getTime()) / 1000;
+
+                    taskVO.setRemainingTime((overtime - durationTime) / 3600 + "灏忔椂");
+                } else {
+                    taskVO.setRemainingTime("-");
+                }
+            }
             this.distinctVo(taskVO);
             vos.add(taskVO);
         }
@@ -413,6 +428,23 @@
             result.total(vos.size());
         }
         result.put("taskList", vos);
+    }
+
+    private Long getTime(String timeStr) {
+        Long time = null;
+        if (StringUtils.isNotBlank(timeStr)) {
+            String[] timeArr = timeStr.split("-");
+            // 瑙f瀽澶╂暟鍜屽皬鏃舵暟
+            int days = Integer.parseInt(timeArr[0]);
+            int hours = 0;
+            if (timeArr.length > 1) {
+                hours = Integer.parseInt(timeArr[1]);
+            }
+            time = (days * 24L + hours) * 3600L;
+//            //鍒�-绉�
+//            time= (days * 60L) + hours;
+        }
+        return time;
     }
 
     @Override
@@ -606,7 +638,7 @@
         jsonData.setAfterHandlerIds(afterHandlerIds);
         jsonData.setAfterHandlerType(form.getPeopleType());
         // 鍙戝竷杞姙浜嬩欢
-        publisher.publishEvent(new TaskLogEvent(this, null,SecurityUtils.getUserId(), form.getProjectId(), form.getProcessInsId(), task.getId(), task.getName(),ProcessLogEventTypeEnum.DELEGATE, jsonData));
+        publisher.publishEvent(new TaskLogEvent(this, null, SecurityUtils.getUserId(), form.getProjectId(), form.getProcessInsId(), task.getId(), task.getName(), ProcessLogEventTypeEnum.DELEGATE, jsonData));
 
         return Result.ok("杞姙鎴愬姛");
     }
@@ -617,7 +649,7 @@
         Task task = taskService.createTaskQuery().taskId(form.getTaskId()).processInstanceId(form.getProcessInsId()).singleResult();
         if (Objects.nonNull(task)) {
             // 娣诲姞璺宠繃鏃ュ織
-            publisher.publishEvent(new TaskLogEvent(this, null,SecurityUtils.getUserId(), form.getProjectId(), form.getProcessInsId(), form.getTaskId(), task.getName(),ProcessLogEventTypeEnum.JUMP, new JumpData(form.getDesc())));
+            publisher.publishEvent(new TaskLogEvent(this, null, SecurityUtils.getUserId(), form.getProjectId(), form.getProcessInsId(), form.getTaskId(), task.getName(), ProcessLogEventTypeEnum.JUMP, new JumpData(form.getDesc())));
             // 鏌ュ嚭璇ヤ换鍔$粦瀹氱殑琛ㄥ崟
 
             Map<String, Object> data = new HashMap<>(1);
@@ -661,7 +693,7 @@
         }
         dataList.add(jsonData);
         //娣诲姞鐫e姙鏃ュ織
-        publisher.publishEvent(new TaskLogEvent(this, processLog.getId(), processLog.getUserId(), form.getProjectId(), form.getProcessInsId(), form.getTaskId(), task.getName(),ProcessLogEventTypeEnum.SUPERVISE, dataList));
+        publisher.publishEvent(new TaskLogEvent(this, processLog.getId(), processLog.getUserId(), form.getProjectId(), form.getProcessInsId(), form.getTaskId(), task.getName(), ProcessLogEventTypeEnum.SUPERVISE, dataList));
         return Result.ok("鎿嶄綔鎴愬姛");
     }
 
@@ -691,7 +723,7 @@
                 task.getName(),
                 ProcessLogEventTypeEnum.HANGUP,
                 new HangupData(form.getReason())
-                ));
+        ));
         return Result.ok("鎿嶄綔鎴愬姛");
     }
 
@@ -747,11 +779,11 @@
                 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));
+                    processVariables.put(key, form.getVariables().get(key));
                 }
             }
         }
-        if( !processVariables.isEmpty() ) {
+        if (!processVariables.isEmpty()) {
             taskService.setVariables(form.getTaskId(), processVariables);
         }
 
diff --git a/business/src/main/java/com/ycl/task/FlowableTask.java b/business/src/main/java/com/ycl/task/FlowableTask.java
index 94a3ef8..37bc466 100644
--- a/business/src/main/java/com/ycl/task/FlowableTask.java
+++ b/business/src/main/java/com/ycl/task/FlowableTask.java
@@ -44,6 +44,7 @@
     private ProcessLogService processLogService;
     @Autowired
     private ProcessLogMapper processLogMapper;
+
     /**
      * 璧嬬爜浠诲姟
      * 涓や釜閫昏緫 鏀归」鐩爜銆佹敼鑺傜偣棰滆壊
@@ -111,17 +112,16 @@
                 durationTime = subNodeHangupTime(hangupLogMap, task, durationTime);
 
                 String status = GREEN; // 榛樿鐘舵�佷负缁胯壊
-                if (redTime != null && redTime !=0 && durationTime >= redTime) {
+                if (redTime != null && redTime != 0 && durationTime >= redTime) {
                     status = RED; // 濡傛灉瓒呰繃绾㈣壊鏃堕棿闃堝�硷紝鍒欑姸鎬佷负绾㈣壊
-                } else if (yellowTime != null && yellowTime !=0 && durationTime >= yellowTime) {
+                } else if (yellowTime != null && yellowTime != 0 && durationTime >= yellowTime) {
                     status = YELLOW; // 鍚﹀垯锛屽鏋滆秴杩囬粍鑹叉椂闂撮槇鍊硷紝鍒欑姸鎬佷负榛勮壊
                 }
                 //澶勭悊鍔炵悊鏈熼檺
                 String overtimeStatus = NORMAL;
-                if (overtime != null && overtime !=0 && durationTime >= overtime) {
+                if (overtime != null && overtime != 0 && durationTime >= overtime) {
                     overtimeStatus = OVERTIME; // 濡傛灉瓒呰繃鍔炵悊鏈熼檺
-                }
-                else if (overtime != null && overtime != 0 && durationTime >= (overtime - 12 * 60 * 60)) {
+                } else if (overtime != null && overtime != 0 && durationTime >= (overtime - 12 * 60 * 60)) {
                     overtimeStatus = WILLOVERTIME; // 濡傛灉涓存湡(鍥哄畾瓒呮椂鍓�12灏忔椂涓轰复鏈�)
                 }
 //                else if (overtime != null && overtime != 0 && durationDay >= (overtime - 60)) {
@@ -130,9 +130,10 @@
                 map.get(status).add(task.getProcessInstanceId());
                 processCoding.setStatus(status);
                 processCoding.setOvertimeStatus(overtimeStatus);
+                processCoding.setStartTaskTime(task.getCreateTime());
                 list.add(processCoding);
             } catch (Exception e) {
-                log.error(e.getMessage(),"璧嬬爜鏃堕棿鏍煎紡鏈夎");
+                log.error(e.getMessage(), "璧嬬爜鏃堕棿鏍煎紡鏈夎");
             }
         }
         //鏇存柊椤圭洰鐮�
diff --git a/business/src/main/resources/mapper/ProjectInfoMapper.xml b/business/src/main/resources/mapper/ProjectInfoMapper.xml
index 7364d0c..5875ad5 100644
--- a/business/src/main/resources/mapper/ProjectInfoMapper.xml
+++ b/business/src/main/resources/mapper/ProjectInfoMapper.xml
@@ -234,4 +234,17 @@
     <select id="queryById" resultType="com.ycl.domain.entity.ProjectInfo">
         select * from t_project_info where id = #{id} and deleted = 0
     </select>
+
+    <resultMap id="pInfo" type="com.ycl.domain.entity.ProjectInfo">
+        <id column="id" property="id"/>
+    </resultMap>
+    <select id="checkProjectNameAndIdIsUnique" resultMap="pInfo">
+        select p.id from t_project_info p where  p.project_name =#{name}
+        <if test="code !=null and code !=''">
+            or p.project_code =#{code}
+        </if>
+        having p.id != #{id}
+
+    </select>
+
 </mapper>
diff --git a/business/src/main/resources/mapper/ProjectPlanExamineRecordMapper.xml b/business/src/main/resources/mapper/ProjectPlanExamineRecordMapper.xml
index 0490ee3..bac2ea6 100644
--- a/business/src/main/resources/mapper/ProjectPlanExamineRecordMapper.xml
+++ b/business/src/main/resources/mapper/ProjectPlanExamineRecordMapper.xml
@@ -189,7 +189,7 @@
         from t_project_plan_examine_record ppe
                  LEFT JOIN t_project_plan_info ppi on ppe.project_plan_info_id = ppi.id
                  LEFT JOIN t_project_plan_record ppr on ppe.project_plan_record_id = ppr.id
-                 INNER JOIN t_project_info pi on ppr.project_info_id = pi.id AND pi.deleted = 0
+                 Left JOIN t_project_info pi on ppr.project_info_id = pi.id AND pi.deleted = 0
         WHERE ppe.department_user_id = #{userId} or manager_user_id = #{userId}
     </select>
 
diff --git a/flowable/src/main/java/com/ycl/domain/entity/ProcessCoding.java b/flowable/src/main/java/com/ycl/domain/entity/ProcessCoding.java
index 72ab5ee..11ecc79 100644
--- a/flowable/src/main/java/com/ycl/domain/entity/ProcessCoding.java
+++ b/flowable/src/main/java/com/ycl/domain/entity/ProcessCoding.java
@@ -5,6 +5,8 @@
 import com.ycl.system.domain.base.AbsEntity;
 import lombok.Data;
 
+import java.util.Date;
+
 /**
  *
  *
@@ -52,4 +54,7 @@
     @TableField("overtime_status")
     /** 浠诲姟瓒呮椂鐘舵�� */
     private String overtimeStatus;
+
+    @TableField("start_task_time")
+    private Date startTaskTime;
 }
diff --git a/flowable/src/main/java/com/ycl/mapper/ProcessCodingMapper.java b/flowable/src/main/java/com/ycl/mapper/ProcessCodingMapper.java
index 829157c..f5ccb6d 100644
--- a/flowable/src/main/java/com/ycl/mapper/ProcessCodingMapper.java
+++ b/flowable/src/main/java/com/ycl/mapper/ProcessCodingMapper.java
@@ -36,4 +36,6 @@
      * @param list
      */
     void updateBatch(@Param("list") List<ProcessCoding> list);
+
+    List<ProcessCoding> findByTaskId(@Param("taskId") String taskId);
 }
diff --git a/flowable/src/main/java/com/ycl/service/ProcessCodingService.java b/flowable/src/main/java/com/ycl/service/ProcessCodingService.java
index a270408..ad24d08 100644
--- a/flowable/src/main/java/com/ycl/service/ProcessCodingService.java
+++ b/flowable/src/main/java/com/ycl/service/ProcessCodingService.java
@@ -63,4 +63,7 @@
      * @return
      */
     Result all();
+
+
+    ProcessCoding getByTaskId(String id);
 }
diff --git a/flowable/src/main/java/com/ycl/service/impl/ProcessCodingServiceImpl.java b/flowable/src/main/java/com/ycl/service/impl/ProcessCodingServiceImpl.java
index a40d634..bea89f4 100644
--- a/flowable/src/main/java/com/ycl/service/impl/ProcessCodingServiceImpl.java
+++ b/flowable/src/main/java/com/ycl/service/impl/ProcessCodingServiceImpl.java
@@ -1,6 +1,8 @@
 package com.ycl.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.ycl.common.base.Result;
 import com.ycl.domain.entity.ProcessCoding;
@@ -19,7 +21,7 @@
 import java.util.stream.Collectors;
 
 /**
- *  鏈嶅姟瀹炵幇绫�
+ * 鏈嶅姟瀹炵幇绫�
  *
  * @author flq
  * @since 2025-01-02
@@ -32,6 +34,7 @@
 
     /**
      * 娣诲姞
+     *
      * @param form
      * @return
      */
@@ -44,6 +47,7 @@
 
     /**
      * 淇敼
+     *
      * @param form
      * @return
      */
@@ -60,6 +64,7 @@
 
     /**
      * 鎵归噺鍒犻櫎
+     *
      * @param ids
      * @return
      */
@@ -71,6 +76,7 @@
 
     /**
      * id鍒犻櫎
+     *
      * @param id
      * @return
      */
@@ -82,6 +88,7 @@
 
     /**
      * 鍒嗛〉鏌ヨ
+     *
      * @param query
      * @return
      */
@@ -94,6 +101,7 @@
 
     /**
      * 鏍规嵁id鏌ユ壘
+     *
      * @param id
      * @return
      */
@@ -106,6 +114,7 @@
 
     /**
      * 鍒楄〃
+     *
      * @return
      */
     @Override
@@ -116,4 +125,14 @@
                 .collect(Collectors.toList());
         return Result.ok().data(vos);
     }
+
+    @Override
+    public ProcessCoding getByTaskId(String taskId) {
+
+        List<ProcessCoding> list = baseMapper.findByTaskId(taskId);
+        if (list.size() > 0) {
+            return list.get(0);
+        }
+        return null;
+    }
 }
diff --git a/flowable/src/main/resources/mapper/ProcessCodingMapper.xml b/flowable/src/main/resources/mapper/ProcessCodingMapper.xml
index ad0c884..4febc7a 100644
--- a/flowable/src/main/resources/mapper/ProcessCodingMapper.xml
+++ b/flowable/src/main/resources/mapper/ProcessCodingMapper.xml
@@ -52,6 +52,9 @@
         WHERE
             TPC.deleted = 0
     </select>
+    <select id="findByTaskId" resultType="com.ycl.domain.entity.ProcessCoding">
+        SELECT * from t_process_coding where task_id = #{taskId}
+    </select>
 
     <!-- 鑷畾涔夋壒閲忔洿鏂�,浣跨敤鍓嶅垽鏂璴ist鏄惁涓虹┖ 杞崲涓簊ql
     update t_process_coding
diff --git a/start/src/main/resources/application.yml b/start/src/main/resources/application.yml
index 3be20ad..5e1ce3d 100644
--- a/start/src/main/resources/application.yml
+++ b/start/src/main/resources/application.yml
@@ -5,6 +5,7 @@
   # 瀹炰綋鎵弿锛屽涓猵ackage鐢ㄩ�楀彿鎴栬�呭垎鍙峰垎闅�
   typeAliasesPackage: com.ycl.**.domain
   configuration:
+    shrink-whitespaces-in-sql: true #浠嶴QL涓垹闄ゅ浣欑殑绌烘牸瀛楃
     default-enum-type-handler: com.baomidou.mybatisplus.core.handlers.MybatisEnumTypeHandler # 閫氱敤鏋氫妇澶勭悊鍣�
   #    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 鏃ュ織鎵撳嵃
   global-config:

--
Gitblit v1.8.0