MonthlyCustomersController.java 42 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894
  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. if (Objects.isNull(month) || "".equals(month)){
  205. return R.error("请先选择开始时间");
  206. }
  207. if (Objects.isNull(week) || "".equals(week)){
  208. return R.error("请先选择结束时间");
  209. }
  210. String merchSn = null;
  211. SysUserEntity sysUser = (SysUserEntity) SecurityUtils.getSubject().getPrincipal();
  212. if(!"1".equals(sysUser.getRoleType())){
  213. merchSn = sysUser.getMerchSn();
  214. }
  215. Map<String,Object> map = monthlyCustomersService.top10ForProduct(month,week,merchSn);
  216. return R.ok(map);
  217. }
  218. /**
  219. * 销售前10的品牌/供应商的商品
  220. * @param startDate
  221. * @param endDate
  222. * @return
  223. */
  224. @RequestMapping("/top10ByBrandAndSupplier")
  225. public R top10ByBrandAndSupplier(@RequestParam("startDate") String startDate,
  226. @RequestParam("endDate") String endDate){
  227. if (Objects.isNull(startDate) || "".equals(startDate)){
  228. return R.error("请先选择开始时间");
  229. }
  230. if (Objects.isNull(endDate) || "".equals(endDate)){
  231. return R.error("请先选择结束时间");
  232. }
  233. String merchSn = null;
  234. SysUserEntity sysUser = (SysUserEntity) SecurityUtils.getSubject().getPrincipal();
  235. if(!"1".equals(sysUser.getRoleType())){
  236. merchSn = sysUser.getMerchSn();
  237. }
  238. Map<String,Object> map = monthlyCustomersService.top10ByBrandAndSupplier(startDate,endDate,merchSn);
  239. return R.ok(map);
  240. }
  241. @RequestMapping("/top10ByBrandAndSupplierExport")
  242. public R top10ByBrandAndSupplierExport(@RequestParam("startDate") String startDate,
  243. @RequestParam("endDate") String endDate, HttpServletResponse response, HttpServletRequest request){
  244. if (Objects.isNull(startDate) || "".equals(startDate)){
  245. return R.error("请先选择开始时间");
  246. }
  247. if (Objects.isNull(endDate) || "".equals(endDate)){
  248. return R.error("请先选择结束时间");
  249. }
  250. String merchSn = null;
  251. SysUserEntity sysUser = (SysUserEntity) SecurityUtils.getSubject().getPrincipal();
  252. if(!"1".equals(sysUser.getRoleType())){
  253. merchSn = sysUser.getMerchSn();
  254. }
  255. Map<String,Object> map = monthlyCustomersService.top10ByBrandAndSupplier(startDate,endDate,merchSn);
  256. List<MonthlySalesGrowthEntity> top10ByBrand = (List<MonthlySalesGrowthEntity>) map.get("top10ByBrand");
  257. List<MonthlySalesGrowthEntity> top10BySupplier = (List<MonthlySalesGrowthEntity>) map.get("top10BySupplier");
  258. ExcelExport ee = new ExcelExport("产品销量前10");
  259. String[] header1 = new String[]{"序号","商户名称","品牌","产品规格","销售数量"};
  260. String[] header2 = new String[]{"序号","商户名称","供应商","产品规格","销售数量"};
  261. List<Map<String, Object>> list1 = new ArrayList<>();
  262. List<Map<String, Object>> list2 = new ArrayList<>();
  263. int count = 1;
  264. if (top10ByBrand!=null && top10ByBrand.size()>0) {
  265. for (MonthlySalesGrowthEntity monthlySalesGrowthEntity : top10ByBrand) {
  266. LinkedHashMap<String, Object> tempMap = new LinkedHashMap<>();
  267. tempMap.put("OrderNumber",count++);
  268. tempMap.put("MerchName",monthlySalesGrowthEntity.getMerchName());
  269. tempMap.put("Brand",monthlySalesGrowthEntity.getBrand());
  270. tempMap.put("GoodsSpecificationNameValue",monthlySalesGrowthEntity.getGoodsSpecificationNameValue());
  271. tempMap.put("sales",monthlySalesGrowthEntity.getSales());
  272. list1.add(tempMap);
  273. }
  274. }
  275. count=1;
  276. if (top10BySupplier!=null && top10BySupplier.size()>0) {
  277. for (MonthlySalesGrowthEntity monthlySalesGrowthEntity : top10BySupplier) {
  278. LinkedHashMap<String, Object> tempMap = new LinkedHashMap<>();
  279. tempMap.put("OrderNumber",count++);
  280. tempMap.put("MerchName",monthlySalesGrowthEntity.getMerchName());
  281. tempMap.put("Supplier",monthlySalesGrowthEntity.getSupplier());
  282. tempMap.put("GoodsSpecificationNameValue",monthlySalesGrowthEntity.getGoodsSpecificationNameValue());
  283. tempMap.put("sales",monthlySalesGrowthEntity.getSales());
  284. list2.add(tempMap);
  285. }
  286. }
  287. ee.addSheetByMap("top10ByBrand", list1, header1);
  288. ee.addSheetByMap("top10BySupplier", list2, header2);
  289. ee.export(response);
  290. return R.ok(map);
  291. }
  292. /**
  293. * 每周销售额销售量图表查询
  294. * @param startWeek
  295. * @param endWeek
  296. * @return
  297. * @throws ParseException
  298. */
  299. @RequestMapping("/customersQueryByWeek")
  300. public R queryWeeklyCustomers(@RequestParam("startWeek") String startWeek, @RequestParam("endWeek") String endWeek) throws ParseException {
  301. if (Objects.isNull(startWeek) || "".equals(startWeek)){
  302. return R.error("请先选择开始时间");
  303. }
  304. if (Objects.isNull(endWeek) || "".equals(endWeek)){
  305. return R.error("请先选择结束时间");
  306. }
  307. List<String> dateList = new ArrayList<>();
  308. try {
  309. calculateDifferentWeek(dateList, startWeek, endWeek);
  310. } catch (ParseException e) {
  311. e.printStackTrace();
  312. }
  313. String merchSn = null;
  314. SysUserEntity sysUser = (SysUserEntity) SecurityUtils.getSubject().getPrincipal();
  315. if(!"1".equals(sysUser.getRoleType())){
  316. merchSn = sysUser.getMerchSn();
  317. }
  318. SimpleDateFormat weekSdf = new SimpleDateFormat("yyyy");
  319. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
  320. Calendar bef = Calendar.getInstance();
  321. Calendar aft = Calendar.getInstance();
  322. bef.setFirstDayOfWeek(Calendar.MONDAY);
  323. aft.setFirstDayOfWeek(Calendar.MONDAY);
  324. bef.setTime(sdf.parse(startWeek));
  325. aft.setTime(sdf.parse(endWeek));
  326. int befWeek = bef.get(Calendar.WEEK_OF_YEAR);
  327. int aftWeek = aft.get(Calendar.WEEK_OF_YEAR);
  328. if(befWeek<10){
  329. startWeek =weekSdf.format(bef.getTime())+"-0"+befWeek;
  330. }else{
  331. startWeek =weekSdf.format(bef.getTime())+"-"+befWeek;
  332. }
  333. if(aftWeek<10){
  334. endWeek =weekSdf.format(aft.getTime())+"-0"+aftWeek;
  335. }else{
  336. endWeek =weekSdf.format(aft.getTime())+"-"+aftWeek;
  337. }
  338. Map<String,Object> map = monthlyCustomersService.queryWeeklyCustomers(startWeek,endWeek,merchSn,dateList);
  339. Map<String, Object> returnMap = new HashMap<>();
  340. returnMap.put("dateList", dateList);
  341. returnMap.putAll(map);
  342. return R.ok(returnMap);
  343. }
  344. @RequestMapping("/weeklySalesSummaryExport")
  345. public R weeklySalesSummaryExport(@RequestParam Map<String, Object> params, HttpServletResponse response, HttpServletRequest request) throws ParseException {
  346. ParamUtils.setQueryPowerByRoleType(params, "storeId", "merchSn", "thirdPartyMerchCode");
  347. if (Objects.isNull(params.get("startWeek"))){
  348. return R.error("请先选择开始时间");
  349. }
  350. if (Objects.isNull(params.get("endWeek"))){
  351. return R.error("请先选择结束时间");
  352. }
  353. String startWeek = (String) params.get("startWeek");
  354. String endWeek = (String) params.get("endWeek");
  355. String merchSn = null;
  356. SysUserEntity sysUser = (SysUserEntity) SecurityUtils.getSubject().getPrincipal();
  357. if(!"1".equals(sysUser.getRoleType())){
  358. merchSn = sysUser.getMerchSn();
  359. }
  360. SimpleDateFormat weekSdf = new SimpleDateFormat("yyyy");
  361. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
  362. Calendar bef = Calendar.getInstance();
  363. Calendar aft = Calendar.getInstance();
  364. bef.setFirstDayOfWeek(Calendar.MONDAY);
  365. aft.setFirstDayOfWeek(Calendar.MONDAY);
  366. bef.setTime(sdf.parse(startWeek));
  367. aft.setTime(sdf.parse(endWeek));
  368. int befWeek = bef.get(Calendar.WEEK_OF_YEAR);
  369. int aftWeek = aft.get(Calendar.WEEK_OF_YEAR);
  370. if(befWeek<10){
  371. startWeek =weekSdf.format(bef.getTime())+"-0"+befWeek;
  372. }else{
  373. startWeek =weekSdf.format(bef.getTime())+"-"+befWeek;
  374. }
  375. if(aftWeek<10){
  376. endWeek =weekSdf.format(aft.getTime())+"-0"+aftWeek;
  377. }else{
  378. endWeek =weekSdf.format(aft.getTime())+"-"+aftWeek;
  379. }
  380. List<MonthlySalesGrowthEntity> monthlySalesGrowthEntities = monthlyCustomersDao.queryWeeklyCustomers(startWeek, endWeek, merchSn);
  381. ExcelExport ee = new ExcelExport("Weekly Sales Summary");
  382. String[] header = new String[]{"序号","商户编号","商户名称","销售额","销售数量","年-周"};
  383. List<Map<String, Object>> list = new ArrayList<>();
  384. int count = 1;
  385. if (monthlySalesGrowthEntities!=null && monthlySalesGrowthEntities.size()>0) {
  386. for (MonthlySalesGrowthEntity monthlySalesGrowthEntity : monthlySalesGrowthEntities) {
  387. LinkedHashMap<String, Object> map = new LinkedHashMap<>();
  388. map.put("OrderNumber",count++);
  389. map.put("MerchSn",monthlySalesGrowthEntity.getMerchSn());
  390. map.put("MerchName",monthlySalesGrowthEntity.getMerchName());
  391. map.put("TotalSales",monthlySalesGrowthEntity.getTotalSales());
  392. map.put("TotalNumber",monthlySalesGrowthEntity.getTotalNumber());
  393. map.put("YearAndWeek",monthlySalesGrowthEntity.getYearAndWeek());
  394. list.add(map);
  395. }
  396. }
  397. ee.addSheetByMap("Weekly Sales Summary", list, header);
  398. ee.export(response);
  399. return R.ok();
  400. }
  401. private void calculateDifferentWeek(List<String> weekList, String startWeek, String endWeek) throws ParseException {
  402. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
  403. SimpleDateFormat weekSdf = new SimpleDateFormat("yyyy");
  404. Calendar bef = Calendar.getInstance();
  405. Calendar aft = Calendar.getInstance();
  406. bef.setFirstDayOfWeek(Calendar.MONDAY);
  407. aft.setFirstDayOfWeek(Calendar.MONDAY);
  408. bef.setTime(sdf.parse(startWeek));
  409. aft.setTime(sdf.parse(endWeek));
  410. do {
  411. int i = bef.get(Calendar.WEEK_OF_YEAR);
  412. if (i<10){
  413. weekList.add(weekSdf.format(bef.getTime())+"-0"+i);
  414. }else{
  415. weekList.add(weekSdf.format(bef.getTime())+"-"+i);
  416. }
  417. bef.set(Calendar.DAY_OF_MONTH,bef.get(Calendar.DAY_OF_MONTH)+7); //给当前时间增加一周
  418. }
  419. while (bef.compareTo(aft) <= 0);
  420. }
  421. /**
  422. * 每月微信好友图表查询
  423. * @param startMonth
  424. * @param endMonth
  425. * @return
  426. */
  427. @RequestMapping("/queryMonthlyWechatFollowers")
  428. public R queryMonthlyWechatFollowers(@RequestParam("startMonth") String startMonth, @RequestParam("endMonth") String endMonth) {
  429. if (Objects.isNull(startMonth) || "".equals(startMonth)){
  430. return R.error("请先选择开始时间");
  431. }
  432. if (Objects.isNull(endMonth) || "".equals(endMonth)){
  433. return R.error("请先选择结束时间");
  434. }
  435. List<String> dateList = new ArrayList<>();
  436. Map<String, Object> returnMap = new HashMap<>();
  437. try {
  438. calculateDifferentMonth(dateList, startMonth, endMonth);
  439. } catch (ParseException e) {
  440. e.printStackTrace();
  441. }
  442. try {
  443. String merchSn = null;
  444. SysUserEntity sysUser = (SysUserEntity) SecurityUtils.getSubject().getPrincipal();
  445. if(!"1".equals(sysUser.getRoleType())){
  446. merchSn = sysUser.getMerchSn();
  447. }
  448. Map<String,Object> map = monthlyCustomersService.queryMonthlyWechatFollowers(startMonth,endMonth,merchSn);
  449. returnMap.put("dateList", dateList);
  450. returnMap.putAll(map);
  451. } catch (Exception e) {
  452. e.printStackTrace();
  453. return R.error(e.getMessage());
  454. }
  455. return R.ok(returnMap);
  456. }
  457. /**
  458. * 添加微信好友数据
  459. * @param wechatFollowers
  460. * @return
  461. */
  462. @RequestMapping("/addWechatFollowers")
  463. public R addWechatFollowers( @RequestParam("wechatFollowers") Integer wechatFollowers) {
  464. try {
  465. String merchSn = null;
  466. SysUserEntity sysUser = (SysUserEntity) SecurityUtils.getSubject().getPrincipal();
  467. if(!"1".equals(sysUser.getRoleType())){
  468. merchSn = sysUser.getMerchSn();
  469. }
  470. WechatFollowersEntity wechatFollowersEntity = new WechatFollowersEntity();
  471. wechatFollowersEntity.setCreaterSn(ShiroUtils.getUserId().toString());
  472. wechatFollowersEntity.setCreateTime(new Date());
  473. wechatFollowersEntity.setWechatFollowers(wechatFollowers);
  474. wechatFollowersEntity.setMerchSn(merchSn);
  475. monthlyCustomersService.addWechatFollowers(wechatFollowersEntity);
  476. } catch (Exception e) {
  477. e.printStackTrace();
  478. return R.error(e.getMessage());
  479. }
  480. return R.ok("添加成功");
  481. }
  482. @RequestMapping("/wechatFollowersGrowthExport")
  483. public R wechatFollowersGrowthExport(@RequestParam Map<String, Object> params, HttpServletResponse response, HttpServletRequest request) {
  484. ParamUtils.setQueryPowerByRoleType(params, "storeId", "merchSn", "thirdPartyMerchCode");
  485. if (Objects.isNull(params.get("startMonth")) || "".equals(params.get("startMonth"))){
  486. return R.error("请先选择开始时间");
  487. }
  488. if (Objects.isNull(params.get("endMonth")) || "".equals(params.get("endMonth"))){
  489. return R.error("请先选择结束时间");
  490. }
  491. String merchSn = null;
  492. SysUserEntity sysUser = (SysUserEntity) SecurityUtils.getSubject().getPrincipal();
  493. if(!"1".equals(sysUser.getRoleType())){
  494. merchSn = sysUser.getMerchSn();
  495. }
  496. List<WechatFollowersEntity> wechatFollowersEntities = wechatFollowersDao.queryMonthlyWechatFollowers((String) params.get("startMonth"), (String) params.get("endMonth"), merchSn);
  497. ExcelExport ee = new ExcelExport("Wechat Followers Growth");
  498. String[] header = new String[]{"序号","商户编号","好友数量","年-月"};
  499. List<Map<String, Object>> list = new ArrayList<>();
  500. int count = 1;
  501. if (wechatFollowersEntities!=null && wechatFollowersEntities.size()>0) {
  502. for (WechatFollowersEntity wechatFollowersEntity : wechatFollowersEntities) {
  503. LinkedHashMap<String, Object> map = new LinkedHashMap<>();
  504. map.put("OrderNumber",count++);
  505. map.put("MerchSn",wechatFollowersEntity.getMerchSn());
  506. map.put("WechatFollowers",wechatFollowersEntity.getWechatFollowers());
  507. map.put("YearAndMonth",wechatFollowersEntity.getYearAndMonth());
  508. list.add(map);
  509. }
  510. }
  511. ee.addSheetByMap("Wechat Followers Growth", list, header);
  512. ee.export(response);
  513. return R.ok();
  514. }
  515. /**
  516. * 品牌销售数量
  517. * @param startDate
  518. * @param endDate
  519. * @return
  520. */
  521. @RequestMapping("/salesByCategory")
  522. public R salesByCategory(@RequestParam("startDate") String startDate, @RequestParam("endDate") String endDate){
  523. if (Objects.isNull(startDate) || "".equals(startDate)){
  524. return R.error("请先选择开始时间");
  525. }
  526. if (Objects.isNull(endDate) || "".equals(endDate)){
  527. return R.error("请先选择结束时间");
  528. }
  529. String merchSn = null;
  530. SysUserEntity sysUser = (SysUserEntity) SecurityUtils.getSubject().getPrincipal();
  531. if(!"1".equals(sysUser.getRoleType())){
  532. merchSn = sysUser.getMerchSn();
  533. }
  534. return R.ok().put("list",monthlyCustomersService.salesByCategory(startDate,endDate,merchSn));
  535. }
  536. /**
  537. * 每月品牌销售数量查询
  538. * @param startMonth
  539. * @param endMonth
  540. * @return
  541. */
  542. @RequestMapping("/monthlyCategory")
  543. public R monthlyCategory(@RequestParam("startMonth") String startMonth, @RequestParam("endMonth") String endMonth) {
  544. if (Objects.isNull(startMonth) || "".equals(startMonth)){
  545. return R.error("请先选择开始时间");
  546. }
  547. if (Objects.isNull(endMonth) || "".equals(endMonth)){
  548. return R.error("请先选择结束时间");
  549. }
  550. List<String> dateList = new ArrayList<>();
  551. Map<String, Object> returnMap = new HashMap<>();
  552. try {
  553. calculateDifferentMonth(dateList, startMonth, endMonth);
  554. } catch (ParseException e) {
  555. e.printStackTrace();
  556. }
  557. try {
  558. String merchSn = null;
  559. SysUserEntity sysUser = (SysUserEntity) SecurityUtils.getSubject().getPrincipal();
  560. if(!"1".equals(sysUser.getRoleType())){
  561. merchSn = sysUser.getMerchSn();
  562. }
  563. Map<String,Object> map = monthlyCustomersService.monthlyCategory(startMonth,endMonth,merchSn,dateList);
  564. returnMap.put("dateList", dateList);
  565. returnMap.putAll(map);
  566. } catch (Exception e) {
  567. e.printStackTrace();
  568. return R.error(e.getMessage());
  569. }
  570. return R.ok(returnMap);
  571. }
  572. @RequestMapping("/monthlyCategoryExport")
  573. public R monthlyCategoryExport(@RequestParam Map<String, Object> params, HttpServletResponse response, HttpServletRequest request) {
  574. ParamUtils.setQueryPowerByRoleType(params, "storeId", "merchSn", "thirdPartyMerchCode");
  575. if (Objects.isNull(params.get("startMonth")) || "".equals(params.get("startMonth"))){
  576. return R.error("请先选择开始时间");
  577. }
  578. if (Objects.isNull(params.get("endMonth")) || "".equals(params.get("endMonth"))){
  579. return R.error("请先选择结束时间");
  580. }
  581. String merchSn = null;
  582. SysUserEntity sysUser = (SysUserEntity) SecurityUtils.getSubject().getPrincipal();
  583. if(!"1".equals(sysUser.getRoleType())){
  584. merchSn = sysUser.getMerchSn();
  585. }
  586. List<MonthlySalesGrowthEntity> monthlySalesGrowthEntities = monthlyCustomersDao.monthlyCategory((String) params.get("startMonth"), (String) params.get("endMonth"), merchSn);
  587. ExcelExport ee = new ExcelExport("品牌销售量比较");
  588. String[] header = new String[]{"序号","销售数量","品牌名","销售额","年-月"};
  589. List<Map<String, Object>> list = new ArrayList<>();
  590. int count = 1;
  591. if (monthlySalesGrowthEntities!=null && monthlySalesGrowthEntities.size()>0) {
  592. for (MonthlySalesGrowthEntity monthlySalesGrowthEntity : monthlySalesGrowthEntities) {
  593. LinkedHashMap<String, Object> map = new LinkedHashMap<>();
  594. map.put("OrderNumber",count++);
  595. map.put("Sales",monthlySalesGrowthEntity.getSales());
  596. map.put("Cgname",monthlySalesGrowthEntity.getCgname());
  597. map.put("TotalSales",monthlySalesGrowthEntity.getTotalSales());
  598. map.put("YearAndMonth",monthlySalesGrowthEntity.getYearAndMonth());
  599. list.add(map);
  600. }
  601. }
  602. ee.addSheetByMap("品牌销售量比较", list, header);
  603. ee.export(response);
  604. return R.ok();
  605. }
  606. @RequestMapping("/exportSelectedMonthData")
  607. public void exportSelectedMonthData(@RequestParam("startMonth") String startMonth, @RequestParam("endMonth") String endMonth
  608. ,@RequestParam("monthNumber") Integer monthNumber
  609. ,HttpServletRequest request ,HttpServletResponse response) {
  610. List<String> dateList = new ArrayList<>();
  611. Map<String, Object> returnMap = new HashMap<>();
  612. try {
  613. calculateDifferentMonth(dateList, startMonth, endMonth);
  614. } catch (ParseException e) {
  615. e.printStackTrace();
  616. }
  617. try {
  618. String merchSn = null;
  619. SysUserEntity sysUser = (SysUserEntity) SecurityUtils.getSubject().getPrincipal();
  620. if(!"1".equals(sysUser.getRoleType())){
  621. merchSn = sysUser.getMerchSn();
  622. }
  623. List<MonthlySalesGrowthEntity> monthlySalesGrowthEntityList = monthlyCustomersService.exportSelectedMonthData(startMonth,endMonth,merchSn,dateList.size(),monthNumber);
  624. ExcelExport ee = new ExcelExport("Wechat Followers Growth");
  625. String[] header = new String[]{"序号","sku","产品名称","月份","销售数","平均销售","总库存","店铺库存","园区库存","在途库存","月均预订量","月消耗预订量","统计月份","预定月份","预定数"};
  626. List<Map<String, Object>> list = new ArrayList<>();
  627. int count = 1;
  628. if (monthlySalesGrowthEntityList!=null && monthlySalesGrowthEntityList.size()>0) {
  629. for (MonthlySalesGrowthEntity monthlySalesGrowthEntity : monthlySalesGrowthEntityList) {
  630. LinkedHashMap<String, Object> map = new LinkedHashMap<>();
  631. map.put("序号",count++ +"");
  632. map.put("sku",monthlySalesGrowthEntity.getSku());
  633. map.put("产品名称",monthlySalesGrowthEntity.getGoodsName());
  634. map.put("月份",monthlySalesGrowthEntity.getSalesMonth());
  635. map.put("销售数",monthlySalesGrowthEntity.getTotalNumber());
  636. map.put("平均销售",monthlySalesGrowthEntity.getAvgSalesNumber());
  637. map.put("总库存",monthlySalesGrowthEntity.getTotalCount());
  638. map.put("店铺库存",monthlySalesGrowthEntity.getStockNumber());
  639. map.put("在途库存",monthlySalesGrowthEntity.getNumber());
  640. map.put("园区库存",monthlySalesGrowthEntity.getGoodsNumber());
  641. map.put("月均预订量",new BigDecimal(monthlySalesGrowthEntity.getAvgSalesNumber()).multiply(
  642. new BigDecimal(monthNumber)).setScale(2,BigDecimal.ROUND_HALF_UP).toString() );
  643. // 总库存 - M*单品每月平均销量
  644. map.put("月消耗预订量",new BigDecimal(monthlySalesGrowthEntity.getTotalCount()).subtract(
  645. new BigDecimal(dateList.size()).multiply(new BigDecimal(monthlySalesGrowthEntity.getAvgSalesNumber())).setScale(2,RoundingMode.HALF_UP)).toString());
  646. map.put("统计月份",dateList.size()+"");
  647. map.put("预定月份",monthNumber+"");
  648. map.put("预定数",monthlySalesGrowthEntity.getPredeterminedNumber());
  649. list.add(map);
  650. }
  651. }
  652. Map<String, List<Map<String, Object>>/*该list为每个sheet页的数据*/> map = Maps.newHashMap();
  653. map.put("测试合并数据", list);
  654. createExcel(header, map, new int[]{0,1,2},request,response);
  655. // ee.addSheetByMap("Wechat Followers Growth", list, header);
  656. // ee.export(response);
  657. // return R.ok();
  658. } catch (Exception e) {
  659. e.printStackTrace();
  660. // return R.error(e.getMessage());
  661. }
  662. }
  663. public String createExcel(String[] title, Map<String, List<Map<String, Object>>> maps, int[] mergeIndex
  664. ,HttpServletRequest request ,HttpServletResponse response){
  665. if (title.length==0){
  666. return null;
  667. }
  668. /*初始化excel模板*/
  669. Workbook workbook = new XSSFWorkbook();
  670. Sheet sheet = null;
  671. int n = 0;
  672. /*循环sheet页*/
  673. for(Map.Entry<String, List<Map<String/*对应title的值*/, Object>>> entry : maps.entrySet()){
  674. /*实例化sheet对象并且设置sheet名称,book对象*/
  675. try {
  676. sheet = workbook.createSheet();
  677. workbook.setSheetName(n, entry.getKey());
  678. workbook.setSelectedTab(0);
  679. }catch (Exception e){
  680. e.printStackTrace();
  681. }
  682. /*初始化head,填值标题行(第一行)*/
  683. Row row0 = sheet.createRow(0);
  684. for(int i = 0; i<title.length; i++){
  685. /*创建单元格,指定类型*/
  686. Cell cell_1 = row0.createCell(i, Cell.CELL_TYPE_STRING);
  687. cell_1.setCellValue(title[i]);
  688. }
  689. /*得到当前sheet下的数据集合*/
  690. List<Map<String/*对应title的值*/, Object>> list = entry.getValue();
  691. /*遍历该数据集合*/
  692. List<PoiModel> poiModels = Lists.newArrayList();
  693. if(null!=workbook){
  694. Iterator iterator = list.iterator();
  695. int index = 1;/*这里1是从excel的第二行开始,第一行已经塞入标题了*/
  696. while (iterator.hasNext()){
  697. Row row = sheet.createRow(index);
  698. /*取得当前这行的map,该map中以key,value的形式存着这一行值*/
  699. Map<String, String> map = (Map<String, String>)iterator.next();
  700. /*循环列数,给当前行塞值*/
  701. for(int i = 0; i<title.length; i++){
  702. String old = "";
  703. /*old存的是上一行统一位置的单元的值,第一行是最上一行了,所以从第二行开始记*/
  704. if(index > 1){
  705. old = poiModels.get(i)==null?"":poiModels.get(i).getContent();
  706. }
  707. /*循环需要合并的列*/
  708. for(int j = 0; j < mergeIndex.length; j++){
  709. if(index == 1){
  710. /*记录第一行的开始行和开始列*/
  711. PoiModel poiModel = new PoiModel();
  712. poiModel.setOldContent(map.get(title[i]));
  713. poiModel.setContent(map.get(title[i]));
  714. poiModel.setRowIndex(1);
  715. poiModel.setCellIndex(i);
  716. poiModels.add(poiModel);
  717. break;
  718. }else if(i > 0 && mergeIndex[j] == i){/*这边i>0也是因为第一列已经是最前一列了,只能从第二列开始*/
  719. /*当前同一列的内容与上一行同一列不同时,把那以上的合并, 或者在当前元素一样的情况下,前一列的元素并不一样,这种情况也合并*/
  720. /*如果不需要考虑当前行与上一行内容相同,但是它们的前一列内容不一样则不合并的情况,把下面条件中||poiModels.get(i).getContent().equals(map.get(title[i])) && !poiModels.get(i - 1).getOldContent().equals(map.get(title[i-1]))去掉就行*/
  721. 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]))){
  722. /*当前行的当前列与上一行的当前列的内容不一致时,则把当前行以上的合并*/
  723. CellRangeAddress cra=new CellRangeAddress(poiModels.get(i).getRowIndex()/*从第二行开始*/, index - 1/*到第几行*/
  724. , poiModels.get(i).getCellIndex()/*从某一列开始*/, poiModels.get(i).getCellIndex()/*到第几列*/);
  725. if (cra.getNumberOfCells() >= 2) {
  726. //在sheet里增加合并单元格
  727. sheet.addMergedRegion(cra);
  728. }
  729. //在sheet里增加合并单元格
  730. /*重新记录该列的内容为当前内容,行标记改为当前行标记,列标记则为当前列*/
  731. poiModels.get(i).setContent(map.get(title[i]));
  732. poiModels.get(i).setRowIndex(index);
  733. poiModels.get(i).setCellIndex(i);
  734. }
  735. }
  736. /*处理第一列的情况*/
  737. if(mergeIndex[j] == i && i == 0 && !poiModels.get(i).getContent().equals(map.get(title[i]))){
  738. /*当前行的当前列与上一行的当前列的内容不一致时,则把当前行以上的合并*/
  739. CellRangeAddress cra=new CellRangeAddress(poiModels.get(i).getRowIndex()/*从第二行开始*/, index - 1/*到第几行*/, poiModels.get(i).getCellIndex()/*从某一列开始*/, poiModels.get(i).getCellIndex()/*到第几列*/);
  740. if (cra.getNumberOfCells() >= 2) {
  741. //在sheet里增加合并单元格
  742. sheet.addMergedRegion(cra);
  743. }
  744. /*重新记录该列的内容为当前内容,行标记改为当前行标记*/
  745. poiModels.get(i).setContent(map.get(title[i]));
  746. poiModels.get(i).setRowIndex(index);
  747. poiModels.get(i).setCellIndex(i);
  748. }
  749. /*最后一行没有后续的行与之比较,所有当到最后一行时则直接合并对应列的相同内容*/
  750. if(mergeIndex[j] == i && index == list.size()){
  751. CellRangeAddress cra=new CellRangeAddress(poiModels.get(i).getRowIndex()/*从第二行开始*/, index/*到第几行*/, poiModels.get(i).getCellIndex()/*从某一列开始*/, poiModels.get(i).getCellIndex()/*到第几列*/);
  752. //在sheet里增加合并单元格
  753. if (cra.getNumberOfCells() >= 2) {
  754. //在sheet里增加合并单元格
  755. sheet.addMergedRegion(cra);
  756. }
  757. }
  758. }
  759. Cell cell = row.createCell(i, Cell.CELL_TYPE_STRING);
  760. cell.setCellValue(map.get(title[i]));
  761. /*在每一个单元格处理完成后,把这个单元格内容设置为old内容*/
  762. poiModels.get(i).setOldContent(old);
  763. }
  764. index++;
  765. }
  766. }
  767. n++;
  768. }
  769. /*生成临时文件*/
  770. String fileName = String.valueOf(new Date().getTime()/1000);
  771. try {
  772. ByteArrayOutputStream os = new ByteArrayOutputStream();
  773. workbook.write(os);
  774. byte[] content = os.toByteArray();
  775. InputStream is = new ByteArrayInputStream(content);
  776. //根据浏览器不同,对文件的名字进行不同的编码设置
  777. final String userAgent = request.getHeader("USER-AGENT");
  778. String finalFileName = null;
  779. if (userAgent.contains("MSIE") || userAgent.contains("Trident")) { //IE浏览器
  780. finalFileName = URLEncoder.encode(fileName + ".xlsx", "UTF-8");
  781. } else if (StringUtils.contains(userAgent, "Mozilla")) { //google,火狐浏览器
  782. finalFileName = new String((fileName + ".xlsx").getBytes("UTF-8"), "ISO-8859-1");
  783. } else {
  784. finalFileName = URLEncoder.encode(fileName + ".xlsx", "UTF-8"); //其他浏览器
  785. }
  786. // 设置response参数,可以打开下载页面
  787. response.reset();
  788. response.setContentType("application/vnd.ms-excel;charset=utf-8");
  789. response.setHeader("Content-Disposition", "attachment;filename=" + finalFileName);
  790. ServletOutputStream out = response.getOutputStream();
  791. BufferedInputStream bis = null;
  792. BufferedOutputStream bos = null;
  793. try {
  794. bis = new BufferedInputStream(is);
  795. bos = new BufferedOutputStream(out);
  796. byte[] buff = new byte[2048];
  797. int bytesRead;
  798. while (-1 != (bytesRead = bis.read(buff, 0, buff.length))) {
  799. bos.write(buff, 0, bytesRead);
  800. }
  801. } catch (Exception e) {
  802. e.printStackTrace();
  803. } finally {
  804. if (bis != null) {
  805. bis.close();
  806. }
  807. if (bos != null) {
  808. bos.close();
  809. }
  810. }
  811. os.close();
  812. } catch (IOException e) {
  813. e.printStackTrace();
  814. }
  815. return "导出成功";
  816. }
  817. }