RepalCustomerServiceImpl.java 34 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624
  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, String keyword) {
  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. .like(StrUtil.isNotBlank(keyword), RepalCustomer::getCustName, keyword));
  82. if(CollUtil.isEmpty(repalCustomers)){
  83. return new ArrayList<>();
  84. }
  85. List<RepalCustomerSimpleVO> result = new ArrayList<>(repalCustomers.size());
  86. for(RepalCustomer repalCustomer:repalCustomers){
  87. RepalCustomerSimpleVO repalCustomerSimpleVO = new RepalCustomerSimpleVO();
  88. result.add(repalCustomerSimpleVO);
  89. BeanUtils.copyProperties(repalCustomer,repalCustomerSimpleVO);
  90. }
  91. return result;
  92. }
  93. @Override
  94. public VOPage<RepalCustomerInfoVO> find(RepalCustomerQueryDTO dto,UserBean userBean) {
  95. //权限
  96. boolean allFlag = repalRolePermissionService.checkUserPermission(UserContextUtil.getUser().getUserId(),
  97. Dict.custTypeEnum.客户.getCode().equals(dto.getCustType()) ? PermissionEnum.QUERY_ALL_CUST.getCode() : PermissionEnum.QUERY_ALL_SUPPLY.getCode());
  98. //查组织id
  99. RepalGroupMember repalGroupMember = repalGroupMemberService.getOne(Wrappers.lambdaQuery(RepalGroupMember.class)
  100. .eq(RepalGroupMember::getUserId,userBean.getUserId())
  101. .eq(RepalGroupMember::getDeleted,Dict.DeletedStatusEnunm.否.getCode()),false);
  102. if(ObjectUtil.isNull(repalGroupMember)){
  103. return new VOPage<>();
  104. }
  105. Page<RepalCustomerInfoBO> page = new Page<>(dto.getPageNum(),dto.getPageSize());
  106. int billType = Dict.custTypeEnum.客户.getCode().equals(dto.getCustType()) ? RepalBillTypeEnum.RECEIVABLE.getCode() : RepalBillTypeEnum.RECEIPT.getCode();
  107. page = repalCustomerMapper.getCustPage(page, repalGroupMember.getRepalGroupId(),dto.getCustProperty(),dto.getSortType(),dto.getCustType(),billType,allFlag,userBean.getUserId());
  108. VOPage<RepalCustomerInfoVO> result = new VOPage<>(dto.getPageNum(), dto.getPageSize(), page.getTotal(), new ArrayList<>());
  109. if(CollUtil.isEmpty(page.getRecords())){
  110. return result;
  111. }
  112. //查询负责人
  113. List<Long> custIds = page.getRecords().stream().map(RepalCustomerInfoBO::getCustId).collect(Collectors.toList());
  114. List<RepalCustChargeRel> rels = repalCustChargeRelService.list(Wrappers.lambdaQuery(RepalCustChargeRel.class)
  115. .in(RepalCustChargeRel::getCustId,custIds));
  116. Map<Long, List<RepalCustChargeRel>> relMap = rels.stream().collect(Collectors.groupingBy(RepalCustChargeRel::getCustId));
  117. Map<Long, RepalGroupMember> memberMap = new HashMap<>();
  118. if(CollUtil.isNotEmpty(rels)) {
  119. memberMap = repalGroupMemberService.list(Wrappers.lambdaQuery(RepalGroupMember.class)
  120. .in(RepalGroupMember::getUserId, rels.stream().map(RepalCustChargeRel::getMemberUserId).collect(Collectors.toList())).eq(RepalGroupMember::getDeleted,Dict.DeletedStatusEnunm.否.getCode()))
  121. .stream().collect(Collectors.toMap(RepalGroupMember::getUserId, Function.identity(),(a,b)->a));
  122. }
  123. List<RepalCustomerInfoVO> voList = new ArrayList<>();
  124. for(RepalCustomerInfoBO customerInfo:page.getRecords()){
  125. RepalCustomerInfoVO vo = new RepalCustomerInfoVO();
  126. BeanUtils.copyProperties(customerInfo,vo);
  127. vo.setReceivableStr(customerInfo.getReceivable().stripTrailingZeros().toPlainString());
  128. vo.setTotalMoneyStr(customerInfo.getTotalMoney().stripTrailingZeros().toPlainString());
  129. //查询未读动态数量
  130. if(Dict.custTypeEnum.客户.getCode().equals(dto.getCustType())) {
  131. List<RepalBill> repalBills = repalBillService.list(Wrappers.lambdaQuery(RepalBill.class)
  132. .eq(RepalBill::getCustomerId, customerInfo.getCustId())
  133. .eq(RepalBill::getDeleted, Dict.DeletedStatusEnunm.否.getCode()));
  134. if (CollUtil.isNotEmpty(repalBills)) {
  135. RepalBillRemindUnReadVO unRead = repalRemindHistoryService.getRemindUnReadVO(repalBills, userBean.getUserId(), null, null);
  136. if (ObjectUtil.isNotNull(unRead) && unRead.getUnreadTotalCount() > 0) {
  137. vo.setDynamicCountList(Stream.of(unRead.getUnreadOverdueCount(), unRead.getUnreadRiskCount(), unRead.getUnreadRankCount(), unRead.getUnreadFinanceCount()).collect(Collectors.toList()));
  138. }
  139. }
  140. }
  141. //负责人
  142. if(relMap.containsKey(customerInfo.getCustId())){
  143. List<RepalCustChargeRel> repalCustChargeRels = relMap.get(customerInfo.getCustId());
  144. List<RepalGroupMemberVO> memberList = new ArrayList<>();
  145. vo.setCharges(memberList);
  146. for(RepalCustChargeRel rel:repalCustChargeRels){
  147. RepalGroupMemberVO member = new RepalGroupMemberVO();
  148. memberList.add(member);
  149. RepalGroupMember groupMember = memberMap.getOrDefault(rel.getMemberUserId(),new RepalGroupMember());
  150. member.setMemberUserName(groupMember.getMemberUserName());
  151. member.setUserId(groupMember.getUserId());
  152. member.setId(groupMember.getId());
  153. member.setRepalGroupId(groupMember.getRepalGroupId());
  154. member.setRoleType(groupMember.getRoleType());
  155. }
  156. }
  157. voList.add(vo);
  158. }
  159. result.setDataList(voList);
  160. return result;
  161. }
  162. @Override
  163. @Transactional
  164. public RepalCustomerDetailVO addCustomer(RepalCustomerDTO dto,UserBean userBean) {
  165. boolean allFlag = repalRolePermissionService.checkUserPermission(UserContextUtil.getUser().getUserId(),
  166. Dict.custTypeEnum.客户.getCode().equals(dto.getCustType()) ? PermissionEnum.ADD_CUST.getCode() : PermissionEnum.ADD_SUPPLY.getCode());
  167. if(!allFlag){
  168. throw new CommonException(CodeMsg.FAILED,"暂无此权限,可联系超级管理员在我的-成员管理页面开通");
  169. }
  170. //查组织id
  171. RepalGroupMember repalGroupMember = repalGroupMemberService.getOne(Wrappers.lambdaQuery(RepalGroupMember.class)
  172. .eq(RepalGroupMember::getUserId,userBean.getUserId())
  173. .eq(RepalGroupMember::getDeleted,Dict.DeletedStatusEnunm.否.getCode()),false);
  174. if(ObjectUtil.isNull(repalGroupMember)){
  175. throw new CommonException(CodeMsg.FAILED,"您还未加入该组织,请联系超级管理员");
  176. }
  177. int repeatCount = count(Wrappers.lambdaQuery(RepalCustomer.class)
  178. .eq(RepalCustomer::getCustName,dto.getCustName())
  179. .eq(RepalCustomer::getRepalGroupId,repalGroupMember.getRepalGroupId()));
  180. if(repeatCount > 0){
  181. throw new CommonException(CodeMsg.FAILED,"不能重复添加客户或供应商");
  182. }
  183. RepalCustomer repalCustomer = new RepalCustomer();
  184. BeanUtils.copyProperties(dto,repalCustomer);
  185. repalCustomer.setRepalGroupId(repalGroupMember.getRepalGroupId());
  186. //校验非空字段
  187. if(StrUtil.isBlank(dto.getCustName())){
  188. throw new CommonException(CodeMsg.FAILED,"客户名不能为空");
  189. }
  190. if(ObjectUtil.isNull(dto.getCustProperty())){
  191. throw new CommonException(CodeMsg.FAILED,"客户性质不能为空");
  192. }
  193. save(repalCustomer);
  194. //保存联系人
  195. if(CollUtil.isNotEmpty(dto.getLinks())){
  196. List<RepalLink> links = new ArrayList<>();
  197. for(RepalLinkDTO linkDto: dto.getLinks()){
  198. RepalLink link = new RepalLink();
  199. BeanUtils.copyProperties(linkDto,link);
  200. link.setCustId(repalCustomer.getCustId());
  201. links.add(link);
  202. }
  203. repalLinkService.saveBatch(links);
  204. }
  205. //保存客户和负责人的关系
  206. if(CollUtil.isNotEmpty(dto.getCharges())){
  207. List<RepalCustChargeRel> rels = new ArrayList<>();
  208. for(Long relUserId: dto.getCharges()){
  209. RepalCustChargeRel rel = new RepalCustChargeRel();
  210. rel.setCustId(repalCustomer.getCustId());
  211. rel.setMemberUserId(relUserId);
  212. rels.add(rel);
  213. }
  214. repalCustChargeRelService.saveBatch(rels);
  215. }
  216. //添加操作日志
  217. Dict.ActionCodeEnum actionCodeEnum = Dict.ActionCodeEnum.新增客户;
  218. if(Dict.custTypeEnum.供应商.getCode().equals(dto.getCustType())){
  219. actionCodeEnum = Dict.ActionCodeEnum.新增供应商;
  220. }
  221. RepalBillOperLog repalBillOperLog = new RepalBillOperLog();
  222. repalBillOperLog.setActionCode(actionCodeEnum.getCode());
  223. repalBillOperLog.setUserId(userBean.getUserId());
  224. repalBillOperLog.setOperTime(LocalDateTime.now());
  225. repalBillOperLog.setBizId(String.valueOf(repalCustomer.getCustId()));
  226. repalBillOperLog.setBizType(actionCodeEnum.getBizType());
  227. repalBillOperLog.setActionName(actionCodeEnum.name());
  228. repalBillOperLogService.save(repalBillOperLog);
  229. return getDetailById(repalCustomer.getCustId(),userBean,dto.getCustType());
  230. }
  231. @Override
  232. public RepalCustomerDetailVO updateCustomer(RepalCustomerUpdateDTO dto, UserBean userBean) {
  233. boolean allFlag = repalRolePermissionService.checkUserPermission(UserContextUtil.getUser().getUserId(),
  234. Dict.custTypeEnum.客户.getCode().equals(dto.getCustType()) ? PermissionEnum.UPDATE_CUST.getCode() : PermissionEnum.UPDATE_SUPPLY.getCode());
  235. if(!allFlag){
  236. throw new CommonException(CodeMsg.FAILED,"暂无此权限,可联系超级管理员在我的-成员管理页面开通");
  237. }
  238. RepalCustomer repalCustomer = getById(dto.getCustId());
  239. if(ObjectUtil.isNull(repalCustomer)){
  240. throw new CommonException(CodeMsg.FAILED,"客户或供应商不存在");
  241. }
  242. RepalBillOperLog repalBillOperLog = new RepalBillOperLog();
  243. List<RepalOperLogContentVO> operLogContents = new ArrayList<>();
  244. if(!ObjectUtil.equal(repalCustomer.getCustName(),dto.getCustName())){
  245. RepalOperLogContentVO contentVO = new RepalOperLogContentVO();
  246. contentVO.setPropertyName("custName");
  247. contentVO.setPropertyCN("客户名称");
  248. contentVO.setOldValue(repalCustomer.getCustName());
  249. contentVO.setNewValue(dto.getCustName());
  250. operLogContents.add(contentVO);
  251. repalCustomer.setCustName(dto.getCustName());
  252. repalCustomer.setCompanyId(dto.getCompanyId());
  253. }
  254. if(!ObjectUtil.equal(repalCustomer.getCustProperty(),dto.getCustProperty())){
  255. RepalOperLogContentVO contentVO = new RepalOperLogContentVO();
  256. contentVO.setPropertyName("custProperty");
  257. contentVO.setPropertyCN("客户性质");
  258. contentVO.setOldValue(String.valueOf(repalCustomer.getCustProperty()));
  259. contentVO.setNewValue(String.valueOf(dto.getCustProperty()));
  260. operLogContents.add(contentVO);
  261. repalCustomer.setCustProperty(dto.getCustProperty());
  262. }
  263. if(!ObjectUtil.equal(repalCustomer.getIndustry(),dto.getIndustry())){
  264. RepalOperLogContentVO contentVO = new RepalOperLogContentVO();
  265. contentVO.setPropertyName("industry");
  266. contentVO.setPropertyCN("所属行业");
  267. contentVO.setOldValue(repalCustomer.getIndustry());
  268. contentVO.setNewValue(dto.getIndustry());
  269. operLogContents.add(contentVO);
  270. repalCustomer.setIndustry(dto.getIndustry());
  271. }
  272. if(!ObjectUtil.equal(repalCustomer.getIndustry(),dto.getIndustry())){
  273. RepalOperLogContentVO contentVO = new RepalOperLogContentVO();
  274. contentVO.setPropertyName("address");
  275. contentVO.setPropertyCN("办公地址");
  276. contentVO.setOldValue(repalCustomer.getAddress());
  277. contentVO.setNewValue(dto.getAddress());
  278. operLogContents.add(contentVO);
  279. repalCustomer.setAddress(dto.getAddress());
  280. }
  281. if(!ObjectUtil.equal(repalCustomer.getAttachment(),dto.getAttachment())){
  282. RepalOperLogContentVO contentVO = new RepalOperLogContentVO();
  283. contentVO.setPropertyName("attachment");
  284. contentVO.setPropertyCN("附件");
  285. contentVO.setOldValue(repalCustomer.getAttachment());
  286. contentVO.setNewValue(dto.getAttachment());
  287. operLogContents.add(contentVO);
  288. repalCustomer.setAttachment(dto.getAttachment());
  289. }
  290. if(!ObjectUtil.equal(repalCustomer.getRemark(),dto.getRemark())){
  291. RepalOperLogContentVO contentVO = new RepalOperLogContentVO();
  292. contentVO.setPropertyName("remark");
  293. contentVO.setPropertyCN("备注信息");
  294. contentVO.setOldValue(repalCustomer.getRemark());
  295. contentVO.setNewValue(dto.getRemark());
  296. operLogContents.add(contentVO);
  297. repalCustomer.setRemark(dto.getRemark());
  298. }
  299. updateById(repalCustomer);
  300. if(CollUtil.isNotEmpty(dto.getCharges())){
  301. List<RepalCustChargeRel> rels = repalCustChargeRelService.list(Wrappers.lambdaQuery(RepalCustChargeRel.class).eq(RepalCustChargeRel::getCustId,dto.getCustId()));
  302. List<RepalGroupMember> members = new ArrayList<>();
  303. //删除旧负责人
  304. if(CollUtil.isNotEmpty(rels)){
  305. repalCustChargeRelService.removeByIds(rels.stream().map(RepalCustChargeRel::getId).collect(Collectors.toList()));
  306. members = repalGroupMemberService.list(Wrappers.lambdaQuery(RepalGroupMember.class)
  307. .in(RepalGroupMember::getUserId,rels.stream().map(RepalCustChargeRel::getMemberUserId).collect(Collectors.toList()))
  308. .eq(RepalGroupMember::getDeleted,Dict.DeletedStatusEnunm.否.getCode()));
  309. }
  310. List<RepalGroupMember> newMembers = repalGroupMemberService.list(Wrappers.lambdaQuery(RepalGroupMember.class)
  311. .in(RepalGroupMember::getUserId,dto.getCharges())
  312. .eq(RepalGroupMember::getDeleted,Dict.DeletedStatusEnunm.否.getCode()));
  313. //新增负责人
  314. List<RepalCustChargeRel> newRels = new ArrayList<>();
  315. for(Long relUserId: dto.getCharges()){
  316. RepalCustChargeRel rel = new RepalCustChargeRel();
  317. rel.setCustId(repalCustomer.getCustId());
  318. rel.setMemberUserId(relUserId);
  319. newRels.add(rel);
  320. }
  321. repalCustChargeRelService.saveBatch(newRels);
  322. RepalOperLogContentVO contentVO = new RepalOperLogContentVO();
  323. contentVO.setPropertyName("charges");
  324. contentVO.setPropertyCN("负责人");
  325. contentVO.setOldValue(JSON.toJSONString(members.stream().map(RepalGroupMember::getMemberUserName).collect(Collectors.toList())));
  326. contentVO.setNewValue(JSON.toJSONString(newMembers.stream().map(RepalGroupMember::getMemberUserName).collect(Collectors.toList())));
  327. operLogContents.add(contentVO);
  328. }
  329. if(CollUtil.isNotEmpty(dto.getLinks())){
  330. List<RepalLink> links = repalLinkService.list(Wrappers.lambdaQuery(RepalLink.class).eq(RepalLink::getCustId,dto.getCustId()).eq(RepalLink::getDeleted,Dict.DeletedStatusEnunm.否.getCode()));
  331. //遍历修改老数据
  332. if(CollUtil.isNotEmpty(links)){
  333. for(RepalLink repalLink:links){
  334. Optional<RepalLinkDTO> optionalRepalLink = dto.getLinks().stream().filter(x->repalLink.getId().equals(x.getId())).findFirst();
  335. if(optionalRepalLink.isPresent()){
  336. BeanUtils.copyProperties(optionalRepalLink.get(),repalLink);
  337. }else {
  338. repalLink.setDeleted(Dict.DeletedStatusEnunm.是.getCode());
  339. }
  340. repalLinkService.updateById(repalLink);
  341. }
  342. }
  343. //遍历新数据
  344. List<RepalLink> newlinks = new ArrayList<>();
  345. for(RepalLinkDTO linkDto: dto.getLinks()){
  346. if(ObjectUtil.isNotNull(linkDto.getId())){
  347. continue;
  348. }
  349. RepalLink link = new RepalLink();
  350. BeanUtils.copyProperties(linkDto,link);
  351. link.setCustId(repalCustomer.getCustId());
  352. newlinks.add(link);
  353. }
  354. repalLinkService.saveBatch(newlinks);
  355. RepalOperLogContentVO contentVO = new RepalOperLogContentVO();
  356. contentVO.setPropertyName("links");
  357. contentVO.setPropertyCN("联系人");
  358. contentVO.setOldValue(JSON.toJSONString(links));
  359. contentVO.setNewValue(JSON.toJSONString(dto.getLinks()));
  360. operLogContents.add(contentVO);
  361. }
  362. Dict.ActionCodeEnum actionCodeEnum = Dict.ActionCodeEnum.修改客户;
  363. if(Dict.custTypeEnum.供应商.getCode().equals(repalCustomer.getCustType())){
  364. actionCodeEnum = Dict.ActionCodeEnum.修改供应商;
  365. }
  366. repalBillOperLog.setActionCode(actionCodeEnum.getCode());
  367. repalBillOperLog.setUserId(userBean.getUserId());
  368. repalBillOperLog.setOperTime(LocalDateTime.now());
  369. repalBillOperLog.setBizId(String.valueOf(dto.getCustId()));
  370. repalBillOperLog.setBizType(actionCodeEnum.getBizType());
  371. repalBillOperLog.setActionName(actionCodeEnum.name());
  372. repalBillOperLog.setActionContent(JSON.toJSONString(operLogContents));
  373. repalBillOperLogService.save(repalBillOperLog);
  374. return getDetailById(dto.getCustId(),userBean,dto.getCustType());
  375. }
  376. @Override
  377. public RepalCustomerDetailVO getDetailById(Long custId,UserBean userBean,Integer custType) {
  378. //不做权限判断,默认通过列表的权限
  379. RepalCustomer repalCustomer = getById(custId);
  380. if(ObjectUtil.isNull(repalCustomer)){
  381. throw new CommonException(CodeMsg.FAILED,"客户或供应商不存在");
  382. }
  383. RepalCustomerDetailVO result = new RepalCustomerDetailVO();
  384. BeanUtils.copyProperties(repalCustomer,result);
  385. //查询负责人
  386. List<RepalCustChargeRel> rels = repalCustChargeRelService.list(Wrappers.lambdaQuery(RepalCustChargeRel.class)
  387. .eq(RepalCustChargeRel::getCustId,custId));
  388. if(CollUtil.isNotEmpty(rels)){
  389. List<RepalGroupMember> repalGroupMembers = repalGroupMemberService.list(Wrappers.lambdaQuery(RepalGroupMember.class)
  390. .in(RepalGroupMember::getUserId,rels.stream().map(RepalCustChargeRel::getMemberUserId).collect(Collectors.toList()))
  391. .eq(RepalGroupMember::getDeleted,Dict.DeletedStatusEnunm.否.getCode()));
  392. List<RepalGroupMemberVO> memberList = new ArrayList<>();
  393. result.setCharges(memberList);
  394. for(RepalGroupMember groupMember:repalGroupMembers){
  395. RepalGroupMemberVO member = new RepalGroupMemberVO();
  396. memberList.add(member);
  397. member.setMemberUserName(groupMember.getMemberUserName());
  398. member.setUserId(groupMember.getUserId());
  399. member.setId(groupMember.getId());
  400. member.setRepalGroupId(groupMember.getRepalGroupId());
  401. member.setRoleType(groupMember.getRoleType());
  402. }
  403. }
  404. // 标签
  405. if (Dict.custTypeEnum.客户.getCode().equals(custType) && StrUtil.isNotBlank(repalCustomer.getCompanyId())) {
  406. // 失信限高标签
  407. ApiDataResult<List<CreditPunishmentLabelListVO>> labelResult = dataMiddlewareService.getCreditPunishmentLabelList(new GetCreditPunishmentLabelDTO(Collections.singletonList(repalCustomer.getCompanyId())));
  408. if (Objects.nonNull(labelResult) && CollUtil.isNotEmpty(labelResult.getData())) {
  409. result.setLabelList(labelResult.getData().get(0).getLabelList());
  410. }
  411. // 财产数量
  412. ApiDataResult<List<FinanceDynamicNumVO>> financeResult = dataMiddlewareService.getFinanceDynamicNumV8List(new GetFinanceDynamicNumDTO().setCompanyIdList(Collections.singletonList(repalCustomer.getCompanyId())));
  413. if (Objects.nonNull(financeResult) && CollUtil.isNotEmpty(financeResult.getData())) {
  414. result.setAssetsNum(financeResult.getData().get(0).getFinanceDynamicNum());
  415. }
  416. // 风险数量
  417. ApiDataResult<List<CompanyRiskNumVO>> riskResult = dataMiddlewareService.getCompanyRiskNumList(new GetCompanyRiskNumDTO(Collections.singletonList(repalCustomer.getCompanyId())));
  418. if (Objects.nonNull(riskResult) && CollUtil.isNotEmpty(riskResult.getData())) {
  419. result.setRiskNum(riskResult.getData().get(0).getRiskNum());
  420. }
  421. }
  422. //账款汇总
  423. List<RepalBill> repalBills = repalBillService.list(Wrappers.lambdaQuery(RepalBill.class).eq(RepalBill::getCustomerId,custId).eq(RepalBill::getDeleted,Dict.DeletedStatusEnunm.否.getCode()));
  424. if(CollUtil.isNotEmpty(repalBills)){
  425. if(Dict.custTypeEnum.客户.getCode().equals(custType)) {
  426. result.setRepalBillCount(repalBills.size());
  427. result.setReceivableStr(repalBills.stream().map(RepalBill::getReceivable).reduce(BigDecimal.ZERO,BigDecimal::add).stripTrailingZeros().toPlainString());
  428. result.setTotalMoneyStr(repalBills.stream().map(RepalBill::getTotalMoney).reduce(BigDecimal.ZERO,BigDecimal::add).stripTrailingZeros().toPlainString());
  429. result.setTotalOverdueStr(repalBills.stream().filter(x-> RepalBillStatusEnum.OVERDUE.getCode().equals(x.getRepalBillStatus())).map(RepalBill::getReceivable).reduce(BigDecimal.ZERO,BigDecimal::add).stripTrailingZeros().toPlainString());
  430. result.setTotalReceiptStr(repalBills.stream().map(RepalBill::getReceipt).reduce(BigDecimal.ZERO,BigDecimal::add).stripTrailingZeros().toPlainString());
  431. //动态
  432. RepalBillRemindUnReadVO unRead = repalRemindHistoryService.getRemindUnReadVO(repalBills, userBean.getUserId(), null, null);
  433. if (ObjectUtil.isNotNull(unRead) && unRead.getUnreadTotalCount() > 0) {
  434. result.setDynamicCountList(Stream.of(unRead.getUnreadOverdueCount(), unRead.getUnreadRiskCount(), unRead.getUnreadRankCount(), unRead.getUnreadFinanceCount()).collect(Collectors.toList()));
  435. }
  436. }
  437. //账款记录
  438. List<RepalChangeRecord> repalChangeRecordList = repalChangeRecordService.list(Wrappers.lambdaQuery(RepalChangeRecord.class)
  439. .in(RepalChangeRecord::getRepalBillId, repalBills.stream().map(RepalBill::getId).collect(Collectors.toList()))
  440. .eq(RepalChangeRecord::getDeleted, DeletedStatusEnum.NORMAL.getCode())
  441. .orderByDesc(RepalChangeRecord::getId));
  442. if (CollUtil.isNotEmpty(repalChangeRecordList)) {
  443. result.setChangeList(repalChangeRecordList.stream().map(t -> {
  444. RepalBillDetailVO.BillMoneyChange billMoneyChange = new RepalBillDetailVO.BillMoneyChange();
  445. billMoneyChange.setChangeTime(t.getTimeCreated());
  446. billMoneyChange.setName(t.getOperUserName());
  447. billMoneyChange.setChangeAmt(t.getTransMoney().setScale(2).toString());
  448. return billMoneyChange;
  449. }).collect(Collectors.toList()));
  450. }
  451. }else {
  452. result.setRepalBillCount(0);
  453. result.setReceivableStr("0");
  454. result.setTotalMoneyStr("0");
  455. result.setTotalOverdueStr("0");
  456. result.setTotalReceiptStr("0");
  457. result.setDynamicCountList(Arrays.asList(0,0,0,0));
  458. }
  459. //联系人
  460. List<RepalLink> repalLinks = repalLinkService.list(Wrappers.lambdaQuery(RepalLink.class).eq(RepalLink::getCustId,custId).eq(RepalLink::getDeleted,Dict.DeletedStatusEnunm.否.getCode()));
  461. if(CollUtil.isNotEmpty(repalLinks)){
  462. List<RepalLinkVO> repalLinkVOs = new ArrayList<>();
  463. result.setLinks(repalLinkVOs);
  464. for(RepalLink repalLink:repalLinks){
  465. RepalLinkVO repalLinkVO = new RepalLinkVO();
  466. repalLinkVOs.add(repalLinkVO);
  467. BeanUtils.copyProperties(repalLink,repalLinkVO);
  468. }
  469. }
  470. return result;
  471. }
  472. @Override
  473. @Transactional
  474. public Boolean deleteCustomer(Long custId, UserBean userBean) {
  475. RepalCustomer repalCustomer = getById(custId);
  476. if(ObjectUtil.isNull(custId)){
  477. throw new CommonException(CodeMsg.FAILED,"客户或供应商不存在");
  478. }
  479. boolean allFlag = repalRolePermissionService.checkUserPermission(UserContextUtil.getUser().getUserId(),
  480. Dict.custTypeEnum.客户.getCode().equals(repalCustomer.getCustType()) ? PermissionEnum.UPDATE_CUST.getCode() : PermissionEnum.UPDATE_SUPPLY.getCode());
  481. if(!allFlag){
  482. throw new CommonException(CodeMsg.FAILED,"暂无此权限,可联系超级管理员在我的-成员管理页面开通");
  483. }
  484. repalCustomer.setDeleted(Dict.DeletedStatusEnunm.是.getCode());
  485. updateById(repalCustomer);
  486. //删除客户对应的账款
  487. List<RepalBill> repalBills = repalBillService.list(Wrappers.lambdaQuery(RepalBill.class)
  488. .eq(RepalBill::getCustomerId,custId)
  489. .eq(RepalBill::getDeleted, Dict.DeletedStatusEnunm.否.getCode()));
  490. if(CollUtil.isNotEmpty(repalBills)){
  491. throw new CommonException(CodeMsg.FAILED,"请先删除该"+(Dict.custTypeEnum.客户.getCode().equals(repalCustomer.getCustType()) ? Dict.custTypeEnum.客户.name() : Dict.custTypeEnum.供应商.name())+"的关联账款");
  492. }
  493. //操作记录
  494. Dict.ActionCodeEnum actionCodeEnum = Dict.ActionCodeEnum.删除客户;
  495. if(Dict.custTypeEnum.供应商.getCode().equals(repalCustomer.getCustType())){
  496. actionCodeEnum = Dict.ActionCodeEnum.删除供应商;
  497. }
  498. RepalBillOperLog repalBillOperLog = new RepalBillOperLog();
  499. repalBillOperLog.setActionCode(actionCodeEnum.getCode());
  500. repalBillOperLog.setUserId(userBean.getUserId());
  501. repalBillOperLog.setOperTime(LocalDateTime.now());
  502. repalBillOperLog.setBizId(String.valueOf(custId));
  503. repalBillOperLog.setBizType(actionCodeEnum.getBizType());
  504. repalBillOperLog.setActionName(actionCodeEnum.name());
  505. repalBillOperLogService.save(repalBillOperLog);
  506. return Boolean.TRUE;
  507. }
  508. @Override
  509. public List<RepalLinkVO> queryLink(Long custId) {
  510. List<RepalLink> repalLinks = repalLinkService.list(Wrappers.lambdaQuery(RepalLink.class).eq(RepalLink::getCustId,custId).eq(RepalLink::getDeleted,Dict.DeletedStatusEnunm.否.getCode()));
  511. List<RepalLinkVO> repalLinkVOs = new ArrayList<>();
  512. if(CollUtil.isNotEmpty(repalLinks)){
  513. for(RepalLink repalLink:repalLinks){
  514. RepalLinkVO repalLinkVO = new RepalLinkVO();
  515. repalLinkVOs.add(repalLinkVO);
  516. BeanUtils.copyProperties(repalLink,repalLinkVO);
  517. }
  518. }
  519. return repalLinkVOs;
  520. }
  521. @Override
  522. public RepalLinkVO updateLink(RepalLinkUpdateDTO dto) {
  523. RepalLinkVO result = new RepalLinkVO();
  524. //如果是添加,检查是否满额
  525. if(ObjectUtil.isNull(dto.getId())){
  526. int count = repalLinkService.count(Wrappers.lambdaQuery(RepalLink.class).eq(RepalLink::getCustId,dto.getCustId()).eq(RepalLink::getDeleted,Dict.DeletedStatusEnunm.否.getCode()));
  527. if(count > 4){
  528. throw new CommonException(CodeMsg.FAILED,"联系人已满5人");
  529. }
  530. RepalLink repalLink = new RepalLink();
  531. BeanUtils.copyProperties(dto,repalLink);
  532. repalLinkService.save(repalLink);
  533. BeanUtils.copyProperties(repalLink,result);
  534. //操作记录
  535. RepalBillOperLog repalBillOperLog = new RepalBillOperLog();
  536. List<RepalOperLogContentVO> operLogContents = new ArrayList<>();
  537. RepalOperLogContentVO contentVO = new RepalOperLogContentVO();
  538. contentVO.setPropertyName("links");
  539. contentVO.setPropertyCN("联系人");
  540. contentVO.setNewValue(JSON.toJSONString(repalLink));
  541. operLogContents.add(contentVO);
  542. Dict.ActionCodeEnum actionCodeEnum = Dict.ActionCodeEnum.修改客户;
  543. repalBillOperLog.setActionCode(actionCodeEnum.getCode());
  544. repalBillOperLog.setUserId(UserContextUtil.getUser().getUserId());
  545. repalBillOperLog.setOperTime(LocalDateTime.now());
  546. repalBillOperLog.setBizId(String.valueOf(dto.getCustId()));
  547. repalBillOperLog.setBizType(actionCodeEnum.getBizType());
  548. repalBillOperLog.setActionName(actionCodeEnum.name());
  549. repalBillOperLog.setActionContent(JSON.toJSONString(operLogContents));
  550. repalBillOperLogService.save(repalBillOperLog);
  551. }else {
  552. RepalLink repalLink = repalLinkService.getById(dto.getId());
  553. if(ObjectUtil.isNull(repalLink)){
  554. throw new CommonException(CodeMsg.FAILED,"联系人不存在");
  555. }
  556. String oldValue = JSON.toJSONString(repalLink);
  557. repalLink.setName(dto.getName());
  558. repalLink.setMobileNo(dto.getMobileNo());
  559. repalLinkService.updateById(repalLink);
  560. BeanUtils.copyProperties(repalLink,result);
  561. //操作记录
  562. RepalBillOperLog repalBillOperLog = new RepalBillOperLog();
  563. List<RepalOperLogContentVO> operLogContents = new ArrayList<>();
  564. RepalOperLogContentVO contentVO = new RepalOperLogContentVO();
  565. contentVO.setPropertyName("links");
  566. contentVO.setPropertyCN("联系人");
  567. contentVO.setOldValue(oldValue);
  568. contentVO.setNewValue(JSON.toJSONString(repalLink));
  569. operLogContents.add(contentVO);
  570. Dict.ActionCodeEnum actionCodeEnum = Dict.ActionCodeEnum.修改客户;
  571. repalBillOperLog.setActionCode(actionCodeEnum.getCode());
  572. repalBillOperLog.setUserId(UserContextUtil.getUser().getUserId());
  573. repalBillOperLog.setOperTime(LocalDateTime.now());
  574. repalBillOperLog.setBizId(String.valueOf(dto.getCustId()));
  575. repalBillOperLog.setBizType(actionCodeEnum.getBizType());
  576. repalBillOperLog.setActionName(actionCodeEnum.name());
  577. repalBillOperLog.setActionContent(JSON.toJSONString(operLogContents));
  578. repalBillOperLogService.save(repalBillOperLog);
  579. }
  580. return result;
  581. }
  582. }