Ver Fonte

计算每个产品的月均销量、预定量等的逻辑

zcb há 4 anos atrás
pai
commit
8d3d8611a8

+ 23 - 0
kmall-admin/pom.xml

@@ -50,6 +50,29 @@
             <scope>provided</scope>
         </dependency>
 
+        <dependency>
+            <groupId>org.apache.poi</groupId>
+            <artifactId>poi</artifactId>
+            <version>3.15</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.poi</groupId>
+            <artifactId>poi-ooxml</artifactId>
+            <version>3.15</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.poi</groupId>
+            <artifactId>poi-ooxml-schemas</artifactId>
+            <version>3.15</version>
+            <exclusions>
+                <exclusion>
+                    <artifactId>stax-api</artifactId>
+                    <groupId>stax</groupId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+
+
     </dependencies>
 
     <build>

+ 207 - 8
kmall-admin/src/main/java/com/kmall/admin/controller/statistics/MonthlyCustomersController.java

@@ -1,5 +1,7 @@
 package com.kmall.admin.controller.statistics;
 
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
 import com.kmall.admin.dao.statistics.MonthlyCustomersDao;
 import com.kmall.admin.dao.statistics.WechatFollowersDao;
 import com.kmall.admin.entity.MonthlySalesGrowthEntity;
@@ -12,16 +14,26 @@ import com.kmall.admin.utils.ShiroUtils;
 import com.kmall.common.utils.R;
 import com.kmall.common.utils.excel.ExcelExport;
 import com.kmall.common.utils.excel.ExcelUtil;
+import org.apache.commons.lang.StringUtils;
+import org.apache.poi.ss.usermodel.Cell;
+import org.apache.poi.ss.usermodel.Row;
+import org.apache.poi.ss.usermodel.Sheet;
+import org.apache.poi.ss.usermodel.Workbook;
+import org.apache.poi.ss.util.CellRangeAddress;
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
 import org.apache.shiro.SecurityUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
+import javax.servlet.ServletOutputStream;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
+import java.io.*;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
+import java.net.URLEncoder;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.util.*;
@@ -573,7 +585,9 @@ public class MonthlyCustomersController {
 
 
     @RequestMapping("/exportSelectedMonthData")
-    public R exportSelectedMonthData(@RequestParam("startMonth") String startMonth, @RequestParam("endMonth") String endMonth) {
+    public void exportSelectedMonthData(@RequestParam("startMonth") String startMonth, @RequestParam("endMonth") String endMonth
+    ,@RequestParam("monthNumber") Integer monthNumber
+    ,HttpServletRequest request ,HttpServletResponse response) {
         List<String> dateList = new ArrayList<>();
         Map<String, Object> returnMap = new HashMap<>();
         try {
@@ -587,19 +601,204 @@ public class MonthlyCustomersController {
             if(!"1".equals(sysUser.getRoleType())){
                 merchSn = sysUser.getMerchSn();
             }
-            Map<String,Object> map = monthlyCustomersService.exportSelectedMonthData(startMonth,endMonth,merchSn,dateList.size());
-
-            returnMap.put("dateList", dateList);
-            returnMap.putAll(map);
+            List<MonthlySalesGrowthEntity> monthlySalesGrowthEntityList = monthlyCustomersService.exportSelectedMonthData(startMonth,endMonth,merchSn,dateList.size(),monthNumber);
+            ExcelExport ee = new ExcelExport("Wechat Followers Growth");
+            String[] header = new String[]{"序号","sku","产品名称","月份","销售数","平均销售","总库存","店铺库存","园区库存","在途库存","月均预订量","月消耗预订量","统计月份","预定月份","预定数"};
+            List<Map<String, Object>> list = new ArrayList<>();
+            int count = 1;
+            if (monthlySalesGrowthEntityList!=null && monthlySalesGrowthEntityList.size()>0) {
+                for (MonthlySalesGrowthEntity monthlySalesGrowthEntity : monthlySalesGrowthEntityList) {
+                    LinkedHashMap<String, Object> map = new LinkedHashMap<>();
+                    map.put("序号",count++ +"");
+                    map.put("sku",monthlySalesGrowthEntity.getSku());
+                    map.put("产品名称",monthlySalesGrowthEntity.getGoodsName());
+                    map.put("月份",monthlySalesGrowthEntity.getSalesMonth());
+                    map.put("销售数",monthlySalesGrowthEntity.getTotalNumber());
+                    map.put("平均销售",monthlySalesGrowthEntity.getAvgSalesNumber());
+                    map.put("总库存",monthlySalesGrowthEntity.getTotalCount());
+                    map.put("店铺库存",monthlySalesGrowthEntity.getStockNumber());
+                    map.put("在途库存",monthlySalesGrowthEntity.getNumber());
+                    map.put("园区库存",monthlySalesGrowthEntity.getGoodsNumber());
+                    map.put("月均预订量",new BigDecimal(monthlySalesGrowthEntity.getAvgSalesNumber()).multiply(
+                            new BigDecimal(monthNumber)).setScale(2,BigDecimal.ROUND_HALF_UP).toString() );
+                    // 总库存 -  M*单品每月平均销量
+                    map.put("月消耗预订量",new BigDecimal(monthlySalesGrowthEntity.getTotalCount()).subtract(
+                            new BigDecimal(dateList.size()).multiply(new BigDecimal(monthlySalesGrowthEntity.getAvgSalesNumber())).setScale(2,RoundingMode.HALF_UP)).toString());
+                    map.put("统计月份",dateList.size()+"");
+                    map.put("预定月份",monthNumber+"");
+                    map.put("预定数",monthlySalesGrowthEntity.getPredeterminedNumber());
+                    list.add(map);
+                }
+            }
+            Map<String, List<Map<String, Object>>/*该list为每个sheet页的数据*/> map = Maps.newHashMap();
+            map.put("测试合并数据", list);
+            createExcel(header, map, new int[]{0,1,2},request,response);
+//            ee.addSheetByMap("Wechat Followers Growth", list, header);
+//            ee.export(response);
+//            return R.ok();
         } catch (Exception e) {
             e.printStackTrace();
-            return R.error(e.getMessage());
+//            return R.error(e.getMessage());
         }
-        return R.ok(returnMap);
     }
 
 
-
+    public String createExcel(String[] title, Map<String, List<Map<String, Object>>> maps, int[] mergeIndex
+            ,HttpServletRequest request ,HttpServletResponse response){
+        if (title.length==0){
+            return null;
+        }
+        /*初始化excel模板*/
+        Workbook workbook = new XSSFWorkbook();
+        Sheet sheet = null;
+        int n = 0;
+        /*循环sheet页*/
+        for(Map.Entry<String, List<Map<String/*对应title的值*/, Object>>> entry : maps.entrySet()){
+            /*实例化sheet对象并且设置sheet名称,book对象*/
+            try {
+                sheet = workbook.createSheet();
+                workbook.setSheetName(n, entry.getKey());
+                workbook.setSelectedTab(0);
+            }catch (Exception e){
+                e.printStackTrace();
+            }
+            /*初始化head,填值标题行(第一行)*/
+            Row row0 = sheet.createRow(0);
+            for(int i = 0; i<title.length; i++){
+                /*创建单元格,指定类型*/
+                Cell cell_1 = row0.createCell(i, Cell.CELL_TYPE_STRING);
+                cell_1.setCellValue(title[i]);
+            }
+            /*得到当前sheet下的数据集合*/
+            List<Map<String/*对应title的值*/, Object>> list = entry.getValue();
+            /*遍历该数据集合*/
+            List<PoiModel> poiModels = Lists.newArrayList();
+            if(null!=workbook){
+                Iterator iterator = list.iterator();
+                int index = 1;/*这里1是从excel的第二行开始,第一行已经塞入标题了*/
+                while (iterator.hasNext()){
+                    Row row = sheet.createRow(index);
+                    /*取得当前这行的map,该map中以key,value的形式存着这一行值*/
+                    Map<String, String> map = (Map<String, String>)iterator.next();
+                    /*循环列数,给当前行塞值*/
+                    for(int i = 0; i<title.length; i++){
+                        String old = "";
+                        /*old存的是上一行统一位置的单元的值,第一行是最上一行了,所以从第二行开始记*/
+                        if(index > 1){
+                            old = poiModels.get(i)==null?"":poiModels.get(i).getContent();
+                        }
+                        /*循环需要合并的列*/
+                        for(int j = 0; j < mergeIndex.length; j++){
+                            if(index == 1){
+                                /*记录第一行的开始行和开始列*/
+                                PoiModel poiModel = new PoiModel();
+                                poiModel.setOldContent(map.get(title[i]));
+                                poiModel.setContent(map.get(title[i]));
+                                poiModel.setRowIndex(1);
+                                poiModel.setCellIndex(i);
+                                poiModels.add(poiModel);
+                                break;
+                            }else if(i > 0 && mergeIndex[j] == i){/*这边i>0也是因为第一列已经是最前一列了,只能从第二列开始*/
+                                /*当前同一列的内容与上一行同一列不同时,把那以上的合并, 或者在当前元素一样的情况下,前一列的元素并不一样,这种情况也合并*/
+                                /*如果不需要考虑当前行与上一行内容相同,但是它们的前一列内容不一样则不合并的情况,把下面条件中||poiModels.get(i).getContent().equals(map.get(title[i])) && !poiModels.get(i - 1).getOldContent().equals(map.get(title[i-1]))去掉就行*/
+                                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]))){
+                                    /*当前行的当前列与上一行的当前列的内容不一致时,则把当前行以上的合并*/
+                                    CellRangeAddress cra=new CellRangeAddress(poiModels.get(i).getRowIndex()/*从第二行开始*/, index - 1/*到第几行*/
+                                            , poiModels.get(i).getCellIndex()/*从某一列开始*/, poiModels.get(i).getCellIndex()/*到第几列*/);
+                                    if (cra.getNumberOfCells() >= 2) {
+                                        //在sheet里增加合并单元格
+                                        sheet.addMergedRegion(cra);
+                                    }
+                                    //在sheet里增加合并单元格
+                                    /*重新记录该列的内容为当前内容,行标记改为当前行标记,列标记则为当前列*/
+                                    poiModels.get(i).setContent(map.get(title[i]));
+                                    poiModels.get(i).setRowIndex(index);
+                                    poiModels.get(i).setCellIndex(i);
+                                }
+                            }
+                            /*处理第一列的情况*/
+                            if(mergeIndex[j] == i && i == 0 && !poiModels.get(i).getContent().equals(map.get(title[i]))){
+                                /*当前行的当前列与上一行的当前列的内容不一致时,则把当前行以上的合并*/
+                                CellRangeAddress cra=new CellRangeAddress(poiModels.get(i).getRowIndex()/*从第二行开始*/, index - 1/*到第几行*/, poiModels.get(i).getCellIndex()/*从某一列开始*/, poiModels.get(i).getCellIndex()/*到第几列*/);
+                                if (cra.getNumberOfCells() >= 2) {
+                                    //在sheet里增加合并单元格
+                                    sheet.addMergedRegion(cra);
+                                }
+                                /*重新记录该列的内容为当前内容,行标记改为当前行标记*/
+                                poiModels.get(i).setContent(map.get(title[i]));
+                                poiModels.get(i).setRowIndex(index);
+                                poiModels.get(i).setCellIndex(i);
+                            }
+
+                            /*最后一行没有后续的行与之比较,所有当到最后一行时则直接合并对应列的相同内容*/
+                            if(mergeIndex[j] == i && index == list.size()){
+                                CellRangeAddress cra=new CellRangeAddress(poiModels.get(i).getRowIndex()/*从第二行开始*/, index/*到第几行*/, poiModels.get(i).getCellIndex()/*从某一列开始*/, poiModels.get(i).getCellIndex()/*到第几列*/);
+                                //在sheet里增加合并单元格
+                                if (cra.getNumberOfCells() >= 2) {
+                                    //在sheet里增加合并单元格
+                                    sheet.addMergedRegion(cra);
+                                }
+                            }
+                        }
+                        Cell cell = row.createCell(i, Cell.CELL_TYPE_STRING);
+                        cell.setCellValue(map.get(title[i]));
+                        /*在每一个单元格处理完成后,把这个单元格内容设置为old内容*/
+                        poiModels.get(i).setOldContent(old);
+                    }
+                    index++;
+                }
+            }
+            n++;
+        }
+        /*生成临时文件*/
+        String fileName = String.valueOf(new Date().getTime()/1000);
+        try {
+            ByteArrayOutputStream os = new ByteArrayOutputStream();
+            workbook.write(os);
+            byte[] content = os.toByteArray();
+            InputStream is = new ByteArrayInputStream(content);
+            //根据浏览器不同,对文件的名字进行不同的编码设置
+            final String userAgent = request.getHeader("USER-AGENT");
+            String finalFileName = null;
+            if (userAgent.contains("MSIE") || userAgent.contains("Trident")) {    //IE浏览器
+                finalFileName = URLEncoder.encode(fileName + ".xlsx", "UTF-8");
+            } else if (StringUtils.contains(userAgent, "Mozilla")) {   //google,火狐浏览器
+                finalFileName = new String((fileName + ".xlsx").getBytes("UTF-8"), "ISO-8859-1");
+            } else {
+                finalFileName = URLEncoder.encode(fileName + ".xlsx", "UTF-8");   //其他浏览器
+            }
+            // 设置response参数,可以打开下载页面
+            response.reset();
+            response.setContentType("application/vnd.ms-excel;charset=utf-8");
+            response.setHeader("Content-Disposition", "attachment;filename=" + finalFileName);
+            ServletOutputStream out = response.getOutputStream();
+            BufferedInputStream bis = null;
+            BufferedOutputStream bos = null;
+
+            try {
+                bis = new BufferedInputStream(is);
+                bos = new BufferedOutputStream(out);
+                byte[] buff = new byte[2048];
+                int bytesRead;
+                while (-1 != (bytesRead = bis.read(buff, 0, buff.length))) {
+                    bos.write(buff, 0, bytesRead);
+                }
+            } catch (Exception e) {
+                e.printStackTrace();
+            } finally {
+                if (bis != null) {
+                    bis.close();
+                }
+                if (bos != null) {
+                    bos.close();
+                }
+            }
+            os.close();
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        return "导出成功";
+    }
 
 
 

+ 44 - 0
kmall-admin/src/main/java/com/kmall/admin/controller/statistics/PoiModel.java

@@ -0,0 +1,44 @@
+package com.kmall.admin.controller.statistics;
+
+public class PoiModel {
+
+    private String content;
+
+    private String oldContent;
+
+    private int rowIndex;
+
+    private int cellIndex;
+
+    public String getOldContent() {
+        return oldContent;
+    }
+
+    public void setOldContent(String oldContent) {
+        this.oldContent = oldContent;
+    }
+
+    public String getContent() {
+        return content;
+    }
+
+    public void setContent(String content) {
+        this.content = content;
+    }
+
+    public int getRowIndex() {
+        return rowIndex;
+    }
+
+    public void setRowIndex(int rowIndex) {
+        this.rowIndex = rowIndex;
+    }
+
+    public int getCellIndex() {
+        return cellIndex;
+    }
+
+    public void setCellIndex(int cellIndex) {
+        this.cellIndex = cellIndex;
+    }
+}

+ 3 - 3
kmall-admin/src/main/java/com/kmall/admin/dao/statistics/MonthlyCustomersDao.java

@@ -4,7 +4,6 @@ import com.kmall.admin.entity.MonthlySalesGrowthEntity;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
-import java.util.Map;
 
 /**
  * @author zhangchuangbiao
@@ -27,7 +26,8 @@ public interface MonthlyCustomersDao {
 
     List<MonthlySalesGrowthEntity> monthlyCategory(@Param("startMonth") String startMonth, @Param("endMonth") String endMonth, @Param("merchSn") String merchSn);
 
-    List<MonthlySalesGrowthEntity> queryAvgSales(@Param("startMonth") String startMonth, @Param("endMonth") String endMonth, @Param("merchSn") String merchSn, @Param("size") int size);
+    List<MonthlySalesGrowthEntity> queryAvgSales(@Param("startMonth") String startMonth, @Param("endMonth") String endMonth,
+                                                 @Param("merchSn") String merchSn,
+                                                 @Param("size") int size, @Param("monthNumber") Integer monthNumber);
 
-    List<MonthlySalesGrowthEntity> querySelectedMonthSales(@Param("startMonth") String startMonth, @Param("endMonth") String endMonth, @Param("merchSn") String merchSn);
 }

+ 85 - 0
kmall-admin/src/main/java/com/kmall/admin/entity/MonthlySalesGrowthEntity.java

@@ -34,6 +34,19 @@ public class MonthlySalesGrowthEntity implements Serializable {
     private String supplier; // 供应商
     private String cgname; // 品牌名
 
+    private String sku ; // sku
+    private String avgSalesNumber; // 平均销量
+    private String salesMonth; // 销售月份
+    private String stockNumber; // 门店库存
+    private String goodsNumber; // 园区库存
+    private String number; // 在途库存
+    private String totalCount; // 总库存
+    private String predeterminedNumber ; // 预定数量
+    private String predeterminedBoxNumber; // 预定箱数
+    private String avgPredeterminedNumber; // 平均订货量
+    private String avgConsumeNumber; // 平均消耗量
+
+
 
     public String getMerchSn() {
         return merchSn;
@@ -131,4 +144,76 @@ public class MonthlySalesGrowthEntity implements Serializable {
     public void setCgname(String cgname) {
         this.cgname = cgname;
     }
+
+    public String getSku() {
+        return sku;
+    }
+
+    public void setSku(String sku) {
+        this.sku = sku;
+    }
+
+    public String getAvgSalesNumber() {
+        return avgSalesNumber;
+    }
+
+    public void setAvgSalesNumber(String avgSalesNumber) {
+        this.avgSalesNumber = avgSalesNumber;
+    }
+
+    public String getSalesMonth() {
+        return salesMonth;
+    }
+
+    public void setSalesMonth(String salesMonth) {
+        this.salesMonth = salesMonth;
+    }
+
+    public String getStockNumber() {
+        return stockNumber;
+    }
+
+    public void setStockNumber(String stockNumber) {
+        this.stockNumber = stockNumber;
+    }
+
+    public String getGoodsNumber() {
+        return goodsNumber;
+    }
+
+    public void setGoodsNumber(String goodsNumber) {
+        this.goodsNumber = goodsNumber;
+    }
+
+    public String getNumber() {
+        return number;
+    }
+
+    public void setNumber(String number) {
+        this.number = number;
+    }
+
+    public String getTotalCount() {
+        return totalCount;
+    }
+
+    public void setTotalCount(String totalCount) {
+        this.totalCount = totalCount;
+    }
+
+    public String getPredeterminedNumber() {
+        return predeterminedNumber;
+    }
+
+    public void setPredeterminedNumber(String predeterminedNumber) {
+        this.predeterminedNumber = predeterminedNumber;
+    }
+
+    public String getPredeterminedBoxNumber() {
+        return predeterminedBoxNumber;
+    }
+
+    public void setPredeterminedBoxNumber(String predeterminedBoxNumber) {
+        this.predeterminedBoxNumber = predeterminedBoxNumber;
+    }
 }

+ 5 - 7
kmall-admin/src/main/java/com/kmall/admin/service/impl/statistics/MonthlyCustomersServiceImpl.java

@@ -182,20 +182,18 @@ public class MonthlyCustomersServiceImpl implements MonthlyCustomersService {
     }
 
     @Override
-    public Map<String, Object> exportSelectedMonthData(String startMonth, String endMonth, String merchSn, int size) {
+    public List<MonthlySalesGrowthEntity> exportSelectedMonthData(String startMonth, String endMonth, String merchSn, int size, Integer monthNumber) {
 
         // 查询平均销量
-        List<MonthlySalesGrowthEntity> avgSalesList = monthlyCustomersDao.queryAvgSales(startMonth,endMonth,merchSn,size);
-
         // 查询所选月份总销量
-        List<MonthlySalesGrowthEntity> salesBySelectedMonthList = monthlyCustomersDao.querySelectedMonthSales(startMonth,endMonth,merchSn);
+        List<MonthlySalesGrowthEntity> avgSalesList = monthlyCustomersDao.queryAvgSales(startMonth,endMonth,merchSn,size,monthNumber);
+
         // 查询总库存 = 店铺库存 + 园区库存 + 在途库存
-        // 1.查询店铺库存+园区库存   mall_product_store_rela 表
+        // 1.查询店铺库存+园区库存   mall_product_store_rela 表  sku  shopNumber
         // 2.查询在途库存  mall_goods_transport_info_detail 表
         // 计算订货量
 
-
-        return null;
+        return avgSalesList;
     }
 
 }

+ 2 - 1
kmall-admin/src/main/java/com/kmall/admin/service/statistics/MonthlyCustomersService.java

@@ -1,5 +1,6 @@
 package com.kmall.admin.service.statistics;
 
+import com.kmall.admin.entity.MonthlySalesGrowthEntity;
 import com.kmall.admin.entity.WechatFollowersEntity;
 
 import java.util.List;
@@ -28,5 +29,5 @@ public interface MonthlyCustomersService {
 
     Map<String, Object> monthlyCategory(String startMonth, String endMonth, String merchSn);
 
-    Map<String, Object> exportSelectedMonthData(String startMonth, String endMonth, String merchSn, int size);
+    List<MonthlySalesGrowthEntity> exportSelectedMonthData(String startMonth, String endMonth, String merchSn, int size, Integer monthNumber);
 }

+ 53 - 19
kmall-admin/src/main/resources/mybatis/mapper/statistics/MonthlyCustomersDao.xml

@@ -187,7 +187,7 @@
 			LEFT JOIN mall_order_goods og ON o.id = og.order_id
 			LEFT JOIN mall_product_store_rela a ON a.goods_id = og.goods_id
 			LEFT JOIN mall_category cg ON a.category_id = cg.id
-
+			LEFT JOIN mall_merch m ON o.merch_sn = m.merch_sn
 		<where>
 			o.is_onffline_order = '1'
 			AND o.order_biz_type = '10'
@@ -204,28 +204,62 @@
 	</select>
     <select id="queryAvgSales" resultType="com.kmall.admin.entity.MonthlySalesGrowthEntity">
 		select
-		sku,sum(number),sum(number)/4
-		from
-		mall_order_goods
-		where
-		DATE_FORMAT(create_time,'%Y-%m') &gt;= '2019-08'
-		and DATE_FORMAT(create_time,'%Y-%m') &lt;= '2019-11'
-		group by sku
-	</select>
+			sku ,goodsName,total as totalNumber , saletime as salesMonth , avgSalesNumber , goodsNumber, stockNumber ,number, (goodsNumber + stockNumber + number) as totalCount,
+			if(avgSalesNumber * #{monthNumber} &lt; ((goodsNumber + stockNumber + number) - avgSalesNumber*#{size}) ,
+			avgSalesNumber * #{monthNumber},
+			((goodsNumber + stockNumber + number) - avgSalesNumber*#{size}))  as predeterminedNumber
+		from (
 
+			SELECT
+			sku,sum( number ) total ,DATE_FORMAT(og.create_time,'%Y-%m') saletime,
+			(
+			select
+			sum(mog.number)/#{size} as avgSalesNumber
+			FROM
+			mall_order_goods mog
+			where
+			DATE_FORMAT(mog.create_time,'%Y-%m') &gt;= #{startMonth}
+			and DATE_FORMAT(mog.create_time,'%Y-%m') &lt;= #{endMonth}
+			and mog.sku = og.sku
 
+			group by sku
+			) as avgSalesNumber,
+			IFNULL((
+			select g.goods_number
+			from mall_goods g
+			where g.sku = og.sku
+			),0) as goodsNumber,
+			IFNULL((
+			select sum(r.stock_num)
+			from mall_product_store_rela r
+			where r.sku = og.sku
+			),0) stockNumber,
+			IFNULL((
+			select sum(d.num)
+			from mall_goods_transport_info_detail d
+			where d.sku = og.sku
+			),0) as number,
+			og.goods_name as goodsName
+			FROM
+			mall_order o
+			LEFT JOIN mall_order_goods og ON o.id = og.order_id
+			LEFT JOIN mall_merch m ON o.merch_sn = m.merch_sn
+			<where>
+				o.is_onffline_order = '1'
+				AND o.order_biz_type = '10'
+				AND o.pay_status = '2'
+				AND DATE_FORMAT(og.create_time,'%Y-%m') &gt;= #{startMonth}
+				and DATE_FORMAT(og.create_time,'%Y-%m') &lt;= #{endMonth}
+				<if test="merchSn != null">
+					and m.merch_sn = #{merchSn}
+				</if>
+			</where>
+			group by sku,DATE_FORMAT(og.create_time,'%Y-%m')
 
-	<select id="querySelectedMonthSales" resultType="com.kmall.admin.entity.MonthlySalesGrowthEntity">
-		SELECT
-		sku,sum( number ) total ,DATE_FORMAT(create_time,'%Y-%m') saletime
-		FROM
-		mall_order_goods
-		where
-		DATE_FORMAT(create_time,'%Y-%m') &gt;= '2019-08'
-		and DATE_FORMAT(create_time,'%Y-%m') &lt;= '2019-11'
-		group by sku,DATE_FORMAT(create_time,'%Y-%m')
-	</select>
+		) t
 
 
+	</select>
+
 
 </mapper>

+ 2 - 1
kmall-admin/src/main/webapp/WEB-INF/page/sale/monthlyCustomers2.html

@@ -40,7 +40,8 @@
             <span>日期:</span>
             <input type="month" name="startMonth" id="startMonth"/>&nbsp;
             <input type="month" name="endMonth" id="endMonth" />&nbsp;
-                <input type="button" name="queryButton" value="导出选中的数据" onclick="exportSelectedMonthData()" />
+            <input type="button" name="queryButton" value="导出选中的数据" onclick="exportSelectedMonthData()" />
+            <input type="number" name="monthNumber" id="monthNumber">;
             </div>
         </div>
     </header>

+ 15 - 56
kmall-admin/src/main/webapp/js/sale/monthlyCustomers2.js

@@ -213,67 +213,26 @@ function exportMonthly(){
 function exportSelectedMonthData(){
     var startMonth = document.getElementById("startMonth").value;
     var endMonth = document.getElementById("endMonth").value;
+    var monthNumber = document.getElementById("monthNumber").value;
 
     var param = {
         startMonth:startMonth,
-        endMonth:endMonth
+        endMonth:endMonth,
+        monthNumber:monthNumber
     };
-    console.log(param);
-    // 折线图
-    $.ajax({
-        url: "../monthly/totalStock",
-        data: param,
-        contentType:"application/x-www-form-urlencoded",
-        type: 'POST',
-        success: function(data) {
-            console.log(JSON.stringify(data))
-
-        },
-    });
+    console.log(param+321313112);
+    exportFile('#rrapp', '../monthly/exportSelectedMonthData', param);
+    // $.ajax({
+    //     url: "../monthly/exportSelectedMonthData",
+    //     data: param,
+    //     contentType:"application/x-www-form-urlencoded",
+    //     type: 'POST',
+    //     success: function(data) {
+    //         console.log(JSON.stringify(data))
+    //
+    //     },
+    // });
 }
-function predeterminedNumber(){
-    var startMonth = document.getElementById("startMonth").value;
-    var endMonth = document.getElementById("endMonth").value;
-
-    var param = {
-        startMonth:startMonth,
-        endMonth:endMonth
-    };
-    console.log(param);
-    // 折线图
-    $.ajax({
-        url: "../monthly/predeterminedNumber",
-        data: param,
-        contentType:"application/x-www-form-urlencoded",
-        type: 'POST',
-        success: function(data) {
-            console.log(JSON.stringify(data))
-
-        },
-    });
-}
-function bookNumberOfBoxes(){
-    var startMonth = document.getElementById("startMonth").value;
-    var endMonth = document.getElementById("endMonth").value;
-
-    var param = {
-        startMonth:startMonth,
-        endMonth:endMonth
-    };
-    console.log(param);
-    // 折线图
-    $.ajax({
-        url: "../monthly/bookNumberOfBoxes",
-        data: param,
-        contentType:"application/x-www-form-urlencoded",
-        type: 'POST',
-        success: function(data) {
-            console.log(JSON.stringify(data))
-
-        },
-    });
-}
-