Forráskód Böngészése

1.产品top10改成top50
2.monthlyCustomer增加一个根据具体日期对比
3.收银端收入页面清空按钮新增一个确认框
4.品牌去掉商户,门店等相关的概念

zcb 4 éve
szülő
commit
37bd103674
22 módosított fájl, 407 hozzáadás és 199 törlés
  1. 27 26
      kmall-admin/src/main/java/com/kmall/admin/controller/BrandController.java
  2. 43 30
      kmall-admin/src/main/java/com/kmall/admin/controller/statistics/MonthlyCustomersController.java
  3. 2 0
      kmall-admin/src/main/java/com/kmall/admin/dao/BrandDao.java
  4. 2 1
      kmall-admin/src/main/java/com/kmall/admin/dao/statistics/MonthlyCustomersDao.java
  5. 10 0
      kmall-admin/src/main/java/com/kmall/admin/entity/BrandEntity.java
  6. 15 0
      kmall-admin/src/main/java/com/kmall/admin/service/impl/BrandServiceImpl.java
  7. 3 3
      kmall-admin/src/main/java/com/kmall/admin/service/impl/RealtimeSalesDetectionServiceImpl.java
  8. 2 2
      kmall-admin/src/main/java/com/kmall/admin/service/impl/statistics/MonthlyCustomersServiceImpl.java
  9. 1 1
      kmall-admin/src/main/java/com/kmall/admin/service/statistics/MonthlyCustomersService.java
  10. 5 6
      kmall-admin/src/main/resources/XmlTemplate/BrandDtoList.xml
  11. 33 0
      kmall-admin/src/main/resources/mybatis/mapper/BrandDao.xml
  12. 2 1
      kmall-admin/src/main/resources/mybatis/mapper/OrderDao.xml
  13. 21 5
      kmall-admin/src/main/resources/mybatis/mapper/statistics/MonthlyCustomersDao.xml
  14. 5 1
      kmall-admin/src/main/webapp/WEB-INF/page/sale/monthlyCustomers.html
  15. 3 2
      kmall-admin/src/main/webapp/WEB-INF/page/sale/top10ForProduct.html
  16. 5 2
      kmall-admin/src/main/webapp/WEB-INF/page/shop/brand.html
  17. 71 27
      kmall-admin/src/main/webapp/js/sale/monthlyCustomers.js
  18. 0 1
      kmall-admin/src/main/webapp/js/sale/realtimeSalesDetection.js
  19. 5 2
      kmall-admin/src/main/webapp/js/sale/sale.js
  20. 34 12
      kmall-admin/src/main/webapp/js/sale/top10ForProduct.js
  21. 118 77
      kmall-admin/src/main/webapp/js/shop/brand.js
  22. BIN
      kmall-admin/src/main/webapp/statics/file/brand_export_yyyy_mm_dd_v1.0.0.xls

+ 27 - 26
kmall-admin/src/main/java/com/kmall/admin/controller/BrandController.java

@@ -82,26 +82,30 @@ public class BrandController {
     @RequiresPermissions("brand:save")
     public R save(@RequestBody BrandEntity brand) {
 
-        Map<String, Object> valideDate = MapBeanUtil.fromObject(brand);
-        ImmutableBiMap.Builder builder = new ImmutableBiMap.Builder();
-        builder.put("merchSn", "商户");
-//        builder.put("storeId", "门店");
-        builder.put("categoryId", "分类");
-        R r = ValidatorUtil.isEmpty(builder.build(), valideDate);
-        if (Integer.valueOf(r.get("code").toString()) != 0) {
-            throw new RRException(r.get("msg").toString());
-        }
-
-        BrandEntity brandEntity = brandService.queryByCategoryIdAndBrandNameAndMerchSn(brand.getCategoryId(),brand.getName(),brand.getMerchSn());
-        if (Objects.nonNull(brandEntity)){
-            throw new RRException("该分类下已经有该品牌名称");
+//        Map<String, Object> valideDate = MapBeanUtil.fromObject(brand);
+//        ImmutableBiMap.Builder builder = new ImmutableBiMap.Builder();
+////        builder.put("merchSn", "商户");
+////        builder.put("storeId", "门店");
+////        builder.put("categoryId", "分类");
+//        R r = ValidatorUtil.isEmpty(builder.build(), valideDate);
+//        if (Integer.valueOf(r.get("code").toString()) != 0) {
+//            throw new RRException(r.get("msg").toString());
+//        }
+
+//        BrandEntity brandEntity = brandService.queryByCategoryIdAndBrandNameAndMerchSn(brand.getCategoryId(),brand.getName(),brand.getMerchSn());
+//        if (Objects.nonNull(brandEntity)){
+//            throw new RRException("该分类下已经有该品牌名称");
+//        }
+//        // 查询该分类是一级还是二级分类
+//        CategoryEntity categoryEntity = categoryService.queryObject(brand.getCategoryId());
+//        // 获取节点等级
+//        String level = categoryEntity.getLevel();
+//        brand.setCategoryLevel(level);
+        try {
+            brandService.save(brand);
+        } catch (RuntimeException e) {
+            return R.error(e.getMessage());
         }
-        // 查询该分类是一级还是二级分类
-        CategoryEntity categoryEntity = categoryService.queryObject(brand.getCategoryId());
-        // 获取节点等级
-        String level = categoryEntity.getLevel();
-        brand.setCategoryLevel(level);
-        brandService.save(brand);
 
         return R.ok();
     }
@@ -115,9 +119,9 @@ public class BrandController {
 
         Map<String, Object> valideDate = MapBeanUtil.fromObject(brand);
         ImmutableBiMap.Builder builder = new ImmutableBiMap.Builder();
-        builder.put("merchSn", "商户");
+//        builder.put("merchSn", "商户");
 //        builder.put("storeId", "门店");
-        builder.put("categoryId", "分类");
+//        builder.put("categoryId", "分类");
         R r = ValidatorUtil.isEmpty(builder.build(), valideDate);
         if (Integer.valueOf(r.get("code").toString()) != 0) {
             throw new RRException(r.get("msg").toString());
@@ -184,7 +188,7 @@ public class BrandController {
 
         ExcelExport ee = new ExcelExport("品牌制造商信息");
 
-        String[] header = new String[]{"品牌id","所属商户","所属商户id","所属分类","所属分类id","品牌名称","描述","是否显示","是否新品牌"};
+        String[] header = new String[]{"品牌id","品牌名称","品牌唯一简码","描述","是否显示","是否新品牌"};
 
 
         List<Map<String, Object>> list = new ArrayList<>();
@@ -192,11 +196,8 @@ public class BrandController {
             for (BrandEntity brandEntity : brandEntityList) {
                 LinkedHashMap<String, Object> map = new LinkedHashMap<>();
                 map.put("Id",brandEntity.getId());
-                map.put("MerchName",brandEntity.getMerchName());
-                map.put("MerchSn",brandEntity.getMerchSn());
-                map.put("CategoryName",brandEntity.getCategoryName());
-                map.put("CategoryId",brandEntity.getCategoryId());
                 map.put("BrandName",brandEntity.getName());
+                map.put("UniqueIdentifier",brandEntity.getUniqueIdentifier());
                 map.put("SimpleDesc",brandEntity.getSimpleDesc());
                 map.put("IsShow",brandEntity.getIsShow()==1?"是":"否");
                 map.put("IsNew",brandEntity.getIsNew()==1?"是":"否");

+ 43 - 30
kmall-admin/src/main/java/com/kmall/admin/controller/statistics/MonthlyCustomersController.java

@@ -6,9 +6,7 @@ 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.GoodsEntity;
 import com.kmall.admin.entity.MonthlySalesGrowthEntity;
-import com.kmall.admin.entity.ProductStoreRelaEntity;
 import com.kmall.admin.entity.WechatFollowersEntity;
 import com.kmall.admin.fromcomm.entity.SysUserEntity;
 import com.kmall.admin.service.statistics.MonthlyCustomersService;
@@ -66,39 +64,54 @@ public class MonthlyCustomersController {
     private ProductStoreRelaDao productStoreRelaDao;
 
 
-    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));
+    private void calculateDifferentMonth(List<String> monthList, String startMonth, String endMonth, String dateFlag) throws ParseException {
+        if("month".equals(dateFlag)){
+            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);
+            do {
+                monthList.add(sdf.format(bef.getTime()));
+                bef.add(Calendar.MONTH, 1);
+            }
+            while (bef.compareTo(aft) <= 0);
+        }else if("day".equals(dateFlag)){
+            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+            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.DAY_OF_MONTH, 1);
+            }
+            while (bef.compareTo(aft) <= 0);
         }
-        while (bef.compareTo(aft) <= 0);
+
 
     }
 
     /**
      * 每月销售额查询
-     * @param startMonth
-     * @param endMonth
+     * @param startDate
+     * @param endDate
      * @return
      */
     @RequestMapping("/customersQuery")
-    public R queryMonthlyCustomers(@RequestParam("startMonth") String startMonth, @RequestParam("endMonth") String endMonth) {
-        if (Objects.isNull(startMonth) || "".equals(startMonth)){
+    public R queryMonthlyCustomers(@RequestParam("startDate") String startDate, @RequestParam("endDate") String endDate, @RequestParam("dateFlag") String dateFlag) {
+        if (Objects.isNull(startDate) || "".equals(startDate)){
             return R.error("请先选择开始时间");
         }
-        if (Objects.isNull(endMonth)  || "".equals(endMonth)){
+        if (Objects.isNull(endDate)  || "".equals(endDate)){
             return R.error("请先选择结束时间");
         }
         List<String> dateList = new ArrayList<>();
         Map<String, Object> returnMap = new HashMap<>();
         try {
-            calculateDifferentMonth(dateList, startMonth, endMonth);
+            calculateDifferentMonth(dateList, startDate, endDate,dateFlag);
         } catch (ParseException e) {
             e.printStackTrace();
         }
@@ -108,7 +121,7 @@ public class MonthlyCustomersController {
             if(!"1".equals(sysUser.getRoleType())){
                 merchSn = sysUser.getMerchSn();
             }
-            Map<String,Object> map = monthlyCustomersService.queryMonthlyCustomers(startMonth,endMonth,merchSn,dateList);
+            Map<String,Object> map = monthlyCustomersService.queryMonthlyCustomers(startDate,endDate,merchSn,dateList,dateFlag);
 
             returnMap.put("dateList", dateList);
             returnMap.putAll(map);
@@ -140,7 +153,7 @@ public class MonthlyCustomersController {
         if(!"1".equals(sysUser.getRoleType())){
             merchSn = sysUser.getMerchSn();
         }
-        List<MonthlySalesGrowthEntity> monthlySalesGrowthEntities = monthlyCustomersDao.queryMonthlyCustomers((String) params.get("startMonth"), (String) params.get("endMonth"), merchSn);
+        List<MonthlySalesGrowthEntity> monthlySalesGrowthEntities = monthlyCustomersDao.queryMonthlyCustomers((String) params.get("startMonth"), (String) params.get("endMonth"), merchSn, "month");
         ExcelExport ee = new ExcelExport("Monthly Sales Growth");
         String[] header = new String[]{"序号","商户编号","商户名称","销售额","销售数量","年-月"};
         List<Map<String, Object>> list = new ArrayList<>();
@@ -172,10 +185,10 @@ public class MonthlyCustomersController {
     @RequestMapping("/monthlySalesGrowthExport2")
     public R monthlySalesGrowthExport2(@RequestParam Map<String, Object> params, HttpServletResponse response, HttpServletRequest request) {
         ParamUtils.setQueryPowerByRoleType(params, "storeId", "merchSn", "thirdPartyMerchCode");
-        if (Objects.isNull(params.get("startMonth")) || "".equals(params.get("startMonth"))){
+        if (Objects.isNull(params.get("startDate")) || "".equals(params.get("endDate"))){
             return R.error("请先选择开始时间");
         }
-        if (Objects.isNull(params.get("endMonth"))  || "".equals(params.get("endMonth"))){
+        if (Objects.isNull(params.get("startDate"))  || "".equals(params.get("endDate"))){
             return R.error("请先选择结束时间");
         }
         String merchSn = null;
@@ -183,7 +196,7 @@ public class MonthlyCustomersController {
         if(!"1".equals(sysUser.getRoleType())){
             merchSn = sysUser.getMerchSn();
         }
-        List<MonthlySalesGrowthEntity> monthlySalesGrowthEntities = monthlyCustomersDao.queryMonthlyCustomers((String) params.get("startMonth"), (String) params.get("endMonth"), merchSn);
+        List<MonthlySalesGrowthEntity> monthlySalesGrowthEntities = monthlyCustomersDao.queryMonthlyCustomers((String) params.get("startDate"), (String) params.get("endDate"), merchSn, (String) params.get("dateFlag"));
         ExcelExport ee = new ExcelExport("Monthly Customers&Avg Basket");
         String[] header = new String[]{"序号","商户编号","商户名称","销售额","销售数量","客户数","客单价","年-月"};
         List<Map<String, Object>> list = new ArrayList<>();
@@ -228,12 +241,12 @@ public class MonthlyCustomersController {
             weekFlag = true;
         }
 
-        if(weekFlag && monthFlag){
-            return R.error("只能选择一个时间!");
+        if(!monthFlag && !weekFlag){
+            return R.error("请选择时间");
         }
 
-        if(!monthFlag && !monthFlag){
-            return R.error("请选择周");
+        if(weekFlag && monthFlag){
+            return R.error("只能选择一个时间!");
         }
 
         String merchSn = null;
@@ -491,7 +504,7 @@ public class MonthlyCustomersController {
         List<String> dateList = new ArrayList<>();
         Map<String, Object> returnMap = new HashMap<>();
         try {
-            calculateDifferentMonth(dateList, startMonth, endMonth);
+            calculateDifferentMonth(dateList, startMonth, endMonth, "month");
         } catch (ParseException e) {
             e.printStackTrace();
         }
@@ -624,7 +637,7 @@ public class MonthlyCustomersController {
         List<String> dateList = new ArrayList<>();
         Map<String, Object> returnMap = new HashMap<>();
         try {
-            calculateDifferentMonth(dateList, startMonth, endMonth);
+            calculateDifferentMonth(dateList, startMonth, endMonth, "month");
         } catch (ParseException e) {
             e.printStackTrace();
         }
@@ -693,7 +706,7 @@ public class MonthlyCustomersController {
         List<String> dateList = new ArrayList<>();
         Map<String, Object> returnMap = new HashMap<>();
         try {
-            calculateDifferentMonth(dateList, startMonth, endMonth);
+            calculateDifferentMonth(dateList, startMonth, endMonth, "month");
         } catch (ParseException e) {
             e.printStackTrace();
         }

+ 2 - 0
kmall-admin/src/main/java/com/kmall/admin/dao/BrandDao.java

@@ -30,4 +30,6 @@ public interface BrandDao extends BaseDao<BrandEntity> {
     BrandEntity queryByCategoryIdAndBrandNameAndMerchSn(@Param("categoryId") Integer categoryId,@Param("name") String name,@Param("merchSn") String merchSn);
 
     List<BrandEntity> queryExportList(Map<String, Object> params);
+
+    BrandEntity queryByUniqueIdentifier(@Param("uniqueIdentifier") String uniqueIdentifier);
 }

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

@@ -12,7 +12,8 @@ import java.util.List;
  */
 public interface MonthlyCustomersDao {
 
-    List<MonthlySalesGrowthEntity> queryMonthlyCustomers(@Param("startMonth") String startMonth, @Param("endMonth") String endMonth, @Param("merchSn") String merchSn);
+    List<MonthlySalesGrowthEntity> queryMonthlyCustomers(@Param("startMonth") String startMonth, @Param("endMonth") String endMonth, @Param("merchSn") String merchSn,
+                                                         @Param("dateFlag") String dateFlag);
 
     List<MonthlySalesGrowthEntity> top10ForProduct(@Param("month") String month, @Param("week") String week, @Param("merchSn") String merchSn);
 

+ 10 - 0
kmall-admin/src/main/java/com/kmall/admin/entity/BrandEntity.java

@@ -19,6 +19,8 @@ public class BrandEntity implements Serializable {
     private Integer id;
     //品牌名称
     private String name;
+    // 品牌唯一标识符
+    private String uniqueIdentifier;
     //图片
     private String listPicUrl;
     //描述
@@ -277,4 +279,12 @@ public class BrandEntity implements Serializable {
     public void setCategoryLevel(String categoryLevel) {
         this.categoryLevel = categoryLevel;
     }
+
+    public String getUniqueIdentifier() {
+        return uniqueIdentifier;
+    }
+
+    public void setUniqueIdentifier(String uniqueIdentifier) {
+        this.uniqueIdentifier = uniqueIdentifier;
+    }
 }

+ 15 - 0
kmall-admin/src/main/java/com/kmall/admin/service/impl/BrandServiceImpl.java

@@ -17,6 +17,7 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.util.*;
+import java.util.regex.Pattern;
 
 /**
  * Service实现类
@@ -55,6 +56,20 @@ public class BrandServiceImpl implements BrandService {
 
     @Override
     public int save(BrandEntity brand) {
+
+        // 品牌唯一标识符正则校验
+        String uniqueIdentifier = brand.getUniqueIdentifier();
+        String regex = "(^[0-9a-zA-Z_&]{1,10}$)";
+        if(!Pattern.matches(regex,uniqueIdentifier)){
+            throw new RuntimeException("请输入正确的品牌唯一简码");
+        }
+
+        // 如果是正确的,根据唯一简码查询该简码是否存在
+        BrandEntity brandEntity = brandDao.queryByUniqueIdentifier(uniqueIdentifier);
+        if(brandEntity != null ){
+            throw new RuntimeException("该唯一简码已存在,请检查唯一简码,唯一简码:"+uniqueIdentifier);
+        }
+
         return brandDao.save(brand);
     }
 

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

@@ -25,15 +25,15 @@ public class RealtimeSalesDetectionServiceImpl implements RealtimeSalesDetection
         RealtimeSalesDetection r = orderDao.queryRealtimeSales(realtimeSalesDetection);
         if(r!=null && r.getGuestNumber()>0){
             //计算优惠损失 销售额-实际销售额
-            r.setPreferentialLoss(r.getTotalSales().subtract(r.getActualSales()));
+//            r.setPreferentialLoss(r.getTotalSales().subtract(r.getActualSales()));
             if(null !=r.getTotalCost() && (new BigDecimal(0)!=r.getTotalCost()) && null !=r.getActualSales()){
                 //计算毛利 实际销售额-总成本
                 r.setGrossProfit(r.getActualSales().subtract(r.getTotalCost()));
                 //计算毛利率 总成本/实际销售额
-                r.setGrossProfitRatio(r.getTotalCost().divide(r.getActualSales(), 2, BigDecimal.ROUND_HALF_UP));
+                r.setGrossProfitRatio(r.getGrossProfit().divide(r.getActualSales(), 2, BigDecimal.ROUND_HALF_UP));
             }
             //计算客单价
-            r.setGuestUnitPrice(r.getActualSales().divide(new BigDecimal(r.getGuestNumber()),2));
+            r.setGuestUnitPrice(r.getActualSales().divide(new BigDecimal(r.getGuestNumber()),2).setScale(2,BigDecimal.ROUND_HALF_UP));
 
             //时区-13小时
             Date lastSalesTime = r.getLastSalesTime();

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

@@ -28,8 +28,8 @@ public class MonthlyCustomersServiceImpl implements MonthlyCustomersService {
     private WechatFollowersDao wechatFollowersDao;
 
     @Override
-    public Map<String, Object> queryMonthlyCustomers(String startMonth, String endMonth, String merchSn, List<String> dateList) {
-        List<MonthlySalesGrowthEntity> monthlySalesGrowthEntities = monthlyCustomersDao.queryMonthlyCustomers(startMonth, endMonth, merchSn);
+    public Map<String, Object> queryMonthlyCustomers(String startMonth, String endMonth, String merchSn, List<String> dateList, String dateFlag) {
+        List<MonthlySalesGrowthEntity> monthlySalesGrowthEntities = monthlyCustomersDao.queryMonthlyCustomers(startMonth, endMonth, merchSn,dateFlag);
 
         Map<String, Object> map = new HashMap<>();
         // 查询销售件数

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

@@ -13,7 +13,7 @@ import java.util.Map;
  */
 public interface MonthlyCustomersService {
 
-    Map<String, Object> queryMonthlyCustomers(String startMonth, String endMonth, String merchSn,List<String> dateList);
+    Map<String, Object> queryMonthlyCustomers(String startMonth, String endMonth, String merchSn, List<String> dateList, String dateFlag);
 
     Map<String, Object> top10ForProduct(String month, String week, String merchSn);
 

+ 5 - 6
kmall-admin/src/main/resources/XmlTemplate/BrandDtoList.xml

@@ -6,12 +6,11 @@
               varType="com.kmall.admin.entity.BrandEntity">
             <section startRow="1" endRow="1">
                 <mapping row="1" col="0">BrandEntity.id</mapping>
-                <mapping row="1" col="1">BrandEntity.merchSn</mapping>
-                <mapping row="1" col="2">BrandEntity.categoryId</mapping>
-                <mapping row="1" col="3">BrandEntity.name</mapping>
-                <mapping row="1" col="4">BrandEntity.simpleDesc</mapping>
-                <mapping row="1" col="5">BrandEntity.isShow</mapping>
-                <mapping row="1" col="6">BrandEntity.isNew</mapping>
+                <mapping row="1" col="1">BrandEntity.name</mapping>
+                <mapping row="1" col="2">BrandEntity.uniqueIdentifier</mapping>
+                <mapping row="1" col="3">BrandEntity.simpleDesc</mapping>
+                <mapping row="1" col="4">BrandEntity.isShow</mapping>
+                <mapping row="1" col="5">BrandEntity.isNew</mapping>
             </section>
             <loopbreakcondition>
                 <rowcheck offset="0">

+ 33 - 0
kmall-admin/src/main/resources/mybatis/mapper/BrandDao.xml

@@ -6,6 +6,7 @@
     <resultMap type="com.kmall.admin.entity.BrandEntity" id="brandMap">
         <result property="id" column="id"/>
         <result property="name" column="name"/>
+        <result property="uniqueIdentifier" column="unique_identifier"/>
         <result property="storeId" column="store_id"/>
         <result property="merchSn" column="merch_sn"/>
         <result property="listPicUrl" column="list_pic_url"/>
@@ -29,6 +30,7 @@
 		select
 			`id`,
 			`name`,
+			`unique_identifier`,
 			`store_id`,
 			`merch_sn`,
 			`list_pic_url`,
@@ -51,6 +53,7 @@
         select
         b.`id`,
         b.`name`,
+        b.`unique_identifier`,
         b.`store_id`,
 		b.`merch_sn`,
         b.`list_pic_url`,
@@ -81,6 +84,7 @@
         select
         `id`,
         `name`,
+        `unique_identifier`,
         `store_id`,
         `merch_sn`,
         `list_pic_url`,
@@ -115,6 +119,7 @@
         select
         b.id,
         b.name,
+        b.unique_identifier,
         b.store_id,
         b.merch_sn,
         `list_pic_url`,
@@ -186,6 +191,7 @@
     <insert id="save" parameterType="com.kmall.admin.entity.BrandEntity" useGeneratedKeys="true" keyProperty="id">
 		insert into mall_brand(
 			`name`,
+			`unique_identifier`,
 			`store_id`,
 			`merch_sn`,
 			`list_pic_url`,
@@ -203,6 +209,7 @@
             )
 		values(
 			#{name},
+			#{uniqueIdentifier},
 			#{storeId},
 			#{merchSn},
 			#{listPicUrl},
@@ -224,6 +231,7 @@
         update mall_brand
         <set>
             <if test="name != null">`name` = #{name},</if>
+            <if test="uniqueIdentifier != null">`unique_identifier` = #{uniqueIdentifier},</if>
             <if test="storeId != null">`store_id` = #{storeId}, </if>
             <if test="merchSn != null">`merch_sn` = #{merchSn}, </if>
             <if test="listPicUrl != null">`list_pic_url` = #{listPicUrl},</if>
@@ -281,6 +289,7 @@
         select
         b.id,
         b.name,
+        b.unique_identifier,
         b.store_id,
         b.merch_sn,
         `list_pic_url`,
@@ -308,4 +317,28 @@
 
     </select>
 
+
+    <select id="queryByUniqueIdentifier" resultType="com.kmall.admin.entity.BrandEntity">
+        select
+			`id`,
+			`name`,
+			`unique_identifier`,
+			`store_id`,
+			`merch_sn`,
+			`list_pic_url`,
+			`simple_desc`,
+			`pic_url`,
+			`sort_order`,
+			`is_show`,
+			`floor_price`,
+			`app_list_pic_url`,
+			`is_new`,
+			`new_pic_url`,
+			`new_sort_order`,
+			category_id,
+			category_level
+		from mall_brand
+		where unique_identifier = #{uniqueIdentifier}
+    </select>
+
 </mapper>

+ 2 - 1
kmall-admin/src/main/resources/mybatis/mapper/OrderDao.xml

@@ -1658,9 +1658,10 @@
             count( distinct o.order_sn ) AS guestNumber,
             sum( og.actual_payment_amount) + sum(og.discounted_price)AS totalSales,
             sum( og.actual_payment_amount) - sum(og.tax_price) + sum(og.discounted_price) AS actualSales,
+            sum(sr.retail_price * og.number - og.actual_payment_amount) as preferentialLoss,
             s.store_name AS storeName,
             max( o.add_time ) AS lastSalesTime ,
-            sum( g.cost_price) AS totalCost
+            sum( sr.bottom_line_price) AS totalCost
         FROM
             mall_order o
             LEFT JOIN mall_store s ON o.store_id = s.id

+ 21 - 5
kmall-admin/src/main/resources/mybatis/mapper/statistics/MonthlyCustomersDao.xml

@@ -10,7 +10,12 @@
 		sum(  og.actual_payment_amount ) + sum(og.discounted_price)AS totalSales,
 		sum( og.number) as totalNumber,
 		count(DISTINCT o.pay_mobile) as totalCustomers,
-		DATE_FORMAT(o.pay_time,'%Y-%m') as yearAndMonth
+		<if test='dateFlag == "month"'>
+			DATE_FORMAT(o.pay_time,'%Y-%m') as yearAndMonth
+		</if>
+		<if test='dateFlag == "day"'>
+			DATE_FORMAT(o.pay_time,'%Y-%m-%d') as yearAndMonth
+		</if>
 		FROM
 		mall_order o
 		LEFT JOIN mall_merch m ON o.merch_sn = m.merch_sn
@@ -20,13 +25,24 @@
 			AND o.order_biz_type = '10'
 			AND o.pay_status = '2'
 			and o.order_status = '300'
-			AND DATE_FORMAT(o.pay_time,'%Y-%m')  &gt;= #{startMonth}
-			AND DATE_FORMAT(o.pay_time,'%Y-%m') &lt;= #{endMonth}
+			<if test='dateFlag == "month"'>
+				AND DATE_FORMAT(o.pay_time,'%Y-%m')  &gt;= #{startMonth}
+				AND DATE_FORMAT(o.pay_time,'%Y-%m') &lt;= #{endMonth}
+			</if>
+			<if test='dateFlag == "day"'>
+				AND DATE_FORMAT(o.pay_time,'%Y-%m-%d')  &gt;= #{startMonth}
+				AND DATE_FORMAT(o.pay_time,'%Y-%m-%d') &lt;= #{endMonth}
+			</if>
 			<if test="merchSn != null">
 				and m.merch_sn = #{merchSn}
 			</if>
 		</where>
-		group by DATE_FORMAT(o.pay_time,'%Y-%m')
+		<if test='dateFlag == "month"'>
+			group by DATE_FORMAT(o.pay_time,'%Y-%m')
+		</if>
+		<if test='dateFlag == "day"'>
+			group by DATE_FORMAT(o.pay_time,'%Y-%m-%d')
+		</if>
 
 	</select>
 	<select id="queryWeeklyCustomers" resultType="com.kmall.admin.entity.MonthlySalesGrowthEntity">
@@ -82,7 +98,7 @@
 			og.sku
 		ORDER BY
 			sales desc
-			LIMIT 10
+			LIMIT 50
 	</select>
 
 	<select id="top10ByBrand" resultType="com.kmall.admin.entity.MonthlySalesGrowthEntity" >

+ 5 - 1
kmall-admin/src/main/webapp/WEB-INF/page/sale/monthlyCustomers.html

@@ -37,9 +37,13 @@
     <header class="main-header">
         <div class="container-fluid  coldiv">
             <div class="row" style="border:0;margin-bottom:10px">
-            <span>日期:</span>
+            <input type="radio" name="date" value="month" checked="checked">日期-月:
             <input type="month" name="startMonth" id="startMonth"/>&nbsp;
             <input type="month" name="endMonth" id="endMonth" />&nbsp;
+            <input type="radio" name="date" value="day" >日期-日:
+            <input type="date" name="startDay" id="startDay"/>&nbsp;
+            <input type="date" name="endDay" id="endDay" />&nbsp;
+
                 <input type="button" name="queryButton" value="查询" onclick="queryMonthly()" />
                 <input type="button" name="exportButton" value="导出" onclick="exportMonthly()" />
             </div>

+ 3 - 2
kmall-admin/src/main/webapp/WEB-INF/page/sale/top10ForProduct.html

@@ -40,13 +40,14 @@
             <span>日期:</span>
             <input type="month" name="month" id="month"/>&nbsp;
             <input type="week" name="week" id="week" />&nbsp;
-                <input type="button" name="queryButton" value="查询" onclick="queryMonthly()" />
+            <input type="button" name="queryButton" value="查询" onclick="queryMonthly()" />
+            <input type="button" name="queryButton" value="重置" onclick="clearDate()" />
             </div>
         </div>
     </header>
     <div class="row">
         <div class="col-md-12  col-sm-12  col-xs-12 charts6">
-            <div id="main3" style="height: 500px;"></div>
+            <div id="main3" style="height: 1800px;"></div>
         </div>
     </div>
     <script src="${rc.contextPath}/js/sale/echarts.js"></script>

+ 5 - 2
kmall-admin/src/main/webapp/WEB-INF/page/shop/brand.html

@@ -51,7 +51,7 @@
     <Card v-show="!showList">
         <p slot="title">{{title}}</p>
         <i-form ref="formValidate" :model="brand" :rules="ruleValidate" :label-width="100">
-            <Form-item label="商户" prop="merchSn">
+            <!--<Form-item label="商户" prop="merchSn">
                 <i-select v-model="brand.merchSn" filterable placeholder="商户" @on-change="getCategorysByMerch" label-in-value>
                     <i-option v-for="merch in merchList" :value="merch.merchSn" :key="merch.merchSn">{{merch.merchName}}</i-option>
                 </i-select>
@@ -61,11 +61,14 @@
                 <div style="overflow-y: auto; max-height: 250px; border: 1px solid #cccccc;">
                     <ul id="categoryTree" class="ztree"></ul>
                 </div>
-            </Form-item>
+            </Form-item>-->
 
             <Form-item label="品牌名称" prop="name">
                 <i-input v-model="brand.name" placeholder="品牌名称"/>
             </Form-item>
+            <Form-item label="品牌唯一简码" prop="uniqueIdentifier">
+                <i-input v-model="brand.uniqueIdentifier" placeholder="品牌唯一简码,限制只能为字母数字下划线"/>
+            </Form-item>
             <Row>
                 <i-col span="16">
                     <Form-item label="图片" prop="listPicUrl">

+ 71 - 27
kmall-admin/src/main/webapp/js/sale/monthlyCustomers.js

@@ -152,7 +152,7 @@ function dFun(dateList, totalNumberList, totalSalesList,taotalCustomersList,avgB
         },
             {
             //折线
-            name: 'Average Basket Sale',
+            name: 'sales/customers',
             type: 'line',
             symbol: 'circle', // 折线点设置为实心点
             symbolSize: 6, // 折线点的大小
@@ -173,17 +173,43 @@ function dFun(dateList, totalNumberList, totalSalesList,taotalCustomersList,avgB
 }
 
 function queryMonthly(){
-    var startMonth = document.getElementById("startMonth").value;
-    var endMonth = document.getElementById("endMonth").value;
-    var startMonthDate = new Date(startMonth);
-    var endMonthDate = new Date(endMonth);
-    if(startMonthDate.getTime() > endMonthDate.getTime()){
-        alert("开始时间不能大于结束时间");
-        return;
+
+    var date = $('input[name="date"]:checked').val();
+
+    var startDate = "";
+    var endDate = "";
+    var dateFlag = "";
+
+    if(date == "month"){
+        var startMonth = document.getElementById("startMonth").value;
+        var endMonth = document.getElementById("endMonth").value;
+        var startMonthDate = new Date(startMonth);
+        var endMonthDate = new Date(endMonth);
+        if(startMonthDate.getTime() > endMonthDate.getTime()){
+            alert("开始时间不能大于结束时间");
+            return;
+        }
+        startDate = startMonth;
+        endDate = endMonth;
+        dateFlag = "month";
+    }else if (date == "day"){
+        var startDay = document.getElementById("startDay").value;
+        var endDay = document.getElementById("endDay").value;
+        var startDayDate = new Date(startDay);
+        var endDayDate = new Date(endDay);
+        if(startDayDate.getTime() > endDayDate.getTime()){
+            alert("开始时间不能大于结束时间");
+            return;
+        }
+        startDate = startDay;
+        endDate = endDay;
+        dateFlag = "day";
     }
+
     var param = {
-        startMonth:startMonth,
-        endMonth:endMonth
+        startDate:startDate,
+        endDate:endDate,
+        dateFlag:dateFlag
     };
     console.log(param);
     // 折线图
@@ -206,26 +232,44 @@ function queryMonthly(){
 }
 
 function exportMonthly(){
-    var startMonth = document.getElementById("startMonth").value;
-    var endMonth = document.getElementById("endMonth").value;
-    var startMonthDate = new Date(startMonth);
-    var endMonthDate = new Date(endMonth);
-    if(startMonthDate.getTime() > endMonthDate.getTime()){
-        alert("开始时间不能大于结束时间");
-        return;
+    var date = $('input[name="date"]:checked').val();
+
+    var startDate = "";
+    var endDate = "";
+    var dateFlag = "";
+
+    if(date == "month"){
+        var startMonth = document.getElementById("startMonth").value;
+        var endMonth = document.getElementById("endMonth").value;
+        var startMonthDate = new Date(startMonth);
+        var endMonthDate = new Date(endMonth);
+        if(startMonthDate.getTime() > endMonthDate.getTime()){
+            alert("开始时间不能大于结束时间");
+            return;
+        }
+        startDate = startMonth;
+        endDate = endMonth;
+        dateFlag = "month";
+    }else if (date == "day"){
+        var startDay = document.getElementById("startDay").value;
+        var endDay = document.getElementById("endDay").value;
+        var startDayDate = new Date(startDay);
+        var endDayDate = new Date(endDay);
+        if(startDayDate.getTime() > endDayDate.getTime()){
+            alert("开始时间不能大于结束时间");
+            return;
+        }
+        startDate = startDay;
+        endDate = endDay;
+        dateFlag = "day";
     }
+
     var params = {
-        startMonth:startMonth,
-        endMonth:endMonth
+        startDate:startDate,
+        endDate:endDate,
+        dateFlag:dateFlag
     };
-    if (startMonth==null || startMonth==undefined || startMonth==''){
-        alert("请输入开始时间");
-        return;
-    }
-    if (endMonth==null || endMonth==undefined || endMonth==''){
-        alert("请输入开始时间");
-        return;
-    }
+
     console.log(params);
     exportFile('#rrapp', '../monthly/monthlySalesGrowthExport2', params);
 

+ 0 - 1
kmall-admin/src/main/webapp/js/sale/realtimeSalesDetection.js

@@ -29,7 +29,6 @@ $(function () {
             {label: '商户名称', name: 'merchName', index: 'storeName', width: 120},
             {label: '销售总额', name: 'totalSales', index: 'totalSales', align: 'right', width: 80},
             {label: '实际销售额(税前)', name: 'actualSales', index: 'actualSales', align: 'right', width: 80},
-            // {label: '占比 %', name: 'proportion', index: 'proportion', align: 'right', width: 60},
             {label: '优惠损失', name: 'preferentialLoss', index: 'preferentialLoss', align: 'right', width: 80},
             {label: '成本总额', name: 'totalCost', index: 'totalCost', align: 'right', width: 80},
             {label: '毛利', name: 'grossProfit', index: 'grossProfit', align: 'right', width: 80},

+ 5 - 2
kmall-admin/src/main/webapp/js/sale/sale.js

@@ -796,8 +796,11 @@ let vm = new Vue({
 
         },
         clearGoodsList:function(){
-            this.goodsList = [];
-            vm.customClearData();
+            confirm('确认清空吗?', function () {
+                vm.goodsList = [];
+                vm.customClearData();
+                alert("清空成功");
+            })
 
         },
         pendingOrder:function(){

+ 34 - 12
kmall-admin/src/main/webapp/js/sale/top10ForProduct.js

@@ -6,6 +6,7 @@ var myChart;
 // 基于准备好的dom,初始化echarts实例
 var dChart = echarts.init(document.getElementById('main3'));
 // 指定图表的配置项和数据
+
 function dFun(productNameList,salesList) {
     dChart.setOption({
         title: {
@@ -26,21 +27,39 @@ function dFun(productNameList,salesList) {
             bottom: '3%',
             containLabel: true
         },
+        dataZoom: [                   //Y轴滑动条
+            {
+                type: 'slider', //滑动条
+                show: true,      //开启
+                yAxisIndex: [0],
+                left: '93%',  //滑动条位置
+                start: 1,    //初始化时,滑动条宽度开始标度
+                end: 50      //初始化时,滑动条宽度结束标度<br>
+            },
+            {
+                type: 'inside',  //内置滑动,随鼠标滚轮展示
+                yAxisIndex: [0],
+                start: 1,//初始化时,滑动条宽度开始标度<br>
+                end: 50  //初始化时,滑动条宽度结束标度
+            }
+        ],
         xAxis: {
             type: 'value',
             name: '数量',
         },
         yAxis: {
             type: 'category',
-            data: productNameList
+            data: productNameList,
+
         },
+
         series: [
             {
-                name: '2011年',
+                name: productNameList,
                 type: 'bar',
                 data: salesList,
-                label:seriesLabel,
-                barWidth:30,
+                // label:seriesLabel,
+                barWidth:20,
             }]
 
     });
@@ -49,19 +68,22 @@ var seriesLabel = {
     normal: {
         show: true,
         textBorderColor: '#333',
-        textBorderWidth: 2
+        textBorderWidth: 1
     }
 }
-
+function clearDate(){
+    $("#month").val("");
+    $("#week").val("");
+}
 function queryMonthly(){
     var month = document.getElementById("month").value;
     var week = document.getElementById("week").value;
-    var startMonthDate = new Date(month);
-    var endWeekDate = new Date(week);
-    if(startMonthDate.getTime() > endWeekDate.getTime()){
-        alert("开始时间不能大于结束时间");
-        return;
-    }
+    // var startMonthDate = new Date(month);
+    // var endWeekDate = new Date(week);
+    // if(startMonthDate.getTime() > endWeekDate.getTime()){
+    //     alert("开始时间不能大于结束时间");
+    //     return;
+    // }
     var param = {
         month:month,
         week:week

+ 118 - 77
kmall-admin/src/main/webapp/js/shop/brand.js

@@ -3,56 +3,85 @@ $(function () {
         url: '../brand/list',
         datatype: "json",
         colModel: [{
-            label: 'id', name: 'id', index: 'id', key: true, width: 140,align: 'center'
+            label: 'id', name: 'id', index: 'id', key: true, width: 140, align: 'center'
         },
-            {label: '所属商户', name: 'merchName', index: 'merchName', width: 180, align: 'center'},
+            // {label: '所属商户', name: 'merchName', index: 'merchName', width: 180, align: 'center'},
             // {label: '所属门店', name: 'storeName', index: 'storeName', width: 180, align: 'center'},
-            {label: '所属分类', name: 'categoryName', index: 'categoryName', width: 180, align: 'center'},
+            // {label: '所属分类', name: 'categoryName', index: 'categoryName', width: 180, align: 'center'},
             {
-            label: '品牌名称', name: 'name', index: 'name', width: 300
-        }, {
-            label: '图片', name: 'listPicUrl', index: 'list_pic_url', width: 100, align: 'center', formatter: function (value) {
-                return transImg(value);
-            }
-        }, {
-            label: '描述', name: 'simpleDesc', index: 'simple_desc', width: 100
-        }, {
-            label: '图片', name: 'picUrl', index: 'pic_url', width: 100, align: 'center', formatter: function (value) {
-                return transImg(value);
-            }
-        }, {
-            label: '排序', name: 'sortOrder', index: 'sort_order', width: 100, align: 'center'
-        }, {
-            label: '显示', name: 'isShow', index: 'is_show', width: 100, align: 'center', formatter: function (value) {
-                return transIsNot(value)
-            }
-        }, {
-            label: '展示价格', name: 'floorPrice', index: 'floor_Price', width: 100, align: 'right'
-        }, {
-            label: 'app显示图片', name: 'appListPicUrl', index: 'app_list_pic_url', align: 'center', width: 100, formatter: function (value) {
-                return transImg(value);
-            }
-        }, {
-            label: '新品牌', name: 'isNew', index: 'is_new', align: 'center', width: 100, formatter: function (value) {
-                return transIsNot(value)
-            }
-        }, {
-            label: '新品牌图片', name: 'newPicUrl', index: 'new_pic_url', align: 'center', width: 100, formatter: function (value) {
-                return transImg(value);
-            }
-        }, {
-            label: '新品牌排序', name: 'newSortOrder', index: 'new_sort_order', align: 'center', width: 80
-        },
-            {label: '操作', width: 150, align: 'center', sortable: false,
-                formatter: function (value, col, row) {
-                    if(hasPermission('brand:saveCopyBrand')) {
-                        return "&nbsp;&nbsp;&nbsp;&nbsp;<button class='btn btn-primary' " +
-                            "onclick='vm.copyBrand(" + row.id + ")'>复制品牌</button>";
-                    }else {
-                        return '-'
-                    }
+                label: '品牌名称', name: 'name', index: 'name', width: 300
+            },{
+                label: '品牌唯一简码', name: 'uniqueIdentifier', index: 'name', width: 100
+            }, {
+                label: '图片',
+                name: 'listPicUrl',
+                index: 'list_pic_url',
+                width: 100,
+                align: 'center',
+                formatter: function (value) {
+                    return transImg(value);
+                }
+            }, {
+                label: '描述', name: 'simpleDesc', index: 'simple_desc', width: 250
+            }, {
+                label: '图片',
+                name: 'picUrl',
+                index: 'pic_url',
+                width: 100,
+                align: 'center',
+                formatter: function (value) {
+                    return transImg(value);
+                }
+            }, {
+                label: '排序', name: 'sortOrder', index: 'sort_order', width: 100, align: 'center'
+            }, {
+                label: '显示',
+                name: 'isShow',
+                index: 'is_show',
+                width: 100,
+                align: 'center',
+                formatter: function (value) {
+                    return transIsNot(value)
+                }
+            }, {
+                label: '展示价格', name: 'floorPrice', index: 'floor_Price', width: 100, align: 'right'
+            }, {
+                label: 'app显示图片',
+                name: 'appListPicUrl',
+                index: 'app_list_pic_url',
+                align: 'center',
+                width: 100,
+                formatter: function (value) {
+                    return transImg(value);
+                }
+            }, {
+                label: '新品牌', name: 'isNew', index: 'is_new', align: 'center', width: 100, formatter: function (value) {
+                    return transIsNot(value)
                 }
-            }],
+            }, {
+                label: '新品牌图片',
+                name: 'newPicUrl',
+                index: 'new_pic_url',
+                align: 'center',
+                width: 100,
+                formatter: function (value) {
+                    return transImg(value);
+                }
+            }, {
+                label: '新品牌排序', name: 'newSortOrder', index: 'new_sort_order', align: 'center', width: 80
+            }
+            // ,
+            //     {label: '操作', width: 150, align: 'center', sortable: false,
+            //         formatter: function (value, col, row) {
+            //             if(hasPermission('brand:saveCopyBrand')) {
+            //                 return "&nbsp;&nbsp;&nbsp;&nbsp;<button class='btn btn-primary' " +
+            //                     "onclick='vm.copyBrand(" + row.id + ")'>复制品牌</button>";
+            //             }else {
+            //                 return '-'
+            //             }
+            //         }
+            //     }
+        ],
         viewrecords: true,
         height: 550,
         rowNum: 10,
@@ -101,9 +130,9 @@ var category_setting = {
         enable: false,
         nocheckInherit: true
     },
-    callback:{
-        onClick:function(event, treeId, treeNode){
-            console.log("点我干啥:"+event+","+treeId+","+treeNode.name+","+treeNode.id);
+    callback: {
+        onClick: function (event, treeId, treeNode) {
+            console.log("点我干啥:" + event + "," + treeId + "," + treeNode.name + "," + treeNode.id);
             vm.brand.categoryId = treeNode.id;
         }
     }
@@ -119,27 +148,30 @@ var vm = new Vue({
             name: [
                 {required: true, message: '品牌名称不能为空', trigger: 'blur'}
             ],
-            listPicUrl: [
-                {required: true, message: '品牌图片不能为空', trigger: 'blur'}
+            uniqueIdentifier: [
+                {required: true, message: '品牌唯一简码不能为空', trigger: 'blur'}
             ],
+            // listPicUrl: [
+            //     {required: true, message: '品牌图片不能为空', trigger: 'blur'}
+            // ],
             simpleDesc: [
                 {required: true, message: '品牌描述不能为空', trigger: 'blur'}
             ],
-            picUrl: [
-                {required: true, message: '品牌图片不能为空', trigger: 'blur'}
-            ],
+            // picUrl: [
+            //     {required: true, message: '品牌图片不能为空', trigger: 'blur'}
+            // ],
             // sortOrder: [
             //     {required: true, message: '排序不能为空', trigger: 'blur'}
             // ],
             // floorPrice: [
             //     {required: true, message: '展示价格不能为空', trigger: 'blur'}
             // ],
-            appListPicUrl: [
-                {required: true, message: 'app显示图片不能为空', trigger: 'blur'}
-            ],
-            newPicUrl: [
-                {required: true, message: '新品牌图片不能为空', trigger: 'blur'}
-            ]
+            // appListPicUrl: [
+            //     {required: true, message: 'app显示图片不能为空', trigger: 'blur'}
+            // ],
+            // newPicUrl: [
+            //     {required: true, message: '新品牌图片不能为空', trigger: 'blur'}
+            // ]
         },
         q: {
             name: '',
@@ -148,13 +180,13 @@ var vm = new Vue({
         storeList: [],
         merchList: [],
         categories: [],//一级分类
-        copyBrandDto: {brandId: '', storeList:"", categoryList:""},
+        copyBrandDto: {brandId: '', storeList: "", categoryList: ""},
         showCopyList: true,
         showViewList: false,
         stores: [],
     },
     methods: {
-        copyBrand: function(id){
+        copyBrand: function (id) {
             vm.copyBrandDto.brandId = id;
             vm.copyBrandDto.storeList = "";
             vm.copyBrandDto.categoryList = "";
@@ -164,15 +196,15 @@ var vm = new Vue({
             vm.title = "复制品牌";
         },
         handleSubmitCopyBrand: function () {
-            if(vm.copyBrandDto.brandId == ""){
+            if (vm.copyBrandDto.brandId == "") {
                 alert('品牌id不能为空');
                 return;
             }
-            if(vm.copyBrandDto.storeList == ""){
+            if (vm.copyBrandDto.storeList == "") {
                 alert('门店id批量上传数据没有上传或未上传成功');
                 return;
             }
-            if(vm.copyBrandDto.categoryList == ""){
+            if (vm.copyBrandDto.categoryList == "") {
                 alert('分类id批量上传数据没有上传或未上传成功');
                 return;
             }
@@ -197,12 +229,12 @@ var vm = new Vue({
             });
         },
         uploadExcelSuccess: function (data) {
-            if(data.code==0){
+            if (data.code == 0) {
                 alert(data.msg, function (index) {
                     vm.copyBrandDto.storeList = data.copyBrandDto.storeList;
                     vm.copyBrandDto.categoryList = data.copyBrandDto.categoryList;
                 });
-            }else{
+            } else {
                 alert(data.msg);
             }
         },
@@ -247,6 +279,15 @@ var vm = new Vue({
             // vm.getStoresByMerch();
         },
         saveOrUpdate: function (event) {
+
+            // 校验品牌唯一简码
+            var uniqueIdentifier = vm.brand.uniqueIdentifier;
+            var uniqueReg = /^[0-9a-zA-Z_]{1,10}$/;
+            if(!uniqueReg.test(uniqueIdentifier)){
+                alert("请输入正确的唯一简码");
+            }
+
+
             var url = vm.brand.id == null ? "../brand/save" : "../brand/update";
             $.ajax({
                 type: "POST",
@@ -311,7 +352,7 @@ var vm = new Vue({
 
         },
 
-        getMerchList: function() {
+        getMerchList: function () {
             $.get("../merch/queryAll", function (r) {
                 vm.merchList = r.list;
             });
@@ -323,13 +364,13 @@ var vm = new Vue({
             vm.showCopyList = true;
             var page = $("#jqGrid").jqGrid('getGridParam', 'page');
             $("#jqGrid").jqGrid('setGridParam', {
-                postData: {'name': vm.q.name,'storeId':vm.q.storeId},
+                postData: {'name': vm.q.name, 'storeId': vm.q.storeId},
                 page: page
             }).trigger("reloadGrid");
             vm.handleReset('formValidate');
         },
         handleSuccessListPicUrl: function (res, file) {
-            if (res.code=="500" && res.msg=="没有权限,请联系管理员授权"){
+            if (res.code == "500" && res.msg == "没有权限,请联系管理员授权") {
                 this.$Notice.warning({
                     title: res.msg,
                     desc: "无上传文件的权限,请联系管理员授权"
@@ -338,7 +379,7 @@ var vm = new Vue({
             vm.brand.listPicUrl = file.response.url;
         },
         handleSuccessPicUrl: function (res, file) {
-            if (res.code=="500" && res.msg=="没有权限,请联系管理员授权"){
+            if (res.code == "500" && res.msg == "没有权限,请联系管理员授权") {
                 this.$Notice.warning({
                     title: res.msg,
                     desc: "无上传文件的权限,请联系管理员授权"
@@ -347,7 +388,7 @@ var vm = new Vue({
             vm.brand.picUrl = file.response.url;
         },
         handleSuccessAppListPicUrl: function (res, file) {
-            if (res.code=="500" && res.msg=="没有权限,请联系管理员授权"){
+            if (res.code == "500" && res.msg == "没有权限,请联系管理员授权") {
                 this.$Notice.warning({
                     title: res.msg,
                     desc: "无上传文件的权限,请联系管理员授权"
@@ -356,7 +397,7 @@ var vm = new Vue({
             vm.brand.appListPicUrl = file.response.url;
         },
         handleSuccessNewPicUrl: function (res, file) {
-            if (res.code=="500" && res.msg=="没有权限,请联系管理员授权"){
+            if (res.code == "500" && res.msg == "没有权限,请联系管理员授权") {
                 this.$Notice.warning({
                     title: res.msg,
                     desc: "无上传文件的权限,请联系管理员授权"
@@ -400,7 +441,7 @@ var vm = new Vue({
         handleReset: function (name) {
             handleResetForm(this, name);
         },
-        exportBrand :function () {
+        exportBrand: function () {
             const msg = this.$Message.loading({
                 content: 'Loading...',
                 duration: 0
@@ -412,11 +453,11 @@ var vm = new Vue({
         },
         uploadExcelSuccess: function (data) {
             // console.log(data);
-            if(data.code==0){
+            if (data.code == 0) {
                 alert('导入成功', function (index) {
                     $("#jqGrid").trigger("reloadGrid");
                 });
-            }else{
+            } else {
                 alert(data.msg);
             }
             setTimeout(exportMsg, 100);
@@ -425,7 +466,7 @@ var vm = new Vue({
             alert('上传出现异常,请重试!');
             setTimeout(exportMsg, 100);
         },
-        uploadExcelProgress:function(event, file, fileList){
+        uploadExcelProgress: function (event, file, fileList) {
             console.log("上传中")
             console.log(event)
             console.log(file)

BIN
kmall-admin/src/main/webapp/statics/file/brand_export_yyyy_mm_dd_v1.0.0.xls