1
0
Переглянути джерело

新增admin模块、api模块库存记录功能

hyq 6 роки тому
батько
коміт
2dd5f120b5
46 змінених файлів з 4672 додано та 479 видалено
  1. 2 2
      kmall-admin/src/main/java/com/kmall/admin/controller/GoodsController.java
  2. 106 0
      kmall-admin/src/main/java/com/kmall/admin/controller/MngChangeController.java
  3. 5 3
      kmall-admin/src/main/java/com/kmall/admin/controller/ProductStoreRelaController.java
  4. 10 0
      kmall-admin/src/main/java/com/kmall/admin/controller/StoreController.java
  5. 106 0
      kmall-admin/src/main/java/com/kmall/admin/controller/StoreMngChangeController.java
  6. 10 0
      kmall-admin/src/main/java/com/kmall/admin/controller/ThirdMerchantBizController.java
  7. 17 0
      kmall-admin/src/main/java/com/kmall/admin/dao/MngChangeDao.java
  8. 17 0
      kmall-admin/src/main/java/com/kmall/admin/dao/StoreMngChangeDao.java
  9. 303 0
      kmall-admin/src/main/java/com/kmall/admin/entity/MngChangeEntity.java
  10. 169 0
      kmall-admin/src/main/java/com/kmall/admin/entity/ScheduleJobEntity.java
  11. 133 0
      kmall-admin/src/main/java/com/kmall/admin/entity/ScheduleJobLogEntity.java
  12. 304 0
      kmall-admin/src/main/java/com/kmall/admin/entity/StoreMngChangeEntity.java
  13. 72 0
      kmall-admin/src/main/java/com/kmall/admin/service/MngChangeService.java
  14. 72 0
      kmall-admin/src/main/java/com/kmall/admin/service/StoreMngChangeService.java
  15. 45 0
      kmall-admin/src/main/java/com/kmall/admin/service/impl/GoodsServiceImpl.java
  16. 58 0
      kmall-admin/src/main/java/com/kmall/admin/service/impl/MngChangeServiceImpl.java
  17. 58 6
      kmall-admin/src/main/java/com/kmall/admin/service/impl/OrderServiceImpl.java
  18. 45 0
      kmall-admin/src/main/java/com/kmall/admin/service/impl/ProductStoreRelaServiceImpl.java
  19. 58 0
      kmall-admin/src/main/java/com/kmall/admin/service/impl/StoreMngChangeServiceImpl.java
  20. 54 54
      kmall-admin/src/main/resources/logback.xml
  21. 184 0
      kmall-admin/src/main/resources/mybatis/mapper/MngChangeDao.xml
  22. 184 0
      kmall-admin/src/main/resources/mybatis/mapper/StoreMngChangeDao.xml
  23. 2 2
      kmall-admin/src/main/resources/mybatis/mapper/ThirdMerchantBizDao.xml
  24. 99 0
      kmall-admin/src/main/webapp/WEB-INF/page/shop/mngchange.html
  25. 99 0
      kmall-admin/src/main/webapp/WEB-INF/page/shop/storemngchange.html
  26. 198 0
      kmall-admin/src/main/webapp/js/shop/mngchange.js
  27. 197 0
      kmall-admin/src/main/webapp/js/shop/storemngchange.js
  28. 9 9
      kmall-admin/src/main/webapp/js/shop/thirdmerchantbiz.js
  29. 2 2
      kmall-api/src/main/java/com/kmall/api/api/ApiOrderController.java
  30. 10 6
      kmall-api/src/main/java/com/kmall/api/dao/ApiMngChangeMapper.java
  31. 9 5
      kmall-api/src/main/java/com/kmall/api/dao/ApiStoreMngChangeMapper.java
  32. 273 0
      kmall-api/src/main/java/com/kmall/api/entity/MngChangeVo.java
  33. 273 0
      kmall-api/src/main/java/com/kmall/api/entity/StoreMngChangeVo.java
  34. 99 7
      kmall-api/src/main/java/com/kmall/api/service/ApiOrderService.java
  35. 2 1
      kmall-api/src/main/resources/mybatis/mapper/ApiGoodsMapper.xml
  36. 156 149
      kmall-api/src/main/resources/mybatis/mapper/ApiMngChangeMapper.xml
  37. 156 159
      kmall-api/src/main/resources/mybatis/mapper/ApiStoreMngChangeMapper.xml
  38. 35 0
      kmall-common/src/main/java/com/kmall/common/constant/Dict.java
  39. 296 0
      kmall-common/src/main/java/com/kmall/common/entity/SysUserEntity.java
  40. 6 0
      kmall-schedule/src/main/java/com/kmall/schedule/dao/QzOrderMapper.java
  41. 273 0
      kmall-schedule/src/main/java/com/kmall/schedule/entity/MngChangeJobEntity.java
  42. 273 0
      kmall-schedule/src/main/java/com/kmall/schedule/entity/StoreMngChangeJobEntity.java
  43. 5 5
      kmall-schedule/src/main/java/com/kmall/schedule/quartz/OrderTask.java
  44. 61 10
      kmall-schedule/src/main/java/com/kmall/schedule/service/QzOrderService.java
  45. 54 54
      kmall-schedule/src/main/resources/logback.xml
  46. 73 5
      kmall-schedule/src/main/resources/mybatis/mapper/QzOrderMapper.xml

+ 2 - 2
kmall-admin/src/main/java/com/kmall/admin/controller/GoodsController.java

@@ -59,14 +59,14 @@ public class GoodsController {
                 throw new RRException("请维护门店信息中的第三方商户编号信息!再进行商品查看");
             }
         }
-        String goodsName = (String) params.get("goodsName");
+        String goodsName = (String) params.get("name");
         if(org.apache.commons.lang3.StringUtils.isNotEmpty(goodsName)){
             try{
                 goodsName = new String(goodsName.getBytes("iso-8859-1"),"utf-8");
             }catch (Exception e){
                 e.printStackTrace();
             }
-            params.put("goodsName", goodsName);
+            params.put("name", goodsName);
         }
         //查询列表数据
         Query query = new Query(params);

+ 106 - 0
kmall-admin/src/main/java/com/kmall/admin/controller/MngChangeController.java

@@ -0,0 +1,106 @@
+package com.kmall.admin.controller;
+
+import java.util.List;
+import java.util.Map;
+
+import com.kmall.admin.entity.MngChangeEntity;
+import com.kmall.admin.service.MngChangeService;
+import com.kmall.common.utils.PageUtils;
+import com.kmall.common.utils.Query;
+import com.kmall.common.utils.R;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * 库存变化表Controller
+ *
+ * @author emato
+ * @email admin@qhdswl.com
+ * @date 2019-03-11 10:29:49
+ */
+@Controller
+@RequestMapping("mngchange")
+public class MngChangeController {
+    @Autowired
+    private MngChangeService mngChangeService;
+
+    /**
+     * 查看列表
+     */
+    @RequestMapping("/list")
+    @RequiresPermissions("mngchange:list")
+    @ResponseBody
+    public R list(@RequestParam Map<String, Object> params) {
+        //查询列表数据
+        Query query = new Query(params);
+
+        List<MngChangeEntity> mngChangeList = mngChangeService.queryList(query);
+        int total = mngChangeService.queryTotal(query);
+
+        PageUtils pageUtil = new PageUtils(mngChangeList, total, query.getLimit(), query.getPage());
+
+        return R.ok().put("page", pageUtil);
+    }
+
+    /**
+     * 查看信息
+     */
+    @RequestMapping("/info/{id}")
+    @RequiresPermissions("mngchange:info")
+    @ResponseBody
+    public R info(@PathVariable("id") Integer id) {
+        MngChangeEntity mngChange = mngChangeService.queryObject(id);
+
+        return R.ok().put("mngChange", mngChange);
+    }
+
+    /**
+     * 保存
+     */
+    @RequestMapping("/save")
+    @RequiresPermissions("mngchange:save")
+    @ResponseBody
+    public R save(@RequestBody MngChangeEntity mngChange) {
+        mngChangeService.save(mngChange);
+
+        return R.ok();
+    }
+
+    /**
+     * 修改
+     */
+    @RequestMapping("/update")
+    @RequiresPermissions("mngchange:update")
+    @ResponseBody
+    public R update(@RequestBody MngChangeEntity mngChange) {
+        mngChangeService.update(mngChange);
+
+        return R.ok();
+    }
+
+    /**
+     * 删除
+     */
+    @RequestMapping("/delete")
+    @RequiresPermissions("mngchange:delete")
+    @ResponseBody
+    public R delete(@RequestBody Integer[]ids) {
+        mngChangeService.deleteBatch(ids);
+
+        return R.ok();
+    }
+
+    /**
+     * 查看所有列表
+     */
+    @RequestMapping("/queryAll")
+    @ResponseBody
+    public R queryAll(@RequestParam Map<String, Object> params) {
+
+        List<MngChangeEntity> list = mngChangeService.queryList(params);
+
+        return R.ok().put("list", list);
+    }
+}

+ 5 - 3
kmall-admin/src/main/java/com/kmall/admin/controller/ProductStoreRelaController.java

@@ -57,9 +57,11 @@ public class ProductStoreRelaController {
         List<ProductStoreRelaEntity> productStoreRelaList = productStoreRelaService.queryList(query);
         for (ProductStoreRelaEntity pro: productStoreRelaList) {
             if(org.apache.commons.lang3.StringUtils.isNotEmpty(pro.getIsStockShare())) {
-                if (pro.getGoodsBizType().equalsIgnoreCase(Dict.orderBizType.item_00.getItem())) {
-                    if(pro.getIsStockShare().equalsIgnoreCase(Dict.isStockShare.item_1.getItem())) {
-                        pro.setStockNum(pro.getGoodsNumber());
+                if(org.apache.commons.lang3.StringUtils.isNotEmpty(pro.getGoodsBizType())) {
+                    if (pro.getGoodsBizType().equalsIgnoreCase(Dict.orderBizType.item_00.getItem())) {
+                        if (pro.getIsStockShare().equalsIgnoreCase(Dict.isStockShare.item_1.getItem())) {
+                            pro.setStockNum(pro.getGoodsNumber());
+                        }
                     }
                 }
             }

+ 10 - 0
kmall-admin/src/main/java/com/kmall/admin/controller/StoreController.java

@@ -59,6 +59,16 @@ public class StoreController {
     public R list(@RequestParam Map<String, Object> params) {
 
         ParamUtils.setQueryPowerByRoleType(params, "id", "merchSn", false);
+
+        String storeName = (String) params.get("storeName");
+        if(org.apache.commons.lang3.StringUtils.isNotEmpty(storeName)){
+            try{
+                storeName = new String(storeName.getBytes("iso-8859-1"),"utf-8");
+            }catch (Exception e){
+                e.printStackTrace();
+            }
+            params.put("storeName", storeName);
+        }
         //查询列表数据
         Query query = new Query(params);
 

+ 106 - 0
kmall-admin/src/main/java/com/kmall/admin/controller/StoreMngChangeController.java

@@ -0,0 +1,106 @@
+package com.kmall.admin.controller;
+
+import java.util.List;
+import java.util.Map;
+
+import com.kmall.admin.entity.StoreMngChangeEntity;
+import com.kmall.admin.service.StoreMngChangeService;
+import com.kmall.common.utils.PageUtils;
+import com.kmall.common.utils.Query;
+import com.kmall.common.utils.R;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * 门店库存变化表Controller
+ *
+ * @author emato
+ * @email admin@qhdswl.com
+ * @date 2019-03-11 10:29:49
+ */
+@Controller
+@RequestMapping("storemngchange")
+public class StoreMngChangeController {
+    @Autowired
+    private StoreMngChangeService storeMngChangeService;
+
+    /**
+     * 查看列表
+     */
+    @RequestMapping("/list")
+    @RequiresPermissions("storemngchange:list")
+    @ResponseBody
+    public R list(@RequestParam Map<String, Object> params) {
+        //查询列表数据
+        Query query = new Query(params);
+
+        List<StoreMngChangeEntity> storeMngChangeList = storeMngChangeService.queryList(query);
+        int total = storeMngChangeService.queryTotal(query);
+
+        PageUtils pageUtil = new PageUtils(storeMngChangeList, total, query.getLimit(), query.getPage());
+
+        return R.ok().put("page", pageUtil);
+    }
+
+    /**
+     * 查看信息
+     */
+    @RequestMapping("/info/{id}")
+    @RequiresPermissions("storemngchange:info")
+    @ResponseBody
+    public R info(@PathVariable("id") Integer id) {
+        StoreMngChangeEntity storeMngChange = storeMngChangeService.queryObject(id);
+
+        return R.ok().put("storeMngChange", storeMngChange);
+    }
+
+    /**
+     * 保存
+     */
+    @RequestMapping("/save")
+    @RequiresPermissions("storemngchange:save")
+    @ResponseBody
+    public R save(@RequestBody StoreMngChangeEntity storeMngChange) {
+        storeMngChangeService.save(storeMngChange);
+
+        return R.ok();
+    }
+
+    /**
+     * 修改
+     */
+    @RequestMapping("/update")
+    @RequiresPermissions("storemngchange:update")
+    @ResponseBody
+    public R update(@RequestBody StoreMngChangeEntity storeMngChange) {
+        storeMngChangeService.update(storeMngChange);
+
+        return R.ok();
+    }
+
+    /**
+     * 删除
+     */
+    @RequestMapping("/delete")
+    @RequiresPermissions("storemngchange:delete")
+    @ResponseBody
+    public R delete(@RequestBody Integer[]ids) {
+        storeMngChangeService.deleteBatch(ids);
+
+        return R.ok();
+    }
+
+    /**
+     * 查看所有列表
+     */
+    @RequestMapping("/queryAll")
+    @ResponseBody
+    public R queryAll(@RequestParam Map<String, Object> params) {
+
+        List<StoreMngChangeEntity> list = storeMngChangeService.queryList(params);
+
+        return R.ok().put("list", list);
+    }
+}

+ 10 - 0
kmall-admin/src/main/java/com/kmall/admin/controller/ThirdMerchantBizController.java

@@ -50,6 +50,16 @@ public class ThirdMerchantBizController {
                 throw new RRException("请维护门店信息中的第三方商户编号信息!再进行商品查看");
             }
         }
+
+        String goodsName = (String) params.get("name");
+        if(org.apache.commons.lang3.StringUtils.isNotEmpty(goodsName)){
+            try{
+                goodsName = new String(goodsName.getBytes("iso-8859-1"),"utf-8");
+            }catch (Exception e){
+                e.printStackTrace();
+            }
+            params.put("name", goodsName);
+        }
         //查询列表数据
         Query query = new Query(params);
 

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

@@ -0,0 +1,17 @@
+package com.kmall.admin.dao;
+
+import com.kmall.admin.entity.MngChangeEntity;
+import com.kmall.manager.dao.BaseDao;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * 库存变化表Dao
+ *
+ * @author emato
+ * @email admin@qhdswl.com
+ * @date 2019-03-11 10:29:49
+ */
+public interface MngChangeDao extends BaseDao<MngChangeEntity> {
+    MngChangeEntity queryObjectByGoodsIdAndType(@Param("goodsId") Long goodsId, @Param("changeType") String changeType);
+
+}

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

@@ -0,0 +1,17 @@
+package com.kmall.admin.dao;
+
+import com.kmall.admin.entity.StoreMngChangeEntity;
+import com.kmall.manager.dao.BaseDao;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * 门店库存变化表Dao
+ *
+ * @author emato
+ * @email admin@qhdswl.com
+ * @date 2019-03-11 10:29:49
+ */
+public interface StoreMngChangeDao extends BaseDao<StoreMngChangeEntity> {
+    StoreMngChangeEntity queryObjectByGoodsIdAndType(@Param("goodsId") Long goodsId, @Param("changeType") String changeType);
+
+}

+ 303 - 0
kmall-admin/src/main/java/com/kmall/admin/entity/MngChangeEntity.java

@@ -0,0 +1,303 @@
+package com.kmall.admin.entity;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 库存变化表实体
+ * 表名 mall_mng_change
+ *
+ * @author emato
+ * @email admin@qhdswl.com
+ * @date 2019-03-11 10:29:49
+ */
+public class MngChangeEntity implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 
+     */
+    private Integer id;
+    /**
+     * 商品库存变化数
+     */
+    private Integer changeNum;
+    /**
+     * 商品原库存数
+     */
+    private Integer originalNum;
+    /**
+     * 商品库存可用数
+     */
+    private Integer validNum;
+    /**
+     * 商户编号
+     */
+    private String merchSn;
+    /**
+     * 第三方商户代码
+     */
+    private String thirdPartyMerchCode;
+    /**
+     * 商品id
+     */
+    private Integer goodsId;
+    /**
+     * 是否有效,0:有效,1:无效
+     */
+    private Integer isValid;
+    /**
+     * 变动类型 0:还原 1:扣减
+     */
+    private String changeType;
+    /**
+     * 变动原因
+     */
+    private String changeReason;
+    /**
+     * 创建人编号
+     */
+    private String createrSn;
+    /**
+     * 创建时间
+     */
+    private Date createTime;
+    /**
+     * 修改人编号
+     */
+    private String moderSn;
+    /**
+     * 修改时间
+     */
+    private Date modTime;
+    /**
+     * 时间戳
+     */
+    private Date tstm;
+
+    private String goodsName;
+
+    private String merchName;
+
+    private String thirdPartyMerchName;
+
+    public String getGoodsName() {
+        return goodsName;
+    }
+
+    public void setGoodsName(String goodsName) {
+        this.goodsName = goodsName;
+    }
+
+    public String getMerchName() {
+        return merchName;
+    }
+
+    public void setMerchName(String merchName) {
+        this.merchName = merchName;
+    }
+
+    public String getThirdPartyMerchName() {
+        return thirdPartyMerchName;
+    }
+
+    public void setThirdPartyMerchName(String thirdPartyMerchName) {
+        this.thirdPartyMerchName = thirdPartyMerchName;
+    }
+
+    /**
+     * 设置:
+     */
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    /**
+     * 获取:
+     */
+    public Integer getId() {
+        return id;
+    }
+    /**
+     * 设置:商品库存变化数
+     */
+    public void setChangeNum(Integer changeNum) {
+        this.changeNum = changeNum;
+    }
+
+    /**
+     * 获取:商品库存变化数
+     */
+    public Integer getChangeNum() {
+        return changeNum;
+    }
+    /**
+     * 设置:商品原库存数
+     */
+    public void setOriginalNum(Integer originalNum) {
+        this.originalNum = originalNum;
+    }
+
+    /**
+     * 获取:商品原库存数
+     */
+    public Integer getOriginalNum() {
+        return originalNum;
+    }
+    /**
+     * 设置:商品库存可用数
+     */
+    public void setValidNum(Integer validNum) {
+        this.validNum = validNum;
+    }
+
+    /**
+     * 获取:商品库存可用数
+     */
+    public Integer getValidNum() {
+        return validNum;
+    }
+    /**
+     * 设置:商户编号
+     */
+    public void setMerchSn(String merchSn) {
+        this.merchSn = merchSn;
+    }
+
+    /**
+     * 获取:商户编号
+     */
+    public String getMerchSn() {
+        return merchSn;
+    }
+    /**
+     * 设置:第三方商户代码
+     */
+    public void setThirdPartyMerchCode(String thirdPartyMerchCode) {
+        this.thirdPartyMerchCode = thirdPartyMerchCode;
+    }
+
+    /**
+     * 获取:第三方商户代码
+     */
+    public String getThirdPartyMerchCode() {
+        return thirdPartyMerchCode;
+    }
+    /**
+     * 设置:商品id
+     */
+    public void setGoodsId(Integer goodsId) {
+        this.goodsId = goodsId;
+    }
+
+    /**
+     * 获取:商品id
+     */
+    public Integer getGoodsId() {
+        return goodsId;
+    }
+    /**
+     * 设置:是否有效,0:有效,1:无效
+     */
+    public void setIsValid(Integer isValid) {
+        this.isValid = isValid;
+    }
+
+    /**
+     * 获取:是否有效,0:有效,1:无效
+     */
+    public Integer getIsValid() {
+        return isValid;
+    }
+    /**
+     * 设置:变动类型 0:还原 1:扣减
+     */
+    public void setChangeType(String changeType) {
+        this.changeType = changeType;
+    }
+
+    /**
+     * 获取:变动类型 0:还原 1:扣减
+     */
+    public String getChangeType() {
+        return changeType;
+    }
+    /**
+     * 设置:变动原因
+     */
+    public void setChangeReason(String changeReason) {
+        this.changeReason = changeReason;
+    }
+
+    /**
+     * 获取:变动原因
+     */
+    public String getChangeReason() {
+        return changeReason;
+    }
+    /**
+     * 设置:创建人编号
+     */
+    public void setCreaterSn(String createrSn) {
+        this.createrSn = createrSn;
+    }
+
+    /**
+     * 获取:创建人编号
+     */
+    public String getCreaterSn() {
+        return createrSn;
+    }
+    /**
+     * 设置:创建时间
+     */
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+    /**
+     * 获取:创建时间
+     */
+    public Date getCreateTime() {
+        return createTime;
+    }
+    /**
+     * 设置:修改人编号
+     */
+    public void setModerSn(String moderSn) {
+        this.moderSn = moderSn;
+    }
+
+    /**
+     * 获取:修改人编号
+     */
+    public String getModerSn() {
+        return moderSn;
+    }
+    /**
+     * 设置:修改时间
+     */
+    public void setModTime(Date modTime) {
+        this.modTime = modTime;
+    }
+
+    /**
+     * 获取:修改时间
+     */
+    public Date getModTime() {
+        return modTime;
+    }
+    /**
+     * 设置:时间戳
+     */
+    public void setTstm(Date tstm) {
+        this.tstm = tstm;
+    }
+
+    /**
+     * 获取:时间戳
+     */
+    public Date getTstm() {
+        return tstm;
+    }
+}

+ 169 - 0
kmall-admin/src/main/java/com/kmall/admin/entity/ScheduleJobEntity.java

@@ -0,0 +1,169 @@
+package com.kmall.admin.entity;
+
+import org.hibernate.validator.constraints.NotBlank;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 定时器
+ *
+ * @author Scott
+ * @email
+ * @date 2016年11月28日 下午12:54:44
+ */
+public class ScheduleJobEntity implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 任务调度参数key
+     */
+    public static final String JOB_PARAM_KEY = "JOB_PARAM_KEY";
+
+    /**
+     * 任务id
+     */
+    private Long jobId;
+
+    /**
+     * spring bean名称
+     */
+    @NotBlank(message = "bean名称不能为空")
+    private String beanName;
+
+    /**
+     * 方法名
+     */
+    @NotBlank(message = "方法名称不能为空")
+    private String methodName;
+
+    /**
+     * 参数
+     */
+    private String params;
+
+    /**
+     * cron表达式
+     */
+    @NotBlank(message = "cron表达式不能为空")
+    private String cronExpression;
+
+    /**
+     * 任务状态
+     */
+    private Integer status;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    /**
+     * 创建时间
+     */
+    private Date createTime;
+
+    /**
+     * 设置:任务id
+     *
+     * @param jobId 任务id
+     */
+    public void setJobId(Long jobId) {
+        this.jobId = jobId;
+    }
+
+    /**
+     * 获取:任务id
+     *
+     * @return Long
+     */
+    public Long getJobId() {
+        return jobId;
+    }
+
+    public String getBeanName() {
+        return beanName;
+    }
+
+    public void setBeanName(String beanName) {
+        this.beanName = beanName;
+    }
+
+    public String getMethodName() {
+        return methodName;
+    }
+
+    public void setMethodName(String methodName) {
+        this.methodName = methodName;
+    }
+
+    public String getParams() {
+        return params;
+    }
+
+    public void setParams(String params) {
+        this.params = params;
+    }
+
+    public String getRemark() {
+        return remark;
+    }
+
+    public void setRemark(String remark) {
+        this.remark = remark;
+    }
+
+    /**
+     * 设置:任务状态
+     *
+     * @param status 任务状态
+     */
+    public void setStatus(Integer status) {
+        this.status = status;
+    }
+
+    /**
+     * 获取:任务状态
+     *
+     * @return String
+     */
+    public Integer getStatus() {
+        return status;
+    }
+
+    /**
+     * 设置:cron表达式
+     *
+     * @param cronExpression cron表达式
+     */
+    public void setCronExpression(String cronExpression) {
+        this.cronExpression = cronExpression;
+    }
+
+    /**
+     * 获取:cron表达式
+     *
+     * @return String
+     */
+    public String getCronExpression() {
+        return cronExpression;
+    }
+
+    /**
+     * 设置:创建时间
+     *
+     * @param createTime 创建时间
+     */
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+    /**
+     * 获取:创建时间
+     *
+     * @return Date
+     */
+    public Date getCreateTime() {
+        return createTime;
+    }
+}

+ 133 - 0
kmall-admin/src/main/java/com/kmall/admin/entity/ScheduleJobLogEntity.java

@@ -0,0 +1,133 @@
+package com.kmall.admin.entity;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 定时执行日志
+ *
+ * @author Scott
+ * @email
+ * @date 2016年12月1日 下午10:26:18
+ */
+public class ScheduleJobLogEntity implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 日志id
+     */
+    private Long logId;
+
+    /**
+     * 任务id
+     */
+    private Long jobId;
+
+    /**
+     * spring bean名称
+     */
+    private String beanName;
+
+    /**
+     * 方法名
+     */
+    private String methodName;
+
+    /**
+     * 参数
+     */
+    private String params;
+
+    /**
+     * 任务状态    0:成功    1:失败
+     */
+    private Integer status;
+
+    /**
+     * 失败信息
+     */
+    private String error;
+
+    /**
+     * 耗时(单位:毫秒)
+     */
+    private Integer times;
+
+    /**
+     * 创建时间
+     */
+    private Date createTime;
+
+    public Long getLogId() {
+        return logId;
+    }
+
+    public void setLogId(Long logId) {
+        this.logId = logId;
+    }
+
+    public Long getJobId() {
+        return jobId;
+    }
+
+    public void setJobId(Long jobId) {
+        this.jobId = jobId;
+    }
+
+    public String getBeanName() {
+        return beanName;
+    }
+
+    public void setBeanName(String beanName) {
+        this.beanName = beanName;
+    }
+
+    public String getMethodName() {
+        return methodName;
+    }
+
+    public void setMethodName(String methodName) {
+        this.methodName = methodName;
+    }
+
+    public String getParams() {
+        return params;
+    }
+
+    public void setParams(String params) {
+        this.params = params;
+    }
+
+    public Integer getStatus() {
+        return status;
+    }
+
+    public void setStatus(Integer status) {
+        this.status = status;
+    }
+
+    public String getError() {
+        return error;
+    }
+
+    public void setError(String error) {
+        this.error = error;
+    }
+
+    public Integer getTimes() {
+        return times;
+    }
+
+    public void setTimes(Integer times) {
+        this.times = times;
+    }
+
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+}

+ 304 - 0
kmall-admin/src/main/java/com/kmall/admin/entity/StoreMngChangeEntity.java

@@ -0,0 +1,304 @@
+package com.kmall.admin.entity;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 门店库存变化表实体
+ * 表名 mall_store_mng_change
+ *
+ * @author emato
+ * @email admin@qhdswl.com
+ * @date 2019-03-11 10:29:49
+ */
+public class StoreMngChangeEntity implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 
+     */
+    private Integer id;
+    /**
+     * 门店库存变化数
+     */
+    private Integer storeChangeNum;
+    /**
+     * 门店原库存数
+     */
+    private Integer storeOriginalNum;
+    /**
+     * 门店库存可用数
+     */
+    private Integer storeValidNum;
+    /**
+     * 商户编号
+     */
+    private String merchSn;
+    /**
+     * 门店编号
+     */
+    private Integer storeId;
+    /**
+     * 商品id
+     */
+    private Integer goodsId;
+    /**
+     * 是否有效,0:有效,1:无效
+     */
+    private Integer isValid;
+    /**
+     * 变动类型 0:还原 1:扣减
+     */
+    private String changeType;
+    /**
+     * 变动原因
+     */
+    private String changeReason;
+    /**
+     * 创建人编号
+     */
+    private String createrSn;
+    /**
+     * 创建时间
+     */
+    private Date createTime;
+    /**
+     * 修改人编号
+     */
+    private String moderSn;
+    /**
+     * 修改时间
+     */
+    private Date modTime;
+    /**
+     * 时间戳
+     */
+    private Date tstm;
+
+
+    private String goodsName;
+
+    private String merchName;
+
+    private String storeName;
+
+    public String getGoodsName() {
+        return goodsName;
+    }
+
+    public void setGoodsName(String goodsName) {
+        this.goodsName = goodsName;
+    }
+
+    public String getMerchName() {
+        return merchName;
+    }
+
+    public void setMerchName(String merchName) {
+        this.merchName = merchName;
+    }
+
+    public String getStoreName() {
+        return storeName;
+    }
+
+    public void setStoreName(String storeName) {
+        this.storeName = storeName;
+    }
+
+    /**
+     * 设置:
+     */
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    /**
+     * 获取:
+     */
+    public Integer getId() {
+        return id;
+    }
+    /**
+     * 设置:门店库存变化数
+     */
+    public void setStoreChangeNum(Integer storeChangeNum) {
+        this.storeChangeNum = storeChangeNum;
+    }
+
+    /**
+     * 获取:门店库存变化数
+     */
+    public Integer getStoreChangeNum() {
+        return storeChangeNum;
+    }
+    /**
+     * 设置:门店原库存数
+     */
+    public void setStoreOriginalNum(Integer storeOriginalNum) {
+        this.storeOriginalNum = storeOriginalNum;
+    }
+
+    /**
+     * 获取:门店原库存数
+     */
+    public Integer getStoreOriginalNum() {
+        return storeOriginalNum;
+    }
+    /**
+     * 设置:门店库存可用数
+     */
+    public void setStoreValidNum(Integer storeValidNum) {
+        this.storeValidNum = storeValidNum;
+    }
+
+    /**
+     * 获取:门店库存可用数
+     */
+    public Integer getStoreValidNum() {
+        return storeValidNum;
+    }
+    /**
+     * 设置:商户编号
+     */
+    public void setMerchSn(String merchSn) {
+        this.merchSn = merchSn;
+    }
+
+    /**
+     * 获取:商户编号
+     */
+    public String getMerchSn() {
+        return merchSn;
+    }
+    /**
+     * 设置:门店编号
+     */
+    public void setStoreId(Integer storeId) {
+        this.storeId = storeId;
+    }
+
+    /**
+     * 获取:门店编号
+     */
+    public Integer getStoreId() {
+        return storeId;
+    }
+    /**
+     * 设置:商品id
+     */
+    public void setGoodsId(Integer goodsId) {
+        this.goodsId = goodsId;
+    }
+
+    /**
+     * 获取:商品id
+     */
+    public Integer getGoodsId() {
+        return goodsId;
+    }
+    /**
+     * 设置:是否有效,0:有效,1:无效
+     */
+    public void setIsValid(Integer isValid) {
+        this.isValid = isValid;
+    }
+
+    /**
+     * 获取:是否有效,0:有效,1:无效
+     */
+    public Integer getIsValid() {
+        return isValid;
+    }
+    /**
+     * 设置:变动类型 0:还原 1:扣减
+     */
+    public void setChangeType(String changeType) {
+        this.changeType = changeType;
+    }
+
+    /**
+     * 获取:变动类型 0:还原 1:扣减
+     */
+    public String getChangeType() {
+        return changeType;
+    }
+    /**
+     * 设置:变动原因
+     */
+    public void setChangeReason(String changeReason) {
+        this.changeReason = changeReason;
+    }
+
+    /**
+     * 获取:变动原因
+     */
+    public String getChangeReason() {
+        return changeReason;
+    }
+    /**
+     * 设置:创建人编号
+     */
+    public void setCreaterSn(String createrSn) {
+        this.createrSn = createrSn;
+    }
+
+    /**
+     * 获取:创建人编号
+     */
+    public String getCreaterSn() {
+        return createrSn;
+    }
+    /**
+     * 设置:创建时间
+     */
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+    /**
+     * 获取:创建时间
+     */
+    public Date getCreateTime() {
+        return createTime;
+    }
+    /**
+     * 设置:修改人编号
+     */
+    public void setModerSn(String moderSn) {
+        this.moderSn = moderSn;
+    }
+
+    /**
+     * 获取:修改人编号
+     */
+    public String getModerSn() {
+        return moderSn;
+    }
+    /**
+     * 设置:修改时间
+     */
+    public void setModTime(Date modTime) {
+        this.modTime = modTime;
+    }
+
+    /**
+     * 获取:修改时间
+     */
+    public Date getModTime() {
+        return modTime;
+    }
+    /**
+     * 设置:时间戳
+     */
+    public void setTstm(Date tstm) {
+        this.tstm = tstm;
+    }
+
+    /**
+     * 获取:时间戳
+     */
+    public Date getTstm() {
+        return tstm;
+    }
+}

+ 72 - 0
kmall-admin/src/main/java/com/kmall/admin/service/MngChangeService.java

@@ -0,0 +1,72 @@
+package com.kmall.admin.service;
+
+import com.kmall.admin.entity.MngChangeEntity;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 库存变化表Service接口
+ *
+ * @author emato
+ * @email admin@qhdswl.com
+ * @date 2019-03-11 10:29:49
+ */
+public interface MngChangeService {
+
+    /**
+     * 根据主键查询实体
+     *
+     * @param id 主键
+     * @return 实体
+     */
+    MngChangeEntity queryObject(Integer id);
+
+    /**
+     * 分页查询
+     *
+     * @param map 参数
+     * @return list
+     */
+    List<MngChangeEntity> queryList(Map<String, Object> map);
+
+    /**
+     * 分页统计总数
+     *
+     * @param map 参数
+     * @return 总数
+     */
+    int queryTotal(Map<String, Object> map);
+
+    /**
+     * 保存实体
+     *
+     * @param mngChange 实体
+     * @return 保存条数
+     */
+    int save(MngChangeEntity mngChange);
+
+    /**
+     * 根据主键更新实体
+     *
+     * @param mngChange 实体
+     * @return 更新条数
+     */
+    int update(MngChangeEntity mngChange);
+
+    /**
+     * 根据主键删除
+     *
+     * @param id
+     * @return 删除条数
+     */
+    int delete(Integer id);
+
+    /**
+     * 根据主键批量删除
+     *
+     * @param ids
+     * @return 删除条数
+     */
+    int deleteBatch(Integer[] ids);
+}

+ 72 - 0
kmall-admin/src/main/java/com/kmall/admin/service/StoreMngChangeService.java

@@ -0,0 +1,72 @@
+package com.kmall.admin.service;
+
+import com.kmall.admin.entity.StoreMngChangeEntity;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 门店库存变化表Service接口
+ *
+ * @author emato
+ * @email admin@qhdswl.com
+ * @date 2019-03-11 10:29:49
+ */
+public interface StoreMngChangeService {
+
+    /**
+     * 根据主键查询实体
+     *
+     * @param id 主键
+     * @return 实体
+     */
+    StoreMngChangeEntity queryObject(Integer id);
+
+    /**
+     * 分页查询
+     *
+     * @param map 参数
+     * @return list
+     */
+    List<StoreMngChangeEntity> queryList(Map<String, Object> map);
+
+    /**
+     * 分页统计总数
+     *
+     * @param map 参数
+     * @return 总数
+     */
+    int queryTotal(Map<String, Object> map);
+
+    /**
+     * 保存实体
+     *
+     * @param storeMngChange 实体
+     * @return 保存条数
+     */
+    int save(StoreMngChangeEntity storeMngChange);
+
+    /**
+     * 根据主键更新实体
+     *
+     * @param storeMngChange 实体
+     * @return 更新条数
+     */
+    int update(StoreMngChangeEntity storeMngChange);
+
+    /**
+     * 根据主键删除
+     *
+     * @param id
+     * @return 删除条数
+     */
+    int delete(Integer id);
+
+    /**
+     * 根据主键批量删除
+     *
+     * @param ids
+     * @return 删除条数
+     */
+    int deleteBatch(Integer[] ids);
+}

+ 45 - 0
kmall-admin/src/main/java/com/kmall/admin/service/impl/GoodsServiceImpl.java

@@ -64,6 +64,8 @@ public class GoodsServiceImpl implements GoodsService {
     private CartDao cartDao;
     @Autowired
     private ThirdMerchantBizDao thirdMerchantBizDao;
+    @Autowired
+    private MngChangeDao mngChangeDao;
 
     @Override
     public GoodsEntity queryObject(Integer id) {
@@ -220,6 +222,23 @@ public class GoodsServiceImpl implements GoodsService {
                 }
             }
         }*/
+        if (goods.getGoodsNumber() != null){
+            MngChangeEntity mngChangeEntity = new MngChangeEntity();
+            mngChangeEntity.setGoodsId(Integer.parseInt(String.valueOf(id)));
+            mngChangeEntity.setThirdPartyMerchCode(goods.getThirdPartyMerchCode());
+            mngChangeEntity.setChangeReason("新增商户商品总库存");
+            mngChangeEntity.setChangeType(Dict.changeType.item_0.getItem());
+            mngChangeEntity.setChangeNum(goods.getGoodsNumber());//变化数
+            mngChangeEntity.setOriginalNum(0);//原库存数
+            mngChangeEntity.setValidNum(goods.getGoodsNumber());//可用数
+            mngChangeEntity.setCreateTime(new Date());
+            mngChangeEntity.setModTime(new Date());
+            mngChangeEntity.setCreaterSn(user.getUsername());
+            mngChangeEntity.setModerSn(user.getUsername());
+            mngChangeEntity.setIsValid(0);
+            mngChangeEntity.setMerchSn(goods.getMerchSn());
+            mngChangeDao.save(mngChangeEntity);
+        }
 
         // 添加产品
         ProductEntity product = new ProductEntity();
@@ -322,6 +341,32 @@ public class GoodsServiceImpl implements GoodsService {
         goods.setModTime(new Date());
         if(goods.getGoodsNumber()==null){
             goods.setGoodsNumber(0);
+        }else{
+            MngChangeEntity mngChangeEntity = new MngChangeEntity();
+            mngChangeEntity.setGoodsId(Integer.parseInt(String.valueOf(goods.getId())));
+            mngChangeEntity.setThirdPartyMerchCode(goods.getThirdPartyMerchCode());
+            mngChangeEntity.setChangeReason("更新商户商品总库存");
+            mngChangeEntity.setCreateTime(new Date());
+            mngChangeEntity.setModTime(new Date());
+            mngChangeEntity.setCreaterSn(user.getUsername());
+            mngChangeEntity.setModerSn(user.getUsername());
+            mngChangeEntity.setIsValid(0);
+            mngChangeEntity.setMerchSn(goods.getMerchSn());
+
+
+            GoodsEntity goodsEntity = goodsDao.queryObject(goods.getId());
+            if(goodsEntity.getGoodsNumber() != goods.getGoodsNumber()) {
+                if (goodsEntity.getGoodsNumber() > goods.getGoodsNumber()) {
+                    mngChangeEntity.setChangeNum(goodsEntity.getGoodsNumber() - goods.getGoodsNumber());//变化数
+                    mngChangeEntity.setChangeType(Dict.changeType.item_4.getItem());
+                } else {
+                    mngChangeEntity.setChangeNum(goods.getGoodsNumber() - goodsEntity.getGoodsNumber());//变化数
+                    mngChangeEntity.setChangeType(Dict.changeType.item_3.getItem());
+                }
+                mngChangeEntity.setOriginalNum(goodsEntity.getGoodsNumber());//原库存数
+                mngChangeEntity.setValidNum(goods.getGoodsNumber());//可用数
+                mngChangeDao.save(mngChangeEntity);
+            }
         }
 
         // 修改商品

+ 58 - 0
kmall-admin/src/main/java/com/kmall/admin/service/impl/MngChangeServiceImpl.java

@@ -0,0 +1,58 @@
+package com.kmall.admin.service.impl;
+
+import com.kmall.admin.dao.MngChangeDao;
+import com.kmall.admin.entity.MngChangeEntity;
+import com.kmall.admin.service.MngChangeService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 库存变化表Service实现类
+ *
+ * @author emato
+ * @email admin@qhdswl.com
+ * @date 2019-03-11 10:29:49
+ */
+@Service("mngChangeService")
+public class MngChangeServiceImpl implements MngChangeService {
+    @Autowired
+    private MngChangeDao mngChangeDao;
+
+    @Override
+    public MngChangeEntity queryObject(Integer id) {
+        return mngChangeDao.queryObject(id);
+    }
+
+    @Override
+    public List<MngChangeEntity> queryList(Map<String, Object> map) {
+        return mngChangeDao.queryList(map);
+    }
+
+    @Override
+    public int queryTotal(Map<String, Object> map) {
+        return mngChangeDao.queryTotal(map);
+    }
+
+    @Override
+    public int save(MngChangeEntity mngChange) {
+        return mngChangeDao.save(mngChange);
+    }
+
+    @Override
+    public int update(MngChangeEntity mngChange) {
+        return mngChangeDao.update(mngChange);
+    }
+
+    @Override
+    public int delete(Integer id) {
+        return mngChangeDao.delete(id);
+    }
+
+    @Override
+    public int deleteBatch(Integer[]ids) {
+        return mngChangeDao.deleteBatch(ids);
+    }
+}

+ 58 - 6
kmall-admin/src/main/java/com/kmall/admin/service/impl/OrderServiceImpl.java

@@ -55,6 +55,10 @@ public class OrderServiceImpl implements OrderService {
     private GoodsDao goodsDao;
     @Autowired
     private MerchDao merchDao;
+    @Autowired
+    private MngChangeDao mngChangeDao;
+    @Autowired
+    private StoreMngChangeDao storeMngChangeDao;
 
     @Override
     public OrderEntity queryObject(Long id) {
@@ -97,7 +101,6 @@ public class OrderServiceImpl implements OrderService {
         if (order.getOrderStatus() == Integer.parseInt(Dict.orderStatus.item_0.getItem())) {
             order.setOrderStatus(Integer.parseInt(Dict.orderStatus.item_101.getItem()));
         }
-
         // 判断是否有优惠券
         UserCouponEntity couponVo = userCouponDao.queryByOrderId(order.getId());
         if (null != couponVo) {
@@ -109,7 +112,7 @@ public class OrderServiceImpl implements OrderService {
             return;
         }
         // 更新库存
-        updateStock(order);
+        updateStock(order, "管理后台取消订单");
     }
 
     @Override
@@ -291,7 +294,7 @@ public class OrderServiceImpl implements OrderService {
             return;
         }
         // 更新库存
-        updateStock(order);
+        updateStock(order, "管理后台订单退款");
     }
 
     /**
@@ -335,7 +338,7 @@ public class OrderServiceImpl implements OrderService {
             return;
         }
         // 更新库存
-        updateStock(order);
+        updateStock(order, "管理后台平安退款订单");
     }
 
     /**
@@ -392,11 +395,12 @@ public class OrderServiceImpl implements OrderService {
             return;
         }
         // 更新库存
-        updateStock(order);
+        updateStock(order, "管理后台微信国际退款订单");
     }
 
-    private void updateStock(OrderEntity order){
+    private void updateStock(OrderEntity order, String changeReason){
         Map<String, Object> map = new HashMap<String, Object>();
+        SysUserEntity user = ShiroUtils.getUserEntity();
         map.put("orderId", order.getId());
         List<OrderGoodsEntity> orderGoodsVoList = orderGoodsDao.queryList(map);
         for (OrderGoodsEntity orderGoodsEntity : orderGoodsVoList) {
@@ -425,6 +429,22 @@ public class OrderServiceImpl implements OrderService {
                         goodsEntity.setGoodsNumber(stockNum + orderGoodsEntity.getNumber());
                         goodsEntity.setSellVolume(Integer.parseInt(goodsSellVolume.toString()));
                         goodsDao.update(goodsEntity);
+                        
+                        MngChangeEntity mngChangeEntity = new MngChangeEntity();
+                        mngChangeEntity.setGoodsId(Integer.parseInt(String.valueOf(goodsEntity.getId())));
+                        mngChangeEntity.setThirdPartyMerchCode(goodsEntity.getThirdPartyMerchCode());
+                        mngChangeEntity.setChangeReason(changeReason);
+                        mngChangeEntity.setChangeType(Dict.changeType.item_0.getItem());
+                        mngChangeEntity.setChangeNum(orderGoodsEntity.getNumber());//变化数
+                        mngChangeEntity.setOriginalNum(stockNum);//原库存数
+                        mngChangeEntity.setValidNum(stockNum + orderGoodsEntity.getNumber());//可用数
+                        mngChangeEntity.setCreateTime(new Date());
+                        mngChangeEntity.setModTime(new Date());
+                        mngChangeEntity.setCreaterSn(user.getUsername());
+                        mngChangeEntity.setModerSn(user.getUsername());
+                        mngChangeEntity.setIsValid(0);
+                        mngChangeEntity.setMerchSn(goodsEntity.getMerchSn());
+                        mngChangeDao.save(mngChangeEntity);
                     }
                 }
                 if (storeRelaEntity.getIsStockShare().equalsIgnoreCase(Dict.isStockShare.item_0.getItem())) {
@@ -437,6 +457,22 @@ public class OrderServiceImpl implements OrderService {
                     storeRelaEntity.setSellVolume(Integer.parseInt(sellVolume.toString()));
                     storeRelaEntity.setStockNum(stockNum + orderGoodsEntity.getNumber());//库存数量
                     productStoreRelaDao.update(storeRelaEntity);
+
+                    StoreMngChangeEntity storeMngChangeEntity = new StoreMngChangeEntity();
+                    storeMngChangeEntity.setChangeType(Dict.changeType.item_0.getItem());
+                    storeMngChangeEntity.setChangeReason(changeReason);
+                    storeMngChangeEntity.setGoodsId(Integer.parseInt(String.valueOf(storeRelaEntity.getGoodsId())));
+                    storeMngChangeEntity.setStoreId(Integer.parseInt(String.valueOf(storeRelaEntity.getStoreId())));
+                    storeMngChangeEntity.setMerchSn(storeRelaEntity.getMerchSn());
+                    storeMngChangeEntity.setCreateTime(new Date());
+                    storeMngChangeEntity.setModTime(new Date());
+                    storeMngChangeEntity.setStoreChangeNum(orderGoodsEntity.getNumber());
+                    storeMngChangeEntity.setStoreOriginalNum(stockNum);
+                    storeMngChangeEntity.setStoreValidNum(stockNum + orderGoodsEntity.getNumber());
+                    storeMngChangeEntity.setCreaterSn(user.getUsername());
+                    storeMngChangeEntity.setModerSn(user.getUsername());
+                    storeMngChangeEntity.setIsValid(0);
+                    storeMngChangeDao.save(storeMngChangeEntity);
                 }
             }else {
                 //还原门店库存
@@ -448,6 +484,22 @@ public class OrderServiceImpl implements OrderService {
                 storeRelaEntity.setSellVolume(Integer.parseInt(sellVolume.toString()));
                 storeRelaEntity.setStockNum(stockNum + orderGoodsEntity.getNumber());//库存数量
                 productStoreRelaDao.update(storeRelaEntity);
+
+                StoreMngChangeEntity storeMngChangeEntity = new StoreMngChangeEntity();
+                storeMngChangeEntity.setChangeType(Dict.changeType.item_0.getItem());
+                storeMngChangeEntity.setChangeReason(changeReason);
+                storeMngChangeEntity.setGoodsId(Integer.parseInt(String.valueOf(storeRelaEntity.getGoodsId())));
+                storeMngChangeEntity.setStoreId(Integer.parseInt(String.valueOf(storeRelaEntity.getStoreId())));
+                storeMngChangeEntity.setMerchSn(storeRelaEntity.getMerchSn());
+                storeMngChangeEntity.setStoreChangeNum(orderGoodsEntity.getNumber());
+                storeMngChangeEntity.setStoreOriginalNum(stockNum);
+                storeMngChangeEntity.setStoreValidNum(stockNum + orderGoodsEntity.getNumber());
+                storeMngChangeEntity.setCreateTime(new Date());
+                storeMngChangeEntity.setModTime(new Date());
+                storeMngChangeEntity.setCreaterSn(user.getUsername());
+                storeMngChangeEntity.setModerSn(user.getUsername());
+                storeMngChangeEntity.setIsValid(0);
+                storeMngChangeDao.save(storeMngChangeEntity);
             }
         }
     }

+ 45 - 0
kmall-admin/src/main/java/com/kmall/admin/service/impl/ProductStoreRelaServiceImpl.java

@@ -49,6 +49,8 @@ public class ProductStoreRelaServiceImpl implements ProductStoreRelaService {
     private GoodsAttributeDao goodsAttributeDao;
     @Autowired
     private AttributeDao attributeDao;
+    @Autowired
+    private StoreMngChangeDao storeMngChangeDao;
 
     @Override
     public ProductStoreRelaEntity queryObject(Integer id) {
@@ -203,6 +205,23 @@ public class ProductStoreRelaServiceImpl implements ProductStoreRelaService {
             }
         }
 
+        //新增库存操作记录
+        StoreMngChangeEntity storeMngChangeEntity = new StoreMngChangeEntity();
+        storeMngChangeEntity.setChangeType(Dict.changeType.item_2.getItem());
+        storeMngChangeEntity.setChangeReason("新增门店商品");
+        storeMngChangeEntity.setGoodsId(Integer.parseInt(String.valueOf(productStoreRela.getGoodsId())));
+        storeMngChangeEntity.setStoreId(Integer.parseInt(String.valueOf(productStoreRela.getStoreId())));
+        storeMngChangeEntity.setMerchSn(productStoreRela.getMerchSn());
+        storeMngChangeEntity.setCreateTime(new Date());
+        storeMngChangeEntity.setModTime(new Date());
+        storeMngChangeEntity.setStoreChangeNum(productStoreRela.getStockNum());
+        storeMngChangeEntity.setStoreOriginalNum(0);
+        storeMngChangeEntity.setStoreValidNum(productStoreRela.getStockNum());
+        storeMngChangeEntity.setCreaterSn(user.getUsername());
+        storeMngChangeEntity.setModerSn(user.getUsername());
+        storeMngChangeEntity.setIsValid(0);
+        storeMngChangeDao.save(storeMngChangeEntity);
+
         productStoreRela.setAttributeCategory(categoryDao.queryObject(productStoreRela.getCategoryId()).getParentId());
         productStoreRela.setProductId(product.getId());
         productStoreRela.setGoodsBizType(goodsEntity.getGoodsBizType());
@@ -324,6 +343,32 @@ public class ProductStoreRelaServiceImpl implements ProductStoreRelaService {
                 cartDao.update(cartEntity);
             }
         }
+        StoreMngChangeEntity storeMngChangeEntity = new StoreMngChangeEntity();
+        storeMngChangeEntity.setChangeType(Dict.changeType.item_3.getItem());
+        storeMngChangeEntity.setChangeReason("更新门店商品库存");
+        storeMngChangeEntity.setGoodsId(Integer.parseInt(String.valueOf(productStoreRela.getGoodsId())));
+        storeMngChangeEntity.setStoreId(Integer.parseInt(String.valueOf(productStoreRela.getStoreId())));
+        storeMngChangeEntity.setMerchSn(productStoreRela.getMerchSn());
+        storeMngChangeEntity.setCreateTime(new Date());
+        storeMngChangeEntity.setModTime(new Date());
+        storeMngChangeEntity.setCreaterSn(user.getUsername());
+        storeMngChangeEntity.setModerSn(user.getUsername());
+
+        ProductStoreRelaEntity productStoreRelaEntity = productStoreRelaDao.queryObject(productStoreRela.getId());
+        Integer orginalNum = productStoreRelaEntity.getStockNum();//原有库存
+        Integer changeNum = productStoreRela.getStockNum();//前端变化库存
+        if(changeNum != orginalNum) {
+            if (orginalNum > changeNum) {
+                storeMngChangeEntity.setStoreChangeNum(orginalNum - changeNum);//变化数
+                storeMngChangeEntity.setChangeType(Dict.changeType.item_4.getItem());
+            } else {
+                storeMngChangeEntity.setStoreChangeNum(changeNum - orginalNum);//变化数
+                storeMngChangeEntity.setChangeType(Dict.changeType.item_3.getItem());
+            }
+            storeMngChangeEntity.setStoreOriginalNum(orginalNum);//原库存数
+            storeMngChangeEntity.setStoreValidNum(changeNum);//可用数
+            storeMngChangeDao.save(storeMngChangeEntity);
+        }
 
         productStoreRela.setAttributeCategory(categoryDao.queryObject(productStoreRela.getCategoryId()).getParentId());
         productStoreRela.setModerSn(user.getUserId().toString());

+ 58 - 0
kmall-admin/src/main/java/com/kmall/admin/service/impl/StoreMngChangeServiceImpl.java

@@ -0,0 +1,58 @@
+package com.kmall.admin.service.impl;
+
+import com.kmall.admin.dao.StoreMngChangeDao;
+import com.kmall.admin.entity.StoreMngChangeEntity;
+import com.kmall.admin.service.StoreMngChangeService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 门店库存变化表Service实现类
+ *
+ * @author emato
+ * @email admin@qhdswl.com
+ * @date 2019-03-11 10:29:49
+ */
+@Service("storeMngChangeService")
+public class StoreMngChangeServiceImpl implements StoreMngChangeService {
+    @Autowired
+    private StoreMngChangeDao storeMngChangeDao;
+
+    @Override
+    public StoreMngChangeEntity queryObject(Integer id) {
+        return storeMngChangeDao.queryObject(id);
+    }
+
+    @Override
+    public List<StoreMngChangeEntity> queryList(Map<String, Object> map) {
+        return storeMngChangeDao.queryList(map);
+    }
+
+    @Override
+    public int queryTotal(Map<String, Object> map) {
+        return storeMngChangeDao.queryTotal(map);
+    }
+
+    @Override
+    public int save(StoreMngChangeEntity storeMngChange) {
+        return storeMngChangeDao.save(storeMngChange);
+    }
+
+    @Override
+    public int update(StoreMngChangeEntity storeMngChange) {
+        return storeMngChangeDao.update(storeMngChange);
+    }
+
+    @Override
+    public int delete(Integer id) {
+        return storeMngChangeDao.delete(id);
+    }
+
+    @Override
+    public int deleteBatch(Integer[]ids) {
+        return storeMngChangeDao.deleteBatch(ids);
+    }
+}

+ 54 - 54
kmall-admin/src/main/resources/logback.xml

@@ -1,50 +1,50 @@
-<?xml version="1.0" encoding="UTF-8"?>
+<?xml version="1.0" encoding="GBK"?>
 <!--
-scan锛氬綋姝ゅ睘鎬ц�缃�负true鏃讹紝閰嶇疆鏂囦欢濡傛灉鍙戠敓鏀瑰彉锛屽皢浼氳�閲嶆柊鍔犺浇锛岄粯璁ゅ€间负true銆�
-scanPeriod锛氳�缃�洃娴嬮厤缃�枃浠舵槸鍚︽湁淇�敼鐨勬椂闂撮棿闅旓紝濡傛灉娌℃湁缁欏嚭鏃堕棿鍗曚綅锛岄粯璁ゅ崟浣嶆槸姣��褰搒can涓簍rue鏃讹紝姝ゅ睘鎬х敓鏁堛€傞粯璁ょ殑鏃堕棿闂撮殧涓�1鍒嗛挓銆�
-debug锛氬綋姝ゅ睘鎬ц�缃�负true鏃讹紝灏嗘墦鍗板嚭logback鍐呴儴鏃ュ織淇℃伅锛屽疄鏃舵煡鐪媗ogback杩愯�鐘舵€併€傞粯璁ゅ€间负false銆�
+scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true。
+scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒当scan为true时,此属性生效。默认的时间间隔为1分钟。
+debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。
 -->
 <configuration scan="false" scanPeriod="60 seconds" debug="false">
 
     <property name="LOG_HOME" value="/data/logs/kmall-pt/kmall-admin/"/>
-    <!-- 瀹氫箟鏃ュ織鐨勬牴鐩�綍 -->
+    <!-- 定义日志的根目录 -->
     <property name="TRACE_DIR" value="trace" />
     <property name="DEBUG_DIR" value="debug" />
     <property name="INFO_DIR" value="info" />
     <property name="WARN_DIR" value="warn" />
     <property name="ERROR_DIR" value="error" />
-    <!-- 瀹氫箟鏃ュ織鏂囦欢鍚嶇О -->
+    <!-- 定义日志文件名称 -->
     <property name="TRACE_FILE_NAME" value="kmall-admin-trace"></property>
     <property name="DEBUG_FILE_NAME" value="kmall-admin-debug"></property>
     <property name="INFO_FILE_NAME" value="kmall-admin-info"></property>
     <property name="WARN_FILE_NAME" value="kmall-admin-warn"></property>
     <property name="ERROR_FILE_NAME" value="kmall-admin-error"></property>
 
-    <!-- 瀹氫箟鏃ュ織绾у埆棰滆壊 -->
-    <!-- 鎺у埗鍙版樉绀� -->
+    <!-- 定义日志级别颜色 -->
+    <!-- 控制台显示 -->
     <property name="STD_CONSOLE_LOG_PATTERN"
               value="%d{yyyy-MM-dd HH:mm:ss.SSS}[%yellow(%thread)]-[%highlight(%-5level)][%green(%logger{70}):%cyan(%line)] - %msg%n"/>
 
-    <!-- 鏃ュ織鏂囦欢鎵撳嵃 -->
+    <!-- 日志文件打印 -->
     <property name="CONSOLE_LOG_PATTERN"
               value="%d{yyyy-MM-dd HH:mm:ss.SSS}[%thread]-[%-5level][%logger{70}:%line] - %msg%n"/>
 
-    <!-- ConsoleAppender 鎺у埗鍙拌緭鍑� appender -->
+    <!-- ConsoleAppender 控制台输出 appender -->
     <appender name="stdoutAppender" class="ch.qos.logback.core.ConsoleAppender">
         <!--
-        鏃ュ織杈撳嚭鏍煎紡锛�%d琛ㄧず鏃ユ湡鏃堕棿锛�%thread琛ㄧず绾跨▼鍚嶏紝%-5level锛氱骇鍒�粠宸︽樉绀�5涓�瓧绗﹀�搴�
-        %logger{70} 琛ㄧずlogger鍚嶅瓧鏈€闀�50涓�瓧绗︼紝鍚﹀垯鎸夌収鍙ョ偣鍒嗗壊銆� %msg锛氭棩蹇楁秷鎭�紝%n鏄�崲琛岀�
+        日志输出格式:%d表示日期时间,%thread表示线程名,%-5level:级别从左显示5个字符宽度
+        %logger{70} 表示logger名字最长50个字符,否则按照句点分割。 %msg:日志消息,%n是换行符
         -->
         <encoder>
             <pattern>${STD_CONSOLE_LOG_PATTERN}</pattern>
-            <charset>UTF-8</charset>
+            <charset>GBK</charset>
         </encoder>
     </appender>
 
 
-    <!-- TRACE 鏃ュ織 appender  -->
+    <!-- TRACE 日志 appender  -->
     <appender name="traceAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
-        <!-- 鎸囧畾鏃ュ織鏂囦欢鐨勫悕绉� -->
+        <!-- 指定日志文件的名称 -->
         <file>${LOG_HOME}/${TRACE_DIR}/${TRACE_FILE_NAME}.log</file>
         <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
             <fileNamePattern>${LOG_HOME}/${TRACE_DIR}/${TRACE_FILE_NAME}-%d{yyyy-MM-dd}-%i.log</fileNamePattern>
@@ -55,7 +55,7 @@ debug锛氬綋姝ゅ睘鎬ц�缃�负true鏃讹紝灏嗘墦鍗板嚭logback鍐呴儴鏃ュ織淇℃伅锛�
         </rollingPolicy>
         <encoder>
             <pattern>${CONSOLE_LOG_PATTERN}</pattern>
-            <charset>UTF-8</charset>
+            <charset>GBK</charset>
         </encoder>
         <filter class="ch.qos.logback.classic.filter.LevelFilter">
             <level>TRACE</level>
@@ -65,9 +65,9 @@ debug锛氬綋姝ゅ睘鎬ц�缃�负true鏃讹紝灏嗘墦鍗板嚭logback鍐呴儴鏃ュ織淇℃伅锛�
     </appender>
 
 
-    <!-- DEBUG 鏃ュ織 appender  -->
+    <!-- DEBUG 日志 appender  -->
     <appender name="debugAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
-        <!-- 鎸囧畾鏃ュ織鏂囦欢鐨勫悕绉� -->
+        <!-- 指定日志文件的名称 -->
         <file>${LOG_HOME}/${DEBUG_DIR}/${DEBUG_FILE_NAME}.log</file>
         <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
             <fileNamePattern>${LOG_HOME}/${DEBUG_DIR}/${DEBUG_FILE_NAME}-%d{yyyy-MM-dd}-%i.log</fileNamePattern>
@@ -78,7 +78,7 @@ debug锛氬綋姝ゅ睘鎬ц�缃�负true鏃讹紝灏嗘墦鍗板嚭logback鍐呴儴鏃ュ織淇℃伅锛�
         </rollingPolicy>
         <encoder>
             <pattern>${CONSOLE_LOG_PATTERN}</pattern>
-            <charset>UTF-8</charset>
+            <charset>GBK</charset>
         </encoder>
         <filter class="ch.qos.logback.classic.filter.LevelFilter">
             <level>DEBUG</level>
@@ -88,9 +88,9 @@ debug锛氬綋姝ゅ睘鎬ц�缃�负true鏃讹紝灏嗘墦鍗板嚭logback鍐呴儴鏃ュ織淇℃伅锛�
     </appender>
 
 
-    <!-- phrase 鏃ュ織 appender  -->
+    <!-- phrase 日志 appender  -->
     <appender name="infoAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
-        <!-- 鎸囧畾鏃ュ織鏂囦欢鐨勫悕绉� -->
+        <!-- 指定日志文件的名称 -->
         <file>${LOG_HOME}/${INFO_DIR}/${INFO_FILE_NAME}.log</file>
         <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
             <fileNamePattern>${LOG_HOME}/${INFO_DIR}/${INFO_FILE_NAME}-%d{yyyy-MM-dd}-%i.log</fileNamePattern>
@@ -101,7 +101,7 @@ debug锛氬綋姝ゅ睘鎬ц�缃�负true鏃讹紝灏嗘墦鍗板嚭logback鍐呴儴鏃ュ織淇℃伅锛�
         </rollingPolicy>
         <encoder>
             <pattern>${CONSOLE_LOG_PATTERN}</pattern>
-            <charset>UTF-8</charset>
+            <charset>GBK</charset>
         </encoder>
         <filter class="ch.qos.logback.classic.filter.LevelFilter">
             <level>INFO</level>
@@ -111,9 +111,9 @@ debug锛氬綋姝ゅ睘鎬ц�缃�负true鏃讹紝灏嗘墦鍗板嚭logback鍐呴儴鏃ュ織淇℃伅锛�
     </appender>
 
 
-    <!-- WARN 鏃ュ織 appender  -->
+    <!-- WARN 日志 appender  -->
     <appender name="warnAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
-        <!-- 鎸囧畾鏃ュ織鏂囦欢鐨勫悕绉� -->
+        <!-- 指定日志文件的名称 -->
         <file>${LOG_HOME}/${WARN_DIR}/${WARN_FILE_NAME}.log</file>
         <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
             <fileNamePattern>${LOG_HOME}/${WARN_DIR}/${WARN_FILE_NAME}-%d{yyyy-MM-dd}-%i.log</fileNamePattern>
@@ -124,7 +124,7 @@ debug锛氬綋姝ゅ睘鎬ц�缃�负true鏃讹紝灏嗘墦鍗板嚭logback鍐呴儴鏃ュ織淇℃伅锛�
         </rollingPolicy>
         <encoder>
             <pattern>${CONSOLE_LOG_PATTERN}</pattern>
-            <charset>UTF-8</charset>
+            <charset>GBK</charset>
         </encoder>
         <filter class="ch.qos.logback.classic.filter.LevelFilter">
             <level>WARN</level>
@@ -134,67 +134,67 @@ debug锛氬綋姝ゅ睘鎬ц�缃�负true鏃讹紝灏嗘墦鍗板嚭logback鍐呴儴鏃ュ織淇℃伅锛�
     </appender>
 
 
-    <!-- ERROR 鏃ュ織 appender  -->
+    <!-- ERROR 日志 appender  -->
     <appender name="errorAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
-        <!-- 鎸囧畾鏃ュ織鏂囦欢鐨勫悕绉� -->
+        <!-- 指定日志文件的名称 -->
         <file>${LOG_HOME}/${ERROR_DIR}/${ERROR_FILE_NAME}.log</file>
         <!--
-        褰撳彂鐢熸粴鍔ㄦ椂锛屽喅瀹� RollingFileAppender 鐨勮�涓猴紝娑夊強鏂囦欢绉诲姩鍜岄噸鍛藉悕
-        TimeBasedRollingPolicy锛� 鏈€甯哥敤鐨勬粴鍔ㄧ瓥鐣ワ紝瀹冩牴鎹�椂闂存潵鍒跺畾婊氬姩绛栫暐锛屾棦璐熻矗婊氬姩涔熻礋璐e嚭鍙戞粴鍔ㄣ€�
+        当发生滚动时,决定 RollingFileAppender 的行为,涉及文件移动和重命名
+        TimeBasedRollingPolicy: 最常用的滚动策略,它根据时间来制定滚动策略,既负责滚动也负责出发滚动。
         -->
         <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
             <!--
-            婊氬姩鏃朵骇鐢熺殑鏂囦欢鐨勫瓨鏀句綅缃�強鏂囦欢鍚嶇О %d{yyyy-MM-dd}锛氭寜澶╄繘琛屾棩蹇楁粴鍔�
-            %i锛氬綋鏂囦欢澶у皬瓒呰繃maxFileSize鏃讹紝鎸夌収i杩涜�鏂囦欢婊氬姩
+            滚动时产生的文件的存放位置及文件名称 %d{yyyy-MM-dd}:按天进行日志滚动
+            %i:当文件大小超过maxFileSize时,按照i进行文件滚动
             -->
             <fileNamePattern>${LOG_HOME}/${ERROR_DIR}/${ERROR_FILE_NAME}-%d{yyyy-MM-dd}-%i.log</fileNamePattern>
             <!--
-            鍙�€夎妭鐐癸紝鎺у埗淇濈暀鐨勫綊妗f枃浠剁殑鏈€澶ф暟閲忥紝瓒呭嚭鏁伴噺灏卞垹闄ゆ棫鏂囦欢銆傚亣璁捐�缃�瘡澶╂粴鍔�紝
-            涓攎axHistory鏄�365锛屽垯鍙�繚瀛樻渶杩�365澶╃殑鏂囦欢锛屽垹闄や箣鍓嶇殑鏃ф枃浠躲€傛敞鎰忥紝鍒犻櫎鏃ф枃浠舵槸锛�
-            閭d簺涓轰簡褰掓。鑰屽垱寤虹殑鐩�綍涔熶細琚�垹闄ゃ€�
+            可选节点,控制保留的归档文件的最大数量,超出数量就删除旧文件。假设设置每天滚动,
+            且maxHistory是365,则只保存最近365天的文件,删除之前的旧文件。注意,删除旧文件是,
+            那些为了归档而创建的目录也会被删除。
             -->
             <MaxHistory>365</MaxHistory>
             <!--
-            褰撴棩蹇楁枃浠惰秴杩噈axFileSize鎸囧畾鐨勫ぇ灏忔槸锛屾牴鎹�笂闈㈡彁鍒扮殑%i杩涜�鏃ュ織鏂囦欢婊氬姩 娉ㄦ剰姝ゅ�閰嶇疆SizeBasedTriggeringPolicy鏄�棤娉曞疄鐜版寜鏂囦欢澶у皬杩涜�婊氬姩鐨勶紝蹇呴』閰嶇疆timeBasedFileNamingAndTriggeringPolicy
+            当日志文件超过maxFileSize指定的大小是,根据上面提到的%i进行日志文件滚动 注意此处配置SizeBasedTriggeringPolicy是无法实现按文件大小进行滚动的,必须配置timeBasedFileNamingAndTriggeringPolicy
             -->
             <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                 <maxFileSize>10MB</maxFileSize>
             </timeBasedFileNamingAndTriggeringPolicy>
         </rollingPolicy>
         <!--
-        鏃ュ織杈撳嚭鏍煎紡锛�%d琛ㄧず鏃ユ湡鏃堕棿锛�%thread琛ㄧず绾跨▼鍚嶏紝%-5level锛氱骇鍒�粠宸︽樉绀�5涓�瓧绗﹀�搴� %logger{70} 琛ㄧずlogger鍚嶅瓧鏈€闀�50涓�瓧绗︼紝鍚﹀垯鎸夌収鍙ョ偣鍒嗗壊銆� %msg锛氭棩蹇楁秷鎭�紝%n鏄�崲琛岀�
+        日志输出格式:%d表示日期时间,%thread表示线程名,%-5level:级别从左显示5个字符宽度 %logger{70} 表示logger名字最长50个字符,否则按照句点分割。 %msg:日志消息,%n是换行符
         -->
         <encoder>
             <pattern>${CONSOLE_LOG_PATTERN}</pattern>
-            <charset>UTF-8</charset>
+            <charset>GBK</charset>
         </encoder>
         <!--
-        杩囨护鍣ㄨ繑鍥炴灇涓撅細DENY锛孨EUTRAL锛孉CCEPT銆�
-        杩斿洖DENY锛屾棩蹇楀皢绔嬪嵆琚�姏寮冧笉鍐嶇粡杩囧叾浠栬繃婊ゅ櫒锛涜繑鍥濶EUTRAL锛屾湁搴忓垪琛ㄩ噷鐨勪笅涓�繃婊ゅ櫒杩囨帴鐫€澶勭悊鏃ュ織锛涜繑鍥濧CCEPT锛屾棩蹇椾細琚�珛鍗冲�鐞嗕笉鍐嶇粡杩囧墿浣欒繃婊ゅ櫒銆�
-        LevelFilter锛� 绾у埆杩囨护鍣�紝鏍规嵁鏃ュ織绾у埆杩涜�杩囨护銆傚�鏋滄棩蹇楃骇鍒�瓑浜庨厤缃�骇鍒�紝杩囨护鍣ㄤ細鏍规嵁onMath 鍜� onMismatch鎺ユ敹鎴栨嫆缁濇棩蹇椼€傝妭鐐癸細level锛宱nMatch锛宱nMismatch
+        过滤器返回枚举:DENY,NEUTRAL,ACCEPT。
+        返回DENY,日志将立即被抛弃不再经过其他过滤器;返回NEUTRAL,有序列表里的下个过滤器过接着处理日志;返回ACCEPT,日志会被立即处理不再经过剩余过滤器。
+        LevelFilter: 级别过滤器,根据日志级别进行过滤。如果日志级别等于配置级别,过滤器会根据onMath 和 onMismatch接收或拒绝日志。节点:level,onMatch,onMismatch
         -->
-        <filter class="ch.qos.logback.classic.filter.LevelFilter"><!-- 鍙�墦鍗伴敊璇�棩蹇� -->
-            <!-- 璁剧疆杩囨护绾у埆 -->
+        <filter class="ch.qos.logback.classic.filter.LevelFilter"><!-- 只打印错误日志 -->
+            <!-- 设置过滤级别 -->
             <level>ERROR</level>
-            <!-- 閰嶇疆绗﹀悎杩囨护鏉′欢鐨勬搷浣�
+            <!-- 配置符合过滤条件的操作
             <onMatch>ACCEPT</onMatch>
-            &lt;!&ndash; 閰嶇疆涓嶇�鍚堣繃婊ゆ潯浠剁殑鎿嶄綔 &ndash;&gt;
+            &lt;!&ndash; 配置不符合过滤条件的操作 &ndash;&gt;
             <onMismatch>DENY</onMismatch>-->
         </filter>
     </appender>
 
 
     <!--
-    logger涓昏�鐢ㄤ簬瀛樻斁鏃ュ織瀵硅薄锛屼篃鍙�互瀹氫箟鏃ュ織绫诲瀷銆佺骇鍒�
-    name锛氳〃绀哄尮閰嶇殑logger绫诲瀷鍓嶇紑锛屼篃灏辨槸鍖呯殑鍓嶅崐閮ㄥ垎
-    level锛氳�璁板綍鐨勬棩蹇楃骇鍒�紝澶у皬鍐欐棤鍏筹紝鍖呮嫭 TRACE锛孌EBUG锛孖NFO锛學ARN锛孍RROR锛孉LL 鍜� OFF銆�
-    additivity锛氭槸鍚﹀悜涓婄骇loger浼犻€掓墦鍗颁俊鎭�€傞粯璁ゆ槸true銆� 浣滅敤鍦ㄤ簬children-logger鏄�惁鍚戜笂绾�oot-logger閰嶇疆鐨刟ppender浼犻€掓墦鍗颁俊鎭�紝false锛氫笉浼犻€掞紝true锛氫紶閫�
+    logger主要用于存放日志对象,也可以定义日志类型、级别
+    name:表示匹配的logger类型前缀,也就是包的前半部分
+    level:要记录的日志级别,大小写无关,包括 TRACE,DEBUG,INFO,WARN,ERROR,ALL 和 OFF。
+    additivity:是否向上级loger传递打印信息。默认是true。 作用在于children-logger是否向上级root-logger配置的appender传递打印信息,false:不传递,true:传递
     -->
     <!--
-    娌¤�缃甽evel锛岀户鎵夸粬鐨勪笂绾�<root>鐨勬棩蹇楃骇鍒�紱
-    娌℃湁璁剧疆additivity锛岄粯璁や负true锛屽皢姝�oger鐨勬墦鍗颁俊鎭�悜涓婄骇<root>浼犻€掞紱
-    娌℃湁璁剧疆appender锛屾�loger鏈�韩涓嶆墦鍗颁换浣曚俊鎭�紱
-    瀛�<logger>鍚�<root>浼犻€掍俊鎭�悗锛屾棩蹇條evel 瀹屽叏鐢卞瓙绾у埆鐨刲evel 鍐冲畾锛�
+    没设置level,继承他的上级<root>的日志级别;
+    没有设置additivity,默认为true,将此loger的打印信息向上级<root>传递;
+    没有设置appender,此loger本身不打印任何信息;
+    子<logger>向<root>传递信息后,日志level 完全由子级别的level 决定;
     -->
 
     <logger name="org.apache" level="ERROR"/>
@@ -214,8 +214,8 @@ debug锛氬綋姝ゅ睘鎬ц�缃�负true鏃讹紝灏嗘墦鍗板嚭logback鍐呴儴鏃ュ織淇℃伅锛�
     <logger name="com.kmall" level="DEBUG"/>
 
     <!--
-    root涓巐ogger鏄�埗瀛愬叧绯伙紝娌℃湁鐗瑰埆瀹氫箟鍒欓粯璁や负root锛屼换浣曚竴涓�被鍙�細鍜屼竴涓猯ogger瀵瑰簲锛�
-    瑕佷箞鏄�畾涔夌殑logger锛岃�涔堟槸root锛屽垽鏂�殑鍏抽敭鍦ㄤ簬鎵惧埌杩欎釜logger锛岀劧鍚庡垽鏂�繖涓猯ogger鐨刲evel鍜宎ppender銆�
+    root与logger是父子关系,没有特别定义则默认为root,任何一个类只会和一个logger对应,
+    要么是定义的logger,要么是root,判断的关键在于找到这个logger,然后判断这个logger的level和appender。
     -->
     <root level="DEBUG" >
         <appender-ref ref="stdoutAppender" />

+ 184 - 0
kmall-admin/src/main/resources/mybatis/mapper/MngChangeDao.xml

@@ -0,0 +1,184 @@
+<?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.MngChangeDao">
+
+    <resultMap type="com.kmall.admin.entity.MngChangeEntity" id="mngChangeMap">
+        <result property="id" column="id"/>
+        <result property="changeNum" column="change_num"/>
+        <result property="originalNum" column="original_num"/>
+        <result property="validNum" column="valid_num"/>
+        <result property="merchSn" column="merch_sn"/>
+        <result property="thirdPartyMerchCode" column="third_party_merch_code"/>
+        <result property="goodsId" column="goods_id"/>
+        <result property="isValid" column="is_valid"/>
+        <result property="changeType" column="change_type"/>
+        <result property="changeReason" column="change_reason"/>
+        <result property="createrSn" column="creater_sn"/>
+        <result property="createTime" column="create_time"/>
+        <result property="moderSn" column="moder_sn"/>
+        <result property="modTime" column="mod_time"/>
+        <result property="tstm" column="tstm"/>
+    </resultMap>
+
+	<select id="queryObject" resultType="com.kmall.admin.entity.MngChangeEntity">
+		select
+			`id`,
+			`change_num`,
+			`original_num`,
+			`valid_num`,
+			`merch_sn`,
+			`third_party_merch_code`,
+			`goods_id`,
+			`is_valid`,
+			`change_type`,
+			`change_reason`,
+			`creater_sn`,
+			`create_time`,
+			`moder_sn`,
+			`mod_time`,
+			`tstm`
+		from mall_mng_change
+		where id = #{id}
+	</select>
+	<select id="queryObjectByGoodsIdAndType" resultType="com.kmall.admin.entity.MngChangeEntity">
+		select
+		`id`,
+		`change_num`,
+		`original_num`,
+		`valid_num`,
+		`merch_sn`,
+		`third_party_merch_code`,
+		`goods_id`,
+		`is_valid`,
+		`change_type`,
+		`change_reason`,
+		`creater_sn`,
+		`create_time`,
+		`moder_sn`,
+		`mod_time`,
+		`tstm`
+		from mall_mng_change
+		where goods_id = #{goodsId} and change_type = #{changeType}
+	</select>
+
+	<select id="queryList" resultType="com.kmall.admin.entity.MngChangeEntity">
+		select
+		c.`id`,
+		c.`change_num`,
+		c.`original_num`,
+		c.`valid_num`,
+		c.`merch_sn`,
+		c.`third_party_merch_code`,
+		c.`goods_id`,
+		c.`is_valid`,
+		c.`change_type`,
+		c.`change_reason`,
+		c.`creater_sn`,
+		c.`create_time`,
+		c.`moder_sn`,
+		c.`mod_time`,
+		c.`tstm`,
+		g.name goodsName,
+		m.merch_name merchName,
+		mb.third_party_merch_name thirdPartyMerchName
+		from mall_mng_change c left join mall_merch m on c.merch_sn = m.merch_sn
+		left join third_merchant_biz mb on c.third_party_merch_code = mb.third_party_merch_code
+		left join mall_goods g on c.goods_id = g.id
+		WHERE 1=1
+		<if test="goodsId != null and goodsId != ''">
+			AND c.goods_id = #{goodsId}
+		</if>
+		<if test="storeId != null and storeId != ''">
+			AND c.store_id = #{storeId}
+		</if>
+		<if test="changeType != null and changeType != ''">
+			AND c.change_type = #{changeType}
+		</if>
+        <choose>
+            <when test="sidx != null and sidx.trim() != ''">
+                order by ${sidx} ${order}
+            </when>
+			<otherwise>
+                order by id desc
+			</otherwise>
+        </choose>
+		<if test="offset != null and limit != null">
+			limit #{offset}, #{limit}
+		</if>
+	</select>
+	
+ 	<select id="queryTotal" resultType="int">
+		select count(*) from mall_mng_change
+		WHERE 1=1
+        <if test="name != null and name.trim() != ''">
+            AND name LIKE concat('%',#{name},'%')
+        </if>
+	</select>
+	 
+	<insert id="save" parameterType="com.kmall.admin.entity.MngChangeEntity">
+		insert into mall_mng_change(
+			`change_num`,
+			`original_num`,
+			`valid_num`,
+			`merch_sn`,
+			`third_party_merch_code`,
+			`goods_id`,
+			`is_valid`,
+			`change_type`,
+			`change_reason`,
+			`creater_sn`,
+			`create_time`,
+			`moder_sn`,
+			`mod_time`,
+			`tstm`)
+		values(
+			#{changeNum},
+			#{originalNum},
+			#{validNum},
+			#{merchSn},
+			#{thirdPartyMerchCode},
+			#{goodsId},
+			#{isValid},
+			#{changeType},
+			#{changeReason},
+			#{createrSn},
+			#{createTime},
+			#{moderSn},
+			#{modTime},
+			#{tstm})
+	</insert>
+	 
+	<update id="update" parameterType="com.kmall.admin.entity.MngChangeEntity">
+		update mall_mng_change 
+		<set>
+			<if test="changeNum != null">`change_num` = #{changeNum}, </if>
+			<if test="originalNum != null">`original_num` = #{originalNum}, </if>
+			<if test="validNum != null">`valid_num` = #{validNum}, </if>
+			<if test="merchSn != null">`merch_sn` = #{merchSn}, </if>
+			<if test="thirdPartyMerchCode != null">`third_party_merch_code` = #{thirdPartyMerchCode}, </if>
+			<if test="goodsId != null">`goods_id` = #{goodsId}, </if>
+			<if test="isValid != null">`is_valid` = #{isValid}, </if>
+			<if test="changeType != null">`change_type` = #{changeType}, </if>
+			<if test="changeReason != null">`change_reason` = #{changeReason}, </if>
+			<if test="createrSn != null">`creater_sn` = #{createrSn}, </if>
+			<if test="createTime != null">`create_time` = #{createTime}, </if>
+			<if test="moderSn != null">`moder_sn` = #{moderSn}, </if>
+			<if test="modTime != null">`mod_time` = #{modTime}, </if>
+			<if test="tstm != null">`tstm` = #{tstm}</if>
+		</set>
+		where id = #{id}
+	</update>
+	
+	<delete id="delete">
+		delete from mall_mng_change where id = #{value}
+	</delete>
+	
+	<delete id="deleteBatch">
+		delete from mall_mng_change where id in 
+		<foreach item="id" collection="array" open="(" separator="," close=")">
+			#{id}
+		</foreach>
+	</delete>
+
+</mapper>

+ 184 - 0
kmall-admin/src/main/resources/mybatis/mapper/StoreMngChangeDao.xml

@@ -0,0 +1,184 @@
+<?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.StoreMngChangeDao">
+
+    <resultMap type="com.kmall.admin.entity.StoreMngChangeEntity" id="storeMngChangeMap">
+        <result property="id" column="id"/>
+        <result property="storeChangeNum" column="store_change_num"/>
+        <result property="storeOriginalNum" column="store_original_num"/>
+        <result property="storeValidNum" column="store_valid_num"/>
+        <result property="merchSn" column="merch_sn"/>
+        <result property="storeId" column="store_id"/>
+        <result property="goodsId" column="goods_id"/>
+        <result property="isValid" column="is_valid"/>
+        <result property="changeType" column="change_type"/>
+        <result property="changeReason" column="change_reason"/>
+        <result property="createrSn" column="creater_sn"/>
+        <result property="createTime" column="create_time"/>
+        <result property="moderSn" column="moder_sn"/>
+        <result property="modTime" column="mod_time"/>
+        <result property="tstm" column="tstm"/>
+    </resultMap>
+
+	<select id="queryObject" resultType="com.kmall.admin.entity.StoreMngChangeEntity">
+		select
+			`id`,
+			`store_change_num`,
+			`store_original_num`,
+			`store_valid_num`,
+			`merch_sn`,
+			`store_id`,
+			`goods_id`,
+			`is_valid`,
+			`change_type`,
+			`change_reason`,
+			`creater_sn`,
+			`create_time`,
+			`moder_sn`,
+			`mod_time`,
+			`tstm`
+		from mall_store_mng_change
+		where id = #{id}
+	</select>
+
+	<select id="queryObjectByGoodsIdAndType" resultType="com.kmall.admin.entity.StoreMngChangeEntity">
+		select
+		`id`,
+		`store_change_num`,
+		`store_original_num`,
+		`store_valid_num`,
+		`merch_sn`,
+		`store_id`,
+		`goods_id`,
+		`is_valid`,
+		`change_type`,
+		`change_reason`,
+		`creater_sn`,
+		`create_time`,
+		`moder_sn`,
+		`mod_time`,
+		`tstm`
+		from mall_store_mng_change
+		where change_type = #{changeType} and goods_id = #{goodsId}
+	</select>
+
+	<select id="queryList" resultType="com.kmall.admin.entity.StoreMngChangeEntity">
+		select
+			c.`id`,
+			c.`store_change_num`,
+			c.`store_original_num`,
+			c.`store_valid_num`,
+			c.`merch_sn`,
+			c.`store_id`,
+			c.`goods_id`,
+			c.`is_valid`,
+			c.`change_type`,
+			c.`change_reason`,
+			c.`creater_sn`,
+			c.`create_time`,
+			c.`moder_sn`,
+    		c.`mod_time`,
+			s.store_name storeName,
+			g.name goodsName,
+			m.merch_name merchName
+		from mall_store_mng_change c left join mall_merch m on c.merch_sn = m.merch_sn
+		left join mall_store s on s.id = c.store_id
+		left join mall_goods g on c.goods_id = g.id
+		WHERE 1=1
+		<if test="goodsId != null and goodsId != ''">
+			AND c.goods_id = #{goodsId}
+		</if>
+		<if test="storeId != null and storeId != ''">
+			AND c.store_id = #{storeId}
+		</if>
+		<if test="changeType != null and changeType != ''">
+			AND c.change_type = #{changeType}
+		</if>
+        <choose>
+            <when test="sidx != null and sidx.trim() != ''">
+                order by ${sidx} ${order}
+            </when>
+			<otherwise>
+                order by id desc
+			</otherwise>
+        </choose>
+		<if test="offset != null and limit != null">
+			limit #{offset}, #{limit}
+		</if>
+	</select>
+	
+ 	<select id="queryTotal" resultType="int">
+		select count(*) from mall_store_mng_change
+		WHERE 1=1
+        <if test="name != null and name.trim() != ''">
+            AND name LIKE concat('%',#{name},'%')
+        </if>
+	</select>
+	 
+	<insert id="save" parameterType="com.kmall.admin.entity.StoreMngChangeEntity">
+		insert into mall_store_mng_change(
+			`store_change_num`,
+			`store_original_num`,
+			`store_valid_num`,
+			`merch_sn`,
+			`store_id`,
+			`goods_id`,
+			`is_valid`,
+			`change_type`,
+			`change_reason`,
+			`creater_sn`,
+			`create_time`,
+			`moder_sn`,
+			`mod_time`,
+			`tstm`)
+		values(
+			#{storeChangeNum},
+			#{storeOriginalNum},
+			#{storeValidNum},
+			#{merchSn},
+			#{storeId},
+			#{goodsId},
+			#{isValid},
+			#{changeType},
+			#{changeReason},
+			#{createrSn},
+			#{createTime},
+			#{moderSn},
+			#{modTime},
+			#{tstm})
+	</insert>
+	 
+	<update id="update" parameterType="com.kmall.admin.entity.StoreMngChangeEntity">
+		update mall_store_mng_change 
+		<set>
+			<if test="storeChangeNum != null">`store_change_num` = #{storeChangeNum}, </if>
+			<if test="storeOriginalNum != null">`store_original_num` = #{storeOriginalNum}, </if>
+			<if test="storeValidNum != null">`store_valid_num` = #{storeValidNum}, </if>
+			<if test="merchSn != null">`merch_sn` = #{merchSn}, </if>
+			<if test="storeId != null">`store_id` = #{storeId}, </if>
+			<if test="goodsId != null">`goods_id` = #{goodsId}, </if>
+			<if test="isValid != null">`is_valid` = #{isValid}, </if>
+			<if test="changeType != null">`change_type` = #{changeType}, </if>
+			<if test="changeReason != null">`change_reason` = #{changeReason}, </if>
+			<if test="createrSn != null">`creater_sn` = #{createrSn}, </if>
+			<if test="createTime != null">`create_time` = #{createTime}, </if>
+			<if test="moderSn != null">`moder_sn` = #{moderSn}, </if>
+			<if test="modTime != null">`mod_time` = #{modTime}, </if>
+			<if test="tstm != null">`tstm` = #{tstm}</if>
+		</set>
+		where id = #{id}
+	</update>
+	
+	<delete id="delete">
+		delete from mall_store_mng_change where id = #{value}
+	</delete>
+	
+	<delete id="deleteBatch">
+		delete from mall_store_mng_change where id in 
+		<foreach item="id" collection="array" open="(" separator="," close=")">
+			#{id}
+		</foreach>
+	</delete>
+
+</mapper>

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

@@ -89,7 +89,7 @@
 		from third_merchant_biz
 		WHERE 1=1
 		<if test="name != null and name.trim() != ''">
-			AND name LIKE concat('%',#{name},'%')
+			AND third_party_merch_name LIKE concat('%',#{name},'%')
 		</if>
 		<if test="merchSn != null and merchSn.trim() != ''">
 			and merch_sn = #{merchSn}
@@ -114,7 +114,7 @@
 		select count(*) from third_merchant_biz
 		WHERE 1=1
         <if test="name != null and name.trim() != ''">
-            AND name LIKE concat('%',#{name},'%')
+            AND third_party_merch_name LIKE concat('%',#{name},'%')
         </if>
 		<if test="merchSn != null and merchSn.trim() != ''">
 			and merch_sn = #{merchSn}

+ 99 - 0
kmall-admin/src/main/webapp/WEB-INF/page/shop/mngchange.html

@@ -0,0 +1,99 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <title>库存变化表</title>
+    #parse("sys/header.html")
+</head>
+<body>
+<div id="rrapp" v-cloak>
+	<div v-show="showList">
+        <Row :gutter="16">
+            <div class="search-group">
+                <i-col span="4">
+                    <i-select v-model="q.goodsId" filterable placeholder="商品" label-in-value>
+                        <i-option v-for="goods in goodss" :value="goods.id" :key="goods.id">{{goods.name}}</i-option>
+                    </i-select>
+                </i-col>
+                <i-col span="4">
+                    <i-select v-model="q.changeType" placeholder="库存变动类型"
+                              label-in-value>
+                        <i-option v-for="macro in macros" :value="macro.value" :key="macro.id">{{macro.name}}
+                        </i-option>
+                    </i-select>
+                </i-col>
+                <i-button @click="query">查询</i-button>
+                <i-button @click="reloadSearch">重置</i-button>
+            </div>
+            <div class="buttons-group">
+                #if($shiro.hasPermission("mngchange:save"))
+                <i-button type="info" @click="add"><i class="fa fa-plus"></i>&nbsp;新增</i-button>
+                #end
+                #if($shiro.hasPermission("mngchange:update"))
+                <i-button type="warning" @click="update"><i class="fa fa-pencil-square-o"></i>&nbsp;修改</i-button>
+                #end
+                #if($shiro.hasPermission("mngchange:delete"))
+                <i-button type="error" @click="del"><i class="fa fa-trash-o"></i>&nbsp;删除</i-button>
+                #end
+            </div>
+        </Row>
+	    <table id="jqGrid"></table>
+	    <div id="jqGridPager"></div>
+    </div>
+
+    <Card v-show="!showList">
+        <p slot="title">{{title}}</p>
+		<i-form ref="formValidate" :model="mngChange" :rules="ruleValidate" :label-width="80">
+            <Form-item label="商品库存变化数" prop="changeNum">
+                <i-input v-model="mngChange.changeNum" placeholder="商品库存变化数"/>
+            </Form-item>
+            <Form-item label="商品原库存数" prop="originalNum">
+                <i-input v-model="mngChange.originalNum" placeholder="商品原库存数"/>
+            </Form-item>
+            <Form-item label="商品库存可用数" prop="validNum">
+                <i-input v-model="mngChange.validNum" placeholder="商品库存可用数"/>
+            </Form-item>
+            <Form-item label="商户编号" prop="merchSn">
+                <i-input v-model="mngChange.merchSn" placeholder="商户编号"/>
+            </Form-item>
+            <Form-item label="第三方商户代码" prop="thirdPartyMerchCode">
+                <i-input v-model="mngChange.thirdPartyMerchCode" placeholder="第三方商户代码"/>
+            </Form-item>
+            <Form-item label="商品id" prop="goodsId">
+                <i-input v-model="mngChange.goodsId" placeholder="商品id"/>
+            </Form-item>
+            <Form-item label="是否有效,0:有效,1:无效" prop="isValid">
+                <i-input v-model="mngChange.isValid" placeholder="是否有效,0:有效,1:无效"/>
+            </Form-item>
+            <Form-item label="变动类型 0:还原 1:扣减" prop="changeType">
+                <i-input v-model="mngChange.changeType" placeholder="变动类型 0:还原 1:扣减"/>
+            </Form-item>
+            <Form-item label="变动原因" prop="changeReason">
+                <i-input v-model="mngChange.changeReason" placeholder="变动原因"/>
+            </Form-item>
+            <Form-item label="创建人编号" prop="createrSn">
+                <i-input v-model="mngChange.createrSn" placeholder="创建人编号"/>
+            </Form-item>
+            <Form-item label="创建时间" prop="createTime">
+                <i-input v-model="mngChange.createTime" placeholder="创建时间"/>
+            </Form-item>
+            <Form-item label="修改人编号" prop="moderSn">
+                <i-input v-model="mngChange.moderSn" placeholder="修改人编号"/>
+            </Form-item>
+            <Form-item label="修改时间" prop="modTime">
+                <i-input v-model="mngChange.modTime" placeholder="修改时间"/>
+            </Form-item>
+            <Form-item label="时间戳" prop="tstm">
+                <i-input v-model="mngChange.tstm" placeholder="时间戳"/>
+            </Form-item>
+            <Form-item>
+                <i-button type="primary" @click="handleSubmit('formValidate')">提交</i-button>
+                <i-button type="warning" @click="reload" style="margin-left: 8px"/>返回</i-button>
+                <i-button type="ghost" @click="handleReset('formValidate')" style="margin-left: 8px">重置</i-button>
+            </Form-item>
+        </i-form>
+	</Card>
+</div>
+
+<script src="${rc.contextPath}/js/shop/mngchange.js?_${date.systemTime}"></script>
+</body>
+</html>

+ 99 - 0
kmall-admin/src/main/webapp/WEB-INF/page/shop/storemngchange.html

@@ -0,0 +1,99 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <title>门店库存变化表</title>
+    #parse("sys/header.html")
+</head>
+<body>
+<div id="rrapp" v-cloak>
+	<div v-show="showList">
+        <Row :gutter="16">
+            <div class="search-group">
+                <i-col span="4">
+                    <i-select v-model="q.goodsId" filterable placeholder="商品" label-in-value>
+                        <i-option v-for="goods in goodss" :value="goods.id" :key="goods.id">{{goods.name}}</i-option>
+                    </i-select>
+                </i-col>
+                <i-col span="4">
+                    <i-select v-model="q.changeType" placeholder="库存变动类型"
+                              label-in-value>
+                        <i-option v-for="macro in macros" :value="macro.value" :key="macro.id">{{macro.name}}
+                        </i-option>
+                    </i-select>
+                </i-col>
+                <i-button @click="query">查询</i-button>
+                <i-button @click="reloadSearch">重置</i-button>
+            </div>
+            <div class="buttons-group">
+                #if($shiro.hasPermission("storemngchange:save"))
+                <i-button type="info" @click="add"><i class="fa fa-plus"></i>&nbsp;新增</i-button>
+                #end
+                #if($shiro.hasPermission("storemngchange:update"))
+                <i-button type="warning" @click="update"><i class="fa fa-pencil-square-o"></i>&nbsp;修改</i-button>
+                #end
+                #if($shiro.hasPermission("storemngchange:delete"))
+                <i-button type="error" @click="del"><i class="fa fa-trash-o"></i>&nbsp;删除</i-button>
+                #end
+            </div>
+        </Row>
+	    <table id="jqGrid"></table>
+	    <div id="jqGridPager"></div>
+    </div>
+
+    <Card v-show="!showList">
+        <p slot="title">{{title}}</p>
+		<i-form ref="formValidate" :model="storeMngChange" :rules="ruleValidate" :label-width="80">
+            <Form-item label="门店库存变化数" prop="storeChangeNum">
+                <i-input v-model="storeMngChange.storeChangeNum" placeholder="门店库存变化数"/>
+            </Form-item>
+            <Form-item label="门店原库存数" prop="storeOriginalNum">
+                <i-input v-model="storeMngChange.storeOriginalNum" placeholder="门店原库存数"/>
+            </Form-item>
+            <Form-item label="门店库存可用数" prop="storeValidNum">
+                <i-input v-model="storeMngChange.storeValidNum" placeholder="门店库存可用数"/>
+            </Form-item>
+            <Form-item label="商户编号" prop="merchSn">
+                <i-input v-model="storeMngChange.merchSn" placeholder="商户编号"/>
+            </Form-item>
+            <Form-item label="门店编号" prop="storeId">
+                <i-input v-model="storeMngChange.storeId" placeholder="门店编号"/>
+            </Form-item>
+            <Form-item label="商品id" prop="goodsId">
+                <i-input v-model="storeMngChange.goodsId" placeholder="商品id"/>
+            </Form-item>
+            <Form-item label="是否有效,0:有效,1:无效" prop="isValid">
+                <i-input v-model="storeMngChange.isValid" placeholder="是否有效,0:有效,1:无效"/>
+            </Form-item>
+            <Form-item label="变动类型 0:还原 1:扣减" prop="changeType">
+                <i-input v-model="storeMngChange.changeType" placeholder="变动类型 0:还原 1:扣减"/>
+            </Form-item>
+            <Form-item label="变动原因" prop="changeReason">
+                <i-input v-model="storeMngChange.changeReason" placeholder="变动原因"/>
+            </Form-item>
+            <Form-item label="创建人编号" prop="createrSn">
+                <i-input v-model="storeMngChange.createrSn" placeholder="创建人编号"/>
+            </Form-item>
+            <Form-item label="创建时间" prop="createTime">
+                <i-input v-model="storeMngChange.createTime" placeholder="创建时间"/>
+            </Form-item>
+            <Form-item label="修改人编号" prop="moderSn">
+                <i-input v-model="storeMngChange.moderSn" placeholder="修改人编号"/>
+            </Form-item>
+            <Form-item label="修改时间" prop="modTime">
+                <i-input v-model="storeMngChange.modTime" placeholder="修改时间"/>
+            </Form-item>
+            <Form-item label="时间戳" prop="tstm">
+                <i-input v-model="storeMngChange.tstm" placeholder="时间戳"/>
+            </Form-item>
+            <Form-item>
+                <i-button type="primary" @click="handleSubmit('formValidate')">提交</i-button>
+                <i-button type="warning" @click="reload" style="margin-left: 8px"/>返回</i-button>
+                <i-button type="ghost" @click="handleReset('formValidate')" style="margin-left: 8px">重置</i-button>
+            </Form-item>
+        </i-form>
+	</Card>
+</div>
+
+<script src="${rc.contextPath}/js/shop/storemngchange.js?_${date.systemTime}"></script>
+</body>
+</html>

+ 198 - 0
kmall-admin/src/main/webapp/js/shop/mngchange.js

@@ -0,0 +1,198 @@
+$(function () {
+    $("#jqGrid").jqGrid({
+        url: '../mngchange/list',
+        datatype: "json",
+        colModel: [
+			{label: 'id', name: 'id', index: 'id', key: true, hidden: true},
+            {label: '变动类型', name: 'changeType', index: 'change_type', width: 70, align: 'center',
+                formatter: function (value) {
+                    if (value == '0') {
+                        return '还原';
+                    } else if (value == '1') {
+                        return '扣减';
+                    } else if (value == '2') {
+                        return '新增调整';
+                    } else if (value == '3') {
+                        return '更新库存增加';
+                    } else if (value == '4') {
+                        return '更新库存减少';
+                    }
+                    return '-';
+                }
+            },
+            {label: '变动原因', name: 'changeReason', index: 'change_reason', width: 90, align: 'center'},
+			{label: '商品库存变化数', name: 'changeNum', index: 'change_num', width: 70, align: 'center'},
+			{label: '商品原库存数', name: 'originalNum', index: 'original_num', width: 65, align: 'center'},
+			{label: '商品库存可用数', name: 'validNum', index: 'valid_num', width: 70, align: 'center'},
+			{label: '所属商户', name: 'merchName', index: 'merchName', width: 70, align: 'center'},
+			{label: '第三方商户代码', name: 'thirdPartyMerchCode', index: 'third_party_merch_code', width: 70, align: 'center'},
+            {label: '第三方商户名称', name: 'thirdPartyMerchName', index: 'thirdPartyMerchName', width: 70, align: 'center'},
+            {label: '所属商品', name: 'goodsName', index: 'goodsName', width: 140, align: 'center'},
+            // {label: '是否有效', name: 'isValid', index: 'is_valid', width: 50, align: 'center',
+            //     formatter: function (value) {
+            //         if (value == '0') {
+            //             return '有效';
+            //         } else if (value == '1') {
+            //             return '无效';
+            //         }
+            //         return '-';
+            //     }
+            // },
+			{label: '创建人', name: 'createrSn', index: 'creater_sn', width: 75, align: 'center'},
+			{label: '创建时间', name: 'createTime', index: 'create_time', width: 90, align: 'center', formatter: function (value) {
+                return transDate(value,'yyyy-MM-dd hh:mm:ss');
+            }},
+			{label: '修改人', name: 'moderSn', index: 'moder_sn', width: 75, align: 'center'},
+			{label: '修改时间', name: 'modTime', index: 'mod_time', width: 90, align: 'center', formatter: function (value) {
+                return transDate(value,'yyyy-MM-dd hh:mm:ss');
+            }}],
+		viewrecords: true,
+        height: 385,
+        rowNum: 10,
+        rowList: [10, 30, 50],
+        rownumbers: true,
+        rownumWidth: 25,
+        autowidth: true,
+        multiselect: true,
+        pager: "#jqGridPager",
+        jsonReader: {
+            root: "page.list",
+            page: "page.currPage",
+            total: "page.totalPage",
+            records: "page.totalCount"
+        },
+        prmNames: {
+            page: "page",
+            rows: "limit",
+            order: "order"
+        },
+        gridComplete: function () {
+            $("#jqGrid").closest(".ui-jqgrid-bdiv").css({"overflow-x": "hidden"});
+        }
+    });
+});
+
+let vm = new Vue({
+	el: '#rrapp',
+	data: {
+        showList: true,
+        title: null,
+		mngChange: {},
+		ruleValidate: {
+			name: [
+				{required: true, message: '名称不能为空', trigger: 'blur'}
+			]
+		},
+		q: {
+            goodsId: '',
+            changeType: ''
+		},
+        goodss: [],
+        macros: []
+	},
+	methods: {
+		query: function () {
+			vm.reload();
+		},
+		add: function () {
+			vm.showList = false;
+			vm.title = "新增";
+			vm.mngChange = {};
+		},
+		update: function (event) {
+            let id = getSelectedRow();
+			if (id == null) {
+				return;
+			}
+			vm.showList = false;
+            vm.title = "修改";
+
+            vm.getInfo(id)
+		},
+		saveOrUpdate: function (event) {
+            let url = vm.mngChange.id == null ? "../mngchange/save" : "../mngchange/update";
+			$.ajax({
+				type: "POST",
+			    url: url,
+			    contentType: "application/json",
+			    data: JSON.stringify(vm.mngChange),
+                success: function (r) {
+                    if (r.code === 0) {
+                        alert('操作成功', function (index) {
+                            vm.reload();
+                        });
+                    } else {
+                        alert(r.msg);
+                    }
+                }
+			});
+		},
+		del: function (event) {
+            let ids = getSelectedRows();
+			if (ids == null){
+				return;
+			}
+
+			confirm('确定要删除选中的记录?', function () {
+				$.ajax({
+					type: "POST",
+				    url: "../mngchange/delete",
+				    contentType: "application/json",
+				    data: JSON.stringify(ids),
+				    success: function (r) {
+						if (r.code == 0) {
+							alert('操作成功', function (index) {
+								$("#jqGrid").trigger("reloadGrid");
+							});
+						} else {
+							alert(r.msg);
+						}
+					}
+				});
+			});
+		},
+		getInfo: function(id){
+			$.get("../mngchange/info/"+id, function (r) {
+                vm.mngChange = r.mngChange;
+            });
+		},
+        reloadSearch: function() {
+            vm.q = {
+                goodsId: '',
+                changeType: ''
+            }
+            vm.reload();
+		},
+		reload: function (event) {
+			vm.showList = true;
+            let page = $("#jqGrid").jqGrid('getGridParam', 'page');
+			$("#jqGrid").jqGrid('setGridParam', {
+                postData: {'goodsId': vm.q.goodsId,'changeType': vm.q.changeType},
+                page: page
+            }).trigger("reloadGrid");
+            vm.handleReset('formValidate');
+		},
+        handleSubmit: function (name) {
+            handleSubmitValidate(this, name, function () {
+                vm.saveOrUpdate()
+            });
+        },
+        handleReset: function (name) {
+            handleResetForm(this, name);
+        }
+	},
+    mounted() {
+        // this.uploadList = this.$refs.upload.fileList;
+        /*$.get("../category/getCategorySelect", function (r) {
+            vm.queryCategories = r.list;
+        });*/
+        $.get("../goods/queryAll", function (r) {
+            vm.goodss = r.list;
+        });
+
+        $.get("../sys/macro/queryMacrosByValue?value=changeType", function (r) {
+            vm.macros = r.list;
+        });
+
+    }
+});

+ 197 - 0
kmall-admin/src/main/webapp/js/shop/storemngchange.js

@@ -0,0 +1,197 @@
+$(function () {
+    $("#jqGrid").jqGrid({
+        url: '../storemngchange/list',
+        datatype: "json",
+        colModel: [
+			{label: 'id', name: 'id', index: 'id', key: true, hidden: true},
+            {label: '变动类型', name: 'changeType', index: 'change_type', width: 60,
+                formatter: function (value) {
+                    if (value == '0') {
+                        return '还原';
+                    } else if (value == '1') {
+                        return '扣减';
+                    } else if (value == '2') {
+                        return '新增调整';
+                    } else if (value == '3') {
+                        return '更新库存增加';
+                    } else if (value == '4') {
+                        return '更新库存减少';
+                    }
+                    return '-';
+                }, align: 'center'
+            },
+            {label: '变动原因', name: 'changeReason', index: 'change_reason', width: 90, align: 'center'},
+			{label: '门店库存变化数', name: 'storeChangeNum', index: 'store_change_num', width: 70, align: 'center'},
+			{label: '门店原库存数', name: 'storeOriginalNum', index: 'store_original_num', width: 65, align: 'center'},
+			{label: '门店库存可用数', name: 'storeValidNum', index: 'store_valid_num', width: 70, align: 'center'},
+			{label: '所属商户', name: 'merchName', index: 'merchName', width: 70, align: 'center'},
+			{label: '所属门店', name: 'storeName', index: 'storeName', width: 80, align: 'center'},
+			{label: '所属商品', name: 'goodsName', index: 'goodsName', width: 140, align: 'center'},
+            // {label: '是否有效', name: 'isValid', index: 'is_valid', width: 60, align: 'center',
+            //     formatter: function (value) {
+            //         if (value == '0') {
+            //             return '有效';
+            //         } else if (value == '1') {
+            //             return '无效';
+            //         }
+            //         return '-';
+            //     }
+            // },
+			{label: '创建人', name: 'createrSn', index: 'creater_sn', width: 75, align: 'center'},
+			{label: '创建时间', name: 'createTime', index: 'create_time', width: 90, align: 'center', formatter: function (value) {
+                return transDate(value,'yyyy-MM-dd hh:mm:ss');
+            }},
+			{label: '修改人', name: 'moderSn', index: 'moder_sn', width: 75, align: 'center'},
+			{label: '修改时间', name: 'modTime', index: 'mod_time', width: 90, align: 'center', formatter: function (value) {
+                return transDate(value,'yyyy-MM-dd hh:mm:ss');
+            }}],
+		viewrecords: true,
+        height: 385,
+        rowNum: 10,
+        rowList: [10, 30, 50],
+        rownumbers: true,
+        rownumWidth: 25,
+        autowidth: true,
+        multiselect: true,
+        pager: "#jqGridPager",
+        jsonReader: {
+            root: "page.list",
+            page: "page.currPage",
+            total: "page.totalPage",
+            records: "page.totalCount"
+        },
+        prmNames: {
+            page: "page",
+            rows: "limit",
+            order: "order"
+        },
+        gridComplete: function () {
+            $("#jqGrid").closest(".ui-jqgrid-bdiv").css({"overflow-x": "hidden"});
+        }
+    });
+});
+
+let vm = new Vue({
+	el: '#rrapp',
+	data: {
+        showList: true,
+        title: null,
+		storeMngChange: {},
+		ruleValidate: {
+			name: [
+				{required: true, message: '名称不能为空', trigger: 'blur'}
+			]
+		},
+		q: {
+            goodsId: '',
+            changeType: ''
+		},
+        goodss: [],
+        macros: []
+	},
+	methods: {
+		query: function () {
+			vm.reload();
+		},
+		add: function () {
+			vm.showList = false;
+			vm.title = "新增";
+			vm.storeMngChange = {};
+		},
+		update: function (event) {
+            let id = getSelectedRow();
+			if (id == null) {
+				return;
+			}
+			vm.showList = false;
+            vm.title = "修改";
+
+            vm.getInfo(id)
+		},
+		saveOrUpdate: function (event) {
+            let url = vm.storeMngChange.id == null ? "../storemngchange/save" : "../storemngchange/update";
+			$.ajax({
+				type: "POST",
+			    url: url,
+			    contentType: "application/json",
+			    data: JSON.stringify(vm.storeMngChange),
+                success: function (r) {
+                    if (r.code === 0) {
+                        alert('操作成功', function (index) {
+                            vm.reload();
+                        });
+                    } else {
+                        alert(r.msg);
+                    }
+                }
+			});
+		},
+		del: function (event) {
+            let ids = getSelectedRows();
+			if (ids == null){
+				return;
+			}
+
+			confirm('确定要删除选中的记录?', function () {
+				$.ajax({
+					type: "POST",
+				    url: "../storemngchange/delete",
+				    contentType: "application/json",
+				    data: JSON.stringify(ids),
+				    success: function (r) {
+						if (r.code == 0) {
+							alert('操作成功', function (index) {
+								$("#jqGrid").trigger("reloadGrid");
+							});
+						} else {
+							alert(r.msg);
+						}
+					}
+				});
+			});
+		},
+		getInfo: function(id){
+			$.get("../storemngchange/info/"+id, function (r) {
+                vm.storeMngChange = r.storeMngChange;
+            });
+		},
+        reloadSearch: function() {
+            vm.q = {
+                goodsId: '',
+                changeType: ''
+            }
+            vm.reload();
+		},
+		reload: function (event) {
+			vm.showList = true;
+            let page = $("#jqGrid").jqGrid('getGridParam', 'page');
+			$("#jqGrid").jqGrid('setGridParam', {
+                postData: {'goodsId': vm.q.goodsId,'changeType': vm.q.changeType},
+                page: page
+            }).trigger("reloadGrid");
+            vm.handleReset('formValidate');
+		},
+        handleSubmit: function (name) {
+            handleSubmitValidate(this, name, function () {
+                vm.saveOrUpdate()
+            });
+        },
+        handleReset: function (name) {
+            handleResetForm(this, name);
+        }
+	},
+    mounted() {
+        // this.uploadList = this.$refs.upload.fileList;
+        /*$.get("../category/getCategorySelect", function (r) {
+            vm.queryCategories = r.list;
+        });*/
+        $.get("../goods/queryAll", function (r) {
+            vm.goodss = r.list;
+        });
+
+        $.get("../sys/macro/queryMacrosByValue?value=changeType", function (r) {
+            vm.macros = r.list;
+        });
+
+    }
+});

+ 9 - 9
kmall-admin/src/main/webapp/js/shop/thirdmerchantbiz.js

@@ -16,15 +16,15 @@ $(function () {
                     }
                     return '';
                 }},
-            {label: '门店用户是否共享', name: 'isStoreUserShare', index: 'isStoreUserShare', width: 80, align: 'center',
-                formatter: function (value) {
-                    if (value == '0') {
-                        return '否';
-                    } else if (value == '1') {
-                        return '是';
-                    }
-                    return '';
-                }},
+            // {label: '门店用户是否共享', name: 'isStoreUserShare', index: 'isStoreUserShare', width: 80, align: 'center',
+            //     formatter: function (value) {
+            //         if (value == '0') {
+            //             return '否';
+            //         } else if (value == '1') {
+            //             return '是';
+            //         }
+            //         return '';
+            //     }},
 
 			{label: '是否有效', name: 'isValid', index: 'is_valid', width: 80, align: 'center',
                 formatter: function (value) {

+ 2 - 2
kmall-api/src/main/java/com/kmall/api/api/ApiOrderController.java

@@ -277,14 +277,14 @@ public class ApiOrderController extends ApiBaseAction {
                         orderVo.setOrder_status(402);
                     }
                     orderVo.setPay_status(4);
-                    orderService.cancelOrder(orderVo);
+                    orderService.cancelOrder(getUserId(), orderVo);
                     return toResponsMsgSuccess("取消成功");
                 } else {
                     return toResponsFail("取消失败");
                 }
             } else {
                 orderVo.setOrder_status(101);
-                orderService.cancelOrder(orderVo);
+                orderService.cancelOrder(getUserId(),orderVo);
                 return toResponsSuccess("取消成功");
             }
         } catch (Exception e) {

+ 10 - 6
kmall-api/src/main/java/com/kmall/api/dao/ApiMngChangeMapper.java

@@ -1,11 +1,15 @@
 package com.kmall.api.dao;
 
-import com.kmall.api.entity.AddressVo;
-import com.kmall.api.entity.MallMngChange;
+import com.kmall.api.entity.MngChangeVo;
 import com.kmall.manager.dao.BaseDao;
 
-public interface ApiMngChangeMapper extends BaseDao<AddressVo> {
+/**
+ * 库存变化表Dao
+ *
+ * @author huangyq
+ * @email admin@qhdswl.com
+ * @date 2019-03-11 10:29:49
+ */
+public interface ApiMngChangeMapper extends BaseDao<MngChangeVo> {
 
-    MallMngChange selectByPrimaryKey(Integer id);
-
-}
+}

+ 9 - 5
kmall-api/src/main/java/com/kmall/api/dao/ApiStoreMngChangeMapper.java

@@ -1,10 +1,14 @@
 package com.kmall.api.dao;
 
-import com.kmall.api.entity.AddressVo;
-import com.kmall.api.entity.MallStoreMngChange;
+import com.kmall.api.entity.StoreMngChangeVo;
 import com.kmall.manager.dao.BaseDao;
 
-public interface ApiStoreMngChangeMapper extends BaseDao<AddressVo> {
-
-    MallStoreMngChange selectByPrimaryKey(Integer id);
+/**
+ * 门店库存变化表Dao
+ *
+ * @author huangyq
+ * @email admin@qhdswl.com
+ * @date 2019-03-11 10:29:49
+ */
+public interface ApiStoreMngChangeMapper extends BaseDao<StoreMngChangeVo> {
 }

+ 273 - 0
kmall-api/src/main/java/com/kmall/api/entity/MngChangeVo.java

@@ -0,0 +1,273 @@
+package com.kmall.api.entity;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 库存变化表实体
+ * 表名 mall_mng_change
+ *
+ * @author emato
+ * @email admin@qhdswl.com
+ * @date 2019-03-11 10:29:49
+ */
+public class MngChangeVo implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 
+     */
+    private Integer id;
+    /**
+     * 商品库存变化数
+     */
+    private Integer changeNum;
+    /**
+     * 商品原库存数
+     */
+    private Integer originalNum;
+    /**
+     * 商品库存可用数
+     */
+    private Integer validNum;
+    /**
+     * 商户编号
+     */
+    private String merchSn;
+    /**
+     * 第三方商户代码
+     */
+    private String thirdPartyMerchCode;
+    /**
+     * 商品id
+     */
+    private Integer goodsId;
+    /**
+     * 是否有效,0:有效,1:无效
+     */
+    private Integer isValid;
+    /**
+     * 变动类型 0:还原 1:扣减
+     */
+    private String changeType;
+    /**
+     * 变动原因
+     */
+    private String changeReason;
+    /**
+     * 创建人编号
+     */
+    private String createrSn;
+    /**
+     * 创建时间
+     */
+    private Date createTime;
+    /**
+     * 修改人编号
+     */
+    private String moderSn;
+    /**
+     * 修改时间
+     */
+    private Date modTime;
+    /**
+     * 时间戳
+     */
+    private Date tstm;
+
+    /**
+     * 设置:
+     */
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    /**
+     * 获取:
+     */
+    public Integer getId() {
+        return id;
+    }
+    /**
+     * 设置:商品库存变化数
+     */
+    public void setChangeNum(Integer changeNum) {
+        this.changeNum = changeNum;
+    }
+
+    /**
+     * 获取:商品库存变化数
+     */
+    public Integer getChangeNum() {
+        return changeNum;
+    }
+    /**
+     * 设置:商品原库存数
+     */
+    public void setOriginalNum(Integer originalNum) {
+        this.originalNum = originalNum;
+    }
+
+    /**
+     * 获取:商品原库存数
+     */
+    public Integer getOriginalNum() {
+        return originalNum;
+    }
+    /**
+     * 设置:商品库存可用数
+     */
+    public void setValidNum(Integer validNum) {
+        this.validNum = validNum;
+    }
+
+    /**
+     * 获取:商品库存可用数
+     */
+    public Integer getValidNum() {
+        return validNum;
+    }
+    /**
+     * 设置:商户编号
+     */
+    public void setMerchSn(String merchSn) {
+        this.merchSn = merchSn;
+    }
+
+    /**
+     * 获取:商户编号
+     */
+    public String getMerchSn() {
+        return merchSn;
+    }
+    /**
+     * 设置:第三方商户代码
+     */
+    public void setThirdPartyMerchCode(String thirdPartyMerchCode) {
+        this.thirdPartyMerchCode = thirdPartyMerchCode;
+    }
+
+    /**
+     * 获取:第三方商户代码
+     */
+    public String getThirdPartyMerchCode() {
+        return thirdPartyMerchCode;
+    }
+    /**
+     * 设置:商品id
+     */
+    public void setGoodsId(Integer goodsId) {
+        this.goodsId = goodsId;
+    }
+
+    /**
+     * 获取:商品id
+     */
+    public Integer getGoodsId() {
+        return goodsId;
+    }
+    /**
+     * 设置:是否有效,0:有效,1:无效
+     */
+    public void setIsValid(Integer isValid) {
+        this.isValid = isValid;
+    }
+
+    /**
+     * 获取:是否有效,0:有效,1:无效
+     */
+    public Integer getIsValid() {
+        return isValid;
+    }
+    /**
+     * 设置:变动类型 0:还原 1:扣减
+     */
+    public void setChangeType(String changeType) {
+        this.changeType = changeType;
+    }
+
+    /**
+     * 获取:变动类型 0:还原 1:扣减
+     */
+    public String getChangeType() {
+        return changeType;
+    }
+    /**
+     * 设置:变动原因
+     */
+    public void setChangeReason(String changeReason) {
+        this.changeReason = changeReason;
+    }
+
+    /**
+     * 获取:变动原因
+     */
+    public String getChangeReason() {
+        return changeReason;
+    }
+    /**
+     * 设置:创建人编号
+     */
+    public void setCreaterSn(String createrSn) {
+        this.createrSn = createrSn;
+    }
+
+    /**
+     * 获取:创建人编号
+     */
+    public String getCreaterSn() {
+        return createrSn;
+    }
+    /**
+     * 设置:创建时间
+     */
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+    /**
+     * 获取:创建时间
+     */
+    public Date getCreateTime() {
+        return createTime;
+    }
+    /**
+     * 设置:修改人编号
+     */
+    public void setModerSn(String moderSn) {
+        this.moderSn = moderSn;
+    }
+
+    /**
+     * 获取:修改人编号
+     */
+    public String getModerSn() {
+        return moderSn;
+    }
+    /**
+     * 设置:修改时间
+     */
+    public void setModTime(Date modTime) {
+        this.modTime = modTime;
+    }
+
+    /**
+     * 获取:修改时间
+     */
+    public Date getModTime() {
+        return modTime;
+    }
+    /**
+     * 设置:时间戳
+     */
+    public void setTstm(Date tstm) {
+        this.tstm = tstm;
+    }
+
+    /**
+     * 获取:时间戳
+     */
+    public Date getTstm() {
+        return tstm;
+    }
+}

+ 273 - 0
kmall-api/src/main/java/com/kmall/api/entity/StoreMngChangeVo.java

@@ -0,0 +1,273 @@
+package com.kmall.api.entity;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 门店库存变化表实体
+ * 表名 mall_store_mng_change
+ *
+ * @author emato
+ * @email admin@qhdswl.com
+ * @date 2019-03-11 10:29:49
+ */
+public class StoreMngChangeVo implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 
+     */
+    private Integer id;
+    /**
+     * 门店库存变化数
+     */
+    private Integer storeChangeNum;
+    /**
+     * 门店原库存数
+     */
+    private Integer storeOriginalNum;
+    /**
+     * 门店库存可用数
+     */
+    private Integer storeValidNum;
+    /**
+     * 商户编号
+     */
+    private String merchSn;
+    /**
+     * 门店编号
+     */
+    private Integer storeId;
+    /**
+     * 商品id
+     */
+    private Integer goodsId;
+    /**
+     * 是否有效,0:有效,1:无效
+     */
+    private Integer isValid;
+    /**
+     * 变动类型 0:还原 1:扣减
+     */
+    private String changeType;
+    /**
+     * 变动原因
+     */
+    private String changeReason;
+    /**
+     * 创建人编号
+     */
+    private String createrSn;
+    /**
+     * 创建时间
+     */
+    private Date createTime;
+    /**
+     * 修改人编号
+     */
+    private String moderSn;
+    /**
+     * 修改时间
+     */
+    private Date modTime;
+    /**
+     * 时间戳
+     */
+    private Date tstm;
+
+    /**
+     * 设置:
+     */
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    /**
+     * 获取:
+     */
+    public Integer getId() {
+        return id;
+    }
+    /**
+     * 设置:门店库存变化数
+     */
+    public void setStoreChangeNum(Integer storeChangeNum) {
+        this.storeChangeNum = storeChangeNum;
+    }
+
+    /**
+     * 获取:门店库存变化数
+     */
+    public Integer getStoreChangeNum() {
+        return storeChangeNum;
+    }
+    /**
+     * 设置:门店原库存数
+     */
+    public void setStoreOriginalNum(Integer storeOriginalNum) {
+        this.storeOriginalNum = storeOriginalNum;
+    }
+
+    /**
+     * 获取:门店原库存数
+     */
+    public Integer getStoreOriginalNum() {
+        return storeOriginalNum;
+    }
+    /**
+     * 设置:门店库存可用数
+     */
+    public void setStoreValidNum(Integer storeValidNum) {
+        this.storeValidNum = storeValidNum;
+    }
+
+    /**
+     * 获取:门店库存可用数
+     */
+    public Integer getStoreValidNum() {
+        return storeValidNum;
+    }
+    /**
+     * 设置:商户编号
+     */
+    public void setMerchSn(String merchSn) {
+        this.merchSn = merchSn;
+    }
+
+    /**
+     * 获取:商户编号
+     */
+    public String getMerchSn() {
+        return merchSn;
+    }
+    /**
+     * 设置:门店编号
+     */
+    public void setStoreId(Integer storeId) {
+        this.storeId = storeId;
+    }
+
+    /**
+     * 获取:门店编号
+     */
+    public Integer getStoreId() {
+        return storeId;
+    }
+    /**
+     * 设置:商品id
+     */
+    public void setGoodsId(Integer goodsId) {
+        this.goodsId = goodsId;
+    }
+
+    /**
+     * 获取:商品id
+     */
+    public Integer getGoodsId() {
+        return goodsId;
+    }
+    /**
+     * 设置:是否有效,0:有效,1:无效
+     */
+    public void setIsValid(Integer isValid) {
+        this.isValid = isValid;
+    }
+
+    /**
+     * 获取:是否有效,0:有效,1:无效
+     */
+    public Integer getIsValid() {
+        return isValid;
+    }
+    /**
+     * 设置:变动类型 0:还原 1:扣减
+     */
+    public void setChangeType(String changeType) {
+        this.changeType = changeType;
+    }
+
+    /**
+     * 获取:变动类型 0:还原 1:扣减
+     */
+    public String getChangeType() {
+        return changeType;
+    }
+    /**
+     * 设置:变动原因
+     */
+    public void setChangeReason(String changeReason) {
+        this.changeReason = changeReason;
+    }
+
+    /**
+     * 获取:变动原因
+     */
+    public String getChangeReason() {
+        return changeReason;
+    }
+    /**
+     * 设置:创建人编号
+     */
+    public void setCreaterSn(String createrSn) {
+        this.createrSn = createrSn;
+    }
+
+    /**
+     * 获取:创建人编号
+     */
+    public String getCreaterSn() {
+        return createrSn;
+    }
+    /**
+     * 设置:创建时间
+     */
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+    /**
+     * 获取:创建时间
+     */
+    public Date getCreateTime() {
+        return createTime;
+    }
+    /**
+     * 设置:修改人编号
+     */
+    public void setModerSn(String moderSn) {
+        this.moderSn = moderSn;
+    }
+
+    /**
+     * 获取:修改人编号
+     */
+    public String getModerSn() {
+        return moderSn;
+    }
+    /**
+     * 设置:修改时间
+     */
+    public void setModTime(Date modTime) {
+        this.modTime = modTime;
+    }
+
+    /**
+     * 获取:修改时间
+     */
+    public Date getModTime() {
+        return modTime;
+    }
+    /**
+     * 设置:时间戳
+     */
+    public void setTstm(Date tstm) {
+        this.tstm = tstm;
+    }
+
+    /**
+     * 获取:时间戳
+     */
+    public Date getTstm() {
+        return tstm;
+    }
+}

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

@@ -71,6 +71,10 @@ public class ApiOrderService {
     private ApiStoreMapper apiStoreMapper;
     @Autowired
     private ApiMerchMapper apiMerchMapper;
+    @Autowired
+    private ApiMngChangeMapper apiMngChangeMapper;
+    @Autowired
+    private ApiStoreMngChangeMapper apiStoreMngChangeMapper;
 
     public OrderVo queryObject(Long id) {
         return apiOrderMapper.queryObject(id);
@@ -99,9 +103,14 @@ public class ApiOrderService {
     }
 
     @Transactional
-    public void cancelOrder(OrderVo order) {
+    public void cancelOrder(Long userId, OrderVo order) {
         Map orderGoodsParam = Maps.newHashMap();
         orderGoodsParam.put("order_id", order.getId());
+        String userName = "";
+        if(userId != null){
+            UserVo userVo = apiUserMapper.queryObject(userId);
+            userName = userVo != null ? userVo.getUsername():"";
+        }
         //订单的商品
         List<OrderGoodsVo> goodsList = apiOrderGoodsMapper.queryList(orderGoodsParam);
         for (OrderGoodsVo orderGoodsVo : goodsList) {
@@ -111,31 +120,82 @@ public class ApiOrderService {
             if (null == goodsInfo || goodsInfo.getIs_delete() == 1 || goodsInfo.getIs_on_sale() == 0) {
                 throw new RRException("订单提交失败:商品不存在");
             }
-            Integer stockNum = 0;
+            Integer stockNum;
             // TODO: 2019/3/5  普通商品不受共享库存影响,直接取门店配置库存
             if(goodsInfo.getGoodsBizType().equalsIgnoreCase(Dict.orderBizType.item_00.getItem())){
                 if (goodsInfo.getIsStockShare().equalsIgnoreCase(Dict.isStockShare.item_1.getItem())) {
                     //还原商户商品库存
                     stockNum = goodsInfo.getGoods_number();
+                    stockNum = stockNum == null? 0 : stockNum;
                     goodsInfo.setGoods_number(stockNum + orderGoodsVo.getNumber());
                     goodsInfo.minusSellVolume();
                     apiGoodsMapper.updateGoodsStock(goodsInfo);
+
+                    MngChangeVo mngChangeVo = new MngChangeVo();
+                    mngChangeVo.setGoodsId(Integer.parseInt(String.valueOf(goodsInfo.getId())));
+                    mngChangeVo.setThirdPartyMerchCode(goodsInfo.getThirdPartyMerchCode());
+                    mngChangeVo.setChangeReason("小程序取消订单");
+                    mngChangeVo.setChangeType(Dict.changeType.item_0.getItem());
+                    mngChangeVo.setChangeNum(orderGoodsVo.getNumber());//变化数
+                    mngChangeVo.setOriginalNum(stockNum);//原库存数
+                    mngChangeVo.setValidNum(stockNum + orderGoodsVo.getNumber());//可用数
+                    mngChangeVo.setCreateTime(new Date());
+                    mngChangeVo.setModTime(new Date());
+                    mngChangeVo.setCreaterSn("小程序用户"+userName);
+                    mngChangeVo.setModerSn("小程序用户"+userName);
+                    mngChangeVo.setIsValid(0);
+                    mngChangeVo.setMerchSn(goodsInfo.getMerchSn());
+                    apiMngChangeMapper.save(mngChangeVo);
                 }
                 if (goodsInfo.getIsStockShare().equalsIgnoreCase(Dict.isStockShare.item_0.getItem())) {
                     //还原门店库存
                     stockNum = productInfo.getStock_num();
+                    stockNum = stockNum == null? 0 : stockNum;
                     productInfo.setStock_num(stockNum + orderGoodsVo.getNumber());
                     productInfo.minusSellVolume();
                     productInfo.setGoods_id(goodsInfo.getId());
                     apiProductMapper.updateStockNum(productInfo);
+
+                    StoreMngChangeVo storeMngChangeVo = new StoreMngChangeVo();
+                    storeMngChangeVo.setChangeType(Dict.changeType.item_0.getItem());
+                    storeMngChangeVo.setChangeReason("小程序取消订单");
+                    storeMngChangeVo.setGoodsId(Integer.parseInt(String.valueOf(goodsInfo.getId())));
+                    storeMngChangeVo.setStoreId(Integer.parseInt(String.valueOf(productInfo.getStore_id())));
+                    storeMngChangeVo.setMerchSn(goodsInfo.getMerchSn());
+                    storeMngChangeVo.setStoreChangeNum(orderGoodsVo.getNumber());
+                    storeMngChangeVo.setStoreOriginalNum(stockNum);
+                    storeMngChangeVo.setStoreValidNum(stockNum + orderGoodsVo.getNumber());
+                    storeMngChangeVo.setCreateTime(new Date());
+                    storeMngChangeVo.setModTime(new Date());
+                    storeMngChangeVo.setCreaterSn("小程序用户"+userName);
+                    storeMngChangeVo.setModerSn("小程序用户"+userName);
+                    storeMngChangeVo.setIsValid(0);
+                    apiStoreMngChangeMapper.save(storeMngChangeVo);
                 }
             }else {
                 //还原门店库存
                 stockNum = productInfo.getStock_num();
+                stockNum = stockNum == null? 0 : stockNum;
                 productInfo.setStock_num(stockNum + orderGoodsVo.getNumber());
                 productInfo.setGoods_id(goodsInfo.getId());
                 productInfo.minusSellVolume();
                 apiProductMapper.updateStockNum(productInfo);
+
+                StoreMngChangeVo storeMngChangeVo = new StoreMngChangeVo();
+                storeMngChangeVo.setChangeType(Dict.changeType.item_0.getItem());
+                storeMngChangeVo.setChangeReason("小程序取消订单");
+                storeMngChangeVo.setGoodsId(Integer.parseInt(String.valueOf(goodsInfo.getId())));
+                storeMngChangeVo.setStoreId(Integer.parseInt(String.valueOf(productInfo.getStore_id())));
+                storeMngChangeVo.setMerchSn(goodsInfo.getMerchSn());
+                storeMngChangeVo.setStoreChangeNum(orderGoodsVo.getNumber());
+                storeMngChangeVo.setStoreOriginalNum(stockNum);
+                storeMngChangeVo.setStoreValidNum(stockNum + orderGoodsVo.getNumber());
+                storeMngChangeVo.setCreateTime(new Date());
+                storeMngChangeVo.setModTime(new Date());
+                storeMngChangeVo.setCreaterSn("小程序用户"+userName);
+                storeMngChangeVo.setModerSn("小程序用户"+userName);
+                storeMngChangeVo.setIsValid(0);
+                apiStoreMngChangeMapper.save(storeMngChangeVo);
             }
         }
         update(order);
@@ -259,15 +319,15 @@ public class ApiOrderService {
                     if(goodsInfo.getGoodsBizType().equalsIgnoreCase(Dict.orderBizType.item_00.getItem())){
                         if (goodsInfo.getIsStockShare().equalsIgnoreCase(Dict.isStockShare.item_1.getItem())) {
                             //扣减商户商品库存
-                            updateGoodsStock(goodsInfo,stockNum,goodsItem);
+                            updateGoodsStock(goodsInfo,stockNum,goodsItem,userName);
                         }
                         if (goodsInfo.getIsStockShare().equalsIgnoreCase(Dict.isStockShare.item_0.getItem())) {
                             //扣减门店库存
-                            updateStock(productInfo,goodsInfo,stockNum,goodsItem,storeId);
+                            updateStock(productInfo,goodsInfo,stockNum,goodsItem,storeId,userName);
                         }
                     }else {
                         //扣减门店库存
-                        updateStock(productInfo,goodsInfo,stockNum,goodsItem,storeId);
+                        updateStock(productInfo,goodsInfo,stockNum,goodsItem,storeId,userName);
                     }
                 }
             }
@@ -435,19 +495,51 @@ public class ApiOrderService {
 
         return resultObj;
     }
-    private void updateGoodsStock(GoodsVo goodsVo,Integer stockNum,CartVo goodsItem){
+    private void updateGoodsStock(GoodsVo goodsVo,Integer stockNum,CartVo goodsItem,String userName){
         goodsVo.setGoods_number(stockNum - goodsItem.getNumber());
         goodsVo.addSellVolume();
         goodsVo.setId(goodsVo.getId());
         apiGoodsMapper.updateGoodsStock(goodsVo);
+
+        MngChangeVo mngChangeVo = new MngChangeVo();
+        mngChangeVo.setGoodsId(Integer.parseInt(String.valueOf(goodsVo.getId())));
+        mngChangeVo.setThirdPartyMerchCode(goodsVo.getThirdPartyMerchCode());
+        mngChangeVo.setChangeReason("小程序购买商品");
+        mngChangeVo.setChangeType(Dict.changeType.item_1.getItem());
+        mngChangeVo.setChangeNum(goodsItem.getNumber());//变化数
+        mngChangeVo.setOriginalNum(stockNum);//原库存数
+        mngChangeVo.setValidNum(stockNum - goodsItem.getNumber());//可用数
+        mngChangeVo.setCreateTime(new Date());
+        mngChangeVo.setModTime(new Date());
+        mngChangeVo.setCreaterSn("小程序用户"+userName);
+        mngChangeVo.setModerSn("小程序用户"+userName);
+        mngChangeVo.setIsValid(0);
+        mngChangeVo.setMerchSn(goodsVo.getMerchSn());
+        apiMngChangeMapper.save(mngChangeVo);
     }
-    private void updateStock(ProductVo productInfo,GoodsVo goodsVo,Integer stockNum,CartVo goodsItem,Long storeId){
+    private void updateStock(ProductVo productInfo,GoodsVo goodsVo,Integer stockNum,CartVo goodsItem,Long storeId,String userName){
         productInfo.setStock_num(stockNum - goodsItem.getNumber());
         productInfo.setStore_id(storeId);
         productInfo.addSellVolume();
         productInfo.setGoods_id(goodsVo.getId());
 //        productVos.add(productInfo);
         apiProductMapper.updateStockNum(productInfo);
+        
+        StoreMngChangeVo storeMngChangeVo = new StoreMngChangeVo();
+        storeMngChangeVo.setChangeType(Dict.changeType.item_1.getItem());
+        storeMngChangeVo.setChangeReason("小程序购买商品");
+        storeMngChangeVo.setGoodsId(Integer.parseInt(String.valueOf(goodsVo.getId())));
+        storeMngChangeVo.setStoreId(Integer.parseInt(String.valueOf(storeId)));
+        storeMngChangeVo.setMerchSn(goodsVo.getMerchSn());
+        storeMngChangeVo.setStoreChangeNum(goodsItem.getNumber());
+        storeMngChangeVo.setStoreOriginalNum(stockNum);
+        storeMngChangeVo.setStoreValidNum(stockNum - goodsItem.getNumber());
+        storeMngChangeVo.setCreateTime(new Date());
+        storeMngChangeVo.setModTime(new Date());
+        storeMngChangeVo.setCreaterSn("小程序用户"+userName);
+        storeMngChangeVo.setModerSn("小程序用户"+userName);
+        storeMngChangeVo.setIsValid(0);
+        apiStoreMngChangeMapper.save(storeMngChangeVo);
     }
 
     /**

+ 2 - 1
kmall-api/src/main/resources/mybatis/mapper/ApiGoodsMapper.xml

@@ -141,7 +141,8 @@
         psr1.store_id,
         psr1.market_price,
         psr1.stock_num,
-        a.goods_desc,a.goods_biz_type,a.goods_rate,a.third_party_merch_code,mb.is_stock_share isStockShare,a.sell_volume goods_sell_volume
+        a.goods_desc,a.goods_biz_type,a.goods_rate,a.third_party_merch_code,mb.is_stock_share isStockShare,a.sell_volume goods_sell_volume,
+        mb.third_party_merch_code
         from mall_goods a left join mall_merch m on a.merch_sn = m.merch_sn
         left join third_merchant_biz mb on a.third_party_merch_code = mb.third_party_merch_code and mb.merch_sn=a.merch_sn
         LEFT JOIN mall_product_store_rela psr1 ON a.id = psr1.goods_id and a.merch_sn = psr1.merch_sn

+ 156 - 149
kmall-api/src/main/resources/mybatis/mapper/ApiMngChangeMapper.xml

@@ -1,151 +1,158 @@
-<?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.api.dao.ApiMngChangeMapper" >
-  <resultMap id="BaseResultMap" type="com.kmall.api.entity.MallMngChange" >
-    <id column="id" property="id" jdbcType="INTEGER" />
-    <result column="change_num" property="changeNum" jdbcType="INTEGER" />
-    <result column="original_num" property="originalNum" jdbcType="INTEGER" />
-    <result column="valid_num" property="validNum" jdbcType="INTEGER" />
-    <result column="merch_sn" property="merchSn" jdbcType="VARCHAR" />
-    <result column="sku" property="sku" jdbcType="VARCHAR" />
-    <result column="is_valid" property="isValid" jdbcType="INTEGER" />
-    <result column="creater_sn" property="createrSn" jdbcType="VARCHAR" />
-    <result column="create_time" property="createTime" jdbcType="TIMESTAMP" />
-    <result column="moder_sn" property="moderSn" jdbcType="VARCHAR" />
-    <result column="mod_time" property="modTime" jdbcType="TIMESTAMP" />
-    <result column="tstm" property="tstm" jdbcType="TIMESTAMP" />
-  </resultMap>
+<?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.api.dao.ApiMngChangeMapper">
+
+    <resultMap type="com.kmall.api.entity.MngChangeVo" id="mngChangeMap">
+        <result property="id" column="id"/>
+        <result property="changeNum" column="change_num"/>
+        <result property="originalNum" column="original_num"/>
+        <result property="validNum" column="valid_num"/>
+        <result property="merchSn" column="merch_sn"/>
+        <result property="thirdPartyMerchCode" column="third_party_merch_code"/>
+        <result property="goodsId" column="goods_id"/>
+        <result property="isValid" column="is_valid"/>
+        <result property="changeType" column="change_type"/>
+        <result property="changeReason" column="change_reason"/>
+        <result property="createrSn" column="creater_sn"/>
+        <result property="createTime" column="create_time"/>
+        <result property="moderSn" column="moder_sn"/>
+        <result property="modTime" column="mod_time"/>
+        <result property="tstm" column="tstm"/>
+    </resultMap>
+
+	<select id="queryObject" resultType="com.kmall.api.entity.MngChangeVo">
+		select
+			`id`,
+			`change_num`,
+			`original_num`,
+			`valid_num`,
+			`merch_sn`,
+			`third_party_merch_code`,
+			`goods_id`,
+			`is_valid`,
+			`change_type`,
+			`change_reason`,
+			`creater_sn`,
+			`create_time`,
+			`moder_sn`,
+			`mod_time`,
+			`tstm`
+		from mall_mng_change
+		where id = #{id}
+	</select>
+
+	<select id="queryList" resultType="com.kmall.api.entity.MngChangeVo">
+		select
+    		`id`,
+    		`change_num`,
+    		`original_num`,
+    		`valid_num`,
+    		`merch_sn`,
+    		`third_party_merch_code`,
+    		`goods_id`,
+    		`is_valid`,
+    		`change_type`,
+    		`change_reason`,
+    		`creater_sn`,
+    		`create_time`,
+    		`moder_sn`,
+    		`mod_time`,
+    		`tstm`
+		from mall_mng_change c left join mall_merch m on c.merch_sn = m.merch_sn
+		left join third_merchant_biz mb on c.third_party_merch_code = mb.third_party_merch_code
+		left join mall_goods g on c.goods_id = g.id
+		WHERE 1=1
+		<if test="goodsId != null and goodsId != ''">
+			AND c.goods_id = #{goodsId}
+		</if>
+		<if test="storeId != null and storeId != ''">
+			AND c.store_id = #{storeId}
+		</if>
+        <choose>
+            <when test="sidx != null and sidx.trim() != ''">
+                order by ${sidx} ${order}
+            </when>
+			<otherwise>
+                order by id desc
+			</otherwise>
+        </choose>
+		<if test="offset != null and limit != null">
+			limit #{offset}, #{limit}
+		</if>
+	</select>
+	
+ 	<select id="queryTotal" resultType="int">
+		select count(*) from mall_mng_change
+		WHERE 1=1
+        <if test="name != null and name.trim() != ''">
+            AND name LIKE concat('%',#{name},'%')
+        </if>
+	</select>
+	 
+	<insert id="save" parameterType="com.kmall.api.entity.MngChangeVo">
+		insert into mall_mng_change(
+			`change_num`,
+			`original_num`,
+			`valid_num`,
+			`merch_sn`,
+			`third_party_merch_code`,
+			`goods_id`,
+			`is_valid`,
+			`change_type`,
+			`change_reason`,
+			`creater_sn`,
+			`create_time`,
+			`moder_sn`,
+			`mod_time`,
+			`tstm`)
+		values(
+			#{changeNum},
+			#{originalNum},
+			#{validNum},
+			#{merchSn},
+			#{thirdPartyMerchCode},
+			#{goodsId},
+			#{isValid},
+			#{changeType},
+			#{changeReason},
+			#{createrSn},
+			#{createTime},
+			#{moderSn},
+			#{modTime},
+			#{tstm})
+	</insert>
+	 
+	<update id="update" parameterType="com.kmall.api.entity.MngChangeVo">
+		update mall_mng_change 
+		<set>
+			<if test="changeNum != null">`change_num` = #{changeNum}, </if>
+			<if test="originalNum != null">`original_num` = #{originalNum}, </if>
+			<if test="validNum != null">`valid_num` = #{validNum}, </if>
+			<if test="merchSn != null">`merch_sn` = #{merchSn}, </if>
+			<if test="thirdPartyMerchCode != null">`third_party_merch_code` = #{thirdPartyMerchCode}, </if>
+			<if test="goodsId != null">`goods_id` = #{goodsId}, </if>
+			<if test="isValid != null">`is_valid` = #{isValid}, </if>
+			<if test="changeType != null">`change_type` = #{changeType}, </if>
+			<if test="changeReason != null">`change_reason` = #{changeReason}, </if>
+			<if test="createrSn != null">`creater_sn` = #{createrSn}, </if>
+			<if test="createTime != null">`create_time` = #{createTime}, </if>
+			<if test="moderSn != null">`moder_sn` = #{moderSn}, </if>
+			<if test="modTime != null">`mod_time` = #{modTime}, </if>
+			<if test="tstm != null">`tstm` = #{tstm}</if>
+		</set>
+		where id = #{id}
+	</update>
+	
+	<delete id="delete">
+		delete from mall_mng_change where id = #{value}
+	</delete>
+	
+	<delete id="deleteBatch">
+		delete from mall_mng_change where id in 
+		<foreach item="id" collection="array" open="(" separator="," close=")">
+			#{id}
+		</foreach>
+	</delete>
 
-  <sql id="Base_Column_List" >
-    id, change_num, original_num, valid_num, merch_sn, sku, is_valid, creater_sn, create_time, 
-    moder_sn, mod_time, tstm
-  </sql>
-  <select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Integer" >
-    select 
-    <include refid="Base_Column_List" />
-    from mall_mng_change
-    where id = #{id,jdbcType=INTEGER}
-  </select>
-  <delete id="delete" parameterType="java.lang.Integer" >
-    delete from mall_mng_change
-    where id = #{id,jdbcType=INTEGER}
-  </delete>
-  <insert id="save" parameterType="com.kmall.api.entity.MallMngChange"  useGeneratedKeys="true" keyProperty="id">
-    insert into mall_mng_change
-    <trim prefix="(" suffix=")" suffixOverrides="," >
-      <if test="id != null" >
-        id,
-      </if>
-      <if test="changeNum != null" >
-        change_num,
-      </if>
-      <if test="originalNum != null" >
-        original_num,
-      </if>
-      <if test="validNum != null" >
-        valid_num,
-      </if>
-      <if test="merchSn != null" >
-        merch_sn,
-      </if>
-      <if test="sku != null" >
-        sku,
-      </if>
-      <if test="isValid != null" >
-        is_valid,
-      </if>
-      <if test="createrSn != null" >
-        creater_sn,
-      </if>
-      <if test="createTime != null" >
-        create_time,
-      </if>
-      <if test="moderSn != null" >
-        moder_sn,
-      </if>
-      <if test="modTime != null" >
-        mod_time,
-      </if>
-      <if test="tstm != null" >
-        tstm,
-      </if>
-    </trim>
-    <trim prefix="values (" suffix=")" suffixOverrides="," >
-      <if test="id != null" >
-        #{id,jdbcType=INTEGER},
-      </if>
-      <if test="changeNum != null" >
-        #{changeNum,jdbcType=INTEGER},
-      </if>
-      <if test="originalNum != null" >
-        #{originalNum,jdbcType=INTEGER},
-      </if>
-      <if test="validNum != null" >
-        #{validNum,jdbcType=INTEGER},
-      </if>
-      <if test="merchSn != null" >
-        #{merchSn,jdbcType=VARCHAR},
-      </if>
-      <if test="sku != null" >
-        #{sku,jdbcType=VARCHAR},
-      </if>
-      <if test="isValid != null" >
-        #{isValid,jdbcType=INTEGER},
-      </if>
-      <if test="createrSn != null" >
-        #{createrSn,jdbcType=VARCHAR},
-      </if>
-      <if test="createTime != null" >
-        #{createTime,jdbcType=TIMESTAMP},
-      </if>
-      <if test="moderSn != null" >
-        #{moderSn,jdbcType=VARCHAR},
-      </if>
-      <if test="modTime != null" >
-        #{modTime,jdbcType=TIMESTAMP},
-      </if>
-      <if test="tstm != null" >
-        #{tstm,jdbcType=TIMESTAMP},
-      </if>
-    </trim>
-  </insert>
-  <update id="update" parameterType="com.kmall.api.entity.MallMngChange" >
-    update mall_mng_change
-    <set >
-      <if test="changeNum != null" >
-        change_num = #{changeNum,jdbcType=INTEGER},
-      </if>
-      <if test="originalNum != null" >
-        original_num = #{originalNum,jdbcType=INTEGER},
-      </if>
-      <if test="validNum != null" >
-        valid_num = #{validNum,jdbcType=INTEGER},
-      </if>
-      <if test="merchSn != null" >
-        merch_sn = #{merchSn,jdbcType=VARCHAR},
-      </if>
-      <if test="sku != null" >
-        sku = #{sku,jdbcType=VARCHAR},
-      </if>
-      <if test="isValid != null" >
-        is_valid = #{isValid,jdbcType=INTEGER},
-      </if>
-      <if test="createrSn != null" >
-        creater_sn = #{createrSn,jdbcType=VARCHAR},
-      </if>
-      <if test="createTime != null" >
-        create_time = #{createTime,jdbcType=TIMESTAMP},
-      </if>
-      <if test="moderSn != null" >
-        moder_sn = #{moderSn,jdbcType=VARCHAR},
-      </if>
-      <if test="modTime != null" >
-        mod_time = #{modTime,jdbcType=TIMESTAMP},
-      </if>
-      <if test="tstm != null" >
-        tstm = #{tstm,jdbcType=TIMESTAMP},
-      </if>
-    </set>
-    where id = #{id,jdbcType=INTEGER}
-  </update>
 </mapper>

+ 156 - 159
kmall-api/src/main/resources/mybatis/mapper/ApiStoreMngChangeMapper.xml

@@ -1,161 +1,158 @@
-<?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.api.dao.ApiStoreMngChangeMapper" >
-  <resultMap id="BaseResultMap" type="com.kmall.api.entity.MallStoreMngChange" >
-    <id column="id" property="id" jdbcType="INTEGER" />
-    <result column="store_change_num" property="storeChangeNum" jdbcType="INTEGER" />
-    <result column="store_original_num" property="storeOriginalNum" jdbcType="INTEGER" />
-    <result column="store_valid_num" property="storeValidNum" jdbcType="INTEGER" />
-    <result column="merch_sn" property="merchSn" jdbcType="VARCHAR" />
-    <result column="store_id" property="storeId" jdbcType="INTEGER" />
-    <result column="sku" property="sku" jdbcType="VARCHAR" />
-    <result column="is_valid" property="isValid" jdbcType="INTEGER" />
-    <result column="creater_sn" property="createrSn" jdbcType="VARCHAR" />
-    <result column="create_time" property="createTime" jdbcType="TIMESTAMP" />
-    <result column="moder_sn" property="moderSn" jdbcType="VARCHAR" />
-    <result column="mod_time" property="modTime" jdbcType="TIMESTAMP" />
-    <result column="tstm" property="tstm" jdbcType="TIMESTAMP" />
-  </resultMap>
-  <sql id="Base_Column_List" >
-    id, store_change_num, store_original_num, store_valid_num, merch_sn, store_id, sku, 
-    is_valid, creater_sn, create_time, moder_sn, mod_time, tstm
-  </sql>
-  <select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Integer" >
-    select 
-    <include refid="Base_Column_List" />
-    from mall_store_mng_change
-    where id = #{id,jdbcType=INTEGER}
-  </select>
-  <delete id="delete" parameterType="java.lang.Integer" >
-    delete from mall_store_mng_change
-    where id = #{id,jdbcType=INTEGER}
-  </delete>
-  <insert id="save" parameterType="com.kmall.api.entity.MallStoreMngChange"  useGeneratedKeys="true" keyProperty="id">
-    insert into mall_store_mng_change
-    <trim prefix="(" suffix=")" suffixOverrides="," >
-      <if test="id != null" >
-        id,
-      </if>
-      <if test="storeChangeNum != null" >
-        store_change_num,
-      </if>
-      <if test="storeOriginalNum != null" >
-        store_original_num,
-      </if>
-      <if test="storeValidNum != null" >
-        store_valid_num,
-      </if>
-      <if test="merchSn != null" >
-        merch_sn,
-      </if>
-      <if test="storeId != null" >
-        store_id,
-      </if>
-      <if test="sku != null" >
-        sku,
-      </if>
-      <if test="isValid != null" >
-        is_valid,
-      </if>
-      <if test="createrSn != null" >
-        creater_sn,
-      </if>
-      <if test="createTime != null" >
-        create_time,
-      </if>
-      <if test="moderSn != null" >
-        moder_sn,
-      </if>
-      <if test="modTime != null" >
-        mod_time,
-      </if>
-      <if test="tstm != null" >
-        tstm,
-      </if>
-    </trim>
-    <trim prefix="values (" suffix=")" suffixOverrides="," >
-      <if test="id != null" >
-        #{id,jdbcType=INTEGER},
-      </if>
-      <if test="storeChangeNum != null" >
-        #{storeChangeNum,jdbcType=INTEGER},
-      </if>
-      <if test="storeOriginalNum != null" >
-        #{storeOriginalNum,jdbcType=INTEGER},
-      </if>
-      <if test="storeValidNum != null" >
-        #{storeValidNum,jdbcType=INTEGER},
-      </if>
-      <if test="merchSn != null" >
-        #{merchSn,jdbcType=VARCHAR},
-      </if>
-      <if test="storeId != null" >
-        #{storeId,jdbcType=INTEGER},
-      </if>
-      <if test="sku != null" >
-        #{sku,jdbcType=VARCHAR},
-      </if>
-      <if test="isValid != null" >
-        #{isValid,jdbcType=INTEGER},
-      </if>
-      <if test="createrSn != null" >
-        #{createrSn,jdbcType=VARCHAR},
-      </if>
-      <if test="createTime != null" >
-        #{createTime,jdbcType=TIMESTAMP},
-      </if>
-      <if test="moderSn != null" >
-        #{moderSn,jdbcType=VARCHAR},
-      </if>
-      <if test="modTime != null" >
-        #{modTime,jdbcType=TIMESTAMP},
-      </if>
-      <if test="tstm != null" >
-        #{tstm,jdbcType=TIMESTAMP},
-      </if>
-    </trim>
-  </insert>
+<?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.api.dao.ApiStoreMngChangeMapper">
+
+    <resultMap type="com.kmall.api.entity.StoreMngChangeVo" id="storeMngChangeMap">
+        <result property="id" column="id"/>
+        <result property="storeChangeNum" column="store_change_num"/>
+        <result property="storeOriginalNum" column="store_original_num"/>
+        <result property="storeValidNum" column="store_valid_num"/>
+        <result property="merchSn" column="merch_sn"/>
+        <result property="storeId" column="store_id"/>
+        <result property="goodsId" column="goods_id"/>
+        <result property="isValid" column="is_valid"/>
+        <result property="changeType" column="change_type"/>
+        <result property="changeReason" column="change_reason"/>
+        <result property="createrSn" column="creater_sn"/>
+        <result property="createTime" column="create_time"/>
+        <result property="moderSn" column="moder_sn"/>
+        <result property="modTime" column="mod_time"/>
+        <result property="tstm" column="tstm"/>
+    </resultMap>
+
+	<select id="queryObject" resultType="com.kmall.api.entity.StoreMngChangeVo">
+		select
+			`id`,
+			`store_change_num`,
+			`store_original_num`,
+			`store_valid_num`,
+			`merch_sn`,
+			`store_id`,
+			`goods_id`,
+			`is_valid`,
+			`change_type`,
+			`change_reason`,
+			`creater_sn`,
+			`create_time`,
+			`moder_sn`,
+			`mod_time`,
+			`tstm`
+		from mall_store_mng_change
+		where id = #{id}
+	</select>
+
+	<select id="queryList" resultType="com.kmall.api.entity.StoreMngChangeVo">
+		select
+    		`id`,
+    		`store_change_num`,
+    		`store_original_num`,
+    		`store_valid_num`,
+    		`merch_sn`,
+    		`store_id`,
+    		`goods_id`,
+    		`is_valid`,
+    		`change_type`,
+    		`change_reason`,
+    		`creater_sn`,
+    		`create_time`,
+    		`moder_sn`,
+    		`mod_time`,
+    		`tstm`
+		from mall_store_mng_change c left join mall_merch m on c.merch_sn = m.merch_sn
+		left join mall_store s on s.id = c.store_id
+		left join mall_goods g on c.goods_id = g.id
+		WHERE 1=1
+		<if test="goodsId != null and goodsId != ''">
+			AND c.goods_id = #{goodsId}
+		</if>
+		<if test="storeId != null and storeId != ''">
+			AND c.store_id = #{storeId}
+		</if>
+        <choose>
+            <when test="sidx != null and sidx.trim() != ''">
+                order by ${sidx} ${order}
+            </when>
+			<otherwise>
+                order by id desc
+			</otherwise>
+        </choose>
+		<if test="offset != null and limit != null">
+			limit #{offset}, #{limit}
+		</if>
+	</select>
+	
+ 	<select id="queryTotal" resultType="int">
+		select count(*) from mall_store_mng_change
+		WHERE 1=1
+        <if test="name != null and name.trim() != ''">
+            AND name LIKE concat('%',#{name},'%')
+        </if>
+	</select>
+	 
+	<insert id="save" parameterType="com.kmall.api.entity.StoreMngChangeVo">
+		insert into mall_store_mng_change(
+			`store_change_num`,
+			`store_original_num`,
+			`store_valid_num`,
+			`merch_sn`,
+			`store_id`,
+			`goods_id`,
+			`is_valid`,
+			`change_type`,
+			`change_reason`,
+			`creater_sn`,
+			`create_time`,
+			`moder_sn`,
+			`mod_time`,
+			`tstm`)
+		values(
+			#{storeChangeNum},
+			#{storeOriginalNum},
+			#{storeValidNum},
+			#{merchSn},
+			#{storeId},
+			#{goodsId},
+			#{isValid},
+			#{changeType},
+			#{changeReason},
+			#{createrSn},
+			#{createTime},
+			#{moderSn},
+			#{modTime},
+			#{tstm})
+	</insert>
+	 
+	<update id="update" parameterType="com.kmall.api.entity.StoreMngChangeVo">
+		update mall_store_mng_change 
+		<set>
+			<if test="storeChangeNum != null">`store_change_num` = #{storeChangeNum}, </if>
+			<if test="storeOriginalNum != null">`store_original_num` = #{storeOriginalNum}, </if>
+			<if test="storeValidNum != null">`store_valid_num` = #{storeValidNum}, </if>
+			<if test="merchSn != null">`merch_sn` = #{merchSn}, </if>
+			<if test="storeId != null">`store_id` = #{storeId}, </if>
+			<if test="goodsId != null">`goods_id` = #{goodsId}, </if>
+			<if test="isValid != null">`is_valid` = #{isValid}, </if>
+			<if test="changeType != null">`change_type` = #{changeType}, </if>
+			<if test="changeReason != null">`change_reason` = #{changeReason}, </if>
+			<if test="createrSn != null">`creater_sn` = #{createrSn}, </if>
+			<if test="createTime != null">`create_time` = #{createTime}, </if>
+			<if test="moderSn != null">`moder_sn` = #{moderSn}, </if>
+			<if test="modTime != null">`mod_time` = #{modTime}, </if>
+			<if test="tstm != null">`tstm` = #{tstm}</if>
+		</set>
+		where id = #{id}
+	</update>
+	
+	<delete id="delete">
+		delete from mall_store_mng_change where id = #{value}
+	</delete>
+	
+	<delete id="deleteBatch">
+		delete from mall_store_mng_change where id in 
+		<foreach item="id" collection="array" open="(" separator="," close=")">
+			#{id}
+		</foreach>
+	</delete>
 
-  <update id="update" parameterType="com.kmall.api.entity.MallStoreMngChange" >
-    update mall_store_mng_change
-    <set >
-      <if test="storeChangeNum != null" >
-        store_change_num = #{storeChangeNum,jdbcType=INTEGER},
-      </if>
-      <if test="storeOriginalNum != null" >
-        store_original_num = #{storeOriginalNum,jdbcType=INTEGER},
-      </if>
-      <if test="storeValidNum != null" >
-        store_valid_num = #{storeValidNum,jdbcType=INTEGER},
-      </if>
-      <if test="merchSn != null" >
-        merch_sn = #{merchSn,jdbcType=VARCHAR},
-      </if>
-      <if test="storeId != null" >
-        store_id = #{storeId,jdbcType=INTEGER},
-      </if>
-      <if test="sku != null" >
-        sku = #{sku,jdbcType=VARCHAR},
-      </if>
-      <if test="isValid != null" >
-        is_valid = #{isValid,jdbcType=INTEGER},
-      </if>
-      <if test="createrSn != null" >
-        creater_sn = #{createrSn,jdbcType=VARCHAR},
-      </if>
-      <if test="createTime != null" >
-        create_time = #{createTime,jdbcType=TIMESTAMP},
-      </if>
-      <if test="moderSn != null" >
-        moder_sn = #{moderSn,jdbcType=VARCHAR},
-      </if>
-      <if test="modTime != null" >
-        mod_time = #{modTime,jdbcType=TIMESTAMP},
-      </if>
-      <if test="tstm != null" >
-        tstm = #{tstm,jdbcType=TIMESTAMP},
-      </if>
-    </set>
-    where id = #{id,jdbcType=INTEGER}
-  </update>
 </mapper>

+ 35 - 0
kmall-common/src/main/java/com/kmall/common/constant/Dict.java

@@ -948,4 +948,39 @@ public class Dict {
             this.itemName = itemName;
         }
     }
+
+    /**
+     * 变动类型 0:还原 1:扣减 2:新增调整 3:更新调整增加 4:更新调整减少
+     */
+    public enum changeType {
+        item_0("0", "还原"),
+        item_1("1", "扣减"),
+        item_2("2", "新增调整"),
+        item_3("3", "更新调整增加"),
+        item_4("4", "更新调整减少");
+
+        private String item;
+        private String itemName;
+
+        changeType(String item, String itemName) {
+            this.item = item;
+            this.itemName = itemName;
+        }
+
+        public String getItem() {
+            return item;
+        }
+
+        public void setItem(String item) {
+            this.item = item;
+        }
+
+        public String getItemName() {
+            return itemName;
+        }
+
+        public void setItemName(String itemName) {
+            this.itemName = itemName;
+        }
+    }
 }

+ 296 - 0
kmall-common/src/main/java/com/kmall/common/entity/SysUserEntity.java

@@ -0,0 +1,296 @@
+package com.kmall.common.entity;
+
+import com.kmall.common.validator.group.AddGroup;
+import com.kmall.common.validator.group.UpdateGroup;
+import org.hibernate.validator.constraints.Email;
+import org.hibernate.validator.constraints.NotBlank;
+
+import java.io.Serializable;
+import java.util.Date;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * 系统用户
+ *
+ * @author Scott
+ * @email
+ * @date 2016年9月18日 上午9:28:55
+ */
+public class SysUserEntity
+        implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 用户ID
+     */
+    private Long userId;
+
+    /**
+     * 用户名
+     */
+    @NotBlank(message = "用户名不能为空", groups = {AddGroup.class, UpdateGroup.class})
+    private String username;
+
+    /**
+     * 密码
+     */
+    private transient String password;
+
+    /**
+     * 邮箱
+     */
+    @NotBlank(message = "邮箱不能为空", groups = {AddGroup.class, UpdateGroup.class})
+    @Email(message = "邮箱格式不正确", groups = {AddGroup.class, UpdateGroup.class})
+    private String email;
+
+    /**
+     * 手机号
+     */
+    private String mobile;
+
+    /**
+     * 状态  0:禁用   1:正常
+     */
+    private Integer status;
+
+    /**
+     * 角色ID列表
+     */
+    private List<Long> roleIdList;
+
+    /**
+     * 创建者ID
+     */
+    private Long createUserId;
+
+    /**
+     * 创建时间
+     */
+    private Date createTime;
+
+    private Long deptId;
+
+    /**
+     * 部门名称
+     */
+    private String deptName;
+
+    private Long roleId;
+
+    private Integer storeId;
+
+    private String merchSn;
+
+    private String merchName;
+
+    private String roleType;
+
+    private Set<String> permsSet;
+
+    public String getMerchName() {
+        return merchName;
+    }
+
+    public void setMerchName(String merchName) {
+        this.merchName = merchName;
+    }
+
+    /**
+     * 设置:
+     *
+     * @param userId
+     */
+    public void setUserId(Long userId) {
+        this.userId = userId;
+    }
+
+    /**
+     * 获取:
+     *
+     * @return Long
+     */
+    public Long getUserId() {
+        return userId;
+    }
+
+    public Long getRoleId() {
+        return roleId;
+    }
+
+    public void setRoleId(Long roleId) {
+        this.roleId = roleId;
+    }
+
+    /**
+     * 设置:用户名
+     *
+     * @param username 用户名
+     */
+    public void setUsername(String username) {
+        this.username = username;
+    }
+
+    /**
+     * 获取:用户名
+     *
+     * @return String
+     */
+    public String getUsername() {
+        return username;
+    }
+
+    /**
+     * 设置:密码
+     *
+     * @param password 密码
+     */
+    public void setPassword(String password) {
+        this.password = password;
+    }
+
+    /**
+     * 获取:密码
+     *
+     * @return String
+     */
+    public String getPassword() {
+        return password;
+    }
+
+    /**
+     * 设置:邮箱
+     *
+     * @param email 邮箱
+     */
+    public void setEmail(String email) {
+        this.email = email;
+    }
+
+    /**
+     * 获取:邮箱
+     *
+     * @return String
+     */
+    public String getEmail() {
+        return email;
+    }
+
+    /**
+     * 设置:手机号
+     *
+     * @param mobile 手机号
+     */
+    public void setMobile(String mobile) {
+        this.mobile = mobile;
+    }
+
+    /**
+     * 获取:手机号
+     *
+     * @return String
+     */
+    public String getMobile() {
+        return mobile;
+    }
+
+    public Integer getStoreId() {
+        return storeId;
+    }
+
+    public void setStoreId(Integer storeId) {
+        this.storeId = storeId;
+    }
+
+    public String getMerchSn() {
+        return merchSn;
+    }
+
+    public void setMerchSn(String merchSn) {
+        this.merchSn = merchSn;
+    }
+
+    public String getRoleType() {
+        return roleType;
+    }
+
+    public void setRoleType(String roleType) {
+        this.roleType = roleType;
+    }
+
+    /**
+     * 设置:状态  0:禁用   1:正常
+     *
+     * @param status 状态  0:禁用   1:正常
+     */
+    public void setStatus(Integer status) {
+        this.status = status;
+    }
+
+    /**
+     * 获取:状态  0:禁用   1:正常
+     *
+     * @return Integer
+     */
+    public Integer getStatus() {
+        return status;
+    }
+
+    /**
+     * 设置:创建时间
+     *
+     * @param createTime 创建时间
+     */
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+    /**
+     * 获取:创建时间
+     *
+     * @return Date
+     */
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    public List<Long> getRoleIdList() {
+        return roleIdList;
+    }
+
+    public void setRoleIdList(List<Long> roleIdList) {
+        this.roleIdList = roleIdList;
+    }
+
+    public Long getCreateUserId() {
+        return createUserId;
+    }
+
+    public void setCreateUserId(Long createUserId) {
+        this.createUserId = createUserId;
+    }
+
+    public Long getDeptId() {
+        return deptId;
+    }
+
+    public void setDeptId(Long deptId) {
+        this.deptId = deptId;
+    }
+
+    public String getDeptName() {
+        return deptName;
+    }
+
+    public void setDeptName(String deptName) {
+        this.deptName = deptName;
+    }
+
+    public Set<String> getPermsSet() {
+        return permsSet;
+    }
+
+    public void setPermsSet(Set<String> permsSet) {
+        this.permsSet = permsSet;
+    }
+}

+ 6 - 0
kmall-schedule/src/main/java/com/kmall/schedule/dao/QzOrderMapper.java

@@ -1,5 +1,7 @@
 package com.kmall.schedule.dao;
 
+import com.kmall.schedule.entity.MngChangeJobEntity;
+import com.kmall.schedule.entity.StoreMngChangeJobEntity;
 import org.springframework.stereotype.Component;
 
 import java.util.List;
@@ -36,6 +38,10 @@ public interface QzOrderMapper {
 
     void updateGoodsStockNum(Map param);
 
+    void saveStoreMngChange(StoreMngChangeJobEntity param);
+
+    void saveMngChange(MngChangeJobEntity param);
+
     List<Map> queryRefundOrderList();
 
     void updateOrderRefund(Map param);

+ 273 - 0
kmall-schedule/src/main/java/com/kmall/schedule/entity/MngChangeJobEntity.java

@@ -0,0 +1,273 @@
+package com.kmall.schedule.entity;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 库存变化表实体
+ * 表名 mall_mng_change
+ *
+ * @author emato
+ * @email admin@qhdswl.com
+ * @date 2019-03-11 10:29:49
+ */
+public class MngChangeJobEntity implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 
+     */
+    private Integer id;
+    /**
+     * 商品库存变化数
+     */
+    private Integer changeNum;
+    /**
+     * 商品原库存数
+     */
+    private Integer originalNum;
+    /**
+     * 商品库存可用数
+     */
+    private Integer validNum;
+    /**
+     * 商户编号
+     */
+    private String merchSn;
+    /**
+     * 第三方商户代码
+     */
+    private String thirdPartyMerchCode;
+    /**
+     * 商品id
+     */
+    private Integer goodsId;
+    /**
+     * 是否有效,0:有效,1:无效
+     */
+    private Integer isValid;
+    /**
+     * 变动类型 0:还原 1:扣减
+     */
+    private String changeType;
+    /**
+     * 变动原因
+     */
+    private String changeReason;
+    /**
+     * 创建人编号
+     */
+    private String createrSn;
+    /**
+     * 创建时间
+     */
+    private Date createTime;
+    /**
+     * 修改人编号
+     */
+    private String moderSn;
+    /**
+     * 修改时间
+     */
+    private Date modTime;
+    /**
+     * 时间戳
+     */
+    private Date tstm;
+
+    /**
+     * 设置:
+     */
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    /**
+     * 获取:
+     */
+    public Integer getId() {
+        return id;
+    }
+    /**
+     * 设置:商品库存变化数
+     */
+    public void setChangeNum(Integer changeNum) {
+        this.changeNum = changeNum;
+    }
+
+    /**
+     * 获取:商品库存变化数
+     */
+    public Integer getChangeNum() {
+        return changeNum;
+    }
+    /**
+     * 设置:商品原库存数
+     */
+    public void setOriginalNum(Integer originalNum) {
+        this.originalNum = originalNum;
+    }
+
+    /**
+     * 获取:商品原库存数
+     */
+    public Integer getOriginalNum() {
+        return originalNum;
+    }
+    /**
+     * 设置:商品库存可用数
+     */
+    public void setValidNum(Integer validNum) {
+        this.validNum = validNum;
+    }
+
+    /**
+     * 获取:商品库存可用数
+     */
+    public Integer getValidNum() {
+        return validNum;
+    }
+    /**
+     * 设置:商户编号
+     */
+    public void setMerchSn(String merchSn) {
+        this.merchSn = merchSn;
+    }
+
+    /**
+     * 获取:商户编号
+     */
+    public String getMerchSn() {
+        return merchSn;
+    }
+    /**
+     * 设置:第三方商户代码
+     */
+    public void setThirdPartyMerchCode(String thirdPartyMerchCode) {
+        this.thirdPartyMerchCode = thirdPartyMerchCode;
+    }
+
+    /**
+     * 获取:第三方商户代码
+     */
+    public String getThirdPartyMerchCode() {
+        return thirdPartyMerchCode;
+    }
+    /**
+     * 设置:商品id
+     */
+    public void setGoodsId(Integer goodsId) {
+        this.goodsId = goodsId;
+    }
+
+    /**
+     * 获取:商品id
+     */
+    public Integer getGoodsId() {
+        return goodsId;
+    }
+    /**
+     * 设置:是否有效,0:有效,1:无效
+     */
+    public void setIsValid(Integer isValid) {
+        this.isValid = isValid;
+    }
+
+    /**
+     * 获取:是否有效,0:有效,1:无效
+     */
+    public Integer getIsValid() {
+        return isValid;
+    }
+    /**
+     * 设置:变动类型 0:还原 1:扣减
+     */
+    public void setChangeType(String changeType) {
+        this.changeType = changeType;
+    }
+
+    /**
+     * 获取:变动类型 0:还原 1:扣减
+     */
+    public String getChangeType() {
+        return changeType;
+    }
+    /**
+     * 设置:变动原因
+     */
+    public void setChangeReason(String changeReason) {
+        this.changeReason = changeReason;
+    }
+
+    /**
+     * 获取:变动原因
+     */
+    public String getChangeReason() {
+        return changeReason;
+    }
+    /**
+     * 设置:创建人编号
+     */
+    public void setCreaterSn(String createrSn) {
+        this.createrSn = createrSn;
+    }
+
+    /**
+     * 获取:创建人编号
+     */
+    public String getCreaterSn() {
+        return createrSn;
+    }
+    /**
+     * 设置:创建时间
+     */
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+    /**
+     * 获取:创建时间
+     */
+    public Date getCreateTime() {
+        return createTime;
+    }
+    /**
+     * 设置:修改人编号
+     */
+    public void setModerSn(String moderSn) {
+        this.moderSn = moderSn;
+    }
+
+    /**
+     * 获取:修改人编号
+     */
+    public String getModerSn() {
+        return moderSn;
+    }
+    /**
+     * 设置:修改时间
+     */
+    public void setModTime(Date modTime) {
+        this.modTime = modTime;
+    }
+
+    /**
+     * 获取:修改时间
+     */
+    public Date getModTime() {
+        return modTime;
+    }
+    /**
+     * 设置:时间戳
+     */
+    public void setTstm(Date tstm) {
+        this.tstm = tstm;
+    }
+
+    /**
+     * 获取:时间戳
+     */
+    public Date getTstm() {
+        return tstm;
+    }
+}

+ 273 - 0
kmall-schedule/src/main/java/com/kmall/schedule/entity/StoreMngChangeJobEntity.java

@@ -0,0 +1,273 @@
+package com.kmall.schedule.entity;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 门店库存变化表实体
+ * 表名 mall_store_mng_change
+ *
+ * @author emato
+ * @email admin@qhdswl.com
+ * @date 2019-03-11 10:29:49
+ */
+public class StoreMngChangeJobEntity implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 
+     */
+    private Integer id;
+    /**
+     * 门店库存变化数
+     */
+    private Integer storeChangeNum;
+    /**
+     * 门店原库存数
+     */
+    private Integer storeOriginalNum;
+    /**
+     * 门店库存可用数
+     */
+    private Integer storeValidNum;
+    /**
+     * 商户编号
+     */
+    private String merchSn;
+    /**
+     * 门店编号
+     */
+    private Integer storeId;
+    /**
+     * 商品id
+     */
+    private Integer goodsId;
+    /**
+     * 是否有效,0:有效,1:无效
+     */
+    private Integer isValid;
+    /**
+     * 变动类型 0:还原 1:扣减
+     */
+    private String changeType;
+    /**
+     * 变动原因
+     */
+    private String changeReason;
+    /**
+     * 创建人编号
+     */
+    private String createrSn;
+    /**
+     * 创建时间
+     */
+    private Date createTime;
+    /**
+     * 修改人编号
+     */
+    private String moderSn;
+    /**
+     * 修改时间
+     */
+    private Date modTime;
+    /**
+     * 时间戳
+     */
+    private Date tstm;
+
+    /**
+     * 设置:
+     */
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    /**
+     * 获取:
+     */
+    public Integer getId() {
+        return id;
+    }
+    /**
+     * 设置:门店库存变化数
+     */
+    public void setStoreChangeNum(Integer storeChangeNum) {
+        this.storeChangeNum = storeChangeNum;
+    }
+
+    /**
+     * 获取:门店库存变化数
+     */
+    public Integer getStoreChangeNum() {
+        return storeChangeNum;
+    }
+    /**
+     * 设置:门店原库存数
+     */
+    public void setStoreOriginalNum(Integer storeOriginalNum) {
+        this.storeOriginalNum = storeOriginalNum;
+    }
+
+    /**
+     * 获取:门店原库存数
+     */
+    public Integer getStoreOriginalNum() {
+        return storeOriginalNum;
+    }
+    /**
+     * 设置:门店库存可用数
+     */
+    public void setStoreValidNum(Integer storeValidNum) {
+        this.storeValidNum = storeValidNum;
+    }
+
+    /**
+     * 获取:门店库存可用数
+     */
+    public Integer getStoreValidNum() {
+        return storeValidNum;
+    }
+    /**
+     * 设置:商户编号
+     */
+    public void setMerchSn(String merchSn) {
+        this.merchSn = merchSn;
+    }
+
+    /**
+     * 获取:商户编号
+     */
+    public String getMerchSn() {
+        return merchSn;
+    }
+    /**
+     * 设置:门店编号
+     */
+    public void setStoreId(Integer storeId) {
+        this.storeId = storeId;
+    }
+
+    /**
+     * 获取:门店编号
+     */
+    public Integer getStoreId() {
+        return storeId;
+    }
+    /**
+     * 设置:商品id
+     */
+    public void setGoodsId(Integer goodsId) {
+        this.goodsId = goodsId;
+    }
+
+    /**
+     * 获取:商品id
+     */
+    public Integer getGoodsId() {
+        return goodsId;
+    }
+    /**
+     * 设置:是否有效,0:有效,1:无效
+     */
+    public void setIsValid(Integer isValid) {
+        this.isValid = isValid;
+    }
+
+    /**
+     * 获取:是否有效,0:有效,1:无效
+     */
+    public Integer getIsValid() {
+        return isValid;
+    }
+    /**
+     * 设置:变动类型 0:还原 1:扣减
+     */
+    public void setChangeType(String changeType) {
+        this.changeType = changeType;
+    }
+
+    /**
+     * 获取:变动类型 0:还原 1:扣减
+     */
+    public String getChangeType() {
+        return changeType;
+    }
+    /**
+     * 设置:变动原因
+     */
+    public void setChangeReason(String changeReason) {
+        this.changeReason = changeReason;
+    }
+
+    /**
+     * 获取:变动原因
+     */
+    public String getChangeReason() {
+        return changeReason;
+    }
+    /**
+     * 设置:创建人编号
+     */
+    public void setCreaterSn(String createrSn) {
+        this.createrSn = createrSn;
+    }
+
+    /**
+     * 获取:创建人编号
+     */
+    public String getCreaterSn() {
+        return createrSn;
+    }
+    /**
+     * 设置:创建时间
+     */
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+    /**
+     * 获取:创建时间
+     */
+    public Date getCreateTime() {
+        return createTime;
+    }
+    /**
+     * 设置:修改人编号
+     */
+    public void setModerSn(String moderSn) {
+        this.moderSn = moderSn;
+    }
+
+    /**
+     * 获取:修改人编号
+     */
+    public String getModerSn() {
+        return moderSn;
+    }
+    /**
+     * 设置:修改时间
+     */
+    public void setModTime(Date modTime) {
+        this.modTime = modTime;
+    }
+
+    /**
+     * 获取:修改时间
+     */
+    public Date getModTime() {
+        return modTime;
+    }
+    /**
+     * 设置:时间戳
+     */
+    public void setTstm(Date tstm) {
+        this.tstm = tstm;
+    }
+
+    /**
+     * 获取:时间戳
+     */
+    public Date getTstm() {
+        return tstm;
+    }
+}

+ 5 - 5
kmall-schedule/src/main/java/com/kmall/schedule/quartz/OrderTask.java

@@ -28,13 +28,13 @@ public class OrderTask {
     /**
      * 未评价订单(发送微信模版消息提醒用户)
      * 每日凌晨2:00
-     */
+     *//*
     @Scheduled(cron = "0 0 2 * * ?")
     public void orderUnEvaluateRemind() {
         logger.info(">>>>>>>>>>>>>>>>>>>>groupProgressRemind is start ");
         qzOrderService.orderUnEvaluateRemind();
         logger.info(">>>>>>>>>>>>>>>>>>>>groupProgressRemind is end ");
-    }
+    }*/
 
     /**
      * 方法描述:更新过期未支付订单
@@ -69,16 +69,16 @@ public class OrderTask {
         logger.info(">>>>>>>>>>>>>>>>>>>>orderQueryUpdate is end ");
     }
 
-    /**
+   /* *//**
      * 方法描述:查询支付中的订单以及小程序更新支付信息异常订单,查询平安订单信息更新订单状态
      * 二分钟更新订单
-     */
+     *//*
     @Scheduled(fixedRate = 1000 * 60 * 1)
     public void pinganOrderQueryUpdate() {
         logger.info(">>>>>>>>>>>>>>>>>>>>pinganOrderQueryUpdate is start ");
         qzOrderService.pinganOrderQueryUpdate();
         logger.info(">>>>>>>>>>>>>>>>>>>>pinganOrderQueryUpdate is end ");
-    }
+    }*/
 
     /**
      * 方法描述:商品发货后7天自动确认收货

+ 61 - 10
kmall-schedule/src/main/java/com/kmall/schedule/service/QzOrderService.java

@@ -23,6 +23,8 @@ import com.kmall.common.utils.wechat.WechatRefundQueryResult;
 import com.kmall.manager.manager.wechat.wxtemplate.TemplateData;
 import com.kmall.manager.manager.wechat.wxtemplate.WxTemplateUtil;
 import com.kmall.schedule.quartz.OrderTask;
+import com.kmall.schedule.entity.MngChangeJobEntity;
+import com.kmall.schedule.entity.StoreMngChangeJobEntity;
 import net.sf.json.JSONObject;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
@@ -210,7 +212,7 @@ public class QzOrderService {
         List<Map> pastOrderList = qzOrderMapper.queryPastOrderList();
         if (null != pastOrderList && pastOrderList.size() > 0) {
             for (Map map : pastOrderList) {
-                restStockNum(map);
+                restStockNum(map,"更新过期未支付订单");
             }
             qzOrderMapper.unpayPastUpdate();
         }
@@ -221,31 +223,80 @@ public class QzOrderService {
      * 还原库存
      * @param map
      */
-    private void restStockNum(Map map){
-        Integer number = MapUtils.getInteger("number", map);
-        Integer stock_num = MapUtils.getInteger("stock_num", map);
+    private void restStockNum(Map map, String changeReason){
+        Integer goods_number = MapUtils.getInteger("goods_number", map);//商品总库存数
+        Integer number = MapUtils.getInteger("number", map);//订单商品购买数
+        Integer stock_num = MapUtils.getInteger("stock_num", map);//门店商品总库存数
         Long storeRelaId = MapUtils.getLong("storeRelaId", map);
         String isStockShare = MapUtils.getString("is_stock_share", map);
-        Integer goods_number = MapUtils.getInteger("goods_number", map);
         Long goods_id = MapUtils.getLong("goods_id", map);
         String goods_biz_type = MapUtils.getString("goods_biz_type", map);
+        Long store_id = MapUtils.getLong("store_id", map);
+        String merch_sn = MapUtils.getString("merch_sn", map);
+        String third_party_merch_code = MapUtils.getString("third_party_merch_code", map);
         if(goods_biz_type.equalsIgnoreCase(Dict.orderBizType.item_00.getItem())){
             if(goods_biz_type.equalsIgnoreCase(Dict.orderBizType.item_00.getItem()) && isStockShare.equalsIgnoreCase(Dict.isStockShare.item_1.getItem())) {//共享
                 Map param = Maps.newHashMap();
                 param.put("id", goods_id);
                 param.put("goods_number", goods_number + number);
                 qzOrderMapper.updateGoodsStockNum(param);//商户商品库存还原
+                MngChangeJobEntity mngChangeJobEntity = new MngChangeJobEntity();
+                mngChangeJobEntity.setGoodsId(Integer.parseInt(String.valueOf(goods_id)));
+                mngChangeJobEntity.setThirdPartyMerchCode(third_party_merch_code);
+                mngChangeJobEntity.setChangeReason(changeReason);
+                mngChangeJobEntity.setChangeType(Dict.changeType.item_0.getItem());
+                mngChangeJobEntity.setChangeNum(number);//变化数
+                mngChangeJobEntity.setOriginalNum(goods_number);//原库存数
+                mngChangeJobEntity.setValidNum(goods_number + number);//可用数
+                mngChangeJobEntity.setCreateTime(new Date());
+                mngChangeJobEntity.setModTime(new Date());
+                mngChangeJobEntity.setCreaterSn("定时任务");
+                mngChangeJobEntity.setModerSn("定时任务");
+                mngChangeJobEntity.setIsValid(0);
+                mngChangeJobEntity.setMerchSn(merch_sn);
+                qzOrderMapper.saveMngChange(mngChangeJobEntity);
+
             }else{
                 Map param = Maps.newHashMap();
                 param.put("id", storeRelaId);
                 param.put("stock_num", stock_num + number);
                 qzOrderMapper.updateStockNum(param);//门店库存还原
+                StoreMngChangeJobEntity storeMngChangeJobEntity = new StoreMngChangeJobEntity();
+                storeMngChangeJobEntity.setChangeType(Dict.changeType.item_0.getItem());
+                storeMngChangeJobEntity.setChangeReason(changeReason);
+                storeMngChangeJobEntity.setGoodsId(Integer.parseInt(String.valueOf(goods_id)));
+                storeMngChangeJobEntity.setStoreId(Integer.parseInt(String.valueOf(store_id)));
+                storeMngChangeJobEntity.setMerchSn(merch_sn);
+                storeMngChangeJobEntity.setCreateTime(new Date());
+                storeMngChangeJobEntity.setModTime(new Date());
+                storeMngChangeJobEntity.setStoreChangeNum(number);
+                storeMngChangeJobEntity.setStoreOriginalNum(stock_num);
+                storeMngChangeJobEntity.setStoreValidNum(stock_num + number);
+                storeMngChangeJobEntity.setCreaterSn("定时任务");
+                storeMngChangeJobEntity.setModerSn("定时任务");
+                storeMngChangeJobEntity.setIsValid(0);
+                qzOrderMapper.saveStoreMngChange(storeMngChangeJobEntity);
             }
         }else{
             Map param = Maps.newHashMap();
             param.put("id", storeRelaId);
             param.put("stock_num", stock_num + number);
             qzOrderMapper.updateStockNum(param);//门店库存还原
+            StoreMngChangeJobEntity storeMngChangeJobEntity = new StoreMngChangeJobEntity();
+            storeMngChangeJobEntity.setChangeType(Dict.changeType.item_0.getItem());
+            storeMngChangeJobEntity.setChangeReason(changeReason);
+            storeMngChangeJobEntity.setStoreId(Integer.parseInt(String.valueOf(store_id)));
+            storeMngChangeJobEntity.setGoodsId(Integer.parseInt(String.valueOf(goods_id)));
+            storeMngChangeJobEntity.setMerchSn(merch_sn);
+            storeMngChangeJobEntity.setCreateTime(new Date());
+            storeMngChangeJobEntity.setModTime(new Date());
+            storeMngChangeJobEntity.setStoreChangeNum(number);
+            storeMngChangeJobEntity.setStoreOriginalNum(stock_num);
+            storeMngChangeJobEntity.setStoreValidNum(stock_num + number);
+            storeMngChangeJobEntity.setCreaterSn("定时任务");
+            storeMngChangeJobEntity.setModerSn("定时任务");
+            storeMngChangeJobEntity.setIsValid(0);
+            qzOrderMapper.saveStoreMngChange(storeMngChangeJobEntity);
         }
     }
 
@@ -661,7 +712,7 @@ public class QzOrderService {
                 } else if (result.getTrade_state().equalsIgnoreCase(Dict.tradeState.item_NOTPAY.getItem())) {//订单未支付
                     Map orderRaram = Maps.newHashMap();
                     if (getDateBetween(addTime, nowDate) >= 15) {//订单下单时间超过15分钟直接取消订单
-                        restStockNum(map);//库存还原
+                        restStockNum(map,"定时任务更新过期未支付订单");//库存还原
                         orderRaram.put("orderStatus", Dict.orderStatus.item_101.getItem());//订单状态已取消
                         orderRaram.put("payStatus", Dict.payStatus.item_0.getItem());//支付状态未支付
                     } else {
@@ -676,7 +727,7 @@ public class QzOrderService {
                     orderRaram.put("orderStatus", Dict.orderStatus.item_500.getItem());
                     orderRaram.put("orderId", orderId);
                     qzOrderMapper.updateOrderInfo(orderRaram);
-                    restStockNum(map);//库存还原
+                    restStockNum(map,"定时任务更新已关闭订单");//库存还原
                     logger.info(">>>>>>>>>>>>>>>>>>>>wxOrderByTransactionIdQueryUpdFail 根据支付单查询微信接口返回信息:state 【" + result.getTrade_state() +
                             "】,des【" + result.getTrade_state_desc() + "】");
                 } else if (result.getTrade_state().equalsIgnoreCase(Dict.tradeState.item_PAYERROR.getItem())) {
@@ -749,7 +800,7 @@ public class QzOrderService {
                 } else if (result.getTrade_state().equalsIgnoreCase(Dict.tradeState.item_NOTPAY.getItem())) {//订单未支付
                     Map orderRaram = Maps.newHashMap();
                     if (getDateBetween(addTime, nowDate) >= 15) {//订单下单时间超过15分钟直接取消订单
-                        restStockNum(map);//库存还原
+                        restStockNum(map,"定时任务更新过期未支付订单");//库存还原
                         orderRaram.put("orderStatus", Dict.orderStatus.item_101.getItem());//订单状态已取消
                         orderRaram.put("payStatus", Dict.payStatus.item_0.getItem());//支付状态未支付
                     } else {
@@ -764,7 +815,7 @@ public class QzOrderService {
                     orderRaram.put("orderStatus", Dict.orderStatus.item_500.getItem());
                     orderRaram.put("orderId", orderId);
                     qzOrderMapper.updateOrderInfo(orderRaram);
-                    restStockNum(map);//库存还原
+                    restStockNum(map,"定时任务更新已关闭订单");//库存还原
                     logger.info(">>>>>>>>>>>>>>>>>>>>wxGlobalOrderByTransactionIdQueryUpdFail 根据支付单查询微信国际接口返回信息:state 【" + result.getTrade_state() +
                             "】,des【" + Dict.tradeState.item_CLOSED.getItemName() + "】");
                 } else if (result.getTrade_state().equalsIgnoreCase(Dict.tradeState.item_PAYERROR.getItem())) {
@@ -843,7 +894,7 @@ public class QzOrderService {
                             if (getDateBetween(addTime, nowDate) >= 15) {//订单下单时间超过15分钟直接取消订单
                                 orderRaram.put("payStatus", 0);//支付状态未支付
                                 orderRaram.put("orderStatus", 101);//订单状态已取消
-                                restStockNum(map);//库存还原
+                                restStockNum(map, "定时任务更新平安超时未支付订单");//库存还原
                             } else {
                                 orderRaram.put("payStatus", 0);//支付状态未支付
                                 orderRaram.put("orderStatus", 0);//订单状态未支付

+ 54 - 54
kmall-schedule/src/main/resources/logback.xml

@@ -1,50 +1,50 @@
-<?xml version="1.0" encoding="UTF-8"?>
+<?xml version="1.0" encoding="GBK"?>
 <!--
-scan锛氬綋姝ゅ睘鎬ц�缃�负true鏃讹紝閰嶇疆鏂囦欢濡傛灉鍙戠敓鏀瑰彉锛屽皢浼氳�閲嶆柊鍔犺浇锛岄粯璁ゅ€间负true銆�
-scanPeriod锛氳�缃�洃娴嬮厤缃�枃浠舵槸鍚︽湁淇�敼鐨勬椂闂撮棿闅旓紝濡傛灉娌℃湁缁欏嚭鏃堕棿鍗曚綅锛岄粯璁ゅ崟浣嶆槸姣��褰搒can涓簍rue鏃讹紝姝ゅ睘鎬х敓鏁堛€傞粯璁ょ殑鏃堕棿闂撮殧涓�1鍒嗛挓銆�
-debug锛氬綋姝ゅ睘鎬ц�缃�负true鏃讹紝灏嗘墦鍗板嚭logback鍐呴儴鏃ュ織淇℃伅锛屽疄鏃舵煡鐪媗ogback杩愯�鐘舵€併€傞粯璁ゅ€间负false銆�
+scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true。
+scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒当scan为true时,此属性生效。默认的时间间隔为1分钟。
+debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。
 -->
 <configuration scan="false" scanPeriod="60 seconds" debug="false">
 
     <property name="LOG_HOME" value="/data/logs/kmall-pt/kmall-schedule/"/>
-    <!-- 瀹氫箟鏃ュ織鐨勬牴鐩�綍 -->
+    <!-- 定义日志的根目录 -->
     <property name="TRACE_DIR" value="trace" />
     <property name="DEBUG_DIR" value="debug" />
     <property name="INFO_DIR" value="info" />
     <property name="WARN_DIR" value="warn" />
     <property name="ERROR_DIR" value="error" />
-    <!-- 瀹氫箟鏃ュ織鏂囦欢鍚嶇О -->
+    <!-- 定义日志文件名称 -->
     <property name="TRACE_FILE_NAME" value="kmall-schedule-trace"></property>
     <property name="DEBUG_FILE_NAME" value="kmall-schedule-debug"></property>
     <property name="INFO_FILE_NAME" value="kmall-schedule-info"></property>
     <property name="WARN_FILE_NAME" value="kmall-schedule-warn"></property>
     <property name="ERROR_FILE_NAME" value="kmall-schedule-error"></property>
 
-    <!-- 瀹氫箟鏃ュ織绾у埆棰滆壊 -->
-    <!-- 鎺у埗鍙版樉绀� -->
+    <!-- 定义日志级别颜色 -->
+    <!-- 控制台显示 -->
     <property name="STD_CONSOLE_LOG_PATTERN"
               value="%d{yyyy-MM-dd HH:mm:ss.SSS}[%yellow(%thread)]-[%highlight(%-5level)][%green(%logger{70}):%cyan(%line)] - %msg%n"/>
 
-    <!-- 鏃ュ織鏂囦欢鎵撳嵃 -->
+    <!-- 日志文件打印 -->
     <property name="CONSOLE_LOG_PATTERN"
               value="%d{yyyy-MM-dd HH:mm:ss.SSS}[%thread]-[%-5level][%logger{70}:%line] - %msg%n"/>
 
-    <!-- ConsoleAppender 鎺у埗鍙拌緭鍑� appender -->
+    <!-- ConsoleAppender 控制台输出 appender -->
     <appender name="stdoutAppender" class="ch.qos.logback.core.ConsoleAppender">
         <!--
-        鏃ュ織杈撳嚭鏍煎紡锛�%d琛ㄧず鏃ユ湡鏃堕棿锛�%thread琛ㄧず绾跨▼鍚嶏紝%-5level锛氱骇鍒�粠宸︽樉绀�5涓�瓧绗﹀�搴�
-        %logger{70} 琛ㄧずlogger鍚嶅瓧鏈€闀�50涓�瓧绗︼紝鍚﹀垯鎸夌収鍙ョ偣鍒嗗壊銆� %msg锛氭棩蹇楁秷鎭�紝%n鏄�崲琛岀�
+        日志输出格式:%d表示日期时间,%thread表示线程名,%-5level:级别从左显示5个字符宽度
+        %logger{70} 表示logger名字最长50个字符,否则按照句点分割。 %msg:日志消息,%n是换行符
         -->
         <encoder>
             <pattern>${STD_CONSOLE_LOG_PATTERN}</pattern>
-            <charset>UTF-8</charset>
+            <charset>GBK</charset>
         </encoder>
     </appender>
 
 
-    <!-- TRACE 鏃ュ織 appender  -->
+    <!-- TRACE 日志 appender  -->
     <appender name="traceAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
-        <!-- 鎸囧畾鏃ュ織鏂囦欢鐨勫悕绉� -->
+        <!-- 指定日志文件的名称 -->
         <file>${LOG_HOME}/${TRACE_DIR}/${TRACE_FILE_NAME}.log</file>
         <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
             <fileNamePattern>${LOG_HOME}/${TRACE_DIR}/${TRACE_FILE_NAME}-%d{yyyy-MM-dd}-%i.log</fileNamePattern>
@@ -55,7 +55,7 @@ debug锛氬綋姝ゅ睘鎬ц�缃�负true鏃讹紝灏嗘墦鍗板嚭logback鍐呴儴鏃ュ織淇℃伅锛�
         </rollingPolicy>
         <encoder>
             <pattern>${CONSOLE_LOG_PATTERN}</pattern>
-            <charset>UTF-8</charset>
+            <charset>GBK</charset>
         </encoder>
         <filter class="ch.qos.logback.classic.filter.LevelFilter">
             <level>TRACE</level>
@@ -65,9 +65,9 @@ debug锛氬綋姝ゅ睘鎬ц�缃�负true鏃讹紝灏嗘墦鍗板嚭logback鍐呴儴鏃ュ織淇℃伅锛�
     </appender>
 
 
-    <!-- DEBUG 鏃ュ織 appender  -->
+    <!-- DEBUG 日志 appender  -->
     <appender name="debugAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
-        <!-- 鎸囧畾鏃ュ織鏂囦欢鐨勫悕绉� -->
+        <!-- 指定日志文件的名称 -->
         <file>${LOG_HOME}/${DEBUG_DIR}/${DEBUG_FILE_NAME}.log</file>
         <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
             <fileNamePattern>${LOG_HOME}/${DEBUG_DIR}/${DEBUG_FILE_NAME}-%d{yyyy-MM-dd}-%i.log</fileNamePattern>
@@ -78,7 +78,7 @@ debug锛氬綋姝ゅ睘鎬ц�缃�负true鏃讹紝灏嗘墦鍗板嚭logback鍐呴儴鏃ュ織淇℃伅锛�
         </rollingPolicy>
         <encoder>
             <pattern>${CONSOLE_LOG_PATTERN}</pattern>
-            <charset>UTF-8</charset>
+            <charset>GBK</charset>
         </encoder>
         <filter class="ch.qos.logback.classic.filter.LevelFilter">
             <level>DEBUG</level>
@@ -88,9 +88,9 @@ debug锛氬綋姝ゅ睘鎬ц�缃�负true鏃讹紝灏嗘墦鍗板嚭logback鍐呴儴鏃ュ織淇℃伅锛�
     </appender>
 
 
-    <!-- phrase 鏃ュ織 appender  -->
+    <!-- phrase 日志 appender  -->
     <appender name="infoAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
-        <!-- 鎸囧畾鏃ュ織鏂囦欢鐨勫悕绉� -->
+        <!-- 指定日志文件的名称 -->
         <file>${LOG_HOME}/${INFO_DIR}/${INFO_FILE_NAME}.log</file>
         <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
             <fileNamePattern>${LOG_HOME}/${INFO_DIR}/${INFO_FILE_NAME}-%d{yyyy-MM-dd}-%i.log</fileNamePattern>
@@ -101,7 +101,7 @@ debug锛氬綋姝ゅ睘鎬ц�缃�负true鏃讹紝灏嗘墦鍗板嚭logback鍐呴儴鏃ュ織淇℃伅锛�
         </rollingPolicy>
         <encoder>
             <pattern>${CONSOLE_LOG_PATTERN}</pattern>
-            <charset>UTF-8</charset>
+            <charset>GBK</charset>
         </encoder>
         <filter class="ch.qos.logback.classic.filter.LevelFilter">
             <level>INFO</level>
@@ -111,9 +111,9 @@ debug锛氬綋姝ゅ睘鎬ц�缃�负true鏃讹紝灏嗘墦鍗板嚭logback鍐呴儴鏃ュ織淇℃伅锛�
     </appender>
 
 
-    <!-- WARN 鏃ュ織 appender  -->
+    <!-- WARN 日志 appender  -->
     <appender name="warnAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
-        <!-- 鎸囧畾鏃ュ織鏂囦欢鐨勫悕绉� -->
+        <!-- 指定日志文件的名称 -->
         <file>${LOG_HOME}/${WARN_DIR}/${WARN_FILE_NAME}.log</file>
         <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
             <fileNamePattern>${LOG_HOME}/${WARN_DIR}/${WARN_FILE_NAME}-%d{yyyy-MM-dd}-%i.log</fileNamePattern>
@@ -124,7 +124,7 @@ debug锛氬綋姝ゅ睘鎬ц�缃�负true鏃讹紝灏嗘墦鍗板嚭logback鍐呴儴鏃ュ織淇℃伅锛�
         </rollingPolicy>
         <encoder>
             <pattern>${CONSOLE_LOG_PATTERN}</pattern>
-            <charset>UTF-8</charset>
+            <charset>GBK</charset>
         </encoder>
         <filter class="ch.qos.logback.classic.filter.LevelFilter">
             <level>WARN</level>
@@ -134,67 +134,67 @@ debug锛氬綋姝ゅ睘鎬ц�缃�负true鏃讹紝灏嗘墦鍗板嚭logback鍐呴儴鏃ュ織淇℃伅锛�
     </appender>
 
 
-    <!-- ERROR 鏃ュ織 appender  -->
+    <!-- ERROR 日志 appender  -->
     <appender name="errorAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
-        <!-- 鎸囧畾鏃ュ織鏂囦欢鐨勫悕绉� -->
+        <!-- 指定日志文件的名称 -->
         <file>${LOG_HOME}/${ERROR_DIR}/${ERROR_FILE_NAME}.log</file>
         <!--
-        褰撳彂鐢熸粴鍔ㄦ椂锛屽喅瀹� RollingFileAppender 鐨勮�涓猴紝娑夊強鏂囦欢绉诲姩鍜岄噸鍛藉悕
-        TimeBasedRollingPolicy锛� 鏈€甯哥敤鐨勬粴鍔ㄧ瓥鐣ワ紝瀹冩牴鎹�椂闂存潵鍒跺畾婊氬姩绛栫暐锛屾棦璐熻矗婊氬姩涔熻礋璐e嚭鍙戞粴鍔ㄣ€�
+        当发生滚动时,决定 RollingFileAppender 的行为,涉及文件移动和重命名
+        TimeBasedRollingPolicy: 最常用的滚动策略,它根据时间来制定滚动策略,既负责滚动也负责出发滚动。
         -->
         <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
             <!--
-            婊氬姩鏃朵骇鐢熺殑鏂囦欢鐨勫瓨鏀句綅缃�強鏂囦欢鍚嶇О %d{yyyy-MM-dd}锛氭寜澶╄繘琛屾棩蹇楁粴鍔�
-            %i锛氬綋鏂囦欢澶у皬瓒呰繃maxFileSize鏃讹紝鎸夌収i杩涜�鏂囦欢婊氬姩
+            滚动时产生的文件的存放位置及文件名称 %d{yyyy-MM-dd}:按天进行日志滚动
+            %i:当文件大小超过maxFileSize时,按照i进行文件滚动
             -->
             <fileNamePattern>${LOG_HOME}/${ERROR_DIR}/${ERROR_FILE_NAME}-%d{yyyy-MM-dd}-%i.log</fileNamePattern>
             <!--
-            鍙�€夎妭鐐癸紝鎺у埗淇濈暀鐨勫綊妗f枃浠剁殑鏈€澶ф暟閲忥紝瓒呭嚭鏁伴噺灏卞垹闄ゆ棫鏂囦欢銆傚亣璁捐�缃�瘡澶╂粴鍔�紝
-            涓攎axHistory鏄�365锛屽垯鍙�繚瀛樻渶杩�365澶╃殑鏂囦欢锛屽垹闄や箣鍓嶇殑鏃ф枃浠躲€傛敞鎰忥紝鍒犻櫎鏃ф枃浠舵槸锛�
-            閭d簺涓轰簡褰掓。鑰屽垱寤虹殑鐩�綍涔熶細琚�垹闄ゃ€�
+            可选节点,控制保留的归档文件的最大数量,超出数量就删除旧文件。假设设置每天滚动,
+            且maxHistory是365,则只保存最近365天的文件,删除之前的旧文件。注意,删除旧文件是,
+            那些为了归档而创建的目录也会被删除。
             -->
             <MaxHistory>365</MaxHistory>
             <!--
-            褰撴棩蹇楁枃浠惰秴杩噈axFileSize鎸囧畾鐨勫ぇ灏忔槸锛屾牴鎹�笂闈㈡彁鍒扮殑%i杩涜�鏃ュ織鏂囦欢婊氬姩 娉ㄦ剰姝ゅ�閰嶇疆SizeBasedTriggeringPolicy鏄�棤娉曞疄鐜版寜鏂囦欢澶у皬杩涜�婊氬姩鐨勶紝蹇呴』閰嶇疆timeBasedFileNamingAndTriggeringPolicy
+            当日志文件超过maxFileSize指定的大小是,根据上面提到的%i进行日志文件滚动 注意此处配置SizeBasedTriggeringPolicy是无法实现按文件大小进行滚动的,必须配置timeBasedFileNamingAndTriggeringPolicy
             -->
             <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                 <maxFileSize>10MB</maxFileSize>
             </timeBasedFileNamingAndTriggeringPolicy>
         </rollingPolicy>
         <!--
-        鏃ュ織杈撳嚭鏍煎紡锛�%d琛ㄧず鏃ユ湡鏃堕棿锛�%thread琛ㄧず绾跨▼鍚嶏紝%-5level锛氱骇鍒�粠宸︽樉绀�5涓�瓧绗﹀�搴� %logger{70} 琛ㄧずlogger鍚嶅瓧鏈€闀�50涓�瓧绗︼紝鍚﹀垯鎸夌収鍙ョ偣鍒嗗壊銆� %msg锛氭棩蹇楁秷鎭�紝%n鏄�崲琛岀�
+        日志输出格式:%d表示日期时间,%thread表示线程名,%-5level:级别从左显示5个字符宽度 %logger{70} 表示logger名字最长50个字符,否则按照句点分割。 %msg:日志消息,%n是换行符
         -->
         <encoder>
             <pattern>${CONSOLE_LOG_PATTERN}</pattern>
-            <charset>UTF-8</charset>
+            <charset>GBK</charset>
         </encoder>
         <!--
-        杩囨护鍣ㄨ繑鍥炴灇涓撅細DENY锛孨EUTRAL锛孉CCEPT銆�
-        杩斿洖DENY锛屾棩蹇楀皢绔嬪嵆琚�姏寮冧笉鍐嶇粡杩囧叾浠栬繃婊ゅ櫒锛涜繑鍥濶EUTRAL锛屾湁搴忓垪琛ㄩ噷鐨勪笅涓�繃婊ゅ櫒杩囨帴鐫€澶勭悊鏃ュ織锛涜繑鍥濧CCEPT锛屾棩蹇椾細琚�珛鍗冲�鐞嗕笉鍐嶇粡杩囧墿浣欒繃婊ゅ櫒銆�
-        LevelFilter锛� 绾у埆杩囨护鍣�紝鏍规嵁鏃ュ織绾у埆杩涜�杩囨护銆傚�鏋滄棩蹇楃骇鍒�瓑浜庨厤缃�骇鍒�紝杩囨护鍣ㄤ細鏍规嵁onMath 鍜� onMismatch鎺ユ敹鎴栨嫆缁濇棩蹇椼€傝妭鐐癸細level锛宱nMatch锛宱nMismatch
+        过滤器返回枚举:DENY,NEUTRAL,ACCEPT。
+        返回DENY,日志将立即被抛弃不再经过其他过滤器;返回NEUTRAL,有序列表里的下个过滤器过接着处理日志;返回ACCEPT,日志会被立即处理不再经过剩余过滤器。
+        LevelFilter: 级别过滤器,根据日志级别进行过滤。如果日志级别等于配置级别,过滤器会根据onMath 和 onMismatch接收或拒绝日志。节点:level,onMatch,onMismatch
         -->
-        <filter class="ch.qos.logback.classic.filter.LevelFilter"><!-- 鍙�墦鍗伴敊璇�棩蹇� -->
-            <!-- 璁剧疆杩囨护绾у埆 -->
+        <filter class="ch.qos.logback.classic.filter.LevelFilter"><!-- 只打印错误日志 -->
+            <!-- 设置过滤级别 -->
             <level>ERROR</level>
-            <!-- 閰嶇疆绗﹀悎杩囨护鏉′欢鐨勬搷浣�
+            <!-- 配置符合过滤条件的操作
             <onMatch>ACCEPT</onMatch>
-            &lt;!&ndash; 閰嶇疆涓嶇�鍚堣繃婊ゆ潯浠剁殑鎿嶄綔 &ndash;&gt;
+            &lt;!&ndash; 配置不符合过滤条件的操作 &ndash;&gt;
             <onMismatch>DENY</onMismatch>-->
         </filter>
     </appender>
 
 
     <!--
-    logger涓昏�鐢ㄤ簬瀛樻斁鏃ュ織瀵硅薄锛屼篃鍙�互瀹氫箟鏃ュ織绫诲瀷銆佺骇鍒�
-    name锛氳〃绀哄尮閰嶇殑logger绫诲瀷鍓嶇紑锛屼篃灏辨槸鍖呯殑鍓嶅崐閮ㄥ垎
-    level锛氳�璁板綍鐨勬棩蹇楃骇鍒�紝澶у皬鍐欐棤鍏筹紝鍖呮嫭 TRACE锛孌EBUG锛孖NFO锛學ARN锛孍RROR锛孉LL 鍜� OFF銆�
-    additivity锛氭槸鍚﹀悜涓婄骇loger浼犻€掓墦鍗颁俊鎭�€傞粯璁ゆ槸true銆� 浣滅敤鍦ㄤ簬children-logger鏄�惁鍚戜笂绾�oot-logger閰嶇疆鐨刟ppender浼犻€掓墦鍗颁俊鎭�紝false锛氫笉浼犻€掞紝true锛氫紶閫�
+    logger主要用于存放日志对象,也可以定义日志类型、级别
+    name:表示匹配的logger类型前缀,也就是包的前半部分
+    level:要记录的日志级别,大小写无关,包括 TRACE,DEBUG,INFO,WARN,ERROR,ALL 和 OFF。
+    additivity:是否向上级loger传递打印信息。默认是true。 作用在于children-logger是否向上级root-logger配置的appender传递打印信息,false:不传递,true:传递
     -->
     <!--
-    娌¤�缃甽evel锛岀户鎵夸粬鐨勪笂绾�<root>鐨勬棩蹇楃骇鍒�紱
-    娌℃湁璁剧疆additivity锛岄粯璁や负true锛屽皢姝�oger鐨勬墦鍗颁俊鎭�悜涓婄骇<root>浼犻€掞紱
-    娌℃湁璁剧疆appender锛屾�loger鏈�韩涓嶆墦鍗颁换浣曚俊鎭�紱
-    瀛�<logger>鍚�<root>浼犻€掍俊鎭�悗锛屾棩蹇條evel 瀹屽叏鐢卞瓙绾у埆鐨刲evel 鍐冲畾锛�
+    没设置level,继承他的上级<root>的日志级别;
+    没有设置additivity,默认为true,将此loger的打印信息向上级<root>传递;
+    没有设置appender,此loger本身不打印任何信息;
+    子<logger>向<root>传递信息后,日志level 完全由子级别的level 决定;
     -->
 
     <logger name="org.apache" level="ERROR"/>
@@ -214,8 +214,8 @@ debug锛氬綋姝ゅ睘鎬ц�缃�负true鏃讹紝灏嗘墦鍗板嚭logback鍐呴儴鏃ュ織淇℃伅锛�
     <logger name="com.kmall" level="DEBUG"/>
 
     <!--
-    root涓巐ogger鏄�埗瀛愬叧绯伙紝娌℃湁鐗瑰埆瀹氫箟鍒欓粯璁や负root锛屼换浣曚竴涓�被鍙�細鍜屼竴涓猯ogger瀵瑰簲锛�
-    瑕佷箞鏄�畾涔夌殑logger锛岃�涔堟槸root锛屽垽鏂�殑鍏抽敭鍦ㄤ簬鎵惧埌杩欎釜logger锛岀劧鍚庡垽鏂�繖涓猯ogger鐨刲evel鍜宎ppender銆�
+    root与logger是父子关系,没有特别定义则默认为root,任何一个类只会和一个logger对应,
+    要么是定义的logger,要么是root,判断的关键在于找到这个logger,然后判断这个logger的level和appender。
     -->
     <root level="DEBUG" >
         <appender-ref ref="stdoutAppender" />

+ 73 - 5
kmall-schedule/src/main/resources/mybatis/mapper/QzOrderMapper.xml

@@ -21,7 +21,8 @@
     </select>
 
     <select id="queryPastOrderList" resultType="map">
-        SELECT b.product_id,b.number,c.stock_num,c.id as storeRelaId,mb.is_stock_share,mb.third_party_merch_code,g.goods_number,g.id goods_id,g.goods_biz_type
+        SELECT b.product_id,b.number,c.stock_num,c.id as storeRelaId,mb.is_stock_share,mb.third_party_merch_code,g.goods_number,g.id goods_id,g.goods_biz_type,
+        a.store_id,g.merch_sn
         FROM mall_order a
         LEFT JOIN mall_order_goods b ON a.id = b.order_id
         LEFT JOIN mall_product_store_rela c ON b.goods_id = c.goods_id
@@ -51,15 +52,80 @@
     <update id="updateGoodsStockNum" parameterType="map">
         update mall_goods a
         <set>
-            <if test="stock_num != null">a.`goods_number` = #{goods_number},</if>
+            <if test="goods_number != null">a.`goods_number` = #{goods_number},</if>
         </set>
         where a.id = #{id}
     </update>
 
+    <insert id="saveStoreMngChange" parameterType="com.kmall.schedule.entity.StoreMngChangeJobEntity">
+        insert into mall_store_mng_change(
+        `store_change_num`,
+        `store_original_num`,
+        `store_valid_num`,
+        `merch_sn`,
+        `store_id`,
+        `goods_id`,
+        `is_valid`,
+        `change_type`,
+        `change_reason`,
+        `creater_sn`,
+        `create_time`,
+        `moder_sn`,
+        `mod_time`,
+        `tstm`)
+        values(
+        #{storeChangeNum},
+        #{storeOriginalNum},
+        #{storeValidNum},
+        #{merchSn},
+        #{storeId},
+        #{goodsId},
+        #{isValid},
+        #{changeType},
+        #{changeReason},
+        #{createrSn},
+        #{createTime},
+        #{moderSn},
+        #{modTime},
+        #{tstm})
+    </insert>
+
+    <insert id="saveMngChange" parameterType="com.kmall.schedule.entity.MngChangeJobEntity">
+        insert into mall_mng_change(
+        `change_num`,
+        `original_num`,
+        `valid_num`,
+        `merch_sn`,
+        `third_party_merch_code`,
+        `goods_id`,
+        `is_valid`,
+        `change_type`,
+        `change_reason`,
+        `creater_sn`,
+        `create_time`,
+        `moder_sn`,
+        `mod_time`,
+        `tstm`)
+        values(
+        #{changeNum},
+        #{originalNum},
+        #{validNum},
+        #{merchSn},
+        #{thirdPartyMerchCode},
+        #{goodsId},
+        #{isValid},
+        #{changeType},
+        #{changeReason},
+        #{createrSn},
+        #{createTime},
+        #{moderSn},
+        #{modTime},
+        #{tstm})
+    </insert>
 
     <select id="queryRefundOrderList" resultType="map">
         select a.pay_transaction_id,a.merch_order_sn,a.order_sn,a.order_status,a.pay_status,f.out_refund_no,f.refund_id,f.order_id,f.id 'orderRefundId',a.is_onffline_order,
-        a.order_sn_wx,a.pay_flag
+        a.order_sn_wx,a.pay_flag,a.store_id,a.merch_sn
         from mall_order a
         inner join mall_order_refund f on a.id = f.order_id	where (f.out_refund_no is null or f.refund_id is null
         or f.refund_time is null or f.wechat_refund_status_des is null) and a.order_status = '401' and f.refund_status
@@ -68,7 +134,8 @@
 
     <select id="queryPayingOrderList" resultType="map">
 		select a.pay_transaction_id,a.order_sn,a.order_status,a.pay_status,a.id 'order_id',a.merch_order_sn,date_format(a.add_time,'%Y-%m-%d %H:%i:%s') as add_time,
-        b.product_id,b.number,c.stock_num,c.id as storeRelaId,a.pay_flag,mb.is_stock_share,mb.third_party_merch_code,g.goods_number,g.id goods_id,g.goods_biz_type
+        b.product_id,b.number,c.stock_num,c.id as storeRelaId,a.pay_flag,mb.is_stock_share,mb.third_party_merch_code,g.goods_number,g.id goods_id,g.goods_biz_type,
+        a.store_id,g.merch_sn,mb.third_party_merch_code
         from mall_order a
         LEFT JOIN mall_order_goods b ON a.id = b.order_id
         LEFT JOIN mall_product_store_rela c ON b.goods_id = c.goods_id
@@ -82,7 +149,8 @@
 
     <select id="queryPinganPayingOrderList" resultType="map">
 		select a.pay_transaction_id,a.order_sn,a.order_status,a.pay_status,a.id 'order_id',a.merch_order_sn,date_format(a.add_time,'%Y-%m-%d %H:%i:%s') as add_time,
-        b.product_id,b.number,c.stock_num,c.id as storeRelaId,a.pay_flag,mb.is_stock_share,mb.third_party_merch_code,g.goods_number,g.id goods_id,g.goods_biz_type
+        b.product_id,b.number,c.stock_num,c.id as storeRelaId,a.pay_flag,mb.is_stock_share,mb.third_party_merch_code,g.goods_number,g.id goods_id,g.goods_biz_type,
+        a.store_id,g.merch_sn,mb.third_party_merch_code
         from mall_order a
         LEFT JOIN mall_order_goods b ON a.id = b.order_id
         LEFT JOIN mall_product_store_rela c ON b.goods_id = c.goods_id