SalesReportServiceImpl.java 18 KB

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