21 コミット 97418a97dd ... accfa93483

作者 SHA1 メッセージ 日付
  wangyongsheng accfa93483 自定义报表添加小数位与千分号处理 6 ヶ月 前
  JammeyJiang 79fbc0348f 添加标准法全院项目的项目成本计算及项目分摊参数计算 6 ヶ月 前
  JammeyJiang 9f856b4f82 无法修改合并计算的责任中心的分摊参数对应配置的问题修复 6 ヶ月 前
  JammeyJiang e41bd922d6 添加完全法全院项目的项目分摊参数及项目成本分摊计算 6 ヶ月 前
  JammeyJiang 28423d655e 添加全院通用的医疗服务项目的分摊参数计算 7 ヶ月 前
  JammeyJiang e7bbbc1e83 添加项目代码的检索 7 ヶ月 前
  JammeyJiang f8dda6a3e1 项目成本分摊计算及项目分摊参数计算的后续脚本处理添加 7 ヶ月 前
  JammeyJiang f8075b737a 添加科室损益计算的报表数据界面的责任中心及报表项排序 8 ヶ月 前
  JammeyJiang b442c7a1e3 添加kettle作业及转换的调用功能 8 ヶ月 前
  JammeyJiang 51b707dd93 添加项目分摊参数计算及项目分摊计算的自定义SQL调用 8 ヶ月 前
  JammeyJiang 56f36ca663 全算损益计算的自定义SQL调用添加报表类型参数 8 ヶ月 前
  JammeyJiang a4d8fb3161 Merge branch 'master_cloud' of http://47.97.198.219:3000/wangyongsheng/kcim-cost into jiangyongmin 8 ヶ月 前
  JammeyJiang c0cf6eea59 分摊时间显示不正确的问题修复 8 ヶ月 前
  JammeyJiang 054005b166 成本分摊报表添加当前层级分摊总金额的显示 8 ヶ月 前
  JammeyJiang 7997c030b3 添加分摊报表支持大于256列的处理 8 ヶ月 前
  JammeyJiang ceb883b0f6 科室门住损益计算及科室损益计算-报表数据界面添加数据权限管控相关代码 8 ヶ月 前
  JammeyJiang 9103ee3e35 调整全院损益计算接口 8 ヶ月 前
  JammeyJiang 888deeb8d8 全院损益计算添加报表类型的存取 8 ヶ月 前
  JammeyJiang e9c5fb6720 添加用户损益报表权限控制相关代码 8 ヶ月 前
  JammeyJiang 64ec6fab23 添加用户损益报表权限控制相关代码 8 ヶ月 前
  JammeyJiang 63bf2de05a 添加计算指定报表类型全院损益的功能 8 ヶ月 前
56 ファイル変更3036 行追加481 行削除
  1. 21 1
      pom.xml
  2. 4 0
      src/main/java/com/kcim/common/constants/Constant.java
  3. 5 0
      src/main/java/com/kcim/common/constants/ParameterConstant.java
  4. 16 0
      src/main/java/com/kcim/common/enums/CustomSqlTypeEnum.java
  5. 4 0
      src/main/java/com/kcim/dao/mapper/ComputeShareParamMapper.java
  6. 16 0
      src/main/java/com/kcim/dao/mapper/UserReportRightMapper.java
  7. 16 0
      src/main/java/com/kcim/dao/mapper/UserResponsibilityRightMapper.java
  8. 13 5
      src/main/java/com/kcim/dao/model/ComputeProjectCostDetail.java
  9. 9 0
      src/main/java/com/kcim/dao/model/ComputeProjectGroupCostDetail.java
  10. 11 5
      src/main/java/com/kcim/dao/model/ComputeShareParamDetail.java
  11. 5 5
      src/main/java/com/kcim/dao/model/HospProfitAndLoss.java
  12. 9 4
      src/main/java/com/kcim/dao/model/Sql.java
  13. 86 0
      src/main/java/com/kcim/dao/model/UserReportRight.java
  14. 86 0
      src/main/java/com/kcim/dao/model/UserResponsibilityRight.java
  15. 3 0
      src/main/java/com/kcim/dao/model/dto/PatientItemDepartmentGroupVo.java
  16. 20 0
      src/main/java/com/kcim/dao/repository/ComputeShareParamRepository.java
  17. 19 0
      src/main/java/com/kcim/dao/repository/CostDepartmentProfitRepository.java
  18. 1 2
      src/main/java/com/kcim/dao/repository/ItemRepository.java
  19. 0 5
      src/main/java/com/kcim/dao/repository/OrderCostDetailRepository.java
  20. 1 1
      src/main/java/com/kcim/dao/repository/StandItemRepository.java
  21. 98 0
      src/main/java/com/kcim/dao/repository/UserReportRightRepository.java
  22. 123 0
      src/main/java/com/kcim/dao/repository/UserResponsibilityRightRepository.java
  23. 7 0
      src/main/java/com/kcim/service/CenterService.java
  24. 9 0
      src/main/java/com/kcim/service/HospProfitAndLossService.java
  25. 8 1
      src/main/java/com/kcim/service/ReportFormService.java
  26. 6 1
      src/main/java/com/kcim/service/ResponsibilityDepartmentService.java
  27. 54 0
      src/main/java/com/kcim/service/UserReportRightService.java
  28. 69 0
      src/main/java/com/kcim/service/UserResponsibilityRightService.java
  29. 73 16
      src/main/java/com/kcim/service/impl/AllocationServiceImpl.java
  30. 24 1
      src/main/java/com/kcim/service/impl/CenterServiceImpl.java
  31. 24 5
      src/main/java/com/kcim/service/impl/ComputeMedicalDepartmentProfitServiceImpl.java
  32. 30 4
      src/main/java/com/kcim/service/impl/CostAccountShareServiceImpl.java
  33. 54 6
      src/main/java/com/kcim/service/impl/CostDepartmentProfitServiceImpl.java
  34. 234 213
      src/main/java/com/kcim/service/impl/HospProfitAndLossServiceImpl.java
  35. 402 139
      src/main/java/com/kcim/service/impl/ProjectCostServiceImpl.java
  36. 11 1
      src/main/java/com/kcim/service/impl/ReportFormServiceImpl.java
  37. 27 17
      src/main/java/com/kcim/service/impl/ReportServiceImpl.java
  38. 43 0
      src/main/java/com/kcim/service/impl/ResponsibilityDepartmentServiceImpl.java
  39. 529 10
      src/main/java/com/kcim/service/impl/ShareParamServiceImpl.java
  40. 146 20
      src/main/java/com/kcim/service/impl/SqlServiceImpl.java
  41. 197 0
      src/main/java/com/kcim/service/impl/UserReportRightServiceImpl.java
  42. 184 0
      src/main/java/com/kcim/service/impl/UserResponsibilityRightServiceImpl.java
  43. 8 0
      src/main/java/com/kcim/vo/ComputeShareParamDetailVo.java
  44. 1 2
      src/main/java/com/kcim/vo/CostResponsibilityProfitVo.java
  45. 4 0
      src/main/java/com/kcim/vo/ReportTitleVo.java
  46. 9 0
      src/main/java/com/kcim/vo/ResponsibilityDepartIdVO.java
  47. 4 0
      src/main/java/com/kcim/vo/SessionUserVO.java
  48. 6 1
      src/main/java/com/kcim/vo/UserInfoVO.java
  49. 36 0
      src/main/java/com/kcim/vo/UserReportRightVO.java
  50. 82 0
      src/main/java/com/kcim/vo/UserResponsibilityRightVO.java
  51. 30 3
      src/main/java/com/kcim/web/ExcelController.java
  52. 9 5
      src/main/java/com/kcim/web/HospProfitAndLossController.java
  53. 84 0
      src/main/java/com/kcim/web/UserReportRightController.java
  54. 1 0
      src/main/resources/mapper/AllocationMapper.xml
  55. 50 2
      src/main/resources/mapper/ComputeShareParamMapper.xml
  56. 15 6
      src/main/resources/mapper/ResponsibilityDepartmentMapper.xml

+ 21 - 1
pom.xml

@@ -314,7 +314,27 @@
             <artifactId>logstash-logback-encoder</artifactId>
             <version>5.3</version>
         </dependency>
-
+        <!--集成kettle-->
+        <dependency>
+            <groupId>com.kcim.third-party-libs</groupId>
+            <artifactId>kettle-core</artifactId>
+            <version>8.3.0.0-0.2.5</version>
+        </dependency>
+        <dependency>
+            <groupId>com.kcim.third-party-libs</groupId>
+            <artifactId>kettle-engine</artifactId>
+            <version>8.3.0.0-0.2.5</version>
+        </dependency>
+        <dependency>
+            <groupId>com.github.abashev</groupId>
+            <artifactId>commons-vfs2</artifactId>
+            <version>2.4.1.1</version>
+        </dependency>
+        <dependency>
+            <groupId>com.kcim.third-party-libs</groupId>
+            <artifactId>metastore</artifactId>
+            <version>8.3.0.0-371</version>
+        </dependency>
     </dependencies>
 
     <build>

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

@@ -209,4 +209,8 @@ public interface Constant {
      */
     String ITEM_COST_COLUMN_TYPE = "ITEM_COST_COLUNM_TYPE";
 
+    /**
+     * 空字符串
+     */
+    String EMPTY_STR = "";
 }

+ 5 - 0
src/main/java/com/kcim/common/constants/ParameterConstant.java

@@ -32,5 +32,10 @@ public interface ParameterConstant {
      */
     Long INCOME_COLLECTION_TYPE = 1791289260914118656L;
 
+    /**
+     * 是否开启损益表数据权限功能 0不开启 1开启
+     */
+    Long USER_REPORT_AUTHOR_ABLE = 1862419414851391488L;
+
 
 }

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

@@ -48,6 +48,22 @@ public enum CustomSqlTypeEnum {
      * 全院损益计算处理
      */
     HOSP_PROFIT_CALC("HOSP_PROFIT_CALC","全院损益计算处理"),
+    /**
+     * 项目分摊参数计算-完全法
+     */
+    FULL_PROJECT_PARAM_CALC("FULL_PROJECT_PARAM_CALC","项目分摊参数计算-完全法"),
+    /**
+     * 项目成本分摊计算-完全法
+     */
+    FULL_PROJECT_COST_CALC("FULL_PROJECT_COST_CALC","项目成本分摊计算-完全法"),
+    /**
+     * 项目分摊参数计算-标准法
+     */
+    STAND_PROJECT_PARAM_CALC("STAND_PROJECT_PARAM_CALC","项目分摊参数计算-标准法"),
+    /**
+     * 项目成本分摊计算-标准法
+     */
+    STAND_PROJECT_COST_CALC("STAND_PROJECT_COST_CALC","项目成本分摊计算-标准法"),
     ;
     private final String code;
     private final String description;

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

@@ -30,4 +30,8 @@ public interface ComputeShareParamMapper extends BaseMapper<ComputeShareParam> {
     List<ComputeShareParamSumVo> getComputeShareParamSum(@Param("computeDate") String computeDate, @Param("hospId") Long hospId);
 
     List<ComputeShareParamDetailVo> getComputeShareParamDetail(String computeDate, Long hospId);
+
+    List<ComputeShareParamDetailVo> getComputeShareParamDetailGroup(String computeDate, Long hospId);
+
+    List<ComputeShareParamDetailVo> getComputeResponsibilityItem(String computeDate, Long hospId);
 }

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

@@ -0,0 +1,16 @@
+package com.kcim.dao.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.kcim.dao.model.UserReportRight;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 用户有权限的损益报表
+ * 
+ * @author Wang.YS
+ * @date 2023-10-17 15:35:58
+ */
+@Mapper
+public interface UserReportRightMapper extends BaseMapper<UserReportRight> {
+	
+}

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

@@ -0,0 +1,16 @@
+package com.kcim.dao.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.kcim.dao.model.UserResponsibilityRight;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 用户有权限的责任中心
+ * 
+ * @author Wang.YS
+ * @date 2023-10-17 15:35:58
+ */
+@Mapper
+public interface UserResponsibilityRightMapper extends BaseMapper<UserResponsibilityRight> {
+	
+}

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

@@ -4,16 +4,15 @@ 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;
+
 /**
  * 完全成本法项目成本计算明细表
  * 
@@ -96,4 +95,13 @@ public class ComputeProjectCostDetail implements Serializable {
 	private Integer index;
 
 	private BigDecimal computeSingleResult;
+
+	private BigDecimal standComputeResult;
+
+	private BigDecimal standComputeSingleResult;
+	/**
+	 * 项目成本计算主表
+	 */
+	@TableField(exist = false)
+	ComputeProjectCost computeProjectCost;
 }

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

@@ -84,5 +84,14 @@ public class ComputeProjectGroupCostDetail implements Serializable {
 
 	private BigDecimal computeSingleResult;
 
+	private BigDecimal standComputeResult;
+
+	private BigDecimal standComputeSingleResult;
+
+	/**
+	 * 项目成本计算主表
+	 */
+	@TableField(exist = false)
+	ComputeProjectCost computeProjectCost;
 
 }

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

@@ -4,16 +4,15 @@ 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;
+
 /**
  * 项目分摊参数计算明细表
  * 
@@ -89,4 +88,11 @@ public class ComputeShareParamDetail implements Serializable {
 
 	private BigDecimal computeSingleResult;
 
+	private BigDecimal standComputeResult;
+
+	private BigDecimal standComputeSingleResult;
+
+	@TableField(exist = false)
+	private ComputeShareParam computeShareCost;
+
 }

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

@@ -4,16 +4,14 @@ 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;
+
 /**
  * 全院损益表
  *
@@ -70,6 +68,8 @@ public class HospProfitAndLoss implements Serializable {
     private String responsibilityCode;
 
     private String responsibilityName;
+
+    private Integer reportType;
     /**
      * 创建时间
      */

+ 9 - 4
src/main/java/com/kcim/dao/model/Sql.java

@@ -4,16 +4,15 @@ import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableLogic;
 import com.baomidou.mybatisplus.annotation.TableName;
-
-import java.io.Serializable;
-import java.util.Date;
-
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 import lombok.experimental.Accessors;
 
+import java.io.Serializable;
+import java.util.Date;
+
 /**
  * sql定义表
  * 
@@ -46,6 +45,12 @@ public class Sql implements Serializable {
 	 * sql代码(新增时定义修改不变)
 	 */
 	private String sqlCode;
+
+	/**
+	 * 取数类型 1自定义SQL 2Kettle转换 3Kettle作业
+	 */
+	private Integer dataSourceType;
+
 	/**
 	 * 语句
 	 */

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

@@ -0,0 +1,86 @@
+package com.kcim.dao.model;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 用户报表权限表
+ * 
+ * @author
+ */
+@Data
+@Accessors(chain = true)
+@AllArgsConstructor
+@NoArgsConstructor
+@TableName("com_user_report_right")
+public class UserReportRight implements Serializable {
+	private static final long serialVersionUID = 1L;
+
+	/**
+	 * 主键
+	 */
+	@TableId
+	private Integer id;
+	/**
+	 * 医院id
+	 */
+	private Long hospId;
+	/**
+	 * 中台用户id
+	 */
+	private Long userId;
+	/**
+	 * 中台用户工号
+	 */
+	private String account;
+	/**
+     *报表代码,对应公用字典(损益表报表类型)的code
+	 */
+	private String reportCode;
+	/**
+	 * 创建人
+	 */
+	@JsonIgnore
+	private String createUser;
+	/**
+	 * 创建时间
+	 */
+	@JsonIgnore
+	private Date createTime;
+	/**
+	 * 更新人
+	 */
+	@JsonIgnore
+	private String updateUser;
+	/**
+	 * 更新时间
+	 */
+	@JsonIgnore
+	private Date updateTime;
+	/**
+	 * 删除人
+	 */
+	@JsonIgnore
+	private String deleteUser;
+	/**
+	 * 删除时间
+	 */
+	@JsonIgnore
+	private Date deleteTime;
+	/**
+	 * 删除标志  0正常 1作废
+	 */
+	@TableLogic(value = "0",delval = "1")
+	@JsonIgnore
+	private Integer delFlag;
+
+}

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

@@ -0,0 +1,86 @@
+package com.kcim.dao.model;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 用户责任中心权限表
+ * 
+ * @author
+ */
+@Data
+@Accessors(chain = true)
+@AllArgsConstructor
+@NoArgsConstructor
+@TableName("com_user_responsibility_right")
+public class UserResponsibilityRight implements Serializable {
+	private static final long serialVersionUID = 1L;
+
+	/**
+	 * 主键
+	 */
+	@TableId
+	private Integer id;
+	/**
+	 * 医院id
+	 */
+	private Long hospId;
+	/**
+	 * 中台用户id
+	 */
+	private Long userId;
+	/**
+	 * 中台用户工号
+	 */
+	private String account;
+	/**
+	 *责任中心代码
+	 */
+	private String responsibilityCode;
+	/**
+	 * 创建人
+	 */
+	@JsonIgnore
+	private String createUser;
+	/**
+	 * 创建时间
+	 */
+	@JsonIgnore
+	private Date createTime;
+	/**
+	 * 更新人
+	 */
+	@JsonIgnore
+	private String updateUser;
+	/**
+	 * 更新时间
+	 */
+	@JsonIgnore
+	private Date updateTime;
+	/**
+	 * 删除人
+	 */
+	@JsonIgnore
+	private String deleteUser;
+	/**
+	 * 删除时间
+	 */
+	@JsonIgnore
+	private Date deleteTime;
+	/**
+	 * 删除标志  0正常 1作废
+	 */
+	@TableLogic(value = "0",delval = "1")
+	@JsonIgnore
+	private Integer delFlag;
+
+}

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

@@ -1,5 +1,6 @@
 package com.kcim.dao.model.dto;
 
+import com.kcim.dao.model.Item;
 import lombok.Data;
 
 import java.math.BigDecimal;
@@ -37,4 +38,6 @@ public class PatientItemDepartmentGroupVo {
 
     private String itemType;
 
+    private Item dicItem;
+
 }

+ 20 - 0
src/main/java/com/kcim/dao/repository/ComputeShareParamRepository.java

@@ -84,4 +84,24 @@ public class ComputeShareParamRepository extends ServiceImpl<ComputeShareParamMa
         return computeShareParamDetail.stream().filter(f -> !StringUtils.isEmpty(f.getResponsibilityCode())).collect(Collectors.toList());
 
     }
+
+    /**
+     * 获取责任中心的分摊参数汇总数据
+     * @param computeDate
+     * @return
+     */
+    public List<ComputeShareParamDetailVo> getComputeShareParamDetailGroup(String computeDate) {
+        List<ComputeShareParamDetailVo> computeShareParamDetail = this.baseMapper.getComputeShareParamDetailGroup(computeDate, UserContext.getHospId());
+        return computeShareParamDetail.stream().filter(f -> !StringUtils.isEmpty(f.getResponsibilityCode())).collect(Collectors.toList());
+    }
+
+    /**
+     * 获取要计算的科室收费项目
+     * @param computeDate
+     * @return
+     */
+    public List<ComputeShareParamDetailVo> getComputeResponsibilityItem(String computeDate) {
+        List<ComputeShareParamDetailVo> computeShareParamDetail = this.baseMapper.getComputeResponsibilityItem(computeDate, UserContext.getHospId());
+        return computeShareParamDetail.stream().filter(f -> !StringUtils.isEmpty(f.getResponsibilityCode())).collect(Collectors.toList());
+    }
 }

+ 19 - 0
src/main/java/com/kcim/dao/repository/CostDepartmentProfitRepository.java

@@ -46,6 +46,25 @@ public class CostDepartmentProfitRepository extends ServiceImpl<CostDepartmentPr
         return this.list(queryWrapper);
     }
 
+    /**
+     * 获取科室损益数据
+     * @param computeDate
+     * @return
+     */
+    public List<CostDepartmentProfit> getDepartmentProfit(String computeDate) {
+        Date dateTime = DateUtils.StringToDate(computeDate, DateStyleEnum.YYYY_MM);
+        int year = DateUtil.year(dateTime);
+        int month = DateUtil.month(dateTime) + 1;
+        LambdaQueryWrapper<CostDepartmentProfit> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(CostDepartmentProfit::getYear,year);
+        queryWrapper.eq(CostDepartmentProfit::getMonth,month);
+        queryWrapper.eq(CostDepartmentProfit::getHospId, UserContext.getHospId());
+        return this.list(queryWrapper);
+
+
+
+    }
+
     public Integer getMaxYear(Long hospId) {
 
         return this.baseMapper.getMaxYear(hospId);

+ 1 - 2
src/main/java/com/kcim/dao/repository/ItemRepository.java

@@ -6,7 +6,6 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.kcim.common.constants.NumberConstant;
 import com.kcim.common.util.UserContext;
 import com.kcim.dao.mapper.ItemMapper;
-import com.kcim.dao.model.EmpCostMap;
 import com.kcim.dao.model.Item;
 import com.kcim.vo.SessionUserVO;
 import org.springframework.stereotype.Repository;
@@ -31,7 +30,7 @@ public class ItemRepository extends ServiceImpl<ItemMapper, Item> {
         queryWrapper.eq(Item::getHospId, UserContext.getHospId());
         if(!StringUtils.isEmpty(name)){
 //            queryWrapper.like(Item::getName,name);
-            queryWrapper.and(q->q.like(Item::getName,name).or().like(Item::getNationalCode,name));
+            queryWrapper.and(q->q.like(Item::getName,name).or().like(Item::getNationalCode,name).or().like(Item::getCode,name));
         }
         if(type.equals(NumberConstant.ONE)){
             queryWrapper.isNull(Item::getStandItemCode);

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

@@ -1,15 +1,11 @@
 package com.kcim.dao.repository;
 
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.kcim.common.util.UserContext;
 import com.kcim.dao.mapper.OrderCostDetailMapper;
-import com.kcim.dao.model.ComputeClinicalPathwayCostDetail;
-import com.kcim.dao.model.ComputeGroupCostDetail;
 import com.kcim.dao.model.OrderCostDetail;
 import org.springframework.stereotype.Repository;
-import org.springframework.util.CollectionUtils;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -53,7 +49,6 @@ public class OrderCostDetailRepository extends ServiceImpl<OrderCostDetailMapper
             this.update(updateWrapper);
         }
 
-
     }
 
     static  Integer MAX_NUMBER = 500;

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

@@ -48,7 +48,7 @@ public class StandItemRepository extends ServiceImpl<StandItemMapper, StandItem>
         queryWrapper.eq(StandItem::getHospId, UserContext.getHospId());
         if(!StringUtils.isEmpty(name)){
 //            queryWrapper.like(StandItem::getName,name);
-            queryWrapper.and(q->q.like(StandItem::getName,name).or().like(StandItem::getNationalCode,name));
+            queryWrapper.and(q->q.like(StandItem::getName,name).or().like(StandItem::getNationalCode,name).or().like(StandItem::getCode,name));
         }
         if(!StringUtils.isEmpty(kcClassCode)){
             queryWrapper.eq(StandItem::getKcClassCode,kcClassCode);

+ 98 - 0
src/main/java/com/kcim/dao/repository/UserReportRightRepository.java

@@ -0,0 +1,98 @@
+package com.kcim.dao.repository;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.kcim.common.util.UserContext;
+import com.kcim.dao.mapper.UserReportRightMapper;
+import com.kcim.dao.model.UserReportRight;
+import org.springframework.stereotype.Repository;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * @program: CostAccount
+ * @description: 用户有权限的损益报表数据库交互
+ * @author: Wang.YS
+ * @create: 2023-10-26 10:41
+ **/
+@Repository
+public class UserReportRightRepository extends ServiceImpl<UserReportRightMapper, UserReportRight> {
+    /**
+     * 获取当前用户有权限的损益报表数据
+     * @return  列表
+     */
+    public List<UserReportRight> getList() {
+        LambdaQueryWrapper<UserReportRight> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(UserReportRight::getHospId, UserContext.getHospId());
+        queryWrapper.eq(UserReportRight::getUserId, UserContext.getCurrentUser().getId());
+        return this.list(queryWrapper);
+    }
+
+
+    /**
+     * 添加一个用户损益报表权限
+     * @param uerReportRight
+     */
+    public void addUserReportRight(UserReportRight uerReportRight) {
+        uerReportRight.setHospId(UserContext.getHospId());
+        uerReportRight.setCreateTime(new Date());
+        uerReportRight.setCreateUser(String.valueOf(UserContext.getCurrentUser().getId()));
+        this.save(uerReportRight);
+    }
+
+    /**
+     * 添加一个用户损益报表权限
+     * @param userId
+     * @param reportCode
+     */
+    public void addUserReportRight(Long userId,String  reportCode) {
+        UserReportRight uerReportRight = new UserReportRight();
+        uerReportRight.setHospId(UserContext.getHospId());
+        uerReportRight.setUserId(userId);
+        uerReportRight.setReportCode(reportCode);
+        uerReportRight.setCreateTime(new Date());
+        uerReportRight.setCreateUser(String.valueOf(UserContext.getCurrentUser().getId()));
+        this.save(uerReportRight);
+    }
+
+    /**
+     * 删除一个用户损益报表权限
+     * @param uerReportRight
+     */
+    public void deleteUserReportRight(UserReportRight uerReportRight) {
+        LambdaQueryWrapper<UserReportRight> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(UserReportRight::getHospId, UserContext.getHospId());
+        queryWrapper.eq(UserReportRight::getUserId, uerReportRight.getUserId());
+        queryWrapper.eq(UserReportRight::getReportCode, uerReportRight.getReportCode());
+        UserReportRight item = this.getOne(queryWrapper);
+        if(Objects.nonNull(item)){
+            item.setDeleteTime(new Date());
+            item.setDeleteUser(String.valueOf(UserContext.getCurrentUser().getId()));
+            this.updateById(item);
+            this.removeById(item.getId());
+        }
+    }
+
+    /**
+     * 删除一个用户损益报表权限
+     * @param userId
+     * @param reportCode
+     */
+    public void deleteUserReportRight(Long userId,String  reportCode) {
+        LambdaQueryWrapper<UserReportRight> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(UserReportRight::getHospId, UserContext.getHospId());
+        queryWrapper.eq(UserReportRight::getUserId,userId);
+        queryWrapper.eq(UserReportRight::getReportCode, reportCode);
+        UserReportRight item = this.getOne(queryWrapper);
+        if(Objects.nonNull(item)){
+            item.setDeleteTime(new Date());
+            item.setDeleteUser(String.valueOf(UserContext.getCurrentUser().getId()));
+            this.updateById(item);
+            this.removeById(item.getId());
+        }
+    }
+
+
+}

+ 123 - 0
src/main/java/com/kcim/dao/repository/UserResponsibilityRightRepository.java

@@ -0,0 +1,123 @@
+package com.kcim.dao.repository;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.kcim.common.util.UserContext;
+import com.kcim.dao.mapper.UserResponsibilityRightMapper;
+import com.kcim.dao.model.UserResponsibilityRight;
+import org.springframework.stereotype.Repository;
+import org.springframework.util.CollectionUtils;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+/**
+ * @program: CostAccount
+ * @description: 用户有权限的责任中心数据库交互
+ * @author: Wang.YS
+ * @create: 2023-10-26 10:41
+ **/
+@Repository
+public class UserResponsibilityRightRepository extends ServiceImpl<UserResponsibilityRightMapper, UserResponsibilityRight> {
+    /**
+     * 获取当前用户有权限的责任中心数据
+     * @return  列表
+     */
+    public List<UserResponsibilityRight> getList() {
+        return getListByUserId(UserContext.getCurrentUser().getId());
+    }
+
+    /**
+     * 获取指定用户有权限的列表
+     * @param userId
+     * @return
+     */
+    public List<UserResponsibilityRight> getListByUserId(Long userId) {
+        LambdaQueryWrapper<UserResponsibilityRight> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(UserResponsibilityRight::getHospId, UserContext.getHospId());
+        queryWrapper.eq(UserResponsibilityRight::getUserId, userId);
+        return this.list(queryWrapper);
+    }
+
+    /**
+     * 批量删除指定用户责任中心权限
+     * @param list
+     */
+    public void removeUserResponsibilityRightList(List<UserResponsibilityRight> list){
+        if(!CollectionUtils.isEmpty(list)){
+            list.stream().forEach(userResponsibility-> {
+                userResponsibility.setDeleteUser(String.valueOf(UserContext.getCurrentUser().getId()));
+                userResponsibility.setDeleteTime(new Date());
+            });
+            this.updateBatchById(list);
+            List<Integer> collect = list.stream().map(UserResponsibilityRight::getId).collect(Collectors.toList());
+            this.removeByIds(collect);
+        }
+    }
+
+    /**
+     * 添加一个用户责任中心权限
+     * @param userResponsibilityRight
+     */
+    public void addUserResponsibilityRight(UserResponsibilityRight userResponsibilityRight) {
+        userResponsibilityRight.setHospId(UserContext.getHospId());
+        userResponsibilityRight.setCreateTime(new Date());
+        userResponsibilityRight.setCreateUser(String.valueOf(UserContext.getCurrentUser().getId()));
+        this.save(userResponsibilityRight);
+    }
+
+    /**
+     * 添加一个用户责任中心权限
+     * @param userId
+     * @param responsibilityCode
+     */
+    public void addUserResponsibilityRight(Long userId,String  responsibilityCode) {
+        UserResponsibilityRight userResponsibilityRight = new UserResponsibilityRight();
+        userResponsibilityRight.setHospId(UserContext.getHospId());
+        userResponsibilityRight.setUserId(userId);
+        userResponsibilityRight.setResponsibilityCode(responsibilityCode);
+        userResponsibilityRight.setCreateTime(new Date());
+        userResponsibilityRight.setCreateUser(String.valueOf(UserContext.getCurrentUser().getId()));
+        this.save(userResponsibilityRight);
+    }
+
+    /**
+     * 删除一个用户责任中心权限
+     * @param userResponsibilityRight
+     */
+    public void deleteUserResponsibilityRight(UserResponsibilityRight userResponsibilityRight) {
+        LambdaQueryWrapper<UserResponsibilityRight> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(UserResponsibilityRight::getHospId, UserContext.getHospId());
+        queryWrapper.eq(UserResponsibilityRight::getUserId, userResponsibilityRight.getUserId());
+        queryWrapper.eq(UserResponsibilityRight::getResponsibilityCode, userResponsibilityRight.getResponsibilityCode());
+        UserResponsibilityRight item = this.getOne(queryWrapper);
+        if(Objects.nonNull(item)){
+            item.setDeleteTime(new Date());
+            item.setDeleteUser(String.valueOf(UserContext.getCurrentUser().getId()));
+            this.updateById(item);
+            this.removeById(item.getId());
+        }
+    }
+
+    /**
+     * 删除指定用户的责任中心权限
+     * @param userId
+     * @param responsibilityCode
+     */
+    public void deleteUserResponsibilityRight(Long userId,String  responsibilityCode) {
+        LambdaQueryWrapper<UserResponsibilityRight> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(UserResponsibilityRight::getHospId, UserContext.getHospId());
+        queryWrapper.eq(UserResponsibilityRight::getUserId, userId);
+        queryWrapper.eq(UserResponsibilityRight::getResponsibilityCode, responsibilityCode);
+        UserResponsibilityRight item = this.getOne(queryWrapper);
+        if(Objects.nonNull(item)){
+            item.setDeleteTime(new Date());
+            item.setDeleteUser(String.valueOf(UserContext.getCurrentUser().getId()));
+            this.updateById(item);
+            this.removeById(item.getId());
+        }
+    }
+
+}

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

@@ -32,6 +32,13 @@ public interface CenterService {
 
     CommonParameterVo getParameter(Long parameterCode);
 
+    /**
+     * 获取指定Code的参数值
+     * @param parameterCode
+     * @return
+     */
+    String getParameterValue(Long parameterCode);
+
     List<KCClassVo>  getKCClass();
 
     List<SysDepartment>  getDepartmentByDepartmentIds(List<Long> departmentIds);

+ 9 - 0
src/main/java/com/kcim/service/HospProfitAndLossService.java

@@ -21,6 +21,15 @@ public interface HospProfitAndLossService extends IService<HospProfitAndLoss> {
      */
     void calc(String date, Long hospId);
 
+    /**
+     * 计算全院损益
+     *
+     * @param date   yyyy-MM-dd 时间
+     * @param hospId 医院id
+     * @param reportType 报表类型
+     */
+    void calcHospProfit(String date, Long hospId, Integer reportType);
+
     /**
      * 全院损益列表
      *

+ 8 - 1
src/main/java/com/kcim/service/ReportFormService.java

@@ -1,11 +1,11 @@
 package com.kcim.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.kcim.dao.model.ReportForm;
 import com.kcim.dao.model.dto.CopyReportDTO;
 import com.kcim.dao.model.dto.ReportFormEditDTO;
 import com.kcim.dao.model.dto.ReportFormSaveDTO;
 import com.kcim.vo.ReportFormVO;
-import com.kcim.dao.model.ReportForm;
 import com.kcim.vo.SessionUserVO;
 
 import java.util.List;
@@ -75,6 +75,13 @@ public interface ReportFormService extends IService<ReportForm> {
      */
     public void checkExistLoss(Long hospId);
 
+    /**
+     * 校验指定类型的全院损益报表是否存在默认损益
+     * @param hospId
+     * @param reportType
+     */
+    public void checkExistLoss(Long hospId, Integer reportType);
+
     Object getResponsibilities(String reportType, Long reportId);
 
     ReportForm getByReportId(Long hospId, String reportType, Long reportId);

+ 6 - 1
src/main/java/com/kcim/service/ResponsibilityDepartmentService.java

@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.service.IService;
 import com.kcim.dao.model.dto.DepartDTO;
 import com.kcim.vo.CenterDepartmentVO;
 import com.kcim.dao.model.ResponsibilityDepartment;
+import com.kcim.vo.ResponsibilityDepartIdVO;
 
 import java.util.List;
 
@@ -30,6 +31,10 @@ public interface ResponsibilityDepartmentService extends IService<Responsibility
      */
     void saveCenterDepart(DepartDTO departDTO);
 
-
+    /**
+     * 获取责任中心科室对照字典
+     * @return
+     */
+    List<ResponsibilityDepartIdVO> getResponsibilityDepart();
 }
 

+ 54 - 0
src/main/java/com/kcim/service/UserReportRightService.java

@@ -0,0 +1,54 @@
+package com.kcim.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.kcim.dao.model.UserReportRight;
+import com.kcim.vo.DictDataVo;
+import com.kcim.vo.UserReportRightVO;
+
+import java.util.List;
+
+
+/**
+ *
+ * @author Administrator
+ */
+public interface UserReportRightService extends IService<UserReportRight> {
+
+    /**
+     * 获取用户有权限的损益报表
+     * @return
+     */
+    DictDataVo getUserReports();
+
+    /**
+     * 获取用户列表
+     * @param userName
+     * @return
+     */
+    Object getUserList(Integer current, Integer pageSize,String userName);
+
+
+    /**
+     * 获取用户有权限的损益报表列表
+     * @param reportName
+     * @param hideFlag
+     * @param userId
+     * @return
+     */
+    List<UserReportRightVO> getUserReportRights(Long userId,String reportName, Integer hideFlag);
+
+    /**
+     * 修改指定用户的损益报表权限
+     * @param userId
+     * @param reportCode
+     * @param status
+     */
+    void editUserReportRight(Long userId, String reportCode, Integer status);
+
+    /**
+     * 编辑用户损益报表权限
+     * @param userReportRightVO
+     */
+    public void editUserReportRight(UserReportRightVO userReportRightVO);
+}
+

+ 69 - 0
src/main/java/com/kcim/service/UserResponsibilityRightService.java

@@ -0,0 +1,69 @@
+package com.kcim.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.kcim.dao.model.Responsibility;
+import com.kcim.dao.model.UserResponsibilityRight;
+import com.kcim.vo.UserResponsibilityRightVO;
+
+import java.util.List;
+
+
+/**
+ * 用户责任中心权限
+ * @author Administrator
+ */
+public interface UserResponsibilityRightService  extends IService<UserResponsibilityRight> {
+
+    /**
+     * 获取用户有权限的责任中心列表
+     * @return
+     */
+    List<UserResponsibilityRight> getUserResponsibilityRight();
+
+
+    /**
+     * 获取用户的责任中心权限列表
+     * @param userId
+     * @param responsibilityName
+     * @param hideFlag
+     * @return
+     */
+    List<UserResponsibilityRightVO> getUserResponsibilityRights(Long userId,String responsibilityName, Integer hideFlag);
+
+    /**
+     * 编辑用户损益报表权限
+     * @param uerResponsibilityRightVO
+     */
+    void editUserResponsibilityRight(UserResponsibilityRightVO uerResponsibilityRightVO);
+
+    /**
+     * 修改指定用户的责任中心权限
+     * @param userId
+     * @param responsibilityCode
+     * @param status
+     */
+    void editUserResponsibilityRight(Long userId,String responsibilityCode,Integer status);
+
+    /**
+     * 给用户添加所有损益报表权限
+     * @param userId
+     * @param allRightFlag
+     */
+    void editAllUserResponsibilityRight(Long userId,Integer allRightFlag);
+
+    /**
+     * 获取授权的责任中心
+     * @param fullResponsibilityList 需要去除非授权的完整的责任中心列表
+     * @return
+     */
+    List<Responsibility> getAuthorizedResponsibility(List<Responsibility> fullResponsibilityList);
+
+
+    /**
+     * 是否开启用户损益报表数据权限功能
+     * @return
+     */
+    boolean IsUserReportRightAble();
+
+}
+

+ 73 - 16
src/main/java/com/kcim/service/impl/AllocationServiceImpl.java

@@ -503,6 +503,7 @@ public class AllocationServiceImpl extends ServiceImpl<AllocationMapper, Allocat
 //        Map<String, AllocationReportVO> allAliMap = allocationReportVOList.stream().collect(Collectors.toMap(k -> k.getResponsibilityName() + k.getAlias() + k.getTargetResponsibilityName() + k.getShareParamName(), synOne -> synOne));
         // 当前责任中心下面有几个会计科目  后面进行合并使用
         final int[] numResponsibility = new int[1];
+        levelSort=levelSort+1;
 //        // 从第几列开始编写数据
         final int[] column = {levelSort + 3};
         responsibilityMap.forEach((key,value)->{
@@ -609,15 +610,31 @@ public class AllocationServiceImpl extends ServiceImpl<AllocationMapper, Allocat
 //                    writer.merge(num, num + shareParamSize - 1, k + 1, k + 1, costCostingVO.getTargetShareMoneys().get(t++), false);
 //
 //                }
-                if(!CollectionUtils.isEmpty(targetShareMoneyList)){
-                    for (int k = 0; k < levelSort - 1; k++) {
-                        writer.merge(num, num + shareParamSize - 1, k + 1, k + 1, targetShareMoneyList.get(k), false);
-                    }
-                }else {
-                    for (int k = 0; k < levelSort - 1; k++) {
-                        writer.merge(num, num + shareParamSize - 1, k + 1, k + 1, "0.0000", false);
-                    }
+                for (int k = 0; k < levelSort - 1; k++) {
+                    Object allocationAmount = getAllocationAmount(levelSort, k, allocationReportVOS, targetShareMoneyList);
+                    writer.merge(num, num + shareParamSize - 1, k + 1, k + 1, allocationAmount, false);
                 }
+//                if(!CollectionUtils.isEmpty(targetShareMoneyList)){
+//                    for (int k = 0; k < levelSort - 1; k++) {
+//                        if(k==levelSort-2){
+//                            BigDecimal totalAmount = allocationReportVOS.stream().map(AllocationReportVO::getAmount)
+//                                    .reduce(BigDecimal.ZERO, BigDecimal::add);
+//                            writer.merge(num, num + shareParamSize - 1, k + 1, k + 1, totalAmount, false);
+//                        }else {
+//                            writer.merge(num, num + shareParamSize - 1, k + 1, k + 1, targetShareMoneyList.get(k), false);
+//                        }
+//                    }
+//                }else {
+//                    for (int k = 0; k < levelSort - 1; k++) {
+//                        if(k==levelSort-2){
+//                            BigDecimal totalAmount = allocationReportVOS.stream().map(AllocationReportVO::getAmount)
+//                                    .reduce(BigDecimal.ZERO, BigDecimal::add);
+//                            writer.merge(num, num + shareParamSize - 1, k + 1, k + 1, totalAmount, false);
+//                        }else {
+//                            writer.merge(num, num + shareParamSize - 1, k + 1, k + 1, "0.0000", false);
+//                        }
+//                    }
+//                }
 
                 // 设置对应的分摊参数值
                 Set<String> strings = linkedHashMap.keySet();
@@ -661,16 +678,33 @@ public class AllocationServiceImpl extends ServiceImpl<AllocationMapper, Allocat
 //                }
                 List<String> targetShareMoneyList = targetTotalMoneys.get(target);
 
-                if(!CollectionUtils.isEmpty(targetShareMoneyList)){
-                    for (int k = 0; k < levelSort - 1; k++) {
-                        writer.writeCellValue(k + 1, num, targetShareMoneyList.get(k));
-                    }
-                }else {
-                    for (int k = 0; k < levelSort - 1; k++) {
-                        writer.writeCellValue(k + 1, num, "0.0000");
-                    }
+                for (int k = 0; k < levelSort - 1; k++) {
+                    Object allocationAmount = getAllocationAmount(levelSort, k, allocationReportVOS, targetShareMoneyList);
+                    writer.writeCellValue(k + 1, num, allocationAmount);
                 }
 
+//                if(!CollectionUtils.isEmpty(targetShareMoneyList)){
+//                    for (int k = 0; k < levelSort - 1; k++) {
+//                        if(k==levelSort-2){
+//                            BigDecimal totalAmount = allocationReportVOS.stream().map(AllocationReportVO::getAmount)
+//                                    .reduce(BigDecimal.ZERO, BigDecimal::add);
+//                            writer.writeCellValue(k + 1, num, totalAmount);
+//                        }else {
+//                            writer.writeCellValue(k + 1, num, targetShareMoneyList.get(k));
+//                        }
+//                    }
+//                }else {
+//                    for (int k = 0; k < levelSort - 1; k++) {
+//                        if(k==levelSort-2){
+//                            BigDecimal totalAmount = allocationReportVOS.stream().map(AllocationReportVO::getAmount)
+//                                    .reduce(BigDecimal.ZERO, BigDecimal::add);
+//                            writer.writeCellValue(k + 1, num, totalAmount);
+//                        }else {
+//                            writer.writeCellValue(k + 1, num, "0.0000");
+//                        }
+//                    }
+//                }
+
                 writer.writeCellValue(levelSort, num, allocationReportVOS.get(0).getShareParamName());
                 writer.writeCellValue(levelSort + 1, num, allocationReportVOS.get(0).getShareParamValueNums());
                 writer.writeCellValue(levelSort + 2, num, allocationReportVOS.get(0).getShareParamRates());
@@ -750,6 +784,29 @@ public class AllocationServiceImpl extends ServiceImpl<AllocationMapper, Allocat
         return writer;
     }
 
+    /**
+     * 获取责任中心对应层级的分摊金额
+     * @param levelSort
+     * @param index
+     * @param allocationReportVOS
+     * @param targetShareMoneyList
+     * @return
+     */
+    public Object getAllocationAmount(int levelSort,int index,List<AllocationReportVO> allocationReportVOS,List<String> targetShareMoneyList){
+        //当前层级取分摊金额加总
+        if(index==levelSort-2){
+            BigDecimal totalAmount = allocationReportVOS.stream().map(AllocationReportVO::getAmount)
+                    .reduce(BigDecimal.ZERO, BigDecimal::add);
+            return totalAmount;
+        }
+        //取不到对应层级的分摊总金额
+        if(CollectionUtils.isEmpty(targetShareMoneyList)||targetShareMoneyList.size()<=index){
+            return  BigDecimal.valueOf(NumberConstant.ZERO,NumberConstant.FOUR);
+        }
+        //取对应层级的分摊总金额
+        return targetShareMoneyList.get(index);
+    }
+
     /**
      * 查询数据
      *

+ 24 - 1
src/main/java/com/kcim/service/impl/CenterServiceImpl.java

@@ -1,6 +1,7 @@
 package com.kcim.service.impl;
 
 import com.alibaba.fastjson2.JSON;
+import com.kcim.common.constants.Constant;
 import com.kcim.common.exception.CostException;
 import com.kcim.dao.model.dto.SysDepartment;
 import com.kcim.endPoint.CenterEndPoint;
@@ -12,8 +13,12 @@ import com.kcim.vo.UserInfoVO;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
+import org.springframework.util.ObjectUtils;
 
-import java.util.*;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
 import java.util.stream.Collectors;
 
 import static com.kcim.common.constants.Constant.CENTER_SYSTEM_ID;
@@ -31,27 +36,32 @@ import static com.kcim.common.constants.Constant.LOCAL_SYSTEM_ID;
 public class CenterServiceImpl implements CenterService {
     CenterEndPoint endPoint;
 
+    @Override
     public List<UserInfoVO> getCenterUserInfo(String filter) {
         Object userInfo = endPoint.getUserInfo(filter);
         return JSON.parseArray(JSON.toJSONString(userInfo), UserInfoVO.class);
 
     }
 
+    @Override
     public DictDataVo getDict(String dictType){
         Object dict = endPoint.getDict(dictType, LOCAL_SYSTEM_ID);
         return JSON.parseObject(JSON.toJSONString(dict), DictDataVo.class);
     }
 
+    @Override
     public DictDataVo getCenterDict(String dictType){
         Object dict = endPoint.getDict(dictType, CENTER_SYSTEM_ID);
         return JSON.parseObject(JSON.toJSONString(dict), DictDataVo.class);
     }
 
+    @Override
     public List<DictDataVo> getAllDict(){
         Object dict = endPoint.getAllDict();
         return JSON.parseArray(JSON.toJSONString(dict), DictDataVo.class);
     }
 
+    @Override
     public List<DictDataVo> getAllDictBySystemId(){
         Object dict = endPoint.getAllDictBySystemId(LOCAL_SYSTEM_ID);
         return JSON.parseArray(JSON.toJSONString(dict), DictDataVo.class);
@@ -81,8 +91,21 @@ public class CenterServiceImpl implements CenterService {
         }catch (Exception e){
             throw new CostException(e.getMessage());
         }
+    }
 
 
+    @Override
+    public String getParameterValue(Long parameterCode) {
+        try {
+            Object dict = endPoint.getParameter(LOCAL_SYSTEM_ID, parameterCode);
+            CommonParameterVo commonParameterVo = JSON.parseObject(JSON.toJSONString(dict), CommonParameterVo.class);
+            if(ObjectUtils.isEmpty(commonParameterVo)||ObjectUtils.isEmpty(commonParameterVo.getValue())) {
+                return Constant.EMPTY_STR;
+            }
+            return  commonParameterVo.getValue();
+        }catch (Exception e){
+            throw new CostException(e.getMessage());
+        }
     }
 
     @Override

+ 24 - 5
src/main/java/com/kcim/service/impl/ComputeMedicalDepartmentProfitServiceImpl.java

@@ -9,12 +9,10 @@ import com.kcim.common.util.ComputeDateUtils;
 import com.kcim.dao.model.ComputeMedicalDepartmentProfit;
 import com.kcim.dao.model.ReportForm;
 import com.kcim.dao.model.Responsibility;
+import com.kcim.dao.model.UserResponsibilityRight;
 import com.kcim.dao.repository.ComputeMedicalDepartmentProfitRepository;
 import com.kcim.dao.repository.CostDepartmentProfitRepository;
-import com.kcim.service.ComputeMedicalDepartmentProfitService;
-import com.kcim.service.ReportFormService;
-import com.kcim.service.ResponsibilityService;
-import com.kcim.service.SqlService;
+import com.kcim.service.*;
 import com.kcim.vo.MedicalResponsibilityVo;
 import com.kcim.vo.ReportFormProfitVo;
 import com.kcim.web.reponse.MedicalProfitResponse;
@@ -48,12 +46,14 @@ public class ComputeMedicalDepartmentProfitServiceImpl implements ComputeMedical
     ResponsibilityService responsibilityService ;
     ReportFormService reportFormService;
     CostDepartmentProfitRepository costDepartmentProfitRepository;
+    UserResponsibilityRightService userResponsibilityRightService;
 
-    public ComputeMedicalDepartmentProfitServiceImpl(SqlService sqlService, ComputeMedicalDepartmentProfitRepository repository, ResponsibilityService responsibilityService, ReportFormService reportFormService, CostDepartmentProfitRepository costDepartmentProfitRepository) {
+    public ComputeMedicalDepartmentProfitServiceImpl(SqlService sqlService, ComputeMedicalDepartmentProfitRepository repository, ResponsibilityService responsibilityService, ReportFormService reportFormService,UserResponsibilityRightService userResponsibilityRightService, CostDepartmentProfitRepository costDepartmentProfitRepository) {
         this.sqlService = sqlService;
         this.repository = repository;
         this.responsibilityService = responsibilityService;
         this.reportFormService = reportFormService;
+        this.userResponsibilityRightService=userResponsibilityRightService;
         this.costDepartmentProfitRepository = costDepartmentProfitRepository;
     }
 
@@ -321,6 +321,25 @@ public class ComputeMedicalDepartmentProfitServiceImpl implements ComputeMedical
         if(CollectionUtils.isEmpty(medicalProfitList)){
             throw new CostException(reportType+"未进行科室门住损益计算");
         }
+        //开启数据权限流程时
+        if(userResponsibilityRightService.IsUserReportRightAble()){
+            //获取用户所有有权限的责任中心
+            List<UserResponsibilityRight> currentUserResponsibilityRights = userResponsibilityRightService.getUserResponsibilityRight();
+            if(CollectionUtils.isEmpty(currentUserResponsibilityRights)){
+                throw new CostException("您没有分配责任中心权限,请联系管理员");
+            }
+            //如果不是分配了全部责任中心权限则过滤没有权限的责任中心
+            if(!currentUserResponsibilityRights.stream().anyMatch(userResponsibilityRight->
+                    userResponsibilityRight.getResponsibilityCode().equals(NumberConstant.ZERO_S))){
+                //筛选出有权限的责任中心对象
+                medicalProfitList = medicalProfitList.stream().filter(responsibility ->
+                        currentUserResponsibilityRights.stream().anyMatch(userRight ->
+                                userRight.getResponsibilityCode().equals(responsibility.getResponsibilityCode()))).collect(Collectors.toList());
+                if(CollectionUtils.isEmpty(medicalProfitList)){
+                    throw new CostException("您没有对应的责任中心权限,请联系管理员");
+                }
+            }
+        }
         //获取当前院区所有的责任中心
         List<Responsibility> responsibilityAllList = responsibilityService.list(new QueryWrapper<Responsibility>().lambda()
                 .eq(Responsibility::getHospId, hospId));

+ 30 - 4
src/main/java/com/kcim/service/impl/CostAccountShareServiceImpl.java

@@ -28,6 +28,7 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Propagation;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
+import org.springframework.util.ObjectUtils;
 import org.springframework.util.StringUtils;
 
 import java.math.BigDecimal;
@@ -151,7 +152,7 @@ public class CostAccountShareServiceImpl extends ServiceImpl<CostAccountShareMap
     public void addCostAccountShare(CostAccountShareSaveDto costAccountShareSaveDto) {
         Long hospId = UserContext.getCurrentLoginHospId();
         // 检验输入的数据的合理性
-        checkAccountShare(costAccountShareSaveDto, hospId);
+        checkAccountShare(costAccountShareSaveDto, hospId,null);
         CostAccountShare costAccountShareRequest = BeanUtil.convertObj(costAccountShareSaveDto, CostAccountShare.class);
         costAccountShareRequest.setHospId(hospId);
         costAccountShareRequest.setCreateTime(System.currentTimeMillis());
@@ -164,7 +165,7 @@ public class CostAccountShareServiceImpl extends ServiceImpl<CostAccountShareMap
      * @param costAccountShareSaveDto
      * @param hospId
      */
-    private void checkAccountShare(CostAccountShareSaveDto costAccountShareSaveDto, Long hospId) {
+    private void checkAccountShare(CostAccountShareSaveDto costAccountShareSaveDto, Long hospId,CostAccountShare oldCostAccountShare) {
         Long responsibilityId = costAccountShareSaveDto.getResponsibilityId();
         Responsibility responsibility = responsibilityService.getOne(new QueryWrapper<Responsibility>().lambda().eq(Responsibility::getHospId, hospId).eq(Responsibility::getId, responsibilityId));
         if (Objects.isNull(responsibility)) {
@@ -174,7 +175,8 @@ public class CostAccountShareServiceImpl extends ServiceImpl<CostAccountShareMap
         costAccountShareSaveDto.setResponsibilityCode(responsibility.getResponsibilityCode());
         costAccountShareSaveDto.setResponsibilityName(responsibility.getResponsibilityName());
         costAccountShareSaveDto.setShareLevel(responsibility.getShareLevel());
-        List<CostAccountShare> costAccountShareList = baseMapper.selectList(new QueryWrapper<CostAccountShare>().lambda().eq(CostAccountShare::getHospId, hospId).eq(CostAccountShare::getResponsibilityId, costAccountShareSaveDto.getResponsibilityId()));
+        //获取责任中心的其他设置记录
+        List<CostAccountShare> costAccountShareList = getResponsibilityOtherRecords(costAccountShareSaveDto,hospId,oldCostAccountShare);
         if (!StringUtils.isEmpty(costAccountShareSaveDto.getAccountingIds())) {
             // 这个责任中心允许输入会计科目
             List<Long> accountIdList = Arrays.stream(costAccountShareSaveDto.getAccountingIds().split(StrUtil.COMMA)).map(Long::valueOf).collect(Collectors.toList());
@@ -228,8 +230,31 @@ public class CostAccountShareServiceImpl extends ServiceImpl<CostAccountShareMap
         } else {
             throw new CostException(500, "对不起该责任中心没有对应分摊层级");
         }
+        //合并计算的配置将责任中心名称作为会计科目名称(会计科目名称不能为空,不然后续报表会报错)
+        if(NumberConstant.ZERO.equals(costShareLevel.getCalcType())){
+            costAccountShareSaveDto.setAccountingCodes(costAccountShareSaveDto.getResponsibilityCode());
+            costAccountShareSaveDto.setAccountingNames(costAccountShareSaveDto.getResponsibilityName());
+        }
+    }
+
+    /**
+     * 获取责任中心的其他设置记录
+     * @param costAccountShareSaveDto
+     * @param hospId
+     * @param oldCostAccountShare
+     * @return
+     */
+    public List<CostAccountShare> getResponsibilityOtherRecords(CostAccountShareSaveDto costAccountShareSaveDto, Long hospId,CostAccountShare oldCostAccountShare){
+        LambdaQueryWrapper<CostAccountShare> costAccountShareQuery = new QueryWrapper<CostAccountShare>().lambda().eq(CostAccountShare::getHospId, hospId).eq(CostAccountShare::getResponsibilityId, costAccountShareSaveDto.getResponsibilityId());
+        //修改时需排除掉自己
+        if(!ObjectUtils.isEmpty(oldCostAccountShare)){
+            costAccountShareQuery=costAccountShareQuery.ne(CostAccountShare::getId,oldCostAccountShare.getId());
+        }
+        List<CostAccountShare> costAccountShareList = baseMapper.selectList(costAccountShareQuery);
+        return costAccountShareList;
     }
 
+
     /**
      * 修改成本分摊参数对应表
      *
@@ -248,9 +273,10 @@ public class CostAccountShareServiceImpl extends ServiceImpl<CostAccountShareMap
         // 新增责任中心成本对照数据
         CostAccountShareSaveDto costAccountShareSaveDto = BeanUtil.convertObj(costAccountShareEditDto, CostAccountShareSaveDto.class);
         // 检验输入的数据是否符合规则
-        checkAccountShare(costAccountShareSaveDto, hospId);
+        checkAccountShare(costAccountShareSaveDto, hospId,costAccountShare);
         CostAccountShareEditDto accountShareEditDto = BeanUtil.convertObj(costAccountShareSaveDto, CostAccountShareEditDto.class);
         BeanUtil.convertObj(accountShareEditDto, costAccountShare);
+        costAccountShare.setId(costAccountShareEditDto.getId());
         baseMapper.updateById(costAccountShare);
     }
 

+ 54 - 6
src/main/java/com/kcim/service/impl/CostDepartmentProfitServiceImpl.java

@@ -111,6 +111,9 @@ public class CostDepartmentProfitServiceImpl extends ServiceImpl<CostDepartmentP
 
     private final CostAccountShareService costAccountShareService;
 
+    private final UserResponsibilityRightService userResponsibilityRightService ;
+
+
     private final SqlService sqlService;
     private final String AMOUNT = "金额";
 
@@ -120,7 +123,7 @@ public class CostDepartmentProfitServiceImpl extends ServiceImpl<CostDepartmentP
 
     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, ComputeLastProfitDateRepository computeLastProfitDateRepository, AccountingService accountingService, CostAccountShareService costAccountShareService, SqlService sqlService) {
+    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, ComputeLastProfitDateRepository computeLastProfitDateRepository, AccountingService accountingService, CostAccountShareService costAccountShareService, SqlService sqlService,UserResponsibilityRightService userResponsibilityRightService) {
         this.reportFormService = reportFormService;
         this.incomeCollectionService = incomeCollectionService;
         this.costShareLevelService = costShareLevelService;
@@ -137,6 +140,7 @@ public class CostDepartmentProfitServiceImpl extends ServiceImpl<CostDepartmentP
         this.accountingService = accountingService;
         this.costAccountShareService = costAccountShareService;
         this.sqlService = sqlService;
+        this.userResponsibilityRightService=userResponsibilityRightService;
     }
 
     /**
@@ -1249,6 +1253,7 @@ public class CostDepartmentProfitServiceImpl extends ServiceImpl<CostDepartmentP
         for (CommonTitleReportVo reportVo : titleReportVoList) {
             List<CommonTitleReportVo> childList = collect.get(reportVo.getReportId());
             if (!CollectionUtils.isEmpty(childList)) {
+                childList.sort(Comparator.comparing(CommonTitleReportVo::getSort, Comparator.nullsLast(Integer::compareTo)));
                 reportVo.setChildTitle(setReportChildren(childList, collect));
             }
         }
@@ -1274,7 +1279,10 @@ public class CostDepartmentProfitServiceImpl extends ServiceImpl<CostDepartmentP
         for (ReportForm reportForm : reportFormList) {
             Integer hide = reportForm.getHide();
             if(hide.equals(NumberConstant.ONE)){
-                filterProfit.addAll(collectGroup.get(reportForm.getId()));
+                List<CostDepartmentProfit> costDepartmentProfits = collectGroup.get(reportForm.getId());
+                if(!CollectionUtils.isEmpty(costDepartmentProfits)) {
+                    filterProfit.addAll(costDepartmentProfits);
+                }
             }
         }
 
@@ -1296,6 +1304,8 @@ public class CostDepartmentProfitServiceImpl extends ServiceImpl<CostDepartmentP
         if (CollectionUtils.isEmpty(responsibilityList)) {
             throw new CostException("未找到对应分摊层级责任中心");
         }
+        //获取授权的责任中心
+        responsibilityList=userResponsibilityRightService.getAuthorizedResponsibility(responsibilityList);
         //获取当前院区所有的责任中心
         List<Responsibility> responsibilityAllList = responsibilityService.list(new QueryWrapper<Responsibility>().lambda()
                 .eq(Responsibility::getHospId, hospId));
@@ -1334,6 +1344,7 @@ public class CostDepartmentProfitServiceImpl extends ServiceImpl<CostDepartmentP
             for (CostProfitVo costProfitVo : profitVos) {
                 costProfitVo.setResponsibilityCode(responsibility.getResponsibilityCode());
                 costProfitVo.setResponsibilityName(responsibility.getResponsibilityName());
+                costProfitVo.setSort(responsibility.getSort());
                 costProfitVo.setAmount(BigDecimal.ZERO);
                 costProfitVo.setPercent(BigDecimal.ZERO);
                 parentReportVos.add(costProfitVo);
@@ -1348,6 +1359,7 @@ public class CostDepartmentProfitServiceImpl extends ServiceImpl<CostDepartmentP
             for (CostProfitVo costProfitVo : profitVos) {
                 costProfitVo.setResponsibilityCode(responsibility.getResponsibilityCode());
                 costProfitVo.setResponsibilityName(responsibility.getResponsibilityName());
+                costProfitVo.setSort(responsibility.getSort());
                 costProfitVo.setAmount(BigDecimal.ZERO);
                 costProfitVo.setPercent(BigDecimal.ZERO);
                 if (aLong.equals(NumberConstant.ZERO_L)) {
@@ -1475,6 +1487,7 @@ public class CostDepartmentProfitServiceImpl extends ServiceImpl<CostDepartmentP
             vo.setResponsibilityCode(k);
             vo.setResponsibilityName(responseNameMap.get(k));
             if (!CollectionUtils.isEmpty(v)) {
+                vo.setSort(v.get(0).getSort());
                 List<CommonDataReportVo> dataReportVos = new ArrayList<>();
                 for (CostProfitVo costProfitVo : v) {
                     CommonDataReportVo vo1 = new CommonDataReportVo();
@@ -1484,6 +1497,7 @@ public class CostDepartmentProfitServiceImpl extends ServiceImpl<CostDepartmentP
                 }
                 vo.setProfitList(dataReportVos);
             } else {
+                vo.setSort(NumberConstant.ZERO);
                 vo.setProfitList(new ArrayList<>());
             }
             list.add(vo);
@@ -1497,6 +1511,7 @@ public class CostDepartmentProfitServiceImpl extends ServiceImpl<CostDepartmentP
             vo.setResponsibilityName(responseNameMap.get(k));
             if (!CollectionUtils.isEmpty(v)) {
                 vo.setParentResponsibilityCode(v.get(0).getParentResponsibilityCode());
+                vo.setSort(v.get(0).getSort());
                 List<CommonDataReportVo> dataReportVos = new ArrayList<>();
                 for (CostProfitVo costProfitVo : v) {
                     CommonDataReportVo vo1 = new CommonDataReportVo();
@@ -1506,6 +1521,7 @@ public class CostDepartmentProfitServiceImpl extends ServiceImpl<CostDepartmentP
                 }
                 vo.setProfitList(dataReportVos);
             } else {
+                vo.setSort(NumberConstant.ZERO);
                 vo.setProfitList(new ArrayList<>());
             }
             list1.add(vo);
@@ -1519,6 +1535,8 @@ public class CostDepartmentProfitServiceImpl extends ServiceImpl<CostDepartmentP
                 }
             }
         }
+        //按责任中心序号排序
+        costResponsibilityProfitVoSort(list);
         response.setData(list);
 
         //提取出最上层
@@ -1600,6 +1618,8 @@ public class CostDepartmentProfitServiceImpl extends ServiceImpl<CostDepartmentP
         if (CollectionUtils.isEmpty(responsibilityList)) {
             throw new CostException("未找到对应分摊层级责任中心");
         }
+        //获取授权的责任中心
+        responsibilityList=userResponsibilityRightService.getAuthorizedResponsibility(responsibilityList);
         List<Responsibility> responsibilityAllList = responsibilityService.list(new QueryWrapper<Responsibility>().lambda()
                 .eq(Responsibility::getHospId, hospId));
         Map<Long, Responsibility> map = responsibilityAllList.stream().collect(Collectors.toMap(Responsibility::getId, responsibility -> responsibility, (a, b) -> b));
@@ -1684,7 +1704,11 @@ public class CostDepartmentProfitServiceImpl extends ServiceImpl<CostDepartmentP
         for (ReportForm reportForm : reportFormList) {
             Integer hide = reportForm.getHide();
             if(hide.equals(NumberConstant.ONE)){
-                filterProfit.addAll(collect1.get(reportForm.getId()));
+//                filterProfit.addAll(collect1.get(reportForm.getId()));
+                List<CostDepartmentProfit> costDepartmentProfits = collect1.get(reportForm.getId());
+                if(!CollectionUtils.isEmpty(costDepartmentProfits)) {
+                    filterProfit.addAll(costDepartmentProfits);
+                }
             }
         }
 
@@ -1755,7 +1779,11 @@ public class CostDepartmentProfitServiceImpl extends ServiceImpl<CostDepartmentP
             for (ReportForm reportForm : reportFormList) {
                 Integer hide = reportForm.getHide();
                 if(hide.equals(NumberConstant.ONE)){
-                    filterProfit.addAll(collect1.get(reportForm.getId()));
+//                    filterProfit.addAll(collect1.get(reportForm.getId()));
+                    List<CostDepartmentProfit> costDepartmentProfits = collect1.get(reportForm.getId());
+                    if(!CollectionUtils.isEmpty(costDepartmentProfits)) {
+                        filterProfit.addAll(costDepartmentProfits);
+                    }
                 }
             }
 
@@ -1813,7 +1841,11 @@ public class CostDepartmentProfitServiceImpl extends ServiceImpl<CostDepartmentP
                     for (ReportForm reportForm : reportFormList) {
                         Integer hide = reportForm.getHide();
                         if(hide.equals(NumberConstant.ONE)){
-                            filterProfit.addAll(collect1.get(reportForm.getId()));
+//                            filterProfit.addAll(collect1.get(reportForm.getId()));
+                            List<CostDepartmentProfit> costDepartmentProfits = collect1.get(reportForm.getId());
+                            if(!CollectionUtils.isEmpty(costDepartmentProfits)) {
+                                filterProfit.addAll(costDepartmentProfits);
+                            }
                         }
                     }
                     Map<Long, Integer> sortMap = reportFormList.stream().collect(Collectors.toMap(ReportForm::getId, ReportForm::getSort, (a, b) -> b));
@@ -2134,6 +2166,8 @@ public class CostDepartmentProfitServiceImpl extends ServiceImpl<CostDepartmentP
         if (CollectionUtils.isEmpty(responsibilityList)) {
             throw new CostException("未找到对应分摊层级责任中心");
         }
+        //获取授权的责任中心
+        responsibilityList=userResponsibilityRightService.getAuthorizedResponsibility(responsibilityList);
         List<Responsibility> responsibilityAllList = responsibilityService.list(new QueryWrapper<Responsibility>().lambda()
                 .eq(Responsibility::getHospId, hospId));
         Map<Long, Responsibility> map = responsibilityAllList.stream().collect(Collectors.toMap(Responsibility::getId, responsibility -> responsibility, (a, b) -> b));
@@ -2228,10 +2262,15 @@ public class CostDepartmentProfitServiceImpl extends ServiceImpl<CostDepartmentP
 
         List<ReportFormCustomVo> costProfitVos1 = collect.get(0L);
         collect.remove(NumberConstant.ZERO_L);
-
+        //最外层排序
+        if (!CollectionUtils.isEmpty(costProfitVos1)) {
+            costProfitVos1.sort(Comparator.comparing(ReportFormCustomVo::getSort, Comparator.nullsLast(Integer::compareTo)));
+        }
         for (ReportFormCustomVo costProfitVo : costProfitVos1) {
             List<ReportFormCustomVo> costProfitVo1 = collect.get(costProfitVo.getId());
             if (!CollectionUtils.isEmpty(costProfitVo1)) {
+                //子项排序
+                costProfitVo1.sort(Comparator.comparing(ReportFormCustomVo::getSort, Comparator.nullsLast(Integer::compareTo)));
                 costProfitVo.setChildren(setCustomChildren(costProfitVo1, collect));
             }
         }
@@ -3088,4 +3127,13 @@ public class CostDepartmentProfitServiceImpl extends ServiceImpl<CostDepartmentP
         }
         T.sort(Comparator.comparing(CommonResponsibilityReportVo::getSort, Comparator.nullsLast(Integer::compareTo)));
     }
+
+    private void costResponsibilityProfitVoSort(List<CostResponsibilityProfitVo> T) {
+        for (CostResponsibilityProfitVo responsibility : T) {
+            if (!CollectionUtils.isEmpty(responsibility.getChild())) {
+                costResponsibilityProfitVoSort(responsibility.getChild());
+            }
+        }
+        T.sort(Comparator.comparing(CostResponsibilityProfitVo::getSort, Comparator.nullsLast(Integer::compareTo)));
+    }
 }

+ 234 - 213
src/main/java/com/kcim/service/impl/HospProfitAndLossServiceImpl.java

@@ -77,15 +77,21 @@ public class HospProfitAndLossServiceImpl extends ServiceImpl<HospProfitAndLossM
     private final ResponsibilityService responsibilityService;
     private final CostAccountShareService accountShareService;
     private final FileRecordService fileRecordService;
+    private final SqlService sqlService;
 
     private final MinioConfig minioConfig;
 
     private final MinioFileUtil minioFileUtil;
 
-    private final SqlService sqlService;
-
 
-    public HospProfitAndLossServiceImpl(ReportFormService reportFormService, IncomeCollectionService collectionService, AllocationQueryService allocationQueryService, AllocationService allocationService, ReportRelationService reportRelationService, CostShareLevelService shareLevelService, CostOtherPaymentsDataService otherPaymentsDataService, ResponsibilityService responsibilityService, CostAccountShareService accountShareService, FileRecordService fileRecordService, MinioConfig minioConfig, MinioFileUtil minioFileUtil, SqlService sqlService) {
+    public HospProfitAndLossServiceImpl(ReportFormService reportFormService,
+                                        IncomeCollectionService collectionService,
+                                        AllocationQueryService allocationQueryService,
+                                        AllocationService allocationService, ReportRelationService reportRelationService,
+                                        CostShareLevelService shareLevelService,
+                                        CostOtherPaymentsDataService otherPaymentsDataService,
+                                        ResponsibilityService responsibilityService,
+                                        CostAccountShareService accountShareService, FileRecordService fileRecordService, MinioConfig minioConfig, MinioFileUtil minioFileUtil,SqlService sqlService) {
         this.reportFormService = reportFormService;
         this.collectionService = collectionService;
         this.allocationQueryService = allocationQueryService;
@@ -98,9 +104,10 @@ public class HospProfitAndLossServiceImpl extends ServiceImpl<HospProfitAndLossM
         this.fileRecordService = fileRecordService;
         this.minioConfig = minioConfig;
         this.minioFileUtil = minioFileUtil;
-        this.sqlService = sqlService;
+        this.sqlService=sqlService;
     }
 
+
     /**
      * 计算全院损益
      *
@@ -180,6 +187,218 @@ public class HospProfitAndLossServiceImpl extends ServiceImpl<HospProfitAndLossM
         this.saveBatch(list);
     }
 
+    /**
+     * 计算全院损益
+     * @param date   yyyy-MM-dd 时间
+     * @param hospId 医院id
+     * @param reportType 报表类型
+     */
+    @Override
+    @Transactional(rollbackFor = Throwable.class, propagation = Propagation.REQUIRED)
+    public void calcHospProfit(String date, Long hospId, Integer reportType) {
+        List<Responsibility> leafResp = responsibilityService.getLeafResp(hospId);
+        DateTime parse = DateUtil.parse(date);
+        int year = DateUtil.year(parse);
+        int month = DateUtil.month(parse) + 1;
+        this.remove(
+                new LambdaQueryWrapper<HospProfitAndLoss>()
+                        .eq(HospProfitAndLoss::getDateYear, year)
+                        .eq(HospProfitAndLoss::getDateMonth, month)
+                        .eq(HospProfitAndLoss::getHospId, hospId)
+                        .eq(HospProfitAndLoss::getReportType, reportType)
+        );
+        // 得到全院损益计算报表
+        List<ReportForm> reportForms = reportFormService.getListByReportType(hospId, reportType);
+        if (CollUtil.isEmpty(reportForms)) {
+            throw new CostException("医院未设置全院损益计算报表");
+        }
+        reportFormService.checkExistLoss(hospId,reportType);
+        // 得到这个月所有收入数据
+        List<IncomeCollection> incomes = collectionService.getCollectionsByDate(year, month, hospId);
+        if (incomes.isEmpty()) {
+            throw new CostException("医院未归集本月收入数据");
+        }
+        Map<Long, List<ReportRelation>> reportRelationMap = reportRelationService.list(new QueryWrapper<ReportRelation>().lambda().eq(ReportRelation::getHospId, hospId)).stream().collect(Collectors.groupingBy(ReportRelation::getReportId));
+
+        // 得到这个月的所有成本数据
+        List<AllocationQuery> allocationQueries = allocationQueryService.getAllByDate(hospId, year, month);
+        if (allocationQueries.isEmpty()) {
+            throw new CostException("医院未分摊本月数据");
+        }
+        List<AllocationQueryReportVO> allocationQueryReportVOList = BeanUtil.convertList(allocationQueries, AllocationQueryReportVO.class);
+        allocationQueryReportVOList.forEach(i -> {
+            i.setAccountingCodes(Arrays.asList(i.getAccountingCode().split(StrUtil.COMMA)));
+            i.setAccountingNames(Arrays.asList(i.getAccountingName().split(StrUtil.COMMA)));
+        });
+        // 查询分摊的报表数据 后面的计算方式需要使用 小计等需要使用
+        List<Allocation> allocationList = allocationService.list(new QueryWrapper<Allocation>().lambda().eq(Allocation::getHospId, hospId)
+                .eq(year > 0, Allocation::getDateYear, year).eq(month > 0, Allocation::getDateMonth, month));
+        if (CollUtil.isEmpty(allocationList)) {
+            throw new CostException(500, "分摊报表数据不存在");
+        }
+        // 查询最后一个层级的责任中心
+        List<CostShareLevel> costShareLevelList = shareLevelService.list(new QueryWrapper<CostShareLevel>().lambda()
+                .eq(CostShareLevel::getHospId, hospId).orderByDesc(CostShareLevel::getLeverSort));
+        if (CollUtil.isEmpty(costShareLevelList)) {
+            throw new CostException(500, "分摊层级未设置");
+        }
+        List<HospProfitAndLossVo> listVo = new ArrayList<>();
+//        List<ReportForm> parentForms = reportForms.stream().filter(i -> i.getParentId().equals(0L)).collect(Collectors.toList());
+        int finalYear = year;
+        int finalMonth = month;
+        leafResp.forEach(i -> {
+            reportForms.forEach(j -> {
+                HospProfitAndLossVo hospProfitAndLossVo = new HospProfitAndLossVo();
+                hospProfitAndLossVo.setDateYear(finalYear);
+                hospProfitAndLossVo.setDateMonth(finalMonth);
+                hospProfitAndLossVo.setReportNum(j.getNum());
+                hospProfitAndLossVo.setReportName(j.getReportName());
+                hospProfitAndLossVo.setResponsibilityCode(i.getResponsibilityCode());
+                hospProfitAndLossVo.setResponsibilityName(i.getResponsibilityName());
+                hospProfitAndLossVo.setCostType(NumberConstant.ZERO);
+                hospProfitAndLossVo.setIncomeType(NumberConstant.ZERO);
+                hospProfitAndLossVo.setHospId(hospId);
+                hospProfitAndLossVo.setType(j.getCostType());
+                hospProfitAndLossVo.setFraction(j.getFraction());
+                hospProfitAndLossVo.setReportId(j.getId());
+                hospProfitAndLossVo.setReportNum(j.getNum());
+                hospProfitAndLossVo.setCalcType(j.getCalcType());
+                hospProfitAndLossVo.setReportName(j.getReportName());
+                hospProfitAndLossVo.setCalcFormula(j.getCalcFormula());
+                hospProfitAndLossVo.setReportParentId(j.getParentId());
+                listVo.add(hospProfitAndLossVo);
+            });
+        });
+
+        Map<Long, List<HospProfitAndLossVo>> listMap = listVo.stream().collect(Collectors.groupingBy(HospProfitAndLossVo::getReportId));
+        List<HospProfitAndLossVo> allList = BeanUtil.convertList(listVo, HospProfitAndLossVo.class);
+        // 记录每一次计算的钱
+        //所有小计 总计单独处理
+        listVo.forEach(i -> {
+            Integer calcType = i.getCalcType();
+            if (NumberConstant.ONE.equals(calcType)) {
+                // TODO 按照会计科目进行计算
+                i.setAmount(setAccountReportData(i, incomes, allocationQueryReportVOList, reportRelationMap));
+            } else if (NumberConstant.TWO.equals(calcType)) {
+                // TODO 按照分摊层级进行计算
+                i.setAmount(setShareLevelReportData(i, reportRelationMap, allocationList));
+            } else if (NumberConstant.THREE.equals(calcType)) {
+                // TODO 按照小计进行计算
+                i.setAmount(setSubtotal(i, costShareLevelList, listMap, listVo, incomes, allocationQueryReportVOList, reportRelationMap, allocationList, allList));
+            } else if (NumberConstant.FOUR.equals(calcType)) {
+                // TODO 按照计算公式进行计算
+//                i.setAmount(setCalculation(i, listVo, costShareLevelList, listMap, incomes, allocationQueryReportVOList, reportRelationMap, allocationList, allList));
+            } else if (NumberConstant.FIVE.equals(calcType)) {
+                // TODO  按照责任中心进行计算
+                i.setAmount(setResponsibilityCode(i, reportRelationMap, allocationList, allList));
+            } else {
+                i.setAmount(new BigDecimal("0.000000"));
+            }
+        });
+        //计算占比
+        if (CollectionUtils.isEmpty(listVo)) {
+            return;
+        }
+
+        List<HospProfitAndLossVo> listSum = new ArrayList<>();
+
+        //把所有数据按报表项目汇总
+        for (ReportForm j : reportForms) {
+            HospProfitAndLossVo hospProfitAndLossVo = new HospProfitAndLossVo();
+            hospProfitAndLossVo.setDateYear(finalYear);
+            hospProfitAndLossVo.setDateMonth(finalMonth);
+            hospProfitAndLossVo.setReportNum(j.getNum());
+            hospProfitAndLossVo.setReportName(j.getReportName());
+            hospProfitAndLossVo.setCostType(NumberConstant.ZERO);
+            hospProfitAndLossVo.setIncomeType(NumberConstant.ZERO);
+            hospProfitAndLossVo.setHospId(hospId);
+            hospProfitAndLossVo.setType(j.getCostType());
+            hospProfitAndLossVo.setFraction(j.getFraction());
+            hospProfitAndLossVo.setReportId(j.getId());
+            hospProfitAndLossVo.setReportNum(j.getNum());
+            hospProfitAndLossVo.setCalcType(j.getCalcType());
+            hospProfitAndLossVo.setReportName(j.getReportName());
+            hospProfitAndLossVo.setCalcFormula(j.getCalcFormula());
+            hospProfitAndLossVo.setReportParentId(j.getParentId());
+            listSum.add(hospProfitAndLossVo);
+        }
+        Map<Integer, List<HospProfitAndLossVo>> reportNumGroup = listVo.stream().collect(Collectors.groupingBy(HospProfitAndLossVo::getReportNum));
+        Map<Integer, BigDecimal> reportNumSumMap = new HashMap<>();
+        reportNumGroup.forEach((reportNum, hospProfitAndLossList) -> {
+            AtomicReference<BigDecimal> sum = new AtomicReference<>(new BigDecimal("0.000000"));
+            for (HospProfitAndLossVo hospProfitAndLoss : hospProfitAndLossList) {
+                if (hospProfitAndLoss.getAmount() != null) {
+                    sum.updateAndGet(f -> f.add(hospProfitAndLoss.getAmount()));
+                }
+            }
+            reportNumSumMap.put(reportNum, sum.get());
+        });
+
+        for (HospProfitAndLossVo costProfitVo : listSum) {
+            BigDecimal bigDecimal = reportNumSumMap.get(costProfitVo.getReportNum());
+            if (bigDecimal != null) {
+                costProfitVo.setAmount(bigDecimal);
+
+            } else {
+                costProfitVo.setAmount(BigDecimal.ZERO.setScale(6, RoundingMode.HALF_UP));
+            }
+        }
+        //单独计算计算公式数据
+        setCalculationAmount(listSum);
+        //收入
+        List<HospProfitAndLossVo> profitIncomeList = listSum.stream().filter(f -> f.getType().equals(NumberConstant.ONE)).collect(Collectors.toList());
+        List<HospProfitAndLossVo> profitIncome = costPercent(profitIncomeList);
+        //成本
+        List<HospProfitAndLossVo> profitCostList = listSum.stream().filter(f -> f.getType().equals(NumberConstant.TWO)).collect(Collectors.toList());
+
+        List<HospProfitAndLossVo> profitCost = costPercent(profitCostList);
+
+        //不计算项目
+        List<HospProfitAndLossVo> noCompute = listSum.stream().filter(f -> f.getFraction().equals(NumberConstant.THREE)).collect(Collectors.toList());
+        noCompute.forEach(profitVO -> profitVO.setPercent(null));
+
+        List<HospProfitAndLossVo> listAllVo = new ArrayList<>();
+
+        if (!CollectionUtils.isEmpty(profitIncome) && !CollectionUtils.isEmpty(profitCost) && !CollectionUtils.isEmpty(noCompute)) {
+            listAllVo.addAll(profitIncome);
+            listAllVo.addAll(profitCost);
+            listAllVo.addAll(noCompute);
+        } else if (!CollectionUtils.isEmpty(profitIncome) && !CollectionUtils.isEmpty(noCompute)) {
+            listAllVo.addAll(noCompute);
+            listAllVo.addAll(profitIncome);
+
+        } else if (!CollectionUtils.isEmpty(profitCost) && !CollectionUtils.isEmpty(noCompute)) {
+            listAllVo.addAll(noCompute);
+            listAllVo.addAll(profitCost);
+        } else if (!CollectionUtils.isEmpty(noCompute)) {
+            listAllVo.addAll(noCompute);
+        }
+
+        List<HospProfitAndLoss> list = BeanUtil.convertList(listAllVo, HospProfitAndLoss.class);
+        // 处理医院其他收支
+        List<CostOtherPaymentsData> otherPaymentsDatas = otherPaymentsDataService.getByMonth(year, month, hospId);
+        if (!otherPaymentsDatas.isEmpty()) {
+            otherPaymentsDatas.forEach(ele -> {
+                HospProfitAndLoss loss = new HospProfitAndLoss();
+                loss.setDateYear(year).setDateMonth(month).setReportName(ele.getPaymentsName()).setReportNum((int) (-ele.getId()))
+                        .setCreateTime(System.currentTimeMillis()).setAmount(ele.getTotalAmount()).setHospId(hospId)
+                        .setResponsibilityName("全院").setResponsibilityCode("-1").setPercent(null);
+                list.add(loss);
+            });
+        }
+        long l = System.currentTimeMillis();
+        list.forEach(i -> {
+            i.setCreateTime(l);
+            i.setReportType(reportType);
+        });
+        this.saveBatch(list);
+        Map<String,String> sqlParameter = new HashMap<>();
+
+        sqlParameter.put(SQLParameter.COMPUTE_DATE_CODE, DateUtils.StringToString(date, DateStyleEnum.YYYY_MM));
+        sqlParameter.put(SQLParameter.REPORT_TYPE_CODE,reportType.toString());
+        sqlService.autoExecuteSql(CustomSqlTypeEnum.HOSP_PROFIT_CALC.getCode(),sqlParameter);
+    }
+
     // 计算公式中钱
     private BigDecimal calcAmount(List<HospProfitAndLoss> list, String calcFormula, ReportForm reportForm) {
         // 得到所有的编号
@@ -447,7 +666,7 @@ public class HospProfitAndLossServiceImpl extends ServiceImpl<HospProfitAndLossM
         Map<Long, Responsibility> responsibilityIdMap = responsibilityList.stream().collect(Collectors.toMap(Responsibility::getId, responsibility -> responsibility, (a, b) -> b));
 
         // 查询所有的全院损益数据  内存溢出问题
-        List<HospProfitAndLoss> hospProfitAndLosses = getAllDataByDate(year, month, hospId);
+        List<HospProfitAndLoss> hospProfitAndLosses = getAllDataByDate(year, month, hospId,NumberConstant.THREE);
         if (CollectionUtils.isEmpty(hospProfitAndLosses)) {
             throw new CostException(500, "未进行全院损益计算");
         }
@@ -963,10 +1182,12 @@ public class HospProfitAndLossServiceImpl extends ServiceImpl<HospProfitAndLossM
         DateTime parse = DateUtil.parse(computeDate);
         int year = DateUtil.year(parse);
         int month = DateUtil.month(parse) + 1;
+        //查询全院损益报表配置
+        Integer integerReportType = Integer.valueOf(reportType);
 //        Integer year = ComputeDateUtils.getComputeYear(computeDate);
 //        Integer month = ComputeDateUtils.getComputeMonth(computeDate);
         // 查询所有的全院损益数据  内存溢出问题
-        List<HospProfitAndLoss> hospProfitAndLosses = getAllDataByDate(year, month, hospId);
+        List<HospProfitAndLoss> hospProfitAndLosses = getAllDataByDate(year, month, hospId,integerReportType);
         if (CollectionUtils.isEmpty(hospProfitAndLosses)) {
             throw new CostException(500, "未进行全院损益计算");
         }
@@ -975,8 +1196,6 @@ public class HospProfitAndLossServiceImpl extends ServiceImpl<HospProfitAndLossM
         if (!CollectionUtils.isEmpty(hospAllList)) {
             hospProfitAndLosses.removeAll(hospAllList);
         }
-        //查询全院损益报表配置
-        Integer integerReportType = Integer.valueOf(reportType);
         List<ReportForm> reportFormList = reportFormService.list(new QueryWrapper<ReportForm>().lambda()
                 .eq(ReportForm::getHospId, hospId)
                 .eq(ReportForm::getReportType, integerReportType).eq(ReportForm::getHide, NumberConstant.ONE));
@@ -1011,11 +1230,11 @@ public class HospProfitAndLossServiceImpl extends ServiceImpl<HospProfitAndLossM
             hospProfitVO.setParentId(0L);
             hospProfitVO.setReportName("全院其他收支");
             hospProfitVO.setSort(costProfitVos.size());
-            hospProfitVO.setReportType(3);
+            hospProfitVO.setReportType(integerReportType);
             hospProfitVO.setFraction(3);
             costProfitVos.add(hospProfitVO);
             for (int i = 0, hospAllListSize = hospAllList.size(); i < hospAllListSize; i++) {
-                costProfitVos.add(getHospProfitVO(hospAllList, i));
+                costProfitVos.add(getHospProfitVO(hospAllList, i,integerReportType));
             }
         }
 
@@ -1076,7 +1295,7 @@ public class HospProfitAndLossServiceImpl extends ServiceImpl<HospProfitAndLossM
 
     }
 
-    private static @NotNull HospProfitVO getHospProfitVO(List<HospProfitAndLoss> hospAllList, int i) {
+    private static @NotNull HospProfitVO getHospProfitVO(List<HospProfitAndLoss> hospAllList, int i,int reportType) {
         HospProfitAndLoss hospProfitAndLoss = hospAllList.get(i);
         HospProfitVO hospProfitVO1 = new HospProfitVO();
         hospProfitVO1.setId(Long.valueOf(hospProfitAndLoss.getReportNum()));
@@ -1084,18 +1303,19 @@ public class HospProfitAndLossServiceImpl extends ServiceImpl<HospProfitAndLossM
         hospProfitVO1.setParentId(-1L);
         hospProfitVO1.setReportName(hospProfitAndLoss.getReportName());
         hospProfitVO1.setSort(i);
-        hospProfitVO1.setReportType(3);
+        hospProfitVO1.setReportType(reportType);
         hospProfitVO1.setAmount(hospProfitAndLoss.getAmount());
         hospProfitVO1.setFraction(3);
         return hospProfitVO1;
     }
 
-    private List<HospProfitAndLoss> getAllDataByDate(int year, int month, Long hospId) {
+    private List<HospProfitAndLoss> getAllDataByDate(int year, int month, Long hospId,int reportType) {
         return this.list(
                 new LambdaQueryWrapper<HospProfitAndLoss>()
                         .eq(HospProfitAndLoss::getHospId, hospId)
                         .eq(HospProfitAndLoss::getDateMonth, month)
                         .eq(HospProfitAndLoss::getDateYear, year)
+                        .eq(HospProfitAndLoss::getReportType, reportType)
         );
     }
 
@@ -1105,207 +1325,8 @@ public class HospProfitAndLossServiceImpl extends ServiceImpl<HospProfitAndLossM
      * @param hospId
      */
     @Override
-    @Transactional(rollbackFor = Throwable.class, propagation = Propagation.REQUIRED)
     public void calcByResponsibility(String date, Long hospId) {
-        List<Responsibility> leafResp = responsibilityService.getLeafResp(hospId);
-        DateTime parse = DateUtil.parse(date);
-        int year = DateUtil.year(parse);
-        int month = DateUtil.month(parse) + 1;
-        this.remove(
-                new LambdaQueryWrapper<HospProfitAndLoss>()
-                        .eq(HospProfitAndLoss::getDateYear, year)
-                        .eq(HospProfitAndLoss::getDateMonth, month)
-                        .eq(HospProfitAndLoss::getHospId, hospId)
-        );
-        // 得到全院损益计算报表
-        List<ReportForm> reportForms = reportFormService.getListByReportType(hospId, ReportTypeEnum.HOSP_PROFIT_LOSS.getType());
-        if (CollUtil.isEmpty(reportForms)) {
-            throw new CostException("医院未设置全院损益计算报表");
-        }
-        // 得到这个月所有收入数据
-        List<IncomeCollection> incomes = collectionService.getCollectionsByDate(year, month, hospId);
-        if (incomes.isEmpty()) {
-            throw new CostException("医院未归集本月收入数据");
-        }
-        Map<Long, List<ReportRelation>> reportRelationMap = reportRelationService.list(new QueryWrapper<ReportRelation>().lambda().eq(ReportRelation::getHospId, hospId)).stream().collect(Collectors.groupingBy(ReportRelation::getReportId));
-
-        // 得到这个月的所有成本数据
-        List<AllocationQuery> allocationQueries = allocationQueryService.getAllByDate(hospId, year, month);
-        if (allocationQueries.isEmpty()) {
-            throw new CostException("医院未分摊本月数据");
-        }
-        List<AllocationQueryReportVO> allocationQueryReportVOList = BeanUtil.convertList(allocationQueries, AllocationQueryReportVO.class);
-        allocationQueryReportVOList.forEach(i -> {
-            i.setAccountingCodes(Arrays.asList(i.getAccountingCode().split(StrUtil.COMMA)));
-            i.setAccountingNames(Arrays.asList(i.getAccountingName().split(StrUtil.COMMA)));
-        });
-        // 查询分摊的报表数据 后面的计算方式需要使用 小计等需要使用
-        List<Allocation> allocationList = allocationService.list(new QueryWrapper<Allocation>().lambda().eq(Allocation::getHospId, hospId)
-                .eq(year > 0, Allocation::getDateYear, year).eq(month > 0, Allocation::getDateMonth, month));
-        if (CollUtil.isEmpty(allocationList)) {
-            throw new CostException(500, "分摊报表数据不存在");
-        }
-        // 查询最后一个层级的责任中心
-        List<CostShareLevel> costShareLevelList = shareLevelService.list(new QueryWrapper<CostShareLevel>().lambda()
-                .eq(CostShareLevel::getHospId, hospId).orderByDesc(CostShareLevel::getLeverSort));
-        if (CollUtil.isEmpty(costShareLevelList)) {
-            throw new CostException(500, "分摊层级未设置");
-        }
-        List<HospProfitAndLossVo> listVo = new ArrayList<>();
-//        List<ReportForm> parentForms = reportForms.stream().filter(i -> i.getParentId().equals(0L)).collect(Collectors.toList());
-        int finalYear = year;
-        int finalMonth = month;
-        leafResp.forEach(i -> {
-            reportForms.forEach(j -> {
-                HospProfitAndLossVo hospProfitAndLossVo = new HospProfitAndLossVo();
-                hospProfitAndLossVo.setDateYear(finalYear);
-                hospProfitAndLossVo.setDateMonth(finalMonth);
-                hospProfitAndLossVo.setReportNum(j.getNum());
-                hospProfitAndLossVo.setReportName(j.getReportName());
-                hospProfitAndLossVo.setResponsibilityCode(i.getResponsibilityCode());
-                hospProfitAndLossVo.setResponsibilityName(i.getResponsibilityName());
-                hospProfitAndLossVo.setCostType(NumberConstant.ZERO);
-                hospProfitAndLossVo.setIncomeType(NumberConstant.ZERO);
-                hospProfitAndLossVo.setHospId(hospId);
-                hospProfitAndLossVo.setType(j.getCostType());
-                hospProfitAndLossVo.setFraction(j.getFraction());
-                hospProfitAndLossVo.setReportId(j.getId());
-                hospProfitAndLossVo.setReportNum(j.getNum());
-                hospProfitAndLossVo.setCalcType(j.getCalcType());
-                hospProfitAndLossVo.setReportName(j.getReportName());
-                hospProfitAndLossVo.setCalcFormula(j.getCalcFormula());
-                hospProfitAndLossVo.setReportParentId(j.getParentId());
-                listVo.add(hospProfitAndLossVo);
-            });
-        });
-
-        Map<Long, List<HospProfitAndLossVo>> listMap = listVo.stream().collect(Collectors.groupingBy(HospProfitAndLossVo::getReportId));
-        List<HospProfitAndLossVo> allList = BeanUtil.convertList(listVo, HospProfitAndLossVo.class);
-        // 记录每一次计算的钱
-        //所有小计 总计单独处理
-        listVo.forEach(i -> {
-            Integer calcType = i.getCalcType();
-            if (NumberConstant.ONE.equals(calcType)) {
-                // TODO 按照会计科目进行计算
-                i.setAmount(setAccountReportData(i, incomes, allocationQueryReportVOList, reportRelationMap));
-            } else if (NumberConstant.TWO.equals(calcType)) {
-                // TODO 按照分摊层级进行计算
-                i.setAmount(setShareLevelReportData(i, reportRelationMap, allocationList));
-            } else if (NumberConstant.THREE.equals(calcType)) {
-                // TODO 按照小计进行计算
-                i.setAmount(setSubtotal(i, costShareLevelList, listMap, listVo, incomes, allocationQueryReportVOList, reportRelationMap, allocationList, allList));
-            } else if (NumberConstant.FOUR.equals(calcType)) {
-                // TODO 按照计算公式进行计算
-//                i.setAmount(setCalculation(i, listVo, costShareLevelList, listMap, incomes, allocationQueryReportVOList, reportRelationMap, allocationList, allList));
-            } else if (NumberConstant.FIVE.equals(calcType)) {
-                // TODO  按照责任中心进行计算
-                i.setAmount(setResponsibilityCode(i, reportRelationMap, allocationList, allList));
-            } else {
-                i.setAmount(new BigDecimal("0.000000"));
-            }
-        });
-        //计算占比
-        if (CollectionUtils.isEmpty(listVo)) {
-            return;
-        }
-
-        List<HospProfitAndLossVo> listSum = new ArrayList<>();
-
-        //把所有数据按报表项目汇总
-        for (ReportForm j : reportForms) {
-            HospProfitAndLossVo hospProfitAndLossVo = new HospProfitAndLossVo();
-            hospProfitAndLossVo.setDateYear(finalYear);
-            hospProfitAndLossVo.setDateMonth(finalMonth);
-            hospProfitAndLossVo.setReportNum(j.getNum());
-            hospProfitAndLossVo.setReportName(j.getReportName());
-            hospProfitAndLossVo.setCostType(NumberConstant.ZERO);
-            hospProfitAndLossVo.setIncomeType(NumberConstant.ZERO);
-            hospProfitAndLossVo.setHospId(hospId);
-            hospProfitAndLossVo.setType(j.getCostType());
-            hospProfitAndLossVo.setFraction(j.getFraction());
-            hospProfitAndLossVo.setReportId(j.getId());
-            hospProfitAndLossVo.setReportNum(j.getNum());
-            hospProfitAndLossVo.setCalcType(j.getCalcType());
-            hospProfitAndLossVo.setReportName(j.getReportName());
-            hospProfitAndLossVo.setCalcFormula(j.getCalcFormula());
-            hospProfitAndLossVo.setReportParentId(j.getParentId());
-            listSum.add(hospProfitAndLossVo);
-        }
-        Map<Integer, List<HospProfitAndLossVo>> reportNumGroup = listVo.stream().collect(Collectors.groupingBy(HospProfitAndLossVo::getReportNum));
-        Map<Integer, BigDecimal> reportNumSumMap = new HashMap<>();
-        reportNumGroup.forEach((reportNum, hospProfitAndLossList) -> {
-            AtomicReference<BigDecimal> sum = new AtomicReference<>(new BigDecimal("0.000000"));
-            for (HospProfitAndLossVo hospProfitAndLoss : hospProfitAndLossList) {
-                if (hospProfitAndLoss.getAmount() != null) {
-                    sum.updateAndGet(f -> f.add(hospProfitAndLoss.getAmount()));
-                }
-            }
-            reportNumSumMap.put(reportNum, sum.get());
-        });
-
-        for (HospProfitAndLossVo costProfitVo : listSum) {
-            BigDecimal bigDecimal = reportNumSumMap.get(costProfitVo.getReportNum());
-            if (bigDecimal != null) {
-                costProfitVo.setAmount(bigDecimal);
-
-            } else {
-                costProfitVo.setAmount(BigDecimal.ZERO.setScale(6, RoundingMode.HALF_UP));
-            }
-        }
-        //单独计算计算公式数据
-        setCalculationAmount(listSum);
-        //收入
-        List<HospProfitAndLossVo> profitIncomeList = listSum.stream().filter(f -> f.getType().equals(NumberConstant.ONE)).collect(Collectors.toList());
-        List<HospProfitAndLossVo> profitIncome = costPercent(profitIncomeList);
-        //成本
-        List<HospProfitAndLossVo> profitCostList = listSum.stream().filter(f -> f.getType().equals(NumberConstant.TWO)).collect(Collectors.toList());
-
-        List<HospProfitAndLossVo> profitCost = costPercent(profitCostList);
-
-        //不计算项目
-        List<HospProfitAndLossVo> noCompute = listSum.stream().filter(f -> f.getFraction().equals(NumberConstant.THREE)).collect(Collectors.toList());
-        noCompute.forEach(profitVO -> profitVO.setPercent(null));
-
-        List<HospProfitAndLossVo> listAllVo = new ArrayList<>();
-
-        if (!CollectionUtils.isEmpty(profitIncome) && !CollectionUtils.isEmpty(profitCost) && !CollectionUtils.isEmpty(noCompute)) {
-            listAllVo.addAll(profitIncome);
-            listAllVo.addAll(profitCost);
-            listAllVo.addAll(noCompute);
-        } else if (!CollectionUtils.isEmpty(profitIncome) && !CollectionUtils.isEmpty(noCompute)) {
-            listAllVo.addAll(noCompute);
-            listAllVo.addAll(profitIncome);
-
-        } else if (!CollectionUtils.isEmpty(profitCost) && !CollectionUtils.isEmpty(noCompute)) {
-            listAllVo.addAll(noCompute);
-            listAllVo.addAll(profitCost);
-        } else if (!CollectionUtils.isEmpty(noCompute)) {
-            listAllVo.addAll(noCompute);
-        }
-
-        List<HospProfitAndLoss> list = BeanUtil.convertList(listAllVo, HospProfitAndLoss.class);
-        // 处理医院其他收支
-        List<CostOtherPaymentsData> otherPaymentsDatas = otherPaymentsDataService.getByMonth(year, month, hospId);
-        if (!otherPaymentsDatas.isEmpty()) {
-            otherPaymentsDatas.forEach(ele -> {
-                HospProfitAndLoss loss = new HospProfitAndLoss();
-                loss.setDateYear(year).setDateMonth(month).setReportName(ele.getPaymentsName()).setReportNum((int) (-ele.getId()))
-                        .setCreateTime(System.currentTimeMillis()).setAmount(ele.getTotalAmount()).setHospId(hospId)
-                        .setResponsibilityName("全院").setResponsibilityCode("-1").setPercent(null);
-                list.add(loss);
-            });
-        }
-        long l = System.currentTimeMillis();
-        list.forEach(i -> {
-            i.setCreateTime(l);
-        });
-        this.saveBatch(list);
-
-        Map<String,String> sqlParameter = new HashMap<>();
-
-        sqlParameter.put(SQLParameter.COMPUTE_DATE_CODE,DateUtils.StringToString(date, DateStyleEnum.YYYY_MM));
-        sqlParameter.put(SQLParameter.REPORT_TYPE_CODE,NumberConstant.THREE_S);
-        sqlService.autoExecuteSql(CustomSqlTypeEnum.HOSP_PROFIT_CALC.getCode(),sqlParameter);
+        calcHospProfit(date,hospId,ReportTypeEnum.HOSP_PROFIT_LOSS.getType());
     }
 
     private void setCalculationAmount(List<HospProfitAndLossVo> listVo) {

+ 402 - 139
src/main/java/com/kcim/service/impl/ProjectCostServiceImpl.java

@@ -15,6 +15,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.ResponsibilityDepartmentService;
 import com.kcim.service.SqlService;
 import com.kcim.vo.*;
 import com.kcim.web.reponse.ProjectCostResponse;
@@ -101,7 +102,9 @@ public class ProjectCostServiceImpl implements ProjectCostService {
 
     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) {
+    ResponsibilityDepartmentService responsibilityDepartmentService;
+
+    public ProjectCostServiceImpl(ResponsibilityDepartmentService responsibilityDepartmentService,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;
@@ -127,6 +130,7 @@ public class ProjectCostServiceImpl implements ProjectCostService {
         this.computeStandPatientProjectCostRepository = computeStandPatientProjectCostRepository;
         this.computeStandPatientProjectCostDetailRepository = computeStandPatientProjectCostDetailRepository;
         this.computeStandPatientProjectGroupCostDetailRepository = computeStandPatientProjectGroupCostDetailRepository;
+        this.responsibilityDepartmentService=responsibilityDepartmentService;
     }
 
     /**
@@ -247,14 +251,26 @@ public class ProjectCostServiceImpl implements ProjectCostService {
         return dataVoList.stream().collect(Collectors.toMap(DictDataVo::getCode, DictDataVo::getName, (a, b) -> b));
     }
 
+    /**
+     * 项目成本分摊计算
+     * @param computeDate
+     */
+    @Override
+    public void computeItemCost(String computeDate){
+        //项目成本分摊计算
+        calcItemCostAllocation(computeDate);
+        log.info("项目成本分摊计算完成开始执行后续处理脚本");
+        //执行后续处理脚本
+        execItemCostSQL(computeDate);
+    }
+
     /**
      * 计算项目成本     *
      *
      * @param computeDate 核算年月
      */
-    @Override
     @Transactional(rollbackFor = Throwable.class, propagation = Propagation.REQUIRED)
-    public void computeItemCost(String computeDate) {
+    public void computeItemCostACtion(String computeDate) {
         SessionUserVO currentUser = UserContext.getCurrentUser();
 
         //获取收费项目数据(项目)
@@ -411,72 +427,368 @@ public class ProjectCostServiceImpl implements ProjectCostService {
 
             }
         }
+    }
 
-//        long count = (itemSize + LIMIT - 1) / LIMIT;        //计算所有项目明细数据
-//        for (int j = 1; j <= count; j++) {
-//            List<PatientItemDepartmentGroupVo> items = importPatientItemRepository.getByDepartGroupComputeDateItem(j,LIMIT,computeDate, currentUser);
-//            List<ComputeProjectCost> saveCost = new ArrayList<>();
-//            List<ComputeProjectCostDetail> saveDetails = new ArrayList<>();
-//            List<ComputeProjectGroupCostDetail> saveGroupDetails = new ArrayList<>();
-//            if (!CollectionUtils.isEmpty(items)) {
-//                for (int i = 0; i < items.size(); i++) {
-//                    PatientItemDepartmentGroupVo item = items.get(i);
-//                    ComputeProjectCost itemCost = BeanUtil.convertObj(computeProjectCost, ComputeProjectCost.class);
-//                    itemCost.setCode(item.getItemCode());
-//                    itemCost.setName(item.getItemName());
-//                    Map<String, Item> departmentMap = itemMap.get(item.getExecuteDepartmentCode());
-//                    if (CollectionUtils.isEmpty(departmentMap)) {
-//                        continue;
-//                    }
-//                    Item itemData = departmentMap.get(item.getItemCode());
-//                    if (Objects.isNull(itemData)) {
-//                        continue;
-//                    }
-//                    itemCost.setItemType(itemData.getItemType());
-//                    itemCost.setResponsibilityCode(responsibilityCodeMap.get(item.getExecuteDepartmentCode()));
-//                    itemCost.setResponsibilityName(result.responsibilityNameMap.get(item.getExecuteDepartmentCode()));
-//
-//                    itemCost.setIndex(i);
-//                    saveCost.add(itemCost);
-//                    costDetail.setIndex(i);
-//                    groupCostDetail.setIndex(i);
-//                    List<ComputeProjectCostDetail> computeProjectCostDetails = setDetails(item, costDetail, itemCost, shareParamCostGroup, sharePercent, shareSum, responsibilitySum);
-//                    saveDetails.addAll(computeProjectCostDetails);
-//                    saveGroupDetails.addAll(setGroupDetails(groupCostDetail, computeProjectCostDetails));
-//                }
-//                if (!CollectionUtils.isEmpty(saveCost)) {
-//                    //保存主表数据 并获取主键
-//                    repository.saveBatch(saveCost, 500);
-//                    Map<Integer, Integer> indexId = saveCost.stream().collect(Collectors.toMap(ComputeProjectCost::getIndex, ComputeProjectCost::getId, (a, b) -> b));
-//                    //保存细项项目成本数据 添加主键关联
-//                    if (!CollectionUtils.isEmpty(saveDetails)) {
-//                        Map<Integer, List<ComputeProjectCostDetail>> collectIndex = saveDetails.stream().collect(Collectors.groupingBy(ComputeProjectCostDetail::getIndex));
-//                        List<ComputeProjectCostDetail> saveCostDetails = new ArrayList<>();
-//                        collectIndex.keySet().forEach(integer -> {
-//                            Integer costId = indexId.get(integer);
-//                            List<ComputeProjectCostDetail> details = collectIndex.get(integer);
-//                            details.forEach(detail -> detail.setProjectCostId(costId));
-//                            saveCostDetails.addAll(details);
-//                        });
-//
-//                        detailRepository.saveBatch(saveCostDetails, 500);
-//                    }
-//                    //处理合并项目成本数据 添加主键关联
-//                    if (!CollectionUtils.isEmpty(saveGroupDetails)) {
-//                        Map<Integer, List<ComputeProjectGroupCostDetail>> collectGroupIndex = saveGroupDetails.stream().collect(Collectors.groupingBy(ComputeProjectGroupCostDetail::getIndex));
-//                        List<ComputeProjectGroupCostDetail> saveGroupCostDetails = new ArrayList<>();
-//                        collectGroupIndex.keySet().forEach(integer -> {
-//                            Integer costId = indexId.get(integer);
-//                            List<ComputeProjectGroupCostDetail> details = collectGroupIndex.get(integer);
-//                            details.forEach(detail -> detail.setProjectCostId(costId));
-//                            saveGroupCostDetails.addAll(details);
-//                        });
-//                        saveGroupCostDetails.forEach(f -> f.setId(null));
-//                        groupDetailRepository.saveBatch(saveGroupCostDetails, 500);
-//                    }
-//                }
-//            }
-//        }
+    /**
+     * 项目成本分摊计算
+     * @param computeDate
+     */
+    @Transactional(rollbackFor = Throwable.class, propagation = Propagation.REQUIRED)
+    public void calcItemCostAllocation(String computeDate) {
+        SessionUserVO currentUser = UserContext.getCurrentUser();
+        //获取收费项目数据(项目)
+        checkImportItem(computeDate, currentUser);
+        //判断是否进行过分摊参数计算
+        long shareCount = computeShareParamRepository.getComputeShareParamCount(computeDate);
+        if (shareCount == 0) {
+            throw new CostException("未进行项目分摊参数计算,请先进行项目分摊参数计算,当前计算中止");
+        }
+        //医疗服务项目字典
+        List<Item> itemList = itemRepository.getList();
+        if (CollectionUtils.isEmpty(itemList)) {
+            throw new CostException("医疗服务项目未维护,请先添加医疗服务项目再进行计算,当前计算中止");
+        }
+        //月度患者收费项目信息
+        List<PatientItemDepartmentGroupVo> ptChargeItems = importPatientItemRepository.getByDepartGroupComputeDateItem(computeDate, currentUser);
+        if (CollectionUtils.isEmpty(ptChargeItems)){
+            throw new CostException("没有可计算的收费项目");
+        }
+
+        //项目成本分摊配置
+        List<ShareParamCostVo> shareParamCostVos = shareParamCostRepository.getParamCost();
+        if (CollectionUtils.isEmpty(shareParamCostVos)){
+            throw new CostException("没有项目分摊配置信息无法分摊,请联系管理员");
+        }
+
+        //作废上次计算记录
+        repository.removeByComputeDate(computeDate, currentUser);
+        detailRepository.removeByComputeDate(computeDate, currentUser);
+        groupDetailRepository.removeByComputeDate(computeDate, currentUser);
+
+        //项目成本分摊配置主表信息(项目成本列配置)
+        List<ShareParamCost> ShareParamCosts = shareParamCostRepository.getList(null);
+        //科室责任中心对照信息
+        List<ResponsibilityDepartIdVO> responsibilityDeptMaps = responsibilityDepartmentService.getResponsibilityDepart();
+        //分摊参数信息
+        List<ComputeShareParamDetailVo> computeShareParamDetails = computeShareParamRepository.getComputeShareParamDetail(computeDate);
+        //分摊参数按责任中心汇总信息
+        List<ComputeShareParamDetailVo> computeShareParamDetailGroup = computeShareParamRepository.getComputeShareParamDetailGroup(computeDate);
+        //要计算的科室收费项目
+        List<ComputeShareParamDetailVo> computeResponsibilityItems = computeShareParamRepository.getComputeResponsibilityItem(computeDate);
+        //获取科室损益报表数据
+        List<CostDepartmentProfit> costDepartmentProfits = costDepartmentProfitRepository.getDepartmentProfit(computeDate);
+
+        //开始项目成本分摊计算
+        List<ComputeProjectCost> computeProjectCosts=new ArrayList<>();
+        List<ComputeProjectCostDetail> computeProjectCostDetails=new ArrayList<>();
+        List<ComputeProjectGroupCostDetail> computeProjectGroupCostDetails=new ArrayList<>();
+        //获取项目收入对应的分摊参数配置
+        ShareParamTypeMap incomeShareParam = getIncomeShareParamTypeMap();
+        //按项目类别+责任中心代码+项目代码逐个计算项目分摊金额
+        computeResponsibilityItems.stream().forEach(responsibilityItem->{
+            //创建项目成本主表对象
+            ComputeProjectCost projectCost = createComputeProjectCost(computeDate, currentUser, responsibilityItem);
+            computeProjectCosts.add(projectCost);
+            //获取项目对应分摊参数数值
+            List<ComputeShareParamDetailVo> itemShareParams = computeShareParamDetails.stream().filter(shareParamGroup -> shareParamGroup.getResponsibilityCode().equals(projectCost.getResponsibilityCode())
+                    && shareParamGroup.getCode().equals(projectCost.getCode()) && shareParamGroup.getItemType().equals(projectCost.getItemType())).collect(Collectors.toList());
+            if (CollectionUtils.isEmpty(itemShareParams)){
+                throw new CostException(String.format("找不到项目的[%s-%s]对应的分摊分摊参数,请重新计算分摊参数",projectCost.getItemType(),projectCost.getName()));
+            }
+            //取项目对应的分摊配置
+            List<ShareParamCost> itemShareParamCost = ShareParamCosts.stream().filter(shareParamCost -> shareParamCost.getItemType().equals(projectCost.getItemType())).collect(Collectors.toList());
+            if (CollectionUtils.isEmpty(itemShareParamCost)){
+                throw new CostException(String.format("类型[%s]没有对应分摊配置,请联系管理员",projectCost.getItemType()));
+            }
+            List<ComputeProjectCostDetail> computeProjectCostDetailChilds=new ArrayList<>();
+            //按项目分摊配置计算项目的所有项目成本列的分摊金额
+            itemShareParamCost.stream().forEach(shareParamCost->{
+                ComputeProjectCostDetail cmputeProjectCostDetail=createComputeProjectCostDetail(computeDate, currentUser,incomeShareParam,responsibilityItem,projectCost,
+                        shareParamCost,shareParamCostVos,itemShareParams,computeShareParamDetailGroup,costDepartmentProfits);
+                computeProjectCostDetailChilds.add(cmputeProjectCostDetail);
+            });
+            computeProjectCostDetails.addAll(computeProjectCostDetailChilds);
+
+            //按项目成本列类型分组
+            Map<String, List<ComputeProjectCostDetail>> columnTypeGroup = computeProjectCostDetailChilds.stream()
+                    .collect(Collectors.groupingBy(ComputeProjectCostDetail::getCostColumnType));
+            columnTypeGroup.forEach((columnType, computeResult) -> {
+                //创建项目成本汇总表对象
+                ComputeProjectGroupCostDetail computeProjectGroupCostDetail = createComputeProjectGroupCostDetail(computeDate, currentUser, responsibilityItem, projectCost, columnType, computeResult);
+                computeProjectGroupCostDetails.add(computeProjectGroupCostDetail);
+            });
+            //创建项目成本列的汇总表对象
+            ComputeProjectGroupCostDetail itemCostGroupDetail = createComputeProjectGroupCostDetail(computeDate, currentUser, responsibilityItem, projectCost, ITEM_COST.getCode(), computeProjectCostDetailChilds);
+            computeProjectGroupCostDetails.add(itemCostGroupDetail);
+        });
+
+        //没有任何可保存的数据
+        if (CollectionUtils.isEmpty(computeProjectCosts)) {
+            throw new CostException("没有任何可保存的数据");
+        }
+        //保存项目分摊主表对象数据
+        repository.saveBatch(computeProjectCosts, 500);
+        if (!CollectionUtils.isEmpty(computeProjectCostDetails)) {
+            //保存项目分摊明细表对象数据
+            computeProjectCostDetails.stream().forEach(projectCostDetail->projectCostDetail.setProjectCostId(projectCostDetail.getComputeProjectCost().getId()));
+            detailRepository.saveBatch(computeProjectCostDetails, 500);
+        }
+        if (!CollectionUtils.isEmpty(computeProjectGroupCostDetails)) {
+            //保存项目分摊汇总表对象数据
+            computeProjectGroupCostDetails.stream().forEach(projectCostDetail->projectCostDetail.setProjectCostId(projectCostDetail.getComputeProjectCost().getId()));
+            groupDetailRepository.saveBatch(computeProjectGroupCostDetails, 500);
+        }
+
+
+
+    }
+
+    /**
+     * 获取项目收入对应的分摊参数配置
+     * @return
+     */
+    public ShareParamTypeMap getIncomeShareParamTypeMap(){
+        //分摊参数设置信息
+        List<ShareParamTypeMap> shareParamTypeMaps = shareParamTypeMapRepository.getList();
+        if(CollectionUtils.isEmpty(shareParamTypeMaps)){
+            throw new CostException("没有分摊参数配置信息无法进行项目分摊计算");
+        }
+        Optional<ShareParamTypeMap> firstShareParamTypeMap = shareParamTypeMaps.stream().filter(shareParam -> shareParam.getSourceCode().equals(ITEM_INCOME.getCode())).findFirst();
+        if(!firstShareParamTypeMap.isPresent()){
+            throw new CostException("没有配置项目收入的分摊参数无法进行项目分摊计算");
+        }
+        return  firstShareParamTypeMap.get();
+    }
+
+    /**
+     * 创建项目成本主表对象
+     * @param computeDate
+     * @param currentUser
+     * @param responsibilityItem
+     * @return
+     */
+    public ComputeProjectCost createComputeProjectCost(String computeDate,SessionUserVO currentUser,ComputeShareParamDetailVo responsibilityItem){
+        //主表公共对象
+        ComputeProjectCost computeProjectCost = new ComputeProjectCost();
+        computeProjectCost.setComputeDate(computeDate);
+        computeProjectCost.setHospId(currentUser.getHospId());
+        computeProjectCost.setCreateUser(String.valueOf(currentUser.getId()));
+        computeProjectCost.setCreateTime(new Date());
+        computeProjectCost.setCode(responsibilityItem.getCode());
+        computeProjectCost.setName(responsibilityItem.getName());
+        computeProjectCost.setItemType(responsibilityItem.getItemType());
+        computeProjectCost.setResponsibilityCode(responsibilityItem.getResponsibilityCode());
+        computeProjectCost.setResponsibilityName(responsibilityItem.getResponsibilityName());
+        return computeProjectCost;
+    }
+
+    /**
+     * 创建项目成本明细表对象
+     * @param computeDate 核算年月
+     * @param currentUser 登录人信息
+     * @param responsibilityItem 责任中心的项目汇总数据
+     * @param computeProjectCost 主表对象
+     * @param shareParamCost 分摊配置主表
+     * @param shareParamCostVos 分摊配置明细
+     * @param computeShareParamDetails 分摊参数计算明细
+     * @param computeShareParamDetailGroup 分摊参数计算明细汇总
+     * @param costDepartmentProfits 科室损益数据
+     * @return
+     */
+    public ComputeProjectCostDetail createComputeProjectCostDetail(String computeDate,SessionUserVO currentUser,ShareParamTypeMap incomeShareParam,ComputeShareParamDetailVo responsibilityItem,ComputeProjectCost computeProjectCost,ShareParamCost shareParamCost,
+                                                                   List<ShareParamCostVo> shareParamCostVos,List<ComputeShareParamDetailVo> computeShareParamDetails ,
+                                                                   List<ComputeShareParamDetailVo> computeShareParamDetailGroup,List<CostDepartmentProfit> costDepartmentProfits){
+        //明细表公共对象
+        ComputeProjectCostDetail costDetail = new ComputeProjectCostDetail();
+        costDetail.setComputeDate(computeDate);
+        costDetail.setHospId(currentUser.getHospId());
+        costDetail.setCreateUser(String.valueOf(currentUser.getId()));
+        costDetail.setCreateTime(new Date());
+        costDetail.setComputeProjectCost(computeProjectCost);
+        costDetail.setCostColumnCode(shareParamCost.getColumnCode());
+        costDetail.setCostColumnType(shareParamCost.getColumnType());
+        //获取对应分摊配置明细
+        List<ShareParamCostVo> shareParamDetails = shareParamCostVos.stream().filter(shareParamDetail -> shareParamDetail.getColumnCode().equals(shareParamCost.getColumnCode())).collect(Collectors.toList());
+        if (CollectionUtils.isEmpty(shareParamDetails)){
+            throw new CostException(String.format("[%s]没有对应分摊配置,请联系管理员",shareParamCost.getColumnName()));
+        }
+        //根据主表配置找到对应的科室损益数据
+        Optional<CostDepartmentProfit> firstDepartmentProfit = costDepartmentProfits.stream().filter(departmentProfit -> String.valueOf(departmentProfit.getShareType()).equals(shareParamCost.getReportType()) &&
+                String.valueOf(departmentProfit.getReportNum()).equals(shareParamCost.getProfitNum()) &&
+                departmentProfit.getResponsibilityCode().equals(computeProjectCost.getResponsibilityCode())).findFirst();
+        //没有对应的损益项目数据或者损益项目金额为0
+        if(!firstDepartmentProfit.isPresent()||firstDepartmentProfit.get().getAmount().equals(BigDecimal.ZERO)){
+            costDetail.setComputeResult(BigDecimal.ZERO);
+            costDetail.setComputeSingleResult(BigDecimal.ZERO);
+            costDetail.setStandComputeResult(BigDecimal.ZERO);
+            costDetail.setStandComputeSingleResult(BigDecimal.ZERO);
+            return costDetail;
+        }
+        //按项目分摊配置计算项目的一个项目成本列的分摊金额
+        BigDecimal itemAllocationAmount=calcItemAllocationAmount(incomeShareParam,computeProjectCost,firstDepartmentProfit.get(),
+                shareParamDetails,computeShareParamDetailGroup,computeShareParamDetails);
+        costDetail.setComputeResult(itemAllocationAmount);
+
+        //按项目分摊配置计算项目的一个项目成本列的标准法分摊金额
+        BigDecimal itemStandAllocationAmount=calcItemStandAllocationAmount(incomeShareParam,computeProjectCost,firstDepartmentProfit.get(),
+                shareParamDetails,computeShareParamDetailGroup,computeShareParamDetails);
+        costDetail.setStandComputeResult(itemStandAllocationAmount);
+
+        //项目没有数量时,单个项目的分摊金额为0
+        if(responsibilityItem.getNum().compareTo(BigDecimal.ZERO)==NumberConstant.ZERO){
+            costDetail.setComputeSingleResult(BigDecimal.ZERO.setScale(NumberConstant.FOUR,RoundingMode.HALF_UP));
+            costDetail.setStandComputeSingleResult(BigDecimal.ZERO.setScale(NumberConstant.FOUR,RoundingMode.HALF_UP));
+        }else{
+            //有数量数,单个项目的分摊金额=总分摊金额/数量
+            costDetail.setComputeSingleResult(itemAllocationAmount.divide(responsibilityItem.getNum(),NumberConstant.FOUR,RoundingMode.HALF_UP));
+            costDetail.setStandComputeSingleResult(itemStandAllocationAmount.divide(responsibilityItem.getNum(),NumberConstant.FOUR,RoundingMode.HALF_UP));
+        }
+        return costDetail;
+    }
+
+    /**
+     * 计算项目的分摊金额
+     * @param computeProjectCost 主表对象
+     * @param costDepartmentProfit 科室损益数据
+     * @param shareParamCostVos 分摊配置明细
+     * @param computeShareParamDetailGroup 分摊参数计算明细汇总
+     * @param computeShareParamDetails 分摊参数计算明细
+     * @return
+     */
+    public  BigDecimal calcItemAllocationAmount(ShareParamTypeMap incomeShareParam,ComputeProjectCost computeProjectCost,CostDepartmentProfit costDepartmentProfit,List<ShareParamCostVo> shareParamCostVos,
+                                                List<ComputeShareParamDetailVo> computeShareParamDetailGroup,List<ComputeShareParamDetailVo> computeShareParamDetails){
+        BigDecimal itemAllocationAmount=BigDecimal.ZERO;
+        //按配置计算每个参数分摊金额
+        for (ShareParamCostVo shareParamCostVo : shareParamCostVos) {//获取参数对应的责任中心汇总数据
+            Optional<ComputeShareParamDetailVo> firstShareParamGroup = computeShareParamDetailGroup.stream().filter(shareParamGroup -> shareParamGroup.getItemType().equals(computeProjectCost.getItemType()) &&
+                    shareParamGroup.getResponsibilityCode().equals(computeProjectCost.getResponsibilityCode()) && shareParamGroup.getShareParamCode().equals(shareParamCostVo.getShareParamCode())).findFirst();
+            //责任中心的汇总数据为0时,按项目收入分摊
+            if (!firstShareParamGroup.isPresent() || firstShareParamGroup.get().getComputeResult().compareTo(BigDecimal.ZERO) == NumberConstant.ZERO) {
+                //获取项目对应的收入数据
+                Optional<ComputeShareParamDetailVo> firstComputeShareParamDetail = computeShareParamDetails.stream().filter(computeShareParamDetailVo ->
+                        computeShareParamDetailVo.getShareParamCode().equals(incomeShareParam.getShareParamCode())).findFirst();
+                if (!firstComputeShareParamDetail.isPresent()) {
+                    throw new CostException(String.format("[%s-%s]没有收入数据无法分摊,请检查对应的收费项目数据及分摊参数计算结果数据", computeProjectCost.getResponsibilityName(), computeProjectCost.getName()));
+                }
+                //找到项目收入的责任中心汇总数据
+                ComputeShareParamDetailVo incomeShareParamGroup = computeShareParamDetailGroup.stream().filter(shareParamGroup -> shareParamGroup.getItemType().equals(computeProjectCost.getItemType()) &&
+                        shareParamGroup.getResponsibilityCode().equals(computeProjectCost.getResponsibilityCode()) && shareParamGroup.getShareParamCode().equals(incomeShareParam.getShareParamCode())).findFirst().get();
+                //分摊金额=损益项目金额*分摊参数占比*收入/责任中心总收入
+                BigDecimal paramAllocationAmount = costDepartmentProfit.getAmount().multiply(shareParamCostVo.getPercent()).multiply(firstComputeShareParamDetail.get().getComputeResult())
+                        .divide(incomeShareParamGroup.getComputeResult(), NumberConstant.FOUR, RoundingMode.HALF_UP);
+                itemAllocationAmount = itemAllocationAmount.add(paramAllocationAmount);
+            } else {
+                //获取项目对应的分摊参数数据
+                Optional<ComputeShareParamDetailVo> firstComputeShareParamDetail = computeShareParamDetails.stream().filter(computeShareParamDetailVo ->
+                        computeShareParamDetailVo.getShareParamCode().equals(shareParamCostVo.getShareParamCode())).findFirst();
+                if (!firstComputeShareParamDetail.isPresent()) {
+                    throw new CostException(String.format("[%s-%s]没有收入数据无法分摊,请检查对应的收费项目数据", computeProjectCost.getResponsibilityName(), computeProjectCost.getName()));
+                }
+                //分摊金额=损益项目金额*分摊参数占比*分摊参数数值/责任中心总分摊参数数值
+                BigDecimal paramAllocationAmount = costDepartmentProfit.getAmount().multiply(shareParamCostVo.getPercent()).multiply(firstComputeShareParamDetail.get().getComputeResult())
+                        .divide(firstShareParamGroup.get().getComputeResult(), NumberConstant.FOUR, RoundingMode.HALF_UP);
+                itemAllocationAmount = itemAllocationAmount.add(paramAllocationAmount);
+            }
+        }
+        return  itemAllocationAmount;
+    }
+
+    /**
+     * 计算项目标准法的分摊金额
+     * @param computeProjectCost 主表对象
+     * @param costDepartmentProfit 科室损益数据
+     * @param shareParamCostVos 分摊配置明细
+     * @param computeShareParamDetailGroup 分摊参数计算明细汇总(按责任中心汇总)
+     * @param computeShareParamDetails 分摊参数计算明细
+     * @return
+     */
+    public  BigDecimal calcItemStandAllocationAmount(ShareParamTypeMap incomeShareParam,ComputeProjectCost computeProjectCost,CostDepartmentProfit costDepartmentProfit,List<ShareParamCostVo> shareParamCostVos,
+                                                List<ComputeShareParamDetailVo> computeShareParamDetailGroup,List<ComputeShareParamDetailVo> computeShareParamDetails){
+        BigDecimal itemAllocationAmount=BigDecimal.ZERO;
+        //按配置计算每个参数分摊金额
+        for (ShareParamCostVo shareParamCostVo : shareParamCostVos) {
+            //获取参数对应的责任中心汇总数据
+            Optional<ComputeShareParamDetailVo> firstShareParamGroup = computeShareParamDetailGroup.stream().filter(shareParamGroup -> shareParamGroup.getItemType().equals(computeProjectCost.getItemType()) &&
+                    shareParamGroup.getResponsibilityCode().equals(computeProjectCost.getResponsibilityCode()) && shareParamGroup.getShareParamCode().equals(shareParamCostVo.getShareParamCode())).findFirst();
+            //责任中心的汇总数据为0时,按项目收入分摊
+            if (!firstShareParamGroup.isPresent() || firstShareParamGroup.get().getStandComputeResult().compareTo(BigDecimal.ZERO) == NumberConstant.ZERO) {
+                //获取项目对应的收入数据
+                Optional<ComputeShareParamDetailVo> firstComputeShareParamDetail = computeShareParamDetails.stream().filter(computeShareParamDetailVo ->
+                        computeShareParamDetailVo.getShareParamCode().equals(incomeShareParam.getShareParamCode())).findFirst();
+                if (!firstComputeShareParamDetail.isPresent()) {
+                    throw new CostException(String.format("[%s-%s]没有收入数据无法分摊,请检查对应的收费项目数据及分摊参数计算结果数据", computeProjectCost.getResponsibilityName(), computeProjectCost.getName()));
+                }
+                //找到项目收入的责任中心汇总数据
+                ComputeShareParamDetailVo incomeShareParamGroup = computeShareParamDetailGroup.stream().filter(shareParamGroup -> shareParamGroup.getItemType().equals(computeProjectCost.getItemType()) &&
+                        shareParamGroup.getResponsibilityCode().equals(computeProjectCost.getResponsibilityCode()) && shareParamGroup.getShareParamCode().equals(incomeShareParam.getShareParamCode())).findFirst().get();
+                //分摊金额=损益项目金额*分摊参数占比*收入/责任中心总收入
+                BigDecimal paramAllocationAmount = costDepartmentProfit.getAmount().multiply(shareParamCostVo.getPercent()).multiply(firstComputeShareParamDetail.get().getStandComputeResult())
+                        .divide(incomeShareParamGroup.getStandComputeResult(), NumberConstant.FOUR, RoundingMode.HALF_UP);
+                itemAllocationAmount = itemAllocationAmount.add(paramAllocationAmount);
+            } else {
+                //获取项目对应的分摊参数数据
+                Optional<ComputeShareParamDetailVo> firstComputeShareParamDetail = computeShareParamDetails.stream().filter(computeShareParamDetailVo ->
+                        computeShareParamDetailVo.getShareParamCode().equals(shareParamCostVo.getShareParamCode())).findFirst();
+                if (!firstComputeShareParamDetail.isPresent()) {
+                    throw new CostException(String.format("[%s-%s]没有收入数据无法分摊,请检查对应的收费项目数据", computeProjectCost.getResponsibilityName(), computeProjectCost.getName()));
+                }
+                //分摊金额=损益项目金额*分摊参数占比*分摊参数数值/责任中心总分摊参数数值
+                BigDecimal paramAllocationAmount = costDepartmentProfit.getAmount().multiply(shareParamCostVo.getPercent()).multiply(firstComputeShareParamDetail.get().getStandComputeResult())
+                        .divide(firstShareParamGroup.get().getStandComputeResult(), NumberConstant.FOUR, RoundingMode.HALF_UP);
+                itemAllocationAmount = itemAllocationAmount.add(paramAllocationAmount);
+            }
+        }
+        return  itemAllocationAmount;
+    }
+
+
+    /**
+     * 创建项目成本汇总表对象
+     * @param computeDate
+     * @param currentUser
+     * @param responsibilityItem
+     * @param computeProjectCost
+     * @param columnType
+     * @param computeProjectCostDetails
+     * @return
+     */
+    public ComputeProjectGroupCostDetail createComputeProjectGroupCostDetail(String computeDate,SessionUserVO currentUser,
+                                                                             ComputeShareParamDetailVo responsibilityItem,ComputeProjectCost computeProjectCost,
+                                                                             String columnType,List<ComputeProjectCostDetail> computeProjectCostDetails){
+        //汇总明细表对象
+        ComputeProjectGroupCostDetail groupCostDetail = new ComputeProjectGroupCostDetail();
+        groupCostDetail.setComputeDate(computeDate);
+        groupCostDetail.setHospId(currentUser.getHospId());
+        groupCostDetail.setCreateUser(String.valueOf(currentUser.getId()));
+        groupCostDetail.setCreateTime(new Date());
+        groupCostDetail.setComputeProjectCost(computeProjectCost);
+        groupCostDetail.setType(columnType);
+        //计算按列类型汇总的分摊金额
+        BigDecimal computeResultGroup = computeProjectCostDetails.stream().collect(Collectors.mapping(ComputeProjectCostDetail::getComputeResult, Collectors.reducing(BigDecimal.ZERO, BigDecimal::add)));
+        //计算按列类型汇总的标准法分摊金额
+        BigDecimal standComputeResultGroup = computeProjectCostDetails.stream().collect(Collectors.mapping(ComputeProjectCostDetail::getStandComputeResult, Collectors.reducing(BigDecimal.ZERO, BigDecimal::add)));
+        groupCostDetail.setComputeResult(computeResultGroup);
+        groupCostDetail.setStandComputeResult(standComputeResultGroup);
+        //项目没有数量时,单个项目的分摊金额为0
+        if(responsibilityItem.getNum().compareTo(BigDecimal.ZERO)==NumberConstant.ZERO){
+            groupCostDetail.setComputeSingleResult(BigDecimal.ZERO);
+            groupCostDetail.setStandComputeSingleResult(BigDecimal.ZERO);
+        }else{
+            //有数量时,单个项目的金额=总金额/数量
+            groupCostDetail.setComputeSingleResult(computeResultGroup.divide(responsibilityItem.getNum(),NumberConstant.FOUR,RoundingMode.HALF_UP));
+            groupCostDetail.setStandComputeSingleResult(standComputeResultGroup.divide(responsibilityItem.getNum(),NumberConstant.FOUR,RoundingMode.HALF_UP));
+        }
+        return groupCostDetail;
+    }
+
+    /**
+     * 执行项目成本计算后续处理SQL
+     * @param computeDate
+     */
+    public void execItemCostSQL(String computeDate){
+        Map<String,String> sqlParameter = new HashMap<>();
+        sqlParameter.put(SQLParameter.COMPUTE_DATE_CODE,computeDate);
+        sqlService.autoExecuteSql(CustomSqlTypeEnum.FULL_PROJECT_COST_CALC.getCode(),sqlParameter);
     }
 
     private @NotNull Map<String, Map<String, PatientItemDepartmentGroupVo>> getPatientItemGroup(String computeDate, SessionUserVO currentUser, Map<String, String> responsibilityCodeMap) {
@@ -923,14 +1235,25 @@ public class ProjectCostServiceImpl implements ProjectCostService {
         return response;
     }
 
+    /**
+     * 标准项目成本分摊计算
+     * @param computeDate
+     */
+    @Override
+    public void computeStandItemCost(String computeDate){
+        //标准项目成本分摊计算
+        computeStandItemCostAction(computeDate);
+        //执行标准法项目成本分摊计算后续处理脚本
+        execStandItemCostSQL(computeDate);
+    }
+
     /**
      * 标准项目成本计算
      *
      * @param computeDate 核算年月
      */
-    @Override
     @Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRED)
-    public void computeStandItemCost(String computeDate) {
+    public void computeStandItemCostAction(String computeDate) {
         SessionUserVO currentUser = UserContext.getCurrentUser();
         //获取收费项目数据(项目)
         checkImportItem(computeDate, currentUser);
@@ -1082,76 +1405,16 @@ public class ProjectCostServiceImpl implements ProjectCostService {
                 }
             }
         }
+    }
 
-
-//        //计算所有项目明细数据
-//        for (int j = 1; j <= count; j++) {
-//            List<PatientItemDepartmentGroupVo> items = importPatientItemRepository.getByDepartGroupComputeDateItem(j, LIMIT, computeDate, currentUser);
-//            List<ComputeStandProjectCost> saveCost = new ArrayList<>();
-//            List<ComputeStandProjectCostDetail> saveDetails = new ArrayList<>();
-//            List<ComputeStandProjectGroupCostDetail> saveGroupDetails = new ArrayList<>();
-//            if (!CollectionUtils.isEmpty(items)) {
-//                for (int i = 0; i < items.size(); i++) {
-//                    PatientItemDepartmentGroupVo item = items.get(i);
-//                    ComputeProjectCost itemCost = BeanUtil.convertObj(computeProjectCost, ComputeProjectCost.class);
-//                    itemCost.setCode(item.getItemCode());
-//                    itemCost.setName(item.getItemName());
-//                    Map<String, Item> departmentMap = itemMap.get(item.getExecuteDepartmentCode());
-//                    if (CollectionUtils.isEmpty(departmentMap)) {
-//                        continue;
-//                    }
-//                    Item itemData = departmentMap.get(item.getItemCode());
-//                    if (Objects.isNull(itemData)) {
-//                        continue;
-//                    }
-//                    itemCost.setItemType(itemData.getItemType());
-//                    itemCost.setResponsibilityCode(responsibilityCodeMap.get(item.getExecuteDepartmentCode()));
-//                    itemCost.setResponsibilityName(responsibilityNameMap.get(item.getExecuteDepartmentCode()));
-//                    itemCost.setIndex(i);
-//                    ComputeStandProjectCost computeStandProjectCost = BeanUtil.convertObj(itemCost, ComputeStandProjectCost.class);
-//                    saveCost.add(computeStandProjectCost);
-//                    costDetail.setIndex(i);
-//                    groupCostDetail.setIndex(i);
-//
-//                    List<ComputeProjectCostDetail> computeProjectCostDetails = setDetails(item, costDetail, itemCost, shareParamCostGroup, sharePercent, shareSum, responsibilitySum);
-//                    List<ComputeStandProjectCostDetail> computeStandProjectCostDetails = BeanUtil.convertList(computeProjectCostDetails, ComputeStandProjectCostDetail.class);
-//                    saveDetails.addAll(computeStandProjectCostDetails);
-//                    List<ComputeProjectGroupCostDetail> computeProjectGroupCostDetails = setGroupDetails(groupCostDetail, computeProjectCostDetails);
-//                    List<ComputeStandProjectGroupCostDetail> computeStandProjectGroupCostDetails = BeanUtil.convertList(computeProjectGroupCostDetails, ComputeStandProjectGroupCostDetail.class);
-//
-//                    saveGroupDetails.addAll(computeStandProjectGroupCostDetails);
-//                }
-//                if (!CollectionUtils.isEmpty(saveCost)) {
-//                    //保存主表数据 并获取主键
-//                    standProjectCostRepository.saveBatch(saveCost, 500);
-//                    Map<Integer, Integer> indexId = saveCost.stream().collect(Collectors.toMap(ComputeStandProjectCost::getIndex, ComputeStandProjectCost::getId, (a, b) -> b));
-//                    //保存细项项目成本数据 添加主键关联
-//                    if (!CollectionUtils.isEmpty(saveDetails)) {
-//                        Map<Integer, List<ComputeStandProjectCostDetail>> collectIndex = saveDetails.stream().collect(Collectors.groupingBy(ComputeStandProjectCostDetail::getIndex));
-//                        List<ComputeStandProjectCostDetail> saveCostDetails = new ArrayList<>();
-//                        collectIndex.forEach((k, v) -> {
-//                            v.forEach(detail -> detail.setProjectCostId(indexId.get(k)));
-//                            saveCostDetails.addAll(v);
-//                        });
-//                        standProjectCostDetailRepository.saveBatch(saveCostDetails, 500);
-//                    }
-//                    //处理合并项目成本数据 添加主键关联
-//                    if (!CollectionUtils.isEmpty(saveGroupDetails)) {
-//                        Map<Integer, List<ComputeStandProjectGroupCostDetail>> collectGroupIndex = saveGroupDetails.stream().collect(Collectors.groupingBy(ComputeStandProjectGroupCostDetail::getIndex));
-//                        List<ComputeStandProjectGroupCostDetail> saveGroupCostDetails = new ArrayList<>();
-//                        collectGroupIndex.forEach((k, v) -> {
-//                            v.forEach(detail -> detail.setProjectCostId(indexId.get(k)));
-//                            saveGroupCostDetails.addAll(v);
-//                        });
-//                        saveGroupCostDetails.forEach(f -> f.setId(null));
-//                        standProjectGroupCostDetailRepository.saveBatch(saveGroupCostDetails, 500);
-//                    }
-//                }
-//
-//            }
-//        }
-
-
+    /**
+     * 执行标准法项目成本分摊计算后续处理脚本
+     * @param computeDate
+     */
+    public  void execStandItemCostSQL(String computeDate){
+        Map<String,String> sqlParameter = new HashMap<>();
+        sqlParameter.put(SQLParameter.COMPUTE_DATE_CODE,computeDate);
+        sqlService.autoExecuteSql(CustomSqlTypeEnum.STAND_PROJECT_COST_CALC.getCode(),sqlParameter);
     }
 
     private static @NotNull BigDecimal getSharePercent(ComputeShareParamDetailVo detailVo, BigDecimal bigDecimalSum) {

+ 11 - 1
src/main/java/com/kcim/service/impl/ReportFormServiceImpl.java

@@ -517,9 +517,19 @@ public class ReportFormServiceImpl extends ServiceImpl<ReportFormMapper, ReportF
     @Override
     @Transactional(rollbackFor = Throwable.class,propagation = Propagation.REQUIRED)
     public void checkExistLoss(Long hospId) {
+        checkExistLoss(hospId,ReportTypeEnum.HOSP_PROFIT_LOSS.getType());
+    }
+
+    /**
+     * 校验指定类型的全院损益报表是否存在默认损益
+     * @param hospId
+     * @param reportType
+     */
+    @Override
+    public void checkExistLoss(Long hospId, Integer reportType) {
         List<ReportForm> list = this.list(
                 new LambdaQueryWrapper<ReportForm>()
-                        .eq(ReportForm::getReportType, ReportTypeEnum.HOSP_PROFIT_LOSS.getType())
+                        .eq(ReportForm::getReportType, reportType)
                         .eq(ReportForm::getHospId, hospId)
                         .eq(ReportForm::getIsLoss, 1)
         );

+ 27 - 17
src/main/java/com/kcim/service/impl/ReportServiceImpl.java

@@ -191,19 +191,20 @@ public class ReportServiceImpl implements ReportService {
                         }else {
                             handleSql = MatchParameter(sql, keyParameter,new HashMap<>());
                         }
-                        Integer dataType = col.getDataType();
                         Object o = sqlRunner(handleSql);
-                        if(dataType != null&&dataType.equals(NumberConstant.THREE)){
-                            Integer decimalPlace = col.getDecimalPlace();
-                            if(o.equals("")){
-                                vo.setValue(BigDecimal.ZERO.setScale(decimalPlace,RoundingMode.HALF_UP));
-                            }else {
-                                BigDecimal value = new BigDecimal(o.toString());
-                                vo.setValue(value.setScale(decimalPlace,RoundingMode.HALF_UP));
-                            }
-                        }else {
+//                        Integer dataType = col.getDataType();
+//
+//                        if(dataType != null&&dataType.equals(NumberConstant.THREE)){
+//                            Integer decimalPlace = col.getDecimalPlace();
+//                            if(o.equals("")){
+//                                vo.setValue(BigDecimal.ZERO.setScale(decimalPlace,RoundingMode.HALF_UP));
+//                            }else {
+//                                BigDecimal value = new BigDecimal(o.toString());
+//                                vo.setValue(value.setScale(decimalPlace,RoundingMode.HALF_UP));
+//                            }
+//                        }else {
                             vo.setValue(o);
-                        }
+//                        }
                         dataVo.add(vo);
                     }
                 }
@@ -238,13 +239,13 @@ public class ReportServiceImpl implements ReportService {
                         CostColumn col = costColumnMap.get(column.getColumnCode());
                         String formula = col.getFormula();
                         BigDecimal formulaData = getFormulaData(formula, dataVo,column);
-                        Integer dataType = col.getDataType();
-                        if(dataType != null&&dataType.equals(NumberConstant.THREE)){
-                            Integer decimalPlace = col.getDecimalPlace();
-                            vo.setValue(formulaData.setScale(decimalPlace, RoundingMode.HALF_UP));
-                        }else {
+//                        Integer dataType = col.getDataType();
+//                        if(dataType != null&&dataType.equals(NumberConstant.THREE)){
+//                            Integer decimalPlace = col.getDecimalPlace();
+//                            vo.setValue(formulaData.setScale(decimalPlace, RoundingMode.HALF_UP));
+//                        }else {
                             vo.setValue(formulaData);
-                        }
+//                        }
                         dataVo.add(vo);
                     }
                 }
@@ -455,6 +456,15 @@ public class ReportServiceImpl implements ReportService {
         CostColumn computeColumn = map.get(Long.valueOf(column));
         if(Objects.nonNull(computeColumn)){
             vo.setDataType(computeColumn.getDataType());
+            vo.setDecimalPlace(computeColumn.getDecimalPlace());
+            String permil = computeColumn.getPermil();
+            if(StringUtils.isEmpty(permil)){
+                vo.setPermil(false);
+            }else {
+                vo.setPermil(permil.equals(NumberConstant.ONE_S));
+            }
+
+
         }
         List<String> primary = new ArrayList<>();
         if(reportCodeModifyVo.getReportCode() != null){

+ 43 - 0
src/main/java/com/kcim/service/impl/ResponsibilityDepartmentServiceImpl.java

@@ -14,13 +14,17 @@ import com.kcim.service.CenterService;
 import com.kcim.service.ResponsibilityDepartmentService;
 import com.kcim.service.ResponsibilityService;
 import com.kcim.vo.CenterDepartmentVO;
+import com.kcim.vo.ResponsibilityDepartIdVO;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Propagation;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.CollectionUtils;
 
+import java.util.ArrayList;
 import java.util.List;
 import java.util.Objects;
+import java.util.Optional;
 import java.util.stream.Collectors;
 
 @Slf4j
@@ -89,4 +93,43 @@ public class ResponsibilityDepartmentServiceImpl
     }
 
 
+    /**
+     * 获取责任中心科室对照信息
+     * @return
+     */
+    @Override
+    public List<ResponsibilityDepartIdVO> getResponsibilityDepart(){
+        Long hospId = UserContext.getHospId();
+        //获取责任中心科室对照信息
+        List<ResponsibilityDepartIdVO> responsibilityDepartIdVOS = baseMapper.getResponsibility(hospId);
+        if(CollectionUtils.isEmpty(responsibilityDepartIdVOS))
+        {
+            responsibilityDepartIdVOS=new ArrayList<>();
+            return  responsibilityDepartIdVOS;
+        }
+        //获取对照的科室字典
+        List<SysDepartment> departmentByDepartmentIds =centerService.getDepartmentFilter(null);
+        if(CollectionUtils.isEmpty(departmentByDepartmentIds))
+        {
+            return  responsibilityDepartIdVOS;
+        }
+        //组装科室代码和科室名称
+        responsibilityDepartIdVOS.stream().forEach(responsibilityDepartIdVO -> {
+            Optional<SysDepartment> firstDepartment = departmentByDepartmentIds.stream().filter(sysDepartment ->Long.valueOf(sysDepartment.getId()).equals(responsibilityDepartIdVO.getDepartmentId())).findFirst();
+            if(firstDepartment.isPresent()){
+                responsibilityDepartIdVO.setDepartmentCode(firstDepartment.get().getCode());
+                responsibilityDepartIdVO.setDepartmentName(firstDepartment.get().getName());
+            }
+        });
+        //只取有对应科室数据的记录
+        List<ResponsibilityDepartIdVO> activeResponsibilityDeparts = responsibilityDepartIdVOS.stream().filter(responsibilityDepartIdVO -> !Objects.isNull(responsibilityDepartIdVO.getDepartmentCode())).collect(Collectors.toList());
+        if(CollectionUtils.isEmpty(activeResponsibilityDeparts))
+        {
+            activeResponsibilityDeparts=new ArrayList<>();
+            return  activeResponsibilityDeparts;
+        }
+        return  activeResponsibilityDeparts;
+    }
+
+
 }

+ 529 - 10
src/main/java/com/kcim/service/impl/ShareParamServiceImpl.java

@@ -4,6 +4,8 @@ import cn.hutool.core.util.StrUtil;
 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.enums.CustomSqlTypeEnum;
 import com.kcim.common.exception.CostException;
 import com.kcim.common.util.BeanUtil;
 import com.kcim.common.util.PageUtils;
@@ -11,15 +13,14 @@ import com.kcim.common.util.UserContext;
 import com.kcim.dao.model.*;
 import com.kcim.dao.model.dto.PatientItemDepartmentGroupVo;
 import com.kcim.dao.repository.*;
-import com.kcim.service.CenterService;
-import com.kcim.service.ShareParamService;
-import com.kcim.service.StandItemService;
+import com.kcim.service.*;
 import com.kcim.vo.*;
 import com.kcim.web.reponse.ShareParamCostResponse;
 import lombok.extern.slf4j.Slf4j;
 import org.jetbrains.annotations.NotNull;
 import org.springframework.stereotype.Service;
 import org.springframework.util.CollectionUtils;
+import org.springframework.util.ObjectUtils;
 import org.springframework.util.StringUtils;
 
 import java.math.BigDecimal;
@@ -62,6 +63,13 @@ public class ShareParamServiceImpl implements ShareParamService {
     ItemEquipmentMapRepository itemEquipmentMapRepository;
 
     ItemSpaceMapRepository itemSpaceMapRepository;
+
+    StandItemEmpMapRepository standItemEmpMapRepository;
+
+    StandItemEquipmentMapRepository standItemEquipmentMapRepository;
+
+    StandItemSpaceMapRepository standItemSpaceMapRepository;
+
     ShareParamTypeMapRepository shareParamTypeMapRepository;
     ResponsibilityDepartmentRepository responsibilityDepartmentRepository;
 
@@ -72,12 +80,18 @@ public class ShareParamServiceImpl implements ShareParamService {
     ComputeStandShareParamDetailRepository computeStandShareParamDetailRepository;
 
     StandItemService standItemService;
+    SqlService sqlService;
+    ResponsibilityDepartmentService  responsibilityDepartmentService;
 
-    public ShareParamServiceImpl(ComputeShareParamRepository repository, ComputeShareParamDetailRepository detailRepository, ImportPatientItemRepository importPatientItemRepository, ItemRepository itemRepository, ItemEmpMapRepository itemEmpMapRepository, ItemEquipmentMapRepository itemEquipmentMapRepository, ItemSpaceMapRepository itemSpaceMapRepository, ShareParamTypeMapRepository shareParamTypeMapRepository, ResponsibilityDepartmentRepository responsibilityDepartmentRepository, CenterService centerService, ComputeStandShareParamRepository computeStandShareParamRepository, ComputeStandShareParamDetailRepository computeStandShareParamDetailRepository, StandItemService standItemService) {
+    public ShareParamServiceImpl(ComputeShareParamRepository repository, ComputeShareParamDetailRepository detailRepository, ImportPatientItemRepository importPatientItemRepository, ItemRepository itemRepository, ItemEmpMapRepository itemEmpMapRepository, ItemEquipmentMapRepository itemEquipmentMapRepository, ItemSpaceMapRepository itemSpaceMapRepository, ShareParamTypeMapRepository shareParamTypeMapRepository, ResponsibilityDepartmentRepository responsibilityDepartmentRepository, CenterService centerService, ComputeStandShareParamRepository computeStandShareParamRepository, ComputeStandShareParamDetailRepository computeStandShareParamDetailRepository, StandItemService standItemService,SqlService sqlService,ResponsibilityDepartmentService  responsibilityDepartmentService
+    ,StandItemEmpMapRepository standItemEmpMapRepository,StandItemEquipmentMapRepository standItemEquipmentMapRepository,StandItemSpaceMapRepository standItemSpaceMapRepository) {
         this.repository = repository;
         this.detailRepository = detailRepository;
         this.importPatientItemRepository = importPatientItemRepository;
         this.itemRepository = itemRepository;
+        this.standItemEmpMapRepository = standItemEmpMapRepository;
+        this.standItemEquipmentMapRepository = standItemEquipmentMapRepository;
+        this.standItemSpaceMapRepository = standItemSpaceMapRepository;
         this.itemEmpMapRepository = itemEmpMapRepository;
         this.itemEquipmentMapRepository = itemEquipmentMapRepository;
         this.itemSpaceMapRepository = itemSpaceMapRepository;
@@ -87,6 +101,8 @@ public class ShareParamServiceImpl implements ShareParamService {
         this.computeStandShareParamRepository = computeStandShareParamRepository;
         this.computeStandShareParamDetailRepository = computeStandShareParamDetailRepository;
         this.standItemService = standItemService;
+        this.sqlService=sqlService;
+        this.responsibilityDepartmentService=responsibilityDepartmentService;
     }
 
     /**
@@ -127,13 +143,24 @@ public class ShareParamServiceImpl implements ShareParamService {
         return response;
     }
 
+    /**
+     * 完全法项目分摊参数计算
+     * @param computeDate
+     */
+    @Override
+    public void computeShareParamCost(String computeDate){
+        //完全法项目分摊参数计算
+        calcShareParamCost(computeDate);
+        //执行完全法项目分摊参数计算后续处理脚本
+        execShareParamCostSQL(computeDate);
+    }
+
     /**
      * 项目分摊参数计算
      *
      * @param computeDate 核算年月
      */
-    @Override
-    public void computeShareParamCost(String computeDate) {
+    public void computeShareParamCostAction(String computeDate) {
         SessionUserVO currentUser = UserContext.getCurrentUser();
         //获取收费项目数据(项目)
         checkItemCount(computeDate, currentUser);
@@ -212,15 +239,488 @@ public class ShareParamServiceImpl implements ShareParamService {
                     detailRepository.saveBatch(saveCostDetails, 500);
                 }
             }
+        }
+    }
 
+    /**
+     * 项目分摊参数计算
+     * @param computeDate
+     */
+    public void calcShareParamCost(String computeDate){
+        SessionUserVO currentUser = UserContext.getCurrentUser();
+        //获取收费项目数据(项目)
+        checkItemCount(computeDate, currentUser);
+        //作废上次计算记录
+        repository.removeByComputeDate(computeDate, currentUser);
+        detailRepository.removeByComputeDate(computeDate, currentUser);
+        //医疗服务项目字典
+        List<Item> itemList = itemRepository.getList();
+        if (CollectionUtils.isEmpty(itemList)) {
+            throw new CostException("医疗服务项目未维护,请先添加医疗服务项目再进行计算,当前计算中止");
         }
+        //医疗服务项目的参与人员信息
+        List<ItemEmpMap> itemEmpMaps = itemEmpMapRepository.getList();
+        //医疗服务项目的使用设备信息
+        List<ItemEquipmentMap> itemEquipmentMaps = itemEquipmentMapRepository.getList();
+        //医疗服务项目的使用空间信息
+        List<ItemSpaceMap> itemSpaceMaps = itemSpaceMapRepository.getList();
+        //标准项目字典人员对照
+        List<StandItemEmpMap> standItemEmpMaps = standItemEmpMapRepository.getList();
+        //标准项目字典设备对照
+        List<StandItemEquipmentMap> standItemEquipmentMaps = standItemEquipmentMapRepository.getList();
+        //标准项目字典空间对照
+        List<StandItemSpaceMap> standItemSpaceMaps = standItemSpaceMapRepository.getList();
+
+        //科室责任中心对照信息
+        List<ResponsibilityDepartIdVO> responsibilityDeptMaps = responsibilityDepartmentService.getResponsibilityDepart();
+        //分摊参数设置信息
+        List<ShareParamTypeMap> shareParamTypeMaps = shareParamTypeMapRepository.getList();
+        //医疗服务项目分类字典
+        DictDataVo itemTypeDict = centerService.getDict(Constant.MED_SERVICE_ITEM_TYPE);
+        //月度患者收费项目信息(按执行科室+收费项目代码汇总过)
+        List<PatientItemDepartmentGroupVo> ptChargeItems = importPatientItemRepository.getByDepartGroupComputeDateItem(computeDate, currentUser);
+        if (CollectionUtils.isEmpty(ptChargeItems)){
+            throw new CostException("没有可计算的收费项目");
+        }
+//        //筛选出字典维护了的项目
+//        List<PatientItemDepartmentGroupVo> activePtChargeItems = ptChargeItems.stream().filter(ptItem -> {
+//            //科室项目字典维护了的数据
+//            if (itemList.stream().anyMatch(item -> item.getCode().equals(ptItem.getItemCode()) && item.getDepartmentCode().equals(ptItem.getExecuteDepartmentCode()))) {
+//                return true;
+//            }
+//            //全院项目字典维护了的数据
+//            if (itemList.stream().anyMatch(item -> item.getCode().equals(ptItem.getItemCode()) && item.getDepartmentCode().equals(NumberConstant.ZERO))) {
+//                return true;
+//            }
+//            return false;
+//        }).collect(Collectors.toList());
+//        if (CollectionUtils.isEmpty(activePtChargeItems)){
+//            throw new CostException("所有收费项目都没有对应的字典数据,请联系管理员");
+//        }
+        //绑定收费项目对应的医疗服务型项目字典对象
+        ptChargeItems.stream().forEach(ptItem->{
+            Item item = getDicItem(ptItem,itemList);
+            ptItem.setDicItem(item);
+        });
+        List<ComputeShareParam> computeShareParamList = new ArrayList();
+        List<ComputeShareParamDetail> ComputeShareParamDetailList = new ArrayList();
+        ptChargeItems.stream().forEach(ptItem->{
+            //只处理字典有项目
+            if(!Objects.isNull(ptItem.getDicItem())) {
+                //根据收费项目创建分摊参数主表对象
+                ComputeShareParam computeShareCost = creatComputeShareParam(currentUser, computeDate, ptItem, itemTypeDict, responsibilityDeptMaps);
+                computeShareParamList.add(computeShareCost);
+                //创建分摊参数主表对象对应的明细对象
+                shareParamTypeMaps.stream().forEach(shareParamType -> {
+                    ComputeShareParamDetail computeShareParamDetail = createComputeShareParamDetail(currentUser, computeDate, ptItem, computeShareCost, shareParamType, itemEmpMaps, itemEquipmentMaps, itemSpaceMaps,standItemEmpMaps, standItemEquipmentMaps, standItemSpaceMaps);
+                    ComputeShareParamDetailList.add(computeShareParamDetail);
+                });
+            }
+        });
+        //没有任何可保存的数据
+        if (CollectionUtils.isEmpty(computeShareParamList)) {
+            throw new CostException("没有任何可保存的数据");
+        }
+        //保存分摊参数主表对象数据
+        repository.saveBatch(computeShareParamList, 500);
+        if (CollectionUtils.isEmpty(ComputeShareParamDetailList)) {
+            return;
+        }
+        //保存分摊参数明细表对象数据
+        ComputeShareParamDetailList.stream().forEach(shareParamDetailL->shareParamDetailL.setShareParamId(shareParamDetailL.getComputeShareCost().getId()));
+        detailRepository.saveBatch(ComputeShareParamDetailList, 500);
+    }
 
+    /**
+     * 获取收费项目对应的医疗服务项目字典对象
+     * @param ptItem
+     * @param itemList
+     * @return
+     */
+    public Item getDicItem(PatientItemDepartmentGroupVo ptItem,List<Item> itemList){
+        //优先取科室项目字典的记录
+        Optional<Item> first = itemList.stream().filter(dicItem -> dicItem.getCode().equals(ptItem.getItemCode()) && dicItem.getDepartmentCode().equals(ptItem.getExecuteDepartmentCode())).findFirst();
+        if(first.isPresent()) {
+            return first.get();
+        }
+        //取全院通用的字典记录
+        first = itemList.stream().filter(dicItem -> dicItem.getCode().equals(ptItem.getItemCode()) && dicItem.getDepartmentCode().equals(NumberConstant.ZERO)).findFirst();
+        if(first.isPresent()) {
+            return first.get();
+        }
+        return null;
+    }
 
+    /**
+     * 根据收费项目创建分摊参数主表对象
+     * @param currentUser
+     * @param computeDate
+     * @param itemTypeDict
+     * @param ptItem
+     * @param responsibilityDeptMaps
+     * @return
+     */
+    public ComputeShareParam creatComputeShareParam(SessionUserVO currentUser,String computeDate,PatientItemDepartmentGroupVo ptItem,DictDataVo itemTypeDict, List<ResponsibilityDepartIdVO> responsibilityDeptMaps){
+        ComputeShareParam computeShareCost = new ComputeShareParam();
+        computeShareCost.setComputeDate(computeDate);
+        computeShareCost.setHospId(currentUser.getHospId());
+        computeShareCost.setCreateUser(String.valueOf(currentUser.getId()));
+        computeShareCost.setCreateTime(new Date());
+        computeShareCost.setCode(ptItem.getItemCode());
+        computeShareCost.setName(ptItem.getItemName());
+        computeShareCost.setNum(ptItem.getNum());
+        //获取执行科室对应的责任中心
+        Optional<ResponsibilityDepartIdVO> firstResponsibilityDepartIdVO = responsibilityDeptMaps.stream().filter(respDeptmap -> !Objects.isNull(respDeptmap.getDepartmentCode())&& respDeptmap.getDepartmentCode().equals(ptItem.getExecuteDepartmentCode())).findFirst();
+        if(!firstResponsibilityDepartIdVO.isPresent()){
+            String errMsg = String.format("【%s(%s)】没有对应的责任中心,计算中止", ptItem.getExecuteDepartmentName(), ptItem.getExecuteDepartmentCode());
+            throw new CostException(errMsg);
+        }
+        ResponsibilityDepartIdVO responsibilityDepartIdVO=firstResponsibilityDepartIdVO.get();
+        computeShareCost.setResponsibilityCode(responsibilityDepartIdVO.getResponsibilityCode());
+        computeShareCost.setResponsibilityName(responsibilityDepartIdVO.getResponsibilityName());
+//        computeShareCost.setItemType(getChargeItemType(itemTypeDict,responsibilityDepartIdVO.getShareId()));
+        computeShareCost.setItemType(ptItem.getDicItem().getItemType());
+        return computeShareCost;
 
+    }
 
+    /**
+     * 根据收费项目创建分摊参数明细表对象
+     * @param currentUser
+     * @param computeDate
+     * @param ptItem
+     * @param computeShareCost
+     * @param shareParamType
+     * @param itemEmpMaps
+     * @param itemEquipmentMaps
+     * @param itemSpaceMaps
+     * @return
+     */
+    public  ComputeShareParamDetail createComputeShareParamDetail( SessionUserVO currentUser,String computeDate,PatientItemDepartmentGroupVo ptItem,ComputeShareParam computeShareCost,ShareParamTypeMap shareParamType,
+                                                                   List<ItemEmpMap> itemEmpMaps,List<ItemEquipmentMap> itemEquipmentMaps ,List<ItemSpaceMap> itemSpaceMaps,
+                                                                   List<StandItemEmpMap> standItemEmpMaps,List<StandItemEquipmentMap> standItemEquipmentMaps ,List<StandItemSpaceMap> standItemSpaceMaps){
+        //明细表公共对象
+        ComputeShareParamDetail costDetail = new ComputeShareParamDetail();
+        costDetail.setComputeDate(computeDate);
+        costDetail.setHospId(currentUser.getHospId());
+        costDetail.setCreateUser(String.valueOf(currentUser.getId()));
+        costDetail.setCreateTime(new Date());
+        costDetail.setShareParamCode(shareParamType.getShareParamCode());
+        if(shareParamType.getSourceType().equals(NumberConstant.ONE_S)){
+            //计算参与人员的参数值
+            BigDecimal computeSingleResult = calcEmpParamValue(shareParamType, ptItem, itemEmpMaps);
+            costDetail.setComputeSingleResult(computeSingleResult);
+            costDetail.setComputeResult(computeSingleResult.multiply(ptItem.getNum()));
+            //计算标准法参与人员的参数值
+            BigDecimal standComputeSingleResult = calcStandEmpParamValue(shareParamType, ptItem, standItemEmpMaps);
+            costDetail.setStandComputeSingleResult(standComputeSingleResult);
+            costDetail.setStandComputeResult(standComputeSingleResult.multiply(ptItem.getNum()));
+        }else if(shareParamType.getSourceType().equals(NumberConstant.TWO_S)){
+            //计算使用设备的参数值
+            BigDecimal computeSingleResult = calcEquipmentParamValue(shareParamType, ptItem, itemEquipmentMaps);
+            costDetail.setComputeSingleResult(computeSingleResult);
+            costDetail.setComputeResult(computeSingleResult.multiply(ptItem.getNum()));
+            //计算标准法使用设备的参数值
+            BigDecimal standComputeSingleResult =  calcStandEquipmentParamValue(shareParamType, ptItem, standItemEquipmentMaps);
+            costDetail.setStandComputeSingleResult(standComputeSingleResult);
+            costDetail.setStandComputeResult(standComputeSingleResult.multiply(ptItem.getNum()));
+        }else if(shareParamType.getSourceType().equals(NumberConstant.THREE_S)){
+            //计算使用空间的参数值
+            BigDecimal computeSingleResult = calcSpaceParamValue(shareParamType, ptItem, itemSpaceMaps);
+            costDetail.setComputeSingleResult(computeSingleResult);
+            costDetail.setComputeResult(computeSingleResult.multiply(ptItem.getNum()));
+            //计算标准法使用空间的参数值
+            BigDecimal standComputeSingleResult = calcStandSpaceParamValue(shareParamType, ptItem,standItemSpaceMaps);
+            costDetail.setStandComputeSingleResult(standComputeSingleResult);
+            costDetail.setStandComputeResult(standComputeSingleResult.multiply(ptItem.getNum()));
+        }else if(shareParamType.getSourceType().equals(NumberConstant.FOUR_S)){
+            //计算项目收入的参数值
+            BigDecimal computeResult = ptItem.getAmount();
+            if (!ptItem.getNum().equals(BigDecimal.ZERO.setScale(NumberConstant.TWO, RoundingMode.HALF_UP))) {
+                costDetail.setComputeSingleResult(computeResult.divide(ptItem.getNum(), NumberConstant.FOUR, RoundingMode.HALF_UP));
+                costDetail.setStandComputeSingleResult(computeResult.divide(ptItem.getNum(), NumberConstant.FOUR, RoundingMode.HALF_UP));
+            } else {
+                costDetail.setComputeSingleResult(BigDecimal.ZERO.setScale(NumberConstant.FOUR, RoundingMode.HALF_UP));
+                costDetail.setStandComputeSingleResult(BigDecimal.ZERO.setScale(NumberConstant.FOUR, RoundingMode.HALF_UP));
+            }
+            costDetail.setComputeResult(computeResult);
+            costDetail.setStandComputeResult(computeResult);
+        }else if(shareParamType.getSourceType().equals(NumberConstant.FIVE_S)){
+            //计算项目数量的参数值
+            BigDecimal computeResult = ptItem.getNum();
+            costDetail.setComputeSingleResult(BigDecimal.ONE.setScale(NumberConstant.FOUR, RoundingMode.HALF_UP));
+            costDetail.setComputeResult(computeResult);
+            //计算标准法项目数量的参数值
+            costDetail.setStandComputeSingleResult(BigDecimal.ONE.setScale(NumberConstant.FOUR, RoundingMode.HALF_UP));
+            costDetail.setStandComputeResult(computeResult);
+        }
+        costDetail.setComputeShareCost(computeShareCost);
+        return costDetail;
+    }
 
-        //
+    /**
+     * 计算参与人员的参数值
+     * @param ptItem
+     * @param itemEmpMaps
+     * @return
+     */
+    public BigDecimal calcEmpParamValue(ShareParamTypeMap shareParamType,PatientItemDepartmentGroupVo ptItem,List<ItemEmpMap> itemEmpMaps){
+        //没有人员配置
+        if(CollectionUtils.isEmpty(itemEmpMaps)){
+            return  BigDecimal.ZERO;
+        }
+        String sourceCode = shareParamType.getSourceCode();
+        //没有维护对应的来源代码
+        if(Objects.isNull(sourceCode)||sourceCode.equals(Constant.EMPTY_STR)){
+            return  BigDecimal.ZERO;
+        }
+        //获取项目对应的参与人员配置
+        List<ItemEmpMap> itemEmpList = itemEmpMaps.stream().filter(itemEmp -> itemEmp.getItemCode().equals(ptItem.getDicItem().getCode()) && itemEmp.getDepartmentCode().equals(ptItem.getDicItem().getDepartmentCode())).collect(Collectors.toList());
+        if(CollectionUtils.isEmpty(itemEmpList)){
+            return  BigDecimal.ZERO;
+        }
+        BigDecimal paramValue=BigDecimal.ZERO;
+        //全部项目
+        if(sourceCode.equals(NumberConstant.ZERO_S)){
+            paramValue = itemEmpList.stream().map(itemEmp -> itemEmp.getExecuteTime().multiply(itemEmp.getNum())).reduce(BigDecimal.ZERO, BigDecimal::add);
+            return paramValue;
+        }
+        //不是全部的项目时,有可能会是多个
+        List<String> sourceCodeList = StrUtil.split(sourceCode, "|");
+        //获取符合条件的项目
+        List<ItemEmpMap> activeItemEmpList = itemEmpList.stream().filter(itemEmp -> sourceCodeList.contains(itemEmp.getEmpTypeCode())).collect(Collectors.toList());
+        if(CollectionUtils.isEmpty(activeItemEmpList)){
+            return paramValue;
+        }
+        //只统计符合条件的项目
+        paramValue = activeItemEmpList.stream().map(itemEmp -> itemEmp.getExecuteTime().multiply(itemEmp.getNum())).reduce(BigDecimal.ZERO, BigDecimal::add);
+        return  paramValue;
+    }
 
+    /**
+     * 计算标准项目参与人员的参数值
+     * @param ptItem
+     * @param standItemEmpMaps
+     * @return
+     */
+    public BigDecimal calcStandEmpParamValue(ShareParamTypeMap shareParamType,PatientItemDepartmentGroupVo ptItem,List<StandItemEmpMap> standItemEmpMaps){
+        //没有人员配置
+        if(CollectionUtils.isEmpty(standItemEmpMaps)){
+            return  BigDecimal.ZERO;
+        }
+        String sourceCode = shareParamType.getSourceCode();
+        //没有维护对应的来源代码
+        if(Objects.isNull(sourceCode)||sourceCode.equals(Constant.EMPTY_STR)){
+            return  BigDecimal.ZERO;
+        }
+        //获取项目对应的标准项目的参与人员配置
+        List<StandItemEmpMap> itemEmpList = standItemEmpMaps.stream().filter(itemEmp ->!ObjectUtils.isEmpty(ptItem.getDicItem())&& ptItem.getDicItem().getStandItemCode().equals(itemEmp.getStandItemCode())).collect(Collectors.toList());
+        if(CollectionUtils.isEmpty(itemEmpList)){
+            return  BigDecimal.ZERO;
+        }
+        BigDecimal paramValue=BigDecimal.ZERO;
+        //全部项目
+        if(sourceCode.equals(NumberConstant.ZERO_S)){
+            paramValue = itemEmpList.stream().map(itemEmp -> itemEmp.getExecuteTime().multiply(itemEmp.getNum())).reduce(BigDecimal.ZERO, BigDecimal::add);
+            return paramValue;
+        }
+        //不是全部的项目时,有可能会是多个
+        List<String> sourceCodeList = StrUtil.split(sourceCode, "|");
+        //获取符合条件的项目
+        List<StandItemEmpMap> activeItemEmpList = itemEmpList.stream().filter(itemEmp -> sourceCodeList.contains(itemEmp.getEmpTypeCode())).collect(Collectors.toList());
+        if(CollectionUtils.isEmpty(activeItemEmpList)){
+            return paramValue;
+        }
+        //只统计符合条件的项目
+        paramValue = activeItemEmpList.stream().map(itemEmp -> itemEmp.getExecuteTime().multiply(itemEmp.getNum())).reduce(BigDecimal.ZERO, BigDecimal::add);
+        return  paramValue;
+    }
+
+
+    /**
+     * 计算使用设备参数值
+     * @param shareParamType
+     * @param ptItem
+     * @param itemEquipmentMaps
+     * @return
+     */
+    public BigDecimal calcEquipmentParamValue(ShareParamTypeMap shareParamType,PatientItemDepartmentGroupVo ptItem,List<ItemEquipmentMap> itemEquipmentMaps){
+        //没有人员配置
+        if(CollectionUtils.isEmpty(itemEquipmentMaps)){
+            return  BigDecimal.ZERO;
+        }
+        String sourceCode = shareParamType.getSourceCode();
+        //没有维护对应的来源代码
+        if(Objects.isNull(sourceCode)||sourceCode.equals(Constant.EMPTY_STR)){
+            return  BigDecimal.ZERO;
+        }
+        //获取项目对应的使用设备配置
+        List<ItemEquipmentMap> itemEquipmentList = itemEquipmentMaps.stream().filter(itemEmp -> itemEmp.getItemCode().equals(ptItem.getDicItem().getCode()) && itemEmp.getDepartmentCode().equals(ptItem.getDicItem().getDepartmentCode())).collect(Collectors.toList());
+        if(CollectionUtils.isEmpty(itemEquipmentList)){
+            return  BigDecimal.ZERO;
+        }
+        BigDecimal paramValue=BigDecimal.ZERO;
+        //全部项目
+        if(sourceCode.equals(NumberConstant.ZERO_S)){
+            paramValue = itemEquipmentList.stream().map(itemEmp -> itemEmp.getExecuteTime().multiply(itemEmp.getNum())).reduce(BigDecimal.ZERO, BigDecimal::add);
+            return paramValue;
+        }
+        //不是全部的项目时,有可能会是多个
+        List<String> sourceCodeList = StrUtil.split(sourceCode, "|");
+        //获取符合条件的项目
+        List<ItemEquipmentMap> activeItemEquipmentList = itemEquipmentList.stream().filter(itemEmp -> sourceCodeList.contains(itemEmp.getEquipmentCode())).collect(Collectors.toList());
+        if(CollectionUtils.isEmpty(activeItemEquipmentList)){
+            return paramValue;
+        }
+        //只统计符合条件的项目
+        paramValue = activeItemEquipmentList.stream().map(itemEmp -> itemEmp.getExecuteTime().multiply(itemEmp.getNum())).reduce(BigDecimal.ZERO, BigDecimal::add);
+        return  paramValue;
+    }
+
+    /**
+     * 计算标准项目使用设备参数值
+     * @param shareParamType
+     * @param ptItem
+     * @param standItemEquipmentMaps
+     * @return
+     */
+    public BigDecimal calcStandEquipmentParamValue(ShareParamTypeMap shareParamType,PatientItemDepartmentGroupVo ptItem,List<StandItemEquipmentMap> standItemEquipmentMaps){
+        //没有人员配置
+        if(CollectionUtils.isEmpty(standItemEquipmentMaps)){
+            return  BigDecimal.ZERO;
+        }
+        String sourceCode = shareParamType.getSourceCode();
+        //没有维护对应的来源代码
+        if(Objects.isNull(sourceCode)||sourceCode.equals(Constant.EMPTY_STR)){
+            return  BigDecimal.ZERO;
+        }
+        //获取项目对应的标准项目的使用设备配置
+        List<StandItemEquipmentMap> itemEquipmentList = standItemEquipmentMaps.stream().filter(itemEmp ->!ObjectUtils.isEmpty(ptItem.getDicItem())&& itemEmp.getStandItemCode().equals(ptItem.getDicItem().getStandItemCode())).collect(Collectors.toList());
+        if(CollectionUtils.isEmpty(itemEquipmentList)){
+            return  BigDecimal.ZERO;
+        }
+        BigDecimal paramValue=BigDecimal.ZERO;
+        //全部项目
+        if(sourceCode.equals(NumberConstant.ZERO_S)){
+            paramValue = itemEquipmentList.stream().map(itemEmp -> itemEmp.getExecuteTime().multiply(itemEmp.getNum())).reduce(BigDecimal.ZERO, BigDecimal::add);
+            return paramValue;
+        }
+        //不是全部的项目时,有可能会是多个
+        List<String> sourceCodeList = StrUtil.split(sourceCode, "|");
+        //获取符合条件的项目
+        List<StandItemEquipmentMap> activeItemEquipmentList = itemEquipmentList.stream().filter(itemEmp -> sourceCodeList.contains(itemEmp.getEquipmentCode())).collect(Collectors.toList());
+        if(CollectionUtils.isEmpty(activeItemEquipmentList)){
+            return paramValue;
+        }
+        //只统计符合条件的项目
+        paramValue = activeItemEquipmentList.stream().map(itemEmp -> itemEmp.getExecuteTime().multiply(itemEmp.getNum())).reduce(BigDecimal.ZERO, BigDecimal::add);
+        return  paramValue;
+    }
+
+    /**
+     * 计算使用空间参数值
+     * @param shareParamType
+     * @param ptItem
+     * @param itemSpaceMaps
+     * @return
+     */
+    public BigDecimal calcSpaceParamValue(ShareParamTypeMap shareParamType,PatientItemDepartmentGroupVo ptItem,List<ItemSpaceMap> itemSpaceMaps){
+        //没有人员配置
+        if(CollectionUtils.isEmpty(itemSpaceMaps)){
+            return  BigDecimal.ZERO;
+        }
+        String sourceCode = shareParamType.getSourceCode();
+        //没有维护对应的来源代码
+        if(Objects.isNull(sourceCode)||sourceCode.equals(Constant.EMPTY_STR)){
+            return  BigDecimal.ZERO;
+        }
+        //获取项目对应的使用空间配置
+        List<ItemSpaceMap> itemSpaceList = itemSpaceMaps.stream().filter(itemEmp -> itemEmp.getItemCode().equals(ptItem.getDicItem().getCode()) && itemEmp.getDepartmentCode().equals(ptItem.getDicItem().getDepartmentCode())).collect(Collectors.toList());
+        if(CollectionUtils.isEmpty(itemSpaceList)){
+            return  BigDecimal.ZERO;
+        }
+        BigDecimal paramValue=BigDecimal.ZERO;
+        //全部项目
+        if(sourceCode.equals(NumberConstant.ZERO_S)){
+            paramValue = itemSpaceList.stream().map(itemEmp -> itemEmp.getExecuteTime().multiply(itemEmp.getNum())).reduce(BigDecimal.ZERO, BigDecimal::add);
+            return paramValue;
+        }
+        //不是全部的项目时,有可能会是多个
+        List<String> sourceCodeList = StrUtil.split(sourceCode, "|");
+        //获取符合条件的项目
+        List<ItemSpaceMap> activeItemSpaceList = itemSpaceList.stream().filter(itemEmp -> sourceCodeList.contains(itemEmp.getSpaceCode())).collect(Collectors.toList());
+        if(CollectionUtils.isEmpty(activeItemSpaceList)){
+            return paramValue;
+        }
+        //只统计符合条件的项目
+        paramValue = activeItemSpaceList.stream().map(itemEmp -> itemEmp.getExecuteTime().multiply(itemEmp.getNum())).reduce(BigDecimal.ZERO, BigDecimal::add);
+        return  paramValue;
+    }
+
+    /**
+     * 计算标准项目使用空间参数值
+     * @param shareParamType
+     * @param ptItem
+     * @param standItemSpaceMaps
+     * @return
+     */
+    public BigDecimal calcStandSpaceParamValue(ShareParamTypeMap shareParamType,PatientItemDepartmentGroupVo ptItem,List<StandItemSpaceMap> standItemSpaceMaps){
+        //没有人员配置
+        if(CollectionUtils.isEmpty(standItemSpaceMaps)){
+            return  BigDecimal.ZERO;
+        }
+        String sourceCode = shareParamType.getSourceCode();
+        //没有维护对应的来源代码
+        if(Objects.isNull(sourceCode)||sourceCode.equals(Constant.EMPTY_STR)){
+            return  BigDecimal.ZERO;
+        }
+        //获取项目对应的使用空间配置
+        List<StandItemSpaceMap> itemSpaceList = standItemSpaceMaps.stream().filter(itemEmp ->!ObjectUtils.isEmpty(ptItem.getDicItem())&&itemEmp.getStandItemCode().equals(ptItem.getDicItem().getStandItemCode())).collect(Collectors.toList());
+        if(CollectionUtils.isEmpty(itemSpaceList)){
+            return  BigDecimal.ZERO;
+        }
+        BigDecimal paramValue=BigDecimal.ZERO;
+        //全部项目
+        if(sourceCode.equals(NumberConstant.ZERO_S)){
+            paramValue = itemSpaceList.stream().map(itemEmp -> itemEmp.getExecuteTime().multiply(itemEmp.getNum())).reduce(BigDecimal.ZERO, BigDecimal::add);
+            return paramValue;
+        }
+        //不是全部的项目时,有可能会是多个
+        List<String> sourceCodeList = StrUtil.split(sourceCode, "|");
+        //获取符合条件的项目
+        List<StandItemSpaceMap> activeItemSpaceList = itemSpaceList.stream().filter(itemEmp -> sourceCodeList.contains(itemEmp.getSpaceCode())).collect(Collectors.toList());
+        if(CollectionUtils.isEmpty(activeItemSpaceList)){
+            return paramValue;
+        }
+        //只统计符合条件的项目
+        paramValue = activeItemSpaceList.stream().map(itemEmp -> itemEmp.getExecuteTime().multiply(itemEmp.getNum())).reduce(BigDecimal.ZERO, BigDecimal::add);
+        return  paramValue;
+    }
+
+    /**
+     * 根据责任中心获取医疗服务项目分类
+     * @param dict
+     * @param shareLevelId
+     * @return
+     */
+    public String getChargeItemType(DictDataVo dict,Long shareLevelId){
+        List<DictDataVo> dataVoList= dict.getDataVoList();
+        if(CollectionUtils.isEmpty(dataVoList)){
+            return NumberConstant.ONE_S;
+        }
+        DictDataVo dictDataVo = dataVoList.stream().filter(dataVo -> dataVo.getValue().equals(shareLevelId.toString())).findFirst().get();
+        return  NumberConstant.ONE_S;
+    }
+
+
+    /**
+     * 执行完全法项目分摊参数计算后续处理脚本
+     * @param computeDate
+     */
+    public void execShareParamCostSQL(String computeDate){
+        Map<String,String> sqlParameter = new HashMap<>();
+        sqlParameter.put(SQLParameter.COMPUTE_DATE_CODE,computeDate);
+        sqlService.autoExecuteSql(CustomSqlTypeEnum.FULL_PROJECT_PARAM_CALC.getCode(),sqlParameter);
     }
 
 
@@ -308,13 +808,24 @@ public class ShareParamServiceImpl implements ShareParamService {
         returnList.add(dataList);
     }
 
+    /**
+     * 标准法项目分摊参数计算
+     * @param computeDate
+     */
+    @Override
+    public void computeStandShareParamCost(String computeDate){
+        //标准法项目分摊参数计算
+        computeStandShareParamCostAction(computeDate);
+        //执行标准法项目分摊参数计算后续处理脚本
+        execStandShareParamCostSQL(computeDate);
+    }
+
     /**
      * 计算标准项目分摊参数
      *
      * @param computeDate 核算年月
      */
-    @Override
-    public void computeStandShareParamCost(String computeDate) {
+    public void computeStandShareParamCostAction(String computeDate) {
         SessionUserVO currentUser = UserContext.getCurrentUser();
         //把当月需要计算数据置成0
 //        importPatientItemRepository.updateGroupCalculateFlag(computeDate, currentUser);
@@ -393,9 +904,17 @@ public class ShareParamServiceImpl implements ShareParamService {
                     computeStandShareParamDetailRepository.saveBatch(saveCostDetails, 500);
                 }
             }
-
         }
+    }
 
+    /**
+     * 执行标准法项目分摊参数计算后续处理脚本
+     * @param computeDate
+     */
+    public void execStandShareParamCostSQL(String computeDate){
+        Map<String,String> sqlParameter = new HashMap<>();
+        sqlParameter.put(SQLParameter.COMPUTE_DATE_CODE,computeDate);
+        sqlService.autoExecuteSql(CustomSqlTypeEnum.STAND_PROJECT_PARAM_CALC.getCode(),sqlParameter);
     }
 
     private void checkItemCount(String computeDate, SessionUserVO currentUser) {

+ 146 - 20
src/main/java/com/kcim/service/impl/SqlServiceImpl.java

@@ -12,11 +12,21 @@ import com.kcim.service.SqlService;
 import com.kcim.vo.DictDataVo;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.ibatis.jdbc.SqlRunner;
+import org.pentaho.di.core.KettleEnvironment;
+import org.pentaho.di.core.exception.KettleException;
+import org.pentaho.di.core.logging.LogLevel;
+import org.pentaho.di.core.parameters.UnknownParamException;
+import org.pentaho.di.job.Job;
+import org.pentaho.di.job.JobMeta;
+import org.pentaho.di.trans.Trans;
+import org.pentaho.di.trans.TransMeta;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 import org.springframework.util.CollectionUtils;
+import org.springframework.util.ObjectUtils;
 import org.springframework.util.StringUtils;
 
+import java.io.File;
 import java.sql.Connection;
 import java.sql.DriverManager;
 import java.sql.SQLException;
@@ -155,36 +165,152 @@ public class SqlServiceImpl implements SqlService {
         return repository.getSqlBySqlType(sqlType);
     }
 
+    /**
+     * 调用自定义SQL
+     * @param sqlType
+     * @param parameter
+     */
     @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{
+            List<Sql> sqlList = getSqlBySqlType(sqlType);
+            //取出需要执行的sql
+            if(!CollectionUtils.isEmpty(sqlList)){
+                sqlList.sort(Comparator.comparing(Sql::getSort,Comparator.nullsLast(Integer::compareTo)));
+                for(Sql sql:sqlList){
+                    if(sql.getDataSourceType().equals(NumberConstant.TWO)) {
+                        //kettle转换
+                        execKettleTrans(sql, sqlType, parameter);
+                    }else if(sql.getDataSourceType().equals(NumberConstant.THREE)){
+                        //kettle作业
+                        execKettleJobs(sql, sqlType, parameter);
+                    }else{
+                        //自定义SQL脚本
+                        execSqlScript(sql, sqlType, parameter);
                     }
                 }
+            }
+        } catch (KettleException e) {
+            throw new CostException(String.format("%s执行失败:%s",sqlType,e.getMessage()));
+        }
+
+    }
+
+    /**
+     * 执行kettle转换
+     * @param sql
+     * @param sqlType
+     * @param parameter
+     */
+    public void execKettleTrans(Sql sql,String sqlType, Map<String, String> parameter) throws KettleException {
+            // 初始化Kettle环境
+            KettleEnvironment.init();
+            // 指定作业文件的路径
+            String filePath = sql.getSql();
+            File transFile = new File(filePath);
+
+            // 检查作业文件是否存在
+            if (!transFile.exists()) {
+                throw new CostException(String.format("%s转换文件不存在!",filePath));
+            }
+            // 加载转换文件
+            TransMeta transMeta = new TransMeta(filePath);
+            Trans trans = new Trans(transMeta);
+            //添加参数
+            parameter.forEach((key,value)-> {
                 try {
-                    SqlRunner sqlRunner = new SqlRunner(getConnection());
-                    log.info("执行的语句"+sqlType+":"+executeSql);
-                    sqlRunner.run(executeSql);
-                } catch (SQLException | ClassNotFoundException e) {
-                    throw new RuntimeException(e);
+                    trans.setParameterValue(key,value );
+                } catch (UnknownParamException e) {
+                    e.printStackTrace();
                 }
+            });
+            //必须要有ParentJob,不然执行会报错
+            if(ObjectUtils.isEmpty(trans.getParentJob())) {
+                Job job = new Job();
+                job.setName("rootJob");
+                trans.setParentJob(job);
+            }
+            // 设置日志级别
+            trans.setLogLevel(LogLevel.BASIC);
+            // 执行转换
+            trans.execute(null);
+            trans.waitUntilFinished();
+            // 检查转换执行情况
+            if (trans.getErrors() > 0) {
+                throw new CostException(String.format("%s转换执行出错:%s",sql.getSqlDefinition(),trans.getErrors()));
             }
+    }
+
+    /**
+     * 执行kettle作业
+     * @param sql
+     * @param sqlType
+     * @param parameter
+     */
+    public void execKettleJobs(Sql sql,String sqlType, Map<String, String> parameter) throws KettleException {
+        // 初始化 Kettle 环境
+        KettleEnvironment.init();
+
+        // 指定作业文件的路径
+        String jobFilePath = sql.getSql();
+        File jobFile = new File(jobFilePath);
+
+        // 检查作业文件是否存在
+        if (!jobFile.exists()) {
+            throw new CostException(String.format("%s作业文件不存在!",jobFilePath));
+        }
+        // 加载作业元数据
+        JobMeta jobMeta = new JobMeta(jobFilePath, null);
+        // 创建作业对象
+        Job job = new Job(null, jobMeta);
+        //添加参数
+        parameter.forEach((key,value)-> {
+            try {
+                job.setParameterValue(key,value );
+            } catch (UnknownParamException e) {
+                e.printStackTrace();
+            }
+        });
+        // 执行作业
+        job.start();
+        // 等待作业完成
+        job.waitUntilFinished();
+        // 检查作业是否成功
+        if (job.getErrors() > 0) {
+            throw new CostException(String.format("%s作业执行出错:%s",sql.getSqlDefinition(),job.getErrors()));
+        }
+    }
+
+    /**
+     * 执行自定义SQL脚本
+     * @param sql
+     * @param sqlType
+     * @param parameter
+     */
+    public void execSqlScript(Sql sql,String sqlType, Map<String, String> parameter) {
+        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());
+            log.info("执行的语句"+sqlType+":"+executeSql);
+            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);

+ 197 - 0
src/main/java/com/kcim/service/impl/UserReportRightServiceImpl.java

@@ -0,0 +1,197 @@
+package com.kcim.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.kcim.common.constants.NumberConstant;
+import com.kcim.common.exception.CostException;
+import com.kcim.common.util.BeanUtil;
+import com.kcim.common.util.PageUtils;
+import com.kcim.dao.mapper.UserReportRightMapper;
+import com.kcim.dao.model.UserReportRight;
+import com.kcim.dao.model.UserResponsibilityRight;
+import com.kcim.dao.repository.UserReportRightRepository;
+import com.kcim.service.CenterService;
+import com.kcim.service.UserReportRightService;
+import com.kcim.service.UserResponsibilityRightService;
+import com.kcim.vo.DictDataVo;
+import com.kcim.vo.UserInfoVO;
+import com.kcim.vo.UserReportRightVO;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+import org.springframework.util.ObjectUtils;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import static com.kcim.common.constants.Constant.PROFIT_REPORT_TYPE;
+import static com.kcim.common.constants.ParameterConstant.USER_REPORT_AUTHOR_ABLE;
+
+
+/**
+ * 用户报表权限
+ * @author
+ */
+@Service("UserReportRightService")
+@Slf4j
+@AllArgsConstructor
+public class UserReportRightServiceImpl extends ServiceImpl<UserReportRightMapper, UserReportRight> implements UserReportRightService {
+
+    private final CenterService centerService;
+    private UserReportRightRepository repository;
+    private UserResponsibilityRightService userResponsibilityRightService;
+
+    /**
+     * 获取用户有权限的损益报表
+     * @return
+     */
+    @Override
+    public DictDataVo getUserReports() {
+        DictDataVo dictDataVo = centerService.getDict(PROFIT_REPORT_TYPE);
+        //没开启数据权限流程时返回所有
+        if(!IsUserReportRightAble())
+        {
+            return dictDataVo;
+        }
+        List<UserReportRight> userReportRight = repository.getList();
+        if(CollectionUtils.isEmpty(userReportRight)){
+            throw new CostException("您没有分分配损益报表权限,请联系管理员");
+        }
+        //筛选出有权限的责任中心对象
+        List<DictDataVo> dictDataVoList = dictDataVo.getDataVoList().stream().filter(dictData ->
+                userReportRight.stream().anyMatch(userRight ->
+                        userRight.getReportCode().equals(dictData.getCode()))).collect(Collectors.toList());
+        if(CollectionUtils.isEmpty(dictDataVoList)){
+            throw new CostException("您没有对应的损益报表权限,请联系管理员");
+        }
+        //只返回有权限的损益报表
+        dictDataVo.setDataVoList(dictDataVoList);
+        return dictDataVo;
+    }
+
+
+    /**
+     * 获取用户列表
+     * @param userName
+     * @return
+     */
+    @Override
+    public Object getUserList(Integer current, Integer pageSize, String userName) {
+        List<UserInfoVO> centerUserInfo = centerService.getCenterUserInfo(userName);
+        //判断是否有维护过责任中心权限
+        List<UserResponsibilityRight> userResponsibilityRight = userResponsibilityRightService.getUserResponsibilityRight();
+        if(!CollectionUtils.isEmpty(userResponsibilityRight)){
+            //获取所有用户ID并去重
+            List<Long> userList = userResponsibilityRight.stream().map(UserResponsibilityRight::getUserId).distinct().collect(Collectors.toList());
+            //找出所有配置过责任中心权限的用户
+            List<UserInfoVO> userInfoVOS = centerUserInfo.stream().filter(userInfo -> userList.contains(userInfo.getId())).collect(Collectors.toList());
+            if(!CollectionUtils.isEmpty(userInfoVOS)){
+                //设置是否配置标识
+                userInfoVOS.stream().forEach(userInfo ->userInfo.setUserStatus(NumberConstant.ONE));
+            }
+        }
+        //判断是否有维护过损益报表权限
+        List<UserReportRight> userReportRight = repository.getList();
+        if(!CollectionUtils.isEmpty(userReportRight)){
+            //获取所有用户ID并去重
+            List<Long> userList = userReportRight.stream().map(UserReportRight::getUserId).distinct().collect(Collectors.toList());
+            //找出所有配置过损益报表权限的用户
+            List<UserInfoVO> userInfoVOS = centerUserInfo.stream().filter(userInfo ->userList.contains(userInfo.getId())).collect(Collectors.toList());
+            if(!CollectionUtils.isEmpty(userInfoVOS)){
+                //设置是否配置标识
+                userInfoVOS.stream().forEach(userInfo ->userInfo.setUserStatus(NumberConstant.ONE));
+            }
+        }
+        PageUtils pageUserInfo = new PageUtils(new ArrayList<>(), NumberConstant.ZERO,pageSize,current);
+        if(CollectionUtils.isEmpty(centerUserInfo)){
+            return pageUserInfo;
+        }
+        pageUserInfo = new PageUtils(centerUserInfo, centerUserInfo.size(), pageSize, current);
+        return pageUserInfo;
+    }
+
+    /**
+     * 获取用户有权限的损益报表列表
+     * @param userId
+     * @param reportName
+     * @param hideFlag
+     * @return
+     */
+    @Override
+    public List<UserReportRightVO> getUserReportRights(Long userId,String reportName, Integer hideFlag) {
+        DictDataVo dictDataVo = centerService.getDict(PROFIT_REPORT_TYPE);
+        //没开启数据权限流程时返回所有
+        if(!ObjectUtils.isEmpty(dictDataVo)||CollectionUtils.isEmpty(dictDataVo.getDataVoList()))
+        {
+            throw new CostException("找不到有效的损益报表,请先维护损益报表字典");
+        }
+        //转成出参对象
+        List<UserReportRightVO> userReportRightVOList = dictDataVo.getDataVoList().stream().map(dataVo -> convertToReportRightVO(dataVo,userId)).collect(Collectors.toList());
+        //获取用户有权限的损益报表
+        List<UserReportRight> userReportRight = repository.getList();
+        if(!CollectionUtils.isEmpty(userReportRight)){
+            //只取reportCode
+            List<String> reportCodeList = userReportRight.stream().map(UserReportRight::getReportCode).distinct().collect(Collectors.toList());
+            //设置选择标志
+            userReportRightVOList.stream().forEach(userReport->
+                    userReport.setStatus(reportCodeList.contains(userReport.getReportCode())?NumberConstant.ONE:NumberConstant.ZERO));
+        }
+        return userReportRightVOList;
+    }
+
+
+    /**
+     * 编辑用户损益报表权限
+     * @param userReportRightVO
+     */
+    @Override
+    public void editUserReportRight(UserReportRightVO userReportRightVO) {
+        UserReportRight userReportRight = BeanUtil.convertObj(userReportRightVO, UserReportRight.class);
+        if(userReportRightVO.getStatus().equals(NumberConstant.ONE)){
+            repository.addUserReportRight(userReportRight);
+        }else{
+            repository.deleteUserReportRight(userReportRight);
+        }
+    }
+
+    /**
+     * 修改指定用户的损益报表权限
+     * @param userId
+     * @param reportCode
+     * @param status
+     */
+    @Override
+    public void editUserReportRight(Long userId, String reportCode, Integer status) {
+        if(status.equals(NumberConstant.ONE)){
+            repository.addUserReportRight(userId,reportCode);
+        }else{
+            repository.deleteUserReportRight(userId,reportCode);
+        }
+    }
+
+    /**
+     * 转成损益报表出参对象
+     * @param dictDataVo
+     * @return
+     */
+    public UserReportRightVO convertToReportRightVO(DictDataVo dictDataVo,Long userId){
+        UserReportRightVO userReportRightVO=new UserReportRightVO();
+        userReportRightVO.setReportCode(dictDataVo.getCode());
+        userReportRightVO.setReportName(dictDataVo.getName());
+        userReportRightVO.setUserId(userId);
+        return userReportRightVO;
+    }
+
+    /**
+     * 判断是否开启用户报表权限功能
+     * @return
+     */
+    public boolean IsUserReportRightAble(){
+        String parameterValue = centerService.getParameterValue(USER_REPORT_AUTHOR_ABLE);
+        if (parameterValue.isEmpty()){
+            return false;
+        }
+        return parameterValue.equals(NumberConstant.ONE_S);
+    }
+}

+ 184 - 0
src/main/java/com/kcim/service/impl/UserResponsibilityRightServiceImpl.java

@@ -0,0 +1,184 @@
+package com.kcim.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.kcim.common.constants.NumberConstant;
+import com.kcim.common.exception.CostException;
+import com.kcim.common.util.BeanUtil;
+import com.kcim.dao.mapper.UserResponsibilityRightMapper;
+import com.kcim.dao.model.Responsibility;
+import com.kcim.dao.model.UserResponsibilityRight;
+import com.kcim.dao.repository.UserResponsibilityRightRepository;
+import com.kcim.service.CenterService;
+import com.kcim.service.ResponsibilityService;
+import com.kcim.service.UserResponsibilityRightService;
+import com.kcim.vo.CommonParameterVo;
+import com.kcim.vo.CostResponsibilityVO;
+import com.kcim.vo.UserResponsibilityRightVO;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Propagation;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.CollectionUtils;
+
+import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+import static com.kcim.common.constants.ParameterConstant.USER_REPORT_AUTHOR_ABLE;
+
+
+/**
+ *
+ * @author Administrator
+ */
+@Service("UserResponsibilityRightService")
+@Slf4j
+@AllArgsConstructor
+public class UserResponsibilityRightServiceImpl extends ServiceImpl<UserResponsibilityRightMapper, UserResponsibilityRight> implements UserResponsibilityRightService {
+
+
+    UserResponsibilityRightRepository repository;
+    ResponsibilityService responsibilityService;
+    CenterService centerService;
+
+    /**
+     * 获取当前用户有权限的责任中心信息
+     * @return
+     */
+    @Override
+    public List<UserResponsibilityRight> getUserResponsibilityRight(){
+        return  repository.getList();
+    }
+
+    /**
+     * 获取用户的责任中心权限列表
+     * @param responsibilityName
+     * @param hideFlag
+     * @return
+     */
+    @Override
+    public List<UserResponsibilityRightVO> getUserResponsibilityRights(Long userId,String responsibilityName, Integer hideFlag) {
+        List<CostResponsibilityVO> responsibilityList = responsibilityService.getList( );
+        //没开启数据权限流程时返回所有
+        if(CollectionUtils.isEmpty(responsibilityList))
+        {
+            throw new CostException("找不到有效的责任中心,请先维护责任中心字典");
+        }
+        //转成出参对象
+        List<UserResponsibilityRightVO> userReportRightVOList = responsibilityList.stream().map(responsibility -> convertToResponsibilityRightVO(responsibility,userId)).collect(Collectors.toList());
+        //获取用户有权限的损益报表
+        List<UserResponsibilityRight> userResponsibilityRightList = repository.getList();
+        if(!CollectionUtils.isEmpty(userResponsibilityRightList)){
+            //只取责任中心代码
+            List<String> responsibilityCodeList = userResponsibilityRightList.stream().map(UserResponsibilityRight::getResponsibilityCode).distinct().collect(Collectors.toList());
+            //设置选择标志
+            userReportRightVOList.stream().forEach(responsibility->
+                    responsibility.setStatus(responsibilityCodeList.contains(responsibility.getResponsibilityCode())? NumberConstant.ONE:NumberConstant.ZERO));
+        }
+        return userReportRightVOList;
+    }
+
+    /**
+     * 转成用户责任中心权限对象
+     * @param responsibilityVO
+     * @return
+     */
+    public UserResponsibilityRightVO convertToResponsibilityRightVO(CostResponsibilityVO responsibilityVO, Long userId){
+        UserResponsibilityRightVO userResponsibilityRightVO = BeanUtil.convertObj(responsibilityVO, UserResponsibilityRightVO.class);
+        userResponsibilityRightVO.setUserId(userId);
+        return userResponsibilityRightVO;
+    }
+
+
+    /**
+     * 编辑用户损益报表权限
+     * @param uerResponsibilityRightVO
+     */
+    @Override
+    public void editUserResponsibilityRight(UserResponsibilityRightVO uerResponsibilityRightVO) {
+        UserResponsibilityRight userResponsibilityRight = BeanUtil.convertObj(uerResponsibilityRightVO, UserResponsibilityRight.class);
+        if(uerResponsibilityRightVO.getStatus().equals(NumberConstant.ONE)){
+            repository.addUserResponsibilityRight(userResponsibilityRight);
+        }else{
+            repository.deleteUserResponsibilityRight(userResponsibilityRight);
+        }
+    }
+
+    /**
+     * 修改指定用户的责任中心权限
+     * @param userId
+     * @param responsibilityCode
+     * @param status
+     */
+    @Override
+    public void editUserResponsibilityRight(Long userId, String responsibilityCode, Integer status) {
+        if(status.equals(NumberConstant.ONE)){
+            repository.addUserResponsibilityRight(userId,responsibilityCode);
+        }else{
+            repository.deleteUserResponsibilityRight(userId,responsibilityCode);
+        }
+    }
+
+    /**
+     * 给用户添加所有损益报表权限
+     * @param userId
+     */
+    @Override
+    @Transactional(rollbackFor = Throwable.class,propagation = Propagation.REQUIRED)
+    public void editAllUserResponsibilityRight(Long userId,Integer allRightFlag) {
+        //先移除已有的所有权限
+        List<UserResponsibilityRight> userResponsibilityRightList = repository.getListByUserId(userId);
+        repository.removeUserResponsibilityRightList(userResponsibilityRightList);
+        //新增一条特殊的全部权限则记录
+        if(allRightFlag.equals(NumberConstant.ONE)){
+            //组装核算单元为0的数据
+            repository.addUserResponsibilityRight(userId,String.valueOf(NumberConstant.ZERO));
+        }
+    }
+
+    /**
+     * 获取授权的责任中心
+     * @param fullResponsibilityList
+     * @return
+     */
+    @Override
+    public List<Responsibility> getAuthorizedResponsibility(List<Responsibility> fullResponsibilityList){
+        //开启用户报表数据权限时
+        if(IsUserReportRightAble()){
+            //获取用户所有有权限的责任中心
+            List<UserResponsibilityRight> currentUserResponsibilityRights = this.getUserResponsibilityRight();
+            if(CollectionUtils.isEmpty(currentUserResponsibilityRights)){
+                throw new CostException("您没有分配责任中心权限,请联系管理员");
+            }
+            //如果不是分配了全部责任中心权限则过滤没有权限的责任中心
+            if(!currentUserResponsibilityRights.stream().anyMatch(userResponsibilityRight->
+                    userResponsibilityRight.getResponsibilityCode().equals(NumberConstant.ZERO_S))){
+                //筛选出有权限的责任中心对象
+                fullResponsibilityList = fullResponsibilityList.stream().filter(responsibility ->
+                        currentUserResponsibilityRights.stream().anyMatch(userRight ->
+                                userRight.getResponsibilityCode().equals(responsibility.getResponsibilityCode()))).collect(Collectors.toList());
+                if(CollectionUtils.isEmpty(fullResponsibilityList)){
+                    throw new CostException("您没有对应的责任中心权限,请联系管理员");
+                }
+            }
+        }
+        return fullResponsibilityList;
+    }
+
+    /**
+     * 判断是否开启用户报表权限功能
+     * @return
+     */
+    @Override
+    public boolean IsUserReportRightAble(){
+        CommonParameterVo parameter = centerService.getParameter(USER_REPORT_AUTHOR_ABLE);
+        if (Objects.isNull(parameter)){
+            return false;
+        }
+        String incomeCollectType = parameter.getValue();
+        return incomeCollectType.equals(NumberConstant.ONE_S);
+    }
+
+
+}

+ 8 - 0
src/main/java/com/kcim/vo/ComputeShareParamDetailVo.java

@@ -14,8 +14,12 @@ import java.math.BigDecimal;
 public class ComputeShareParamDetailVo {
      private String responsibilityCode;
 
+     private String responsibilityName;
+
      private String code;
 
+     private String name;
+
      private String shareParamCode;
 
      private BigDecimal computeResult;
@@ -26,6 +30,10 @@ public class ComputeShareParamDetailVo {
 
      private BigDecimal computeSingleResult;
 
+     private BigDecimal standComputeResult;
+
+     private BigDecimal standComputeSingleResult;
+
      private String orderCode;
 
      private String itemType;

+ 1 - 2
src/main/java/com/kcim/vo/CostResponsibilityProfitVo.java

@@ -2,9 +2,7 @@ package com.kcim.vo;
 
 import lombok.Data;
 
-import java.math.BigDecimal;
 import java.util.List;
-import java.util.Map;
 
 /**
  * @program: CostAccount
@@ -19,6 +17,7 @@ public class CostResponsibilityProfitVo {
 
     private String responsibilityName;
 
+    private Integer sort;
 
 
     private List<CommonDataReportVo> profitList;

+ 4 - 0
src/main/java/com/kcim/vo/ReportTitleVo.java

@@ -36,6 +36,10 @@ public class ReportTitleVo {
 
     private Integer freeze;
 
+    private Integer decimalPlace;
+
+    private boolean permil = false;
+
     private List<RedirectData> redirectData;
 
     private List<CommonTitleVo> childTitle;

+ 9 - 0
src/main/java/com/kcim/vo/ResponsibilityDepartIdVO.java

@@ -13,8 +13,17 @@ public class ResponsibilityDepartIdVO {
 
     private Long departmentId;
 
+    private String departmentCode;
+
+    private String departmentName;
+
+    private Long responsibilityId;
+
     private String responsibilityCode;
 
     private String responsibilityName;
 
+    private Long shareId;
+
+    private Integer shareLevel;
 }

+ 4 - 0
src/main/java/com/kcim/vo/SessionUserVO.java

@@ -39,4 +39,8 @@ public class SessionUserVO {
     private Long currentLoginHospId;
 
     // TODO: 2022/1/4 按业务需求新增
+
+    private Long orgnId;
+
+    private String orgnName;
 }

+ 6 - 1
src/main/java/com/kcim/vo/UserInfoVO.java

@@ -1,10 +1,10 @@
 package com.kcim.vo;
 
+import com.kcim.common.constants.NumberConstant;
 import io.swagger.annotations.ApiModel;
 import lombok.*;
 
 import java.util.Date;
-import java.util.List;
 
 /**
  * 我的主页 用户信息相关
@@ -124,6 +124,11 @@ public class UserInfoVO {
 
     private Integer employeeId;
 
+    /**
+     * 用户状态 0未设置 1已设置
+     */
+    private Integer userStatus= NumberConstant.ZERO;
+
     
 
 

+ 36 - 0
src/main/java/com/kcim/vo/UserReportRightVO.java

@@ -0,0 +1,36 @@
+package com.kcim.vo;
+
+import com.kcim.common.constants.NumberConstant;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.*;
+
+/**
+ * 用户损益表权限
+ */
+@Getter
+@Setter
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+@ApiModel
+public class UserReportRightVO {
+
+    @ApiModelProperty(name = "userId",value = "中台用户ID")
+    private Long userId;
+
+    @ApiModelProperty(name = "account",value = "用户工号")
+    private String account;
+
+    @ApiModelProperty(name = "reportName", value = "损益报表名称")
+    private String reportName;
+
+    @ApiModelProperty(name = "reportCode", value = "损益报表代码")
+    private String reportCode;
+
+    /**
+     * 选择标志 0未选择 1已选择
+     */
+    @ApiModelProperty(name = "status", value = "选择标志")
+    private Integer status= NumberConstant.ZERO;
+}

+ 82 - 0
src/main/java/com/kcim/vo/UserResponsibilityRightVO.java

@@ -0,0 +1,82 @@
+package com.kcim.vo;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.kcim.common.constants.NumberConstant;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.*;
+
+/**
+ * 用户责任中心权限
+ */
+@Getter
+@Setter
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+@ApiModel
+public class UserResponsibilityRightVO {
+
+    @ApiModelProperty(name = "id",value = "用户责任中心权限的Id")
+    private Long id;
+
+    @ApiModelProperty(name = "userId",value = "中台用户ID")
+    private Long userId;
+
+    @ApiModelProperty(name = "account",value = "用户工号")
+    private String account;
+
+    @ApiModelProperty(name = "responsibilityName", value = "责任中心名称")
+    private String responsibilityName;
+
+    @ApiModelProperty(name = "responsibilityCode", value = "责任中心代码")
+    private String responsibilityCode;
+
+    @ApiModelProperty(name = "responsibilityLevel", value = "责任级别(第一级为1,以此类推)")
+    private Integer responsibilityLevel;
+
+    @ApiModelProperty(name = "isGatherCenter", value = "是否汇总中心1.是,2.不是")
+    private Integer isGatherCenter;
+
+    @ApiModelProperty(name = "responsibilityType", value = "责任类型 1. 收费中心,2.成本(费用)中心")
+    private Integer responsibilityType;
+
+    @ApiModelProperty(name = "shareId", value = "分摊层级Id")
+    /**
+     * 分摊级别的Id
+     */
+    private Long shareId;
+
+    @ApiModelProperty(name = "shareLevel", value = "分摊级别 如果是顶层默认为0")
+    private Integer shareLevel;
+
+    @ApiModelProperty(name = "shareName", value = "分摊级别名称")
+    private String shareName;
+
+    @ApiModelProperty(name = "deptStatus", value = "责任中心状态,0.门诊,1.住院")
+    private Integer isDefault;
+
+    /**
+     * 标准分摊层级
+     */
+    private String standardShareLevel;
+
+    /**
+     * 标准分摊层级名称
+     */
+    @TableField(exist = false)
+    private String standardShareLevelName;
+
+    /**
+     * 责任中心类型
+     */
+    private String type;
+    @TableField(exist = false)
+    private String typeName;
+
+    /**
+     * 选择标志 0未选择 1已选择
+     */
+    @ApiModelProperty(name = "status", value = "选择标志")
+    private Integer status= NumberConstant.ZERO;
+}

+ 30 - 3
src/main/java/com/kcim/web/ExcelController.java

@@ -25,8 +25,6 @@ import com.kcim.service.impl.DepartmentServiceImpl;
 import com.kcim.service.impl.ProductServiceImpl;
 import com.kcim.vo.ResponsibilityDepartIdVO;
 import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiImplicitParam;
-import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.poi.ss.usermodel.Sheet;
@@ -523,7 +521,7 @@ public class ExcelController extends AbstractController {
 //
 //    }
     @ApiOperation("分摊报表输出2.0")
-    @GetMapping("/getShareReportTemplate")
+    @GetMapping("/getTemplate")
     public void getTemplate(HttpServletResponse response, Integer levelSort, String token, Integer year, Integer month, Long shareLevelId) throws IOException {
 //        int userId = jwtUtil.getUserId(token);
 //        User user = userService.getById(userId);
@@ -554,6 +552,35 @@ public class ExcelController extends AbstractController {
 
     }
 
+    @ApiOperation("分摊报表输出")
+    @GetMapping("/getShareReportTemplate")
+    public void getShareReportTemplate(HttpServletResponse response, Integer levelSort, Integer year, Integer month, Long shareLevelId) throws IOException {
+
+        ExcelWriter writer =ExcelUtil.getWriter(true);
+        Sheet sheet = writer.getSheet();
+        CostShareLevel service = shareLevelService.getById(shareLevelId);        // 第几次分摊
+        writer = allocationService.getShareReportTemplate(writer, levelSort, sheet, year, month, shareLevelId);
+
+        String fileName = service.getShareName() + "分摊.xlsx";
+        String headerKey = "Content-Disposition";
+        String encodedFileName = URLEncoder.encode(fileName, "UTF-8");
+        // 设置响应头
+        response.setCharacterEncoding("UTF-8");
+        //设置文件格式为.xlsx
+        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
+        response.setHeader(headerKey, encodedFileName);
+
+        // 获取响应的输出流
+        ServletOutputStream out = response.getOutputStream();
+
+        // 将Excel内容写入响应的输出流中
+        writer.flush(out, true);
+
+        // 关闭ExcelWriter和输出流
+        writer.close();
+        out.close();
+    }
+
     /**
      * 获取执行类型的成本项目
      *

+ 9 - 5
src/main/java/com/kcim/web/HospProfitAndLossController.java

@@ -7,6 +7,7 @@ import com.kcim.service.HospProfitAndLossService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
+import org.springframework.util.ObjectUtils;
 import org.springframework.web.bind.annotation.*;
 
 @Api(tags = "全院损益相关")
@@ -20,12 +21,15 @@ public class HospProfitAndLossController extends AbstractController {
         this.hospProfitAndLossService = hospProfitAndLossService;
     }
 
-
-    @ApiOperation("计算全院损益")
+    @ApiOperation("计算指定类型报表的全院损益")
     @PostMapping("/calc")
-    public Result calc(@RequestParam @ApiParam(name = "date", value = "yyyy-MM-dd") String date) {
-//        hospProfitAndLossService.calc(date, getHospId());
-        hospProfitAndLossService.calcByResponsibility(date, getHospId());
+    public Result calcHospProfit(@RequestParam @ApiParam(name = "date", value = "yyyy-MM-dd") String date,
+                                 @RequestParam(name = "reportType",required = false) Integer reportType) {
+        if(ObjectUtils.isEmpty(reportType)){
+            hospProfitAndLossService.calcByResponsibility(date, getHospId());
+        }else{
+            hospProfitAndLossService.calcHospProfit(date, getHospId(),reportType);
+        }
         return Result.ok();
     }
 

+ 84 - 0
src/main/java/com/kcim/web/UserReportRightController.java

@@ -0,0 +1,84 @@
+package com.kcim.web;
+
+import com.kcim.common.util.Result;
+import com.kcim.service.UserReportRightService;
+import com.kcim.service.UserResponsibilityRightService;
+import com.kcim.vo.UserReportRightVO;
+import com.kcim.vo.UserResponsibilityRightVO;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * 用户报表权限相关操作
+ */
+@RestController
+@RequestMapping("/userReportRight")
+@Api(tags = "用户报表权限相关操作")
+public class UserReportRightController {
+    @Autowired
+    private UserReportRightService userReportRightService;
+    @Autowired
+    private UserResponsibilityRightService userResponsibilityRightService;
+
+
+    @GetMapping("/getUserReports")
+    @ApiOperation("查询用户有权限的损益报表")
+    public Result getUserReports(){
+        return Result.ok(userReportRightService.getUserReports());
+    }
+
+    @ApiOperation("获取用户列表")
+    @GetMapping("/getUserList")
+    public Result getUserList(@RequestParam(value = "current", defaultValue = "1") Integer current,
+                              @RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize,
+                              @RequestParam(value = "name", required = false) String userName) {
+        return Result.ok(userReportRightService.getUserList(current,pageSize,userName));
+    }
+
+    @ApiOperation("获取用户损益报表权限列表")
+    @GetMapping("/getUserReportRights")
+    public Result getUserReportRights(@RequestParam(value = "userId") Long userId,
+                                      @RequestParam(value = "reportName", required = false) String reportName,
+                                      @RequestParam(value = "hideFlag", defaultValue = "0") Integer hideFlag) {
+        return Result.ok(userReportRightService.getUserReportRights(userId,reportName,hideFlag));
+    }
+
+    @ApiOperation("修改用户损益报表权限")
+    @PostMapping("/editUserReportRight")
+    public Result editUserReportRight(@RequestBody UserReportRightVO userReportRightVO) {
+        userReportRightService.editUserReportRight(userReportRightVO);
+        return Result.ok();
+    }
+
+    /**
+     * 获取用户责任中心权限列表
+     * @param responsibilityName 责任呢中心代码/名称
+     * @param hideFlag
+     * @return
+     */
+    @ApiOperation("获取用户责任中心权限列表")
+    @GetMapping("/getUserResponsibilityRights")
+    public Result getUserResponsibilityRights(@RequestParam(value = "userId") Long userId,
+                                              @RequestParam(value = "responsibilityName", required = false) String responsibilityName,
+                                              @RequestParam(value = "hideFlag", defaultValue = "0") Integer hideFlag) {
+        return Result.ok(userResponsibilityRightService.getUserResponsibilityRights(userId,responsibilityName,hideFlag));
+    }
+
+    @ApiOperation("修改用户损益报表权限")
+    @PostMapping("/editUserResponsibilityRight")
+    public Result editUserResponsibilityRight(@RequestBody UserResponsibilityRightVO uerResponsibilityRightVO) {
+        userResponsibilityRightService.editUserResponsibilityRight(uerResponsibilityRightVO);
+        return Result.ok();
+    }
+
+    @ApiOperation("修改用户的所有损益报表权限")
+    @PostMapping("/editAllUserResponsibilityRight")
+    public Result editAllUserResponsibilityRight(@RequestParam(value = "userId") Long userId,
+                                                @RequestParam(value = "allRightFlag", defaultValue = "0") Integer allRightFlag) {
+        userResponsibilityRightService.editAllUserResponsibilityRight(userId,allRightFlag);
+        return Result.ok();
+    }
+
+}

+ 1 - 0
src/main/resources/mapper/AllocationMapper.xml

@@ -79,6 +79,7 @@
         where date_year = #{year}
           and date_month = #{month}
           and hosp_id = #{hospId}
+          and delete_time=0
         group by share_level_id
     </select>
 

+ 50 - 2
src/main/resources/mapper/ComputeShareParamMapper.xml

@@ -78,13 +78,16 @@
     <select id="getComputeShareParamDetail" resultType="com.kcim.vo.ComputeShareParamDetailVo">
         SELECT
             a.item_type,
-
             a.responsibility_code,
+            a.`responsibility_name`,
             sum(a.num) as num,
             a.`code`,
+            a.`name`,
             b.share_param_code,
             sum(b.compute_result) as compute_result,
-            sum(b.compute_single_result) as compute_single_result
+            sum(b.compute_single_result) as compute_single_result,
+            sum(b.stand_compute_result) as stand_compute_result,
+            sum(b.stand_compute_single_result) as stand_compute_single_result
         FROM
             compute_share_param a
                 LEFT JOIN compute_share_param_detail b ON a.id = b.share_param_id
@@ -101,5 +104,50 @@
             a.`code`,a.item_type
     </select>
 
+    <select id="getComputeShareParamDetailGroup" resultType="com.kcim.vo.ComputeShareParamDetailVo">
+        SELECT
+            a.item_type,
+            a.responsibility_code,
+            sum(a.num) as num,
+            b.share_param_code,
+            sum(b.compute_result) as compute_result,
+            sum(b.compute_single_result) as compute_single_result,
+            sum(b.stand_compute_result) as stand_compute_result,
+            sum(b.stand_compute_single_result) as stand_compute_single_result
+        FROM
+            compute_share_param a
+                LEFT JOIN compute_share_param_detail b ON a.id = b.share_param_id
+                AND b.del_flag = 0
+        WHERE
+            a.compute_date = #{computeDate,jdbcType=VARCHAR}
+          AND b.compute_date = #{computeDate,jdbcType=VARCHAR}
+          AND a.del_flag = 0
+          AND b.hosp_id = #{hospId,jdbcType=BIGINT}
+          AND a.hosp_id = #{hospId,jdbcType=BIGINT}
+        GROUP BY
+            a.responsibility_code,
+            b.share_param_code,
+            a.item_type
+    </select>
+
+    <select id="getComputeResponsibilityItem" resultType="com.kcim.vo.ComputeShareParamDetailVo">
+        SELECT
+            a.item_type,
+            a.responsibility_code,
+            a.`responsibility_name`,
+            sum(a.num) as num,
+            a.`code`,
+            a.`name`
+        FROM
+            compute_share_param a
+        WHERE
+            a.compute_date = #{computeDate,jdbcType=VARCHAR}
+          AND a.del_flag = 0
+          AND a.hosp_id = #{hospId,jdbcType=BIGINT}
+        GROUP BY
+            a.responsibility_code,
+            a.`code`,a.item_type
+    </select>
+
 
 </mapper>

+ 15 - 6
src/main/resources/mapper/ResponsibilityDepartmentMapper.xml

@@ -20,12 +20,21 @@
         where crd.responsibility_id = #{responsibilityId} and crd.delete_time = 0 and sd.delete_time = 0
     </select>
     <select id="getResponsibility" resultType="com.kcim.vo.ResponsibilityDepartIdVO">
-        select b.department_id,a.responsibility_code,a.responsibility_name from cost_responsibility a
-          left JOIN cost_responsibility_department b on a.id = b.responsibility_id
-            and b.delete_time = 0
-        where a.hosp_id = #{hospId}
-          and b.hosp_id =#{hospId}
-          and a.delete_time = 0
+        SELECT
+            b.department_id,
+            b.responsibility_id,
+            a.responsibility_code,
+            a.responsibility_name,
+            a.share_level,
+            a.share_id
+        FROM
+            cost_responsibility a
+                INNER JOIN cost_responsibility_department b ON a.id = b.responsibility_id
+                AND b.delete_time = 0
+                AND b.hosp_id = #{hospId}
+        WHERE
+            a.hosp_id = #{hospId}
+          AND a.delete_time = 0
     </select>