MonthlyCustomersController.java 40 KB

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