CostAccountShareServiceImpl.java 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401
  1. package com.imed.costaccount.service.impl;
  2. import cn.hutool.core.util.StrUtil;
  3. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  4. import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
  5. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  6. import com.imed.costaccount.common.exception.CostException;
  7. import com.imed.costaccount.common.util.BeanUtil;
  8. import com.imed.costaccount.common.util.JsonUtil;
  9. import com.imed.costaccount.common.util.PageUtils;
  10. import com.imed.costaccount.constants.NumberConstant;
  11. import com.imed.costaccount.mapper.CostAccountShareMapper;
  12. import com.imed.costaccount.model.*;
  13. import com.imed.costaccount.model.dto.AccountShareCopyDto;
  14. import com.imed.costaccount.model.dto.CostAccountShareEditDto;
  15. import com.imed.costaccount.model.dto.CostAccountShareSaveDto;
  16. import com.imed.costaccount.model.dto.ShareParamEditDto;
  17. import com.imed.costaccount.model.vo.CostAccountShareVO;
  18. import com.imed.costaccount.model.vo.CostShareParamStatusVO;
  19. import com.imed.costaccount.model.vo.CostShareParamVO;
  20. import com.imed.costaccount.model.vo.ShareParamProportionVO;
  21. import com.imed.costaccount.service.*;
  22. import org.apache.shiro.SecurityUtils;
  23. import org.springframework.stereotype.Service;
  24. import org.springframework.transaction.annotation.Propagation;
  25. import org.springframework.transaction.annotation.Transactional;
  26. import org.springframework.util.CollectionUtils;
  27. import org.springframework.util.StringUtils;
  28. import java.util.*;
  29. import java.util.concurrent.atomic.AtomicReference;
  30. import java.util.stream.Collectors;
  31. @Service("costAccountShareService")
  32. public class CostAccountShareServiceImpl extends ServiceImpl<CostAccountShareMapper, CostAccountShare> implements CostAccountShareService {
  33. private final ResponsibilityService responsibilityService;
  34. private final AccountingService accountingService;
  35. private final CostShareLevelService costShareLevelService;
  36. private final CostShareParamService costShareParamService;
  37. public CostAccountShareServiceImpl(ResponsibilityService responsibilityService, AccountingService accountingService, CostShareLevelService costShareLevelService, CostShareParamService costShareParamService) {
  38. this.responsibilityService = responsibilityService;
  39. this.accountingService = accountingService;
  40. this.costShareLevelService = costShareLevelService;
  41. this.costShareParamService = costShareParamService;
  42. }
  43. /**
  44. * 分页查询责任中心成本对照相关数据
  45. *
  46. * @param current
  47. * @param pageSize
  48. * @param name
  49. * @return
  50. */
  51. @Override
  52. public PageUtils queryList(Integer current, Integer pageSize, String name, Long hospId) {
  53. Page<CostAccountShare> costAccountSharePage = new Page<>(current, pageSize);
  54. Page<CostAccountShare> pages = this.page(costAccountSharePage, new QueryWrapper<CostAccountShare>().lambda()
  55. .eq(!StringUtils.isEmpty(hospId), CostAccountShare::getHospId, hospId)
  56. .like(!StringUtils.isEmpty(name), CostAccountShare::getResponsibilityName, name)
  57. .orderByAsc(CostAccountShare::getShareLevel));
  58. List<CostAccountShare> costAccountShareList = pages.getRecords();
  59. List<CostAccountShareVO> costAccountShareVOList = BeanUtil.convertList(costAccountShareList, CostAccountShareVO.class);
  60. costAccountShareVOList.forEach(i->{
  61. String accountingIds = i.getAccountingIds();
  62. if (StrUtil.isNotBlank(accountingIds)){
  63. List<String> list = Arrays.asList(accountingIds.split(StrUtil.COMMA));
  64. i.setAccountingIdList(list);
  65. }
  66. });
  67. // getMessage(hospId, costAccountShareVOList);
  68. PageUtils pageUtils = new PageUtils(pages);
  69. pageUtils.setList(costAccountShareVOList);
  70. return pageUtils;
  71. }
  72. // private void getMessage(Long hospId, List<CostAccountShareVO> costAccountShareList) {
  73. // // 设置责任中心的数据 与 会计科目的数据从对应的id里面获取
  74. // List<Responsibility> list = responsibilityService.list(new QueryWrapper<Responsibility>().lambda().eq(Responsibility::getHospId, hospId));
  75. // List<Accounting> accountingList = accountingService.list(new QueryWrapper<Accounting>().lambda().eq(Accounting::getHospId, hospId));
  76. // Map<Long, List<Responsibility>> resMap = list.stream().collect(Collectors.groupingBy(Responsibility::getId));
  77. // Map<Long, List<Accounting>> accountMap = accountingList.stream().collect(Collectors.groupingBy(Accounting::getId));
  78. // costAccountShareList.forEach(i->{
  79. // Long id = i.getResponsibilityId();
  80. // List<Responsibility> responsibilities = resMap.get(id);
  81. // if (!CollectionUtils.isEmpty(responsibilities)){
  82. // i.setResponsibilityId(id);
  83. // i.setResponsibilityName(responsibilities.get(0).getResponsibilityName());
  84. // i.setResponsibilityCode(responsibilities.get(0).getResponsibilityCode());
  85. //
  86. // }
  87. // Long accountingId = i.getAccountingId();
  88. // if (accountingId>0){
  89. // List<Accounting> accountingList1 = accountMap.get(accountingId);
  90. // if (!CollectionUtils.isEmpty(accountingList1)){
  91. // i.setAccountingId(accountingId);
  92. // i.setAccountingName(accountingList1.get(0).getAccountingName());
  93. // i.setAccountingCode(accountingList1.get(0).getAccountingCode());
  94. // i.setAllParentIds(accountingList1.get(0).getAllParentIds());
  95. // }
  96. // }
  97. // });
  98. // }
  99. /**
  100. * 保存成本参数对应成本对照表
  101. *
  102. * @param costAccountShareSaveDto
  103. */
  104. @Override
  105. @Transactional(propagation = Propagation.REQUIRED,rollbackFor = Exception.class)
  106. public void addCostAccountShare(CostAccountShareSaveDto costAccountShareSaveDto) {
  107. User user = (User) SecurityUtils.getSubject().getPrincipal();
  108. Long hospId = user.getHospId();
  109. // 检验输入的数据的合理性
  110. checkAccountShare(costAccountShareSaveDto, hospId);
  111. CostAccountShare costAccountShareRequest = BeanUtil.convertObj(costAccountShareSaveDto, CostAccountShare.class);
  112. costAccountShareRequest.setHospId(hospId);
  113. costAccountShareRequest.setCreateTime(System.currentTimeMillis());
  114. baseMapper.insert(costAccountShareRequest);
  115. }
  116. /**
  117. * 检验输入数据的合理性
  118. * @param costAccountShareSaveDto
  119. * @param hospId
  120. */
  121. private void checkAccountShare(CostAccountShareSaveDto costAccountShareSaveDto, Long hospId) {
  122. Long responsibilityId = costAccountShareSaveDto.getResponsibilityId();
  123. Responsibility responsibility = responsibilityService.getOne(new QueryWrapper<Responsibility>().lambda().eq(Responsibility::getHospId,hospId).eq(Responsibility::getId, responsibilityId));
  124. if (Objects.isNull(responsibility)){
  125. throw new CostException(500,"输入的责任不存在");
  126. }
  127. costAccountShareSaveDto.setResponsibilityId(responsibilityId);
  128. costAccountShareSaveDto.setResponsibilityCode(responsibility.getResponsibilityCode());
  129. costAccountShareSaveDto.setResponsibilityName(responsibility.getResponsibilityName());
  130. costAccountShareSaveDto.setShareLevel(responsibility.getShareLevel());
  131. List<CostAccountShare> costAccountShareList = baseMapper.selectList(new QueryWrapper<CostAccountShare>().lambda().eq(CostAccountShare::getHospId,hospId).eq(CostAccountShare::getResponsibilityId,costAccountShareSaveDto.getResponsibilityId()));
  132. if (!StringUtils.isEmpty(costAccountShareSaveDto.getAccountingIds())){
  133. // 这个责任中心允许输入会计科目
  134. List<Long> accountIdList = Arrays.stream(costAccountShareSaveDto.getAccountingIds().split(StrUtil.COMMA)).map(Long::valueOf).collect(Collectors.toList());
  135. List<Accounting> accountingList = accountingService.list(new QueryWrapper<Accounting>().lambda().eq(Accounting::getHospId, hospId).in(Accounting::getId, accountIdList).orderByDesc(Accounting::getCreateTime));
  136. if (CollectionUtils.isEmpty(accountingList)){
  137. throw new CostException(500,"输入的会计科目不存在");
  138. }else {
  139. String accountIds = accountingList.stream().map(Accounting::getId).collect(Collectors.toList()).stream().map(String::valueOf).collect(Collectors.joining(StrUtil.COMMA));
  140. costAccountShareSaveDto.setAccountingIds(accountIds);
  141. String accountNames = accountingList.stream().map(Accounting::getAccountingName).map(String::valueOf).collect(Collectors.joining(StrUtil.COMMA));
  142. costAccountShareSaveDto.setAccountingNames(accountNames);
  143. String accountCodes = accountingList.stream().map(Accounting::getAccountingCode).map(String::valueOf).collect(Collectors.joining(StrUtil.COMMA));
  144. costAccountShareSaveDto.setAccountingCodes(accountCodes);
  145. }
  146. // Map<String, List<CostAccountShare>> costAccountMap = costAccountShareList.stream().collect(Collectors.groupingBy(CostAccountShare::getResponsibilityCode));
  147. // List<CostAccountShare> list = costAccountMap.get(costAccountShareSaveDto.getResponsibilityCode());
  148. if (!CollectionUtils.isEmpty(costAccountShareList)){
  149. costAccountShareList.forEach(i->{
  150. String accountingIds = i.getAccountingIds();
  151. Integer isShareCost = i.getIsShareCost();
  152. List<Long> accountIdListRequest = Arrays.stream(accountingIds.split(StrUtil.COMMA)).map(Long::valueOf).collect(Collectors.toList());
  153. if (!Collections.disjoint(accountIdListRequest,accountIdList)){
  154. throw new CostException(500,"存在重复的数据");
  155. }if (NumberConstant.ONE.equals(isShareCost) && NumberConstant.ONE.equals(costAccountShareSaveDto.getIsShareCost())){
  156. throw new CostException(500,"责任中心已包含分摊成本");
  157. }
  158. });
  159. }
  160. }else {
  161. // 此时是
  162. // 责任中心只允许出现一次
  163. if (!CollectionUtils.isEmpty(costAccountShareList)){
  164. throw new CostException(500,"该责任中心合并计算已存在");
  165. }
  166. if (NumberConstant.ONE.equals(costAccountShareSaveDto.getIsShareCost())){
  167. throw new CostException(500,"合并计算责任中心必须要设置包含分摊参数");
  168. }
  169. }
  170. // 检验输入的这个责任中心是否允许输入会计科目
  171. Long shareId = responsibility.getShareId();
  172. CostShareLevel costShareLevel = costShareLevelService.getOne(new QueryWrapper<CostShareLevel>().lambda()
  173. .eq(CostShareLevel::getHospId, hospId).eq(CostShareLevel::getId, shareId));
  174. if (Objects.nonNull(costShareLevel)){
  175. if ((!StringUtils.isEmpty(costAccountShareSaveDto.getAccountingIds())) && NumberConstant.ZERO.equals(costShareLevel.getCalcType())){
  176. throw new CostException(500,"合并计算不允许选择会计科目");
  177. }
  178. if ((StringUtils.isEmpty(costAccountShareSaveDto.getAccountingIds())) && NumberConstant.ONE.equals(costShareLevel.getCalcType())){
  179. throw new CostException(500,"分开计算的责任中心需要选择会计科目");
  180. }
  181. }else {
  182. throw new CostException(500,"对不起该责任中心没有对应分摊层级");
  183. }
  184. }
  185. /**
  186. * 修改成本中心责任对照表
  187. *
  188. * @param costAccountShareEditDto
  189. */
  190. @Override
  191. @Transactional(propagation = Propagation.REQUIRED,rollbackFor = Exception.class)
  192. public void updateByCostAccountShare(CostAccountShareEditDto costAccountShareEditDto) {
  193. User user = (User) SecurityUtils.getSubject().getPrincipal();
  194. Long hospId = user.getHospId();
  195. Long id = costAccountShareEditDto.getId();
  196. CostAccountShare costAccountShare = baseMapper.selectById(id);
  197. if (Objects.isNull(costAccountShare)){
  198. throw new CostException(500,"成本分摊参数对应数据不存在");
  199. }
  200. baseMapper.deleteById(id);
  201. // 新增责任中心成本对照数据
  202. CostAccountShareSaveDto costAccountShareSaveDto = BeanUtil.convertObj(costAccountShareEditDto, CostAccountShareSaveDto.class);
  203. // 检验输入的数据是否符合规则
  204. checkAccountShare(costAccountShareSaveDto,hospId);
  205. CostAccountShareEditDto accountShareEditDto = BeanUtil.convertObj(costAccountShareSaveDto, CostAccountShareEditDto.class);
  206. CostAccountShare costAccountShareRequest = BeanUtil.convertObj(accountShareEditDto, CostAccountShare.class);
  207. costAccountShareRequest.setId(null);
  208. costAccountShareRequest.setHospId(hospId);
  209. costAccountShareRequest.setParamList(costAccountShare.getParamList());
  210. costAccountShareRequest.setCreateTime(System.currentTimeMillis());
  211. baseMapper.insert(costAccountShareRequest);
  212. }
  213. /**
  214. * 修改成本分摊参数的设置
  215. *
  216. * @param shareParamEditDto
  217. */
  218. @Override
  219. @Transactional(propagation = Propagation.REQUIRED,rollbackFor = Exception.class)
  220. public void updateShareParam(ShareParamEditDto shareParamEditDto) {
  221. List<ShareParamProportionVO> shareParamProportionVOList1 = shareParamEditDto.getShareParamProportionVOList();
  222. User user = (User) SecurityUtils.getSubject().getPrincipal();
  223. Long hospId = user.getHospId();
  224. Long id = shareParamEditDto.getId();
  225. CostAccountShare costAccountShare = baseMapper.selectOne(new QueryWrapper<CostAccountShare>().lambda()
  226. .eq(CostAccountShare::getHospId, hospId)
  227. .eq(CostAccountShare::getId, id));
  228. if (Objects.isNull(costAccountShare)){
  229. throw new CostException(500,"分摊参数对应数据不存在");
  230. }
  231. if (!CollectionUtils.isEmpty(shareParamProportionVOList1)){
  232. List<ShareParamProportionVO> shareParamProportionVOList = shareParamEditDto.getShareParamProportionVOList();
  233. // 检验输入的成本分摊参数是否存在
  234. List<CostShareParamVO> costShareParamServiceAll = costShareParamService.getAll(hospId);
  235. Map<Long, List<CostShareParamVO>> listMap = costShareParamServiceAll.stream().collect(Collectors.groupingBy(CostShareParamVO::getId));
  236. shareParamProportionVOList.forEach(i->{
  237. if (CollectionUtils.isEmpty(listMap.get(i.getId()))){
  238. throw new CostException(500,"分摊名称:"+i.getShareParamName()+"未找到");
  239. }
  240. });
  241. // 检验输入的数据的和是否是100
  242. AtomicReference<Integer> sum= new AtomicReference<>(0);
  243. shareParamProportionVOList.forEach(i->{
  244. sum.updateAndGet(v -> v + i.getShareParamPopout());
  245. });
  246. int max = Integer.parseInt(sum.toString());
  247. if (!NumberConstant.ONE_HUNDRED.equals(max)){
  248. throw new CostException(500,"分摊比例的和不是100");
  249. }
  250. // 判断添加的分摊是否存在一样的
  251. HashMap<Long, ShareParamProportionVO> hashMap = new HashMap<>();
  252. shareParamProportionVOList.forEach(i->{
  253. Long paramId = i.getId();
  254. if (hashMap.containsKey(paramId)){
  255. throw new CostException(500,"不可以添加相同的分摊参数");
  256. }
  257. hashMap.put(paramId,i);
  258. });
  259. //
  260. String paramList = JsonUtil.toJSONString(shareParamProportionVOList);
  261. costAccountShare.setParamList(paramList);
  262. }else{
  263. costAccountShare.setParamList(null);
  264. }
  265. baseMapper.updateById(costAccountShare);
  266. }
  267. /**
  268. * 获取责任中心成本表的分摊参数的集合
  269. *
  270. * @param id
  271. * @param hospId
  272. * @return
  273. */
  274. @Override
  275. public List<ShareParamProportionVO> selectShareParamById(Integer id, Long hospId) {
  276. CostAccountShare costAccountShare = baseMapper.selectOne(new QueryWrapper<CostAccountShare>().lambda()
  277. .eq(CostAccountShare::getHospId, hospId).eq(CostAccountShare::getId, id));
  278. if (Objects.isNull(costAccountShare)){
  279. throw new CostException(500,"责任中心成本不存在");
  280. }
  281. String paramList = costAccountShare.getParamList();
  282. return JsonUtil.toList(paramList, ShareParamProportionVO.class);
  283. }
  284. /**
  285. * 成本分摊参数中被分摊参数对应选中的状态
  286. *
  287. * @param id
  288. * @param hospId
  289. * @return
  290. */
  291. @Override
  292. public List<CostShareParamStatusVO> getAllShareParamStatusById(Integer id, Long hospId) {
  293. List<CostShareParamVO> costShareParamServiceAll = costShareParamService.getAll(hospId);
  294. CostAccountShare costAccountShare = baseMapper.selectById(id);
  295. if (Objects.isNull(costAccountShare)){
  296. throw new CostException(500,"成本分摊对应数据不存在");
  297. }
  298. String paramList = costAccountShare.getParamList();
  299. List<CostShareParamStatusVO> costShareParamStatusVOList = BeanUtil.convertList(costShareParamServiceAll, CostShareParamStatusVO.class);
  300. if (!StringUtils.isEmpty(paramList)) {
  301. List<ShareParamProportionVO> shareParamProportionVOList = JsonUtil.toList(paramList, ShareParamProportionVO.class);
  302. Map<Long, List<ShareParamProportionVO>> map = shareParamProportionVOList.stream().collect(Collectors.groupingBy(ShareParamProportionVO::getId));
  303. costShareParamStatusVOList.forEach(i -> {
  304. Long paramId = i.getId();
  305. if (!CollectionUtils.isEmpty(map.get(paramId))) {
  306. i.setShareParamStatus(NumberConstant.ONE);
  307. }
  308. });
  309. }
  310. return costShareParamStatusVOList;
  311. }
  312. /**
  313. * 拷贝
  314. *
  315. * @param accountShareCopyDto 赋值数据
  316. * @param hospId 医院Id
  317. */
  318. @Override
  319. @Transactional(propagation = Propagation.REQUIRED,rollbackFor = Exception.class)
  320. public void copyAccountShareData(AccountShareCopyDto accountShareCopyDto, Long hospId) {
  321. Long id = accountShareCopyDto.getId();
  322. CostAccountShare costAccountShare = this.getById(id);
  323. if (Objects.isNull(costAccountShare)){
  324. throw new CostException(500,"成本分摊参数设置对应数据不存在");
  325. }
  326. List<CostAccountShare> accountShareList = new ArrayList<>();
  327. List<Long> responsibilityIds = accountShareCopyDto.getResponsibilityIds();
  328. Map<Long, Responsibility> responsibilityMap = responsibilityService.list(new QueryWrapper<Responsibility>().lambda()
  329. .eq(Responsibility::getHospId, hospId)).stream().collect(Collectors.toMap(Responsibility::getId, synOne->synOne));
  330. long millis = System.currentTimeMillis();
  331. responsibilityIds.forEach(i->{
  332. CostAccountShare accountShareRequest = BeanUtil.convertObj(costAccountShare, CostAccountShare.class);
  333. accountShareRequest.setId(null);
  334. accountShareRequest.setCreateTime(millis);
  335. Responsibility responsibility = responsibilityMap.get(i);
  336. accountShareRequest.setResponsibilityId(i);
  337. accountShareRequest.setResponsibilityCode(responsibility.getResponsibilityCode());
  338. accountShareRequest.setResponsibilityName(responsibility.getResponsibilityName());
  339. accountShareRequest.setShareLevel(responsibility.getShareLevel());
  340. accountShareList.add(accountShareRequest);
  341. });
  342. this.saveBatch(accountShareList);
  343. }
  344. /**
  345. * 获取指定类型的责任中心集合 分开计算还是合并计算
  346. *
  347. *
  348. * @param accountShareId
  349. * @param hospId
  350. * @return
  351. */
  352. @Override
  353. public List<Responsibility> getResponsibilityCalType(Long accountShareId, Long hospId) {
  354. CostAccountShare costAccountShare = this.getById(accountShareId);
  355. if (Objects.isNull(costAccountShare)){
  356. throw new CostException(500,"成本分摊参数设置对应数据不存在");
  357. }
  358. Long responsibilityId = costAccountShare.getResponsibilityId();
  359. Responsibility responsibility = responsibilityService.getById(responsibilityId);
  360. Long shareId = responsibility.getShareId();
  361. CostShareLevel costShareLevel = costShareLevelService.getById(shareId);
  362. Integer calcType = costShareLevel.getCalcType();
  363. // 分摊参数设置对饮的责任中心的id集合
  364. List<Long> responsibilityIds = this.list(new QueryWrapper<CostAccountShare>().lambda().eq(CostAccountShare::getHospId, hospId)).stream().map(CostAccountShare::getResponsibilityId).collect(Collectors.toList());
  365. // 执行类型的分摊级别的Id的集合
  366. List<Long> costShareIds = costShareLevelService.list(new QueryWrapper<CostShareLevel>().lambda()
  367. .eq(CostShareLevel::getHospId,hospId).eq(CostShareLevel::getCalcType, calcType))
  368. .stream().map(CostShareLevel::getId).collect(Collectors.toList());
  369. // 筛选责任中心里面符合指定类型的责任中心
  370. // 筛选指定类型的责任中心 并且当前没有设置的责任中心
  371. List<Responsibility> responsibilityList = responsibilityService.list(new QueryWrapper<Responsibility>().lambda()
  372. .eq(Responsibility::getHospId, hospId)).stream()
  373. .filter(i -> costShareIds.contains(i.getShareId()) && !responsibilityIds.contains(i.getId())).collect(Collectors.toList());
  374. return responsibilityList;
  375. }
  376. }