Explorar o código

Merge branch 'feature/出入库'

lhm %!s(int64=3) %!d(string=hai) anos
pai
achega
36be66d04c
Modificáronse 24 ficheiros con 1761 adicións e 157 borrados
  1. 49 0
      kmall-admin/src/main/java/com/kmall/admin/config/JacksonConfig.java
  2. 160 0
      kmall-admin/src/main/java/com/kmall/admin/controller/haikong/StockChangeController.java
  3. 27 0
      kmall-admin/src/main/java/com/kmall/admin/dao/haikong/StockChangeDao.java
  4. 4 0
      kmall-admin/src/main/java/com/kmall/admin/dao/haikong/StockChangeRecordDao.java
  5. 83 0
      kmall-admin/src/main/java/com/kmall/admin/dto/StockChangeDto.java
  6. 18 34
      kmall-admin/src/main/java/com/kmall/admin/dto/StockChangeRecordDto.java
  7. 312 0
      kmall-admin/src/main/java/com/kmall/admin/entity/haikong/StockChangeEntity.java
  8. 71 75
      kmall-admin/src/main/java/com/kmall/admin/entity/haikong/StockChangeRecordEntity.java
  9. 40 4
      kmall-admin/src/main/java/com/kmall/admin/haikong/constant/Constants.java
  10. 4 0
      kmall-admin/src/main/java/com/kmall/admin/service/haikong/StockChangeRecordService.java
  11. 85 0
      kmall-admin/src/main/java/com/kmall/admin/service/haikong/StockChangeService.java
  12. 2 2
      kmall-admin/src/main/java/com/kmall/admin/service/impl/OrderServiceImpl.java
  13. 9 0
      kmall-admin/src/main/java/com/kmall/admin/service/impl/haikong/StockChangeRecordServiceImpl.java
  14. 238 0
      kmall-admin/src/main/java/com/kmall/admin/service/impl/haikong/StockChangeServiceImpl.java
  15. 30 0
      kmall-admin/src/main/resources/XmlTemplate/StockChangeDtoList.xml
  16. 12 1
      kmall-admin/src/main/resources/mybatis/mapper/OrderProcessRecordDao.xml
  17. 184 0
      kmall-admin/src/main/resources/mybatis/mapper/haikong/StockChangeDao.xml
  18. 56 22
      kmall-admin/src/main/resources/mybatis/mapper/haikong/StockChangeRecordDao.xml
  19. 19 19
      kmall-admin/src/main/resources/spring/spring-mvc.xml
  20. 104 0
      kmall-admin/src/main/webapp/WEB-INF/page/shop/stockchange.html
  21. 4 0
      kmall-admin/src/main/webapp/js/sale/sale.js
  22. 248 0
      kmall-admin/src/main/webapp/js/shop/stockchange.js
  23. BIN=BIN
      kmall-admin/src/main/webapp/statics/file/stock_change.xlsx
  24. 2 0
      kmall-common/src/main/java/com/kmall/common/constant/JxlsXmlTemplateName.java

+ 49 - 0
kmall-admin/src/main/java/com/kmall/admin/config/JacksonConfig.java

@@ -0,0 +1,49 @@
+package com.kmall.admin.config;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.SerializationFeature;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.http.MediaType;
+import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
+
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.TimeZone;
+
+/**
+ * @author lhm
+ * @createDate 2021-12-29
+ */
+@Configuration
+public class JacksonConfig {
+
+    @Bean
+    public ObjectMapper objectMapper() {
+        ObjectMapper objectMapper = new ObjectMapper();
+
+        objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
+
+        objectMapper.setTimeZone(TimeZone.getTimeZone("GMT+8"));
+
+        objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
+
+        return objectMapper;
+    }
+
+    @Bean
+    public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter(ObjectMapper objectMapper) {
+        MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter();
+
+        mappingJackson2HttpMessageConverter.setObjectMapper(objectMapper);
+        List<MediaType> mediaTypes = new ArrayList<>();
+        mediaTypes.add(MediaType.parseMediaType("application/json;charset=UTF-8"));
+        mediaTypes.add(MediaType.parseMediaType("text/html;charset=UTF-8"));
+
+        mappingJackson2HttpMessageConverter.setSupportedMediaTypes(mediaTypes);
+
+        return mappingJackson2HttpMessageConverter;
+    }
+
+}

+ 160 - 0
kmall-admin/src/main/java/com/kmall/admin/controller/haikong/StockChangeController.java

@@ -0,0 +1,160 @@
+package com.kmall.admin.controller.haikong;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import com.kmall.admin.dto.StockChangeDto;
+import com.kmall.admin.dto.StockChangeRecordDto;
+import com.kmall.admin.entity.haikong.StockChangeEntity;
+import com.kmall.admin.haikong.constant.Constants;
+import com.kmall.admin.service.haikong.StockChangeService;
+import com.kmall.common.constant.JxlsXmlTemplateName;
+import com.kmall.common.utils.PageUtils;
+import com.kmall.common.utils.Query;
+import com.kmall.common.utils.R;
+import com.kmall.common.utils.excel.ExcelUtil;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+/**
+ * Controller
+ *
+ * @author emato
+ * @email admin@qhdswl.com
+ * @date 2021-12-29 14:46:49
+ */
+@Controller
+@RequestMapping("stockchange")
+public class StockChangeController {
+    @Autowired
+    private StockChangeService stockChangeService;
+    @Autowired
+    private ExcelUtil excelUtil;
+    private final static Logger log = LoggerFactory.getLogger(StockChangeController.class);
+
+    /**
+     * 查看列表
+     */
+    @RequestMapping("/list")
+    @ResponseBody
+    public R list(@RequestParam Map<String, Object> params) {
+        //查询列表数据
+        Query query = new Query(params);
+
+        List<StockChangeEntity> stockChangeList = stockChangeService.queryList(query);
+        int total = stockChangeService.queryTotal(query);
+
+        PageUtils pageUtil = new PageUtils(stockChangeList, total, query.getLimit(), query.getPage());
+
+        return R.ok().put("page", pageUtil);
+    }
+
+    /**
+     * 查看信息
+     */
+    @RequestMapping("/info/{id}")
+    @ResponseBody
+    public R info(@PathVariable("id") String id) {
+        StockChangeEntity stockChange = stockChangeService.queryObject(id);
+
+        return R.ok().put("stockChange", stockChange);
+    }
+
+    /**
+     * 保存
+     */
+    @RequestMapping("/save")
+    @ResponseBody
+    public R save(@RequestBody StockChangeEntity stockChange) {
+        stockChangeService.save(stockChange);
+
+        return R.ok();
+    }
+
+    /**
+     * 修改
+     */
+    @RequestMapping("/update")
+    @ResponseBody
+    public R update(@RequestBody StockChangeEntity stockChange) {
+        stockChangeService.update(stockChange);
+
+        return R.ok();
+    }
+
+    /**
+     * 删除
+     */
+    @RequestMapping("/delete")
+    @ResponseBody
+    public R delete(@RequestBody String[]ids) {
+        stockChangeService.deleteBatch(ids);
+
+        return R.ok();
+    }
+
+    /**
+     * 查看所有列表
+     */
+    @RequestMapping("/queryAll")
+    @ResponseBody
+    public R queryAll(@RequestParam Map<String, Object> params) {
+
+        List<StockChangeEntity> list = stockChangeService.queryList(params);
+
+        return R.ok().put("list", list);
+    }
+
+
+    /**
+     * 导入excel
+     */
+    @PostMapping("/upload")
+    @ResponseBody
+    public R storeUpload(@RequestParam("file") MultipartFile file) {
+        List<StockChangeRecordDto> stockChangeRecordDtos = new ArrayList<>();
+        StockChangeDto stockChangeDto = new StockChangeDto();
+        try {
+
+            StockChangeRecordDto stockChangeRecordDto = new StockChangeRecordDto();
+
+            Map<String, Object> beans = new HashMap<String, Object>();
+            beans.put("StockChangeRecordDto", stockChangeRecordDto);
+            beans.put("StockChangeRecordDtoList", stockChangeRecordDtos);
+            beans.put("StockChangeDto", stockChangeDto);
+            if (file.isEmpty()) {
+                return R.error("文件不能为空!");
+            }
+            excelUtil.readExcel(JxlsXmlTemplateName.STOCK_CHANGE_DTO_LIST, beans, file.getInputStream());
+        } catch (Exception e) {
+            log.error("导入出入库记录失败:", e);
+            return R.error("导入失败!");
+        }
+        try {
+            stockChangeService.uploadExcel(stockChangeRecordDtos, stockChangeDto);
+        } catch (RuntimeException e){
+            log.error("出入库记录导入数据写入表失败:", e);
+            return R.error(e.getMessage());
+        }
+        //上传文件
+        return R.ok("导入成功!");
+    }
+
+    @PostMapping("/audit")
+//    @RequiresPermissions("stockchange:audit")
+    @ResponseBody
+    public R audit (@RequestBody Map<String, Object> params) {
+        String[] strings = new String[]{};
+        stockChangeService.updateAuditStatus(((List<String>) params.get("ids")).toArray(strings), (String) params.get("type"));
+
+        return R.ok();
+    }
+
+}

+ 27 - 0
kmall-admin/src/main/java/com/kmall/admin/dao/haikong/StockChangeDao.java

@@ -0,0 +1,27 @@
+package com.kmall.admin.dao.haikong;
+
+import com.kmall.admin.entity.haikong.StockChangeEntity;
+import com.kmall.manager.dao.BaseDao;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * Dao
+ *
+ * @author emato
+ * @email admin@qhdswl.com
+ * @date 2021-12-29 14:46:49
+ */
+public interface StockChangeDao extends BaseDao<StockChangeEntity> {
+
+    /**
+     * 更新审核状态
+     *
+     * @param ids  要更新的数据
+     * @param type 状态
+     */
+    void updateAuditStatus(@Param("array") String[] ids, @Param("type") String type);
+
+    List<StockChangeEntity> queryListByIds(String[] ids);
+}

+ 4 - 0
kmall-admin/src/main/java/com/kmall/admin/dao/haikong/StockChangeRecordDao.java

@@ -30,4 +30,8 @@ public interface StockChangeRecordDao {
     int deleteBatch(Integer[] ids);
 
     void saveBatch(List<StockChangeRecordEntity> stockChangeRecordEntities);
+
+    List<StockChangeRecordEntity> queryListByParentIds(List<String> stringList);
+
+    void deleteBatchByParentIds(String[] ids);
 }

+ 83 - 0
kmall-admin/src/main/java/com/kmall/admin/dto/StockChangeDto.java

@@ -0,0 +1,83 @@
+package com.kmall.admin.dto;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * @author lhm
+ * @createDate 2021-12-29
+ */
+public class StockChangeDto implements Serializable {
+
+    private static final long serialVersionUID = 684865635636920L;
+
+    private String id;
+
+    private String merchSn;
+
+    private String thirdMerchSn;
+
+    private Integer storeId;
+
+    private String type;
+
+    private String remark;
+
+    private String time;
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getMerchSn() {
+        return merchSn;
+    }
+
+    public void setMerchSn(String merchSn) {
+        this.merchSn = merchSn;
+    }
+
+    public String getThirdMerchSn() {
+        return thirdMerchSn;
+    }
+
+    public void setThirdMerchSn(String thirdMerchSn) {
+        this.thirdMerchSn = thirdMerchSn;
+    }
+
+    public Integer getStoreId() {
+        return storeId;
+    }
+
+    public void setStoreId(Integer storeId) {
+        this.storeId = storeId;
+    }
+
+    public String getType() {
+        return type;
+    }
+
+    public void setType(String type) {
+        this.type = type;
+    }
+
+    public String getRemark() {
+        return remark;
+    }
+
+    public void setRemark(String remark) {
+        this.remark = remark;
+    }
+
+    public String getTime() {
+        return time;
+    }
+
+    public void setTime(String time) {
+        this.time = time;
+    }
+}

+ 18 - 34
kmall-admin/src/main/java/com/kmall/admin/dto/StockChangeRecordDto.java

@@ -10,26 +10,18 @@ public class StockChangeRecordDto implements Serializable {
 
     private static final long serialVersionUID = 199865635636920L;
 
-    private Integer storeId;
-
-    private String merchSn;
-    private String thirdMerchSn;
-
     private String sku;
 
-    private String type;
-
     private Integer number;
 
-    private String remark;
+    private String orderSn;
 
-    public Integer getStoreId() {
-        return storeId;
-    }
+    /**
+     * 快递单号
+     */
+    private String courierNumber;
 
-    public void setStoreId(Integer storeId) {
-        this.storeId = storeId;
-    }
+    private String remark;
 
     public String getSku() {
         return sku;
@@ -39,14 +31,6 @@ public class StockChangeRecordDto implements Serializable {
         this.sku = sku;
     }
 
-    public String getType() {
-        return type;
-    }
-
-    public void setType(String type) {
-        this.type = type;
-    }
-
     public Integer getNumber() {
         return number;
     }
@@ -55,27 +39,27 @@ public class StockChangeRecordDto implements Serializable {
         this.number = number;
     }
 
-    public String getRemark() {
-        return remark;
+    public String getOrderSn() {
+        return orderSn;
     }
 
-    public void setRemark(String remark) {
-        this.remark = remark;
+    public void setOrderSn(String orderSn) {
+        this.orderSn = orderSn;
     }
 
-    public String getMerchSn() {
-        return merchSn;
+    public String getCourierNumber() {
+        return courierNumber;
     }
 
-    public void setMerchSn(String merchSn) {
-        this.merchSn = merchSn;
+    public void setCourierNumber(String courierNumber) {
+        this.courierNumber = courierNumber;
     }
 
-    public String getThirdMerchSn() {
-        return thirdMerchSn;
+    public String getRemark() {
+        return remark;
     }
 
-    public void setThirdMerchSn(String thirdMerchSn) {
-        this.thirdMerchSn = thirdMerchSn;
+    public void setRemark(String remark) {
+        this.remark = remark;
     }
 }

+ 312 - 0
kmall-admin/src/main/java/com/kmall/admin/entity/haikong/StockChangeEntity.java

@@ -0,0 +1,312 @@
+package com.kmall.admin.entity.haikong;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 实体
+ * 表名 mall_stock_change
+ *
+ * @author emato
+ * @email admin@qhdswl.com
+ * @date 2021-12-29 14:46:49
+ */
+public class StockChangeEntity implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 出、入库单单号,手动录入
+     */
+    private String id;
+    /**
+     * 出、入库类型,0:普通入库 1:调拨入库 2:销售出库 3:普通出库 4:调拨出库
+     */
+    private String type;
+    /**
+     * 出、入库时间
+     */
+    private Date time;
+    /**
+     * 商户编号
+     */
+    private String merchSn;
+    /**
+     * 商户名称
+     */
+    private String merch;
+    /**
+     * 门店id
+     */
+    private Integer storeId;
+    /**
+     * 门店名称
+     */
+    private String store;
+    /**
+     * 第三方商户
+     */
+    private String thirdMerchSn;
+    /**
+     * 审核状态,0:待审核 1:审核成功 2:审核拒绝
+     */
+    private String audit;
+    /**
+     * 第三方商户名称
+     */
+    private String thirdMerch;
+    /**
+     * 备注
+     */
+    private String remark;
+    /**
+     * 创建人
+     */
+    private String createBy;
+    /**
+     * 创建时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")
+    private Date createTime;
+    /**
+     * 修改人
+     */
+    private String modifyBy;
+    /**
+     * 修改时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")
+    private Date modifyTime;
+    /**
+     * 审核人
+     */
+    private String auditBy;
+    /**
+     * 审核时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")
+    private Date auditTime;
+
+    /**
+     * 设置:出、入库单单号,手动录入
+     */
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    /**
+     * 获取:出、入库单单号,手动录入
+     */
+    public String getId() {
+        return id;
+    }
+    /**
+     * 设置:出、入库类型,0:普通入库 1:调拨入库 2:销售出库 3:普通出库 4:调拨出库
+     */
+    public void setType(String type) {
+        this.type = type;
+    }
+
+    /**
+     * 获取:出、入库类型,0:普通入库 1:调拨入库 2:销售出库 3:普通出库 4:调拨出库
+     */
+    public String getType() {
+        return type;
+    }
+    /**
+     * 设置:出、入库时间
+     */
+    public void setTime(Date time) {
+        this.time = time;
+    }
+
+    /**
+     * 获取:出、入库时间
+     */
+    public Date getTime() {
+        return time;
+    }
+    /**
+     * 设置:商户编号
+     */
+    public void setMerchSn(String merchSn) {
+        this.merchSn = merchSn;
+    }
+
+    /**
+     * 获取:商户编号
+     */
+    public String getMerchSn() {
+        return merchSn;
+    }
+    /**
+     * 设置:商户名称
+     */
+    public void setMerch(String merch) {
+        this.merch = merch;
+    }
+
+    /**
+     * 获取:商户名称
+     */
+    public String getMerch() {
+        return merch;
+    }
+    /**
+     * 设置:门店id
+     */
+    public void setStoreId(Integer storeId) {
+        this.storeId = storeId;
+    }
+
+    /**
+     * 获取:门店id
+     */
+    public Integer getStoreId() {
+        return storeId;
+    }
+    /**
+     * 设置:门店名称
+     */
+    public void setStore(String store) {
+        this.store = store;
+    }
+
+    /**
+     * 获取:门店名称
+     */
+    public String getStore() {
+        return store;
+    }
+    /**
+     * 设置:第三方商户
+     */
+    public void setThirdMerchSn(String thirdMerchSn) {
+        this.thirdMerchSn = thirdMerchSn;
+    }
+
+    /**
+     * 获取:第三方商户
+     */
+    public String getThirdMerchSn() {
+        return thirdMerchSn;
+    }
+    /**
+     * 设置:审核状态,0:待审核 1:审核成功 2:审核拒绝
+     */
+    public void setAudit(String audit) {
+        this.audit = audit;
+    }
+
+    /**
+     * 获取:审核状态,0:待审核 1:审核成功 2:审核拒绝
+     */
+    public String getAudit() {
+        return audit;
+    }
+    /**
+     * 设置:第三方商户名称
+     */
+    public void setThirdMerch(String thirdMerch) {
+        this.thirdMerch = thirdMerch;
+    }
+
+    /**
+     * 获取:第三方商户名称
+     */
+    public String getThirdMerch() {
+        return thirdMerch;
+    }
+    /**
+     * 设置:备注
+     */
+    public void setRemark(String remark) {
+        this.remark = remark;
+    }
+
+    /**
+     * 获取:备注
+     */
+    public String getRemark() {
+        return remark;
+    }
+    /**
+     * 设置:创建人
+     */
+    public void setCreateBy(String createBy) {
+        this.createBy = createBy;
+    }
+
+    /**
+     * 获取:创建人
+     */
+    public String getCreateBy() {
+        return createBy;
+    }
+    /**
+     * 设置:创建时间
+     */
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+    /**
+     * 获取:创建时间
+     */
+    public Date getCreateTime() {
+        return createTime;
+    }
+    /**
+     * 设置:修改人
+     */
+    public void setModifyBy(String modifyBy) {
+        this.modifyBy = modifyBy;
+    }
+
+    /**
+     * 获取:修改人
+     */
+    public String getModifyBy() {
+        return modifyBy;
+    }
+    /**
+     * 设置:修改时间
+     */
+    public void setModifyTime(Date modifyTime) {
+        this.modifyTime = modifyTime;
+    }
+
+    /**
+     * 获取:修改时间
+     */
+    public Date getModifyTime() {
+        return modifyTime;
+    }
+    /**
+     * 设置:审核人
+     */
+    public void setAuditBy(String auditBy) {
+        this.auditBy = auditBy;
+    }
+
+    /**
+     * 获取:审核人
+     */
+    public String getAuditBy() {
+        return auditBy;
+    }
+    /**
+     * 设置:审核时间
+     */
+    public void setAuditTime(Date auditTime) {
+        this.auditTime = auditTime;
+    }
+
+    /**
+     * 获取:审核时间
+     */
+    public Date getAuditTime() {
+        return auditTime;
+    }
+}

+ 71 - 75
kmall-admin/src/main/java/com/kmall/admin/entity/haikong/StockChangeRecordEntity.java

@@ -20,13 +20,14 @@ public class StockChangeRecordEntity implements Serializable {
      * 
      */
     private Integer id;
-    /**
-     * 门店id
-     */
-    private Integer storeId;
+    private Integer specification;
+    private String product;
     private String merchSn;
     private String thirdMerchSn;
+    private Integer storeId;
+    private String parentId;
     private String orderSn;
+    private String courierNumber;
     /**
      * sku
      */
@@ -54,111 +55,102 @@ public class StockChangeRecordEntity implements Serializable {
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")
     private Date modifyTime;
 
-    /**
-     * 设置:
-     */
+    public Integer getId() {
+        return id;
+    }
+
     public void setId(Integer id) {
         this.id = id;
     }
 
-    /**
-     * 获取:
-     */
-    public Integer getId() {
-        return id;
+    public Integer getSpecification() {
+        return specification;
     }
-    /**
-     * 设置:门店id
-     */
-    public void setStoreId(Integer storeId) {
-        this.storeId = storeId;
+
+    public void setSpecification(Integer specification) {
+        this.specification = specification;
     }
 
-    /**
-     * 获取:门店id
-     */
-    public Integer getStoreId() {
-        return storeId;
+    public String getProduct() {
+        return product;
     }
-    /**
-     * 设置:sku
-     */
-    public void setSku(String sku) {
-        this.sku = sku;
+
+    public void setProduct(String product) {
+        this.product = product;
+    }
+
+    public String getParentId() {
+        return parentId;
+    }
+
+    public void setParentId(String parentId) {
+        this.parentId = parentId;
+    }
+
+    public String getOrderSn() {
+        return orderSn;
+    }
+
+    public void setOrderSn(String orderSn) {
+        this.orderSn = orderSn;
+    }
+
+    public String getCourierNumber() {
+        return courierNumber;
+    }
+
+    public void setCourierNumber(String courierNumber) {
+        this.courierNumber = courierNumber;
     }
 
-    /**
-     * 获取:sku
-     */
     public String getSku() {
         return sku;
     }
-    /**
-     * 设置:记录类型,0:出库 1:入库
-     */
-    public void setType(String type) {
-        this.type = type;
+
+    public void setSku(String sku) {
+        this.sku = sku;
     }
 
-    /**
-     * 获取:记录类型,0:出库 1:入库
-     */
     public String getType() {
         return type;
     }
-    /**
-     * 设置:出库或入库数量
-     */
-    public void setNumber(Integer number) {
-        this.number = number;
+
+    public void setType(String type) {
+        this.type = type;
     }
 
-    /**
-     * 获取:出库或入库数量
-     */
     public Integer getNumber() {
         return number;
     }
-    /**
-     * 设置:备注
-     */
-    public void setRemark(String remark) {
-        this.remark = remark;
+
+    public void setNumber(Integer number) {
+        this.number = number;
     }
 
-    /**
-     * 获取:备注
-     */
     public String getRemark() {
         return remark;
     }
-    /**
-     * 设置:
-     */
-    public void setCreateTime(Date createTime) {
-        this.createTime = createTime;
+
+    public void setRemark(String remark) {
+        this.remark = remark;
     }
 
-    /**
-     * 获取:
-     */
     public Date getCreateTime() {
         return createTime;
     }
-    /**
-     * 设置:
-     */
-    public void setModifyTime(Date modifyTime) {
-        this.modifyTime = modifyTime;
+
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
     }
 
-    /**
-     * 获取:
-     */
     public Date getModifyTime() {
         return modifyTime;
     }
 
+    public void setModifyTime(Date modifyTime) {
+        this.modifyTime = modifyTime;
+    }
+
     public String getMerchSn() {
         return merchSn;
     }
@@ -175,22 +167,26 @@ public class StockChangeRecordEntity implements Serializable {
         this.thirdMerchSn = thirdMerchSn;
     }
 
-    public String getOrderSn() {
-        return orderSn;
+    public Integer getStoreId() {
+        return storeId;
     }
 
-    public void setOrderSn(String orderSn) {
-        this.orderSn = orderSn;
+    public void setStoreId(Integer storeId) {
+        this.storeId = storeId;
     }
 
     @Override
     public String toString() {
         return "StockChangeRecordEntity{" +
                 "id=" + id +
-                ", storeId=" + storeId +
+                ", specification=" + specification +
+                ", product='" + product + '\'' +
                 ", merchSn='" + merchSn + '\'' +
                 ", thirdMerchSn='" + thirdMerchSn + '\'' +
+                ", storeId=" + storeId +
+                ", parentId='" + parentId + '\'' +
                 ", orderSn='" + orderSn + '\'' +
+                ", courierNumber='" + courierNumber + '\'' +
                 ", sku='" + sku + '\'' +
                 ", type='" + type + '\'' +
                 ", number=" + number +

+ 40 - 4
kmall-admin/src/main/java/com/kmall/admin/haikong/constant/Constants.java

@@ -334,19 +334,28 @@ public class Constants {
         }
     }
 
+    /**
+     * 0:普通入库
+     * 1:调拨入库
+     * 2:销售出库(下单时自动写入明细,不需要导入)
+     * 3:普通出库
+     * 4:调拨出库
+     */
     public enum StockChangeType {
         /**
-         * 出库
+         * 普通入
          */
-        item_0("0", "出库"),
+        item_0("0", "普通入库"),
         /**
-         * 入库
+         * 调拨入库
          */
-        item_1("1", "入库"),
+        item_1("1", "调拨入库"),
         /**
          * 销售出库
          */
         item_2("2", "销售出库"),
+        item_3("3", "普通出库"),
+        item_4("4", "调拨出库"),
         ;
 
         private final String type;
@@ -367,4 +376,31 @@ public class Constants {
         }
     }
 
+    /**
+     * 审核状态,0:待审核 1:审核成功 2:审核拒绝
+     */
+    public enum AuditStatus {
+        WAIT_AUDIT("0", "待审核"),
+        AUDIT_SUCCESS("1", "审核成功"),
+        AUDIT_REJECT("2", "审核拒绝"),
+        ;
+
+        private final String type;
+
+        private final String desc;
+
+        AuditStatus(String type, String desc) {
+            this.type = type;
+            this.desc = desc;
+        }
+
+        public String getType() {
+            return type;
+        }
+
+        public String getDesc() {
+            return desc;
+        }
+    }
+
 }

+ 4 - 0
kmall-admin/src/main/java/com/kmall/admin/service/haikong/StockChangeRecordService.java

@@ -83,4 +83,8 @@ public interface StockChangeRecordService {
      * 订单提交时进行保存,不修改库存
      */
     void saveBatchByOrderSubmit(List<StockChangeRecordEntity> stockChangeRecordEntities);
+
+    List<StockChangeRecordEntity> queryListByParentIds(List<String> stringList);
+
+    void deleteBatchByParentIds(String[] ids);
 }

+ 85 - 0
kmall-admin/src/main/java/com/kmall/admin/service/haikong/StockChangeService.java

@@ -0,0 +1,85 @@
+package com.kmall.admin.service.haikong;
+
+import com.kmall.admin.dto.StockChangeDto;
+import com.kmall.admin.dto.StockChangeRecordDto;
+import com.kmall.admin.entity.haikong.StockChangeEntity;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Service接口
+ *
+ * @author emato
+ * @email admin@qhdswl.com
+ * @date 2021-12-29 14:46:49
+ */
+public interface StockChangeService {
+
+    /**
+     * 根据主键查询实体
+     *
+     * @param id 主键
+     * @return 实体
+     */
+    StockChangeEntity queryObject(String id);
+
+    /**
+     * 分页查询
+     *
+     * @param map 参数
+     * @return list
+     */
+    List<StockChangeEntity> queryList(Map<String, Object> map);
+
+    /**
+     * 分页统计总数
+     *
+     * @param map 参数
+     * @return 总数
+     */
+    int queryTotal(Map<String, Object> map);
+
+    /**
+     * 保存实体
+     *
+     * @param stockChange 实体
+     * @return 保存条数
+     */
+    int save(StockChangeEntity stockChange);
+
+    /**
+     * 根据主键更新实体
+     *
+     * @param stockChange 实体
+     * @return 更新条数
+     */
+    int update(StockChangeEntity stockChange);
+
+    /**
+     * 根据主键删除
+     *
+     * @param id
+     * @return 删除条数
+     */
+    int delete(String id);
+
+    /**
+     * 根据主键批量删除
+     *
+     * @param ids
+     * @return 删除条数
+     */
+    int deleteBatch(String[]ids);
+
+    void uploadExcel(List<StockChangeRecordDto> stockChangeRecordDtos, StockChangeDto stockChangeDto);
+
+    /**
+     * 更新审核状态
+     * @param ids   要更新的数据
+     * @param type  状态
+     */
+    void updateAuditStatus(String[] ids, String type);
+
+    List<StockChangeEntity> queryListByIds(String[] ids);
+}

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

@@ -2331,6 +2331,7 @@ public class OrderServiceImpl implements OrderService {
             //生成商户订单号
             Snowflake snowflake = IdUtil.createSnowflake(14, 14);
             String orderSn = "8" + snowflake.nextIdStr().substring(6);
+            LOGGER.info("订单======>{},请求生成订单数据======>{}", orderSn, JacksonUtil.toJson(param));
             // 检查库存和更新库存
             for (QueryGoodsVO goodsDto : queryGoodsVOList) {
                 // 要购买的数量
@@ -2354,8 +2355,7 @@ public class OrderServiceImpl implements OrderService {
                         LOGGER.error("sku:【{}】库存不足,门店可用库存:【{}】,仓库可用库存:【{}】,购买数量:【{}】", sku, stockNum, warehouseStock, sellVolume);
                         throw new ServiceException(String.format("sku:【%s】库存不足,门店可用库存:【%s】,仓库可用库存:【%s】,购买数量:【%s】", sku, stockNum, warehouseStock, sellVolume));
                     }
-                    sellVolume -= 1;
-                    // TODO 库存变化记录新增字段:订单号、门店编号
+                    // 库存变化记录新增字段:订单号、门店编号
                     // 门店库存变化记录
                     StoreMngChangeEntity storeMngChangeEntity = new StoreMngChangeEntity();
                     storeMngChangeEntity.setChangeType(Dict.changeType.item_1.getItem());

+ 9 - 0
kmall-admin/src/main/java/com/kmall/admin/service/impl/haikong/StockChangeRecordServiceImpl.java

@@ -174,4 +174,13 @@ public class StockChangeRecordServiceImpl implements StockChangeRecordService {
         stockChangeRecordDao.saveBatch(stockChangeRecordEntities);
     }
 
+    @Override
+    public List<StockChangeRecordEntity> queryListByParentIds(List<String> stringList) {
+        return stockChangeRecordDao.queryListByParentIds(stringList);
+    }
+
+    @Override
+    public void deleteBatchByParentIds(String[] ids) {
+        stockChangeRecordDao.deleteBatchByParentIds(ids);
+    }
 }

+ 238 - 0
kmall-admin/src/main/java/com/kmall/admin/service/impl/haikong/StockChangeServiceImpl.java

@@ -0,0 +1,238 @@
+package com.kmall.admin.service.impl.haikong;
+
+import cn.hutool.core.date.DateTime;
+import cn.hutool.core.date.DateUtil;
+import com.google.common.collect.ImmutableBiMap;
+import com.kmall.admin.dto.StockChangeDto;
+import com.kmall.admin.dto.StockChangeRecordDto;
+import com.kmall.admin.entity.StoreEntity;
+import com.kmall.admin.entity.haikong.StockChangeRecordEntity;
+import com.kmall.admin.fromcomm.entity.SysUserEntity;
+import com.kmall.admin.haikong.constant.Constants;
+import com.kmall.admin.service.GoodsService;
+import com.kmall.admin.service.ProductStoreRelaService;
+import com.kmall.admin.service.StoreService;
+import com.kmall.admin.service.haikong.StockChangeRecordService;
+import com.kmall.admin.utils.ShiroUtils;
+import com.kmall.common.utils.MapBeanUtil;
+import com.kmall.common.utils.R;
+import com.kmall.common.utils.RRException;
+import com.kmall.common.utils.ValidatorUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.aop.framework.AopContext;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+import com.kmall.admin.dao.haikong.StockChangeDao;
+import com.kmall.admin.entity.haikong.StockChangeEntity;
+import com.kmall.admin.service.haikong.StockChangeService;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.CollectionUtils;
+import org.springframework.util.StringUtils;
+
+/**
+ * Service实现类
+ *
+ * @author emato
+ * @email admin@qhdswl.com
+ * @date 2021-12-29 14:46:49
+ */
+@Service("stockChangeService")
+public class StockChangeServiceImpl implements StockChangeService {
+    @Autowired
+    private StockChangeDao stockChangeDao;
+
+    @Autowired
+    private StockChangeRecordService stockChangeRecordService;
+
+    @Autowired
+    private StoreService storeService;
+
+    @Autowired
+    private ProductStoreRelaService productStoreRelaService;
+
+    @Autowired
+    private GoodsService goodsService;
+
+    private static final Logger log = LoggerFactory.getLogger(StockChangeServiceImpl.class);
+
+    @Override
+    public StockChangeEntity queryObject(String id) {
+        return stockChangeDao.queryObject(id);
+    }
+
+    @Override
+    public List<StockChangeEntity> queryList(Map<String, Object> map) {
+        return stockChangeDao.queryList(map);
+    }
+
+    @Override
+    public int queryTotal(Map<String, Object> map) {
+        return stockChangeDao.queryTotal(map);
+    }
+
+    @Override
+    public int save(StockChangeEntity stockChange) {
+        return stockChangeDao.save(stockChange);
+    }
+
+    @Override
+    public int update(StockChangeEntity stockChange) {
+        return stockChangeDao.update(stockChange);
+    }
+
+    @Override
+    public int delete(String id) {
+        String[] ids = {id};
+        stockChangeRecordService.deleteBatchByParentIds(ids);
+        return stockChangeDao.delete(id);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public int deleteBatch(String[]ids) {
+        stockChangeRecordService.deleteBatchByParentIds(ids);
+        return stockChangeDao.deleteBatch(ids);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void uploadExcel(List<StockChangeRecordDto> stockChangeRecordDtos, StockChangeDto stockChangeDto) {
+        if (!CollectionUtils.isEmpty(stockChangeRecordDtos) && Objects.nonNull(stockChangeDto)) {
+            List<StockChangeRecordEntity> stockChangeRecordEntities = new ArrayList<>();
+
+            String id = stockChangeDto.getId();
+            String merchSn = stockChangeDto.getMerchSn();
+            String thirdMerchSn = stockChangeDto.getThirdMerchSn();
+            Integer storeId = stockChangeDto.getStoreId();
+            StoreEntity storeEntity = storeService.queryObject(storeId);
+            String type = stockChangeDto.getType();
+            if (StringUtils.isEmpty(id)) {
+                log.error("导入出入库单时,出入库单单号为空!");
+                throw new RRException("出入库单单号不能为空!");
+            }
+            if (StringUtils.isEmpty(merchSn)) {
+                log.error("导入出入库单时,商户编号为空!");
+                throw new RRException("商户编号不能为空!");
+            }
+            if (StringUtils.isEmpty(thirdMerchSn)) {
+                log.error("导入出入库单时,第三方商户编号为空!");
+                throw new RRException("第三方商户编号不能为空!");
+            }
+            if (Objects.isNull(storeId)) {
+                log.error("导入出入库单时,门店编号为空!");
+                throw new RRException("门店编号不能为空!");
+            }
+            if (Objects.isNull(storeEntity)) {
+                log.error("门店id对应门店不存在!");
+                throw new RRException(String.format("门店编号【%s】对应门店不存在!", storeId));
+            }
+            if (StringUtils.isEmpty(type)) {
+                log.error("导入出入库单时,类型为空!");
+                throw new RRException("类型不能为空!");
+            }
+            Date createTime = new Date();
+            stockChangeRecordDtos.forEach(stockChangeRecordDto -> {
+                Map<String, Object> valideDate = MapBeanUtil.fromObject(stockChangeRecordDto);
+                // 校验excel传入的数据
+                ImmutableBiMap.Builder builder = new ImmutableBiMap.Builder();
+                builder.put("sku", "商品SKU");
+                builder.put("number", "出入库数量");
+
+                R r = ValidatorUtil.isEmpty(builder.build(), valideDate);
+                if (Integer.valueOf(r.get("code").toString()) != 0) {
+                    throw new RRException(r.get("msg").toString());
+                }
+
+                StockChangeRecordEntity stockChangeRecordEntity = new StockChangeRecordEntity();
+                BeanUtils.copyProperties(stockChangeRecordDto, stockChangeRecordEntity);
+
+                stockChangeRecordEntity.setCreateTime(createTime);
+                stockChangeRecordEntity.setModifyTime(createTime);
+                stockChangeRecordEntity.setThirdMerchSn(thirdMerchSn);
+                stockChangeRecordEntity.setMerchSn(merchSn);
+                stockChangeRecordEntity.setType(type);
+                stockChangeRecordEntity.setStoreId(storeId);
+                stockChangeRecordEntity.setParentId(id);
+                stockChangeRecordEntities.add(stockChangeRecordEntity);
+            });
+
+            // 先不修改库存,等审核成功后再进行修改
+            stockChangeRecordService.saveBatchByOrderSubmit(stockChangeRecordEntities);
+            SysUserEntity userEntity = ShiroUtils.getUserEntity();
+
+            StockChangeEntity stockChangeEntity = new StockChangeEntity();
+            BeanUtils.copyProperties(stockChangeDto, stockChangeEntity);
+            DateTime parse = DateUtil.parse(stockChangeDto.getTime(), "yyyy-MM-dd HH:mm:ss");
+            stockChangeEntity.setTime(parse);
+            stockChangeEntity.setAudit(Constants.AuditStatus.WAIT_AUDIT.getType());
+            stockChangeEntity.setStore(storeEntity.getStoreName());
+            stockChangeEntity.setMerch(storeEntity.getMerchName());
+            stockChangeEntity.setThirdMerch(stockChangeEntity.getThirdMerch());
+            stockChangeEntity.setCreateBy(userEntity.getUsername());
+            stockChangeEntity.setCreateTime(createTime);
+            stockChangeEntity.setModifyBy(userEntity.getUsername());
+            stockChangeEntity.setModifyTime(createTime);
+
+            ((StockChangeService)(AopContext.currentProxy())).save(stockChangeEntity);
+
+        }
+    }
+
+
+    /**
+     * 更新审核状态
+     *
+     * @param ids  要更新的数据
+     * @param type 状态
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void updateAuditStatus(String[] ids, String type) {
+
+        // 更新库存
+        List<StockChangeEntity> inChangeEntities = new ArrayList<>();
+        List<StockChangeEntity> outChangeEntities = new ArrayList<>();
+        // 审核成功才需要更新库存
+        if (Constants.AuditStatus.AUDIT_SUCCESS.getType().equals(type)) {
+            List<StockChangeEntity> stockChangeEntities = queryListByIds(ids);
+
+            stockChangeEntities.forEach(stockChangeEntity -> {
+                String type1 = stockChangeEntity.getType();
+                if (Constants.StockChangeType.item_0.getType().equals(type1)
+                || Constants.StockChangeType.item_1.getType().equals(type1)) {
+                    inChangeEntities.add(stockChangeEntity);
+                } else if (Constants.StockChangeType.item_3.getType().equals(type1)
+                || Constants.StockChangeType.item_4.getType().equals(type1)) {
+                    outChangeEntities.add(stockChangeEntity);
+                }
+            });
+
+            if (!CollectionUtils.isEmpty(inChangeEntities)) {
+                List<String> stringList = inChangeEntities.stream().map(StockChangeEntity::getId).collect(Collectors.toList());
+                List<StockChangeRecordEntity> stockChangeRecordEntities = stockChangeRecordService.queryListByParentIds(stringList);
+                productStoreRelaService.updateStockNumberByStorage(stockChangeRecordEntities);
+                goodsService.updateStockNumberByStorage(stockChangeRecordEntities);
+            }
+
+            if (!CollectionUtils.isEmpty(outChangeEntities)) {
+                List<String> stringList = outChangeEntities.stream().map(StockChangeEntity::getId).collect(Collectors.toList());
+                List<StockChangeRecordEntity> stockChangeRecordEntities = stockChangeRecordService.queryListByParentIds(stringList);
+                productStoreRelaService.updateStockNumberByOutbound(stockChangeRecordEntities);
+                goodsService.updateStockNumberByOutbound(stockChangeRecordEntities);
+            }
+        }
+
+        stockChangeDao.updateAuditStatus(ids, type);
+    }
+
+    @Override
+    public List<StockChangeEntity> queryListByIds(String[] ids) {
+        return stockChangeDao.queryListByIds(ids);
+    }
+}

+ 30 - 0
kmall-admin/src/main/resources/XmlTemplate/StockChangeDtoList.xml

@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<workbook>
+    <worksheet name="Sheet1">
+        <section startRow="0" endRow="1"/>
+        <section startRow="2" endRow="2">
+            <mapping cell="A2">StockChangeDto.id</mapping>
+            <mapping cell="B2">StockChangeDto.merchSn</mapping>
+            <mapping cell="C2">StockChangeDto.thirdMerchSn</mapping>
+            <mapping cell="D2">StockChangeDto.storeId</mapping>
+            <mapping cell="E2">StockChangeDto.type</mapping>
+            <mapping cell="F2">StockChangeDto.remark</mapping>
+            <mapping cell="G2">StockChangeDto.time</mapping>
+        </section>
+        <loop startRow="3" endRow="3" items="StockChangeRecordDtoList" var="StockChangeRecordDto"
+              varType="com.kmall.admin.dto.StockChangeRecordDto">
+            <section startRow="3" endRow="3">
+                <mapping row="3" col="0">StockChangeRecordDto.sku</mapping>
+                <mapping row="3" col="1">StockChangeRecordDto.number</mapping>
+                <mapping row="3" col="2">StockChangeRecordDto.orderSn</mapping>
+                <mapping row="3" col="3">StockChangeRecordDto.courierNumber</mapping>
+                <mapping row="3" col="4">StockChangeRecordDto.remark</mapping>
+            </section>
+            <loopbreakcondition>
+                <rowcheck offset="0">
+                    <cellcheck offset="0"></cellcheck>
+                </rowcheck>
+            </loopbreakcondition>
+        </loop>
+    </worksheet>
+</workbook>

+ 12 - 1
kmall-admin/src/main/resources/mybatis/mapper/OrderProcessRecordDao.xml

@@ -447,7 +447,18 @@ select
 					</if>
 				</foreach>
 			</trim>
-
+			<trim prefix="order_status =case" suffix="end,">
+				<foreach collection="list" item="item" index="index">
+					<if test="item.logisticsNo!=null">
+						when order_sn=#{item.orderSn}
+						then '300'
+					</if>
+					<if test="item.logisticsNo==null">
+						when order_sn=#{item.orderSn}
+						then mall_order.order_status
+					</if>
+				</foreach>
+			</trim>
 			<trim prefix="shipping_code =case" suffix="end,">
 				<foreach collection="list" item="item" index="index">
 					<if test="item.shippingCode!=null">

+ 184 - 0
kmall-admin/src/main/resources/mybatis/mapper/haikong/StockChangeDao.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.haikong.StockChangeDao">
+
+    <resultMap type="com.kmall.admin.entity.haikong.StockChangeEntity" id="stockChangeMap">
+        <result property="id" column="id"/>
+        <result property="type" column="type"/>
+        <result property="time" column="time"/>
+        <result property="merchSn" column="merch_sn"/>
+        <result property="merch" column="merch"/>
+        <result property="storeId" column="store_id"/>
+        <result property="store" column="store"/>
+        <result property="thirdMerchSn" column="third_merch_sn"/>
+        <result property="audit" column="audit"/>
+        <result property="thirdMerch" column="third_merch"/>
+        <result property="remark" column="remark"/>
+        <result property="createBy" column="create_by"/>
+        <result property="createTime" column="create_time"/>
+        <result property="modifyBy" column="modify_by"/>
+        <result property="modifyTime" column="modify_time"/>
+        <result property="auditBy" column="audit_by"/>
+        <result property="auditTime" column="audit_time"/>
+    </resultMap>
+
+	<select id="queryObject" resultType="com.kmall.admin.entity.haikong.StockChangeEntity">
+		select
+			`id`,
+			`type`,
+			`time`,
+			`merch_sn`,
+			`merch`,
+			`store_id`,
+			`store`,
+			`third_merch_sn`,
+			`audit`,
+			`third_merch`,
+			`remark`,
+			`create_by`,
+			`create_time`,
+			`modify_by`,
+			`modify_time`,
+			`audit_by`,
+			`audit_time`
+		from mall_stock_change
+		where id = #{id}
+	</select>
+
+	<select id="queryList" resultType="com.kmall.admin.entity.haikong.StockChangeEntity">
+		select
+    		`id`,
+    		`type`,
+    		`time`,
+    		`merch_sn`,
+    		`merch`,
+    		`store_id`,
+    		`store`,
+    		`third_merch_sn`,
+    		`audit`,
+    		`third_merch`,
+    		`remark`,
+    		`create_by`,
+    		`create_time`,
+    		`modify_by`,
+    		`modify_time`,
+    		`audit_by`,
+    		`audit_time`
+		from mall_stock_change
+		WHERE 1=1
+		<if test="name != null and name.trim() != ''">
+			AND name LIKE concat('%',#{name},'%')
+		</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_stock_change
+		WHERE 1=1
+        <if test="name != null and name.trim() != ''">
+            AND name LIKE concat('%',#{name},'%')
+        </if>
+	</select>
+
+
+	<select id="queryListByIds" resultType="com.kmall.admin.entity.haikong.StockChangeEntity">
+		select * from mall_stock_change
+		where id in
+		<foreach item="id" collection="array" open="(" separator="," close=")">
+			#{id}
+		</foreach>
+	</select>
+
+	<insert id="save" parameterType="com.kmall.admin.entity.haikong.StockChangeEntity">
+		insert into mall_stock_change(
+			`id`,
+			`type`,
+			`time`,
+			`merch_sn`,
+			`merch`,
+			`store_id`,
+			`store`,
+			`third_merch_sn`,
+			`audit`,
+			`third_merch`,
+			`remark`,
+			`create_by`,
+			`create_time`,
+			`modify_by`,
+			`modify_time`,
+			`audit_by`,
+			`audit_time`)
+		values(
+			#{id},
+			#{type},
+			#{time},
+			#{merchSn},
+			#{merch},
+			#{storeId},
+			#{store},
+			#{thirdMerchSn},
+			#{audit},
+			#{thirdMerch},
+			#{remark},
+			#{createBy},
+			#{createTime},
+			#{modifyBy},
+			#{modifyTime},
+			#{auditBy},
+			#{auditTime})
+	</insert>
+	 
+	<update id="update" parameterType="com.kmall.admin.entity.haikong.StockChangeEntity">
+		update mall_stock_change 
+		<set>
+			<if test="type != null">`type` = #{type}, </if>
+			<if test="time != null">`time` = #{time}, </if>
+			<if test="merchSn != null">`merch_sn` = #{merchSn}, </if>
+			<if test="merch != null">`merch` = #{merch}, </if>
+			<if test="storeId != null">`store_id` = #{storeId}, </if>
+			<if test="store != null">`store` = #{store}, </if>
+			<if test="thirdMerchSn != null">`third_merch_sn` = #{thirdMerchSn}, </if>
+			<if test="audit != null">`audit` = #{audit}, </if>
+			<if test="thirdMerch != null">`third_merch` = #{thirdMerch}, </if>
+			<if test="remark != null">`remark` = #{remark}, </if>
+			<if test="createBy != null">`create_by` = #{createBy}, </if>
+			<if test="createTime != null">`create_time` = #{createTime}, </if>
+			<if test="modifyBy != null">`modify_by` = #{modifyBy}, </if>
+			<if test="modifyTime != null">`modify_time` = #{modifyTime}, </if>
+			<if test="auditBy != null">`audit_by` = #{auditBy}, </if>
+			<if test="auditTime != null">`audit_time` = #{auditTime}</if>
+		</set>
+		where id = #{id}
+	</update>
+
+    <update id="updateAuditStatus">
+		update mall_stock_change set audit = #{type}
+		where id in
+		<foreach collection="array" item="item" open="(" separator="," close=")">
+			#{item}
+		</foreach>
+	</update>
+
+    <delete id="delete">
+		delete from mall_stock_change where id = #{value}
+	</delete>
+	
+	<delete id="deleteBatch">
+		delete from mall_stock_change where id in 
+		<foreach item="id" collection="array" open="(" separator="," close=")">
+			#{id}
+		</foreach>
+	</delete>
+
+</mapper>

+ 56 - 22
kmall-admin/src/main/resources/mybatis/mapper/haikong/StockChangeRecordDao.xml

@@ -5,14 +5,18 @@
 
     <resultMap type="com.kmall.admin.entity.haikong.StockChangeRecordEntity" id="stockChangeRecordMap">
         <result property="id" column="id"/>
-        <result property="merchSn" column="merch_sn"/>
-        <result property="thirdMerchSn" column="third_merch_sn"/>
-        <result property="storeId" column="store_id"/>
+        <result property="specification" column="specification"/>
+        <result property="product" column="product"/>
+        <result property="parentId" column="parent_id"/>
+        <result property="courierNumber" column="courier_number"/>
         <result property="sku" column="sku"/>
         <result property="type" column="type"/>
         <result property="number" column="number"/>
         <result property="remark" column="remark"/>
         <result property="orderSn" column="order_sn"/>
+        <result property="thirdMerchSn" column="third_merch_sn"/>
+        <result property="merchSn" column="merch_sn"/>
+        <result property="storeId" column="store_id"/>
         <result property="createTime" column="create_time"/>
         <result property="modifyTime" column="modify_time"/>
     </resultMap>
@@ -35,9 +39,6 @@
 		<if test="sku != null and sku.trim() != ''">
 			AND `sku` LIKE concat('%',#{sku},'%')
 		</if>
-		<if test="storeId != null and storeId.trim() != ''">
-			AND `store_id` LIKE concat('%',#{storeId},'%')
-		</if>
         <choose>
             <when test="sidx != null and sidx.trim() != ''">
                 order by ${sidx} ${order}
@@ -58,28 +59,43 @@
             AND name LIKE concat('%',#{name},'%')
         </if>
 	</select>
-	 
+	<select id="queryListByParentIds" resultType="com.kmall.admin.entity.haikong.StockChangeRecordEntity">
+		select * from mall_stock_change_record
+		where parent_id in
+		<foreach collection="list" item="item" open="(" separator="," close=")">
+			#{item}
+		</foreach>
+	</select>
+
 	<insert id="save" parameterType="com.kmall.admin.entity.haikong.StockChangeRecordEntity" useGeneratedKeys="true" keyProperty="id">
 		insert into mall_stock_change_record(
-			`merch_sn`,
-			`third_merch_sn`,
+			`specification`,
+			`product`,
 			`order_sn`,
-			`store_id`,
+			`parent_id`,
+			`courier_number`,
 			`sku`,
 			`type`,
 			`number`,
 			`remark`,
+			`third_merch_sn`,
+			`merch_sn`,
+			`store_id`,
 			`create_time`,
 			`modify_time`)
 		values(
-			#{merchSn},
-			#{thirdMerchSn},
+			#{specification},
+			#{product},
 			#{orderSn},
-			#{storeId},
+			#{parentId},
+			#{courierNumber},
 			#{sku},
 			#{type},
 			#{number},
 			#{remark},
+			#{thirdMerchSn},
+			#{merchSn},
+			#{storeId},
 			#{createTime},
 			#{modifyTime})
 	</insert>
@@ -87,28 +103,36 @@
 	<insert id="saveBatch">
 		insert into mall_stock_change_record
 		(
-			`store_id`,
-			`merch_sn`,
-			`third_merch_sn`,
+			`specification`,
+			`product`,
 			`order_sn`,
+			`parent_id`,
+			`courier_number`,
 			`sku`,
 			`type`,
 			`number`,
 			`remark`,
+			`third_merch_sn`,
+			`merch_sn`,
+			`store_id`,
 			`create_time`,
 			`modify_time`
 		)
 		values
 		<foreach collection="list" item="item" separator=",">
 			(
-				#{item.storeId},
-				#{item.merchSn},
-				#{item.thirdMerchSn},
+				#{item.specification},
+				#{item.product},
 				#{item.orderSn},
+				#{item.parentId},
+				#{item.courierNumber},
 				#{item.sku},
 				#{item.type},
 				#{item.number},
 				#{item.remark},
+				#{item.thirdMerchSn},
+				#{item.merchSn},
+				#{item.storeId},
 				#{item.createTime},
 				#{item.modifyTime}
 			)
@@ -118,14 +142,18 @@
 	<update id="update" parameterType="com.kmall.admin.entity.haikong.StockChangeRecordEntity">
 		update mall_stock_change_record 
 		<set>
-			<if test="storeId != null">`store_id` = #{storeId}, </if>
-			<if test="merchSn != null">`merch_sn` = #{merchSn}, </if>
-			<if test="thirdMerchSn != null">`third_merch_sn` = #{thirdMerchSn}, </if>
+			<if test="specification != null">`specification` = #{specification}, </if>
+			<if test="product != null">`product` = #{product}, </if>
+			<if test="parentId != null">`parent_id` = #{parentId}, </if>
+			<if test="courierNumber != null">`courier_number` = #{courierNumber}, </if>
 			<if test="orderSn != null">`order_sn` = #{orderSn}, </if>
 			<if test="sku != null">`sku` = #{sku}, </if>
 			<if test="type != null">`type` = #{type}, </if>
 			<if test="number != null">`number` = #{number}, </if>
 			<if test="remark != null">`remark` = #{remark}, </if>
+			<if test="thirdMerchSn != null">`third_merch_sn` = #{thirdMerchSn}, </if>
+			<if test="merchSn != null">`merch_sn` = #{merchSn}, </if>
+			<if test="storeId != null">`store_id` = #{storeId}, </if>
 			<if test="createTime != null">`create_time` = #{createTime}, </if>
 			<if test="modifyTime != null">`modify_time` = #{modifyTime}</if>
 		</set>
@@ -142,5 +170,11 @@
 			#{id}
 		</foreach>
 	</delete>
+	<delete id="deleteBatchByParentIds">
+		delete from mall_stock_change_record where parent_id in
+		<foreach item="id" collection="array" open="(" separator="," close=")">
+			#{id}
+		</foreach>
+	</delete>
 
 </mapper>

+ 19 - 19
kmall-admin/src/main/resources/spring/spring-mvc.xml

@@ -23,25 +23,25 @@
     <!-- 暴露代理对象,用来保证调用当前bean的其他方法事务不失效,获取当前bean代理对象:((需要转换的Service) AopContext.currentProxy()) -->
     <aop:aspectj-autoproxy proxy-target-class="true" expose-proxy="true"/>
     <mvc:annotation-driven>
-        <mvc:message-converters register-defaults="true">
-            <bean class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">
-                <property name="supportedMediaTypes">
-                    <list>
-                        <value>text/html;charset=UTF-8</value>
-                        <value>application/json;charset=UTF-8</value>
-                    </list>
-                </property>
-                <property name="features">
-                    <list>
-                        <value>WriteMapNullValue</value>
-                        <value>QuoteFieldNames</value>
-                        <value>WriteDateUseDateFormat</value>
-                        <!-- 禁用fastjson循环引用检测 -->
-                        <value>DisableCircularReferenceDetect</value>
-                    </list>
-                </property>
-            </bean>
-        </mvc:message-converters>
+<!--        <mvc:message-converters register-defaults="true">-->
+<!--            <bean class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">-->
+<!--                <property name="supportedMediaTypes">-->
+<!--                    <list>-->
+<!--                        <value>text/html;charset=UTF-8</value>-->
+<!--                        <value>application/json;charset=UTF-8</value>-->
+<!--                    </list>-->
+<!--                </property>-->
+<!--                <property name="features">-->
+<!--                    <list>-->
+<!--                        <value>WriteMapNullValue</value>-->
+<!--                        <value>QuoteFieldNames</value>-->
+<!--                        <value>WriteDateUseDateFormat</value>-->
+<!--                        &lt;!&ndash; 禁用fastjson循环引用检测 &ndash;&gt;-->
+<!--                        <value>DisableCircularReferenceDetect</value>-->
+<!--                    </list>-->
+<!--                </property>-->
+<!--            </bean>-->
+<!--        </mvc:message-converters>-->
     </mvc:annotation-driven>
 
     <!-- 为了加载拦截器 需要 日志拦截器 (登录拦截和权限拦截已在shiro实现,看实现 情况处理) -->

+ 104 - 0
kmall-admin/src/main/webapp/WEB-INF/page/shop/stockchange.html

@@ -0,0 +1,104 @@
+<!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-input v-model="q.name" @on-enter="query" placeholder="名称"/>
+                </i-col>
+                <i-button @click="query">查询</i-button>
+                <i-button @click="reloadSearch">重置</i-button>
+            </div>
+            <div class="buttons-group" style="width: 100%;margin-top: 8px;">
+                <i-col style="display: inline-grid;">
+                    <Upload :show-upload-list="false" :on-success="uploadExcelSuccess" :on-error="uploadExcelError" :on-format-error="uploadExcelFormatError"
+                            :format="['xls','xlsx']"
+                            action="../stockchange/upload" :before-upload="beforeUpload"  :data="uploadData" >
+                        <i-button type="ghost" icon="ios-cloud-upload-outline">导入</i-button>
+                    </Upload>
+                </i-col>
+                <a href="../statics/file/stock_change.xlsx">出入库单导入模板下载</a>
+            </div>
+            <div class="buttons-group">
+                <i-button type="info" @click="add"><i class="fa fa-plus"></i>&nbsp;新增</i-button>
+                <i-button type="warning" @click="update"><i class="fa fa-pencil-square-o"></i>&nbsp;修改</i-button>
+                <i-button type="error" @click="del"><i class="fa fa-trash-o"></i>&nbsp;删除</i-button>
+
+                <i-button type="primary" @click="audit('1')"><i class="fa fa-pencil-square-o"></i>&nbsp;审核通过</i-button>
+                <i-button type="error" @click="audit('0')"><i class="fa fa-pencil-square-o"></i>&nbsp;审核拒绝</i-button>
+
+            </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="stockChange" :rules="ruleValidate" :label-width="80">
+            <Form-item label="出、入库类型,0:普通入库 1:调拨入库 2:销售出库 3:普通出库 4:调拨出库" prop="type">
+                <i-input v-model="stockChange.type" placeholder="出、入库类型,0:普通入库 1:调拨入库 2:销售出库 3:普通出库 4:调拨出库"/>
+            </Form-item>
+            <Form-item label="出、入库时间" prop="time">
+                <i-input v-model="stockChange.time" placeholder="出、入库时间"/>
+            </Form-item>
+            <Form-item label="商户编号" prop="merchSn">
+                <i-input v-model="stockChange.merchSn" placeholder="商户编号"/>
+            </Form-item>
+            <Form-item label="商户名称" prop="merch">
+                <i-input v-model="stockChange.merch" placeholder="商户名称"/>
+            </Form-item>
+            <Form-item label="门店id" prop="storeId">
+                <i-input v-model="stockChange.storeId" placeholder="门店id"/>
+            </Form-item>
+            <Form-item label="门店名称" prop="store">
+                <i-input v-model="stockChange.store" placeholder="门店名称"/>
+            </Form-item>
+            <Form-item label="第三方商户" prop="thirdMerchSn">
+                <i-input v-model="stockChange.thirdMerchSn" placeholder="第三方商户"/>
+            </Form-item>
+            <Form-item label="审核状态,0:待审核 1:审核成功 2:审核拒绝" prop="audit">
+                <i-input v-model="stockChange.audit" placeholder="审核状态,0:待审核 1:审核成功 2:审核拒绝"/>
+            </Form-item>
+            <Form-item label="第三方商户名称" prop="thirdMerch">
+                <i-input v-model="stockChange.thirdMerch" placeholder="第三方商户名称"/>
+            </Form-item>
+            <Form-item label="备注" prop="remark">
+                <i-input v-model="stockChange.remark" placeholder="备注"/>
+            </Form-item>
+            <Form-item label="创建人" prop="createBy">
+                <i-input v-model="stockChange.createBy" placeholder="创建人"/>
+            </Form-item>
+            <Form-item label="创建时间" prop="createTime">
+                <i-input v-model="stockChange.createTime" placeholder="创建时间"/>
+            </Form-item>
+            <Form-item label="修改人" prop="modifyBy">
+                <i-input v-model="stockChange.modifyBy" placeholder="修改人"/>
+            </Form-item>
+            <Form-item label="修改时间" prop="modifyTime">
+                <i-input v-model="stockChange.modifyTime" placeholder="修改时间"/>
+            </Form-item>
+            <Form-item label="审核人" prop="auditBy">
+                <i-input v-model="stockChange.auditBy" placeholder="审核人"/>
+            </Form-item>
+            <Form-item label="审核时间" prop="auditTime">
+                <i-input v-model="stockChange.auditTime" 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/stockchange.js?_${date.systemTime}"></script>
+</body>
+</html>

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

@@ -954,6 +954,7 @@ let vm = new Vue({
             vm.levelName = '';
             vm.deductionScore = '';
             vm.memberCurrentAvailableScore = '';
+            vm.userInfo.customPhone = '';
             vm.memberCode = '';
             vm.switch1 = true;
             vm.clickFlag = true;
@@ -969,6 +970,7 @@ let vm = new Vue({
             vm.deductionScore = '';
             vm.memberCurrentAvailableScore = '';
             vm.memberCode = '';
+            vm.userInfo.customPhone = '';
             vm.clickFlag = true;
             vm.switch1 = true;
             vm.calActivityFlag = false;
@@ -995,6 +997,7 @@ let vm = new Vue({
 
             vm.clickFlag = true;
             vm.memberCode = '';
+            vm.userInfo.customPhone = '';
             vm.switch1 = true;
             vm.calActivityFlag = false;
             removeByValue(vm.pendingOrderKeys,key);
@@ -2222,6 +2225,7 @@ function toPayOrder(payCode){
                     vm.levelName = '';
                     vm.deductionScore = '';
                     vm.memberCurrentAvailableScore = '';
+                    vm.userInfo.customPhone = '';
                     vm.memberCode = "";
                     vm.switch1 = true;
                     vm.clickFlag = false;

+ 248 - 0
kmall-admin/src/main/webapp/js/shop/stockchange.js

@@ -0,0 +1,248 @@
+$(function () {
+    $("#jqGrid").jqGrid({
+        url: '../stockchange/list',
+        datatype: "json",
+        colModel: [
+			{label: '单号', name: 'id', index: 'id', key: true, width: 80, align: 'center'},
+			{label: '类型', name: 'type', index: 'type', width: 80, 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: 'time', index: 'time', width: 80, align: 'center'},
+			{label: '商户编号', name: 'merchSn', index: 'merch_sn', width: 80, align: 'center'},
+			{label: '商户名称', name: 'merch', index: 'merch', width: 80, align: 'center'},
+			{label: '门店id', name: 'storeId', index: 'store_id', width: 80, align: 'center'},
+			{label: '门店名称', name: 'store', index: 'store', width: 80, align: 'center'},
+			{label: '第三方商户', name: 'thirdMerchSn', index: 'third_merch_sn', width: 80, align: 'center'},
+			{label: '审核状态', name: 'audit', index: 'audit', width: 80, align: 'center', formatter: function (value) {
+					if (value == '0') {
+						return '待审核';
+					} else if (value == '1') {
+						return '审核成功';
+					} else if (value == '2') {
+						return '审核拒绝';
+					}
+					return '-';
+			}},
+			{label: '第三方商户名称', name: 'thirdMerch', index: 'third_merch', width: 80, align: 'center'},
+			{label: '备注', name: 'remark', index: 'remark', width: 80, align: 'center'},
+			{label: '创建人', name: 'createBy', index: 'create_by', width: 80, align: 'center'},
+			{label: '创建时间', name: 'createTime', index: 'create_time', width: 80, align: 'center'},
+			{label: '修改人', name: 'modifyBy', index: 'modify_by', width: 80, align: 'center'},
+			{label: '修改时间', name: 'modifyTime', index: 'modify_time', width: 80, align: 'center'},
+			{label: '审核人', name: 'auditBy', index: 'audit_by', width: 80, align: 'center'},
+			{label: '审核时间', name: 'auditTime', index: 'audit_time', width: 80, align: 'center'}],
+		viewrecords: true,
+        height: 550,
+        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,
+		stockChange: {},
+		ruleValidate: {
+			name: [
+				{required: true, message: '名称不能为空', trigger: 'blur'}
+			]
+		},
+		q: {
+		    name: ''
+		},
+		uploadData:[],
+	},
+	methods: {
+		query: function () {
+			vm.reload();
+		},
+		add: function () {
+			vm.showList = false;
+			vm.title = "新增";
+			vm.stockChange = {};
+		},
+		update: function (event) {
+            let id = getSelectedRow();
+			if (id == null) {
+				alert("请选择数据!");
+				return;
+			}
+			vm.showList = false;
+            vm.title = "修改";
+
+            vm.getInfo(id)
+		},
+		saveOrUpdate: function (event) {
+            let url = vm.stockChange.id == null ? "../stockchange/save" : "../stockchange/update";
+			$.ajax({
+				type: "POST",
+			    url: url,
+			    contentType: "application/json",
+			    data: JSON.stringify(vm.stockChange),
+                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){
+				alert("请选择至少一行!");
+				return;
+			}
+
+			confirm('确定要删除选中的记录?', function () {
+				$.ajax({
+					type: "POST",
+				    url: "../stockchange/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);
+						}
+					}
+				});
+			});
+		},
+		audit: function (type) {
+			let ids = getSelectedRows();
+			if (ids == null){
+				alert("请选择至少一行!");
+				return;
+			}
+
+			console.log(type);
+
+			let param = {
+				"ids" : ids,
+				"type" : type,
+			}
+			let msg;
+			if (type == '1') {
+				msg = "确定要审核成功吗?";
+			} else {
+				msg = "确定要拒绝审核吗?";
+			}
+
+			confirm(msg, function () {
+				$.ajax({
+					type: "POST",
+					url: "../stockchange/audit",
+					contentType: "application/json",
+					data: JSON.stringify(param),
+					success: function (r) {
+						if (r.code == 0) {
+							alert('操作成功', function (index) {
+								$("#jqGrid").trigger("reloadGrid");
+							});
+						} else {
+							alert(r.msg);
+						}
+					}
+				});
+			});
+
+		},
+		getInfo: function(id){
+			$.get("../stockchange/info/"+id, function (r) {
+                vm.stockChange = r.stockChange;
+            });
+		},
+        reloadSearch: function() {
+            vm.q = {
+                name: ''
+            }
+            vm.reload();
+		},
+		reload: function (event) {
+			vm.showList = true;
+            let page = $("#jqGrid").jqGrid('getGridParam', 'page');
+			$("#jqGrid").jqGrid('setGridParam', {
+                postData: {'name': vm.q.name},
+                page: page
+            }).trigger("reloadGrid");
+            vm.handleReset('formValidate');
+		},
+        handleSubmit: function (name) {
+            handleSubmitValidate(this, name, function () {
+                vm.saveOrUpdate()
+            });
+        },
+        handleReset: function (name) {
+            handleResetForm(this, name);
+        },
+		uploadExcelSuccess: function (data) {
+			if(data.code==0){
+				alert('导入成功', function (index) {
+					$("#jqGrid").trigger("reloadGrid");
+				});
+			}else{
+				alert(data.msg);
+			}
+		},
+		uploadExcelError: function () {
+			alert('上传出现异常,请重试!');
+		},
+		uploadExcelFormatError: function (file) {
+			this.$Notice.warning({
+				title: '文件格式不正确',
+				desc: '文件 ' + file.name + ' 格式不正确,请上传 xls 或 xlsx 格式的文件。'
+			});
+		},beforeUpload(){
+			vm.uploadData = {
+				storeId: vm.storeId,
+				mkaId : vm.mkaId
+			}
+			let promise = new Promise((resolve) => {
+				this.$nextTick(function () {
+					resolve(true);
+				});
+			});
+			return promise; //通过返回一个promis对象解决
+
+		}
+	}
+});

BIN=BIN
kmall-admin/src/main/webapp/statics/file/stock_change.xlsx


+ 2 - 0
kmall-common/src/main/java/com/kmall/common/constant/JxlsXmlTemplateName.java

@@ -44,6 +44,8 @@ public class JxlsXmlTemplateName {
     public static final String SCORE_REDUCTION_DTO_LIST = "/XmlTemplate/ScoreReductionDTOList.xml";
     // 出入库单记录导入
     public static final String STOCK_CHANGE_RECORD_DTO_LIST = "/XmlTemplate/StockChangeRecordDtoList.xml";
+    // 出入库单
+    public static final String STOCK_CHANGE_DTO_LIST = "/XmlTemplate/StockChangeDtoList.xml";
     // 优惠券商品导入
     public static final String COUPON_MERCHANDISE_DTO_LIST = "/XmlTemplate/CouponMerchandiseDtoList.xml";
     // 组合价商品导入