瀏覽代碼

Merge branch 'master' of zcb/kmall-pt-general into master

张创标 4 年之前
父節點
當前提交
0ddf44f366
共有 19 個文件被更改,包括 901 次插入24 次删除
  1. 109 0
      README.md
  2. 72 0
      kmall-admin/src/main/java/com/kmall/admin/controller/statistics/MonthlyCustomersController.java
  3. 17 0
      kmall-admin/src/main/java/com/kmall/admin/dao/statistics/MonthlyCustomersDao.java
  4. 11 11
      kmall-admin/src/main/java/com/kmall/admin/entity/MonthlySalesGrowthEntity.java
  5. 3 0
      kmall-admin/src/main/java/com/kmall/admin/service/impl/SysNoticeServiceImpl.java
  6. 59 0
      kmall-admin/src/main/java/com/kmall/admin/service/impl/statistics/MonthlyCustomersServiceImpl.java
  7. 13 0
      kmall-admin/src/main/java/com/kmall/admin/service/statistics/MonthlyCustomersService.java
  8. 6 5
      kmall-admin/src/main/java/com/kmall/admin/task/TestTask.java
  9. 29 0
      kmall-admin/src/main/resources/mybatis/mapper/statistics/MonthlyCustomersDao.xml
  10. 56 0
      kmall-admin/src/main/webapp/WEB-INF/page/sale/monthlyCustomers.html
  11. 1 1
      kmall-admin/src/main/webapp/js/alarm/mall2orderingearlywarningreminds.js
  12. 1 1
      kmall-admin/src/main/webapp/js/alarm/mall2shippingreminderalarm.js
  13. 470 0
      kmall-admin/src/main/webapp/js/sale/monthlyCustomers.js
  14. 1 1
      kmall-admin/src/main/webapp/statics/plugins/treegrid/jquery.treegrid.extension.js
  15. 3 3
      kmall-api/src/main/java/com/kmall/api/service/ApiOrderService.java
  16. 9 0
      kmall-manager/src/main/java/com/kmall/manager/manager/redis/JedisProperties.java
  17. 1 0
      kmall-manager/src/main/resources/conf/redis.properties
  18. 3 2
      kmall-manager/src/main/resources/spring/spring-redis.xml
  19. 37 0
      切换环境需要修改的.md

+ 109 - 0
README.md

@@ -0,0 +1,109 @@
+# kmall-pt
+
+#### 项目介绍
+kmall-pt
+
+
+#### 软件架构
+软件架构说明
+
+
+#### 新增功能
+* 完善开源版本购物流程
+* 多门店管理
+* 下单语音提醒
+* 团购管理
+    * 团购设置
+    * 分享
+* 优惠活动
+    * 折扣
+    * 满减
+    * 满免配送
+* 优惠推广
+    * 下单送满减券
+    * 推荐送满减券
+* 订单管理
+    * 普通订单
+    * 团购订单
+    * 打印订单
+* 收货地址
+    * 用户输入
+    * 微信地址
+* 用户评论审核
+* 快递查询接口
+    * 快递鸟
+* 用户下单自动打印小票
+    * 飞鸽打印机
+* 升级版UI
+* 短信平台
+* 优化退款功能和付款记录
+
+## 本地开发环境启动步骤
+* 新建数据库 kmall_pt
+    * 字符集                 : utf8mb4 -- UTF-8 Unicode
+    * 排序规则               : utf8mb4_unicode_ci
+* 导入wechat_buss.sql
+* 修改开发环境配置kmall-pt\kmall-admin\src\main\resources\dev\platform.properties
+    * jdbc.url
+    * jdbc.username
+    * jdbc.password
+    * redis.host
+    * redis.port
+    * wx.appId
+    * wx.secret
+    * wx.mchId
+    * wx.paySignKey
+    * wx.notifyUrl
+    * spbillCreateIp
+    * 如果使用快递接口请自行申请账户
+        * kdn.businessId
+        * kdn.appKey
+* 修改生产环境配置kmall-pt\kmall-admin\src\main\resources\prod\platform.properties(同上)
+* 安装并启动redis
+* 启动项目(参照开发文档2.6)
+* 将wx-mall导入微信web开发者工具
+
+* 生成环境打包 
+    * mvn clean package
+    
+## 打印机设置
+* 360急速浏览器
+    * 打开浏览器,点击右上角"自定义和控制360急速浏览器"图标,在弹出层上面点击【打印】
+    * 选择打印机
+    * 打开更多设置
+    * 纸张尺寸:选择自定义的选项,如没有,选择默认
+    * 边距:最小
+    * 选项:去掉所有勾选
+    * 此配置为推荐配置,可按实际情况调整
+* 谷歌浏览器
+    * 打开浏览器,点击右上角"自定义及控制Google Chrome"图标,在弹出层上面点击【打印】
+    * 选择打印机
+    * 打开更多设置
+    * 纸张尺寸:选择自定义的选项,如没有,选择默认
+    * 边距:最小
+    * 选项:去掉所有勾选
+    * 此配置为推荐配置,可按实际情况调整
+* 火狐浏览器
+    * 打开浏览器,点击右上角"打开菜单"图标,在弹出层上面点击【打印】
+    * 在新界面左上角点击【打印(p)】
+    * 在弹出层上选择打印机后,点击【确认】
+    * 在新界面左上角点击【页面设置(U)】
+    * 在弹出层上点击【页边距和页眉/页脚】
+    * 在"页边距"中左右顶底都设置为0.1
+    * 在"页眉和页脚"中所有选项都选择空白
+    * 点击【确认】->点击【关闭】完成配置
+    * 此配置为推荐配置,可按实际情况调整
+#### 打印机静默设置
+* 谷歌浏览器
+    * 第一次打印设置好打印样式
+    * 右键快捷方式,点击【属性】,在【目标】尾部位置添加“ --kiosk-printing”注意空格,
+    * 如C:\Program Files (x86)\Google\Chrome\Application\chrome.exe --kiosk-printing
+    * 重新打开浏览器
+* 火狐浏览器
+    * 第一次打印设置好打印样式
+    * 在地址栏输入"about:config"
+    * 点击"我了解此风险!"按钮
+    * 在页面随意地方点击右键,选择【新建】->【布尔】
+    * 输入首选项名称为"print.always_print_silent",点击【确定】
+    * 选择值为"true"点击【确定】
+    * 重新打开浏览器

+ 72 - 0
kmall-admin/src/main/java/com/kmall/admin/controller/statistics/MonthlyCustomersController.java

@@ -0,0 +1,72 @@
+package com.kmall.admin.controller.statistics;
+
+import com.kmall.admin.fromcomm.entity.SysUserEntity;
+import com.kmall.admin.service.statistics.MonthlyCustomersService;
+import com.kmall.common.utils.R;
+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 java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.*;
+
+/**
+ * @author zhangchuangbiao
+ * @version 1.0
+ * 2020-09-01 14:35
+ */
+@RestController
+@RequestMapping("/monthly")
+public class MonthlyCustomersController {
+
+    @Autowired
+    private MonthlyCustomersService monthlyCustomersService;
+
+
+    private void calculateDifferentMonth(List<String> monthList, String startMonth, String endMonth) throws ParseException {
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM");
+        Calendar bef = Calendar.getInstance();
+        Calendar aft = Calendar.getInstance();
+        bef.setTime(sdf.parse(startMonth));
+        aft.setTime(sdf.parse(endMonth));
+
+        do {
+            monthList.add(sdf.format(bef.getTime()));
+            bef.add(Calendar.MONTH, 1);
+        }
+        while (bef.compareTo(aft) <= 0);
+
+    }
+
+    @RequestMapping("/customersQuery")
+    public R queryMonthlyCustomers(@RequestParam("startMonth") String startMonth, @RequestParam("endMonth") String endMonth) {
+
+        List<String> dateList = new ArrayList<>();
+        try {
+            calculateDifferentMonth(dateList, startMonth, endMonth);
+        } catch (ParseException e) {
+            e.printStackTrace();
+        }
+
+        String merchSn = null;
+        SysUserEntity sysUser = (SysUserEntity) SecurityUtils.getSubject().getPrincipal();
+        if(!"1".equals(sysUser.getRoleType())){
+            merchSn = sysUser.getMerchSn();
+        }
+
+
+        Map<String,Object> map = monthlyCustomersService.queryMonthlyCustomers(startMonth,endMonth,merchSn);
+
+        Map<String, Object> returnMap = new HashMap<>();
+        returnMap.put("dateList", dateList);
+        returnMap.putAll(map);
+
+
+        return R.ok(returnMap);
+    }
+
+
+}

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

@@ -0,0 +1,17 @@
+package com.kmall.admin.dao.statistics;
+
+import com.kmall.admin.entity.MonthlySalesGrowthEntity;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author zhangchuangbiao
+ * @version 1.0
+ * 2020-09-01 16:16
+ */
+public interface MonthlyCustomersDao {
+
+    List<MonthlySalesGrowthEntity> queryMonthlyCustomers(@Param("startMonth") String startMonth, @Param("endMonth") String endMonth, @Param("merchSn") String merchSn);
+}

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

@@ -8,11 +8,11 @@ public class MonthlySalesGrowthEntity implements Serializable {
     private String merchSn;
     private String merchSn;
     private String merchName;
     private String merchName;
     //销售总额
     //销售总额
-    private BigDecimal totalSales;
+    private String totalSales;
     // 销售数量
     // 销售数量
-    private Integer totalNumber;
+    private String totalNumber;
     // 客单数
     // 客单数
-    private Integer taotalCustomers;
+    private String totalCustomers;
     private String yearAndMonth;
     private String yearAndMonth;
 
 
     public String getMerchSn() {
     public String getMerchSn() {
@@ -31,28 +31,28 @@ public class MonthlySalesGrowthEntity implements Serializable {
         this.merchName = merchName;
         this.merchName = merchName;
     }
     }
 
 
-    public BigDecimal getTotalSales() {
+    public String getTotalSales() {
         return totalSales;
         return totalSales;
     }
     }
 
 
-    public void setTotalSales(BigDecimal totalSales) {
+    public void setTotalSales(String totalSales) {
         this.totalSales = totalSales;
         this.totalSales = totalSales;
     }
     }
 
 
-    public Integer getTotalNumber() {
+    public String getTotalNumber() {
         return totalNumber;
         return totalNumber;
     }
     }
 
 
-    public void setTotalNumber(Integer totalNumber) {
+    public void setTotalNumber(String totalNumber) {
         this.totalNumber = totalNumber;
         this.totalNumber = totalNumber;
     }
     }
 
 
-    public Integer getTaotalCustomers() {
-        return taotalCustomers;
+    public String getTotalCustomers() {
+        return totalCustomers;
     }
     }
 
 
-    public void setTaotalCustomers(Integer taotalCustomers) {
-        this.taotalCustomers = taotalCustomers;
+    public void setTotalCustomers(String totalCustomers) {
+        this.totalCustomers = totalCustomers;
     }
     }
 
 
     public String getYearAndMonth() {
     public String getYearAndMonth() {

+ 3 - 0
kmall-admin/src/main/java/com/kmall/admin/service/impl/SysNoticeServiceImpl.java

@@ -8,6 +8,7 @@ import org.springframework.stereotype.Service;
 
 
 import java.util.List;
 import java.util.List;
 import java.util.Map;
 import java.util.Map;
+import java.util.UUID;
 
 
 /**
 /**
  * 通知Service实现类
  * 通知Service实现类
@@ -38,6 +39,8 @@ public class SysNoticeServiceImpl implements SysNoticeService {
 
 
     @Override
     @Override
     public int save(SysNoticeEntity sysNotice) {
     public int save(SysNoticeEntity sysNotice) {
+
+        sysNotice.setId(UUID.randomUUID().toString().replaceAll("-",""));
         return sysNoticeDao.save(sysNotice);
         return sysNoticeDao.save(sysNotice);
     }
     }
 
 

+ 59 - 0
kmall-admin/src/main/java/com/kmall/admin/service/impl/statistics/MonthlyCustomersServiceImpl.java

@@ -0,0 +1,59 @@
+package com.kmall.admin.service.impl.statistics;
+
+import com.kmall.admin.dao.statistics.MonthlyCustomersDao;
+import com.kmall.admin.entity.MonthlySalesGrowthEntity;
+import com.kmall.admin.service.statistics.MonthlyCustomersService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * @author zhangchuangbiao
+ * @version 1.0
+ * 2020-09-01 14:36
+ */
+@Service("monthlyCustomersService")
+public class MonthlyCustomersServiceImpl implements MonthlyCustomersService {
+
+    @Autowired
+    private MonthlyCustomersDao monthlyCustomersDao;
+
+    @Override
+    public Map<String, Object> queryMonthlyCustomers(String startMonth, String endMonth, String merchSn) {
+        List<MonthlySalesGrowthEntity> monthlySalesGrowthEntities = monthlyCustomersDao.queryMonthlyCustomers(startMonth, endMonth, merchSn);
+
+        Map<String,Object> map = new HashMap<>();
+        // 查询销售件数
+        List<String> totalNumberList = new ArrayList<>();
+//        // 查询销售额
+        List<String> totalSalesList = new ArrayList<>();
+//        // 查询客户数
+        List<String> taotalCustomersList = new ArrayList<>();
+//        // 查询客单价
+        List<String> avgBasketSaleList = new ArrayList<>();
+
+        // 按照实体类的日期进行升序排序
+        monthlySalesGrowthEntities = monthlySalesGrowthEntities.stream().sorted(Comparator.comparing(MonthlySalesGrowthEntity::getYearAndMonth)).collect(Collectors.toList());
+        for (MonthlySalesGrowthEntity monthlySalesGrowthEntity : monthlySalesGrowthEntities) {
+            String totalSales = monthlySalesGrowthEntity.getTotalSales();
+            String taotalCustomers = monthlySalesGrowthEntity.getTotalCustomers();
+            String totalNumber = monthlySalesGrowthEntity.getTotalNumber();
+
+            totalNumberList.add(totalNumber); // 销售数量
+            totalSalesList.add(totalSales); // 销售额
+            taotalCustomersList.add(taotalCustomers); // 客单数
+            String avgBasketSale = new BigDecimal(totalSales).divide(new BigDecimal(totalNumber),3, RoundingMode.HALF_UP).toString(); // 客单价
+            avgBasketSaleList.add(avgBasketSale);
+        }
+        map.put("totalNumberList",totalNumberList);
+        map.put("totalSalesList",totalSalesList);
+        map.put("taotalCustomersList",taotalCustomersList);
+        map.put("avgBasketSaleList",avgBasketSaleList);
+
+        return map;
+    }
+}

+ 13 - 0
kmall-admin/src/main/java/com/kmall/admin/service/statistics/MonthlyCustomersService.java

@@ -0,0 +1,13 @@
+package com.kmall.admin.service.statistics;
+
+import java.util.Map;
+
+/**
+ * @author zhangchuangbiao
+ * @version 1.0
+ * 2020-09-01 14:36
+ */
+public interface MonthlyCustomersService {
+
+    Map<String, Object> queryMonthlyCustomers(String startMonth, String endMonth, String merchSn);
+}

+ 6 - 5
kmall-admin/src/main/java/com/kmall/admin/task/TestTask.java

@@ -8,7 +8,10 @@ import com.kmall.admin.websocket.WebSocketServer;
 import org.apache.commons.lang.builder.ToStringBuilder;
 import org.apache.commons.lang.builder.ToStringBuilder;
 import org.slf4j.Logger;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.slf4j.LoggerFactory;
+import org.springframework.beans.BeansException;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.ApplicationContextAware;
 import org.springframework.scheduling.annotation.EnableScheduling;
 import org.springframework.scheduling.annotation.EnableScheduling;
 import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Component;
 import org.springframework.stereotype.Component;
@@ -35,19 +38,15 @@ public class TestTask {
 
 
     @Autowired
     @Autowired
     private SysUserService sysUserService;
     private SysUserService sysUserService;
-    @Autowired
-    private static PickUpCodeService pickUpCodeService;
 
 
 
 
 
 
-    @Scheduled(cron = "0/5 * * * * ?")
+//    @Scheduled(cron = "0/5 * * * * ?")
     public void flushPickUpCode() {
     public void flushPickUpCode() {
         logger.info("flushPickUpCode-----------------" );
         logger.info("flushPickUpCode-----------------" );
 
 
 
 
         WebSocketServer.broadcastInfo("broadcast");
         WebSocketServer.broadcastInfo("broadcast");
-//        SysUserEntity user = sysUserService.queryObject(1L);
-//        System.out.println(ToStringBuilder.reflectionToString(user));
 
 
     }
     }
 
 
@@ -55,4 +54,6 @@ public class TestTask {
     public void test2() {
     public void test2() {
         logger.info("我是不带参数的test2方法,正在被执行");
         logger.info("我是不带参数的test2方法,正在被执行");
     }
     }
+
+
 }
 }

+ 29 - 0
kmall-admin/src/main/resources/mybatis/mapper/statistics/MonthlyCustomersDao.xml

@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+
+<mapper namespace="com.kmall.admin.dao.statistics.MonthlyCustomersDao">
+
+    <select id="queryMonthlyCustomers" resultType="com.kmall.admin.entity.MonthlySalesGrowthEntity" >
+		SELECT
+		o.merch_sn AS merchSn,
+		m.merch_name AS merchName,
+		sum( o.order_price ) AS totalSales,
+		sum( og.number) as totalNumber,
+		count(DISTINCT o.id) as totalCustomers,
+		DATE_FORMAT(o.pay_time,'%Y-%m') as yearAndMonth
+		FROM
+		mall_order o
+		LEFT JOIN mall_merch m ON o.merch_sn = m.merch_sn
+		LEFT JOIN mall_order_goods og ON o.id = og.order_id
+		<where>
+			DATE_FORMAT(o.pay_time,'%Y-%m')  &gt;= #{startMonth}
+			and DATE_FORMAT(o.pay_time,'%Y-%m') &lt;= #{endMonth}
+			<if test="merchSn != null">
+				and m.merch_sn = #{merchSn}
+			</if>
+		</where>
+		group by DATE_FORMAT(o.pay_time,'%Y-%m')
+
+	</select>
+
+</mapper>

+ 56 - 0
kmall-admin/src/main/webapp/WEB-INF/page/sale/monthlyCustomers.html

@@ -0,0 +1,56 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="UTF-8">
+    <title>Monthly Customers & Avg Basket</title>
+    #parse("sys/header.html")
+    <style>
+        .coldiv {
+            background-color: #f8f8f9;
+        }
+
+        body {
+            color: #515a6e;
+        }
+
+        #refreshTime, #storeId, #categoryId {
+            width: 100px;
+        }
+
+        #merchSn {
+            width: 300px;
+        }
+
+        i {
+            font-size: 20px;
+        }
+
+        input {
+            border: 1px #dcdee2 solid;
+            border-radius: 5px;
+            outline-color: #5cadff;
+        }
+    </style>
+</head>
+<body>
+<!--<div id="rrapp" v-cloak>-->
+    <header class="main-header">
+        <div class="container-fluid  coldiv">
+            <div class="row" style="border:0;margin-bottom:10px">
+            <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="queryMonthly()" />
+            </div>
+        </div>
+    </header>
+    <div class="row">
+        <div class="col-md-12  col-sm-12  col-xs-12 charts6">
+            <div id="main3" style="height: 200px;"></div>
+        </div>
+    </div>
+    <script src="${rc.contextPath}/js/sale/echarts.js"></script>
+    <script src="${rc.contextPath}/js/sale/monthlyCustomers.js"></script>
+<!--</div>-->
+</body>
+</html>

+ 1 - 1
kmall-admin/src/main/webapp/js/alarm/mall2orderingearlywarningreminds.js

@@ -10,7 +10,7 @@ $(function () {
             {label: '平均销量', name: 'averageSales', index: 'average_sales',align:"right", width: 120},
             {label: '平均销量', name: 'averageSales', index: 'average_sales',align:"right", width: 120},
 			{label: '总库存数', name: 'totalNum', index: 'total_num',align:"right", width: 120},
 			{label: '总库存数', name: 'totalNum', index: 'total_num',align:"right", width: 120},
 			{
 			{
-				label: '预警时间', name: 'alarmTime', index: 'alarm_time',align:"center", width: 80, formatter: function (value) {
+				label: '预警时间', name: 'alarmTime', index: 'alarm_time',align:"center", width: 200, formatter: function (value) {
 					return transDate(value, 'yyyy-MM-dd hh:mm:ss');
 					return transDate(value, 'yyyy-MM-dd hh:mm:ss');
 				}
 				}
 			}
 			}

+ 1 - 1
kmall-admin/src/main/webapp/js/alarm/mall2shippingreminderalarm.js

@@ -17,7 +17,7 @@ $(function () {
 
 
 				}},
 				}},
 			{
 			{
-				label: '预警时间', name: 'alarmTime', index: 'alarm_time',align:"center", width: 80, formatter: function (value) {
+				label: '预警时间', name: 'alarmTime', index: 'alarm_time',align:"center", width: 200, formatter: function (value) {
 					return transDate(value, 'yyyy-MM-dd hh:mm:ss');
 					return transDate(value, 'yyyy-MM-dd hh:mm:ss');
 				}
 				}
 			}
 			}

+ 470 - 0
kmall-admin/src/main/webapp/js/sale/monthlyCustomers.js

@@ -0,0 +1,470 @@
+$(function () {
+    var data = {
+        "echatX": [
+            "2019-07-02",
+            "2019-07-03",
+            "2019-07-04",
+            "2019-07-05",
+            "2019-07-06",
+            "2019-07-07",
+            "2019-07-08",
+            "2019-07-09",
+            "2019-07-10",
+            "2019-07-11",
+            "2019-07-12",
+            "2019-07-13",
+            "2019-07-14",
+            "2019-07-15"
+        ],
+        "echatY": [
+            501,210,123,333,445,157,151,369,101,101,350,435,153,100
+        ],
+        "echatY2": [
+            80,40,13,36,57,77,41,39,61,31,60,73,33,50
+        ],
+        "echatY3": [
+            5091,2210,1233,3133,4415,1517,1511,3619,1101,1011,3510,4315,1513,1100
+        ],
+        "echatY4": [
+            501,210,123,333,445,157,151,369,101,101,350,435,153,100
+        ],
+        "peopleTotal":15,"peopleOnline":4,"peopleOutline":12,"ranges":[]
+    };
+    dFun(data.echatX, data.echatY, data.echatY2,data.echatY3,data.echatY4);
+
+
+});
+var myChart;
+// 基于准备好的dom,初始化echarts实例
+var dChart = echarts.init(document.getElementById('main3'));
+// 指定图表的配置项和数据
+function dFun(dateList, totalNumberList, totalSalesList,taotalCustomersList,avgBasketSaleList) {
+    dChart.setOption({
+        // title: {
+        //     left: 'left',
+        //     text: '概率',
+        //     show: false
+        // },
+        tooltip: {
+            trigger: 'axis',
+            // formatter: '{a}:{c}',
+            axisPointer: {
+                type: 'shadow',
+                crossStyle: {
+                    color: '#999'
+                }
+            }
+        },
+        grid: {
+            show: false,
+            left: '3%',
+            right: '4%',
+            bottom: '10%'
+        },
+        // legend: {
+        //     show: true,
+        //     selectedMode: 'single', // 设置显示单一图例的图形,点击可切换
+        //     bottom: 10,
+        //     left: 50,
+        //     textStyle: {
+        //         color: '#666',
+        //         fontSize: 12
+        //     },
+        //     itemGap: 20,
+        //     inactiveColor: '#ccc'
+        // },
+        xAxis: {
+            // splitLine: {     show: false   },
+            type: 'category',
+            data: dateList,
+            axisPointer: {
+                type: 'shadow'
+            },
+            // 改变x轴颜色
+            axisLine: {
+                lineStyle: {
+                    color: '#00a2e2',
+                    width: 1, // 这里是为了突出显示加上的
+                }
+            },
+            axisTick: {
+                show: true,
+                interval: 0
+            },
+        },
+        // 设置两个y轴,左边显示数量,右边显示概率
+        yAxis: [{
+            splitLine: {     show: false   },
+            type: 'value',
+            name: '',
+            // max: 10000,
+            // min: 0,
+            // show: true,
+            // interval: 1000,
+            // 改变y轴颜色
+            axisLine: {
+                lineStyle: {
+                    color: '#00a2e2',
+                    width: 1, // 这里是为了突出显示加上的
+                }
+            },
+        }, // 右边显示概率
+        {
+            splitLine: {     show: false   },
+            type: 'value',
+            name: '客单价',
+            // min: 0,
+            // max: 100,
+            // interval: 10,
+            // 改变y轴颜色
+            axisLine: {
+                lineStyle: {
+                    color: '#00a2e2',
+                    width: 1, // 这里是为了突出显示加上的
+                }
+            }
+        }],
+        // 每个设备分数量、概率2个指标,只要让他们的name一致,即可通过,legeng进行统一的切换
+        series: [{
+            name: 'Units Sold',
+            type: 'bar',
+            symbol: 'circle', // 折线点设置为实心点
+            symbolSize: 4, // 折线点的大小
+            data: totalNumberList,
+            barWidth: '20%',
+
+        },{
+            name: 'Sales',
+            type: 'bar',
+            symbol: 'circle', // 折线点设置为实心点
+            symbolSize: 4, // 折线点的大小
+            data: totalSalesList,
+            barWidth: '20%',
+
+        },{
+            name: 'Customers',
+            type: 'bar',
+            symbol: 'circle', // 折线点设置为实心点
+            symbolSize: 4, // 折线点的大小
+            data: taotalCustomersList,
+            barWidth: '20%',
+
+        },
+            {
+            //折线
+            name: 'Average Basket Sale',
+            type: 'line',
+            symbol: 'circle', // 折线点设置为实心点
+            symbolSize: 6, // 折线点的大小
+            yAxisIndex: 1, // 这里要设置哪个y轴,默认是最左边的是0,然后1,2顺序来。
+            data: avgBasketSaleList,
+            symbolSize: 10,
+            itemStyle: {
+                normal: {
+                    color: "#DDA0DD"
+                }
+            }
+
+        },
+
+        ]
+
+    });
+}
+
+function queryMonthly(){
+    var startMonth = document.getElementById("startMonth").value;
+    var endMonth = document.getElementById("endMonth").value;
+
+    var param = {
+        startMonth:startMonth,
+        endMonth:endMonth
+    };
+    console.log(param);
+    // 折线图
+    $.ajax({
+        url: "../monthly/customersQuery",
+        data: param,
+        contentType:"application/x-www-form-urlencoded",
+        type: 'POST',
+        success: function(data) {
+            console.log(JSON.stringify(data))
+            dFun(data.dateList, data.totalNumberList, data.totalSalesList,data.taotalCustomersList,data.avgBasketSaleList);
+
+        },
+    });
+
+}
+
+
+let vm = new Vue({
+    el: '#rrapp',
+    data: {
+        date: '',
+        refreshTime: 10,
+        type: 'store',
+        refreshCount:0,
+
+        storeId: '',
+        merchSn: '',
+        merchName: '',
+        storeName: '',
+        salesDate: '',
+        totalSales: '',
+        actualSales: '',
+        preferentialLoss: '',
+        totalCost: '',
+        grossProfit: '',
+        grossProfitRatio: '',
+        proportion: '',
+        guestNumber: '',
+        guestUnitPrice: '',
+        lastSalesTime: '',
+        categoryId: '',
+        categoryName: '',
+
+        showList: false,
+        compareDate: '',//比较日期
+        storeId2: '',
+        merchSn2: '',
+        merchName2: '',
+        storeName2: '',
+        salesDate2: '',
+        totalSales2: '',
+        actualSales2: '',
+        preferentialLoss2: '',
+        totalCost2: '',
+        grossProfit2: '',
+        grossProfitRatio2: '',
+        proportion2: '',
+        guestNumber2: '',
+        guestUnitPrice2: '',
+        lastSalesTime2: '',
+        intervalId: 0,
+        isCompare: false,
+        compare2: '',
+
+
+        temp: {
+            date: '',
+            refreshTime: 10,
+            type: '',
+            storeId: '',
+            merchSn: '',
+            salesDate: '',
+            categoryId: ''
+        },
+
+
+        rateList: [
+            {
+                id: '0',
+                name: '含税'
+            },
+            {
+                id: '1',
+                name: '不含税'
+
+            }
+        ],
+        projectList: [
+            {
+                id: '0',
+                name: '销售总额'
+            },
+            {
+                id: '1',
+                name: '客单价'
+
+            }
+        ],
+        seriesTypeList: [
+            {
+                id: 'bar',
+                name: '垂直柱状图'
+            },
+            {
+                id: 'line',
+                name: '折线图'
+
+            },
+            {
+                id: 'pie',
+                name: '饼图'
+
+            }
+        ],
+        formatsList: [
+            {
+                id: '0',
+                name: '<全部>'
+            },
+            {
+                id: '1',
+                name: '<非全部>'
+
+            }
+        ],
+        salesList: [
+            {
+                store: {storeId: '11106', storeName: '前海店'},
+                totalSales: 43046.18,
+                actualSales: 35593.46
+            }
+        ],
+        dept: {
+            deptId: '',
+            deptName: ''
+        },
+        category: {
+            categoryId: '',
+            categoryName: ''
+        },
+        seriesList: [], //保存饼图数据
+        seriesList2: [],
+        xAxisList: {    //主要用于保存 启动刷新时的条件和数据
+            storeId: '',
+            storeName: '',
+            merchSn: '',
+            merchName: '',
+            totalSales: '',
+            actualSales: '',
+            preferentialLoss: '',
+            totalCost: '',
+            grossProfit: '',
+            grossProfitRatio: '',
+            proportion: '',
+            guestNumber: '',
+            guestUnitPrice: '',
+            lastSalesTime: '',
+
+            salesDate: '0',
+            projectSelect: '0',
+            type:''
+        },
+        dataList: [],
+        tooltip: {},
+        today:''
+    },
+    created() {
+        this.rateSelect = this.rateList[0].id;
+        this.projectSelect = this.projectList[0].id;
+        this.seriesTypeSelect = this.seriesTypeList[0].id;
+        this.formatsSelect = this.formatsList[0].id;
+    },
+    methods: {
+
+        seriesTypeSwitch: function () {
+            console.log(vm.seriesTypeSelect);
+        },
+        showEcharts: function () {
+            // 基于准备好的dom,初始化echarts实例
+            myChart = echarts.init(document.getElementById('main'));
+            myChart.clear();
+            //加载动画
+            myChart.showLoading();
+
+
+            //项目下拉框判断       6-19,饼图设置 vm.xAxisList
+            var temp = '';
+            if (vm.xAxisList.projectSelect == '0') {
+                if (vm.xAxisList.type == 'dept') {
+                    temp = '[' + vm.xAxisList.merchSn + ']' + vm.xAxisList.merchName + '/销售总额:' + vm.xAxisList.totalSales + '元(' + vm.xAxisList.salesDate + ')';
+                } else {
+                    temp = '[' + vm.xAxisList.storeId + ']' + vm.xAxisList.storeName + '/销售总额:' + vm.xAxisList.totalSales + '元(' + vm.xAxisList.salesDate + ')';
+                }
+                vm.seriesList2.push(vm.xAxisList.totalSales);
+                vm.seriesList.push({value: vm.xAxisList.totalSales, name: temp});
+
+            } else if (vm.xAxisList.projectSelect == '1') {
+                if (vm.xAxisList.type == 'dept') {
+                    temp = '[' + vm.xAxisList.merchSn + ']' + vm.xAxisList.merchName + '/客单价:' + vm.xAxisList.guestUnitPrice + '元(' + vm.xAxisList.salesDate + ')';
+                } else {
+                    temp = '[' + vm.xAxisList.storeId + ']' + vm.xAxisList.storeName + '/客单价:' + vm.xAxisList.guestUnitPrice + '元(' + vm.xAxisList.salesDate + ')';
+                }
+                vm.seriesList2.push(vm.xAxisList.guestUnitPrice);
+                vm.seriesList.push({value: vm.xAxisList.guestUnitPrice, name: temp});
+
+            }
+
+            vm.dataList = [temp];
+
+            if (vm.seriesTypeSelect == "pie") {
+                vm.seriesList2 = vm.seriesList.concat();
+            }
+
+            // console.log('vm.seriesList2');
+            // console.log(vm.seriesList2);
+
+            // 指定图表的配置项和数据
+            //销售量
+            var option = {
+                title: {
+                    // textAlign: 'right',
+                    text: 'Monthly Customers & Avg Basket',
+                    x: 'center',
+                    textStyle: {
+                        //文字颜色
+                        color: '#17233d',
+                        //字体风格,'normal','italic','oblique'
+                        fontStyle: 'normal',
+                        //字体粗细 'normal','bold','bolder','lighter',100 | 200 | 300 | 400...
+                        fontWeight: 'bold',
+                        //字体系列
+                        fontFamily: 'sans-serif',
+                        //字体大小
+                        fontSize: 28
+                    }
+                },
+                tooltip: {
+                    formatter: function (params) {
+                        return params.name;
+                    }
+                },
+                legend: {
+                    data: ['/销售总额']
+                },
+                xAxis: {
+                    data: vm.dataList,
+                    axisLabel: {
+                        interval: 0
+                    }
+                },
+                yAxis: {},
+                series: [{
+                    barMaxWidth: '20%',
+                    barWidth: '50%',
+                    radius: '55%',
+                    roseType: 'angle',
+                    type: vm.seriesTypeSelect,
+                    color: ['#dd6b66', '#759aa0'],
+                    data: vm.seriesList2
+                }]
+            };
+
+            //隐藏
+            myChart.hideLoading();
+            // 使用刚指定的配置项和数据显示图表。
+            myChart.setOption(option);
+
+        },
+        tooltipFormatter: function () {
+            if (vm.type == 'dept') {
+                return '[' + vm.merchSn + ']' + vm.merchName + '/销售总额:' + vm.totalSales + '元(' + vm.salesDate + ')';
+            }
+            return '[' + vm.storeId + ']' + vm.storeName + '/销售总额:' + vm.totalSales + '元(' + vm.salesDate + ')';
+        },
+        showTable: function (postParam) {
+
+            console.log(postParam);
+
+            $("#jqGrid").jqGrid('setGridParam', {
+                postData: postParam
+
+            }).trigger("reloadGrid").closest(".ui-jqgrid-bdiv").css({"overflow-x": "scroll"});
+        },
+        switchProjectView: function () {
+            console.log(vm.projectSelect);
+        }
+    }
+});

+ 1 - 1
kmall-admin/src/main/webapp/statics/plugins/treegrid/jquery.treegrid.extension.js

@@ -256,4 +256,4 @@
         expanderCollapsedClass: 'glyphicon glyphicon-chevron-right'// 缩起的按钮的图标
         expanderCollapsedClass: 'glyphicon glyphicon-chevron-right'// 缩起的按钮的图标
 
 
     };
     };
-})(jQuery);
+})(jQuery);

+ 3 - 3
kmall-api/src/main/java/com/kmall/api/service/ApiOrderService.java

@@ -820,11 +820,11 @@ public class ApiOrderService {
             mkStoreTicketDiscountVo = apiMkStoreTicketDiscountMapper.queryObject(tickDiscId);
             mkStoreTicketDiscountVo = apiMkStoreTicketDiscountMapper.queryObject(tickDiscId);
             if(mkStoreTicketDiscountVo != null) {
             if(mkStoreTicketDiscountVo != null) {
                 if (mkStoreTicketDiscountVo.getTickDiscType().equalsIgnoreCase(Dict.tickDiscType.item_00.getItem())) {
                 if (mkStoreTicketDiscountVo.getTickDiscType().equalsIgnoreCase(Dict.tickDiscType.item_00.getItem())) {
-                    cond = mkStoreTicketDiscountVo.getVoucherCond();
-                    money = mkStoreTicketDiscountVo.getVoucherMoney();
+                    cond = mkStoreTicketDiscountVo.getVoucherCond(); // 代金券使用条件(元),消费金额满多少使用
+                    money = mkStoreTicketDiscountVo.getVoucherMoney(); // 优惠多少钱
                 }
                 }
                 if (mkStoreTicketDiscountVo.getTickDiscType().equalsIgnoreCase(Dict.tickDiscType.item_01.getItem())) {
                 if (mkStoreTicketDiscountVo.getTickDiscType().equalsIgnoreCase(Dict.tickDiscType.item_01.getItem())) {
-                    cond = mkStoreTicketDiscountVo.getDiscCond();
+                    cond = mkStoreTicketDiscountVo.getDiscCond(); // 折扣券使用条件(元),),消费金额满多少使用
                     money = mkStoreTicketDiscountVo.getDiscRatio();//满多少打几折
                     money = mkStoreTicketDiscountVo.getDiscRatio();//满多少打几折
                 }
                 }
                 // TODO: 2019/5/21 代金券暂时无用
                 // TODO: 2019/5/21 代金券暂时无用

+ 9 - 0
kmall-manager/src/main/java/com/kmall/manager/manager/redis/JedisProperties.java

@@ -14,6 +14,15 @@ public class JedisProperties implements Serializable {
     private String host;
     private String host;
     private String port;
     private String port;
     private Pool pool;
     private Pool pool;
+    private String password;
+
+    public String getPassword() {
+        return password;
+    }
+
+    public void setPassword(String password) {
+        this.password = password;
+    }
 
 
     public String getKeyPrefix() {
     public String getKeyPrefix() {
         return keyPrefix;
         return keyPrefix;

+ 1 - 0
kmall-manager/src/main/resources/conf/redis.properties

@@ -17,6 +17,7 @@ redis.dev.pool.testOnBorrow=true
 redis.prod.keyPrefix=platform
 redis.prod.keyPrefix=platform
 redis.prod.host=183.62.225.124
 redis.prod.host=183.62.225.124
 redis.prod.port=6379
 redis.prod.port=6379
+redis.prod.password=Abc-123#*.-
 redis.prod.pool.maxIdle=200
 redis.prod.pool.maxIdle=200
 redis.prod.pool.maxWait=1000
 redis.prod.pool.maxWait=1000
 redis.prod.pool.maxTotal=10000
 redis.prod.pool.maxTotal=10000

+ 3 - 2
kmall-manager/src/main/resources/spring/spring-redis.xml

@@ -5,7 +5,7 @@
        xmlns:aop="http://www.springframework.org/schema/aop"
        xmlns:aop="http://www.springframework.org/schema/aop"
        xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:tx="http://www.springframework.org/schema/tx"
        xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:tx="http://www.springframework.org/schema/tx"
        xsi:schemaLocation="
        xsi:schemaLocation="
-        http://www.springframework.org/schema/beans 
+        http://www.springframework.org/schema/beans
         http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
         http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
         http://www.springframework.org/schema/context
         http://www.springframework.org/schema/context
         http://www.springframework.org/schema/context/spring-context-4.2.xsd
         http://www.springframework.org/schema/context/spring-context-4.2.xsd
@@ -21,6 +21,7 @@
         <property name="keyPrefix" value="${redis.prod.keyPrefix}"/>
         <property name="keyPrefix" value="${redis.prod.keyPrefix}"/>
         <property name="host" value="${redis.prod.host}"/>
         <property name="host" value="${redis.prod.host}"/>
         <property name="port" value="${redis.prod.port}"/>
         <property name="port" value="${redis.prod.port}"/>
+        <property name="password" value="${redis.prod.password}"/>
         <property name="pool">
         <property name="pool">
             <bean class="com.kmall.manager.manager.redis.JedisProperties$Pool">
             <bean class="com.kmall.manager.manager.redis.JedisProperties$Pool">
                 <property name="maxIdle" value="${redis.prod.pool.maxIdle}"/>
                 <property name="maxIdle" value="${redis.prod.pool.maxIdle}"/>
@@ -46,4 +47,4 @@
     </bean>
     </bean>
 
 
 
 
-</beans>
+</beans>

+ 37 - 0
切换环境需要修改的.md

@@ -0,0 +1,37 @@
+切换环境需要修改的:
+
+1. 微信小程序支付配置
+    文件目录:resources\conf\wx-mp.properties
+        修改env为prod
+2. Redis配置
+    文件目录:resources\conf\redis.properties
+        修改env为prod
+3. 打印机配置
+    文件目录:resources\conf\print-ticket.properties
+
+4. 快递鸟配置
+    文件目录:resources\conf\express-kdn.properties
+        修改env为prod
+41. sf快递配置
+    文件目录:resources\conf\express-sf.properties
+        
+5. 云片短信配置
+    文件目录:resources\conf\common.properties
+
+6. 数据源配置
+    文件目录:resources\conf\db.properties
+        切换为生产环境配置
+
+7. 商户配置
+    文件目录:resources\conf\oms-merch.properties
+        oms配置切换为生产环境配置
+
+8. 图片上传配置
+    文件目录:resources\conf\fastdfs.properties
+        切换为生产环境配置
+        
+9. Jdk1.8
+    服务器安装jdk1.8,微信退款回调信息解密需要在目录“jdk1.8.0_131\jre\lib\security”中
+替换local_policy.jar、US_export_policy.jar两个安全的jar文件
+
+10. cert安装目录配置在wx-mp.properties的certName中