RepalCustomerServiceImpl.java 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533
  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.alibaba.fastjson.JSON;
  6. import com.baomidou.mybatisplus.core.toolkit.Wrappers;
  7. import com.module.login.usersession.UserBean;
  8. import com.winhc.common.base.ApiDataResult;
  9. import com.winhc.common.enums.CodeMsg;
  10. import com.winhc.common.exception.CommonException;
  11. import com.winhc.repal.cloud.DataMiddlewareService;
  12. import com.winhc.repal.cloud.dto.GetCompanyRiskNumDTO;
  13. import com.winhc.repal.cloud.dto.GetCreditPunishmentLabelDTO;
  14. import com.winhc.repal.cloud.dto.GetFinanceDynamicNumDTO;
  15. import com.winhc.repal.cloud.vo.CompanyRiskNumVO;
  16. import com.winhc.repal.cloud.vo.CreditPunishmentLabelListVO;
  17. import com.winhc.repal.cloud.vo.FinanceDynamicNumVO;
  18. import com.winhc.repal.entity.*;
  19. import com.winhc.repal.enums.*;
  20. import com.winhc.repal.model.bo.RepalCustomerInfoBO;
  21. import com.winhc.repal.model.bo.UserContextBO;
  22. import com.winhc.repal.model.dto.*;
  23. import com.winhc.repal.model.vo.*;
  24. import com.winhc.repal.repository.RepalCustomerMapper;
  25. import com.winhc.repal.service.*;
  26. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  27. import com.winhc.repal.util.UserContextUtil;
  28. import org.springframework.beans.BeanUtils;
  29. import org.springframework.beans.factory.annotation.Autowired;
  30. import org.springframework.stereotype.Service;
  31. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  32. import com.baomidou.mybatisplus.core.metadata.IPage;
  33. import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
  34. import com.winhc.common.model.base.VOPage;
  35. import com.winhc.repal.model.cvt.RepalCustomerConvert;
  36. import org.springframework.transaction.annotation.Transactional;
  37. import java.math.BigDecimal;
  38. import java.time.LocalDateTime;
  39. import java.util.*;
  40. import java.util.function.Function;
  41. import java.util.stream.Collectors;
  42. import java.util.stream.Stream;
  43. /**
  44. * @description RepalCustomer 接口实现类
  45. * @author Generator
  46. * @date 2022-04-08
  47. */
  48. @Service
  49. public class RepalCustomerServiceImpl extends ServiceImpl<RepalCustomerMapper, RepalCustomer> implements RepalCustomerService {
  50. @Autowired
  51. private RepalCustomerMapper repalCustomerMapper;
  52. @Autowired
  53. private RepalBookService repalBookService;
  54. @Autowired
  55. private RepalBillService repalBillService;
  56. @Autowired
  57. private RepalBillOperLogService repalBillOperLogService;
  58. @Autowired
  59. private RepalCustChargeRelService repalCustChargeRelService;
  60. @Autowired
  61. private RepalGroupMemberService repalGroupMemberService;
  62. @Autowired
  63. private RepalRemindHistoryService repalRemindHistoryService;
  64. @Autowired
  65. private RepalLinkService repalLinkService;
  66. @Autowired
  67. private DataMiddlewareService dataMiddlewareService;
  68. @Autowired
  69. private RepalChangeRecordService repalChangeRecordService;
  70. @Autowired
  71. private RepalRolePermissionService repalRolePermissionService;
  72. @Override
  73. public List<RepalCustomerSimpleVO> getCustList(Integer custType) {
  74. //不校验权限,返回全部客户供应商列表
  75. UserContextBO userContextBO = UserContextUtil.getUser();
  76. Long repalGroupId = repalGroupMemberService.getUserGroupId(userContextBO.getUserId());
  77. List<RepalCustomer> repalCustomers = list(Wrappers.lambdaQuery(RepalCustomer.class)
  78. .eq(RepalCustomer::getRepalGroupId,repalGroupId)
  79. .eq(RepalCustomer::getDeleted,Dict.DeletedStatusEnunm.否.getCode())
  80. .eq(RepalCustomer::getCustType,custType));
  81. if(CollUtil.isEmpty(repalCustomers)){
  82. return new ArrayList<>();
  83. }
  84. List<RepalCustomerSimpleVO> result = new ArrayList<>(repalCustomers.size());
  85. for(RepalCustomer repalCustomer:repalCustomers){
  86. RepalCustomerSimpleVO repalCustomerSimpleVO = new RepalCustomerSimpleVO();
  87. result.add(repalCustomerSimpleVO);
  88. BeanUtils.copyProperties(repalCustomer,repalCustomerSimpleVO);
  89. }
  90. return result;
  91. }
  92. @Override
  93. public VOPage<RepalCustomerInfoVO> find(RepalCustomerQueryDTO dto,UserBean userBean) {
  94. //权限
  95. boolean allFlag = repalRolePermissionService.checkUserPermission(UserContextUtil.getUser().getUserId(),
  96. Dict.custTypeEnum.客户.getCode().equals(dto.getCustType()) ? PermissionEnum.QUERY_ALL_CUST.getCode() : PermissionEnum.QUERY_ALL_SUPPLY.getCode());
  97. //查组织id
  98. RepalGroupMember repalGroupMember = repalGroupMemberService.getOne(Wrappers.lambdaQuery(RepalGroupMember.class)
  99. .eq(RepalGroupMember::getUserId,userBean.getUserId())
  100. .eq(RepalGroupMember::getDeleted,Dict.DeletedStatusEnunm.否.getCode()),false);
  101. if(ObjectUtil.isNull(repalGroupMember)){
  102. return new VOPage<>();
  103. }
  104. Page<RepalCustomerInfoBO> page = new Page<>(dto.getPageNum(),dto.getPageSize());
  105. int billType = Dict.custTypeEnum.客户.getCode().equals(dto.getCustType()) ? RepalBillTypeEnum.RECEIVABLE.getCode() : RepalBillTypeEnum.RECEIPT.getCode();
  106. page = repalCustomerMapper.getCustPage(page, repalGroupMember.getRepalGroupId(),dto.getCustProperty(),dto.getSortType(),dto.getCustType(),billType,allFlag,userBean.getUserId());
  107. VOPage<RepalCustomerInfoVO> result = new VOPage<>(dto.getPageNum(), dto.getPageSize(), page.getTotal(), new ArrayList<>());
  108. if(CollUtil.isEmpty(page.getRecords())){
  109. return result;
  110. }
  111. //查询负责人
  112. List<Long> custIds = page.getRecords().stream().map(RepalCustomerInfoBO::getCustId).collect(Collectors.toList());
  113. List<RepalCustChargeRel> rels = repalCustChargeRelService.list(Wrappers.lambdaQuery(RepalCustChargeRel.class)
  114. .in(RepalCustChargeRel::getCustId,custIds));
  115. Map<Long, List<RepalCustChargeRel>> relMap = rels.stream().collect(Collectors.groupingBy(RepalCustChargeRel::getCustId));
  116. Map<Long, RepalGroupMember> memberMap = repalGroupMemberService.list(Wrappers.lambdaQuery(RepalGroupMember.class)
  117. .in(RepalGroupMember::getUserId,rels.stream().map(RepalCustChargeRel::getMemberUserId).collect(Collectors.toList())))
  118. .stream().collect(Collectors.toMap(RepalGroupMember::getUserId,Function.identity()));
  119. List<RepalCustomerInfoVO> voList = new ArrayList<>();
  120. for(RepalCustomerInfoBO customerInfo:page.getRecords()){
  121. RepalCustomerInfoVO vo = new RepalCustomerInfoVO();
  122. BeanUtils.copyProperties(customerInfo,vo);
  123. vo.setReceivableStr(customerInfo.getReceivable().stripTrailingZeros().toPlainString());
  124. vo.setTotalMoneyStr(customerInfo.getTotalMoney().stripTrailingZeros().toPlainString());
  125. //查询未读动态数量
  126. if(Dict.custTypeEnum.客户.getCode().equals(dto.getCustType())) {
  127. List<RepalBill> repalBills = repalBillService.list(Wrappers.lambdaQuery(RepalBill.class)
  128. .eq(RepalBill::getCustomerId, customerInfo.getCustId())
  129. .eq(RepalBill::getDeleted, Dict.DeletedStatusEnunm.否.getCode()));
  130. if (CollUtil.isNotEmpty(repalBills)) {
  131. RepalBillRemindUnReadVO unRead = repalRemindHistoryService.getRemindUnReadVO(repalBills, userBean.getUserId());
  132. if (ObjectUtil.isNotNull(unRead) && unRead.getUnreadTotalCount() > 0) {
  133. vo.setDynamicCountList(Stream.of(unRead.getUnreadOverdueCount(), unRead.getUnreadRiskCount(), unRead.getUnreadRankCount(), unRead.getUnreadFinanceCount()).collect(Collectors.toList()));
  134. }
  135. }
  136. }
  137. //负责人
  138. if(relMap.containsKey(customerInfo.getCustId())){
  139. List<RepalCustChargeRel> repalCustChargeRels = relMap.get(customerInfo.getCustId());
  140. List<RepalGroupMemberVO> memberList = new ArrayList<>();
  141. vo.setCharges(memberList);
  142. for(RepalCustChargeRel rel:repalCustChargeRels){
  143. RepalGroupMemberVO member = new RepalGroupMemberVO();
  144. memberList.add(member);
  145. RepalGroupMember groupMember = memberMap.getOrDefault(rel.getMemberUserId(),new RepalGroupMember());
  146. member.setMemberUserName(groupMember.getMemberUserName());
  147. member.setUserId(groupMember.getUserId());
  148. member.setId(groupMember.getId());
  149. member.setRepalGroupId(groupMember.getRepalGroupId());
  150. member.setRoleType(groupMember.getRoleType());
  151. }
  152. }
  153. voList.add(vo);
  154. }
  155. result.setDataList(voList);
  156. return result;
  157. }
  158. @Override
  159. @Transactional
  160. public RepalCustomerDetailVO addCustomer(RepalCustomerDTO dto,UserBean userBean) {
  161. boolean allFlag = repalRolePermissionService.checkUserPermission(UserContextUtil.getUser().getUserId(),
  162. Dict.custTypeEnum.客户.getCode().equals(dto.getCustType()) ? PermissionEnum.ADD_CUST.getCode() : PermissionEnum.ADD_SUPPLY.getCode());
  163. if(!allFlag){
  164. throw new CommonException(CodeMsg.FAILED,"暂无此权限,可联系超级管理员在我的-成员管理页面开通");
  165. }
  166. //查组织id
  167. RepalGroupMember repalGroupMember = repalGroupMemberService.getOne(Wrappers.lambdaQuery(RepalGroupMember.class)
  168. .eq(RepalGroupMember::getUserId,userBean.getUserId())
  169. .eq(RepalGroupMember::getDeleted,Dict.DeletedStatusEnunm.否.getCode()),false);
  170. if(ObjectUtil.isNull(repalGroupMember)){
  171. throw new CommonException(CodeMsg.FAILED,"您还未加入该组织,请联系超级管理员");
  172. }
  173. RepalCustomer repalCustomer = new RepalCustomer();
  174. BeanUtils.copyProperties(dto,repalCustomer);
  175. repalCustomer.setRepalGroupId(repalGroupMember.getRepalGroupId());
  176. //校验非空字段
  177. if(StrUtil.isBlank(dto.getCustName())){
  178. throw new CommonException(CodeMsg.FAILED,"客户名不能为空");
  179. }
  180. if(ObjectUtil.isNull(dto.getCustProperty())){
  181. throw new CommonException(CodeMsg.FAILED,"客户性质不能为空");
  182. }
  183. save(repalCustomer);
  184. //保存联系人
  185. if(CollUtil.isNotEmpty(dto.getLinks())){
  186. List<RepalLink> links = new ArrayList<>();
  187. for(RepalLinkDTO linkDto: dto.getLinks()){
  188. RepalLink link = new RepalLink();
  189. BeanUtils.copyProperties(linkDto,link);
  190. link.setCustId(repalCustomer.getCustId());
  191. links.add(link);
  192. }
  193. repalLinkService.saveBatch(links);
  194. }
  195. //保存客户和负责人的关系
  196. if(CollUtil.isNotEmpty(dto.getCharges())){
  197. List<RepalCustChargeRel> rels = new ArrayList<>();
  198. for(Long relUserId: dto.getCharges()){
  199. RepalCustChargeRel rel = new RepalCustChargeRel();
  200. rel.setCustId(repalCustomer.getCustId());
  201. rel.setMemberUserId(relUserId);
  202. rels.add(rel);
  203. }
  204. repalCustChargeRelService.saveBatch(rels);
  205. }
  206. //添加操作日志
  207. Dict.ActionCodeEnum actionCodeEnum = Dict.ActionCodeEnum.新增客户;
  208. if(Dict.custTypeEnum.供应商.getCode().equals(dto.getCustType())){
  209. actionCodeEnum = Dict.ActionCodeEnum.新增供应商;
  210. }
  211. RepalBillOperLog repalBillOperLog = new RepalBillOperLog();
  212. repalBillOperLog.setActionCode(actionCodeEnum.getCode());
  213. repalBillOperLog.setUserId(userBean.getUserId());
  214. repalBillOperLog.setOperTime(LocalDateTime.now());
  215. repalBillOperLog.setBizId(String.valueOf(repalCustomer.getCustId()));
  216. repalBillOperLog.setBizType(actionCodeEnum.getBizType());
  217. repalBillOperLog.setActionName(actionCodeEnum.name());
  218. repalBillOperLogService.save(repalBillOperLog);
  219. return getDetailById(repalCustomer.getCustId(),userBean,dto.getCustType());
  220. }
  221. @Override
  222. public RepalCustomerDetailVO updateCustomer(RepalCustomerUpdateDTO dto, UserBean userBean) {
  223. boolean allFlag = repalRolePermissionService.checkUserPermission(UserContextUtil.getUser().getUserId(),
  224. Dict.custTypeEnum.客户.getCode().equals(dto.getCustType()) ? PermissionEnum.UPDATE_CUST.getCode() : PermissionEnum.UPDATE_SUPPLY.getCode());
  225. if(!allFlag){
  226. throw new CommonException(CodeMsg.FAILED,"暂无此权限,可联系超级管理员在我的-成员管理页面开通");
  227. }
  228. RepalCustomer repalCustomer = getById(dto.getCustId());
  229. if(ObjectUtil.isNull(repalCustomer)){
  230. throw new CommonException(CodeMsg.FAILED,"客户或供应商不存在");
  231. }
  232. RepalBillOperLog repalBillOperLog = new RepalBillOperLog();
  233. List<RepalOperLogContentVO> operLogContents = new ArrayList<>();
  234. if(!ObjectUtil.equal(repalCustomer.getCustName(),dto.getCustName())){
  235. RepalOperLogContentVO contentVO = new RepalOperLogContentVO();
  236. contentVO.setPropertyName("custName");
  237. contentVO.setPropertyCN("客户名称");
  238. contentVO.setOldValue(repalCustomer.getCustName());
  239. contentVO.setNewValue(dto.getCustName());
  240. operLogContents.add(contentVO);
  241. repalCustomer.setCustName(dto.getCustName());
  242. repalCustomer.setCompanyId(dto.getCompanyId());
  243. }
  244. if(!ObjectUtil.equal(repalCustomer.getCustProperty(),dto.getCustProperty())){
  245. RepalOperLogContentVO contentVO = new RepalOperLogContentVO();
  246. contentVO.setPropertyName("custProperty");
  247. contentVO.setPropertyCN("客户性质");
  248. contentVO.setOldValue(String.valueOf(repalCustomer.getCustProperty()));
  249. contentVO.setNewValue(String.valueOf(dto.getCustProperty()));
  250. operLogContents.add(contentVO);
  251. repalCustomer.setCustProperty(dto.getCustProperty());
  252. }
  253. if(!ObjectUtil.equal(repalCustomer.getIndustry(),dto.getIndustry())){
  254. RepalOperLogContentVO contentVO = new RepalOperLogContentVO();
  255. contentVO.setPropertyName("industry");
  256. contentVO.setPropertyCN("所属行业");
  257. contentVO.setOldValue(repalCustomer.getIndustry());
  258. contentVO.setNewValue(dto.getIndustry());
  259. operLogContents.add(contentVO);
  260. repalCustomer.setIndustry(dto.getIndustry());
  261. }
  262. if(!ObjectUtil.equal(repalCustomer.getIndustry(),dto.getIndustry())){
  263. RepalOperLogContentVO contentVO = new RepalOperLogContentVO();
  264. contentVO.setPropertyName("address");
  265. contentVO.setPropertyCN("办公地址");
  266. contentVO.setOldValue(repalCustomer.getAddress());
  267. contentVO.setNewValue(dto.getAddress());
  268. operLogContents.add(contentVO);
  269. repalCustomer.setAddress(dto.getAddress());
  270. }
  271. if(!ObjectUtil.equal(repalCustomer.getAttachment(),dto.getAttachment())){
  272. RepalOperLogContentVO contentVO = new RepalOperLogContentVO();
  273. contentVO.setPropertyName("attachment");
  274. contentVO.setPropertyCN("附件");
  275. contentVO.setOldValue(repalCustomer.getAttachment());
  276. contentVO.setNewValue(dto.getAttachment());
  277. operLogContents.add(contentVO);
  278. repalCustomer.setAttachment(dto.getAttachment());
  279. }
  280. if(!ObjectUtil.equal(repalCustomer.getRemark(),dto.getRemark())){
  281. RepalOperLogContentVO contentVO = new RepalOperLogContentVO();
  282. contentVO.setPropertyName("remark");
  283. contentVO.setPropertyCN("备注信息");
  284. contentVO.setOldValue(repalCustomer.getRemark());
  285. contentVO.setNewValue(dto.getRemark());
  286. operLogContents.add(contentVO);
  287. repalCustomer.setRemark(dto.getRemark());
  288. }
  289. updateById(repalCustomer);
  290. if(CollUtil.isNotEmpty(dto.getCharges())){
  291. List<RepalCustChargeRel> rels = repalCustChargeRelService.list(Wrappers.lambdaQuery(RepalCustChargeRel.class).eq(RepalCustChargeRel::getCustId,dto.getCustId()));
  292. List<RepalGroupMember> members = new ArrayList<>();
  293. //删除旧负责人
  294. if(CollUtil.isNotEmpty(rels)){
  295. repalCustChargeRelService.removeByIds(rels.stream().map(RepalCustChargeRel::getId).collect(Collectors.toList()));
  296. members = repalGroupMemberService.list(Wrappers.lambdaQuery(RepalGroupMember.class)
  297. .in(RepalGroupMember::getUserId,rels.stream().map(RepalCustChargeRel::getMemberUserId).collect(Collectors.toList()))
  298. .eq(RepalGroupMember::getDeleted,Dict.DeletedStatusEnunm.否.getCode()));
  299. }
  300. List<RepalGroupMember> newMembers = repalGroupMemberService.list(Wrappers.lambdaQuery(RepalGroupMember.class)
  301. .in(RepalGroupMember::getUserId,dto.getCharges())
  302. .eq(RepalGroupMember::getDeleted,Dict.DeletedStatusEnunm.否.getCode()));
  303. //新增负责人
  304. List<RepalCustChargeRel> newRels = new ArrayList<>();
  305. for(Long relUserId: dto.getCharges()){
  306. RepalCustChargeRel rel = new RepalCustChargeRel();
  307. rel.setCustId(repalCustomer.getCustId());
  308. rel.setMemberUserId(relUserId);
  309. newRels.add(rel);
  310. }
  311. repalCustChargeRelService.saveBatch(newRels);
  312. RepalOperLogContentVO contentVO = new RepalOperLogContentVO();
  313. contentVO.setPropertyName("charges");
  314. contentVO.setPropertyCN("负责人");
  315. contentVO.setOldValue(JSON.toJSONString(members.stream().map(RepalGroupMember::getMemberUserName).collect(Collectors.toList())));
  316. contentVO.setNewValue(JSON.toJSONString(newMembers.stream().map(RepalGroupMember::getMemberUserName).collect(Collectors.toList())));
  317. operLogContents.add(contentVO);
  318. }
  319. if(CollUtil.isNotEmpty(dto.getLinks())){
  320. List<RepalLink> links = repalLinkService.list(Wrappers.lambdaQuery(RepalLink.class).eq(RepalLink::getCustId,dto.getCustId()).eq(RepalLink::getDeleted,Dict.DeletedStatusEnunm.否.getCode()));
  321. //遍历修改老数据
  322. if(CollUtil.isNotEmpty(links)){
  323. for(RepalLink repalLink:links){
  324. Optional<RepalLinkDTO> optionalRepalLink = dto.getLinks().stream().filter(x->repalLink.getId().equals(x.getId())).findFirst();
  325. if(optionalRepalLink.isPresent()){
  326. BeanUtils.copyProperties(optionalRepalLink.get(),repalLink);
  327. }else {
  328. repalLink.setDeleted(Dict.DeletedStatusEnunm.是.getCode());
  329. }
  330. repalLinkService.updateById(repalLink);
  331. }
  332. }
  333. //遍历新数据
  334. List<RepalLink> newlinks = new ArrayList<>();
  335. for(RepalLinkDTO linkDto: dto.getLinks()){
  336. if(ObjectUtil.isNotNull(linkDto.getId())){
  337. continue;
  338. }
  339. RepalLink link = new RepalLink();
  340. BeanUtils.copyProperties(linkDto,link);
  341. link.setCustId(repalCustomer.getCustId());
  342. newlinks.add(link);
  343. }
  344. repalLinkService.saveBatch(newlinks);
  345. RepalOperLogContentVO contentVO = new RepalOperLogContentVO();
  346. contentVO.setPropertyName("links");
  347. contentVO.setPropertyCN("联系人");
  348. contentVO.setOldValue(JSON.toJSONString(links));
  349. contentVO.setNewValue(JSON.toJSONString(dto.getLinks()));
  350. operLogContents.add(contentVO);
  351. }
  352. Dict.ActionCodeEnum actionCodeEnum = Dict.ActionCodeEnum.修改客户;
  353. if(Dict.custTypeEnum.供应商.getCode().equals(repalCustomer.getCustType())){
  354. actionCodeEnum = Dict.ActionCodeEnum.修改供应商;
  355. }
  356. repalBillOperLog.setActionCode(actionCodeEnum.getCode());
  357. repalBillOperLog.setUserId(userBean.getUserId());
  358. repalBillOperLog.setOperTime(LocalDateTime.now());
  359. repalBillOperLog.setBizId(String.valueOf(dto.getCustId()));
  360. repalBillOperLog.setBizType(actionCodeEnum.getBizType());
  361. repalBillOperLog.setActionName(actionCodeEnum.name());
  362. repalBillOperLog.setActionContent(JSON.toJSONString(operLogContents));
  363. repalBillOperLogService.save(repalBillOperLog);
  364. return getDetailById(dto.getCustId(),userBean,dto.getCustType());
  365. }
  366. @Override
  367. public RepalCustomerDetailVO getDetailById(Long custId,UserBean userBean,Integer custType) {
  368. //不做权限判断,默认通过列表的权限
  369. RepalCustomer repalCustomer = getById(custId);
  370. if(ObjectUtil.isNull(repalCustomer)){
  371. throw new CommonException(CodeMsg.FAILED,"客户或供应商不存在");
  372. }
  373. RepalCustomerDetailVO result = new RepalCustomerDetailVO();
  374. BeanUtils.copyProperties(repalCustomer,result);
  375. //查询负责人
  376. List<RepalCustChargeRel> rels = repalCustChargeRelService.list(Wrappers.lambdaQuery(RepalCustChargeRel.class)
  377. .eq(RepalCustChargeRel::getCustId,custId));
  378. if(CollUtil.isNotEmpty(rels)){
  379. List<RepalGroupMember> repalGroupMembers = repalGroupMemberService.list(Wrappers.lambdaQuery(RepalGroupMember.class)
  380. .in(RepalGroupMember::getUserId,rels.stream().map(RepalCustChargeRel::getMemberUserId).collect(Collectors.toList())));
  381. List<RepalGroupMemberVO> memberList = new ArrayList<>();
  382. result.setCharges(memberList);
  383. for(RepalGroupMember groupMember:repalGroupMembers){
  384. RepalGroupMemberVO member = new RepalGroupMemberVO();
  385. memberList.add(member);
  386. member.setMemberUserName(groupMember.getMemberUserName());
  387. member.setUserId(groupMember.getUserId());
  388. member.setId(groupMember.getId());
  389. member.setRepalGroupId(groupMember.getRepalGroupId());
  390. member.setRoleType(groupMember.getRoleType());
  391. }
  392. }
  393. // 标签
  394. if (Dict.custTypeEnum.客户.getCode().equals(custType) && StrUtil.isNotBlank(repalCustomer.getCompanyId())) {
  395. // 失信限高标签
  396. ApiDataResult<List<CreditPunishmentLabelListVO>> labelResult = dataMiddlewareService.getCreditPunishmentLabelList(new GetCreditPunishmentLabelDTO(Collections.singletonList(repalCustomer.getCompanyId())));
  397. if (Objects.nonNull(labelResult) && CollUtil.isNotEmpty(labelResult.getData())) {
  398. result.setLabelList(labelResult.getData().get(0).getLabelList());
  399. }
  400. // 财产数量
  401. ApiDataResult<List<FinanceDynamicNumVO>> financeResult = dataMiddlewareService.getFinanceDynamicNumV8List(new GetFinanceDynamicNumDTO().setCompanyIdList(Collections.singletonList(repalCustomer.getCompanyId())));
  402. if (Objects.nonNull(financeResult) && CollUtil.isNotEmpty(financeResult.getData())) {
  403. result.setAssetsNum(financeResult.getData().get(0).getFinanceDynamicNum());
  404. }
  405. // 风险数量
  406. ApiDataResult<List<CompanyRiskNumVO>> riskResult = dataMiddlewareService.getCompanyRiskNumList(new GetCompanyRiskNumDTO(Collections.singletonList(repalCustomer.getCompanyId())));
  407. if (Objects.nonNull(riskResult) && CollUtil.isNotEmpty(riskResult.getData())) {
  408. result.setRiskNum(riskResult.getData().get(0).getRiskNum());
  409. }
  410. }
  411. //账款汇总
  412. List<RepalBill> repalBills = repalBillService.list(Wrappers.lambdaQuery(RepalBill.class).eq(RepalBill::getCustomerId,custId).eq(RepalBill::getDeleted,Dict.DeletedStatusEnunm.否.getCode()));
  413. if(CollUtil.isNotEmpty(repalBills)){
  414. if(Dict.custTypeEnum.客户.getCode().equals(custType)) {
  415. result.setRepalBillCount(repalBills.size());
  416. result.setReceivableStr(repalBills.stream().map(RepalBill::getReceivable).reduce(BigDecimal.ZERO,BigDecimal::add).stripTrailingZeros().toPlainString());
  417. result.setTotalMoneyStr(repalBills.stream().map(RepalBill::getTotalMoney).reduce(BigDecimal.ZERO,BigDecimal::add).stripTrailingZeros().toPlainString());
  418. result.setTotalOverdueStr(repalBills.stream().filter(x-> RepalBillStatusEnum.OVERDUE.getCode().equals(x.getRepalBillStatus())).map(RepalBill::getReceivable).reduce(BigDecimal.ZERO,BigDecimal::add).stripTrailingZeros().toPlainString());
  419. result.setTotalReceiptStr(repalBills.stream().map(RepalBill::getReceipt).reduce(BigDecimal.ZERO,BigDecimal::add).stripTrailingZeros().toPlainString());
  420. //动态
  421. RepalBillRemindUnReadVO unRead = repalRemindHistoryService.getRemindUnReadVO(repalBills, userBean.getUserId());
  422. if (ObjectUtil.isNotNull(unRead) && unRead.getUnreadTotalCount() > 0) {
  423. result.setDynamicCountList(Stream.of(unRead.getUnreadOverdueCount(), unRead.getUnreadRiskCount(), unRead.getUnreadRankCount(), unRead.getUnreadFinanceCount()).collect(Collectors.toList()));
  424. }
  425. }
  426. //账款记录
  427. List<RepalChangeRecord> repalChangeRecordList = repalChangeRecordService.list(Wrappers.lambdaQuery(RepalChangeRecord.class)
  428. .in(RepalChangeRecord::getRepalBillId, repalBills.stream().map(RepalBill::getId).collect(Collectors.toList()))
  429. .eq(RepalChangeRecord::getDeleted, DeletedStatusEnum.NORMAL.getCode())
  430. .orderByDesc(RepalChangeRecord::getId));
  431. if (CollUtil.isNotEmpty(repalChangeRecordList)) {
  432. result.setChangeList(repalChangeRecordList.stream().map(t -> {
  433. RepalBillDetailVO.BillMoneyChange billMoneyChange = new RepalBillDetailVO.BillMoneyChange();
  434. billMoneyChange.setChangeTime(t.getTimeCreated());
  435. billMoneyChange.setChangeDesc(t.getOperUserName() + " 增加回款 " + t.getTransMoney().stripTrailingZeros().toPlainString());
  436. return billMoneyChange;
  437. }).collect(Collectors.toList()));
  438. }
  439. }else {
  440. result.setRepalBillCount(0);
  441. result.setReceivableStr("0");
  442. result.setTotalMoneyStr("0");
  443. result.setTotalOverdueStr("0");
  444. result.setTotalReceiptStr("0");
  445. result.setDynamicCountList(Arrays.asList(0,0,0,0));
  446. }
  447. //联系人
  448. List<RepalLink> repalLinks = repalLinkService.list(Wrappers.lambdaQuery(RepalLink.class).eq(RepalLink::getCustId,custId).eq(RepalLink::getDeleted,Dict.DeletedStatusEnunm.否.getCode()));
  449. if(CollUtil.isNotEmpty(repalLinks)){
  450. List<RepalLinkVO> repalLinkVOs = new ArrayList<>();
  451. result.setLinks(repalLinkVOs);
  452. for(RepalLink repalLink:repalLinks){
  453. RepalLinkVO repalLinkVO = new RepalLinkVO();
  454. repalLinkVOs.add(repalLinkVO);
  455. BeanUtils.copyProperties(repalLink,repalLinkVO);
  456. }
  457. }
  458. return result;
  459. }
  460. @Override
  461. @Transactional
  462. public Boolean deleteCustomer(Long custId, UserBean userBean) {
  463. RepalCustomer repalCustomer = getById(custId);
  464. if(ObjectUtil.isNull(custId)){
  465. throw new CommonException(CodeMsg.FAILED,"客户或供应商不存在");
  466. }
  467. boolean allFlag = repalRolePermissionService.checkUserPermission(UserContextUtil.getUser().getUserId(),
  468. Dict.custTypeEnum.客户.getCode().equals(repalCustomer.getCustType()) ? PermissionEnum.UPDATE_CUST.getCode() : PermissionEnum.UPDATE_SUPPLY.getCode());
  469. if(!allFlag){
  470. throw new CommonException(CodeMsg.FAILED,"暂无此权限,可联系超级管理员在我的-成员管理页面开通");
  471. }
  472. repalCustomer.setDeleted(Dict.DeletedStatusEnunm.是.getCode());
  473. updateById(repalCustomer);
  474. //删除客户对应的账款
  475. List<RepalBill> repalBills = repalBillService.list(Wrappers.lambdaQuery(RepalBill.class)
  476. .eq(RepalBill::getCustomerId,custId)
  477. .eq(RepalBill::getDeleted, Dict.DeletedStatusEnunm.否.getCode()));
  478. if(CollUtil.isNotEmpty(repalBills)){
  479. throw new CommonException(CodeMsg.FAILED,"请先删除该"+(Dict.custTypeEnum.客户.getCode().equals(repalCustomer.getCustType()) ? Dict.custTypeEnum.客户.name() : Dict.custTypeEnum.供应商.name())+"的关联账款");
  480. }
  481. //操作记录
  482. Dict.ActionCodeEnum actionCodeEnum = Dict.ActionCodeEnum.删除客户;
  483. if(Dict.custTypeEnum.供应商.getCode().equals(repalCustomer.getCustType())){
  484. actionCodeEnum = Dict.ActionCodeEnum.删除供应商;
  485. }
  486. RepalBillOperLog repalBillOperLog = new RepalBillOperLog();
  487. repalBillOperLog.setActionCode(actionCodeEnum.getCode());
  488. repalBillOperLog.setUserId(userBean.getUserId());
  489. repalBillOperLog.setOperTime(LocalDateTime.now());
  490. repalBillOperLog.setBizId(String.valueOf(custId));
  491. repalBillOperLog.setBizType(actionCodeEnum.getBizType());
  492. repalBillOperLog.setActionName(actionCodeEnum.name());
  493. repalBillOperLogService.save(repalBillOperLog);
  494. return Boolean.TRUE;
  495. }
  496. }