SalesReportServiceImpl.java 17 KB

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