MonthlyCustomersController.java 42 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910
  1. package com.kmall.admin.controller.statistics;
  2. import com.kmall.admin.dao.GoodsDao;
  3. import com.kmall.admin.dao.ProductStoreRelaDao;
  4. import com.google.common.collect.Lists;
  5. import com.google.common.collect.Maps;
  6. import com.kmall.admin.dao.statistics.MonthlyCustomersDao;
  7. import com.kmall.admin.dao.statistics.WechatFollowersDao;
  8. import com.kmall.admin.entity.GoodsEntity;
  9. import com.kmall.admin.entity.MonthlySalesGrowthEntity;
  10. import com.kmall.admin.entity.ProductStoreRelaEntity;
  11. import com.kmall.admin.entity.WechatFollowersEntity;
  12. import com.kmall.admin.fromcomm.entity.SysUserEntity;
  13. import com.kmall.admin.service.statistics.MonthlyCustomersService;
  14. import com.kmall.admin.utils.ParamUtils;
  15. import com.kmall.admin.utils.ShiroUtils;
  16. import com.kmall.common.utils.R;
  17. import com.kmall.common.utils.excel.ExcelExport;
  18. import com.kmall.common.utils.excel.ExcelUtil;
  19. import org.apache.commons.lang.StringUtils;
  20. import org.apache.poi.ss.usermodel.Cell;
  21. import org.apache.poi.ss.usermodel.Row;
  22. import org.apache.poi.ss.usermodel.Sheet;
  23. import org.apache.poi.ss.usermodel.Workbook;
  24. import org.apache.poi.ss.util.CellRangeAddress;
  25. import org.apache.poi.xssf.usermodel.XSSFWorkbook;
  26. import org.apache.shiro.SecurityUtils;
  27. import org.springframework.beans.factory.annotation.Autowired;
  28. import org.springframework.web.bind.annotation.RequestMapping;
  29. import org.springframework.web.bind.annotation.RequestParam;
  30. import org.springframework.web.bind.annotation.RestController;
  31. import javax.servlet.ServletOutputStream;
  32. import javax.servlet.http.HttpServletRequest;
  33. import javax.servlet.http.HttpServletResponse;
  34. import java.io.*;
  35. import java.math.BigDecimal;
  36. import java.math.RoundingMode;
  37. import java.net.URLEncoder;
  38. import java.text.ParseException;
  39. import java.text.SimpleDateFormat;
  40. import java.util.*;
  41. /**
  42. * @author zhangchuangbiao
  43. * @version 1.0
  44. * 2020-09-01 14:35
  45. */
  46. @RestController
  47. @RequestMapping("/monthly")
  48. public class MonthlyCustomersController {
  49. @Autowired
  50. private MonthlyCustomersService monthlyCustomersService;
  51. @Autowired
  52. private ExcelUtil excelUtil;
  53. @Autowired
  54. private MonthlyCustomersDao monthlyCustomersDao;
  55. @Autowired
  56. private WechatFollowersDao wechatFollowersDao;
  57. @Autowired
  58. private GoodsDao goodsDao;
  59. @Autowired
  60. private ProductStoreRelaDao productStoreRelaDao;
  61. private void calculateDifferentMonth(List<String> monthList, String startMonth, String endMonth) throws ParseException {
  62. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM");
  63. Calendar bef = Calendar.getInstance();
  64. Calendar aft = Calendar.getInstance();
  65. bef.setTime(sdf.parse(startMonth));
  66. aft.setTime(sdf.parse(endMonth));
  67. do {
  68. monthList.add(sdf.format(bef.getTime()));
  69. bef.add(Calendar.MONTH, 1);
  70. }
  71. while (bef.compareTo(aft) <= 0);
  72. }
  73. /**
  74. * 每月销售额查询
  75. * @param startMonth
  76. * @param endMonth
  77. * @return
  78. */
  79. @RequestMapping("/customersQuery")
  80. public R queryMonthlyCustomers(@RequestParam("startMonth") String startMonth, @RequestParam("endMonth") String endMonth) {
  81. if (Objects.isNull(startMonth) || "".equals(startMonth)){
  82. return R.error("请先选择开始时间");
  83. }
  84. if (Objects.isNull(endMonth) || "".equals(endMonth)){
  85. return R.error("请先选择结束时间");
  86. }
  87. List<String> dateList = new ArrayList<>();
  88. Map<String, Object> returnMap = new HashMap<>();
  89. try {
  90. calculateDifferentMonth(dateList, startMonth, endMonth);
  91. } catch (ParseException e) {
  92. e.printStackTrace();
  93. }
  94. try {
  95. String merchSn = null;
  96. SysUserEntity sysUser = (SysUserEntity) SecurityUtils.getSubject().getPrincipal();
  97. if(!"1".equals(sysUser.getRoleType())){
  98. merchSn = sysUser.getMerchSn();
  99. }
  100. Map<String,Object> map = monthlyCustomersService.queryMonthlyCustomers(startMonth,endMonth,merchSn,dateList);
  101. returnMap.put("dateList", dateList);
  102. returnMap.putAll(map);
  103. } catch (Exception e) {
  104. e.printStackTrace();
  105. return R.error(e.getMessage());
  106. }
  107. return R.ok(returnMap);
  108. }
  109. /**
  110. * 每月销售额销售量导出
  111. * @param params
  112. * @param response
  113. * @param request
  114. * @return
  115. */
  116. @RequestMapping("/monthlySalesGrowthExport")
  117. public R monthlySalesGrowthExport(@RequestParam Map<String, Object> params, HttpServletResponse response, HttpServletRequest request) {
  118. ParamUtils.setQueryPowerByRoleType(params, "storeId", "merchSn", "thirdPartyMerchCode");
  119. if (Objects.isNull(params.get("startMonth")) || "".equals(params.get("startMonth"))){
  120. return R.error("请先选择开始时间");
  121. }
  122. if (Objects.isNull(params.get("endMonth")) || "".equals(params.get("endMonth"))){
  123. return R.error("请先选择结束时间");
  124. }
  125. String merchSn = null;
  126. SysUserEntity sysUser = (SysUserEntity) SecurityUtils.getSubject().getPrincipal();
  127. if(!"1".equals(sysUser.getRoleType())){
  128. merchSn = sysUser.getMerchSn();
  129. }
  130. List<MonthlySalesGrowthEntity> monthlySalesGrowthEntities = monthlyCustomersDao.queryMonthlyCustomers((String) params.get("startMonth"), (String) params.get("endMonth"), merchSn);
  131. ExcelExport ee = new ExcelExport("Monthly Sales Growth");
  132. String[] header = new String[]{"序号","商户编号","商户名称","销售额","销售数量","年-月"};
  133. List<Map<String, Object>> list = new ArrayList<>();
  134. int count = 1;
  135. if (monthlySalesGrowthEntities!=null && monthlySalesGrowthEntities.size()>0) {
  136. for (MonthlySalesGrowthEntity monthlySalesGrowthEntity : monthlySalesGrowthEntities) {
  137. LinkedHashMap<String, Object> map = new LinkedHashMap<>();
  138. map.put("OrderNumber",count++);
  139. map.put("MerchSn",monthlySalesGrowthEntity.getMerchSn());
  140. map.put("MerchName",monthlySalesGrowthEntity.getMerchName());
  141. map.put("TotalSales",monthlySalesGrowthEntity.getTotalSales());
  142. map.put("TotalNumber",monthlySalesGrowthEntity.getTotalNumber());
  143. map.put("YearAndMonth",monthlySalesGrowthEntity.getYearAndMonth());
  144. list.add(map);
  145. }
  146. }
  147. ee.addSheetByMap("Monthly Sales Growth", list, header);
  148. ee.export(response);
  149. return R.ok();
  150. }
  151. /**
  152. * 导出销售额销售数客单数客单价
  153. * @param params
  154. * @param response
  155. * @param request
  156. * @return
  157. */
  158. @RequestMapping("/monthlySalesGrowthExport2")
  159. public R monthlySalesGrowthExport2(@RequestParam Map<String, Object> params, HttpServletResponse response, HttpServletRequest request) {
  160. ParamUtils.setQueryPowerByRoleType(params, "storeId", "merchSn", "thirdPartyMerchCode");
  161. if (Objects.isNull(params.get("startMonth")) || "".equals(params.get("startMonth"))){
  162. return R.error("请先选择开始时间");
  163. }
  164. if (Objects.isNull(params.get("endMonth")) || "".equals(params.get("endMonth"))){
  165. return R.error("请先选择结束时间");
  166. }
  167. String merchSn = null;
  168. SysUserEntity sysUser = (SysUserEntity) SecurityUtils.getSubject().getPrincipal();
  169. if(!"1".equals(sysUser.getRoleType())){
  170. merchSn = sysUser.getMerchSn();
  171. }
  172. List<MonthlySalesGrowthEntity> monthlySalesGrowthEntities = monthlyCustomersDao.queryMonthlyCustomers((String) params.get("startMonth"), (String) params.get("endMonth"), merchSn);
  173. ExcelExport ee = new ExcelExport("Monthly Customers&Avg Basket");
  174. String[] header = new String[]{"序号","商户编号","商户名称","销售额","销售数量","客户数","客单价","年-月"};
  175. List<Map<String, Object>> list = new ArrayList<>();
  176. int count = 1;
  177. if (monthlySalesGrowthEntities!=null && monthlySalesGrowthEntities.size()>0) {
  178. for (MonthlySalesGrowthEntity monthlySalesGrowthEntity : monthlySalesGrowthEntities) {
  179. LinkedHashMap<String, Object> map = new LinkedHashMap<>();
  180. map.put("OrderNumber",count++);
  181. map.put("MerchSn",monthlySalesGrowthEntity.getMerchSn());
  182. map.put("MerchName",monthlySalesGrowthEntity.getMerchName());
  183. map.put("TotalSales",monthlySalesGrowthEntity.getTotalSales());
  184. map.put("TotalNumber",monthlySalesGrowthEntity.getTotalNumber());
  185. map.put("TotalCustomers",monthlySalesGrowthEntity.getTotalCustomers());
  186. String avgBasketSale = new BigDecimal(monthlySalesGrowthEntity.getTotalSales()).divide(new BigDecimal(monthlySalesGrowthEntity.getTotalNumber()),3, RoundingMode.HALF_UP).toString();
  187. map.put("avgBasketSale",avgBasketSale);
  188. map.put("YearAndMonth",monthlySalesGrowthEntity.getYearAndMonth());
  189. list.add(map);
  190. }
  191. }
  192. ee.addSheetByMap("Monthly Customers&Avg Basket", list, header);
  193. ee.export(response);
  194. return R.ok();
  195. }
  196. /**
  197. * 销售前10的产品
  198. * @param month
  199. * @param week
  200. * @return
  201. */
  202. @RequestMapping("/top10ForProduct")
  203. public R top10ForProduct(@RequestParam("month") String month, @RequestParam("week") String week){
  204. boolean monthFlag = false;
  205. if (Objects.isNull(month) || "".equals(month)){
  206. monthFlag = true;
  207. }
  208. if(monthFlag && (Objects.isNull(week) || "".equals(week))){
  209. return R.error("请选择周");
  210. }else{
  211. monthFlag = false;
  212. week = week.split("W")[1];
  213. }
  214. if(monthFlag ){
  215. return R.error("请选择月份");
  216. }
  217. if(!"".equals(week) && !"".equals(month)){
  218. return R.error("只能选择一个时间!");
  219. }
  220. String merchSn = null;
  221. SysUserEntity sysUser = (SysUserEntity) SecurityUtils.getSubject().getPrincipal();
  222. if(!"1".equals(sysUser.getRoleType())){
  223. merchSn = sysUser.getMerchSn();
  224. }
  225. Map<String,Object> map = monthlyCustomersService.top10ForProduct(month,week,merchSn);
  226. return R.ok(map);
  227. }
  228. /**
  229. * 销售前10的品牌/供应商的商品
  230. * @param startDate
  231. * @param endDate
  232. * @return
  233. */
  234. @RequestMapping("/top10ByBrandAndSupplier")
  235. public R top10ByBrandAndSupplier(@RequestParam("startDate") String startDate,
  236. @RequestParam("endDate") String endDate){
  237. if (Objects.isNull(startDate) || "".equals(startDate)){
  238. return R.error("请先选择开始时间");
  239. }
  240. if (Objects.isNull(endDate) || "".equals(endDate)){
  241. return R.error("请先选择结束时间");
  242. }
  243. String merchSn = null;
  244. SysUserEntity sysUser = (SysUserEntity) SecurityUtils.getSubject().getPrincipal();
  245. if(!"1".equals(sysUser.getRoleType())){
  246. merchSn = sysUser.getMerchSn();
  247. }
  248. Map<String,Object> map = monthlyCustomersService.top10ByBrandAndSupplier(startDate,endDate,merchSn);
  249. return R.ok(map);
  250. }
  251. @RequestMapping("/top10ByBrandAndSupplierExport")
  252. public R top10ByBrandAndSupplierExport(@RequestParam("startDate") String startDate,
  253. @RequestParam("endDate") String endDate, HttpServletResponse response, HttpServletRequest request){
  254. if (Objects.isNull(startDate) || "".equals(startDate)){
  255. return R.error("请先选择开始时间");
  256. }
  257. if (Objects.isNull(endDate) || "".equals(endDate)){
  258. return R.error("请先选择结束时间");
  259. }
  260. String merchSn = null;
  261. SysUserEntity sysUser = (SysUserEntity) SecurityUtils.getSubject().getPrincipal();
  262. if(!"1".equals(sysUser.getRoleType())){
  263. merchSn = sysUser.getMerchSn();
  264. }
  265. Map<String,Object> map = monthlyCustomersService.top10ByBrandAndSupplier(startDate,endDate,merchSn);
  266. List<MonthlySalesGrowthEntity> top10ByBrand = (List<MonthlySalesGrowthEntity>) map.get("top10ByBrand");
  267. List<MonthlySalesGrowthEntity> top10BySupplier = (List<MonthlySalesGrowthEntity>) map.get("top10BySupplier");
  268. ExcelExport ee = new ExcelExport("产品销量前10");
  269. String[] header1 = new String[]{"序号","商户名称","品牌","产品规格","销售数量"};
  270. String[] header2 = new String[]{"序号","商户名称","供应商","产品规格","销售数量"};
  271. List<Map<String, Object>> list1 = new ArrayList<>();
  272. List<Map<String, Object>> list2 = new ArrayList<>();
  273. int count = 1;
  274. if (top10ByBrand!=null && top10ByBrand.size()>0) {
  275. for (MonthlySalesGrowthEntity monthlySalesGrowthEntity : top10ByBrand) {
  276. LinkedHashMap<String, Object> tempMap = new LinkedHashMap<>();
  277. tempMap.put("OrderNumber",count++);
  278. tempMap.put("MerchName",monthlySalesGrowthEntity.getMerchName());
  279. tempMap.put("Brand",monthlySalesGrowthEntity.getBrand());
  280. tempMap.put("GoodsSpecificationNameValue",monthlySalesGrowthEntity.getGoodsSpecificationNameValue());
  281. tempMap.put("sales",monthlySalesGrowthEntity.getSales());
  282. list1.add(tempMap);
  283. }
  284. }
  285. count=1;
  286. if (top10BySupplier!=null && top10BySupplier.size()>0) {
  287. for (MonthlySalesGrowthEntity monthlySalesGrowthEntity : top10BySupplier) {
  288. LinkedHashMap<String, Object> tempMap = new LinkedHashMap<>();
  289. tempMap.put("OrderNumber",count++);
  290. tempMap.put("MerchName",monthlySalesGrowthEntity.getMerchName());
  291. tempMap.put("Supplier",monthlySalesGrowthEntity.getSupplier());
  292. tempMap.put("GoodsSpecificationNameValue",monthlySalesGrowthEntity.getGoodsSpecificationNameValue());
  293. tempMap.put("sales",monthlySalesGrowthEntity.getSales());
  294. list2.add(tempMap);
  295. }
  296. }
  297. ee.addSheetByMap("top10ByBrand", list1, header1);
  298. ee.addSheetByMap("top10BySupplier", list2, header2);
  299. ee.export(response);
  300. return R.ok(map);
  301. }
  302. /**
  303. * 每周销售额销售量图表查询
  304. * @param startWeek
  305. * @param endWeek
  306. * @return
  307. * @throws ParseException
  308. */
  309. @RequestMapping("/customersQueryByWeek")
  310. public R queryWeeklyCustomers(@RequestParam("startWeek") String startWeek, @RequestParam("endWeek") String endWeek) throws ParseException {
  311. if (Objects.isNull(startWeek) || "".equals(startWeek)){
  312. return R.error("请先选择开始时间");
  313. }
  314. if (Objects.isNull(endWeek) || "".equals(endWeek)){
  315. return R.error("请先选择结束时间");
  316. }
  317. List<String> dateList = new ArrayList<>();
  318. try {
  319. calculateDifferentWeek(dateList, startWeek, endWeek);
  320. } catch (ParseException e) {
  321. e.printStackTrace();
  322. }
  323. String merchSn = null;
  324. SysUserEntity sysUser = (SysUserEntity) SecurityUtils.getSubject().getPrincipal();
  325. if(!"1".equals(sysUser.getRoleType())){
  326. merchSn = sysUser.getMerchSn();
  327. }
  328. SimpleDateFormat weekSdf = new SimpleDateFormat("yyyy");
  329. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
  330. Calendar bef = Calendar.getInstance();
  331. Calendar aft = Calendar.getInstance();
  332. bef.setFirstDayOfWeek(Calendar.MONDAY);
  333. aft.setFirstDayOfWeek(Calendar.MONDAY);
  334. bef.setTime(sdf.parse(startWeek));
  335. aft.setTime(sdf.parse(endWeek));
  336. int befWeek = bef.get(Calendar.WEEK_OF_YEAR);
  337. int aftWeek = aft.get(Calendar.WEEK_OF_YEAR);
  338. if(befWeek<10){
  339. startWeek =weekSdf.format(bef.getTime())+"-0"+befWeek;
  340. }else{
  341. startWeek =weekSdf.format(bef.getTime())+"-"+befWeek;
  342. }
  343. if(aftWeek<10){
  344. endWeek =weekSdf.format(aft.getTime())+"-0"+aftWeek;
  345. }else{
  346. endWeek =weekSdf.format(aft.getTime())+"-"+aftWeek;
  347. }
  348. Map<String,Object> map = monthlyCustomersService.queryWeeklyCustomers(startWeek,endWeek,merchSn,dateList);
  349. Map<String, Object> returnMap = new HashMap<>();
  350. // returnMap.put("dateList", dateList);
  351. returnMap.putAll(map);
  352. return R.ok(returnMap);
  353. }
  354. @RequestMapping("/weeklySalesSummaryExport")
  355. public R weeklySalesSummaryExport(@RequestParam Map<String, Object> params, HttpServletResponse response, HttpServletRequest request) throws ParseException {
  356. ParamUtils.setQueryPowerByRoleType(params, "storeId", "merchSn", "thirdPartyMerchCode");
  357. if (Objects.isNull(params.get("startWeek"))){
  358. return R.error("请先选择开始时间");
  359. }
  360. if (Objects.isNull(params.get("endWeek"))){
  361. return R.error("请先选择结束时间");
  362. }
  363. String startWeek = (String) params.get("startWeek");
  364. String endWeek = (String) params.get("endWeek");
  365. String merchSn = null;
  366. SysUserEntity sysUser = (SysUserEntity) SecurityUtils.getSubject().getPrincipal();
  367. if(!"1".equals(sysUser.getRoleType())){
  368. merchSn = sysUser.getMerchSn();
  369. }
  370. SimpleDateFormat weekSdf = new SimpleDateFormat("yyyy");
  371. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
  372. Calendar bef = Calendar.getInstance();
  373. Calendar aft = Calendar.getInstance();
  374. bef.setFirstDayOfWeek(Calendar.MONDAY);
  375. aft.setFirstDayOfWeek(Calendar.MONDAY);
  376. bef.setTime(sdf.parse(startWeek));
  377. aft.setTime(sdf.parse(endWeek));
  378. int befWeek = bef.get(Calendar.WEEK_OF_YEAR);
  379. int aftWeek = aft.get(Calendar.WEEK_OF_YEAR);
  380. if(befWeek<10){
  381. startWeek =weekSdf.format(bef.getTime())+"-0"+befWeek;
  382. }else{
  383. startWeek =weekSdf.format(bef.getTime())+"-"+befWeek;
  384. }
  385. if(aftWeek<10){
  386. endWeek =weekSdf.format(aft.getTime())+"-0"+aftWeek;
  387. }else{
  388. endWeek =weekSdf.format(aft.getTime())+"-"+aftWeek;
  389. }
  390. List<MonthlySalesGrowthEntity> monthlySalesGrowthEntities = monthlyCustomersDao.queryWeeklyCustomers(startWeek, endWeek, merchSn);
  391. ExcelExport ee = new ExcelExport("Weekly Sales Summary");
  392. String[] header = new String[]{"序号","商户编号","商户名称","销售额","销售数量","年-周"};
  393. List<Map<String, Object>> list = new ArrayList<>();
  394. int count = 1;
  395. if (monthlySalesGrowthEntities!=null && monthlySalesGrowthEntities.size()>0) {
  396. for (MonthlySalesGrowthEntity monthlySalesGrowthEntity : monthlySalesGrowthEntities) {
  397. LinkedHashMap<String, Object> map = new LinkedHashMap<>();
  398. map.put("OrderNumber",count++);
  399. map.put("MerchSn",monthlySalesGrowthEntity.getMerchSn());
  400. map.put("MerchName",monthlySalesGrowthEntity.getMerchName());
  401. map.put("TotalSales",monthlySalesGrowthEntity.getTotalSales());
  402. map.put("TotalNumber",monthlySalesGrowthEntity.getTotalNumber());
  403. map.put("YearAndWeek",monthlySalesGrowthEntity.getYearAndWeek());
  404. list.add(map);
  405. }
  406. }
  407. ee.addSheetByMap("Weekly Sales Summary", list, header);
  408. ee.export(response);
  409. return R.ok();
  410. }
  411. private void calculateDifferentWeek(List<String> weekList, String startWeek, String endWeek) throws ParseException {
  412. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
  413. SimpleDateFormat weekSdf = new SimpleDateFormat("yyyy");
  414. Calendar bef = Calendar.getInstance();
  415. Calendar aft = Calendar.getInstance();
  416. bef.setFirstDayOfWeek(Calendar.MONDAY);
  417. aft.setFirstDayOfWeek(Calendar.MONDAY);
  418. bef.setTime(sdf.parse(startWeek));
  419. aft.setTime(sdf.parse(endWeek));
  420. do {
  421. int i = bef.get(Calendar.WEEK_OF_YEAR);
  422. if (i<10){
  423. weekList.add(weekSdf.format(bef.getTime())+"-0"+i);
  424. }else{
  425. weekList.add(weekSdf.format(bef.getTime())+"-"+i);
  426. }
  427. bef.set(Calendar.DAY_OF_MONTH,bef.get(Calendar.DAY_OF_MONTH)+7); //给当前时间增加一周
  428. }
  429. while (bef.compareTo(aft) <= 0);
  430. }
  431. /**
  432. * 每月微信好友图表查询
  433. * @param startMonth
  434. * @param endMonth
  435. * @return
  436. */
  437. @RequestMapping("/queryMonthlyWechatFollowers")
  438. public R queryMonthlyWechatFollowers(@RequestParam("startMonth") String startMonth, @RequestParam("endMonth") String endMonth) {
  439. if (Objects.isNull(startMonth) || "".equals(startMonth)){
  440. return R.error("请先选择开始时间");
  441. }
  442. if (Objects.isNull(endMonth) || "".equals(endMonth)){
  443. return R.error("请先选择结束时间");
  444. }
  445. List<String> dateList = new ArrayList<>();
  446. Map<String, Object> returnMap = new HashMap<>();
  447. try {
  448. calculateDifferentMonth(dateList, startMonth, endMonth);
  449. } catch (ParseException e) {
  450. e.printStackTrace();
  451. }
  452. try {
  453. String merchSn = null;
  454. SysUserEntity sysUser = (SysUserEntity) SecurityUtils.getSubject().getPrincipal();
  455. if(!"1".equals(sysUser.getRoleType())){
  456. merchSn = sysUser.getMerchSn();
  457. }
  458. Map<String,Object> map = monthlyCustomersService.queryMonthlyWechatFollowers(startMonth,endMonth,merchSn,dateList);
  459. returnMap.put("dateList", dateList);
  460. returnMap.putAll(map);
  461. } catch (Exception e) {
  462. e.printStackTrace();
  463. return R.error(e.getMessage());
  464. }
  465. return R.ok(returnMap);
  466. }
  467. /**
  468. * 添加微信好友数据
  469. * @param wechatFollowers
  470. * @return
  471. */
  472. @RequestMapping("/addWechatFollowers")
  473. public R addWechatFollowers( @RequestParam("wechatFollowers") Integer wechatFollowers) {
  474. try {
  475. String merchSn = null;
  476. SysUserEntity sysUser = (SysUserEntity) SecurityUtils.getSubject().getPrincipal();
  477. if(!"1".equals(sysUser.getRoleType())){
  478. merchSn = sysUser.getMerchSn();
  479. }
  480. WechatFollowersEntity wechatFollowersEntity = new WechatFollowersEntity();
  481. wechatFollowersEntity.setCreaterSn(ShiroUtils.getUserId().toString());
  482. wechatFollowersEntity.setCreateTime(new Date());
  483. wechatFollowersEntity.setWechatFollowers(wechatFollowers);
  484. wechatFollowersEntity.setMerchSn(merchSn);
  485. monthlyCustomersService.addWechatFollowers(wechatFollowersEntity);
  486. } catch (Exception e) {
  487. e.printStackTrace();
  488. return R.error(e.getMessage());
  489. }
  490. return R.ok("添加成功");
  491. }
  492. @RequestMapping("/wechatFollowersGrowthExport")
  493. public R wechatFollowersGrowthExport(@RequestParam Map<String, Object> params, HttpServletResponse response, HttpServletRequest request) {
  494. ParamUtils.setQueryPowerByRoleType(params, "storeId", "merchSn", "thirdPartyMerchCode");
  495. if (Objects.isNull(params.get("startMonth")) || "".equals(params.get("startMonth"))){
  496. return R.error("请先选择开始时间");
  497. }
  498. if (Objects.isNull(params.get("endMonth")) || "".equals(params.get("endMonth"))){
  499. return R.error("请先选择结束时间");
  500. }
  501. String merchSn = null;
  502. SysUserEntity sysUser = (SysUserEntity) SecurityUtils.getSubject().getPrincipal();
  503. if(!"1".equals(sysUser.getRoleType())){
  504. merchSn = sysUser.getMerchSn();
  505. }
  506. List<WechatFollowersEntity> wechatFollowersEntities = wechatFollowersDao.queryMonthlyWechatFollowers((String) params.get("startMonth"), (String) params.get("endMonth"), merchSn);
  507. ExcelExport ee = new ExcelExport("Wechat Followers Growth");
  508. String[] header = new String[]{"序号","商户编号","好友数量","年-月"};
  509. List<Map<String, Object>> list = new ArrayList<>();
  510. int count = 1;
  511. if (wechatFollowersEntities!=null && wechatFollowersEntities.size()>0) {
  512. for (WechatFollowersEntity wechatFollowersEntity : wechatFollowersEntities) {
  513. LinkedHashMap<String, Object> map = new LinkedHashMap<>();
  514. map.put("OrderNumber",count++);
  515. map.put("MerchSn",wechatFollowersEntity.getMerchSn());
  516. map.put("WechatFollowers",wechatFollowersEntity.getWechatFollowers());
  517. map.put("YearAndMonth",wechatFollowersEntity.getYearAndMonth());
  518. list.add(map);
  519. }
  520. }
  521. ee.addSheetByMap("Wechat Followers Growth", list, header);
  522. ee.export(response);
  523. return R.ok();
  524. }
  525. /**
  526. * 品牌销售数量
  527. * @param startDate
  528. * @param endDate
  529. * @return
  530. */
  531. @RequestMapping("/salesByCategory")
  532. public R salesByCategory(@RequestParam("startDate") String startDate, @RequestParam("endDate") String endDate){
  533. if (Objects.isNull(startDate) || "".equals(startDate)){
  534. return R.error("请先选择开始时间");
  535. }
  536. if (Objects.isNull(endDate) || "".equals(endDate)){
  537. return R.error("请先选择结束时间");
  538. }
  539. String merchSn = null;
  540. SysUserEntity sysUser = (SysUserEntity) SecurityUtils.getSubject().getPrincipal();
  541. if(!"1".equals(sysUser.getRoleType())){
  542. merchSn = sysUser.getMerchSn();
  543. }
  544. return R.ok().put("list",monthlyCustomersService.salesByCategory(startDate,endDate,merchSn));
  545. }
  546. /**
  547. * 每月品牌销售数量查询
  548. * @param startMonth
  549. * @param endMonth
  550. * @return
  551. */
  552. @RequestMapping("/monthlyCategory")
  553. public R monthlyCategory(@RequestParam("startMonth") String startMonth, @RequestParam("endMonth") String endMonth) {
  554. if (Objects.isNull(startMonth) || "".equals(startMonth)){
  555. return R.error("请先选择开始时间");
  556. }
  557. if (Objects.isNull(endMonth) || "".equals(endMonth)){
  558. return R.error("请先选择结束时间");
  559. }
  560. List<String> dateList = new ArrayList<>();
  561. Map<String, Object> returnMap = new HashMap<>();
  562. try {
  563. calculateDifferentMonth(dateList, startMonth, endMonth);
  564. } catch (ParseException e) {
  565. e.printStackTrace();
  566. }
  567. try {
  568. String merchSn = null;
  569. SysUserEntity sysUser = (SysUserEntity) SecurityUtils.getSubject().getPrincipal();
  570. if(!"1".equals(sysUser.getRoleType())){
  571. merchSn = sysUser.getMerchSn();
  572. }
  573. Map<String,Object> map = monthlyCustomersService.monthlyCategory(startMonth,endMonth,merchSn,dateList);
  574. returnMap.put("dateList", dateList);
  575. returnMap.putAll(map);
  576. } catch (Exception e) {
  577. e.printStackTrace();
  578. return R.error(e.getMessage());
  579. }
  580. return R.ok(returnMap);
  581. }
  582. @RequestMapping("/monthlyCategoryExport")
  583. public R monthlyCategoryExport(@RequestParam Map<String, Object> params, HttpServletResponse response, HttpServletRequest request) {
  584. ParamUtils.setQueryPowerByRoleType(params, "storeId", "merchSn", "thirdPartyMerchCode");
  585. if (Objects.isNull(params.get("startMonth")) || "".equals(params.get("startMonth"))){
  586. return R.error("请先选择开始时间");
  587. }
  588. if (Objects.isNull(params.get("endMonth")) || "".equals(params.get("endMonth"))){
  589. return R.error("请先选择结束时间");
  590. }
  591. String merchSn = null;
  592. SysUserEntity sysUser = (SysUserEntity) SecurityUtils.getSubject().getPrincipal();
  593. if(!"1".equals(sysUser.getRoleType())){
  594. merchSn = sysUser.getMerchSn();
  595. }
  596. List<MonthlySalesGrowthEntity> monthlySalesGrowthEntities = monthlyCustomersDao.monthlyCategory((String) params.get("startMonth"), (String) params.get("endMonth"), merchSn);
  597. ExcelExport ee = new ExcelExport("品牌销售量比较");
  598. String[] header = new String[]{"序号","销售数量","品牌名","销售额","年-月"};
  599. List<Map<String, Object>> list = new ArrayList<>();
  600. int count = 1;
  601. if (monthlySalesGrowthEntities!=null && monthlySalesGrowthEntities.size()>0) {
  602. for (MonthlySalesGrowthEntity monthlySalesGrowthEntity : monthlySalesGrowthEntities) {
  603. LinkedHashMap<String, Object> map = new LinkedHashMap<>();
  604. map.put("OrderNumber",count++);
  605. map.put("Sales",monthlySalesGrowthEntity.getSales());
  606. map.put("Cgname",monthlySalesGrowthEntity.getCgname());
  607. map.put("TotalSales",monthlySalesGrowthEntity.getTotalSales());
  608. map.put("YearAndMonth",monthlySalesGrowthEntity.getYearAndMonth());
  609. list.add(map);
  610. }
  611. }
  612. ee.addSheetByMap("品牌销售量比较", list, header);
  613. ee.export(response);
  614. return R.ok();
  615. }
  616. @RequestMapping("/exportSelectedMonthData")
  617. public void exportSelectedMonthData(@RequestParam("startMonth") String startMonth, @RequestParam("endMonth") String endMonth
  618. ,@RequestParam("monthNumber") Integer monthNumber
  619. ,HttpServletRequest request ,HttpServletResponse response) {
  620. List<String> dateList = new ArrayList<>();
  621. Map<String, Object> returnMap = new HashMap<>();
  622. try {
  623. calculateDifferentMonth(dateList, startMonth, endMonth);
  624. } catch (ParseException e) {
  625. e.printStackTrace();
  626. }
  627. try {
  628. String merchSn = null;
  629. SysUserEntity sysUser = (SysUserEntity) SecurityUtils.getSubject().getPrincipal();
  630. if(!"1".equals(sysUser.getRoleType())){
  631. merchSn = sysUser.getMerchSn();
  632. }
  633. List<MonthlySalesGrowthEntity> monthlySalesGrowthEntityList = monthlyCustomersService.exportSelectedMonthData(startMonth,endMonth,merchSn,dateList.size(),monthNumber);
  634. ExcelExport ee = new ExcelExport("Wechat Followers Growth");
  635. String[] header = new String[]{"序号","sku","产品名称","月份","销售数","平均销售","总库存","店铺库存","园区库存","在途库存","月均预订量","月消耗预订量","统计月份","预定月份","预定数"};
  636. List<Map<String, Object>> list = new ArrayList<>();
  637. int count = 1;
  638. if (monthlySalesGrowthEntityList!=null && monthlySalesGrowthEntityList.size()>0) {
  639. for (MonthlySalesGrowthEntity monthlySalesGrowthEntity : monthlySalesGrowthEntityList) {
  640. LinkedHashMap<String, Object> map = new LinkedHashMap<>();
  641. map.put("序号",count++ +"");
  642. map.put("sku",monthlySalesGrowthEntity.getSku());
  643. map.put("产品名称",monthlySalesGrowthEntity.getGoodsName());
  644. map.put("月份",monthlySalesGrowthEntity.getSalesMonth());
  645. map.put("销售数",monthlySalesGrowthEntity.getTotalNumber());
  646. map.put("平均销售",monthlySalesGrowthEntity.getAvgSalesNumber());
  647. map.put("总库存",monthlySalesGrowthEntity.getTotalCount());
  648. map.put("店铺库存",monthlySalesGrowthEntity.getStockNumber());
  649. map.put("在途库存",monthlySalesGrowthEntity.getNumber());
  650. map.put("园区库存",monthlySalesGrowthEntity.getGoodsNumber());
  651. map.put("月均预订量",new BigDecimal(monthlySalesGrowthEntity.getAvgSalesNumber()).multiply(
  652. new BigDecimal(monthNumber)).setScale(2,BigDecimal.ROUND_HALF_UP).toString() );
  653. // 总库存 - M*单品每月平均销量
  654. map.put("月消耗预订量",new BigDecimal(monthlySalesGrowthEntity.getTotalCount()).subtract(
  655. new BigDecimal(dateList.size()).multiply(new BigDecimal(monthlySalesGrowthEntity.getAvgSalesNumber())).setScale(2,RoundingMode.HALF_UP)).toString());
  656. map.put("统计月份",dateList.size()+"");
  657. map.put("预定月份",monthNumber+"");
  658. map.put("预定数",monthlySalesGrowthEntity.getPredeterminedNumber());
  659. list.add(map);
  660. }
  661. }
  662. Map<String, List<Map<String, Object>>/*该list为每个sheet页的数据*/> map = Maps.newHashMap();
  663. map.put("测试合并数据", list);
  664. createExcel(header, map, new int[]{0,1,2},request,response);
  665. // ee.addSheetByMap("Wechat Followers Growth", list, header);
  666. // ee.export(response);
  667. // return R.ok();
  668. } catch (Exception e) {
  669. e.printStackTrace();
  670. // return R.error(e.getMessage());
  671. }
  672. }
  673. public String createExcel(String[] title, Map<String, List<Map<String, Object>>> maps, int[] mergeIndex
  674. ,HttpServletRequest request ,HttpServletResponse response){
  675. if (title.length==0){
  676. return null;
  677. }
  678. /*初始化excel模板*/
  679. Workbook workbook = new XSSFWorkbook();
  680. Sheet sheet = null;
  681. int n = 0;
  682. /*循环sheet页*/
  683. for(Map.Entry<String, List<Map<String/*对应title的值*/, Object>>> entry : maps.entrySet()){
  684. /*实例化sheet对象并且设置sheet名称,book对象*/
  685. try {
  686. sheet = workbook.createSheet();
  687. workbook.setSheetName(n, entry.getKey());
  688. workbook.setSelectedTab(0);
  689. }catch (Exception e){
  690. e.printStackTrace();
  691. }
  692. /*初始化head,填值标题行(第一行)*/
  693. Row row0 = sheet.createRow(0);
  694. for(int i = 0; i<title.length; i++){
  695. /*创建单元格,指定类型*/
  696. Cell cell_1 = row0.createCell(i, Cell.CELL_TYPE_STRING);
  697. cell_1.setCellValue(title[i]);
  698. }
  699. /*得到当前sheet下的数据集合*/
  700. List<Map<String/*对应title的值*/, Object>> list = entry.getValue();
  701. /*遍历该数据集合*/
  702. List<PoiModel> poiModels = Lists.newArrayList();
  703. if(null!=workbook){
  704. Iterator iterator = list.iterator();
  705. int index = 1;/*这里1是从excel的第二行开始,第一行已经塞入标题了*/
  706. while (iterator.hasNext()){
  707. Row row = sheet.createRow(index);
  708. /*取得当前这行的map,该map中以key,value的形式存着这一行值*/
  709. Map<String, String> map = (Map<String, String>)iterator.next();
  710. /*循环列数,给当前行塞值*/
  711. for(int i = 0; i<title.length; i++){
  712. String old = "";
  713. /*old存的是上一行统一位置的单元的值,第一行是最上一行了,所以从第二行开始记*/
  714. if(index > 1){
  715. old = poiModels.get(i)==null?"":poiModels.get(i).getContent();
  716. }
  717. /*循环需要合并的列*/
  718. for(int j = 0; j < mergeIndex.length; j++){
  719. if(index == 1){
  720. /*记录第一行的开始行和开始列*/
  721. PoiModel poiModel = new PoiModel();
  722. poiModel.setOldContent(map.get(title[i]));
  723. poiModel.setContent(map.get(title[i]));
  724. poiModel.setRowIndex(1);
  725. poiModel.setCellIndex(i);
  726. poiModels.add(poiModel);
  727. break;
  728. }else if(i > 0 && mergeIndex[j] == i){/*这边i>0也是因为第一列已经是最前一列了,只能从第二列开始*/
  729. /*当前同一列的内容与上一行同一列不同时,把那以上的合并, 或者在当前元素一样的情况下,前一列的元素并不一样,这种情况也合并*/
  730. /*如果不需要考虑当前行与上一行内容相同,但是它们的前一列内容不一样则不合并的情况,把下面条件中||poiModels.get(i).getContent().equals(map.get(title[i])) && !poiModels.get(i - 1).getOldContent().equals(map.get(title[i-1]))去掉就行*/
  731. if(!poiModels.get(i).getContent().equals(map.get(title[i])) || poiModels.get(i).getContent().equals(map.get(title[i])) && !poiModels.get(i - 1).getOldContent().equals(map.get(title[i-1]))){
  732. /*当前行的当前列与上一行的当前列的内容不一致时,则把当前行以上的合并*/
  733. CellRangeAddress cra=new CellRangeAddress(poiModels.get(i).getRowIndex()/*从第二行开始*/, index - 1/*到第几行*/
  734. , poiModels.get(i).getCellIndex()/*从某一列开始*/, poiModels.get(i).getCellIndex()/*到第几列*/);
  735. if (cra.getNumberOfCells() >= 2) {
  736. //在sheet里增加合并单元格
  737. sheet.addMergedRegion(cra);
  738. }
  739. //在sheet里增加合并单元格
  740. /*重新记录该列的内容为当前内容,行标记改为当前行标记,列标记则为当前列*/
  741. poiModels.get(i).setContent(map.get(title[i]));
  742. poiModels.get(i).setRowIndex(index);
  743. poiModels.get(i).setCellIndex(i);
  744. }
  745. }
  746. /*处理第一列的情况*/
  747. if(mergeIndex[j] == i && i == 0 && !poiModels.get(i).getContent().equals(map.get(title[i]))){
  748. /*当前行的当前列与上一行的当前列的内容不一致时,则把当前行以上的合并*/
  749. CellRangeAddress cra=new CellRangeAddress(poiModels.get(i).getRowIndex()/*从第二行开始*/, index - 1/*到第几行*/, poiModels.get(i).getCellIndex()/*从某一列开始*/, poiModels.get(i).getCellIndex()/*到第几列*/);
  750. if (cra.getNumberOfCells() >= 2) {
  751. //在sheet里增加合并单元格
  752. sheet.addMergedRegion(cra);
  753. }
  754. /*重新记录该列的内容为当前内容,行标记改为当前行标记*/
  755. poiModels.get(i).setContent(map.get(title[i]));
  756. poiModels.get(i).setRowIndex(index);
  757. poiModels.get(i).setCellIndex(i);
  758. }
  759. /*最后一行没有后续的行与之比较,所有当到最后一行时则直接合并对应列的相同内容*/
  760. if(mergeIndex[j] == i && index == list.size()){
  761. CellRangeAddress cra=new CellRangeAddress(poiModels.get(i).getRowIndex()/*从第二行开始*/, index/*到第几行*/, poiModels.get(i).getCellIndex()/*从某一列开始*/, poiModels.get(i).getCellIndex()/*到第几列*/);
  762. //在sheet里增加合并单元格
  763. if (cra.getNumberOfCells() >= 2) {
  764. //在sheet里增加合并单元格
  765. sheet.addMergedRegion(cra);
  766. }
  767. }
  768. }
  769. Cell cell = row.createCell(i, Cell.CELL_TYPE_STRING);
  770. cell.setCellValue(map.get(title[i]));
  771. /*在每一个单元格处理完成后,把这个单元格内容设置为old内容*/
  772. poiModels.get(i).setOldContent(old);
  773. }
  774. index++;
  775. }
  776. }
  777. n++;
  778. }
  779. /*生成临时文件*/
  780. String fileName = String.valueOf(new Date().getTime()/1000);
  781. try {
  782. ByteArrayOutputStream os = new ByteArrayOutputStream();
  783. workbook.write(os);
  784. byte[] content = os.toByteArray();
  785. InputStream is = new ByteArrayInputStream(content);
  786. //根据浏览器不同,对文件的名字进行不同的编码设置
  787. final String userAgent = request.getHeader("USER-AGENT");
  788. String finalFileName = null;
  789. if (userAgent.contains("MSIE") || userAgent.contains("Trident")) { //IE浏览器
  790. finalFileName = URLEncoder.encode(fileName + ".xlsx", "UTF-8");
  791. } else if (StringUtils.contains(userAgent, "Mozilla")) { //google,火狐浏览器
  792. finalFileName = new String((fileName + ".xlsx").getBytes("UTF-8"), "ISO-8859-1");
  793. } else {
  794. finalFileName = URLEncoder.encode(fileName + ".xlsx", "UTF-8"); //其他浏览器
  795. }
  796. // 设置response参数,可以打开下载页面
  797. response.reset();
  798. response.setContentType("application/vnd.ms-excel;charset=utf-8");
  799. response.setHeader("Content-Disposition", "attachment;filename=" + finalFileName);
  800. ServletOutputStream out = response.getOutputStream();
  801. BufferedInputStream bis = null;
  802. BufferedOutputStream bos = null;
  803. try {
  804. bis = new BufferedInputStream(is);
  805. bos = new BufferedOutputStream(out);
  806. byte[] buff = new byte[2048];
  807. int bytesRead;
  808. while (-1 != (bytesRead = bis.read(buff, 0, buff.length))) {
  809. bos.write(buff, 0, bytesRead);
  810. }
  811. } catch (Exception e) {
  812. e.printStackTrace();
  813. } finally {
  814. if (bis != null) {
  815. bis.close();
  816. }
  817. if (bos != null) {
  818. bos.close();
  819. }
  820. }
  821. os.close();
  822. } catch (IOException e) {
  823. e.printStackTrace();
  824. }
  825. return "导出成功";
  826. }
  827. }