Преглед изворни кода

1 添加会计科目与 收费项目对照

wangyongsheng пре 1 година
родитељ
комит
fcce24dc98
70 измењених фајлова са 2112 додато и 194 уклоњено
  1. 8 0
      src/main/java/com/kcim/common/util/excel/entity/PatientInfoImportEntity.java
  2. 10 0
      src/main/java/com/kcim/common/util/excel/entity/PatientItemImportEntity.java
  3. 34 0
      src/main/java/com/kcim/common/util/excel/entity/ProductTemplateEntity.java
  4. 16 0
      src/main/java/com/kcim/dao/mapper/AccountingItemMapMapper.java
  5. 3 1
      src/main/java/com/kcim/dao/mapper/ComputeItemCostMapper.java
  6. 3 1
      src/main/java/com/kcim/dao/mapper/ImportPatientItemMapper.java
  7. 16 0
      src/main/java/com/kcim/dao/mapper/OrderCostDetailMapper.java
  8. 25 0
      src/main/java/com/kcim/dao/mapper/OrderCostMapper.java
  9. 5 0
      src/main/java/com/kcim/dao/model/Accounting.java
  10. 100 0
      src/main/java/com/kcim/dao/model/AccountingItemMap.java
  11. 9 0
      src/main/java/com/kcim/dao/model/ComputeItemCost.java
  12. 3 0
      src/main/java/com/kcim/dao/model/DiseaseType.java
  13. 18 0
      src/main/java/com/kcim/dao/model/ImportPatientInfo.java
  14. 9 0
      src/main/java/com/kcim/dao/model/ImportPatientItem.java
  15. 103 0
      src/main/java/com/kcim/dao/model/OrderCost.java
  16. 94 0
      src/main/java/com/kcim/dao/model/OrderCostDetail.java
  17. 3 1
      src/main/java/com/kcim/dao/model/OrderItemMap.java
  18. 2 2
      src/main/java/com/kcim/dao/model/dto/AccountingSaveDTO.java
  19. 80 0
      src/main/java/com/kcim/dao/model/dto/ComputeItemGroupByOrder.java
  20. 80 0
      src/main/java/com/kcim/dao/model/dto/ComputeOrderCostPageDto.java
  21. 10 0
      src/main/java/com/kcim/dao/model/dto/PatientItemVo.java
  22. 63 0
      src/main/java/com/kcim/dao/repository/AccountingItemMapRepository.java
  23. 8 0
      src/main/java/com/kcim/dao/repository/AccountingRepository.java
  24. 4 0
      src/main/java/com/kcim/dao/repository/ComputeItemCostRepository.java
  25. 27 5
      src/main/java/com/kcim/dao/repository/DiseaseTypeDiagMapRepository.java
  26. 3 1
      src/main/java/com/kcim/dao/repository/DiseaseTypeRepository.java
  27. 4 0
      src/main/java/com/kcim/dao/repository/ImportPatientItemRepository.java
  28. 3 1
      src/main/java/com/kcim/dao/repository/ItemRepository.java
  29. 33 0
      src/main/java/com/kcim/dao/repository/OrderCostDetailRepository.java
  30. 48 0
      src/main/java/com/kcim/dao/repository/OrderCostRepository.java
  31. 7 0
      src/main/java/com/kcim/dao/repository/OrderItemMapRepository.java
  32. 1 1
      src/main/java/com/kcim/dao/repository/OrderRepository.java
  33. 2 1
      src/main/java/com/kcim/dao/repository/StandItemRepository.java
  34. 26 0
      src/main/java/com/kcim/service/AccountingItemMapService.java
  35. 3 1
      src/main/java/com/kcim/service/DrugService.java
  36. 3 1
      src/main/java/com/kcim/service/ItemService.java
  37. 3 1
      src/main/java/com/kcim/service/MaterialService.java
  38. 13 0
      src/main/java/com/kcim/service/OrderCostDetailService.java
  39. 16 0
      src/main/java/com/kcim/service/OrderCostService.java
  40. 1 1
      src/main/java/com/kcim/service/OrderService.java
  41. 6 2
      src/main/java/com/kcim/service/ProductService.java
  42. 270 0
      src/main/java/com/kcim/service/impl/AccountingItemMapServiceImpl.java
  43. 1 1
      src/main/java/com/kcim/service/impl/AccountingServiceImpl.java
  44. 14 1
      src/main/java/com/kcim/service/impl/ComputeDiseaseCostServiceImpl.java
  45. 2 0
      src/main/java/com/kcim/service/impl/ComputeItemCostServiceImpl.java
  46. 31 12
      src/main/java/com/kcim/service/impl/DepartmentServiceImpl.java
  47. 31 6
      src/main/java/com/kcim/service/impl/DiseaseTypeDiagMapServiceImpl.java
  48. 1 1
      src/main/java/com/kcim/service/impl/DrugServiceImpl.java
  49. 1 1
      src/main/java/com/kcim/service/impl/ItemServiceImpl.java
  50. 1 1
      src/main/java/com/kcim/service/impl/MaterialServiceImpl.java
  51. 12 0
      src/main/java/com/kcim/service/impl/OrderCostDetailServiceImpl.java
  52. 202 0
      src/main/java/com/kcim/service/impl/OrderCostServiceImpl.java
  53. 91 32
      src/main/java/com/kcim/service/impl/OrderServiceImpl.java
  54. 76 11
      src/main/java/com/kcim/service/impl/PatientInfoImportServiceImpl.java
  55. 2 0
      src/main/java/com/kcim/service/impl/PatientItemImportServiceImpl.java
  56. 93 16
      src/main/java/com/kcim/service/impl/ProductServiceImpl.java
  57. 35 27
      src/main/java/com/kcim/service/impl/ReportServiceImpl.java
  58. 20 0
      src/main/java/com/kcim/web/CostCalculateController.java
  59. 91 43
      src/main/java/com/kcim/web/ExcelController.java
  60. 2 3
      src/main/java/com/kcim/web/ProductController.java
  61. 43 14
      src/main/java/com/kcim/web/SettingController.java
  62. 23 0
      src/main/java/com/kcim/web/request/AccountingItemMapRequest.java
  63. 5 3
      src/main/resources/application-demonstrate.yml
  64. 1 1
      src/main/resources/application.yml
  65. 25 0
      src/main/resources/mapper/AccountingItemMapMapper.xml
  66. 28 1
      src/main/resources/mapper/ComputeItemCostMapper.xml
  67. 5 0
      src/main/resources/mapper/ImportPatientInfoMapper.xml
  68. 21 0
      src/main/resources/mapper/ImportPatientItemMapper.xml
  69. 23 0
      src/main/resources/mapper/OrderCostDetailMapper.xml
  70. 57 0
      src/main/resources/mapper/OrderCostMapper.xml

+ 8 - 0
src/main/java/com/kcim/common/util/excel/entity/PatientInfoImportEntity.java

@@ -47,6 +47,14 @@ public class PatientInfoImportEntity {
      */
     @Excel(name="科室名称",width = 20)
     private String departmentName;
+
+    @Excel(name="病区代码",width = 20)
+    private String inpatientWardCode;
+    /**
+     * 科室名称
+     */
+    @Excel(name="病区名称",width = 20)
+    private String inpatientWardName;
     /**
      * 就诊类别 1门诊3住院2急诊
      */

+ 10 - 0
src/main/java/com/kcim/common/util/excel/entity/PatientItemImportEntity.java

@@ -37,6 +37,16 @@ public class PatientItemImportEntity {
      */
     @Excel(name="姓名",width = 20)
     private String name;
+    /**
+     * 医嘱代码
+     */
+    @Excel(name="医嘱代码",width = 20)
+    private String orderCode;
+    /**
+     * 项目名称
+     */
+    @Excel(name="医嘱名称",width = 20)
+    private String orderName;
     /**
      * 项目代码
      */

+ 34 - 0
src/main/java/com/kcim/common/util/excel/entity/ProductTemplateEntity.java

@@ -0,0 +1,34 @@
+package com.kcim.common.util.excel.entity;
+
+import cn.afterturn.easypoi.excel.annotation.Excel;
+import cn.afterturn.easypoi.excel.annotation.ExcelTarget;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @program: CostAccount
+ * @description:
+ * @author: Wang.YS
+ * @create: 2023-12-04 20:48
+ **/
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+@ExcelTarget("ProductTemplateEntity")
+public class ProductTemplateEntity {
+    /**
+     * 成本项目编号
+     */
+    @Excel(name="成本项目编号",width = 20)
+    private String productCode;
+    /**
+     * 成本项目名
+     */
+    @Excel(name="成本项目名",width = 20)
+    private String productName;
+
+
+}

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

@@ -0,0 +1,16 @@
+package com.kcim.dao.mapper;
+
+import com.kcim.dao.model.AccountingItemMap;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 会计科目与收费项目对照
+ * 
+ * @author Wang.YS
+ * @date 2023-11-27 16:08:34
+ */
+@Mapper
+public interface AccountingItemMapMapper extends BaseMapper<AccountingItemMap> {
+	
+}

+ 3 - 1
src/main/java/com/kcim/dao/mapper/ComputeItemCostMapper.java

@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.kcim.dao.model.ComputeItemCost;
 import com.kcim.dao.model.dto.ComputeItemCostPageDto;
+import com.kcim.dao.model.dto.ComputeItemGroupByOrder;
 import com.kcim.dao.model.dto.ComputeItemGroupByVisitNoDto;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
@@ -31,5 +32,6 @@ public interface ComputeItemCostMapper extends BaseMapper<ComputeItemCost> {
 
 
 
-
+    List<ComputeItemGroupByOrder> getListGroupByOrder(@Param("computeDate") String computeDate,
+                                                        @Param("hospId")Long hospId);
 }

+ 3 - 1
src/main/java/com/kcim/dao/mapper/ImportPatientItemMapper.java

@@ -19,5 +19,7 @@ public interface ImportPatientItemMapper extends BaseMapper<ImportPatientItem> {
 
     List<PatientItemVo> getAllGroupByCompute(@Param("computeDate")String computeDate,
                                              @Param("hospId")Long hospId);
-	
+
+    List<PatientItemVo> getAllGroupByOrder(@Param("computeDate")String computeDate,
+                                           @Param("hospId")Long hospId);
 }

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

@@ -0,0 +1,16 @@
+package com.kcim.dao.mapper;
+
+import com.kcim.dao.model.OrderCostDetail;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 医嘱项目成本计算明细表
+ * 
+ * @author Wang.YS
+ * @date 2023-11-22 11:02:32
+ */
+@Mapper
+public interface OrderCostDetailMapper extends BaseMapper<OrderCostDetail> {
+	
+}

+ 25 - 0
src/main/java/com/kcim/dao/mapper/OrderCostMapper.java

@@ -0,0 +1,25 @@
+package com.kcim.dao.mapper;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.kcim.dao.model.OrderCost;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.kcim.dao.model.dto.ComputeOrderCostPageDto;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * 医嘱项目成本计算表
+ * 
+ * @author Wang.YS
+ * @date 2023-11-22 11:02:32
+ */
+@Mapper
+public interface OrderCostMapper extends BaseMapper<OrderCost> {
+
+    List<ComputeOrderCostPageDto> getByPage(Page<ComputeOrderCostPageDto> page,
+                                            @Param("computeDate") String computeDate,
+                                            @Param("orderName") String orderName,
+                                            @Param("hospId")Long hospId);
+}

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

@@ -1,14 +1,17 @@
 package com.kcim.dao.model;
 
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableLogic;
 import com.baomidou.mybatisplus.annotation.TableName;
+import com.kcim.vo.AccountVO;
 import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 import lombok.experimental.Accessors;
 
 import java.io.Serializable;
+import java.util.List;
 
 /**
  * 会计科目管理表
@@ -65,5 +68,7 @@ public class Accounting implements Serializable {
 	 */
 	@TableLogic(value = "0",delval = "UNIX_TIMESTAMP(NOW()) * 1000")
 	private Long deleteTime;
+	@TableField(exist = false)
+	private List<Accounting> children;
 
 }

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

@@ -0,0 +1,100 @@
+package com.kcim.dao.model;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+
+import java.io.Serializable;
+import java.util.Date;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+/**
+ * 会计科目与收费项目对照
+ * 
+ * @author Wang.YS
+
+ * @date 2023-11-27 16:08:34
+ */
+@Data
+@Accessors(chain = true)
+@AllArgsConstructor
+@NoArgsConstructor
+@TableName("com_accounting_item_map")
+public class AccountingItemMap implements Serializable {
+	private static final long serialVersionUID = 1L;
+
+	/**
+	 * 主键
+	 */
+	@TableId
+	private Integer id;
+	/**
+	 * 医院id
+	 */
+	private Long hospId;
+	/**
+	 * 收费项目代码
+	 */
+	private String accountingCode;
+	/**
+	 * 收费项目名称
+	 */
+	private String accountingName;
+	/**
+	 * 收费项目代码
+	 */
+	private String itemCode;
+	/**
+	 * 收费项目名称
+	 */
+	private String itemName;
+	/**
+	 * 收费项目类别
+	 */
+	private String type;
+	@TableField(exist = false)
+	private String typeName;
+	/**
+	 * 创建人
+	 */
+	@JsonIgnore
+	private String createUser;
+	/**
+	 * 创建时间
+	 */
+	@JsonIgnore
+	private Date createTime;
+	/**
+	 * 更新人
+	 */
+	@JsonIgnore
+	private String updateUser;
+	/**
+	 * 更新时间
+	 */
+	@JsonIgnore
+	private Date updateTime;
+	/**
+	 * 删除人
+	 */
+	@JsonIgnore
+	private String deleteUser;
+	/**
+	 * 删除时间
+	 */
+	@JsonIgnore
+	private Date deleteTime;
+	/**
+	 * 删除标志  0正常 1作废
+	 */
+	@JsonIgnore
+	@TableLogic(value = "0",delval = "1")
+	private Integer delFlag;
+
+}

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

@@ -62,6 +62,15 @@ public class ComputeItemCost implements Serializable {
 	 * 项目类别
 	 */
 	private String itemType;
+	/**
+	 * 医嘱代码
+	 */
+	private String orderCode;
+
+	/**
+	 * 医嘱名称
+	 */
+	private String orderName;
 	/**
 	 * 创建人
 	 */

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

@@ -1,5 +1,6 @@
 package com.kcim.dao.model;
 
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableLogic;
 import com.baomidou.mybatisplus.annotation.TableName;
@@ -85,5 +86,7 @@ public class DiseaseType implements Serializable {
 	@TableLogic(value = "0",delval = "1")
 	@JsonIgnore
 	private Integer delFlag;
+	@TableField(exist = false)
+	private String replaceCode;
 
 }

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

@@ -62,6 +62,15 @@ public class ImportPatientInfo implements Serializable {
 	 * 科室名称
 	 */
 	private String departmentName;
+	/**
+	 * 病区代码
+	 */
+	private String inpatientWardCode;
+
+	/**
+	 * 病区名称
+	 */
+	private String inpatientWardName;
 	/**
 	 * 就诊类别 1门诊3住院2急诊
 	 */
@@ -132,6 +141,15 @@ public class ImportPatientInfo implements Serializable {
 	 * 病种编码
 	 */
 	private String diseaseTypeCode;
+	/**
+	 * 患者床日数
+	 */
+	private Integer bedDays;
+	/**
+	 * 当前患者床日数
+	 */
+	private Integer currentBedDays;
+
 	/**
 	 * 创建人
 	 */

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

@@ -55,6 +55,15 @@ public class ImportPatientItem implements Serializable {
 	 * 姓名
 	 */
 	private String name;
+	/**
+	 * 医嘱代码
+	 */
+	private String orderCode;
+
+	/**
+	 * 医嘱名称
+	 */
+	private String orderName;
 	/**
 	 * 项目代码
 	 */

+ 103 - 0
src/main/java/com/kcim/dao/model/OrderCost.java

@@ -0,0 +1,103 @@
+package com.kcim.dao.model;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+
+import java.io.Serializable;
+import java.util.Date;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+/**
+ * 医嘱项目成本计算表
+ * 
+ * @author Wang.YS
+
+ * @date 2023-11-22 11:02:32
+ */
+@Data
+@Accessors(chain = true)
+@AllArgsConstructor
+@NoArgsConstructor
+@TableName("compute_order_cost")
+public class OrderCost implements Serializable {
+	private static final long serialVersionUID = 1L;
+
+	/**
+	 * 主键
+	 */
+	@TableId
+	private Integer id;
+	/**
+	 * 医院id
+	 */
+	private Long hospId;
+	/**
+	 * 核算年月
+	 */
+	private String computeDate;
+
+	/**
+	 * 医嘱项目代码
+	 */
+	private String code;
+	/**
+	 * 医嘱项目名称
+	 */
+	private String name;
+
+	/**
+	 * 科室代码
+	 */
+	private String departmentCode;
+	/**
+	 * 科室名称
+	 */
+	private String departmentName;
+	/**
+	 * 创建人
+	 */
+	@JsonIgnore
+	private String createUser;
+	/**
+	 * 创建时间
+	 */
+	@JsonIgnore
+	private Date createTime;
+	/**
+	 * 更新人
+	 */
+	@JsonIgnore
+	private String updateUser;
+	/**
+	 * 更新时间
+	 */
+	@JsonIgnore
+	private Date updateTime;
+	/**
+	 * 删除人
+	 */
+	@JsonIgnore
+	private String deleteUser;
+	/**
+	 * 删除时间
+	 */
+	@JsonIgnore
+	private Date deleteTime;
+	/**
+	 * 删除标志  0正常 1作废
+	 */
+	@JsonIgnore
+	@TableLogic(value = "0",delval = "1")
+	private Integer delFlag;
+
+	@TableField(exist = false)
+	private Integer index;
+
+}

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

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

+ 3 - 1
src/main/java/com/kcim/dao/model/OrderItemMap.java

@@ -49,8 +49,10 @@ public class OrderItemMap implements Serializable {
 	private String itemCode;
 
 	private String itemName;
-	@TableField(exist = false)
 	private String itemType;
+	@TableField(exist = false)
+	private String itemTypeName;
+
 	/**
 	 * 数量
 	 */

+ 2 - 2
src/main/java/com/kcim/dao/model/dto/AccountingSaveDTO.java

@@ -27,6 +27,6 @@ public class AccountingSaveDTO {
     @NotNull(message = "会计科目类型不能为空")
     private Integer accountingType;
 
-    @ApiModelProperty(name = "isBaseCode",value = "如果是支出,必须选择收入还是支出")
-    private Integer isBaseCode;
+    @ApiModelProperty(name = "isBaseCost",value = "如果是支出,必须选择收入还是支出")
+    private Integer isBaseCost;
 }

+ 80 - 0
src/main/java/com/kcim/dao/model/dto/ComputeItemGroupByOrder.java

@@ -0,0 +1,80 @@
+package com.kcim.dao.model.dto;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * @program: CostAccount
+ * @description: 收费项目按医嘱分组
+ * @author: Wang.YS
+ * @create: 2023-11-22 17:18
+ **/
+@Data
+public class ComputeItemGroupByOrder {
+    private Integer id;
+    /**
+     * 医院id
+     */
+    private Long hospId;
+    /**
+     * 核算年月
+     */
+    private String computeDate;
+    /**
+     * 就诊id
+     */
+    private String visitNo;
+
+    /**
+     * 医嘱代码
+     */
+    private String orderCode;
+
+    /**
+     * 医嘱名称
+     */
+    private String orderName;
+
+
+    /**
+     *药品收入
+     */
+    private BigDecimal drugIncome;
+    /**
+     *材料收入
+     */
+    private BigDecimal materialIncome;
+    /**
+     *项目收入
+     */
+    private BigDecimal itemIncome;
+    /**
+     *药品成本
+     */
+    private BigDecimal drugCost;
+    /**
+     *材料成本
+     */
+    private BigDecimal materialCost;
+    /**
+     *项目成本
+     */
+    private BigDecimal itemCost;
+    /**
+     *人力成本
+     */
+    private BigDecimal empCost;
+    /**
+     *设备成本
+     */
+    private BigDecimal equipmentCost;
+    /**
+     *空间成本
+     */
+    private BigDecimal spaceCost;
+
+    private String departCode;
+
+    private String departName;
+}

+ 80 - 0
src/main/java/com/kcim/dao/model/dto/ComputeOrderCostPageDto.java

@@ -0,0 +1,80 @@
+package com.kcim.dao.model.dto;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * @program: CostAccount
+ * @description: 医嘱项目成本计算自定义出参
+ * @author: Wang.YS
+ * @create: 2023-10-30 11:30
+ **/
+@Data
+public class ComputeOrderCostPageDto {
+    private Integer id;
+    /**
+     * 医院id
+     */
+    private Long hospId;
+    /**
+     * 核算年月
+     */
+    private String computeDate;
+
+    /**
+     * 医嘱项目代码
+     */
+    private String code;
+    /**
+     * 医嘱项目名称
+     */
+    private String name;
+
+    /**
+     * 科室代码
+     */
+    private String departmentCode;
+    /**
+     * 科室名称
+     */
+    private String departmentName;
+    /**
+     *药品收入
+     */
+    private BigDecimal drugIncome;
+    /**
+     *材料收入
+     */
+    private BigDecimal materialIncome;
+    /**
+     *项目收入
+     */
+    private BigDecimal itemIncome;
+    /**
+     *药品成本
+     */
+    private BigDecimal drugCost;
+    /**
+     *材料成本
+     */
+    private BigDecimal materialCost;
+    /**
+     *项目成本
+     */
+    private BigDecimal itemCost;
+    /**
+     *人力成本
+     */
+    private BigDecimal empCost;
+    /**
+     *设备成本
+     */
+    private BigDecimal equipmentCost;
+    /**
+     *空间成本
+     */
+    private BigDecimal spaceCost;
+
+
+}

+ 10 - 0
src/main/java/com/kcim/dao/model/dto/PatientItemVo.java

@@ -33,6 +33,16 @@ public class PatientItemVo {
      * 项目类别
      */
     private String itemType;
+
+    /**
+     * 医嘱代码
+     */
+    private String orderCode;
+
+    /**
+     * 医嘱名称
+     */
+    private String orderName;
     /**
      * 执行科室代码
      */

+ 63 - 0
src/main/java/com/kcim/dao/repository/AccountingItemMapRepository.java

@@ -0,0 +1,63 @@
+package com.kcim.dao.repository;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.kcim.common.util.UserContext;
+import com.kcim.dao.mapper.AccountingItemMapMapper;
+import com.kcim.dao.model.AccountingItemMap;
+import org.springframework.stereotype.Repository;
+import org.springframework.util.CollectionUtils;
+import org.springframework.util.StringUtils;
+
+import java.util.Date;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * @program: CostAccount
+ * @description:
+ * @author: Wang.YS
+ * @create: 2023-11-27 17:52
+ **/
+@Repository
+public class AccountingItemMapRepository extends ServiceImpl<AccountingItemMapMapper, AccountingItemMap> {
+    public List<AccountingItemMap> getList() {
+        LambdaQueryWrapper<AccountingItemMap> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(AccountingItemMap::getHospId, UserContext.getHospId());
+        return this.list(queryWrapper);
+
+    }
+
+    public void batchDelete(List<Integer> ids) {
+        LambdaQueryWrapper<AccountingItemMap> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(AccountingItemMap::getHospId, UserContext.getHospId());
+        queryWrapper.in(AccountingItemMap::getId,ids);
+        List<AccountingItemMap> list = this.list(queryWrapper);
+        if(!CollectionUtils.isEmpty(list)){
+            for (AccountingItemMap itemMap : list) {
+                itemMap.setDeleteTime(new Date());
+                itemMap.setDeleteUser(String.valueOf(UserContext.getCurrentUser().getId()));
+            }
+            this.updateBatchById(list);
+            List<Integer> collect = list.stream().map(AccountingItemMap::getId).collect(Collectors.toList());
+            this.removeBatchByIds(collect);
+        }
+
+
+
+    }
+
+    public Page<AccountingItemMap> getPage(Integer current, Integer pageSize, String accountingCode, String itemName) {
+        Page<AccountingItemMap> page = new Page<>(current,pageSize);
+        LambdaQueryWrapper<AccountingItemMap> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(AccountingItemMap::getHospId, UserContext.getHospId());
+        queryWrapper.eq(AccountingItemMap::getAccountingCode,accountingCode);
+        if(!StringUtils.isEmpty(itemName)){
+            queryWrapper.like(AccountingItemMap::getItemName,itemName);
+        }
+        return this.page(page, queryWrapper);
+
+
+    }
+}

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

@@ -32,4 +32,12 @@ public class AccountingRepository extends ServiceImpl<AccountingMapper, Accounti
         }
         return this.list(queryWrapper);
     }
+
+    public List<Accounting> getAllIncome() {
+        LambdaQueryWrapper<Accounting> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(Accounting::getHospId, UserContext.getHospId());
+        queryWrapper.eq(Accounting::getAccountingType, NumberConstant.ONE);
+
+        return this.list(queryWrapper);
+    }
 }

+ 4 - 0
src/main/java/com/kcim/dao/repository/ComputeItemCostRepository.java

@@ -7,6 +7,7 @@ import com.kcim.common.util.UserContext;
 import com.kcim.dao.mapper.ComputeItemCostMapper;
 import com.kcim.dao.model.ComputeItemCost;
 import com.kcim.dao.model.dto.ComputeItemCostPageDto;
+import com.kcim.dao.model.dto.ComputeItemGroupByOrder;
 import com.kcim.dao.model.dto.ComputeItemGroupByVisitNoDto;
 import org.springframework.stereotype.Repository;
 import org.springframework.util.CollectionUtils;
@@ -49,5 +50,8 @@ public class ComputeItemCostRepository extends ServiceImpl<ComputeItemCostMapper
         return this.baseMapper.getListGroupByVisitNo(computeDate,UserContext.getHospId());
 
     }
+    public List<ComputeItemGroupByOrder> getByComputeDateGroupByOrder(String computeDate){
+        return this.baseMapper.getListGroupByOrder(computeDate,UserContext.getHospId());
 
+    }
 }

+ 27 - 5
src/main/java/com/kcim/dao/repository/DiseaseTypeDiagMapRepository.java

@@ -7,6 +7,7 @@ import com.kcim.common.constants.NumberConstant;
 import com.kcim.common.util.UserContext;
 import com.kcim.dao.mapper.DiseaseTypeDiagMapMapper;
 import com.kcim.dao.model.DiseaseTypeDiagMap;
+import com.kcim.dao.model.Item;
 import org.springframework.stereotype.Repository;
 import org.springframework.util.CollectionUtils;
 import org.springframework.util.StringUtils;
@@ -29,18 +30,23 @@ public class DiseaseTypeDiagMapRepository extends ServiceImpl<DiseaseTypeDiagMap
     }
 
     public  Map<String,String> getDiagDiseaseMap() {
-        Map<String,String> diagMap = new HashMap<>();
+
         LambdaQueryWrapper<DiseaseTypeDiagMap> queryWrapper = new LambdaQueryWrapper<>();
         queryWrapper.eq(DiseaseTypeDiagMap::getHospId, UserContext.getHospId());
         List<DiseaseTypeDiagMap> list = this.list(queryWrapper);
         if(!CollectionUtils.isEmpty(list)){
-            //2023.10.30 医院诊断编码与诊断对照表 icdCode 对应
-             diagMap = list.stream().collect(Collectors.toMap(DiseaseTypeDiagMap::getIcdCode, DiseaseTypeDiagMap::getDiseaseTypeCode, (a, b) -> b));
+            //判断诊断与病种是否已对照
+            List<DiseaseTypeDiagMap> collect = list.stream().filter(f -> !StringUtils.isEmpty(f.getDiseaseTypeCode())).collect(Collectors.toList());
+            if(!CollectionUtils.isEmpty(collect)){
+                //2023.10.30 医院诊断编码与诊断对照表 icdCode 对应
+              return   collect.stream().collect(Collectors.toMap(DiseaseTypeDiagMap::getIcdCode, DiseaseTypeDiagMap::getDiseaseTypeCode, (a, b) -> b));
+
+            }
 
         }
 
 
-        return diagMap;
+        return new HashMap<>();
     }
 
     public Page<DiseaseTypeDiagMap> getPage(Integer current, Integer pageSize, String name, Integer type) {
@@ -48,7 +54,9 @@ public class DiseaseTypeDiagMapRepository extends ServiceImpl<DiseaseTypeDiagMap
         LambdaQueryWrapper<DiseaseTypeDiagMap> queryWrapper = new LambdaQueryWrapper<>();
         queryWrapper.eq(DiseaseTypeDiagMap::getHospId, UserContext.getHospId());
         if(!StringUtils.isEmpty(name)){
-            queryWrapper.like(DiseaseTypeDiagMap::getDiagName,name);
+//            queryWrapper.like(DiseaseTypeDiagMap::getDiagName,name);
+            queryWrapper.and(q->q.like(DiseaseTypeDiagMap::getDiagName,name).or().like(DiseaseTypeDiagMap::getIcdCode,name));
+
         }
         if(type.equals(NumberConstant.ONE)){
             queryWrapper.isNull(DiseaseTypeDiagMap::getDiseaseTypeCode);
@@ -75,4 +83,18 @@ public class DiseaseTypeDiagMapRepository extends ServiceImpl<DiseaseTypeDiagMap
         List<Integer> collect = list.stream().map(DiseaseTypeDiagMap::getId).collect(Collectors.toList());
         this.removeBatchByIds(collect);
     }
+
+    public List<DiseaseTypeDiagMap> getByDiagCode(String diagCode) {
+        LambdaQueryWrapper<DiseaseTypeDiagMap> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(DiseaseTypeDiagMap::getHospId, UserContext.getHospId());
+        queryWrapper.eq(DiseaseTypeDiagMap::getDiagCode,diagCode);
+        return this.list(queryWrapper);
+    }
+
+    public DiseaseTypeDiagMap getOneByDiagCode(String diagCode) {
+        LambdaQueryWrapper<DiseaseTypeDiagMap> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(DiseaseTypeDiagMap::getHospId, UserContext.getHospId());
+        queryWrapper.eq(DiseaseTypeDiagMap::getDiagCode,diagCode);
+        return this.getOne(queryWrapper);
+    }
 }

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

@@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.kcim.common.util.UserContext;
 import com.kcim.dao.mapper.DiseaseTypeMapper;
 import com.kcim.dao.model.DiseaseType;
+import com.kcim.dao.model.StandItem;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Repository;
 import org.springframework.util.CollectionUtils;
@@ -41,7 +42,8 @@ public class DiseaseTypeRepository extends ServiceImpl<DiseaseTypeMapper, Diseas
         queryWrapper.eq(DiseaseType::getHospId, UserContext.getHospId());
 
         if(!StringUtils.isEmpty(name)){
-            queryWrapper.like(DiseaseType::getName,name);
+            queryWrapper.and(q->q.like(DiseaseType::getName,name).or().like(DiseaseType::getCode,name));
+//            queryWrapper.like(DiseaseType::getName,name);
         }
 
         return this.page(page,queryWrapper);

+ 4 - 0
src/main/java/com/kcim/dao/repository/ImportPatientItemRepository.java

@@ -58,4 +58,8 @@ public class ImportPatientItemRepository extends ServiceImpl<ImportPatientItemMa
         }
         return this.list(queryWrapper);
     }
+
+    public List<PatientItemVo> getAllGroupByOrder(String computeDate){
+        return baseMapper.getAllGroupByOrder(computeDate,UserContext.getHospId());
+    }
 }

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

@@ -6,6 +6,7 @@ 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 org.springframework.stereotype.Repository;
 import org.springframework.util.StringUtils;
@@ -28,7 +29,8 @@ public class ItemRepository extends ServiceImpl<ItemMapper, Item> {
         LambdaQueryWrapper<Item> queryWrapper = new LambdaQueryWrapper<>();
         queryWrapper.eq(Item::getHospId, UserContext.getHospId());
         if(!StringUtils.isEmpty(name)){
-            queryWrapper.like(Item::getName,name);
+//            queryWrapper.like(Item::getName,name);
+            queryWrapper.and(q->q.like(Item::getName,name).or().like(Item::getNationalCode,name));
         }
         if(type.equals(NumberConstant.ONE)){
             queryWrapper.isNull(Item::getStandItemCode);

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

@@ -0,0 +1,33 @@
+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.OrderCostDetailMapper;
+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.List;
+import java.util.stream.Collectors;
+
+/**
+ * @program: CostAccount
+ * @description:
+ * @author: Wang.YS
+ * @create: 2023-11-22 11:11
+ **/
+@Repository
+public class OrderCostDetailRepository extends ServiceImpl<OrderCostDetailMapper, OrderCostDetail> {
+    public void removeByOrderCostId(List<Integer> integers) {
+        LambdaQueryWrapper<OrderCostDetail> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(OrderCostDetail::getHospId, UserContext.getHospId());
+        queryWrapper.in(OrderCostDetail::getOrderCostId,integers);
+        List<OrderCostDetail> list = this.list(queryWrapper);
+        if(!CollectionUtils.isEmpty(list)){
+            List<Integer> collect = list.stream().map(OrderCostDetail::getId).collect(Collectors.toList());
+            this.removeBatchByIds(collect,500);
+        }
+    }
+}

+ 48 - 0
src/main/java/com/kcim/dao/repository/OrderCostRepository.java

@@ -0,0 +1,48 @@
+package com.kcim.dao.repository;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.kcim.common.util.UserContext;
+import com.kcim.dao.mapper.OrderCostMapper;
+import com.kcim.dao.model.ComputeGroupCost;
+import com.kcim.dao.model.OrderCost;
+import com.kcim.dao.model.dto.ComputeGroupCostPageDto;
+import com.kcim.dao.model.dto.ComputeOrderCostPageDto;
+import org.springframework.stereotype.Repository;
+import org.springframework.util.CollectionUtils;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * @program: CostAccount
+ * @description:
+ * @author: Wang.YS
+ * @create: 2023-11-22 11:10
+ **/
+@Repository
+public class OrderCostRepository extends ServiceImpl<OrderCostMapper, OrderCost> {
+    public List<Integer> removeByComputeDate(String computeDate) {
+        LambdaQueryWrapper<OrderCost> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(OrderCost::getHospId, UserContext.getHospId());
+        queryWrapper.eq(OrderCost::getComputeDate,computeDate);
+        List<OrderCost> list = this.list(queryWrapper);
+        if(!CollectionUtils.isEmpty(list)){
+            List<Integer> collect = list.stream().map(OrderCost::getId).collect(Collectors.toList());
+            this.removeBatchByIds(collect,500);
+            return collect;
+        }
+        return new ArrayList<>();
+    }
+
+    public Page<ComputeOrderCostPageDto> getByPage(Integer current, Integer pageSize, String computeDate, String orderName) {
+        Page<ComputeOrderCostPageDto> page = new Page<>(current,pageSize);
+        List<ComputeOrderCostPageDto> byPage = this.baseMapper.getByPage(page, computeDate, orderName, UserContext.getHospId());
+        if(!CollectionUtils.isEmpty(byPage)){
+            page.setRecords(byPage);
+        }
+        return page;
+    }
+}

+ 7 - 0
src/main/java/com/kcim/dao/repository/OrderItemMapRepository.java

@@ -84,4 +84,11 @@ public class OrderItemMapRepository extends ServiceImpl<OrderItemMapMapper, Orde
             this.removeBatchByIds(collect);
         }
     }
+
+    public List<OrderItemMap> getByOrderCode(String orderCode) {
+        LambdaQueryWrapper<OrderItemMap> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(OrderItemMap::getHospId, UserContext.getHospId());
+        queryWrapper.eq(OrderItemMap::getOrderCode, orderCode);
+        return this.list(queryWrapper);
+    }
 }

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

@@ -35,7 +35,7 @@ public class OrderRepository extends ServiceImpl<OrderMapper, Order> {
         if(!StringUtils.isEmpty(orderName)){
             queryWrapper.like(Order::getName,orderName);
         }
-        return this.list();
+        return this.list(queryWrapper);
     }
 
     public List<Order> getByCode(String code) {

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

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

+ 26 - 0
src/main/java/com/kcim/service/AccountingItemMapService.java

@@ -0,0 +1,26 @@
+package com.kcim.service;
+
+import com.kcim.web.request.AccountingItemMapRequest;
+
+import java.util.List;
+
+/**
+ * @program: CostAccount
+ * @description:
+ * @author: Wang.YS
+ * @create: 2023-11-27 17:52
+ **/
+
+public interface AccountingItemMapService {
+    Object getAccountingList(String accountingName, Integer type);
+
+    Object getAccountingItemDictList(Integer type,String name);
+
+    Object getAccountingItemMap(Integer current, Integer pageSize, String accountingCode, String itemName);
+
+    void addAccountingItemMap(AccountingItemMapRequest map);
+
+    void deleteAccountingItemMap(Integer id);
+
+    void batchDeleteAccountingItemMap(List<Integer> ids);
+}

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

@@ -1,9 +1,11 @@
 package com.kcim.service;
 
 import com.kcim.dao.model.Drug;
+import com.kcim.dao.model.OrderItemMap;
 import org.springframework.web.multipart.MultipartFile;
 
 import javax.servlet.http.HttpServletResponse;
+import java.util.List;
 
 /**
  * @program: CostAccount
@@ -26,5 +28,5 @@ public interface DrugService {
 
     Object getDrugType();
 
-    Object getItemDict(String name);
+    List<OrderItemMap> getItemDict(String name);
 }

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

@@ -1,9 +1,11 @@
 package com.kcim.service;
 
 import com.kcim.dao.model.Item;
+import com.kcim.dao.model.OrderItemMap;
 import org.springframework.web.multipart.MultipartFile;
 
 import javax.servlet.http.HttpServletResponse;
+import java.util.List;
 
 /**
  * @program: CostAccount
@@ -29,5 +31,5 @@ public interface ItemService {
 
     Object getStandItemDict(String name);
 
-    Object getItemDict(String name);
+    List<OrderItemMap> getItemDict(String name);
 }

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

@@ -1,9 +1,11 @@
 package com.kcim.service;
 
 import com.kcim.dao.model.Material;
+import com.kcim.dao.model.OrderItemMap;
 import org.springframework.web.multipart.MultipartFile;
 
 import javax.servlet.http.HttpServletResponse;
+import java.util.List;
 
 /**
  * @program: CostAccount
@@ -24,5 +26,5 @@ public interface MaterialService {
 
     void importMaterial(MultipartFile file);
 
-    Object getItemDict(String name);
+    List<OrderItemMap> getItemDict(String name);
 }

+ 13 - 0
src/main/java/com/kcim/service/OrderCostDetailService.java

@@ -0,0 +1,13 @@
+package com.kcim.service;
+
+
+/**
+ * 医嘱项目成本计算明细表
+ *
+ * @author Wang.YS
+ * @date 2023-11-22 11:02:32
+ */
+public interface OrderCostDetailService {
+
+}
+

+ 16 - 0
src/main/java/com/kcim/service/OrderCostService.java

@@ -0,0 +1,16 @@
+package com.kcim.service;
+
+
+/**
+ * 医嘱项目成本计算表
+ *
+ * @author Wang.YS
+ * @date 2023-11-22 11:02:32
+ */
+public interface OrderCostService  {
+
+    Object orderCostCalculateList(Integer current, Integer pageSize, String computeDate, String orderName);
+
+    void orderCostCalculate(String computeDate);
+}
+

+ 1 - 1
src/main/java/com/kcim/service/OrderService.java

@@ -39,5 +39,5 @@ public interface OrderService {
 
     void batchDeleteOrderItem(List<Integer> ids);
 
-    Object getItemDict();
+    Object getItemDict(Integer type, String orderCode, String name);
 }

+ 6 - 2
src/main/java/com/kcim/service/ProductService.java

@@ -7,6 +7,7 @@ import com.kcim.dao.model.Product;
 import com.kcim.dao.model.dto.ProductDTO;
 import com.kcim.dao.model.dto.ProductEditDTO;
 import com.kcim.vo.CommonVO;
+import org.springframework.web.multipart.MultipartFile;
 
 import java.util.List;
 
@@ -22,12 +23,12 @@ public interface ProductService extends IService<Product> {
     /**
      * 分页查询
      *
-     * @param page
+     * @param current
      * @param pageSize
      * @param name
      * @return
      */
-    PageUtils selectList(Integer page, Integer pageSize, String name);
+    PageUtils selectList(Integer current, Integer pageSize, String name);
 
     /**
      * 保存成本项目
@@ -63,5 +64,8 @@ public interface ProductService extends IService<Product> {
      * @param asList 成本的Id集合
      */
     void deleteByIds(List<Integer> asList);
+
+    Result importProduct(MultipartFile file);
+
 }
 

+ 270 - 0
src/main/java/com/kcim/service/impl/AccountingItemMapServiceImpl.java

@@ -0,0 +1,270 @@
+package com.kcim.service.impl;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.kcim.common.constants.NumberConstant;
+import com.kcim.common.exception.CostException;
+import com.kcim.common.util.PageUtils;
+import com.kcim.common.util.UserContext;
+import com.kcim.dao.model.Accounting;
+import com.kcim.dao.model.AccountingItemMap;
+import com.kcim.dao.model.OrderItemMap;
+import com.kcim.dao.repository.AccountingItemMapRepository;
+import com.kcim.dao.repository.AccountingRepository;
+import com.kcim.service.AccountingItemMapService;
+import com.kcim.service.DrugService;
+import com.kcim.service.ItemService;
+import com.kcim.service.MaterialService;
+import com.kcim.web.request.AccountingItemMapRequest;
+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.*;
+import java.util.stream.Collectors;
+
+/**
+ * @program: CostAccount
+ * @description:
+ * @author: Wang.YS
+ * @create: 2023-11-27 17:52
+ **/
+@Service("AccountingItemMapService")
+@Slf4j
+@AllArgsConstructor
+public class AccountingItemMapServiceImpl implements AccountingItemMapService {
+
+    AccountingItemMapRepository repository;
+
+    AccountingRepository accountingRepository;
+    DrugService drugService;
+
+    MaterialService materialService;
+
+    ItemService itemService;
+    /**
+     * 获取会计科目收入列表
+     * @param accountingName 会计科目名称
+     * @param type 筛选类型 0全部 1已对照 2未对照
+     * @return 列表
+     */
+    @Override
+    public Object getAccountingList(String accountingName, Integer type) {
+        List<Accounting> accountingList = accountingRepository.getAccountIncome(accountingName);
+        List<Accounting> allIncome = accountingRepository.getAllIncome();
+        if(CollectionUtils.isEmpty(accountingList)){
+            return new ArrayList<>();
+        }
+        List<AccountingItemMap> itemMaps = repository.getList();
+        if(CollectionUtils.isEmpty(itemMaps)){
+            //无对照数据 返回会计科目全部
+            List<Accounting> collect = accountingList.stream().filter(f -> !f.getParentId().equals(NumberConstant.ZERO_L)).collect(Collectors.toList());
+            Map<Long, Accounting> accountingMap = allIncome.stream().collect(Collectors.toMap(Accounting::getId, accounting -> accounting, (a, b) -> b));
+            List<Accounting> parentAccounting = new ArrayList<>();
+
+            collect.forEach(accounting -> getParentAccount(accounting, accountingMap, parentAccounting));
+            if(!CollectionUtils.isEmpty(parentAccounting)){
+                accountingList.addAll(parentAccounting);
+            }
+            List<Accounting> accounting = accountingList.stream().distinct().collect(Collectors.toList());
+            return   accounting.stream().filter(o -> o.getParentId() == 0)
+                    .peek(o -> o.setChildren(this.getAccountTree(o, accounting)))
+                    .collect(Collectors.toList());
+        }else {
+            if(type.equals(NumberConstant.ONE)){
+                //已对照
+                List<String> accountCodes = itemMaps.stream().map(AccountingItemMap::getAccountingCode).distinct().collect(Collectors.toList());
+                List<Accounting> returnList = new ArrayList<>();
+                for (Accounting accountVO : accountingList) {
+                    if(accountCodes.contains(accountVO.getAccountingCode())){
+                        returnList.add(accountVO);
+                    }
+                }
+                if(!CollectionUtils.isEmpty(returnList)){
+                    //找出父类不是0的数据 递归找到父类组装成树
+                    List<Accounting> collect = returnList.stream().filter(f -> !f.getParentId().equals(NumberConstant.ZERO_L)).collect(Collectors.toList());
+                    List<Accounting> parentAccounting = new ArrayList<>();
+                    Map<Long, Accounting> accountingMap = allIncome.stream().collect(Collectors.toMap(Accounting::getId, accounting -> accounting, (a, b) -> b));
+                    collect.forEach(accounting -> getParentAccount(accounting, accountingMap, parentAccounting));
+                    if(!CollectionUtils.isEmpty(parentAccounting)){
+                        returnList.addAll(parentAccounting);
+                    }
+                    List<Accounting> accounting = returnList.stream().distinct().collect(Collectors.toList());
+                    return accounting.stream().filter(o -> o.getParentId() == 0)
+                            .peek(o -> o.setChildren(this.getAccountTree(o, accounting)))
+                            .collect(Collectors.toList());
+                }
+            } else if (type.equals(NumberConstant.TWO)) {
+                //未对照
+                List<String> accountCodes = itemMaps.stream().map(AccountingItemMap::getAccountingCode).distinct().collect(Collectors.toList());
+                List<Accounting> returnList = new ArrayList<>();
+                for (Accounting accountVO : accountingList) {
+                    if(!accountCodes.contains(accountVO.getAccountingCode())){
+                        returnList.add(accountVO);
+                    }
+                }
+                if(!CollectionUtils.isEmpty(returnList)){
+                    //找出父类不是0的数据 递归找到父类组装成树
+                    List<Accounting> collect = returnList.stream().filter(f -> !f.getParentId().equals(NumberConstant.ZERO_L)).collect(Collectors.toList());
+                    List<Accounting> parentAccounting = new ArrayList<>();
+                    Map<Long, Accounting> accountingMap = allIncome.stream().collect(Collectors.toMap(Accounting::getId, accounting -> accounting, (a, b) -> b));
+                    collect.forEach(accounting -> getParentAccount(accounting, accountingMap, parentAccounting));
+                    if(!CollectionUtils.isEmpty(parentAccounting)){
+                        returnList.addAll(parentAccounting);
+                    }
+                    List<Accounting> accounting = returnList.stream().distinct().collect(Collectors.toList());
+                    return accounting.stream().filter(o -> o.getParentId() == 0)
+                            .peek(o -> o.setChildren(this.getAccountTree(o, accounting)))
+                            .collect(Collectors.toList());
+                }
+            }else {
+                //全部
+                List<Accounting> collect = accountingList.stream().filter(f -> !f.getParentId().equals(NumberConstant.ZERO_L)).collect(Collectors.toList());
+                Map<Long, Accounting> accountingMap = allIncome.stream().collect(Collectors.toMap(Accounting::getId, accounting -> accounting, (a, b) -> b));
+                List<Accounting> parentAccounting = new ArrayList<>();
+
+                collect.forEach(accounting -> getParentAccount(accounting, accountingMap, parentAccounting));
+                if(!CollectionUtils.isEmpty(parentAccounting)){
+                    accountingList.addAll(parentAccounting);
+                }
+                List<Accounting> accounting = accountingList.stream().distinct().collect(Collectors.toList());
+                return   accounting.stream().filter(o -> o.getParentId() == 0)
+                        .peek(o -> o.setChildren(this.getAccountTree(o, accounting)))
+                        .collect(Collectors.toList());
+            }
+        }
+        return new ArrayList<>();
+    }
+
+    /**
+     * 递归查找父类代码
+     * @param accounting 当前会计科目
+     * @param accountingMap 所有会计科目
+     * @param parentAccounting 父类会计科目
+     */
+    private void getParentAccount(Accounting accounting,Map<Long,Accounting> accountingMap,List<Accounting> parentAccounting ){
+        Accounting parentAccount = accountingMap.get(accounting.getParentId());
+        parentAccounting.add(parentAccount);
+        if(!parentAccount.getParentId().equals(NumberConstant.ZERO_L)){
+            getParentAccount(parentAccount, accountingMap, parentAccounting );
+        }
+    }
+
+    private List<Accounting> getAccountTree(Accounting accountVO, List<Accounting> list) {
+        return list.stream().filter(o -> o.getParentId().equals(accountVO.getId()))
+                .peek(o -> o.setChildren(this.getAccountTree(o, list)))
+                .collect(Collectors.toList());
+    }
+    /**
+     * 获取收费项目字典
+     * @param type 类型 1 药品 2 材料 3 项目
+     * @param name  项目名称
+     * @return 字典列表
+     */
+    @Override
+    public Object getAccountingItemDictList(Integer type, String name) {
+        List<OrderItemMap> orderItemMaps = new ArrayList<>();
+        if(type.equals(NumberConstant.ONE)){
+            //药品
+            orderItemMaps = drugService.getItemDict(name);
+        } else if (type.equals(NumberConstant.TWO)) {
+            //材料
+            orderItemMaps = materialService.getItemDict(name);
+        } else {
+            orderItemMaps = itemService.getItemDict(name);
+        }
+        //获取已对照的项目
+        List<AccountingItemMap> itemMaps = repository.getList();
+        if(!CollectionUtils.isEmpty(itemMaps)){
+            List<String> list = itemMaps.stream().map(AccountingItemMap::getItemCode).collect(Collectors.toList());
+            List<OrderItemMap> removeList = orderItemMaps.stream().filter(orderItemMap -> list.contains(orderItemMap.getItemCode())).collect(Collectors.toList());
+            if(!CollectionUtils.isEmpty(removeList)){
+                orderItemMaps.removeAll(removeList);
+            }
+
+        }
+        return orderItemMaps;
+    }
+
+    /**
+     * 获取会计科目
+     * @param current 当前页
+     * @param pageSize 页容量
+     * @param accountingCode 会计科目代码
+     * @param itemName 项目名称
+     * @return 对照列表
+     */
+    @Override
+    public Object getAccountingItemMap(Integer current, Integer pageSize, String accountingCode, String itemName) {
+        Page<AccountingItemMap> page = repository.getPage(current, pageSize, accountingCode, itemName);
+        List<AccountingItemMap> records = page.getRecords();
+        if(CollectionUtils.isEmpty(records)){
+            return new PageUtils(new ArrayList<>(),NumberConstant.ZERO,pageSize,current);
+        }
+        for (AccountingItemMap record : records) {
+            //"药品_1","材料_2","项目_3"
+            String itemType = record.getType();
+            switch (itemType) {
+                case "1":
+                    record.setTypeName("药品");
+                    break;
+                case "2":
+                    record.setTypeName("材料");
+                    break;
+                case "3":
+                    record.setTypeName("项目");
+                    break;
+                default:
+                    record.setTypeName("未知");
+                    break;
+            }
+        }
+        return new PageUtils(records, Math.toIntExact(page.getTotal()),pageSize,current);
+    }
+
+    /**
+     * 添加会计科目项目对照
+     * @param map 入参
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class,propagation = Propagation.REQUIRED)
+    public void addAccountingItemMap(AccountingItemMapRequest map) {
+        List<AccountingItemMap> itemMaps = map.getItemMaps();
+        if(CollectionUtils.isEmpty(itemMaps)){
+            throw new CostException("未找到需要保存的数据");
+        }
+
+        for (AccountingItemMap itemMap : itemMaps) {
+            itemMap.setHospId(UserContext.getHospId());
+            itemMap.setCreateTime(new Date());
+            itemMap.setCreateUser(String.valueOf(UserContext.getCurrentUser().getId()));
+            itemMap.setAccountingCode(map.getAccountingCode());
+            itemMap.setAccountingName(map.getAccountingName());
+        }
+        repository.saveBatch(itemMaps);
+
+    }
+
+    /**
+     * 单个删除
+     * @param id 主键
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class,propagation = Propagation.REQUIRED)
+    public void deleteAccountingItemMap(Integer id) {
+        repository.batchDelete(Collections.singletonList(id));
+
+    }
+
+    /**
+     * 批量删除
+     * @param ids 主键
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class,propagation = Propagation.REQUIRED)
+    public void batchDeleteAccountingItemMap(List<Integer> ids) {
+        repository.batchDelete(ids);
+    }
+}

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

@@ -129,7 +129,7 @@ public class AccountingServiceImpl extends ServiceImpl<AccountingMapper, Account
         accounting.setCreateTime(System.currentTimeMillis());
         // 如果是支出类型
         if (accountingSaveDTO.getAccountingType().equals(2)) {
-            Integer isBaseCode = accountingSaveDTO.getIsBaseCode();
+            Integer isBaseCode = accountingSaveDTO.getIsBaseCost();
             if (Objects.isNull(isBaseCode)) {
                 throw new CostException(500, "支出类型需要选择是否固定支出成本");
             }

+ 14 - 1
src/main/java/com/kcim/service/impl/ComputeDiseaseCostServiceImpl.java

@@ -59,6 +59,8 @@ public class ComputeDiseaseCostServiceImpl implements ComputeDiseaseCostService
     ComputePatientCostRepository computePatientCostRepository;
 
     ComputeItemCostService computeItemCostService;
+
+    DiseaseTypeDiagMapRepository diagMapRepository;
     /**
      * 病种成本计算获取列表-分页
      *
@@ -108,7 +110,18 @@ public class ComputeDiseaseCostServiceImpl implements ComputeDiseaseCostService
                 throw new CostException("当前核算年月【"+computeDate+"】未计算病人成本信息,请先计算病人成本信息,当前计算中止");
             }
             Map<String, ComputePatientCostGroupByDepartmentDto> computeItemGroup = patientCostDepartmentGroup.stream().collect(Collectors.toMap(ComputePatientCostGroupByDepartmentDto::getDepartmentCode, dto -> dto, (a, b) -> b));
-
+            Map<String, String> diagDiseaseMap = diagMapRepository.getDiagDiseaseMap();
+            //病种与诊断对照
+            if(!CollectionUtils.isEmpty(diagDiseaseMap)){
+                for (ImportPatientInfo patientInfo : patientInfos) {
+                    if(!StringUtils.isEmpty(patientInfo.getPrimaryDiagCode())){
+                        String diseaseType = diagDiseaseMap.get(patientInfo.getPrimaryDiagCode());
+                        if(!StringUtils.isEmpty(diseaseType)){
+                            patientInfo.setDiseaseTypeCode(diseaseType);
+                        }
+                    }
+                }
+            }
             //过滤掉病种分类为空的数据
             List<ImportPatientInfo> patientInfoList = patientInfos.stream().filter(patientInfo -> !StringUtils.isEmpty(patientInfo.getDiseaseTypeCode())).collect(Collectors.toList());
             //按病种分类和科室进行分组

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

@@ -166,6 +166,8 @@ public class ComputeItemCostServiceImpl implements ComputeItemCostService {
                 String typeCode = item.getItemTypeCode();
                 itemCost.setItemTypeCode(typeCode);
                 itemCost.setItemType(item.getItemType());
+                itemCost.setOrderCode(item.getOrderCode());
+                itemCost.setOrderName(item.getOrderName());
                 itemCost.setIndex(i);
                 saveCost.add(itemCost);
                 costDetail.setIndex(i);

+ 31 - 12
src/main/java/com/kcim/service/impl/DepartmentServiceImpl.java

@@ -17,8 +17,10 @@ import com.kcim.dao.mapper.DepartmentMapper;
 import com.kcim.dao.model.Department;
 import com.kcim.dao.model.Hospital;
 import com.kcim.dao.model.dto.DepartmentRequest;
+import com.kcim.service.CenterService;
 import com.kcim.vo.DepartmentVO;
 import com.kcim.service.DepartmentService;
+import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -27,18 +29,17 @@ import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
 import org.springframework.util.StringUtils;
 
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
+import java.util.*;
 import java.util.stream.Collectors;
 
 @Slf4j
 @Service("departmentService")
+@AllArgsConstructor
 public class DepartmentServiceImpl extends ServiceImpl<DepartmentMapper, Department> implements DepartmentService {
 
-    @Autowired
     private HospitalServiceImpl hospitalService;
+
+    private CenterService centerService;
     /**
      * 分页查询科室信息
      *
@@ -79,13 +80,31 @@ public class DepartmentServiceImpl extends ServiceImpl<DepartmentMapper, Departm
      */
     @Override
     public List<Department> getByDepartment(Integer id,String departmentName,String departmentCode,Long hospId) {
-        LambdaQueryWrapper<Department> wrapper = new QueryWrapper<Department>().lambda()
-                .eq(!StringUtils.isEmpty(id), Department::getId, id)
-                .like(!StringUtils.isEmpty(departmentName), Department::getDepartmentName, departmentName)
-                .eq(!StringUtils.isEmpty(departmentCode), Department::getDepartmentCode, departmentCode)
-                .eq(!StringUtils.isEmpty(hospId), Department::getHospId, hospId)
-                .orderByDesc(Department::getCreateTime);
-        List<Department> departmentList = baseMapper.selectList(wrapper);
+//        LambdaQueryWrapper<Department> wrapper = new QueryWrapper<Department>().lambda()
+//                .eq(!StringUtils.isEmpty(id), Department::getId, id)
+//                .like(!StringUtils.isEmpty(departmentName), Department::getDepartmentName, departmentName)
+//                .eq(!StringUtils.isEmpty(departmentCode), Department::getDepartmentCode, departmentCode)
+//                .eq(!StringUtils.isEmpty(hospId), Department::getHospId, hospId)
+//                .orderByDesc(Department::getCreateTime);
+//        List<Department> departmentList = baseMapper.selectList(wrapper);
+        Map<String, String> department = centerService.getDepartment();
+        List<Department> departmentList = new ArrayList<>();
+        if(!CollectionUtils.isEmpty(department)){
+            Long i = 1L;
+            for (String s : department.keySet()) {
+                Department depart = new Department();
+                depart.setId(i);
+                depart.setDepartmentCode(s);
+                depart.setDepartmentName(department.get(s));
+                departmentList.add(depart);
+                i++;
+            }
+
+        }
+
+
+
+
         return departmentList;
     }
 

+ 31 - 6
src/main/java/com/kcim/service/impl/DiseaseTypeDiagMapServiceImpl.java

@@ -16,6 +16,7 @@ import com.kcim.common.util.excel.ExcelStyleUtil;
 import com.kcim.common.util.excel.entity.DiseaseTypeMapImportEntity;
 import com.kcim.dao.model.DiseaseType;
 import com.kcim.dao.model.DiseaseTypeDiagMap;
+import com.kcim.dao.model.Item;
 import com.kcim.dao.repository.DiseaseTypeDiagMapRepository;
 import com.kcim.dao.repository.DiseaseTypeRepository;
 import com.kcim.service.DiseaseTypeDiagMapService;
@@ -80,6 +81,10 @@ public class DiseaseTypeDiagMapServiceImpl implements DiseaseTypeDiagMapService
      */
     @Override
     public void addDiseaseTypeMap(DiseaseTypeDiagMap request) {
+        List<DiseaseTypeDiagMap> byCode = repository.getByDiagCode(request.getDiagCode());
+        if(!CollectionUtils.isEmpty(byCode)){
+            throw new CostException("当前诊断代码已存在,请修改后再保存");
+        }
         request.setHospId(UserContext.getCurrentLoginHospId());
         request.setCreateTime(new Date());
         request.setCreateUser(String.valueOf(UserContext.getCurrentUser().getId()));
@@ -106,12 +111,19 @@ public class DiseaseTypeDiagMapServiceImpl implements DiseaseTypeDiagMapService
             throw new CostException("编辑诊断时,主键必填");
         }
         DiseaseTypeDiagMap diagMap = repository.getById(id);
+        DiseaseTypeDiagMap oneByCode = repository.getOneByDiagCode(request.getDiagCode());
+
         if(Objects.nonNull(diagMap)){
-            BeanUtil.convertObj(request,diagMap);
-            diagMap.setUpdateTime(new Date());
-            diagMap.setUpdateUser(String.valueOf(UserContext.getCurrentUser().getId()));
-            repository.updateById(diagMap);
+            if(Objects.isNull(oneByCode)||oneByCode.getId().equals(id)){
+                BeanUtil.convertObj(request,diagMap);
+                diagMap.setUpdateTime(new Date());
+                diagMap.setUpdateUser(String.valueOf(UserContext.getCurrentUser().getId()));
+                repository.updateById(diagMap);
+            }else {
+                throw new CostException("当前诊断代码已存在,请修改后再保存");
+            }
         }
+
     }
 
     /**
@@ -227,11 +239,24 @@ public class DiseaseTypeDiagMapServiceImpl implements DiseaseTypeDiagMapService
         if(CollectionUtils.isEmpty(diagMaps)){
             throw new CostException("当前院区未添加诊断字典,添先添加诊断再进行对照");
         }
-        Map<String,DiseaseType> map = list.stream().collect(Collectors.toMap(DiseaseType::getCode, type -> type, (a, b) -> b));
+        for (DiseaseType diseaseType : list) {
+            String code = diseaseType.getCode();
+            String replace = code.replace(".", "");
+            if(replace.length()>3){
+                String subStr = replace.substring(0, 4);
+                diseaseType.setReplaceCode(subStr);
+            }else {
+                diseaseType.setReplaceCode(replace);
+            }
+
+        }
+
+
+        Map<String,DiseaseType> map = list.stream().collect(Collectors.toMap(DiseaseType::getReplaceCode, type -> type, (a, b) -> b));
         List<DiseaseTypeDiagMap> collect = diagMaps.stream().filter(f -> StringUtils.isEmpty(f.getDiseaseTypeCode())).collect(Collectors.toList());
         if(!CollectionUtils.isEmpty(collect)){
             for (DiseaseTypeDiagMap diagMap : collect) {
-                String diagCode = diagMap.getDiagCode();
+                String diagCode = diagMap.getIcdCode();
                 if(!StringUtils.isEmpty(diagCode)){
                     String replace = diagCode.replace(".", "");
                     String subStr = replace.substring(0, 4);

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

@@ -263,7 +263,7 @@ public class DrugServiceImpl implements DrugService {
     }
 
     @Override
-    public Object getItemDict(String name) {
+    public List<OrderItemMap> getItemDict(String name) {
         List<Drug> list = repository.getList(name);
         if(CollectionUtils.isEmpty(list)){
             return new ArrayList<>();

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

@@ -278,7 +278,7 @@ public class ItemServiceImpl implements ItemService {
     }
 
     @Override
-    public Object getItemDict(String name) {
+    public List<OrderItemMap>  getItemDict(String name) {
         List<Item> list = repository.getList(name);
         if(CollectionUtils.isEmpty(list)){
             return new ArrayList<>();

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

@@ -245,7 +245,7 @@ public class MaterialServiceImpl implements MaterialService {
     }
 
     @Override
-    public Object getItemDict(String name) {
+    public List<OrderItemMap>  getItemDict(String name) {
         List<Material> list = repository.getList(name);
         if(CollectionUtils.isEmpty(list)){
             return new ArrayList<>();

+ 12 - 0
src/main/java/com/kcim/service/impl/OrderCostDetailServiceImpl.java

@@ -0,0 +1,12 @@
+package com.kcim.service.impl;
+
+import com.kcim.service.OrderCostDetailService;
+import org.springframework.stereotype.Service;
+
+
+
+@Service("OrderCostDetailService")
+public class OrderCostDetailServiceImpl  implements OrderCostDetailService {
+
+
+}

+ 202 - 0
src/main/java/com/kcim/service/impl/OrderCostServiceImpl.java

@@ -0,0 +1,202 @@
+package com.kcim.service.impl;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.kcim.common.constants.NumberConstant;
+import com.kcim.common.enums.ReportItemTypeEnum;
+import com.kcim.common.exception.CostException;
+import com.kcim.common.util.BeanUtil;
+import com.kcim.common.util.PageUtils;
+import com.kcim.common.util.UserContext;
+import com.kcim.dao.model.*;
+import com.kcim.dao.model.dto.ComputeGroupCostPageDto;
+import com.kcim.dao.model.dto.ComputeItemGroupByOrder;
+import com.kcim.dao.model.dto.ComputeOrderCostPageDto;
+import com.kcim.dao.repository.ComputeItemCostRepository;
+import com.kcim.dao.repository.ImportPatientInfoRepository;
+import com.kcim.dao.repository.OrderCostDetailRepository;
+import com.kcim.dao.repository.OrderCostRepository;
+import com.kcim.service.ComputeItemCostService;
+import com.kcim.service.OrderCostService;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import java.math.BigDecimal;
+import java.util.*;
+import java.util.stream.Collectors;
+
+
+@Service("OrderCostService")
+@Slf4j
+@AllArgsConstructor
+public class OrderCostServiceImpl  implements OrderCostService {
+
+    OrderCostRepository repository;
+
+    OrderCostDetailRepository detailRepository;
+
+    ImportPatientInfoRepository importPatientInfoRepository;
+
+    ComputeItemCostRepository computeItemCostRepository;
+
+    ComputeItemCostService computeItemCostService;
+    /**
+     * @param current
+     * @param pageSize
+     * @param computeDate
+     * @param orderName
+     * @return
+     */
+    @Override
+    public Object orderCostCalculateList(Integer current, Integer pageSize, String computeDate, String orderName) {
+        Page<ComputeOrderCostPageDto> page = repository.getByPage(current, pageSize, computeDate, orderName);
+        if(CollectionUtils.isEmpty(page.getRecords())){
+            return new PageUtils(new ArrayList<>(), NumberConstant.ZERO,pageSize,current);
+        }
+        return new PageUtils(page.getRecords(), Math.toIntExact(page.getTotal()),pageSize,current);
+    }
+
+    /**
+     * 计算医嘱项目成本
+     * @param computeDate 核算年月
+     */
+    @Override
+    public void orderCostCalculate(String computeDate) {
+        //获取患者信息
+        List<ImportPatientInfo> patientInfos = importPatientInfoRepository.getByComputeDate(computeDate);
+        if(CollectionUtils.isEmpty(patientInfos)){
+            throw new CostException("当前核算年月未导入患者信息");
+        }
+        List<ComputeItemGroupByOrder> itemCostList = computeItemCostRepository.getByComputeDateGroupByOrder(computeDate);
+        if (CollectionUtils.isEmpty(itemCostList)){
+            throw new CostException("收费项目成本未计算,请先计算收费项目成本");
+
+        }
+        Map<String,ImportPatientInfo> patientInfoMap = patientInfos.stream().collect(Collectors.toMap(ImportPatientInfo::getVisitNo, importPatientInfo -> importPatientInfo, (a, b) -> b));
+
+
+        //组装患者所在科室
+        for (ComputeItemGroupByOrder groupByOrder : itemCostList) {
+            groupByOrder.setDepartCode(patientInfoMap.get(groupByOrder.getVisitNo()).getDepartmentCode());
+            groupByOrder.setDepartName(patientInfoMap.get(groupByOrder.getVisitNo()).getDepartmentName());
+        }
+        //按医嘱分组
+        Map<String, List<ComputeItemGroupByOrder>> collect = itemCostList.stream().collect(Collectors.groupingBy(ComputeItemGroupByOrder::getOrderCode));
+        OrderCost orderCost = new OrderCost();
+        orderCost.setComputeDate(computeDate);
+        orderCost.setHospId(UserContext.getHospId());
+        orderCost.setCreateUser(String.valueOf(UserContext.getCurrentUser().getId()));
+        orderCost.setCreateTime(new Date());
+        OrderCostDetail orderCostDetail = new OrderCostDetail();
+        orderCostDetail.setHospId(UserContext.getHospId());
+        orderCostDetail.setCreateUser(String.valueOf(UserContext.getCurrentUser().getId()));
+        orderCostDetail.setCreateTime(new Date());
+
+        int index = 0;
+        List<OrderCost> saveOrderCost = new ArrayList<>();
+        List<OrderCostDetail> details = new ArrayList<>();
+        //按科室分组
+        for (String orderCode : collect.keySet()) {
+            List<ComputeItemGroupByOrder> computeItemGroupByOrders = collect.get(orderCode);
+            String orderName = computeItemGroupByOrders.get(0).getOrderName();
+            Map<String, List<ComputeItemGroupByOrder>> collect1 = computeItemGroupByOrders.stream().collect(Collectors.groupingBy(ComputeItemGroupByOrder::getDepartCode));
+            //科室下所有数据求和
+            for (String departCode : collect1.keySet()) {
+                List<ComputeItemGroupByOrder> departmentList = collect1.get(departCode);
+                String departName = departmentList.get(0).getDepartName();
+                OrderCost order = BeanUtil.convertObj(orderCost, OrderCost.class);
+                order.setCode(orderCode);
+                order.setName(orderName);
+                order.setDepartmentCode(departCode);
+                order.setDepartmentName(departName);
+                order.setIndex(index);
+                getDetails(orderCostDetail, index, details, departmentList);
+                saveOrderCost.add(order);
+                index++;
+            }
+
+        }
+        if(!CollectionUtils.isEmpty(saveOrderCost)){
+            //作废当前核算年月已有数据
+            List<Integer> integers = repository.removeByComputeDate(computeDate);
+            if(!CollectionUtils.isEmpty(integers)){
+                detailRepository.removeByOrderCostId(integers);
+            }
+            repository.saveBatch(saveOrderCost,100);
+            if(!CollectionUtils.isEmpty(saveOrderCost)){
+                Map<Integer,Integer> indexId = saveOrderCost.stream().collect(Collectors.toMap(OrderCost::getIndex, OrderCost::getId, (a, b) -> b));
+                Map<Integer, List<OrderCostDetail>> indexGroup = details.stream().collect(Collectors.groupingBy(OrderCostDetail::getIndex));
+                List<OrderCostDetail> saveCostDetails = new ArrayList<>();
+                indexGroup.keySet().forEach(integer -> {
+                    Integer costId = indexId.get(integer);
+                    List<OrderCostDetail> detailList = indexGroup.get(integer);
+                    detailList.forEach(detail -> detail.setOrderCostId(costId));
+                    saveCostDetails.addAll(detailList);
+                });
+                detailRepository.saveBatch(saveCostDetails,500);
+            }
+        }
+
+    }
+
+    private void getDetails(OrderCostDetail orderCostDetail, int index, List<OrderCostDetail> details, List<ComputeItemGroupByOrder> departmentList) {
+        //药品收入
+        BigDecimal drugIncome = new BigDecimal("0.0000");
+        //材料收入
+        BigDecimal materialIncome = new BigDecimal("0.0000");
+        //项目收入
+        BigDecimal itemIncome = new BigDecimal("0.0000");
+        //药品成本
+        BigDecimal drugCost = new BigDecimal("0.0000");
+        //材料成本
+        BigDecimal materialCost = new BigDecimal("0.0000");
+        //项目成本
+        BigDecimal itemCost = new BigDecimal("0.0000");
+        //人力成本
+        BigDecimal empCost = new BigDecimal("0.0000");
+        //设备成本
+        BigDecimal equipmentCost = new BigDecimal("0.0000");
+        //空间成本
+        BigDecimal spaceCost = new BigDecimal("0.0000");
+        for (ComputeItemGroupByOrder computeItemGroupByOrder : departmentList) {
+            drugIncome = drugIncome.add(computeItemGroupByOrder.getDrugIncome());
+            materialIncome = materialIncome.add(computeItemGroupByOrder.getMaterialIncome());
+            itemIncome = itemIncome.add(computeItemGroupByOrder.getItemIncome());
+            drugCost = drugCost.add(computeItemGroupByOrder.getDrugCost());
+            materialCost = materialCost.add(computeItemGroupByOrder.getMaterialCost());
+            itemCost = itemCost.add(computeItemGroupByOrder.getItemCost());
+            empCost = empCost.add(computeItemGroupByOrder.getEmpCost());
+            equipmentCost = equipmentCost.add(computeItemGroupByOrder.getEquipmentCost());
+            spaceCost = spaceCost.add(computeItemGroupByOrder.getSpaceCost());
+        }
+        List<String> itemTypeList = computeItemCostService.getItemTypeList();
+        for (String s : itemTypeList) {
+            OrderCostDetail detail = BeanUtil.convertObj(orderCostDetail, OrderCostDetail.class);
+            detail.setType(s);
+            detail.setIndex(index);
+            if(s.equals(ReportItemTypeEnum.DRUG_INCOME.getCode())){
+                detail.setComputeResult(drugIncome);
+            }else if (s.equals(ReportItemTypeEnum.MATERIAL_INCOME.getCode())) {
+                detail.setComputeResult(materialIncome);
+            }else if (s.equals(ReportItemTypeEnum.ITEM_INCOME.getCode())) {
+                detail.setComputeResult(itemIncome);
+            }else if (s.equals(ReportItemTypeEnum.DRUG_COST.getCode())) {
+                detail.setComputeResult(drugCost);
+            }else if (s.equals(ReportItemTypeEnum.MATERIAL_COST.getCode())) {
+                detail.setComputeResult(materialCost);
+            }else if (s.equals(ReportItemTypeEnum.ITEM_COST.getCode())) {
+                detail.setComputeResult(itemCost);
+            }else if (s.equals(ReportItemTypeEnum.EMP_COST.getCode())) {
+                detail.setComputeResult(empCost);
+            }else if (s.equals(ReportItemTypeEnum.EQUIPMENT_COST.getCode())) {
+                detail.setComputeResult(equipmentCost);
+            }else if (s.equals(ReportItemTypeEnum.SPACE_COST.getCode())) {
+                detail.setComputeResult(spaceCost);
+            }  else {
+                detail.setComputeResult(BigDecimal.ZERO);
+            }
+            details.add(detail);
+        }
+    }
+}

+ 91 - 32
src/main/java/com/kcim/service/impl/OrderServiceImpl.java

@@ -14,16 +14,13 @@ import com.kcim.common.util.PageUtils;
 import com.kcim.common.util.UserContext;
 import com.kcim.common.util.excel.ExcelStyleUtil;
 import com.kcim.common.util.excel.entity.OrderImportEntity;
-import com.kcim.common.util.excel.handler.ItemTypeHandler;
 import com.kcim.common.util.excel.handler.OrderTypeHandler;
-import com.kcim.dao.model.Item;
 import com.kcim.dao.model.Order;
 import com.kcim.dao.model.OrderItemMap;
 import com.kcim.dao.repository.ItemRepository;
 import com.kcim.dao.repository.OrderItemMapRepository;
 import com.kcim.dao.repository.OrderRepository;
-import com.kcim.service.CenterService;
-import com.kcim.service.OrderService;
+import com.kcim.service.*;
 import com.kcim.vo.DictDataVo;
 import com.kcim.web.request.OrderItemRequest;
 import lombok.AllArgsConstructor;
@@ -67,10 +64,17 @@ public class OrderServiceImpl implements OrderService {
 
     ItemRepository itemRepository;
 
+    DrugService drugService;
+
+    MaterialService materialService;
+
+    ItemService itemService;
+
     /**
-     * @param orderType
-     * @param orderName
-     * @return
+     * 获取医嘱列表
+     * @param orderType 医嘱类型
+     * @param orderName 医嘱名称
+     * @return 医嘱列表
      */
     @Override
     public Object getOrderList(String orderType, String orderName) {
@@ -88,7 +92,8 @@ public class OrderServiceImpl implements OrderService {
     }
 
     /**
-     * @param request
+     * 新增医嘱
+     * @param request 入参
      */
     @Override
     @Transactional(rollbackFor = Exception.class,propagation = Propagation.REQUIRED)
@@ -105,7 +110,8 @@ public class OrderServiceImpl implements OrderService {
     }
 
     /**
-     * @param request
+     * 编辑医嘱
+     * @param request 入参
      */
     @Override
     @Transactional(rollbackFor = Exception.class,propagation = Propagation.REQUIRED)
@@ -129,7 +135,8 @@ public class OrderServiceImpl implements OrderService {
     }
 
     /**
-     * @param id
+     * 删除医嘱
+     * @param id 主键
      */
     @Override
     @Transactional(rollbackFor = Exception.class,propagation = Propagation.REQUIRED)
@@ -139,7 +146,8 @@ public class OrderServiceImpl implements OrderService {
     }
 
     /**
-     * @return
+     * 获取医嘱类型
+     * @return 医嘱类型字典
      */
     @Override
     public Object getOrderType() {
@@ -148,8 +156,9 @@ public class OrderServiceImpl implements OrderService {
     }
 
     /**
-     * @param response
-     * @return
+     * 导出医嘱模版
+     * @param response 出参
+     * @return 出参
      */
     @SneakyThrows
     @Override
@@ -177,8 +186,7 @@ public class OrderServiceImpl implements OrderService {
             String fileName ="医嘱项目成本导入模版";
             response.setHeader("Content-Disposition",  URLEncoder.encode(fileName, "UTF-8"));
             workbook.write(response.getOutputStream());
-//                workbook.write(outputStream);
-//                outputStream.close();
+
             workbook.close();
             log.info("导出文件:{}",fileName);
         } catch (FileNotFoundException e) {
@@ -190,7 +198,8 @@ public class OrderServiceImpl implements OrderService {
     }
 
     /**
-     * @param file
+     * 导入医嘱
+     * @param file excel 文 件
      */
     @Override
     @Transactional(rollbackFor = Exception.class,propagation = Propagation.REQUIRED)
@@ -224,7 +233,7 @@ public class OrderServiceImpl implements OrderService {
 
             List<DictDataVo> dataVoList = dict.getDataVoList();
             //设置导出样式
-            params.setDictHandler(new ItemTypeHandler(dataVoList));
+            params.setDictHandler(new OrderTypeHandler(dataVoList));
             List<OrderImportEntity> orderImportEntities  = ExcelImportUtil.importExcel(stream, OrderImportEntity.class,params);
             if(!CollectionUtils.isEmpty(orderImportEntities)){
                 List<Order> saveList = new ArrayList<>();
@@ -272,11 +281,12 @@ public class OrderServiceImpl implements OrderService {
     }
 
     /**
-     * @param current
-     * @param pageSize
-     * @param orderCode
-     * @param itemName
-     * @return
+     * 按分页获取医嘱列表
+     * @param current 当前页
+     * @param pageSize 页容量
+     * @param orderCode 医嘱代码
+     * @param itemName 项目名称
+     * @return 列表
      */
     @Override
     public Object getOrderItemList(Integer current, Integer pageSize, String orderCode, String itemName) {
@@ -285,17 +295,31 @@ public class OrderServiceImpl implements OrderService {
         if(CollectionUtils.isEmpty(records)){
             return new PageUtils(new ArrayList<>(), NumberConstant.ZERO,pageSize,current);
         }
-        List<Item> list = itemRepository.getList();
-        Map<String,String> itemMap = list.stream().collect(Collectors.toMap(Item::getCode, Item::getType, (a, b) -> b));
         for (OrderItemMap record : records) {
-            record.setItemType(itemMap.get(record.getItemCode()));
+            //"药品_1","材料_2","项目_3"
+            String itemType = record.getItemType();
+            switch (itemType) {
+                case "1":
+                    record.setItemTypeName("药品");
+                    break;
+                case "2":
+                    record.setItemTypeName("材料");
+                    break;
+                case "3":
+                    record.setItemTypeName("项目");
+                    break;
+                default:
+                    record.setItemTypeName("未知");
+                    break;
+            }
         }
         return new PageUtils(records, Math.toIntExact(page.getTotal()),pageSize,current);
 
     }
 
     /**
-     * @param request
+     * 添加医嘱项目
+     * @param request 入参
      */
     @Override
     @Transactional(rollbackFor = Exception.class,propagation = Propagation.REQUIRED)
@@ -305,20 +329,22 @@ public class OrderServiceImpl implements OrderService {
         if(CollectionUtils.isEmpty(items)){
             throw new CostException("未传入任何需要保存的数据,无需保存");
         }
-        orderItemMapRepository.removeByOrderCode(orderCode);
+//        orderItemMapRepository.removeByOrderCode(orderCode);
         for (OrderItemMap item : items) {
             item.setOrderCode(orderCode);
             item.setCreateTime(new Date());
             item.setCreateUser(String.valueOf(UserContext.getCurrentUser().getId()));
             item.setHospId(UserContext.getHospId());
             item.setNum(BigDecimal.ONE);
+            item.setItemType(item.getItemType());
         }
         orderItemMapRepository.saveBatch(items);
 
     }
 
     /**
-     * @param request
+     * 编辑医嘱项目列表
+     * @param request 入参
      */
     @Override
     @Transactional(rollbackFor = Exception.class,propagation = Propagation.REQUIRED)
@@ -338,7 +364,8 @@ public class OrderServiceImpl implements OrderService {
     }
 
     /**
-     * @param id
+     * 单个删除
+     * @param id 主键
      */
     @Override
     @Transactional(rollbackFor = Exception.class,propagation = Propagation.REQUIRED)
@@ -347,7 +374,8 @@ public class OrderServiceImpl implements OrderService {
     }
 
     /**
-     * @param ids
+     * 批量删除医嘱项目
+     * @param ids 主键列表
      */
     @Override
     @Transactional(rollbackFor = Exception.class,propagation = Propagation.REQUIRED)
@@ -356,9 +384,40 @@ public class OrderServiceImpl implements OrderService {
 
     }
 
+    /**
+     * 获取项目字典
+     * @param type 类型
+     * @param orderCode 医嘱代码
+     * @param name 项目名称
+     * @return 字典列表
+     */
     @Override
-    public Object getItemDict() {
-        return null;
+    public Object getItemDict(Integer type, String orderCode, String name) {
+        List<OrderItemMap> orderItemMaps = new ArrayList<>();
+        if(type.equals(NumberConstant.ONE)){
+            //药品
+            orderItemMaps = drugService.getItemDict(name);
+        } else if (type.equals(NumberConstant.TWO)) {
+            //材料
+            orderItemMaps = materialService.getItemDict(name);
+        } else if (type.equals(NumberConstant.THREE)) {
+            //收费项目
+            orderItemMaps = itemService.getItemDict(name);
+        }else {
+            orderItemMaps = itemService.getItemDict(name);
+        }
+        //获取已对照的项目
+        List<OrderItemMap> byOrderCode = orderItemMapRepository.getByOrderCode(orderCode);
+        if(!CollectionUtils.isEmpty(byOrderCode)){
+            List<String> list = byOrderCode.stream().map(OrderItemMap::getItemCode).collect(Collectors.toList());
+
+            List<OrderItemMap> removeList = orderItemMaps.stream().filter(orderItemMap -> list.contains(orderItemMap.getItemCode())).collect(Collectors.toList());
+            if(!CollectionUtils.isEmpty(removeList)){
+                orderItemMaps.removeAll(removeList);
+            }
+
+        }
+        return orderItemMaps;
     }
 
     private void check() {

+ 76 - 11
src/main/java/com/kcim/service/impl/PatientInfoImportServiceImpl.java

@@ -9,8 +9,10 @@ import cn.afterturn.easypoi.excel.entity.result.ExcelVerifyHandlerResult;
 import cn.afterturn.easypoi.handler.inter.IExcelVerifyHandler;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.kcim.common.constants.NumberConstant;
+import com.kcim.common.enums.DateStyleEnum;
 import com.kcim.common.exception.CostException;
 import com.kcim.common.util.BeanUtil;
+import com.kcim.common.util.DateUtils;
 import com.kcim.common.util.PageUtils;
 import com.kcim.common.util.UserContext;
 import com.kcim.common.util.excel.ExcelStyleUtil;
@@ -34,6 +36,8 @@ import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.io.InputStream;
 import java.net.URLEncoder;
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
@@ -69,6 +73,13 @@ public class PatientInfoImportServiceImpl implements PatientInfoImportService {
         Page<ImportPatientInfo> page = repository.getPage(current, pageSize, computeDate, departmentName, patientName);
         List<ImportPatientInfo> records = page.getRecords();
         if(!CollectionUtils.isEmpty(records)){
+            for (ImportPatientInfo record : records) {
+                Integer bedDays = calculateBedDays(record.getInHospitalTime(), record.getOutHospitalTime());
+                Integer bedDays1 = calculateCurrentBedDays(record.getInHospitalTime(), record.getOutHospitalTime(), computeDate);
+                System.out.println("visitNo:"+record.getVisitNo()+"床日数:"+bedDays+"|当前床日数:"+bedDays1);
+            }
+
+
             return new PageUtils(records, Math.toIntExact(page.getTotal()),pageSize,current);
         }
         return new PageUtils(new ArrayList<>(), NumberConstant.ZERO,pageSize,current);
@@ -156,9 +167,7 @@ public class PatientInfoImportServiceImpl implements PatientInfoImportService {
             List<PatientInfoImportEntity> patientInfoImportEntities  = ExcelImportUtil.importExcel(stream, PatientInfoImportEntity.class,params);
             if(!CollectionUtils.isEmpty(patientInfoImportEntities)){
                 //获取病种对照
-                Map<String, String> diagDiseaseMap = diagMapRepository.getDiagDiseaseMap();
-
-
+//                Map<String, String> diagDiseaseMap = diagMapRepository.getDiagDiseaseMap();
                 List<ImportPatientInfo> saveList = new ArrayList<>();
                 ImportPatientInfo importPatientInfo = new ImportPatientInfo();
                 importPatientInfo.setHospId(UserContext.getHospId());
@@ -174,14 +183,14 @@ public class PatientInfoImportServiceImpl implements PatientInfoImportService {
                     patientInfo.setDepartmentName(entity.getDepartmentName());
                     patientInfo.setType(entity.getType());
                     patientInfo.setPrimaryDiagCode(entity.getPrimaryDiagCode());
-                    if(!CollectionUtils.isEmpty(diagDiseaseMap)){
-                        if(!StringUtils.isEmpty(patientInfo.getPrimaryDiagCode())){
-                            String diseaseType = diagDiseaseMap.get(patientInfo.getPrimaryDiagCode());
-                            if(!StringUtils.isEmpty(diseaseType)){
-                                patientInfo.setDiseaseTypeCode(diseaseType);
-                            }
-                        }
-                    }
+//                    if(!CollectionUtils.isEmpty(diagDiseaseMap)){
+//                        if(!StringUtils.isEmpty(patientInfo.getPrimaryDiagCode())){
+//                            String diseaseType = diagDiseaseMap.get(patientInfo.getPrimaryDiagCode());
+//                            if(!StringUtils.isEmpty(diseaseType)){
+//                                patientInfo.setDiseaseTypeCode(diseaseType);
+//                            }
+//                        }
+//                    }
                     patientInfo.setPrimaryDiagName(entity.getPrimaryDiagName());
                     patientInfo.setSecondaryDiagCode(entity.getSecondaryDiagCode());
                     patientInfo.setSecondaryDiagName(entity.getSecondaryDiagName());
@@ -196,6 +205,15 @@ public class PatientInfoImportServiceImpl implements PatientInfoImportService {
                     patientInfo.setInHospitalTime(entity.getInHospitalTime());
                     patientInfo.setOutHospitalTime(entity.getOutHospitalTime());
                     patientInfo.setInHospitalDays(entity.getInHospitalDays());
+                    patientInfo.setInpatientWardCode(entity.getInpatientWardCode());
+                    patientInfo.setInpatientWardName(entity.getInpatientWardName());
+                    //添加计算床日数
+                    if(patientInfo.getOutHospitalTime() !=null){
+                        Integer bedDays = calculateBedDays(patientInfo.getInHospitalTime(), patientInfo.getOutHospitalTime());
+                        patientInfo.setBedDays(bedDays);
+                    }
+                    Integer currentBedDays = calculateCurrentBedDays(patientInfo.getInHospitalTime(), patientInfo.getOutHospitalTime(), computeDate);
+                    patientInfo.setCurrentBedDays(currentBedDays);
                     saveList.add(patientInfo);
                 }
                 if(!CollectionUtils.isEmpty(saveList)){
@@ -220,7 +238,54 @@ public class PatientInfoImportServiceImpl implements PatientInfoImportService {
             repository.updateBatchById(byComputeDate);
             List<Integer> collect = byComputeDate.stream().map(ImportPatientInfo::getId).collect(Collectors.toList());
             repository.removeBatchByIds(collect);
+        }
+    }
 
+    private Integer calculateBedDays(Date inHospitalDate,Date outHospitalDate){
+        int intervalDays = DateUtils.getIntervalDays(inHospitalDate, outHospitalDate);
+        if(intervalDays == NumberConstant.ZERO){
+            intervalDays = NumberConstant.ONE;
         }
+        return intervalDays;
+
+    }
+
+    private Integer calculateCurrentBedDays(Date inHospitalDate,Date outHospitalDate,String computeDate){
+//        入院日期=实际入院日期>当月最小日期?实际入院日期:当月最小日期
+//        出院日期=实际出院日期>当月最大日期?当月最大日期:实际出院日期
+//        床日数=出院日期-入院日期,如果是当日入出院算1天(算出来的床日数为0时算1天)
+//        实际出院日期>当月最大日期或没有出院日期时,床日数需+1
+        Date date = DateUtils.StringToDate(computeDate, DateStyleEnum.YYYY_MM);
+        Date firstDateOfMonth = DateUtils.getFirstDateOfMonth(date);
+        Date lastDateOfMonth = DateUtils.getLastDateOfMonth(date);
+        Date currentOutHospitalDate ;
+        int currentBedDays ;
+        Date currentInHospitalDate = inHospitalDate.compareTo(firstDateOfMonth) >= 0 ? inHospitalDate : firstDateOfMonth;
+        if(outHospitalDate == null){
+            currentOutHospitalDate = lastDateOfMonth;
+            currentBedDays =  DateUtils.getIntervalDays(currentOutHospitalDate,currentInHospitalDate) + 1;
+        }else {
+            boolean last = false;
+            if(outHospitalDate.compareTo(firstDateOfMonth)>=0){
+                if (outHospitalDate.compareTo(lastDateOfMonth) >= 0) {
+                    currentOutHospitalDate = lastDateOfMonth;
+                    last = true;
+                }else {
+                    currentOutHospitalDate = outHospitalDate;
+                }
+                currentBedDays =  DateUtils.getIntervalDays(currentOutHospitalDate,currentInHospitalDate) ;
+                if(last){
+                    currentBedDays += 1;
+                }
+            }else {
+                //出院日期小于当前核算年月最小日期 按原出入院日期算
+                currentBedDays = calculateBedDays(inHospitalDate, outHospitalDate);
+            }
+        }
+        if(currentBedDays==NumberConstant.ZERO){
+            currentBedDays = NumberConstant.ONE;
+        }
+        return currentBedDays;
+
     }
 }

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

@@ -177,6 +177,8 @@ public class PatientItemImportServiceImpl implements PatientItemImportService {
                     patientItem.setItemCode(entity.getItemCode());
                     patientItem.setItemName(entity.getItemName());
                     patientItem.setItemTypeCode(entity.getItemType());
+                    patientItem.setOrderCode(entity.getOrderCode());
+                    patientItem.setOrderName(entity.getOrderName());
                     patientItem.setItemType(itemTypeMap.get(entity.getItemType()));
                     patientItem.setOrderDepartmentCode(entity.getOrderDepartmentCode());
                     patientItem.setOrderDepartmentName(entity.getOrderDepartmentName());

+ 93 - 16
src/main/java/com/kcim/service/impl/ProductServiceImpl.java

@@ -1,5 +1,9 @@
 package com.kcim.service.impl;
 
+import cn.afterturn.easypoi.excel.ExcelImportUtil;
+import cn.afterturn.easypoi.excel.entity.ImportParams;
+import cn.afterturn.easypoi.excel.entity.result.ExcelVerifyHandlerResult;
+import cn.afterturn.easypoi.handler.inter.IExcelVerifyHandler;
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
@@ -11,12 +15,17 @@ import com.kcim.common.util.PageUtils;
 import com.kcim.common.util.Result;
 import com.kcim.common.util.UserContext;
 import com.kcim.common.constants.NumberConstant;
+import com.kcim.common.util.excel.entity.PatientItemImportEntity;
+import com.kcim.common.util.excel.entity.ProductTemplateEntity;
+import com.kcim.common.util.excel.handler.ItemTypeHandler;
 import com.kcim.dao.mapper.ProductMapper;
 import com.kcim.dao.model.Hospital;
+import com.kcim.dao.model.ImportPatientItem;
 import com.kcim.dao.model.Product;
 import com.kcim.dao.model.dto.ProductDTO;
 import com.kcim.dao.model.dto.ProductEditDTO;
 import com.kcim.vo.CommonVO;
+import com.kcim.vo.DictDataVo;
 import com.kcim.vo.ProductVO;
 import com.kcim.service.ProductService;
 import com.kcim.common.util.BeanUtil;
@@ -26,13 +35,16 @@ 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 org.springframework.web.multipart.MultipartFile;
 
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.Objects;
+import java.io.InputStream;
+import java.util.*;
 import java.util.stream.Collectors;
 
+import static com.kcim.common.constants.Constant.CHARGE_ITEM_TYPE;
+
 @Slf4j
 @Service("productService")
 public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> implements ProductService {
@@ -43,25 +55,28 @@ public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> impl
     /**
      * 分页查询
      *
-     * @param page
+     * @param current
      * @param pageSize
      * @param name
      * @return
      */
     @Override
-    public PageUtils selectList(Integer page, Integer pageSize, String name) {
-        Page<Product> productPage = new Page<>(page, pageSize);
-        Page<Product> pages = this.page(productPage,
-                new LambdaQueryWrapper<Product>()
-                        .eq(Product::getHospId, UserContext.getHospId())
-                        .eq(StrUtil.isNotBlank(name), Product::getProductName, name)
-                .orderByDesc(Product::getCreateTime)
-        );
-        PageUtils pageUtils = new PageUtils(pages);
+    public PageUtils selectList(Integer current, Integer pageSize, String name) {
+        Page<Product> productPage = new Page<>(current, pageSize);
+        LambdaQueryWrapper<Product> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(Product::getHospId, UserContext.getHospId());
+        if(!StringUtils.isEmpty(name)){
+            queryWrapper.like(Product::getProductName, name);
+        }
+        queryWrapper.orderByDesc(Product::getCreateTime);
+        Page<Product> pages = this.page(productPage, queryWrapper);
         List<Product> records = pages.getRecords();
+        if(CollectionUtils.isEmpty(records)){
+            return new PageUtils(new ArrayList<>(),NumberConstant.ZERO,pageSize,current);
+        }
         List<ProductVO> list = BeanUtil.convertList(records, ProductVO.class);
-        pageUtils.setList(list);
-        return pageUtils;
+        return new PageUtils(list,NumberConstant.ZERO,pageSize,current);
+
     }
 
     /**
@@ -224,4 +239,66 @@ public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> impl
     public void deleteByIds(List<Integer> idList) {
         this.removeByIds(idList);
     }
+
+    @Override
+    @Transactional(propagation = Propagation.REQUIRED,rollbackFor = Exception.class)
+    public Result importProduct(MultipartFile file) {
+        try {
+            if (ObjectUtils.isEmpty(file) || file.getSize() == 0){
+                throw new CostException("未获取到导入的excel文件内容");
+            }
+            log.info("接收到文件:{}",file.getOriginalFilename());
+            // 参数1:文件流
+            InputStream stream = file.getInputStream();
+            // 参数2:导入类型
+            ImportParams params = new ImportParams();
+            //校验Excel 去掉空行
+            params.setNeedVerify(true);
+            IExcelVerifyHandler<ProductTemplateEntity> handler = val ->{
+                if(StringUtils.isEmpty(val.getProductCode())){
+                    return new ExcelVerifyHandlerResult(false,"成本项目编号不能为空");
+                }
+                return new ExcelVerifyHandlerResult(true);
+            };
+            params.setVerifyHandler(handler);
+            // 标题占用多少行
+            params.setTitleRows(1);
+            // 头部属性占用多少行
+            params.setHeadRows(1);
+
+            List<ProductTemplateEntity> importExcel  = ExcelImportUtil.importExcel(stream, ProductTemplateEntity.class,params);
+            if(!CollectionUtils.isEmpty(importExcel)){
+                List<Product> saveList = new ArrayList<>();
+                Product product = new Product();
+                product.setHospId(UserContext.getHospId());
+                product.setCreateTime(new Date().getTime());
+                for (ProductTemplateEntity entity : importExcel) {
+                    Product obj = BeanUtil.convertObj(product, Product.class);
+                    obj.setProductCode(entity.getProductCode());
+                    obj.setProductName(entity.getProductName());
+                    saveList.add(obj);
+                }
+                if(!CollectionUtils.isEmpty(saveList)){
+                    check();
+                    this.saveBatch(saveList,50);
+                }
+
+            }
+
+        }catch (Exception e){
+            throw new RuntimeException(e);
+        }
+        return Result.ok();
+    }
+
+    private void check() {
+        LambdaQueryWrapper<Product> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(Product::getHospId,UserContext.getHospId());
+        List<Product> list = this.list(queryWrapper);
+        if(!CollectionUtils.isEmpty(list)){
+            List<Long> collect = list.stream().map(Product::getId).collect(Collectors.toList());
+            this.removeByIds(collect);
+        }
+    }
+
 }

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

@@ -112,7 +112,7 @@ public class ReportServiceImpl implements ReportService {
         List<Map<String, Object>> maps = sqlRunnerList(keySql);
         if(CollectionUtils.isEmpty(maps)){
             log.error("报表"+report.getName()+"无符合条件主键数据"+keySql);
-            throw new CostException("报表"+report.getName()+"无符合条件主键数据"+keySql);
+            throw new CostException("报表"+report.getName()+"无符合条件主键数据");
         }
 
         List<CostColumn> calcFormulaList = dataSourceGroup.get(NumberConstant.ONE);
@@ -143,6 +143,9 @@ public class ReportServiceImpl implements ReportService {
         List<List<ReportVo>> vos = new ArrayList<>();
         ReportCodeModifyVo reportCodeModifyVo = new ReportCodeModifyVo();
         for(Map<String, Object> result:maps){
+            if(CollectionUtils.isEmpty(result)){
+               continue;
+            }
             Map<String, Object> keyParameter = result.keySet().stream().collect(Collectors.toMap(s -> s, result::get, (a, b) -> b));
             List<ReportVo> dataVo = new ArrayList<>();
             //sql报表列
@@ -150,8 +153,9 @@ public class ReportServiceImpl implements ReportService {
                 for(CostReportColumn column:sqlReportColumn){
                     Integer primaryKey = column.getPrimaryKey();
                     if(primaryKey.equals(NumberConstant.ONE)){
-                        Map<String,String> modify = new HashMap<>();
                         if(result.size()>1){
+                            Map<String,String> modify = new HashMap<>();
+
                             for(String s:result.keySet()){
                                 ReportVo vo = new ReportVo();
                                 vo.setCode(column.getReportCode()+s);
@@ -159,15 +163,17 @@ public class ReportServiceImpl implements ReportService {
                                 dataVo.add(vo);
                                 modify.put(column.getReportCode()+s,s);
                             }
+                            reportCodeModifyVo.setReportCode(column.getColumnCode());
+                            reportCodeModifyVo.setModifyReportCode(modify);
                         }else {
                             ReportVo vo = new ReportVo();
-                            vo.setCode(column.getReportCode()+result.keySet().stream().findFirst().get());
+                            vo.setCode(column.getColumnCode().toString());
                             vo.setValue(result.values().stream().findFirst().get());
-                            modify.put(vo.getCode(),result.keySet().stream().findFirst().get());
+//                            modify.put(vo.getCode(),result.keySet().stream().findFirst().get());
                             dataVo.add(vo);
                         }
-                        reportCodeModifyVo.setReportCode(column.getColumnCode());
-                        reportCodeModifyVo.setModifyReportCode(modify);
+//                        reportCodeModifyVo.setReportCode(column.getColumnCode());
+//                        reportCodeModifyVo.setModifyReportCode(modify);
                     }else {
                         ReportVo vo = new ReportVo();
                         vo.setCode(column.getColumnCode().toString());
@@ -183,8 +189,12 @@ public class ReportServiceImpl implements ReportService {
                         Object o = sqlRunner(handleSql);
                         if(dataType != null&&dataType.equals(NumberConstant.THREE)){
                             Integer decimalPlace = col.getDecimalPlace();
-                            BigDecimal value = new BigDecimal(o.toString());
-                            vo.setValue(value.setScale(decimalPlace,RoundingMode.HALF_UP));
+                            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);
                         }
@@ -198,8 +208,9 @@ public class ReportServiceImpl implements ReportService {
                 for(CostReportColumn column:calcReportColumn){
                     Integer primaryKey = column.getPrimaryKey();
                     if(primaryKey.equals(NumberConstant.ONE)){
-                        Map<String,String> modify = new HashMap<>();
                         if(result.size()>1){
+                            Map<String,String> modify = new HashMap<>();
+
                             for(String s:result.keySet()){
                                 ReportVo vo = new ReportVo();
                                 vo.setCode(column.getReportCode()+s);
@@ -207,15 +218,14 @@ public class ReportServiceImpl implements ReportService {
                                 dataVo.add(vo);
                                 modify.put(column.getReportCode()+s,s);
                             }
+                            reportCodeModifyVo.setReportCode(column.getColumnCode());
+                            reportCodeModifyVo.setModifyReportCode(modify);
                         }else {
                             ReportVo vo = new ReportVo();
-                            vo.setCode(column.getReportCode()+result.keySet().stream().findFirst().get());
+                            vo.setCode(column.getColumnCode().toString());
                             vo.setValue(result.values().stream().findFirst().get());
-                            modify.put(vo.getCode(),result.keySet().stream().findFirst().get());
                             dataVo.add(vo);
                         }
-                        reportCodeModifyVo.setReportCode(column.getColumnCode());
-                        reportCodeModifyVo.setModifyReportCode(modify);
                     }else {
                         ReportVo vo = new ReportVo();
                         vo.setCode(column.getColumnCode().toString());
@@ -233,10 +243,8 @@ public class ReportServiceImpl implements ReportService {
                     }
                 }
             }
-
             vos.add(dataVo);
         }
-
         List<ReportTitleVo> titleVos = new ArrayList<>();
         for(CostReportColumn column:reportColumns){
             Integer primaryKey = column.getPrimaryKey();
@@ -261,7 +269,7 @@ public class ReportServiceImpl implements ReportService {
                             vo.setName(name);
                             if(!CollectionUtils.isEmpty(columnSortMap)){
                                 Integer sort = columnSortMap.get(columnName);
-                                vo.setSort(sort);
+                                vo.setSort(sort != null ? sort : column.getSort());
                             }else {
                                 vo.setSort(column.getSort());
                             }
@@ -412,15 +420,15 @@ public class ReportServiceImpl implements ReportService {
     }
 
 
-    private static ReportTitleVo getReportTitleVo(String column, String column1, CostReportColumn column2, Map<Long, List<CostReportRedirect>> reportRedirectMap, ReportCodeModifyVo reportCodeModifyVo, Map<Long, CostColumn> map) {
+    private static ReportTitleVo getReportTitleVo(String column, String columnName, CostReportColumn reportColumn, Map<Long, List<CostReportRedirect>> reportRedirectMap, ReportCodeModifyVo reportCodeModifyVo, Map<Long, CostColumn> map) {
         ReportTitleVo vo = new ReportTitleVo();
         vo.setCode(column);
-        vo.setName(column1);
-        vo.setSort(column2.getSort()+100);
-        vo.setHide(column2.getHide());
-        vo.setFreeze(column2.getFreeze());
-        vo.setColumnName(column2.getColumnName());
-        vo.setSortStatus(column2.getSortStatus());
+        vo.setName(columnName);
+        vo.setSort(reportColumn.getSort()+100);
+        vo.setHide(reportColumn.getHide());
+        vo.setFreeze(reportColumn.getFreeze());
+        vo.setColumnName(reportColumn.getColumnName());
+        vo.setSortStatus(reportColumn.getSortStatus());
         CostColumn computeColumn = map.get(Long.valueOf(column));
         if(Objects.nonNull(computeColumn)){
             vo.setDataType(computeColumn.getDataType());
@@ -440,7 +448,7 @@ public class ReportServiceImpl implements ReportService {
 //                vo.setRedirectParameter(redirect.getRedirectParameter());
 //            }
         if(!CollectionUtils.isEmpty(primary)){
-            List<CostReportRedirect> reportRedirects = reportRedirectMap.get(column2.getColumnCode());
+            List<CostReportRedirect> reportRedirects = reportRedirectMap.get(reportColumn.getColumnCode());
             if(!CollectionUtils.isEmpty(reportRedirects)){
                 List<RedirectData> redirectDataList = new ArrayList<>();
                 for(CostReportRedirect redirect:reportRedirects){
@@ -455,7 +463,7 @@ public class ReportServiceImpl implements ReportService {
                 vo.setRedirectData(redirectDataList);
             }
         }else {
-            List<CostReportRedirect> reportRedirects = reportRedirectMap.get(column2.getColumnCode());
+            List<CostReportRedirect> reportRedirects = reportRedirectMap.get(reportColumn.getColumnCode());
             if(!CollectionUtils.isEmpty(reportRedirects)){
                 List<RedirectData> redirectDataList = new ArrayList<>();
                 for(CostReportRedirect redirect:reportRedirects){
@@ -500,7 +508,7 @@ public class ReportServiceImpl implements ReportService {
         }
         if(sql.contains("#")){
             log.error("sql 所需条件未全部传递,请确认后再进行查询"+sql);
-            throw new CostException("sql 所需条件未全部传递,请确认后再进行查询"+sql);
+            throw new CostException("sql 所需条件未全部传递,请确认后再进行查询");
         }
         return sql;
     }
@@ -552,7 +560,7 @@ public class ReportServiceImpl implements ReportService {
         }
         if(sql.contains("#")){
             log.error("sql 所需条件未全部传递,请确认后再进行查询"+sql);
-            throw new CostException("sql 所需条件未全部传递,请确认后再进行查询"+sql);
+            throw new CostException("sql 所需条件未全部传递,请确认后再进行查询");
         }
         return sql;
     }

+ 20 - 0
src/main/java/com/kcim/web/CostCalculateController.java

@@ -155,4 +155,24 @@ public class CostCalculateController {
         result.setMsg("计算完成");
         return result;
     }
+
+    OrderCostService orderCostService;
+    @ApiOperation("成本核算-医嘱项目成本-获取列表")
+    @GetMapping("orderCostCalculateList")
+    public Result orderCostCalculateList(@RequestParam(defaultValue = "1",name = "current",required = false)Integer current,
+                                                   @RequestParam(defaultValue = "10",name = "pageSize",required = false)Integer pageSize,
+                                                   @RequestParam(name = "computeDate")String computeDate,
+                                                   @RequestParam(name = "orderName",required = false)String orderName){
+        return Result.ok(orderCostService.orderCostCalculateList(current,pageSize,computeDate,orderName));
+    }
+
+    @ApiOperation("成本核算-医嘱项目成本-计算")
+    @PostMapping("orderCostCalculate")
+    public Result orderCostCalculate(@RequestParam(name = "computeDate")String computeDate){
+        orderCostService.orderCostCalculate(computeDate);
+        Result result = new Result();
+        result.setStatus(200);
+        result.setMsg("计算完成");
+        return result;
+    }
 }

+ 91 - 43
src/main/java/com/kcim/web/ExcelController.java

@@ -1,5 +1,7 @@
 package com.kcim.web;
 
+import cn.afterturn.easypoi.excel.ExcelExportUtil;
+import cn.afterturn.easypoi.excel.entity.ExportParams;
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.io.FileUtil;
@@ -12,29 +14,35 @@ import com.kcim.common.exception.CostException;
 import com.kcim.common.util.Result;
 import com.kcim.common.util.UserContext;
 import com.kcim.common.constants.NumberConstant;
+import com.kcim.common.util.excel.ExcelStyleUtil;
+import com.kcim.common.util.excel.entity.PatientItemImportEntity;
+import com.kcim.common.util.excel.entity.ProductTemplateEntity;
+import com.kcim.common.util.excel.handler.ItemTypeHandler;
 import com.kcim.dao.model.*;
 import com.kcim.service.impl.DepartmentServiceImpl;
 import com.kcim.service.impl.ProductServiceImpl;
 import com.kcim.service.*;
+import com.kcim.vo.DictDataVo;
 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;
+import org.apache.poi.ss.usermodel.Workbook;
 import org.springframework.util.CollectionUtils;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 
 import javax.servlet.ServletOutputStream;
 import javax.servlet.http.HttpServletResponse;
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
+import java.io.*;
+import java.net.URLEncoder;
 import java.util.*;
 import java.util.stream.Collectors;
 
+import static com.kcim.common.constants.Constant.CHARGE_ITEM_TYPE;
+
 /**
  * 相关导入导出操作
  */
@@ -207,35 +215,72 @@ public class ExcelController extends AbstractController{
      */
     @ApiOperation("成本项目导出模板设置")
     @GetMapping("/getImportProductTemplate")
-    public void getImportProductTemplate(HttpServletResponse response) throws IOException {
-        String uuid = UUID.randomUUID().toString();
-        String url = System.getProperty("java.io.tmpdir") + File.separator + uuid + File.separator + uuid + ".xls";
-        FileUtil.del(FileUtil.file(url));
+    public Object getImportProductTemplate(HttpServletResponse response) throws IOException {
+//        String uuid = UUID.randomUUID().toString();
+//        String url = System.getProperty("java.io.tmpdir") + File.separator + uuid + File.separator + uuid + ".xls";
+//        FileUtil.del(FileUtil.file(url));
+//
+//        ExcelWriter writer = new ExcelWriter(url);
+//        // 样式
+//        Sheet sheet = writer.getSheet();
+//        // 内容
+//        writer.merge(0, 1, 0, 2, "为了保证成功导入,请勿修改模板格式", false);
+//        writer.passCurrentRow();
+//        writer.passCurrentRow();
+//        writer.merge(2, 2, 0, 2, "医院成本收入批量导入", false);
+//        writer.passCurrentRow();
+//        writer.setColumnWidth(0, 20);
+//        writer.setColumnWidth(1, 15);
+//        writer.setColumnWidth(2, 15);
+//        writer.writeRow(Arrays.asList("院区", "成本项目名", "成本项目编号"));
+//
+//        // 写入响应
+//        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8");
+//        response.setHeader("Content-Disposition", "attachment;filename=" + uuid + ".xls");
+//        ServletOutputStream out = null;
+//
+//        out = response.getOutputStream();
+//        writer.flush(out, true);
+//        writer.close();
+//        IoUtil.close(out);
+
+        try {
+            //获取项目类别字典
+            //配置excel 文件信息
+            ExportParams params = new ExportParams();
+
+            params.setTitle("说明:为了保证成功导入,请勿修改模板格式" );
+            //设置导出样式
+            params.setStyle(ExcelStyleUtil.class);
+            params.setHeaderHeight(10);
+
+            //设置sheetName
+            params.setSheetName("会计收入项目");
+//            params.setHeaderColor();
+//            params.setFreezeCol(2);
+//            FileOutputStream outputStream = new FileOutputStream("E:\\会计收入项目导入模版.xlsx");
+
+            Workbook workbook = ExcelExportUtil.exportExcel(params, ProductTemplateEntity.class,new ArrayList<>());
+            response.setCharacterEncoding("UTF-8");
+            response.setContentType("application/vnd.ms-excel");
+            String fileName ="会计收入项目导入模版";
+            response.setHeader("Content-Disposition",  URLEncoder.encode(fileName, "UTF-8"));
+            workbook.write(response.getOutputStream());
+//                workbook.write(outputStream);
+//                outputStream.close();
+            workbook.close();
+        } catch (FileNotFoundException e) {
+            throw new CostException(e.getMessage());
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+        return response.getOutputStream();
+    }
+
+
 
-        ExcelWriter writer = new ExcelWriter(url);
-        // 样式
-        Sheet sheet = writer.getSheet();
-        // 内容
-        writer.merge(0, 1, 0, 2, "为了保证成功导入,请勿修改模板格式", false);
-        writer.passCurrentRow();
-        writer.passCurrentRow();
-        writer.merge(2, 2, 0, 2, "医院成本收入批量导入", false);
-        writer.passCurrentRow();
-        writer.setColumnWidth(0, 20);
-        writer.setColumnWidth(1, 15);
-        writer.setColumnWidth(2, 15);
-        writer.writeRow(Arrays.asList("院区", "成本项目名", "成本项目编号"));
 
-        // 写入响应
-        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8");
-        response.setHeader("Content-Disposition", "attachment;filename=" + uuid + ".xls");
-        ServletOutputStream out = null;
 
-        out = response.getOutputStream();
-        writer.flush(out, true);
-        writer.close();
-        IoUtil.close(out);
-    }
 
     /**
      * 收入成本项目批量导入
@@ -243,19 +288,22 @@ public class ExcelController extends AbstractController{
     @PostMapping("/importProduct")
     @ApiOperation("批量导入成本项目信息")
     public Result importProduct(@RequestParam("file") MultipartFile file) {
-        InputStream in;
-        try {
-            in = file.getInputStream();
-            ExcelReader reader = ExcelUtil.getReader(in);
-            List<List<Object>> read = reader.read();
-            log.info("最开始:read={}", read);
-            log.info("-------------------------------------------------------------------");
-            Long hospId = UserContext.getHospId();
-            return productService.importProduct(read, hospId);
-        } catch (IOException e) {
-            e.printStackTrace();
-            throw new CostException(500, "导入失败");
-        }
+//        InputStream in;
+//        try {
+////            in = file.getInputStream();
+////            ExcelReader reader = ExcelUtil.getReader(in);
+////            List<List<Object>> read = reader.read();
+////            log.info("最开始:read={}", read);
+////            log.info("-------------------------------------------------------------------");
+////            Long hospId = UserContext.getHospId();
+////            return productService.importProduct(read, hospId);
+//            return productService.importProduct(file);
+//        } catch (IOException e) {
+//            e.printStackTrace();
+//            throw new CostException(500, "导入失败");
+//        }
+        return productService.importProduct(file);
+
     }
 
     /**

+ 2 - 3
src/main/java/com/kcim/web/ProductController.java

@@ -39,9 +39,8 @@ public class ProductController {
     @GetMapping("/list")
     public Result list(@RequestParam(defaultValue = "1", value = "current") Integer current,
                        @RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize,
-                       @RequestParam(value = "name", required = false) String name){
-        PageUtils pageUtils = productService.selectList(current, pageSize,name);
-        return Result.ok(pageUtils);
+                       @RequestParam(value = "filter", required = false) String filter){
+        return Result.ok(productService.selectList(current, pageSize,filter));
     }
 
     @ApiOperation("新增成本项目")

+ 43 - 14
src/main/java/com/kcim/web/SettingController.java

@@ -1,9 +1,9 @@
 package com.kcim.web;
 
-import com.kcim.common.constants.NumberConstant;
 import com.kcim.common.util.Result;
 import com.kcim.dao.model.*;
 import com.kcim.service.*;
+import com.kcim.web.request.AccountingItemMapRequest;
 import com.kcim.web.request.OrderItemRequest;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -705,25 +705,54 @@ public class SettingController {
     @ApiOperation("获取项目列表")
     @GetMapping("getItemDict")
     public Result getItemDict(@RequestParam(defaultValue = "3") Integer type,
-                              @RequestParam(required = false)String name){
-        if(type.equals(NumberConstant.ONE)){
-            //药品
-            return Result.ok(drugService.getItemDict(name));
+                              @RequestParam(required = false)String name,
+                              @RequestParam String orderCode){
 
-        } else if (type.equals(NumberConstant.TWO)) {
-            //材料
-            return Result.ok(materialService.getItemDict(name));
 
-        } else if (type.equals(NumberConstant.THREE)) {
-            //收费项目
-            return Result.ok(itemService.getItemDict(name));
+        return Result.ok(orderService.getItemDict(type,orderCode,name));
+    }
+    AccountingItemMapService accountingItemMapService;
+    @ApiOperation("获取会计科目收入列表")
+    @GetMapping("getAccountingList")
+    public Result getAccountingList(@RequestParam(required = false) String accountingName,
+                                    @RequestParam(required = false,name = "type",defaultValue = "0") Integer type){
+        return Result.ok(accountingItemMapService.getAccountingList(accountingName,type));
+    }
 
-        }else {
-            return Result.ok(itemService.getItemDict(name));
+    @ApiOperation("获取会计科目收费项目对照列表")
+    @GetMapping("getAccountingItemMap")
+    public Result getAccountingItemMap(@RequestParam(required = false,name = "current") Integer current,
+                                    @RequestParam(required = false,name = "pageSize") Integer pageSize,
+                                    @RequestParam String accountingCode,
+                                    @RequestParam(required = false,name = "itemName")String itemName){
+        return Result.ok(accountingItemMapService.getAccountingItemMap(current,pageSize,accountingCode,itemName));
+    }
 
-        }
+    @ApiOperation("获取收费项目列表")
+    @GetMapping("getAccountingItemDictList")
+    public Result getAccountingItemDictList(@RequestParam(defaultValue = "3") Integer type,
+                                            @RequestParam(required = false)String name){
+        return Result.ok(accountingItemMapService.getAccountingItemDictList(type,name));
+    }
 
+    @ApiOperation(" 添加会计科目收费项目对照")
+    @PostMapping("addAccountingItemMap")
+    public Result addAccountingItemMap(@RequestBody AccountingItemMapRequest map){
+        accountingItemMapService.addAccountingItemMap(map);
+        return Result.ok();
+    }
 
+    @ApiOperation(" 删除会计科目收费项目对照")
+    @PostMapping("deleteAccountingItemMap")
+    public Result deleteAccountingItemMap(@RequestParam Integer id){
+        accountingItemMapService.deleteAccountingItemMap(id);
+        return Result.ok();
+    }
 
+    @ApiOperation("批量删除会计科目收费项目对照")
+    @PostMapping("batchDeleteAccountingItemMap")
+    public Result batchDeleteAccountingItemMap(@RequestBody List<Integer> ids){
+        accountingItemMapService.batchDeleteAccountingItemMap(ids);
+        return Result.ok();
     }
 }

+ 23 - 0
src/main/java/com/kcim/web/request/AccountingItemMapRequest.java

@@ -0,0 +1,23 @@
+package com.kcim.web.request;
+
+import com.kcim.dao.model.AccountingItemMap;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @program: CostAccount
+ * @description:
+ * @author: Wang.YS
+ * @create: 2023-11-28 10:39
+ **/
+@Data
+public class AccountingItemMapRequest {
+
+    private String accountingCode;
+
+    private String accountingName;
+
+    private List<AccountingItemMap> itemMaps;
+
+}

+ 5 - 3
src/main/resources/application-demonstrate.yml

@@ -23,9 +23,11 @@ spring:
     nacos: #注册nacos
       discovery:
         service: ${spring.application.name}
-        server-addr: 47.96.149.190:8848
-        namespace: 38b4fbe9-4a20-48c3-a8bf-ebf069fb26e8
-        group: KCIM
+        server-addr: 120.27.235.181:8848
+        #        namespace: 38b4fbe9-4a20-48c3-a8bf-ebf069fb26e8
+        #        group: KCIM
+        namespace: 060cc0fe-193f-4a94-bbca-6d48a4f95ac2
+        group: dev
 #        namespace: 060cc0fe-193f-4a94-bbca-6d48a4f95ac2
 #        group: dev
 #    sentinel:

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

@@ -1,6 +1,6 @@
 spring:
   profiles:
-    active: prod
+    active: dev
 #    active: demonstrate
 #    active: prod
 

+ 25 - 0
src/main/resources/mapper/AccountingItemMapMapper.xml

@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+
+<mapper namespace="com.kcim.dao.mapper.AccountingItemMapMapper">
+
+	<!-- 可根据自己的需求,是否要使用 -->
+    <resultMap type="com.kcim.dao.model.AccountingItemMap" id="accountingItemMapMap">
+        <result property="id" column="id"/>
+        <result property="hospId" column="hosp_id"/>
+        <result property="accountingCode" column="accounting_code"/>
+        <result property="accountingName" column="accounting_name"/>
+        <result property="itemCode" column="item_code"/>
+        <result property="itemName" column="item_name"/>
+        <result property="type" column="type"/>
+        <result property="createUser" column="create_user"/>
+        <result property="createTime" column="create_time"/>
+        <result property="updateUser" column="update_user"/>
+        <result property="updateTime" column="update_time"/>
+        <result property="deleteUser" column="delete_user"/>
+        <result property="deleteTime" column="delete_time"/>
+        <result property="delFlag" column="del_flag"/>
+    </resultMap>
+
+
+</mapper>

+ 28 - 1
src/main/resources/mapper/ComputeItemCostMapper.xml

@@ -85,7 +85,34 @@
         GROUP BY visit_no
 
     </select>
-
+    <select id="getListGroupByOrder" resultType="com.kcim.dao.model.dto.ComputeItemGroupByOrder">
+        SELECT
+            a.id as id,
+            a.hosp_id as hosp_id,
+            a.compute_date as compute_date,
+            a.visit_no as visit_no,
+            a.order_code as order_code,
+            a.order_name as order_name,
+            sum((IF(b.type = '1', b.compute_result, 0.00))) as drugIncome,
+            sum((IF(b.type = '2', b.compute_result, 0.00))) as materialIncome,
+            sum((IF(b.type = '3', b.compute_result, 0.00))) as itemIncome,
+            sum((IF(b.type = '4', b.compute_result, 0.00))) as drugCost,
+            sum((IF(b.type = '5', b.compute_result, 0.00))) as materialCost,
+            sum((IF(b.type = '6', b.compute_result, 0.00))) as itemCost,
+            sum((IF(b.type = '7', b.compute_result, 0.00))) as empCost,
+            sum((IF(b.type = '8', b.compute_result, 0.00))) as equipmentCost,
+            sum((IF(b.type = '9', b.compute_result, 0.00))) as spaceCost
+        FROM
+            compute_item_cost a
+                LEFT JOIN compute_item_cost_detail b ON a.id = b.item_cost_id
+        WHERE
+            a.hosp_id = #{hospId}
+          AND b.hosp_id=#{hospId}
+          AND a.del_flag = 0
+          AND a.compute_date = #{computeDate}
+          AND b.del_flag = 0
+        GROUP BY visit_no,order_code
+    </select>
 
 
 </mapper>

+ 5 - 0
src/main/resources/mapper/ImportPatientInfoMapper.xml

@@ -13,6 +13,9 @@
         <result property="name" column="name"/>
         <result property="departmentCode" column="department_code"/>
         <result property="departmentName" column="department_name"/>
+        <result property="inpatientWardCode" column="inpatient_ward_code"/>
+        <result property="inpatientWardName" column="inpatient_ward_name"/>
+
         <result property="type" column="type"/>
         <result property="primaryDiagCode" column="primary_diag_code"/>
         <result property="primaryDiagName" column="primary_diag_name"/>
@@ -29,6 +32,8 @@
         <result property="inHospitalTime" column="in_hospital_time"/>
         <result property="outHospitalTime" column="out_hospital_time"/>
         <result property="inHospitalDays" column="in_hospital_days"/>
+        <result property="bedDays" column="	bed_days"/>
+        <result property="currentBedDays" column="current_bed_days"/>
         <result property="diseaseTypeCode" column="disease_type_code"/>
         <result property="createUser" column="create_user"/>
         <result property="createTime" column="create_time"/>

+ 21 - 0
src/main/resources/mapper/ImportPatientItemMapper.xml

@@ -41,6 +41,8 @@
                item_name,
                item_type_code,
                item_type,
+               order_code,
+               order_name,
                execute_department_code,
                execute_user_code,
                sum( num ) as num,
@@ -49,7 +51,26 @@
         WHERE del_flag = 0
         AND compute_date = #{computeDate}
         and hosp_id = #{hospId}
+        GROUP BY  visit_no, execute_department_code,item_code,order_code;
+    </select>
+    <select id="getAllGroupByOrder" resultType="com.kcim.dao.model.dto.PatientItemVo">
+        SELECT visit_no,
+               item_code,
+               item_name,
+               item_type_code,
+               item_type,
+               execute_department_code,
+               execute_user_code,
+               sum( num ) as num,
+               sum( amount ) as amount
+        FROM import_patient_item
+        WHERE del_flag = 0
+          AND compute_date = #{computeDate}
+          and hosp_id = #{hospId}
         GROUP BY  visit_no, execute_department_code,item_code;
+
+
+
     </select>
 
 

+ 23 - 0
src/main/resources/mapper/OrderCostDetailMapper.xml

@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+
+<mapper namespace="com.kcim.dao.mapper.OrderCostDetailMapper">
+
+	<!-- 可根据自己的需求,是否要使用 -->
+    <resultMap type="com.kcim.dao.model.OrderCostDetail" id="OrderCostDetailMap">
+        <result property="id" column="id"/>
+        <result property="hospId" column="hosp_id"/>
+        <result property="orderCostId" column="order_cost_id"/>
+        <result property="type" column="type"/>
+        <result property="computeResult" column="compute_result"/>
+        <result property="createUser" column="create_user"/>
+        <result property="createTime" column="create_time"/>
+        <result property="updateUser" column="update_user"/>
+        <result property="updateTime" column="update_time"/>
+        <result property="deleteUser" column="delete_user"/>
+        <result property="deleteTime" column="delete_time"/>
+        <result property="delFlag" column="del_flag"/>
+    </resultMap>
+
+
+</mapper>

+ 57 - 0
src/main/resources/mapper/OrderCostMapper.xml

@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+
+<mapper namespace="com.kcim.dao.mapper.OrderCostMapper">
+
+	<!-- 可根据自己的需求,是否要使用 -->
+    <resultMap type="com.kcim.dao.model.OrderCost" id="OrderCostMap">
+        <result property="id" column="id"/>
+        <result property="hospId" column="hosp_id"/>
+        <result property="computeDate" column="compute_date"/>
+        <result property="code" column="code"/>
+        <result property="name" column="name"/>
+        <result property="departmentCode" column="department_code"/>
+        <result property="departmentName" column="department_name"/>
+        <result property="createUser" column="create_user"/>
+        <result property="createTime" column="create_time"/>
+        <result property="updateUser" column="update_user"/>
+        <result property="updateTime" column="update_time"/>
+        <result property="deleteUser" column="delete_user"/>
+        <result property="deleteTime" column="delete_time"/>
+        <result property="delFlag" column="del_flag"/>
+    </resultMap>
+    <select id="getByPage" resultType="com.kcim.dao.model.dto.ComputeOrderCostPageDto">
+        SELECT
+        a.id as id,
+        a.hosp_id as hosp_id,
+        a.compute_date as compute_date,
+        a.`code` as `code`,
+        a.`name` as `name`,
+        a.department_code as department_code,
+        a.department_name as department_name,
+        sum((IF(b.type = '1', b.compute_result, 0.00))) as drugIncome,
+        sum((IF(b.type = '2', b.compute_result, 0.00))) as materialIncome,
+        sum((IF(b.type = '3', b.compute_result, 0.00))) as itemIncome,
+        sum((IF(b.type = '4', b.compute_result, 0.00))) as drugCost,
+        sum((IF(b.type = '5', b.compute_result, 0.00))) as materialCost,
+        sum((IF(b.type = '6', b.compute_result, 0.00))) as itemCost,
+        sum((IF(b.type = '7', b.compute_result, 0.00))) as empCost,
+        sum((IF(b.type = '8', b.compute_result, 0.00))) as equipmentCost,
+        sum((IF(b.type = '9', b.compute_result, 0.00))) as spaceCost
+        FROM
+        compute_order_cost a
+        LEFT JOIN compute_order_cost_detail b ON a.id = b.order_cost_id
+        WHERE
+        a.hosp_id = #{hospId}
+        AND b.hosp_id = #{hospId}
+        AND a.del_flag = 0
+        AND a.compute_date = #{computeDate}
+        AND b.del_flag = 0
+        <if test="orderName != null and orderName != ''">
+            and a.name  like concat('%',#{orderName,jdbcType=VARCHAR},'%')
+        </if>
+        GROUP BY `code`,department_code,`name`
+        order by `name`
+    </select>
+
+</mapper>