Kaynağa Gözat

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

杨波 4 yıl önce
ebeveyn
işleme
99e4918b32
31 değiştirilmiş dosya ile 1052 ekleme ve 224 silme
  1. 11 0
      kmall-admin/src/main/java/com/kmall/admin/controller/GoodsProductController.java
  2. 2 0
      kmall-admin/src/main/java/com/kmall/admin/dao/AddressInfoDao.java
  3. 5 0
      kmall-admin/src/main/java/com/kmall/admin/dao/OrderDao.java
  4. 10 0
      kmall-admin/src/main/java/com/kmall/admin/entity/GoodsProductEntity.java
  5. 56 0
      kmall-admin/src/main/java/com/kmall/admin/entity/StoreExprActiveDto.java
  6. 4 0
      kmall-admin/src/main/java/com/kmall/admin/service/AddressInfoService.java
  7. 1 0
      kmall-admin/src/main/java/com/kmall/admin/service/GoodsProductService.java
  8. 6 0
      kmall-admin/src/main/java/com/kmall/admin/service/impl/AddressInfoServiceImpl.java
  9. 134 33
      kmall-admin/src/main/java/com/kmall/admin/service/impl/GoodsProductServiceImpl.java
  10. 220 141
      kmall-admin/src/main/java/com/kmall/admin/service/impl/OrderServiceImpl.java
  11. 5 0
      kmall-admin/src/main/java/com/kmall/admin/service/impl/oms2kmall/Oms2KmallServiceImpl.java
  12. 63 13
      kmall-admin/src/main/resources/mybatis/mapper/GoodsProductDao.xml
  13. 4 0
      kmall-admin/src/main/resources/mybatis/mapper/OrderDao.xml
  14. 17 0
      kmall-admin/src/main/resources/mybatis/mapper/shop/AddressInfoDao.xml
  15. 27 0
      kmall-admin/src/main/webapp/WEB-INF/page/sale/sale.html
  16. 10 0
      kmall-admin/src/main/webapp/WEB-INF/page/shop/goodsproduct.html
  17. 113 21
      kmall-admin/src/main/webapp/js/sale/sale.js
  18. 61 5
      kmall-admin/src/main/webapp/js/shop/goodsproduct.js
  19. BIN
      kmall-admin/src/main/webapp/statics/img/bestex_logo.jpeg
  20. BIN
      kmall-admin/src/main/webapp/statics/img/bestex_logo2.jpeg
  21. BIN
      kmall-admin/src/main/webapp/statics/img/bestex_logo2.png
  22. BIN
      kmall-admin/src/main/webapp/statics/img/bestex_logo3.png
  23. BIN
      kmall-admin/src/main/webapp/statics/img/yto_logo.jpg
  24. 41 0
      kmall-common/src/main/java/com/kmall/common/constant/Dict.java
  25. 9 0
      kmall-common/src/main/java/com/kmall/common/utils/print/ticket/item/Ticket.java
  26. 198 0
      kmall-common/src/main/java/com/kmall/common/utils/print/ticket/item/TicketMailInfo.java
  27. 42 0
      kmall-manager/src/main/java/com/kmall/manager/manager/print/ticket/TicketPrintUtil.java
  28. 2 2
      kmall-manager/src/main/resources/conf/db.properties
  29. 7 7
      kmall-manager/src/main/resources/conf/oms-merch.properties
  30. 1 2
      kmall-manager/src/main/resources/conf/redis.properties
  31. 3 0
      切换环境需要修改的.md

+ 11 - 0
kmall-admin/src/main/java/com/kmall/admin/controller/GoodsProductController.java

@@ -102,6 +102,7 @@ public class GoodsProductController {
         if (barcode!=null) {
             return R.error("此产品条码:"+barcode.getProdBarcode()+"以备案");
         }
+        goodsProduct.setStatus(Dict.productRecordStatus.item_00.getItem());
         goodsProductService.save(goodsProduct);
         return R.ok();
     }
@@ -528,6 +529,16 @@ public class GoodsProductController {
         String result = goodsProductService.sendAllProduct(Dict.operateFlag.item_2.getItem());
         return R.ok(result);
     }
+    /**
+     * 从oms拉取产品备案数据,然后更新
+     */
+    @RequestMapping("/pullFromOms")
+    @ResponseBody
+    public R pull() {
+        String result = goodsProductService.pullFromOms();
+        return R.ok(result);
+    }
+
 
 
 }

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

@@ -2,6 +2,7 @@ package com.kmall.admin.dao;
 
 
 import com.kmall.admin.entity.AddressInfoEntity;
+import com.kmall.admin.entity.StoreExprActiveDto;
 import com.kmall.manager.dao.BaseDao;
 import org.apache.ibatis.annotations.Param;
 
@@ -38,4 +39,5 @@ public interface AddressInfoDao extends BaseDao<AddressInfoEntity> {
      */
     List<AddressInfoEntity> queryCourieId(@Param("courieId") Integer courieId);
 
+    StoreExprActiveDto queryByStoreId(Long storeId);
 }

+ 5 - 0
kmall-admin/src/main/java/com/kmall/admin/dao/OrderDao.java

@@ -8,6 +8,9 @@ import com.kmall.api.entity.OrderVo;
 import com.kmall.common.utils.Query;
 import org.apache.ibatis.annotations.Param;
 import com.kmall.manager.dao.BaseDao;
+import org.springframework.transaction.annotation.Isolation;
+import org.springframework.transaction.annotation.Propagation;
+import org.springframework.transaction.annotation.Transactional;
 
 import java.math.BigDecimal;
 import java.util.List;
@@ -172,4 +175,6 @@ public interface OrderDao extends BaseDao<OrderEntity> {
     List<TaxDetailDto> queryRefundPreviousTaxDetailList(@Param("billDate") String billDate, @Param("storeId") String storeId);
 
     List<OrderEntity> queryAll201Order(@Param("date") String date);
+
+    int updateOrderRefunding(Long id);
 }

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

@@ -216,6 +216,16 @@ public class GoodsProductEntity implements Serializable {
 
     private Date omsAuditTime;
 
+    private String status;
+
+    public String getStatus() {
+        return status;
+    }
+
+    public void setStatus(String status) {
+        this.status = status;
+    }
+
     public Date getOmsAuditTime() {
         return omsAuditTime;
     }

+ 56 - 0
kmall-admin/src/main/java/com/kmall/admin/entity/StoreExprActiveDto.java

@@ -0,0 +1,56 @@
+package com.kmall.admin.entity;
+
+import java.io.Serializable;
+
+public class StoreExprActiveDto implements Serializable {
+
+    private Long storeId;
+
+    private Long exprId;
+
+    private String exprTypeId;
+
+    private String exprCode;
+
+    private String exprName;
+
+    public Long getStoreId() {
+        return storeId;
+    }
+
+    public String getExprTypeId() {
+        return exprTypeId;
+    }
+
+    public void setExprTypeId(String exprTypeId) {
+        this.exprTypeId = exprTypeId;
+    }
+
+    public void setStoreId(Long storeId) {
+        this.storeId = storeId;
+    }
+
+    public Long getExprId() {
+        return exprId;
+    }
+
+    public void setExprId(Long exprId) {
+        this.exprId = exprId;
+    }
+
+    public String getExprCode() {
+        return exprCode;
+    }
+
+    public void setExprCode(String exprCode) {
+        this.exprCode = exprCode;
+    }
+
+    public String getExprName() {
+        return exprName;
+    }
+
+    public void setExprName(String exprName) {
+        this.exprName = exprName;
+    }
+}

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

@@ -3,6 +3,7 @@ package com.kmall.admin.service;
 
 import com.kmall.admin.entity.AddressInfoEntity;
 import com.kmall.admin.entity.ShopAndAddrVo;
+import com.kmall.admin.entity.StoreExprActiveDto;
 import com.kmall.admin.entity.shop.StoreAddrVo;
 
 import java.util.List;
@@ -33,6 +34,9 @@ public interface AddressInfoService {
     AddressInfoEntity queryIds(ShopAndAddrVo shopAndAddrVo);
 
     List<AddressInfoEntity> queryCourieId(Integer courieId);
+
+    StoreExprActiveDto queryByStoreId(Long storeId);
+
     /**
      * 分页查询
      *

+ 1 - 0
kmall-admin/src/main/java/com/kmall/admin/service/GoodsProductService.java

@@ -89,4 +89,5 @@ public interface GoodsProductService {
 
     int updateAuditInfo(String sku, String isAudit, Date auditTime, String auditRemark);
 
+    String pullFromOms();
 }

+ 6 - 0
kmall-admin/src/main/java/com/kmall/admin/service/impl/AddressInfoServiceImpl.java

@@ -3,6 +3,7 @@ package com.kmall.admin.service.impl;
 import com.kmall.admin.dao.AddressInfoDao;
 import com.kmall.admin.entity.AddressInfoEntity;
 import com.kmall.admin.entity.ShopAndAddrVo;
+import com.kmall.admin.entity.StoreExprActiveDto;
 import com.kmall.admin.entity.shop.StoreAddrVo;
 import com.kmall.admin.fromcomm.entity.SysUserEntity;
 import com.kmall.admin.service.AddressInfoService;
@@ -46,6 +47,11 @@ public class AddressInfoServiceImpl implements AddressInfoService {
     }
 
     @Override
+    public StoreExprActiveDto queryByStoreId(Long storeId) {
+        return addressInfoDao.queryByStoreId(storeId);
+    }
+
+    @Override
     public List<AddressInfoEntity> queryList(Map<String, Object> map) {
         return addressInfoDao.queryList(map);
     }

+ 134 - 33
kmall-admin/src/main/java/com/kmall/admin/service/impl/GoodsProductServiceImpl.java

@@ -1,16 +1,19 @@
 package com.kmall.admin.service.impl;
 
 import com.alibaba.fastjson.JSON;
+import com.google.common.base.Joiner;
 import com.google.gson.Gson;
 import com.kmall.admin.dao.GoodsProductDao;
 import com.kmall.admin.dto.GoodsProductDto;
 import com.kmall.admin.dto.PdProductDtoInfo;
 import com.kmall.admin.entity.GoodsProductEntity;
 import com.kmall.admin.service.GoodsProductService;
+import com.kmall.admin.service.GoodsService;
 import com.kmall.admin.utils.ShiroUtils;
 import com.kmall.admin.utils.data.response.ResponseMessage;
 import com.kmall.admin.utils.oms.OmsSign;
 import com.kmall.common.constant.Dict;
+import com.kmall.common.utils.R;
 import com.kmall.common.utils.RRException;
 import com.kmall.manager.manager.merch.OmsMerchProperties;
 import okhttp3.Request;
@@ -23,6 +26,7 @@ import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.StringUtils;
 
 import java.math.BigDecimal;
+import java.net.URLEncoder;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -41,6 +45,9 @@ public class GoodsProductServiceImpl implements GoodsProductService {
     private GoodsProductDao goodsProductDao;
 
     @Autowired
+    private GoodsService goodsService;
+
+    @Autowired
     private OmsMerchProperties omsMerchProperties;
 
     @Override
@@ -60,11 +67,47 @@ public class GoodsProductServiceImpl implements GoodsProductService {
 
     @Override
     public int save(GoodsProductEntity goodsProduct) {
+        GoodsProductEntity entity = goodsProductDao.selectBySku(goodsProduct.getSku());
+        if (entity != null) {
+            throw new RRException("该sku已存在!");
+        }
+        entity = goodsProductDao.selectByBarcode(goodsProduct.getProdBarcode());
+        if (entity != null) {
+            throw new RRException("该产品条码已存在!");
+        }
+        goodsProduct.setStatus(Dict.productRecordStatus.item_00.getItem());
         return goodsProductDao.save(goodsProduct);
     }
 
+
     @Override
     public int update(GoodsProductEntity goodsProduct) {
+        GoodsProductEntity entity = goodsProductDao.selectBySku(goodsProduct.getSku());
+        if (entity == null) {
+            throw new RRException("该产品sku不存在!");
+        }
+        String status = entity.getStatus();
+        Map<String, String> restrictMsg = new HashMap<>();
+
+        restrictMsg.put(Dict.productRecordStatus.item_02.getItem(), "该数据正在审核中,无法修改");
+        restrictMsg.put(Dict.productRecordStatus.item_12.getItem(), "该数据正在审核中,无法修改");
+        restrictMsg.put(Dict.productRecordStatus.item_21.getItem(), "该数据已经备案成功,暂未更新,无法修改");
+
+        if (restrictMsg.containsKey(status)) {
+            throw new RRException(restrictMsg.get(status));
+        }
+
+        Set<String> addStatus = new HashSet<>();
+        addStatus.add(Dict.productRecordStatus.item_00.getItem());
+        addStatus.add(Dict.productRecordStatus.item_01.getItem());
+        addStatus.add(Dict.productRecordStatus.item_03.getItem());
+        if (addStatus.contains(status)) {
+            goodsProduct.setStatus(Dict.productRecordStatus.item_00.getItem());
+        } else {
+            goodsProduct.setStatus(Dict.productRecordStatus.item_10.getItem());
+        }
+
+
         return goodsProductDao.update(goodsProduct);
     }
 
@@ -74,15 +117,15 @@ public class GoodsProductServiceImpl implements GoodsProductService {
     }
 
     @Override
-    public int deleteBatch(Integer[]mallGoodsProductSns) {
+    public int deleteBatch(Integer[] mallGoodsProductSns) {
         return goodsProductDao.deleteBatch(mallGoodsProductSns);
     }
 
     @Override
     @Transactional
     public void uploadExcel(List<GoodsProductDto> goodsProductDtoList) {
-        if (Objects.nonNull(goodsProductDtoList) && goodsProductDtoList.size()>0){
-            int count =1;
+        if (Objects.nonNull(goodsProductDtoList) && goodsProductDtoList.size() > 0) {
+            int count = 1;
             for (GoodsProductDto goodsProductDto : goodsProductDtoList) {
                 if (StringUtils.isEmpty(goodsProductDto.getMerchSn())) {
                     throw new RRException("第" + count + "行的商户编号为空!");
@@ -109,10 +152,10 @@ public class GoodsProductServiceImpl implements GoodsProductService {
                     throw new RRException("第" + count + "行的品牌中文或品牌英文必填其中之一!");
                 }
                 if (!StringUtils.isEmpty(goodsProductDto.getProdBrandCn()) && !StringUtils.isEmpty(goodsProductDto.getProdBrandEn())) {
-                    goodsProductDto.setProdBrand(goodsProductDto.getProdBrandCn()+"#&#"+goodsProductDto.getProdBrandEn());
-                }else if (!StringUtils.isEmpty(goodsProductDto.getProdBrandCn()) && StringUtils.isEmpty(goodsProductDto.getProdBrandEn())){
+                    goodsProductDto.setProdBrand(goodsProductDto.getProdBrandCn() + "#&#" + goodsProductDto.getProdBrandEn());
+                } else if (!StringUtils.isEmpty(goodsProductDto.getProdBrandCn()) && StringUtils.isEmpty(goodsProductDto.getProdBrandEn())) {
                     goodsProductDto.setProdBrand(goodsProductDto.getProdBrandCn());
-                }else{
+                } else {
                     goodsProductDto.setProdBrand(goodsProductDto.getProdBrandEn());
                 }
                 if (StringUtils.isEmpty(goodsProductDto.getUnitCode())) {
@@ -148,12 +191,12 @@ public class GoodsProductServiceImpl implements GoodsProductService {
                 if (StringUtils.isEmpty(goodsProductDto.getLegalUnit2Qty())) {
                     throw new RRException("第" + count + "行的第二法定单位数量为空!");
                 }
-                GoodsProductEntity queryProduct = goodsProductDao.selectByParams(goodsProductDto.getSku(), goodsProductDto.getMerchSn(),goodsProductDto.getThirdMerchSn());
-                if (Objects.nonNull(queryProduct)){
-                    throw new RRException("该sku:"+queryProduct.getSku()+"已存在!");
+                GoodsProductEntity queryProduct = goodsProductDao.selectByParams(goodsProductDto.getSku(), goodsProductDto.getMerchSn(), goodsProductDto.getThirdMerchSn());
+                if (Objects.nonNull(queryProduct)) {
+                    throw new RRException("该sku:" + queryProduct.getSku() + "已存在!");
                 }
                 GoodsProductEntity goodsProductEntity = new GoodsProductEntity();
-                BeanUtils.copyProperties(goodsProductDto,goodsProductEntity);
+                BeanUtils.copyProperties(goodsProductDto, goodsProductEntity);
                 goodsProductEntity.setLegalUnit1Qty(new BigDecimal(goodsProductDto.getLegalUnit1Qty()));
                 goodsProductEntity.setLegalUnit2Qty(new BigDecimal(goodsProductDto.getLegalUnit2Qty()));
                 goodsProductEntity.setNetWeight(new BigDecimal(goodsProductDto.getNetWeight()));
@@ -165,20 +208,58 @@ public class GoodsProductServiceImpl implements GoodsProductService {
                 goodsProductEntity.setDeclPrice(new BigDecimal(goodsProductDto.getDeclPrice()));
                 goodsProductEntity.setCreateTime(new Date());
                 goodsProductEntity.setCreaterSn(ShiroUtils.getUserId().toString());
+                goodsProductEntity.setStatus(Dict.productRecordStatus.item_00.getItem());
                 goodsProductDao.save(goodsProductEntity);
-                count ++;
+                count++;
             }
         }
     }
 
     @Override
     @Transactional
-    public String sendSelectProduct(Integer[] mallGoodsProductSns,String operateFlag) {
+    public String sendSelectProduct(Integer[] mallGoodsProductSns, String operateFlag) {
+        if (!Dict.operateFlag.item_1.getItem().equals(operateFlag) && !Dict.operateFlag.item_2.getItem().equals(operateFlag)) {
+            return "操作标识无法识别,请联系管理员";
+        }
         List<GoodsProductEntity> goodsProductEntityList = goodsProductDao.selectByMallGoodsProductSns(mallGoodsProductSns);
+
+        Map<String, String> addRestrictMsg = new HashMap<>();
+        addRestrictMsg.put(Dict.productRecordStatus.item_02.getItem(), "sku:%s,该sku备案正在审核中,请勿再次发送!");
+        addRestrictMsg.put(Dict.productRecordStatus.item_03.getItem(), "sku:%s,该sku备案审核失败,请修改后再次发送!");
+        addRestrictMsg.put(Dict.productRecordStatus.item_10.getItem(), "sku:%s,该sku备案为重新备案,请选择修改发送!");
+        addRestrictMsg.put(Dict.productRecordStatus.item_11.getItem(), "sku:%s,该sku备案为重新备案,请选择修改发送!");
+        addRestrictMsg.put(Dict.productRecordStatus.item_12.getItem(), "sku:%s,该sku备案为重新备案,且正在审核中!");
+        addRestrictMsg.put(Dict.productRecordStatus.item_13.getItem(), "sku:%s,该sku备案为重新备案,请修改后选择修改发送!");
+        addRestrictMsg.put(Dict.productRecordStatus.item_21.getItem(), "sku:%s,该sku备案已经备案成功,请重新抓取!");
+        addRestrictMsg.put(Dict.productRecordStatus.item_22.getItem(), "sku:%s,该sku备案已经备案成功,无法新增,如需修改,请编辑后选择修改发送!");
+
+        Map<String, String> updateRestrictMsg = new HashMap<>();
+        updateRestrictMsg.put(Dict.productRecordStatus.item_00.getItem(), "sku:%s,该sku为新增备案,请选择新增发送!");
+        updateRestrictMsg.put(Dict.productRecordStatus.item_01.getItem(), "sku:%s,该sku为新增备案,请选择新增发送!");
+        updateRestrictMsg.put(Dict.productRecordStatus.item_02.getItem(), "sku:%s,该sku为新增备案,且正在审核中!");
+        updateRestrictMsg.put(Dict.productRecordStatus.item_03.getItem(), "sku:%s,该sku为新增备案,请修改后选择新增发送!");
+        updateRestrictMsg.put(Dict.productRecordStatus.item_12.getItem(), "sku:%s,该sku备案正在审核中,请勿再次发送!");
+        updateRestrictMsg.put(Dict.productRecordStatus.item_13.getItem(), "sku:%s,该sku备案审核失败,请修改后再次发送!");
+        updateRestrictMsg.put(Dict.productRecordStatus.item_21.getItem(), "sku:%s,该sku备案已经备案成功,请重新抓取!");
+        updateRestrictMsg.put(Dict.productRecordStatus.item_22.getItem(), "sku:%s,该sku备案已经备案成功,如需修改,请编辑后选择修改发送!");
+        for (GoodsProductEntity entity : goodsProductEntityList) {
+            String status = entity.getStatus();
+            if (Dict.operateFlag.item_1.getItem().equals(operateFlag)) {
+                if (addRestrictMsg.containsKey(status)) {
+                    String msg = addRestrictMsg.get(status);
+                    return String.format(msg, entity.getSku());
+                }
+            } else if (Dict.operateFlag.item_2.getItem().equals(operateFlag)) {
+                if (updateRestrictMsg.containsKey(status)) {
+                    String msg = updateRestrictMsg.get(status);
+                    return String.format(msg, entity.getSku());
+                }
+            }
+        }
         List<GoodsProductDto> goodsProductDtoList = new ArrayList<>();
         for (GoodsProductEntity goodsProductEntity : goodsProductEntityList) {
             GoodsProductDto dto = new GoodsProductDto();
-            BeanUtils.copyProperties(goodsProductEntity,dto);
+            BeanUtils.copyProperties(goodsProductEntity, dto);
             dto.setLegalUnit1Qty(goodsProductEntity.getLegalUnit1Qty().toString());
             dto.setLegalUnit2Qty(goodsProductEntity.getLegalUnit2Qty().toString());
             dto.setNetWeight(goodsProductEntity.getNetWeight().toString());
@@ -194,14 +275,14 @@ public class GoodsProductServiceImpl implements GoodsProductService {
             if (!"0".equals(result.getCode())) {
                 isPass = false;
             }
-            rollbackHandler(goodsProductDtoList, isPass);
+            callbackHandler(goodsProductDtoList, isPass);
             return result.getMsg();
-        }catch (Exception e){
+        } catch (Exception e) {
             isPass = false;
             e.printStackTrace();
             LOGGER.error(e.getMessage());
         }
-        rollbackHandler(goodsProductDtoList, isPass);
+        callbackHandler(goodsProductDtoList, isPass);
         return "请求失败,请联系管理员";
     }
 
@@ -210,15 +291,22 @@ public class GoodsProductServiceImpl implements GoodsProductService {
     public String sendAllProduct(String operateFlag) {
         // 查询所有发送失败或者未发送的
         Map<String, Object> condition = new HashMap<>();
-        condition.put("isSend", "0,2");
+        if (Dict.operateFlag.item_1.getItem().equals(operateFlag)) {
+            condition.put("status", Dict.productRecordStatus.item_00.getItem() + "," + Dict.productRecordStatus.item_01.getItem());
+        } else if (Dict.operateFlag.item_2.getItem().equals(operateFlag)) {
+            condition.put("status", Dict.productRecordStatus.item_10.getItem() + "," + Dict.productRecordStatus.item_11.getItem());
+        } else {
+            return "操作标识无法识别,请联系管理员";
+        }
+
         List<GoodsProductEntity> goodsProductEntityList = goodsProductDao.queryList(condition);
-        if (goodsProductEntityList == null || goodsProductEntityList.size()==0){
-            return "无数据,请添加数据";
+        if (goodsProductEntityList == null || goodsProductEntityList.size() == 0) {
+            return "没有要发送的数据";
         }
         List<GoodsProductDto> goodsProductDtoList = new ArrayList<>();
         for (GoodsProductEntity goodsProductEntity : goodsProductEntityList) {
             GoodsProductDto dto = new GoodsProductDto();
-            BeanUtils.copyProperties(goodsProductEntity,dto);
+            BeanUtils.copyProperties(goodsProductEntity, dto);
             dto.setLegalUnit1Qty(goodsProductEntity.getLegalUnit1Qty().toString());
             dto.setLegalUnit2Qty(goodsProductEntity.getLegalUnit2Qty().toString());
             dto.setNetWeight(goodsProductEntity.getNetWeight().toString());
@@ -234,14 +322,14 @@ public class GoodsProductServiceImpl implements GoodsProductService {
             if (!"0".equals(result.getCode())) {
                 isPass = false;
             }
-            rollbackHandler(goodsProductDtoList, isPass);
+            callbackHandler(goodsProductDtoList, isPass);
             return result.getMsg();
-        }catch (Exception e){
+        } catch (Exception e) {
             isPass = false;
             e.printStackTrace();
             LOGGER.error(e.getMessage());
         }
-        rollbackHandler(goodsProductDtoList, isPass);
+        callbackHandler(goodsProductDtoList, isPass);
         return "请求失败,请联系管理员";
     }
 
@@ -261,6 +349,7 @@ public class GoodsProductServiceImpl implements GoodsProductService {
         param.put("isSend", Dict.goodsProductIsSend.item_1.getItem());
         param.put("sendTime", new Date());
         param.put("omsAuditStatus", Dict.omsAuditStatus.item_0.getItem());
+        param.put("updateStatusMode", 1);
         return goodsProductDao.updateStatusBySkuBatch(skuList, param);
     }
 
@@ -270,6 +359,7 @@ public class GoodsProductServiceImpl implements GoodsProductService {
         param.put("isSend", Dict.goodsProductIsSend.item_2.getItem());
         param.put("sendTime", new Date());
         param.put("omsAuditStatus", Dict.omsAuditStatus.item_0.getItem());
+        param.put("updateStatusMode", 1);
         return goodsProductDao.updateStatusBySkuBatch(skuList, param);
     }
 
@@ -280,26 +370,38 @@ public class GoodsProductServiceImpl implements GoodsProductService {
         param.put("omsAuditRemark", auditRemark);
         param.put("omsCallbackTime", new Date());
         param.put("omsAuditTime", auditTime);
+        param.put("updateStatusMode", 2);
         return goodsProductDao.updateStatusBySkuBatch(Arrays.asList(sku), param);
     }
 
+    @Override
+    public String pullFromOms() {
+        try {
 
-    private ResponseMessage requestOmsProduct(List<GoodsProductDto> goodsProductDtoList){
+        }catch (Exception e){
+            e.printStackTrace();
+            return "同步产品备案信息失败,请联系管理员";
+        }
+        return "同步成功";
+    }
+
+
+    private ResponseMessage requestOmsProduct(List<GoodsProductDto> goodsProductDtoList) {
         Map<String, String> sParaTemp = new TreeMap<String, String>();
         PdProductDtoInfo pdProductDtoInfo = new PdProductDtoInfo();
         pdProductDtoInfo.setPdProductDtoList(goodsProductDtoList);
         sParaTemp.put("data", JSON.toJSONString(pdProductDtoInfo));
         LOGGER.info("请求omsdata数据:" + sParaTemp.get("data"));
-        sParaTemp.put("merchId",omsMerchProperties.getMerchSn());
-        String timestamp = String.valueOf(System.currentTimeMillis()/1000);
+        sParaTemp.put("merchId", omsMerchProperties.getMerchSn());
+        String timestamp = String.valueOf(System.currentTimeMillis() / 1000);
         sParaTemp.put("timestamp", timestamp);
         //生成要请求给oms秘钥
 //        String sign = OmsSign.sign(sParaTemp,cus.getWaybill().get("secret-key"));
         LOGGER.info("md5混淆码参数:" + omsMerchProperties.getMd5Salt());
-        String sign = OmsSign.sign(sParaTemp,omsMerchProperties.getMd5Salt());
+        String sign = OmsSign.sign(sParaTemp, omsMerchProperties.getMd5Salt());
         sParaTemp.put("sign", sign);
         //构建Request
-        String  url = omsMerchProperties.getAddPdProductListUrl();
+        String url = omsMerchProperties.getAddPdProductListUrl();
         Request request = com.kmall.admin.utils.oms.OkHttpUtils.buildRequest(url, JSON.toJSONString(sParaTemp));
         LOGGER.info("oms的请求报文:" + request);
         // 同步访问,返回结果字符串
@@ -312,19 +414,19 @@ public class GoodsProductServiceImpl implements GoodsProductService {
             e.printStackTrace();
         }
 
-        LOGGER.info("oms的响应报文"+responseString);
+        LOGGER.info("oms的响应报文" + responseString);
         //解析响应数据
         Gson gson = new Gson();
         ResponseMessage result = gson.fromJson(responseString, ResponseMessage.class);
-        if(result == null){
+        if (result == null) {
             String info = "解析响应数据Result失败";
             LOGGER.error("--- {}", info);
             throw new RuntimeException(info);
         }
-       return result;
+        return result;
     }
 
-    private void rollbackHandler(List<GoodsProductDto> goodsProductDtoList, boolean pass){
+    private void callbackHandler(List<GoodsProductDto> goodsProductDtoList, boolean pass) {
         List<String> skuList = goodsProductDtoList.stream().map(GoodsProductDto::getSku).collect(Collectors.toList());
         if (pass) {
             this.updateSendOmsPassStatus(skuList);
@@ -334,5 +436,4 @@ public class GoodsProductServiceImpl implements GoodsProductService {
     }
 
 
-
 }

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

@@ -1,5 +1,6 @@
 package com.kmall.admin.service.impl;
 
+import cn.hutool.core.io.IoUtil;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.google.common.collect.ImmutableBiMap;
@@ -35,6 +36,7 @@ import com.kmall.admin.utils.ShiroUtils;
 import com.kmall.admin.utils.data.response.ResponseMessage;
 import com.kmall.admin.utils.data.response.ResponseMessageData;
 import com.kmall.admin.utils.oms.OmsSign;
+import com.kmall.admin.utils.pdf.BarcodeUtil;
 import com.kmall.admin.websocket.WebSocketServer;
 import com.kmall.api.entity.OrderGoodsVo;
 import com.kmall.api.entity.OrderVo;
@@ -58,6 +60,7 @@ import com.kmall.manager.manager.merch.OmsMerchProperties;
 import com.kmall.manager.manager.merch.OmsMerchPropertiesBuilder;
 import com.kmall.manager.manager.print.ticket.PrintTicketPropertiesBuilder;
 import com.kmall.manager.manager.print.ticket.TicketPrintUtil;
+import com.kmall.manager.manager.redis.JedisUtil;
 import com.kmall.manager.manager.wechat.WechatUtil;
 import com.kmall.manager.manager.wechat.wxglobal.dto.WechatGlobalRefundApiResult;
 import okhttp3.Request;
@@ -67,14 +70,21 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
 import java.io.IOException;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.net.InetAddress;
 import java.net.URLDecoder;
+import java.nio.charset.Charset;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.util.*;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
 
 
 @Service("orderService")
@@ -174,12 +184,14 @@ public class OrderServiceImpl implements OrderService {
     @Autowired
     private OrderExceptionRecordService orderExceptionRecordService;
 
+    @Autowired
+    private AddressInfoService addressInfoService;
+
 
     @Autowired
     private KtoEccsService ktoEccsService;
 
 
-
     @Override
     public OrderEntity queryObject(Long id) {
         return orderDao.queryObject(id);
@@ -415,9 +427,9 @@ public class OrderServiceImpl implements OrderService {
 
 
             GoodsEntity goodsEntity = goodsService.queryObject(orderGoods.getGoodsId());
-            BigDecimal goodsTax = CalculateTax.calculateFinalTax(goodsEntity,orderGoods.getRetailPrice(),goodsService).setScale(3,RoundingMode.HALF_UP);
-            goodsTax = goodsTax.multiply(new BigDecimal(orderGoods.getNumber())).setScale(2,RoundingMode.HALF_UP);
-            taxTotal = taxTotal.add(goodsTax).setScale(2,RoundingMode.HALF_UP);
+            BigDecimal goodsTax = CalculateTax.calculateFinalTax(goodsEntity, orderGoods.getRetailPrice(), goodsService).setScale(3, RoundingMode.HALF_UP);
+            goodsTax = goodsTax.multiply(new BigDecimal(orderGoods.getNumber())).setScale(2, RoundingMode.HALF_UP);
+            taxTotal = taxTotal.add(goodsTax).setScale(2, RoundingMode.HALF_UP);
 
             Goods goods = new Goods(orderGoods.getGoodsName(),
                     orderGoods.getRetailPrice().toString(), // 含税价
@@ -475,7 +487,44 @@ public class OrderServiceImpl implements OrderService {
 //                e.printStackTrace();
 //            }
         }
-        return TicketPrintUtil.print(head, goodsList, cashInfo, cusListing);
+        TicketMailInfo mailInfo = new TicketMailInfo();
+        String exprNo = orderProcessRecordEntity.getLogisticsNo();
+        if (StringUtils.isNullOrEmpty(exprNo)) {
+            throw new RRException("快递面单为空,请联系客服");
+        }
+        mailInfo.setExprNo(exprNo);
+        String logoUrl = "/statics/img/yto_logo.jpg";
+
+        Map<String, String> logoMap = new HashMap<>();
+        logoMap.put("yto", "/statics/img/yto_logo.jpg");
+        logoMap.put("best", "/statics/img/bestex_logo3.png");
+        if (StringUtils.isNotEmpty(orderEntity.getShippingCode()) && logoMap.containsKey(orderEntity.getShippingCode())) {
+            logoUrl = logoMap.get(orderEntity.getShippingCode());
+        }
+
+        mailInfo.setExprLogoUrl(logoUrl);
+        byte[] barCode128 = BarcodeUtil.generateBarCode128(exprNo, 6.0D, null, true, false);
+        String exprNoBase64Img = new String(Base64.getEncoder().encode(barCode128));
+        mailInfo.setShopTel("0752-2688660");
+
+        // 发货人
+        mailInfo.setSenderTel("0752-2688660");
+        mailInfo.setSenderName("CW澳洲大药房");
+        mailInfo.setSenderProvince("广东省");
+        mailInfo.setSenderCity("深圳市");
+        mailInfo.setSenderDistrict("南山区");
+        mailInfo.setSenderAddress("前海综合保税区W104");
+
+        // 收货人
+        mailInfo.setConsigneeMob(new StringBuilder(orderEntity.getMobile()).replace(3, 7, "****").toString());
+        mailInfo.setConsigneeName(new StringBuilder(orderEntity.getConsignee()).replace(1, 2, "*").toString());
+        mailInfo.setConsigneeProvince(orderEntity.getProvince());
+        mailInfo.setConsigneeCity(orderEntity.getCity());
+        mailInfo.setConsigneeDistrict(orderEntity.getDistrict());
+        mailInfo.setConsigneeAddress(orderEntity.getAddress());
+
+        mailInfo.setExprNoBase64Img(exprNoBase64Img);
+        return TicketPrintUtil.print(head, goodsList, cashInfo, cusListing, mailInfo);
     }
 
 
@@ -757,21 +806,21 @@ public class OrderServiceImpl implements OrderService {
             ktoEccsEntity.setRequestData(JSON.toJSONString(orderGoodsEntity));
             ktoEccsEntity.setRequestType("04");
             ktoEccsEntity.setSendStatus("00");
-            if(user != null){
-                ktoEccsEntity.setCreaterSn(user.getUserId()+"");
-            }else{
+            if (user != null) {
+                ktoEccsEntity.setCreaterSn(user.getUserId() + "");
+            } else {
                 ktoEccsEntity.setCreaterSn("9999");
             }
             ktoEccsEntity.setCreateTime(new Date());
             ktoEccsEntities.add(ktoEccsEntity);
         }
-        if(ktoEccsEntities.size() > 0){
-            if(ktoEccsEntities.size() > 50){
+        if (ktoEccsEntities.size() > 0) {
+            if (ktoEccsEntities.size() > 50) {
                 List<List<KtoEccsEntity>> partition = Lists.partition(ktoEccsEntities, 50);
                 for (List<KtoEccsEntity> ktoEccs : partition) {
                     ktoEccsService.saveBatch(ktoEccs);
                 }
-            }else{
+            } else {
                 ktoEccsService.saveBatch(ktoEccsEntities);
             }
         }
@@ -852,7 +901,7 @@ public class OrderServiceImpl implements OrderService {
         if (goodsEntity != null) {
             goodsEntity.setGoodsNumber(stockNum + orderGoodsEntity.getNumber());
 //                        goodsEntity.setSellVolume(Integer.parseInt(goodsSellVolume.toString()));
-            if("oms退单成功,恢复库存".equals(changeReason)){
+            if ("oms退单成功,恢复库存".equals(changeReason)) {
                 goodsEntity.setToBeRestored(goodsEntity.getToBeRestored() - orderGoodsEntity.getNumber());
             }
             goodsDao.update(goodsEntity);
@@ -860,7 +909,7 @@ public class OrderServiceImpl implements OrderService {
 //            storeRelaEntity.setSellVolume(Integer.parseInt(sellVolume.toString()));
 //            productStoreRelaDao.update(storeRelaEntity);
             String username = "system";
-            if(user != null){
+            if (user != null) {
                 username = user.getUsername();
             }
 
@@ -896,14 +945,14 @@ public class OrderServiceImpl implements OrderService {
                                       OrderGoodsEntity orderGoodsEntity, BigDecimal sellVolume, String changeReason, SysUserEntity user) {
         storeRelaEntity.setSellVolume(Integer.parseInt(sellVolume.toString())); // 减退库存
         storeRelaEntity.setStockNum(stockNum + orderGoodsEntity.getNumber());//库存数量
-        if("oms退单成功,恢复库存".equals(changeReason)){
+        if ("oms退单成功,恢复库存".equals(changeReason)) {
             storeRelaEntity.setToBeRestored(storeRelaEntity.getToBeRestored() - orderGoodsEntity.getNumber());
         }
         productStoreRelaDao.update(storeRelaEntity);
 
 
         String username = "system";
-        if(user != null){
+        if (user != null) {
             username = user.getUsername();
         }
         StoreMngChangeEntity storeMngChangeEntity = new StoreMngChangeEntity();
@@ -1798,7 +1847,7 @@ public class OrderServiceImpl implements OrderService {
         Map<String, String> mapAddr = new HashMap<>();
         if (status == 0) {
             //省
-            String cmbProvince = (String)param.get("cmbProvince");
+            String cmbProvince = (String) param.get("cmbProvince");
             //市
             String cmbCity = (String) param.get("cmbCity");
             //区
@@ -1806,10 +1855,10 @@ public class OrderServiceImpl implements OrderService {
             //详细地址
             String addrUser = (String) param.get("addrUser");
 
-            mapAddr.put("cmbProvince",cmbProvince);
-            mapAddr.put("cmbCity",cmbCity);
-            mapAddr.put("cmbArea",cmbArea);
-            mapAddr.put("addrUser",addrUser);
+            mapAddr.put("cmbProvince", cmbProvince);
+            mapAddr.put("cmbCity", cmbCity);
+            mapAddr.put("cmbArea", cmbArea);
+            mapAddr.put("addrUser", addrUser);
         }
 
         try {
@@ -2068,9 +2117,6 @@ public class OrderServiceImpl implements OrderService {
             }
 
 
-
-
-
             // TODO 查询使用的优惠券,并减扣金额
             String couponSn = (String) userInfo.get("couponSn");
             // 获取当前时间
@@ -2102,7 +2148,7 @@ public class OrderServiceImpl implements OrderService {
             // 生成订单
             String merchOrderSn = "EMATO" + CommonUtil.generateOrderNumber();
 
-            OrderVo order = setOrderVo(goodsEntities, userEntity, storeId.longValue(), user.getMerchSn(), disCountAmount, totalTax,status,mapAddr);
+            OrderVo order = setOrderVo(goodsEntities, userEntity, storeId.longValue(), user.getMerchSn(), disCountAmount, totalTax, status, mapAddr);
             order.setStore_id(storeId.longValue());
 //            if(storeTopic != null){
 //                order.setActivity_id(storeTopic.getId().longValue());
@@ -2153,29 +2199,32 @@ public class OrderServiceImpl implements OrderService {
             // 设置支付单开始时间
             processRecordEntity.setPaymentStartTime(new Date());
             // 判断是微信的支付码还是支付宝的支付码
-//            if (parCode.startsWith("28")) {
-//                // 支付宝支付
-//                try {
-//                    AliPay(user, parCode, order, processRecordEntity, orderWXPayRecordCurrent, store);
-//                } catch (Exception e) {
-//                    e.printStackTrace();
-//                    throw e;
-//                }
-//            } else {
-//                // 微信支付
-//                try {
-//                    wxPay(user, parCode, resultObj, order, processRecordEntity, orderWXPayRecordCurrent, store);
-//                } catch (Exception e) {
-//                    e.printStackTrace();
-//                    throw e;
-//                }
-//            }
+            if (parCode.startsWith("28")) {
+                // 支付宝支付
+                try {
+                    AliPay(user, parCode, order, processRecordEntity, orderWXPayRecordCurrent, store);
+                } catch (Exception e) {
+                    e.printStackTrace();
+                    throw e;
+                }
+            } else {
+                // 微信支付
+                try {
+                    wxPay(user, parCode, resultObj, order, processRecordEntity, orderWXPayRecordCurrent, store);
+                } catch (Exception e) {
+                    e.printStackTrace();
+                    throw e;
+                }
+            }
+
+//            // TODO 到时候要注释掉,测试用而已
+//            OrderEntity orderEntity = queryObject(order.getId());
+//            orderEntity.setOrderStatus(Integer.parseInt(Dict.orderStatus.item_201.getItem()));
+//            orderEntity.setPayStatus(Integer.parseInt(Dict.payStatus.item_2.getItem()));
+//            orderEntity.setPayTime(new Date());
+//            orderDao.update(orderEntity);
+
 
-            ////             TODO 到时候要注释掉,测试用而已
-            OrderEntity orderEntity = queryObject(order.getId());
-            orderEntity.setOrderStatus(Integer.parseInt(Dict.orderStatus.item_201.getItem()));
-            orderEntity.setPayStatus(Integer.parseInt(Dict.payStatus.item_2.getItem()));
-            orderDao.update(orderEntity);
             resultObj.put("shopName", store.getStoreName()); // 根据门店编号查询
             resultObj.put("userName", user.getUsername());
 
@@ -2246,7 +2295,7 @@ public class OrderServiceImpl implements OrderService {
             resultObj.put("time", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
             resultObj.put("orderNo", order.getOrder_sn()); //
 
-            resultObj.put("phone",(String) userInfo.get("customPhone"));
+            resultObj.put("phone", (String) userInfo.get("customPhone"));
             // 通知WebSocket
             WebSocketServer.sendMessage(sessionId, order.getOrder_sn(), order.getStore_id()
                     + "");
@@ -2665,21 +2714,44 @@ public class OrderServiceImpl implements OrderService {
         return orderDao.queryObjectByOrderSn(orderSn);
     }
 
+    ExecutorService service = Executors.newSingleThreadExecutor();
     // 收银端退款的代码
     @Override
     @Transactional
     public synchronized R orderRefund(OrderEntity order, String sessionId, SysUserEntity user) throws Exception {
+        OrderEntity orderInfo = order;
+        if (null == orderInfo) {
+            return R.error("订单不存在");
+        }
+
+        if (orderInfo.getOrderStatus() == Integer.parseInt(Dict.orderStatus.item_401.getItem()) ||
+                orderInfo.getOrderStatus() == Integer.parseInt(Dict.orderStatus.item_402.getItem())) {
+            return R.error("订单已退款");
+        }
+
         String payFlag = order.getPayFlag();
 
-        if (Dict.payFlag.item_weixin.getItem().equals(payFlag)) {
-            OrderEntity orderInfo = order;
-            if (null == orderInfo) {
-                return R.error("订单不存在");
-            }
-            if (orderInfo.getOrderStatus() == Integer.parseInt(Dict.orderStatus.item_401.getItem()) ||
-                    orderInfo.getOrderStatus() == Integer.parseInt(Dict.orderStatus.item_402.getItem())) {
-                return R.error("订单已退款");
+        String key  = "kmall_order_refund_" + order.getOrderSn();
+        if (JedisUtil.exists(key)) {
+            return R.error("订单退款操作过快,请等待!");
+        }
+
+        JedisUtil.set(key, System.currentTimeMillis() + "", 2);
+        if (orderInfo.getPayStatus() == Integer.parseInt(Dict.payStatus.item_3.getItem())) {
+            return R.error("订单正在退款中,请勿重复退款");
+        }
+        CountDownLatch cdl = new CountDownLatch(1);
+        service.submit(()-> {
+            try {
+                orderDao.updateOrderRefunding(order.getId());
+            } finally {
+                cdl.countDown();
             }
+        });
+        cdl.await();
+
+        if (Dict.payFlag.item_weixin.getItem().equals(payFlag)) {
+
             Double totalActualPrice = orderDao.getTotalActualPrice(orderInfo.getMerchOrderSn());
             if (totalActualPrice == null) {
                 totalActualPrice = 0d;
@@ -2720,11 +2792,11 @@ public class OrderServiceImpl implements OrderService {
                 pickUpCodeService.update(pickUpCodeEntity);
 
                 // 判断该订单是否进入oms系统
-                if(!arrivedOms(order.getOrderSn())){
+                if (!arrivedOms(order.getOrderSn())) {
                     // oms无该订单,则直接退款
                     restoreInventory(order, "收银端退款");
                     orderRefund.setRestore(1);
-                } else{
+                } else {
                     // 如果oms有订单,统一进入锁库存情况
                     orderRefund.setRestore(0);
                     toBeRestoreInventory(order);
@@ -2735,14 +2807,7 @@ public class OrderServiceImpl implements OrderService {
             // 支付宝的退款代码
         } else if (Dict.payFlag.item_alipay.getItem().equals(payFlag)) {
 
-            OrderEntity orderInfo = order;
-            if (null == orderInfo) {
-                return R.error("订单不存在");
-            }
-            if (orderInfo.getOrderStatus() == Integer.parseInt(Dict.orderStatus.item_401.getItem()) ||
-                    orderInfo.getOrderStatus() == Integer.parseInt(Dict.orderStatus.item_402.getItem())) {
-                return R.error("订单已退款");
-            }
+
 
             AliPayMicropayApiResult userRefund = AliPayUtil.aliTradeRefund(order.getOrderSn(), order.getActualPrice().toString(),
                     "用户退款", order.getStoreId() + "");
@@ -2778,11 +2843,11 @@ public class OrderServiceImpl implements OrderService {
             pickUpCodeEntity.setPickUpCodeStatus("3");
             pickUpCodeService.update(pickUpCodeEntity);
             // 判断该订单是否进入oms系统
-            if(!arrivedOms(order.getOrderSn())){
+            if (!arrivedOms(order.getOrderSn())) {
                 // oms无该订单,则直接退款
                 restoreInventory(order, "收银端退款");
                 orderRefund.setRestore(1);
-            } else{
+            } else {
                 // 如果oms有订单,统一进入锁库存情况
                 orderRefund.setRestore(0);
                 toBeRestoreInventory(order);
@@ -2806,19 +2871,19 @@ public class OrderServiceImpl implements OrderService {
             ProductStoreRelaEntity storeRelaEntity = productStoreRelaDao
                     .queryByGoodsIdAndStoreId(order.getStoreId().longValue(), orderGoodsEntity.getGoodsId().longValue());
             Integer toBeRestored = storeRelaEntity.getToBeRestored();
-            if(toBeRestored == null){
+            if (toBeRestored == null) {
                 toBeRestored = 0;
             }
             // 修改待退款的数量
-            storeRelaEntity.setToBeRestored(toBeRestored +restoreNumber);
+            storeRelaEntity.setToBeRestored(toBeRestored + restoreNumber);
 
             GoodsEntity goodsEntity = goodsDao.queryObject(orderGoodsEntity.getGoodsId());
 
             toBeRestored = goodsEntity.getToBeRestored();
-            if(toBeRestored == null){
+            if (toBeRestored == null) {
                 toBeRestored = 0;
             }
-            goodsEntity.setToBeRestored(toBeRestored+restoreNumber);
+            goodsEntity.setToBeRestored(toBeRestored + restoreNumber);
 
 
             productStoreRelaDao.update(storeRelaEntity);
@@ -2829,6 +2894,7 @@ public class OrderServiceImpl implements OrderService {
 
     /**
      * 查询oms系统是否有该订单
+     *
      * @param orderSn
      * @return
      */
@@ -2836,17 +2902,17 @@ public class OrderServiceImpl implements OrderService {
 
         Map<String, String> sParaTemp = new TreeMap<String, String>();
 //        sParaTemp.put("data","ZWCW2020122749351849");
-        sParaTemp.put("data",orderSn);
-        sParaTemp.put("merchId",omsMerchProperties.getMerchSn());
-        String timestamp = String.valueOf(System.currentTimeMillis()/1000);
+        sParaTemp.put("data", orderSn);
+        sParaTemp.put("merchId", omsMerchProperties.getMerchSn());
+        String timestamp = String.valueOf(System.currentTimeMillis() / 1000);
         sParaTemp.put("timestamp", timestamp);
         //生成要请求给oms秘钥
 //        String sign = OmsSign.sign(sParaTemp,cus.getWaybill().get("secret-key"));
         LOGGER.info("md5混淆码参数:" + omsMerchProperties.getMd5Salt());
-        String sign = OmsSign.sign(sParaTemp,omsMerchProperties.getMd5Salt());
+        String sign = OmsSign.sign(sParaTemp, omsMerchProperties.getMd5Salt());
         sParaTemp.put("sign", sign);
         //构建Request
-        String  url = omsMerchProperties.getQueryInveResponseUrl();
+        String url = omsMerchProperties.getQueryInveResponseUrl();
         Request request = com.kmall.admin.utils.oms.OkHttpUtils.buildRequest(url, JSON.toJSONString(sParaTemp));
         LOGGER.info("oms的请求报文:" + request);
         // 同步访问,返回结果字符串
@@ -2859,16 +2925,16 @@ public class OrderServiceImpl implements OrderService {
             e.printStackTrace();
         }
 
-        LOGGER.info("oms的响应报文"+responseString);
+        LOGGER.info("oms的响应报文" + responseString);
         //解析响应数据
         Gson gson = new Gson();
         ResponseMessage result = gson.fromJson(responseString, ResponseMessage.class);
-        if(result == null){
+        if (result == null) {
             String info = "解析响应数据Result失败";
             LOGGER.error("--- {}", info);
             throw new RuntimeException(info);
         }
-        if("oms无该订单".equals(result.getMsg())){
+        if ("oms无该订单".equals(result.getMsg())) {
             return false;
         }
 
@@ -2971,7 +3037,7 @@ public class OrderServiceImpl implements OrderService {
 //
 //        dBefore = calendar.getTime(); //得到前一天的时间
 
-        String defaultStartDate =  comparedDate + " 00:00:00";
+        String defaultStartDate = comparedDate + " 00:00:00";
 
 
         String defaultEndDate = comparedDate + " 23:59:59";
@@ -2992,11 +3058,11 @@ public class OrderServiceImpl implements OrderService {
     @Override
     public ExportExcelDto querySumAmount(String billDate, String storeId) {
         ExportExcelDto exportExcelDto = new ExportExcelDto();
-        ExportExcelDto totalAmount = orderDao.totalAmount(billDate,storeId);
-        ExportExcelDto refundCurrentAmount = orderDao.refundCurrentAmount(billDate,storeId);
-        ExportExcelDto refundPreviousAmount = orderDao.refundPreviousAmount(billDate,storeId);
-        ExportExcelDto currentTax = orderDao.currentTax(billDate,storeId);
-        ExportExcelDto refundPreviousTax = orderDao.refundPreviousTax(billDate,storeId);
+        ExportExcelDto totalAmount = orderDao.totalAmount(billDate, storeId);
+        ExportExcelDto refundCurrentAmount = orderDao.refundCurrentAmount(billDate, storeId);
+        ExportExcelDto refundPreviousAmount = orderDao.refundPreviousAmount(billDate, storeId);
+        ExportExcelDto currentTax = orderDao.currentTax(billDate, storeId);
+        ExportExcelDto refundPreviousTax = orderDao.refundPreviousTax(billDate, storeId);
 
         // 以下是直接从数据库中查出来的
         exportExcelDto.setTotalAmount(totalAmount.getTotalAmount()); // 总销售额
@@ -3010,71 +3076,71 @@ public class OrderServiceImpl implements OrderService {
 
         // 以下是通过计算的出来的
         // 销售净额
-        exportExcelDto.setNetAmount( new BigDecimal(exportExcelDto.getTotalAmount()).subtract(new BigDecimal(exportExcelDto.getRefundPreviousAmount())).setScale(2,RoundingMode.HALF_UP).toString() );
+        exportExcelDto.setNetAmount(new BigDecimal(exportExcelDto.getTotalAmount()).subtract(new BigDecimal(exportExcelDto.getRefundPreviousAmount())).setScale(2, RoundingMode.HALF_UP).toString());
         // 总税额
-        exportExcelDto.setTotalTax(new BigDecimal(exportExcelDto.getCurrentTax()).add(new BigDecimal(exportExcelDto.getPreviousTax())).setScale(2,RoundingMode.HALF_UP).toString());
+        exportExcelDto.setTotalTax(new BigDecimal(exportExcelDto.getCurrentTax()).add(new BigDecimal(exportExcelDto.getPreviousTax())).setScale(2, RoundingMode.HALF_UP).toString());
         // 税前总额
-        exportExcelDto.setPreTaxTotalAmount(new BigDecimal(exportExcelDto.getNetAmount()).subtract(new BigDecimal(exportExcelDto.getTotalTax())).setScale(2,RoundingMode.HALF_UP).toString());
+        exportExcelDto.setPreTaxTotalAmount(new BigDecimal(exportExcelDto.getNetAmount()).subtract(new BigDecimal(exportExcelDto.getTotalTax())).setScale(2, RoundingMode.HALF_UP).toString());
         // 成功单数
-        exportExcelDto.setSuccessNumber(new BigDecimal(exportExcelDto.getTotalCount()).subtract(new BigDecimal(exportExcelDto.getRefundPreviousCount())).setScale(2,RoundingMode.HALF_UP).toString());
+        exportExcelDto.setSuccessNumber(new BigDecimal(exportExcelDto.getTotalCount()).subtract(new BigDecimal(exportExcelDto.getRefundPreviousCount())).setScale(2, RoundingMode.HALF_UP).toString());
         // 退款总额
-        exportExcelDto.setRefundAmount(new BigDecimal(exportExcelDto.getRefundCurrentAmount()).add(new BigDecimal(exportExcelDto.getRefundPreviousAmount())).setScale(2,RoundingMode.HALF_UP).toString());
+        exportExcelDto.setRefundAmount(new BigDecimal(exportExcelDto.getRefundCurrentAmount()).add(new BigDecimal(exportExcelDto.getRefundPreviousAmount())).setScale(2, RoundingMode.HALF_UP).toString());
         // 退单单数
-        exportExcelDto.setRefundCount(new BigDecimal(exportExcelDto.getRefundCurrentCount()).add(new BigDecimal(exportExcelDto.getRefundPreviousCount())).setScale(2,RoundingMode.HALF_UP).toString());
+        exportExcelDto.setRefundCount(new BigDecimal(exportExcelDto.getRefundCurrentCount()).add(new BigDecimal(exportExcelDto.getRefundPreviousCount())).setScale(2, RoundingMode.HALF_UP).toString());
 
         return exportExcelDto;
     }
 
     @Override
-    public Map<String,List<OrderEntity>> querySaleOrderList(String billDate, String storeId) {
-        Map<String,List<OrderEntity>> result = new HashMap<>();
+    public Map<String, List<OrderEntity>> querySaleOrderList(String billDate, String storeId) {
+        Map<String, List<OrderEntity>> result = new HashMap<>();
         // 查询当天所有订单
-        List<OrderEntity> orderEntityList = orderDao.queryCurrentPreviousOrderList(billDate,storeId);
-        result.put("current",orderEntityList);
+        List<OrderEntity> orderEntityList = orderDao.queryCurrentPreviousOrderList(billDate, storeId);
+        result.put("current", orderEntityList);
         // 查询当天退前期订单
-        List<OrderEntity> refundPreviousOrderList = orderDao.queryRefundPreviousOrderList(billDate,storeId);
-        result.put("previous",refundPreviousOrderList);
+        List<OrderEntity> refundPreviousOrderList = orderDao.queryRefundPreviousOrderList(billDate, storeId);
+        result.put("previous", refundPreviousOrderList);
 
         return result;
     }
 
     @Override
     public Map<String, List<TaxDetailDto>> queryTaxDetailList(String billDate, String storeId) {
-        Map<String,List<TaxDetailDto>> result = new HashMap<>();
+        Map<String, List<TaxDetailDto>> result = new HashMap<>();
         // 查询当天所有订单税单
-        List<TaxDetailDto> taxDetailList = orderDao.queryCurrentTaxDetailList(billDate,storeId);
+        List<TaxDetailDto> taxDetailList = orderDao.queryCurrentTaxDetailList(billDate, storeId);
 
         // 计算税前价,增值税,消费税
         BigDecimal discountRate = new BigDecimal(0.7);
-        if(taxDetailList != null && taxDetailList.size() != 0){
+        if (taxDetailList != null && taxDetailList.size() != 0) {
             for (TaxDetailDto taxDetailDto : taxDetailList) {
                 // 获取实际支付价格
                 String postTaxPrice = taxDetailDto.getPostTaxPrice();
                 // 获取总税额
-                String  taxStr = taxDetailDto.getTax();
+                String taxStr = taxDetailDto.getTax();
                 // 税前金额
                 BigDecimal tax = new BigDecimal(taxStr);
                 BigDecimal pretaxPrice = new BigDecimal(postTaxPrice).subtract(tax).setScale(2, RoundingMode.HALF_UP);
                 // 计算综合税率
                 BigDecimal taxRate = tax.divide(pretaxPrice, 4, RoundingMode.HALF_UP);
                 // 消费税率
-                BigDecimal saleTaxRate = new BigDecimal(taxDetailDto.getSaleTaxRate()).divide(new BigDecimal(100),2,RoundingMode.HALF_UP);
+                BigDecimal saleTaxRate = new BigDecimal(taxDetailDto.getSaleTaxRate()).divide(new BigDecimal(100), 2, RoundingMode.HALF_UP);
                 // 综合税率
-                BigDecimal vatRate = new BigDecimal(taxDetailDto.getVatRate()).divide(new BigDecimal(100),2,RoundingMode.HALF_UP);
+                BigDecimal vatRate = new BigDecimal(taxDetailDto.getVatRate()).divide(new BigDecimal(100), 2, RoundingMode.HALF_UP);
 //              消费税 = (明细商品总价 / (1-消费税税率)) * 消费税税率
 //              增值税 = (明细商品总价 + 消费税) * 增值税税率
 //              订单该商品总税费 = (商品消费税 + 商品增值税)* 0.7
                 // 如果大于,要算消费税
                 BigDecimal saleTax = new BigDecimal(0);
                 BigDecimal vat = new BigDecimal(0);
-                if(taxRate.compareTo(new BigDecimal("0.23")) > 0){
+                if (taxRate.compareTo(new BigDecimal("0.23")) > 0) {
                     saleTax = pretaxPrice.divide(new BigDecimal(1).subtract(saleTaxRate), 2, RoundingMode.HALF_UP).multiply(saleTaxRate).
                             setScale(2, RoundingMode.HALF_UP);
                     vat = pretaxPrice.add(saleTax).multiply(vatRate).
                             multiply(discountRate).setScale(2, RoundingMode.HALF_UP);
-                    saleTax = saleTax.multiply(discountRate).setScale(2,RoundingMode.HALF_UP);
+                    saleTax = saleTax.multiply(discountRate).setScale(2, RoundingMode.HALF_UP);
 
-                }else{
+                } else {
                     // 不需要算消费税,增值税计算
                     vat = pretaxPrice.multiply(vatRate).multiply(discountRate).setScale(2, RoundingMode.HALF_UP);
                 }
@@ -3083,48 +3149,48 @@ public class OrderServiceImpl implements OrderService {
             }
         }
 
-        result.put("current",taxDetailList);
+        result.put("current", taxDetailList);
         // 查询当天退前期订单税单
-        List<TaxDetailDto> refundPrevioustaxDetailList = orderDao.queryRefundPreviousTaxDetailList(billDate,storeId);
+        List<TaxDetailDto> refundPrevioustaxDetailList = orderDao.queryRefundPreviousTaxDetailList(billDate, storeId);
 
         // 计算税前价,增值税,消费税
-        if(refundPrevioustaxDetailList != null && refundPrevioustaxDetailList.size() != 0){
+        if (refundPrevioustaxDetailList != null && refundPrevioustaxDetailList.size() != 0) {
             for (TaxDetailDto taxDetailDto : refundPrevioustaxDetailList) {
                 // 获取实际支付价格
                 String postTaxPrice = taxDetailDto.getPostTaxPrice();
                 // 获取总税额
-                String  taxStr = taxDetailDto.getPreTax();
+                String taxStr = taxDetailDto.getPreTax();
                 // 税前金额
                 BigDecimal tax = new BigDecimal(taxStr);
                 BigDecimal pretaxPrice = new BigDecimal(postTaxPrice).subtract(tax).setScale(2, RoundingMode.HALF_UP);
                 // 计算综合税率
                 BigDecimal taxRate = tax.divide(pretaxPrice, 4, RoundingMode.HALF_UP);
                 // 消费税率
-                BigDecimal saleTaxRate = new BigDecimal(taxDetailDto.getPreSaleTax()).divide(new BigDecimal(100),2,RoundingMode.HALF_UP);
+                BigDecimal saleTaxRate = new BigDecimal(taxDetailDto.getPreSaleTax()).divide(new BigDecimal(100), 2, RoundingMode.HALF_UP);
                 // 综合税率
-                BigDecimal vatRate = new BigDecimal(taxDetailDto.getPreVat()).divide(new BigDecimal(100),2,RoundingMode.HALF_UP);
+                BigDecimal vatRate = new BigDecimal(taxDetailDto.getPreVat()).divide(new BigDecimal(100), 2, RoundingMode.HALF_UP);
 //              消费税 = (明细商品总价 / (1-消费税税率)) * 消费税税率
 //              增值税 = (明细商品总价 + 消费税) * 增值税税率
 //              订单该商品总税费 = (商品消费税 + 商品增值税)* 0.7
                 // 如果大于,要算消费税
                 BigDecimal saleTax = new BigDecimal(0);
                 BigDecimal vat = new BigDecimal(0);
-                if(taxRate.compareTo(new BigDecimal("0.23")) > 0){
+                if (taxRate.compareTo(new BigDecimal("0.23")) > 0) {
                     saleTax = pretaxPrice.divide(new BigDecimal(1).subtract(saleTaxRate), 2, RoundingMode.HALF_UP).multiply(saleTaxRate).
                             multiply(discountRate).setScale(2, RoundingMode.HALF_UP);
                     vat = pretaxPrice.add(saleTax).multiply(vatRate).
                             multiply(discountRate).setScale(2, RoundingMode.HALF_UP);
 
-                }else{
+                } else {
                     // 不需要算消费税,增值税计算
                     vat = pretaxPrice.multiply(vatRate).multiply(discountRate).setScale(2, RoundingMode.HALF_UP);
                 }
-                taxDetailDto.setPreSaleTax(saleTax.compareTo(BigDecimal.ZERO)==0?saleTax.toString():"-"+saleTax.toString());
-                taxDetailDto.setPreVat(vat.compareTo(BigDecimal.ZERO)==0?vat.toString():"-"+vat.toString());
+                taxDetailDto.setPreSaleTax(saleTax.compareTo(BigDecimal.ZERO) == 0 ? saleTax.toString() : "-" + saleTax.toString());
+                taxDetailDto.setPreVat(vat.compareTo(BigDecimal.ZERO) == 0 ? vat.toString() : "-" + vat.toString());
             }
         }
 
-        result.put("previous",refundPrevioustaxDetailList);
+        result.put("previous", refundPrevioustaxDetailList);
 
         return result;
     }
@@ -3132,17 +3198,17 @@ public class OrderServiceImpl implements OrderService {
     @Override
     public List<String> queryInveResponse(String orderSn) throws IOException {
         Map<String, String> sParaTemp = new TreeMap<String, String>();
-        sParaTemp.put("data",orderSn);
-        sParaTemp.put("merchId",omsMerchProperties.getMerchSn());
-        String timestamp = String.valueOf(System.currentTimeMillis()/1000);
+        sParaTemp.put("data", orderSn);
+        sParaTemp.put("merchId", omsMerchProperties.getMerchSn());
+        String timestamp = String.valueOf(System.currentTimeMillis() / 1000);
         sParaTemp.put("timestamp", timestamp);
         //生成要请求给oms秘钥
 //        String sign = OmsSign.sign(sParaTemp,cus.getWaybill().get("secret-key"));
         LOGGER.info("md5混淆码参数:" + omsMerchProperties.getMd5Salt());
-        String sign = OmsSign.sign(sParaTemp,omsMerchProperties.getMd5Salt());
+        String sign = OmsSign.sign(sParaTemp, omsMerchProperties.getMd5Salt());
         sParaTemp.put("sign", sign);
         //构建Request
-        String  url = omsMerchProperties.getQueryInveResponseUrl();
+        String url = omsMerchProperties.getQueryInveResponseUrl();
         Request request = com.kmall.admin.utils.oms.OkHttpUtils.buildRequest(url, JSON.toJSONString(sParaTemp));
         LOGGER.info("oms的请求报文:" + request);
         // 同步访问,返回结果字符串
@@ -3156,11 +3222,11 @@ public class OrderServiceImpl implements OrderService {
             throw e;
         }
 
-        LOGGER.info("oms的响应报文"+responseString);
+        LOGGER.info("oms的响应报文" + responseString);
         //解析响应数据
         Gson gson = new Gson();
         ResponseMessage result = gson.fromJson(responseString, ResponseMessage.class);
-        if(result == null){
+        if (result == null) {
             String info = "解析响应数据Result失败";
             LOGGER.error("--- {}", info);
             throw new RuntimeException(info);
@@ -3169,9 +3235,9 @@ public class OrderServiceImpl implements OrderService {
         List rows = data.getRows();
         List<String> resultMessage = new LinkedList<>();
         for (Object row : rows) {
-            if(row instanceof ArrayList){
+            if (row instanceof ArrayList) {
                 for (Object o : ((ArrayList<?>) row)) {
-                    if(o instanceof LinkedTreeMap){
+                    if (o instanceof LinkedTreeMap) {
                         String cusReturnInfo = (String) ((LinkedTreeMap<?, ?>) o).get("cusReturnInfo");
                         resultMessage.add(cusReturnInfo);
                     }
@@ -3207,16 +3273,16 @@ public class OrderServiceImpl implements OrderService {
         // 查询该订单在库存是否已经释放过,避免重复恢复库存
         OrderEntity orderInfo = orderDao.queryObjectByOrderSn(orderSn);
         OrderRefundEntity orderRefundEntity = orderRefundService.queryObjectByOrderId(orderInfo.getId());
-        if(orderRefundEntity == null){
-            LOGGER.error("该订单无退款记录,订单号{}",orderSn);
-            throw new RuntimeException("该订单无退款记录,订单号:"+orderSn);
+        if (orderRefundEntity == null) {
+            LOGGER.error("该订单无退款记录,订单号{}", orderSn);
+            throw new RuntimeException("该订单无退款记录,订单号:" + orderSn);
         }
         Integer restore = orderRefundEntity.getRestore();
-        if(restore == 1){
-            LOGGER.error("该订单库存记录已恢复过,订单号{}",orderSn);
-            throw new RuntimeException("该订单库存记录已恢复过,订单号:"+orderSn);
+        if (restore == 1) {
+            LOGGER.error("该订单库存记录已恢复过,订单号{}", orderSn);
+            throw new RuntimeException("该订单库存记录已恢复过,订单号:" + orderSn);
         }
-        restoreInventory(orderInfo,"oms退单成功,恢复库存");
+        restoreInventory(orderInfo, "oms退单成功,恢复库存");
         orderRefundEntity.setRestore(1);
         orderRefundService.update(orderRefundEntity);
 
@@ -3314,12 +3380,13 @@ public class OrderServiceImpl implements OrderService {
 
         return orderInfo;
     }
+
     /**
      * 设置订单数据
      *
      * @return
      */
-    public OrderVo setOrderVo(List<GoodsEntity> goodsList, UserEntity loginUser, Long storeId, String merchSn, BigDecimal disCountAmount, BigDecimal totalTax,int status,Map mapAddr) {
+    public OrderVo setOrderVo(List<GoodsEntity> goodsList, UserEntity loginUser, Long storeId, String merchSn, BigDecimal disCountAmount, BigDecimal totalTax, int status, Map mapAddr) {
         OrderVo orderInfo = new OrderVo();
 
         BigDecimal goodsTotalPrice = new BigDecimal(0.00);
@@ -3359,9 +3426,9 @@ public class OrderServiceImpl implements OrderService {
         orderInfo.setMobile(loginUser.getMobile());
         orderInfo.setCountry("");
         //根据 前端的选择方式 1 是柜取 0 是 邮寄
-        if (status==0) {
+        if (status == 0) {
             //省
-            String cmbProvince = (String)mapAddr.get("cmbProvince");
+            String cmbProvince = (String) mapAddr.get("cmbProvince");
             //市
             String cmbCity = (String) mapAddr.get("cmbCity");
             //区
@@ -3372,7 +3439,7 @@ public class OrderServiceImpl implements OrderService {
             orderInfo.setCity(cmbCity);
             orderInfo.setDistrict(cmbArea);
             orderInfo.setAddress(addrUser);
-        }else {
+        } else {
             orderInfo.setProvince(storeEntity.getProvinceName());
             orderInfo.setCity(storeEntity.getCityName());
             orderInfo.setDistrict(storeEntity.getCountyName());
@@ -3419,6 +3486,20 @@ public class OrderServiceImpl implements OrderService {
         orderInfo.setIsOnfflineOrder(Dict.isOnfflineOrder.item_1.getItem());
         orderInfo.setOrderBizType(Dict.orderBizType.item_10.getItem());
 
+        // 添加快递信息
+
+        try {
+            StoreExprActiveDto activeExpr = addressInfoService.queryByStoreId(storeId);
+            if (activeExpr == null) {
+                throw new RRException("门店未配置快递信息");
+            }
+
+            orderInfo.setShipping_id(activeExpr.getExprId());
+            orderInfo.setShipping_code(activeExpr.getExprCode());
+            orderInfo.setShipping_name(activeExpr.getExprName());
+        } catch (Exception e) {
+            LOGGER.error("订单写入门店快递配置信息有误:", e);
+        }
         return orderInfo;
     }
 
@@ -3448,8 +3529,6 @@ public class OrderServiceImpl implements OrderService {
         orderGoodsVo.setSku(goodsDto.getSku());
 
 
-
-
         BigDecimal number = new BigDecimal(Long.valueOf(goodsDto.getGoodsNumber()));
         BigDecimal goodsTotal = goodsDto.getRetailPrice().multiply(number);//单商品总价
         BigDecimal rate = goodsTotal.divide(orderInfo.getGoods_price(), 2, BigDecimal.ROUND_HALF_UP);//当前商品总价/订单总价(不含运费、不含优惠券)
@@ -3483,8 +3562,8 @@ public class OrderServiceImpl implements OrderService {
 
         // 计算税费
         GoodsEntity goodsEntity = goodsService.queryObject(goodsDto.getId().intValue());
-        BigDecimal goodsTax = CalculateTax.calculateFinalTax(goodsEntity,goodsDto.getStoreRetailPrice(),goodsService).setScale(3,RoundingMode.HALF_UP);
-        goodsTax = goodsTax.multiply(number).setScale(2,RoundingMode.HALF_UP);
+        BigDecimal goodsTax = CalculateTax.calculateFinalTax(goodsEntity, goodsDto.getStoreRetailPrice(), goodsService).setScale(3, RoundingMode.HALF_UP);
+        goodsTax = goodsTax.multiply(number).setScale(2, RoundingMode.HALF_UP);
         orderGoodsVo.setTaxPrice(goodsTax);
 
         return orderGoodsVo;

+ 5 - 0
kmall-admin/src/main/java/com/kmall/admin/service/impl/oms2kmall/Oms2KmallServiceImpl.java

@@ -1,6 +1,7 @@
 package com.kmall.admin.service.impl.oms2kmall;
 
 import com.kmall.admin.controller.oms2kmall.Oms2KmallController;
+import com.kmall.admin.entity.GoodsProductEntity;
 import com.kmall.admin.entity.StoreTransferInventoryOrderDetailEntity;
 import com.kmall.admin.entity.StoreTransferInventoryOrderEntity;
 import com.kmall.admin.service.GoodsProductService;
@@ -104,6 +105,10 @@ public class Oms2KmallServiceImpl implements Oms2KmallService {
         } else if ("2".equals(resp.getIsAudit())) {
             resp.setIsAudit(Dict.omsAuditStatus.item_3.getItem());
         }
+        GoodsProductEntity entity = goodsProductService.queryBySku(resp.getSku());
+        if (entity == null) {
+            return R.error("sku:" + resp.getSku() + "不存在");
+        }
         int count = goodsProductService.updateAuditInfo(resp.getSku(), resp.getIsAudit(), resp.getAuditTime(), resp.getAuditRemark());
         if (count > 0) {
             return R.ok();

+ 63 - 13
kmall-admin/src/main/resources/mybatis/mapper/GoodsProductDao.xml

@@ -59,6 +59,7 @@
 		<result property="omsCallbackTime" column="oms_callback_time"/>
 		<result property="batchNo" column="batch_no"/>
 		<result property="omsAuditTime" column="oms_audit_time"/>
+		<result property="status" column="status"/>
     </resultMap>
 
 	<select id="queryObject" resultType="com.kmall.admin.entity.GoodsProductEntity">
@@ -117,7 +118,8 @@
 			`oms_audit_remark`,
 			`oms_callback_time`,
 			`batch_no`,
-            `oms_audit_time`
+            `oms_audit_time`,
+            `status`
      from mall_goods_product
      where mall_goods_product_sn = #{id}
 	</select>
@@ -178,7 +180,8 @@
 			`oms_audit_remark`,
 			`oms_callback_time`,
 			`batch_no`,
-			`oms_audit_time`
+			`oms_audit_time`,
+			`status`
 		from mall_goods_product
 		WHERE 1=1
 		<if test="name != null and name.trim() != ''">
@@ -187,6 +190,9 @@
 		<if test="isSend != null and isSend.trim() != ''">
 			AND `is_send` in (${isSend})
 		</if>
+		<if test="status != null and status.trim() != ''">
+			AND `status` in (${status})
+		</if>
         <choose>
             <when test="sidx != null and sidx.trim() != ''">
                 order by ${sidx} ${order}
@@ -199,7 +205,7 @@
 			limit #{offset}, #{limit}
 		</if>
 	</select>
-	
+
  	<select id="queryTotal" resultType="int">
 		select count(*) from mall_goods_product
 		WHERE 1=1
@@ -263,7 +269,8 @@
 		`oms_audit_remark`,
 		`oms_callback_time`,
 		`batch_no`,
-		`oms_audit_time`
+		`oms_audit_time`,
+		`status`
 		from mall_goods_product
 		WHERE 1=1
 		<if test="sku != null and sku.trim() != ''">
@@ -332,7 +339,8 @@
 		`oms_audit_remark`,
 		`oms_callback_time`,
 		`batch_no`,
-		`oms_audit_time`
+		`oms_audit_time`,
+		`status`
 		from mall_goods_product
 		WHERE 1=1
 		<if test="mallGoodsProductSns != null">
@@ -399,7 +407,8 @@
 			`oms_audit_remark`,
 			`oms_callback_time`,
 			`batch_no`,
-			`oms_audit_time`
+			`oms_audit_time`,
+			`status`
 		from mall_goods_product
 		where sku = #{sku}
 	</select>
@@ -459,7 +468,8 @@
 			`oms_audit_remark`,
 			`oms_callback_time`,
 			`batch_no`,
-			`oms_audit_time`
+			`oms_audit_time`,
+			`status`
 		from mall_goods_product
 		where prod_barcode = #{barCode}
 	</select>
@@ -515,7 +525,8 @@
 			`right_img`,
 			`before_img`,
 			`after_img`,
-			`batch_no`)
+			`batch_no`,
+		    `status`)
 		values(
 			#{mallGoodsProductSn},
 			#{merchSn},
@@ -566,11 +577,12 @@
 			#{rightImg},
 			#{beforeImg},
 			#{afterImg},
-		    #{batchNo})
+		    #{batchNo},
+			#{status})
 	</insert>
 
 	<update id="update" parameterType="com.kmall.admin.entity.GoodsProductEntity">
-		update mall_goods_product 
+		update mall_goods_product
 		<set>
 			<if test="merchSn != null">`merch_sn` = #{merchSn}, </if>
 			<if test="thirdMerchSn != null">`third_merch_sn` = #{thirdMerchSn}, </if>
@@ -625,6 +637,7 @@
 			<if test="omsAuditRemark != null">`oms_audit_remark` = #{omsAuditRemark}, </if>
 			<if test="omsAuditTime != null">`oms_audit_time` = #{omsAuditTime}, </if>
 			<if test="omsCallbackTime != null">`oms_callback_time` = #{omsCallbackTime}, </if>
+			<if test="status != null">`status` = #{status}, </if>
 		</set>
 		where mall_goods_product_sn = #{mallGoodsProductSn}
 	</update>
@@ -649,6 +662,43 @@
 			<if test="map.omsAuditRemark != null">`oms_audit_remark` = #{map.omsAuditRemark}, </if>
 			<if test="map.omsAuditTime != null">`oms_audit_time` = #{map.omsAuditTime}, </if>
 			<if test="map.omsCallbackTime != null">`oms_callback_time` = #{map.omsCallbackTime}, </if>
+			<if test="map.status != null">`status` = #{map.status}, </if>
+			<if test="map.updateStatusMode != null and map.updateStatusMode == 1 ">
+				`status` =
+				<if test="map.isSend == 1">
+					case status
+		            when '00' then '02'
+		            when '01' then '02'
+		            when '10' then '12'
+		            when '11' then '12'
+		            else '99' end
+				</if>
+				<if test="map.isSend == 2">
+					case status
+                    when '00' then '01'
+                    when '01' then '01'
+                    when '10' then '11'
+                    when '11' then '11'
+                    else '99' end
+				</if>
+				,
+			</if>
+            <if test="map.updateStatusMode != null and map.updateStatusMode == 2 ">
+                `status` =
+                <if test="map.omsAuditStatus == 2">
+                    case status
+                    when '02' then '21'
+                    when '12' then '21'
+                    else '88' end
+                </if>
+                <if test="map.omsAuditStatus == 3">
+                    case status
+                    when '02' then '03'
+                    when '12' then '23'
+                    else '88' end
+                </if>
+                ,
+            </if>
 		</set>
 		where sku in
 		<foreach collection="list" item="sku" open="(" separator="," close=")">
@@ -656,13 +706,13 @@
 		</foreach>
 
 	</update>
-	
+
 	<delete id="delete">
 		delete from mall_goods_product where mall_goods_product_sn = #{value}
 	</delete>
-	
+
 	<delete id="deleteBatch">
-		delete from mall_goods_product where mall_goods_product_sn in 
+		delete from mall_goods_product where mall_goods_product_sn in
 		<foreach item="mallGoodsProductSn" collection="array" open="(" separator="," close=")">
 			#{mallGoodsProductSn}
 		</foreach>

+ 4 - 0
kmall-admin/src/main/resources/mybatis/mapper/OrderDao.xml

@@ -2409,4 +2409,8 @@
             create_time DESC
     </select>
 
+    <update id="updateOrderRefunding">
+        update mall_order set pay_status = 3 where id = #{id}
+    </update>
+
 </mapper>

+ 17 - 0
kmall-admin/src/main/resources/mybatis/mapper/shop/AddressInfoDao.xml

@@ -41,6 +41,14 @@
 			ms.`store_name`,
 			ecs.`express_name`
 	</sql>
+	<sql id="storeActiveExpr">
+		a.store_id as storeId,
+        a.id as exprId,
+        a.exprtype_id as exprTypeId,
+        b.express_id as exprCode,
+        b.express_name as exprName
+	</sql>
+
 
 	<select id="queryObject" resultType="com.kmall.admin.entity.AddressInfoEntity">
 		select
@@ -69,6 +77,15 @@
 	    and is_valid = 1
 	</select>
 
+	<select id="queryByStoreId" resultType="com.kmall.admin.entity.StoreExprActiveDto">
+		select
+		<include refid="storeActiveExpr" />
+		from mall2_express_address_info a
+		LEFT JOIN mall2_express_company b on a.courie_id = b.id
+		where a.store_id = #{storeId}
+		and a.is_valid = 1
+	</select>
+
 	<select id="queryStatus" resultType="com.kmall.admin.entity.AddressInfoEntity">
 		select
 		<include refid="addrInfo"></include>

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

@@ -391,6 +391,33 @@
         </div>
     </div>
 </div>
+<div style="display: none">
+    <img src="/statics/img/yto_logo.jpg">
+    <img src="/statics/img/bestex_logo.jpeg">
+    <img src="/statics/img/bestex_logo2.jpeg">
+    <img src="/statics/img/bestex_logo2.png">
+    <img src="/statics/img/bestex_logo3.png">
+</div>
+<script type="application/javascript">
+    let mailTypes = ["best", "yto"];
+    var strategies = {
+        "best": function(data){
+            return render_of_best(data);
+        },
+        "yto": function(data){
+            return render_of_yto(data);
+        }
+    };
+    for (let i = 0; i < mailTypes.length; i++) {
+        strategies[mailTypes[i]] = "";
+    }
+
+
+
+    var renderMailInfo = function(exprCode, data){
+        return strategies[exprCode](data);
+    };
+</script>
 <script src="${rc.contextPath}/statics/dist/js7_jsAddress.js"></script>
 <script src="${rc.contextPath}/js/sale/sale.js?_${date.systemTime}"></script>
 <script src="https://cdn.staticfile.org/jquery/2.1.1/jquery.min.js"></script>

+ 10 - 0
kmall-admin/src/main/webapp/WEB-INF/page/shop/goodsproduct.html

@@ -21,9 +21,18 @@
                 <i-col span="4">
                     <i-input v-model="q.name" @on-enter="query" placeholder="中文名称"/>
                 </i-col>
+                <i-col span="3">
+                    <i-select v-model="q.status" placeholder="状态" filterable label-in-value>
+                        <i-option v-for="status in statusList" :value="status.id"
+                                  :key="status.id">{{status.name}}
+                        </i-option>
+                    </i-select>
+                </i-col>
                 <i-button @click="query">查询</i-button>
                 <i-button @click="reloadSearch">重置</i-button>
             </div>
+        </Row>
+            <Row :gutter="16">
             <div class="buttons-group">
                 <i-button type="info" @click="sendSelectProductByAdd"><i class="fa fa-plus"></i>&nbsp;选中发送(新增)</i-button>
                 <i-button type="info" @click="sendAllProductByAdd"><i class="fa fa-plus"></i>&nbsp;全部发送(新增)</i-button>
@@ -39,6 +48,7 @@
                 #if($shiro.hasPermission("goodsproduct:delete"))
                 <i-button type="error" @click="del"><i class="fa fa-trash-o"></i>&nbsp;删除</i-button>
                 #end
+                <i-button type="info" @click="pull"><i class="fa fa-plus"></i>&nbsp;拉取</i-button>
 
                 <i-col style="display: inline-grid;">
                     <Upload :show-upload-list="false" :on-success="uploadExcelSuccess" :on-error="uploadExcelError" :on-format-error="uploadExcelFormatError"

+ 113 - 21
kmall-admin/src/main/webapp/js/sale/sale.js

@@ -1278,9 +1278,9 @@ function openWebSocket() {
         //kmall测试环境
         // webSocket = new WebSocket("ws://183.62.225.124:8080/ws/server/"+storeId);
         //kmall正式环境
-        // webSocket = new WebSocket("ws://8.135.102.238:8080//ws/server/"+storeId);
+        webSocket = new WebSocket("ws://8.135.102.238:8080//ws/server/"+storeId);
         //kmall本地环境
-        webSocket = new WebSocket("ws://127.0.0.1:8080//ws/server/"+163);
+        // webSocket = new WebSocket("ws://127.0.0.1:9090//ws/server/"+163);
         // webSocket = new WebSocket("wss://cb.k1net.cn/ws/server/"+storeId);
         if (webSocket.readyState === webSocket.CONNECTING) {
             console.log('1.连接正在打开......');
@@ -1451,28 +1451,29 @@ function getPrintContentOrder(ticket) {
     content += "</div>";
     content += "<div style=\"width: 100%;overflow:hidden;white-space: nowrap;\">--------------------------------------------------</div>";
     //海关清单信息
-    content += "<div style=\"width: 100%;\">";
-    content += "订单号:" + ticket.cusListing.orderId;
-    content += "</div>";
-    content += "<div style=\"width: 100%;\">";
-    content += "运单编号:" + ticket.cusListing.waybillId;
-    content += "</div>";
+    // content += "<div style=\"width: 100%;\">";
+    // content += "订单号:" + ticket.cusListing.orderId;
+    // content += "</div>";
+    // content += "<div style=\"width: 100%;\">";
+    // content += "运单编号:" + ticket.cusListing.waybillId;
+    // content += "</div>";
     content += "<div style=\"width: 100%;\">";
     content += "海关清单号:" + ticket.cusListing.invtNo;
     content += "</div>";
-    content += "<div style=\"width: 100%;\">";
-    content += "收货人:" + ticket.cusListing.consignee;
-    content += "</div>";
-    content += "<div style=\"width: 100%;\">";
-    content += "收货人电话:" + ticket.cusListing.consigneeTel;
-    content += "</div>";
-    content += "<div style=\"width: 100%;\">";
-    content += "始发地: 仓库地址 : 广东省深圳市南山区前海保税港区W104"  ;
-    content += "</div>";
-    content += "<div style=\"width: 100%;\">";
-    content += "交货地:" + ticket.cusListing.deliveryAddress;
-    content += "</div>";
+    // content += "<div style=\"width: 100%;\">";
+    // content += "收货人:" + ticket.cusListing.consignee;
+    // content += "</div>";
+    // content += "<div style=\"width: 100%;\">";
+    // content += "收货人电话:" + ticket.cusListing.consigneeTel;
+    // content += "</div>";
+    // content += "<div style=\"width: 100%;\">";
+    // content += "始发地: 仓库地址 : 广东省深圳市南山区前海保税港区W104"  ;
+    // content += "</div>";
+    // content += "<div style=\"width: 100%;\">";
+    // content += "交货地:" + ticket.cusListing.deliveryAddress;
+    // content += "</div>";
     content += "<div style=\"width: 100%;overflow:hidden;white-space: nowrap;\">--------------------------------------------------</div>";
+
     content += "<div style=\"width: 100%;text-align: center;\">";
     content += "购买跨境商品须知:"
     content += "</div>";
@@ -1517,6 +1518,94 @@ function getPrintContentOrder(ticket) {
     content += "<div style=\"width: 100%;text-align: center;\">";
     content += "关注CW大药房客服号,获取更多优惠信息"
     content += "</div>";
+    content += "<div style=\"width: 100%;overflow:hidden;white-space: nowrap;\">--------------------------------------------------</div>";
+    content += "<div style=\"width: 100%;height: 50px;\"></div>";
+
+    // var strategies = {
+    //     "best": function(data){
+    //         return render_of_best(data);
+    //     },
+    //     "yto": function(data){
+    //         return render_of_yto(data);
+    //     }
+    // };
+    //
+    // var renderMailInfo = function(exprCode, data){
+    //     return strategies[exprCode](data);
+    // };
+    //
+    // renderMailInfo('best', ticket);
+
+    // 面单打印
+    content += `
+    <div style="width: 100%; height: 82px; border: 1px solid black;">
+        <div style="width: 100%;height: 78px; overflow: hidden">
+            <img src='${ticket.ticketMailInfo.exprLogoUrl}' style='max-width:180px;' />
+        </div>
+    </div>
+
+    <!-- 面单条码 -->
+    <div style="width: 100%;height: 98px; border-width: 0 1px 1px 1px; border-style: solid; border-color: black;">
+        <div style="width: 200px; height: 88px;">
+            <img src='data:image/png;base64,${ticket.ticketMailInfo.exprNoBase64Img}' style='max-width:199px;' />
+        </div>
+    
+    </div>
+    <div style="width: 100%; border-width: 0 1px 1px 1px; border-style: solid; border-color: black;">
+        <div style="padding: 5px 10px 5px 10px">
+            <div style="width: 65px; display: inline; font-weight: bolder;">
+                收件人
+            </div>
+            <div style="width: 100px; display: inline;">
+                <span style="font-weight: bold">${ticket.cusListing.consignee}</span> <span style="font-weight: bold">${ticket.cusListing.consigneeTel}</span>
+            </div>
+            <div style="width: 100%">
+                ${ticket.ticketMailInfo.consigneeProvince} ${ticket.ticketMailInfo.consigneeCity} ${ticket.ticketMailInfo.consigneeDistrict} ${ticket.ticketMailInfo.consigneeAddress}
+            </div>
+        </div>
+    </div>
+    <div style="width: 100%; border-width: 0 1px 1px 1px; border-style: solid; border-color: black;">
+        <div style="padding: 5px 10px 5px 10px">
+            <div style="width: 65px; display: inline; font-weight: bolder">
+                发件人
+            </div>
+            <div style="width: 100px; display: inline;">
+                <span style="font-weight: bold">${ticket.ticketMailInfo.shopTel}</span> <span style="font-weight: bold">CW澳洲大药房</span>
+            </div>
+            <div style="width: 100%">
+                仓库地址:${ticket.ticketMailInfo.senderProvince} ${ticket.ticketMailInfo.senderCity} ${ticket.ticketMailInfo.senderDistrict} ${ticket.ticketMailInfo.senderAddress}
+            </div>
+        </div>
+    </div>
+    `;
+    let box = "<div style='width: 100%; position: relative;'>";
+    for (let i = 0;i < ticket.goods.length; i++){
+        let topBorder = 0, bottomBorder = 0;
+        // if (i === 0) {
+        //     topBorder = "1px";
+        // }
+        if (i === ticket.goods.length - 1) {
+            bottomBorder = "1px";
+        }
+        let paddingBottom = "5px";
+        if (i === ticket.goods.length - 1) {
+            paddingBottom = "35px";
+        }
+        box += `
+        <div
+            style="width: 100%; border-width: ${topBorder} 1px ${bottomBorder} 1px; border-style: solid; border-color: black; font-weight: bold;">
+            <div style="text-align: left;width: 70%; line-height: 1.5; padding: 5px 10px ${paddingBottom} 10px ">
+                ${ticket.goods[i].gname} *${ticket.goods[i].num}
+            </div>
+        </div>`;
+
+
+    }
+
+    let markBox = `<div style="position: absolute; bottom: 5px; right: 5px; font-weight: bold; font-size: 10pt; color: #9b9b9b">已验视</div>`;
+    box += markBox;
+    box += "</div>";
+    content += box;
     return content;
 }
 
@@ -1756,7 +1845,10 @@ function toRefund(){
                 if (r.code == 0) {
                     vm.canRefund = true;
                     alert("退款成功")
-                }else{
+                } else if (r.code == 500) {
+                    vm.canRefund = true;
+                    alert(r.msg)
+                } else {
                     alert("退款失败,请联系管理员");
                 }
             }

+ 61 - 5
kmall-admin/src/main/webapp/js/shop/goodsproduct.js

@@ -62,6 +62,32 @@ $(function () {
             {label: '园区商品序号', name: 'itemRecordNo', index: 'item_record_no', width: 140},
             {label: '账册分类代码', name: 'emsClassCode', index: 'ems_class_code', width: 140},
             {
+                label: '状态', name: 'status', index: 'status', width: 140, formatter: function (value) {
+                    if ( value == "00") {
+                        return "新增备案-待发送";
+                    } else if ( value == "01") {
+                        return "新增备案-发送失败";
+                    } else if ( value == "02") {
+                        return "新增备案-待审核";
+                    } else if ( value == "03") {
+                        return "新增备案-审核失败";
+                    } else if ( value == "10") {
+                        return "重新备案-待发送";
+                    } else if ( value == "11") {
+                        return "重新备案-发送失败";
+                    } else if ( value == "12") {
+                        return "重新备案-待审核";
+                    } else if ( value == "13") {
+                        return "重新备案-审核失败";
+                    } else if ( value == "21") {
+                        return "备案成功-待更新";
+                    } else if ( value == "22") {
+                        return "备案成功-更新完成";
+                    }
+                    return '';
+                }
+            },
+            {
                 label: '是否发送', name: 'isSend', index: 'is_send', width: 140, formatter: function (value) {
                     if (value == '0') {
                         return '未发送';
@@ -243,8 +269,21 @@ let vm = new Vue({
             ]
         },
         q: {
-            name: ''
-        }
+            name: '',
+            status: ''
+        },
+        statusList: [
+            {id: "00", name: "新增备案-待发送"},
+            {id: "01", name: "新增备案-发送失败"},
+            {id: "02", name: "新增备案-待审核"},
+            {id: "03", name: "新增备案-审核失败"},
+            {id: "10", name: "重新备案-待发送"},
+            {id: "11", name: "重新备案-发送失败"},
+            {id: "12", name: "重新备案-待审核"},
+            {id: "13", name: "重新备案-审核失败"},
+            {id: "21", name: "备案成功-待更新"},
+            {id: "22", name: "备案成功-更新完成"}
+        ]
     },
     methods: {
         query: function () {
@@ -265,6 +304,23 @@ let vm = new Vue({
 
             vm.getInfo(mallGoodsProductSn)
         },
+        pull: function (event) {
+            $.ajax({
+                type: "POST",
+                url: '../goodsproduct/pullFromOms',
+                contentType: "application/json",
+                data: "{}",
+                success: function (r) {
+                    if (r.code === 0) {
+                        alert('操作成功', function (index) {
+                            vm.reload();
+                        });
+                    } else {
+                        alert(r.msg);
+                    }
+                }
+            });
+        },
         saveOrUpdate: function (event) {
             let url = vm.goodsProduct.mallGoodsProductSn == null ? "../goodsproduct/save" : "../goodsproduct/update";
             $.ajax({
@@ -322,7 +378,7 @@ let vm = new Vue({
             vm.showList = true;
             let page = $("#jqGrid").jqGrid('getGridParam', 'page');
             $("#jqGrid").jqGrid('setGridParam', {
-                postData: {'name': vm.q.name},
+                postData: {'name': vm.q.name, 'status': vm.q.status},
                 page: page
             }).trigger("reloadGrid");
             vm.handleReset('formValidate');
@@ -519,7 +575,7 @@ let vm = new Vue({
         },
         sendAllProductByAdd: function (event) {
 
-            confirm('确定要发送所有的产品备案信息?', function () {
+            confirm('全部发送(新增)将会发送所有待发送以及发送失败的新增备案数据,是否继续?', function () {
                 $.ajax({
                     type: "POST",
                     url: "../goodsproduct/sendAllProductByAdd",
@@ -563,7 +619,7 @@ let vm = new Vue({
         },
         sendAllProductByUpdate: function (event) {
 
-            confirm('确定要发送所有的产品备案信息?', function () {
+            confirm('全部发送(修改)将会发送所有待发送以及发送失败的重新备案数据,是否继续?', function () {
                 $.ajax({
                     type: "POST",
                     url: "../goodsproduct/sendAllProductByUpdate",

BIN
kmall-admin/src/main/webapp/statics/img/bestex_logo.jpeg


BIN
kmall-admin/src/main/webapp/statics/img/bestex_logo2.jpeg


BIN
kmall-admin/src/main/webapp/statics/img/bestex_logo2.png


BIN
kmall-admin/src/main/webapp/statics/img/bestex_logo3.png


BIN
kmall-admin/src/main/webapp/statics/img/yto_logo.jpg


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

@@ -1880,5 +1880,46 @@ public class Dict {
 
     }
 
+    /**
+     * 产品备案信息状态
+     */
+    public enum productRecordStatus {
+        item_00("00", "新增备案-待发送"),
+        item_01("01", "新增备案-发送失败"),
+        item_02("02", "新增备案-待审核"),
+        item_03("03", "新增备案-审核失败"),
+        item_10("10", "重新备案-待发送"),
+        item_11("11", "重新备案-发送失败"),
+        item_12("12", "重新备案-待审核"),
+        item_13("13", "重新备案-审核失败"),
+        item_21("21", "备案成功-待更新"),
+        item_22("22", "备案成功-更新完成");
+
+        private String item;
+        private String itemName;
+
+        productRecordStatus(String item, String itemName) {
+            this.item = item;
+            this.itemName = itemName;
+        }
+
+        public String getItem() {
+            return item;
+        }
+
+        public void setItem(String item) {
+            this.item = item;
+        }
+
+        public String getItemName() {
+            return itemName;
+        }
+
+        public void setItemName(String itemName) {
+            this.itemName = itemName;
+        }
+
+    }
+
 
 }

+ 9 - 0
kmall-common/src/main/java/com/kmall/common/utils/print/ticket/item/Ticket.java

@@ -30,6 +30,8 @@ public class Ticket implements Serializable {
     private CusListing cusListing;
     // 小票页脚
     private TicketFoot ticketFoot;
+    // 面单信息
+    private TicketMailInfo ticketMailInfo;
 
     //---------- 商品要素对齐方式 ----------
     private String goodsAlign = BOTTOM;
@@ -44,6 +46,13 @@ public class Ticket implements Serializable {
     private TicketCommonFont ticketCommonFont;
 
 
+    public TicketMailInfo getTicketMailInfo() {
+        return ticketMailInfo;
+    }
+
+    public void setTicketMailInfo(TicketMailInfo ticketMailInfo) {
+        this.ticketMailInfo = ticketMailInfo;
+    }
 
     public TicketHead getTicketHead() {
         return ticketHead;

+ 198 - 0
kmall-common/src/main/java/com/kmall/common/utils/print/ticket/item/TicketMailInfo.java

@@ -0,0 +1,198 @@
+package com.kmall.common.utils.print.ticket.item;
+
+import java.io.Serializable;
+
+public class TicketMailInfo implements Serializable {
+
+    /**
+     * 快递公司logo地址
+     */
+    private String exprLogoUrl;
+
+    /**
+     * 快递面单
+     */
+    private String exprNo;
+
+    /**
+     * 快递面单base64图片
+     */
+    private String exprNoBase64Img;
+
+    /**
+     * 门店电话
+     */
+    private String shopTel;
+
+    private String senderName;
+
+    private String senderMob;
+
+    private String senderTel;
+
+    private String senderProvince;
+
+    private String senderCity;
+
+    private String senderDistrict;
+
+    private String senderAddress;
+
+    private String consigneeName;
+
+    private String consigneeMob;
+
+    private String consigneeTel;
+
+    private String consigneeProvince;
+
+    private String consigneeCity;
+
+    private String consigneeDistrict;
+
+    private String consigneeAddress;
+
+    public String getConsigneeName() {
+        return consigneeName;
+    }
+
+    public void setConsigneeName(String consigneeName) {
+        this.consigneeName = consigneeName;
+    }
+
+    public String getConsigneeMob() {
+        return consigneeMob;
+    }
+
+    public void setConsigneeMob(String consigneeMob) {
+        this.consigneeMob = consigneeMob;
+    }
+
+    public String getConsigneeTel() {
+        return consigneeTel;
+    }
+
+    public void setConsigneeTel(String consigneeTel) {
+        this.consigneeTel = consigneeTel;
+    }
+
+    public String getSenderName() {
+        return senderName;
+    }
+
+    public void setSenderName(String senderName) {
+        this.senderName = senderName;
+    }
+
+    public String getSenderMob() {
+        return senderMob;
+    }
+
+    public void setSenderMob(String senderMob) {
+        this.senderMob = senderMob;
+    }
+
+    public String getSenderTel() {
+        return senderTel;
+    }
+
+    public void setSenderTel(String senderTel) {
+        this.senderTel = senderTel;
+    }
+
+    public String getSenderProvince() {
+        return senderProvince;
+    }
+
+    public void setSenderProvince(String senderProvince) {
+        this.senderProvince = senderProvince;
+    }
+
+    public String getSenderCity() {
+        return senderCity;
+    }
+
+    public void setSenderCity(String senderCity) {
+        this.senderCity = senderCity;
+    }
+
+    public String getSenderDistrict() {
+        return senderDistrict;
+    }
+
+    public void setSenderDistrict(String senderDistrict) {
+        this.senderDistrict = senderDistrict;
+    }
+
+    public String getSenderAddress() {
+        return senderAddress;
+    }
+
+    public void setSenderAddress(String senderAddress) {
+        this.senderAddress = senderAddress;
+    }
+
+    public String getConsigneeProvince() {
+        return consigneeProvince;
+    }
+
+    public void setConsigneeProvince(String consigneeProvince) {
+        this.consigneeProvince = consigneeProvince;
+    }
+
+    public String getConsigneeCity() {
+        return consigneeCity;
+    }
+
+    public void setConsigneeCity(String consigneeCity) {
+        this.consigneeCity = consigneeCity;
+    }
+
+    public String getConsigneeDistrict() {
+        return consigneeDistrict;
+    }
+
+    public void setConsigneeDistrict(String consigneeDistrict) {
+        this.consigneeDistrict = consigneeDistrict;
+    }
+
+    public String getConsigneeAddress() {
+        return consigneeAddress;
+    }
+
+    public void setConsigneeAddress(String consigneeAddress) {
+        this.consigneeAddress = consigneeAddress;
+    }
+
+    public String getShopTel() {
+        return shopTel;
+    }
+
+    public void setShopTel(String shopTel) {
+        this.shopTel = shopTel;
+    }
+
+    public String getExprLogoUrl() {
+        return exprLogoUrl;
+    }
+
+    public void setExprLogoUrl(String exprLogoUrl) {
+        this.exprLogoUrl = exprLogoUrl;
+    }
+
+    public String getExprNo() {
+        return exprNo;
+    }
+
+    public void setExprNo(String exprNo) {
+        this.exprNo = exprNo;
+    }
+
+    public String getExprNoBase64Img() {
+        return exprNoBase64Img;
+    }
+
+    public void setExprNoBase64Img(String exprNoBase64Img) {
+        this.exprNoBase64Img = exprNoBase64Img;
+    }
+}

+ 42 - 0
kmall-manager/src/main/java/com/kmall/manager/manager/print/ticket/TicketPrintUtil.java

@@ -51,4 +51,46 @@ public class TicketPrintUtil {
         return ticket;
     }
 
+    public static Ticket print(TicketHead head, List<Goods> goods, CashInfo cashInfo, CusListing cusListing, TicketMailInfo mailInfo) {
+        //---------- 小票字体 ----------
+        TicketHeadFont headFont = new TicketHeadFont();
+        headFont.setFamily("宋体");
+        headFont.setWeight(Font.BOLD);
+        headFont.setSize(12);
+
+        TicketGoodsTitleFont goodsTitleFont = new TicketGoodsTitleFont();
+        goodsTitleFont.setFamily("宋体");
+        goodsTitleFont.setWeight(Font.BOLD);
+        goodsTitleFont.setSize(8);
+
+        TicketCommonFont commonFont = new TicketCommonFont();
+        commonFont.setFamily("宋体");
+        commonFont.setWeight(Font.PLAIN);
+        commonFont.setSize(8);
+
+        // 小票脚
+        TicketFoot foot = new TicketFoot();
+        foot.setSummary(PrintTicketPropertiesBuilder.instance().getSummary());
+        foot.setServiceTel(PrintTicketPropertiesBuilder.instance().getServiceTel());
+        foot.setUrl1(PrintTicketPropertiesBuilder.instance().getUrl1());
+
+        //---------- 组装小票 ----------
+        Ticket ticket = new Ticket();
+        ticket.setTicketHead(head);
+        ticket.setGoodsAlign(Ticket.BOTTOM);
+        ticket.setGoods(goods);
+        ticket.setCashInfo(cashInfo);
+        ticket.setCusListing(cusListing);
+        ticket.setTicketFoot(foot);
+        ticket.setTicketMailInfo(mailInfo);
+
+        ticket.setTicketHeadFont(headFont);
+        ticket.setTicketGoodsTitleFont(goodsTitleFont);
+        ticket.setTicketCommonFont(commonFont);
+
+        // 打印
+        // TicketPrinter.print(ticket);
+        return ticket;
+    }
+
 }

+ 2 - 2
kmall-manager/src/main/resources/conf/db.properties

@@ -30,9 +30,9 @@
 #\u963F\u91CC\u4E91\u5185\u7F51\u5730\u5740
 #jdbc.url=jdbc:mysql://rm-wz9rps8173a1nx63g819.mysql.rds.aliyuncs.com:3306/kmall_pt?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8
 #\u963F\u91CC\u4E91\u5916\u7F51\u5730\u5740
-jdbc.url=jdbc:mysql://out-rm-wz9rps8173a1nx63gio.mysql.rds.aliyuncs.com:3306/kmall_cw?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8
+#jdbc.url=jdbc:mysql://out-rm-wz9rps8173a1nx63gio.mysql.rds.aliyuncs.com:3306/kmall_cw?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8
 # \u65B0\u963F\u91CC\u4E91\u5916\u7F51\u5730\u5740
-#jdbc.url=jdbc:mysql://out-rm-wz92efl25x02n44xego.mysql.rds.aliyuncs.com:3306/kmall_cw?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8
+jdbc.url=jdbc:mysql://out-rm-wz92efl25x02n44xego.mysql.rds.aliyuncs.com:3306/kmall_cw?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8
 jdbc.username=kmall_cw
 jdbc.password=eb6zHJg%x3
 

+ 7 - 7
kmall-manager/src/main/resources/conf/oms-merch.properties

@@ -24,21 +24,21 @@ merch.wxOrderResendUrl=http://8.135.102.238:8680/wx/wxOrderResendQueryAll
 ##oms\u6D4B\u8BD5\u73AF\u5883\u8DE8\u5883\u989D\u5EA6\u67E5\u8BE2\u63A5\u53E3
 #merch.quotaInquiryUrl=http://127.0.0.1:8680/al/cus/yearLimit
 #\u7533\u8BF7\u4EA7\u54C1\u5907\u6848\u63A5\u53E3(\u672C\u5730\u6D4B\u8BD5)
-merch.addPdProductListUrl=http://127.0.0.1:8181/al/product/addPdProductList
-#\u7533\u8BF7\u4EA7\u54C1\u5907\u6848\u63A5\u53E3
-merch.pdProductImgInsertOrUpdateUrl=http://127.0.0.1:8181/pdProductImg/insertOrUpdateSkuImg
+#merch.addPdProductListUrl=http://127.0.0.1:8680/al/product/addPdProductList
+##\u7533\u8BF7\u4EA7\u54C1\u5907\u6848\u63A5\u53E3
+#merch.pdProductImgInsertOrUpdateUrl=http://127.0.0.1:8181/pdProductImg/insertOrUpdateSkuImg
 
 
-####oms\u751F\u4EA7\u73AF\u5883\u5BC6\u94A5
+###oms\u751F\u4EA7\u73AF\u5883\u5BC6\u94A5
 merch.md5Salt=IxyIvP0sJqlUZinx
 ##oms\u751F\u4EA7\u73AF\u5883\u6D3B\u4F53\u4EBA\u8138\u6838\u8EAB\u63A5\u53E3
 merch.livenessRecognitionUrl=http://ws.ds-bay.com/al/faceid/livenessRecognition
 ##oms\u6D4B\u8BD5\u73AF\u5883\u8DE8\u5883\u989D\u5EA6\u67E5\u8BE2\u63A5\u53E3
 merch.quotaInquiryUrl=http://ws.ds-bay.com/al/cus/yearLimit
 #\u7533\u8BF7\u4EA7\u54C1\u5907\u6848\u63A5\u53E3
-#merch.addPdProductListUrl=http://ws.ds-bay.com/al/product/addPdProductList
+merch.addPdProductListUrl=http://ws.ds-bay.com/al/product/addPdProductList
 #\u4EA7\u54C1\u5907\u6848\u56FE\u7247\u66F4\u65B0\u63A5\u53E3
-#merch.pdProductImgInsertOrUpdateUrl=http://ws.ds-bay.com/al/pdProductImg/insertOrUpdateSkuImg
+merch.pdProductImgInsertOrUpdateUrl=http://ws.ds-bay.com/oms-controller-mgt/pdProductImg/insertOrUpdateSkuImg
 
 
 
@@ -52,4 +52,4 @@ merch.quotaInquiryUrl=http://ws.ds-bay.com/al/cus/yearLimit
 #\u7533\u8BF7\u4EA7\u54C1\u5907\u6848\u63A5\u53E3
 #merch.addPdProductListUrl=http://183.3.221.143:8680/al/product/addPdProductList
 #\u4EA7\u54C1\u5907\u6848\u56FE\u7247\u66F4\u65B0\u63A5\u53E3
-#merch.pdProductImgInsertOrUpdateUrl=http://183.3.221.143:8680/al/pdProductImg/insertOrUpdateSkuImg
+#merch.pdProductImgInsertOrUpdateUrl=http://183.3.221.143:8080/oms-controller-mgt/pdProductImg/insertOrUpdateSkuImg

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

@@ -24,9 +24,8 @@ redis.dev.pool.testOnBorrow=true
 
 # \u4E2D\u7F51\u751F\u4EA7\u73AF\u5883
 redis.prod.keyPrefix=platform
-redis.prod.host=183.3.221.144
+redis.prod.host=127.0.0.1
 redis.prod.port=6379
-redis.prod.password=Abc-123#*.-
 redis.prod.pool.maxIdle=200
 redis.prod.pool.maxWait=1000
 redis.prod.pool.maxTotal=10000

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

@@ -35,3 +35,6 @@
 替换local_policy.jar、US_export_policy.jar两个安全的jar文件
 
 10. cert安装目录配置在wx-mp.properties的certName中
+
+
+11. sale.js修改WebSocket地址