MonthlyCustomersController.java 42 KB

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