Explorar el Código

出入库单基础代码提交

lhm hace 3 años
padre
commit
5278d90051
Se han modificado 16 ficheros con 1119 adiciones y 1 borrados
  1. 143 0
      kmall-admin/src/main/java/com/kmall/admin/controller/haikong/StockChangeRecordController.java
  2. 33 0
      kmall-admin/src/main/java/com/kmall/admin/dao/haikong/StockChangeRecordDao.java
  3. 72 0
      kmall-admin/src/main/java/com/kmall/admin/dto/StockChangeRecordDto.java
  4. 4 0
      kmall-admin/src/main/java/com/kmall/admin/entity/haikong/HaiKongMemberOrderSyncResendEntity.java
  5. 3 0
      kmall-admin/src/main/java/com/kmall/admin/entity/haikong/HaiKongMemberScoreChangeRecordEntity.java
  6. 190 0
      kmall-admin/src/main/java/com/kmall/admin/entity/haikong/StockChangeRecordEntity.java
  7. 29 0
      kmall-admin/src/main/java/com/kmall/admin/haikong/constant/Constants.java
  8. 78 0
      kmall-admin/src/main/java/com/kmall/admin/service/haikong/StockChangeRecordService.java
  9. 21 1
      kmall-admin/src/main/java/com/kmall/admin/service/impl/OrderServiceImpl.java
  10. 115 0
      kmall-admin/src/main/java/com/kmall/admin/service/impl/haikong/StockChangeRecordServiceImpl.java
  11. 22 0
      kmall-admin/src/main/resources/XmlTemplate/StockChangeRecordDtoList.xml
  12. 144 0
      kmall-admin/src/main/resources/mybatis/mapper/haikong/StockChangeRecordDao.xml
  13. 76 0
      kmall-admin/src/main/webapp/WEB-INF/page/shop/stockchangerecord.html
  14. 187 0
      kmall-admin/src/main/webapp/js/shop/stockchangerecord.js
  15. BIN
      kmall-admin/src/main/webapp/statics/file/stock_change_record.xlsx
  16. 2 0
      kmall-common/src/main/java/com/kmall/common/constant/JxlsXmlTemplateName.java

+ 143 - 0
kmall-admin/src/main/java/com/kmall/admin/controller/haikong/StockChangeRecordController.java

@@ -0,0 +1,143 @@
+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.StockChangeRecordDto;
+import com.kmall.admin.entity.haikong.StockChangeRecordEntity;
+import com.kmall.admin.service.haikong.StockChangeRecordService;
+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.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-27 16:21:47
+ */
+@Controller
+@RequestMapping("stockchangerecord")
+public class StockChangeRecordController {
+    @Autowired
+    private StockChangeRecordService stockChangeRecordService;
+    @Autowired
+    private ExcelUtil excelUtil;
+
+    private final static Logger log = LoggerFactory.getLogger(StockChangeRecordController.class);
+    /**
+     * 查看列表
+     */
+    @RequestMapping("/list")
+    @ResponseBody
+    public R list(@RequestParam Map<String, Object> params) {
+        //查询列表数据
+        Query query = new Query(params);
+
+        List<StockChangeRecordEntity> stockChangeRecordList = stockChangeRecordService.queryList(query);
+        int total = stockChangeRecordService.queryTotal(query);
+
+        PageUtils pageUtil = new PageUtils(stockChangeRecordList, total, query.getLimit(), query.getPage());
+
+        return R.ok().put("page", pageUtil);
+    }
+
+    /**
+     * 查看信息
+     */
+    @RequestMapping("/info/{id}")
+    @ResponseBody
+    public R info(@PathVariable("id") Integer id) {
+        StockChangeRecordEntity stockChangeRecord = stockChangeRecordService.queryObject(id);
+
+        return R.ok().put("stockChangeRecord", stockChangeRecord);
+    }
+
+    /**
+     * 保存
+     */
+    @RequestMapping("/save")
+    @ResponseBody
+    public R save(@RequestBody StockChangeRecordEntity stockChangeRecord) {
+        stockChangeRecordService.save(stockChangeRecord);
+
+        return R.ok();
+    }
+
+    /**
+     * 修改
+     */
+    @RequestMapping("/update")
+    @ResponseBody
+    public R update(@RequestBody StockChangeRecordEntity stockChangeRecord) {
+        stockChangeRecordService.update(stockChangeRecord);
+
+        return R.ok();
+    }
+
+    /**
+     * 删除
+     */
+    @RequestMapping("/delete")
+    @ResponseBody
+    public R delete(@RequestBody Integer[]ids) {
+        stockChangeRecordService.deleteBatch(ids);
+
+        return R.ok();
+    }
+
+    /**
+     * 查看所有列表
+     */
+    @RequestMapping("/queryAll")
+    @ResponseBody
+    public R queryAll(@RequestParam Map<String, Object> params) {
+
+        List<StockChangeRecordEntity> list = stockChangeRecordService.queryList(params);
+
+        return R.ok().put("list", list);
+    }
+
+    /**
+     * 导入excel
+     */
+    @PostMapping("/upload")
+    @ResponseBody
+    public R storeUpload(@RequestParam("file") MultipartFile file) {
+        List<StockChangeRecordDto> stockChangeRecordDtos = new ArrayList<>();//信息
+        try {
+
+            StockChangeRecordDto stockChangeRecordDto = new StockChangeRecordDto();
+            Map<String, Object> beans = new HashMap<String, Object>();
+            beans.put("StockChangeRecordDto", stockChangeRecordDto);
+            beans.put("StockChangeRecordDtoList", stockChangeRecordDtos);
+            if (file.isEmpty()) {
+                return R.error("文件不能为空!");
+            }
+            excelUtil.readExcel(JxlsXmlTemplateName.STOCK_CHANGE_RECORD_DTO_LIST, beans, file.getInputStream());
+        } catch (Exception e) {
+            log.error("导入出入库记录失败:", e);
+            return R.error("导入失败!");
+        }
+        try {
+            stockChangeRecordService.uploadExcel(stockChangeRecordDtos);
+        } catch (RuntimeException e){
+            log.error("出入库记录导入数据写入表失败:", e);
+            return R.error(e.getMessage());
+        }
+        //上传文件
+        return R.ok("导入成功!");
+    }
+}

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

@@ -0,0 +1,33 @@
+package com.kmall.admin.dao.haikong;
+
+import com.kmall.admin.entity.haikong.StockChangeRecordEntity;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 海控出入库单记录Dao
+ *
+ * @author emato
+ * @email admin@qhdswl.com
+ * @date 2021-12-27 16:21:47
+ */
+public interface StockChangeRecordDao {
+
+
+    StockChangeRecordEntity queryObject(Integer id);
+
+    List<StockChangeRecordEntity> queryList(Map<String, Object> map);
+
+    int queryTotal(Map<String, Object> map);
+
+    int save(StockChangeRecordEntity stockChangeRecord);
+
+    int update(StockChangeRecordEntity stockChangeRecord);
+
+    int delete(Integer id);
+
+    int deleteBatch(Integer[] ids);
+
+    void saveBatch(List<StockChangeRecordEntity> stockChangeRecordEntities);
+}

+ 72 - 0
kmall-admin/src/main/java/com/kmall/admin/dto/StockChangeRecordDto.java

@@ -0,0 +1,72 @@
+package com.kmall.admin.dto;
+
+import java.io.Serializable;
+
+/**
+ * @author lhm
+ * @createDate 2021-12-27
+ */
+public class StockChangeRecordDto implements Serializable {
+
+    private static final long serialVersionUID = 199865635636920L;
+
+    private Integer storeId;
+
+    private Integer warehouseSn;
+
+    private String sku;
+
+    private String type;
+
+    private Integer number;
+
+    private String remark;
+
+    public Integer getStoreId() {
+        return storeId;
+    }
+
+    public void setStoreId(Integer storeId) {
+        this.storeId = storeId;
+    }
+
+    public Integer getWarehouseSn() {
+        return warehouseSn;
+    }
+
+    public void setWarehouseSn(Integer warehouseSn) {
+        this.warehouseSn = warehouseSn;
+    }
+
+    public String getSku() {
+        return sku;
+    }
+
+    public void setSku(String sku) {
+        this.sku = sku;
+    }
+
+    public String getType() {
+        return type;
+    }
+
+    public void setType(String type) {
+        this.type = type;
+    }
+
+    public Integer getNumber() {
+        return number;
+    }
+
+    public void setNumber(Integer number) {
+        this.number = number;
+    }
+
+    public String getRemark() {
+        return remark;
+    }
+
+    public void setRemark(String remark) {
+        this.remark = remark;
+    }
+}

+ 4 - 0
kmall-admin/src/main/java/com/kmall/admin/entity/haikong/HaiKongMemberOrderSyncResendEntity.java

@@ -1,5 +1,7 @@
 package com.kmall.admin.entity.haikong;
 
+import com.fasterxml.jackson.annotation.JsonFormat;
+
 import java.math.BigDecimal;
 import java.util.Date;
 
@@ -54,8 +56,10 @@ public class HaiKongMemberOrderSyncResendEntity {
     /**
      * 最后一次重发时间
      */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")
     private Date lastResendTime;
 
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")
     private Date createTime;
 
     public Integer getId() {

+ 3 - 0
kmall-admin/src/main/java/com/kmall/admin/entity/haikong/HaiKongMemberScoreChangeRecordEntity.java

@@ -1,5 +1,6 @@
 package com.kmall.admin.entity.haikong;
 
+import com.fasterxml.jackson.annotation.JsonFormat;
 import com.kmall.admin.haikong.constant.HaiKongMemberScoreChangeEventEnum;
 
 import java.util.Date;
@@ -46,8 +47,10 @@ public class HaiKongMemberScoreChangeRecordEntity {
      */
     private String statementId;
 
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")
     private Date createTime;
 
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")
     private Date modifyTime;
 
     /**

+ 190 - 0
kmall-admin/src/main/java/com/kmall/admin/entity/haikong/StockChangeRecordEntity.java

@@ -0,0 +1,190 @@
+package com.kmall.admin.entity.haikong;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 海控出入库单记录实体
+ * 表名 mall_stock_change_record
+ *
+ * @author emato
+ * @email admin@qhdswl.com
+ * @date 2021-12-27 16:21:47
+ */
+public class StockChangeRecordEntity implements Serializable {
+    private static final long serialVersionUID = 987816484146341651L;
+
+    /**
+     * 
+     */
+    private Integer id;
+    /**
+     * 门店id
+     */
+    private Integer storeId;
+    /**
+     * 仓库编号
+     */
+    private Integer warehouseSn;
+    /**
+     * sku
+     */
+    private String sku;
+    /**
+     * 记录类型,0:出库 1:入库
+     */
+    private String type;
+    /**
+     * 出库或入库数量
+     */
+    private Integer number;
+    /**
+     * 备注
+     */
+    private String remark;
+    /**
+     * 
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")
+    private Date createTime;
+    /**
+     * 
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")
+    private Date modifyTime;
+
+    /**
+     * 设置:
+     */
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    /**
+     * 获取:
+     */
+    public Integer getId() {
+        return id;
+    }
+    /**
+     * 设置:门店id
+     */
+    public void setStoreId(Integer storeId) {
+        this.storeId = storeId;
+    }
+
+    /**
+     * 获取:门店id
+     */
+    public Integer getStoreId() {
+        return storeId;
+    }
+    /**
+     * 设置:仓库编号
+     */
+    public void setWarehouseSn(Integer warehouseSn) {
+        this.warehouseSn = warehouseSn;
+    }
+
+    /**
+     * 获取:仓库编号
+     */
+    public Integer getWarehouseSn() {
+        return warehouseSn;
+    }
+    /**
+     * 设置:sku
+     */
+    public void setSku(String sku) {
+        this.sku = sku;
+    }
+
+    /**
+     * 获取:sku
+     */
+    public String getSku() {
+        return sku;
+    }
+    /**
+     * 设置:记录类型,0:出库 1:入库
+     */
+    public void setType(String type) {
+        this.type = type;
+    }
+
+    /**
+     * 获取:记录类型,0:出库 1:入库
+     */
+    public String getType() {
+        return type;
+    }
+    /**
+     * 设置:出库或入库数量
+     */
+    public void setNumber(Integer number) {
+        this.number = number;
+    }
+
+    /**
+     * 获取:出库或入库数量
+     */
+    public Integer getNumber() {
+        return number;
+    }
+    /**
+     * 设置:备注
+     */
+    public void setRemark(String remark) {
+        this.remark = remark;
+    }
+
+    /**
+     * 获取:备注
+     */
+    public String getRemark() {
+        return remark;
+    }
+    /**
+     * 设置:
+     */
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+    /**
+     * 获取:
+     */
+    public Date getCreateTime() {
+        return createTime;
+    }
+    /**
+     * 设置:
+     */
+    public void setModifyTime(Date modifyTime) {
+        this.modifyTime = modifyTime;
+    }
+
+    /**
+     * 获取:
+     */
+    public Date getModifyTime() {
+        return modifyTime;
+    }
+
+    @Override
+    public String toString() {
+        return "StockChangeRecordEntity{" +
+                "id=" + id +
+                ", storeId=" + storeId +
+                ", warehouseSn=" + warehouseSn +
+                ", sku='" + sku + '\'' +
+                ", type='" + type + '\'' +
+                ", number=" + number +
+                ", remark='" + remark + '\'' +
+                ", createTime=" + createTime +
+                ", modifyTime=" + modifyTime +
+                '}';
+    }
+}

+ 29 - 0
kmall-admin/src/main/java/com/kmall/admin/haikong/constant/Constants.java

@@ -334,4 +334,33 @@ public class Constants {
         }
     }
 
+    public enum StockChangeType {
+        /**
+         * 出库
+         */
+        item_0("0", "出库"),
+        /**
+         * 入库
+         */
+        item_1("1", "入库"),
+        ;
+
+        private final String type;
+
+        private final String desc;
+
+        StockChangeType(String type, String desc) {
+            this.type = type;
+            this.desc = desc;
+        }
+
+        public String getType() {
+            return type;
+        }
+
+        public String getDesc() {
+            return desc;
+        }
+    }
+
 }

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

@@ -0,0 +1,78 @@
+package com.kmall.admin.service.haikong;
+
+
+import com.kmall.admin.dto.StockChangeRecordDto;
+import com.kmall.admin.entity.haikong.StockChangeRecordEntity;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 海控出入库单记录Service接口
+ *
+ * @author emato
+ * @email admin@qhdswl.com
+ * @date 2021-12-27 16:21:47
+ */
+public interface StockChangeRecordService {
+
+    /**
+     * 根据主键查询实体
+     *
+     * @param id 主键
+     * @return 实体
+     */
+    StockChangeRecordEntity queryObject(Integer id);
+
+    /**
+     * 分页查询
+     *
+     * @param map 参数
+     * @return list
+     */
+    List<StockChangeRecordEntity> queryList(Map<String, Object> map);
+
+    /**
+     * 分页统计总数
+     *
+     * @param map 参数
+     * @return 总数
+     */
+    int queryTotal(Map<String, Object> map);
+
+    /**
+     * 保存实体
+     *
+     * @param stockChangeRecord 实体
+     * @return 保存条数
+     */
+    int save(StockChangeRecordEntity stockChangeRecord);
+
+    /**
+     * 根据主键更新实体
+     *
+     * @param stockChangeRecord 实体
+     * @return 更新条数
+     */
+    int update(StockChangeRecordEntity stockChangeRecord);
+
+    /**
+     * 根据主键删除
+     *
+     * @param id
+     * @return 删除条数
+     */
+    int delete(Integer id);
+
+    /**
+     * 根据主键批量删除
+     *
+     * @param ids
+     * @return 删除条数
+     */
+    int deleteBatch(Integer[]ids);
+
+    void uploadExcel(List<StockChangeRecordDto> stockChangeRecordDtos);
+
+    void saveBatch(List<StockChangeRecordEntity> stockChangeRecordEntities);
+}

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

@@ -324,6 +324,9 @@ public class OrderServiceImpl implements OrderService {
     @Autowired
     private HaiKongSendOrderInfoDetailRecordService haiKongSendOrderInfoDetailRecordService;
 
+    @Autowired
+    private StockChangeRecordService stockChangeRecordService;
+
     @Override
     public OrderEntity queryObject(Long id) {
         return orderDao.queryObject(id);
@@ -2177,13 +2180,16 @@ public class OrderServiceImpl implements OrderService {
         List<QueryGoodsVO> queryGoodsVOList = new ArrayList<>();
         Map<String, GoodsEntity> goodsEntityMap;
         List<GoodsEntity> goodsEntityList;
+
+        List<StockChangeRecordEntity> stockChangeRecordEntities = new ArrayList<>();
         try {
             goodsList.forEach(map -> {
                 QueryGoodsVO queryGoodsVo = new QueryGoodsVO();
                 queryGoodsVo.setProdBarcode((String) map.get("prodBarcode"));
                 queryGoodsVo.setSku((String) map.get("goodsSn"));
                 queryGoodsVo.setStoreId(storeId.longValue());
-                queryGoodsVo.setSellVolume((Integer) map.get("sellVolume"));
+                Integer sellVolume = (Integer) map.get("sellVolume");
+                queryGoodsVo.setSellVolume(sellVolume);
                 queryGoodsVo.setRetailPrice(new BigDecimal(String.valueOf(map.get("retailPrice"))));
                 queryGoodsVo.setGoodsTaxes(new BigDecimal(String.valueOf(map.get("goodstaxes"))));
                 Object discountedPriceObj = map.get("discountedPrice");
@@ -2206,8 +2212,20 @@ public class OrderServiceImpl implements OrderService {
                     deductionPrice = new BigDecimal(deductionPriceObj.toString());
                 }
                 queryGoodsVo.setDeductionPrice(deductionPrice);
+
+                StockChangeRecordEntity stockChangeRecordEntity = new StockChangeRecordEntity();
+                stockChangeRecordEntity.setNumber(sellVolume);
+                stockChangeRecordEntity.setWarehouseSn(Integer.parseInt(haiKongProperties.getWareCode()));
+                stockChangeRecordEntity.setRemark("销售出库");
+                stockChangeRecordEntity.setSku(queryGoodsVo.getProdBarcode());
+                stockChangeRecordEntity.setStoreId(storeId);
+                stockChangeRecordEntity.setType(Constants.StockChangeType.item_0.getType());
+                stockChangeRecordEntities.add(stockChangeRecordEntity);
+
                 queryGoodsVOList.add(queryGoodsVo);
             });
+
+            stockChangeRecordService.saveBatch(stockChangeRecordEntities);
             // 将在循环中查询数据库改为一次性查询
             goodsEntityList = goodsService.queryGoodsStockByQueryGoodsVoList(queryGoodsVOList);
             goodsEntityMap = goodsEntityList.stream().collect(Collectors.toMap(GoodsEntity::getSku, Function.identity(), (k1, k2) -> k2));
@@ -2216,6 +2234,8 @@ public class OrderServiceImpl implements OrderService {
             throw new ServiceException(e);
         }
 
+
+
         Map resultObj = Maps.newHashMap();
         // 海控需求,下单流程修改,收银端接收会员码,付款码,用户信息,订单数据
         // 1. 校验库存:保税仓库存 + 展销店库存 - 出区数 >= 购买数

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

@@ -0,0 +1,115 @@
+package com.kmall.admin.service.impl.haikong;
+
+import com.google.common.collect.ImmutableBiMap;
+import com.kmall.admin.dao.haikong.StockChangeRecordDao;
+import com.kmall.admin.dto.ScoreReductionDTO;
+import com.kmall.admin.dto.StockChangeRecordDto;
+import com.kmall.admin.entity.haikong.StockChangeRecordEntity;
+import com.kmall.admin.entity.mk.MkActivitiesScoreEntity;
+import com.kmall.admin.service.haikong.StockChangeRecordService;
+import com.kmall.admin.service.mk.MkActivitiesScoreService;
+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.springframework.aop.framework.AopContext;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.CollectionUtils;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+
+/**
+ * 海控出入库单记录Service实现类
+ *
+ * @author emato
+ * @email admin@qhdswl.com
+ * @date 2021-12-27 16:21:47
+ */
+@Service("stockChangeRecordService")
+public class StockChangeRecordServiceImpl implements StockChangeRecordService {
+    @Autowired
+    private StockChangeRecordDao stockChangeRecordDao;
+
+    @Override
+    public StockChangeRecordEntity queryObject(Integer id) {
+        return stockChangeRecordDao.queryObject(id);
+    }
+
+    @Override
+    public List<StockChangeRecordEntity> queryList(Map<String, Object> map) {
+        return stockChangeRecordDao.queryList(map);
+    }
+
+    @Override
+    public int queryTotal(Map<String, Object> map) {
+        return stockChangeRecordDao.queryTotal(map);
+    }
+
+    @Override
+    public int save(StockChangeRecordEntity stockChangeRecord) {
+        Date modifyTime = new Date();
+        stockChangeRecord.setModifyTime(modifyTime);
+        stockChangeRecord.setCreateTime(modifyTime);
+        return stockChangeRecordDao.save(stockChangeRecord);
+    }
+
+    @Override
+    public int update(StockChangeRecordEntity stockChangeRecord) {
+        stockChangeRecord.setModifyTime(new Date());
+        return stockChangeRecordDao.update(stockChangeRecord);
+    }
+
+    @Override
+    public int delete(Integer id) {
+        return stockChangeRecordDao.delete(id);
+    }
+
+    @Override
+    public int deleteBatch(Integer[]ids) {
+        return stockChangeRecordDao.deleteBatch(ids);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void uploadExcel(List<StockChangeRecordDto> stockChangeRecordDtos) {
+        if (!CollectionUtils.isEmpty(stockChangeRecordDtos)) {
+            List<StockChangeRecordEntity> stockChangeRecordEntities = new ArrayList<>();
+
+            stockChangeRecordDtos.forEach(stockChangeRecordDto -> {
+                Map<String, Object> valideDate = MapBeanUtil.fromObject(stockChangeRecordDto);
+                // 校验excel传入的数据
+                ImmutableBiMap.Builder builder = new ImmutableBiMap.Builder();
+                builder.put("storeId", "门店编号");
+                builder.put("sku", "商品SKU");
+                builder.put("warehouseSn", "仓库编码");
+                builder.put("type", "出入库类型");
+                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);
+                Date createTime = new Date();
+                stockChangeRecordEntity.setCreateTime(createTime);
+                stockChangeRecordEntity.setModifyTime(createTime);
+                stockChangeRecordEntities.add(stockChangeRecordEntity);
+            });
+
+            ((StockChangeRecordService) AopContext.currentProxy()).saveBatch(stockChangeRecordEntities);
+
+        }
+    }
+
+    @Override
+    public void saveBatch(List<StockChangeRecordEntity> stockChangeRecordEntities) {
+        stockChangeRecordDao.saveBatch(stockChangeRecordEntities);
+    }
+}

+ 22 - 0
kmall-admin/src/main/resources/XmlTemplate/StockChangeRecordDtoList.xml

@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<workbook>
+    <worksheet name="Sheet1">
+        <section startRow="0" endRow="0"/>
+        <loop startRow="1" endRow="1" items="StockChangeRecordDtoList" var="StockChangeRecordDto"
+              varType="com.kmall.admin.dto.StockChangeRecordDto">
+            <section startRow="1" endRow="1">
+                <mapping row="1" col="0">StockChangeRecordDto.storeId</mapping>
+                <mapping row="1" col="1">StockChangeRecordDto.warehouseSn</mapping>
+                <mapping row="1" col="2">StockChangeRecordDto.sku</mapping>
+                <mapping row="1" col="3">StockChangeRecordDto.type</mapping>
+                <mapping row="1" col="4">StockChangeRecordDto.number</mapping>
+                <mapping row="1" col="5">StockChangeRecordDto.remark</mapping>
+            </section>
+            <loopbreakcondition>
+                <rowcheck offset="0">
+                    <cellcheck offset="0"></cellcheck>
+                </rowcheck>
+            </loopbreakcondition>
+        </loop>
+    </worksheet>
+</workbook>

+ 144 - 0
kmall-admin/src/main/resources/mybatis/mapper/haikong/StockChangeRecordDao.xml

@@ -0,0 +1,144 @@
+<?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.StockChangeRecordDao">
+
+    <resultMap type="com.kmall.admin.entity.haikong.StockChangeRecordEntity" id="stockChangeRecordMap">
+        <result property="id" column="id"/>
+        <result property="storeId" column="store_id"/>
+        <result property="warehouseSn" column="warehouse_sn"/>
+        <result property="sku" column="sku"/>
+        <result property="type" column="type"/>
+        <result property="number" column="number"/>
+        <result property="remark" column="remark"/>
+        <result property="createTime" column="create_time"/>
+        <result property="modifyTime" column="modify_time"/>
+    </resultMap>
+
+	<select id="queryObject" resultMap="stockChangeRecordMap">
+		select
+			`id`,
+			`store_id`,
+			`warehouse_sn`,
+			`sku`,
+			`type`,
+			`number`,
+			`remark`,
+			`create_time`,
+			`modify_time`
+		from mall_stock_change_record
+		where id = #{id}
+	</select>
+
+	<select id="queryList" resultMap="stockChangeRecordMap">
+		select
+    		`id`,
+    		`store_id`,
+    		`warehouse_sn`,
+    		`sku`,
+    		`type`,
+    		`number`,
+    		`remark`,
+    		`create_time`,
+    		`modify_time`
+		from mall_stock_change_record
+		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_record
+		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.haikong.StockChangeRecordEntity" useGeneratedKeys="true" keyProperty="id">
+		insert into mall_stock_change_record(
+			`store_id`,
+			`warehouse_sn`,
+			`sku`,
+			`type`,
+			`number`,
+			`remark`,
+			`create_time`,
+			`modify_time`)
+		values(
+			#{storeId},
+			#{warehouseSn},
+			#{sku},
+			#{type},
+			#{number},
+			#{remark},
+			#{createTime},
+			#{modifyTime})
+	</insert>
+
+	<insert id="saveBatch">
+		insert into mall_stock_change_record
+		(
+			`store_id`,
+			`warehouse_sn`,
+			`sku`,
+			`type`,
+			`number`,
+			`remark`,
+			`create_time`,
+			`modify_time`
+		)
+		values
+		<foreach collection="list" item="item" separator=",">
+			(
+				#{item.storeId},
+				#{item.warehouseSn},
+				#{item.sku},
+				#{item.type},
+				#{item.number},
+				#{item.remark},
+				#{item.createTime},
+				#{item.modifyTime}
+			)
+		</foreach>
+	</insert>
+
+	<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="warehouseSn != null">`warehouse_sn` = #{warehouseSn}, </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="createTime != null">`create_time` = #{createTime}, </if>
+			<if test="modifyTime != null">`modify_time` = #{modifyTime}</if>
+		</set>
+		where id = #{id}
+	</update>
+	
+	<delete id="delete">
+		delete from mall_stock_change_record where id = #{value}
+	</delete>
+	
+	<delete id="deleteBatch">
+		delete from mall_stock_change_record where id in 
+		<foreach item="id" collection="array" open="(" separator="," close=")">
+			#{id}
+		</foreach>
+	</delete>
+
+</mapper>

+ 76 - 0
kmall-admin/src/main/webapp/WEB-INF/page/shop/stockchangerecord.html

@@ -0,0 +1,76 @@
+<!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.storeId" @on-enter="query" placeholder="门店id"/>
+                </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="../stockchangerecord/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_record.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>
+            </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="stockChangeRecord" :rules="ruleValidate" :label-width="80">
+            <Form-item label="门店id" prop="storeId">
+                <i-input v-model="stockChangeRecord.storeId" placeholder="门店id"/>
+            </Form-item>
+            <Form-item label="仓库编号" prop="warehouseSn">
+                <i-input v-model="stockChangeRecord.warehouseSn" placeholder="仓库编号"/>
+            </Form-item>
+            <Form-item label="sku" prop="sku">
+                <i-input v-model="stockChangeRecord.sku" placeholder="sku"/>
+            </Form-item>
+            <Form-item label="类型" prop="type">
+                <i-input v-model="stockChangeRecord.type" placeholder="记录类型,0:出库 1:入库"/>
+            </Form-item>
+            <Form-item label="数量" prop="number">
+                <i-input v-model="stockChangeRecord.number" placeholder="出库或入库数量"/>
+            </Form-item>
+            <Form-item label="备注" prop="remark">
+                <i-input v-model="stockChangeRecord.remark" placeholder="备注"/>
+            </Form-item>
+            <Form-item label="创建时间" prop="createTime">
+                <i-input v-model="stockChangeRecord.createTime" placeholder=""/>
+            </Form-item>
+            <Form-item label="修改时间" prop="modifyTime">
+                <i-input v-model="stockChangeRecord.modifyTime" 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/stockchangerecord.js?_${date.systemTime}"></script>
+</body>
+</html>

+ 187 - 0
kmall-admin/src/main/webapp/js/shop/stockchangerecord.js

@@ -0,0 +1,187 @@
+$(function () {
+    $("#jqGrid").jqGrid({
+        url: '../stockchangerecord/list',
+        datatype: "json",
+        colModel: [
+			{label: 'id', name: 'id', index: 'id', key: true, hidden: true},
+			{label: '门店id', name: 'storeId', index: 'store_id', width: 80},
+			{label: '仓库编号', name: 'warehouseSn', index: 'warehouse_sn', width: 80},
+			{label: 'sku', name: 'sku', index: 'sku', width: 80},
+			{label: '类型', name: 'type', index: 'type', width: 80, formatter:function (value) {
+				if (value === '0') {
+					return '出库';
+				} else {
+					return '入库';
+				}
+			}},
+			{label: '数量', name: 'number', index: 'number', width: 80},
+			{label: '备注', name: 'remark', index: 'remark', width: 80},
+			{label: '创建时间', name: 'createTime', index: 'create_time', width: 80, formatter:function (value) {
+				return new Date(value);
+			}},
+			{label: '修改时间', name: 'modifyTime', index: 'modify_time', width: 80, formatter:function (value) {
+				return new Date(value);
+			}}],
+		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,
+		stockChangeRecord: {},
+		ruleValidate: {
+			name: [
+				{required: true, message: '名称不能为空', trigger: 'blur'}
+			]
+		},
+		q: {
+		    name: ''
+		},
+		uploadData:[]
+	},
+	methods: {
+		query: function () {
+			vm.reload();
+		},
+		add: function () {
+			vm.showList = false;
+			vm.title = "新增";
+			vm.stockChangeRecord = {};
+		},
+		update: function (event) {
+            let id = getSelectedRow();
+			if (id == null) {
+				return;
+			}
+			vm.showList = false;
+            vm.title = "修改";
+
+            vm.getInfo(id)
+		},
+		saveOrUpdate: function (event) {
+            let url = vm.stockChangeRecord.id == null ? "../stockchangerecord/save" : "../stockchangerecord/update";
+			$.ajax({
+				type: "POST",
+			    url: url,
+			    contentType: "application/json",
+			    data: JSON.stringify(vm.stockChangeRecord),
+                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: "../stockchangerecord/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("../stockchangerecord/info/"+id, function (r) {
+                vm.stockChangeRecord = r.stockChangeRecord;
+            });
+		},
+        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
kmall-admin/src/main/webapp/statics/file/stock_change_record.xlsx


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

@@ -42,6 +42,8 @@ public class JxlsXmlTemplateName {
     public static final String FREE_GOODS_DTO_LIST = "/XmlTemplate/FreeGoodsDtoList.xml";
     // 积分抵扣商品导入
     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 COUPON_MERCHANDISE_DTO_LIST = "/XmlTemplate/CouponMerchandiseDtoList.xml";
     // 组合价商品导入