ProjectDistributionAsyncService.java 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386
  1. package com.goafanti.order.service.impl;
  2. import com.goafanti.business.bo.InputRestrictProject;
  3. import com.goafanti.common.dao.*;
  4. import com.goafanti.common.enums.ChannelStatus;
  5. import com.goafanti.common.enums.NoticeStatus;
  6. import com.goafanti.common.model.*;
  7. import com.goafanti.core.shiro.token.TokenManager;
  8. import com.goafanti.order.bo.TOrderNewBo;
  9. import com.goafanti.order.bo.TOrderTaskBo;
  10. import com.goafanti.order.enums.NewProjectStatus;
  11. import com.goafanti.order.enums.OrderChangeProcess;
  12. import com.goafanti.order.enums.ProcessStatus;
  13. import com.goafanti.order.service.OrderNewService;
  14. import com.goafanti.techproject.enums.TaskState;
  15. import org.springframework.scheduling.annotation.Async;
  16. import org.springframework.stereotype.Service;
  17. import org.springframework.transaction.annotation.Transactional;
  18. import javax.annotation.Resource;
  19. import java.math.BigDecimal;
  20. import java.math.RoundingMode;
  21. import java.util.*;
  22. @Async
  23. @Service
  24. public class ProjectDistributionAsyncService {
  25. @Resource
  26. private TOrderTaskMapper tOrderTaskMapper;
  27. @Resource
  28. private OrderNewService orderNewService;
  29. @Resource
  30. private TOrderLogMapper tOrderLogMapper;
  31. @Resource
  32. private UserMapper userMapper;
  33. @Resource
  34. private UserLockReleaseMapper userLockReleaseMapper;
  35. @Resource
  36. private BusinessProjectMapper businessProjectMapper;
  37. @Resource
  38. private RestrictProjectMapper restrictProjectMapper;
  39. @Resource
  40. private UserTransferLogMapper userTransferLogMapper;
  41. @Resource
  42. private TTaskMidMapper tTaskMidMapper;
  43. @Resource
  44. private TOrderNewMapper tOrderNewMapper;
  45. @Resource
  46. private TOrderMidMapper tOrderMidMapper;
  47. @Resource
  48. private OrderExamineMapper orderExamineMapper;
  49. @Resource
  50. private AdminProjectStatisticsMapper adminProjectStatisticsMapper;
  51. @Resource
  52. private NewOrderChangeMapper newOrderChangeMapper;
  53. @Resource
  54. private UserBusinessMapper userBusinessMapper;
  55. @Resource
  56. private PublicReleaseMapper publicReleaseMapper;
  57. @Resource
  58. private UserChannelMapper userChannelMapper;
  59. @Resource
  60. private UserMidMapper userMidMapper;
  61. @Transactional
  62. public void pushProjectDistribution(Integer taskId, String taskReceiverId, Integer type, TOrderTask t, TOrderNew tn, Date date, Admin a) {
  63. List<String> aids = new ArrayList<>();
  64. aids.add(taskReceiverId);
  65. TOrderNewBo order = tOrderNewMapper.getSaleIdByOno(t.getOrderNo());
  66. orderNewService.pushGeneralSendNoticeAndEmail(aids, NoticeStatus.ORDER_TASK_TO.getCode(),order, TokenManager.getAdminId(),0, taskId);
  67. //处理项目统计表
  68. TTaskMid details = tTaskMidMapper.getDtails(taskId);
  69. if (type ==0){
  70. //设置催款触发
  71. orderNewService.pushOrderDun(tn);
  72. //未锁定客户就锁定客户
  73. pushUser(t, tn, date);
  74. //处理客户已派项目
  75. projectDistributionPushUserMid(tn);
  76. //处理限定项目状态
  77. BusinessProject businessProject = businessProjectMapper.selectById(t.getCommodityId());
  78. if (businessProject.getRestrictStatus()==1){
  79. RestrictProject use = restrictProjectMapper.selectByParam(new InputRestrictProject(tn.getBuyerId(), null, t.getCommodityId()));
  80. if (use!=null){
  81. RestrictProject newRP=new RestrictProject();
  82. newRP.setId(use.getId());
  83. newRP.setLockTime(date);
  84. newRP.setType(2);
  85. if (!use.getAid().equals(tn.getSalesmanId())){
  86. newRP.setAid(tn.getSalesmanId());
  87. }
  88. restrictProjectMapper.updateByPrimaryKeySelective(newRP);
  89. UserTransferLog log=new UserTransferLog();
  90. log.setAid(use.getAid());
  91. log.setUid(use.getUid());
  92. log.setPid(use.getPid());
  93. log.setType(20);
  94. log.setRemarks("签单触发锁定限时项目");
  95. userTransferLogMapper.insertSelective(log);
  96. } else {
  97. RestrictProject newRP=new RestrictProject();
  98. newRP.setUid(tn.getBuyerId());
  99. newRP.setAid(tn.getSalesmanId());
  100. newRP.setPid(t.getCommodityId());
  101. newRP.setLockTime(date);
  102. newRP.setType(2);
  103. restrictProjectMapper.insertSelective(newRP);
  104. }
  105. }
  106. details.setDispatchCount(t.getCommodityQuantity());
  107. details.setStockCount(t.getCommodityQuantity());
  108. }
  109. //如果不相等就切换
  110. if (!details.getDutyDep().equals(a.getDepartmentId())){
  111. details.setDutyDep(a.getDepartmentId());
  112. }
  113. tTaskMidMapper.updateByTid(details);
  114. //处理订单信息
  115. checkProjiectAllocation(t.getOrderNo());
  116. pushTaskChange(TokenManager.getAdminId(), taskReceiverId, type, t.getOrderNo());
  117. //派单后设置用户客户统计
  118. if (type ==0){
  119. updateAdminByAid(taskReceiverId);
  120. }else {
  121. updateAdminByAid(TokenManager.getAdminId(), taskReceiverId);
  122. }
  123. }
  124. public void updateAdminByAid(String aid,String aid2) {
  125. updateAdminByAid(aid);
  126. updateAdminByAid(aid2);
  127. }
  128. public void updateAdminByAid(String aid) {
  129. List<TOrderTaskBo> tOrderTaskBos = tOrderTaskMapper.selectAdminTaskByAid(aid);
  130. int htSatCount = 0,htSatScoreCount = 0,htSatNotScoreCount = 0,
  131. memberCount=0,memberScoreCount = 0,memberNotScoreCount = 0;
  132. BigDecimal ht_satSum=new BigDecimal(0);
  133. BigDecimal hySum=new BigDecimal(0);
  134. for (TOrderTaskBo tOrderTaskBo : tOrderTaskBos) {
  135. if (aid ==null) aid =tOrderTaskBo.getTaskReceiver();
  136. if (tOrderTaskBo.getcSort()==3||tOrderTaskBo.getcSort()==9){
  137. htSatCount++;
  138. if (tOrderTaskBo.getScoreStatus()==1){
  139. htSatNotScoreCount++;
  140. }else if (tOrderTaskBo.getScoreStatus()==2){
  141. htSatScoreCount++;
  142. ht_satSum=ht_satSum.add(new BigDecimal(tOrderTaskBo.getScoreNumber()));
  143. }
  144. }else if (tOrderTaskBo.getcSort()==6) {
  145. memberCount++;
  146. if (tOrderTaskBo.getScoreStatus()==1){
  147. memberNotScoreCount++;
  148. }else if (tOrderTaskBo.getScoreStatus()==2){
  149. memberScoreCount++;
  150. hySum=hySum.add(new BigDecimal(tOrderTaskBo.getScoreNumber()));
  151. }
  152. }
  153. }
  154. BigDecimal htSatScoreAverage = BigDecimal.ZERO;
  155. BigDecimal memberScoreAverage = BigDecimal.ZERO;
  156. if (htSatScoreCount>0)htSatScoreAverage=ht_satSum.divide(new BigDecimal(htSatScoreCount),2, RoundingMode.HALF_UP);
  157. if (memberScoreCount>0)memberScoreAverage=hySum.divide(new BigDecimal(memberScoreCount),2, RoundingMode.HALF_UP);
  158. AdminProjectStatistics adminProjectStatistics = adminProjectStatisticsMapper.queryByAid(aid);
  159. AdminProjectStatistics aps=new AdminProjectStatistics();
  160. aps.setAid(aid);
  161. aps.setHtSatCount(htSatCount);
  162. aps.setHtSatScoreAverage(htSatScoreAverage.doubleValue());
  163. aps.setHtSatNotScoreCount(htSatNotScoreCount);
  164. aps.setHtSatScoreCount(htSatScoreCount);
  165. aps.setMemberScoreAverage(memberScoreAverage.doubleValue());
  166. aps.setMemberScoreCount(memberScoreCount);
  167. aps.setMemberNotScoreCount(memberNotScoreCount);
  168. aps.setMemberCount(memberCount);
  169. if (adminProjectStatistics==null){
  170. adminProjectStatisticsMapper.insert(aps);
  171. }else {
  172. aps.setId(adminProjectStatistics.getId());
  173. adminProjectStatisticsMapper.update(aps);
  174. }
  175. }
  176. /**
  177. *
  178. * @param aid 操作者
  179. * @param taskReceiverId 接收方
  180. * @param type type – 0管理员派单 1经理转交 2经理派单 3咨询师转交 4回退
  181. */
  182. private void pushTaskChange(String aid, String taskReceiverId,Integer type,String orderNo) {
  183. if (type==1||type==3){
  184. orderExamineMapper.updateDimissionTransfer(aid,taskReceiverId,null,orderNo);
  185. }else if (type==2){
  186. OrderExamine o=new OrderExamine();
  187. o.setAid(taskReceiverId);
  188. o.setOrderNo(orderNo);
  189. o.setCreateTime(new Date());
  190. o.setType(0);//咨询师经理
  191. o.setStatus(0);//正常
  192. orderExamineMapper.insertSelective(o);
  193. }else if (type==4){
  194. orderExamineMapper.updateBack(aid,taskReceiverId,orderNo);
  195. }
  196. newOrderChangeMapper.updateTaskExamineName(aid,taskReceiverId, OrderChangeProcess.JSY.getCode());
  197. newOrderChangeMapper.updateTaskExamineName(aid,taskReceiverId,OrderChangeProcess.JSJL.getCode());
  198. }
  199. public void addOrderLog(String orderNo, Integer code,String remarks) {
  200. TOrderLog tl=new TOrderLog();
  201. tl.setOrderNo(orderNo);
  202. tl.setProcess(code);
  203. tl.setAid(TokenManager.getAdminId());
  204. if(null!=remarks)tl.setRemarks(remarks);
  205. tOrderLogMapper.insertSelective(tl);
  206. }
  207. public void checkProjiectAllocation(String orderNo) {
  208. TOrderNew tNew=new TOrderNew();
  209. tNew.setOrderNo(orderNo);
  210. tNew.setProcessStatus(getOrderProcessStatus(orderNo));
  211. tNew.setExamineName("");
  212. tOrderNewMapper.update(tNew);
  213. updateMidServiceProject(orderNo);
  214. }
  215. public Integer getOrderProcessStatus(String orderNo) {
  216. Integer processStatus=ProcessStatus.YPZXSGLY.getCode();
  217. List<TOrderTaskBo> taskBos=tOrderTaskMapper.selectOrderTaskAll(orderNo,4);
  218. int i=0;
  219. for (TOrderTaskBo to : taskBos) {
  220. if (to.getTaskStatus()> TaskState.UN_DISTRIBUTION.getCode()&&to.getTaskStatus()<TaskState.INVALID.getCode()) {
  221. i++;
  222. }
  223. }
  224. if (i==taskBos.size()) {
  225. processStatus=ProcessStatus.YQBFPZXSGLY.getCode();
  226. }else if(i>0&&i<taskBos.size()){
  227. processStatus=ProcessStatus.YBFPZXSGLY.getCode();
  228. }else if(i==0){
  229. processStatus=ProcessStatus.YPZXSGLY.getCode();
  230. }
  231. return processStatus;
  232. }
  233. public void updateMidServiceProject(String orderNo) {
  234. List<TOrderTaskBo> taskBos = tOrderTaskMapper.selectOrderTaskAll(orderNo, 4);
  235. if (!taskBos.isEmpty()){
  236. List<String > cp=new ArrayList<>();
  237. List<String > cc=new ArrayList<>();
  238. StringBuilder ps=new StringBuilder();
  239. StringBuilder cs=new StringBuilder();
  240. for (TOrderTaskBo taskBo : taskBos) {
  241. if (!cp.contains(taskBo.getCommodityName())){
  242. cp.add(taskBo.getCommodityName());
  243. ps.append(taskBo.getCommodityName());
  244. String str= NewProjectStatus.getValueByCode(taskBo.getProjectStatus());
  245. String contacts=taskBo.getContacts()!=null?taskBo.getContacts():"暂无";
  246. ps.append("-").append(str).append("-").append(contacts).append(",");
  247. }
  248. if (!cc.contains(taskBo.getCname())){
  249. cc.add(taskBo.getCname());
  250. cs.append(taskBo.getCname()).append(",");
  251. }
  252. }
  253. TOrderMid tOrderMid = new TOrderMid();
  254. tOrderMid.setOrderNo(orderNo);
  255. if (ps.length()>1)tOrderMid.setServiceProject(ps.substring(0,ps.length()-1));
  256. if (ps.length()>1)tOrderMid.setServiceType(cs.substring(0,cs.length()-1));
  257. tOrderMidMapper.updateByOrderNo(tOrderMid);
  258. }
  259. }
  260. /**
  261. * 推动客户、业务渠道的锁定
  262. */
  263. private void pushUser(TOrderTask t, TOrderNew tn, Date date) {
  264. if (userMapper.checkLock(tn.getBuyerId())<1) {
  265. User user = userMapper.queryById(tn.getBuyerId());
  266. //新增如果不是渠道才转换时间和改成签单
  267. if (user!=null&&user.getNewChannel()!=1){
  268. //签单改成刷新客户跟进时间
  269. userLockReleaseMapper.updateByAidAndUid(tn.getBuyerId());
  270. userMapper.updateShareType(tn.getBuyerId(),tn.getSalesmanId());
  271. }
  272. }
  273. //判定用户最后签单时间
  274. pushSignTime(tn);
  275. //未锁定业务就锁定业务
  276. if (userLockReleaseMapper.checkLock(tn.getSalesmanId(),tn.getBuyerId(),t.getCommodityId())<1) {
  277. UserLockRelease ulr=new UserLockRelease();
  278. ulr.setId(UUID.randomUUID().toString());
  279. ulr.setBusinessProjectId(t.getCommodityId());
  280. ulr.setType(1);
  281. ulr.setUid(tn.getBuyerId());
  282. ulr.setAid(tn.getSalesmanId());
  283. ulr.setStatus(0);
  284. ulr.setLockTime(date);
  285. userLockReleaseMapper.insertSelective(ulr);
  286. }
  287. int i = userBusinessMapper.judgeBusiness(tn.getBuyerId(), t.getCommodityId(), tn.getSalesmanId());
  288. UserBusiness ub=new UserBusiness();
  289. ub.setId(UUID.randomUUID().toString());
  290. ub.setUid(tn.getBuyerId());
  291. ub.setAid(tn.getSalesmanId());
  292. ub.setFollowSituation(5);
  293. ub.setCustomerStatus(4);
  294. ub.setUpdateTime(date);
  295. ub.setRemarks("派单自动锁定客户");
  296. ub.setBusinessProjectId(t.getCommodityId());
  297. if (i>0){
  298. userBusinessMapper.updateByPrimaryKeySelective(ub);
  299. }else {
  300. ub.setCreateTime(date);
  301. userBusinessMapper.insertSelective(ub);
  302. }
  303. //如果是渠道客户更新渠道表
  304. UserChannel uc=new UserChannel();
  305. uc.setUid(tn.getBuyerId());
  306. uc.setStatus(ChannelStatus.YQD.getCode());
  307. uc.setSignTime(date);
  308. userChannelMapper.updateByUid(uc);
  309. //标记最新的打卡
  310. publicReleaseMapper.updateSignByAidAndUid(tn.getBuyerId(),tn.getSalesmanId());
  311. }
  312. private void pushSignTime(TOrderNew tn) {
  313. List<TOrderNewBo> tOrderNewBos = tOrderNewMapper.selectByuidandAid(tn.getBuyerId(), tn.getSalesmanId());
  314. Date lastSigningTime= tn.getSignTime();
  315. if (!tOrderNewBos.isEmpty()){
  316. for (TOrderNewBo e : tOrderNewBos) {
  317. if(e.getSignTime()!=null){
  318. if (e.getSignTime().getTime()>lastSigningTime.getTime()){
  319. lastSigningTime = e.getSignTime();
  320. }
  321. }
  322. }
  323. }
  324. User u=new User();
  325. u.setId(tn.getBuyerId());
  326. u.setSignTime(lastSigningTime);
  327. userMapper.update(u);
  328. }
  329. private void projectDistributionPushUserMid(TOrderNew tn) {
  330. if (Objects.equals(tn.getProcessStatus(), ProcessStatus.YPZXSGLY.getCode())){
  331. UserMid um=new UserMid();
  332. String taskNames=userMidMapper.getUserTaskNames(tn.getBuyerId());
  333. UserMid use=userMidMapper.getUserDtails(tn.getBuyerId());
  334. um.setUid(tn.getBuyerId());
  335. um.setTaskNames(taskNames);
  336. um.setLastSigningTime(tn.getCreateTime());
  337. if(tn.getSalesType()!=null){
  338. um.setLastSalesType(tn.getSalesType());
  339. }
  340. BigDecimal signAmount;
  341. int signNumber;
  342. if (use!=null){
  343. if (use.getFirstSigningTime() != null) {
  344. um.setFirstSigningTime(use.getFirstSigningTime()); }
  345. if (use.getSignAmount() != null) {
  346. signAmount=use.getSignAmount().add(tn.getTotalAmount());
  347. }else{
  348. signAmount=new BigDecimal(0).add(tn.getTotalAmount());
  349. }
  350. if (use.getSignNumber()!=null){
  351. signNumber=use.getSignNumber()+1;
  352. }else {
  353. signNumber=1;
  354. }
  355. }else {
  356. signAmount=new BigDecimal(0).add(tn.getTotalAmount());
  357. signNumber=1;
  358. }
  359. um.setSignAmount(signAmount);
  360. um.setSignNumber(signNumber);
  361. userMidMapper.updateByUid(um);
  362. }
  363. }
  364. }