Forráskód Böngészése

成本1.0 迁入及bug修复

wangyongsheng 1 éve
szülő
commit
cba8f91f8c
100 módosított fájl, 5530 hozzáadás és 73 törlés
  1. 10 1
      pom.xml
  2. 1 0
      src/main/java/com/kcim/CostAccountApplication.java
  3. 4 0
      src/main/java/com/kcim/common/config/FeignConfiguration.java
  4. 29 0
      src/main/java/com/kcim/common/constants/Constant.java
  5. 4 2
      src/main/java/com/kcim/common/constants/NumberConstant.java
  6. 20 1
      src/main/java/com/kcim/common/constants/ParameterConstant.java
  7. 12 0
      src/main/java/com/kcim/common/constants/ProgressType.java
  8. 2 0
      src/main/java/com/kcim/common/constants/RedisKeyConstant.java
  9. 30 0
      src/main/java/com/kcim/common/enums/DefaultComputeColumnEnum.java
  10. 23 0
      src/main/java/com/kcim/common/enums/MatchTypeEnum.java
  11. 6 0
      src/main/java/com/kcim/common/enums/ReportItemTypeEnum.java
  12. 8 0
      src/main/java/com/kcim/common/util/CommonUtil.java
  13. 88 0
      src/main/java/com/kcim/common/util/ComputeDateUtils.java
  14. 11 0
      src/main/java/com/kcim/common/util/DateUtils.java
  15. 190 0
      src/main/java/com/kcim/common/util/MatchTextComparatorUtil.java
  16. 69 1
      src/main/java/com/kcim/common/util/PageUtils.java
  17. 260 0
      src/main/java/com/kcim/common/util/excel/EasyExcelStyleUtil.java
  18. 408 0
      src/main/java/com/kcim/common/util/excel/EasyExcelUtil.java
  19. 685 0
      src/main/java/com/kcim/common/util/excel/ExcelPoiUtil.java
  20. 1 0
      src/main/java/com/kcim/common/util/excel/ExcelStyleUtil.java
  21. 222 0
      src/main/java/com/kcim/common/util/excel/ExcelTreeUtil.java
  22. 181 0
      src/main/java/com/kcim/common/util/excel/entity/ColEntity.java
  23. 44 0
      src/main/java/com/kcim/common/util/excel/entity/EmpTypeEntity.java
  24. 20 0
      src/main/java/com/kcim/common/util/excel/entity/ItemImportEntity.java
  25. 12 3
      src/main/java/com/kcim/common/util/excel/entity/StandItemImportEntity.java
  26. 107 0
      src/main/java/com/kcim/common/util/excel/entity/TitleEntity.java
  27. 94 0
      src/main/java/com/kcim/common/util/excel/handler/MedServiceItemTypeHandler.java
  28. 7 1
      src/main/java/com/kcim/dao/mapper/AccountingProductMapper.java
  29. 16 0
      src/main/java/com/kcim/dao/mapper/ComputeCheckResultMapper.java
  30. 16 0
      src/main/java/com/kcim/dao/mapper/ComputeDrugCostDetailMapper.java
  31. 31 0
      src/main/java/com/kcim/dao/mapper/ComputeDrugCostMapper.java
  32. 16 0
      src/main/java/com/kcim/dao/mapper/ComputeProjectCostDetailMapper.java
  33. 34 0
      src/main/java/com/kcim/dao/mapper/ComputeProjectCostMapper.java
  34. 16 0
      src/main/java/com/kcim/dao/mapper/ComputeProjectGroupCostDetailMapper.java
  35. 23 0
      src/main/java/com/kcim/dao/mapper/ComputeShareParamDetailMapper.java
  36. 33 0
      src/main/java/com/kcim/dao/mapper/ComputeShareParamMapper.java
  37. 41 17
      src/main/java/com/kcim/dao/mapper/CostCostingGroupMapper.java
  38. 9 0
      src/main/java/com/kcim/dao/mapper/CostIncomeGroupMapper.java
  39. 16 0
      src/main/java/com/kcim/dao/mapper/FreeCostMapMapper.java
  40. 17 0
      src/main/java/com/kcim/dao/mapper/HistoryMatchMapper.java
  41. 9 1
      src/main/java/com/kcim/dao/mapper/ImportEmpCostMapper.java
  42. 16 1
      src/main/java/com/kcim/dao/mapper/ImportPatientInfoMapper.java
  43. 12 0
      src/main/java/com/kcim/dao/mapper/ImportPatientItemMapper.java
  44. 16 0
      src/main/java/com/kcim/dao/mapper/ItemEmpMapMapper.java
  45. 16 0
      src/main/java/com/kcim/dao/mapper/ItemEquipmentMapMapper.java
  46. 16 0
      src/main/java/com/kcim/dao/mapper/ItemNoValuationDrugMaterialMapMapper.java
  47. 16 0
      src/main/java/com/kcim/dao/mapper/ItemSpaceMapMapper.java
  48. 16 0
      src/main/java/com/kcim/dao/mapper/ItemValuationDrugMaterialMapMapper.java
  49. 3 0
      src/main/java/com/kcim/dao/mapper/ResponsibilityDepartmentMapper.java
  50. 16 0
      src/main/java/com/kcim/dao/mapper/ShareParamCostDetailMapper.java
  51. 21 0
      src/main/java/com/kcim/dao/mapper/ShareParamCostMapper.java
  52. 16 0
      src/main/java/com/kcim/dao/mapper/ShareParamTypeMapMapper.java
  53. 4 0
      src/main/java/com/kcim/dao/mapper/ShareParamValueMapper.java
  54. 16 0
      src/main/java/com/kcim/dao/mapper/SqlMapper.java
  55. 2 0
      src/main/java/com/kcim/dao/model/AllocationQuery.java
  56. 101 0
      src/main/java/com/kcim/dao/model/ComputeCheckResult.java
  57. 113 0
      src/main/java/com/kcim/dao/model/ComputeDrugCost.java
  58. 86 0
      src/main/java/com/kcim/dao/model/ComputeDrugCostDetail.java
  59. 5 5
      src/main/java/com/kcim/dao/model/ComputeItemCost.java
  60. 3 5
      src/main/java/com/kcim/dao/model/ComputeItemCostDetail.java
  61. 110 0
      src/main/java/com/kcim/dao/model/ComputeProjectCost.java
  62. 99 0
      src/main/java/com/kcim/dao/model/ComputeProjectCostDetail.java
  63. 88 0
      src/main/java/com/kcim/dao/model/ComputeProjectGroupCostDetail.java
  64. 113 0
      src/main/java/com/kcim/dao/model/ComputeShareParam.java
  65. 92 0
      src/main/java/com/kcim/dao/model/ComputeShareParamDetail.java
  66. 6 0
      src/main/java/com/kcim/dao/model/CostCostingGroup.java
  67. 12 0
      src/main/java/com/kcim/dao/model/CostDepartmentProfit.java
  68. 4 0
      src/main/java/com/kcim/dao/model/CostReportColumn.java
  69. 2 1
      src/main/java/com/kcim/dao/model/CostShareParam.java
  70. 109 0
      src/main/java/com/kcim/dao/model/FreeCostMap.java
  71. 118 0
      src/main/java/com/kcim/dao/model/HistoryMatch.java
  72. 16 0
      src/main/java/com/kcim/dao/model/HospProfitAndLoss.java
  73. 2 0
      src/main/java/com/kcim/dao/model/ImportEmpCost.java
  74. 3 0
      src/main/java/com/kcim/dao/model/ImportPatientInfo.java
  75. 4 0
      src/main/java/com/kcim/dao/model/ImportPatientItem.java
  76. 44 0
      src/main/java/com/kcim/dao/model/Item.java
  77. 97 0
      src/main/java/com/kcim/dao/model/ItemEmpMap.java
  78. 98 0
      src/main/java/com/kcim/dao/model/ItemEquipmentMap.java
  79. 100 0
      src/main/java/com/kcim/dao/model/ItemNoValuationDrugMaterialMap.java
  80. 101 0
      src/main/java/com/kcim/dao/model/ItemSpaceMap.java
  81. 100 0
      src/main/java/com/kcim/dao/model/ItemValuationDrugMaterialMap.java
  82. 3 0
      src/main/java/com/kcim/dao/model/ReportForm.java
  83. 115 0
      src/main/java/com/kcim/dao/model/ShareParamCost.java
  84. 94 0
      src/main/java/com/kcim/dao/model/ShareParamCostDetail.java
  85. 99 0
      src/main/java/com/kcim/dao/model/ShareParamTypeMap.java
  86. 107 0
      src/main/java/com/kcim/dao/model/Sql.java
  87. 24 0
      src/main/java/com/kcim/dao/model/StandItem.java
  88. 94 0
      src/main/java/com/kcim/dao/model/dto/ComputeDrugCostPageDto.java
  89. 5 0
      src/main/java/com/kcim/dao/model/dto/ReportFormEditDTO.java
  90. 6 0
      src/main/java/com/kcim/dao/model/dto/ReportFormSaveDTO.java
  91. 5 0
      src/main/java/com/kcim/dao/repository/AccountingProductRepository.java
  92. 22 0
      src/main/java/com/kcim/dao/repository/AccountingRepository.java
  93. 55 0
      src/main/java/com/kcim/dao/repository/ComputeCheckResultRepository.java
  94. 37 7
      src/main/java/com/kcim/dao/repository/ComputeClinicalPathwayCostDetailRepository.java
  95. 35 7
      src/main/java/com/kcim/dao/repository/ComputeDiseaseCostDetailRepository.java
  96. 49 0
      src/main/java/com/kcim/dao/repository/ComputeDrugCostDetailRepository.java
  97. 49 0
      src/main/java/com/kcim/dao/repository/ComputeDrugCostRepository.java
  98. 8 0
      src/main/java/com/kcim/dao/repository/ComputeEmpCostRepository.java
  99. 35 7
      src/main/java/com/kcim/dao/repository/ComputeGroupCostDetailRepository.java
  100. 51 13
      src/main/java/com/kcim/dao/repository/ComputeItemCostDetailRepository.java

+ 10 - 1
pom.xml

@@ -180,6 +180,11 @@
                 </exclusion>
             </exclusions>
         </dependency>
+        <dependency>
+            <groupId>com.alibaba.nacos</groupId>
+            <artifactId>nacos-client</artifactId>
+            <version>1.4.2</version>
+        </dependency>
         <!--        <dependency>-->
         <!--            <groupId>com.alibaba.cloud</groupId>-->
         <!--            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>-->
@@ -271,7 +276,11 @@
             <artifactId>apm-toolkit-opentracing</artifactId>
             <version>8.7.0</version>
         </dependency>
-
+        <dependency>
+            <groupId>com.hankcs</groupId>
+            <artifactId>hanlp</artifactId>
+            <version>portable-1.8.4</version>
+        </dependency>
     </dependencies>
 
     <build>

+ 1 - 0
src/main/java/com/kcim/CostAccountApplication.java

@@ -4,6 +4,7 @@ import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
 import org.springframework.cloud.openfeign.EnableFeignClients;
+import org.springframework.scheduling.annotation.EnableAsync;
 
 @SpringBootApplication
 @EnableDiscoveryClient

+ 4 - 0
src/main/java/com/kcim/common/config/FeignConfiguration.java

@@ -21,7 +21,11 @@ public class FeignConfiguration implements RequestInterceptor {
      */
     @Override
     public void apply(RequestTemplate template) {
+        RequestContextHolder.setRequestAttributes(RequestContextHolder.getRequestAttributes(), true);
+
         ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
+
+
 //        获取请求体
         javax.servlet.http.HttpServletRequest request = attributes.getRequest();
 //        获取token

+ 29 - 0
src/main/java/com/kcim/common/constants/Constant.java

@@ -156,7 +156,36 @@ public interface Constant {
     String DRUG_TYPE = "DRUG_TYPE";
 
     String ORDER_TYPE = "ORDER_TYPE";
+    /**
+     * 医疗服务项目分类
+     */
+    String MED_SERVICE_ITEM_TYPE ="MED_SERVICE_ITEM_TYPE";
+    /**
+     * 项目分摊参数来源类型
+     */
+    String ITEM_ALLOCATE_PARAM_SOURCE_TYPE = "ITEM_ALLOCATE_PARAM_SOURCE_TYPE";
 
+    /**
+     * 取数项目类型
+     */
+    String CUSTOMIZE_SQL_TYPE = "CUSTOMIZE_SQL_TYPE";
+    /**
+     * 人员类别
+     */
+    String PERSONNEL_CATEGORY = "PERSONNEL_CATEGORY";
+    /**
+     * 月度数据采集类型
+     */
 
+    String DATA_COLLECT_TYPE = "DATA_COLLECT_TYPE";
+
+    /**
+     * 数据异常类型
+     */
+    String DATA_EXCEPTION_TYPE = "DATA_EXCEPTION_TYPE";
+    /**
+     * 损益报表类型
+     */
+    String PROFIT_REPORT_TYPE ="PROFIT_REPORT_TYPE";
 
 }

+ 4 - 2
src/main/java/com/kcim/common/constants/NumberConstant.java

@@ -17,21 +17,23 @@ public final class NumberConstant {
      * 一
      */
     public static final Integer ONE = 1;
-
+    public static final String ONE_S = "1";
     /**
      * 二
      */
     public static final Integer TWO = 2;
-
+    public static final String TWO_S= "2";
     /**
      * 三
      */
     public static final Integer THREE = 3;
+    public static final String THREE_S= "3";
 
     /**
      * 四
      */
     public static final Integer FOUR = 4;
+    public static final String FOUR_S= "4";
 
     /**
      * 五

+ 20 - 1
src/main/java/com/kcim/common/constants/ParameterConstant.java

@@ -7,7 +7,26 @@ package com.kcim.common.constants;
  * @create: 2023-10-24 18:16
  **/
 public interface ParameterConstant {
-
+    /**
+     * 每日工时
+     */
     Long DAY_HOUR = 1716751564162600960L;
 
+    /**
+     * 项目成本是否包含空间成本
+     */
+    Long ITEM_CONTAINS_SPACE = 1736668898654294016L;
+    /**
+     * 医技分摊层级id
+     */
+    Long MEDICAL_TECHNIQUES_SHARE_LEVEL_ID = 1747234074663194624L;
+    /**
+     * 医疗服务项目成本数据展示类型
+     */
+    Long ITEM_COST_DISPLAY = 1762673127055298560L;
+
+
+    Long AUTO_MATCH_PERCENT = 1764922833697378304L;
+
+
 }

+ 12 - 0
src/main/java/com/kcim/common/constants/ProgressType.java

@@ -0,0 +1,12 @@
+package com.kcim.common.constants;
+
+/**
+ * @program: CostAccount
+ * @description: 进度条调用界面类型常量
+ * @author: Wang.YS
+ * @create: 2023-12-28 18:01
+ **/
+
+public interface ProgressType {
+    String ITEM_COST_CALCULATE = "ITEM_COST_CALCULATE";
+}

+ 2 - 0
src/main/java/com/kcim/common/constants/RedisKeyConstant.java

@@ -7,4 +7,6 @@ public final class RedisKeyConstant {
     public RedisKeyConstant() {
     }
 
+    public static final String PROGRESS = "percent-";
+
 }

+ 30 - 0
src/main/java/com/kcim/common/enums/DefaultComputeColumnEnum.java

@@ -0,0 +1,30 @@
+package com.kcim.common.enums;/**
+* @program: CostAccount
+* @description: 
+* @author: Wang.YS
+* @create: 2024-01-18 19:41
+**/
+public enum DefaultComputeColumnEnum {
+    RESPONSIBILITY_CODE("responsibilityCode", "责任中心代码"),
+    RESPONSIBILITY_NAME("responsibilityName", "责任中心名称"),
+    ITEM_CODE("itemCode", "项目代码"),
+    ITEM_NAME("itemName", "项目名称"),
+    ITEM_TYPE("itemType", "项目分类"),
+
+;
+    private final String code;
+    private final String name;
+
+    DefaultComputeColumnEnum(String code, String name) {
+        this.code = code;
+        this.name = name;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public String getName() {
+        return name;
+    }
+}

+ 23 - 0
src/main/java/com/kcim/common/enums/MatchTypeEnum.java

@@ -0,0 +1,23 @@
+package com.kcim.common.enums;
+
+import lombok.Getter;
+
+/**
+ * 历史匹配枚举
+ *
+ */
+@Getter
+public enum MatchTypeEnum {
+
+    ITEM_MATCH("ITEM_MATCH", "医疗服务项目匹配"),
+
+    ;
+
+    final String type;
+    final String name;
+
+    MatchTypeEnum(String type, String name) {
+        this.type = type;
+        this.name = name;
+    }
+}

+ 6 - 0
src/main/java/com/kcim/common/enums/ReportItemTypeEnum.java

@@ -14,9 +14,15 @@ public enum ReportItemTypeEnum {
     MATERIAL_COST("5","材料成本"),
     ITEM_COST("6","项目成本"),
     EMP_COST("7","人力成本"),
+
+    WEIGHT_EMP_COST("7_1","加成人为成本"),
     EQUIPMENT_COST("8","设备成本"),
     SPACE_COST("9","空间成本"),
 
+    PUBLIC_SHARE("10","公共费用分摊"),
+
+    MANAGER_SHARE("11","管理费用分摊"),
+
     ;
     private final String code;
     private final String name;

+ 8 - 0
src/main/java/com/kcim/common/util/CommonUtil.java

@@ -46,4 +46,12 @@ public class CommonUtil {
         }
 
     }
+
+    static Integer MAX_NUMBER = 500;
+
+    public static Integer countStep(Integer size) {
+        return (size + MAX_NUMBER - 1) / MAX_NUMBER;
+    }
+
+
 }

+ 88 - 0
src/main/java/com/kcim/common/util/ComputeDateUtils.java

@@ -0,0 +1,88 @@
+package com.kcim.common.util;
+
+import com.kcim.common.enums.DateStyleEnum;
+import org.springframework.util.StringUtils;
+
+import java.util.Calendar;
+import java.util.Date;
+
+/**
+* @program: performace
+* @program:  核算日期工具类
+* @author : Wang.YS
+* @since : 2023-01-08 21:50
+**/
+
+public class ComputeDateUtils {
+
+    /**
+     * 获取上一个核算年月
+     * @param computeDate 当前核算年月
+     * @return 上一个核算年月
+     */
+    public static String getPreComputeDate(String computeDate){
+        if(StringUtils.isEmpty(computeDate)){
+            return null;
+        }
+        Date date = DateUtils.StringToDate(computeDate, DateStyleEnum.YYYY_MM);
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(date);
+        calendar.add(Calendar.MONTH,-1);
+        return DateUtils.getStringFromDate(calendar.getTime(), DateStyleEnum.YYYY_MM.getValue());
+
+
+    }
+
+    /**
+     * 获取下一个核算年月
+     * @param computeDate 当前核算年月
+     * @return 下一个核算年月
+     */
+    public static String getLastComputeDate(String computeDate){
+        if(StringUtils.isEmpty(computeDate)){
+            return null;
+        }
+        Date date = DateUtils.StringToDate(computeDate, DateStyleEnum.YYYY_MM);
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(date);
+        calendar.add(Calendar.MONTH,1);
+        return DateUtils.getStringFromDate(calendar.getTime(),DateStyleEnum.YYYY_MM.getValue());
+
+    }
+
+//    public static String getComputeYear(String computeDate){
+//        if(StringUtils.isEmpty(computeDate)){
+//            return null;
+//        }
+//        Date date = DateUtils.StringToDate(computeDate, DateStyleEnum.YYYY_MM);
+//
+//        return DateUtils.getStringFromDate(date,DateStyleEnum.YYYY_CN.getValue());
+//    }
+//
+//    public static String getComputeMonth(String computeDate){
+//        if(StringUtils.isEmpty(computeDate)){
+//            return null;
+//        }
+//        Date date = DateUtils.StringToDate(computeDate, DateStyleEnum.YYYY_MM);
+//        return DateUtils.getStringFromDate(date,DateStyleEnum.MM_CN.getValue());
+//    }
+
+    public static Integer getComputeYear(String computeDate){
+        if(StringUtils.isEmpty(computeDate)){
+            return null;
+        }
+        Date date = DateUtils.StringToDate(computeDate, DateStyleEnum.YYYY_MM);
+        String stringFromDate = DateUtils.getStringFromDate(date, DateStyleEnum.YYYY.getValue());
+        return Integer.valueOf(stringFromDate);
+    }
+
+    public static Integer getComputeMonth(String computeDate){
+        if(StringUtils.isEmpty(computeDate)){
+            return null;
+        }
+        Date date = DateUtils.StringToDate(computeDate, DateStyleEnum.YYYY_MM);
+        String stringFromDate = DateUtils.getStringFromDate(date, DateStyleEnum.MM.getValue());
+        return Integer.valueOf(stringFromDate);
+
+    }
+}

+ 11 - 0
src/main/java/com/kcim/common/util/DateUtils.java

@@ -1789,4 +1789,15 @@ public class DateUtils {
         }
     }
 
+    public static String getStringFromDate(final Date date, final String pattern) {
+        final SimpleDateFormat sdf = new SimpleDateFormat(pattern);
+        String format = null;
+        try {
+            format = sdf.format(date);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return format;
+    }
+
 }

+ 190 - 0
src/main/java/com/kcim/common/util/MatchTextComparatorUtil.java

@@ -0,0 +1,190 @@
+package com.kcim.common.util;
+
+import com.hankcs.hanlp.HanLP;
+import com.hankcs.hanlp.corpus.tag.Nature;
+import com.hankcs.hanlp.seg.common.Term;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @program: CostAccount
+ * @description:
+ * @author: Wang.YS
+ * @create: 2024-03-05 11:14
+ **/
+
+public class MatchTextComparatorUtil {
+    // 两两对比函数
+    public static Double getCosineSimilarity(String textA,String textB){
+        // 从文本中提取出关键词数组
+        List<String> wordListA = extractWordFromText(textA);
+        List<String> wordListB = extractWordFromText(textB);
+
+        List<Double> vectorA = new ArrayList<>();
+        List<Double> vectorB = new ArrayList<>();
+        // 将关键词数组转换为词向量并保存在 vectorA 和 vectorB 中
+        convertWordList2Vector(wordListA,wordListB,vectorA,vectorB);
+
+        // 计算向量夹角的余弦值
+
+        return Double.parseDouble(String.format("%.4f",countCosine(vectorA,vectorB)));
+    }
+
+    // 提取文本中有实意的词
+    private static List<String> extractWordFromText(String text){
+        // resultList 用于保存提取后的结果
+        List<String> resultList = new ArrayList<>();
+
+        // 当 text 为空字符串时,使用分词函数会报错,所以需要提前处理这种情况
+        if(text.length() == 0){
+            return resultList;
+        }
+
+        // 分词
+        List<Term> termList = HanLP.segment(text);
+        // 提取所有的 1.名词/n ; 2.动词/v ; 3.形容词/a
+        for (Term term : termList) {
+            if(term.nature == Nature.n || term.nature == Nature.v || term.nature == Nature.a
+                    || term.nature == Nature.vn){
+                resultList.add(term.word);
+            }
+        }
+
+        return resultList;
+    }
+
+    /**
+     * @Description : 将单词数组转换为单词向量,结果保存在 vectorA 和 vectorB 里
+     * @param wordListA : 文本 A 的单词数组
+     * @param wordListB : 文本 B 的单词数组
+     * @param vectorA   : 文本 A 转换成为的向量 A
+     * @param vectorB   : 文本 B 转换成为的向量 B
+     * @return vocabulary : 词汇表
+     */
+    private static List<String> convertWordList2Vector(List<String> wordListA,List<String> wordListB,List<Double> vectorA,List<Double> vectorB){
+        // 词汇表
+        List<String> vocabulary = new ArrayList<>();
+
+        // 获取词汇表 wordListA 的频率表,并同时建立词汇表
+        Map<String,Double> frequencyTableA = buildFrequencyTable(wordListA, vocabulary);
+
+        // 获取词汇表 wordListB 的频率表,并同时建立词汇表
+        Map<String,Double> frequencyTableB = buildFrequencyTable(wordListB, vocabulary);
+
+        // 根据频率表得到向量
+        getWordVectorFromFrequencyTable(frequencyTableA,vectorA,vocabulary);
+        getWordVectorFromFrequencyTable(frequencyTableB,vectorB,vocabulary);
+
+        return vocabulary;
+    }
+
+    /**
+     * @param wordList:单词数组
+     * @param vocabulary: 词汇表
+     * @return Map<String,Double>: key为单词,value为频率
+     * @Description 建立词汇表 wordList 的频率表,并同时建立词汇表
+     */
+    private static Map<String,Double> buildFrequencyTable(List<String> wordList,List<String> vocabulary){
+        // 先建立频数表
+        Map<String,Integer> countTable = new HashMap<>();
+        for (String word : wordList) {
+            if(countTable.containsKey(word)){
+                countTable.put(word,countTable.get(word)+1);
+            }
+            else{
+                countTable.put(word,1);
+            }
+            // 词汇表中是无重复元素的,所以只在 vocabulary 中没有该元素时才加入
+            if(!vocabulary.contains(word)){
+                vocabulary.add(word);
+            }
+        }
+        // totalCount 用于记录词出现的总次数
+        int totalCount = wordList.size();
+        // 将频数表转换为频率表
+        Map<String,Double> frequencyTable = new HashMap<>();
+        for (String key : countTable.keySet()) {
+            frequencyTable.put(key,(double)countTable.get(key)/totalCount);
+        }
+        return frequencyTable;
+    }
+
+    /**
+     * @param frequencyTable : 频率表
+     * @param wordVector     : 转换后的词向量
+     * @param vocabulary     : 词汇表
+     * @Description 根据词汇表和文本的频率表计算词向量,最后 wordVector 和 vocabulary 应该是同维的
+     */
+    private static void getWordVectorFromFrequencyTable(Map<String,Double> frequencyTable, List<Double> wordVector, List<String> vocabulary){
+        for (String word : vocabulary) {
+            double value = 0.0;
+            if(frequencyTable.containsKey(word)){
+                value = frequencyTable.get(word);
+            }
+            wordVector.add(value);
+        }
+    }
+
+    /**
+     * @Description 计算向量 A 和向量 B 的夹角余弦值
+     * @param vectorA   : 词向量 A
+     * @param vectorB   : 词向量 B
+     * @return
+     */
+    private static double countCosine(List<Double> vectorA,List<Double> vectorB){
+        // 分别计算向量的平方和
+        double sqrtA = countSquareSum(vectorA);
+        double sqrtB = countSquareSum(vectorB);
+
+        // 计算向量的点积
+        double dotProductResult = 0.0;
+        for(int i = 0;i < vectorA.size();i++){
+            dotProductResult += vectorA.get(i) * vectorB.get(i);
+        }
+
+        return dotProductResult/(sqrtA*sqrtB);
+    }
+
+    // 计算向量平方和的开方
+    private static double countSquareSum(List<Double> vector){
+        double result = 0.0;
+        for (Double value : vector) {
+            result += value*value;
+        }
+        return Math.sqrt(result);
+    }
+
+    public static double calculateSimilarity(String text1, String text2) {
+        // 预处理:去除多余空格,转为小写
+        text1 = text1.toLowerCase().replaceAll("\\s+", " ");
+        text2 = text2.toLowerCase().replaceAll("\\s+", " ");
+
+        // 计算两个文本的总字符数
+        int totalChars1 = text1.length();
+        int totalChars2 = text2.length();
+
+        // 计算两个文本中共同出现的字符数
+        Map<Character, Integer> charCounts1 = getCharacterCounts(text1);
+        Map<Character, Integer> charCounts2 = getCharacterCounts(text2);
+        int commonChars = 0;
+        for (char c : charCounts1.keySet()) {
+            if (charCounts2.containsKey(c)) {
+                commonChars += Math.min(charCounts1.get(c), charCounts2.get(c));
+            }
+        }
+
+        // 计算相似度百分比
+        return (double) commonChars / (totalChars1 + totalChars2 - commonChars);
+    }
+
+    private static Map<Character, Integer> getCharacterCounts(String text) {
+        Map<Character, Integer> charCounts = new HashMap<>();
+        for (char c : text.toCharArray()) {
+            charCounts.put(c, charCounts.getOrDefault(c, 0) + 1);
+        }
+        return charCounts;
+    }
+}

+ 69 - 1
src/main/java/com/kcim/common/util/PageUtils.java

@@ -2,9 +2,11 @@ package com.kcim.common.util;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.fasterxml.jackson.annotation.JsonInclude;
+import com.kcim.vo.CostingGroupStartVO;
 
 import java.io.Serializable;
 import java.math.BigDecimal;
+import java.util.ArrayList;
 import java.util.List;
 
 /**
@@ -40,7 +42,40 @@ public class PageUtils implements Serializable {
 	 */
 	@JsonInclude(JsonInclude.Include.NON_NULL)
 	private BigDecimal totalAmount;
-	
+
+	public PageUtils(int totalCount, int pageSize, int totalPage, int current, List<?> list, BigDecimal totalAmount, BigDecimal departmentAmount) {
+		this.totalCount = totalCount;
+		this.pageSize = pageSize;
+		this.totalPage = totalPage;
+		this.current = current;
+		this.list = list;
+		this.totalAmount = totalAmount;
+		this.departmentAmount = departmentAmount;
+	}
+
+	public PageUtils(List<?> list, int totalCount, Integer pageSize, Integer current, BigDecimal totalAmount, BigDecimal departmentAmount) {
+		this.totalCount = totalCount;
+		this.pageSize = pageSize;
+		this.totalPage = (int)Math.ceil((double)totalCount/pageSize);
+		this.current = current;
+		this.list = list;
+		this.totalAmount = totalAmount;
+		this.departmentAmount = departmentAmount;
+
+
+
+	}
+
+	public BigDecimal getDepartmentAmount() {
+		return departmentAmount;
+	}
+
+	public void setDepartmentAmount(BigDecimal departmentAmount) {
+		this.departmentAmount = departmentAmount;
+	}
+
+	@JsonInclude(JsonInclude.Include.NON_NULL)
+	private BigDecimal departmentAmount;
 	/**
 	 * 分页
 	 * @param list        列表数据
@@ -135,6 +170,39 @@ public class PageUtils implements Serializable {
 	public void setTotalAmount(BigDecimal totalAmount) {
 		this.totalAmount = totalAmount;
 	}
+	public static <T> List<T> startPage(List<T> list,int current,int pageSize){
+		if(list ==null){
+			return new ArrayList<>();
+		}
+		if(list.size() == 0){
+			return  list;
+		}
+		if(current ==0){
+			current = 1;
+		}
+		//记录总数
+		int count = list.size();
+		//页数
+		int pageCount = 0;
+		if(count % pageSize==0){
+			pageCount = count / pageSize;
+		}else {
+			pageCount = count / pageSize + 1;
+		}
+		int fromIndex = 0;
+		int toIndex = 0;
+		if(current>pageCount){
+			return new ArrayList<>();
+		}
+		if(current != pageCount){
+			fromIndex = (current - 1)*pageSize;
+			toIndex = fromIndex + pageSize;
+		}else {
+			fromIndex = (current - 1)*pageSize;
+			toIndex = count;
+		}
+		return list.subList(fromIndex,toIndex);
+	}
 
 
 }

+ 260 - 0
src/main/java/com/kcim/common/util/excel/EasyExcelStyleUtil.java

@@ -0,0 +1,260 @@
+package com.kcim.common.util.excel;
+
+import cn.afterturn.easypoi.excel.entity.params.ExcelExportEntity;
+import cn.afterturn.easypoi.excel.entity.params.ExcelForEachParams;
+import cn.afterturn.easypoi.excel.export.styler.IExcelExportStyler;
+import org.apache.poi.ss.usermodel.*;
+
+import java.util.List;
+
+/**
+ * @program: CostAccount
+ * @description:
+ * @author: Wang.YS
+ * @create: 2024-01-31 15:37
+ **/
+
+public class EasyExcelStyleUtil implements IExcelExportStyler {
+    private EasyExcelStyleUtil(){}
+
+    private static final short STRING_FORMAT = (short) BuiltinFormats.getBuiltinFormat("TEXT");
+    private static final short FONT_SIZE_TEN = 10;
+    private static final short FONT_SIZE_ELEVEN = 11;
+    private static final short FONT_SIZE_TWELVE = 12;
+    private static final short height = 30;
+
+    /**
+     * 大标题样式
+     */
+    private CellStyle headerStyle;
+    /**
+     * 每列标题样式
+     */
+    private CellStyle titleStyle;
+    /**
+     * 数据行样式
+     */
+    private CellStyle styles;
+
+    public EasyExcelStyleUtil(Workbook workbook) {
+        this.init(workbook);
+    }
+
+    /**
+     * 初始化样式
+     * @param workbook
+     */
+    private void init(Workbook workbook) {
+        this.headerStyle = initHeaderStyle(workbook);
+        this.titleStyle = initTitleStyle(workbook,true,FONT_SIZE_ELEVEN);
+        this.styles = initStyles(workbook);
+    }
+
+    @Override
+    public CellStyle getHeaderStyle(short i) {
+        return headerStyle;
+    }
+
+    @Override
+    public CellStyle getTitleStyle(short i) {
+        return titleStyle;
+    }
+
+    @Override
+    public CellStyle getTemplateStyles(boolean b, ExcelForEachParams excelForEachParams) {
+        return null;
+    }
+
+    @Override
+    public CellStyle getStyles(boolean b, ExcelExportEntity excelExportEntity) {
+        return styles;
+    }
+
+    @Override
+    public CellStyle getStyles(Cell cell, int i, ExcelExportEntity entity, Object o, Object o1) {
+        return getStyles(true, entity);
+    }
+
+    /**
+     * 获取样式
+     * @param style 1 大标题样式 2 表头样式 3 内容样式
+     */
+    public static CellStyle getStyles(Workbook workbook,int style) {
+        CellStyle cellStyle = null;
+        switch (style){
+            case 1:
+                cellStyle = initHeaderStyle(workbook);
+                break;
+            case 2:
+                cellStyle = initTitleStyle(workbook,true,FONT_SIZE_ELEVEN);
+                break;
+            case 3:
+                cellStyle = initStyles(workbook);
+                break;
+            default:
+                cellStyle = initStyles(workbook);
+                break;
+        }
+        cellStyle.setDataFormat(STRING_FORMAT);
+        return cellStyle;
+    }
+
+    /**
+     * 初始化--大标题样式
+     */
+    private static CellStyle initHeaderStyle(Workbook workbook) {
+        CellStyle style = getBaseCellStyle(workbook);
+        style.setFont(getFont(workbook, FONT_SIZE_TWELVE, true));
+        return style;
+    }
+
+    /**
+     * 初始化--每列标题样式
+     */
+    private static CellStyle initTitleStyle(Workbook workbook,boolean isBold,short size) {
+        CellStyle style = getBaseCellStyle(workbook);
+        style.setFont(getFont(workbook, size, isBold));
+        //背景色
+        style.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex());
+        style.setFillPattern(FillPatternType.SOLID_FOREGROUND);
+        return style;
+    }
+
+    /**
+     * 初始化--数据行样式
+     */
+    private static CellStyle initStyles(Workbook workbook) {
+        CellStyle style = getBaseCellStyle(workbook);
+        style.setFont(getFont(workbook, FONT_SIZE_TEN, false));
+        style.setDataFormat(STRING_FORMAT);
+        return style;
+    }
+
+    /**
+     * 设置隔行背景色
+     */
+    public static CellStyle getRowBackground(Workbook workbook) {
+        CellStyle style = getBaseCellStyle(workbook);
+        style.setFont(getFont(workbook, FONT_SIZE_TEN,false));
+        //背景色
+        style.setFillForegroundColor(IndexedColors.LAVENDER.getIndex());
+        style.setFillPattern(FillPatternType.SOLID_FOREGROUND);
+        style.setDataFormat(STRING_FORMAT);
+        return style;
+    }
+
+    /**
+     * 基础样式
+     */
+    private static CellStyle getBaseCellStyle(Workbook workbook) {
+        CellStyle style = workbook.createCellStyle();
+        //下边框
+        style.setBorderBottom(BorderStyle.THIN);
+        //左边框
+        style.setBorderLeft(BorderStyle.THIN);
+        //上边框
+        style.setBorderTop(BorderStyle.THIN);
+        //右边框
+        style.setBorderRight(BorderStyle.THIN);
+        //水平居中
+        style.setAlignment(HorizontalAlignment.CENTER);
+        //上下居中
+        style.setVerticalAlignment(VerticalAlignment.CENTER);
+        //设置自动换行
+        style.setWrapText(true);
+        return style;
+    }
+
+    /**
+     * 字体样式
+     * @param size   字体大小
+     * @param isBold 是否加粗
+     */
+    private static Font getFont(Workbook workbook, short size, boolean isBold) {
+        Font font = workbook.createFont();
+        //字体样式
+        font.setFontName("宋体");
+        //是否加粗
+        font.setBold(isBold);
+        //字体大小
+        font.setFontHeightInPoints(size);
+        return font;
+    }
+
+    /**
+     * 根据type设置workbook
+     * @param workbook
+     * @param type 类型(0 默认 1 设置隔行背景 2 自适应行高 3 设置隔行背景同时自适应行高)
+     * @param autoRowHeight 需要自适应行高的行号
+     */
+    public static void setStyleByType(Workbook workbook, String sheetName, int type, List<Integer> autoRowHeight){
+        if (sheetName != null && sheetName.length()>0){
+            Sheet sheet = workbook.getSheet(sheetName);
+            setSheetStyleByType(workbook,sheet,type,autoRowHeight);
+        }else {
+            int sheetNum = workbook.getNumberOfSheets();
+            for (int i = 0; i < sheetNum; i++) {
+                Sheet sheet = workbook.getSheetAt(i);
+                setSheetStyleByType(workbook,sheet,type,autoRowHeight);
+            }
+        }
+    }
+
+    public static void setSheetStyleByType(Workbook workbook,Sheet sheet,int type,List<Integer> autoRowHeight){
+        if (type==1 || type == 3){ // 1和3,设置隔行背景
+            setRowBackground(workbook,sheet);
+        }
+        int lastRowNum = sheet.getLastRowNum();
+        for(int j = 0; j <= lastRowNum; j++) {
+            Row row = sheet.getRow(j);
+            row.setHeightInPoints(height); // 默认行高
+            if (type==2 || type == 3){ // 2和3,设置自适应行高
+                if (autoRowHeight != null && autoRowHeight.contains(j)){ // 不为空,则只有指定行号的行需要自适应行高
+                    autoRowHeight(row);
+                }else { // 为null,则表示全部行都需要自适应行高
+                    autoRowHeight(row);
+                }
+            }
+        }
+    }
+
+    /**
+     * 偶数行设置背景色
+     */
+    public static void setRowBackground(Workbook workbook,Sheet sheet){
+        CellStyle styles = getRowBackground(workbook);
+        for(int i = 0; i <= sheet.getLastRowNum(); i ++) {
+            if (i%2==0 && i>0){ // 标题用全局的标题样式,就不单独设置样式了,所以排除标题
+                Row row = sheet.getRow(i);
+                for(int j = 0; j < row.getPhysicalNumberOfCells(); j ++) {
+                    Cell cell = row.getCell(j);
+                    cell.setCellStyle(styles);
+                }
+            }
+        }
+    }
+
+    /**
+     * 设置自适应行高
+     */
+    public static void autoRowHeight(Row row){
+        //根据内容长度设置行高
+        int enterCnt = 0;
+        for(int j = 0; j < row.getPhysicalNumberOfCells(); j ++) {
+            Cell cell = row.getCell(j);
+            if (cell != null){
+                int rwsTemp = row.getCell(j).toString().length();
+                //这里取每一行中的每一列字符长度最大的那一列的字符
+                if (rwsTemp > enterCnt) {
+                    enterCnt = rwsTemp;
+                }
+            }
+        }
+        row.setHeightInPoints(height); // 设置默认行高为35
+        //如果字符长度大于35,根据内容来设置相应的行高
+        if (enterCnt>height){
+            long d = Math.round((double) enterCnt / (double) height)+2;
+            row.setHeightInPoints(enterCnt*d);
+        }
+    }
+}

+ 408 - 0
src/main/java/com/kcim/common/util/excel/EasyExcelUtil.java

@@ -0,0 +1,408 @@
+package com.kcim.common.util.excel;
+
+import cn.afterturn.easypoi.excel.ExcelExportUtil;
+import cn.afterturn.easypoi.excel.ExcelImportUtil;
+import cn.afterturn.easypoi.excel.annotation.Excel;
+import cn.afterturn.easypoi.excel.entity.ExportParams;
+import cn.afterturn.easypoi.excel.entity.ImportParams;
+import cn.afterturn.easypoi.excel.entity.enmus.ExcelType;
+import cn.afterturn.easypoi.excel.entity.params.ExcelExportEntity;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.poi.hssf.usermodel.HSSFWorkbook;
+import org.apache.poi.ss.usermodel.ClientAnchor;
+import org.apache.poi.ss.usermodel.Drawing;
+import org.apache.poi.ss.usermodel.Sheet;
+import org.apache.poi.ss.usermodel.Workbook;
+import sun.misc.BASE64Decoder;
+
+import javax.imageio.ImageIO;
+import javax.servlet.http.HttpServletResponse;
+import java.awt.image.BufferedImage;
+import java.io.*;
+import java.lang.reflect.Field;
+import java.net.URLEncoder;
+import java.util.*;
+
+/**
+ * easypoi操作工具类
+ */
+public class EasyExcelUtil {
+
+    public EasyExcelUtil(){}
+
+    // ********************************************* 导出 *********************************************
+
+    /**
+     * excel 根据 type 导出
+     * @param list 数据
+     * @param title   标题
+     * @param sheetName sheet名称
+     * @param pojoClass pojo类型
+     * @param fileName 文件名称
+     * @param type 类型(0 无 1 设置隔行背景 2 自适应行高 3 设置隔行背景同时自适应行高)
+     * @param autoRowHeight 需要自适应行高的行号,为空则表示全部行都需要自适应
+     */
+    public static void exportExcel(List<?> list, String title, String sheetName, Class<?> pojoClass, String fileName, int type,List<Integer> autoRowHeight, HttpServletResponse response){
+        ExportParams params = new ExportParams(title, sheetName, ExcelType.HSSF);
+        fileName = fileName + ".xls";
+        params.setStyle(EasyExcelStyleUtil.class);
+        Workbook workbook = ExcelExportUtil.exportExcel(params,pojoClass,list);
+        if (workbook != null);
+        EasyExcelStyleUtil.setStyleByType(workbook,null,type,autoRowHeight);
+        downLoadExcel(fileName, response, workbook);
+    }
+
+    /**
+     * excel 根据 type 导出
+     * @param list 数据
+     * @param pojoClass pojo类型
+     * @param fileName 文件名称
+     * @param type 类型(0 无 1 设置隔行背景 2 自适应行高 3 设置隔行背景同时自适应行高)
+     * @param autoRowHeight 需要自适应行高的行号,为空则表示全部行都需要自适应
+     */
+    public static void exportExcel(List<?> list, Class<?> pojoClass, String fileName, int type,List<Integer> autoRowHeight, HttpServletResponse response){
+        ExportParams params = new ExportParams();
+        params.setTitleHeight((short) 15);
+        params.setStyle(EasyExcelStyleUtil.class);
+        params.setType(ExcelType.HSSF);
+        fileName = fileName + ".xls";
+        Workbook workbook = ExcelExportUtil.exportExcel(params,pojoClass,list);
+        if (workbook != null);
+        EasyExcelStyleUtil.setStyleByType(workbook,null,type,autoRowHeight);
+        downLoadExcel(fileName, response, workbook);
+    }
+
+    /**
+     * excel 导出
+     * @param list           数据
+     * @param title          标题
+     * @param sheetName      sheet名称
+     * @param pojoClass      pojo类型
+     * @param fileName       文件名称
+     */
+    public static void exportExcel(List<?> list, String title, String sheetName, Class<?> pojoClass, String fileName, HttpServletResponse response){
+        ExportParams params = new ExportParams(title, sheetName, ExcelType.HSSF);
+        params.setTitleHeight((short) 15);
+        params.setStyle(EasyExcelStyleUtil.class);
+        fileName = fileName + ".xls";
+        Workbook workbook = ExcelExportUtil.exportExcel(params,pojoClass,list);
+        downLoadExcel(fileName, response, workbook);
+    }
+
+    /**
+     * excel 导出
+     * @param list           数据
+     * @param pojoClass      pojo类型
+     * @param fileName       文件名称
+     */
+    public static void exportExcel(List<?> list, Class<?> pojoClass, String fileName, HttpServletResponse response){
+        ExportParams params = new ExportParams();
+        params.setTitleHeight((short) 15);
+        params.setStyle(EasyExcelStyleUtil.class);
+        params.setType(ExcelType.HSSF);
+        fileName = fileName + ".xls";
+        Workbook workbook = ExcelExportUtil.exportExcel(params,pojoClass,list);
+        downLoadExcel(fileName, response, workbook);
+    }
+
+    /**
+     * list map 导出
+     * @param list     数据
+     * @param fileName 文件名称
+     */
+    public static void exportExcel(List<Map<String, Object>> list, String fileName, HttpServletResponse response){
+        Workbook workbook = ExcelExportUtil.exportExcel(list, ExcelType.HSSF);
+        fileName = fileName + ".xls";
+        downLoadExcel(fileName, response, workbook);
+    }
+
+    /**
+     * excel 导出,自定义表头导出
+     * @param entityList     自定义的表头数据
+     * @param list           数据
+     * @param fileName       文件名称
+     */
+    public static void exportExcel(List<ExcelExportEntity> entityList,List<?> list, String fileName, HttpServletResponse response){
+        ExportParams exportParams = new ExportParams();
+        exportParams.setTitleHeight((short) 15);
+        exportParams.setStyle(EasyExcelStyleUtil.class);
+        exportParams.setType(ExcelType.HSSF);
+        fileName = fileName + ".xls";
+        List<Map<String, Object>> result = objectToMap(list);
+        Workbook workbook = ExcelExportUtil.exportExcel(exportParams, entityList, result);
+        downLoadExcel(fileName, response,workbook);
+    }
+
+    /**
+     * 设置注解参数
+     * @param annotation  注解
+     * @param entity
+     */
+    private static void annotationParams(Excel annotation,ExcelExportEntity entity){
+        if (annotation.addressList()){
+            entity.setAddressList(annotation.addressList());
+            entity.setReplace(annotation.replace());
+        }
+        entity.setReplace(annotation.replace());
+        entity.setOrderNum(Integer.parseInt(annotation.orderNum()));
+        entity.setGroupName(annotation.groupName());
+        entity.setNeedMerge(annotation.needMerge());
+        entity.setMergeVertical(annotation.mergeVertical());
+    }
+
+    /**
+     * 动态导出列,根据Excel注解获取列的字段注释(表头名)、宽度
+     * @param clazz
+     * @param fields 选择要导出的列
+     * @param changeHead 要更改表头的列,格式是{"字段1":"更改的表头1","字段2":"更改的表头2"}
+     */
+    public static List<ExcelExportEntity> dynamicExport(Class<?> clazz,String fields, Map<String,String> changeHead) {
+        List<ExcelExportEntity> beanList = new ArrayList<>();
+        String[] split = fields.split(",");
+        int length = split.length;
+        try {
+            for (int i = 0; i < length; i++) {
+                Field f = clazz.getDeclaredField(split[i]);
+                Excel annotation = f.getAnnotation((Excel.class));
+                String comment = annotation.name();
+                if (changeHead != null && Objects.nonNull(changeHead.get(f.getName()))){
+                    comment = changeHead.get(f.getName()).toString();
+                }
+                Double width = annotation.width();
+                ExcelExportEntity entity = new ExcelExportEntity(comment, f.getName(), width.intValue());
+                annotationParams(annotation,entity);
+                beanList.add(entity);
+            }
+        }catch (NoSuchFieldException e){
+            e.printStackTrace();
+        }
+        return beanList;
+    }
+
+    /**
+     * 动态导出列(选择要忽略的列),根据Excel注解获取列的字段注释(表头名)、宽度
+     * @param clazz
+     * @param fields 选择要忽略的列
+     * @param changeHead 要更改表头的列,格式是{"字段1":"更改的表头1","字段2":"更改的表头2"}
+     */
+    public static List<ExcelExportEntity> dynamicIgnoreExport(Class<?> clazz, String fields, Map<String,String> changeHead) {
+        List<ExcelExportEntity> beanList = new ArrayList<>();
+        String[] split = fields.split(",");
+        int length = split.length;
+        Field[] declaredFields = clazz.getDeclaredFields();
+        for (Field f : declaredFields) {
+            Excel annotation = f.getAnnotation((Excel.class));
+            if (annotation != null){
+                boolean flag = false;
+                for (int i = 0; i < length; i++) {
+                    if (f.getName().equals(split[i])){
+                        flag = true;
+                        break;
+                    }
+                }
+                if (flag) continue;
+                String comment = annotation.name();
+                if (changeHead != null && Objects.nonNull(changeHead.get(f.getName()))){
+                    comment = changeHead.get(f.getName()).toString();
+                }
+                Double width = annotation.width();
+                ExcelExportEntity entity = new ExcelExportEntity(comment, f.getName(), width.intValue());
+                annotationParams(annotation,entity);
+                beanList.add(entity);
+            }
+        }
+        return beanList;
+    }
+
+    /**
+     * 实体bean转map,以map的形式导出表格
+     * @param list 数据
+     */
+    public static <T> List<Map<String, Object>> objectToMap(List<T> list){
+        List<Map<String, Object>> result = new ArrayList<>();
+        Map<String, Object> map = null;
+        try {
+            for (T item : list) {
+                map = new HashMap<>();
+                Class<?> clazz = item.getClass();
+                for (Field field : clazz.getDeclaredFields()) {
+                    field.setAccessible(true);
+                    String fieldName = field.getName();
+                    Object value = field.get(item);
+                    map.put(fieldName, value);
+                }
+                result.add(map);
+            }
+            return result;
+        }catch (IllegalAccessException e){
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+    /**
+     * 下载
+     * @param fileName 文件名称
+     * @param response
+     * @param workbook excel数据
+     */
+    public static void downLoadExcel(String fileName, HttpServletResponse response, Workbook workbook){
+        try {
+            // 如果文件名最后没有 .xls 和 .xlsx 后缀,则添加默认后缀
+            if (fileName.lastIndexOf(".xls") == -1 && fileName.lastIndexOf(".xlsx") == -1){
+                fileName = fileName + ".xls";
+            }
+            response.setCharacterEncoding("UTF-8");
+            response.setContentType("text/html; charset=UTF-8"); //设置编码字符
+            response.setContentType("application/octet-stream"); //设置内容类型为下载类型
+            response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
+            response.setHeader("Access-Control-Expose-Headers", "Content-Disposition");
+            workbook.write(response.getOutputStream());
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+    }
+
+    /**
+     * 导出Excel,并在最后追加图片
+     * @param sheetName  sheet名称
+     * @param workbook   HSSFWorkbook对象
+     * @param imgBase64  图片base64
+     */
+    public static Workbook getHSSFWorkbook(String sheetName,Workbook workbook, String imgBase64,int[] anchors) throws IOException {
+        // 第一步,创建一个HSSFWorkbook,对应一个Excel文件
+        if (workbook == null) {
+            workbook = new HSSFWorkbook();
+        }
+        // 第二步,在workbook中添加一个sheet,对应Excel文件中的sheet
+        Sheet sheet = workbook.getSheet(sheetName);
+        /*生成图表*/
+        if(!StringUtils.isEmpty(imgBase64)) {
+            String[] imgUrlArr = imgBase64.split("base64,");  //拆分base64编码后部分
+            byte[] buffer = new BASE64Decoder().decodeBuffer(imgUrlArr[1]);
+            String picPath = System.getProperty("user.dir")+"\\upload\\excel\\pic.png"; // 图片临时路径
+            File file = new File(picPath); //图片文件
+            try {
+                //生成图片
+                OutputStream out = new FileOutputStream(file);//图片输出流
+                out.write(buffer);
+                out.flush();//清空流
+                out.close();//关闭流
+                ByteArrayOutputStream outStream = new ByteArrayOutputStream(); // 将图片写入流中
+                BufferedImage bufferImg = ImageIO.read(new File(picPath));
+                ImageIO.write(bufferImg, "PNG", outStream);
+                Drawing<?> patri = sheet.createDrawingPatriarch(); // 利用HSSFPatriarch将图片写入EXCEL
+                //HSSFClientAnchor anchor = new HSSFClientAnchor(0, 0, 0, 0, (short) 0, 8, (short) 10, 36);
+                //ClientAnchor anchor = patri.createAnchor(0, 0, 0, 0, 0, 8, 13, 36);
+                ClientAnchor anchor = patri.createAnchor(anchors[0], anchors[1], anchors[2], anchors[3], anchors[4], anchors[5], anchors[6], anchors[7]);
+                patri.createPicture(anchor, workbook.addPicture(outStream.toByteArray(), HSSFWorkbook.PICTURE_TYPE_PNG));
+            } catch (Exception ex) {
+                ex.printStackTrace();
+            }
+            if (file.exists()) {
+                file.delete();//删除图片
+            }
+        }
+        return workbook;
+    }
+
+
+    // ********************************************* 导入 *********************************************
+
+    /**
+     * excel 导入
+     * @param filePath   excel文件路径
+     * @param titleRows  标题行
+     * @param headerRows 表头行
+     * @param pojoClass  pojo类型
+     */
+    public static <T> List<T> importExcel(String filePath, Integer titleRows, Integer headerRows, Class<T> pojoClass) throws IOException {
+        if (StringUtils.isBlank(filePath)) {
+            return null;
+        }
+        ImportParams params = new ImportParams();
+        params.setTitleRows(titleRows);
+        params.setHeadRows(headerRows);
+        params.setNeedSave(false);
+        try {
+            return ExcelImportUtil.importExcel(new File(filePath), pojoClass, params);
+        } catch (NoSuchElementException e) {
+            throw new IOException("模板不能为空");
+        } catch (Exception e) {
+            throw new IOException(e.getMessage());
+        }
+    }
+
+    /**
+     * excel 导入
+     * @param inputStream 文件输入流
+     * @param titleRows   标题行
+     * @param headerRows  表头行
+     * @param needVerify  是否检验excel内容
+     * @param pojoClass   pojo类型
+     */
+    public static <T> List<T> importExcel(InputStream inputStream, Integer titleRows, Integer headerRows, boolean needVerify, Class<T> pojoClass) throws IOException {
+        if (inputStream == null) {
+            return null;
+        }
+        ImportParams params = new ImportParams();
+        params.setTitleRows(titleRows);
+        params.setHeadRows(headerRows);
+        params.setNeedSave(false);
+        params.setNeedVerify(needVerify);
+        try {
+            return ExcelImportUtil.importExcel(inputStream, pojoClass, params);
+        } catch (NoSuchElementException e) {
+            throw new IOException("excel文件不能为空");
+        } catch (Exception e) {
+            throw new IOException(e.getMessage());
+        }
+    }
+
+    /**
+     * 上传文件,返回一个workbook
+     */
+    /*public static Workbook importExcel(InputStream inputStream, String fileName) throws IOException {
+        Workbook workbook = null;
+        if(fileName.endsWith("xls")){
+            workbook = new HSSFWorkbook(inputStream);
+        }else if(fileName.endsWith("xlsx")){
+            workbook = new XSSFWorkbook(inputStream);
+        }else {
+            throw new RuntimeException("请确认你上传的文件类型");
+        }
+        return workbook;
+    }*/
+
+    /**
+     * 读取指定sheet的数据
+     * @param sheetName 要读取的sheetName
+     * @param titleRows 表头行数
+     * @param headRows 标题行数
+     * @param startRows 表头之前有多少行不要的数据,从1开始,忽略空行;不指定时默认为0
+     * @param readRows 要读取多少行数据,从0开始,比如读取十行,值就是9; 不指定时默认为0
+     * @param pojoClass 实体
+     */
+    /*public static <T> List<T> importExcel(InputStream inputStream,String fileName,String sheetName,Integer titleRows,Integer headRows, Integer startRows,Integer readRows,Class<T> pojoClass) throws Exception {
+        Workbook workbook = importExcel(inputStream,fileName);
+        int numberOfSheets = workbook.getNumberOfSheets();
+        List<T> list = null;
+        for (int i = 0; i < numberOfSheets; i++) {
+            String name = workbook.getSheetName(i).trim();
+            if (name.equals(sheetName) || name.endsWith(sheetName)){
+                ImportParams params = new ImportParams();
+                params.setTitleRows(titleRows);
+                params.setHeadRows(headRows);
+                params.setStartRows(startRows);
+                params.setReadRows(readRows);
+                //第几个sheet页
+                params.setStartSheetIndex(i);
+                final ExcelImportService excelImportService = new ExcelImportService();
+                ExcelImportResult<T> result = excelImportService.importExcelByIs(inputStream, pojoClass, params, false);
+                list = result.getList();
+                break;
+            }
+        }
+        return list;
+    }*/
+}

+ 685 - 0
src/main/java/com/kcim/common/util/excel/ExcelPoiUtil.java

@@ -0,0 +1,685 @@
+package com.kcim.common.util.excel;
+
+import com.kcim.common.util.excel.entity.ColEntity;
+import org.apache.poi.hssf.usermodel.*;
+import org.apache.poi.ss.usermodel.BorderStyle;
+import org.apache.poi.ss.usermodel.CellStyle;
+import org.apache.poi.ss.util.CellRangeAddress;
+import org.apache.poi.ss.util.RegionUtil;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.lang.reflect.Field;
+import java.text.SimpleDateFormat;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * excel poi 处理工具
+ * 概念-> 表头数据:报表的表头
+ * 行内数据:表头以下的数据
+ * 功能:动态生成单级,多级Excel表头,多个sheet,纵向合并单元格
+ * 备注:tree型结构数据的root节点的id默认为零(0)
+ */
+public class ExcelPoiUtil<T> {
+
+    /**
+     * excel 对象
+     */
+    private HSSFWorkbook workbook;
+    /**
+     * 表格标题
+     */
+    private String title;
+    /**
+     * 表头样式
+     */
+    private CellStyle styleHead;
+    /**
+     * 主体样式
+     */
+    private CellStyle styleBody;
+    /**
+     * 日期格式化,默认yyyy-MM-dd HH:mm:ss
+     */
+    private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+
+    public HSSFWorkbook getWorkbook() {
+        return workbook;
+    }
+
+    public void setWorkbook(HSSFWorkbook workbook) {
+        this.workbook = workbook;
+    }
+
+    public String getTitle() {
+        return title;
+    }
+
+    public void setTitle(String title) {
+        this.title = title;
+    }
+
+    public CellStyle getStyleHead() {
+        return styleHead;
+    }
+
+    public void setStyleHead(CellStyle styleHead) {
+        this.styleHead = styleHead;
+    }
+
+    public CellStyle getStyleBody() {
+        return styleBody;
+    }
+
+    public void setStyleBody(CellStyle styleBody) {
+        this.styleBody = styleBody;
+    }
+
+    public SimpleDateFormat getSdf() {
+        return sdf;
+    }
+
+    public void setSdf(SimpleDateFormat sdf) {
+        this.sdf = sdf;
+    }
+
+    /**
+     * 无参数 初始化 对象
+     */
+    public ExcelPoiUtil() {
+        this.title = "sheet1";
+        this.workbook = new HSSFWorkbook();
+        init();
+    }
+
+    public ExcelPoiUtil(String title) {
+        this.title = title;
+        this.workbook = new HSSFWorkbook();
+        init();
+    }
+
+    /**
+     * 内部统一调用的样式初始化
+     */
+    private void init() {
+        this.styleHead = EasyExcelStyleUtil.getStyles(workbook,2);
+        this.styleBody = EasyExcelStyleUtil.getStyles(workbook,3);
+    }
+
+    /**
+     * 返回workbook
+     * @param listTpamsColEntity 表头数据
+     * @param datas           行内数据
+     */
+    public HSSFWorkbook exportWorkbook(List<ColEntity> listTpamsColEntity, List<T> datas) throws Exception {
+        splitDataToSheets(this.title,datas, listTpamsColEntity,null, false);
+        EasyExcelStyleUtil.setStyleByType(this.workbook,null,0,null);
+        return this.workbook;
+    }
+
+    /**
+     * 返回workbook
+     * @param listTpamsColEntity 表头数据
+     * @param datas           行内数据
+     * @param mergeIndex      需要纵向合并的单元格列号(默认有横向合并)
+     */
+    public HSSFWorkbook exportWorkbook(List<ColEntity> listTpamsColEntity, List<T> datas,List<Integer> mergeIndex) throws Exception {
+        splitDataToSheets(this.title,datas, listTpamsColEntity, mergeIndex,false);
+        EasyExcelStyleUtil.setStyleByType(this.workbook,null,0,null);
+        return this.workbook;
+    }
+
+    /**
+     * 返回workbook
+     * @param listTpamsColEntity 表头数据
+     * @param datas           行内数据
+     * @param type            类型(0 默认 1 设置隔行背景 2 自适应行高 3 设置隔行背景同时自适应行高)
+     * @param autoRowHeight   需要自适应行高的行号
+     */
+    public HSSFWorkbook exportWorkbook(List<ColEntity> listTpamsColEntity, List<T> datas,int type,List<Integer> autoRowHeight) throws Exception {
+        splitDataToSheets(this.title,datas, listTpamsColEntity,null, false);
+        EasyExcelStyleUtil.setStyleByType(this.workbook,null,type,autoRowHeight);
+        return this.workbook;
+    }
+
+    /**
+     * 返回workbook
+     * @param listTpamsColEntity 表头数据
+     * @param datas           行内数据
+     * @param type            类型(0 默认 1 设置隔行背景 2 自适应行高 3 设置隔行背景同时自适应行高)
+     * @param autoRowHeight   需要自适应行高的行号
+     * @param mergeIndex      需要纵向合并的单元格列号(默认有横向合并)
+     */
+    public HSSFWorkbook exportWorkbook(List<ColEntity> listTpamsColEntity, List<T> datas,int type,List<Integer> autoRowHeight,List<Integer> mergeIndex) throws Exception {
+        splitDataToSheets(this.title,datas, listTpamsColEntity,mergeIndex, false);
+        EasyExcelStyleUtil.setStyleByType(this.workbook,null,type,autoRowHeight);
+        return this.workbook;
+    }
+
+    /**
+     * 返回workbook(多个sheet),这里全部sheet都用的同一个样式
+     * @param titles          表头数据(key为sheet名称,value为表头数据)
+     * @param datas           行内数据(key为sheet名称,value为行内数据)
+     * @param type            样式类型,每个sheet都用这个(0 默认 1 设置隔行背景 2 自适应行高 3 设置隔行背景同时自适应行高)
+     * @param autoRowHeight  需要自适应行高的行号,每个sheet都用这个
+     * @param mergeIndex     需要纵向合并的单元格列号(默认有横向合并),每个sheet都用这个
+     */
+    public HSSFWorkbook exportWorkbook(Map<String,List<ColEntity>> titles, Map<String,List<T>> datas,int type,List<Integer> autoRowHeight,List<Integer> mergeIndex) throws Exception {
+        for (String sheetName : titles.keySet()) {
+            List<ColEntity> colEntityList = titles.get(sheetName);
+            List<T> tList = datas.get(sheetName);
+            splitDataToSheets(sheetName,tList, colEntityList,mergeIndex,false);
+        }
+        EasyExcelStyleUtil.setStyleByType(this.workbook,null,type,autoRowHeight);
+        return this.workbook;
+    }
+
+    /**
+     * 返回workbook(多个sheet),这里多个sheet都有不同样式
+     * @param titles          表头数据(key为sheet名称,value为表头数据)
+     * @param datas           行内数据(key为sheet名称,value为行内数据)
+     * @param types           每个sheet的类型,key为sheet名称(0 默认 1 设置隔行背景 2 自适应行高 3 设置隔行背景同时自适应行高)
+     * @param autoRowHeights  每个sheet需要自适应行高的行号
+     * @param mergeIndexs     每个sheet需要纵向合并的单元格列号(默认有横向合并)
+     */
+    public HSSFWorkbook exportWorkbook(Map<String,List<ColEntity>> titles, Map<String,List<T>> datas,Map<String,Integer> types,
+                                       Map<String,List<Integer>> autoRowHeights,Map<String,List<Integer>> mergeIndexs) throws Exception {
+        for (String sheetName : titles.keySet()) {
+            List<ColEntity> colEntityList = titles.get(sheetName);
+            List<T> tList = datas.get(sheetName);
+            int type = types == null ? 0 : types.get(sheetName) == null ? 0 : types.get(sheetName);
+            List<Integer> autoRowHeight = autoRowHeights == null ? null : autoRowHeights.get(sheetName);
+            List<Integer> mergeIndex = mergeIndexs == null ? null : mergeIndexs.get(sheetName);
+            splitDataToSheets(sheetName,tList, colEntityList,mergeIndex,false);
+            EasyExcelStyleUtil.setStyleByType(this.workbook,sheetName,type,autoRowHeight);
+        }
+        return this.workbook;
+    }
+
+    /**
+     * 保存excel到本机指定的路径
+     * @param workbook
+     * @param filePath
+     */
+    public void save(HSSFWorkbook workbook, String filePath) {
+        File file = new File(filePath);
+        if (!file.getParentFile().exists()) {
+            file.getParentFile().mkdirs();
+        }
+        FileOutputStream fOut = null;
+        try {
+            fOut = new FileOutputStream(file);
+            workbook.write(fOut);
+            fOut.flush();
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        try {
+            if (null != fOut) {
+                fOut.close();
+            }
+        } catch (Exception e1) {
+        }
+    }
+
+    /**
+     * 导出Excel,适用于web导出excel
+     * @param sheet           excel
+     * @param data            行内数据
+     * @param headerCellList 表头数据
+     * @param mergeIndex      需要纵向合并的单元格列号(默认有横向合并)
+     * @param rowFlag         输出展示数据的结构(表头下面行的数据)
+     */
+    private void writeSheet(HSSFSheet sheet, List<T> data, List<ColEntity> headerCellList,List<Integer> mergeIndex,boolean rowFlag) throws Exception {
+        sheet = createHead(sheet, headerCellList.get(0).getTotalRow(), headerCellList.get(0).getTotalCol());
+        createHead(headerCellList, sheet, 0);
+        writeSheetContent(headerCellList, data, sheet, headerCellList.get(0).getTotalRow(),mergeIndex, rowFlag);
+    }
+
+    /**
+     * 拆分sheet,因为每个sheet不能超过65535,否则会报异常
+     * @param sheetName       sheet名称
+     * @param data            行内数据
+     * @param headerCellList 表头数据
+     * @param mergeIndex      需要纵向合并的单元格列号(默认有横向合并)
+     * @param rowFlag         输出展示数据的结构(表头下面行的数据)
+     */
+    private void splitDataToSheets(String sheetName,List<T> data, List<ColEntity> headerCellList,List<Integer> mergeIndex,boolean rowFlag) throws Exception {
+        int dataCount = data.size();
+        int maxColEntity = 65535;
+        int pieces = dataCount / maxColEntity;
+        for (int i = 1; i <= pieces; i++) {
+            HSSFSheet sheet = this.workbook.createSheet(sheetName + i);
+            List<T> subList = data.subList((i - 1) * maxColEntity, i * maxColEntity);
+            writeSheet(sheet, subList, headerCellList,mergeIndex,rowFlag);
+        }
+        HSSFSheet sheet = this.workbook.createSheet(sheetName);
+        writeSheet(sheet, data.subList(pieces * maxColEntity, dataCount), headerCellList,mergeIndex,rowFlag);
+    }
+
+    /**
+     * 把数据写入到单元格
+     * @param headerCellList 表头数据
+     * @param datas           行内数据
+     * @param sheet           工作表(excel分页)
+     * @param mergeIndex      需要纵向合并的单元格列号(默认有横向合并)
+     * @throws Exception void
+     */
+    private void writeSheetContent(List<ColEntity> headerCellList, List<T> datas, HSSFSheet sheet, int rowIndex,List<Integer> mergeIndex, boolean rowFlag) throws Exception {
+        boolean isMerge = false;// 是否纵向合并单元格
+        if (mergeIndex != null && !mergeIndex.isEmpty()) isMerge = true;
+        HSSFRow row = null;
+        List<ColEntity> listCol = new ArrayList<>();
+        rowFlag = false;
+        if (rowFlag) {//暂时没有用 后面扩展用
+            for (int i = 0, index = rowIndex; i < datas.size(); i++, index++) {
+                row = sheet.createRow(index);//创建行
+                for (int j = 0; j < headerCellList.size(); j++) {
+                    createColl(row, j, headerCellList.get(j).getFieldName(), datas.get(i));
+                }
+            }
+        } else {
+            getColEntityList(headerCellList, listCol);
+            Map<Integer,  Map<Integer, String>> mergeMaps = new HashMap<>();// 需要合并的列:key 列号,value为单元格内容
+            Map<Integer, String> mergeMap = null;// 需要合并的行:key 行号 value 为单元格内容
+            for (int i = 0, index = rowIndex; i < datas.size(); i++, index++) {
+                row = sheet.createRow(index);//创建行
+                for (int j = 0; j < listCol.size(); j++) {
+                    ColEntity c = listCol.get(j);
+                    //数据列
+                    HSSFCell col = createCol(row, c, datas.get(i));
+                    if (col.toString().length()>0){
+                        // 需要合并 并且 当前单元格所在的列包含在要合并的列中
+                        if (isMerge && mergeIndex.contains(c.getCol())){
+                            if (mergeMaps.get(c.getCol()) != null){ // 如果要合并的列已经有了,则直接去拿该列的数据
+                                mergeMap = mergeMaps.get(c.getCol());
+                            }else {
+                                mergeMap = new HashMap<>();
+                            }
+                            // 当前行号为key,当前单元格内容为value
+                            mergeMap.put(index,col.toString()); // 将当前单元格的内容添加到当前行号中
+                            mergeMaps.put(c.getCol(),mergeMap);
+                        }
+                    }
+                }
+            }
+            if (isMerge) mergedCells(mergeMaps,sheet);
+        }
+    }
+
+    /**
+     * 纵向合并单元格
+     * @param mergeMaps 需要合并的列:key 要合并的列号,value为单元格内容
+     * @param sheet
+     */
+    private void mergedCells(Map<Integer,  Map<Integer, String>> mergeMaps,HSSFSheet sheet){
+        for (Integer colNum : mergeMaps.keySet()) { // 遍历要合并的列,获取每一列的每一行
+            Map<Integer, String> mergeMap = mergeMaps.get(colNum);// 当前这列每一行的内容:key为行号,value为单元格内容
+            // 根据mergeMap的value,也就是单元格内容进行分组,每一组都是需要合并在一起的单元格(要合并的区域)
+            Map<String, List<Map.Entry<Integer,String>>>result = mergeMap.entrySet().stream().collect(Collectors.groupingBy(c -> c.getValue()));
+            System.out.println("\n合并的列号:"+colNum);
+            System.out.println("合并的区域:"+result);
+            for (String key : result.keySet()) {
+                // list为这一组要合并的几个单元格
+                List<Map.Entry<Integer, String>> list = result.get(key);
+                int start = list.get(0).getKey(); // 开始合并的行号
+                int end = list.get(list.size()-1).getKey(); // 结束合并的行号
+                System.out.println("第"+colNum+"列开始合并的行号:"+start+"\t第"+colNum+"列结束合并的行号:"+"\t"+end+"。");
+                if (start < end){ // 开始合并的行号必须小于结束合并的行号
+                    sheet.addMergedRegion(new CellRangeAddress(start, end, colNum,colNum));
+                }
+            }
+        }
+    }
+
+    /**
+     * 根据list 来创建单元格 暂时没有用
+     * @param row
+     * @param j
+     * @param finame
+     * @param t
+     */
+    private void createColl(HSSFRow row, int j, String finame, T t) {
+        HSSFCell cell = row.createCell(j);  //创建单元格
+        cell.setCellStyle(this.styleBody); //设置单元格样式
+        String text = "";
+        if (t instanceof List) {
+            List<Map> temp = (List<Map>) t;
+            if (j >= temp.size()) {
+                return;
+            }
+            text = String.valueOf(temp.get(j).get(finame) == null ? "" : temp.get(j).get(finame));
+        }
+        HSSFRichTextString richString = new HSSFRichTextString(text);
+        cell.setCellValue(richString);
+    }
+
+    /**
+     * 把ColEntity的ColEntityList整理成一个list<ColEntity> 过滤表头的脏数据
+     * @param list    表头数据
+     * @param listCol 返回新的list
+     */
+    private void getColEntityList(List<ColEntity> list, List<ColEntity> listCol) {
+        for (ColEntity ColEntity : list) {
+            if (ColEntity.getFieldName() != null) {
+                listCol.add(ColEntity);
+            }
+            List<ColEntity> listChildren = ColEntity.getCellList();
+            if (listChildren.size() > 0) {
+                getColEntityList(listChildren, listCol);
+            }
+        }
+    }
+
+    /**
+     * 创建行
+     * @param row         Excel对应的行
+     * @param tpamsColEntity 当前单元格属性
+     * @param v
+     * @param j
+     * @return
+     * @throws Exception
+     */
+    public int createRowVal(HSSFRow row, ColEntity tpamsColEntity, T v, int j) throws Exception {
+        //遍历标题
+        if (tpamsColEntity.getCellList() != null && tpamsColEntity.getCellList().size() > 0) {
+            for (int i = 0; i < tpamsColEntity.getCellList().size(); i++) {
+                createRowVal(row, tpamsColEntity.getCellList().get(i), v, j);
+            }
+        } else {
+            createCol(row, tpamsColEntity, v);
+        }
+        return j;
+    }
+
+    /**
+     * 创建单元格
+     * @param row         Excel对应的行
+     * @param colEntity 当前单元格对象
+     * @param v
+     * @throws Exception
+     */
+    public HSSFCell createCol(HSSFRow row, ColEntity colEntity, T v) throws Exception {
+        HSSFCell cell = row.createCell(colEntity.getCol());  //创建单元格
+        cell.setCellStyle(this.styleBody); //设置单元格样式
+        final Object[] value = {null};
+        if (v instanceof Map) {
+            Map m = (Map) v;
+            m.forEach((k, val) -> {
+                if (k.equals(colEntity.getFieldName()) && !colEntity.isHasChildren()) {
+                    value[0] = val;
+                }
+            });
+        } else {
+            Class<?> cls = v.getClass();// 拿到该类
+            Field[] fields = cls.getDeclaredFields();// 获取实体类的所有属性,返回Field数组
+            for (int i = 0; i < fields.length; i++) {
+                Field f = fields[i];
+                f.setAccessible(true); // 设置些属性是可以访问的
+                if (colEntity.getFieldName().equals(f.getName()) && !colEntity.isHasChildren()){
+                    value[0] = f.get(v);
+                }
+                if (value[0] instanceof Date) {
+                    value[0] = parseDate((Date) value[0]);
+                }
+            }
+        }
+        if (value[0] != null) {
+            HSSFRichTextString richString = new HSSFRichTextString(value[0].toString());
+            cell.setCellValue(richString);
+        }
+        return cell;
+    }
+
+    /**
+     * 时间转换
+     * @param date
+     * @return String
+     */
+    private String parseDate(Date date) {
+        String dateStr = "";
+        try {
+            dateStr = this.sdf.format(date);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return dateStr;
+    }
+
+
+    /**
+     * 根据数据的行数和列数,在excel创建单元格cell
+     * @param sheetCo excel分页
+     * @param r       excel 行数
+     * @param c       excel 列数
+     * @return
+     */
+    public HSSFSheet createHead(HSSFSheet sheetCo, int r, int c) {
+        for (int i = 0; i < r; i++) {
+            HSSFRow row = sheetCo.createRow(i);
+            for (int j = 0; j < c; j++) {
+                HSSFCell cell = row.createCell(j);
+            }
+        }
+        return sheetCo;
+    }
+
+    /**
+     * 使用递归 在excel写入表头数据 支持单级,多级表头的创建
+     * @param cellList 表头数据
+     * @param sheetCo  哪个分页
+     * @param rowIndex 当前Excel的第几行
+     */
+    public void createHead(List<ColEntity> cellList, HSSFSheet sheetCo, int rowIndex) {
+        HSSFRow row = sheetCo.getRow(rowIndex);
+        int len = cellList.size();//当前行 有多少列
+        for (int i = 0; i < len; i++) {//i是headers的索引,n是Excel的索引 多级表头
+            ColEntity colEntity = cellList.get(i);
+            //创建这一行的第几列单元格
+            int r = colEntity.getRow();
+            int rLen = colEntity.getRLen();
+            int c = colEntity.getCol();
+            int cLen = colEntity.getCLen();
+            int endR = r + rLen;
+            //解决表头导出时多一行问题
+            if(endR > r){
+                endR--;
+            }
+            int endC = c + cLen;
+            if (endC > c) {
+                endC--;
+            }
+            HSSFCell cell = row.getCell(c);
+            HSSFRichTextString text = new HSSFRichTextString(colEntity.getContent());
+            cell.setCellStyle(this.styleHead); //设置表头样式
+            cell.setCellValue(text);
+            // 合并单元格
+            CellRangeAddress cra = new CellRangeAddress(r, endR, c, endC);
+            //todo debug
+            if (cra.getNumberOfCells() > 1) {
+                sheetCo.addMergedRegion(cra);
+            }
+            sheetCo.setColumnWidth(c,colEntity.getWidth()*256);// 设置列宽
+            // 使用RegionUtil类为合并后的单元格添加边框
+            RegionUtil.setBorderBottom(BorderStyle.THIN, cra, sheetCo); // 下边框
+            RegionUtil.setBorderLeft(BorderStyle.THIN, cra, sheetCo); // 左边框
+            RegionUtil.setBorderRight(BorderStyle.THIN, cra, sheetCo); // 有边框
+            if (colEntity.isHasChildren()) {
+                rowIndex = r + 1;
+                createHead(colEntity.getCellList(), sheetCo, rowIndex);
+            }
+        }
+    }
+
+    /**
+     * 转换成ColEntity对象
+     * 支持List<T>的数据结构:map String ,只能是单级的数据
+     * @param list 需要转换的数据
+     */
+    public List<ColEntity> colEntityTransformer(List<T> list) {
+        List<ColEntity> lc = new ArrayList<>();
+        if (list.get(0) instanceof Map) {
+            final int[] i = {1};
+            for (Map<String, String> m : (List<Map<String, String>>) list) {
+                m.forEach((k, val) -> {
+                    ColEntity tpamsColEntity = new ColEntity();
+                    tpamsColEntity.setId(String.valueOf(i[0]));
+                    tpamsColEntity.setPid("0");
+                    tpamsColEntity.setContent(k);
+                    tpamsColEntity.setFieldName(val);
+                    tpamsColEntity.setWidth(20);
+                    lc.add(tpamsColEntity);
+                    i[0]++;
+                });
+            }
+        } else {
+            int i = 1;
+            for (String s : (List<String>) list) {
+                ColEntity tpamsColEntity = new ColEntity();
+                tpamsColEntity.setId(String.valueOf(i));
+                tpamsColEntity.setPid("0");
+                tpamsColEntity.setContent(s);
+                tpamsColEntity.setFieldName(null);
+                tpamsColEntity.setWidth(20);
+                lc.add(tpamsColEntity);
+                i++;
+            }
+        }
+        setParm(lc, "0");//处理一下
+        List<ColEntity> s = ExcelTreeUtil.buildByRecursive(lc, "0");
+        setColNum(lc, s);
+        return s;
+    }
+
+    /**
+     * 转换成ColEntity对象 返回tree数据结构
+     * 支持:List<map>、某个具体对象(entity)数据的转换
+     * @param list  需要转换的数据
+     * @param parm {id,pid,content,fieldName,width} 这几个字段对应的是封装表头实体类的字段,
+     *             比如我用的是TitleEntity封装的表头,则这五个key对应的value就是TitleEntity的字段名。
+     *             也就是说这五个key对应的value需要和第一个参数传入的 T(某个具体对象) 的字段对应。
+     *             id:       当前节点id 字段的名称       主键
+     *             pid:      当前节点的父节点id          字段名称
+     *             content:  当前节点所在单元格的内容     字段名称
+     *             fieldName:填充行内数据时,映射的字段名  字段名称
+     *             width:    列宽                      字段名称
+     * @param rootid    rootid的值
+     */
+    public List<ColEntity> colEntityTransformer(List<T> list, Map<String,String> parm,String rootid) throws Exception {
+        List<ColEntity> lc = new ArrayList<>();
+        if (list.get(0) instanceof Map) {
+            for (Map m : (List<Map>) list) {
+                ColEntity colEntity = new ColEntity();
+                m.forEach((k, val) -> {
+                    if (parm.get("id").equals(k)) {
+                        colEntity.setId(String.valueOf(val));
+                    }
+                    if (parm.get("pid").equals(k)) {
+                        colEntity.setPid((String) val);
+                    }
+                    if (parm.get("content").equals(k)) {
+                        colEntity.setContent((String) val);
+                    }
+                    if (parm.get("fieldName") != null && parm.get("fieldName").equals(k)) {
+                        colEntity.setFieldName((String) val);
+                    }
+                    if (parm.get("width") != null && parm.get("width").equals(k)) {
+                        colEntity.setWidth(Integer.parseInt(val.toString()));
+                    }
+                });
+                lc.add(colEntity);
+            }
+        } else {
+            for (T t : list) { // 反射
+                ColEntity colEntity = new ColEntity();
+                Class cls = t.getClass();
+                Field[] fs = cls.getDeclaredFields();
+                for (int i = 0; i < fs.length; i++) {
+                    Field f = fs[i];
+                    f.setAccessible(true); // 设置些属性是可以访问的
+                    if (parm.get("id").equals(f.getName()) && f.get(t) != null) {
+                        colEntity.setId(f.get(t).toString());
+                    }
+                    if (parm.get("pid").equals(f.getName()) && f.get(t) != null) {
+                        colEntity.setPid(f.get(t).toString());
+                    }
+                    if (parm.get("content").equals(f.getName()) && f.get(t) != null) {
+                        colEntity.setContent(f.get(t).toString());
+                    }
+                    if (f.get(t) != null && parm.get("fieldName") != null && parm.get("fieldName").equals(f.getName())) {
+                        colEntity.setFieldName(f.get(t).toString());
+                    }
+                    if (parm.get("width").equals(f.getName()) && f.get(t) != null) {
+                        colEntity.setWidth(Integer.parseInt(f.get(t).toString()));
+                    }
+                }
+                lc.add(colEntity);
+            }
+        }
+        setParm(lc, rootid); // 处理基础参数
+        List<ColEntity> s = ExcelTreeUtil.buildByRecursive(lc, rootid); // 构建树结构
+        setColNum(lc, s);
+        return s;
+    }
+
+    /**
+     * 设置基础的参数
+     * @param list
+     */
+    public static void setParm(List<ColEntity> list, String rootid) {
+        int row = 0; //excel第几行
+        int rLen = 0; //excel 跨多少行
+        int totalRow = ExcelTreeUtil.getMaxStep(list);
+        int totalCol = ExcelTreeUtil.getDownChildren(list, rootid);
+        for (int i = 0; i < list.size(); i++) {
+            ColEntity poit = list.get(i);
+            int tree_step = ExcelTreeUtil.getTreeStep(list, poit.getPid(), 0);//往上遍历tree
+            poit.setTreeStep(tree_step);
+            poit.setRow(tree_step);//设置第几行
+            //判断是否有节点
+            boolean hasCh = ExcelTreeUtil.hasChild(list, poit);
+            poit.setHasChildren(hasCh);
+            if (hasCh) {
+                poit.setRLen(0);//设置跨多少行
+            } else {
+                if (tree_step < totalRow) {
+                    rLen = totalRow - tree_step;
+                }
+                poit.setRLen(rLen);
+            }
+            poit.setTotalRow(totalRow);
+            poit.setTotalCol(totalCol);
+        }
+    }
+
+    /**
+     * 设置基础的参数
+     * @param list     所有list数据,一条一条
+     * @param treeList 转成tree结构的list
+     */
+    public static void setColNum(List<ColEntity> list, List<ColEntity> treeList) {
+        //int col = pcIndex;//excel第几列
+        //int cLen ;//xcel跨多少列
+        List<ColEntity> new_list = new ArrayList<>();//新的遍历list
+        for (int i = 0; i < treeList.size(); i++) {
+            ColEntity poit = treeList.get(i);
+            //String temp_id = ExcelTreeUtil.getStepParentId(list,poit.getId() ,1);
+            int col = ExcelTreeUtil.getParentCol(list, poit.getPid()).getCol();
+            int brotherCol = ExcelTreeUtil.getBrotherChilNum(list, poit);
+            poit.setCol(col + brotherCol);
+            int cLen = ExcelTreeUtil.getDownChildren(list, poit.getId());
+            if (cLen <= 1) {
+                cLen = 0;
+            }
+            //else  cLen--;
+            poit.setCLen(cLen);//设置跨多少列
+            if (poit.getCellList().size() > 0) {
+                new_list.addAll(poit.getCellList());
+            }
+        }
+        if (new_list.size() > 0) {
+            setColNum(list, new_list);
+        }
+    }
+}

+ 1 - 0
src/main/java/com/kcim/common/util/excel/ExcelStyleUtil.java

@@ -91,4 +91,5 @@ public class ExcelStyleUtil extends ExcelExportStylerDefaultImpl {
         font.setFontHeightInPoints((short) size);
         return font;
     }
+
 }

+ 222 - 0
src/main/java/com/kcim/common/util/excel/ExcelTreeUtil.java

@@ -0,0 +1,222 @@
+package com.kcim.common.util.excel;
+
+
+import com.kcim.common.util.excel.entity.ColEntity;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+
+/**
+ * excel poi 处理tree结构的数据 工具类
+ */
+public class ExcelTreeUtil {
+    
+    /**
+     * 传入的id 必须存在list集合里
+     * 获取某节点的深度
+     * @param list
+     * @param id   根节点
+     * @param step 当前节点级别
+     * @return
+     */
+    public static int getTreeStep(List<ColEntity> list, String id, int step) {
+        if ("".equals(id) || null == id) return step;
+        for (ColEntity cc : list) {
+            if (id.equals(cc.getId())) {
+                int temp = step + 1;
+                return getTreeStep(list, cc.getPid(), temp);
+            }
+        }
+        return step;
+    }
+
+    /**
+     * 遍历所有数据 获取树最大的深度
+     * @param list
+     * @return
+     */
+    public static int getMaxStep(List<ColEntity> list) {
+        List<Integer> nums = new ArrayList<>();
+        for (ColEntity cc : list) {
+            nums.add(getTreeStep(list, cc.getId(), 0));
+        }
+        return Collections.max(nums);
+    }
+
+    /**
+     * 获取最底部子节点的个数 所有叶子节点个数
+     * @param list
+     * @param did
+     * @return
+     */
+    public static int getDownChildren(List<ColEntity> list, String did) {
+        int sum = 0;
+        for (ColEntity cc : list) {
+            if (did.equals(cc.getPid())) {
+                sum++;
+                //判断该节点 是否有子节点
+                if (hasChild(list, cc)) {
+                    sum += getDownChildren(list, cc.getId()) - 1;
+                }
+            }
+        }
+        return sum;
+    }
+
+    /**
+     * 获取父节点
+     * @param list 所有的list数据,一条一条
+     * @param did  当前节点id
+     * @return
+     */
+    public static ColEntity getParentCol(List<ColEntity> list, String did) {
+        for (ColEntity cc : list) {
+            if (did != null && did.equals(cc.getId())) {
+                return cc;
+            }
+            if (did == null && did == cc.getId()) {
+                return cc;
+            }
+        }
+        return new ColEntity() {{
+            setCol(0);
+            setRow(0);
+        }};
+    }
+
+    /**
+     * 获取兄弟节点个数 这个必须是有排序的
+     * @param list   所有的list数据,一条一条
+     * @param ColEntity 当前节点信息
+     * @return
+     */
+    public static int getBrotherChilNum(List<ColEntity> list, ColEntity ColEntity) {
+        int sum = 0;
+        for (ColEntity cc : list) {
+            if (ColEntity.getId().equals(cc.getId())) {
+                break;
+            }
+            if (!ColEntity.getPid().equals(cc.getPid())) {
+                continue;
+            }
+            int temp = getDownChildren(list, cc.getId());
+            if (temp == 0 || temp == 1) {
+                sum++;
+            } else {
+                sum += temp;
+            }
+        }
+        return sum;
+    }
+
+    /**
+     * 根据某节点的第几层的父节点id
+     * @param list 所有的list数据,一条一条
+     * @param id   当前节点id
+     * @param step 第几层(深度 从零开始)
+     * @return
+     */
+    public static String getStepParentId(List<ColEntity> list, String id, int step) {
+        String f_id = null;
+        for (ColEntity cc : list) {
+            if (id.equals(cc.getId())) {
+                int cstep = getTreeStep(list, cc.getId(), 0);
+                if (step == cstep) {
+                    return id;
+                }
+                int fstep = getTreeStep(list, cc.getPid(), 0);
+                if (step == fstep) {
+                    f_id = cc.getPid();
+                    break;
+                } else {
+                    getStepParentId(list, cc.getPid(), step);
+                }
+            }
+        }
+        return f_id;
+    }
+
+    /**
+     * 判断是否有子节点
+     * @param list 遍历的数据
+     * @param node 某个节点
+     * @return
+     */
+    public static boolean hasChild(List<ColEntity> list, ColEntity node) {
+        return getChildList(list, node).size() > 0;
+    }
+
+    /**
+     * 得到子节点列表
+     * @param list 遍历的数据
+     * @param node 某个节点
+     * @return
+     */
+    public static List<ColEntity> getChildList(List<ColEntity> list, ColEntity node) {
+        List<ColEntity> nodeList = new ArrayList<>();
+        Iterator<ColEntity> it = list.iterator();
+        while (it.hasNext()) {
+            ColEntity n = (ColEntity) it.next();
+            if (n.getPid() != null && n.getPid().equals(node.getId())) {
+                nodeList.add(n);
+            }
+        }
+        return nodeList;
+    }
+
+    /**
+     * 使用递归方法建树
+     * @param treeNodes
+     */
+    public static List<ColEntity> buildByRecursive(List<ColEntity> treeNodes, String rootID) {
+        List<ColEntity> trees = new ArrayList<>();
+        boolean flag = false;
+        boolean sflag = false;
+        for (ColEntity treeNode : treeNodes) {
+            if ((rootID == null && rootID == treeNode.getId())) {
+                flag = true;
+            }
+            if (rootID != null && rootID.equals(treeNode.getId())) {
+                flag = true;
+            }
+            if (flag) {
+                trees.add(findChildren(treeNode, treeNodes));
+                flag = false;
+            }
+        }
+        if (trees.size() <= 0) {
+            for (ColEntity treeNode : treeNodes) {
+                if ((rootID == null && rootID == treeNode.getPid())) {
+                    sflag = true;
+                }
+                if (rootID != null && rootID.equals(treeNode.getPid())) {
+                    sflag = true;
+                }
+                if (sflag) {
+                    trees.add(findChildren(treeNode, treeNodes));
+                    sflag = false;
+                }
+            }
+        }
+        return trees;
+    }
+
+    /**
+     * 递归查找子节点
+     * @param treeNodes
+     * @return
+     */
+    public static ColEntity findChildren(ColEntity treeNode, List<ColEntity> treeNodes) {
+        for (ColEntity it : treeNodes) {
+            if (treeNode.getId().equals(it.getPid())) {
+                if (treeNode.getCellList() == null) {
+                    treeNode.setCellList(new ArrayList<>());
+                }
+                treeNode.getCellList().add(findChildren(it, treeNodes));
+            }
+        }
+        return treeNode;
+    }
+}

+ 181 - 0
src/main/java/com/kcim/common/util/excel/entity/ColEntity.java

@@ -0,0 +1,181 @@
+package com.kcim.common.util.excel.entity;
+
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 单元格
+ */
+public class ColEntity {
+    /**
+     * 单元格内容
+     */
+    private String content;
+    /**
+     * 字段名称,用户导出表格时反射调用
+     */
+    private String fieldName;
+    /**
+     * 这个单元格的集合
+     */
+    private List<ColEntity> cellList = new ArrayList<ColEntity>();
+    /**
+     * 总行数
+     */
+    private int totalRow;
+    /**
+     * 总列数
+     */
+    private int totalCol;
+    /**
+     * excel第几行
+     */
+    private int row;
+    /**
+     * excel第几列
+     */
+    private int col;
+    /**
+     * excel 跨多少行
+     */
+    private int rLen;
+    /**
+     * excel跨多少列
+     */
+    private int cLen;
+    /**
+     * 是否有子节点
+     */
+    private boolean hasChildren;
+    /**
+     * 树的级别 从0开始
+     */
+    private int treeStep;
+    /**
+     * 树的id
+     */
+    private String id;
+    /**
+     * 树的父级id
+     */
+    private String pid;
+    /**
+     * 列宽
+     */
+    private int width;
+
+    public ColEntity() {}
+
+    public String getContent() {
+        return content;
+    }
+
+    public void setContent(String content) {
+        this.content = content;
+    }
+
+    public String getFieldName() {
+        return fieldName;
+    }
+
+    public void setFieldName(String fieldName) {
+        this.fieldName = fieldName;
+    }
+
+    public List<ColEntity> getCellList() {
+        return cellList;
+    }
+
+    public void setCellList(List<ColEntity> cellList) {
+        this.cellList = cellList;
+    }
+
+    public int getTotalRow() {
+        return totalRow;
+    }
+
+    public void setTotalRow(int totalRow) {
+        this.totalRow = totalRow;
+    }
+
+    public int getTotalCol() {
+        return totalCol;
+    }
+
+    public void setTotalCol(int totalCol) {
+        this.totalCol = totalCol;
+    }
+
+    public int getRow() {
+        return row;
+    }
+
+    public void setRow(int row) {
+        this.row = row;
+    }
+
+    public int getCol() {
+        return col;
+    }
+
+    public void setCol(int col) {
+        this.col = col;
+    }
+
+    public int getRLen() {
+        return rLen;
+    }
+
+    public void setRLen(int rLen) {
+        this.rLen = rLen;
+    }
+
+    public int getCLen() {
+        return cLen;
+    }
+
+    public void setCLen(int cLen) {
+        this.cLen = cLen;
+    }
+
+    public boolean isHasChildren() {
+        return hasChildren;
+    }
+
+    public void setHasChildren(boolean hasChildren) {
+        this.hasChildren = hasChildren;
+    }
+
+    public int getTreeStep() {
+        return treeStep;
+    }
+
+    public void setTreeStep(int treeStep) {
+        this.treeStep = treeStep;
+    }
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getPid() {
+        return pid;
+    }
+
+    public void setPid(String pid) {
+        this.pid = pid;
+    }
+
+    public int getWidth() {
+        return width;
+    }
+
+    public void setWidth(int width) {
+        this.width = width;
+    }
+}

+ 44 - 0
src/main/java/com/kcim/common/util/excel/entity/EmpTypeEntity.java

@@ -0,0 +1,44 @@
+package com.kcim.common.util.excel.entity;
+
+import cn.afterturn.easypoi.excel.annotation.Excel;
+import cn.afterturn.easypoi.excel.annotation.ExcelTarget;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @program: CostAccount
+ * @description:
+ * @author: Wang.YS
+ * @create: 2024-03-19 15:21
+ **/
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+@ExcelTarget("EmpTypeEntity")
+public class EmpTypeEntity {
+
+
+    @Excel(name="人员ID",width = 20)
+    private String userId;
+
+    @Excel(name="工号",width = 20)
+    private String account;
+
+    @Excel(name="姓名",width = 20)
+    private String name;
+    @Excel(name="科室代码",width = 20)
+    private String departmentCode;
+    @Excel(name="科室名称",width = 20)
+    private String departmentName;
+    @Excel(name="岗位代码",width = 20)
+    private String positionCode;
+    @Excel(name="岗位名称",width = 20)
+    private String positionName;
+    @Excel(name="人事分类代码",width = 20)
+    private String empTypeCode;
+    @Excel(name="人事分类名称",width = 20)
+    private String empTypeName;
+}

+ 20 - 0
src/main/java/com/kcim/common/util/excel/entity/ItemImportEntity.java

@@ -35,12 +35,32 @@ public class ItemImportEntity {
     @Excel(name="项目类别",width = 20)
     private String type;
 
+    @Excel(name="项目分类",width = 20,dict = "itemType",addressList = true)
+    private String itemType;
+
     @Excel(name="单价",width = 20)
     private BigDecimal price;
 
+    @Excel(name="参与人员",width = 20)
+    private String emp;
+
+    @Excel(name="使用设备",width = 20)
+    private String equipment;
+
+    @Excel(name="使用空间",width = 20)
+    private String space;
+
+    @Excel(name="不计价药品",width = 20)
+    private String noValuationDrug;
 
+    @Excel(name="不计价材料",width = 20)
+    private String noValuationMaterial;
 
+    @Excel(name="计价药品",width = 20)
+    private String valuationDrug;
 
+    @Excel(name="计价材料",width = 20)
+    private String valuationMaterial;
 
 
 }

+ 12 - 3
src/main/java/com/kcim/common/util/excel/entity/StandItemImportEntity.java

@@ -27,7 +27,8 @@ public class StandItemImportEntity {
 
     @Excel(name="项目名称",width = 20)
     private String name;
-
+    @Excel(name="项目分类",width = 20,dict = "itemType",addressList = true)
+    private String itemType;
     @Excel(name="国家编码",width = 20)
     private String nationalCode;
 
@@ -45,8 +46,16 @@ public class StandItemImportEntity {
 
     @Excel(name="使用空间",width = 20)
     private String space;
-
-
+    /**
+     * 技术难度
+     */
+    @Excel(name="技术难度",width = 20)
+    private BigDecimal technicalDifficulty;
+    /**
+     * 风险程度
+     */
+    @Excel(name="风险程度",width = 20)
+    private BigDecimal riskDegree;
 
 
 

+ 107 - 0
src/main/java/com/kcim/common/util/excel/entity/TitleEntity.java

@@ -0,0 +1,107 @@
+package com.kcim.common.util.excel.entity;
+
+
+/**
+ * 表头的实体类: 在具体的项目里,可以是你从数据库里查询出来的数据
+ */
+public class TitleEntity {
+    /**
+     * id
+     */
+    public  String id;
+    /**
+     * 父级id
+     */
+    public  String pid;
+    /**
+     * 表头内容
+     */
+    public  String content;
+    /**
+     * 映射的字段名
+     */
+    public  String fieldName;
+
+    public Integer sort;
+
+    public Integer getSort() {
+        return sort;
+    }
+
+    public void setSort(Integer sort) {
+        this.sort = sort;
+    }
+
+    /**
+     * 列宽
+     */
+    public int width = 20;
+
+    public boolean isLast() {
+        return last;
+    }
+
+    public void setLast(boolean last) {
+        this.last = last;
+    }
+
+    public boolean last = false;
+
+    public TitleEntity(){}
+
+    public TitleEntity(String id, String pid, String content, String fieldName, int width) {
+        this.id = id;
+        this.pid = pid;
+        this.content = content;
+        this.fieldName = fieldName;
+        this.width = width;
+    }
+
+    public TitleEntity(String id, String pid, String content, String fieldName) {
+        this.id = id;this.pid = pid;this.content = content;this.fieldName = fieldName;
+    }
+
+    public TitleEntity(String id, String pid, String content,boolean last,Integer sort) {
+        this.id = id;this.pid = pid;this.content = content;this.last = last;this.sort = sort;
+    }
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getPid() {
+        return pid;
+    }
+
+    public void setPid(String pid) {
+        this.pid = pid;
+    }
+
+    public String getContent() {
+        return content;
+    }
+
+    public void setContent(String content) {
+        this.content = content;
+    }
+
+    public String getFieldName() {
+        return fieldName;
+    }
+
+    public void setFieldName(String fieldName) {
+        this.fieldName = fieldName;
+    }
+
+    public int getWidth() {
+        return width;
+    }
+
+    public void setWidth(int width) {
+        this.width = width;
+    }
+}

+ 94 - 0
src/main/java/com/kcim/common/util/excel/handler/MedServiceItemTypeHandler.java

@@ -0,0 +1,94 @@
+package com.kcim.common.util.excel.handler;
+
+import cn.afterturn.easypoi.handler.inter.IExcelDictHandler;
+import com.kcim.vo.DictDataVo;
+import org.springframework.util.CollectionUtils;
+import org.springframework.util.StringUtils;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * @program: CostAccount
+ * @description: 收费项目项目类别实现
+ * @author: Wang.YS
+ * @create: 2023-10-19 14:33
+ **/
+public class MedServiceItemTypeHandler implements IExcelDictHandler {
+
+    public final List<DictDataVo> list ;
+
+    public MedServiceItemTypeHandler(List<DictDataVo> dataVoList) {
+        this.list = dataVoList;
+    }
+
+    /**
+     * 返回字典所有值
+     * key: dictKey
+     * value: dictValue
+     *
+     * @param dict 字典Key
+     * @return
+     */
+    @Override
+    public List<Map> getList(String dict) {
+        List<Map> dictList    = new ArrayList<>();
+        if(!CollectionUtils.isEmpty(list)){
+            for (DictDataVo dataVo : list) {
+                Map<String, String> dictMap = new HashMap<>();
+                dictMap.put("dictKey", dataVo.getCode());
+                dictMap.put("dictValue", dataVo.getName());
+                dictList.add(dictMap);
+            }
+        }
+        return dictList;
+    }
+
+    /**
+     * 从值翻译到名称
+     *
+     * @param dict  字典Key
+     * @param obj   对象
+     * @param name  属性名称
+     * @param value 属性值
+     * @return
+     */
+    @Override
+    public String toName(String dict, Object obj, String name, Object value) {
+         if ("itemType".equals(dict)) {
+            if(!StringUtils.isEmpty(value)){
+                String level = value.toString();
+                Map<String, String> dictMap = list.stream().collect(Collectors.toMap(DictDataVo::getCode, DictDataVo::getName, (a, b) -> b));
+                return dictMap.get(level);
+            }
+        }
+        return null;
+    }
+
+    /**
+     * 从名称翻译到值
+     *
+     * @param dict  字典Key
+     * @param obj   对象
+     * @param name  属性名称
+     * @param value 属性值
+     * @return
+     */
+    @Override
+    public String toValue(String dict, Object obj, String name, Object value) {
+        if ("itemType".equals(dict)) {
+            if(!StringUtils.isEmpty(value)){
+                if(!CollectionUtils.isEmpty(list)){
+                    Map<String, String> dictMap = list.stream().collect(Collectors.toMap(DictDataVo::getName, DictDataVo::getCode, (a, b) -> b));
+                    String level = value.toString();
+                    return dictMap.get(level);
+                }
+            }
+
+        }
+        return null;
+    }
+}

+ 7 - 1
src/main/java/com/kcim/dao/mapper/AccountingProductMapper.java

@@ -2,7 +2,11 @@ package com.kcim.dao.mapper;
 
 import com.kcim.dao.model.AccountingProduct;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.kcim.vo.ProductMapVO;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
 
 /**
  * 会计科目成本对照表
@@ -12,5 +16,7 @@ import org.apache.ibatis.annotations.Mapper;
  */
 @Mapper
 public interface AccountingProductMapper extends BaseMapper<AccountingProduct> {
-	
+
+    List<ProductMapVO> selectProductMap(@Param("hospId") Long hospId,
+                                        @Param("accountIds")List<Long> accountIds );
 }

+ 16 - 0
src/main/java/com/kcim/dao/mapper/ComputeCheckResultMapper.java

@@ -0,0 +1,16 @@
+package com.kcim.dao.mapper;
+
+import com.kcim.dao.model.ComputeCheckResult;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 异常结果详情
+ * 
+ * @author Wang.YS
+ * @date 2024-03-21 15:17:54
+ */
+@Mapper
+public interface ComputeCheckResultMapper extends BaseMapper<ComputeCheckResult> {
+	
+}

+ 16 - 0
src/main/java/com/kcim/dao/mapper/ComputeDrugCostDetailMapper.java

@@ -0,0 +1,16 @@
+package com.kcim.dao.mapper;
+
+import com.kcim.dao.model.ComputeDrugCostDetail;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 药材成本计算明细表
+ * 
+ * @author Wang.YS
+ * @date 2024-01-11 19:57:43
+ */
+@Mapper
+public interface ComputeDrugCostDetailMapper extends BaseMapper<ComputeDrugCostDetail> {
+	
+}

+ 31 - 0
src/main/java/com/kcim/dao/mapper/ComputeDrugCostMapper.java

@@ -0,0 +1,31 @@
+package com.kcim.dao.mapper;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.kcim.dao.model.ComputeDrugCost;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.kcim.dao.model.dto.ComputeDrugCostPageDto;
+import com.kcim.dao.model.dto.ComputeItemCostPageDto;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * 药材成本计算表
+ * 
+ * @author Wang.YS
+ * @date 2024-01-11 19:57:43
+ */
+@Mapper
+public interface ComputeDrugCostMapper extends BaseMapper<ComputeDrugCost> {
+
+    List<ComputeDrugCostPageDto> getByPage(Page<ComputeDrugCostPageDto> page,
+                                           @Param("computeDate") String computeDate,
+                                           @Param("responsibilityCode") String responsibilityCode,
+                                           @Param("filter") String filter,
+                                           @Param("hospId") Long hospId);
+
+
+
+
+}

+ 16 - 0
src/main/java/com/kcim/dao/mapper/ComputeProjectCostDetailMapper.java

@@ -0,0 +1,16 @@
+package com.kcim.dao.mapper;
+
+import com.kcim.dao.model.ComputeProjectCostDetail;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 完全成本法项目成本计算明细表
+ * 
+ * @author Wang.YS
+ * @date 2024-01-15 20:23:56
+ */
+@Mapper
+public interface ComputeProjectCostDetailMapper extends BaseMapper<ComputeProjectCostDetail> {
+	
+}

+ 34 - 0
src/main/java/com/kcim/dao/mapper/ComputeProjectCostMapper.java

@@ -0,0 +1,34 @@
+package com.kcim.dao.mapper;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.kcim.dao.model.ComputeProjectCost;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.kcim.vo.ComputeProjectCostPageDto;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * 完全成本法项目成本计算表
+ * 
+ * @author Wang.YS
+ * @date 2024-01-15 20:23:56
+ */
+@Mapper
+public interface ComputeProjectCostMapper extends BaseMapper<ComputeProjectCost> {
+
+    List<ComputeProjectCostPageDto> getByPage(Page<ComputeProjectCostPageDto> page,
+                                              @Param("computeDate") String computeDate,
+                                              @Param("itemType")String itemType,
+                                              @Param("responsibility") String responsibility,
+                                              @Param("itemFilter") String itemFilter,
+                                              @Param("hospId") Long hospId);
+
+    List<ComputeProjectCostPageDto> getSingleByPage(Page<ComputeProjectCostPageDto> page,
+                                                    @Param("computeDate") String computeDate,
+                                                    @Param("itemType")String itemType,
+                                                    @Param("responsibility") String responsibility,
+                                                    @Param("itemFilter") String itemFilter,
+                                                    @Param("hospId") Long hospId);
+}

+ 16 - 0
src/main/java/com/kcim/dao/mapper/ComputeProjectGroupCostDetailMapper.java

@@ -0,0 +1,16 @@
+package com.kcim.dao.mapper;
+
+import com.kcim.dao.model.ComputeProjectGroupCostDetail;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 完全成本法项目成本计算汇总明细表
+ * 
+ * @author Wang.YS
+ * @date 2024-01-19 15:53:57
+ */
+@Mapper
+public interface ComputeProjectGroupCostDetailMapper extends BaseMapper<ComputeProjectGroupCostDetail> {
+	
+}

+ 23 - 0
src/main/java/com/kcim/dao/mapper/ComputeShareParamDetailMapper.java

@@ -0,0 +1,23 @@
+package com.kcim.dao.mapper;
+
+import com.kcim.dao.model.ComputeShareParamDetail;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.kcim.vo.ComputeDateShareParamVo;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * 项目分摊参数计算明细表
+ * 
+ * @author Wang.YS
+ * @date 2024-01-15 20:23:56
+ */
+@Mapper
+public interface ComputeShareParamDetailMapper extends BaseMapper<ComputeShareParamDetail> {
+
+    List<ComputeDateShareParamVo> getByShareParamId(@Param("computeDate") String computeDate,
+                                                    @Param("hospId") Long hospId,
+                                                    @Param("items") List<Integer> items);
+}

+ 33 - 0
src/main/java/com/kcim/dao/mapper/ComputeShareParamMapper.java

@@ -0,0 +1,33 @@
+package com.kcim.dao.mapper;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.kcim.dao.model.ComputeShareParam;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.kcim.vo.ComputeDateShareParamVo;
+import com.kcim.vo.ComputeShareParamDetailVo;
+import com.kcim.vo.ComputeShareParamSumVo;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * 项目分摊参数计算表
+ * 
+ * @author Wang.YS
+ * @date 2024-01-15 20:23:56
+ */
+@Mapper
+public interface ComputeShareParamMapper extends BaseMapper<ComputeShareParam> {
+
+    List<ComputeDateShareParamVo> getByPage(Page<ComputeDateShareParamVo> page,
+                                            @Param("computeDate") String computeDate,
+                                            @Param("itemType") String itemType,
+                                            @Param("responsibility") String responsibility,
+                                            @Param("itemFilter") String itemFilter,
+                                            @Param("hospId") Long hospId);
+
+    List<ComputeShareParamSumVo> getComputeShareParamSum(@Param("computeDate") String computeDate, @Param("hospId") Long hospId);
+
+    List<ComputeShareParamDetailVo> getComputeShareParamDetail(String computeDate, Long hospId);
+}

+ 41 - 17
src/main/java/com/kcim/dao/mapper/CostCostingGroupMapper.java

@@ -3,6 +3,7 @@ package com.kcim.dao.mapper;
 import com.kcim.dao.model.CostCostingGroup;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.kcim.vo.AllocationVO;
+import com.kcim.vo.CommonDepartVo;
 import com.kcim.vo.CostingGroupStartVO;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
@@ -22,13 +23,16 @@ public interface CostCostingGroupMapper extends BaseMapper<CostCostingGroup> {
 
     /**
      * 成本分摊前查询列表
-     * @param startIndex 开始索引
-     * @param pageSize limit
+     *
+     * @param startIndex         开始索引
+     * @param pageSize           limit
      * @param responsibilityCode 责任中心代码
-     * @param accountCode 会计中心代码
-     * @param year 年
-     * @param month 月
-     * @param hospId 医院
+     * @param accountCode        会计中心代码
+     * @param year               年
+     * @param month              月
+     * @param hospId             医院
+     * @param departmentCode
+     * @param filter
      * @return {@link CostingGroupStartVO}
      */
     List<CostingGroupStartVO> queryStartAllocation(@Param("startIndex") Integer startIndex,
@@ -37,31 +41,38 @@ public interface CostCostingGroupMapper extends BaseMapper<CostCostingGroup> {
                                                    @Param("accountCode") String accountCode,
                                                    @Param("year") Integer year,
                                                    @Param("month") Integer month,
-                                                   @Param("hospId") Long hospId);
+                                                   @Param("hospId") Long hospId,
+                                                   @Param("departmentCode")String departmentCode,
+                                                   @Param("filter")String filter);
 
     /**
      * 成本分摊前查询列表 总数
+     *
      * @param responsibilityCode 责任中心代码
-     * @param accountCode 会计中心代码
-     * @param year 年
-     * @param month 月
-     * @param hospId 医院
+     * @param accountCode        会计中心代码
+     * @param year               年
+     * @param month              月
+     * @param hospId             医院
+     * @param departmentCode
+     * @param filter
      * @return 总数
      */
     int queryStartAllocationCount(@Param("responsibilityCode") String responsibilityCode,
                                   @Param("accountCode") String accountCode,
                                   @Param("year") Integer year,
                                   @Param("month") Integer month,
-                                  @Param("hospId") Long hospId);
+                                  @Param("hospId") Long hospId, @Param("departmentCode") String departmentCode, @Param("filter") String filter);
 
     /**
-     *成本分摊年月总金额
+     * 成本分摊年月总金额
      *
      * @param responsibilityCode 责任中心代码
-     * @param accountCode 会计中心代码
-     * @param year 年
-     * @param month 月
-     * @param hospId 医院
+     * @param accountCode        会计中心代码
+     * @param year               年
+     * @param month              月
+     * @param hospId             医院
+     * @param departmentCode
+     * @param filter
      * @return 总金额
      */
     BigDecimal queryStartAllocationTotalAmount(@Param("responsibilityCode") String responsibilityCode,
@@ -95,4 +106,17 @@ public interface CostCostingGroupMapper extends BaseMapper<CostCostingGroup> {
     int queryAllocationCount(@Param("year") Integer year, @Param("month") Integer month, @Param("hospId") Long hospId);
 
     List<CostCostingGroup> getRealData(@Param("maxId") List<Long> maxId, @Param("hospId") Long hospId, @Param("month") Integer month, @Param("year") Integer year);
+
+
+    List<CommonDepartVo> getDepartment(@Param("year") Integer year, @Param("month") Integer month, @Param("hospId") Long hospId, @Param("departmentName")  String departmentName);
+
+    List<CostCostingGroup> selectHistoryList(@Param("hospId") Long hospId,@Param("id") Long id);
+
+    void reducingHistory(@Param("id") Long id, @Param("hospId") Long hospId,@Param("list") List<Long> list);
+
+    BigDecimal queryStartAllocationDepartmentAmount(@Param("responsibilityCode") String responsibilityCode,
+                                                    @Param("accountCode") String accountCode,
+                                                    @Param("year") Integer year,
+                                                    @Param("month") Integer month,
+                                                    @Param("hospId") Long hospId,@Param("departmentCode") String departmentCode, @Param("filter")String filter);
 }

+ 9 - 0
src/main/java/com/kcim/dao/mapper/CostIncomeGroupMapper.java

@@ -3,6 +3,7 @@ package com.kcim.dao.mapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.kcim.dao.model.CostIncomeGroup;
 import com.kcim.vo.CollectionVO;
+import com.kcim.vo.CommonDepartVo;
 import com.kcim.vo.CostIncomeGroupAllAmountBO;
 import com.kcim.vo.CostIncomeGroupAllAmountVO;
 import org.apache.ibatis.annotations.Mapper;
@@ -49,4 +50,12 @@ public interface CostIncomeGroupMapper extends BaseMapper<CostIncomeGroup> {
 
     List<CostIncomeGroupAllAmountBO> selectListAndMoney(@Param("year") Integer year, @Param("month") Integer month, @Param("hospId") Long hospId);
 
+
+    List<CommonDepartVo> getOpenDepartment(@Param("year") Integer year, @Param("month") Integer month, @Param("hospId") Long hospId,  @Param("departmentName") String departmentName);
+
+    List<CommonDepartVo> getStartDepartment(@Param("year") Integer year, @Param("month") Integer month, @Param("hospId") Long hospId, @Param("departmentName")  String departmentName);
+
+    List<CostIncomeGroup> selectHistoryList(@Param("hospId") Long hospId,@Param("id") Long id);
+
+    void reducingHistory(@Param("id") Long id,@Param("hospId") Long hospId,@Param("list") List<Long> list);
 }

+ 16 - 0
src/main/java/com/kcim/dao/mapper/FreeCostMapMapper.java

@@ -0,0 +1,16 @@
+package com.kcim.dao.mapper;
+
+import com.kcim.dao.model.FreeCostMap;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 闲置成本对照表
+ * 
+ * @author Wang.YS
+ * @date 2024-04-03 10:26:29
+ */
+@Mapper
+public interface FreeCostMapMapper extends BaseMapper<FreeCostMap> {
+	
+}

+ 17 - 0
src/main/java/com/kcim/dao/mapper/HistoryMatchMapper.java

@@ -0,0 +1,17 @@
+package com.kcim.dao.mapper;
+
+import com.kcim.dao.model.HistoryMatch;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 推荐匹配手动匹配管理
+ * 
+ * @author Wang.YS
+ * @date 2024-03-12 15:59:30
+ */
+@Mapper
+public interface HistoryMatchMapper extends BaseMapper<HistoryMatch> {
+
+    void getByFilter(String name, String code, String name1);
+}

+ 9 - 1
src/main/java/com/kcim/dao/mapper/ImportEmpCostMapper.java

@@ -3,6 +3,9 @@ package com.kcim.dao.mapper;
 import com.kcim.dao.model.ImportEmpCost;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.Date;
 
 /**
  * 人事成本数据导入
@@ -12,5 +15,10 @@ import org.apache.ibatis.annotations.Mapper;
  */
 @Mapper
 public interface ImportEmpCostMapper extends BaseMapper<ImportEmpCost> {
-	
+
+    void reducingEmpCostByFileId(@Param("computeDate") String computeDate,
+                                 @Param("hospId")Long hospId,
+                                 @Param("fileId")Long fileId,
+                                 @Param("date")Date date,
+                                 @Param("userId")String userId);
 }

+ 16 - 1
src/main/java/com/kcim/dao/mapper/ImportPatientInfoMapper.java

@@ -2,7 +2,12 @@ package com.kcim.dao.mapper;
 
 import com.kcim.dao.model.ImportPatientInfo;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.kcim.vo.CommonDepartVo;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.Date;
+import java.util.List;
 
 /**
  * 患者信息导入
@@ -12,5 +17,15 @@ import org.apache.ibatis.annotations.Mapper;
  */
 @Mapper
 public interface ImportPatientInfoMapper extends BaseMapper<ImportPatientInfo> {
-	
+
+    List<CommonDepartVo> getPatientInfoDepartment(@Param("type") Integer type,
+                                                  @Param("filter")String filter,
+                                                  @Param("computeDate")String computeDate,
+                                                  @Param("hospId") Long hospId);
+
+    void reducingPatientInfoByFileId(@Param("computeDate") String computeDate,
+                                 @Param("hospId")Long hospId,
+                                 @Param("fileId")Long fileId,
+                                 @Param("date") Date date,
+                                 @Param("userId")String userId);
 }

+ 12 - 0
src/main/java/com/kcim/dao/mapper/ImportPatientItemMapper.java

@@ -3,9 +3,11 @@ package com.kcim.dao.mapper;
 import com.kcim.dao.model.ImportPatientItem;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.kcim.dao.model.dto.PatientItemVo;
+import com.kcim.vo.PatientInfoVo;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 
+import java.util.Date;
 import java.util.List;
 
 /**
@@ -22,4 +24,14 @@ public interface ImportPatientItemMapper extends BaseMapper<ImportPatientItem> {
 
     List<PatientItemVo> getAllGroupByOrder(@Param("computeDate")String computeDate,
                                            @Param("hospId")Long hospId);
+
+    List<PatientInfoVo> getPatientItemPatientInfo(@Param("computeDate")String computeDate,
+                                                  @Param("filter")String filter,
+                                                  @Param("hospId") Long hospId);
+
+    void reducingPatientItemByFileId(@Param("computeDate") String computeDate,
+                                     @Param("hospId")Long hospId,
+                                     @Param("fileId")Long fileId,
+                                     @Param("date") Date date,
+                                     @Param("userId")String userId);
 }

+ 16 - 0
src/main/java/com/kcim/dao/mapper/ItemEmpMapMapper.java

@@ -0,0 +1,16 @@
+package com.kcim.dao.mapper;
+
+import com.kcim.dao.model.ItemEmpMap;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 医疗服务项目人员对照管理
+ * 
+ * @author Wang.YS
+ * @date 2024-01-11 17:04:42
+ */
+@Mapper
+public interface ItemEmpMapMapper extends BaseMapper<ItemEmpMap> {
+	
+}

+ 16 - 0
src/main/java/com/kcim/dao/mapper/ItemEquipmentMapMapper.java

@@ -0,0 +1,16 @@
+package com.kcim.dao.mapper;
+
+import com.kcim.dao.model.ItemEquipmentMap;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 医疗服务项目设备对照管理
+ * 
+ * @author Wang.YS
+ * @date 2024-01-11 17:04:42
+ */
+@Mapper
+public interface ItemEquipmentMapMapper extends BaseMapper<ItemEquipmentMap> {
+	
+}

+ 16 - 0
src/main/java/com/kcim/dao/mapper/ItemNoValuationDrugMaterialMapMapper.java

@@ -0,0 +1,16 @@
+package com.kcim.dao.mapper;
+
+import com.kcim.dao.model.ItemNoValuationDrugMaterialMap;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 医疗服务项目不计价药品材料对照管理
+ * 
+ * @author Wang.YS
+ * @date 2024-01-11 17:04:42
+ */
+@Mapper
+public interface ItemNoValuationDrugMaterialMapMapper extends BaseMapper<ItemNoValuationDrugMaterialMap> {
+	
+}

+ 16 - 0
src/main/java/com/kcim/dao/mapper/ItemSpaceMapMapper.java

@@ -0,0 +1,16 @@
+package com.kcim.dao.mapper;
+
+import com.kcim.dao.model.ItemSpaceMap;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 医疗服务项目空间对照管理
+ * 
+ * @author Wang.YS
+ * @date 2024-01-11 17:04:42
+ */
+@Mapper
+public interface ItemSpaceMapMapper extends BaseMapper<ItemSpaceMap> {
+	
+}

+ 16 - 0
src/main/java/com/kcim/dao/mapper/ItemValuationDrugMaterialMapMapper.java

@@ -0,0 +1,16 @@
+package com.kcim.dao.mapper;
+
+import com.kcim.dao.model.ItemValuationDrugMaterialMap;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 医疗服务项目计价药品材料对照管理
+ * 
+ * @author Wang.YS
+ * @date 2024-01-11 17:04:42
+ */
+@Mapper
+public interface ItemValuationDrugMaterialMapMapper extends BaseMapper<ItemValuationDrugMaterialMap> {
+	
+}

+ 3 - 0
src/main/java/com/kcim/dao/mapper/ResponsibilityDepartmentMapper.java

@@ -3,6 +3,7 @@ package com.kcim.dao.mapper;
 import com.kcim.dao.model.ResponsibilityDepartment;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.kcim.vo.DepartVO;
+import com.kcim.vo.ResponsibilityDepartIdVO;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 
@@ -23,4 +24,6 @@ public interface ResponsibilityDepartmentMapper extends BaseMapper<Responsibilit
      * @return
      */
     List<DepartVO> getDepartByCenterId(@Param("responsibilityId") Long responsibilityId);
+
+    List<ResponsibilityDepartIdVO> getResponsibility(@Param("hospId") Long hospId);
 }

+ 16 - 0
src/main/java/com/kcim/dao/mapper/ShareParamCostDetailMapper.java

@@ -0,0 +1,16 @@
+package com.kcim.dao.mapper;
+
+import com.kcim.dao.model.ShareParamCostDetail;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 项目成本分摊设置明细表
+ * 
+ * @author Wang.YS
+ * @date 2024-01-17 20:27:30
+ */
+@Mapper
+public interface ShareParamCostDetailMapper extends BaseMapper<ShareParamCostDetail> {
+	
+}

+ 21 - 0
src/main/java/com/kcim/dao/mapper/ShareParamCostMapper.java

@@ -0,0 +1,21 @@
+package com.kcim.dao.mapper;
+
+import com.kcim.dao.model.ShareParamCost;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.kcim.vo.ShareParamCostVo;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * 项目成本分摊设置
+ * 
+ * @author Wang.YS
+ * @date 2024-01-17 20:27:30
+ */
+@Mapper
+public interface ShareParamCostMapper extends BaseMapper<ShareParamCost> {
+
+    List<ShareParamCostVo> getParamCost(@Param("hospId") Long hospId);
+}

+ 16 - 0
src/main/java/com/kcim/dao/mapper/ShareParamTypeMapMapper.java

@@ -0,0 +1,16 @@
+package com.kcim.dao.mapper;
+
+import com.kcim.dao.model.ShareParamTypeMap;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 分摊参数来源项目对照
+ * 
+ * @author Wang.YS
+ * @date 2024-01-11 17:04:42
+ */
+@Mapper
+public interface ShareParamTypeMapMapper extends BaseMapper<ShareParamTypeMap> {
+	
+}

+ 4 - 0
src/main/java/com/kcim/dao/mapper/ShareParamValueMapper.java

@@ -44,4 +44,8 @@ public interface ShareParamValueMapper extends BaseMapper<ShareParamValue> {
     int getValuesCount(@Param("current") Integer current, @Param("pageSize") Integer pageSize, @Param("date") String date, @Param("shareParamCode") String shareParamCode, @Param("responsibilityCode") String responsibilityCode, @Param("hospId") Long hospId);
 
     List<ShareParamValue> getListByYearAndMonth(@Param("year") Integer year, @Param("month") Integer month, @Param("hospId") Long hospId);
+
+    List<ShareParamValue> selectHistoryList( @Param("hospId")Long hospId,  @Param("id")Long id);
+
+    void reducingHistory(@Param("id")Long id,  @Param("hospId")Long hospId, @Param("list")List<Long> list);
 }

+ 16 - 0
src/main/java/com/kcim/dao/mapper/SqlMapper.java

@@ -0,0 +1,16 @@
+package com.kcim.dao.mapper;
+
+import com.kcim.dao.model.Sql;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * sql定义表
+ * 
+ * @author Wang.YS
+ * @date 2024-03-18 16:13:33
+ */
+@Mapper
+public interface SqlMapper extends BaseMapper<Sql> {
+	
+}

+ 2 - 0
src/main/java/com/kcim/dao/model/AllocationQuery.java

@@ -97,4 +97,6 @@ public class AllocationQuery implements Serializable {
 	@TableLogic(value = "0",delval = "UNIX_TIMESTAMP(NOW()) * 1000")
 	private Long deleteTime;
 
+	private Integer shareType;
+
 }

+ 101 - 0
src/main/java/com/kcim/dao/model/ComputeCheckResult.java

@@ -0,0 +1,101 @@
+package com.kcim.dao.model;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+
+import java.io.Serializable;
+import java.util.Date;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+/**
+ * 异常结果详情
+ * 
+ * @author Wang.YS
+
+ * @date 2024-03-21 15:17:54
+ */
+@Data
+@Accessors(chain = true)
+@AllArgsConstructor
+@NoArgsConstructor
+@TableName("compute_check_result")
+public class ComputeCheckResult implements Serializable {
+	private static final long serialVersionUID = 1L;
+
+	/**
+	 * 主键
+	 */
+	@TableId
+	private Integer id;
+	/**
+	 * 医院id
+	 */
+	private Long hospId;
+	/**
+	 * 核算年月
+	 */
+	private String computeDate;
+	/**
+	 * 异常类型
+	 */
+	private String resultType;
+	/**
+	 * 异常类型名称
+	 */
+	private String resultTypeName;
+	/**
+	 * 异常信息
+	 */
+	private String resultMessage;
+	/**
+	 * 处理建议
+	 */
+	private String resolveAdvice;
+	/**
+	 * 处理路径
+	 */
+	private String resolvePath;
+	/**
+	 * 创建人
+	 */
+	@JsonIgnore
+	private String createUser;
+	/**
+	 * 创建时间
+	 */
+	@JsonIgnore
+	private Date createTime;
+	/**
+	 * 更新人
+	 */
+	@JsonIgnore
+	private String updateUser;
+	/**
+	 * 更新时间
+	 */
+	@JsonIgnore
+	private Date updateTime;
+	/**
+	 * 删除人
+	 */
+	@JsonIgnore
+	private String deleteUser;
+	/**
+	 * 删除时间
+	 */
+	@JsonIgnore
+	private Date deleteTime;
+	/**
+	 * 删除标志  0正常 1作废
+	 */
+	@TableLogic(value = "0",delval = "1")
+	@JsonIgnore
+	private Integer delFlag;
+
+}

+ 113 - 0
src/main/java/com/kcim/dao/model/ComputeDrugCost.java

@@ -0,0 +1,113 @@
+package com.kcim.dao.model;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+
+import java.io.Serializable;
+import java.util.Date;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+/**
+ * 药材成本计算表
+ * 
+ * @author Wang.YS
+
+ * @date 2024-01-11 19:57:43
+ */
+@Data
+@Accessors(chain = true)
+@AllArgsConstructor
+@NoArgsConstructor
+@TableName("compute_drug_cost")
+public class ComputeDrugCost implements Serializable {
+	private static final long serialVersionUID = 1L;
+
+	/**
+	 * 主键
+	 */
+	@TableId
+	private Integer id;
+	/**
+	 * 医院id
+	 */
+	private Long hospId;
+	/**
+	 * 核算年月
+	 */
+	private String computeDate;
+	/**
+	 * 就诊id
+	 */
+	private String visitNo;
+	/**
+	 * 收费项目代码
+	 */
+	private String code;
+	/**
+	 * 收费项目名称
+	 */
+	private String name;
+	/**
+	 * 项目类别代码
+	 */
+	private String itemTypeCode;
+	/**
+	 * 项目类别
+	 */
+	private String itemType;
+	/**
+	 * 医嘱代码
+	 */
+	private String orderCode;
+	/**
+	 * 医嘱名称
+	 */
+	private String orderName;
+	/**
+	 * 责任中心代码
+	 */
+	private String responsibilityCode;
+	/**
+	 * 责任中心名称
+	 */
+	private String responsibilityName;
+	/**
+	 * 创建人
+	 */
+	private String createUser;
+	/**
+	 * 创建时间
+	 */
+	private Date createTime;
+	/**
+	 * 更新人
+	 */
+	private String updateUser;
+	/**
+	 * 更新时间
+	 */
+	private Date updateTime;
+	/**
+	 * 删除人
+	 */
+	private String deleteUser;
+	/**
+	 * 删除时间
+	 */
+	private Date deleteTime;
+	/**
+	 * 删除标志  0正常 1作废
+	 */
+	@TableLogic(value = "0",delval = "1")
+	private Integer delFlag;
+
+	@TableField(exist = false)
+	private Integer index;
+
+}

+ 86 - 0
src/main/java/com/kcim/dao/model/ComputeDrugCostDetail.java

@@ -0,0 +1,86 @@
+package com.kcim.dao.model;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+
+import java.math.BigDecimal;
+import java.io.Serializable;
+import java.util.Date;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+/**
+ * 药材成本计算明细表
+ * 
+ * @author Wang.YS
+
+ * @date 2024-01-11 19:57:43
+ */
+@Data
+@Accessors(chain = true)
+@AllArgsConstructor
+@NoArgsConstructor
+@TableName("compute_drug_cost_detail")
+public class ComputeDrugCostDetail implements Serializable {
+	private static final long serialVersionUID = 1L;
+
+	/**
+	 * 主键
+	 */
+	@TableId
+	private Integer id;
+	/**
+	 * 医院id
+	 */
+	private Long hospId;
+	/**
+	 * 收费项目成本主键
+	 */
+	private Integer drugCostId;
+	/**
+	 * 报表项目类别
+	 */
+	private String type;
+	/**
+	 * 计算结果
+	 */
+	private BigDecimal computeResult;
+	/**
+	 * 创建人
+	 */
+	private String createUser;
+	/**
+	 * 创建时间
+	 */
+	private Date createTime;
+	/**
+	 * 更新人
+	 */
+	private String updateUser;
+	/**
+	 * 更新时间
+	 */
+	private Date updateTime;
+	/**
+	 * 删除人
+	 */
+	private String deleteUser;
+	/**
+	 * 删除时间
+	 */
+	private Date deleteTime;
+	/**
+	 * 删除标志  0正常 1作废
+	 */
+	@TableLogic(value = "0",delval = "1")
+	private Integer delFlag;
+
+	@TableField(exist = false)
+	private Integer index;
+
+}

+ 5 - 5
src/main/java/com/kcim/dao/model/ComputeItemCost.java

@@ -1,11 +1,9 @@
 package com.kcim.dao.model;
 
-import com.baomidou.mybatisplus.annotation.TableField;
-import com.baomidou.mybatisplus.annotation.TableId;
-import com.baomidou.mybatisplus.annotation.TableLogic;
-import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.*;
 
 import java.io.Serializable;
+import java.math.BigDecimal;
 import java.util.Date;
 
 import com.fasterxml.jackson.annotation.JsonIgnore;
@@ -32,7 +30,7 @@ public class ComputeItemCost implements Serializable {
 	/**
 	 * 主键
 	 */
-	@TableId
+	@TableId(type = IdType.AUTO)
 	private Integer id;
 	/**
 	 * 医院id
@@ -110,4 +108,6 @@ public class ComputeItemCost implements Serializable {
 	@TableField(exist = false)
 	private Integer index;
 
+	private BigDecimal num;
+
 }

+ 3 - 5
src/main/java/com/kcim/dao/model/ComputeItemCostDetail.java

@@ -1,9 +1,6 @@
 package com.kcim.dao.model;
 
-import com.baomidou.mybatisplus.annotation.TableField;
-import com.baomidou.mybatisplus.annotation.TableId;
-import com.baomidou.mybatisplus.annotation.TableLogic;
-import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.*;
 
 import java.math.BigDecimal;
 import java.io.Serializable;
@@ -33,7 +30,7 @@ public class ComputeItemCostDetail implements Serializable {
 	/**
 	 * 主键
 	 */
-	@TableId
+	@TableId(type = IdType.AUTO)
 	private Integer id;
 	/**
 	 * 医院id
@@ -91,4 +88,5 @@ public class ComputeItemCostDetail implements Serializable {
 	@TableField(exist = false)
 	private Integer index;
 
+	private BigDecimal computeSingleResult;
 }

+ 110 - 0
src/main/java/com/kcim/dao/model/ComputeProjectCost.java

@@ -0,0 +1,110 @@
+package com.kcim.dao.model;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+
+import java.io.Serializable;
+import java.util.Date;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+/**
+ * 完全成本法项目成本计算表
+ * 
+ * @author Wang.YS
+
+ * @date 2024-01-15 20:23:56
+ */
+@Data
+@Accessors(chain = true)
+@AllArgsConstructor
+@NoArgsConstructor
+@TableName("compute_project_cost")
+public class ComputeProjectCost implements Serializable {
+	private static final long serialVersionUID = 1L;
+
+	/**
+	 * 主键
+	 */
+	@TableId
+	private Integer id;
+	/**
+	 * 医院id
+	 */
+	private Long hospId;
+	/**
+	 * 核算年月
+	 */
+	private String computeDate;
+	/**
+	 * 就诊id
+	 */
+	private String visitNo;
+	/**
+	 * 收费项目代码
+	 */
+	private String code;
+	/**
+	 * 收费项目名称
+	 */
+	private String name;
+	/**
+	 * 项目分类
+	 */
+	private String itemType;
+	/**
+	 * 医嘱代码
+	 */
+	private String orderCode;
+	/**
+	 * 医嘱名称
+	 */
+	private String orderName;
+	/**
+	 * 责任中心代码
+	 */
+	private String responsibilityCode;
+	/**
+	 * 责任中心名称
+	 */
+	private String responsibilityName;
+	/**
+	 * 创建人
+	 */
+	private String createUser;
+	/**
+	 * 创建时间
+	 */
+	private Date createTime;
+	/**
+	 * 更新人
+	 */
+	private String updateUser;
+	/**
+	 * 更新时间
+	 */
+	private Date updateTime;
+	/**
+	 * 删除人
+	 */
+	private String deleteUser;
+	/**
+	 * 删除时间
+	 */
+	private Date deleteTime;
+	/**
+	 * 删除标志  0正常 1作废
+	 */
+	@TableLogic(value = "0",delval = "1")
+	private Integer delFlag;
+
+	@TableField(exist = false)
+	private Integer index;
+
+
+}

+ 99 - 0
src/main/java/com/kcim/dao/model/ComputeProjectCostDetail.java

@@ -0,0 +1,99 @@
+package com.kcim.dao.model;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+
+import java.math.BigDecimal;
+import java.io.Serializable;
+import java.util.Date;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+/**
+ * 完全成本法项目成本计算明细表
+ * 
+ * @author Wang.YS
+
+ * @date 2024-01-15 20:23:56
+ */
+@Data
+@Accessors(chain = true)
+@AllArgsConstructor
+@NoArgsConstructor
+@TableName("compute_project_cost_detail")
+public class ComputeProjectCostDetail implements Serializable {
+	private static final long serialVersionUID = 1L;
+
+	/**
+	 * 主键
+	 */
+	@TableId
+	private Integer id;
+	/**
+	 * 医院id
+	 */
+	private Long hospId;
+	/**
+	 * 核算年月
+	 */
+	private String computeDate;
+	/**
+	 * 项目成本主键
+	 */
+	private Integer projectCostId;
+	/**
+	 * 项目成本列代码
+	 */
+	private String costColumnCode;
+
+	/**
+	 * 项目成本列类型
+	 */
+	private String costColumnType;
+
+	/**
+	 * 计算结果
+	 */
+	private BigDecimal computeResult;
+
+
+	/**
+	 * 创建人
+	 */
+	private String createUser;
+	/**
+	 * 创建时间
+	 */
+	private Date createTime;
+	/**
+	 * 更新人
+	 */
+	private String updateUser;
+	/**
+	 * 更新时间
+	 */
+	private Date updateTime;
+	/**
+	 * 删除人
+	 */
+	private String deleteUser;
+	/**
+	 * 删除时间
+	 */
+	private Date deleteTime;
+	/**
+	 * 删除标志  0正常 1作废
+	 */
+	@TableLogic(value = "0",delval = "1")
+	private Integer delFlag;
+
+	@TableField(exist = false)
+	private Integer index;
+
+	private BigDecimal computeSingleResult;
+}

+ 88 - 0
src/main/java/com/kcim/dao/model/ComputeProjectGroupCostDetail.java

@@ -0,0 +1,88 @@
+package com.kcim.dao.model;
+
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 完全成本法项目成本计算汇总明细表
+ * 
+ * @author Wang.YS
+
+ * @date 2024-01-19 15:53:57
+ */
+@Data
+@Accessors(chain = true)
+@AllArgsConstructor
+@NoArgsConstructor
+@TableName("compute_project_group_cost_detail")
+public class ComputeProjectGroupCostDetail implements Serializable {
+	private static final long serialVersionUID = 1L;
+
+	/**
+	 * 主键
+	 */
+	@TableId
+	private Integer id;
+	/**
+	 * 医院id
+	 */
+	private Long hospId;
+
+	private String computeDate;
+	/**
+	 * 项目成本主键
+	 */
+	private Integer projectCostId;
+	/**
+	 * 报表项目类别
+	 */
+	private String type;
+	/**
+	 * 计算结果
+	 */
+	private BigDecimal computeResult;
+	/**
+	 * 创建人
+	 */
+	private String createUser;
+	/**
+	 * 创建时间
+	 */
+	private Date createTime;
+	/**
+	 * 更新人
+	 */
+	private String updateUser;
+	/**
+	 * 更新时间
+	 */
+	private Date updateTime;
+	/**
+	 * 删除人
+	 */
+	private String deleteUser;
+	/**
+	 * 删除时间
+	 */
+	private Date deleteTime;
+	/**
+	 * 删除标志  0正常 1作废
+	 */
+	@TableLogic(value = "0",delval = "1")
+	private Integer delFlag;
+
+
+	@TableField(exist = false)
+	private Integer index;
+
+	private BigDecimal computeSingleResult;
+
+
+}

+ 113 - 0
src/main/java/com/kcim/dao/model/ComputeShareParam.java

@@ -0,0 +1,113 @@
+package com.kcim.dao.model;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+/**
+ * 项目分摊参数计算表
+ * 
+ * @author Wang.YS
+
+ * @date 2024-01-15 20:23:56
+ */
+@Data
+@Accessors(chain = true)
+@AllArgsConstructor
+@NoArgsConstructor
+@TableName("compute_share_param")
+public class ComputeShareParam implements Serializable {
+	private static final long serialVersionUID = 1L;
+
+	/**
+	 * 主键
+	 */
+	@TableId
+	private Integer id;
+	/**
+	 * 医院id
+	 */
+	private Long hospId;
+	/**
+	 * 核算年月
+	 */
+	private String computeDate;
+	/**
+	 * 就诊id
+	 */
+	private String visitNo;
+	/**
+	 * 收费项目代码
+	 */
+	private String code;
+	/**
+	 * 收费项目名称
+	 */
+	private String name;
+	/**
+	 * 项目分类
+	 */
+	private String itemType;
+	/**
+	 * 医嘱代码
+	 */
+	private String orderCode;
+	/**
+	 * 医嘱名称
+	 */
+	private String orderName;
+	/**
+	 * 责任中心代码
+	 */
+	private String responsibilityCode;
+	/**
+	 * 责任中心名称
+	 */
+	private String responsibilityName;
+	/**
+	 * 创建人
+	 */
+	private String createUser;
+	/**
+	 * 创建时间
+	 */
+	private Date createTime;
+	/**
+	 * 更新人
+	 */
+	private String updateUser;
+	/**
+	 * 更新时间
+	 */
+	private Date updateTime;
+	/**
+	 * 删除人
+	 */
+	private String deleteUser;
+	/**
+	 * 删除时间
+	 */
+	private Date deleteTime;
+	/**
+	 * 删除标志  0正常 1作废
+	 */
+	@TableLogic(value = "0",delval = "1")
+	private Integer delFlag;
+
+	@TableField(exist = false)
+	private Integer index;
+
+	private BigDecimal num;
+
+
+}

+ 92 - 0
src/main/java/com/kcim/dao/model/ComputeShareParamDetail.java

@@ -0,0 +1,92 @@
+package com.kcim.dao.model;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+
+import java.math.BigDecimal;
+import java.io.Serializable;
+import java.util.Date;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+/**
+ * 项目分摊参数计算明细表
+ * 
+ * @author Wang.YS
+
+ * @date 2024-01-15 20:23:56
+ */
+@Data
+@Accessors(chain = true)
+@AllArgsConstructor
+@NoArgsConstructor
+@TableName("compute_share_param_detail")
+public class ComputeShareParamDetail implements Serializable {
+	private static final long serialVersionUID = 1L;
+
+	/**
+	 * 主键
+	 */
+	@TableId
+	private Integer id;
+	/**
+	 * 医院id
+	 */
+	private Long hospId;
+	/**
+	 * 核算年月
+	 */
+	private String computeDate;
+	/**
+	 * 项目成本主键
+	 */
+	private Integer shareParamId;
+	/**
+	 * 报表项目类别
+	 */
+	private String shareParamCode;
+	/**
+	 * 计算结果
+	 */
+	private BigDecimal computeResult;
+	/**
+	 * 创建人
+	 */
+	private String createUser;
+	/**
+	 * 创建时间
+	 */
+	private Date createTime;
+	/**
+	 * 更新人
+	 */
+	private String updateUser;
+	/**
+	 * 更新时间
+	 */
+	private Date updateTime;
+	/**
+	 * 删除人
+	 */
+	private String deleteUser;
+	/**
+	 * 删除时间
+	 */
+	private Date deleteTime;
+	/**
+	 * 删除标志  0正常 1作废
+	 */
+	@TableLogic(value = "0",delval = "1")
+	private Integer delFlag;
+
+	@TableField(exist = false)
+	private Integer index;
+
+	private BigDecimal computeSingleResult;
+
+}

+ 6 - 0
src/main/java/com/kcim/dao/model/CostCostingGroup.java

@@ -105,4 +105,10 @@ public class CostCostingGroup implements Serializable {
 	@TableLogic(value = "0",delval = "UNIX_TIMESTAMP(NOW()) * 1000")
 	private Long deleteTime;
 
+	private Integer computeType;
+
+	private Long computeConnectId;
+
+	private BigDecimal rate;
+
 }

+ 12 - 0
src/main/java/com/kcim/dao/model/CostDepartmentProfit.java

@@ -1,5 +1,6 @@
 package com.kcim.dao.model;
 
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableLogic;
 import com.baomidou.mybatisplus.annotation.TableName;
@@ -71,6 +72,13 @@ public class CostDepartmentProfit implements Serializable {
 	 * 责任中心名称
 	 */
 	private String responsibilityName;
+	/**
+	 * 父类责任中心名称
+	 */
+	@TableField(exist = false)
+	private String parentResponsibilityCode;
+	@TableField(exist = false)
+	private String parentResponsibilityName;
 	/**
 	 * 成本类型
 	 */
@@ -97,4 +105,8 @@ public class CostDepartmentProfit implements Serializable {
 	@TableLogic(value = "0",delval = "UNIX_TIMESTAMP(NOW()) * 1000")
 	private Long deleteTime;
 
+	private Integer shareType;
+
+	private BigDecimal percent;
+
 }

+ 4 - 0
src/main/java/com/kcim/dao/model/CostReportColumn.java

@@ -65,6 +65,10 @@ public class CostReportColumn implements Serializable {
 	 * 是否冻结 1是 0否
 	 */
 	private Integer freeze;
+	/**
+	 * 是否检索 1是 0否
+	 */
+	private Integer search;
 	/**
 	 * 排序
 	 */

+ 2 - 1
src/main/java/com/kcim/dao/model/CostShareParam.java

@@ -20,7 +20,8 @@ import java.io.Serializable;
 @AllArgsConstructor
 @NoArgsConstructor
 @TableName("cost_share_param")
-public class CostShareParam implements Serializable {
+public class
+CostShareParam implements Serializable {
 	private static final long serialVersionUID = 1L;
 
 	/**

+ 109 - 0
src/main/java/com/kcim/dao/model/FreeCostMap.java

@@ -0,0 +1,109 @@
+package com.kcim.dao.model;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+
+import java.io.Serializable;
+import java.util.Date;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+/**
+ * 闲置成本对照表
+ * 
+ * @author Wang.YS
+
+ * @date 2024-04-03 10:26:29
+ */
+@Data
+@Accessors(chain = true)
+@AllArgsConstructor
+@NoArgsConstructor
+@TableName("com_free_cost_map")
+public class FreeCostMap implements Serializable {
+	private static final long serialVersionUID = 1L;
+
+	/**
+	 * 主键
+	 */
+	@TableId
+	private Integer id;
+	/**
+	 * 医院id
+	 */
+	private Long hospId;
+	/**
+	 * 闲置成本代码
+	 */
+	private String freeAccountCode;
+	/**
+	 * 闲置成本名称
+	 */
+	private String freeAccountName;
+	/**
+	 * 成本代码
+	 */
+	private String accountCode;
+	/**
+	 * 成本名称
+	 */
+	private String accountName;
+	/**
+	 * 可检查时间参数代码
+	 */
+	private String canParamCode;
+	/**
+	 * 可检查时间参数名称
+	 */
+	private String canParamName;
+	/**
+	 * 实际检查时间参数代码
+	 */
+	private String actualParamCode;
+	/**
+	 * 实际检查时间参数名称
+	 */
+	private String actualParamName;
+	/**
+	 * 创建人
+	 */
+	@JsonIgnore
+	private String createUser;
+	/**
+	 * 创建时间
+	 */
+	@JsonIgnore
+	private Date createTime;
+	/**
+	 * 更新人
+	 */
+	@JsonIgnore
+	private String updateUser;
+	/**
+	 * 更新时间
+	 */
+	@JsonIgnore
+	private Date updateTime;
+	/**
+	 * 删除人
+	 */
+	@JsonIgnore
+	private String deleteUser;
+	/**
+	 * 删除时间
+	 */
+	@JsonIgnore
+	private Date deleteTime;
+	/**
+	 * 删除标志  0正常 1作废
+	 */
+	@TableLogic(value = "0",delval = "1")
+	@JsonIgnore
+	private Integer delFlag;
+
+}

+ 118 - 0
src/main/java/com/kcim/dao/model/HistoryMatch.java

@@ -0,0 +1,118 @@
+package com.kcim.dao.model;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+
+import java.io.Serializable;
+import java.util.Date;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+/**
+ * 推荐匹配手动匹配管理
+ * 
+ * @author Wang.YS
+
+ * @date 2024-03-12 15:59:30
+ */
+@Data
+@Accessors(chain = true)
+@AllArgsConstructor
+@NoArgsConstructor
+@TableName("com_history_match")
+public class HistoryMatch implements Serializable {
+	private static final long serialVersionUID = 1L;
+
+	/**
+	 * 主键
+	 */
+	@TableId
+	private Integer id;
+	/**
+	 * 医院id
+	 */
+	private Long hospId;
+	/**
+	 * 历史匹配类型 ITEM_MATCH 医疗服务项目匹配
+	 */
+	private String matchType;
+	/**
+	 * 收费项目代码
+	 */
+	private String code;
+	/**
+	 * 收费项目名称
+	 */
+	private String name;
+	/**
+	 * 康程分类代码
+	 */
+	private String kcCode;
+	/**
+	 * 标准项目代码
+	 */
+	private String standItemCode;
+	/**
+	 * 标准项目名称
+	 */
+	private String standItemName;
+	/**
+	 * 对照类型 1 手动匹配 2智能推荐
+	 */
+	private Integer type;
+	/**
+	 * 创建人
+	 */
+	@JsonIgnore
+	private String createUser;
+	/**
+	 * 创建时间
+	 */
+	@JsonIgnore
+	private Date createTime;
+	/**
+	 * 更新人
+	 */
+	@JsonIgnore
+	private String updateUser;
+	/**
+	 * 更新时间
+	 */
+	@JsonIgnore
+	private Date updateTime;
+	/**
+	 * 删除人
+	 */
+	@JsonIgnore
+	private String deleteUser;
+	/**
+	 * 删除时间
+	 */
+	@JsonIgnore
+	private Date deleteTime;
+	/**
+	 * 删除标志  0正常 1作废
+	 */
+	@JsonIgnore
+	@TableLogic(value = "0",delval = "1")
+	private Integer delFlag;
+
+	@TableField(exist = false)
+	private Double percent;
+
+	@TableField(exist = false)
+	private String percentDisplay;
+
+	@TableField(exist = false)
+	private Integer historyFlag;
+
+	@TableField(exist = false)
+	private String historyName;
+
+}

+ 16 - 0
src/main/java/com/kcim/dao/model/HospProfitAndLoss.java

@@ -1,5 +1,6 @@
 package com.kcim.dao.model;
 
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableLogic;
 import com.baomidou.mybatisplus.annotation.TableName;
@@ -79,4 +80,19 @@ public class HospProfitAndLoss implements Serializable {
     @TableLogic(value = "0", delval = "UNIX_TIMESTAMP(NOW()) * 1000")
     private Long deleteTime;
 
+    private BigDecimal percent;
+
+    @TableField(exist = false)
+    private Integer type;
+
+    @TableField(exist = false)
+    private Integer fraction;
+
+    /**
+     * 父类责任中心名称
+     */
+    @TableField(exist = false)
+    private String parentResponsibilityCode;
+    @TableField(exist = false)
+    private String parentResponsibilityName;
 }

+ 2 - 0
src/main/java/com/kcim/dao/model/ImportEmpCost.java

@@ -100,4 +100,6 @@ public class ImportEmpCost implements Serializable {
 	@JsonIgnore
 	private Integer delFlag;
 
+	private Long fileId;
+
 }

+ 3 - 0
src/main/java/com/kcim/dao/model/ImportPatientInfo.java

@@ -187,4 +187,7 @@ public class ImportPatientInfo implements Serializable {
 	@TableLogic(value = "0",delval = "1")
 	private Integer delFlag;
 
+
+	private Long fileId;
+
 }

+ 4 - 0
src/main/java/com/kcim/dao/model/ImportPatientItem.java

@@ -163,4 +163,8 @@ public class ImportPatientItem implements Serializable {
 	@TableLogic(value = "0",delval = "1")
 	private Integer delFlag;
 
+	private Integer calculateFlag;
+
+	private Long fileId;
+
 }

+ 44 - 0
src/main/java/com/kcim/dao/model/Item.java

@@ -8,6 +8,7 @@ import com.baomidou.mybatisplus.annotation.TableName;
 import java.io.Serializable;
 import java.math.BigDecimal;
 import java.util.Date;
+import java.util.List;
 
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import lombok.AllArgsConstructor;
@@ -51,6 +52,12 @@ public class Item implements Serializable {
 	 * 收费项目类别
 	 */
 	private String type;
+	/**
+	 *项目分类 公用字典:医疗服务项目分类
+	 */
+	private String itemType;
+	@TableField(exist = false)
+	private String itemTypeName;
 	/**
 	 * 康程分类代码
 	 */
@@ -114,4 +121,41 @@ public class Item implements Serializable {
 	@JsonIgnore
 	private Integer delFlag;
 
+	/**
+	 * 人员对照信息
+	 */
+	@TableField(exist = false)
+	private List<ItemEmpMap> empMaps;
+	/**
+	 * 设备对照信息
+	 */
+	@TableField(exist = false)
+	private List<ItemEquipmentMap> equipmentMaps;
+	/**
+	 * 空间对照信息
+	 */
+	@TableField(exist = false)
+	private List<ItemSpaceMap> spaceMaps;
+
+	/**
+	 * 不计价材料
+	 */
+	@TableField(exist = false)
+	private List<ItemNoValuationDrugMaterialMap> noValuation;
+
+	/**
+	 * 计价材料
+	 */
+	@TableField(exist = false)
+	private List<ItemValuationDrugMaterialMap> valuation;
+
+	@TableField(exist = false)
+	private boolean match;
+
+	@TableField(exist = false)
+	private Double percent;
+
+	@TableField(exist = false)
+	private String percentDisplay;
+
 }

+ 97 - 0
src/main/java/com/kcim/dao/model/ItemEmpMap.java

@@ -0,0 +1,97 @@
+package com.kcim.dao.model;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+
+import java.math.BigDecimal;
+import java.io.Serializable;
+import java.util.Date;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+/**
+ * 医疗服务项目人员对照管理
+ * 
+ * @author Wang.YS
+
+ * @date 2024-01-11 17:04:42
+ */
+@Data
+@Accessors(chain = true)
+@AllArgsConstructor
+@NoArgsConstructor
+@TableName("com_item_emp_map")
+public class ItemEmpMap implements Serializable {
+	private static final long serialVersionUID = 1L;
+
+	/**
+	 * 主键
+	 */
+	@TableId
+	private Integer id;
+	/**
+	 * 医院id
+	 */
+	private Long hospId;
+	/**
+	 * 医疗服务项目代码
+	 */
+	private String itemCode;
+	/**
+	 * 人员类别
+	 */
+	private String empTypeCode;
+	@TableField(exist = false)
+	private String empTypeCodeName;
+	/**
+	 * 数量
+	 */
+	private Integer num;
+	/**
+	 * 执行时间(m)
+	 */
+	private BigDecimal executeTime;
+	/**
+	 * 创建人
+	 */
+	@JsonIgnore
+	private String createUser;
+	/**
+	 * 创建时间
+	 */
+	@JsonIgnore
+	private Date createTime;
+	/**
+	 * 更新人
+	 */
+	@JsonIgnore
+	private String updateUser;
+	/**
+	 * 更新时间
+	 */
+	@JsonIgnore
+	private Date updateTime;
+	/**
+	 * 删除人
+	 */
+	@JsonIgnore
+	private String deleteUser;
+	/**
+	 * 删除时间
+	 */
+	@JsonIgnore
+	private Date deleteTime;
+	/**
+	 * 删除标志  0正常 1作废
+	 */
+	@TableLogic(value = "0",delval = "1")
+	@JsonIgnore
+	private Integer delFlag;
+
+}

+ 98 - 0
src/main/java/com/kcim/dao/model/ItemEquipmentMap.java

@@ -0,0 +1,98 @@
+package com.kcim.dao.model;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+
+import java.math.BigDecimal;
+import java.io.Serializable;
+import java.util.Date;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+/**
+ * 医疗服务项目设备对照管理
+ * 
+ * @author Wang.YS
+
+ * @date 2024-01-11 17:04:42
+ */
+@Data
+@Accessors(chain = true)
+@AllArgsConstructor
+@NoArgsConstructor
+@TableName("com_item_equipment_map")
+public class ItemEquipmentMap implements Serializable {
+	private static final long serialVersionUID = 1L;
+
+	/**
+	 * 主键
+	 */
+	@TableId
+	private Integer id;
+	/**
+	 * 医院id
+	 */
+	private Long hospId;
+	/**
+	 * 医疗服务项目代码
+	 */
+	private String itemCode;
+	/**
+	 * 设备编码
+	 */
+	private String equipmentCode;
+
+	@TableField(exist = false)
+	private String equipmentCodeName;
+	/**
+	 * 数量
+	 */
+	private Integer num;
+	/**
+	 * 执行时间(m)
+	 */
+	private BigDecimal executeTime;
+	/**
+	 * 创建人
+	 */
+	@JsonIgnore
+	private String createUser;
+	/**
+	 * 创建时间
+	 */
+	@JsonIgnore
+	private Date createTime;
+	/**
+	 * 更新人
+	 */
+	@JsonIgnore
+	private String updateUser;
+	/**
+	 * 更新时间
+	 */
+	@JsonIgnore
+	private Date updateTime;
+	/**
+	 * 删除人
+	 */
+	@JsonIgnore
+	private String deleteUser;
+	/**
+	 * 删除时间
+	 */
+	@JsonIgnore
+	private Date deleteTime;
+	/**
+	 * 删除标志  0正常 1作废
+	 */
+	@TableLogic(value = "0",delval = "1")
+	@JsonIgnore
+	private Integer delFlag;
+
+}

+ 100 - 0
src/main/java/com/kcim/dao/model/ItemNoValuationDrugMaterialMap.java

@@ -0,0 +1,100 @@
+package com.kcim.dao.model;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+
+import java.io.Serializable;
+import java.util.Date;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+/**
+ * 医疗服务项目不计价药品材料对照管理
+ * 
+ * @author Wang.YS
+
+ * @date 2024-01-11 17:04:42
+ */
+@Data
+@Accessors(chain = true)
+@AllArgsConstructor
+@NoArgsConstructor
+@TableName("com_item_no_valuation_drug_material_map")
+public class ItemNoValuationDrugMaterialMap implements Serializable {
+	private static final long serialVersionUID = 1L;
+
+	/**
+	 * 主键
+	 */
+	@TableId
+	private Integer id;
+	/**
+	 * 医院id
+	 */
+	private Long hospId;
+	/**
+	 * 医疗服务项目代码
+	 */
+	private String itemCode;
+	/**
+	 * 项目代码
+	 */
+	private String code;
+	/**
+	 * 项目名称
+	 */
+	private String name;
+	/**
+	 * 项目类别 1药品 2 材料
+	 */
+	private Integer type;
+	@TableField(exist = false)
+	private String typeName;
+	/**
+	 * 数量
+	 */
+	private Integer num;
+	/**
+	 * 创建人
+	 */
+	@JsonIgnore
+	private String createUser;
+	/**
+	 * 创建时间
+	 */
+	@JsonIgnore
+	private Date createTime;
+	/**
+	 * 更新人
+	 */
+	@JsonIgnore
+	private String updateUser;
+	/**
+	 * 更新时间
+	 */
+	@JsonIgnore
+	private Date updateTime;
+	/**
+	 * 删除人
+	 */
+	@JsonIgnore
+	private String deleteUser;
+	/**
+	 * 删除时间
+	 */
+	@JsonIgnore
+	private Date deleteTime;
+	/**
+	 * 删除标志  0正常 1作废
+	 */
+	@TableLogic(value = "0",delval = "1")
+	@JsonIgnore
+	private Integer delFlag;
+
+}

+ 101 - 0
src/main/java/com/kcim/dao/model/ItemSpaceMap.java

@@ -0,0 +1,101 @@
+package com.kcim.dao.model;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+
+import java.math.BigDecimal;
+import java.io.Serializable;
+import java.util.Date;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+/**
+ * 医疗服务项目空间对照管理
+ * 
+ * @author Wang.YS
+
+ * @date 2024-01-11 17:04:42
+ */
+@Data
+@Accessors(chain = true)
+@AllArgsConstructor
+@NoArgsConstructor
+@TableName("com_item_space_map")
+public class ItemSpaceMap implements Serializable {
+	private static final long serialVersionUID = 1L;
+
+	/**
+	 * 主键
+	 */
+	@TableId
+	private Integer id;
+	/**
+	 * 医院id
+	 */
+	private Long hospId;
+	/**
+	 * 医疗服务项目代码
+	 */
+	private String itemCode;
+	/**
+	 * 设备编码
+	 */
+	private String spaceCode;
+	@TableField(exist = false)
+	private String spaceCodeName;
+	/**
+	 * 设备编码路径
+	 */
+	private String spaceCodePath;
+	/**
+	 * 数量
+	 */
+	private Integer num;
+	/**
+	 * 执行时间(m)
+	 */
+	private BigDecimal executeTime;
+	/**
+	 * 创建人
+	 */
+	@JsonIgnore
+	private String createUser;
+	/**
+	 * 创建时间
+	 */
+	@JsonIgnore
+	private Date createTime;
+	/**
+	 * 更新人
+	 */
+	@JsonIgnore
+	private String updateUser;
+	/**
+	 * 更新时间
+	 */
+	@JsonIgnore
+	private Date updateTime;
+	/**
+	 * 删除人
+	 */
+	@JsonIgnore
+	private String deleteUser;
+	/**
+	 * 删除时间
+	 */
+	@JsonIgnore
+	private Date deleteTime;
+	/**
+	 * 删除标志  0正常 1作废
+	 */
+	@TableLogic(value = "0",delval = "1")
+	@JsonIgnore
+	private Integer delFlag;
+
+}

+ 100 - 0
src/main/java/com/kcim/dao/model/ItemValuationDrugMaterialMap.java

@@ -0,0 +1,100 @@
+package com.kcim.dao.model;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+
+import java.io.Serializable;
+import java.util.Date;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+/**
+ * 医疗服务项目计价药品材料对照管理
+ * 
+ * @author Wang.YS
+
+ * @date 2024-01-11 17:04:42
+ */
+@Data
+@Accessors(chain = true)
+@AllArgsConstructor
+@NoArgsConstructor
+@TableName("com_item_valuation_drug_material_map")
+public class ItemValuationDrugMaterialMap implements Serializable {
+	private static final long serialVersionUID = 1L;
+
+	/**
+	 * 主键
+	 */
+	@TableId
+	private Integer id;
+	/**
+	 * 医院id
+	 */
+	private Long hospId;
+	/**
+	 * 医疗服务项目代码
+	 */
+	private String itemCode;
+	/**
+	 * 项目代码
+	 */
+	private String code;
+	/**
+	 * 项目名称
+	 */
+	private String name;
+	/**
+	 * 项目类别 1药品 2 材料
+	 */
+	private Integer type;
+	@TableField(exist = false)
+	private String typeName;
+	/**
+	 * 数量
+	 */
+	private Integer num;
+	/**
+	 * 创建人
+	 */
+	@JsonIgnore
+	private String createUser;
+	/**
+	 * 创建时间
+	 */
+	@JsonIgnore
+	private Date createTime;
+	/**
+	 * 更新人
+	 */
+	@JsonIgnore
+	private String updateUser;
+	/**
+	 * 更新时间
+	 */
+	@JsonIgnore
+	private Date updateTime;
+	/**
+	 * 删除人
+	 */
+	@JsonIgnore
+	private String deleteUser;
+	/**
+	 * 删除时间
+	 */
+	@JsonIgnore
+	private Date deleteTime;
+	/**
+	 * 删除标志  0正常 1作废
+	 */
+	@TableLogic(value = "0",delval = "1")
+	@JsonIgnore
+	private Integer delFlag;
+
+}

+ 3 - 0
src/main/java/com/kcim/dao/model/ReportForm.java

@@ -89,5 +89,8 @@ public class ReportForm implements Serializable {
     @TableLogic(value = "0", delval = "UNIX_TIMESTAMP(NOW()) * 1000")
     private Long deleteTime;
 
+    private Integer costType;
+
+    private Integer fraction;
 
 }

+ 115 - 0
src/main/java/com/kcim/dao/model/ShareParamCost.java

@@ -0,0 +1,115 @@
+package com.kcim.dao.model;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+
+import java.io.Serializable;
+import java.util.Date;
+import java.util.List;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+/**
+ * 项目成本分摊设置
+ * 
+ * @author Wang.YS
+
+ * @date 2024-01-17 20:27:30
+ */
+@Data
+@Accessors(chain = true)
+@AllArgsConstructor
+@NoArgsConstructor
+@TableName("com_share_param_cost")
+public class ShareParamCost implements Serializable {
+	private static final long serialVersionUID = 1L;
+
+	/**
+	 * 主键
+	 */
+	@TableId
+	private Integer id;
+	/**
+	 * 医院id
+	 */
+	private Long hospId;
+	/**
+	 * 项目列代码
+	 */
+	private String columnCode;
+	/**
+	 * 项目列名称
+	 */
+	private String columnName;
+	/**
+	 * 项目列类型
+	 */
+	private String columnType;
+	/**
+	 * 项目列类型名称
+	 */
+	private String columnTypeName;
+	/**
+	 * 损益表id
+	 */
+	private String profitId;
+	/**
+	 * 损益表num
+	 */
+	private String profitNum;
+	/**
+	 * 损益表项目名称
+	 */
+	private String profitName;
+	/**
+	 * 损益表级连回显
+	 */
+	private String profitPath;
+	/**
+	 * 创建人
+	 */
+	@JsonIgnore
+	private String createUser;
+	/**
+	 * 创建时间
+	 */
+	@JsonIgnore
+	private Date createTime;
+	/**
+	 * 更新人
+	 */
+	@JsonIgnore
+	private String updateUser;
+	/**
+	 * 更新时间
+	 */
+	@JsonIgnore
+	private Date updateTime;
+	/**
+	 * 删除人
+	 */
+	@JsonIgnore
+	private String deleteUser;
+	/**
+	 * 删除时间
+	 */
+	@JsonIgnore
+	private Date deleteTime;
+	/**
+	 * 删除标志  0正常 1作废
+	 */
+	@JsonIgnore
+	@TableLogic(value = "0",delval = "1")
+	private Integer delFlag;
+	@TableField(exist = false)
+	private List<ShareParamCostDetail> shareParamCostDetails;
+
+	private String profitPathName;
+
+}

+ 94 - 0
src/main/java/com/kcim/dao/model/ShareParamCostDetail.java

@@ -0,0 +1,94 @@
+package com.kcim.dao.model;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+
+import java.math.BigDecimal;
+import java.io.Serializable;
+import java.util.Date;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+/**
+ * 项目成本分摊设置明细表
+ * 
+ * @author Wang.YS
+
+ * @date 2024-01-17 20:27:30
+ */
+@Data
+@Accessors(chain = true)
+@AllArgsConstructor
+@NoArgsConstructor
+@TableName("com_share_param_cost_detail")
+public class ShareParamCostDetail implements Serializable {
+	private static final long serialVersionUID = 1L;
+
+	/**
+	 * 主键
+	 */
+	@TableId
+	private Integer id;
+	/**
+	 * 医院id
+	 */
+	private Long hospId;
+	/**
+	 * 成本分摊项目列代码
+	 */
+	private String shareParamColumnCode;
+	/**
+	 * 分摊参数代码
+	 */
+	private String shareParamCode;
+	/**
+	 * 分摊参数名称
+	 */
+	private String shareParamName;
+	/**
+	 * 占比
+	 */
+	private BigDecimal percent;
+	/**
+	 * 创建人
+	 */
+	@JsonIgnore
+	private String createUser;
+	/**
+	 * 创建时间
+	 */
+	@JsonIgnore
+	private Date createTime;
+	/**
+	 * 更新人
+	 */
+	@JsonIgnore
+	private String updateUser;
+	/**
+	 * 更新时间
+	 */
+	@JsonIgnore
+	private Date updateTime;
+	/**
+	 * 删除人
+	 */
+	@JsonIgnore
+	private String deleteUser;
+	/**
+	 * 删除时间
+	 */
+	@JsonIgnore
+	private Date deleteTime;
+	/**
+	 * 删除标志  0正常 1作废
+	 */
+	@JsonIgnore
+	@TableLogic(value = "0",delval = "1")
+	private Integer delFlag;
+
+}

+ 99 - 0
src/main/java/com/kcim/dao/model/ShareParamTypeMap.java

@@ -0,0 +1,99 @@
+package com.kcim.dao.model;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+
+import java.io.Serializable;
+import java.util.Date;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+/**
+ * 分摊参数来源项目对照
+ * 
+ * @author Wang.YS
+
+ * @date 2024-01-11 17:04:42
+ */
+@Data
+@Accessors(chain = true)
+@AllArgsConstructor
+@NoArgsConstructor
+@TableName("com_share_param_type_map")
+public class ShareParamTypeMap implements Serializable {
+	private static final long serialVersionUID = 1L;
+
+	/**
+	 * 主键
+	 */
+	@TableId
+	private Integer id;
+	/**
+	 * 医院id
+	 */
+	private Long hospId;
+	/**
+	 * 分摊参数代码
+	 */
+	private String shareParamCode;
+	/**
+	 * 分摊参数名称
+	 */
+	private String shareParamName;
+	/**
+	 * 来源类型 项目分摊参数来源类型参与人员、使用设备、使用空间、项目收入
+	 */
+	private String sourceType;
+	@TableField(exist = false)
+	private String sourceTypeName;
+	/**
+	 * 来源项目代码 0 为全部 item_income为项目收入
+	 */
+	private String sourceCode;
+	/**
+	 * 来源项目代码
+	 */
+	private String sourceName;
+	/**
+	 * 创建人
+	 */
+	@JsonIgnore
+	private String createUser;
+	/**
+	 * 创建时间
+	 */
+	@JsonIgnore
+	private Date createTime;
+	/**
+	 * 更新人
+	 */
+	@JsonIgnore
+	private String updateUser;
+	/**
+	 * 更新时间
+	 */
+	@JsonIgnore
+	private Date updateTime;
+	/**
+	 * 删除人
+	 */
+	@JsonIgnore
+	private String deleteUser;
+	/**
+	 * 删除时间
+	 */
+	@JsonIgnore
+	private Date deleteTime;
+	/**
+	 * 删除标志  0正常 1作废
+	 */
+	@TableLogic(value = "0",delval = "1")
+	private Integer delFlag;
+
+}

+ 107 - 0
src/main/java/com/kcim/dao/model/Sql.java

@@ -0,0 +1,107 @@
+package com.kcim.dao.model;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+
+import java.io.Serializable;
+import java.util.Date;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+/**
+ * sql定义表
+ * 
+ * @author Wang.YS
+
+ * @date 2024-03-18 16:13:33
+ */
+@Data
+@Accessors(chain = true)
+@AllArgsConstructor
+@NoArgsConstructor
+@TableName("com_sql")
+public class Sql implements Serializable {
+	private static final long serialVersionUID = 1L;
+
+	/**
+	 * 主键
+	 */
+	@TableId
+	private Integer id;
+	/**
+	 * 医院id
+	 */
+	private Long hospId;
+	/**
+	 * 代码
+	 */
+	private Long code;
+	/**
+	 * sql代码(新增时定义修改不变)
+	 */
+	private String sqlCode;
+	/**
+	 * 语句
+	 */
+	@TableField("`sql`")
+	private String sql;
+	/**
+	 * sql说明
+	 */
+	private String sqlDefinition;
+	/**
+	 * sql类型 取公用字典配置
+	 */
+	private String sqlType;
+	/**
+	 * 顺序号
+	 */
+	private Integer sort;
+	/**
+	 * 启用标志 1启用 0停用
+	 */
+	private Integer status;
+	/**
+	 * 创建人
+	 */
+	@JsonIgnore
+	private String createUser;
+	/**
+	 * 创建时间
+	 */
+	@JsonIgnore
+	private Date createTime;
+	/**
+	 * 更新人
+	 */
+	@JsonIgnore
+	private String updateUser;
+	/**
+	 * 更新时间
+	 */
+	@JsonIgnore
+	private Date updateTime;
+	/**
+	 * 删除人
+	 */
+	@JsonIgnore
+	private String deleteUser;
+	/**
+	 * 删除时间
+	 */
+	@JsonIgnore
+	private Date deleteTime;
+	/**
+	 * 删除标志  0正常 1作废
+	 */
+	@JsonIgnore
+	@TableLogic(value = "0",delval = "1")
+	private Integer delFlag;
+
+}

+ 24 - 0
src/main/java/com/kcim/dao/model/StandItem.java

@@ -79,6 +79,20 @@ public class StandItem implements Serializable {
 	 */
 	@TableField(exist = false)
 	private String accountName;
+	/**
+	 * 技术难度
+	 */
+	private BigDecimal technicalDifficulty;
+	/**
+	 * 风险程度
+	 */
+	private BigDecimal riskDegree;
+
+	private String itemType;
+
+	@TableField(exist = false)
+	private String itemTypeName;
+
 	/**
 	 * 创建人
 	 */
@@ -130,5 +144,15 @@ public class StandItem implements Serializable {
 	 */
 	@TableField(exist = false)
 	private List<StandItemSpaceMap> spaceMaps;
+	@TableField(exist = false)
+	private Double percent;
+
+	@TableField(exist = false)
+	private String percentDisplay;
+	@TableField(exist = false)
+	private Integer historyFlag;
+	@TableField(exist = false)
+	private String historyName;
+
 
 }

+ 94 - 0
src/main/java/com/kcim/dao/model/dto/ComputeDrugCostPageDto.java

@@ -0,0 +1,94 @@
+package com.kcim.dao.model.dto;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * @program: CostAccount
+ * @description: 药材项目成本计算自定义出参
+ * @author: Wang.YS
+ * @create: 2023-10-30 11:30
+ **/
+@Data
+public class ComputeDrugCostPageDto {
+    private Integer id;
+    /**
+     * 医院id
+     */
+    private Long hospId;
+    /**
+     * 核算年月
+     */
+    private String computeDate;
+    /**
+     * 就诊id
+     */
+    private String visitNo;
+    /**
+     * 责任中心代码
+     */
+    private String responsibilityCode;
+    /**
+     * 责任中心名称
+     */
+    private String responsibilityName;
+    /**
+     * 收费项目代码
+     */
+    private String code;
+    /**
+     * 收费项目名称
+     */
+    private String name;
+    /**
+     * 项目类别代码
+     */
+    private String itemTypeCode;
+    /**
+     * 项目类别
+     */
+    private String itemType;
+    /**
+     * 报表项目类别
+     */
+    private String type;
+    /**
+     *药品收入
+     */
+    private BigDecimal drugIncome;
+    /**
+     *材料收入
+     */
+    private BigDecimal materialIncome;
+    /**
+     *项目收入
+     */
+//    private BigDecimal itemIncome;
+    /**
+     *药品成本
+     */
+    private BigDecimal drugCost;
+    /**
+     *材料成本
+     */
+    private BigDecimal materialCost;
+    /**
+     *项目成本
+     */
+//    private BigDecimal itemCost;
+    /**
+     *人力成本
+     */
+//    private BigDecimal empCost;
+    /**
+     *设备成本
+     */
+//    private BigDecimal equipmentCost;
+    /**
+     *空间成本
+     */
+//    private BigDecimal spaceCost;
+
+
+}

+ 5 - 0
src/main/java/com/kcim/dao/model/dto/ReportFormEditDTO.java

@@ -41,4 +41,9 @@ public class ReportFormEditDTO {
 
     private Integer isLoss;
 
+    private Integer costType;
+
+    private Integer fraction;
+
+
 }

+ 6 - 0
src/main/java/com/kcim/dao/model/dto/ReportFormSaveDTO.java

@@ -36,4 +36,10 @@ public class ReportFormSaveDTO {
 
     private Integer isLoss;
 
+
+    private Integer costType;
+
+    private Integer fraction;
+
+
 }

+ 5 - 0
src/main/java/com/kcim/dao/repository/AccountingProductRepository.java

@@ -6,6 +6,7 @@ import com.kcim.common.util.UserContext;
 import com.kcim.dao.mapper.AccountingProductMapper;
 import com.kcim.dao.model.AccountingProduct;
 import com.kcim.dao.model.CostResponsibilityDepartment;
+import com.kcim.vo.ProductMapVO;
 import org.springframework.stereotype.Repository;
 
 import java.util.List;
@@ -23,4 +24,8 @@ public class AccountingProductRepository extends ServiceImpl<AccountingProductMa
         queryWrapper.eq(AccountingProduct::getHospId, UserContext.getHospId());
         return this.list(queryWrapper);
     }
+
+    public List<ProductMapVO> getProductMap(List<Long> accountIds){
+        return this.baseMapper.selectProductMap(UserContext.getHospId(),accountIds);
+    }
 }

+ 22 - 0
src/main/java/com/kcim/dao/repository/AccountingRepository.java

@@ -40,4 +40,26 @@ public class AccountingRepository extends ServiceImpl<AccountingMapper, Accounti
 
         return this.list(queryWrapper);
     }
+
+    public List<Accounting> getList(Integer accountType) {
+        LambdaQueryWrapper<Accounting> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(Accounting::getHospId, UserContext.getHospId());
+        queryWrapper.eq(Accounting::getAccountingType, accountType);
+        queryWrapper.orderByDesc(Accounting::getCreateTime);
+        return this.list(queryWrapper);
+
+    }
+
+    public List<Accounting> getBaseCostList(String filter) {
+        LambdaQueryWrapper<Accounting> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(Accounting::getHospId, UserContext.getHospId());
+        queryWrapper.eq(Accounting::getAccountingType, NumberConstant.TWO);
+        queryWrapper.eq(Accounting::getIsBaseCost,NumberConstant.ONE);
+        if(!StringUtils.isEmpty(filter)){
+            queryWrapper.like(Accounting::getAccountingName,filter);
+        }
+        queryWrapper.orderByDesc(Accounting::getCreateTime);
+        return this.list(queryWrapper);
+
+    }
 }

+ 55 - 0
src/main/java/com/kcim/dao/repository/ComputeCheckResultRepository.java

@@ -0,0 +1,55 @@
+package com.kcim.dao.repository;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.kcim.common.util.UserContext;
+import com.kcim.dao.mapper.ComputeCheckResultMapper;
+import com.kcim.dao.model.ComputeCheckResult;
+import com.kcim.vo.ComputeProjectCostPageDto;
+import org.springframework.stereotype.Repository;
+import org.springframework.util.CollectionUtils;
+import org.springframework.util.StringUtils;
+
+import java.util.Date;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * @program: CostAccount
+ * @description:
+ * @author: Wang.YS
+ * @create: 2024-03-21 15:21
+ **/
+@Repository
+public class ComputeCheckResultRepository extends ServiceImpl<ComputeCheckResultMapper, ComputeCheckResult> {
+
+    public Page<ComputeCheckResult> getByPage(Integer current, Integer pageSize, String computeDate, String resultType) {
+        Page<ComputeCheckResult> page = new Page<>(current,pageSize);
+        LambdaQueryWrapper<ComputeCheckResult> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(ComputeCheckResult::getComputeDate,computeDate);
+        queryWrapper.eq(ComputeCheckResult::getHospId,UserContext.getHospId());
+        if(!StringUtils.isEmpty(resultType)){
+            queryWrapper.eq(ComputeCheckResult::getResultType,resultType);
+        }
+        return this.page(page, queryWrapper);
+
+    }
+
+    public void removeByComputeDate(String computeDate) {
+        LambdaQueryWrapper<ComputeCheckResult> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(ComputeCheckResult::getComputeDate,computeDate);
+        queryWrapper.eq(ComputeCheckResult::getHospId,UserContext.getHospId());
+        List<ComputeCheckResult> list = this.list(queryWrapper);
+        if(!CollectionUtils.isEmpty(list)){
+            for (ComputeCheckResult computeCheckResult : list) {
+                computeCheckResult.setDeleteTime(new Date());
+                computeCheckResult.setDeleteUser(String.valueOf(UserContext.getCurrentUser().getId()));
+            }
+            this.updateBatchById(list);
+            List<Integer> collect = list.stream().map(ComputeCheckResult::getId).collect(Collectors.toList());
+            this.removeByIds(collect);
+        }
+
+    }
+}

+ 37 - 7
src/main/java/com/kcim/dao/repository/ComputeClinicalPathwayCostDetailRepository.java

@@ -1,15 +1,19 @@
 package com.kcim.dao.repository;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.kcim.common.util.UserContext;
 import com.kcim.dao.mapper.ComputeClinicalPathwayCostDetailMapper;
 import com.kcim.dao.model.ComputeClinicalPathwayCostDetail;
+import com.kcim.dao.model.ComputeGroupCostDetail;
 import org.springframework.stereotype.Repository;
 import org.springframework.util.CollectionUtils;
 
+import java.util.ArrayList;
 import java.util.List;
 import java.util.stream.Collectors;
+import java.util.stream.Stream;
 
 /**
  * @program: CostAccount
@@ -19,14 +23,40 @@ import java.util.stream.Collectors;
  **/
 @Repository
 public class ComputeClinicalPathwayCostDetailRepository extends ServiceImpl<ComputeClinicalPathwayCostDetailMapper, ComputeClinicalPathwayCostDetail> {
+    static  Integer MAX_NUMBER = 500;
+
+    private static Integer countStep(Integer size) {
+        return (size + MAX_NUMBER - 1) / MAX_NUMBER;
+    }
     public void removeByClinicalCostId(List<Integer> integers) {
-        LambdaQueryWrapper<ComputeClinicalPathwayCostDetail> queryWrapper = new LambdaQueryWrapper<>();
-        queryWrapper.eq(ComputeClinicalPathwayCostDetail::getHospId, UserContext.getHospId());
-        queryWrapper.in(ComputeClinicalPathwayCostDetail::getClinicalPathwayId,integers);
-        List<ComputeClinicalPathwayCostDetail> list = this.list(queryWrapper);
-        if(!CollectionUtils.isEmpty(list)){
-            List<Integer> collect = list.stream().map(ComputeClinicalPathwayCostDetail::getId).collect(Collectors.toList());
-            this.removeBatchByIds(collect,500);
+//        LambdaQueryWrapper<ComputeClinicalPathwayCostDetail> queryWrapper = new LambdaQueryWrapper<>();
+//        queryWrapper.eq(ComputeClinicalPathwayCostDetail::getHospId, UserContext.getHospId());
+//        queryWrapper.in(ComputeClinicalPathwayCostDetail::getClinicalPathwayId,integers);
+//        List<ComputeClinicalPathwayCostDetail> list = this.list(queryWrapper);
+//        if(!CollectionUtils.isEmpty(list)){
+//            List<Integer> collect = list.stream().map(ComputeClinicalPathwayCostDetail::getId).collect(Collectors.toList());
+//            this.removeBatchByIds(collect,500);
+//        }
+
+
+        int limit = countStep(integers.size());
+        //方法一:使用流遍历操作
+        List<List<Integer>> mgList = new ArrayList<>();
+        Stream.iterate(0, n -> n + 1).limit(limit).forEach(i -> {
+            mgList.add(integers.stream().skip(i * MAX_NUMBER).limit(MAX_NUMBER).collect(Collectors.toList()));
+        });
+        for (List<Integer> mg : mgList) {
+            UpdateWrapper<ComputeClinicalPathwayCostDetail> updateWrapper = new UpdateWrapper<>();
+            updateWrapper.lambda().eq(ComputeClinicalPathwayCostDetail::getDelFlag,0)
+                    .eq(ComputeClinicalPathwayCostDetail::getHospId,UserContext.getHospId())
+                    .in(ComputeClinicalPathwayCostDetail::getClinicalPathwayId,mg)
+                    .set(ComputeClinicalPathwayCostDetail::getDelFlag,1);
+//                updateWrapper.set("del_flag",1);
+//                updateWrapper.eq("hosp_id", currentUser.getHospId());
+//                updateWrapper.eq("del_flag", 0);
+//                updateWrapper.in("item_cost_id", integers);
+            this.update(updateWrapper);
         }
+
     }
 }

+ 35 - 7
src/main/java/com/kcim/dao/repository/ComputeDiseaseCostDetailRepository.java

@@ -1,15 +1,19 @@
 package com.kcim.dao.repository;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.kcim.common.util.UserContext;
 import com.kcim.dao.mapper.ComputeDiseaseCostDetailMapper;
 import com.kcim.dao.model.ComputeDiseaseCostDetail;
+import com.kcim.dao.model.ComputePatientCostDetail;
 import org.springframework.stereotype.Repository;
 import org.springframework.util.CollectionUtils;
 
+import java.util.ArrayList;
 import java.util.List;
 import java.util.stream.Collectors;
+import java.util.stream.Stream;
 
 /**
  * @program: CostAccount
@@ -19,14 +23,38 @@ import java.util.stream.Collectors;
  **/
 @Repository
 public class ComputeDiseaseCostDetailRepository extends ServiceImpl<ComputeDiseaseCostDetailMapper, ComputeDiseaseCostDetail> {
+    static  Integer MAX_NUMBER = 500;
+
+    private static Integer countStep(Integer size) {
+        return (size + MAX_NUMBER - 1) / MAX_NUMBER;
+    }
     public void removeByDiseaseCostId(List<Integer> integers) {
-        LambdaQueryWrapper<ComputeDiseaseCostDetail> queryWrapper = new LambdaQueryWrapper<>();
-        queryWrapper.eq(ComputeDiseaseCostDetail::getHospId, UserContext.getHospId());
-        queryWrapper.in(ComputeDiseaseCostDetail::getDiseaseCostId,integers);
-        List<ComputeDiseaseCostDetail> list = this.list(queryWrapper);
-        if(!CollectionUtils.isEmpty(list)){
-            List<Integer> collect = list.stream().map(ComputeDiseaseCostDetail::getId).collect(Collectors.toList());
-            this.removeBatchByIds(collect,500);
+//        LambdaQueryWrapper<ComputeDiseaseCostDetail> queryWrapper = new LambdaQueryWrapper<>();
+//        queryWrapper.eq(ComputeDiseaseCostDetail::getHospId, UserContext.getHospId());
+//        queryWrapper.in(ComputeDiseaseCostDetail::getDiseaseCostId,integers);
+//        List<ComputeDiseaseCostDetail> list = this.list(queryWrapper);
+//        if(!CollectionUtils.isEmpty(list)){
+//            List<Integer> collect = list.stream().map(ComputeDiseaseCostDetail::getId).collect(Collectors.toList());
+//            this.removeBatchByIds(collect,500);
+//        }
+
+        int limit = countStep(integers.size());
+        //方法一:使用流遍历操作
+        List<List<Integer>> mgList = new ArrayList<>();
+        Stream.iterate(0, n -> n + 1).limit(limit).forEach(i -> {
+            mgList.add(integers.stream().skip(i * MAX_NUMBER).limit(MAX_NUMBER).collect(Collectors.toList()));
+        });
+        for (List<Integer> mg : mgList) {
+            UpdateWrapper<ComputeDiseaseCostDetail> updateWrapper = new UpdateWrapper<>();
+            updateWrapper.lambda().eq(ComputeDiseaseCostDetail::getDelFlag,0)
+                    .eq(ComputeDiseaseCostDetail::getHospId,UserContext.getHospId())
+                    .in(ComputeDiseaseCostDetail::getDiseaseCostId,mg)
+                    .set(ComputeDiseaseCostDetail::getDelFlag,1);
+//                updateWrapper.set("del_flag",1);
+//                updateWrapper.eq("hosp_id", currentUser.getHospId());
+//                updateWrapper.eq("del_flag", 0);
+//                updateWrapper.in("item_cost_id", integers);
+            this.update(updateWrapper);
         }
     }
 }

+ 49 - 0
src/main/java/com/kcim/dao/repository/ComputeDrugCostDetailRepository.java

@@ -0,0 +1,49 @@
+package com.kcim.dao.repository;
+
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.kcim.dao.mapper.ComputeDrugCostDetailMapper;
+import com.kcim.dao.model.ComputeDrugCostDetail;
+import com.kcim.vo.SessionUserVO;
+import org.springframework.stereotype.Repository;
+import org.springframework.util.CollectionUtils;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+/**
+ * @program: CostAccount
+ * @description: 药材成本计算明细表数据库交互
+ * @author: Wang.YS
+ * @create: 2024-01-11 20:06
+ **/
+@Repository
+public class ComputeDrugCostDetailRepository extends ServiceImpl<ComputeDrugCostDetailMapper, ComputeDrugCostDetail> {
+    static Integer MAX_NUMBER = 500;
+
+    private static Integer countStep(Integer size) {
+        return (size + MAX_NUMBER - 1) / MAX_NUMBER;
+    }
+
+    public void removeByItemCostId(List<Integer> costIds, SessionUserVO currentUser) {
+        if (!CollectionUtils.isEmpty(costIds)) {
+            int limit = countStep(costIds.size());
+            //方法一:使用流遍历操作
+            List<List<Integer>> mglist = new ArrayList<>();
+            Stream.iterate(0, n -> n + 1).limit(limit).forEach(i -> {
+                mglist.add(costIds.stream().skip(i * MAX_NUMBER).limit(MAX_NUMBER).collect(Collectors.toList()));
+            });
+            for (List<Integer> integers : mglist) {
+                UpdateWrapper<ComputeDrugCostDetail> updateWrapper = new UpdateWrapper<>();
+                updateWrapper.lambda().eq(ComputeDrugCostDetail::getDelFlag, 0)
+                        .eq(ComputeDrugCostDetail::getHospId, currentUser.getHospId())
+                        .in(ComputeDrugCostDetail::getDrugCostId, integers)
+                        .set(ComputeDrugCostDetail::getDelFlag, 1);
+
+                this.update(updateWrapper);
+            }
+        }
+    }
+}

+ 49 - 0
src/main/java/com/kcim/dao/repository/ComputeDrugCostRepository.java

@@ -0,0 +1,49 @@
+package com.kcim.dao.repository;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.kcim.common.util.UserContext;
+import com.kcim.dao.mapper.ComputeDrugCostMapper;
+import com.kcim.dao.model.ComputeDrugCost;
+import com.kcim.dao.model.ComputeItemCost;
+import com.kcim.dao.model.dto.ComputeDrugCostPageDto;
+import com.kcim.dao.model.dto.ComputeItemCostPageDto;
+import com.kcim.vo.SessionUserVO;
+import org.springframework.stereotype.Repository;
+import org.springframework.util.CollectionUtils;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * @program: CostAccount
+ * @description: 药材成本计算表
+ * @author: Wang.YS
+ * @create: 2024-01-11 20:02
+ **/
+@Repository
+public class ComputeDrugCostRepository extends ServiceImpl<ComputeDrugCostMapper, ComputeDrugCost> {
+    public List<Integer> removeByComputeDate(String computeDate, SessionUserVO currentUser) {
+        LambdaQueryWrapper<ComputeDrugCost> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(ComputeDrugCost::getHospId, currentUser.getHospId());
+        queryWrapper.eq(ComputeDrugCost::getComputeDate,computeDate);
+        List<ComputeDrugCost> list = this.list(queryWrapper);
+        if(!CollectionUtils.isEmpty(list)){
+            List<Integer> collect = list.stream().map(ComputeDrugCost::getId).collect(Collectors.toList());
+            this.removeBatchByIds(collect,500);
+            return collect;
+        }
+        return new ArrayList<>();
+    }
+
+    public Page<ComputeDrugCostPageDto> getByPage(Integer current, Integer pageSize, String computeDate, String responsibilityCode, String filter) {
+        Page<ComputeDrugCostPageDto> page = new Page<>(current,pageSize);
+        List<ComputeDrugCostPageDto> byPage = this.baseMapper.getByPage(page, computeDate, responsibilityCode, filter, UserContext.getHospId());
+        if(!CollectionUtils.isEmpty(byPage)){
+            page.setRecords(byPage);
+        }
+        return page;
+    }
+}

+ 8 - 0
src/main/java/com/kcim/dao/repository/ComputeEmpCostRepository.java

@@ -6,6 +6,7 @@ import com.kcim.common.constants.NumberConstant;
 import com.kcim.common.util.UserContext;
 import com.kcim.dao.mapper.ComputeEmpCostMapper;
 import com.kcim.dao.model.ComputeEmpCost;
+import com.kcim.vo.SessionUserVO;
 import org.springframework.stereotype.Repository;
 import org.springframework.util.CollectionUtils;
 import org.springframework.util.StringUtils;
@@ -66,4 +67,11 @@ public class ComputeEmpCostRepository extends ServiceImpl<ComputeEmpCostMapper,
 
         return this.list(queryWrapper);
     }
+
+    public List<ComputeEmpCost> getByComputeDate(String computeDate, SessionUserVO currentUser) {
+        LambdaQueryWrapper<ComputeEmpCost> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(ComputeEmpCost::getHospId, currentUser.getHospId());
+        queryWrapper.eq(ComputeEmpCost::getComputeDate,computeDate);
+        return this.list(queryWrapper);
+    }
 }

+ 35 - 7
src/main/java/com/kcim/dao/repository/ComputeGroupCostDetailRepository.java

@@ -1,15 +1,19 @@
 package com.kcim.dao.repository;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.kcim.common.util.UserContext;
 import com.kcim.dao.mapper.ComputeGroupCostDetailMapper;
+import com.kcim.dao.model.ComputeDiseaseCostDetail;
 import com.kcim.dao.model.ComputeGroupCostDetail;
 import org.springframework.stereotype.Repository;
 import org.springframework.util.CollectionUtils;
 
+import java.util.ArrayList;
 import java.util.List;
 import java.util.stream.Collectors;
+import java.util.stream.Stream;
 
 /**
  * @program: CostAccount
@@ -19,14 +23,38 @@ import java.util.stream.Collectors;
  **/
 @Repository
 public class ComputeGroupCostDetailRepository extends ServiceImpl<ComputeGroupCostDetailMapper, ComputeGroupCostDetail> {
+    static  Integer MAX_NUMBER = 500;
+
+    private static Integer countStep(Integer size) {
+        return (size + MAX_NUMBER - 1) / MAX_NUMBER;
+    }
     public void removeByDiseaseCostId(List<Integer> integers) {
-        LambdaQueryWrapper<ComputeGroupCostDetail> queryWrapper = new LambdaQueryWrapper<>();
-        queryWrapper.eq(ComputeGroupCostDetail::getHospId, UserContext.getHospId());
-        queryWrapper.in(ComputeGroupCostDetail::getGroupCostId,integers);
-        List<ComputeGroupCostDetail> list = this.list(queryWrapper);
-        if(!CollectionUtils.isEmpty(list)){
-            List<Integer> collect = list.stream().map(ComputeGroupCostDetail::getId).collect(Collectors.toList());
-            this.removeBatchByIds(collect,500);
+//        LambdaQueryWrapper<ComputeGroupCostDetail> queryWrapper = new LambdaQueryWrapper<>();
+//        queryWrapper.eq(ComputeGroupCostDetail::getHospId, UserContext.getHospId());
+//        queryWrapper.in(ComputeGroupCostDetail::getGroupCostId,integers);
+//        List<ComputeGroupCostDetail> list = this.list(queryWrapper);
+//        if(!CollectionUtils.isEmpty(list)){
+//            List<Integer> collect = list.stream().map(ComputeGroupCostDetail::getId).collect(Collectors.toList());
+//            this.removeBatchByIds(collect,500);
+//        }
+
+        int limit = countStep(integers.size());
+        //方法一:使用流遍历操作
+        List<List<Integer>> mgList = new ArrayList<>();
+        Stream.iterate(0, n -> n + 1).limit(limit).forEach(i -> {
+            mgList.add(integers.stream().skip(i * MAX_NUMBER).limit(MAX_NUMBER).collect(Collectors.toList()));
+        });
+        for (List<Integer> mg : mgList) {
+            UpdateWrapper<ComputeGroupCostDetail> updateWrapper = new UpdateWrapper<>();
+            updateWrapper.lambda().eq(ComputeGroupCostDetail::getDelFlag,0)
+                    .eq(ComputeGroupCostDetail::getHospId,UserContext.getHospId())
+                    .in(ComputeGroupCostDetail::getGroupCostId,mg)
+                    .set(ComputeGroupCostDetail::getDelFlag,1);
+//                updateWrapper.set("del_flag",1);
+//                updateWrapper.eq("hosp_id", currentUser.getHospId());
+//                updateWrapper.eq("del_flag", 0);
+//                updateWrapper.in("item_cost_id", integers);
+            this.update(updateWrapper);
         }
     }
 }

+ 51 - 13
src/main/java/com/kcim/dao/repository/ComputeItemCostDetailRepository.java

@@ -1,15 +1,20 @@
 package com.kcim.dao.repository;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.kcim.common.util.UserContext;
 import com.kcim.dao.mapper.ComputeItemCostDetailMapper;
 import com.kcim.dao.model.ComputeItemCostDetail;
+import com.kcim.dao.model.ImportPatientItem;
+import com.kcim.vo.SessionUserVO;
 import org.springframework.stereotype.Repository;
 import org.springframework.util.CollectionUtils;
 
+import java.util.ArrayList;
 import java.util.List;
 import java.util.stream.Collectors;
+import java.util.stream.Stream;
 
 /**
  * @program: CostAccount
@@ -19,20 +24,53 @@ import java.util.stream.Collectors;
  **/
 @Repository
 public class ComputeItemCostDetailRepository extends ServiceImpl<ComputeItemCostDetailMapper, ComputeItemCostDetail> {
+    static  Integer MAX_NUMBER = 500;
 
-    public void removeByItemCostId(List<Integer> costIds) {
-        LambdaQueryWrapper<ComputeItemCostDetail> queryWrapper = new LambdaQueryWrapper<>();
-        queryWrapper.eq(ComputeItemCostDetail::getHospId, UserContext.getHospId());
-        queryWrapper.in(ComputeItemCostDetail::getItemCostId,costIds);
-        List<ComputeItemCostDetail> list = this.list(queryWrapper);
-        if(!CollectionUtils.isEmpty(list)){
-//            list.forEach(computeItemCost -> {
-//                computeItemCost.setDeleteUser(String.valueOf(UserContext.getCurrentUser().getId()));
-//                computeItemCost.setDeleteTime(new Date());
-//            });
-//            this.updateBatchById(list,100);
-            List<Integer> collect = list.stream().map(ComputeItemCostDetail::getId).collect(Collectors.toList());
-            this.removeBatchByIds(collect,500);
+    private static Integer countStep(Integer size) {
+        return (size + MAX_NUMBER - 1) / MAX_NUMBER;
+    }
+    public void removeByItemCostId(List<Integer> costIds, SessionUserVO currentUser) {
+        if(!CollectionUtils.isEmpty(costIds)){
+            int limit = countStep(costIds.size());
+            //方法一:使用流遍历操作
+            List<List<Integer>> mglist = new ArrayList<>();
+            Stream.iterate(0, n -> n + 1).limit(limit).forEach(i -> {
+                mglist.add(costIds.stream().skip(i * MAX_NUMBER).limit(MAX_NUMBER).collect(Collectors.toList()));
+            });
+            for (List<Integer> integers : mglist) {
+                UpdateWrapper<ComputeItemCostDetail> updateWrapper = new UpdateWrapper<>();
+                updateWrapper.lambda().eq(ComputeItemCostDetail::getDelFlag,0)
+                                .eq(ComputeItemCostDetail::getHospId,currentUser.getHospId())
+                        .in(ComputeItemCostDetail::getItemCostId,integers)
+                                                .set(ComputeItemCostDetail::getDelFlag,1);
+//                updateWrapper.set("del_flag",1);
+//                updateWrapper.eq("hosp_id", currentUser.getHospId());
+//                updateWrapper.eq("del_flag", 0);
+//                updateWrapper.in("item_cost_id", integers);
+                this.update(updateWrapper);
+            }
         }
+
+//
+//
+//        update compute_item_cost_detail set del_flag = 1
+//        where item_cost_id in(select id from compute_item_cost where del_flag=0 and compute_date='2023-11')
+//
+//
+//
+//
+//        LambdaQueryWrapper<ComputeItemCostDetail> queryWrapper = new LambdaQueryWrapper<>();
+//        queryWrapper.eq(ComputeItemCostDetail::getHospId, UserConcurrentUsertext.getHospId());
+//        queryWrapper.in(ComputeItemCostDetail::getItemCostId,costIds);
+//        List<ComputeItemCostDetail> list = this.list(queryWrapper);
+//        if(!CollectionUtils.isEmpty(list)){
+////            list.forEach(computeItemCost -> {
+////                computeItemCost.setDeleteUser(String.valueOf(UserContext.getCurrentUser().getId()));
+////                computeItemCost.setDeleteTime(new Date());
+////            });
+////            this.updateBatchById(list,100);
+//            List<Integer> collect = list.stream().map(ComputeItemCostDetail::getId).collect(Collectors.toList());
+//            this.removeBatchByIds(collect,500);
+//        }
     }
 }

Nem az összes módosított fájl került megjelenítésre, mert túl sok fájl változott