SalesReportServiceImpl.java 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408
  1. package com.goafanti.report.service;
  2. import java.math.BigDecimal;
  3. import java.util.*;
  4. import java.util.stream.Collectors;
  5. import com.goafanti.admin.service.DepartmentService;
  6. import org.apache.commons.lang3.StringUtils;
  7. import org.springframework.beans.factory.annotation.Autowired;
  8. import org.springframework.stereotype.Service;
  9. import org.springframework.ui.ModelMap;
  10. import com.goafanti.common.constant.AFTConstants;
  11. import com.goafanti.common.dao.DailySalesReportMapper;
  12. import com.goafanti.common.dao.UserMapper;
  13. import com.goafanti.common.error.BusinessException;
  14. import com.goafanti.common.model.DailySalesReport;
  15. import com.goafanti.core.mybatis.BaseMybatisDao;
  16. import com.goafanti.report.bo.CountMarketingStatisticsBo;
  17. import com.goafanti.report.bo.DepartmentSalesReportBO;
  18. import com.goafanti.report.bo.PersonalSalesReportBO;
  19. import com.goafanti.report.bo.ReportDate;
  20. import com.goafanti.report.bo.SalesValues;
  21. import com.goafanti.report.bo.SomeTimeMarketingBo;
  22. import com.goafanti.report.bo.marketingESBo;
  23. import com.goafanti.report.bo.technicalDepStatisticsListBo;
  24. import com.goafanti.report.bo.userDataListBo;
  25. import com.goafanti.report.enums.OrderBy;
  26. import com.goafanti.report.enums.SalesReportOrderField;
  27. import com.goafanti.report.enums.TimeType;
  28. @Service
  29. public class SalesReportServiceImpl extends BaseMybatisDao<DailySalesReportMapper> {
  30. @Autowired
  31. DailySalesReportMapper dailySalesReportMapper;
  32. @Autowired
  33. UserMapper userMapper;
  34. @Autowired
  35. DepartmentService departmentService;
  36. public int insertDailyReports(Date startTime, Date endTime) {
  37. List<DailySalesReport> list = dailySalesReportMapper.selectAdmins();
  38. Map<String, DailySalesReport> map = new HashMap<>();
  39. for (DailySalesReport dsr : list) {
  40. dsr.setCreateTime(endTime);
  41. map.put(dsr.getAdminId(), dsr);
  42. }
  43. List<DailySalesReport> reports = dailySalesReportMapper.selectDailySalesReports(startTime, endTime);
  44. for (DailySalesReport dsr : reports) {
  45. DailySalesReport item = map.get(dsr.getAdminId());
  46. if (item != null) {
  47. item.setOrderAmount(item.getOrderAmount().add(dsr.getOrderAmount()));
  48. item.setOrderCount(item.getOrderCount() + dsr.getOrderCount());
  49. }
  50. }
  51. dailySalesReportMapper.deleteByDate(endTime);
  52. return dailySalesReportMapper.insertBatch(list);
  53. }
  54. public ModelMap getReportTotal(Date startTime, String depName, String name, String position) {
  55. ReportDate rd = new ReportDate(startTime);
  56. ModelMap mm = new ModelMap();
  57. putField(mm, "dailyTotalCount", "dailyTotalAmount", rd.getDailyStart(), rd.getDailyEnd(), depName, name,
  58. position);
  59. putField(mm, "weeklyTotalCount", "weeklyTotalAmount", rd.getWeeklyStart(), rd.getWeeklyEnd(), depName, name,
  60. position);
  61. putField(mm, "monthlyTotalCount", "monthlyTotalAmount", rd.getMonthStart(), rd.getMonthEnd(), depName, name,
  62. position);
  63. putField(mm, "quarterlyTotalCount", "quarterlyTotalAmount", rd.getQuarterStart(), rd.getQuarterEnd(), depName,
  64. name, position);
  65. putField(mm, "annuallyTotalCount", "annuallyTotalAmount", rd.getYearStart(), rd.getYearEnd(), depName, name,
  66. position);
  67. long totalCount = dailySalesReportMapper.selectSalesPersonalReportsCount(rd.getDailyStart(), rd.getDailyEnd(),
  68. depName, name, position);
  69. if (totalCount == 0) {
  70. totalCount = dailySalesReportMapper.selectSalesPersonalReportsCount(null, null, depName, name, position);
  71. }
  72. mm.put("totalRecordCount", totalCount);
  73. return mm;
  74. }
  75. private void putField(ModelMap mm, String count, String amount, Date start, Date end, String depName, String name,
  76. String position) {
  77. ModelMap res = dailySalesReportMapper.selectTotalReports(start, end, depName, name, position);
  78. mm.put(count, res == null ? 0 : res.get("totalCount"));
  79. mm.put(amount, res == null ? 0 : res.get("totalAmount"));
  80. }
  81. public List<PersonalSalesReportBO> getPersonSalesReports(SalesReportOrderField orderField, OrderBy order,
  82. Integer pageSize, Integer pageNo, Date startTime, String depName, String name, String position) {
  83. ReportDate rd = new ReportDate(startTime);
  84. List<PersonalSalesReportBO> list = null;
  85. switch (orderField) {
  86. case DailyOrderAmount:
  87. case DailyOrderCount:
  88. list = dailySalesReportMapper.selectSalesPersonalReports(rd.getDailyStart(), rd.getDailyEnd(), pageNo, pageSize,
  89. orderField.getCode(), order.getCode(), SalesReportOrderField.DailyOrderCount.getCode(),
  90. SalesReportOrderField.DailyOrderAmount.getCode(), depName, name, position);
  91. break;
  92. case WeeklyOrderCount:
  93. case WeeklyOrderAmount:
  94. list = dailySalesReportMapper.selectSalesPersonalReports(rd.getWeeklyStart(), rd.getWeeklyEnd(), pageNo,
  95. pageSize, orderField.getCode(), order.getCode(), SalesReportOrderField.WeeklyOrderCount.getCode(),
  96. SalesReportOrderField.WeeklyOrderAmount.getCode(), depName, name, position);
  97. break;
  98. case MonthlyOrderCount:
  99. case MonthlyOrderAmount:
  100. list = dailySalesReportMapper.selectSalesPersonalReports(rd.getMonthStart(), rd.getMonthEnd(), pageNo, pageSize,
  101. orderField.getCode(), order.getCode(), SalesReportOrderField.MonthlyOrderCount.getCode(),
  102. SalesReportOrderField.MonthlyOrderAmount.getCode(), depName, name, position);
  103. break;
  104. case QuarterlyOrderCount:
  105. case QuarterlyOrderAmount:
  106. list = dailySalesReportMapper.selectSalesPersonalReports(rd.getQuarterStart(), rd.getQuarterEnd(), pageNo,
  107. pageSize, orderField.getCode(), order.getCode(),
  108. SalesReportOrderField.QuarterlyOrderCount.getCode(),
  109. SalesReportOrderField.QuarterlyOrderAmount.getCode(), depName, name, position);
  110. break;
  111. case AnnuallyOrderCount:
  112. case AnnuallyOrderAmount:
  113. list = dailySalesReportMapper.selectSalesPersonalReports(rd.getYearStart(), rd.getYearEnd(), pageNo, pageSize,
  114. orderField.getCode(), order.getCode(), SalesReportOrderField.AnnuallyOrderCount.getCode(),
  115. SalesReportOrderField.AnnuallyOrderAmount.getCode(), depName, name, position);
  116. break;
  117. }
  118. if (list.isEmpty()) {
  119. list = dailySalesReportMapper.selectPersonalByPage(pageNo, pageSize, depName, name, position);
  120. }
  121. if (list.isEmpty()) {
  122. return list;
  123. }
  124. Map<String, PersonalSalesReportBO> map = new HashMap<>();
  125. List<String> ids = list.stream().map(item -> {
  126. map.put(item.getId(), item);
  127. return item.getId();
  128. }).collect(Collectors.toList());
  129. if (pageSize == null || pageNo == null) {
  130. // 如果没有分页,则取其他统计数据时返回所有数据
  131. ids = null;
  132. }
  133. getPersonalExtraInfo(map, ids, AFTConstants.DAILY, rd.getDailyStart(), rd.getDailyEnd());
  134. getPersonalExtraInfo(map, ids, AFTConstants.WEEKLY, rd.getWeeklyStart(), rd.getWeeklyEnd());
  135. getPersonalExtraInfo(map, ids, AFTConstants.MONTHLY, rd.getMonthStart(), rd.getMonthEnd());
  136. getPersonalExtraInfo(map, ids, AFTConstants.QUARTERLY, rd.getQuarterStart(), rd.getQuarterEnd());
  137. getPersonalExtraInfo(map, ids, AFTConstants.ANNUALLY, rd.getYearStart(), rd.getYearEnd());
  138. return list;
  139. }
  140. private void getPersonalExtraInfo(Map<String, PersonalSalesReportBO> map, List<String> ids, String field,
  141. Date start, Date end) {
  142. List<ModelMap> mms = dailySalesReportMapper.selectSalesPersonalExtraReports(start, end, ids);
  143. for (ModelMap mm : mms) {
  144. Optional<SalesValues> svo = Optional.ofNullable(map.get(mm.get("id"))).map(it -> it.getValues())
  145. .map(it -> it.get(field));
  146. if (svo.isPresent()) {
  147. svo.get().setOrderAmount((BigDecimal) mm.get("order_amount"));
  148. svo.get().setOrderCount(((BigDecimal) mm.get("order_count")).intValue());
  149. }
  150. }
  151. }
  152. public List<DepartmentSalesReportBO> getDepartmentSalesReports(Date startTime) {
  153. ReportDate rd = new ReportDate(startTime);
  154. List<DepartmentSalesReportBO> list = dailySalesReportMapper.selectSalesDepartmentReports();
  155. Map<String, DepartmentSalesReportBO> map = new HashMap<>();
  156. for (DepartmentSalesReportBO dsr : list) {
  157. map.put(dsr.getId(), dsr);
  158. }
  159. getDepartmentExtraInfo(map, AFTConstants.DAILY, rd.getDailyStart(), rd.getDailyEnd());
  160. getDepartmentExtraInfo(map, AFTConstants.WEEKLY, rd.getWeeklyStart(), rd.getWeeklyEnd());
  161. getDepartmentExtraInfo(map, AFTConstants.MONTHLY, rd.getMonthStart(), rd.getMonthEnd());
  162. getDepartmentExtraInfo(map, AFTConstants.QUARTERLY, rd.getQuarterStart(), rd.getQuarterEnd());
  163. getDepartmentExtraInfo(map, AFTConstants.ANNUALLY, rd.getYearStart(), rd.getYearEnd());
  164. for (DepartmentSalesReportBO dsr : list) {
  165. if (StringUtils.isNotBlank(dsr.getSuperId()) && !StringUtils.equals(dsr.getId(), dsr.getSuperId())) {
  166. dsr.setLevel(calcLevel(map, dsr.getSuperId(), 0));
  167. }
  168. }
  169. list.sort(new Comparator<DepartmentSalesReportBO>() {
  170. @Override
  171. public int compare(DepartmentSalesReportBO o1, DepartmentSalesReportBO o2) {
  172. // 排序确保父节点在前,不重复计算父级数据
  173. return o1.getLevel() - o2.getLevel();
  174. }
  175. });
  176. for (DepartmentSalesReportBO dsr : list) {
  177. if (StringUtils.isNotBlank(dsr.getSuperId()) && !StringUtils.equals(dsr.getId(), dsr.getSuperId())) {
  178. addToParent(map, dsr.getValues(), dsr.getMemberCount(), dsr.getSuperId());
  179. }
  180. }
  181. return list;
  182. }
  183. private int calcLevel(Map<String, DepartmentSalesReportBO> map, String parentId, int level) {
  184. DepartmentSalesReportBO dsr = map.get(parentId);
  185. if (dsr != null) {
  186. level++;
  187. if (level > 5) {
  188. // 业务只能有3层,代码定义强行5层跳出,超过5层可能出现上下级循环嵌套的错误数据,导致递归死循环
  189. throw new BusinessException("部门数据层级错误,请检查数据: " + parentId);
  190. }
  191. if (StringUtils.isNotBlank(dsr.getSuperId()) && !StringUtils.equals(dsr.getId(), dsr.getSuperId())) {
  192. return calcLevel(map, dsr.getSuperId(), level);
  193. }
  194. }
  195. return level;
  196. }
  197. /**
  198. * 递归给所有上级增加销售统计
  199. */
  200. private void addToParent(Map<String, DepartmentSalesReportBO> map, Map<String, SalesValues> values, int memberCount,
  201. String parentId) {
  202. DepartmentSalesReportBO dsr = map.get(parentId);
  203. if (dsr != null) {
  204. Map<String, SalesValues> pValues = dsr.getValues();
  205. for (String period : values.keySet()) {
  206. SalesValues psv = pValues.get(period);
  207. SalesValues sv = values.get(period);
  208. psv.setOrderCount(psv.getOrderCount() + sv.getOrderCount());
  209. psv.setOrderAmount(psv.getOrderAmount().add(sv.getOrderAmount()));
  210. }
  211. dsr.setMemberCount(dsr.getMemberCount() + memberCount);
  212. if (StringUtils.isNotBlank(dsr.getSuperId()) && !StringUtils.equals(dsr.getId(), dsr.getSuperId())) {
  213. addToParent(map, values, memberCount, dsr.getSuperId());
  214. }
  215. }
  216. }
  217. private void getDepartmentExtraInfo(Map<String, DepartmentSalesReportBO> map, String field, Date start, Date end) {
  218. List<ModelMap> mms = dailySalesReportMapper.selectSalesDepartmentExtraReports(start, end);
  219. for (ModelMap mm : mms) {
  220. Optional<SalesValues> svo = Optional.ofNullable(map.get(mm.get("id"))).map(it -> it.getValues())
  221. .map(it -> it.get(field));
  222. if (svo.isPresent()) {
  223. svo.get().setOrderAmount((BigDecimal) mm.get("order_amount"));
  224. svo.get().setOrderCount(((BigDecimal) mm.get("order_count")).intValue());
  225. }
  226. }
  227. }
  228. public List<marketingESBo> marketingStatistics(String depId) {
  229. ReportDate rd = new ReportDate(new Date());
  230. List<marketingESBo> list=dailySalesReportMapper.findmarketingStatisticsList(depId,rd.getStringDailyStart(),rd.getStringDailyEnd(),rd.getStringWeeklyStart(),rd.getStringWeeklyEnd(),
  231. rd.getStringMonthStart(),rd.getStringMonthEnd(),rd.getStringYearStart(),rd.getStringYearEnd());
  232. return list;
  233. }
  234. public List<marketingESBo> marketingDepStatistics(String depId) {
  235. ReportDate rd = new ReportDate(new Date());
  236. List<marketingESBo> list=dailySalesReportMapper.marketingDepStatisticsList(depId,rd.getStringDailyStart(),rd.getStringDailyEnd(),rd.getStringWeeklyStart(),rd.getStringWeeklyEnd(),
  237. rd.getStringMonthStart(),rd.getStringMonthEnd(),rd.getStringYearStart(),rd.getStringYearEnd());
  238. return list;
  239. }
  240. public CountMarketingStatisticsBo countMarketingStatistics(String depId) {
  241. ReportDate rd = new ReportDate(new Date());
  242. CountMarketingStatisticsBo count=dailySalesReportMapper.privateCustomersCount(depId,rd.getStringDailyStart(),rd.getStringDailyEnd(),rd.getStringWeeklyStart(),rd.getStringWeeklyEnd(),
  243. rd.getStringMonthStart(),rd.getStringMonthEnd(),rd.getStringYearStart(),rd.getStringYearEnd());
  244. return count;
  245. }
  246. public CountMarketingStatisticsBo countMarketingDepStatistics(String depId) {
  247. ReportDate rd = new ReportDate(new Date());
  248. CountMarketingStatisticsBo count=dailySalesReportMapper.privateCustomersDepCount(depId,rd.getStringDailyStart(),rd.getStringDailyEnd(),rd.getStringWeeklyStart(),rd.getStringWeeklyEnd(),
  249. rd.getStringMonthStart(),rd.getStringMonthEnd(),rd.getStringYearStart(),rd.getStringYearEnd());
  250. return count;
  251. }
  252. public List<SomeTimeMarketingBo> sometimeMarketingStatistics(String depId, Integer timeType, String startTime, String endTime) {
  253. List<SomeTimeMarketingBo> list = null;
  254. ReportDate rd = new ReportDate(new Date());
  255. if (TimeType.WEEKLY.getCode()==timeType) {
  256. list=dailySalesReportMapper.sometimeMarketingStatistics(depId,rd.getStringWeeklyStart(),rd.getStringWeeklyEnd());
  257. }
  258. if (TimeType.MONTH.getCode()==timeType) {
  259. list=dailySalesReportMapper.sometimeMarketingStatistics(depId,rd.getStringMonthStart(),rd.getStringMonthEnd());
  260. }
  261. if (TimeType.QTR.getCode()==timeType) {
  262. list=dailySalesReportMapper.sometimeMarketingStatistics(depId,rd.getStringQuarterStart(),rd.getStringQuarterEnd());
  263. }
  264. if (TimeType.YEAR.getCode()==timeType) {
  265. list=dailySalesReportMapper.sometimeMarketingStatistics(depId,rd.getStringYearStart(),rd.getStringYearEnd());
  266. }
  267. if (TimeType.ZS.getCode()==timeType) {
  268. list=dailySalesReportMapper.sometimeMarketingStatistics(depId,startTime,endTime);
  269. }
  270. return list;
  271. }
  272. public List<SomeTimeMarketingBo> sometimeMarketingDepStatistics(String depId, Integer timeType, String startTime, String endTime) {
  273. List<SomeTimeMarketingBo> list = null;
  274. ReportDate rd = new ReportDate(new Date());
  275. if (TimeType.WEEKLY.getCode()==timeType) {
  276. list=dailySalesReportMapper.sometimeMarketingDepStatistics(depId,rd.getStringWeeklyStart(),rd.getStringWeeklyEnd());
  277. }
  278. if (TimeType.MONTH.getCode()==timeType) {
  279. list=dailySalesReportMapper.sometimeMarketingDepStatistics(depId,rd.getStringMonthStart(),rd.getStringMonthEnd());
  280. }
  281. if (TimeType.QTR.getCode()==timeType) {
  282. list=dailySalesReportMapper.sometimeMarketingDepStatistics(depId,rd.getStringQuarterStart(),rd.getStringQuarterEnd());
  283. }
  284. if (TimeType.YEAR.getCode()==timeType) {
  285. list=dailySalesReportMapper.sometimeMarketingDepStatistics(depId,rd.getStringYearStart(),rd.getStringYearEnd());
  286. }
  287. if (TimeType.ZS.getCode()==timeType) {
  288. list=dailySalesReportMapper.sometimeMarketingDepStatistics(depId,startTime,endTime);
  289. }
  290. return list;
  291. }
  292. public SomeTimeMarketingBo countSometimeMarketingStatistics(String depId, Integer timeType, String startTime, String endTime) {
  293. ReportDate rd = new ReportDate(new Date());
  294. if (TimeType.WEEKLY.getCode()==timeType) {
  295. return dailySalesReportMapper.countsometimeMarketingStatistics(depId,rd.getStringWeeklyStart(),rd.getStringWeeklyEnd());
  296. }
  297. if (TimeType.MONTH.getCode()==timeType) {
  298. return dailySalesReportMapper.countsometimeMarketingStatistics(depId,rd.getStringMonthStart(),rd.getStringMonthEnd());
  299. }
  300. if (TimeType.QTR.getCode()==timeType) {
  301. return dailySalesReportMapper.countsometimeMarketingStatistics(depId,rd.getStringQuarterStart(),rd.getStringQuarterEnd());
  302. }
  303. if (TimeType.YEAR.getCode()==timeType) {
  304. return dailySalesReportMapper.countsometimeMarketingStatistics(depId,rd.getStringYearStart(),rd.getStringYearEnd());
  305. }
  306. if (TimeType.ZS.getCode()==timeType) {
  307. return dailySalesReportMapper.countsometimeMarketingStatistics(depId,startTime,endTime);
  308. }
  309. return null;
  310. }
  311. public SomeTimeMarketingBo countSometimeMarketingDepStatistics(String depId, Integer timeType, String startTime,
  312. String endTime) {
  313. ReportDate rd = new ReportDate(new Date());
  314. if (TimeType.WEEKLY.getCode()==timeType) {
  315. return dailySalesReportMapper.countsometimeMarketingDepStatistics(depId,rd.getStringWeeklyStart(),rd.getStringWeeklyEnd());
  316. }
  317. if (TimeType.MONTH.getCode()==timeType) {
  318. return dailySalesReportMapper.countsometimeMarketingDepStatistics(depId,rd.getStringMonthStart(),rd.getStringMonthEnd());
  319. }
  320. if (TimeType.QTR.getCode()==timeType) {
  321. return dailySalesReportMapper.countsometimeMarketingDepStatistics(depId,rd.getStringQuarterStart(),rd.getStringQuarterEnd());
  322. }
  323. if (TimeType.YEAR.getCode()==timeType) {
  324. return dailySalesReportMapper.countsometimeMarketingDepStatistics(depId,rd.getStringYearStart(),rd.getStringYearEnd());
  325. }
  326. if (TimeType.ZS.getCode()==timeType) {
  327. return dailySalesReportMapper.countsometimeMarketingDepStatistics(depId,startTime,endTime);
  328. }
  329. return null;
  330. }
  331. public List<technicalDepStatisticsListBo> technicalDepStatistics(String depId, Integer timeType, String startTime, String endTime,
  332. String publishStatus, String taskStatus) {
  333. ReportDate rd = new ReportDate(new Date());
  334. if (TimeType.WEEKLY.getCode()==timeType) {
  335. return dailySalesReportMapper.technicalDepStatistics(depId,rd.getStringWeeklyStart(),rd.getStringWeeklyEnd(),publishStatus,taskStatus);
  336. }
  337. if (TimeType.MONTH.getCode()==timeType) {
  338. return dailySalesReportMapper.technicalDepStatistics(depId,rd.getStringMonthStart(),rd.getStringMonthEnd(),publishStatus,taskStatus);
  339. }
  340. if (TimeType.QTR.getCode()==timeType) {
  341. return dailySalesReportMapper.technicalDepStatistics(depId,rd.getStringQuarterStart(),rd.getStringQuarterEnd(),publishStatus,taskStatus);
  342. }
  343. if (TimeType.YEAR.getCode()==timeType) {
  344. return dailySalesReportMapper.technicalDepStatistics(depId,rd.getStringYearStart(),rd.getStringYearEnd(),publishStatus,taskStatus);
  345. }
  346. if (TimeType.ZS.getCode()==timeType) {
  347. return dailySalesReportMapper.technicalDepStatistics(depId,startTime,endTime,publishStatus,taskStatus);
  348. }
  349. return null;
  350. }
  351. public List<userDataListBo> userDataStatistics(String deps) {
  352. List<String> listDep=new ArrayList<>();
  353. if (deps!=null){
  354. listDep=departmentService.parseArray(deps);
  355. }
  356. return userMapper.userDataStatistics(listDep);
  357. }
  358. public userDataListBo userDataStatisticsCount(String deps) {
  359. List<String> listDep=new ArrayList<>();
  360. if (deps!=null){
  361. listDep=departmentService.parseArray(deps);
  362. }
  363. return userMapper.userDataStatisticsCount(listDep);
  364. }
  365. }