Jelajahi Sumber

苏州领跨年报告号

徐滕 2 hari lalu
induk
melakukan
06ddf84d5e

+ 2 - 0
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/projectReport/domain/CwProjectReportData.java

@@ -32,6 +32,8 @@ public class CwProjectReportData extends BaseDTO {
     private String takeNumberType;
     @TableField(exist = false)
     private String improperTakeCause;
+    @TableField(exist = false)
+    private String crossYearFlag; // 跨年标识 1:跨年 0:当年
 
     @TableField(exist = false)
     private String isBatchImport;

+ 2 - 0
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/projectReport/domain/CwProjectReportNumberApply.java

@@ -28,4 +28,6 @@ public class CwProjectReportNumberApply extends BaseEntity {
     private String takeNumberType;
     //非正常取号原因
     private String improperTakeCause;
+    //跨年标识 1:跨年 0:当年
+    private String crossYearFlag;
 }

+ 9 - 0
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/projectReport/mapper/CwProjectReportNumberApplyMapper.java

@@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.jeeplus.finance.projectReport.domain.CwProjectReportData;
 import com.jeeplus.finance.projectReport.domain.CwProjectReportNumberApply;
 import com.jeeplus.finance.projectReport.domain.CwProjectReview;
+import com.jeeplus.finance.reimbursementApproval.approvalInfo.service.dto.ReportNoDto;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 
@@ -25,4 +26,12 @@ public interface CwProjectReportNumberApplyMapper extends BaseMapper<CwProjectRe
 
     @InterceptorIgnore(tenantLine = "true")
     void updateReviewById(CwProjectReportNumberApply review);
+
+    /**
+     * 根据报告号前缀查询最大的报告号(用于跨年领号)
+     * @param reportNoPrefix 报告号前缀,例如:苏兴会基字[2023]
+     * @return 最大的报告号信息
+     */
+    @InterceptorIgnore(tenantLine = "true")
+    ReportNoDto getMaxReportNoByPrefix(@Param("reportNoPrefix") String reportNoPrefix);
 }

+ 8 - 0
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/projectReport/mapper/CwProjectReportReviewMapper.java

@@ -83,4 +83,12 @@ public interface CwProjectReportReviewMapper extends BaseMapper<CwProjectReview>
      * @param userId    用户id
      */
     String getReportReviewUserIdByProcInsId(@Param(value = "procInsId")String procInsId , @Param(value = "userId")String userId);
+
+    /**
+     * 根据报告号前缀查询最大的报告号(用于跨年领号)
+     * @param reportNoPrefix 报告号前缀,例如:苏兴会基字[2023]
+     * @return 最大的报告号信息
+     */
+    @InterceptorIgnore(tenantLine = "true")
+    ReportNoDto getMaxReportNoByPrefix(@Param("reportNoPrefix") String reportNoPrefix);
 }

+ 10 - 0
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/projectReport/mapper/xml/CwProjectReportNumberApplyMapper.xml

@@ -17,6 +17,9 @@
         <if test="improperTakeCause != null and improperTakeCause != ''">
             improper_take_cause = #{improperTakeCause},
         </if>
+        <if test="crossYearFlag != null and crossYearFlag != ''">
+            cross_year_flag = #{crossYearFlag},
+        </if>
         update_by_id = #{updateById},
         update_time = #{updateTime}
         WHERE
@@ -30,4 +33,11 @@
     <select id="selectByPortId" resultType="com.jeeplus.finance.projectReport.domain.CwProjectReportData">
          select * from cw_project_report_number_apply where report_id = #{id}
     </select>
+    <select id="getMaxReportNoByPrefix" resultType="com.jeeplus.finance.reimbursementApproval.approvalInfo.service.dto.ReportNoDto">
+        SELECT report_no as reportNo
+        FROM cw_project_info_data
+        WHERE report_no LIKE CONCAT(#{reportNoPrefix}, '%')
+        ORDER BY report_no DESC
+        LIMIT 1
+    </select>
 </mapper>

+ 8 - 0
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/projectReport/mapper/xml/CwProjectReportReviewMapper.xml

@@ -173,4 +173,12 @@
             LIMIT 1
     </select>
 
+    <select id="getMaxReportNoByPrefix" resultType="com.jeeplus.finance.reimbursementApproval.approvalInfo.service.dto.ReportNoDto">
+        select report_no as reportNo
+        from cw_project_report_new_line
+        where report_no like concat(#{reportNoPrefix}, '%')
+        order by cast(substring_index(substring_index(report_no, '号', 1), ']', -1) as unsigned) desc
+            limit 1
+    </select>
+
 </mapper>

+ 137 - 38
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/projectReport/service/CwProjectReportNumberApplyService.java

@@ -118,10 +118,21 @@ public class CwProjectReportNumberApplyService extends ServiceImpl<CwProjectRepo
         review.setUpdateById(userDTO.getId());
         review.setUpdateTime(new Date());
         review.setId(detail.getId());
+        // 设置跨年标识默认值,确保数据完整性
+        if (StringUtils.isBlank(review.getCrossYearFlag())) {
+            review.setCrossYearFlag("0");
+        }
         String currentToken = TokenProvider.getCurrentToken();
 
 
         if (reportData.getReviewStatus().equals("5")){
+            // 如果是跨年申请(crossYearFlag=1),在此处预留报告号赋值点位
+            // TODO: 流程节点名称=所长审核 时,根据跨年标识生成相应年度的报告号
+            // if ("1".equals(review.getCrossYearFlag())) {
+            //     // 跨年报告号生成逻辑:获取上一年度的报告号前缀
+            //     // 例如:当前是2026年,则使用2025年的报告号序列
+            // }
+            
             //设置报告文号、报告流水号
             CwProjectInfoData infoData = new CwProjectInfoData();
             //报告文号生成
@@ -130,46 +141,97 @@ public class CwProjectReportNumberApplyService extends ServiceImpl<CwProjectRepo
                 infoData.setReportNo(reportData.getReportNo());
             }else{
                 if (!reportData.getTakeNumberType().equals("2")){
-                    if(StringUtils.isNotBlank(reportData.getReportType())) {
-                        ReportNoDto projectReportByNumber = new ReportNoDto();
-                        switch (reportData.getReportType()) {
-                            case "1":   //基字
-                                do{
-                                    documentNo = SpringUtil.getBean ( IWorkAttachmentApi.class ).genSerialNumNoSort(userDTO.getCompanyDTO().getId(), CwProjectInfoData.BIZ_CODE,currentToken);
-                                    //根据报告号查询诗剧苦中是否存在
-                                    projectReportByNumber = reviewMapper.getProjectReportByNumber(documentNo);
-                                }while (null != projectReportByNumber && StringUtils.isNotBlank(projectReportByNumber.getReportNo()));
-                                break;
-                            case "2":   //咨字
-                                do{
-                                    documentNo = SpringUtil.getBean ( IWorkAttachmentApi.class ).genSerialNumNoSort(userDTO.getCompanyDTO().getId(), CwProjectInfoData.CONSULT_BIZ_CODE,currentToken);
-                                    //根据报告号查询诗剧苦中是否存在
-                                    projectReportByNumber = reviewMapper.getProjectReportByNumber(documentNo);
-                                }while (null != projectReportByNumber && StringUtils.isNotBlank(projectReportByNumber.getReportNo()));
-                                break;
-                            case "3":   //审字
-                                do{
-                                    documentNo = SpringUtil.getBean ( IWorkAttachmentApi.class ).genSerialNumNoSort(userDTO.getCompanyDTO().getId(), CwProjectInfoData.EXAMINE_BIZ_CODE,currentToken);
-                                    //根据报告号查询诗剧苦中是否存在
-                                    projectReportByNumber = reviewMapper.getProjectReportByNumber(documentNo);
-                                }while (null != projectReportByNumber && StringUtils.isNotBlank(projectReportByNumber.getReportNo()));
-                                break;
-                            case "4":   //验字
-                                do{
-                                    documentNo = SpringUtil.getBean ( IWorkAttachmentApi.class ).genSerialNumNoSort(userDTO.getCompanyDTO().getId(), CwProjectInfoData.CHECK_BIZ_CODE,currentToken);
-                                    //根据报告号查询诗剧苦中是否存在
-                                    projectReportByNumber = reviewMapper.getProjectReportByNumber(documentNo);
-                                }while (null != projectReportByNumber && StringUtils.isNotBlank(projectReportByNumber.getReportNo()));
-                                break;
-                            case "5":   //特字
-                                do{
-                                    documentNo = SpringUtil.getBean ( IWorkAttachmentApi.class ).genSerialNumNoSort(userDTO.getCompanyDTO().getId(), CwProjectInfoData.SPECIAL_BIZ_CODE,currentToken);
-                                    //根据报告号查询诗剧苦中是否存在
-                                    projectReportByNumber = reviewMapper.getProjectReportByNumber(documentNo);
-                                }while (null != projectReportByNumber && StringUtils.isNotBlank(projectReportByNumber.getReportNo()));
-                                break;
+                    if (StringUtils.isBlank(review.getCrossYearFlag()) || "0".equals(review.getCrossYearFlag())) {
+                        if(StringUtils.isNotBlank(reportData.getReportType())) {
+                            ReportNoDto projectReportByNumber = new ReportNoDto();
+                            switch (reportData.getReportType()) {
+                                case "1":   //基字
+                                    do{
+                                        documentNo = SpringUtil.getBean ( IWorkAttachmentApi.class ).genSerialNumNoSort(userDTO.getCompanyDTO().getId(), CwProjectInfoData.BIZ_CODE,currentToken);
+                                        //根据报告号查询诗剧苦中是否存在
+                                        projectReportByNumber = reviewMapper.getProjectReportByNumber(documentNo);
+                                    }while (null != projectReportByNumber && StringUtils.isNotBlank(projectReportByNumber.getReportNo()));
+                                    break;
+                                case "2":   //咨字
+                                    do{
+                                        documentNo = SpringUtil.getBean ( IWorkAttachmentApi.class ).genSerialNumNoSort(userDTO.getCompanyDTO().getId(), CwProjectInfoData.CONSULT_BIZ_CODE,currentToken);
+                                        //根据报告号查询诗剧苦中是否存在
+                                        projectReportByNumber = reviewMapper.getProjectReportByNumber(documentNo);
+                                    }while (null != projectReportByNumber && StringUtils.isNotBlank(projectReportByNumber.getReportNo()));
+                                    break;
+                                case "3":   //审字
+                                    do{
+                                        documentNo = SpringUtil.getBean ( IWorkAttachmentApi.class ).genSerialNumNoSort(userDTO.getCompanyDTO().getId(), CwProjectInfoData.EXAMINE_BIZ_CODE,currentToken);
+                                        //根据报告号查询诗剧苦中是否存在
+                                        projectReportByNumber = reviewMapper.getProjectReportByNumber(documentNo);
+                                    }while (null != projectReportByNumber && StringUtils.isNotBlank(projectReportByNumber.getReportNo()));
+                                    break;
+                                case "4":   //验字
+                                    do{
+                                        documentNo = SpringUtil.getBean ( IWorkAttachmentApi.class ).genSerialNumNoSort(userDTO.getCompanyDTO().getId(), CwProjectInfoData.CHECK_BIZ_CODE,currentToken);
+                                        //根据报告号查询诗剧苦中是否存在
+                                        projectReportByNumber = reviewMapper.getProjectReportByNumber(documentNo);
+                                    }while (null != projectReportByNumber && StringUtils.isNotBlank(projectReportByNumber.getReportNo()));
+                                    break;
+                                case "5":   //特字
+                                    do{
+                                        documentNo = SpringUtil.getBean ( IWorkAttachmentApi.class ).genSerialNumNoSort(userDTO.getCompanyDTO().getId(), CwProjectInfoData.SPECIAL_BIZ_CODE,currentToken);
+                                        //根据报告号查询诗剧苦中是否存在
+                                        projectReportByNumber = reviewMapper.getProjectReportByNumber(documentNo);
+                                    }while (null != projectReportByNumber && StringUtils.isNotBlank(projectReportByNumber.getReportNo()));
+                                    break;
+                            }
+                        }
+                    } else if ("1".equals(review.getCrossYearFlag())){
+                        // 跨年领号:生成上一年度的报告号
+                        int lastYear = java.time.Year.now().getValue() - 1;
+                        if(StringUtils.isNotBlank(reportData.getReportType())) {
+                            ReportNoDto projectReportByNumber = new ReportNoDto();
+                            switch (reportData.getReportType()) {
+                                case "1":   //基字 - 苏兴会基字
+                                    String bizPrefix = "苏兴会基字[" + lastYear + "]";
+                                    do{
+                                        documentNo = generateCrossYearReportNo(bizPrefix);
+                                        //根据报告号查询诗剧苦中是否存在
+                                        projectReportByNumber = reviewMapper.getProjectReportByNumber(documentNo);
+                                    }while (null != projectReportByNumber && StringUtils.isNotBlank(projectReportByNumber.getReportNo()));
+                                    break;
+                                case "2":   //咨字 - 苏兴会咨字
+                                    String consultPrefix = "苏兴会咨字[" + lastYear + "]";
+                                    do{
+                                        documentNo = generateCrossYearReportNo(consultPrefix);
+                                        //根据报告号查询诗剧苦中是否存在
+                                        projectReportByNumber = reviewMapper.getProjectReportByNumber(documentNo);
+                                    }while (null != projectReportByNumber && StringUtils.isNotBlank(projectReportByNumber.getReportNo()));
+                                    break;
+                                case "3":   //审字 - 苏兴会审字
+                                    String examinePrefix = "苏兴会审字[" + lastYear + "]";
+                                    do{
+                                        documentNo = generateCrossYearReportNo(examinePrefix);
+                                        //根据报告号查询诗剧苦中是否存在
+                                        projectReportByNumber = reviewMapper.getProjectReportByNumber(documentNo);
+                                    }while (null != projectReportByNumber && StringUtils.isNotBlank(projectReportByNumber.getReportNo()));
+                                    break;
+                                case "4":   //验字 - 苏兴会验字
+                                    String checkPrefix = "苏兴会验字[" + lastYear + "]";
+                                    do{
+                                        documentNo = generateCrossYearReportNo(checkPrefix);
+                                        //根据报告号查询诗剧苦中是否存在
+                                        projectReportByNumber = reviewMapper.getProjectReportByNumber(documentNo);
+                                    }while (null != projectReportByNumber && StringUtils.isNotBlank(projectReportByNumber.getReportNo()));
+                                    break;
+                                case "5":   //特字 - 苏兴会特字
+                                    String specialPrefix = "苏兴会特字[" + lastYear + "]";
+                                    do{
+                                        documentNo = generateCrossYearReportNo(specialPrefix);
+                                        //根据报告号查询诗剧苦中是否存在
+                                        projectReportByNumber = reviewMapper.getProjectReportByNumber(documentNo);
+                                    }while (null != projectReportByNumber && StringUtils.isNotBlank(projectReportByNumber.getReportNo()));
+                                    break;
+                            }
                         }
                     }
+
                 }
                 if(StringUtils.isNotBlank(reportData.getReportNumber())){
                     infoData.setReportNumber(reportData.getReportNumber());
@@ -286,6 +348,10 @@ public class CwProjectReportNumberApplyService extends ServiceImpl<CwProjectRepo
         info.setUpdateById(userDTO.getId());
         info.setUpdateTime(new Date());
         info.setReportId(dto.getId());
+        // 设置跨年标识,默认为0(当年)
+        if (StringUtils.isBlank(info.getCrossYearFlag())) {
+            info.setCrossYearFlag("0");
+        }
         mapper.insert(info);
         //保存复核信息  只保存一个下一节点审核人信息
         CwProjectReview cwProjectReview = reviewMapper.selectByReportId(dto.getId());
@@ -482,4 +548,37 @@ public class CwProjectReportNumberApplyService extends ServiceImpl<CwProjectRepo
         }
 
     }
+
+    /**
+     * 生成跨年报告号
+     * @param reportNoPrefix 报告号前缀,例如:苏兴会基字[2023]
+     * @return 生成的报告号,例如:苏兴会基字[2023]723号
+     */
+    private String generateCrossYearReportNo(String reportNoPrefix) {
+        // 查询数据库中该前缀下最大的报告号
+        ReportNoDto maxReportNo = reviewMapper.getMaxReportNoByPrefix(reportNoPrefix);
+        
+        int nextSerialNumber = 1; // 默认从1开始
+        
+        if (maxReportNo != null && StringUtils.isNotBlank(maxReportNo.getReportNo())) {
+            // 提取流水号部分:从最后一个']'后面到'号'前面
+            String reportNo = maxReportNo.getReportNo();
+            int bracketEndIndex = reportNo.lastIndexOf("]");
+            int haoIndex = reportNo.lastIndexOf("号");
+            
+            if (bracketEndIndex != -1 && haoIndex != -1 && haoIndex > bracketEndIndex) {
+                String serialNumberStr = reportNo.substring(bracketEndIndex + 1, haoIndex);
+                try {
+                    int currentSerialNumber = Integer.parseInt(serialNumberStr);
+                    nextSerialNumber = currentSerialNumber + 1;
+                } catch (NumberFormatException e) {
+                    // 如果解析失败,使用默认值1
+                    nextSerialNumber = 1;
+                }
+            }
+        }
+        
+        // 生成新的报告号:前缀 + 流水号 + "号"
+        return reportNoPrefix + nextSerialNumber + "号";
+    }
 }

+ 9 - 0
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/projectReport/service/CwProjectReportService.java

@@ -2415,6 +2415,13 @@ public class CwProjectReportService extends ServiceImpl<CwProjectReportMapper, C
                 reportData.setComputerNo(review.getComputerNo());
                 reportData.setReportReviewNo(review.getReportReviewNo());
                 reportData.setReviewBy(review.getReviewBy());
+                
+                // 设置跨年标识:从报告号申请表中查询
+                CwProjectReportNumberApply applyRecord = applyMapper.selectByReportId(reportData.getId());
+                if (null != applyRecord && StringUtils.isNotBlank(applyRecord.getCrossYearFlag())) {
+                    reportData.setCrossYearFlag(applyRecord.getCrossYearFlag());
+                }
+                
                 //将一级复核等填入数据查出
                 List<CwProofreadDetail> details = detailMapper.findByReportInfoId(review.getId());
                 if (null != details) {
@@ -2439,6 +2446,8 @@ public class CwProjectReportService extends ServiceImpl<CwProjectReportMapper, C
             if (null != review) {
                 reportData = reportMapper.queryById(review.getReportId());
                 if (null != reportData) {
+                    // 设置跨年标识
+                    reportData.setCrossYearFlag(review.getCrossYearFlag());
                     List<ProjectReportWorkAttachmentDTO> dtos = attachmentMapper.selectByInfoId(reportData.getId());
                     if (null != dtos) {
 

+ 1 - 1
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/projectReportArchive/mapper/xml/CwProjectReportArchiveMapper.xml

@@ -672,7 +672,7 @@
         </if>
         update_by_id = #{updateById},
         update_time = #{updateTime},
-        create_by_id = #{updateById}
+        create_by_id = #{createById}
         where id = #{id} ;
     </update>
     <update id="updateBorrowTypeById">

+ 9 - 1
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/projectReportArchive/service/CwProjectReportArchiveService.java

@@ -18,6 +18,7 @@ import com.jeeplus.core.query.QueryWrapperGenerator;
 import com.jeeplus.finance.invoice.domain.CwFinanceInvoice;
 import com.jeeplus.finance.projectRecords.domain.CwProjectRecords;
 import com.jeeplus.finance.projectRecords.mapper.CwProjectRecordsMapper;
+import com.jeeplus.finance.projectRecords.service.dto.CwProjectRecordsDTO;
 import com.jeeplus.finance.projectReport.domain.CwProjectInfoData;
 import com.jeeplus.finance.projectReport.domain.CwProjectReport;
 import com.jeeplus.finance.projectReport.mapper.CwProjectInfoMapper;
@@ -456,8 +457,15 @@ public class CwProjectReportArchiveService extends ServiceImpl<CwProjectReportAr
             cwProjectReport.setSignatureAnnotator1(signatureAnnotator1);
             cwProjectReport.setSignatureAnnotator2(signatureAnnotator2);
             cwProjectReport.setId(cwProjectReportArchiveDTO.getReportId());
-            cwProjectReportMapper.updateById(cwProjectReport);
+        cwProjectReportMapper.updateById(cwProjectReport);
         if(StringUtils.isNotBlank(cwProjectReportArchive.getId())){ //修改
+
+            //查询项目中的实际执行人是谁,如果有值则更改createById,如果无值,则不进行调整
+            CwProjectRecordsDTO projectRecordsDTO = cwProjectRecordsMapper.getInfoById(cwProjectReportArchive.getProjectId());
+            if(StringUtils.isNotBlank(projectRecordsDTO.getProjectExecutor())){
+                cwProjectReportArchive.setCreateById(projectRecordsDTO.getProjectExecutor());
+            }
+
             cwProjectReportArchiveMapper.updateInfoById(cwProjectReportArchive);
         }else{  //新增
             cwProjectReportArchiveMapper.insert(cwProjectReportArchive);