Procházet zdrojové kódy

评估-工作流名称变更,项目归档与合同归档的关联

徐滕 před 4 dny
rodič
revize
a5cae343f2

+ 3 - 2
jeeplus-modules/jeeplus-assess/src/main/java/com/jeeplus/assess/invoice/controller/FinanceInvoiceController.java

@@ -190,7 +190,8 @@ public class FinanceInvoiceController {
     @PostMapping("saveForm")
     public ResponseEntity saveForm(@Valid @RequestBody FinanceInvoiceDTO financeInvoiceDTO) throws Exception {
         String id = financeInvoiceService.saveForm(financeInvoiceDTO);
-        return ResponseUtil.newInstance().add("businessTable", "finance_invoice").add("businessId", id).ok ("操作成功");
+        FinanceInvoiceDTO savedDto = financeInvoiceService.queryById(id);
+        return ResponseUtil.newInstance().add("businessTable", "finance_invoice").add("businessId", id).add("no", savedDto.getNo()).add("programName", savedDto.getProgramName()).ok ("操作成功");
     }
 
     /**
@@ -203,7 +204,7 @@ public class FinanceInvoiceController {
     @PostMapping("saveFormInvalid")
     public ResponseEntity saveFormInvalid(@Valid @RequestBody FinanceInvoiceDTO financeInvoiceDTO) throws Exception {
         String id = financeInvoiceService.saveFormInvalid(financeInvoiceDTO);
-        return ResponseUtil.newInstance().add("businessTable", "finance_invoice_invalid").add("businessId", id).ok ("操作成功");
+        return ResponseUtil.newInstance().add("businessTable", "finance_invoice_invalid").add("businessId", id).add("no", financeInvoiceDTO.getNo()).add("programName", financeInvoiceDTO.getProgramName()).ok ("操作成功");
     }
 
     /**

+ 2 - 1
jeeplus-modules/jeeplus-assess/src/main/java/com/jeeplus/assess/program/configuration/projectList/controller/ProjectListController.java

@@ -139,7 +139,8 @@ public class ProjectListController {
     @PostMapping(value = "/saveForm")
     public ResponseEntity saveForm(@RequestBody ProjectListDto projectListDto) throws Exception{
         String id = projectListService.save(projectListDto,"1");
-        return ResponseUtil.newInstance().add("businessTable", "program_project_list_info").add("businessId", id).ok ("操作成功");
+        ProjectListDto savedDto = projectListService.findById(id);
+        return ResponseUtil.newInstance().add("businessTable", "program_project_list_info").add("businessId", id).add("no", savedDto.getNo()).add("name", savedDto.getName()).ok ("操作成功");
     }
 
     /**

+ 13 - 2
jeeplus-modules/jeeplus-assess/src/main/java/com/jeeplus/assess/program/configuration/projectList/mapper/ProgramArchiveMapper.java

@@ -38,8 +38,19 @@ public interface ProgramArchiveMapper extends BaseMapper<ProgramArchive> {
      * @param invoiceDate 开票日期
      */
     void updateInvoiceInfoByProgramId(@Param("programId") String programId, @Param("invoiceDate") Date invoiceDate);
-}
-
 
+    /**
+     * 合同归档完成后,同步更新关联项目的"合同是否存档"字段
+     * 只更新项目归档审核未通过(status != '5')的记录
+     * @param contractId 合同id
+     */
+    void syncContractArchiveByContractId(@Param("contractId") String contractId);
 
+    /**
+     * 打开归档表单时,主动从合同表刷新 is_contract_archive 字段
+     * 只刷新项目归档审核未通过(status != '5'/'7')的记录
+     * @param id program_archive 主键id
+     */
+    void refreshContractArchiveFromContract(@Param("id") String id);
+}
 

+ 22 - 0
jeeplus-modules/jeeplus-assess/src/main/java/com/jeeplus/assess/program/configuration/projectList/mapper/xml/ProgramArchiveMapper.xml

@@ -205,4 +205,26 @@
           AND del_flag = '0'
           AND (is_invoice IS NULL OR is_invoice = '' OR is_invoice = '0')
     </update>
+
+    <update id="syncContractArchiveByContractId">
+        UPDATE program_archive pa
+        JOIN program_project_list_info ppli ON pa.program_id = ppli.id AND ppli.del_flag = '0'
+        SET pa.is_contract_archive = '1',
+            pa.update_time = NOW()
+        WHERE ppli.contract_id = #{contractId}
+          AND pa.del_flag = '0'
+          AND pa.status IN ('1', '3', '4', '6')
+    </update>
+
+    <!-- 打开归档表单时,主动从合同表刷新 is_contract_archive 字段 -->
+    <update id="refreshContractArchiveFromContract">
+        UPDATE program_archive pa
+        JOIN program_project_list_info ppli ON pa.program_id = ppli.id AND ppli.del_flag = '0'
+        LEFT JOIN work_contract_info wci ON ppli.contract_id = wci.id AND wci.del_flag = '0'
+        SET pa.is_contract_archive = IF(IFNULL(wci.filed_type, '0') = '5', '1', '0'),
+            pa.update_time = NOW()
+        WHERE pa.id = #{id}
+          AND pa.del_flag = '0'
+          AND pa.status IN ('1', '3', '4', '6')
+    </update>
 </mapper>

+ 2 - 0
jeeplus-modules/jeeplus-assess/src/main/java/com/jeeplus/assess/program/configuration/projectList/service/ProjectListService.java

@@ -799,6 +799,8 @@ public class ProjectListService {
     }
 
     public ProgramArchiveDto findByIdArchive(String id){
+        // 打开归档表单时,先主动从合同表刷新 is_contract_archive(审核未通过的才刷新)
+        programArchiveMapper.refreshContractArchiveFromContract(id);
         ProgramArchiveDto programArchiveDto = programArchiveMapper.findByIdArchive(id);
         if(ObjectUtil.isNotEmpty(programArchiveDto)){
             if(ObjectUtil.isNotEmpty(programArchiveDto.getProgramProjectListInfo())){

+ 2 - 1
jeeplus-modules/jeeplus-assess/src/main/java/com/jeeplus/assess/workContract/controller/WorkContractBorrowController.java

@@ -30,7 +30,8 @@ public class WorkContractBorrowController {
     @PostMapping(value = "save")
     public ResponseEntity<String> save(@RequestBody WorkContractBorrowDto workContractBorrowDto) throws Exception{
         String id = workContractBorrowService.saveInfo(workContractBorrowDto);
-        return ResponseUtil.newInstance().add("businessTable", "work_contract_borrow").add("businessId", id).ok ("操作成功");
+        WorkContractBorrow saved = workContractBorrowService.findById(id);
+        return ResponseUtil.newInstance().add("businessTable", "work_contract_borrow").add("businessId", id).add("no", saved.getNo()).add("name", saved.getName()).ok ("操作成功");
     }
 
     /**

+ 2 - 1
jeeplus-modules/jeeplus-assess/src/main/java/com/jeeplus/assess/workContract/controller/WorkContractController.java

@@ -178,7 +178,8 @@ public class WorkContractController {
     @PostMapping(value = "save")
     public ResponseEntity<String> save(@RequestBody WorkContractInfoDto workContractInfoDto) throws Exception{
         String id = workContractService.saveInfo(workContractInfoDto);
-        return ResponseUtil.newInstance().add("businessTable", "work_contract_info").add("businessId", id).ok ("操作成功");
+        WorkContractInfoDto savedDto = workContractService.findById(id);
+        return ResponseUtil.newInstance().add("businessTable", "work_contract_info").add("businessId", id).add("no", savedDto.getNo()).add("name", savedDto.getName()).ok ("操作成功");
     }
 
     /**

+ 8 - 0
jeeplus-modules/jeeplus-assess/src/main/java/com/jeeplus/assess/workContract/service/WorkContractFileService.java

@@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.jeeplus.assess.program.configuration.projectList.mapper.ProgramArchiveMapper;
 import com.jeeplus.assess.workContract.domain.WorkContractFile;
 import com.jeeplus.assess.workContract.mapper.WorkContractFileMapper;
 import com.jeeplus.assess.workContract.service.dto.WorkContractFileDto;
@@ -33,6 +34,9 @@ public class WorkContractFileService {
     @Resource
     private WorkContractFileMapper workContractFileMapper;
 
+    @Resource
+    private ProgramArchiveMapper programArchiveMapper;
+
     public String saveInfo(WorkContractFileDto workContractFileDto) throws Exception {
         if (StringUtils.isNotEmpty(workContractFileDto.getId())) {
             WorkContractFile info = workContractFileMapper.selectFileByContractInfoId(workContractFileDto.getId());
@@ -83,6 +87,10 @@ public class WorkContractFileService {
      */
     public void updateStatusById(WorkContractFileDto workContractFileDto) {
         workContractFileMapper.updateStatusById(workContractFileDto.getId(), workContractFileDto.getFiledType());
+        // 合同归档完成(filedType=5)时,同步更新关联项目的"合同是否存档"字段
+        if ("5".equals(workContractFileDto.getFiledType())) {
+            programArchiveMapper.syncContractArchiveByContractId(workContractFileDto.getId());
+        }
     }
 
 

+ 2 - 0
jeeplus-modules/jeeplus-flowable/src/main/java/com/jeeplus/flowable/model/Flow.java

@@ -62,6 +62,8 @@ public class Flow {
     private String assigneeName; // 任务执行人名称
     private String assigneeId; // 任务执行人Id
 
+    private String relatedNo; // 关联业务编号(搜索条件)
+
     private Variable vars;        // 流程变量
 
     private Date beginDate;    // 开始查询日期

+ 8 - 0
jeeplus-modules/jeeplus-flowable/src/main/java/com/jeeplus/flowable/service/FlowTaskService.java

@@ -567,6 +567,9 @@ public class FlowTaskService {
         if (StringUtils.isNotEmpty(act.getAssigneeId())) {
             histTaskQuery.processVariableValueLike (FlowableConstant.USERNAME,"%"+ act.getAssigneeId()+"%");
         }
+        if (StringUtils.isNotEmpty(act.getRelatedNo())) {
+            histTaskQuery.processVariableValueLike (FlowableConstant.TITLE, "%" + act.getRelatedNo() + "%");
+        }
         // 查询总数
         page.setTotal ( histTaskQuery.count ( ) );
         // 查询列表
@@ -588,6 +591,11 @@ public class FlowTaskService {
                 HisTaskVo hisTaskVo = new HisTaskVo ( histTask );
                 hisTaskVo.setProcessDefinitionName ( ProcessDefCache.get ( histTask.getProcessDefinitionId ( ) ).getName ( ) );
                 hisTaskVo.setBack ( isBack ( histTask ) );
+                // 从标题中提取关联业务编号
+                Object titleObj = histTask.getProcessVariables() != null ? histTask.getProcessVariables().get(FlowableConstant.TITLE) : null;
+                if (titleObj != null) {
+                    hisTaskVo.setRelatedNo(HisTaskVo.extractRelatedNo(titleObj.toString()));
+                }
                 List <Task> currentTaskList = taskService.createTaskQuery ( ).processInstanceId ( histTask.getProcessInstanceId ( ) ).list ( );
                 if ( ((List) currentTaskList).size ( ) > 0 ) {
                     TaskVo currentTaskVo = new TaskVo ( currentTaskList.get ( 0 ) );

+ 42 - 0
jeeplus-modules/jeeplus-flowable/src/main/java/com/jeeplus/flowable/vo/HisTaskVo.java

@@ -5,6 +5,8 @@ import org.flowable.task.api.history.HistoricTaskInstance;
 
 import java.util.Date;
 import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 
 /*
     历史任务节点
@@ -34,6 +36,7 @@ public class HisTaskVo {
     private String belongProject; // 所属系统
     private String processDefKey; // 流程key
     private String businessId; // 数据详情id
+    private String relatedNo; // 关联业务编号(从标题提取)
 
     public HisTaskVo(HistoricTaskInstance task) {
         this.id = task.getId ( );
@@ -49,4 +52,43 @@ public class HisTaskVo {
         this.processInstanceId = task.getProcessInstanceId ( );
     }
 
+    /**
+     * 从流程标题中提取业务关联编号
+     * 新标题格式(统一包含方括号编号):
+     *   A类报销:张三 在 2026-11-09 09:48 发起了 [BX2024001] [评估-报销审批]
+     *   B类合同:张三 在 2026-11-09 09:48 发起了 [HT2024001] - XX合同 [评估-合同登记]
+     *   C类有报告号:张三 在 2026-11-09 09:48 发起了 苏兴评字[2026]001号 - XX项目 [评估-项目归档]
+     *   C类无报告号:张三 在 2026-11-09 09:48 发起了 - XX项目 [评估-项目归档]
+     *   旧格式兼容:张三 发起了 [BX2024001] - [评估-报销审批]
+     *
+     * 提取策略:最后一个方括号是流程名称,之前的内容中提取编号
+     */
+    public static String extractRelatedNo(String title) {
+        if (title == null || title.isEmpty()) {
+            return null;
+        }
+        // 策略:匹配 "发起了" 之后、最后一个 "[流程名]" 之前的内容
+        Pattern pattern = Pattern.compile("发起了\\s*(.+?)\\s*\\[(?:评估|会计|项目|财务|咨询|中审|苏州)[^\\]]*\\]\\s*$");
+        Matcher matcher = pattern.matcher(title);
+        if (matcher.find()) {
+            String middle = matcher.group(1).trim();
+            if (middle.isEmpty() || middle.equals("-")) {
+                return null; // C类无报告号的情况
+            }
+            // 去除尾部的 " - 项目名称" 部分
+            int dashIdx = middle.lastIndexOf(" - ");
+            if (dashIdx > 0) {
+                middle = middle.substring(0, dashIdx).trim();
+            }
+            // 如果中间部分本身被方括号包裹(如 [BX2024001]),提取内部内容
+            Pattern innerBracket = Pattern.compile("^\\[(.+)]$");
+            Matcher innerMatcher = innerBracket.matcher(middle);
+            if (innerMatcher.matches()) {
+                return innerMatcher.group(1);
+            }
+            return middle;
+        }
+        return null;
+    }
+
 }