AdminStatisticsServiceImpl.java 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689
  1. package com.goafanti.admin.service.impl;
  2. import com.goafanti.admin.bo.*;
  3. import com.goafanti.admin.service.AdminStatisticsService;
  4. import com.goafanti.common.constant.AFTConstants;
  5. import com.goafanti.common.dao.*;
  6. import com.goafanti.common.error.BusinessException;
  7. import com.goafanti.common.model.*;
  8. import com.goafanti.common.utils.DateUtils;
  9. import com.goafanti.common.utils.LoggerUtils;
  10. import com.goafanti.core.shiro.token.TokenManager;
  11. import org.springframework.cache.annotation.CacheEvict;
  12. import org.springframework.cache.annotation.Cacheable;
  13. import org.springframework.stereotype.Service;
  14. import javax.annotation.Resource;
  15. import java.math.BigDecimal;
  16. import java.math.RoundingMode;
  17. import java.time.LocalDate;
  18. import java.time.ZoneId;
  19. import java.time.format.DateTimeFormatter;
  20. import java.util.*;
  21. @Service
  22. public class AdminStatisticsServiceImpl implements AdminStatisticsService {
  23. @Resource
  24. private AdminMapper adminMapper;
  25. @Resource
  26. private PublicReleaseMapper publicReleaseMapper;
  27. @Resource
  28. private FinanceCountMapper financeCountMapper;
  29. @Resource
  30. private CallLogMapper callLogMapper;
  31. @Resource
  32. private SalesTeamMapper salesTeamMapper;
  33. @Resource
  34. private AdminCallDayMapper adminCallDayMapper;
  35. @Resource
  36. private UserFollowMapper userFollowMapper;
  37. @Resource
  38. private DepartmentMapper departmentMapper;
  39. @Override
  40. public Object info( String startTime, String endTime) {
  41. String aid=TokenManager.getAdminId();
  42. endTime=endTime+" 23:59:59";
  43. //不再计算私有,签单,渠道
  44. AdminStatisticsBo adminStatisticsBo = adminMapper.adminStatisticsInfo(aid);
  45. if (adminStatisticsBo==null){
  46. adminStatisticsBo=new AdminStatisticsBo();
  47. }else {
  48. //从客户中计算再添加到adminStatisticsBo
  49. AdminStatisticsBo ListCount = adminMapper.selectUserCount(aid, null, null);
  50. adminStatisticsBo.setPrivateSum(ListCount.getPrivateSum());
  51. adminStatisticsBo.setSignSum(ListCount.getSignSum());
  52. adminStatisticsBo.setChannelSum(ListCount.getChannelSum());
  53. //计算公出次数
  54. Integer publicSum = publicReleaseMapper.selectCountByaidAndDate(aid, null, null);
  55. adminStatisticsBo.setPublicReleaseSum(publicSum);
  56. //计算跟进次数
  57. Integer followSum = userFollowMapper.selectByaidAndDate(aid, null, null);
  58. adminStatisticsBo.setFollowSum(followSum);
  59. }
  60. if (adminStatisticsBo.getReceivables()==null) adminStatisticsBo.setReceivables(new BigDecimal(0));
  61. AdminStatisticsBo asb = adminMapper.adminStatisticsInfoByTime(aid, startTime, endTime);
  62. if (asb==null) {
  63. adminStatisticsBo.setRangePrivateSum(0);
  64. adminStatisticsBo.setRangeSignSum(0);
  65. adminStatisticsBo.setRangeChannelSum(0);
  66. adminStatisticsBo.setRangeFollowSum(0);
  67. adminStatisticsBo.setRangeOrderSum(0);
  68. }else {
  69. adminStatisticsBo.setRangeFollowSum(asb.getRangeFollowSum());
  70. adminStatisticsBo.setRangeOrderSum(asb.getRangeOrderSum());
  71. //从客户中计算再添加到adminStatisticsBo
  72. AdminStatisticsBo ListCount = adminMapper.selectUserCount(aid, startTime, endTime);
  73. adminStatisticsBo.setRangePrivateSum(ListCount.getPrivateSum());
  74. adminStatisticsBo.setRangeSignSum(ListCount.getSignSum());
  75. adminStatisticsBo.setRangeChannelSum(ListCount.getChannelSum());
  76. }
  77. Integer rangePublicReleaseSum=adminMapper.adminStatisticsPublicReleaseByAidAndTime(aid, startTime, endTime);
  78. if (rangePublicReleaseSum==null)rangePublicReleaseSum=0;
  79. adminStatisticsBo.setRangePublicReleaseSum(rangePublicReleaseSum);
  80. BigDecimal rangeReceivables=adminMapper.addAdminContactsRangeReceivables(aid,startTime,endTime);
  81. adminStatisticsBo.setRangeReceivables(rangeReceivables);
  82. //添加外呼数据
  83. AdminStatisticsBo as = adminCallDayMapper.selectByAidCount(aid, startTime, endTime);
  84. if (as !=null){
  85. if (as.getCallSum()!=null)adminStatisticsBo.setCallSum(as.getCallSum());
  86. if (as.getCallDurationSum()!=null)adminStatisticsBo.setCallDurationSum(as.getCallDurationSum());
  87. if (as.getConnectSum()!=null)adminStatisticsBo.setConnectSum(as.getConnectSum());
  88. if (as.getValidSum()!=null)adminStatisticsBo.setValidSum(as.getValidSum());
  89. }else {
  90. adminStatisticsBo.setCallSum(0);
  91. adminStatisticsBo.setCallDurationSum(BigDecimal.ZERO);
  92. adminStatisticsBo.setConnectSum(0);
  93. adminStatisticsBo.setValidSum(0);
  94. }
  95. //添加销售团队数据
  96. statisticsSalesTeam(adminStatisticsBo,aid,startTime,endTime);
  97. return adminStatisticsBo;
  98. }
  99. private void statisticsSalesTeam(AdminStatisticsBo res,String aid ,String startTime,String endTime) {
  100. List<String> list =new ArrayList<>();
  101. List<SalesTeam> salesTeams = salesTeamMapper.queryByAid(aid);
  102. //如果不是团队负责人,所有数据都为null
  103. if (salesTeams.isEmpty()){
  104. res.setTeamPeopleSum(null);
  105. res.setTeamCallSum(null);
  106. res.setTeamCallDurationSum(null);
  107. return;
  108. }
  109. //先获取顶层再迭代获取每一层
  110. for (SalesTeam e : salesTeams) {
  111. List<Admin> admins = adminMapper.queryByTeamId(e.getId());
  112. admins.stream().forEach(e1 -> {
  113. list.add(e1.getId());
  114. });
  115. addSonSalesTeam(list,e);
  116. }
  117. Set<String> set = new HashSet<>(list);
  118. int teamCallSum=0;
  119. int teamConnectSum=0;
  120. int teamValidSum=0;
  121. BigDecimal teamCallDurationSum=BigDecimal.ZERO;
  122. for (String s : set) {
  123. AdminStatisticsBo as = adminCallDayMapper.selectByAidCount(s, startTime, endTime);
  124. if (as != null) {
  125. if (as.getCallSum()!= null) teamCallSum = teamCallSum + as.getCallSum();
  126. if (as.getCallDurationSum()!= null) teamCallDurationSum = teamCallDurationSum.add(as.getCallDurationSum());
  127. if (as.getConnectSum() !=null) teamConnectSum = teamConnectSum + as.getConnectSum();
  128. if (as.getValidSum()!=null) teamValidSum = teamValidSum + as.getValidSum();
  129. }
  130. }
  131. res.setTeamPeopleSum(set.size());
  132. res.setTeamCallSum(teamCallSum);
  133. res.setTeamConnectSum(teamConnectSum);
  134. res.setTeamValidSum(teamValidSum);
  135. res.setTeamCallDurationSum(teamCallDurationSum);
  136. }
  137. /**
  138. *
  139. * @param list
  140. * @param res
  141. */
  142. private void addSonSalesTeam(List<String> list, SalesTeam res) {
  143. List<SalesTeam> salesTeams = salesTeamMapper.queryBySuperId(res.getId());
  144. if (!salesTeams.isEmpty()){
  145. for (SalesTeam e : salesTeams) {
  146. List<Admin> admins = adminMapper.queryByTeamId(e.getId());
  147. admins.stream().forEach(e1 -> {
  148. list.add(e1.getId());
  149. });
  150. addSonSalesTeam(list,e);
  151. }
  152. }
  153. }
  154. @Override
  155. // @Cacheable(value = "adminStatisticeLists#300", key = "'key:'+#aid")
  156. public Object lists(String aid) {
  157. //获取当月的列表
  158. Map<String,Object> map=new HashMap<>();
  159. Days days = new Days();
  160. List<String> thisMonth = getThisMonth(days);
  161. List<AdminUserCount> userList = adminMapper.thisMonthUser(days.firstDay,days.endDay, aid);
  162. List<Integer> signList=new ArrayList<>();
  163. List<Integer> privateList=new ArrayList<>();
  164. List<Integer> channelList=new ArrayList<>();
  165. List<Integer> userFollowList=new ArrayList<>();
  166. List<Integer> orderList=new ArrayList<>();
  167. List<Integer> publicReleaseList=new ArrayList<>();
  168. int signCount=0,privateCount=0,channelCount=0,followCount=0,orderCount=0,publicReleaseCount=0;
  169. for (String dates : thisMonth) {
  170. boolean flag=true;
  171. for (AdminUserCount e : userList) {
  172. String formatDate = DateUtils.formatDate(e.getDateTime(), AFTConstants.YYYYMMDD);
  173. if (dates.equals(formatDate)){
  174. signCount=signCount+e.getSignCount();
  175. int newSign=signCount;
  176. signList.add(newSign);
  177. privateCount=privateCount+e.getPrivateCount();
  178. int newPrivate=privateCount;
  179. privateList.add(newPrivate);
  180. channelCount=channelCount+e.getChannelCount();
  181. int newChannel=channelCount;
  182. channelList.add(newChannel);
  183. followCount=followCount+e.getFollowCount();
  184. int newFollow=followCount;
  185. userFollowList.add(newFollow);
  186. orderCount=orderCount+e.getOrderCount();
  187. int newOrder=orderCount;
  188. orderList.add(newOrder);
  189. publicReleaseCount=publicReleaseCount+e.getPublicReleaseCount();
  190. int newPublicRelease=publicReleaseCount;
  191. publicReleaseList.add(newPublicRelease);
  192. flag=false;
  193. }
  194. }
  195. if (flag){
  196. signList.add(signCount);
  197. privateList.add(privateCount);
  198. channelList.add(channelCount);
  199. userFollowList.add(followCount);
  200. orderList.add(orderCount);
  201. publicReleaseList.add(publicReleaseCount);
  202. }
  203. }
  204. map.put("dates",thisMonth);
  205. map.put("signList",signList);
  206. map.put("privateList",privateList);
  207. map.put("channelList",channelList);
  208. //跟进数
  209. map.put("userFollowList",userFollowList);
  210. //订单数
  211. map.put("orderList",orderList);
  212. //公出企业数
  213. map.put("publicReleaseList",publicReleaseList);
  214. return map;
  215. }
  216. @Override
  217. public Object consultantInfo(String startTime, String endTime) {
  218. String aid=TokenManager.getAdminId();
  219. endTime=endTime+" 23:59:59";
  220. Integer shiroType=2;
  221. if(TokenManager.hasRole(AFTConstants.TECH)){
  222. shiroType=0;
  223. }else if(TokenManager.hasRole(AFTConstants.TECH_MANAGER)){
  224. shiroType=1;
  225. }
  226. ConsultantStatisticsBo res = adminMapper.consultantStatisticsInfo(aid,shiroType);
  227. if (res == null) res=new ConsultantStatisticsBo();
  228. if (res.getCountPublicRelease()==null)res.setCountPublicRelease(0);
  229. if (res.getOrderPayment()==null)res.setOrderPayment(0);
  230. ConsultantStatisticsBo asb = adminMapper.consultantStatisticsInfoByTime(aid, startTime, endTime);
  231. if (asb!=null){
  232. res.setRangeProjectCount(asb.getProjectCount());
  233. res.setRangeInProgress(asb.getInProgress());
  234. res.setRangeNotStarted(asb.getNotStarted());
  235. res.setRangeComplete(asb.getComplete());
  236. res.setRangeStop(asb.getStop());
  237. res.setRangeCountPublicRelease(asb.getCountPublicRelease());
  238. res.setRangeCountAssist(asb.getCountAssist());
  239. }
  240. return res;
  241. }
  242. @Override
  243. public Object consultantLists(String aid) {
  244. //获取当月的列表
  245. Map<String,Object> map=new LinkedHashMap<>();
  246. Days days = new Days();
  247. List<String> thisMonth = getThisMonth(days);
  248. List<ConsultantUserCount> list = adminMapper.consultantthisMonthUser(days.firstDay,days.endDay, aid);
  249. List<Integer> projectCountList =new ArrayList<>();
  250. List<Integer> inProgressList =new ArrayList<>();
  251. List<Integer> notStartedList =new ArrayList<>();
  252. List<Integer> completeList =new ArrayList<>();
  253. List<Integer> stopList =new ArrayList<>();
  254. List<Integer> publicReleaseCountList =new ArrayList<>();
  255. List<Integer> assistCountList =new ArrayList<>();
  256. int projectCount=0,inProgressCount=0,notStartedCount=0,completeCount=0,stopCount=0,publicReleaseCount=0,
  257. assistCount=0;
  258. for (String dates : thisMonth) {
  259. for (ConsultantUserCount e : list) {
  260. if (e.getDates().equals(dates)){
  261. projectCount=projectCount+e.getProjectCount();
  262. inProgressCount=inProgressCount+e.getInProgress();
  263. notStartedCount=notStartedCount+e.getNotStarted();
  264. completeCount=completeCount+e.getComplete();
  265. stopCount=stopCount+e.getStop();
  266. publicReleaseCount=publicReleaseCount+e.getCountPublicRelease();
  267. assistCount=assistCount+e.getCountAssist();
  268. }
  269. }
  270. projectCountList.add(projectCount);
  271. inProgressList.add(inProgressCount);
  272. notStartedList.add(notStartedCount);
  273. completeList.add(completeCount);
  274. stopList.add(stopCount);
  275. publicReleaseCountList.add(publicReleaseCount);
  276. assistCountList.add(assistCount);
  277. }
  278. map.put("dates",thisMonth);
  279. map.put("projectCountList",projectCountList);
  280. map.put("inProgressList",inProgressList);
  281. map.put("notStartedList",notStartedList);
  282. map.put("completeList",completeList);
  283. map.put("stopList",stopList);
  284. map.put("publicReleaseCountList",publicReleaseCountList);
  285. map.put("assistCountList",assistCountList);
  286. return map;
  287. }
  288. @Override
  289. public Object financeInfo(String startTime, String endTime) {
  290. String aid = TokenManager.getAdminId();
  291. OutFinanceCount financeCount=adminMapper.financeInfo(aid, startTime, endTime);
  292. if (financeCount==null)financeCount= new OutFinanceCount();
  293. String endDate =endTime+" 23:59:59";
  294. Integer rangePublicCount = publicReleaseMapper.selectCountByaidAndDate(aid, startTime, endDate);
  295. if (rangePublicCount==null) rangePublicCount=0;
  296. financeCount.setRangePublicCount(rangePublicCount);
  297. BigDecimal rangeReceivables=adminMapper.selectFinanceReceivablesCount(aid,startTime,endDate);
  298. if (rangeReceivables==null)rangeReceivables=new BigDecimal(0);
  299. financeCount.setRangeReceivables(rangeReceivables);
  300. OutFinanceCount outFinanceCount = adminMapper.selectFinanceChangeCount(aid);
  301. if (outFinanceCount==null) outFinanceCount= new OutFinanceCount();
  302. if (outFinanceCount.getChangeCount()==null)outFinanceCount.setChangeCount(0);
  303. if (outFinanceCount.getChangeInvoiceCount()==null)outFinanceCount.setChangeInvoiceCount(0);
  304. financeCount.setChangeCount(outFinanceCount.getChangeCount());
  305. financeCount.setChangeInvoiceCount(outFinanceCount.getChangeInvoiceCount());
  306. return financeCount;
  307. }
  308. @Override
  309. public Object financeLists(String aid) {
  310. //获取当月的列表
  311. Map<String,Object> map=new LinkedHashMap<>();
  312. Days days = new Days();
  313. List<String> thisMonth = getThisMonth(days);
  314. List<Integer> orderList=new ArrayList<>();
  315. List<Integer> expenseList=new ArrayList<>();
  316. List<Integer> invoiceList=new ArrayList<>();
  317. List<Integer> memberList=new ArrayList<>();
  318. List<Integer> paymentList=new ArrayList<>();
  319. List<Integer> publicList=new ArrayList<>();
  320. List<OutFinanceCount> financeCounts = financeCountMapper.financeLists(aid, days.firstDay, days.endDay+" 23:59:59");
  321. List<OutFinanceCount> pList = publicReleaseMapper.selectByaidAndDate(aid, days.firstDay, days.endDay + " 23:59:59");
  322. int orderCount=0,expenseCount=0, invoiceCount=0,memberCount=0,paymentCount=0,publicCount=0;
  323. for (String e : thisMonth) {
  324. for (OutFinanceCount f : financeCounts) {
  325. if (e.equals(f.getDates())){
  326. orderCount+=f.getOrderCount();
  327. expenseCount+=f.getExpenseCount();
  328. invoiceCount+=f.getInvoiceCount();
  329. memberCount+=f.getMemberCount();
  330. paymentCount+=f.getPaymentCount();
  331. }
  332. }
  333. for (OutFinanceCount p : pList) {
  334. if (e.equals(p.getDates())){
  335. publicCount+=p.getPublicCount();
  336. }
  337. }
  338. orderList.add(orderCount);
  339. expenseList.add(expenseCount);
  340. invoiceList.add(invoiceCount);
  341. memberList.add(memberCount);
  342. paymentList.add(paymentCount);
  343. publicList.add(publicCount);
  344. }
  345. map.put("dates",thisMonth);
  346. map.put("orderList",orderList);
  347. map.put("expenseList",expenseList);
  348. map.put("invoiceList",invoiceList);
  349. map.put("memberList",memberList);
  350. map.put("paymentList",paymentList);
  351. map.put("publicList",publicList);
  352. return map;
  353. }
  354. @Override
  355. @Cacheable(value = "salesTeam#600", key = "'key:'+#aid+'_'+#startTime+'_'+#endTime")
  356. public Object salesTeam(String aid,String startTime, String endTime) {
  357. endTime=endTime+" 23:59:59";
  358. List<SalesTeamBo> resList=new ArrayList<>();
  359. List<SalesTeam> salesTeams=new ArrayList<>();
  360. if (TokenManager.hasRole(AFTConstants.SUPERADMIN)){
  361. List<SalesTeamBo> salesTeamLvlList = salesTeamMapper.findSalesTeamLvlList(1);
  362. salesTeams.addAll(salesTeamLvlList);
  363. }else {
  364. salesTeams= salesTeamMapper.queryByAid(aid);
  365. }
  366. //如果不是团队负责人,所有数据都为null
  367. int teamCallSum=0;
  368. int teamConnectSum=0;
  369. int teamValidSum=0;
  370. BigDecimal teamCallDurationSum=BigDecimal.ZERO;
  371. //先计算负责人
  372. // AdminStatisticsBo ab=adminCallDayMapper.selectByAidCount(aid,startTime,endTime);
  373. // if (ab!= null) {
  374. // if (ab.getCallSum()!= null) teamCallSum = teamCallSum + ab.getCallSum();
  375. // if (ab.getCallDurationSum()!= null) teamCallDurationSum = teamCallDurationSum.add(ab.getCallDurationSum());
  376. // if (ab.getConnectSum()!= null) teamConnectSum = teamConnectSum + ab.getConnectSum();
  377. // if (ab.getValidSum()!= null) teamValidSum = teamValidSum + ab.getValidSum();
  378. // }
  379. if (!salesTeams.isEmpty()){
  380. //先获取顶层再迭代获取每一层
  381. for (SalesTeam e : salesTeams) {
  382. SalesTeamBo salesTeamBo = new SalesTeamBo(e);
  383. //再计算所有成员
  384. List<Admin> admins = adminMapper.queryByTeamId(e.getId());
  385. for (Admin e2 : admins) {
  386. AdminStatisticsBo as=adminCallDayMapper.selectByAidCount(e2.getId(), startTime,endTime);
  387. if (as != null) {
  388. if (as.getCallSum()!= null) teamCallSum = teamCallSum + as.getCallSum();
  389. if (as.getCallDurationSum()!= null) teamCallDurationSum = teamCallDurationSum.add(as.getCallDurationSum());
  390. if (as.getConnectSum()!= null) teamConnectSum = teamConnectSum + as.getConnectSum();
  391. if (as.getValidSum()!= null) teamValidSum = teamValidSum + as.getValidSum();
  392. }
  393. }
  394. salesTeamBo.setTeamCallSum(teamCallSum);
  395. salesTeamBo.setTeamCallDurationSum(teamCallDurationSum);
  396. salesTeamBo.setTeamPeopleSum(admins.size());
  397. salesTeamBo.setTeamConnectSum(teamConnectSum);
  398. salesTeamBo.setTeamValidSum(teamValidSum);
  399. resList.add(salesTeamBo);
  400. addSonTeam(resList,salesTeamBo,startTime,endTime);
  401. }
  402. }
  403. return resList;
  404. }
  405. @Override
  406. @CacheEvict(value = "salesTeam#600", allEntries = true)
  407. public Object salesTeamClean() {
  408. LoggerUtils.debug(getClass(),"营销团队缓存清理");
  409. return 1;
  410. }
  411. private void addSonTeam(List<SalesTeamBo>list, SalesTeamBo salesTeamBo, String startTime, String endTime) {
  412. List<SalesTeam> salesTeams = salesTeamMapper.queryBySuperId(salesTeamBo.getId());
  413. if (!salesTeams.isEmpty()){
  414. //计算所有子项数据
  415. for (SalesTeam e : salesTeams) {
  416. SalesTeamBo salesTeamBo2 = new SalesTeamBo(e);
  417. int teamCallSum=0;
  418. int teamConnectSum=0;
  419. int teamValidSum=0;
  420. BigDecimal teamCallDurationSum=BigDecimal.ZERO;
  421. //先计算负责人
  422. // AdminStatisticsBo ab=callLogMapper.selectAdminCallSum(e.getAid(),startTime,endTime);
  423. // if (ab!= null) {
  424. // if (ab.getCallSum()!= null) teamCallSum = teamCallSum + ab.getCallSum();
  425. // if (ab.getCallDurationSum()!= null) teamCallDurationSum = teamCallDurationSum.add(ab.getCallDurationSum());
  426. // if (ab.getConnectSum()!= null) teamConnectSum = teamConnectSum + ab.getConnectSum();
  427. // if (ab.getValidSum()!= null) teamValidSum = teamValidSum + ab.getValidSum();
  428. // }
  429. List<Admin> admins = adminMapper.queryByTeamId(e.getId());
  430. for (Admin admin : admins) {
  431. AdminStatisticsBo as=callLogMapper.selectAdminCallSum(admin.getId(),startTime,endTime);
  432. if (as!= null) {
  433. if (as.getCallSum()!= null) teamCallSum = teamCallSum + as.getCallSum();
  434. if (as.getCallDurationSum()!= null) teamCallDurationSum = teamCallDurationSum.add(as.getCallDurationSum());
  435. if (as.getConnectSum()!= null) teamConnectSum = teamConnectSum + as.getConnectSum();
  436. if (as.getValidSum()!= null) teamValidSum = teamValidSum + as.getValidSum();
  437. }
  438. }
  439. salesTeamBo2.setTeamCallSum(teamCallSum);
  440. salesTeamBo2.setTeamCallDurationSum(teamCallDurationSum);
  441. salesTeamBo2.setTeamConnectSum(teamConnectSum);
  442. salesTeamBo2.setTeamValidSum(teamValidSum);
  443. salesTeamBo2.setTeamPeopleSum(admins.size());
  444. //迭代计算并赋值给上一层
  445. addSonTeam(list,salesTeamBo2,startTime,endTime);
  446. if (salesTeamBo2.getTeamPeopleSum()!=null)salesTeamBo.setTeamPeopleSum(salesTeamBo.getTeamPeopleSum() + salesTeamBo2.getTeamPeopleSum());
  447. if (salesTeamBo2.getTeamCallSum()!=null)salesTeamBo.setTeamCallSum(salesTeamBo.getTeamCallSum()+salesTeamBo2.getTeamCallSum());
  448. if (salesTeamBo2.getTeamCallDurationSum()!=null)salesTeamBo.setTeamCallDurationSum(salesTeamBo.getTeamCallDurationSum().add(salesTeamBo2.getTeamCallDurationSum()));
  449. if (salesTeamBo2.getTeamConnectSum()!=null)salesTeamBo.setTeamConnectSum(salesTeamBo.getTeamConnectSum()+salesTeamBo2.getTeamConnectSum());
  450. if (salesTeamBo2.getTeamValidSum()!=null)salesTeamBo.setTeamValidSum(salesTeamBo.getTeamValidSum()+salesTeamBo2.getTeamValidSum());
  451. list.add(salesTeamBo2);
  452. }
  453. }
  454. }
  455. public List<String> getThisMonth(Days days) {
  456. //获取三十天前的日期
  457. Date date=new Date();
  458. Calendar ca=Calendar.getInstance();
  459. ca.setTime(date);
  460. ca.add(Calendar.DAY_OF_MONTH,-30);
  461. days.setFirstDay(DateUtils.formatDate(ca.getTime(),AFTConstants.YYYYMMDD));
  462. List<String> list=new ArrayList<>();
  463. for (int i=0;i<31;i++){
  464. if (i==0){
  465. Calendar newc=Calendar.getInstance();
  466. newc.setTime(ca.getTime());
  467. list.add(DateUtils.formatDate(newc.getTime(), AFTConstants.YYYYMMDD));
  468. }else {
  469. ca.add(Calendar.DAY_OF_MONTH,1);
  470. ca.set(Calendar.HOUR_OF_DAY,0);
  471. if (ca.getTimeInMillis()<date.getTime()){
  472. Calendar newc=Calendar.getInstance();
  473. newc.setTime(ca.getTime());
  474. days.setEndDay(DateUtils.formatDate(newc.getTime(), AFTConstants.YYYYMMDD));
  475. list.add(days.getEndDay());
  476. }
  477. }
  478. }
  479. return list;
  480. }
  481. class Days{
  482. private String firstDay;
  483. private String endDay;
  484. public String getFirstDay() {
  485. return firstDay;
  486. }
  487. public void setFirstDay(String firstDay) {
  488. this.firstDay = firstDay;
  489. }
  490. public String getEndDay() {
  491. return endDay;
  492. }
  493. public void setEndDay(String endDay) {
  494. this.endDay = endDay;
  495. }
  496. }
  497. /**
  498. * 月份数据
  499. * @return
  500. */
  501. @Override
  502. public Map<String,Object> monthData(String dateStr) {
  503. DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
  504. LocalDate localDate =LocalDate.parse(dateStr,formatter);
  505. LocalDate endDate = localDate.plusMonths(1);
  506. List<PublicRelease> publicReleases = publicReleaseMapper.selectByMonth(localDate, endDate,null);
  507. List<PublicRelease> publicReleases2 = publicReleaseMapper.selectByMonth(localDate, endDate,1);
  508. List<AdminPublicDuration> list=new ArrayList<>();
  509. List<String> errors=new ArrayList<>();
  510. for (PublicRelease e : publicReleases) {
  511. AdminPublicDuration a = new AdminPublicDuration();
  512. pushAdminNameAndProvince(e.getAid(),a);
  513. //计算时间差,再加一天就是一共多少天
  514. long daysBetween = DateUtils.getDaysBetween(e.getReleaseStart(), e.getReleaseEnd());
  515. daysBetween+=1;
  516. if (daysBetween==1){
  517. a.setId(e.getAid());
  518. a.setDate(e.getReleaseStart());
  519. a.setDuration(e.getDuration());
  520. list.add(a);
  521. }else if(daysBetween>0){
  522. double v = e.getDuration() / daysBetween;
  523. for (int i = 0; i < daysBetween; i++) {
  524. LocalDate localDate1 = e.getReleaseStart().toInstant().atZone(ZoneId.systemDefault()).toLocalDate().plusDays(i);
  525. if (localDate1.isBefore(endDate)){
  526. a.setId(e.getAid());
  527. a.setDate(Date.from(localDate1.atStartOfDay(ZoneId.systemDefault()).toInstant()));
  528. a.setDuration(v);
  529. list.add(a);
  530. }else{
  531. errors.add(String.format("用户[%s]公出时间[%s]超出[%s],不计入本月公出",a.getName(),localDate1.format(formatter),endDate.format(formatter)));
  532. }
  533. }
  534. }
  535. }
  536. for (PublicRelease e : publicReleases2) {
  537. AdminPublicDuration a = new AdminPublicDuration();
  538. pushAdminNameAndProvince(e.getAid(),a);
  539. long daysBetween = DateUtils.getDaysBetween(e.getReleaseStart(), e.getReleaseEnd());
  540. if(daysBetween>0){
  541. double v = e.getDuration() / daysBetween;
  542. for (int i = 0; i < daysBetween; i++) {
  543. LocalDate localDate1 = e.getReleaseStart().toInstant().atZone(ZoneId.systemDefault()).toLocalDate().plusDays(i);
  544. if (localDate1.isAfter(localDate)){
  545. a.setId(e.getAid());
  546. a.setDate(Date.from(localDate1.atStartOfDay(ZoneId.systemDefault()).toInstant()));
  547. a.setDuration(v);
  548. list.add(a);
  549. }else{
  550. errors.add(String.format("用户[%s]公出时间[%s]小于[%s],不计入本月公出",a.getName(),localDate1.format(formatter),endDate.format(formatter)));
  551. }
  552. }
  553. }
  554. }
  555. //将数据统计到人
  556. Map<String, BigDecimal> durationMap = new HashMap<>();
  557. for (AdminPublicDuration e : list) {
  558. String id = e.getId(); // 假设 AdminStatisticsBo 有一个 getId() 方法
  559. BigDecimal duration = BigDecimal.valueOf(e.getDuration()); // 假设 AdminStatisticsBo 有一个 getCallDurationSum() 方法
  560. if (durationMap.containsKey(id)) {
  561. BigDecimal currentDuration = durationMap.get(id);
  562. durationMap.put(id, currentDuration.add(duration));
  563. } else {
  564. durationMap.put(id, duration);
  565. }
  566. }
  567. List<AdminPublicDuration> list2=sumDurationsById(list);
  568. Map<String,Object> map=new HashMap<>();
  569. map.put("date",list);
  570. map.put("count",list2);
  571. map.put("errors",errors);
  572. return map;
  573. }
  574. private void pushAdminNameAndProvince(String aid, AdminPublicDuration a) {
  575. Admin admin = adminMapper.queryById(aid);
  576. Department department = departmentMapper.selectByPrimaryKey(admin.getDepartmentId());
  577. String name = admin.getName();
  578. // 去掉括号及其内部的内容
  579. if (name.contains("(")){
  580. int index = name.indexOf('(');
  581. name = name.substring(0, index);
  582. }else if (name.contains("(")){
  583. int index = name.indexOf('(');
  584. name = name.substring(0, index);
  585. }
  586. a.setName(name);
  587. a.setWorkingHours(department.getWorkingHoursType());
  588. }
  589. public List<AdminPublicDuration> sumDurationsById(List<AdminPublicDuration> adminPublicDurations) {
  590. Map<String, AdminPublicDuration> durationMap = new HashMap<>();
  591. for (AdminPublicDuration adminPublicDuration : adminPublicDurations) {
  592. String id = adminPublicDuration.getId();
  593. String name = adminPublicDuration.getName();
  594. double duration = adminPublicDuration.getDuration();
  595. if (durationMap.containsKey(id)) {
  596. AdminPublicDuration summary = durationMap.get(id);
  597. summary.setWorkingHours(adminPublicDuration.getWorkingHours());
  598. BigDecimal countDuration = BigDecimal.valueOf(summary.getDuration()).add(BigDecimal.valueOf(duration));
  599. summary.setDuration(countDuration.doubleValue());
  600. summary.setName(name);
  601. summary.setCountNumber(summary.getCountNumber()+1);
  602. if (summary.getWorkingHours()==null){
  603. throw new BusinessException(String.format("用户[%s]未设置工作类型",name));
  604. }
  605. if (summary.getWorkingHours()==2){
  606. summary.setConversion(7.0);
  607. } else{
  608. summary.setConversion(7.5);
  609. }
  610. if (summary.getConversion()!=null){
  611. BigDecimal divide = BigDecimal.valueOf(summary.getDuration()).divide(BigDecimal.valueOf(summary.getConversion()), 2, RoundingMode.HALF_UP);
  612. summary.setDays(divide.doubleValue());
  613. System.out.println(name+":"+summary.getDuration()+"/"+summary.getConversion()+"="+divide);
  614. }
  615. } else {
  616. AdminPublicDuration e = new AdminPublicDuration(id, name, duration);
  617. e.setWorkingHours(adminPublicDuration.getWorkingHours());
  618. if (e.getWorkingHours()==null){
  619. throw new BusinessException(String.format("用户[%s]未设置工作类型",name));
  620. }
  621. if (e.getWorkingHours()==2){
  622. e.setConversion(7.0);
  623. } else{
  624. e.setConversion(7.5);
  625. }
  626. if (e.getConversion()!=null){
  627. BigDecimal divide = BigDecimal.valueOf(e.getDuration()).divide(BigDecimal.valueOf(e.getConversion()), 2, RoundingMode.HALF_UP);
  628. e.setDays(divide.doubleValue());
  629. System.out.println(name+":"+e.getDuration()+"/"+e.getConversion()+"="+divide);
  630. }
  631. durationMap.put(id, e);
  632. }
  633. }
  634. return new ArrayList<>(durationMap.values());
  635. }
  636. }