MonthlyCustomersController.java 42 KB

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