SalesReportServiceImpl.java 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247
  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.error.BusinessException;
  17. import com.goafanti.common.model.DailySalesReport;
  18. import com.goafanti.core.mybatis.BaseMybatisDao;
  19. import com.goafanti.report.bo.DepartmentSalesReportBO;
  20. import com.goafanti.report.bo.PersonalSalesReportBO;
  21. import com.goafanti.report.bo.ReportDate;
  22. import com.goafanti.report.bo.SalesValues;
  23. import com.goafanti.report.enums.OrderBy;
  24. import com.goafanti.report.enums.SalesReportOrderField;
  25. @Service
  26. public class SalesReportServiceImpl extends BaseMybatisDao<DailySalesReportMapper> {
  27. @Autowired
  28. DailySalesReportMapper salesReportMapper;
  29. public int insertDailyReports(Date startTime, Date endTime) {
  30. List<DailySalesReport> list = salesReportMapper.selectAdmins();
  31. Map<String, DailySalesReport> map = new HashMap<>();
  32. for (DailySalesReport dsr : list) {
  33. dsr.setCreateTime(endTime);
  34. map.put(dsr.getAdminId(), dsr);
  35. }
  36. List<DailySalesReport> reports = salesReportMapper.selectDailySalesReports(startTime, endTime);
  37. for (DailySalesReport dsr : reports) {
  38. DailySalesReport item = map.get(dsr.getAdminId());
  39. if (item != null) {
  40. item.setOrderAmount(item.getOrderAmount().add(dsr.getOrderAmount()));
  41. item.setOrderCount(item.getOrderCount() + dsr.getOrderCount());
  42. }
  43. }
  44. salesReportMapper.deleteByDate(endTime);
  45. return salesReportMapper.insertBatch(list);
  46. }
  47. public ModelMap getReportTotal(Date startTime, String depName, String name, String position) {
  48. ReportDate rd = new ReportDate(startTime);
  49. ModelMap mm = new ModelMap();
  50. putField(mm, "dailyTotalCount", "dailyTotalAmount", rd.getDailyStart(), rd.getDailyEnd(), depName, name,
  51. position);
  52. putField(mm, "weeklyTotalCount", "weeklyTotalAmount", rd.getWeeklyStart(), rd.getWeeklyEnd(), depName, name,
  53. position);
  54. putField(mm, "monthlyTotalCount", "monthlyTotalAmount", rd.getMonthStart(), rd.getMonthEnd(), depName, name,
  55. position);
  56. putField(mm, "quarterlyTotalCount", "quarterlyTotalAmount", rd.getQuarterStart(), rd.getQuarterEnd(), depName,
  57. name, position);
  58. putField(mm, "annuallyTotalCount", "annuallyTotalAmount", rd.getYearStart(), rd.getYearEnd(), depName, name,
  59. position);
  60. long totalCount = salesReportMapper.selectSalesPersonalReportsCount(rd.getDailyStart(), rd.getDailyEnd(),
  61. depName, name, position);
  62. if (totalCount == 0) {
  63. totalCount = salesReportMapper.selectSalesPersonalReportsCount(null, null, depName, name, position);
  64. }
  65. mm.put("totalRecordCount", totalCount);
  66. return mm;
  67. }
  68. private void putField(ModelMap mm, String count, String amount, Date start, Date end, String depName, String name,
  69. String position) {
  70. ModelMap res = salesReportMapper.selectTotalReports(start, end, depName, name, position);
  71. mm.put(count, res == null ? 0 : res.get("totalCount"));
  72. mm.put(amount, res == null ? 0 : res.get("totalAmount"));
  73. }
  74. public List<PersonalSalesReportBO> getPersonSalesReports(SalesReportOrderField orderField, OrderBy order,
  75. Integer pageSize, Integer pageNo, Date startTime, String depName, String name, String position) {
  76. ReportDate rd = new ReportDate(startTime);
  77. List<PersonalSalesReportBO> list = null;
  78. switch (orderField) {
  79. case DailyOrderAmount:
  80. case DailyOrderCount:
  81. list = salesReportMapper.selectSalesPersonalReports(rd.getDailyStart(), rd.getDailyEnd(), pageNo, pageSize,
  82. orderField.getCode(), order.getCode(), SalesReportOrderField.DailyOrderCount.getCode(),
  83. SalesReportOrderField.DailyOrderAmount.getCode(), depName, name, position);
  84. break;
  85. case WeeklyOrderCount:
  86. case WeeklyOrderAmount:
  87. list = salesReportMapper.selectSalesPersonalReports(rd.getWeeklyStart(), rd.getWeeklyEnd(), pageNo,
  88. pageSize, orderField.getCode(), order.getCode(), SalesReportOrderField.WeeklyOrderCount.getCode(),
  89. SalesReportOrderField.WeeklyOrderAmount.getCode(), depName, name, position);
  90. break;
  91. case MonthlyOrderCount:
  92. case MonthlyOrderAmount:
  93. list = salesReportMapper.selectSalesPersonalReports(rd.getMonthStart(), rd.getMonthEnd(), pageNo, pageSize,
  94. orderField.getCode(), order.getCode(), SalesReportOrderField.MonthlyOrderCount.getCode(),
  95. SalesReportOrderField.MonthlyOrderAmount.getCode(), depName, name, position);
  96. break;
  97. case QuarterlyOrderCount:
  98. case QuarterlyOrderAmount:
  99. list = salesReportMapper.selectSalesPersonalReports(rd.getQuarterStart(), rd.getQuarterEnd(), pageNo,
  100. pageSize, orderField.getCode(), order.getCode(),
  101. SalesReportOrderField.QuarterlyOrderCount.getCode(),
  102. SalesReportOrderField.QuarterlyOrderAmount.getCode(), depName, name, position);
  103. break;
  104. case AnnuallyOrderCount:
  105. case AnnuallyOrderAmount:
  106. list = salesReportMapper.selectSalesPersonalReports(rd.getYearStart(), rd.getYearEnd(), pageNo, pageSize,
  107. orderField.getCode(), order.getCode(), SalesReportOrderField.AnnuallyOrderCount.getCode(),
  108. SalesReportOrderField.AnnuallyOrderAmount.getCode(), depName, name, position);
  109. break;
  110. }
  111. if (list.isEmpty()) {
  112. list = salesReportMapper.selectPersonalByPage(pageNo, pageSize, depName, name, position);
  113. }
  114. if (list.isEmpty()) {
  115. return list;
  116. }
  117. Map<String, PersonalSalesReportBO> map = new HashMap<>();
  118. List<String> ids = list.stream().map(item -> {
  119. map.put(item.getId(), item);
  120. return item.getId();
  121. }).collect(Collectors.toList());
  122. if (pageSize == null || pageNo == null) {
  123. // 如果没有分页,则取其他统计数据时返回所有数据
  124. ids = null;
  125. }
  126. getPersonalExtraInfo(map, ids, AFTConstants.DAILY, rd.getDailyStart(), rd.getDailyEnd());
  127. getPersonalExtraInfo(map, ids, AFTConstants.WEEKLY, rd.getWeeklyStart(), rd.getWeeklyEnd());
  128. getPersonalExtraInfo(map, ids, AFTConstants.MONTHLY, rd.getMonthStart(), rd.getMonthEnd());
  129. getPersonalExtraInfo(map, ids, AFTConstants.QUARTERLY, rd.getQuarterStart(), rd.getQuarterEnd());
  130. getPersonalExtraInfo(map, ids, AFTConstants.ANNUALLY, rd.getYearStart(), rd.getYearEnd());
  131. return list;
  132. }
  133. private void getPersonalExtraInfo(Map<String, PersonalSalesReportBO> map, List<String> ids, String field,
  134. Date start, Date end) {
  135. List<ModelMap> mms = salesReportMapper.selectSalesPersonalExtraReports(start, end, ids);
  136. for (ModelMap mm : mms) {
  137. Optional<SalesValues> svo = Optional.ofNullable(map.get(mm.get("id"))).map(it -> it.getValues())
  138. .map(it -> it.get(field));
  139. if (svo.isPresent()) {
  140. svo.get().setOrderAmount((BigDecimal) mm.get("order_amount"));
  141. svo.get().setOrderCount(((BigDecimal) mm.get("order_count")).intValue());
  142. }
  143. }
  144. }
  145. public List<DepartmentSalesReportBO> getDepartmentSalesReports(Date startTime) {
  146. ReportDate rd = new ReportDate(startTime);
  147. List<DepartmentSalesReportBO> list = salesReportMapper.selectSalesDepartmentReports();
  148. Map<String, DepartmentSalesReportBO> map = new HashMap<>();
  149. for (DepartmentSalesReportBO dsr : list) {
  150. map.put(dsr.getId(), dsr);
  151. }
  152. getDepartmentExtraInfo(map, AFTConstants.DAILY, rd.getDailyStart(), rd.getDailyEnd());
  153. getDepartmentExtraInfo(map, AFTConstants.WEEKLY, rd.getWeeklyStart(), rd.getWeeklyEnd());
  154. getDepartmentExtraInfo(map, AFTConstants.MONTHLY, rd.getMonthStart(), rd.getMonthEnd());
  155. getDepartmentExtraInfo(map, AFTConstants.QUARTERLY, rd.getQuarterStart(), rd.getQuarterEnd());
  156. getDepartmentExtraInfo(map, AFTConstants.ANNUALLY, rd.getYearStart(), rd.getYearEnd());
  157. for (DepartmentSalesReportBO dsr : list) {
  158. if (StringUtils.isNotBlank(dsr.getSuperId()) && !StringUtils.equals(dsr.getId(), dsr.getSuperId())) {
  159. dsr.setLevel(calcLevel(map, dsr.getSuperId(), 0));
  160. }
  161. }
  162. list.sort(new Comparator<DepartmentSalesReportBO>() {
  163. @Override
  164. public int compare(DepartmentSalesReportBO o1, DepartmentSalesReportBO o2) {
  165. // 排序确保父节点在前,不重复计算父级数据
  166. return o1.getLevel() - o2.getLevel();
  167. }
  168. });
  169. for (DepartmentSalesReportBO dsr : list) {
  170. if (StringUtils.isNotBlank(dsr.getSuperId()) && !StringUtils.equals(dsr.getId(), dsr.getSuperId())) {
  171. addToParent(map, dsr.getValues(), dsr.getMemberCount(), dsr.getSuperId());
  172. }
  173. }
  174. return list;
  175. }
  176. private int calcLevel(Map<String, DepartmentSalesReportBO> map, String parentId, int level) {
  177. DepartmentSalesReportBO dsr = map.get(parentId);
  178. if (dsr != null) {
  179. level++;
  180. if (level > 5) {
  181. // 业务只能有3层,代码定义强行5层跳出,超过5层可能出现上下级循环嵌套的错误数据,导致递归死循环
  182. throw new BusinessException("部门数据层级错误,请检查数据: " + parentId);
  183. }
  184. if (StringUtils.isNotBlank(dsr.getSuperId()) && !StringUtils.equals(dsr.getId(), dsr.getSuperId())) {
  185. return calcLevel(map, dsr.getSuperId(), level);
  186. }
  187. }
  188. return level;
  189. }
  190. /**
  191. * 递归给所有上级增加销售统计
  192. */
  193. private void addToParent(Map<String, DepartmentSalesReportBO> map, Map<String, SalesValues> values, int memberCount,
  194. String parentId) {
  195. DepartmentSalesReportBO dsr = map.get(parentId);
  196. if (dsr != null) {
  197. Map<String, SalesValues> pValues = dsr.getValues();
  198. for (String period : values.keySet()) {
  199. SalesValues psv = pValues.get(period);
  200. SalesValues sv = values.get(period);
  201. psv.setOrderCount(psv.getOrderCount() + sv.getOrderCount());
  202. psv.setOrderAmount(psv.getOrderAmount().add(sv.getOrderAmount()));
  203. }
  204. dsr.setMemberCount(dsr.getMemberCount() + memberCount);
  205. if (StringUtils.isNotBlank(dsr.getSuperId()) && !StringUtils.equals(dsr.getId(), dsr.getSuperId())) {
  206. addToParent(map, values, memberCount, dsr.getSuperId());
  207. }
  208. }
  209. }
  210. private void getDepartmentExtraInfo(Map<String, DepartmentSalesReportBO> map, String field, Date start, Date end) {
  211. List<ModelMap> mms = salesReportMapper.selectSalesDepartmentExtraReports(start, end);
  212. for (ModelMap mm : mms) {
  213. Optional<SalesValues> svo = Optional.ofNullable(map.get(mm.get("id"))).map(it -> it.getValues())
  214. .map(it -> it.get(field));
  215. if (svo.isPresent()) {
  216. svo.get().setOrderAmount((BigDecimal) mm.get("order_amount"));
  217. svo.get().setOrderCount(((BigDecimal) mm.get("order_count")).intValue());
  218. }
  219. }
  220. }
  221. }