Bladeren bron

优化项目成本分摊计算逻辑

JammeyJiang 1 maand geleden
bovenliggende
commit
8c9f22375b

+ 1 - 2
src/main/java/com/kcim/dao/mapper/ComputeProjectCostAccountMapper.java

@@ -1,6 +1,5 @@
 package com.kcim.dao.mapper;
 
-import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.kcim.dao.model.ComputeProjectCostAccount;
 import com.kcim.vo.HospitalServiceProjectCostVO;
 import org.apache.ibatis.annotations.Mapper;
@@ -15,7 +14,7 @@ import java.util.List;
  * @date 2025-08-22 17:57:23
  */
 @Mapper
-public interface ComputeProjectCostAccountMapper extends BaseMapper<ComputeProjectCostAccount> {
+public interface ComputeProjectCostAccountMapper extends GenericBatchMapper<ComputeProjectCostAccount> {
 
     /**
      * @param computeDate

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

@@ -15,7 +15,7 @@ import java.util.List;
  * @date 2024-01-15 20:23:56
  */
 @Mapper
-public interface ComputeProjectCostDetailMapper extends BaseMapper<ComputeProjectCostDetail> {
+public interface ComputeProjectCostDetailMapper extends GenericBatchMapper<ComputeProjectCostDetail> {
 
     List<ComputeProjectCostPageDto> getByProjectCostId(@Param("computeDate") String computeDate,
                                                        @Param("hospId") Long hospId,

+ 1 - 2
src/main/java/com/kcim/dao/mapper/ComputeProjectGroupCostDetailMapper.java

@@ -1,7 +1,6 @@
 package com.kcim.dao.mapper;
 
 import com.kcim.dao.model.ComputeProjectGroupCostDetail;
-import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import org.apache.ibatis.annotations.Mapper;
 
 /**
@@ -11,6 +10,6 @@ import org.apache.ibatis.annotations.Mapper;
  * @date 2024-01-19 15:53:57
  */
 @Mapper
-public interface ComputeProjectGroupCostDetailMapper extends BaseMapper<ComputeProjectGroupCostDetail> {
+public interface ComputeProjectGroupCostDetailMapper extends GenericBatchMapper<ComputeProjectGroupCostDetail> {
 	
 }

+ 10 - 2
src/main/java/com/kcim/dao/mapper/ItemMapper.java

@@ -1,8 +1,11 @@
 package com.kcim.dao.mapper;
 
-import com.kcim.dao.model.Item;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.kcim.dao.model.Item;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
 
 /**
  * 收费项目管理
@@ -12,5 +15,10 @@ import org.apache.ibatis.annotations.Mapper;
  */
 @Mapper
 public interface ItemMapper extends BaseMapper<Item> {
-	
+    /**
+     * 获取责任中心的医疗服务项目字典
+     * @param hospId
+     * @return
+     */
+	public List<Item> getRespItemList(@Param("hospId") Long hospId);
 }

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

@@ -12,6 +12,7 @@ import lombok.experimental.Accessors;
 import java.io.Serializable;
 import java.math.BigDecimal;
 import java.util.Date;
+import java.util.Map;
 
 /**
  * 完全成本法项目成本计算表
@@ -115,6 +116,16 @@ public class ComputeProjectCost implements Serializable {
 	private Integer index;
 
 
+	/**
+	 * 项目成本的会计科目表
+	 */
+	@TableField(exist = false)
+	Map<String,ComputeProjectCostAccount> projectCostAccountMap;
 
+	/**
+	 * 标准项目代码
+	 */
+	@TableField(exist = false)
+	private String standItemCode;
 
 }

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

@@ -167,4 +167,10 @@ public class Item implements Serializable {
 	private String departmentName;
 	@TableField(exist = false)
 	private StandItem standItem;
+
+	/**
+	 * 责任中心代码
+	 */
+	@TableField(exist = false)
+	private String responsibilityCode;
 }

+ 47 - 0
src/main/java/com/kcim/dao/model/dto/ParamContainerDTO.java

@@ -0,0 +1,47 @@
+package com.kcim.dao.model.dto;
+
+
+import java.util.HashMap;
+import java.util.Map;
+
+
+/**
+ * 泛型参数容器,可动态添加任意类型对象
+ * @author Administrator
+ */
+public class ParamContainerDTO {
+    /**
+     * 参数
+     */
+    private Map<String, Object> params = new HashMap<>();
+
+    /**
+     * 添加参数
+     * @param key
+     * @param value
+     * @param <T>
+     */
+    public <T> void put(String key, T value) {
+        params.put(key, value);
+    }
+
+    /**
+     * 获取参数(带类型转换)
+     * @param key
+     * @param <T>
+     * @return
+     */
+    @SuppressWarnings("unchecked")
+    public <T> T get(String key) {
+        return (T) params.get(key);
+    }
+
+    /**
+     * 判断是否包含某个参数
+     * @param key
+     * @return
+     */
+    public boolean contains(String key) {
+        return params.containsKey(key);
+    }
+}

+ 16 - 2
src/main/java/com/kcim/dao/repository/ComputeProjectCostAccountRepository.java

@@ -1,13 +1,16 @@
 package com.kcim.dao.repository;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.kcim.common.util.UserContext;
 import com.kcim.dao.mapper.ComputeProjectCostAccountMapper;
 import com.kcim.dao.model.ComputeProjectCostAccount;
+import com.kcim.service.impl.BaseBatchServiceImpl;
 import com.kcim.vo.HospitalServiceProjectCostVO;
+import com.kcim.vo.SessionUserVO;
 import org.springframework.stereotype.Repository;
 
+import java.util.Date;
 import java.util.List;
 
 /**
@@ -17,7 +20,7 @@ import java.util.List;
  * @create: 2023-11-27 17:52
  **/
 @Repository
-public class ComputeProjectCostAccountRepository extends ServiceImpl<ComputeProjectCostAccountMapper, ComputeProjectCostAccount> {
+public class ComputeProjectCostAccountRepository extends BaseBatchServiceImpl<ComputeProjectCostAccountMapper, ComputeProjectCostAccount> {
     public List<ComputeProjectCostAccount> getList(String computeDate) {
         LambdaQueryWrapper<ComputeProjectCostAccount> queryWrapper = new LambdaQueryWrapper<>();
         queryWrapper.eq(ComputeProjectCostAccount::getHospId, UserContext.getHospId());
@@ -28,4 +31,15 @@ public class ComputeProjectCostAccountRepository extends ServiceImpl<ComputeProj
     public List<HospitalServiceProjectCostVO> getMedicalServiceCostDetailList(String computeDate) {
         return this.baseMapper.getMedicalServiceCostDetailList(computeDate, UserContext.getHospId());
     }
+
+    public void removeByComputeDate(String computeDate, SessionUserVO currentUser) {
+        UpdateWrapper<ComputeProjectCostAccount> updateWrapper = new UpdateWrapper<>();
+        updateWrapper.lambda().eq(ComputeProjectCostAccount::getDelFlag, 0)
+                .eq(ComputeProjectCostAccount::getHospId, currentUser.getHospId())
+                .eq(ComputeProjectCostAccount::getComputeDate, computeDate)
+                .set(ComputeProjectCostAccount::getDeleteTime,new Date())
+                .set(ComputeProjectCostAccount::getDeleteUser,String.valueOf(currentUser.getId()))
+                .set(ComputeProjectCostAccount::getDelFlag, 1);
+        this.update(updateWrapper);
+    }
 }

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

@@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.kcim.common.util.UserContext;
 import com.kcim.dao.mapper.ComputeProjectCostDetailMapper;
 import com.kcim.dao.model.ComputeProjectCostDetail;
+import com.kcim.service.impl.BaseBatchServiceImpl;
 import com.kcim.vo.ComputeProjectCostPageDto;
 import com.kcim.vo.SessionUserVO;
 import org.springframework.stereotype.Repository;
@@ -19,7 +20,7 @@ import java.util.List;
  * @create: 2024-01-15 20:32
  **/
 @Repository
-public class ComputeProjectCostDetailRepository extends ServiceImpl<ComputeProjectCostDetailMapper, ComputeProjectCostDetail> {
+public class ComputeProjectCostDetailRepository extends BaseBatchServiceImpl<ComputeProjectCostDetailMapper, ComputeProjectCostDetail> {
 
 
     public void removeByComputeDate(String computeDate, SessionUserVO currentUser) {

+ 2 - 3
src/main/java/com/kcim/dao/repository/ComputeProjectGroupCostDetailRepository.java

@@ -1,10 +1,9 @@
 package com.kcim.dao.repository;
 
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.kcim.dao.mapper.ComputeProjectGroupCostDetailMapper;
-import com.kcim.dao.model.ComputeProjectCostDetail;
 import com.kcim.dao.model.ComputeProjectGroupCostDetail;
+import com.kcim.service.impl.BaseBatchServiceImpl;
 import com.kcim.vo.SessionUserVO;
 import org.springframework.stereotype.Repository;
 
@@ -17,7 +16,7 @@ import java.util.Date;
  * @create: 2024-01-19 15:58
  **/
 @Repository
-public class ComputeProjectGroupCostDetailRepository extends ServiceImpl<ComputeProjectGroupCostDetailMapper, ComputeProjectGroupCostDetail> {
+public class ComputeProjectGroupCostDetailRepository extends BaseBatchServiceImpl<ComputeProjectGroupCostDetailMapper, ComputeProjectGroupCostDetail> {
     public void removeByComputeDate(String computeDate, SessionUserVO currentUser) {
 
         UpdateWrapper<ComputeProjectGroupCostDetail> updateWrapper = new UpdateWrapper<>();

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

@@ -81,6 +81,14 @@ public class ItemRepository extends ServiceImpl<ItemMapper, Item> {
         }
     }
 
+    /**
+     * 获取责任中心的医疗服务项目字典
+     * @return
+     */
+    public List<Item> getRespItemList(){
+        return this.baseMapper.getRespItemList(UserContext.getHospId());
+    }
+
     public List<Item> getList() {
         LambdaQueryWrapper<Item> queryWrapper = new LambdaQueryWrapper<>();
         queryWrapper.eq(Item::getHospId, UserContext.getHospId());

+ 3 - 2
src/main/java/com/kcim/service/StandardReportService.java

@@ -2,6 +2,7 @@ package com.kcim.service;
 
 import com.kcim.vo.*;
 import com.kcim.web.reponse.ComputeProfitCollectResponse;
+import com.kcim.web.reponse.StandardDeptCostCollectResponse;
 
 import java.util.List;
 
@@ -105,7 +106,7 @@ public interface StandardReportService {
      * @param computeDate
      * @return
      */
-    ComputeProfitCollectResponse getDeptDiseaseCostCompositionDetail(String computeDate);
+    StandardDeptCostCollectResponse getDeptDiseaseCostCompositionDetail(String computeDate);
 
     /**
      * 获取DRG成本明细表数据
@@ -126,5 +127,5 @@ public interface StandardReportService {
      * @param computeDate
      * @return
      */
-    ComputeProfitCollectResponse getDeptDrgCostCompositionDetail(String computeDate);
+    StandardDeptCostCollectResponse getDeptDrgCostCompositionDetail(String computeDate);
 }

+ 249 - 89
src/main/java/com/kcim/service/impl/ProjectCostServiceImpl.java

@@ -19,6 +19,7 @@ import com.kcim.service.ResponsibilityDepartmentService;
 import com.kcim.service.SqlService;
 import com.kcim.vo.*;
 import com.kcim.web.reponse.ProjectCostResponse;
+import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.jetbrains.annotations.NotNull;
 import org.springframework.stereotype.Service;
@@ -47,6 +48,7 @@ import static com.kcim.service.impl.DrugMaterialCalculateServiceImpl.getVisitNoR
  **/
 @Service("ProjectCostService")
 @Slf4j
+@AllArgsConstructor
 public class ProjectCostServiceImpl implements ProjectCostService {
     private static final Integer LIMIT = 1000;
     ResponsibilityRepository responsibilityRepository;
@@ -69,6 +71,8 @@ public class ProjectCostServiceImpl implements ProjectCostService {
      * 科室损益
      */
     CostDepartmentProfitRepository costDepartmentProfitRepository;
+
+    CostDepartmentProfitAccountRepository costDepartmentProfitAccountRepository;
     /**
      * 项目分摊参数设置
      */
@@ -76,6 +80,8 @@ public class ProjectCostServiceImpl implements ProjectCostService {
 
     ComputeShareParamRepository computeShareParamRepository;
 
+    ComputeProjectCostAccountRepository projectCostAccountRepository;
+
     ItemRepository itemRepository;
 
     ResponsibilityDepartmentRepository responsibilityDepartmentRepository;
@@ -104,34 +110,34 @@ public class ProjectCostServiceImpl implements ProjectCostService {
 
     ResponsibilityDepartmentService responsibilityDepartmentService;
 
-    public ProjectCostServiceImpl(ResponsibilityDepartmentService responsibilityDepartmentService,SqlService sqlService,ResponsibilityRepository responsibilityRepository, ComputeProjectCostRepository repository, ComputeProjectCostDetailRepository detailRepository, ComputeProjectGroupCostDetailRepository groupDetailRepository, ImportPatientItemRepository importPatientItemRepository, ShareParamCostRepository shareParamCostRepository, ShareParamCostDetailRepository shareParamCostDetailRepository, CostDepartmentProfitRepository costDepartmentProfitRepository, ShareParamTypeMapRepository shareParamTypeMapRepository, ComputeShareParamRepository computeShareParamRepository, ItemRepository itemRepository, ResponsibilityDepartmentRepository responsibilityDepartmentRepository, CenterService centerService, ComputePatientProjectCostRepository computePatientProjectCostRepository, ComputePatientProjectCostDetailRepository computePatientProjectCostDetailRepository, ComputePatientProjectGroupCostDetailRepository computePatientProjectGroupCostDetailRepository, ComputeStandShareParamRepository computeStandShareParamRepository, ComputeStandProjectCostRepository standProjectCostRepository, ComputeStandProjectCostDetailRepository standProjectCostDetailRepository, ComputeStandProjectGroupCostDetailRepository standProjectGroupCostDetailRepository, ComputeStandPatientProjectCostRepository computeStandPatientProjectCostRepository, ComputeStandPatientProjectCostDetailRepository computeStandPatientProjectCostDetailRepository, ComputeStandPatientProjectGroupCostDetailRepository computeStandPatientProjectGroupCostDetailRepository) {
-        this.responsibilityRepository = responsibilityRepository;
-        this.repository = repository;
-        this.sqlService = sqlService;
-
-        this.detailRepository = detailRepository;
-        this.groupDetailRepository = groupDetailRepository;
-        this.importPatientItemRepository = importPatientItemRepository;
-        this.shareParamCostRepository = shareParamCostRepository;
-        this.shareParamCostDetailRepository = shareParamCostDetailRepository;
-        this.costDepartmentProfitRepository = costDepartmentProfitRepository;
-        this.shareParamTypeMapRepository = shareParamTypeMapRepository;
-        this.computeShareParamRepository = computeShareParamRepository;
-        this.itemRepository = itemRepository;
-        this.responsibilityDepartmentRepository = responsibilityDepartmentRepository;
-        this.centerService = centerService;
-        this.computePatientProjectCostRepository = computePatientProjectCostRepository;
-        this.computePatientProjectCostDetailRepository = computePatientProjectCostDetailRepository;
-        this.computePatientProjectGroupCostDetailRepository = computePatientProjectGroupCostDetailRepository;
-        this.computeStandShareParamRepository = computeStandShareParamRepository;
-        this.standProjectCostRepository = standProjectCostRepository;
-        this.standProjectCostDetailRepository = standProjectCostDetailRepository;
-        this.standProjectGroupCostDetailRepository = standProjectGroupCostDetailRepository;
-        this.computeStandPatientProjectCostRepository = computeStandPatientProjectCostRepository;
-        this.computeStandPatientProjectCostDetailRepository = computeStandPatientProjectCostDetailRepository;
-        this.computeStandPatientProjectGroupCostDetailRepository = computeStandPatientProjectGroupCostDetailRepository;
-        this.responsibilityDepartmentService=responsibilityDepartmentService;
-    }
+//    public ProjectCostServiceImpl(ResponsibilityDepartmentService responsibilityDepartmentService,SqlService sqlService,ResponsibilityRepository responsibilityRepository, ComputeProjectCostRepository repository, ComputeProjectCostDetailRepository detailRepository, ComputeProjectGroupCostDetailRepository groupDetailRepository, ImportPatientItemRepository importPatientItemRepository, ShareParamCostRepository shareParamCostRepository, ShareParamCostDetailRepository shareParamCostDetailRepository, CostDepartmentProfitRepository costDepartmentProfitRepository, ShareParamTypeMapRepository shareParamTypeMapRepository, ComputeShareParamRepository computeShareParamRepository, ItemRepository itemRepository, ResponsibilityDepartmentRepository responsibilityDepartmentRepository, CenterService centerService, ComputePatientProjectCostRepository computePatientProjectCostRepository, ComputePatientProjectCostDetailRepository computePatientProjectCostDetailRepository, ComputePatientProjectGroupCostDetailRepository computePatientProjectGroupCostDetailRepository, ComputeStandShareParamRepository computeStandShareParamRepository, ComputeStandProjectCostRepository standProjectCostRepository, ComputeStandProjectCostDetailRepository standProjectCostDetailRepository, ComputeStandProjectGroupCostDetailRepository standProjectGroupCostDetailRepository, ComputeStandPatientProjectCostRepository computeStandPatientProjectCostRepository, ComputeStandPatientProjectCostDetailRepository computeStandPatientProjectCostDetailRepository, ComputeStandPatientProjectGroupCostDetailRepository computeStandPatientProjectGroupCostDetailRepository) {
+//        this.responsibilityRepository = responsibilityRepository;
+//        this.repository = repository;
+//        this.sqlService = sqlService;
+//
+//        this.detailRepository = detailRepository;
+//        this.groupDetailRepository = groupDetailRepository;
+//        this.importPatientItemRepository = importPatientItemRepository;
+//        this.shareParamCostRepository = shareParamCostRepository;
+//        this.shareParamCostDetailRepository = shareParamCostDetailRepository;
+//        this.costDepartmentProfitRepository = costDepartmentProfitRepository;
+//        this.shareParamTypeMapRepository = shareParamTypeMapRepository;
+//        this.computeShareParamRepository = computeShareParamRepository;
+//        this.itemRepository = itemRepository;
+//        this.responsibilityDepartmentRepository = responsibilityDepartmentRepository;
+//        this.centerService = centerService;
+//        this.computePatientProjectCostRepository = computePatientProjectCostRepository;
+//        this.computePatientProjectCostDetailRepository = computePatientProjectCostDetailRepository;
+//        this.computePatientProjectGroupCostDetailRepository = computePatientProjectGroupCostDetailRepository;
+//        this.computeStandShareParamRepository = computeStandShareParamRepository;
+//        this.standProjectCostRepository = standProjectCostRepository;
+//        this.standProjectCostDetailRepository = standProjectCostDetailRepository;
+//        this.standProjectGroupCostDetailRepository = standProjectGroupCostDetailRepository;
+//        this.computeStandPatientProjectCostRepository = computeStandPatientProjectCostRepository;
+//        this.computeStandPatientProjectCostDetailRepository = computeStandPatientProjectCostDetailRepository;
+//        this.computeStandPatientProjectGroupCostDetailRepository = computeStandPatientProjectGroupCostDetailRepository;
+//        this.responsibilityDepartmentService=responsibilityDepartmentService;
+//    }
 
     /**
      * 项目成本计算分页查询
@@ -467,20 +473,44 @@ public class ProjectCostServiceImpl implements ProjectCostService {
         if (CollectionUtils.isEmpty(shareParamCostVos)){
             throw new CostException("没有项目分摊配置信息无法分摊,请联系管理员");
         }
+        //按成本列代码分组
+        Map<String, List<ShareParamCostVo>> shareParamCostMap = shareParamCostVos.stream().collect(Collectors.groupingBy(ShareParamCostVo::getColumnCode));
 
         //获取科室损益报表数据
         List<CostDepartmentProfit> costDepartmentProfits = costDepartmentProfitRepository.getDepartmentProfit(computeDate);
         if (CollectionUtils.isEmpty(costDepartmentProfits)){
             throw new CostException("未进行科室损益计算,请先进行科室损益计算,当前计算中止");
         }
+        //按报表类型+报表编码+责任中心分组
+        Map<String, List<CostDepartmentProfit>> deptProfitGroup =costDepartmentProfits.stream().collect(Collectors.groupingBy(
+                                cost ->String.format("%s-%s-%s",cost.getShareType(),cost.getReportNum(),cost.getResponsibilityCode())));
+
+        //获取科室损益的会计科目金额
+        List<CostDepartmentProfitAccount> deptPriftAccountList = costDepartmentProfitAccountRepository.getList(computeDate);
+        Map<Long, List<CostDepartmentProfitAccount>> deptPriftAccountMap;
+        if(CollectionUtils.isEmpty(deptPriftAccountList)){
+            deptPriftAccountMap = new HashMap<>();
+        }else{
+            deptPriftAccountMap= deptPriftAccountList.stream().collect(Collectors.groupingBy(CostDepartmentProfitAccount::getDeptProfitId));
+        }
 
+        //获取责任中心的医疗服务项目字典
+        List<Item> itemList = itemRepository.getRespItemList();
+        Map<String, Map<String, List<Item>>> respItemGroup = itemList.stream()
+                .collect(Collectors.groupingBy(Item::getResponsibilityCode,
+                        Collectors.groupingBy(Item::getCode)));
 
         //项目成本分摊配置主表信息(项目成本列配置)
         List<ShareParamCost> ShareParamCosts = shareParamCostRepository.getList(null);
+        Map<String, List<ShareParamCost>> shareParamCostGroup = ShareParamCosts.stream().collect(Collectors.groupingBy(ShareParamCost::getItemType));
         //分摊参数信息
         List<ComputeShareParamDetailVo> computeShareParamDetails = computeShareParamRepository.getComputeShareParamDetail(computeDate);
+        Map<String, List<ComputeShareParamDetailVo>> shareParamDetailValueGroup = computeShareParamDetails.stream().collect(Collectors.groupingBy(
+                cost -> String.format("%s-%s-%s", cost.getResponsibilityCode(), cost.getItemType(), cost.getCode())));
         //分摊参数按责任中心汇总信息
         List<ComputeShareParamDetailVo> computeShareParamDetailGroup = computeShareParamRepository.getComputeShareParamDetailGroup(computeDate);
+        Map<String, List<ComputeShareParamDetailVo>> shareParamDetailGroup = computeShareParamDetailGroup.stream().collect(Collectors.groupingBy(
+                cost -> String.format("%s-%s-%s", cost.getItemType(), cost.getShareParamCode(), cost.getResponsibilityCode())));
         //要计算的科室收费项目
         List<ComputeShareParamDetailVo> computeResponsibilityItems = computeShareParamRepository.getComputeResponsibilityItem(computeDate);
 
@@ -493,16 +523,17 @@ public class ProjectCostServiceImpl implements ProjectCostService {
         //按项目类别+责任中心代码+项目代码逐个计算项目分摊金额
         computeResponsibilityItems.stream().forEach(responsibilityItem->{
             //创建项目成本主表对象
-            ComputeProjectCost projectCost = createComputeProjectCost(computeDate, currentUser, responsibilityItem);
+            ComputeProjectCost projectCost = createComputeProjectCost(computeDate, currentUser, responsibilityItem,respItemGroup);
             computeProjectCosts.add(projectCost);
+            String shareParamDetailValueKey = String.format("%s-%s-%s", projectCost.getResponsibilityCode(),projectCost.getItemType(), projectCost.getCode());
             //获取项目对应分摊参数数值
-            List<ComputeShareParamDetailVo> itemShareParams = computeShareParamDetails.stream().filter(shareParamGroup -> shareParamGroup.getResponsibilityCode().equals(projectCost.getResponsibilityCode())
-                    && shareParamGroup.getCode().equals(projectCost.getCode()) && shareParamGroup.getItemType().equals(projectCost.getItemType())).collect(Collectors.toList());
+            List<ComputeShareParamDetailVo> itemShareParams =shareParamDetailValueGroup.get(shareParamDetailValueKey);
             if (CollectionUtils.isEmpty(itemShareParams)){
                 throw new CostException(String.format("找不到项目的[%s-%s]对应的分摊分摊参数,请重新计算分摊参数",projectCost.getItemType(),projectCost.getName()));
             }
+            Map<String, List<ComputeShareParamDetailVo>> respShareParamValueMap = itemShareParams.stream().collect(Collectors.groupingBy(ComputeShareParamDetailVo::getShareParamCode));
             //取项目对应的分摊配置
-            List<ShareParamCost> itemShareParamCost = ShareParamCosts.stream().filter(shareParamCost -> shareParamCost.getItemType().equals(projectCost.getItemType())).collect(Collectors.toList());
+            List<ShareParamCost> itemShareParamCost =shareParamCostGroup.get(projectCost.getItemType());
             if (CollectionUtils.isEmpty(itemShareParamCost)){
                 throw new CostException(String.format("类型[%s]没有对应分摊配置,请联系管理员",projectCost.getItemType()));
             }
@@ -510,7 +541,7 @@ public class ProjectCostServiceImpl implements ProjectCostService {
             //按项目分摊配置计算项目的所有项目成本列的分摊金额
             itemShareParamCost.stream().forEach(shareParamCost->{
                 ComputeProjectCostDetail cmputeProjectCostDetail=createComputeProjectCostDetail(computeDate, currentUser,incomeShareParam,responsibilityItem,projectCost,
-                        shareParamCost,shareParamCostVos,itemShareParams,computeShareParamDetailGroup,costDepartmentProfits);
+                                                        shareParamCost,shareParamCostMap,respShareParamValueMap,shareParamDetailGroup, deptProfitGroup, deptPriftAccountMap);
                 computeProjectCostDetailChilds.add(cmputeProjectCostDetail);
             });
             computeProjectCostDetails.addAll(computeProjectCostDetailChilds);
@@ -537,22 +568,54 @@ public class ProjectCostServiceImpl implements ProjectCostService {
         repository.removeByComputeDate(computeDate, currentUser);
         detailRepository.removeByComputeDate(computeDate, currentUser);
         groupDetailRepository.removeByComputeDate(computeDate, currentUser);
+        projectCostAccountRepository.removeByComputeDate(computeDate, currentUser);
 
         //保存项目分摊主表对象数据
         repository.saveBatch(computeProjectCosts, 500);
         if (!CollectionUtils.isEmpty(computeProjectCostDetails)) {
             //保存项目分摊明细表对象数据
             computeProjectCostDetails.stream().forEach(projectCostDetail->projectCostDetail.setProjectCostId(projectCostDetail.getComputeProjectCost().getId()));
-            detailRepository.saveBatch(computeProjectCostDetails, 500);
+            detailRepository.batchInsert(computeProjectCostDetails);
         }
         if (!CollectionUtils.isEmpty(computeProjectGroupCostDetails)) {
             //保存项目分摊汇总表对象数据
             computeProjectGroupCostDetails.stream().forEach(projectCostDetail->projectCostDetail.setProjectCostId(projectCostDetail.getComputeProjectCost().getId()));
-            groupDetailRepository.saveBatch(computeProjectGroupCostDetails, 500);
+            groupDetailRepository.batchInsert(computeProjectGroupCostDetails);
         }
+        //保存项目成本对应的会计科目信息
+        saveProjectCostAccountList(computeProjectCosts);
 
+    }
 
+    /**
+     * 保存项目成本对应的会计科目信息
+     * @param computeProjectCosts
+     */
+    public void saveProjectCostAccountList(List<ComputeProjectCost> computeProjectCosts){
+        List<ComputeProjectCostAccount> projectCostAccountList=new ArrayList<>();
+        for (ComputeProjectCost projectCost : computeProjectCosts) {
+            List<ComputeProjectCostAccount> itemAccountList =new ArrayList<>();
+            itemAccountList.addAll(projectCost.getProjectCostAccountMap().values());
+            if (CollectionUtils.isEmpty(itemAccountList)) {
+                continue;
+            }
+            itemAccountList.forEach(itemAccount->{
+                itemAccount.setProjectCostId(projectCost.getId());
+                //计算单个项目的金额
+                if(BigDecimal.ZERO.compareTo(projectCost.getQuantity()) == NumberConstant.ZERO){
+                    itemAccount.setComputeSingleResult(BigDecimal.ZERO);
+                }else{
+                    BigDecimal divide = itemAccount.getComputeResult().divide(projectCost.getQuantity(), NumberConstant.FOUR, RoundingMode.HALF_UP);
+                    itemAccount.setComputeSingleResult(divide);
+                }
+            });
+            projectCostAccountList.addAll(itemAccountList);
+        }
+        if(CollectionUtils.isEmpty(projectCostAccountList)){
+            return;
+        }
 
+        projectCostAccountRepository.batchInsert(projectCostAccountList);
     }
 
     /**
@@ -579,7 +642,7 @@ public class ProjectCostServiceImpl implements ProjectCostService {
      * @param responsibilityItem
      * @return
      */
-    public ComputeProjectCost createComputeProjectCost(String computeDate,SessionUserVO currentUser,ComputeShareParamDetailVo responsibilityItem){
+    public ComputeProjectCost createComputeProjectCost(String computeDate,SessionUserVO currentUser,ComputeShareParamDetailVo responsibilityItem,Map<String, Map<String, List<Item>>> respItemGroup){
         //主表公共对象
         ComputeProjectCost computeProjectCost = new ComputeProjectCost();
         computeProjectCost.setComputeDate(computeDate);
@@ -589,8 +652,14 @@ public class ProjectCostServiceImpl implements ProjectCostService {
         computeProjectCost.setCode(responsibilityItem.getCode());
         computeProjectCost.setName(responsibilityItem.getName());
         computeProjectCost.setItemType(responsibilityItem.getItemType());
+        computeProjectCost.setQuantity(responsibilityItem.getNum());
         computeProjectCost.setResponsibilityCode(responsibilityItem.getResponsibilityCode());
         computeProjectCost.setResponsibilityName(responsibilityItem.getResponsibilityName());
+        Map<String, List<Item>> stringListMap = respItemGroup.get(responsibilityItem.getResponsibilityCode());
+        if(stringListMap!=null&&stringListMap.containsKey(responsibilityItem.getCode())){
+            computeProjectCost.setStandItemCode(stringListMap.get(responsibilityItem.getCode()).get(NumberConstant.ZERO).getStandItemCode());
+        }
+        computeProjectCost.setProjectCostAccountMap(new HashMap<>());
         return computeProjectCost;
     }
 
@@ -607,9 +676,17 @@ public class ProjectCostServiceImpl implements ProjectCostService {
      * @param costDepartmentProfits 科室损益数据
      * @return
      */
-    public ComputeProjectCostDetail createComputeProjectCostDetail(String computeDate,SessionUserVO currentUser,ShareParamTypeMap incomeShareParam,ComputeShareParamDetailVo responsibilityItem,ComputeProjectCost computeProjectCost,ShareParamCost shareParamCost,
-                                                                   List<ShareParamCostVo> shareParamCostVos,List<ComputeShareParamDetailVo> computeShareParamDetails ,
-                                                                   List<ComputeShareParamDetailVo> computeShareParamDetailGroup,List<CostDepartmentProfit> costDepartmentProfits){
+    public ComputeProjectCostDetail createComputeProjectCostDetail(String computeDate,
+                                                                   SessionUserVO currentUser,
+                                                                   ShareParamTypeMap incomeShareParam,
+                                                                   ComputeShareParamDetailVo responsibilityItem,
+                                                                   ComputeProjectCost computeProjectCost,
+                                                                   ShareParamCost shareParamCost,
+                                                                   Map<String, List<ShareParamCostVo>> shareParamCostVos,
+                                                                   Map<String, List<ComputeShareParamDetailVo>> computeShareParamDetails ,
+                                                                   Map<String, List<ComputeShareParamDetailVo>> computeShareParamDetailGroup,
+                                                                   Map<String, List<CostDepartmentProfit>> costDepartmentProfits,
+                                                                   Map<Long, List<CostDepartmentProfitAccount>> deptPriftAccountMap){
         //明细表公共对象
         ComputeProjectCostDetail costDetail = new ComputeProjectCostDetail();
         costDetail.setComputeDate(computeDate);
@@ -620,16 +697,15 @@ public class ProjectCostServiceImpl implements ProjectCostService {
         costDetail.setCostColumnCode(shareParamCost.getColumnCode());
         costDetail.setCostColumnType(shareParamCost.getColumnType());
         //获取对应分摊配置明细
-        List<ShareParamCostVo> shareParamDetails = shareParamCostVos.stream().filter(shareParamDetail -> shareParamDetail.getColumnCode().equals(shareParamCost.getColumnCode())).collect(Collectors.toList());
+        List<ShareParamCostVo> shareParamDetails = shareParamCostVos.get(shareParamCost.getColumnCode());
         if (CollectionUtils.isEmpty(shareParamDetails)){
             throw new CostException(String.format("[%s]没有对应分摊配置,请联系管理员",shareParamCost.getColumnName()));
         }
+        String profitKey = String.format("%s-%s-%s",shareParamCost.getReportType(),shareParamCost.getProfitNum(),computeProjectCost.getResponsibilityCode());
         //根据主表配置找到对应的科室损益数据
-        Optional<CostDepartmentProfit> firstDepartmentProfit = costDepartmentProfits.stream().filter(departmentProfit -> String.valueOf(departmentProfit.getShareType()).equals(shareParamCost.getReportType()) &&
-                String.valueOf(departmentProfit.getReportNum()).equals(shareParamCost.getProfitNum()) &&
-                departmentProfit.getResponsibilityCode().equals(computeProjectCost.getResponsibilityCode())).findFirst();
+        List<CostDepartmentProfit> departmentProfitList = costDepartmentProfits.get(profitKey);
         //没有对应的损益项目数据或者损益项目金额为0
-        if(!firstDepartmentProfit.isPresent()||firstDepartmentProfit.get().getAmount().equals(BigDecimal.ZERO)){
+        if(CollectionUtils.isEmpty(departmentProfitList)|| departmentProfitList.get(NumberConstant.ZERO).getAmount().equals(BigDecimal.ZERO)){
             costDetail.setComputeResult(BigDecimal.ZERO);
             costDetail.setComputeSingleResult(BigDecimal.ZERO);
             costDetail.setStandComputeResult(BigDecimal.ZERO);
@@ -637,13 +713,13 @@ public class ProjectCostServiceImpl implements ProjectCostService {
             return costDetail;
         }
         //按项目分摊配置计算项目的一个项目成本列的分摊金额
-        BigDecimal itemAllocationAmount=calcItemAllocationAmount(incomeShareParam,computeProjectCost,firstDepartmentProfit.get(),
-                shareParamDetails,computeShareParamDetailGroup,computeShareParamDetails);
+        BigDecimal itemAllocationAmount=calcItemAllocationAmount(incomeShareParam,computeProjectCost, departmentProfitList.get(NumberConstant.ZERO),
+                shareParamDetails,computeShareParamDetailGroup,computeShareParamDetails,deptPriftAccountMap);
         costDetail.setComputeResult(itemAllocationAmount);
 
         //按项目分摊配置计算项目的一个项目成本列的标准法分摊金额
-        BigDecimal itemStandAllocationAmount=calcItemStandAllocationAmount(incomeShareParam,computeProjectCost,firstDepartmentProfit.get(),
-                shareParamDetails,computeShareParamDetailGroup,computeShareParamDetails);
+        BigDecimal itemStandAllocationAmount=calcItemStandAllocationAmount(incomeShareParam,computeProjectCost, departmentProfitList.get(NumberConstant.ZERO),
+                shareParamDetails,computeShareParamDetailGroup,computeShareParamDetails,deptPriftAccountMap);
         costDetail.setStandComputeResult(itemStandAllocationAmount);
 
         //项目没有数量时,单个项目的分摊金额为0
@@ -667,44 +743,118 @@ public class ProjectCostServiceImpl implements ProjectCostService {
      * @param computeShareParamDetails 分摊参数计算明细
      * @return
      */
-    public  BigDecimal calcItemAllocationAmount(ShareParamTypeMap incomeShareParam,ComputeProjectCost computeProjectCost,CostDepartmentProfit costDepartmentProfit,List<ShareParamCostVo> shareParamCostVos,
-                                                List<ComputeShareParamDetailVo> computeShareParamDetailGroup,List<ComputeShareParamDetailVo> computeShareParamDetails){
+    public BigDecimal calcItemAllocationAmount(ShareParamTypeMap incomeShareParam,
+                                               ComputeProjectCost computeProjectCost,
+                                               CostDepartmentProfit costDepartmentProfit,
+                                               List<ShareParamCostVo> shareParamCostVos,
+                                               Map<String, List<ComputeShareParamDetailVo>> computeShareParamDetailGroup,
+                                               Map<String, List<ComputeShareParamDetailVo>> computeShareParamDetails,
+                                               Map<Long, List<CostDepartmentProfitAccount>> deptPriftAccountMap) {
         BigDecimal itemAllocationAmount=BigDecimal.ZERO;
         //按配置计算每个参数分摊金额
-        for (ShareParamCostVo shareParamCostVo : shareParamCostVos) {//获取参数对应的责任中心汇总数据
-            Optional<ComputeShareParamDetailVo> firstShareParamGroup = computeShareParamDetailGroup.stream().filter(shareParamGroup -> shareParamGroup.getItemType().equals(computeProjectCost.getItemType()) &&
-                    shareParamGroup.getResponsibilityCode().equals(computeProjectCost.getResponsibilityCode()) && shareParamGroup.getShareParamCode().equals(shareParamCostVo.getShareParamCode())).findFirst();
+        for (ShareParamCostVo shareParamCostVo : shareParamCostVos) {
+            //获取参数对应的责任中心汇总数据
+            String shareParamKey = String.format("%s-%s-%s",computeProjectCost.getItemType(),shareParamCostVo.getShareParamCode(),computeProjectCost.getResponsibilityCode());
+            List<ComputeShareParamDetailVo> shareParamTotalValueList = computeShareParamDetailGroup.get(shareParamKey);
             //责任中心的汇总数据为0时,按项目收入分摊
-            if (!firstShareParamGroup.isPresent() || firstShareParamGroup.get().getComputeResult().compareTo(BigDecimal.ZERO) == NumberConstant.ZERO) {
+            if (CollectionUtils.isEmpty(shareParamTotalValueList)|| shareParamTotalValueList.get(NumberConstant.ZERO).getComputeResult().compareTo(BigDecimal.ZERO) == NumberConstant.ZERO) {
                 //获取项目对应的收入数据
-                Optional<ComputeShareParamDetailVo> firstComputeShareParamDetail = computeShareParamDetails.stream().filter(computeShareParamDetailVo ->
-                        computeShareParamDetailVo.getShareParamCode().equals(incomeShareParam.getShareParamCode())).findFirst();
-                if (!firstComputeShareParamDetail.isPresent()) {
+                List<ComputeShareParamDetailVo> computeShareParamDetailList = computeShareParamDetails.get(incomeShareParam.getShareParamCode());
+                if (CollectionUtils.isEmpty(computeShareParamDetailList)) {
                     throw new CostException(String.format("[%s-%s]没有收入数据无法分摊,请检查对应的收费项目数据及分摊参数计算结果数据", computeProjectCost.getResponsibilityName(), computeProjectCost.getName()));
                 }
-                //找到项目收入的责任中心汇总数据
-                ComputeShareParamDetailVo incomeShareParamGroup = computeShareParamDetailGroup.stream().filter(shareParamGroup -> shareParamGroup.getItemType().equals(computeProjectCost.getItemType()) &&
-                        shareParamGroup.getResponsibilityCode().equals(computeProjectCost.getResponsibilityCode()) && shareParamGroup.getShareParamCode().equals(incomeShareParam.getShareParamCode())).findFirst().get();
-                //分摊金额=损益项目金额*分摊参数占比*收入/责任中心总收入
-                BigDecimal paramAllocationAmount = costDepartmentProfit.getAmount().multiply(shareParamCostVo.getPercent()).multiply(firstComputeShareParamDetail.get().getComputeResult())
-                        .divide(incomeShareParamGroup.getComputeResult(), NumberConstant.FOUR, RoundingMode.HALF_UP);
-                itemAllocationAmount = itemAllocationAmount.add(paramAllocationAmount);
+                String incomeShareParamKey = String.format("%s-%s-%s",computeProjectCost.getItemType(),incomeShareParam.getShareParamCode(),computeProjectCost.getResponsibilityCode());
+                //有对应的收入数据
+                if(computeShareParamDetailGroup.containsKey(incomeShareParamKey)){
+                    //找到项目收入的责任中心汇总数据
+                    List<ComputeShareParamDetailVo> incomeShareParamGroup = computeShareParamDetailGroup.get(incomeShareParamKey);
+                    //分摊金额=损益项目金额*分摊参数占比*收入/责任中心总收入
+                    BigDecimal paramAllocationAmount = costDepartmentProfit.getAmount().multiply(shareParamCostVo.getPercent()).multiply(computeShareParamDetailList.get(NumberConstant.ZERO).getComputeResult())
+                            .divide(incomeShareParamGroup.get(NumberConstant.ZERO).getComputeResult(), NumberConstant.FOUR, RoundingMode.HALF_UP);
+                    itemAllocationAmount = itemAllocationAmount.add(paramAllocationAmount);
+                    //计算项目对应的会计科目金额
+                    calcProjectAccountAmount( computeProjectCost, costDepartmentProfit, shareParamCostVo, computeShareParamDetailList.get(NumberConstant.ZERO),incomeShareParamGroup.get(NumberConstant.ZERO), deptPriftAccountMap,NumberConstant.ONE ) ;
+                }
             } else {
+
                 //获取项目对应的分摊参数数据
-                Optional<ComputeShareParamDetailVo> firstComputeShareParamDetail = computeShareParamDetails.stream().filter(computeShareParamDetailVo ->
-                        computeShareParamDetailVo.getShareParamCode().equals(shareParamCostVo.getShareParamCode())).findFirst();
-                if (!firstComputeShareParamDetail.isPresent()) {
+                List<ComputeShareParamDetailVo> computeShareParamDetailList = computeShareParamDetails.get(shareParamCostVo.getShareParamCode());
+                if (CollectionUtils.isEmpty(computeShareParamDetailList)) {
                     throw new CostException(String.format("[%s-%s]没有收入数据无法分摊,请检查对应的收费项目数据", computeProjectCost.getResponsibilityName(), computeProjectCost.getName()));
                 }
                 //分摊金额=损益项目金额*分摊参数占比*分摊参数数值/责任中心总分摊参数数值
-                BigDecimal paramAllocationAmount = costDepartmentProfit.getAmount().multiply(shareParamCostVo.getPercent()).multiply(firstComputeShareParamDetail.get().getComputeResult())
-                        .divide(firstShareParamGroup.get().getComputeResult(), NumberConstant.FOUR, RoundingMode.HALF_UP);
+                BigDecimal paramAllocationAmount = costDepartmentProfit.getAmount().multiply(shareParamCostVo.getPercent()).multiply(computeShareParamDetailList.get(NumberConstant.ZERO).getComputeResult())
+                        .divide(shareParamTotalValueList.get(NumberConstant.ZERO).getComputeResult(), NumberConstant.FOUR, RoundingMode.HALF_UP);
                 itemAllocationAmount = itemAllocationAmount.add(paramAllocationAmount);
+                //计算项目对应的会计科目金额
+                calcProjectAccountAmount( computeProjectCost, costDepartmentProfit, shareParamCostVo, computeShareParamDetailList.get(NumberConstant.ZERO), shareParamTotalValueList.get(NumberConstant.ZERO), deptPriftAccountMap,NumberConstant.ONE );
             }
         }
         return  itemAllocationAmount;
     }
 
+    /**
+     * 计算项目对应的会计科目金额
+     * @param computeProjectCost
+     * @param costDepartmentProfit
+     * @param shareParamCostVo
+     * @param shareParamValueVo
+     * @param shareParamTotalValueVo
+     * @param deptPriftAccountMap
+     * @param calcType 1:计算项目金额 2:计算项目标准金额
+     */
+    public void calcProjectAccountAmount(ComputeProjectCost computeProjectCost,
+                                         CostDepartmentProfit costDepartmentProfit,
+                                         ShareParamCostVo shareParamCostVo,
+                                         ComputeShareParamDetailVo shareParamValueVo,
+                                         ComputeShareParamDetailVo shareParamTotalValueVo,
+                                         Map<Long,List<CostDepartmentProfitAccount>> deptPriftAccountMap,
+                                         Integer calcType){
+        List<CostDepartmentProfitAccount> costDepartmentProfitAccounts = deptPriftAccountMap.get(costDepartmentProfit.getId());
+        if(CollectionUtils.isEmpty(costDepartmentProfitAccounts)){
+            return;
+        }
+        //排除掉无效数据
+        if(StringUtils.isEmpty(computeProjectCost.getStandItemCode())){
+            return;
+        }
+        for (CostDepartmentProfitAccount costDepartmentProfitAccount : costDepartmentProfitAccounts) {
+            ComputeProjectCostAccount computeProjectCostAccount = new ComputeProjectCostAccount();
+            computeProjectCostAccount.setProjectCostId(computeProjectCost.getId())
+                    .setStandItemCode(computeProjectCost.getStandItemCode())
+                    .setAccountType(costDepartmentProfitAccount.getAccountType())
+                    .setCostType(costDepartmentProfitAccount.getCostType())
+                    .setHospId(costDepartmentProfit.getHospId())
+                    .setComputeDate(computeProjectCost.getComputeDate())
+                    .setCreateUser(computeProjectCost.getCreateUser())
+                    .setCreateTime(new Date())
+                    .setUpdateUser(computeProjectCost.getUpdateUser())
+                    .setUpdateTime(new Date())
+                    .setDelFlag(NumberConstant.ZERO);
+
+            BigDecimal paramAllocationAmount = BigDecimal.ZERO;
+            if(BigDecimal.ZERO.compareTo(shareParamTotalValueVo.getComputeResult())!=NumberConstant.ZERO){
+                paramAllocationAmount = costDepartmentProfitAccount.getAmount().multiply(shareParamCostVo.getPercent()).multiply(shareParamValueVo.getComputeResult())
+                        .divide(shareParamTotalValueVo.getComputeResult(), NumberConstant.FOUR, RoundingMode.HALF_UP);
+            }
+            computeProjectCostAccount.setComputeResult(paramAllocationAmount);
+            String accountKey=String.format("%s-%s",computeProjectCostAccount.getCostType(),computeProjectCostAccount.getAccountType());
+            //判断当前科目是否已经存在
+            if(computeProjectCost.getProjectCostAccountMap().containsKey(accountKey)){
+                ComputeProjectCostAccount itemAccount = computeProjectCost.getProjectCostAccountMap().get(accountKey);
+                if(NumberConstant.ONE.equals(calcType)){
+                    itemAccount.setComputeResult(itemAccount.getComputeResult().add(computeProjectCostAccount.getComputeResult()));
+                }else {
+                    itemAccount.setStandComputeResult(itemAccount.getStandComputeResult().add(computeProjectCostAccount.getComputeResult()));
+                }
+            }else{
+                computeProjectCost.getProjectCostAccountMap().put(accountKey,computeProjectCostAccount);
+            }
+        }
+
+    }
+
+
     /**
      * 计算项目标准法的分摊金额
      * @param computeProjectCost 主表对象
@@ -714,40 +864,50 @@ public class ProjectCostServiceImpl implements ProjectCostService {
      * @param computeShareParamDetails 分摊参数计算明细
      * @return
      */
-    public  BigDecimal calcItemStandAllocationAmount(ShareParamTypeMap incomeShareParam,ComputeProjectCost computeProjectCost,CostDepartmentProfit costDepartmentProfit,List<ShareParamCostVo> shareParamCostVos,
-                                                List<ComputeShareParamDetailVo> computeShareParamDetailGroup,List<ComputeShareParamDetailVo> computeShareParamDetails){
+    public  BigDecimal calcItemStandAllocationAmount(ShareParamTypeMap incomeShareParam,
+                                                     ComputeProjectCost computeProjectCost,
+                                                     CostDepartmentProfit costDepartmentProfit,
+                                                     List<ShareParamCostVo> shareParamCostVos,
+                                                     Map<String, List<ComputeShareParamDetailVo>> computeShareParamDetailGroup,
+                                                     Map<String, List<ComputeShareParamDetailVo>> computeShareParamDetails,
+                                                     Map<Long, List<CostDepartmentProfitAccount>> deptPriftAccountMap){
         BigDecimal itemAllocationAmount=BigDecimal.ZERO;
         //按配置计算每个参数分摊金额
         for (ShareParamCostVo shareParamCostVo : shareParamCostVos) {
             //获取参数对应的责任中心汇总数据
-            Optional<ComputeShareParamDetailVo> firstShareParamGroup = computeShareParamDetailGroup.stream().filter(shareParamGroup -> shareParamGroup.getItemType().equals(computeProjectCost.getItemType()) &&
-                    shareParamGroup.getResponsibilityCode().equals(computeProjectCost.getResponsibilityCode()) && shareParamGroup.getShareParamCode().equals(shareParamCostVo.getShareParamCode())).findFirst();
+            String shareParamKey = String.format("%s-%s-%s",computeProjectCost.getItemType(),shareParamCostVo.getShareParamCode(),computeProjectCost.getResponsibilityCode());
+            List<ComputeShareParamDetailVo> shareParamTotalValueList = computeShareParamDetailGroup.get(shareParamKey);
             //责任中心的汇总数据为0时,按项目收入分摊
-            if (!firstShareParamGroup.isPresent() || firstShareParamGroup.get().getStandComputeResult().compareTo(BigDecimal.ZERO) == NumberConstant.ZERO) {
+            if (CollectionUtils.isEmpty(shareParamTotalValueList)|| shareParamTotalValueList.get(NumberConstant.ZERO).getStandComputeResult().compareTo(BigDecimal.ZERO) == NumberConstant.ZERO) {
                 //获取项目对应的收入数据
-                Optional<ComputeShareParamDetailVo> firstComputeShareParamDetail = computeShareParamDetails.stream().filter(computeShareParamDetailVo ->
-                        computeShareParamDetailVo.getShareParamCode().equals(incomeShareParam.getShareParamCode())).findFirst();
-                if (!firstComputeShareParamDetail.isPresent()) {
+                List<ComputeShareParamDetailVo> computeShareParamDetailList = computeShareParamDetails.get(incomeShareParam.getShareParamCode());
+                if (CollectionUtils.isEmpty(computeShareParamDetailList)) {
                     throw new CostException(String.format("[%s-%s]没有收入数据无法分摊,请检查对应的收费项目数据及分摊参数计算结果数据", computeProjectCost.getResponsibilityName(), computeProjectCost.getName()));
                 }
-                //找到项目收入的责任中心汇总数据
-                ComputeShareParamDetailVo incomeShareParamGroup = computeShareParamDetailGroup.stream().filter(shareParamGroup -> shareParamGroup.getItemType().equals(computeProjectCost.getItemType()) &&
-                        shareParamGroup.getResponsibilityCode().equals(computeProjectCost.getResponsibilityCode()) && shareParamGroup.getShareParamCode().equals(incomeShareParam.getShareParamCode())).findFirst().get();
-                //分摊金额=损益项目金额*分摊参数占比*收入/责任中心总收入
-                BigDecimal paramAllocationAmount = costDepartmentProfit.getAmount().multiply(shareParamCostVo.getPercent()).multiply(firstComputeShareParamDetail.get().getStandComputeResult())
-                        .divide(incomeShareParamGroup.getStandComputeResult(), NumberConstant.FOUR, RoundingMode.HALF_UP);
-                itemAllocationAmount = itemAllocationAmount.add(paramAllocationAmount);
+                String incomeShareParamKey = String.format("%s-%s-%s",computeProjectCost.getItemType(),incomeShareParam.getShareParamCode(),computeProjectCost.getResponsibilityCode());
+                //有对应的收入数据
+                if(computeShareParamDetailGroup.containsKey(incomeShareParamKey)){
+                    //找到项目收入的责任中心汇总数据
+                    List<ComputeShareParamDetailVo> incomeShareParamGroup = computeShareParamDetailGroup.get(incomeShareParamKey);
+                    //分摊金额=损益项目金额*分摊参数占比*收入/责任中心总收入
+                    BigDecimal paramAllocationAmount = costDepartmentProfit.getAmount().multiply(shareParamCostVo.getPercent()).multiply(computeShareParamDetailList.get(NumberConstant.ZERO).getStandComputeResult())
+                            .divide(incomeShareParamGroup.get(NumberConstant.ZERO).getStandComputeResult(), NumberConstant.FOUR, RoundingMode.HALF_UP);
+                    itemAllocationAmount = itemAllocationAmount.add(paramAllocationAmount);
+                    //计算项目对应的会计科目金额
+                    calcProjectAccountAmount( computeProjectCost, costDepartmentProfit, shareParamCostVo, computeShareParamDetailList.get(NumberConstant.ZERO),incomeShareParamGroup.get(NumberConstant.ZERO), deptPriftAccountMap,NumberConstant.ONE ) ;
+                }
             } else {
                 //获取项目对应的分摊参数数据
-                Optional<ComputeShareParamDetailVo> firstComputeShareParamDetail = computeShareParamDetails.stream().filter(computeShareParamDetailVo ->
-                        computeShareParamDetailVo.getShareParamCode().equals(shareParamCostVo.getShareParamCode())).findFirst();
-                if (!firstComputeShareParamDetail.isPresent()) {
+                List<ComputeShareParamDetailVo> computeShareParamDetailList = computeShareParamDetails.get(shareParamCostVo.getShareParamCode());
+                if (CollectionUtils.isEmpty(computeShareParamDetailList)) {
                     throw new CostException(String.format("[%s-%s]没有收入数据无法分摊,请检查对应的收费项目数据", computeProjectCost.getResponsibilityName(), computeProjectCost.getName()));
                 }
                 //分摊金额=损益项目金额*分摊参数占比*分摊参数数值/责任中心总分摊参数数值
-                BigDecimal paramAllocationAmount = costDepartmentProfit.getAmount().multiply(shareParamCostVo.getPercent()).multiply(firstComputeShareParamDetail.get().getStandComputeResult())
-                        .divide(firstShareParamGroup.get().getStandComputeResult(), NumberConstant.FOUR, RoundingMode.HALF_UP);
+                BigDecimal paramAllocationAmount = costDepartmentProfit.getAmount().multiply(shareParamCostVo.getPercent()).multiply(computeShareParamDetailList.get(NumberConstant.ZERO).getStandComputeResult())
+                        .divide(shareParamTotalValueList.get(NumberConstant.ZERO).getStandComputeResult(), NumberConstant.FOUR, RoundingMode.HALF_UP);
                 itemAllocationAmount = itemAllocationAmount.add(paramAllocationAmount);
+                //计算项目对应的会计科目金额
+                calcProjectAccountAmount( computeProjectCost, costDepartmentProfit, shareParamCostVo, computeShareParamDetailList.get(NumberConstant.ZERO), shareParamTotalValueList.get(NumberConstant.ZERO), deptPriftAccountMap,NumberConstant.ONE );
             }
         }
         return  itemAllocationAmount;

+ 48 - 36
src/main/java/com/kcim/service/impl/StandardReportServiceImpl.java

@@ -16,6 +16,7 @@ import com.kcim.service.IncomeCollectionService;
 import com.kcim.service.StandardReportService;
 import com.kcim.vo.*;
 import com.kcim.web.reponse.ComputeProfitCollectResponse;
+import com.kcim.web.reponse.StandardDeptCostCollectResponse;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
@@ -1075,33 +1076,38 @@ public class StandardReportServiceImpl implements StandardReportService {
      * @return
      */
     @Override
-    public ComputeProfitCollectResponse getDeptDiseaseCostCompositionDetail(String computeDate) {
+    public StandardDeptCostCollectResponse getDeptDiseaseCostCompositionDetail(String computeDate) {
         List<DiseaseCostDetailVO> projectCostAccountList = computePatientCostAccountRepository.getDeptDiseaseCostCompositionDetail(computeDate);
         if(CollectionUtils.isEmpty(projectCostAccountList)){
             throw new CostException("请先计算患者成本");
         }
-        // 获取所有的标准字典数据
-        StandCostDictMapVO standCostDictMaps = getStandCostDictMaps();
+        Map<String, List<DiseaseCostDetailVO>> deptPtAccountGroup = projectCostAccountList.stream().collect(Collectors.groupingBy(DiseaseCostDetailVO::getDepartmentCode));
+
         List<CommonResponsibilityReportVo> titleList = new ArrayList<>();
         // 提取科室名称作为列标题
-        for (Responsibility dept : standCostDictMaps.getResponsibilityDict()) {
-            CommonResponsibilityReportVo title = new CommonResponsibilityReportVo();
-            title.setResponsibilityName(dept.getResponsibilityName());
-            title.setResponsibilityCode(dept.getResponsibilityCode());
-            title.setSort(dept.getSort());
-            //添加子级标题
-            addCommonResponsibilityChild(title);
-            titleList.add(title);
-        }
+        deptPtAccountGroup.forEach((deptCode, deptPtAccountList) -> {
+            if(!CollectionUtils.isEmpty(deptPtAccountList)){
+                CommonResponsibilityReportVo title = new CommonResponsibilityReportVo();
+                title.setResponsibilityName(deptPtAccountList.get(NumberConstant.ZERO).getDepartmentName());
+                title.setResponsibilityCode(deptCode);
+                title.setSort(NumberConstant.ONE);
+                //添加子级标题
+                addCommonResponsibilityChild(title);
+                titleList.add(title);
+            }
+
+        });
+        //按科室名称排序
+        titleList.sort(Comparator.comparing(CommonResponsibilityReportVo::getResponsibilityName));
         // 记录项目类别对象
-        Map<String, ReportFormCustomVo> diseaseCostMap = new HashMap<>();
+        Map<String, StandardReportFormCustomVo> diseaseCostMap = new HashMap<>();
         // 遍历每个项目生成科室金额
         for (DiseaseCostDetailVO costItem : projectCostAccountList) {
-            ReportFormCustomVo itemVo ;
+            StandardReportFormCustomVo itemVo ;
             if(diseaseCostMap.containsKey(costItem.getItemCode())){
                 itemVo=diseaseCostMap.get(costItem.getItemCode());
             }else{
-                itemVo = new ReportFormCustomVo();
+                itemVo = new StandardReportFormCustomVo();
                 itemVo.setReportName(costItem.getItemName());
                 itemVo.setReportCode(costItem.getItemCode());
                 itemVo.setData(new ArrayList<>());
@@ -1119,10 +1125,10 @@ public class StandardReportServiceImpl implements StandardReportService {
             itemVo.setTotalValue(itemVo.getTotalValue().add(costItem.getHospitalFullCost()));
         }
 
-        List<ReportFormCustomVo> diseaseCostDetailList =new ArrayList<>(diseaseCostMap.values());
+        List<StandardReportFormCustomVo> diseaseCostDetailList =new ArrayList<>(diseaseCostMap.values());
 
         // 遍历每个成本项目(列转行)
-        for (ReportFormCustomVo costItem : diseaseCostDetailList) {
+        for (StandardReportFormCustomVo costItem : diseaseCostDetailList) {
             if(CollectionUtils.isEmpty(costItem.getData())){
                 continue;
             }
@@ -1139,7 +1145,7 @@ public class StandardReportServiceImpl implements StandardReportService {
                 costItem.getData().add(percentReportVo);
             }
         }
-        ComputeProfitCollectResponse response = new ComputeProfitCollectResponse();
+        StandardDeptCostCollectResponse response = new StandardDeptCostCollectResponse();
         response.setTitle(titleList);
         response.setData(diseaseCostDetailList);
 
@@ -1247,33 +1253,39 @@ public class StandardReportServiceImpl implements StandardReportService {
      * @return
      */
     @Override
-    public ComputeProfitCollectResponse getDeptDrgCostCompositionDetail(String computeDate) {
+    public StandardDeptCostCollectResponse getDeptDrgCostCompositionDetail(String computeDate) {
         List<DiseaseCostDetailVO> projectCostAccountList = computePatientCostAccountRepository.getDeptDrgCostCompositionDetail(computeDate);
         if(CollectionUtils.isEmpty(projectCostAccountList)){
             throw new CostException("请先计算患者成本");
         }
-        // 获取所有的标准字典数据
-        StandCostDictMapVO standCostDictMaps = getStandCostDictMaps();
+
+        Map<String, List<DiseaseCostDetailVO>> deptPtAccountGroup = projectCostAccountList.stream().collect(Collectors.groupingBy(DiseaseCostDetailVO::getDepartmentCode));
+
         List<CommonResponsibilityReportVo> titleList = new ArrayList<>();
         // 提取科室名称作为列标题
-        for (Responsibility dept : standCostDictMaps.getResponsibilityDict()) {
-            CommonResponsibilityReportVo title = new CommonResponsibilityReportVo();
-            title.setResponsibilityName(dept.getResponsibilityName());
-            title.setResponsibilityCode(dept.getResponsibilityCode());
-            title.setSort(dept.getSort());
-            //添加子级标题
-            addCommonResponsibilityChild(title);
-            titleList.add(title);
-        }
+        deptPtAccountGroup.forEach((deptCode, deptPtAccountList) -> {
+            if(!CollectionUtils.isEmpty(deptPtAccountList)){
+                CommonResponsibilityReportVo title = new CommonResponsibilityReportVo();
+                title.setResponsibilityName(deptPtAccountList.get(NumberConstant.ZERO).getDepartmentName());
+                title.setResponsibilityCode(deptCode);
+                title.setSort(NumberConstant.ONE);
+                //添加子级标题
+                addCommonResponsibilityChild(title);
+                titleList.add(title);
+            }
+        });
+        //按科室名称排序
+        titleList.sort(Comparator.comparing(CommonResponsibilityReportVo::getResponsibilityName));
+
         // 记录项目类别对象
-        Map<String, ReportFormCustomVo> diseaseCostMap = new HashMap<>();
+        Map<String, StandardReportFormCustomVo> diseaseCostMap = new HashMap<>();
         // 遍历每个项目生成科室金额
         for (DiseaseCostDetailVO costItem : projectCostAccountList) {
-            ReportFormCustomVo itemVo ;
+            StandardReportFormCustomVo itemVo ;
             if(diseaseCostMap.containsKey(costItem.getItemCode())){
                 itemVo=diseaseCostMap.get(costItem.getItemCode());
             }else{
-                itemVo = new ReportFormCustomVo();
+                itemVo = new StandardReportFormCustomVo();
                 itemVo.setReportName(costItem.getItemName());
                 itemVo.setReportCode(costItem.getItemCode());
                 itemVo.setData(new ArrayList<>());
@@ -1291,10 +1303,10 @@ public class StandardReportServiceImpl implements StandardReportService {
             itemVo.setTotalValue(itemVo.getTotalValue().add(costItem.getHospitalFullCost()));
         }
 
-        List<ReportFormCustomVo> diseaseCostDetailList =new ArrayList<>(diseaseCostMap.values());
+        List<StandardReportFormCustomVo> diseaseCostDetailList =new ArrayList<>(diseaseCostMap.values());
 
         // 遍历每个成本项目(列转行)
-        for (ReportFormCustomVo costItem : diseaseCostDetailList) {
+        for (StandardReportFormCustomVo costItem : diseaseCostDetailList) {
             if(CollectionUtils.isEmpty(costItem.getData())){
                 continue;
             }
@@ -1311,7 +1323,7 @@ public class StandardReportServiceImpl implements StandardReportService {
                 costItem.getData().add(percentReportVo);
             }
         }
-        ComputeProfitCollectResponse response = new ComputeProfitCollectResponse();
+        StandardDeptCostCollectResponse response = new StandardDeptCostCollectResponse();
         response.setTitle(titleList);
         response.setData(diseaseCostDetailList);
 

+ 27 - 0
src/main/java/com/kcim/vo/StandardReportFormCustomVo.java

@@ -0,0 +1,27 @@
+package com.kcim.vo;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * @program: CostAccount
+ * @description:
+ * @author: Wang.YS
+ * @create: 2024-09-19 16:29
+ **/
+@Data
+public class StandardReportFormCustomVo{
+
+    private String reportCode ;
+
+    private String reportName ;
+
+    private BigDecimal totalValue ;
+
+    private List<ReportVo> data;
+
+    private List<StandardReportFormCustomVo> children;
+
+}

+ 21 - 0
src/main/java/com/kcim/web/reponse/StandardDeptCostCollectResponse.java

@@ -0,0 +1,21 @@
+package com.kcim.web.reponse;
+
+import com.kcim.vo.CommonResponsibilityReportVo;
+import com.kcim.vo.StandardReportFormCustomVo;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @program: CostAccount
+ * @description:
+ * @author: Wang.YS
+ * @create: 2024-09-19 16:40
+ **/
+@Data
+public class StandardDeptCostCollectResponse {
+
+    private List<CommonResponsibilityReportVo> title;
+
+    private List<StandardReportFormCustomVo> data;
+}

+ 24 - 0
src/main/resources/mapper/ItemMapper.xml

@@ -23,6 +23,30 @@
         <result property="deleteTime" column="delete_time"/>
         <result property="delFlag" column="del_flag"/>
     </resultMap>
+    <select id="getRespItemList" resultType="com.kcim.dao.model.Item" parameterType="com.kcim.dao.model.Item">
+        SELECT
+            a.`code`,
+            a.`name`,
+            a.`type`,
+            a.`item_type`,
+            a.`price`,
+            a.`national_code`,
+            a.`kc_code`,
+            a.`stand_item_code`,
+            a.`stand_item_name`,
+            a.`department_code`,
+            a.`department_name`,
+            b.responsibility_code
+        FROM
+            com_item a
+                INNER JOIN cost_responsibility_department b ON a.department_code = b.department_code
+        WHERE
+            a.del_flag = 0
+          AND a.hosp_id = #{hospId}
+        GROUP BY
+            a.`code`,
+            a.department_code
+    </select>
 
 
 </mapper>