RepalBillServiceImpl.java 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489
  1. package com.winhc.repal.service.impl;
  2. import cn.hutool.core.collection.CollUtil;
  3. import cn.hutool.core.util.ObjectUtil;
  4. import cn.hutool.core.util.StrUtil;
  5. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  6. import com.baomidou.mybatisplus.core.toolkit.Wrappers;
  7. import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
  8. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  9. import com.winhc.common.base.ApiDataResult;
  10. import com.winhc.common.enums.CodeMsg;
  11. import com.winhc.common.exception.CommonException;
  12. import com.winhc.common.model.base.VOPage;
  13. import com.winhc.repal.cloud.DataMiddlewareService;
  14. import com.winhc.repal.cloud.InCaseService;
  15. import com.winhc.repal.cloud.dto.GetCompanyRiskNumDTO;
  16. import com.winhc.repal.cloud.dto.GetCreditPunishmentLabelDTO;
  17. import com.winhc.repal.cloud.dto.GetFinanceDynamicNumDTO;
  18. import com.winhc.repal.cloud.vo.CompanyRiskNumVO;
  19. import com.winhc.repal.cloud.vo.CreditPunishmentLabelListVO;
  20. import com.winhc.repal.cloud.vo.DiagnosisRecordVO;
  21. import com.winhc.repal.cloud.vo.FinanceDynamicNumVO;
  22. import com.winhc.repal.entity.*;
  23. import com.winhc.repal.enums.*;
  24. import com.winhc.repal.model.bo.BillPageBO;
  25. import com.winhc.repal.model.bo.TotalMoneyBO;
  26. import com.winhc.repal.model.bo.UserBillUnreadInfoBO;
  27. import com.winhc.repal.model.dto.*;
  28. import com.winhc.repal.model.vo.RepalBillDetailVO;
  29. import com.winhc.repal.model.vo.RepalBillInfoVO;
  30. import com.winhc.repal.model.vo.RepalBillPageVO;
  31. import com.winhc.repal.repository.RepalBillMapper;
  32. import com.winhc.repal.service.*;
  33. import com.winhc.repal.util.DiagnosisUtil;
  34. import com.winhc.repal.util.RepalBillStatusUtil;
  35. import com.winhc.repal.util.UserContextUtil;
  36. import org.slf4j.Logger;
  37. import org.slf4j.LoggerFactory;
  38. import org.springframework.beans.BeanUtils;
  39. import org.springframework.beans.factory.annotation.Autowired;
  40. import org.springframework.stereotype.Service;
  41. import org.springframework.transaction.annotation.Transactional;
  42. import java.math.BigDecimal;
  43. import java.time.DayOfWeek;
  44. import java.time.LocalDate;
  45. import java.time.LocalDateTime;
  46. import java.time.temporal.TemporalAdjusters;
  47. import java.util.*;
  48. import java.util.function.Function;
  49. import java.util.stream.Collectors;
  50. /**
  51. * @description RepalBill 接口实现类
  52. * @author Generator
  53. * @date 2022-04-08
  54. */
  55. @Service
  56. public class RepalBillServiceImpl extends ServiceImpl<RepalBillMapper, RepalBill> implements RepalBillService {
  57. public static final Logger LOGGER = LoggerFactory.getLogger(RepalBillServiceImpl.class);
  58. @Autowired
  59. private RepalBillMapper repalBillMapper;
  60. @Autowired
  61. private RepalResponsiblePersonService repalResponsiblePersonService;
  62. @Autowired
  63. private RepalGroupMemberService repalGroupMemberService;
  64. @Autowired
  65. private RepalCustomerService repalCustomerService;
  66. @Autowired
  67. private DataMiddlewareService dataMiddlewareService;
  68. @Autowired
  69. private InCaseService inCaseService;
  70. @Autowired
  71. private RepalBillDiagnosisService repalBillDiagnosisService;
  72. @Autowired
  73. private RepalChangeRecordService repalChangeRecordService;
  74. @Autowired
  75. private RepalBookService repalBookService;
  76. @Autowired
  77. private RepalRolePermissionService repalRolePermissionService;
  78. @Autowired
  79. private RepalRemindHistoryService repalRemindHistoryService;
  80. @Autowired
  81. private RepalRemindReadInfoService repalRemindReadInfoService;
  82. @Autowired
  83. private RepalBillOperLogService repalBillOperLogService;
  84. @Autowired
  85. private UserExtService userExtService;
  86. @Override
  87. public RepalBillInfoVO getRepalBillPage(GetRepalBillPageDTO dto) {
  88. if (ObjectUtil.hasEmpty(dto.getRepalGroupId(), dto.getRepalBookId())) {
  89. throw new CommonException(CodeMsg.VALIDATE_PARAMETER);
  90. }
  91. VOPage<RepalBillPageVO> voPage = new VOPage<>();
  92. voPage.setPageSize(dto.getPageSize());
  93. voPage.setPageNum(dto.getPageNum());
  94. RepalBillInfoVO infoVO = new RepalBillInfoVO();
  95. boolean allFlag = repalRolePermissionService.checkUserPermission(UserContextUtil.getUser().getUserId(),
  96. RepalBillTypeEnum.RECEIVABLE.getCode().equals(dto.getRepalBillType()) ? PermissionEnum.QUERY_ALL_RECEIVABLE.getCode() : PermissionEnum.QUERY_ALL_RECEIPT.getCode());
  97. LOGGER.info("allFlag:[{}]", allFlag);
  98. TotalMoneyBO totalMoneyBO;
  99. TotalMoneyBO overdueBO;
  100. TotalMoneyBO totalBO;
  101. if (allFlag) {
  102. totalMoneyBO = repalBillMapper.getTotalMoneyByGroup(dto.getRepalGroupId(), dto.getRepalBillType(), RepalBillStatusEnum.PROGRESSING.getCode(), dto.getRepalBookId());
  103. overdueBO = repalBillMapper.getTotalMoneyByGroup(dto.getRepalGroupId(), dto.getRepalBillType(), RepalBillStatusEnum.OVERDUE.getCode(), dto.getRepalBookId());
  104. totalBO = repalBillMapper.getTotalMoneyByGroup(dto.getRepalGroupId(), dto.getRepalBillType(), null, dto.getRepalBookId());
  105. } else {
  106. // 只查询自己负责的
  107. totalMoneyBO = repalBillMapper.getTotalMoneyByUser(UserContextUtil.getUser().getUserId(), dto.getRepalGroupId(), dto.getRepalBillType(), RepalBillStatusEnum.PROGRESSING.getCode(), dto.getRepalBookId());
  108. overdueBO = repalBillMapper.getTotalMoneyByUser(UserContextUtil.getUser().getUserId(), dto.getRepalGroupId(), dto.getRepalBillType(), RepalBillStatusEnum.OVERDUE.getCode(), dto.getRepalBookId());
  109. totalBO = repalBillMapper.getTotalMoneyByUser(UserContextUtil.getUser().getUserId(), dto.getRepalGroupId(), dto.getRepalBillType(), null, dto.getRepalBookId());
  110. }
  111. infoVO.setTotalBillMoneyStr(totalMoneyBO.getTotalMoney().stripTrailingZeros().toPlainString());
  112. infoVO.setTotalBillCount(totalMoneyBO.getTotalCount());
  113. infoVO.setTotalOverdueCount(overdueBO.getTotalCount());
  114. infoVO.setTotalOverdueStr(overdueBO.getTotalMoney().stripTrailingZeros().toPlainString());
  115. infoVO.setTotalCount(totalBO.getTotalCount());
  116. infoVO.setTotalStr(totalBO.getTotalMoney().stripTrailingZeros().toPlainString());
  117. // 分页数据
  118. Page<RepalBill> repalBillPage = new Page<>(dto.getPageNum(),dto.getPageSize());
  119. BillPageBO billPageBO = new BillPageBO();
  120. BeanUtils.copyProperties(dto, billPageBO);
  121. billPageBO.setUserId(UserContextUtil.getUser().getUserId());
  122. billPageBO.setAllFlag(allFlag);
  123. // 对应1-4到期时间
  124. if (Objects.nonNull(dto.getOverdueType())) {
  125. switch (dto.getOverdueType()) {
  126. case 1:
  127. billPageBO.setStartDate(LocalDate.now());
  128. billPageBO.setEndDate(billPageBO.getStartDate());
  129. break;
  130. case 2:
  131. billPageBO.setStartDate(LocalDate.now().with(DayOfWeek.MONDAY));
  132. billPageBO.setEndDate(LocalDate.now().with(DayOfWeek.SUNDAY));
  133. break;
  134. case 3:
  135. billPageBO.setStartDate(LocalDate.now().with(TemporalAdjusters.firstDayOfMonth()));
  136. billPageBO.setEndDate(LocalDate.now().with(TemporalAdjusters.lastDayOfMonth()));
  137. case 4:
  138. billPageBO.setStartDate(LocalDate.now().with(TemporalAdjusters.firstDayOfYear()));
  139. billPageBO.setEndDate(LocalDate.now().with(TemporalAdjusters.lastDayOfYear()));
  140. break;
  141. default:
  142. break;
  143. }
  144. }
  145. repalBillPage = repalBillMapper.getRepalBillPage(repalBillPage, dto);
  146. voPage.setTotalPage(Math.toIntExact(repalBillPage.getPages()));
  147. voPage.setTotalNum(repalBillPage.getTotal());
  148. voPage.setDataList(new ArrayList<>());
  149. infoVO.setPage(voPage);
  150. if (CollUtil.isEmpty(repalBillPage.getRecords())) {
  151. return infoVO;
  152. }
  153. // 未读消息
  154. List<Long> billIdList = repalBillPage.getRecords().stream().map(RepalBill::getId).collect(Collectors.toList());
  155. List<UserBillUnreadInfoBO> unreadInfoList = repalRemindReadInfoService.getUserBillUnreadInfo(UserContextUtil.getUser().getUserId(), billIdList);
  156. Map<Long, UserBillUnreadInfoBO> unreadInfoMap = new HashMap<>();
  157. if (CollUtil.isNotEmpty(unreadInfoList)) {
  158. unreadInfoMap = unreadInfoList.stream().collect(Collectors.toMap(UserBillUnreadInfoBO::getRepalBillId, Function.identity()));
  159. }
  160. Map<Long, List<String>> nameMap = repalResponsiblePersonService.getResponsiblePersonNameList(billIdList);
  161. Map<Long, UserBillUnreadInfoBO> finalUnreadInfoMap = unreadInfoMap;
  162. voPage.setDataList(repalBillPage.getRecords().stream().map(t -> {
  163. RepalBillPageVO vo = new RepalBillPageVO();
  164. BeanUtils.copyProperties(t, vo);
  165. vo.setRepalBillId(t.getId());
  166. vo.setResponsiblePersonNames(String.join("、", nameMap.get(t.getId())));
  167. UserBillUnreadInfoBO unreadInfoBO = finalUnreadInfoMap.get(vo.getRepalBillId());
  168. if (Objects.nonNull(unreadInfoBO)) {
  169. vo.setDynamicCountList(new ArrayList<Integer>(){{
  170. add(unreadInfoBO.getUnreadRiskCount());
  171. add(unreadInfoBO.getUnreadFinanceCount());
  172. add(unreadInfoBO.getUnreadRankCount());
  173. add(unreadInfoBO.getUnreadOverdueCount());
  174. }});
  175. }
  176. return vo;
  177. }).collect(Collectors.toList()));
  178. return infoVO;
  179. }
  180. @Override
  181. public RepalBillDetailVO getRepalBillDetail(Long repalBillId) {
  182. RepalBill repalBill = this.getById(repalBillId);
  183. if (Objects.isNull(repalBill)) {
  184. return null;
  185. }
  186. RepalBillDetailVO vo = new RepalBillDetailVO();
  187. BeanUtils.copyProperties(repalBill, vo);
  188. vo.setRepalBillId(repalBill.getId());
  189. RepalCustomer repalCustomer = repalCustomerService.getById(repalBill.getCustomerId());
  190. vo.setCompanyId(repalCustomer.getCompanyId());
  191. vo.setCustProperty(repalCustomer.getCustProperty());
  192. List<String> nameList = repalResponsiblePersonService.getResponsiblePersonName(vo.getRepalBillId());
  193. vo.setResponsiblePersonNames(CollUtil.isEmpty(nameList) ? "" : String.join("、", nameList));
  194. vo.setTotalMoneyStr(repalBill.getTotalMoney().stripTrailingZeros().toPlainString());
  195. vo.setReceiptStr(repalBill.getReceipt().stripTrailingZeros().toPlainString());
  196. vo.setReceivableStr(repalBill.getReceivable().stripTrailingZeros().toPlainString());
  197. // 评分趋势
  198. vo.setDiagnosisScoreTrend(DiagnosisUtil.getDiagnosisScoreTrend(repalBill.getPreDiagnosisScore(), repalBill.getDiagnosisScore(), repalBill.getPreDiagnosisGrade(), repalBill.getDiagnosisGrade()));
  199. if (Objects.nonNull(repalBill.getDiagnosisScore())) {
  200. vo.setDiagnosisGradeDesc(DiagnosisUtil.getGradeConclusion(repalBill.getDiagnosisScore()));
  201. vo.setDiagnosisScore(repalBill.getDiagnosisScore().stripTrailingZeros().toPlainString());
  202. }
  203. // companyId
  204. if (StrUtil.isNotBlank(vo.getCompanyId())) {
  205. // 财产数量
  206. ApiDataResult<List<FinanceDynamicNumVO>> financeResult = dataMiddlewareService.getFinanceDynamicNumV8List(new GetFinanceDynamicNumDTO().setCompanyIdList(Collections.singletonList(vo.getCompanyId())));
  207. if (Objects.nonNull(financeResult) && CollUtil.isNotEmpty(financeResult.getData())) {
  208. vo.setAssetsNum(financeResult.getData().get(0).getFinanceDynamicNum());
  209. }
  210. // 风险数量
  211. ApiDataResult<List<CompanyRiskNumVO>> riskResult = dataMiddlewareService.getCompanyRiskNumList(new GetCompanyRiskNumDTO(Collections.singletonList(vo.getCompanyId())));
  212. if (Objects.nonNull(riskResult) && CollUtil.isNotEmpty(riskResult.getData())) {
  213. vo.setRiskNum(riskResult.getData().get(0).getRiskNum());
  214. }
  215. // 失信限高标签
  216. ApiDataResult<List<CreditPunishmentLabelListVO>> labelResult = dataMiddlewareService.getCreditPunishmentLabelList(new GetCreditPunishmentLabelDTO(Collections.singletonList(vo.getCompanyId())));
  217. if (Objects.nonNull(labelResult) && CollUtil.isNotEmpty(labelResult.getData())) {
  218. vo.setLabelList(labelResult.getData().get(0).getLabelList());
  219. }
  220. }
  221. if (Objects.nonNull(repalBill.getDiagnosisId())) {
  222. RepalBillDiagnosis repalBillDiagnosis = repalBillDiagnosisService.getById(repalBill.getDiagnosisId());
  223. if (Objects.nonNull(repalBillDiagnosis)) {
  224. ApiDataResult<DiagnosisRecordVO> apiDataResult = inCaseService.getRecordVO(repalBillDiagnosis.getBizId());
  225. if (Objects.nonNull(apiDataResult)) {
  226. vo.setAnalysisList(DiagnosisUtil.convertItemToList(apiDataResult.getData().getResultItem()));
  227. }
  228. }
  229. }
  230. // 合同
  231. if (StrUtil.isNotBlank(repalBill.getContractUrl())) {
  232. List<String> urlList = Arrays.stream(repalBill.getContractUrl().split(";")).collect(Collectors.toList());
  233. vo.setContractList(urlList.stream().map(s -> {
  234. RepalBillDetailVO.BillContract billContract = new RepalBillDetailVO.BillContract();
  235. billContract.setContractUrl(s);
  236. billContract.setContractName(s.substring(s.lastIndexOf("/") + 1));
  237. return billContract;
  238. }).collect(Collectors.toList()));
  239. }
  240. if (RepalBillStatusEnum.OVERDUE.getCode().equals(repalBill.getRepalBillStatus())) {
  241. if (Objects.nonNull(repalBill.getEndDate())) {
  242. if (LocalDate.now().isAfter(repalBill.getEndDate()) || LocalDate.now().compareTo(repalBill.getEndDate()) == 0) {
  243. // 避免天数出现负数
  244. vo.setOverdueDay(Math.toIntExact(LocalDate.now().toEpochDay() - repalBill.getEndDate().toEpochDay()) + 1);
  245. }
  246. }
  247. }
  248. List<RepalChangeRecord> repalChangeRecordList = repalChangeRecordService.list(Wrappers.lambdaQuery(RepalChangeRecord.class)
  249. .eq(RepalChangeRecord::getRepalBillId, vo.getRepalBillId())
  250. .eq(RepalChangeRecord::getDeleted, DeletedStatusEnum.NORMAL.getCode()));
  251. if (CollUtil.isNotEmpty(repalChangeRecordList)) {
  252. vo.setChangeList(repalChangeRecordList.stream().map(t -> {
  253. RepalBillDetailVO.BillMoneyChange billMoneyChange = new RepalBillDetailVO.BillMoneyChange();
  254. billMoneyChange.setChangeTime(t.getTimeCreated());
  255. billMoneyChange.setChangeDesc(t.getOperUserName() + " 增加回款 " + t.getTransMoney().stripTrailingZeros().toPlainString());
  256. return billMoneyChange;
  257. }).collect(Collectors.toList()));
  258. }
  259. return vo;
  260. }
  261. @Override
  262. @Transactional(rollbackFor = Exception.class)
  263. public Boolean deleteRepalBillById(DeleteRepalBillDTO dto) {
  264. RepalBill repalBill = this.getById(dto.getRepalBillId());
  265. if (repalRolePermissionService.checkUserPermission(UserContextUtil.getUser().getUserId(),
  266. RepalBillTypeEnum.RECEIVABLE.getCode().equals(repalBill.getRepalBillType()) ? PermissionEnum.UPDATE_RECEIVABLE.getCode() : PermissionEnum.UPDATE_RECEIPT.getCode())) {
  267. throw new CommonException(CodeMsg.FAILED, "无对应权限");
  268. }
  269. this.update(Wrappers.lambdaUpdate(RepalBill.class).eq(RepalBill::getId, dto.getRepalBillId())
  270. .set(RepalBill::getDeleted, DeletedStatusEnum.DELETE.getCode()));
  271. // 删除关联人
  272. repalResponsiblePersonService.deletePersonByBillId(dto.getRepalBillId());
  273. return true;
  274. }
  275. @Override
  276. @Transactional(rollbackFor = Exception.class)
  277. public Boolean settleRepalBillById(SettleRepalBillDTO dto) {
  278. RepalBill repalBill = this.getById(dto.getRepalBillId());
  279. if (repalRolePermissionService.checkUserPermission(UserContextUtil.getUser().getUserId(),
  280. RepalBillTypeEnum.RECEIVABLE.getCode().equals(repalBill.getRepalBillType()) ? PermissionEnum.UPDATE_RECEIVABLE.getCode() : PermissionEnum.UPDATE_RECEIPT.getCode())) {
  281. throw new CommonException(CodeMsg.FAILED, "无对应权限");
  282. }
  283. // 结清tag
  284. boolean success = false;
  285. // 金额溢出
  286. if (dto.getMoney().compareTo(repalBill.getReceivable()) >= 0) {
  287. dto.setMoney(repalBill.getReceivable());
  288. success = true;
  289. }
  290. // 重新计算金额
  291. repalBill.setReceivable(success ? BigDecimal.ZERO : repalBill.getReceivable().subtract(dto.getMoney()));
  292. repalBill.setReceipt(success ? repalBill.getTotalMoney() : repalBill.getReceipt().add(dto.getMoney()));
  293. RepalChangeRecord changeRecord = new RepalChangeRecord();
  294. changeRecord.setRepalBookId(repalBill.getRepalBookId());
  295. changeRecord.setRepalBillId(repalBill.getId());
  296. changeRecord.setAfterMoney(BigDecimal.ZERO);
  297. changeRecord.setPreMoney(repalBill.getReceivable());
  298. changeRecord.setTransMoney(repalBill.getReceivable());
  299. changeRecord.setOperUserId(UserContextUtil.getUser().getUserId());
  300. UserExt userExt = userExtService.getById(changeRecord.getOperUserId());
  301. changeRecord.setOperUserName(userExt.getUserName());
  302. repalChangeRecordService.save(changeRecord);
  303. this.update(Wrappers.lambdaUpdate(RepalBill.class)
  304. .eq(RepalBill::getId, repalBill.getId())
  305. .set(success, RepalBill::getRepalBillStatus, RepalBillStatusEnum.SUCCESS.getCode())
  306. .set(RepalBill::getReceivable, repalBill.getReceivable())
  307. .set(RepalBill::getReceipt, repalBill.getReceipt())
  308. .set(success, RepalBill::getSettleTime, LocalDateTime.now()));
  309. return true;
  310. }
  311. @Override
  312. @Transactional(rollbackFor = Exception.class)
  313. public Boolean addRepalBill(AddRepalBillDTO dto) {
  314. RepalCustomer customer = repalCustomerService.getById(dto.getCustomerId());
  315. if (Objects.isNull(customer)) {
  316. throw new CommonException(CodeMsg.FAILED, "客户信息错误");
  317. }
  318. // 评级flag
  319. boolean diagnosisFlag = (CustPropertyEnum.COMPANY.getCode().equals(customer.getCustProperty()) || CustPropertyEnum.GOV.getCode().equals(customer.getCustProperty()))
  320. && RepalBillTypeEnum.RECEIVABLE.getCode().equals(dto.getRepalBillType());
  321. if (diagnosisFlag && StrUtil.isBlank(customer.getCompanyId())) {
  322. throw new CommonException(CodeMsg.FAILED, "公司信息错误");
  323. }
  324. if (repalRolePermissionService.checkUserPermission(UserContextUtil.getUser().getUserId(),
  325. RepalBillTypeEnum.RECEIVABLE.getCode().equals(dto.getRepalBillType()) ? PermissionEnum.ADD_RECEIVABLE.getCode() : PermissionEnum.ADD_RECEIPT.getCode())) {
  326. throw new CommonException(CodeMsg.FAILED, "无对应权限");
  327. }
  328. if (Objects.isNull(dto.getRepalBookId())) {
  329. // 新建账本
  330. RepalBook repalBook = new RepalBook();
  331. repalBook.setRepalGroupId(dto.getRepalGroupId());
  332. repalBook.setCustomerId(customer.getCustId());
  333. repalBook.setCustomerName(customer.getCustName());
  334. repalBook.setRepalBookName(customer.getCustName());
  335. repalBook.setCompanyId(customer.getCompanyId());
  336. repalBook.setUserId(UserContextUtil.getUser().getUserId());
  337. repalBookService.save(repalBook);
  338. dto.setRepalBookId(repalBook.getId());
  339. }
  340. RepalBill repalBill = new RepalBill();
  341. BeanUtils.copyProperties(dto, repalBill);
  342. repalBill.setCustomerName(customer.getCustName());
  343. repalBill.setUserId(UserContextUtil.getUser().getUserId());
  344. repalBill.setRepalBillStatus(RepalBillStatusUtil.getRepalBillStatus(dto.getEndDate()));
  345. if (CollUtil.isNotEmpty(dto.getContractUrlList())) {
  346. repalBill.setContractUrl(String.join(";", dto.getContractUrlList()));
  347. }
  348. this.save(repalBill);
  349. if (diagnosisFlag) {
  350. // 非个人 & 应收,才会评级
  351. repalBillDiagnosisService.addRepalBillDiagnosis(repalBill.getUserId(), repalBill.getId(), dto.getTotalMoney(), Collections.singletonList(customer.getCustName()));
  352. }
  353. // 负责人
  354. repalResponsiblePersonService.saveBatch(dto.getResponsiblePersonIdList().stream().map(t -> {
  355. RepalResponsiblePerson person = new RepalResponsiblePerson();
  356. person.setRepalGroupId(dto.getRepalGroupId());
  357. person.setRepalBookId(dto.getRepalBookId());
  358. person.setRepalBillId(repalBill.getId());
  359. person.setUserId(t);
  360. return person;
  361. }).collect(Collectors.toList()));
  362. return true;
  363. }
  364. @Override
  365. @Transactional(rollbackFor = Exception.class)
  366. public Boolean breakRepalBill(BreakRepalBillDTO dto) {
  367. RepalBill repalBill = this.getById(dto.getRepalBillId());
  368. if (Objects.isNull(repalBill)) {
  369. throw new CommonException(CodeMsg.FAILED, "账款错误");
  370. }
  371. if (repalRolePermissionService.checkUserPermission(UserContextUtil.getUser().getUserId(),
  372. RepalBillTypeEnum.RECEIVABLE.getCode().equals(repalBill.getRepalBillType()) ? PermissionEnum.UPDATE_RECEIVABLE.getCode() : PermissionEnum.UPDATE_RECEIPT.getCode())) {
  373. throw new CommonException(CodeMsg.FAILED, "无对应权限");
  374. }
  375. this.update(Wrappers.lambdaUpdate(RepalBill.class)
  376. .eq(RepalBill::getId, dto.getRepalBillId())
  377. .set(RepalBill::getRepalBillStatus, RepalBillStatusEnum.END.getCode())
  378. .set(StrUtil.isNotBlank(dto.getBreakReason()), RepalBill::getBreakReason, dto.getBreakReason()));
  379. return true;
  380. }
  381. @Override
  382. @Transactional(rollbackFor = Exception.class)
  383. public Boolean updateRepalBill(UpdateRepalBillDTO dto) {
  384. RepalBill repalBill = this.getById(dto.getRepalBillId());
  385. if (repalRolePermissionService.checkUserPermission(UserContextUtil.getUser().getUserId(),
  386. RepalBillTypeEnum.RECEIVABLE.getCode().equals(repalBill.getRepalBillType()) ? PermissionEnum.UPDATE_RECEIVABLE.getCode() : PermissionEnum.UPDATE_RECEIPT.getCode())) {
  387. throw new CommonException(CodeMsg.FAILED, "无对应权限");
  388. }
  389. return true;
  390. }
  391. @Override
  392. @Transactional(rollbackFor = Exception.class)
  393. public Boolean deleteRepalBillByBookId(Long repalBookId) {
  394. this.update(Wrappers.lambdaUpdate(RepalBill.class)
  395. .eq(RepalBill::getRepalBookId, repalBookId)
  396. .set(RepalBill::getDeleted, DeletedStatusEnum.DELETE.getCode()));
  397. // 责任人也删除
  398. repalResponsiblePersonService.deletePersonByBookId(repalBookId);
  399. return true;
  400. }
  401. @Override
  402. public boolean checkAllBillRefreshStatus(Long repalBookId, Long repalBillId) {
  403. LambdaQueryWrapper<RepalBill> qw = Wrappers.lambdaQuery(RepalBill.class);
  404. qw.eq(RepalBill::getRepalBookId,repalBookId);
  405. qw.ne(RepalBill::getId,repalBillId);
  406. List<RepalBill> results = list(qw);
  407. for(RepalBill accountBill:results){
  408. if(!RefreshStatusEnum.REFRESH_SUCCESS.getCode().equals(accountBill.getRefreshStatus())){
  409. return false;
  410. }
  411. }
  412. return true;
  413. }
  414. @Override
  415. public VOPage<RepalBillPageVO> getCustRepalBillPage(Integer pageNum, Integer pageSize, Long custId) {
  416. VOPage<RepalBillPageVO> voPage = new VOPage<>();
  417. voPage.setPageSize(pageSize);
  418. voPage.setPageNum(pageNum);
  419. // 分页数据
  420. Page<RepalBill> repalBillPage = new Page<>(pageNum,pageSize);
  421. repalBillPage = repalBillMapper.getCustRepalBillPage(repalBillPage,custId);
  422. voPage.setTotalPage(Math.toIntExact(repalBillPage.getPages()));
  423. voPage.setTotalNum(repalBillPage.getTotal());
  424. voPage.setDataList(new ArrayList<>());
  425. if (CollUtil.isEmpty(repalBillPage.getRecords())) {
  426. return voPage;
  427. }
  428. // 未读消息
  429. List<Long> billIdList = repalBillPage.getRecords().stream().map(RepalBill::getId).collect(Collectors.toList());
  430. List<UserBillUnreadInfoBO> unreadInfoList = repalRemindReadInfoService.getUserBillUnreadInfo(UserContextUtil.getUser().getUserId(), billIdList);
  431. Map<Long, UserBillUnreadInfoBO> unreadInfoMap = new HashMap<>();
  432. if (CollUtil.isNotEmpty(unreadInfoList)) {
  433. unreadInfoMap = unreadInfoList.stream().collect(Collectors.toMap(UserBillUnreadInfoBO::getRepalBillId, Function.identity()));
  434. }
  435. Map<Long, List<String>> nameMap = repalResponsiblePersonService.getResponsiblePersonNameList(billIdList);
  436. Map<Long, UserBillUnreadInfoBO> finalUnreadInfoMap = unreadInfoMap;
  437. voPage.setDataList(repalBillPage.getRecords().stream().map(t -> {
  438. RepalBillPageVO vo = new RepalBillPageVO();
  439. BeanUtils.copyProperties(t, vo);
  440. vo.setRepalBillId(t.getId());
  441. vo.setResponsiblePersonNames(String.join("、", nameMap.get(t.getId())));
  442. UserBillUnreadInfoBO unreadInfoBO = finalUnreadInfoMap.get(vo.getRepalBillId());
  443. if (Objects.nonNull(unreadInfoBO)) {
  444. vo.setDynamicCountList(new ArrayList<Integer>(){{
  445. add(unreadInfoBO.getUnreadRiskCount());
  446. add(unreadInfoBO.getUnreadFinanceCount());
  447. add(unreadInfoBO.getUnreadRankCount());
  448. add(unreadInfoBO.getUnreadOverdueCount());
  449. }});
  450. }
  451. return vo;
  452. }).collect(Collectors.toList()));
  453. return voPage;
  454. }
  455. }