Browse Source

科室损益excel 行转列

wangyongsheng 1 năm trước cách đây
mục cha
commit
6c8cd838da
46 tập tin đã thay đổi với 1314 bổ sung462 xóa
  1. 43 26
      pom.xml
  2. 1 1
      src/main/java/com/kcim/common/constants/SQLParameter.java
  3. 51 0
      src/main/java/com/kcim/common/enums/CustomSqlTypeEnum.java
  4. 5 10
      src/main/java/com/kcim/common/enums/ErrorCodeEnum.java
  5. 212 0
      src/main/java/com/kcim/common/util/ListUtils.java
  6. 188 0
      src/main/java/com/kcim/common/util/TreeDepthUtil.java
  7. 14 0
      src/main/java/com/kcim/common/util/excel/ExcelPoiUtil.java
  8. 0 1
      src/main/java/com/kcim/common/util/excel/entity/ItemImportEntity.java
  9. 1 0
      src/main/java/com/kcim/dao/mapper/CostCostingGroupMapper.java
  10. 7 0
      src/main/java/com/kcim/dao/mapper/ImportPatientItemMapper.java
  11. 0 2
      src/main/java/com/kcim/dao/model/Accounting.java
  12. 62 60
      src/main/java/com/kcim/dao/model/ComputeDrugCostDetail.java
  13. 0 1
      src/main/java/com/kcim/dao/model/CostIncomeGroup.java
  14. 6 4
      src/main/java/com/kcim/dao/model/ReportForm.java
  15. 4 0
      src/main/java/com/kcim/dao/model/ResponsibilityDepartment.java
  16. 4 0
      src/main/java/com/kcim/dao/model/dto/PatientItemDepartmentGroupVo.java
  17. 0 1
      src/main/java/com/kcim/dao/repository/AccountingProductRepository.java
  18. 13 0
      src/main/java/com/kcim/dao/repository/ComputeDrugCostDetailRepository.java
  19. 24 16
      src/main/java/com/kcim/dao/repository/ComputeDrugCostRepository.java
  20. 0 1
      src/main/java/com/kcim/dao/repository/ComputeStandPatientProjectCostDetailRepository.java
  21. 14 8
      src/main/java/com/kcim/dao/repository/ImportPatientItemRepository.java
  22. 0 2
      src/main/java/com/kcim/dao/repository/ItemNoValuationDrugMaterialMapRepository.java
  23. 4 0
      src/main/java/com/kcim/endPoint/CenterEndPoint.java
  24. 2 0
      src/main/java/com/kcim/service/CenterService.java
  25. 0 1
      src/main/java/com/kcim/service/ResponsibilityService.java
  26. 6 0
      src/main/java/com/kcim/service/SqlService.java
  27. 12 7
      src/main/java/com/kcim/service/impl/CenterServiceImpl.java
  28. 10 5
      src/main/java/com/kcim/service/impl/ComputePatientCostServiceImpl.java
  29. 22 13
      src/main/java/com/kcim/service/impl/CostAccountShareServiceImpl.java
  30. 1 48
      src/main/java/com/kcim/service/impl/CostDataServiceImpl.java
  31. 393 183
      src/main/java/com/kcim/service/impl/CostDepartmentProfitServiceImpl.java
  32. 45 53
      src/main/java/com/kcim/service/impl/DrugMaterialCalculateServiceImpl.java
  33. 4 2
      src/main/java/com/kcim/service/impl/IncomeCollectionServiceImpl.java
  34. 25 1
      src/main/java/com/kcim/service/impl/ProjectCostServiceImpl.java
  35. 11 6
      src/main/java/com/kcim/service/impl/ResponsibilityDepartmentServiceImpl.java
  36. 2 0
      src/main/java/com/kcim/service/impl/ResponsibilityServiceImpl.java
  37. 3 1
      src/main/java/com/kcim/service/impl/ShareParamServiceImpl.java
  38. 65 3
      src/main/java/com/kcim/service/impl/SqlServiceImpl.java
  39. 2 0
      src/main/java/com/kcim/vo/CenterDepartmentVO.java
  40. 6 0
      src/main/java/com/kcim/vo/CostAccountShareVO.java
  41. 2 0
      src/main/java/com/kcim/vo/DepartVO.java
  42. 22 0
      src/main/java/com/kcim/vo/ResponsibilityVo.java
  43. 0 2
      src/main/java/com/kcim/vo/ShareParamCostVo.java
  44. 1 0
      src/main/java/com/kcim/web/CostCostingCollectionController.java
  45. 1 1
      src/main/resources/application.yml
  46. 26 3
      src/main/resources/mapper/ImportPatientItemMapper.xml

+ 43 - 26
pom.xml

@@ -208,35 +208,40 @@
             <artifactId>httpmime</artifactId>
             <version>4.5.7</version>
         </dependency>
-        <!-- POI -->
-        <dependency>
-            <groupId>org.apache.poi</groupId>
-            <artifactId>poi-ooxml</artifactId>
-            <version>4.1.1</version>
-        </dependency>
-        <dependency>
-            <groupId>com.alibaba</groupId>
-            <artifactId>easyexcel</artifactId>
-            <version>3.2.1</version>
-        </dependency>
-        <!--导入导出的工具包,可以完成Excel导出,导入,Word的导出,Excel的导出功能-->
-        <dependency>
-            <groupId>cn.afterturn</groupId>
-            <artifactId>easypoi-base</artifactId>
-            <version>${easypoi.version}</version>
-        </dependency>
-        <!--耦合了spring-mvc 基于AbstractView,极大的简化spring-mvc下的导出功能-->
-        <dependency>
-            <groupId>cn.afterturn</groupId>
-            <artifactId>easypoi-web</artifactId>
-            <version>${easypoi.version}</version>
-        </dependency>
-        <!--基础注解包,作用与实体对象上,拆分后方便maven多工程的依赖管理-->
         <dependency>
             <groupId>cn.afterturn</groupId>
-            <artifactId>easypoi-annotation</artifactId>
-            <version>${easypoi.version}</version>
+            <artifactId>easypoi-spring-boot-starter</artifactId>
+            <version>4.4.0</version>
         </dependency>
+        <!-- POI -->
+<!--        <dependency>-->
+<!--            <groupId>org.apache.poi</groupId>-->
+<!--            <artifactId>poi-ooxml</artifactId>-->
+<!--            <version>4.1.1</version>-->
+<!--        </dependency>-->
+<!--        <dependency>-->
+<!--            <groupId>com.alibaba</groupId>-->
+<!--            <artifactId>easyexcel</artifactId>-->
+<!--            <version>3.2.1</version>-->
+<!--        </dependency>-->
+<!--        &lt;!&ndash;导入导出的工具包,可以完成Excel导出,导入,Word的导出,Excel的导出功能&ndash;&gt;-->
+<!--        <dependency>-->
+<!--            <groupId>cn.afterturn</groupId>-->
+<!--            <artifactId>easypoi-base</artifactId>-->
+<!--            <version>${easypoi.version}</version>-->
+<!--        </dependency>-->
+<!--        &lt;!&ndash;耦合了spring-mvc 基于AbstractView,极大的简化spring-mvc下的导出功能&ndash;&gt;-->
+<!--        <dependency>-->
+<!--            <groupId>cn.afterturn</groupId>-->
+<!--            <artifactId>easypoi-web</artifactId>-->
+<!--            <version>${easypoi.version}</version>-->
+<!--        </dependency>-->
+<!--        &lt;!&ndash;基础注解包,作用与实体对象上,拆分后方便maven多工程的依赖管理&ndash;&gt;-->
+<!--        <dependency>-->
+<!--            <groupId>cn.afterturn</groupId>-->
+<!--            <artifactId>easypoi-annotation</artifactId>-->
+<!--            <version>${easypoi.version}</version>-->
+<!--        </dependency>-->
         <dependency>
             <groupId>com.alibaba.cloud</groupId>
             <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
@@ -254,6 +259,18 @@
             </exclusions>
 
         </dependency>
+        <dependency>
+            <groupId>org.apache.poi</groupId>
+            <artifactId>poi</artifactId>
+            <version>4.1.2</version>
+        </dependency>
+        <!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml -->
+        <dependency>
+            <groupId>org.apache.poi</groupId>
+            <artifactId>poi-ooxml</artifactId>
+            <version>4.1.2</version>
+        </dependency>
+
         <!--        <dependency>-->
         <!--            <groupId>com.squareup.okhttp3</groupId>-->
         <!--            <artifactId>okhttp</artifactId>-->

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

@@ -12,7 +12,7 @@ public interface SQLParameter {
     String UNIT_CODE = "#unit_code";
 
     String HOSP_ID_CODE = "#hosp_id";
-    String COMPUTE_DATE_CODE = "#compute_date";
+    String COMPUTE_DATE_CODE = "compute_date";
 
     String USER_CODE = "#user_code";
 }

+ 51 - 0
src/main/java/com/kcim/common/enums/CustomSqlTypeEnum.java

@@ -0,0 +1,51 @@
+package com.kcim.common.enums;
+
+/**
+ * @program: CostAccount
+ * @description: 自定义sql枚举类
+ * @author: Wang.YS
+ * @create: 2024-07-30 15:20
+ **/
+public enum CustomSqlTypeEnum {
+    /**
+     * 检查数据异常
+     */
+    CHECK_DATA_EXCEPTION("CHECK_DATA_EXCEPTION","检查数据异常"),
+    /**
+     * 收入归集
+     */
+    INCOME_COLLECTION("INCOME_COLLECTION","收入归集"),
+    /**
+     * 药材成本计算
+     */
+    DRG_COST_CALC("DRG_COST_CALC","药材成本计算"),
+    /**
+     * 患者项目成本计算
+     */
+    PT_ITEM_COST_CALC("PT_ITEM_COST_CALC","患者项目成本计算"),
+    /**
+     * 患者成本计算
+     */
+    PT_COST_CALC("PT_COST_CALC","患者成本计算"),
+    /**
+     * 患者标准项目成本计算
+     */
+    PT_STAND_ITEM_COST_CALC("PT_STAND_ITEM_COST_CALC","患者标准项目成本计算"),
+
+    ;
+    private final String code;
+    private final String description;
+
+    CustomSqlTypeEnum(String code, String description) {
+        this.code = code;
+        this.description = description;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+}

+ 5 - 10
src/main/java/com/kcim/common/enums/ErrorCodeEnum.java

@@ -1,5 +1,8 @@
 package com.kcim.common.enums;
 
+import lombok.Getter;
+
+@Getter
 public enum ErrorCodeEnum {
     DATA_NOT_EXIST(500, "数据不存在或已被移除"),
     USER_NOT_EXIST(500, "用户不存在"),
@@ -12,21 +15,13 @@ public enum ErrorCodeEnum {
 
     ;
 
-    private Integer code;
+    private final Integer code;
 
-    private String description;
+    private final String description;
 
     ErrorCodeEnum(Integer code, String description) {
         this.code = code;
         this.description = description;
     }
 
-    public Integer getCode() {
-        return code;
-    }
-
-    public String getDescription() {
-        return description;
-    }
-
 }

+ 212 - 0
src/main/java/com/kcim/common/util/ListUtils.java

@@ -0,0 +1,212 @@
+package com.kcim.common.util;
+
+/*
+  @author wangyongsheng
+ * @instruction
+ * @create 2019/9/8
+ */
+
+
+import java.lang.reflect.Field;
+import java.text.Collator;
+import java.text.NumberFormat;
+import java.util.*;
+import java.util.function.Function;
+
+/**
+ * @author
+ * 在数据库中查出来的列表中,往往需要对不同的字段重新排序。 一般的做法都是使用排序的字段,重新到数据库中查询。
+ * 如果不到数据库查询,直接在第一次查出来的list中排序,无疑会提高系统的性能。 下面就写一个通用的方法,对list排序,
+
+ * 至少需要满足以下5点:
+
+ * ①.list元素对象类型任意
+ *         ---->使用泛型解决
+
+ * ②.可以按照list元素对象的任意多个属性进行排序,即可以同时指定多个属性进行排序
+ *         --->使用java的可变参数解决
+
+ * ③.list元素对象属性的类型可以是数字(byte、short、int、long、float、double等,包括正数、负数、0)、字符串(char、String)、日期(java.util.Date)
+ *         --->对于数字:统一转换为固定长度的字符串解决,比如数字3和123,转换为"003"和"123" ;再比如"-15"和"7"转换为"-015"和"007"
+ *         --->对于日期:可以先把日期转化为long类型的数字,数字的解决方法如上
+
+ * ④.list元素对象的属性可以没有相应的getter和setter方法
+ *         --->可以使用java反射进行获取private和protected修饰的属性值
+
+ * ⑤.list元素对象的对象的每个属性都可以指定是升序还是降序
+ *           -->使用2个重写的方法(一个方法满足所有属性都按照升序(降序),另外一个方法满足每个属性都能指定是升序(降序))
+ *
+ *
+ */
+public class ListUtils {
+    /**
+     * 对list的元素按照多个属性名称排序,
+     * list元素的属性可以是数字(byte、short、int、long、float、double等,支持正数、负数、0)、char、String、java.util.Date
+     *
+     *
+     *  @param  list
+     *  @param  sortnameArr
+     *            list元素的属性名称
+     * @param isAsc
+     *            true升序,false降序
+     */
+    public static <E> void sort(List<E> list, final boolean isAsc, final String... sortnameArr) {
+        Collections.sort(list, new Comparator<E>() {
+
+            public int compare(E a, E b) {
+                int ret = 0;
+                try {
+                    for (int i = 0; i < sortnameArr.length; i++) {
+                        ret = ListUtils.compareObject(sortnameArr[i], isAsc, a, b);
+                        if (0 != ret) {
+                            break;
+                        }
+                    }
+                } catch (Exception e) {
+                    e.printStackTrace();
+                }
+                return ret;
+            }
+        });
+    }
+
+    /**
+     * 给list的每个属性都指定是升序还是降序
+     *
+     * @param list
+     * @param sortnameArr  参数数组
+     * @param typeArr      每个属性对应的升降序数组, true升序,false降序
+     */
+
+    public static <E> void sort(List<E> list, final String[] sortnameArr, final boolean[] typeArr) {
+        if (sortnameArr.length != typeArr.length) {
+            throw new RuntimeException("属性数组元素个数和升降序数组元素个数不相等");
+        }
+        Collections.sort(list, new Comparator<E>() {
+            public int compare(E a, E b) {
+                int ret = 0;
+                try {
+                    for (int i = 0; i < sortnameArr.length; i++) {
+                        ret = ListUtils.compareObject(sortnameArr[i], typeArr[i], a, b);
+                        if (0 != ret) {
+                            break;
+                        }
+                    }
+                } catch (Exception e) {
+                    e.printStackTrace();
+                }
+                return ret;
+            }
+        });
+    }
+
+    /**
+     * 对2个对象按照指定属性名称进行排序
+     *
+     * @param sortname
+     *            属性名称
+     * @param isAsc
+     *            true升序,false降序
+     * @param a
+     * @param b
+     * @return
+     * @throws Exception
+     */
+    private static <E> int compareObject(final String sortname, final boolean isAsc, E a, E b) throws Exception {
+        int ret;
+        Object value1 = ListUtils.forceGetFieldValue(a, sortname);
+        Object value2 = ListUtils.forceGetFieldValue(b, sortname);
+        String str1 = value1.toString();
+        String str2 = value2.toString();
+        if (value1 instanceof Number && value2 instanceof Number) {
+            int maxlen = Math.max(str1.length(), str2.length());
+            str1 = ListUtils.addZero2Str((Number) value1, maxlen);
+            str2 = ListUtils.addZero2Str((Number) value2, maxlen);
+        } else if (value1 instanceof Date && value2 instanceof Date) {
+            long time1 = ((Date) value1).getTime();
+            long time2 = ((Date) value2).getTime();
+            int maxlen = Long.toString(Math.max(time1, time2)).length();
+            str1 = ListUtils.addZero2Str(time1, maxlen);
+            str2 = ListUtils.addZero2Str(time2, maxlen);
+        }
+        if (isAsc) {
+            ret = str1.compareTo(str2);
+        } else {
+            ret = str2.compareTo(str1);
+        }
+        return ret;
+    }
+
+    /**
+     * 给数字对象按照指定长度在左侧补0.
+     *
+     * 使用案例: addZero2Str(11,4) 返回 "0011", addZero2Str(-18,6)返回 "-000018"
+     *
+     * @param numObj
+     *            数字对象
+     * @param length
+     *            指定的长度
+     * @return
+     */
+    public static String addZero2Str(Number numObj, int length) {
+        NumberFormat nf = NumberFormat.getInstance();
+        // 设置是否使用分组
+        nf.setGroupingUsed(false);
+        // 设置最大整数位数
+        nf.setMaximumIntegerDigits(length);
+        // 设置最小整数位数
+        nf.setMinimumIntegerDigits(length);
+        return nf.format(numObj);
+    }
+
+    /**
+     * 获取指定对象的指定属性值(去除private,protected的限制)
+     *
+     * @param obj
+     *            属性名称所在的对象
+     * @param fieldName
+     *            属性名称
+     * @return
+     * @throws Exception
+     */
+    public static Object forceGetFieldValue(Object obj, String fieldName) throws Exception {
+        Field field = obj.getClass().getDeclaredField(fieldName);
+        Object object = null;
+        boolean accessible = field.isAccessible();
+        if (!accessible) {
+            // 如果是private,protected修饰的属性,需要修改为可以访问的
+            field.setAccessible(true);
+            object = field.get(obj);
+            // 还原private,protected属性的访问性质
+            field.setAccessible(accessible);
+            return object;
+        }
+        object = field.get(obj);
+        return object;
+    }
+    private static final Comparator<Object> CHINESE_COMPARATOR = Collator.getInstance(Locale.CHINA);
+
+    /**
+     * 中文排序
+     * @param keyExtractor
+     * @param <T>
+     * @return
+     */
+    public static <T> Comparator<T> wrapComparator(Function<? super T, String> keyExtractor) {
+        return Comparator.comparing(keyExtractor, CHINESE_COMPARATOR);
+    }
+
+    public static void sort(List<String> data) {
+        data.sort(wrapComparator(Function.identity()));
+    }
+
+    public static <T> void sort(List<T> data, Function<? super T, String> keyExtractor) {
+        data.sort(wrapComparator(keyExtractor));
+    }
+
+
+
+
+
+
+}

+ 188 - 0
src/main/java/com/kcim/common/util/TreeDepthUtil.java

@@ -0,0 +1,188 @@
+package com.kcim.common.util;
+
+/**
+ * @program: CostAccount
+ * @description:
+ * @author: Wang.YS
+ * @create: 2024-08-13 18:28
+ **/
+
+
+import org.springframework.util.CollectionUtils;
+import org.springframework.util.StringUtils;
+
+import java.lang.reflect.Field;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Stack;
+import java.util.stream.Collectors;
+
+/**
+ * 获取树深度
+ * 注:若最深一层只有null元素,该层不计入深度
+ */
+public class TreeDepthUtil {
+    private static final Byte FLAG = 1;
+
+    /**
+     * dfs的递归实现获取树深度
+     *
+     * @param root       根节点
+     * @param childField 子节点列表字段名称
+     * @param <T>        节点类型
+     * @return 树深度
+     */
+    public static <T> int getTreeDepthByDfsWithRecursion(T root, String childField) {
+        if (root == null || !StringUtils.hasText(childField)) {
+            return 0;
+        }
+        List<Integer> depth = new ArrayList<>(1);
+        depth.add(0);
+        // 这里只是需要一个标志,表示当前路径上的点,所以用byte减少内存占用
+        Stack<Byte> stack = new Stack<>();
+        doGetTreeDepthByDfs(root, childField, stack, depth);
+        return depth.get(0);
+    }
+
+    private static <T> void doGetTreeDepthByDfs(T parent, String childField, Stack<Byte> stack, List<Integer> depth) {
+        stack.push(FLAG);
+        depth.set(0, Math.max(depth.get(0), stack.size()));
+        Collection<T> childs = (Collection<T>) getFieldValue(parent, childField);
+        if (CollectionUtils.isEmpty(childs)) {
+            stack.pop();
+            return;
+        }
+        for (T child : childs) {
+            if (child == null) {
+                continue;
+            }
+            doGetTreeDepthByDfs(child, childField, stack, depth);
+        }
+        stack.pop();
+    }
+
+    /**
+     * dfs的非递归(循环)实现获取树深度
+     *
+     * @param root       根节点
+     * @param childField 子节点列表字段名称
+     * @param <T>        节点类型
+     * @return 树深度
+     */
+    public static <T> int getTreeDepthByDfsWithLoop(T root, String childField) {
+        if (root == null || !StringUtils.hasText(childField)) {
+            return 0;
+        }
+        Stack<Iterator> stack = new Stack<>();
+        List<T> list = new ArrayList<>();
+        list.add(root);
+        Iterator<T> iterator = list.iterator();
+        Iterator<T> emptyIterator = (Iterator<T>) Collections.emptyList().iterator();
+        int depth = 0;
+        while (true) {
+            while (!iterator.hasNext() && !stack.isEmpty()) {
+                iterator = stack.pop();
+            }
+            if (!iterator.hasNext() && stack.isEmpty()) {
+                break;
+            }
+            stack.push(iterator);
+            depth = Math.max(depth, stack.size());
+            T next = iterator.next();
+            Collection<T> childs = (Collection<T>) getFieldValue(next, childField);
+            if (childs != null) {
+                childs = childs.stream().filter(o -> o != null).collect(Collectors.toList());
+            }
+            iterator = childs == null ? emptyIterator : childs.iterator();
+        }
+        return depth;
+    }
+
+    /**
+     * bfs的递归实现获取树深度
+     *
+     * @param root       根节点
+     * @param childField 子节点列表字段名称
+     * @param <T>        节点类型
+     * @return 树深度
+     */
+    public static <T> int getTreeDepthByBfsWithRecursion(T root, String childField) {
+        if (root == null || !StringUtils.hasText(childField)) {
+            return 0;
+        }
+        List<T> parents = new ArrayList<>();
+        parents.add(root);
+        List<Integer> depth = new ArrayList<>(1);
+        depth.add(0);
+        doGetTreeDepthByBfs(parents, childField, depth);
+        return depth.get(0);
+    }
+
+    private static <T> void doGetTreeDepthByBfs(Collection<T> parents, String childField, List<Integer> depth) {
+        if (parents.isEmpty()) {
+            return;
+        }
+        depth.set(0, depth.get(0) + 1);
+        readChilds(parents, childField);
+        doGetTreeDepthByBfs(parents, childField, depth);
+    }
+
+    /**
+     * bfs的非递归(循环)实现获取树深度
+     *
+     * @param root       根节点
+     * @param childField 子节点列表字段名称
+     * @param <T>        节点类型
+     * @return 树深度
+     */
+    public static <T> int getTreeDepthByBfsWithLoop(T root, String childField) {
+        if (root == null || !StringUtils.hasText(childField)) {
+            return 0;
+        }
+        List<T> parents = new ArrayList<>();
+        parents.add(root);
+        int depth = 0;
+        while (!parents.isEmpty()) {
+            depth++;
+            readChilds(parents, childField);
+        }
+        return depth;
+    }
+
+
+    private static <T> void readChilds(Collection<T> parents, String childField) {
+        List<T> allChilds = new ArrayList<>();
+        for (T parent : parents) {
+            Collection<T> childs = (Collection<T>) getFieldValue(parent, childField);
+            if (childs == null) {
+                continue;
+            }
+            allChilds.addAll(childs.stream().filter(o -> o != null).collect(Collectors.toList()));
+        }
+        parents.clear();
+        parents.addAll(allChilds);
+    }
+
+    /**
+     * 获取字段值
+     *
+     * @param element   待获取值的对象
+     * @param fieldName 字段名称
+     * @param <T>       对象类型
+     * @return 字段值
+     */
+    private static <T> Object getFieldValue(T element, String fieldName) {
+        try {
+            Field field = element.getClass().getDeclaredField(fieldName);
+            field.setAccessible(true);
+            return field.get(element);
+        } catch (IllegalAccessException exception) {
+            throw new RuntimeException("no permission to read field [" + fieldName + "]!");
+        } catch (NoSuchFieldException e) {
+            throw new RuntimeException("field [" + fieldName + "] not exists!");
+        }
+    }
+}

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

@@ -6,6 +6,7 @@ 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 org.apache.poi.xssf.usermodel.XSSFWorkbook;
 
 import java.io.File;
 import java.io.FileOutputStream;
@@ -26,6 +27,8 @@ public class ExcelPoiUtil<T> {
     /**
      * excel 对象
      */
+    private XSSFWorkbook xssfWorkbook;
+
     private HSSFWorkbook workbook;
     /**
      * 表格标题
@@ -130,6 +133,17 @@ public class ExcelPoiUtil<T> {
         return this.workbook;
     }
 
+    /**
+     * 返回workbook
+     * @param listTpamsColEntity 表头数据
+     * @param datas           行内数据
+     * @param mergeIndex      需要纵向合并的单元格列号(默认有横向合并)
+     */
+    public XSSFWorkbook exportXssfWorkbook(List<ColEntity> listTpamsColEntity, List<T> datas,List<Integer> mergeIndex) throws Exception {
+        splitDataToSheets(this.title,datas, listTpamsColEntity, mergeIndex,false);
+        EasyExcelStyleUtil.setStyleByType(this.xssfWorkbook,null,0,null);
+        return this.xssfWorkbook;
+    }
     /**
      * 返回workbook
      * @param listTpamsColEntity 表头数据

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

@@ -8,7 +8,6 @@ import lombok.Data;
 import lombok.NoArgsConstructor;
 
 import java.math.BigDecimal;
-import java.util.Date;
 
 /**
  * @program: CostAccount

+ 1 - 0
src/main/java/com/kcim/dao/mapper/CostCostingGroupMapper.java

@@ -86,6 +86,7 @@ public interface CostCostingGroupMapper extends BaseMapper<CostCostingGroup> {
      * @param startIndex 开始索引
      * @param pageSize 每页数据大小
      * @param year 年
+     *
      * @param month 月
      * @param hospId 医院id
      * @return 列表

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

@@ -57,4 +57,11 @@ public interface ImportPatientItemMapper extends BaseMapper<ImportPatientItem> {
 
     List<PatientItemDepartmentGroupVo>  getDepartAmountGroup(@Param("computeDate") String computeDate,
                               @Param("hospId") Long hospId);
+
+    long getDrugCount(@Param("computeDate") String computeDate,
+                      @Param("hospId") Long hospId);
+
+    List<PatientItemDepartmentGroupVo> getByNoCalculateComputeDateDrugMaterial(@Param("page") Page<PatientItemDepartmentGroupVo> page,
+                                                                               @Param("computeDate") String computeDate,
+                                                                               @Param("hospId") Long hospId);
 }

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

@@ -4,7 +4,6 @@ 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.kcim.vo.AccountVO;
 import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.NoArgsConstructor;
@@ -17,7 +16,6 @@ import java.util.List;
  * 会计科目管理表
  * 
  * @author huangrui
- * @email 
  * @date 2021-07-28 13:52:24
  */
 @Data

+ 62 - 60
src/main/java/com/kcim/dao/model/ComputeDrugCostDetail.java

@@ -4,21 +4,19 @@ 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;
 
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
 /**
  * 药材成本计算明细表
- * 
+ *
  * @author Wang.YS
-
  * @date 2024-01-11 19:57:43
  */
 @Data
@@ -27,60 +25,64 @@ import lombok.experimental.Accessors;
 @NoArgsConstructor
 @TableName("compute_drug_cost_detail")
 public class ComputeDrugCostDetail implements Serializable {
-	private static final long serialVersionUID = 1L;
+    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;
+    /**
+     * 主键
+     */
+    @TableId
+    private Integer id;
+    /**
+     * 医院id
+     */
+    private Long hospId;
+    /*
+     * 核算年月
+     */
+    private String computeDate;
+    /**
+     * 收费项目成本主键
+     */
+    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;
+    @TableField(exist = false)
+    private Integer index;
 
 }

+ 0 - 1
src/main/java/com/kcim/dao/model/CostIncomeGroup.java

@@ -16,7 +16,6 @@ import java.util.Date;
  * 收入归集
  * 
  * @author KCYG
- * @email KCYG@xinxicom
  * @date 2021-08-10 13:50:52
  */
 @Data

+ 6 - 4
src/main/java/com/kcim/dao/model/ReportForm.java

@@ -1,17 +1,17 @@
 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;
 
+import java.io.Serializable;
+import java.util.List;
+
 /**
  * 报表项目
  *
@@ -92,5 +92,7 @@ public class ReportForm implements Serializable {
     private Integer costType;
 
     private Integer fraction;
+    @TableField(exist = false)
+    private List<ReportForm> child;
 
 }

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

@@ -52,4 +52,8 @@ public class ResponsibilityDepartment implements Serializable {
 	@TableLogic(value = "0",delval = "UNIX_TIMESTAMP(NOW()) * 1000")
 	private Long deleteTime;
 
+	private String responsibilityCode;
+
+	private String departmentCode;
+
 }

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

@@ -33,4 +33,8 @@ public class PatientItemDepartmentGroupVo {
 
     private String responsibilityCode;
 
+    private String itemTypeCode;
+
+    private String itemType;
+
 }

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

@@ -5,7 +5,6 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 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;
 

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

@@ -9,6 +9,7 @@ import org.springframework.stereotype.Repository;
 import org.springframework.util.CollectionUtils;
 
 import java.util.ArrayList;
+import java.util.Date;
 import java.util.List;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
@@ -46,4 +47,16 @@ public class ComputeDrugCostDetailRepository extends ServiceImpl<ComputeDrugCost
             }
         }
     }
+
+    public void removeByComputeDate(String computeDate, SessionUserVO currentUser) {
+        UpdateWrapper<ComputeDrugCostDetail> updateWrapper = new UpdateWrapper<>();
+        updateWrapper.lambda().eq(ComputeDrugCostDetail::getDelFlag, 0)
+                .eq(ComputeDrugCostDetail::getHospId, currentUser.getHospId())
+                .eq(ComputeDrugCostDetail::getComputeDate, computeDate)
+                .set(ComputeDrugCostDetail::getDeleteTime,new Date())
+                .set(ComputeDrugCostDetail::getDeleteUser,String.valueOf(currentUser.getId()))
+                .set(ComputeDrugCostDetail::getDelFlag, 1);
+
+        this.update(updateWrapper);
+    }
 }

+ 24 - 16
src/main/java/com/kcim/dao/repository/ComputeDrugCostRepository.java

@@ -1,21 +1,18 @@
 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.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.Date;
 import java.util.List;
-import java.util.stream.Collectors;
 
 /**
  * @program: CostAccount
@@ -25,17 +22,28 @@ import java.util.stream.Collectors;
  **/
 @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 void 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<>();
+
+        UpdateWrapper<ComputeDrugCost> updateWrapper = new UpdateWrapper<>();
+        updateWrapper.lambda().eq(ComputeDrugCost::getDelFlag, 0)
+                .eq(ComputeDrugCost::getHospId, currentUser.getHospId())
+                .eq(ComputeDrugCost::getComputeDate, computeDate)
+                .set(ComputeDrugCost::getDeleteTime,new Date())
+                .set(ComputeDrugCost::getDeleteUser,String.valueOf(currentUser.getId()))
+                .set(ComputeDrugCost::getDelFlag, 1);
+
+        this.update(updateWrapper);
+
     }
 
     public Page<ComputeDrugCostPageDto> getByPage(Integer current, Integer pageSize, String computeDate, String responsibilityCode, String filter) {

+ 0 - 1
src/main/java/com/kcim/dao/repository/ComputeStandPatientProjectCostDetailRepository.java

@@ -3,7 +3,6 @@ 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.ComputeStandPatientProjectCostDetailMapper;
-import com.kcim.dao.model.ComputeStandPatientProjectCost;
 import com.kcim.dao.model.ComputeStandPatientProjectCostDetail;
 import com.kcim.vo.SessionUserVO;
 import org.springframework.stereotype.Repository;

+ 14 - 8
src/main/java/com/kcim/dao/repository/ImportPatientItemRepository.java

@@ -126,6 +126,11 @@ public class ImportPatientItemRepository extends ServiceImpl<ImportPatientItemMa
         return this.list(queryWrapper);
     }
 
+    public List<PatientItemDepartmentGroupVo> getByNoCalculateComputeDateDrugMaterial(Integer current, Integer pageSize,String computeDate, SessionUserVO currentUser) {
+        return baseMapper.getByNoCalculateComputeDateDrugMaterial(new Page<>(current, pageSize), computeDate, currentUser.getHospId());
+
+    }
+
     @Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRED)
     public void updateCalculateFlag(List<ImportPatientItem> items) {
         items.forEach(f -> f.setCalculateFlag(NumberConstant.ONE));
@@ -135,14 +140,15 @@ public class ImportPatientItemRepository extends ServiceImpl<ImportPatientItemMa
     }
 
     public long getDrugCount(String computeDate, SessionUserVO currentUser) {
-        List<Integer> list = new ArrayList<>();
-        list.add(1);
-        list.add(2);
-        LambdaQueryWrapper<ImportPatientItem> queryWrapper = new LambdaQueryWrapper<>();
-        queryWrapper.eq(ImportPatientItem::getHospId, currentUser.getHospId());
-        queryWrapper.eq(ImportPatientItem::getComputeDate, computeDate);
-        queryWrapper.in(ImportPatientItem::getItemTypeCode, list);
-        return this.count(queryWrapper);
+//        List<Integer> list = new ArrayList<>();
+//        list.add(1);
+//        list.add(2);
+//        LambdaQueryWrapper<ImportPatientItem> queryWrapper = new LambdaQueryWrapper<>();
+//        queryWrapper.eq(ImportPatientItem::getHospId, currentUser.getHospId());
+//        queryWrapper.eq(ImportPatientItem::getComputeDate, computeDate);
+//        queryWrapper.in(ImportPatientItem::getItemTypeCode, list);
+//        return this.count(queryWrapper);
+        return this.baseMapper.getDrugCount(computeDate,currentUser.getHospId());
     }
 
     public long getItemCount(String computeDate, SessionUserVO currentUser) {

+ 0 - 2
src/main/java/com/kcim/dao/repository/ItemNoValuationDrugMaterialMapRepository.java

@@ -6,8 +6,6 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.kcim.common.util.UserContext;
 import com.kcim.dao.mapper.ItemNoValuationDrugMaterialMapMapper;
 import com.kcim.dao.model.ItemNoValuationDrugMaterialMap;
-import com.kcim.dao.model.ItemSpaceMap;
-import com.kcim.dao.model.ItemValuationDrugMaterialMap;
 import org.springframework.stereotype.Repository;
 
 import java.util.Date;

+ 4 - 0
src/main/java/com/kcim/endPoint/CenterEndPoint.java

@@ -5,6 +5,8 @@ import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestParam;
 
+import java.util.List;
+
 /**
  * @program: pfm_manager
  * @description: 中台方法调用
@@ -47,4 +49,6 @@ public interface CenterEndPoint {
 
     @GetMapping("/api/getKCClass")
     Object getKCClass(@RequestParam(required = false,name = "className") String className);
+    @GetMapping("/sysdepartment/getDepartmentByDepartmentIds")
+    Object getDepartmentByDepartmentIds(@RequestParam(required = false,name = "departmentIds")List<Long> departmentIds);
 }

+ 2 - 0
src/main/java/com/kcim/service/CenterService.java

@@ -33,4 +33,6 @@ public interface CenterService {
     CommonParameterVo getParameter(Long parameterCode);
 
     List<KCClassVo>  getKCClass();
+
+    List<SysDepartment>  getDepartmentByDepartmentIds(List<Long> departmentIds);
 }

+ 0 - 1
src/main/java/com/kcim/service/ResponsibilityService.java

@@ -23,7 +23,6 @@ public interface ResponsibilityService extends IService<Responsibility> {
     /**
      * 责任中心列表不分页
      *
-     * @param user 当前登录人员
      * @return
      */
     List<CostResponsibilityVO> getList();

+ 6 - 0
src/main/java/com/kcim/service/SqlService.java

@@ -3,6 +3,7 @@ package com.kcim.service;
 import com.kcim.dao.model.Sql;
 
 import java.util.List;
+import java.util.Map;
 
 /**
  * @program: CostAccount
@@ -24,4 +25,9 @@ public interface SqlService {
     void sortSql(List<Sql> sql);
 
     List<Sql> getSqlBySqlType(String sqlType);
+
+    void autoExecuteSql(String sqlType, Map<String,String> parameter) ;
+
+
+
 }

+ 12 - 7
src/main/java/com/kcim/service/impl/CenterServiceImpl.java

@@ -13,10 +13,8 @@ import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
+import java.util.*;
+import java.util.stream.Collectors;
 
 import static com.kcim.common.constants.Constant.CENTER_SYSTEM_ID;
 import static com.kcim.common.constants.Constant.LOCAL_SYSTEM_ID;
@@ -61,8 +59,11 @@ public class CenterServiceImpl implements CenterService {
 
     @Override
     public Map<String, String> getDepartment() {
-        Object dict = endPoint.getDepartment();
-        return  (Map<String, String>) dict;
+        Object departmentFilter = endPoint.getDepartmentFilter(null);
+        List<SysDepartment> sysDepartments = JSON.parseArray(JSON.toJSONString(departmentFilter), SysDepartment.class);
+        return sysDepartments.stream().collect(Collectors.toMap(SysDepartment::getCode, SysDepartment::getName, (a, b) -> b));
+
+//        return  (Map<String, String>) dict;
 
     }
 
@@ -93,5 +94,9 @@ public class CenterServiceImpl implements CenterService {
         return new ArrayList<>();
     }
 
-
+    @Override
+    public List<SysDepartment> getDepartmentByDepartmentIds(List<Long> departmentIds) {
+        Object departmentByDepartmentIds = endPoint.getDepartmentByDepartmentIds(departmentIds);
+        return JSON.parseArray(JSON.toJSONString(departmentByDepartmentIds), SysDepartment.class);
+    }
 }

+ 10 - 5
src/main/java/com/kcim/service/impl/ComputePatientCostServiceImpl.java

@@ -2,12 +2,12 @@ package com.kcim.service.impl;
 
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.kcim.common.constants.NumberConstant;
+import com.kcim.common.constants.SQLParameter;
+import com.kcim.common.enums.CustomSqlTypeEnum;
 import com.kcim.common.enums.ReportItemTypeEnum;
-import com.kcim.common.exception.CostException;
 import com.kcim.common.util.BeanUtil;
 import com.kcim.common.util.PageUtils;
-import com.kcim.common.util.UserContext;
-import com.kcim.dao.model.*;
+import com.kcim.dao.model.ComputePatientCostDetail;
 import com.kcim.dao.model.dto.ComputeItemGroupByVisitNoDto;
 import com.kcim.dao.model.dto.ComputePatientCostPageDto;
 import com.kcim.dao.repository.ComputeItemCostRepository;
@@ -16,6 +16,7 @@ import com.kcim.dao.repository.ComputePatientCostRepository;
 import com.kcim.dao.repository.ImportPatientInfoRepository;
 import com.kcim.service.ComputeItemCostService;
 import com.kcim.service.ComputePatientCostService;
+import com.kcim.service.SqlService;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
@@ -25,7 +26,6 @@ import org.springframework.util.CollectionUtils;
 
 import java.math.BigDecimal;
 import java.util.*;
-import java.util.stream.Collectors;
 
 /**
  * @program: CostAccount
@@ -55,7 +55,7 @@ public class ComputePatientCostServiceImpl implements ComputePatientCostService
     ComputeItemCostRepository computeItemCostRepository;
 
     ComputeItemCostService computeItemCostService;
-
+    SqlService sqlService;
 
     /**
      * 成本核算-病人成本计算-获取列表
@@ -84,6 +84,10 @@ public class ComputePatientCostServiceImpl implements ComputePatientCostService
     @Override
     @Transactional(rollbackFor = Exception.class,propagation = Propagation.REQUIRED)
     public void patientCostCalculate(String computeDate) {
+        Map<String,String> sqlParameter = new HashMap<>();
+        sqlParameter.put(SQLParameter.COMPUTE_DATE_CODE,computeDate);
+        sqlService.autoExecuteSql(CustomSqlTypeEnum.PT_COST_CALC.getCode(),sqlParameter);
+/*      暂时更换成自定义sql 执行 下面代码留用
         try {
             //获取导入的患者信息
             List<ImportPatientInfo> patientInfos = importPatientInfoRepository.getByComputeDate(computeDate);
@@ -146,6 +150,7 @@ public class ComputePatientCostServiceImpl implements ComputePatientCostService
             log.error(e.getMessage());
             throw new CostException(e.getMessage());
         }
+*/
 
     }
 

+ 22 - 13
src/main/java/com/kcim/service/impl/CostAccountShareServiceImpl.java

@@ -6,12 +6,12 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.fasterxml.jackson.core.type.TypeReference;
+import com.kcim.common.constants.NumberConstant;
 import com.kcim.common.exception.CostException;
 import com.kcim.common.util.BeanUtil;
 import com.kcim.common.util.JacksonUtil;
 import com.kcim.common.util.PageUtils;
 import com.kcim.common.util.UserContext;
-import com.kcim.common.constants.NumberConstant;
 import com.kcim.dao.mapper.CostAccountShareMapper;
 import com.kcim.dao.model.Accounting;
 import com.kcim.dao.model.CostAccountShare;
@@ -22,10 +22,7 @@ import com.kcim.dao.model.dto.CostAccountShareEditDto;
 import com.kcim.dao.model.dto.CostAccountShareSaveDto;
 import com.kcim.dao.model.dto.ShareParamEditDto;
 import com.kcim.service.*;
-import com.kcim.vo.CostAccountShareVO;
-import com.kcim.vo.CostShareParamStatusVO;
-import com.kcim.vo.CostShareParamVO;
-import com.kcim.vo.ShareParamProportionVO;
+import com.kcim.vo.*;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Propagation;
@@ -81,8 +78,8 @@ public class CostAccountShareServiceImpl extends ServiceImpl<CostAccountShareMap
                         .orderByDesc(Responsibility::getCreateTime)
         );
 
-        Map<Long,String> map = new HashMap<>();
-        if(!CollectionUtils.isEmpty(responsibilities)){
+        Map<Long, String> map = new HashMap<>();
+        if (!CollectionUtils.isEmpty(responsibilities)) {
             map = responsibilities.stream().collect(Collectors.toMap(Responsibility::getId, Responsibility::getShareName, (a, b) -> b));
         }
 
@@ -98,6 +95,16 @@ public class CostAccountShareServiceImpl extends ServiceImpl<CostAccountShareMap
             if (!CollectionUtils.isEmpty(map)) {
                 i.setShareName(map.get(i.getResponsibilityId()));
             }
+            if (!StringUtils.isEmpty(i.getParamList())) {
+                List<AccountShareVO> accountShareVOs = JacksonUtil.str2ObjList(i.getParamList(), List.class, AccountShareVO.class);
+                if (!CollectionUtils.isEmpty(accountShareVOs)) {
+                    StringBuilder shareParamBuilder = new StringBuilder();
+                    for (AccountShareVO accountShareVO : accountShareVOs) {
+                        shareParamBuilder.append(accountShareVO.getShareParamName()).append("x").append(accountShareVO.getShareParamPopout()).append("%").append("|");
+                    }
+                    i.setShareParamMap(org.apache.commons.lang3.StringUtils.removeEnd(shareParamBuilder.toString(), "|"));
+                }
+            }
         }
 //        getMessage(hospId, costAccountShareVOList);
         PageUtils pageUtils = new PageUtils(pages);
@@ -325,7 +332,8 @@ public class CostAccountShareServiceImpl extends ServiceImpl<CostAccountShareMap
         String paramList = costAccountShare.getParamList();
 //        return JsonUtil.toList(paramList, ShareParamProportionVO.class);
 //        return JacksonUtil.string2ObjList(paramList, List.class, ShareParamProportionVO.class);
-        return JacksonUtil.str2ObjList(paramList, new TypeReference<List<ShareParamProportionVO>>() {});
+        return JacksonUtil.str2ObjList(paramList, new TypeReference<List<ShareParamProportionVO>>() {
+        });
     }
 
     /**
@@ -346,7 +354,8 @@ public class CostAccountShareServiceImpl extends ServiceImpl<CostAccountShareMap
         List<CostShareParamStatusVO> costShareParamStatusVOList = BeanUtil.convertList(costShareParamServiceAll, CostShareParamStatusVO.class);
         if (!StringUtils.isEmpty(paramList)) {
 //            List<ShareParamProportionVO> shareParamProportionVOList = JsonUtil.toList(paramList, ShareParamProportionVO.class);
-            List<ShareParamProportionVO> shareParamProportionVOList = JacksonUtil.str2ObjList(paramList, new TypeReference<List<ShareParamProportionVO>>() {});
+            List<ShareParamProportionVO> shareParamProportionVOList = JacksonUtil.str2ObjList(paramList, new TypeReference<List<ShareParamProportionVO>>() {
+            });
             Map<Long, List<ShareParamProportionVO>> map = shareParamProportionVOList.stream().collect(Collectors.groupingBy(ShareParamProportionVO::getId));
             costShareParamStatusVOList.forEach(i -> {
                 Long paramId = i.getId();
@@ -415,7 +424,7 @@ public class CostAccountShareServiceImpl extends ServiceImpl<CostAccountShareMap
 //        List<Long> responsibilityIds = this.list(new QueryWrapper<CostAccountShare>().lambda().eq(CostAccountShare::getHospId, hospId)).stream().map(CostAccountShare::getResponsibilityId).distinct().collect(Collectors.toList());
         // 执行类型的分摊级别的Id的集合
         List<Long> costShareIds = costShareLevelService.list(new QueryWrapper<CostShareLevel>().lambda()
-                .eq(CostShareLevel::getHospId, hospId).eq(CostShareLevel::getCalcType, calcType))
+                        .eq(CostShareLevel::getHospId, hospId).eq(CostShareLevel::getCalcType, calcType))
                 .stream().map(CostShareLevel::getId).distinct().collect(Collectors.toList());
         String accountingIds = costAccountShare.getAccountingIds();
 //        List<Long> responsibilityIdList=null;
@@ -426,8 +435,8 @@ public class CostAccountShareServiceImpl extends ServiceImpl<CostAccountShareMap
         // 筛选指定类型的责任中心 并且当前没有设置的责任中心
 //        List<Long> finalResponsibilityIdList = responsibilityIdList;
         List<Responsibility> responsibilityList = responsibilityService.list(new QueryWrapper<Responsibility>().lambda()
-                .eq(Responsibility::getHospId, hospId)
-                .ne(Responsibility::getShareId,NumberConstant.ZERO))
+                        .eq(Responsibility::getHospId, hospId)
+                        .ne(Responsibility::getShareId, NumberConstant.ZERO))
                 .stream().filter(i -> costShareIds.contains(i.getShareId()) && !responsibilityId.equals(i.getId())).collect(Collectors.toList());
 //        && (CollUtil.isNotEmpty(finalResponsibilityIdList) && !finalResponsibilityIdList.contains(i.getId()))
         return responsibilityList;
@@ -465,7 +474,7 @@ public class CostAccountShareServiceImpl extends ServiceImpl<CostAccountShareMap
      * @param idList id集合
      */
     @Override
-    @Transactional(propagation = Propagation.REQUIRED,rollbackFor = Exception.class)
+    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
     public void deleteByIds(List<Long> idList) {
         this.removeByIds(idList);
     }

+ 1 - 48
src/main/java/com/kcim/service/impl/CostDataServiceImpl.java

@@ -3,28 +3,19 @@ package com.kcim.service.impl;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.kcim.common.constants.Constant;
 import com.kcim.common.constants.NumberConstant;
-import com.kcim.common.constants.SQLParameter;
 import com.kcim.common.exception.CostException;
 import com.kcim.common.util.PageUtils;
-import com.kcim.common.util.UserContext;
 import com.kcim.dao.model.ComputeCheckResult;
-import com.kcim.dao.model.Sql;
 import com.kcim.dao.repository.ComputeCheckResultRepository;
 import com.kcim.service.CenterService;
 import com.kcim.service.CostDataService;
 import com.kcim.service.SqlService;
 import com.kcim.vo.DictDataVo;
-import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
-import org.apache.ibatis.jdbc.SqlRunner;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 import org.springframework.util.CollectionUtils;
-import org.springframework.util.StringUtils;
 
-import java.sql.Connection;
-import java.sql.DriverManager;
-import java.sql.SQLException;
 import java.util.*;
 
 /**
@@ -152,47 +143,9 @@ public class CostDataServiceImpl implements CostDataService {
 
 
     public void autoExecuteSql(String sqlType, Map<String,String> parameter) {
-        List<Sql> sqlList = sqlService.getSqlBySqlType(sqlType);
-
-        //取出需要执行的sql
-        if(!CollectionUtils.isEmpty(sqlList)){
-            sqlList.sort(Comparator.comparing(Sql::getSort,Comparator.nullsLast(Integer::compareTo)));
-            for(Sql sql:sqlList){
-                String executeSql = sql.getSql();
-                executeSql = MatchSystemParameter(executeSql);
-                //替换传参
-                if(!CollectionUtils.isEmpty(parameter)){
-                    for(String s:parameter.keySet()){
-                        //拼接 #
-                        String sqlFilter = "#" + s;
-                        if (executeSql.contains(sqlFilter)) {
-                            executeSql = executeSql.replace(sqlFilter, parameter.get(s));
-                        }
-                    }
-                }
-                try {
-                    SqlRunner sqlRunner = new SqlRunner(getConnection());
-                    sqlRunner.run(executeSql);
-                } catch (SQLException | ClassNotFoundException e) {
-                    throw new RuntimeException(e);
-                }
-            }
-        }
+        sqlService.autoExecuteSql(sqlType,parameter);
 
     }
 
-    private Connection getConnection() throws SQLException, ClassNotFoundException {
-        Class.forName(driver);
-        return DriverManager.getConnection(url, username, password);
-    }
-    private static String MatchSystemParameter(String sql) {
-        if(StringUtils.isEmpty(sql)){
-            throw new CostException("无效自定义sql语句");
-        }
-        if (sql.contains(SQLParameter.HOSP_ID_CODE)) {
-            sql = sql.replace(SQLParameter.HOSP_ID_CODE, String.valueOf(UserContext.getCurrentLoginHospId()));
-        }
 
-        return sql;
-    }
 }

+ 393 - 183
src/main/java/com/kcim/service/impl/CostDepartmentProfitServiceImpl.java

@@ -1,6 +1,8 @@
 package com.kcim.service.impl;
 
 import cn.afterturn.easypoi.excel.entity.params.ExcelExportEntity;
+import cn.afterturn.easypoi.util.PoiCellUtil;
+import cn.afterturn.easypoi.util.PoiMergeCellUtil;
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.date.DateTime;
 import cn.hutool.core.date.DateUtil;
@@ -32,6 +34,10 @@ import org.apache.commons.fileupload.FileItemFactory;
 import org.apache.commons.fileupload.disk.DiskFileItemFactory;
 import org.apache.poi.hssf.usermodel.HSSFWorkbook;
 import org.apache.poi.ss.usermodel.Sheet;
+import org.apache.poi.ss.util.CellRangeAddress;
+import org.apache.poi.xssf.usermodel.XSSFRow;
+import org.apache.poi.xssf.usermodel.XSSFSheet;
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Propagation;
 import org.springframework.transaction.annotation.Transactional;
@@ -49,6 +55,7 @@ import java.text.DecimalFormat;
 import java.util.*;
 import java.util.concurrent.atomic.AtomicReference;
 import java.util.stream.Collectors;
+import java.util.stream.IntStream;
 
 import static com.kcim.common.constants.Constant.PROFIT_REPORT_TYPE;
 import static com.kcim.common.constants.ParameterConstant.MEDICAL_TECHNIQUES_SHARE_LEVEL_ID;
@@ -92,6 +99,9 @@ public class CostDepartmentProfitServiceImpl extends ServiceImpl<CostDepartmentP
 
     private final String PERCENT = "占比";
 
+    private final String AMOUNT_FIELD = "amount";
+
+    private final String PERCENT_FIELD = "percent";
 
     public CostDepartmentProfitServiceImpl(ReportFormService reportFormService, IncomeCollectionService incomeCollectionService, CostShareLevelService costShareLevelService, ResponsibilityService responsibilityService, ReportRelationService reportRelationService, AllocationService allocationService, AllocationQueryService allocationQueryService, FileRecordService fileRecordService, MinioConfig minioConfig, MinioFileUtil minioFileUtil, CenterService centerService, CostDepartmentProfitRepository costDepartmentProfitRepository) {
         this.reportFormService = reportFormService;
@@ -627,6 +637,7 @@ public class CostDepartmentProfitServiceImpl extends ServiceImpl<CostDepartmentP
         Map<String, List<CostDepartmentProfit>> doctorParentMap = departmentProfits.stream().collect(Collectors.groupingBy(CostDepartmentProfit::getParentResponsibilityCode));
 //        Map<String, List<CostDepartmentProfit>> yiParentMap = costDepartmentProfits.stream().collect(Collectors.groupingBy(CostDepartmentProfit::getParentResponsibilityCode));
 
+
         //列
         List<TitleEntity> titleEntities = titleList.stream().filter(TitleEntity::isLast).collect(Collectors.toList());
         List<Map<String, String>> rowList = new ArrayList<>();
@@ -673,6 +684,7 @@ public class CostDepartmentProfitServiceImpl extends ServiceImpl<CostDepartmentP
                 for (int i = 0; i < 2; i++) {
                     Map<String, String> m = new HashMap<String, String>();
                     for (TitleEntity titleEntity : titleEntities) {
+
                         if (titleEntity.getId().equals("parentResponsibility")) {
                             m.put("parent", v1.get(0).getParentResponsibilityName());
                         } else if (titleEntity.getId().equals("childResponsibility")) {
@@ -761,20 +773,73 @@ public class CostDepartmentProfitServiceImpl extends ServiceImpl<CostDepartmentP
         } else {
             return true;
         }
-//        else {
-//            TitleEntity entity = new TitleEntity();
-//            entity.setId("amount"+reportForm.getId());
-//            entity.setPid(String.valueOf(reportForm.getId()));
-//            entity.setContent("金额");
-//            entity.setFieldName("amount"+reportForm.getId());
-//            titleList.add(entity);
-//            TitleEntity entity1 = new TitleEntity();
-//            entity1.setId("percent"+reportForm.getId());
-//            entity1.setPid(String.valueOf(reportForm.getId()));
-//            entity1.setContent("占比");
-//            entity1.setFieldName("percent"+reportForm.getId());
-//            titleList.add(entity1);
-//        }
+
+    }
+    private boolean getChild(List<TitleEntity> titleList, String parentResponsibilityCode,
+                             Map<String, List<ResponsibilityVo>> collect, Map<String, Long> responseCodeIdMap, String pid) {
+        List<ResponsibilityVo> forms = collect.get(parentResponsibilityCode);
+        if (!CollectionUtils.isEmpty(forms)) {
+            for (ResponsibilityVo form : forms) {
+                TitleEntity entity = new TitleEntity();
+                entity.setPid(pid);
+                entity.setContent(form.getResponsibilityName());
+                entity.setFieldName(form.getResponsibilityName());
+                entity.setWidth(10);
+                entity.setSort(1);
+                if(form.getResponsibilityCode().equals(parentResponsibilityCode)){
+                    entity.setId(responseCodeIdMap.get(form.getResponsibilityCode())+"child");
+                    entity.setLast(false);
+                    titleList.add(entity);
+                    //添加固定两列金额 占比
+                    TitleEntity amountEntity = new TitleEntity();
+                    amountEntity.setId(parentResponsibilityCode+"|"+AMOUNT_FIELD);
+                    amountEntity.setPid(responseCodeIdMap.get(form.getResponsibilityCode())+"child");
+                    amountEntity.setContent("金额");
+                    amountEntity.setFieldName(parentResponsibilityCode+"|"+AMOUNT_FIELD);
+                    amountEntity.setWidth(15);
+                    amountEntity.setSort(2);
+                    amountEntity.setLast(true);
+                    titleList.add(amountEntity);
+                    TitleEntity percentEntity = new TitleEntity();
+                    percentEntity.setId(parentResponsibilityCode+"|"+PERCENT_FIELD);
+                    percentEntity.setPid(responseCodeIdMap.get(form.getResponsibilityCode())+"child");
+                    percentEntity.setContent("占比");
+                    percentEntity.setFieldName(parentResponsibilityCode+"|"+PERCENT_FIELD);
+                    percentEntity.setWidth(10);
+                    percentEntity.setSort(2);
+                    percentEntity.setLast(true);
+                    titleList.add(percentEntity);
+                }else {
+                    entity.setId(String.valueOf(responseCodeIdMap.get(form.getResponsibilityCode())));
+
+                    boolean last = getChild(titleList, form.getResponsibilityCode(), collect, responseCodeIdMap, String.valueOf(responseCodeIdMap.get(form.getResponsibilityCode())));
+                    entity.setLast(last);
+                    titleList.add(entity);
+                }
+
+            }
+        } else {
+            //添加固定两列金额 占比
+            TitleEntity amountEntity = new TitleEntity();
+            amountEntity.setId(parentResponsibilityCode+"|"+AMOUNT_FIELD);
+            amountEntity.setPid(pid);
+            amountEntity.setContent("金额");
+            amountEntity.setFieldName(parentResponsibilityCode+"|"+AMOUNT_FIELD);
+            amountEntity.setWidth(15);
+            amountEntity.setSort(2);
+            amountEntity.setLast(true);
+            titleList.add(amountEntity);
+            TitleEntity percentEntity = new TitleEntity();
+            percentEntity.setId(parentResponsibilityCode+"|"+PERCENT_FIELD);
+            percentEntity.setPid(pid);
+            percentEntity.setContent("占比");
+            percentEntity.setFieldName(parentResponsibilityCode+"|"+PERCENT_FIELD);
+            percentEntity.setWidth(10);
+            percentEntity.setSort(2);
+            percentEntity.setLast(true);
+            titleList.add(percentEntity);
+        }
+        return false;
 
     }
 
@@ -819,49 +884,40 @@ public class CostDepartmentProfitServiceImpl extends ServiceImpl<CostDepartmentP
         if (CollectionUtils.isEmpty(dataVoList)) {
             throw new CostException("未找到损益报表类型字典");
         }
-        Map<String, DictDataVo> dictMap = dataVoList.stream().collect(Collectors.toMap(DictDataVo::getCode, vo -> vo, (a, b) -> b));
+//        Map<String, DictDataVo> dictMap = dataVoList.stream().collect(Collectors.toMap(DictDataVo::getCode, vo -> vo, (a, b) -> b));
         //去除全院损益字典
         List<DictDataVo> collect = dataVoList.stream().filter(f -> f.getValue().equals(NumberConstant.ONE_S)).collect(Collectors.toList());
         if(CollectionUtils.isEmpty(collect)){
             throw new CostException("未找到科室损益报表类型字典");
         }
-//        ExecutorService pool = Executors.newFixedThreadPool(5);
+//        FileItemFactory factory = new DiskFileItemFactory(5242880, null);
+
+//        FileItem fileItem = factory.createItem("file", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8", true,   "测试用.xls");
+////            try {
+//        OutputStream  outputStream = fileItem.getOutputStream();
 
         for (DictDataVo vo : collect) {
-//            pool.execute(new Runnable() {
-//                /**
-//                 * When an object implementing interface <code>Runnable</code> is used
-//                 * to create a thread, starting the thread causes the object's
-//                 * <code>run</code> method to be called in that separately executing
-//                 * thread.
-//                 * <p>
-//                 * The general contract of the method <code>run</code> is that it may
-//                 * take any action whatsoever.
-//                 *
-//                 * @see Thread#run()
-//                 */
-//                @Override
-//                public void run() {
-//
-//                }
-//            });
+
             Integer reportDictType = Integer.valueOf(vo.getCode());
 
             String time = DateUtil.format(DateUtil.date(), "yyyy年MM月dd日HH时mm分ss秒");
 
             FileItemFactory factory = new DiskFileItemFactory(5242880, null);
 
-            FileItem fileItem = factory.createItem("file", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8", true, vo.getName() + time + ".xls");
+            FileItem fileItem = factory.createItem("file", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8", true, vo.getName() + time + ".xlsx");
 //            try {
-                OutputStream  outputStream = fileItem.getOutputStream();
-                getDepartmentProfit(date, outputStream, reportDictType,vo.getName());
+            OutputStream  outputStream = fileItem.getOutputStream();
+//                getDepartmentProfit(date, outputStream, reportDictType,vo.getName());
+            exportDepartmentProfit(date, outputStream, reportDictType,vo.getName());
+
+
 //            } catch (Exception e) {
 //                throw new RuntimeException(e);
 //            }
             MultipartFile multipartFile = new CommonsMultipartFile(fileItem);
             String file = uploadFile(multipartFile);
             FileRecord fileRecord = new FileRecord();
-            fileRecord.setFileName(vo.getName() + time + ".xls")
+            fileRecord.setFileName(vo.getName() + time + ".xlsx")
                     .setFileSource(reportType)
                     .setFileType(vo.getName())
                     .setFileUrl(file)
@@ -891,152 +947,6 @@ public class CostDepartmentProfitServiceImpl extends ServiceImpl<CostDepartmentP
 
 
 
-    private void handleDepartmentProfit(String date, OutputStream outputStream, Integer reportType, String name) throws Exception {
-
-        Long hospId = UserContext.getHospId();
-        DateTime dateTime = DateUtil.parse(date);
-        int year = DateUtil.year(dateTime);
-        int month = DateUtil.month(dateTime) + 1;
-
-         Map<String,List<ColEntity>> heads = new HashMap<>();// 最终导出的多个sheet的表头
-         Map<String,List<Map<String, String>>> datas = new HashMap<>();// 最终导出的多个sheet的内容
-         Map<String,Integer> types = new HashMap<>();// 最终导出的每个sheet的样式类型
-         Map<String,List<Integer>> autoRowHeights = new HashMap<>();// 最终导出的每个sheet的需要自适应行高的行号
-         Map<String,List<Integer>> mergeIndexs = new HashMap<>();
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-        // 查询所有的节点
-        List<Responsibility> responsibilityList = responsibilityService.list(new QueryWrapper<Responsibility>().lambda().eq(Responsibility::getHospId, hospId));
-        if (CollUtil.isEmpty(responsibilityList)) {
-            throw new CostException(500, "责任中心不存在");
-        }
-        Map<String, Long> responseCodeParentIdMap = responsibilityList.stream().collect(Collectors.toMap(Responsibility::getResponsibilityCode, Responsibility::getParentId, (a, b) -> b));
-
-        Map<Long, Responsibility> responsibilityIdMap = responsibilityList.stream().collect(Collectors.toMap(Responsibility::getId, responsibility -> responsibility, (a, b) -> b));
-
-        Map<String, Responsibility> responsibilityCodeMap = responsibilityList.stream().collect(Collectors.toMap(Responsibility::getResponsibilityCode, responsibility -> responsibility, (a, b) -> b));
-
-        // 表头
-        List<CostDepartmentProfit> departmentProfits = this.list(new QueryWrapper<CostDepartmentProfit>().lambda()
-                .eq(CostDepartmentProfit::getHospId, hospId)
-                .eq(CostDepartmentProfit::getYear, year).eq(CostDepartmentProfit::getMonth, month).eq(CostDepartmentProfit::getShareType, reportType));
-        if (CollectionUtils.isEmpty(departmentProfits)) {
-            throw new CostException(500, name+"未进行科室损益计算");
-        }
-        //损益报表数据没有 上级责任中心所以需要拼回去
-        for (CostDepartmentProfit departmentProfit : departmentProfits) {
-            Long aLong = responseCodeParentIdMap.get(departmentProfit.getResponsibilityCode());
-            if (aLong != null) {
-                if (aLong.equals(NumberConstant.ZERO_L)) {
-                    Responsibility responsibility = responsibilityCodeMap.get(departmentProfit.getResponsibilityCode());
-                    departmentProfit.setParentResponsibilityCode(departmentProfit.getResponsibilityCode());
-                    departmentProfit.setParentResponsibilityName(departmentProfit.getResponsibilityName());
-                    departmentProfit.setParentResponsibilityId(responsibility.getId());
-                    departmentProfit.setResponsibilityId(responsibility.getId());
-                } else {
-                    Responsibility responsibility = responsibilityIdMap.get(aLong);
-                    Responsibility currentResponsibility = responsibilityCodeMap.get(departmentProfit.getResponsibilityCode());
-                    if (Objects.nonNull(responsibility)) {
-                        departmentProfit.setParentResponsibilityCode(responsibility.getResponsibilityCode());
-                        departmentProfit.setParentResponsibilityName(responsibility.getResponsibilityName());
-                        departmentProfit.setParentResponsibilityId(aLong);
-                        departmentProfit.setResponsibilityId(currentResponsibility.getId());
-                    }
-                }
-            }
-        }
-        //损益表设置  行树层级
-        List<ReportForm> reportFormList = reportFormService.list(new QueryWrapper<ReportForm>().lambda()
-                .eq(ReportForm::getHospId, hospId)
-                .eq(ReportForm::getReportType, reportType));
-        if (CollUtil.isEmpty(reportFormList)) {
-            throw new CostException(500, "损益表未找到");
-        }
-        Map<Long, List<ReportForm>> collect = reportFormList.stream().collect(Collectors.groupingBy(ReportForm::getParentId));
-
-
-        //第一层
-        List<TitleEntity> titleList = new ArrayList<>();
-        titleList.add(new TitleEntity("0", null, name, false, NumberConstant.ZERO));
-        //添加默认三列责任中心
-//        setDefaultColumn(titleList);
-        //行
-        ArrayList<CostDepartmentProfit> headerDepartmentProfits = new ArrayList<>(departmentProfits.stream()
-                .collect(Collectors.toMap(
-                        CostDepartmentProfit::getResponsibilityCode, // 以 responsibilityCode 作为 key
-                        profit -> profit, // 保留 profit 对象
-                        (existing, replacement) -> existing // 如果有重复的 responsibilityCode,保留已有的对象
-                )).values());
-
-
-        Map<String, List<CostDepartmentProfit>> doctorParentMap = headerDepartmentProfits.stream().collect(Collectors.groupingBy(CostDepartmentProfit::getParentResponsibilityCode));
-        AtomicReference<Integer> patentPid = new AtomicReference<>(1);
-        doctorParentMap.forEach((parentResponsibilityCde,responseList)->{
-
-
-            Responsibility responsibility = responsibilityCodeMap.get(parentResponsibilityCde);
-            TitleEntity entity = new TitleEntity();
-            entity.setId(String.valueOf(responsibility.getId()));
-            entity.setPid(String.valueOf(patentPid));
-            entity.setContent(responsibility.getResponsibilityName());
-            entity.setFieldName(String.valueOf(responsibility.getId()));
-            entity.setWidth(20);
-            responseList.forEach(f->{
-                TitleEntity childEntity = new TitleEntity();
-                childEntity.setId(String.valueOf(f.getResponsibilityId()));
-                childEntity.setPid(f.getParentResponsibilityCode());
-                childEntity.setContent(f.getResponsibilityName());
-                childEntity.setFieldName(String.valueOf(f.getResponsibilityId()));
-                childEntity.setWidth(20);
-                childEntity.setLast(false);
-                titleList.add(childEntity);
-                getLastDefaultHeader(titleList,String.valueOf(f.getResponsibilityId()));
-            });
-            entity.setLast(false);
-            titleList.add(entity);
-            patentPid.getAndSet(patentPid.get() + 1);
-        });
-
-
-        //列
-        List<TitleEntity> titleEntities = titleList.stream().filter(TitleEntity::isLast).collect(Collectors.toList());
-        List<Map<String, String>> rowList = new ArrayList<>();
-
-//        setRowList(doctorParentMap, titleEntities, rowList);
-
-
-        ExcelPoiUtil excelTool = new ExcelPoiUtil(name);
-        Map<String, String> param = ImmutableMap.<String, String>builder().put("id", "id").put("pid", "pid")
-                .put("content", "content").put("fieldName", "fieldName").put("width", "width").build();
-        List<ColEntity> titleData = excelTool.colEntityTransformer(titleList, param, "0");
-
-        heads.put(name, titleData);// 每个sheet的表头,sheet名称为key
-        datas.put(name, rowList);// 每个sheet的内容,sheet名称为key
-
-        types.put(name, 0);// 每个sheet的样式类型,sheet名称为key
-//        mergeIndexs.put(name, Arrays.asList(0, 1));// 每个sheet的默认行高,sheet名称为key
-        autoRowHeights.put(name, Arrays.asList( 2, 3));
-
-        // 多个sheet导出
-        HSSFWorkbook workbook = excelTool.exportWorkbook(heads, datas, types, autoRowHeights, mergeIndexs);
-        excelTool.save(workbook, "D:\\测试用.xls");
-        workbook.write(outputStream);
-        workbook.close();
-
-    }
 
   private void  getLastDefaultHeader( List<TitleEntity> titleList,String responsibilityId){
         TitleEntity amountEntity = new TitleEntity();
@@ -1861,4 +1771,304 @@ public class CostDepartmentProfitServiceImpl extends ServiceImpl<CostDepartmentP
         }
         return bigDecimal;
     }
+
+
+    private void exportDepartmentProfit(String date, OutputStream outputStream, Integer reportType, String name) throws Exception {
+
+        Long hospId = UserContext.getHospId();
+        DateTime dateTime = DateUtil.parse(date);
+        int year = DateUtil.year(dateTime);
+        int month = DateUtil.month(dateTime) + 1;
+        // 查询所有的节点
+        List<Responsibility> responsibilityList = responsibilityService.list(new QueryWrapper<Responsibility>().lambda().eq(Responsibility::getHospId, hospId));
+        if (CollUtil.isEmpty(responsibilityList)) {
+            throw new CostException(500, "责任中心不存在");
+        }
+        Map<String, Long> responseCodeParentIdMap = responsibilityList.stream().collect(Collectors.toMap(Responsibility::getResponsibilityCode, Responsibility::getParentId, (a, b) -> b));
+        Map<Long, Responsibility> responsibilityIdMap = responsibilityList.stream().collect(Collectors.toMap(Responsibility::getId, responsibility -> responsibility, (a, b) -> b));
+        Map<String, String> responseCodeNameMap = responsibilityList.stream().collect(Collectors.toMap(Responsibility::getResponsibilityCode, Responsibility::getResponsibilityName, (a, b) -> b));
+        Map<String, Long> responseCodeIdMap = responsibilityList.stream().collect(Collectors.toMap(Responsibility::getResponsibilityCode, Responsibility::getId, (a, b) -> b));
+
+        // 损益表数据
+        List<CostDepartmentProfit> departmentProfits = this.list(new QueryWrapper<CostDepartmentProfit>().lambda()
+                .eq(CostDepartmentProfit::getHospId, hospId)
+                .eq(CostDepartmentProfit::getYear, year).eq(CostDepartmentProfit::getMonth, month)
+                .eq(CostDepartmentProfit::getShareType, reportType));
+        if (CollectionUtils.isEmpty(departmentProfits)) {
+            throw new CostException(500, name+"未进行科室损益计算");
+        }
+        for (CostDepartmentProfit departmentProfit : departmentProfits) {
+            Long aLong = responseCodeParentIdMap.get(departmentProfit.getResponsibilityCode());
+            if (aLong != null) {
+                if (aLong.equals(NumberConstant.ZERO_L)) {
+                    departmentProfit.setParentResponsibilityCode(departmentProfit.getResponsibilityCode());
+                    departmentProfit.setParentResponsibilityName(departmentProfit.getResponsibilityName());
+                } else {
+                    Responsibility responsibility = responsibilityIdMap.get(aLong);
+                    if (Objects.nonNull(responsibility)) {
+                        departmentProfit.setParentResponsibilityCode(responsibility.getResponsibilityCode());
+                        departmentProfit.setParentResponsibilityName(responsibility.getResponsibilityName());
+                    }
+                }
+
+            }
+        }
+        List<CostDepartmentProfit> profitList = departmentProfits.stream().filter(f -> StringUtils.isEmpty(f.getParentResponsibilityCode())).collect(Collectors.toList());
+        if(!CollectionUtils.isEmpty(profitList)){
+            log.info("{}报表类型存在无上级责任中心的数据,请核实配置数据",reportType);
+        }
+        Map<Long, List<CostDepartmentProfit>> profitReportIdGroup = departmentProfits.stream().collect(Collectors.groupingBy(CostDepartmentProfit::getReportId));
+        Map<Long, Map<String, CostDepartmentProfit>> profitReportResponsibilityGroup = new HashMap<>();
+        profitReportIdGroup.forEach((k,v)->{
+            profitReportResponsibilityGroup.put(k,v.stream().collect(Collectors.toMap(CostDepartmentProfit::getResponsibilityCode, costDepartmentProfit -> costDepartmentProfit, (a, b) -> b)));
+        });
+//        Map<String, List<CostDepartmentProfit>> doctorParentMap = departmentProfits.stream().collect(Collectors.groupingBy(CostDepartmentProfit::getParentResponsibilityCode));
+        //损益表设置
+        List<ReportForm> reportFormList = reportFormService.list(new QueryWrapper<ReportForm>().lambda()
+                .eq(ReportForm::getHospId, hospId)
+                .eq(ReportForm::getReportType, reportType));
+        if (CollUtil.isEmpty(reportFormList)) {
+            throw new CostException(500, "损益表未找到");
+        }
+        //第一层
+        List<TitleEntity> titleList = new ArrayList<>();
+        titleList.add(new TitleEntity("0", null, name, false, NumberConstant.ZERO));
+        //从损益数据中提取出所有责任中心组装成树
+        List<ResponsibilityVo> responsibilityVos = new ArrayList<>();
+        for (CostDepartmentProfit departmentProfit : departmentProfits) {
+            ResponsibilityVo responsibilityVo = new ResponsibilityVo();
+            responsibilityVo.setParentResponsibilityCode(departmentProfit.getParentResponsibilityCode());
+            responsibilityVo.setParentResponsibilityName(departmentProfit.getParentResponsibilityName());
+            responsibilityVo.setResponsibilityCode(departmentProfit.getResponsibilityCode());
+            responsibilityVo.setResponsibilityName(departmentProfit.getResponsibilityName());
+            responsibilityVos.add(responsibilityVo);
+        }
+        ListUtils.sort(responsibilityVos,ResponsibilityVo::getParentResponsibilityName);
+        Map<String, List<ResponsibilityVo>> responsibilityMap = responsibilityVos.stream().distinct().collect(Collectors.groupingBy(ResponsibilityVo::getParentResponsibilityCode));
+        responsibilityMap.forEach((k,v)->{
+            TitleEntity entity = new TitleEntity();
+            entity.setId(String.valueOf(responseCodeIdMap.get(k)));
+            entity.setPid("0");
+            entity.setContent(responseCodeNameMap.get(k));
+            entity.setFieldName(responseCodeNameMap.get(k));
+            entity.setWidth(15);
+            entity.setSort(1);
+            boolean child = getChild(titleList, k, responsibilityMap,responseCodeIdMap,String.valueOf(responseCodeIdMap.get(k)));
+            entity.setLast(child);
+            titleList.add(entity);
+        });
+
+
+        final List<ReportForm> finalReportFormList = reportFormList;
+        List<ReportForm> reportForms = reportFormList.stream().filter(i -> i.getParentId() == 0)
+                .peek(i -> i.setChild(this.getReportFormChild(i, finalReportFormList)))
+                .collect(Collectors.toList());
+        //列
+        List<TitleEntity> titleEntities = titleList.stream().filter(TitleEntity::isLast).collect(Collectors.toList());
+        List<Map<String, String>> rowList = new ArrayList<>();
+        List<Integer> depthList = new ArrayList<>();
+        for (ReportForm reportForm : reportForms) {
+            int child = TreeDepthUtil.getTreeDepthByDfsWithRecursion(reportForm, "child");
+            depthList.add(child);
+        }
+        OptionalInt max = depthList.stream().mapToInt(Integer::intValue).max();
+        //根据报表设置最深深度添加 默认列
+        int asInt = max.getAsInt();
+        for (int i = 1; i<= asInt; i++){
+            TitleEntity parentResponsibility = new TitleEntity();
+            parentResponsibility.setId(String.valueOf(i));
+            parentResponsibility.setPid("0");
+            parentResponsibility.setContent("");
+            parentResponsibility.setFieldName(String.valueOf(i));
+            parentResponsibility.setWidth(15);
+            parentResponsibility.setSort(NumberConstant.ZERO);
+            parentResponsibility.setLast(true);
+            titleList.add(parentResponsibility);
+        }
+        titleList.sort(Comparator.comparing(TitleEntity::getSort));
+        DecimalFormat df = new DecimalFormat("0.00%");
+        //递归排序
+        formSort(reportForms);
+        //配置单元格数据
+        for (ReportForm reportForm : reportForms) {
+            int fieldId = 1;
+            Map<String, String> m = new HashMap<String, String>();
+            if(!CollectionUtils.isEmpty(reportForm.getChild())){
+                m.put(Integer.toString(fieldId),reportForm.getReportName());
+                setRowList(fieldId,reportForm.getChild(),profitReportResponsibilityGroup,rowList,df,titleEntities,m,asInt);
+            }else {
+                for (int i = 1; i<= asInt; i++){
+                    m.put(Integer.toString(i),reportForm.getReportName());
+                }
+                Map<String, CostDepartmentProfit> map = profitReportResponsibilityGroup.get(reportForm.getId());
+                for (TitleEntity titleEntity : titleEntities) {
+                    String fieldName = titleEntity.getFieldName();
+                    if(fieldName.contains(AMOUNT_FIELD)){
+                        String[] split1 = StringUtils.split(fieldName, "|");
+                        if (split1 != null) {
+                            CostDepartmentProfit costDepartmentProfit = map.get(split1[0]);
+                            m.put(fieldName, costDepartmentProfit.getAmount().setScale(2, RoundingMode.HALF_UP).toString());
+
+                        }else {
+                            m.put(fieldName,"");
+                        }
+                    } else if (fieldName.contains(PERCENT_FIELD)) {
+                        String[] split1 = StringUtils.split(fieldName, "|");
+                        if (split1 != null) {
+                            CostDepartmentProfit costDepartmentProfit = map.get(split1[0]);
+                            if (costDepartmentProfit.getPercent() != null) {
+                                m.put(fieldName, df.format(costDepartmentProfit.getPercent()));
+                            } else {
+                                m.put(fieldName, "");
+                            }
+                        }else {
+                            m.put(fieldName,"");
+                        }
+                    }
+
+                }
+                rowList.add(m);
+            }
+
+        }
+
+        //表头树进行excel 元素转换
+        ExcelPoiUtil excelTool = new ExcelPoiUtil(name);
+        Map<String, String> param = ImmutableMap.<String, String>builder().put("id", "id").put("pid", "pid")
+                .put("content", "content").put("fieldName", "fieldName").put("width", "width").build();
+        List<ColEntity> titleData = excelTool.colEntityTransformer(titleList, param, "0");
+
+        List<Integer> mergeList = IntStream.range(0, asInt).boxed().collect(Collectors.toList());
+
+        // 多个sheet导出
+        XSSFWorkbook workbook = excelTool.exportXssfWorkbook(titleData, rowList,  null);
+//        CellRangeAddress cellAddresses = new CellRangeAddress(4,7,0,4);
+//        workbook.getSheetAt(0).addMergedRegion(cellAddresses);
+
+        //表头占的行数
+        int totalRow = titleData.get(0).getTotalRow();
+        int[] relationColl = new int[mergeList.size()];
+        Map<Integer,int[]> mergeMap = IntStream.range(0, mergeList.size()).boxed().collect(Collectors.toMap(i -> i, i -> relationColl, (a, b) -> b));
+        //手动横向合并
+        addMergeCells(workbook, mergeMap, asInt);
+        //纵向合并
+        PoiMergeCellUtil.mergeCells(workbook.getSheetAt(0),mergeMap,totalRow);
+//        int[] relationTitleColl = new int[totalRow];
+//
+//        Map<Integer,int[]> mergeTitleMap = IntStream.range(asInt-1, titleData.get(0).getTotalCol()).boxed().collect(Collectors.toMap(i -> i, i -> relationTitleColl, (a, b) -> b));
+//        PoiMergeCellUtil.mergeCells(workbook.getSheetAt(0),mergeTitleMap,1,totalRow-1);
+
+//        excelTool.save(workbook, "D:\\测试用.xls");
+        workbook.write(outputStream);
+        workbook.close();
+
+    }
+
+    private static void addMergeCells(XSSFWorkbook workbook, Map<Integer, int[]> mergeMap, int asInt) {
+        XSSFSheet sheet = workbook.getSheetAt(0);
+        //最后一行
+        Set<Integer> colKeyList = mergeMap.keySet();
+        int endRow = sheet.getLastRowNum();
+        for(int i = 4; i <= endRow; i++) {
+            //mergeMap
+            List<String> cellText = new ArrayList<>();
+            for (Integer integer : colKeyList) {
+                XSSFRow row = sheet.getRow(i);
+                String text = PoiCellUtil.getCellValue(row.getCell(integer));
+                cellText.add(text);
+            }
+            // 过滤出元素出现次数大于 1 (重复元素)的 entry
+            List<Integer> collect = cellText.stream().filter(j -> !Objects.equals(j, ""))               // list 对应的 Stream 并过滤""
+                    .collect(Collectors.toMap(e -> e, e -> 1, Integer::sum)) // 获得元素出现频率的 Map,键为元素,值为元素出现的次数
+                    .values()
+                    .stream()                       // 所有 entry 对应的 Stream
+                    .filter(integer -> integer > 1)                // 获得 entry 的键(重复元素)对应的 Stream
+                    .collect(Collectors.toList());
+            if(!CollectionUtils.isEmpty(collect)){
+                sheet.addMergedRegion(new CellRangeAddress(i,i, mergeMap.size()-collect.get(0), asInt -1));
+            }
+        }
+    }
+
+    private void setRowList(int fieldId, List<ReportForm> child, Map<Long, Map<String, CostDepartmentProfit>> profitReportResponsibilityGroup,
+                            List<Map<String, String>> rowList, DecimalFormat df, List<TitleEntity> titleEntities,
+                            Map<String, String> parentFieldMap, int maxDepth) {
+        fieldId++;
+        for (ReportForm reportForm:child){
+            Map<String, String> m = new HashMap<String, String>(parentFieldMap);
+            m.put(Integer.toString(fieldId),reportForm.getReportName());
+            if(!CollectionUtils.isEmpty(reportForm.getChild())){
+                setRowList(fieldId,reportForm.getChild(),profitReportResponsibilityGroup,rowList, df, titleEntities, m, maxDepth);
+            }else {
+                if(fieldId<maxDepth){
+                    for(int i=1;i<=maxDepth - fieldId;i++){
+                        m.put(Integer.toString(fieldId + i),reportForm.getReportName());
+                    }
+                }
+                Map<String, CostDepartmentProfit> map = profitReportResponsibilityGroup.get(reportForm.getId());
+                for (TitleEntity titleEntity : titleEntities) {
+                    String fieldName = titleEntity.getFieldName();
+                    if(fieldName.contains(AMOUNT_FIELD)){
+                        String[] split1 = StringUtils.split(fieldName, "|");
+                        if (split1 != null) {
+                            if(map !=null){
+                                CostDepartmentProfit costDepartmentProfit = map.get(split1[0]);
+                                if(Objects.nonNull(costDepartmentProfit)){
+                                    m.put(fieldName, costDepartmentProfit.getAmount().setScale(2, RoundingMode.HALF_UP).toString());
+                                }else {
+                                    m.put(fieldName,"");
+                                }
+                            }else {
+                                m.put(fieldName,"");
+                            }
+
+
+                        }else {
+                            m.put(fieldName,"");
+
+                        }
+                    } else if (fieldName.contains(PERCENT_FIELD)) {
+                        String[] split1 = StringUtils.split(fieldName, "|");
+                        if (split1 != null) {
+                            if(map !=null){
+                                CostDepartmentProfit costDepartmentProfit = map.get(split1[0]);
+                                if (costDepartmentProfit.getPercent() != null) {
+                                    m.put(fieldName, df.format(costDepartmentProfit.getPercent()));
+                                } else {
+                                    m.put(fieldName, "");
+                                }
+                            }else {
+                                m.put(fieldName, "");
+                            }
+                        }else {
+                            m.put(fieldName,"");
+                        }
+                    }
+                }
+                rowList.add(m);
+
+            }
+
+
+
+        }
+
+    }
+
+    private List<ReportForm> getReportFormChild(ReportForm parent, List<ReportForm> reportFormList) {
+        return reportFormList.stream().filter(o -> o.getParentId().equals(parent.getId()))
+                .peek(o -> o.setChild(this.getReportFormChild(o, reportFormList)))
+                .collect(Collectors.toList());
+//
+    }
+
+    private void formSort(List<ReportForm> reportFormList){
+        for (ReportForm reportForm :reportFormList){
+            if(!CollectionUtils.isEmpty(reportForm.getChild())){
+                formSort(reportForm.getChild());
+            }
+        }
+        reportFormList.sort(Comparator.comparing(ReportForm::getSort));
+    }
+
 }

+ 45 - 53
src/main/java/com/kcim/service/impl/DrugMaterialCalculateServiceImpl.java

@@ -2,20 +2,21 @@ package com.kcim.service.impl;
 
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.kcim.common.constants.NumberConstant;
-import com.kcim.common.constants.RedisKeyConstant;
+import com.kcim.common.constants.SQLParameter;
+import com.kcim.common.enums.CustomSqlTypeEnum;
 import com.kcim.common.enums.ItemTypeEnum;
 import com.kcim.common.enums.ReportItemTypeEnum;
 import com.kcim.common.exception.CostException;
 import com.kcim.common.util.BeanUtil;
 import com.kcim.common.util.PageUtils;
-import com.kcim.common.util.UserContext;
-import com.kcim.dao.model.*;
+import com.kcim.dao.model.ComputeDrugCostDetail;
 import com.kcim.dao.model.dto.ComputeDrugCostPageDto;
-import com.kcim.dao.model.dto.ComputeItemCostPageDto;
+import com.kcim.dao.model.dto.PatientItemDepartmentGroupVo;
 import com.kcim.dao.model.dto.SysDepartment;
 import com.kcim.dao.repository.*;
 import com.kcim.service.CenterService;
 import com.kcim.service.DrugMaterialCalculateService;
+import com.kcim.service.SqlService;
 import com.kcim.vo.ResponsibilityDepartIdVO;
 import com.kcim.vo.SessionUserVO;
 import com.kcim.vo.VisitNoResponsibilityMap;
@@ -29,7 +30,6 @@ import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
 
 import java.math.BigDecimal;
-import java.math.RoundingMode;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -72,16 +72,18 @@ public class DrugMaterialCalculateServiceImpl implements DrugMaterialCalculateSe
 
     CenterService centerService;
 
+    SqlService sqlService;
 
-    private static final Integer LIMIT = 1000;
+    private static final Integer LIMIT = 5000;
 
     /**
-     * @param current
-     * @param pageSize
-     * @param computeDate
-     * @param responsibilityCode
-     * @param filter
-     * @return
+     * 查询药材成本
+     * @param current 当前页
+     * @param pageSize 页容量
+     * @param computeDate 核算年月
+     * @param responsibilityCode 责任中心
+     * @param filter 过滤条件
+     * @return 药材成本列表
      */
     @Override
     public Object drugMaterialCostCalculateList(Integer current, Integer pageSize, String computeDate, String responsibilityCode, String filter) {
@@ -95,27 +97,35 @@ public class DrugMaterialCalculateServiceImpl implements DrugMaterialCalculateSe
         return new PageUtils(records, Math.toIntExact(page.getTotal()), pageSize, current);    }
 
     /**
-     * @param computeDate
+     * 计算药材成本
+     * @param computeDate 核算年月
      */
     @Override
     @Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRED, isolation = Isolation.READ_COMMITTED)
     public void drugMaterialCostCalculate(String computeDate) {
-        SessionUserVO currentUser = UserContext.getCurrentUser();
+//        SessionUserVO currentUser = UserContext.getCurrentUser();
+
+        Map<String,String> sqlParameter = new HashMap<>();
+        sqlParameter.put(SQLParameter.COMPUTE_DATE_CODE,computeDate);
+        sqlService.autoExecuteSql(CustomSqlTypeEnum.DRG_COST_CALC.getCode(),sqlParameter);
+/*  目前更换成自定义sql 下面代码保存留用
+
+
+        long l = System.currentTimeMillis();
 
 
         //获取收费项目数据(药材)
         long itemSize = importPatientItemRepository.getDrugCount(computeDate, currentUser);
         if (Objects.equals(itemSize, NumberConstant.ZERO_L)) {
-            log.error("当前核算年月【" + computeDate + "】未导入收费项目数据,计算中止");
+            log.error("当前核算年月【{}】未导入收费项目数据,计算中止", computeDate);
             throw new CostException("当前核算年月【" + computeDate + "】未导入收费项目数据,计算中止");
         }
         //把当月需要计算数据置成0
-        importPatientItemRepository.updateCalculateFlag(computeDate, currentUser);
+//        importPatientItemRepository.updateCalculateFlag(computeDate, currentUser);
         //作废上次计算记录
-        List<Integer> integers = repository.removeByComputeDate(computeDate, currentUser);
-        if (!CollectionUtils.isEmpty(integers)) {
-            detailRepository.removeByItemCostId(integers, currentUser);
-        }
+        repository.removeByComputeDate(computeDate, currentUser);
+        detailRepository.removeByComputeDate(computeDate, currentUser);
+
         //获到科室与责任中心对照
         List<VisitNoResponsibilityMap> patientResponsibility = getPatientResponsibility( currentUser);
         Map<String,String> responsibilityCodeMap = new HashMap<>();
@@ -141,17 +151,18 @@ public class DrugMaterialCalculateServiceImpl implements DrugMaterialCalculateSe
         //明细表公共对象
         ComputeDrugCostDetail costDetail = new ComputeDrugCostDetail();
         costDetail.setHospId(currentUser.getHospId());
+        costDetail.setComputeDate(computeDate);
         costDetail.setCreateUser(String.valueOf(currentUser.getId()));
         costDetail.setCreateTime(new Date());
         long count = (itemSize + LIMIT - 1) / LIMIT;
 //        long l = 0;
-        for (int j = 0; j < count; j++) {
-            List<ImportPatientItem> items = importPatientItemRepository.getByNoCalculateComputeDateDrugMaterial(computeDate, currentUser);
+        for (int j = 1; j <= count; j++) {
+            List<PatientItemDepartmentGroupVo> items = importPatientItemRepository.getByNoCalculateComputeDateDrugMaterial(j, LIMIT, computeDate, currentUser);
             List<ComputeDrugCostDetail> saveDetails = new ArrayList<>();
             List<ComputeDrugCost> saveCost = new ArrayList<>();
             if (!CollectionUtils.isEmpty(items)) {
                 for (int i = 0; i < items.size(); i++) {
-                    ImportPatientItem item = items.get(i);
+                    PatientItemDepartmentGroupVo item = items.get(i);
                     ComputeDrugCost itemCost = BeanUtil.convertObj(computeDrugCost, ComputeDrugCost.class);
                     itemCost.setVisitNo(item.getVisitNo());
                     itemCost.setCode(item.getItemCode());
@@ -159,8 +170,6 @@ public class DrugMaterialCalculateServiceImpl implements DrugMaterialCalculateSe
                     String typeCode = item.getItemTypeCode();
                     itemCost.setItemTypeCode(typeCode);
                     itemCost.setItemType(item.getItemType());
-                    itemCost.setOrderCode(item.getOrderCode());
-                    itemCost.setOrderName(item.getOrderName());
                     itemCost.setResponsibilityCode(responsibilityCodeMap.get(item.getExecuteDepartmentCode()));
                     itemCost.setResponsibilityName(responsibilityNameMap.get(item.getExecuteDepartmentCode()));
                     itemCost.setIndex(i);
@@ -170,30 +179,10 @@ public class DrugMaterialCalculateServiceImpl implements DrugMaterialCalculateSe
                     if (!CollectionUtils.isEmpty(details)) {
                         saveDetails.addAll(details);
                     }
-//                    double percent = (l + 1) / (double) itemSize * 100;
-//                    //这里对小数采用向下取整,例如99.5会取整为99
-//                    percent = Math.floor(percent / 2 + 25.0);
-//                    if (l == itemSize - 1) {
-//                        redisUtil.set(RedisKeyConstant.PROGRESS + progressKey, 98.0);
-//                    } else {
-//                        redisUtil.set(RedisKeyConstant.PROGRESS + progressKey, percent);
-//                    }
-//                    System.out.println(l + "-" + itemSize);
-//                    l++;
-
                 }
                 if (!CollectionUtils.isEmpty(saveCost)) {
-                    //把责任中心加载到主表数据
-//                    for (ComputeDrugCost drugCost : saveCost) {
-//                        VisitNoResponsibilityMap responsibilityMap = patientResponsibility.get(drugCost.getVisitNo());
-//                        if(Objects.nonNull(responsibilityMap)){
-//                            drugCost.setResponsibilityCode(responsibilityMap.getResponsibilityCode());
-//                            drugCost.setResponsibilityName(responsibilityMap.getResponsibilityName());
-//                        }
-//                    }
 
-
-                    repository.saveBatch(saveCost, 100);
+                    repository.saveBatch(saveCost, 1000);
                     if (!CollectionUtils.isEmpty(saveDetails)) {
                         Map<Integer, Integer> indexId = saveCost.stream().collect(Collectors.toMap(ComputeDrugCost::getIndex, ComputeDrugCost::getId, (a, b) -> b));
                         Map<Integer, List<ComputeDrugCostDetail>> collect = saveDetails.stream().collect(Collectors.groupingBy(ComputeDrugCostDetail::getIndex));
@@ -204,14 +193,17 @@ public class DrugMaterialCalculateServiceImpl implements DrugMaterialCalculateSe
                             details.forEach(detail -> detail.setDrugCostId(costId));
                             saveCostDetails.addAll(details);
                         });
-                        detailRepository.saveBatch(saveCostDetails, 100);
+                        detailRepository.saveBatch(saveCostDetails, 1000);
                     }
                 }
                 //保存完把已计算过的置1
-                importPatientItemRepository.updateCalculateFlag(items);
-//                    connection.commit();
+//                importPatientItemRepository.updateCalculateFlag(items);
+
             }
         }
+        long end = System.currentTimeMillis();
+        log.info("{}ms", end - l);
+*/
     }
 
     private List<VisitNoResponsibilityMap> getPatientResponsibility(SessionUserVO currentUser) {
@@ -246,7 +238,7 @@ public class DrugMaterialCalculateServiceImpl implements DrugMaterialCalculateSe
 
     private List<ComputeDrugCostDetail> setDetails(Map<String, BigDecimal> drugCostMap, Map<String, BigDecimal> materialCostMap,
                                                    ComputeDrugCostDetail costDetail,
-                                                   ImportPatientItem item, String typeCode ) {
+                                                   PatientItemDepartmentGroupVo item, String typeCode ) {
         List<ComputeDrugCostDetail> details = new ArrayList<>();
         if (typeCode.equals(ItemTypeEnum.DRUG.getCode())) {
             // 药品  取药品收入 药品成本
@@ -281,7 +273,7 @@ public class DrugMaterialCalculateServiceImpl implements DrugMaterialCalculateSe
      * @param item   导入项目
      * @return 收入对象
      */
-    private ComputeDrugCostDetail getIncome(ComputeDrugCostDetail detail, ImportPatientItem item) {
+    private ComputeDrugCostDetail getIncome(ComputeDrugCostDetail detail, PatientItemDepartmentGroupVo item) {
         ComputeDrugCostDetail result = BeanUtil.convertObj(detail, ComputeDrugCostDetail.class);
         result.setComputeResult(item.getAmount());
         return result;
@@ -295,14 +287,14 @@ public class DrugMaterialCalculateServiceImpl implements DrugMaterialCalculateSe
      * @param costMap 成本字典
      * @return 成本对象
      */
-    private ComputeDrugCostDetail getCost(ComputeDrugCostDetail detail, ImportPatientItem item, Map<String, BigDecimal> costMap) {
+    private ComputeDrugCostDetail getCost(ComputeDrugCostDetail detail, PatientItemDepartmentGroupVo item, Map<String, BigDecimal> costMap) {
         ComputeDrugCostDetail result = BeanUtil.convertObj(detail, ComputeDrugCostDetail.class);
         BigDecimal bigDecimal = costMap.get(item.getItemCode());
         BigDecimal num = item.getNum();
         if (bigDecimal != null && num != null) {
             result.setComputeResult(bigDecimal.multiply(num));
         } else {
-            log.info("【" + item.getItemName() + "】未找到成本信息,默认为 0");
+            log.info("【{}】未找到成本信息,默认为 0", item.getItemName());
             result.setComputeResult(BigDecimal.ZERO);
         }
         return result;

+ 4 - 2
src/main/java/com/kcim/service/impl/IncomeCollectionServiceImpl.java

@@ -6,6 +6,8 @@ import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.kcim.common.constants.NumberConstant;
+import com.kcim.common.constants.SQLParameter;
+import com.kcim.common.enums.CustomSqlTypeEnum;
 import com.kcim.common.exception.CostException;
 import com.kcim.common.util.BeanUtil;
 import com.kcim.common.util.JacksonUtil;
@@ -115,8 +117,8 @@ public class IncomeCollectionServiceImpl
         }else {
             String computeDate = month < 10 ? year + "-0" + month : year + "-" + month;
             Map<String,String> sqlParameter = new HashMap<>();
-            sqlParameter.put("compute_date",computeDate);
-            costDataService.autoExecuteSql("INCOME_COLLECTION",sqlParameter);
+            sqlParameter.put(SQLParameter.COMPUTE_DATE_CODE,computeDate);
+            costDataService.autoExecuteSql(CustomSqlTypeEnum.INCOME_COLLECTION.getCode(),sqlParameter);
         }
 
     }

+ 25 - 1
src/main/java/com/kcim/service/impl/ProjectCostServiceImpl.java

@@ -3,6 +3,8 @@ package com.kcim.service.impl;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.kcim.common.constants.NumberConstant;
 import com.kcim.common.constants.ParameterConstant;
+import com.kcim.common.constants.SQLParameter;
+import com.kcim.common.enums.CustomSqlTypeEnum;
 import com.kcim.common.exception.CostException;
 import com.kcim.common.util.BeanUtil;
 import com.kcim.common.util.PageUtils;
@@ -12,6 +14,7 @@ import com.kcim.dao.model.dto.PatientItemDepartmentGroupVo;
 import com.kcim.dao.repository.*;
 import com.kcim.service.CenterService;
 import com.kcim.service.ProjectCostService;
+import com.kcim.service.SqlService;
 import com.kcim.vo.*;
 import com.kcim.web.reponse.ProjectCostResponse;
 import lombok.extern.slf4j.Slf4j;
@@ -95,9 +98,13 @@ public class ProjectCostServiceImpl implements ProjectCostService {
 
     ComputeStandPatientProjectGroupCostDetailRepository computeStandPatientProjectGroupCostDetailRepository;
 
-    public ProjectCostServiceImpl(ResponsibilityRepository responsibilityRepository, ComputeProjectCostRepository repository, ComputeProjectCostDetailRepository detailRepository, ComputeProjectGroupCostDetailRepository groupDetailRepository, ImportPatientItemRepository importPatientItemRepository, ShareParamCostRepository shareParamCostRepository, ShareParamCostDetailRepository shareParamCostDetailRepository, CostDepartmentProfitRepository costDepartmentProfitRepository, ShareParamTypeMapRepository shareParamTypeMapRepository, ComputeShareParamRepository computeShareParamRepository, ItemRepository itemRepository, ResponsibilityDepartmentRepository responsibilityDepartmentRepository, CenterService centerService, ComputePatientProjectCostRepository computePatientProjectCostRepository, ComputePatientProjectCostDetailRepository computePatientProjectCostDetailRepository, ComputePatientProjectGroupCostDetailRepository computePatientProjectGroupCostDetailRepository, ComputeStandShareParamRepository computeStandShareParamRepository, ComputeStandProjectCostRepository standProjectCostRepository, ComputeStandProjectCostDetailRepository standProjectCostDetailRepository, ComputeStandProjectGroupCostDetailRepository standProjectGroupCostDetailRepository, ComputeStandPatientProjectCostRepository computeStandPatientProjectCostRepository, ComputeStandPatientProjectCostDetailRepository computeStandPatientProjectCostDetailRepository, ComputeStandPatientProjectGroupCostDetailRepository computeStandPatientProjectGroupCostDetailRepository) {
+    SqlService sqlService;
+
+    public ProjectCostServiceImpl(SqlService sqlService,ResponsibilityRepository responsibilityRepository, ComputeProjectCostRepository repository, ComputeProjectCostDetailRepository detailRepository, ComputeProjectGroupCostDetailRepository groupDetailRepository, ImportPatientItemRepository importPatientItemRepository, ShareParamCostRepository shareParamCostRepository, ShareParamCostDetailRepository shareParamCostDetailRepository, CostDepartmentProfitRepository costDepartmentProfitRepository, ShareParamTypeMapRepository shareParamTypeMapRepository, ComputeShareParamRepository computeShareParamRepository, ItemRepository itemRepository, ResponsibilityDepartmentRepository responsibilityDepartmentRepository, CenterService centerService, ComputePatientProjectCostRepository computePatientProjectCostRepository, ComputePatientProjectCostDetailRepository computePatientProjectCostDetailRepository, ComputePatientProjectGroupCostDetailRepository computePatientProjectGroupCostDetailRepository, ComputeStandShareParamRepository computeStandShareParamRepository, ComputeStandProjectCostRepository standProjectCostRepository, ComputeStandProjectCostDetailRepository standProjectCostDetailRepository, ComputeStandProjectGroupCostDetailRepository standProjectGroupCostDetailRepository, ComputeStandPatientProjectCostRepository computeStandPatientProjectCostRepository, ComputeStandPatientProjectCostDetailRepository computeStandPatientProjectCostDetailRepository, ComputeStandPatientProjectGroupCostDetailRepository computeStandPatientProjectGroupCostDetailRepository) {
         this.responsibilityRepository = responsibilityRepository;
         this.repository = repository;
+        this.sqlService = sqlService;
+
         this.detailRepository = detailRepository;
         this.groupDetailRepository = groupDetailRepository;
         this.importPatientItemRepository = importPatientItemRepository;
@@ -289,6 +296,10 @@ public class ProjectCostServiceImpl implements ProjectCostService {
         for (PatientItemDepartmentGroupVo departmentGroupVo : departAmountGroup) {
             departmentGroupVo.setResponsibilityCode(responsibilityCodeMap.get(departmentGroupVo.getExecuteDepartmentCode()));
         }
+        List<PatientItemDepartmentGroupVo> collect2 = departAmountGroup.stream().filter(f -> StringUtils.isEmpty(f.getResponsibilityCode())).collect(Collectors.toList());
+        if(!CollectionUtils.isEmpty(collect2)){
+            throw new CostException("存在执行科室与责任中心未对照数据");
+        }
         Map<String, List<PatientItemDepartmentGroupVo>> collect = departAmountGroup.stream().collect(Collectors.groupingBy(PatientItemDepartmentGroupVo::getResponsibilityCode));
         Map<String, BigDecimal> responsibilitySum = new HashMap<>();
 
@@ -575,6 +586,11 @@ public class ProjectCostServiceImpl implements ProjectCostService {
     @Override
     @Transactional(rollbackFor = Throwable.class, propagation = Propagation.REQUIRED)
     public void computePatientItemCost(String computeDate) {
+
+//        Map<String,String> sqlParameter = new HashMap<>();
+//        sqlParameter.put(SQLParameter.COMPUTE_DATE_CODE,computeDate);
+//        sqlService.autoExecuteSql(CustomSqlTypeEnum.PT_ITEM_COST_CALC.getCode(),sqlParameter);
+//      暂时更换成自定义sql 执行 下面代码留用
         SessionUserVO currentUser = UserContext.getCurrentUser();
         //获取收费项目数据(项目)
         checkImportItem(computeDate, currentUser);
@@ -693,6 +709,7 @@ public class ProjectCostServiceImpl implements ProjectCostService {
                 }
             }
         }
+
     }
 
     @Override
@@ -1246,6 +1263,12 @@ public class ProjectCostServiceImpl implements ProjectCostService {
      */
     @Override
     public void computeStandPatientItemCost(String computeDate) {
+
+        Map<String,String> sqlParameter = new HashMap<>();
+        sqlParameter.put(SQLParameter.COMPUTE_DATE_CODE,computeDate);
+        sqlService.autoExecuteSql(CustomSqlTypeEnum.PT_STAND_ITEM_COST_CALC.getCode(),sqlParameter);
+
+/*     暂时更换成自定义sql 执行 下面代码留用
         SessionUserVO currentUser = UserContext.getCurrentUser();
         //获取收费项目数据(项目)
         checkImportItem(computeDate, currentUser);
@@ -1372,6 +1395,7 @@ public class ProjectCostServiceImpl implements ProjectCostService {
                 }
             }
         }
+*/
     }
 
     private void handleDictTitle(List<CommonTitleVo> titleVos) {

+ 11 - 6
src/main/java/com/kcim/service/impl/ResponsibilityDepartmentServiceImpl.java

@@ -9,15 +9,16 @@ import com.kcim.dao.mapper.ResponsibilityDepartmentMapper;
 import com.kcim.dao.model.Responsibility;
 import com.kcim.dao.model.ResponsibilityDepartment;
 import com.kcim.dao.model.dto.DepartDTO;
-import com.kcim.vo.CenterDepartmentVO;
+import com.kcim.dao.model.dto.SysDepartment;
+import com.kcim.service.CenterService;
 import com.kcim.service.ResponsibilityDepartmentService;
 import com.kcim.service.ResponsibilityService;
+import com.kcim.vo.CenterDepartmentVO;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Propagation;
 import org.springframework.transaction.annotation.Transactional;
 
-import java.util.ArrayList;
 import java.util.List;
 import java.util.Objects;
 import java.util.stream.Collectors;
@@ -29,13 +30,15 @@ public class ResponsibilityDepartmentServiceImpl
 
     private ResponsibilityService responsibilityService;
 
-    public ResponsibilityDepartmentServiceImpl(ResponsibilityService responsibilityService) {
+    private CenterService centerService;
+
+    public ResponsibilityDepartmentServiceImpl(ResponsibilityService responsibilityService, CenterService centerService) {
         this.responsibilityService = responsibilityService;
+        this.centerService = centerService;
     }
 
     /**
      * 获取责任中心对照列表
-     *
      * @return
      */
     @Override
@@ -74,10 +77,12 @@ public class ResponsibilityDepartmentServiceImpl
         if (byId.getIsGatherCenter() == 1) {
             throw new CostException(500, "汇总中心不允许添加对照关系,请先修改");
         }
-        List<ResponsibilityDepartment> data = departmentIds.stream().map(item -> {
+
+        List<SysDepartment> departmentByDepartmentIds = centerService.getDepartmentByDepartmentIds(departmentIds);
+        List<ResponsibilityDepartment> data = departmentByDepartmentIds.stream().map(item -> {
             ResponsibilityDepartment centerDepart = new ResponsibilityDepartment();
             return centerDepart.setResponsibilityId(responsibilityId).setCreateTime(System.currentTimeMillis()).setHospId(hospId)
-                    .setDepartmentId(item);
+                    .setDepartmentId(Long.valueOf(item.getId())).setDepartmentCode(item.getCode()).setResponsibilityCode(byId.getResponsibilityCode());
         }).collect(Collectors.toList());
 
         this.saveBatch(data);

+ 2 - 0
src/main/java/com/kcim/service/impl/ResponsibilityServiceImpl.java

@@ -389,6 +389,7 @@ public class ResponsibilityServiceImpl extends ServiceImpl<ResponsibilityMapper,
         List<CenterDepartmentVO> centerDepartmentVOS = costResponsibilityVOS.stream().map(i -> {
             CenterDepartmentVO vo = BeanUtil.convertObj(i, CenterDepartmentVO.class);
             vo.setResponsibilityId(i.getId());
+            vo.setResponsibilityCode(i.getResponsibilityCode());
             return vo;
         }).collect(Collectors.toList());
 
@@ -409,6 +410,7 @@ public class ResponsibilityServiceImpl extends ServiceImpl<ResponsibilityMapper,
                     if(!StringUtils.isEmpty(departName)){
                         vo.setDepartmentId(department.getDepartmentId());
                         vo.setDepartmentName(departName +departmentCodeMap.get(department.getDepartmentId()));
+                        vo.setDepartmentCode(department.getDepartmentCode());
                     }
                     departVOS.add(vo);
                 }

+ 3 - 1
src/main/java/com/kcim/service/impl/ShareParamServiceImpl.java

@@ -789,7 +789,9 @@ public class ShareParamServiceImpl implements ShareParamService {
                             details.add(result);
                         }
                     } else {
-                        result.setComputeResult(BigDecimal.ZERO);
+                        if (result != null) {
+                            result.setComputeResult(BigDecimal.ZERO);
+                        }
                         result.setComputeSingleResult(BigDecimal.ZERO);
                         result.setShareParamCode(shareParam.getShareParamCode());
                         details.add(result);

+ 65 - 3
src/main/java/com/kcim/service/impl/SqlServiceImpl.java

@@ -1,6 +1,7 @@
 package com.kcim.service.impl;
 
 import com.kcim.common.constants.NumberConstant;
+import com.kcim.common.constants.SQLParameter;
 import com.kcim.common.exception.CostException;
 import com.kcim.common.util.SnowflakeUtil;
 import com.kcim.common.util.UserContext;
@@ -9,11 +10,16 @@ import com.kcim.dao.repository.SqlRepository;
 import com.kcim.service.CenterService;
 import com.kcim.service.SqlService;
 import com.kcim.vo.DictDataVo;
-import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.ibatis.jdbc.SqlRunner;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 import org.springframework.util.CollectionUtils;
+import org.springframework.util.StringUtils;
 
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.SQLException;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -26,10 +32,23 @@ import static com.kcim.common.constants.Constant.CUSTOMIZE_SQL_TYPE;
  * @create: 2024-03-19 11:10
  **/
 @Service("SqlService")
-@AllArgsConstructor
 @Slf4j
 public class SqlServiceImpl implements SqlService {
 
+    @Value("${spring.datasource.driver-class-name}")
+    private String driver;
+    @Value("${spring.datasource.url}")
+    private String url;
+    @Value("${spring.datasource.username}")
+    private String username;
+    @Value("${spring.datasource.password}")
+    private String password;
+
+    public SqlServiceImpl(SqlRepository repository, CenterService centerService) {
+        this.repository = repository;
+        this.centerService = centerService;
+    }
+
     SqlRepository repository;
 
     CenterService centerService;
@@ -133,7 +152,50 @@ public class SqlServiceImpl implements SqlService {
 
     @Override
     public List<Sql> getSqlBySqlType(String sqlType) {
-
         return repository.getSqlBySqlType(sqlType);
     }
+
+    @Override
+    public void autoExecuteSql(String sqlType, Map<String, String> parameter) {
+        List<Sql> sqlList = getSqlBySqlType(sqlType);
+        //取出需要执行的sql
+        if(!CollectionUtils.isEmpty(sqlList)){
+            sqlList.sort(Comparator.comparing(Sql::getSort,Comparator.nullsLast(Integer::compareTo)));
+            for(Sql sql:sqlList){
+                String executeSql = sql.getSql();
+                executeSql = MatchSystemParameter(executeSql);
+                //替换传参
+                if(!CollectionUtils.isEmpty(parameter)){
+                    for(String s:parameter.keySet()){
+                        //拼接 #
+                        String sqlFilter = "#" + s;
+                        if (executeSql.contains(sqlFilter)) {
+                            executeSql = executeSql.replace(sqlFilter, parameter.get(s));
+                        }
+                    }
+                }
+                try {
+                    SqlRunner sqlRunner = new SqlRunner(getConnection());
+                    sqlRunner.run(executeSql);
+                } catch (SQLException | ClassNotFoundException e) {
+                    throw new RuntimeException(e);
+                }
+            }
+        }
+    }
+
+    private Connection getConnection() throws SQLException, ClassNotFoundException {
+        Class.forName(driver);
+        return DriverManager.getConnection(url, username, password);
+    }
+    private static String MatchSystemParameter(String sql) {
+        if(StringUtils.isEmpty(sql)){
+            throw new CostException("无效自定义sql语句");
+        }
+        if (sql.contains(SQLParameter.HOSP_ID_CODE)) {
+            sql = sql.replace(SQLParameter.HOSP_ID_CODE, String.valueOf(UserContext.getCurrentLoginHospId()));
+        }
+
+        return sql;
+    }
 }

+ 2 - 0
src/main/java/com/kcim/vo/CenterDepartmentVO.java

@@ -16,6 +16,8 @@ public class CenterDepartmentVO {
 
     private Long responsibilityId;
 
+    private String responsibilityCode;
+
     private String responsibilityName;
 
 //    @JsonInclude(JsonInclude.Include.NON_EMPTY)

+ 6 - 0
src/main/java/com/kcim/vo/CostAccountShareVO.java

@@ -56,4 +56,10 @@ public class CostAccountShareVO {
      */
     private String alias;
     private String allParentIds;
+
+    private String paramList;
+
+    private String shareParamMap;
+
+
 }

+ 2 - 0
src/main/java/com/kcim/vo/DepartVO.java

@@ -10,4 +10,6 @@ public class DepartVO {
     private String departmentName;
 
     private Integer departmentStatus;
+
+    private String departmentCode;
 }

+ 22 - 0
src/main/java/com/kcim/vo/ResponsibilityVo.java

@@ -0,0 +1,22 @@
+package com.kcim.vo;
+
+import lombok.Data;
+
+/**
+ * @program: CostAccount
+ * @description:
+ * @author: Wang.YS
+ * @create: 2024-08-13 16:01
+ **/
+@Data
+public class ResponsibilityVo {
+
+    private String responsibilityCode;
+
+    private String responsibilityName;
+
+    private String parentResponsibilityCode;
+
+    private String parentResponsibilityName;
+
+}

+ 0 - 2
src/main/java/com/kcim/vo/ShareParamCostVo.java

@@ -1,10 +1,8 @@
 package com.kcim.vo;
 
-import com.kcim.dao.model.CostDepartmentProfit;
 import lombok.Data;
 
 import java.math.BigDecimal;
-import java.util.List;
 import java.util.Map;
 
 /**

+ 1 - 0
src/main/java/com/kcim/web/CostCostingCollectionController.java

@@ -18,6 +18,7 @@ import java.util.Arrays;
 @RequestMapping("costcostingcollection")
 public class CostCostingCollectionController {
 
+
     private final CostCostingCollectionService costCostingCollectionService;
 
     public CostCostingCollectionController(CostCostingCollectionService costCostingCollectionService) {

+ 1 - 1
src/main/resources/application.yml

@@ -1,4 +1,4 @@
 spring:
   profiles:
-    active: prod
+    active: dev
 

+ 26 - 3
src/main/resources/mapper/ImportPatientItemMapper.xml

@@ -154,12 +154,35 @@
               GROUP BY b.item_code, b.execute_department_code, b.visit_no) a
     </select>
     <select id="getDepartAmountGroup" resultType="com.kcim.dao.model.dto.PatientItemDepartmentGroupVo">
-        select sum(amount) amount,execute_department_code
+        select sum(amount) amount, execute_department_code
         from import_patient_item
-        WHERE hosp_id = #{hospId} and del_flag = 0 and compute_date = #{computeDate}
-        and item_type_code = 3
+        WHERE hosp_id = #{hospId}
+          and del_flag = 0
+          and compute_date = #{computeDate}
+          and item_type_code = 3
         GROUP BY execute_department_code
     </select>
+    <select id="getDrugCount" resultType="java.lang.Long">
+        select count(a.countSum)
+        from (SELECT count(1) as countSum
+              FROM `import_patient_item`
+              where hosp_id = #{hospId}
+                and compute_date = #{computeDate}
+                and item_type_code in ('1', '2')
+                and del_flag = 0
+              GROUP BY visit_no, item_code, item_type_code, execute_department_code) a
+    </select>
+    <select id="getByNoCalculateComputeDateDrugMaterial"
+            resultType="com.kcim.dao.model.dto.PatientItemDepartmentGroupVo">
+
+        SELECT visit_no, item_code, item_type,item_type_code, item_name, execute_department_code, sum(amount) as amount, sum(num) as num
+        FROM `import_patient_item`
+        where hosp_id = #{hospId}
+          and compute_date = #{computeDate}
+          and item_type_code in ('1', '2')
+          and del_flag = 0
+        GROUP BY visit_no, item_code, item_type_code, execute_department_code
+    </select>
 
 
 </mapper>