Bläddra i källkod

Merge remote-tracking branch 'origin/master' into feature/系统日志前端优化1210

# Conflicts:
#	kmall-admin/src/main/resources/mybatis/mapper/GoodsDao.xml
qng 3 år sedan
förälder
incheckning
3e5c236ccc

+ 35 - 0
kmall-admin/src/main/java/com/kmall/admin/dao/haikong/HaiKongSendOrderInfoDetailRecordDao.java

@@ -0,0 +1,35 @@
+package com.kmall.admin.dao.haikong;
+
+
+import com.kmall.admin.entity.haikong.HaiKongSendOrderInfoDetailRecordEntity;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 推送订单明细记录Dao
+ *
+ * @author emato
+ * @email admin@qhdswl.com
+ * @date 2021-12-10 14:24:19
+ */
+public interface HaiKongSendOrderInfoDetailRecordDao {
+
+    HaiKongSendOrderInfoDetailRecordEntity queryObject(Integer id);
+
+    List<HaiKongSendOrderInfoDetailRecordEntity> queryListByOrderId(String orderId);
+
+    List<HaiKongSendOrderInfoDetailRecordEntity> queryList(Map<String, Object> params);
+
+    int queryTotal(Map<String, Object> params);
+
+    int save(HaiKongSendOrderInfoDetailRecordEntity entity);
+
+    int update(HaiKongSendOrderInfoDetailRecordEntity entity);
+
+    int delete(Integer id);
+
+    int deleteBatch(List<Integer> idList);
+
+    int saveBatch(List<HaiKongSendOrderInfoDetailRecordEntity> entities);
+}

+ 40 - 0
kmall-admin/src/main/java/com/kmall/admin/dao/haikong/HaiKongSendOrderInfoRecordDao.java

@@ -0,0 +1,40 @@
+package com.kmall.admin.dao.haikong;
+
+
+import com.kmall.admin.entity.haikong.HaiKongSendOrderInfoRecordEntity;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 推送订单信息记录Dao
+ *
+ * @author emato
+ * @email admin@qhdswl.com
+ * @date 2021-12-10 14:24:19
+ */
+public interface HaiKongSendOrderInfoRecordDao {
+
+    HaiKongSendOrderInfoRecordEntity queryObjectByOuterOrderNo(String outerOrderNo);
+
+    HaiKongSendOrderInfoRecordEntity queryObject(Integer id);
+
+    List<HaiKongSendOrderInfoRecordEntity> queryListByResendStatus();
+
+    List<HaiKongSendOrderInfoRecordEntity> queryList(Map<String, Object> params);
+
+    int queryTotal(Map<String, Object> params);
+
+    int save(HaiKongSendOrderInfoRecordEntity entity);
+
+    int update(HaiKongSendOrderInfoRecordEntity entity);
+
+    int delete(Integer id);
+
+    int deleteBatch(List<Integer> idList);
+
+    int saveBatch(List<HaiKongSendOrderInfoRecordEntity> entities);
+
+    void updateResendStatusBatch(List<HaiKongSendOrderInfoRecordEntity> entities);
+}

+ 236 - 0
kmall-admin/src/main/java/com/kmall/admin/entity/haikong/HaiKongSendOrderInfoDetailRecordEntity.java

@@ -0,0 +1,236 @@
+package com.kmall.admin.entity.haikong;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 推送订单明细记录实体
+ * 表名 haikong_send_order_info_detail_record
+ *
+ * @author emato
+ * @email admin@qhdswl.com
+ * @date 2021-12-10 14:24:19
+ */
+public class HaiKongSendOrderInfoDetailRecordEntity implements Serializable {
+    private static final long serialVersionUID = 198746514877654L;
+
+    /**
+     * 
+     */
+    private Integer id;
+    /**
+     * 订单id
+     */
+    private String orderId;
+    /**
+     * 图片地址
+     */
+    private String imageUrl;
+    /**
+     * 明细商品货号,填sku
+     */
+    private String bn;
+    /**
+     * 条码
+     */
+    private String barcode;
+    /**
+     * 商品名
+     */
+    private String name;
+    /**
+     * 明细商品的成本,填零售价
+     */
+    private BigDecimal cost;
+    /**
+     * 销售价
+     */
+    private BigDecimal price;
+    /**
+     * 商品编码
+     */
+    private String itemcode;
+    /**
+     * 明细商品总额,销售价*数量
+     */
+    private BigDecimal amount;
+    /**
+     * 明细商品购买数量
+     */
+    private Integer nums;
+    /**
+     * 是否含税 固定传true
+     */
+    private String isTax;
+
+    /**
+     * 税金
+     */
+    private BigDecimal taxPrice;
+
+    /**
+     * 设置:
+     */
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    /**
+     * 获取:
+     */
+    public Integer getId() {
+        return id;
+    }
+    /**
+     * 设置:订单id
+     */
+    public void setOrderId(String orderId) {
+        this.orderId = orderId;
+    }
+
+    /**
+     * 获取:订单id
+     */
+    public String getOrderId() {
+        return orderId;
+    }
+    /**
+     * 设置:图片地址
+     */
+    public void setImageUrl(String imageUrl) {
+        this.imageUrl = imageUrl;
+    }
+
+    /**
+     * 获取:图片地址
+     */
+    public String getImageUrl() {
+        return imageUrl;
+    }
+    /**
+     * 设置:明细商品货号,填sku
+     */
+    public void setBn(String bn) {
+        this.bn = bn;
+    }
+
+    /**
+     * 获取:明细商品货号,填sku
+     */
+    public String getBn() {
+        return bn;
+    }
+    /**
+     * 设置:条码
+     */
+    public void setBarcode(String barcode) {
+        this.barcode = barcode;
+    }
+
+    /**
+     * 获取:条码
+     */
+    public String getBarcode() {
+        return barcode;
+    }
+    /**
+     * 设置:商品名
+     */
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    /**
+     * 获取:商品名
+     */
+    public String getName() {
+        return name;
+    }
+    /**
+     * 设置:明细商品的成本,填零售价
+     */
+    public void setCost(BigDecimal cost) {
+        this.cost = cost;
+    }
+
+    /**
+     * 获取:明细商品的成本,填零售价
+     */
+    public BigDecimal getCost() {
+        return cost;
+    }
+    /**
+     * 设置:销售价
+     */
+    public void setPrice(BigDecimal price) {
+        this.price = price;
+    }
+
+    /**
+     * 获取:销售价
+     */
+    public BigDecimal getPrice() {
+        return price;
+    }
+    /**
+     * 设置:商品编码
+     */
+    public void setItemcode(String itemcode) {
+        this.itemcode = itemcode;
+    }
+
+    /**
+     * 获取:商品编码
+     */
+    public String getItemcode() {
+        return itemcode;
+    }
+    /**
+     * 设置:明细商品总额,销售价*数量
+     */
+    public void setAmount(BigDecimal amount) {
+        this.amount = amount;
+    }
+
+    /**
+     * 获取:明细商品总额,销售价*数量
+     */
+    public BigDecimal getAmount() {
+        return amount;
+    }
+    /**
+     * 设置:明细商品购买数量
+     */
+    public void setNums(Integer nums) {
+        this.nums = nums;
+    }
+
+    /**
+     * 获取:明细商品购买数量
+     */
+    public Integer getNums() {
+        return nums;
+    }
+    /**
+     * 设置:是否含税 固定传true
+     */
+    public void setIsTax(String isTax) {
+        this.isTax = isTax;
+    }
+
+    /**
+     * 获取:是否含税 固定传true
+     */
+    public String getIsTax() {
+        return isTax;
+    }
+
+    public BigDecimal getTaxPrice() {
+        return taxPrice;
+    }
+
+    public void setTaxPrice(BigDecimal taxPrice) {
+        this.taxPrice = taxPrice;
+    }
+}

+ 509 - 0
kmall-admin/src/main/java/com/kmall/admin/entity/haikong/HaiKongSendOrderInfoRecordEntity.java

@@ -0,0 +1,509 @@
+package com.kmall.admin.entity.haikong;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 推送订单信息记录实体
+ * 表名 haikong_send_order_info_record
+ *
+ * @author emato
+ * @email admin@qhdswl.com
+ * @date 2021-12-10 14:24:19
+ */
+public class HaiKongSendOrderInfoRecordEntity implements Serializable {
+    private static final long serialVersionUID = 18978315462135466L;
+
+    /**
+     * 
+     */
+    private Integer id;
+    /**
+     * 订单编号
+     */
+    private String outerOrderNo;
+    /**
+     * 支付方式[wxpay|wxpayinapp|wxpayinwxapp|alipay|alipayguarantee|alipayqr|chinapay|chinapayclient|code|offine]
+     */
+    private String payApp;
+    /**
+     * 配送方式,默认SF
+     */
+    private String dlytypeCode;
+    /**
+     * 收货人
+     */
+    private String consigneeName;
+    /**
+     * 收货地址省份
+     */
+    private String consigneeAreaProvince;
+    /**
+     * 收货地址城市
+     */
+    private String consigneeAreaCity;
+    /**
+     * 收货地址地区
+     */
+    private String consigneeAreaCounty;
+    /**
+     * 收货地址详细地址
+     */
+    private String consigneeAddress;
+    /**
+     * 收货人的邮编
+     */
+    private String consigneeZip;
+    /**
+     * 收货人的联系电话
+     */
+    private String consigneeTel;
+    /**
+     * 收货人的邮箱
+     */
+    private String consigneeEmail;
+    /**
+     * 收货人的手机号
+     */
+    private String consigneeMobile;
+    /**
+     * 订单商品总重量(克)
+     */
+    private BigDecimal weight;
+    /**
+     * 订单包含商品数量
+     */
+    private Integer quantity;
+    /**
+     * 订单应付总金额
+     */
+    private BigDecimal orderTotal;
+    /**
+     * 下单的平台,['pc','mobile','wx','ios','android','store','other']
+     */
+    private String platform;
+    /**
+     * 支付货币金额
+     */
+    private BigDecimal money;
+    /**
+     * 付款方式 online=在线支付 offline=线下支付 deposit=预付款支付
+     */
+    private String payMode;
+    /**
+     * 发送给支付企业的原始请求
+     */
+    private String request;
+    /**
+     * 支付成功后回调的原始请求
+     */
+    private String response;
+    /**
+     * 支付平台流水号
+     */
+    private String outTradeNo;
+    /**
+     * 口岸代码  4600
+     */
+    private String seaportCode;
+    /**
+     * 跨境商品平台来源 1:广州跨境通保税 2:自营保税    填1
+     */
+    private String seaportPlatform;
+    /**
+     * 订购人身份证号码
+     */
+    private String identityCard;
+    /**
+     * 订购人姓名
+     */
+    private String identityName;
+    /**
+     * 订购人手机号
+     */
+    private String identityMobile;
+
+    /**
+     * 订单产品信息,json字符串
+     */
+    private String orderProductInfo;
+
+    /**
+     * 重发状态,0:等待重发 1:重发成功 2:重发失败 3:无需重发
+     */
+    private String resendStatus;
+
+    /**
+     * 设置:
+     */
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    /**
+     * 获取:
+     */
+    public Integer getId() {
+        return id;
+    }
+    /**
+     * 设置:订单编号
+     */
+    public void setOuterOrderNo(String outerOrderNo) {
+        this.outerOrderNo = outerOrderNo;
+    }
+
+    /**
+     * 获取:订单编号
+     */
+    public String getOuterOrderNo() {
+        return outerOrderNo;
+    }
+    /**
+     * 设置:支付方式[wxpay|wxpayinapp|wxpayinwxapp|alipay|alipayguarantee|alipayqr|chinapay|chinapayclient|code|offine]
+     */
+    public void setPayApp(String payApp) {
+        this.payApp = payApp;
+    }
+
+    /**
+     * 获取:支付方式[wxpay|wxpayinapp|wxpayinwxapp|alipay|alipayguarantee|alipayqr|chinapay|chinapayclient|code|offine]
+     */
+    public String getPayApp() {
+        return payApp;
+    }
+    /**
+     * 设置:配送方式,默认SF
+     */
+    public void setDlytypeCode(String dlytypeCode) {
+        this.dlytypeCode = dlytypeCode;
+    }
+
+    /**
+     * 获取:配送方式,默认SF
+     */
+    public String getDlytypeCode() {
+        return dlytypeCode;
+    }
+    /**
+     * 设置:收货人
+     */
+    public void setConsigneeName(String consigneeName) {
+        this.consigneeName = consigneeName;
+    }
+
+    /**
+     * 获取:收货人
+     */
+    public String getConsigneeName() {
+        return consigneeName;
+    }
+    /**
+     * 设置:收货地址省份
+     */
+    public void setConsigneeAreaProvince(String consigneeAreaProvince) {
+        this.consigneeAreaProvince = consigneeAreaProvince;
+    }
+
+    /**
+     * 获取:收货地址省份
+     */
+    public String getConsigneeAreaProvince() {
+        return consigneeAreaProvince;
+    }
+    /**
+     * 设置:收货地址城市
+     */
+    public void setConsigneeAreaCity(String consigneeAreaCity) {
+        this.consigneeAreaCity = consigneeAreaCity;
+    }
+
+    /**
+     * 获取:收货地址城市
+     */
+    public String getConsigneeAreaCity() {
+        return consigneeAreaCity;
+    }
+    /**
+     * 设置:收货地址地区
+     */
+    public void setConsigneeAreaCounty(String consigneeAreaCounty) {
+        this.consigneeAreaCounty = consigneeAreaCounty;
+    }
+
+    /**
+     * 获取:收货地址地区
+     */
+    public String getConsigneeAreaCounty() {
+        return consigneeAreaCounty;
+    }
+    /**
+     * 设置:收货地址详细地址
+     */
+    public void setConsigneeAddress(String consigneeAddress) {
+        this.consigneeAddress = consigneeAddress;
+    }
+
+    /**
+     * 获取:收货地址详细地址
+     */
+    public String getConsigneeAddress() {
+        return consigneeAddress;
+    }
+    /**
+     * 设置:收货人的邮编
+     */
+    public void setConsigneeZip(String consigneeZip) {
+        this.consigneeZip = consigneeZip;
+    }
+
+    /**
+     * 获取:收货人的邮编
+     */
+    public String getConsigneeZip() {
+        return consigneeZip;
+    }
+    /**
+     * 设置:收货人的联系电话
+     */
+    public void setConsigneeTel(String consigneeTel) {
+        this.consigneeTel = consigneeTel;
+    }
+
+    /**
+     * 获取:收货人的联系电话
+     */
+    public String getConsigneeTel() {
+        return consigneeTel;
+    }
+    /**
+     * 设置:收货人的邮箱
+     */
+    public void setConsigneeEmail(String consigneeEmail) {
+        this.consigneeEmail = consigneeEmail;
+    }
+
+    /**
+     * 获取:收货人的邮箱
+     */
+    public String getConsigneeEmail() {
+        return consigneeEmail;
+    }
+    /**
+     * 设置:收货人的手机号
+     */
+    public void setConsigneeMobile(String consigneeMobile) {
+        this.consigneeMobile = consigneeMobile;
+    }
+
+    /**
+     * 获取:收货人的手机号
+     */
+    public String getConsigneeMobile() {
+        return consigneeMobile;
+    }
+    /**
+     * 设置:订单商品总重量(克)
+     */
+    public void setWeight(BigDecimal weight) {
+        this.weight = weight;
+    }
+
+    /**
+     * 获取:订单商品总重量(克)
+     */
+    public BigDecimal getWeight() {
+        return weight;
+    }
+    /**
+     * 设置:订单包含商品数量
+     */
+    public void setQuantity(Integer quantity) {
+        this.quantity = quantity;
+    }
+
+    /**
+     * 获取:订单包含商品数量
+     */
+    public Integer getQuantity() {
+        return quantity;
+    }
+    /**
+     * 设置:订单应付总金额
+     */
+    public void setOrderTotal(BigDecimal orderTotal) {
+        this.orderTotal = orderTotal;
+    }
+
+    /**
+     * 获取:订单应付总金额
+     */
+    public BigDecimal getOrderTotal() {
+        return orderTotal;
+    }
+    /**
+     * 设置:下单的平台,['pc','mobile','wx','ios','android','store','other']
+     */
+    public void setPlatform(String platform) {
+        this.platform = platform;
+    }
+
+    /**
+     * 获取:下单的平台,['pc','mobile','wx','ios','android','store','other']
+     */
+    public String getPlatform() {
+        return platform;
+    }
+    /**
+     * 设置:支付货币金额
+     */
+    public void setMoney(BigDecimal money) {
+        this.money = money;
+    }
+
+    /**
+     * 获取:支付货币金额
+     */
+    public BigDecimal getMoney() {
+        return money;
+    }
+    /**
+     * 设置:付款方式 online=在线支付 offline=线下支付 deposit=预付款支付
+     */
+    public void setPayMode(String payMode) {
+        this.payMode = payMode;
+    }
+
+    /**
+     * 获取:付款方式 online=在线支付 offline=线下支付 deposit=预付款支付
+     */
+    public String getPayMode() {
+        return payMode;
+    }
+    /**
+     * 设置:发送给支付企业的原始请求
+     */
+    public void setRequest(String request) {
+        this.request = request;
+    }
+
+    /**
+     * 获取:发送给支付企业的原始请求
+     */
+    public String getRequest() {
+        return request;
+    }
+    /**
+     * 设置:支付成功后回调的原始请求
+     */
+    public void setResponse(String response) {
+        this.response = response;
+    }
+
+    /**
+     * 获取:支付成功后回调的原始请求
+     */
+    public String getResponse() {
+        return response;
+    }
+    /**
+     * 设置:支付平台流水号
+     */
+    public void setOutTradeNo(String outTradeNo) {
+        this.outTradeNo = outTradeNo;
+    }
+
+    /**
+     * 获取:支付平台流水号
+     */
+    public String getOutTradeNo() {
+        return outTradeNo;
+    }
+    /**
+     * 设置:口岸代码  4600
+     */
+    public void setSeaportCode(String seaportCode) {
+        this.seaportCode = seaportCode;
+    }
+
+    /**
+     * 获取:口岸代码  4600
+     */
+    public String getSeaportCode() {
+        return seaportCode;
+    }
+    /**
+     * 设置:跨境商品平台来源 1:广州跨境通保税 2:自营保税    填1
+     */
+    public void setSeaportPlatform(String seaportPlatform) {
+        this.seaportPlatform = seaportPlatform;
+    }
+
+    /**
+     * 获取:跨境商品平台来源 1:广州跨境通保税 2:自营保税    填1
+     */
+    public String getSeaportPlatform() {
+        return seaportPlatform;
+    }
+    /**
+     * 设置:订购人身份证号码
+     */
+    public void setIdentityCard(String identityCard) {
+        this.identityCard = identityCard;
+    }
+
+    /**
+     * 获取:订购人身份证号码
+     */
+    public String getIdentityCard() {
+        return identityCard;
+    }
+    /**
+     * 设置:订购人姓名
+     */
+    public void setIdentityName(String identityName) {
+        this.identityName = identityName;
+    }
+
+    /**
+     * 获取:订购人姓名
+     */
+    public String getIdentityName() {
+        return identityName;
+    }
+    /**
+     * 设置:订购人手机号
+     */
+    public void setIdentityMobile(String identityMobile) {
+        this.identityMobile = identityMobile;
+    }
+
+    /**
+     * 获取:订购人手机号
+     */
+    public String getIdentityMobile() {
+        return identityMobile;
+    }
+    /**
+     * 设置:重发状态,0:等待重发 1:重发成功 2:重发失败 3:无需重发
+     */
+    public void setResendStatus(String resendStatus) {
+        this.resendStatus = resendStatus;
+    }
+
+    /**
+     * 获取:重发状态,0:等待重发 1:重发成功 2:重发失败 3:无需重发
+     */
+    public String getResendStatus() {
+        return resendStatus;
+    }
+
+    public String getOrderProductInfo() {
+        return orderProductInfo;
+    }
+
+    public void setOrderProductInfo(String orderProductInfo) {
+        this.orderProductInfo = orderProductInfo;
+    }
+}

+ 114 - 0
kmall-admin/src/main/java/com/kmall/admin/haikong/task/SendOrderInfoTask.java

@@ -0,0 +1,114 @@
+package com.kmall.admin.haikong.task;
+
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.kmall.admin.entity.haikong.HaiKongMemberOrderSyncResendEntity;
+import com.kmall.admin.entity.haikong.HaiKongSendOrderInfoDetailRecordEntity;
+import com.kmall.admin.entity.haikong.HaiKongSendOrderInfoRecordEntity;
+import com.kmall.admin.haikong.client.VmcShopTemplate;
+import com.kmall.admin.haikong.constant.HaiKongMemberOrderResendStatusEnum;
+import com.kmall.admin.haikong.dto.*;
+import com.kmall.admin.haikong.utils.Response;
+import com.kmall.admin.service.haikong.HaiKongSendOrderInfoDetailRecordService;
+import com.kmall.admin.service.haikong.HaiKongSendOrderInfoRecordService;
+import com.kmall.admin.utils.jackson.JacksonUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+import org.springframework.util.CollectionUtils;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+/**
+ * 推送订单,重推接口
+ * @author lhm
+ * @createDate 2021-12-10
+ */
+@Component
+public class SendOrderInfoTask {
+
+    private static final Logger log = LoggerFactory.getLogger(SendOrderInfoTask.class);
+
+    @Autowired
+    private HaiKongSendOrderInfoRecordService haiKongSendOrderInfoRecordService;
+
+    @Autowired
+    private HaiKongSendOrderInfoDetailRecordService haiKongSendOrderInfoDetailRecordService;
+
+    @Autowired
+    private VmcShopTemplate vmcShopTemplate;
+
+    //    @Scheduled(cron = "0/20 0/2 * * * ?")
+    public void resend() {
+        // 查询等待发送和发送失败的记录
+        List<HaiKongSendOrderInfoRecordEntity> haiKongSendOrderInfoRecordEntities = haiKongSendOrderInfoRecordService.queryListByResendStatus();
+        if (CollectionUtils.isEmpty(haiKongSendOrderInfoRecordEntities)) {
+            return;
+        }
+        List<HaiKongSendOrderInfoRecordEntity> successList = new ArrayList<>();
+        List<HaiKongSendOrderInfoRecordEntity> failedList = new ArrayList<>();
+        haiKongSendOrderInfoRecordEntities.forEach(haiKongSendOrderInfoRecordEntity -> {
+            SendOrderToVmcShopDTO sendOrderToVmcShopDTO = new SendOrderToVmcShopDTO();
+            SeaportInfoDTO seaportInfoDTO = new SeaportInfoDTO();
+            PayInfoDTO payInfoDTO = new PayInfoDTO();
+            OrderInfoDTO orderInfoDTO = new OrderInfoDTO();
+
+            BeanUtils.copyProperties(haiKongSendOrderInfoRecordEntity, orderInfoDTO);
+            BeanUtils.copyProperties(haiKongSendOrderInfoRecordEntity, payInfoDTO);
+            seaportInfoDTO.setSeaportCode(haiKongSendOrderInfoRecordEntity.getSeaportCode());
+            seaportInfoDTO.setPlatform(haiKongSendOrderInfoRecordEntity.getPlatform());
+            seaportInfoDTO.setIdentityCard(haiKongSendOrderInfoRecordEntity.getIdentityCard());
+            seaportInfoDTO.setIdentityMobile(haiKongSendOrderInfoRecordEntity.getIdentityMobile());
+            seaportInfoDTO.setIdentityName(haiKongSendOrderInfoRecordEntity.getIdentityName());
+            seaportInfoDTO.setOrderProductInfoList(JacksonUtil.fromListJson(haiKongSendOrderInfoRecordEntity.getOrderProductInfo(), new TypeReference<List<OrderProductInfoDTO>>() {}));
+
+            List<HaiKongSendOrderInfoDetailRecordEntity> detailRecordEntities = haiKongSendOrderInfoDetailRecordService.queryListByOrderId(haiKongSendOrderInfoRecordEntity.getOuterOrderNo());
+            List<OrderInfoItemDTO> dtoList = detailRecordEntities.stream().map(detailRecord -> {
+                OrderInfoItemDTO orderInfoItemDTO = new OrderInfoItemDTO();
+                BeanUtils.copyProperties(detailRecord, orderInfoItemDTO);
+                orderInfoItemDTO.setTax(Boolean.getBoolean(detailRecord.getIsTax()));
+                return orderInfoItemDTO;
+            }).collect(Collectors.toList());
+
+            sendOrderToVmcShopDTO.setPayInfo(payInfoDTO);
+            sendOrderToVmcShopDTO.setSeaportInfo(seaportInfoDTO);
+            sendOrderToVmcShopDTO.setOrderInfoItems(dtoList);
+            sendOrderToVmcShopDTO.setOrderInfo(orderInfoDTO);
+
+            String body = JacksonUtil.toJson(sendOrderToVmcShopDTO);
+            log.info("【重发】请求会员消费订单同步接口!请求体:{}", body);
+            try {
+                String responseJson = vmcShopTemplate.sendOrder(body);
+                Response<Long> response = JacksonUtil.fromListJson(responseJson, new TypeReference<Response<Long>>() {});
+                if (Objects.nonNull(response) && response.getSuccess()) {
+                    haiKongSendOrderInfoRecordEntity.setResendStatus(HaiKongMemberOrderResendStatusEnum.RESEND_SUCCESS.getStatus());
+                    successList.add(haiKongSendOrderInfoRecordEntity);
+                    log.info("【重发】请求会员消费订单同步接口成功!响应数据:{}", responseJson);
+                } else {
+                    haiKongSendOrderInfoRecordEntity.setResendStatus(HaiKongMemberOrderResendStatusEnum.RESEND_FAILED.getStatus());
+                    failedList.add(haiKongSendOrderInfoRecordEntity);
+                    log.error("【重发】请求会员消费订单同步接口失败!响应:{}", responseJson);
+                }
+            } catch (Exception e) {
+                haiKongSendOrderInfoRecordEntity.setResendStatus(HaiKongMemberOrderResendStatusEnum.RESEND_FAILED.getStatus());
+                failedList.add(haiKongSendOrderInfoRecordEntity);
+                log.error("【重发】请求会员消费订单同步接口失败!异常:", e);
+            }
+        });
+
+        if (!CollectionUtils.isEmpty(successList)) {
+            haiKongSendOrderInfoRecordService.updateResendStatusBatch(successList);
+        }
+
+        if (!CollectionUtils.isEmpty(failedList)) {
+            haiKongSendOrderInfoRecordService.updateResendStatusBatch(failedList);
+        }
+        log.info("【重发】此次重发会员消费订单同步接口!成功【{}】条,失败【{}】条!", successList.size(), failedList.size());
+    }
+
+}

+ 76 - 0
kmall-admin/src/main/java/com/kmall/admin/service/haikong/HaiKongSendOrderInfoDetailRecordService.java

@@ -0,0 +1,76 @@
+package com.kmall.admin.service.haikong;
+
+import com.kmall.admin.entity.haikong.HaiKongSendOrderInfoDetailRecordEntity;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 推送订单明细记录Service接口
+ *
+ * @author emato
+ * @email admin@qhdswl.com
+ * @date 2021-12-10 14:24:19
+ */
+public interface HaiKongSendOrderInfoDetailRecordService {
+
+    /**
+     * 根据主键查询实体
+     *
+     * @param id 主键
+     * @return 实体
+     */
+    HaiKongSendOrderInfoDetailRecordEntity queryObject(Integer id);
+
+    /**
+     * 分页查询
+     *
+     * @param map 参数
+     * @return list
+     */
+    List<HaiKongSendOrderInfoDetailRecordEntity> queryList(Map<String, Object> map);
+
+    /**
+     * 分页统计总数
+     *
+     * @param map 参数
+     * @return 总数
+     */
+    int queryTotal(Map<String, Object> map);
+
+    /**
+     * 保存实体
+     *
+     * @param haikongSendOrderInfoDetailRecord 实体
+     * @return 保存条数
+     */
+    int save(HaiKongSendOrderInfoDetailRecordEntity haikongSendOrderInfoDetailRecord);
+
+    /**
+     * 根据主键更新实体
+     *
+     * @param haikongSendOrderInfoDetailRecord 实体
+     * @return 更新条数
+     */
+    int update(HaiKongSendOrderInfoDetailRecordEntity haikongSendOrderInfoDetailRecord);
+
+    /**
+     * 根据主键删除
+     *
+     * @param id
+     * @return 删除条数
+     */
+    int delete(Integer id);
+
+    /**
+     * 根据主键批量删除
+     *
+     * @param ids
+     * @return 删除条数
+     */
+    int deleteBatch(List<Integer> ids);
+
+    int saveBatch(List<HaiKongSendOrderInfoDetailRecordEntity> entities);
+
+    List<HaiKongSendOrderInfoDetailRecordEntity> queryListByOrderId(String orderId);
+}

+ 79 - 0
kmall-admin/src/main/java/com/kmall/admin/service/haikong/HaiKongSendOrderInfoRecordService.java

@@ -0,0 +1,79 @@
+package com.kmall.admin.service.haikong;
+
+import com.kmall.admin.entity.haikong.HaiKongSendOrderInfoRecordEntity;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 推送订单信息记录Service接口
+ *
+ * @author emato
+ * @email admin@qhdswl.com
+ * @date 2021-12-10 14:24:19
+ */
+public interface HaiKongSendOrderInfoRecordService {
+
+    /**
+     * 根据主键查询实体
+     *
+     * @param id 主键
+     * @return 实体
+     */
+    HaiKongSendOrderInfoRecordEntity queryObject(Integer id);
+
+    /**
+     * 分页查询
+     *
+     * @param map 参数
+     * @return list
+     */
+    List<HaiKongSendOrderInfoRecordEntity> queryList(Map<String, Object> map);
+
+    /**
+     * 分页统计总数
+     *
+     * @param map 参数
+     * @return 总数
+     */
+    int queryTotal(Map<String, Object> map);
+
+    /**
+     * 保存实体
+     *
+     * @param haikongSendOrderInfoRecord 实体
+     * @return 保存条数
+     */
+    int save(HaiKongSendOrderInfoRecordEntity haikongSendOrderInfoRecord);
+
+    /**
+     * 根据主键更新实体
+     *
+     * @param haikongSendOrderInfoRecord 实体
+     * @return 更新条数
+     */
+    int update(HaiKongSendOrderInfoRecordEntity haikongSendOrderInfoRecord);
+
+    /**
+     * 根据主键删除
+     *
+     * @param id
+     * @return 删除条数
+     */
+    int delete(Integer id);
+
+    /**
+     * 根据主键批量删除
+     *
+     * @param ids
+     * @return 删除条数
+     */
+    int deleteBatch(List<Integer>ids);
+
+    int saveBatch(List<HaiKongSendOrderInfoRecordEntity> entities);
+
+    List<HaiKongSendOrderInfoRecordEntity> queryListByResendStatus();
+
+    void updateResendStatusBatch(List<HaiKongSendOrderInfoRecordEntity> entities);
+}

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

@@ -1655,7 +1655,6 @@ public class GoodsServiceImpl implements GoodsService {
 
         /*
         * 2. 查询海仓仓库系统,判断库存是否足够
-        * TODO 测试的时候注释,海控仓库系统没有测试环境,上生产时放开注释
         * */
         sku = org.springframework.util.StringUtils.isEmpty(sku) ? goods.getSku() : sku;
         String wareStockNumberKey = storeId + sku + prodBarcode;
@@ -1667,6 +1666,7 @@ public class GoodsServiceImpl implements GoodsService {
         Integer sellVolume = Objects.isNull(goods.getSellVolume()) ? 1 : goods.getSellVolume();
         if (org.springframework.util.StringUtils.isEmpty(redisCacheWareQuantity)) {
 
+            /* -----------------↓--------------生产请打开注释-------------------↓------------ */
 //            WareQueryStockParamDTO wareQueryStockParamDTO = new WareQueryStockParamDTO();
 //            List<Criteria> criteriaList = new ArrayList<>();
 //            Criteria criteria = new Criteria();
@@ -1690,6 +1690,7 @@ public class GoodsServiceImpl implements GoodsService {
 //                throw new ServiceException("调用库存系统接口出现错误!");
 //            }
 //            WareQueryStockResponseDTO wareQueryStockResponseDTO = JacksonUtil.fromStringJson(queryWarehouseStockResponse, WareQueryStockResponseDTO.class);
+            /* -----------------↑--------------生产请打开注释------------------↑------------- */
 
             /* -----------------↓--------------测试数据,生产请注释-------------------↓------------ */
             WareQueryStockResponseDTO wareQueryStockResponseDTO = new WareQueryStockResponseDTO();

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

@@ -22,10 +22,7 @@ import com.kmall.admin.dao.vip.Mall2MemberPointsDao;
 import com.kmall.admin.dao.vip.Mall2PointsRulesDao;
 import com.kmall.admin.dto.*;
 import com.kmall.admin.entity.*;
-import com.kmall.admin.entity.haikong.HaiKongMemberOrderSyncResendEntity;
-import com.kmall.admin.entity.haikong.HaiKongMemberScoreChangeDetailRecordEntity;
-import com.kmall.admin.entity.haikong.HaiKongMemberScoreChangeRecordEntity;
-import com.kmall.admin.entity.haikong.IntegralGoBackEntity;
+import com.kmall.admin.entity.haikong.*;
 import com.kmall.admin.entity.mk.MkActivitiesEntity;
 import com.kmall.admin.entity.mk.MkActivitiesScoreEntity;
 import com.kmall.admin.entity.mk.store.MkStorePromOrderRealEntity;
@@ -45,9 +42,7 @@ import com.kmall.admin.haikong.client.VmcShopTemplate;
 import com.kmall.admin.haikong.config.HaiKongProperties;
 import com.kmall.admin.haikong.utils.Response;
 import com.kmall.admin.service.*;
-import com.kmall.admin.service.haikong.HaiKongMemberOrderSyncResendService;
-import com.kmall.admin.service.haikong.HaiKongMemberScoreChangeDetailRecordService;
-import com.kmall.admin.service.haikong.HaiKongMemberScoreChangeRecordService;
+import com.kmall.admin.service.haikong.*;
 import com.kmall.admin.service.mk.MkActivitiesScoreService;
 import com.kmall.admin.service.mk.MkActivitiesService;
 import com.kmall.admin.service.mk.store.MkStoreCampMinusService;
@@ -304,6 +299,12 @@ public class OrderServiceImpl implements OrderService {
     @Autowired
     private AliCusDeclareBiz aliCusDeclareBiz;
 
+    @Autowired
+    private HaiKongSendOrderInfoRecordService haiKongSendOrderInfoRecordService;
+
+    @Autowired
+    private HaiKongSendOrderInfoDetailRecordService haiKongSendOrderInfoDetailRecordService;
+
     @Override
     public OrderEntity queryObject(Long id) {
         return orderDao.queryObject(id);
@@ -2173,7 +2174,7 @@ public class OrderServiceImpl implements OrderService {
         Map resultObj = Maps.newHashMap();
         // 海控需求,下单流程修改,收银端接收会员码,付款码,用户信息,订单数据
         // 1. 校验库存:保税仓库存 + 展销店库存 - 出区数 >= 购买数
-        // TODO 获取保税仓库存,测试时注释
+        /* -----------------↓--------------生产请打开注释-------------------↓------------ */
         /*WareQueryStockParamDTO wareQueryStockParamDTO = new WareQueryStockParamDTO();
         List<Criteria> criteriaList = new ArrayList<>();
         goodsList.forEach(goods -> {
@@ -2216,8 +2217,9 @@ public class OrderServiceImpl implements OrderService {
                 stockMap.put(itemCode, quantity);
             }
         });*/
+        /* -----------------↑--------------生产请打开注释------------------↑------------- */
 
-        // TODO 上生产时注释,模拟仓库系统(sku最大库存为3)返回
+        /* -----------------↓--------------测试数据,生产请注释-------------------↓------------ */
         Map<String, Integer> stockMap = new HashMap<>(16);
         goodsList.forEach(goods -> {
             String sku = (String) goods.get("goodsSn");
@@ -2228,6 +2230,7 @@ public class OrderServiceImpl implements OrderService {
                 stockMap.put(sku, 3);
             }
         });
+        /* -----------------↑--------------测试数据,生产请注释------------------↑------------- */
 
         try {
             if (user == null) {
@@ -2757,6 +2760,9 @@ public class OrderServiceImpl implements OrderService {
         sendOrderToVmcShopDTO.setSeaportInfo(seaportInfoDTO);
         sendOrderToVmcShopDTO.setPayInfo(payInfoDTO);
 
+        HaiKongSendOrderInfoRecordEntity haiKongSendOrderInfoRecordEntity = wrapSendOrderInfoRecord(sendOrderToVmcShopDTO);
+        List<HaiKongSendOrderInfoDetailRecordEntity> detailRecordEntities = wrapSendOrderInfoDetailRecord(orderInfoItemDTOList);
+
         String body = JacksonUtil.toJson(sendOrderToVmcShopDTO);
 
         String orderSn = order.getOrder_sn();
@@ -2768,15 +2774,49 @@ public class OrderServiceImpl implements OrderService {
 
             if (Objects.nonNull(r) && r.getCode() == 0) {
                 pickUpCodeService.updatePickUpCodeStatusByOrderSn(orderSn, Dict.PickUpCodeStatusEnum.item_0.getStatus());
+                haiKongSendOrderInfoRecordEntity.setResendStatus(HaiKongMemberOrderResendStatusEnum.NON_RESEND.getStatus());
                 LOGGER.info("推送订单到免税mall成功!响应结果:{}", response);
             } else {
                 pickUpCodeService.updatePickUpCodeStatusByOrderSn(orderSn, Dict.PickUpCodeStatusEnum.item_6.getStatus());
+                haiKongSendOrderInfoRecordEntity.setResendStatus(HaiKongMemberOrderResendStatusEnum.WAIT_RESEND.getStatus());
                 LOGGER.error("推送订单到免税mall失败!响应结果:{}", response);
             }
         } catch (Exception e) {
             pickUpCodeService.updatePickUpCodeStatusByOrderSn(orderSn, Dict.PickUpCodeStatusEnum.item_6.getStatus());
+            haiKongSendOrderInfoRecordEntity.setResendStatus(HaiKongMemberOrderResendStatusEnum.WAIT_RESEND.getStatus());
             LOGGER.error("推送订单到免税mall失败!出现异常!", e);
         }
+
+        haiKongSendOrderInfoRecordService.save(haiKongSendOrderInfoRecordEntity);
+        haiKongSendOrderInfoDetailRecordService.saveBatch(detailRecordEntities);
+    }
+
+    private List<HaiKongSendOrderInfoDetailRecordEntity> wrapSendOrderInfoDetailRecord(List<OrderInfoItemDTO> orderInfoItemDTOList) {
+        return orderInfoItemDTOList.stream().map(orderInfoItemDTO -> {
+            HaiKongSendOrderInfoDetailRecordEntity entity = new HaiKongSendOrderInfoDetailRecordEntity();
+            BeanUtils.copyProperties(orderInfoItemDTO, entity);
+            entity.setIsTax(orderInfoItemDTO.getTax().toString());
+            return entity;
+        }).collect(Collectors.toList());
+    }
+
+    private HaiKongSendOrderInfoRecordEntity wrapSendOrderInfoRecord(SendOrderToVmcShopDTO sendOrderToVmcShopDTO) {
+        HaiKongSendOrderInfoRecordEntity entity = new HaiKongSendOrderInfoRecordEntity();
+        OrderInfoDTO orderInfo = sendOrderToVmcShopDTO.getOrderInfo();
+        PayInfoDTO payInfo = sendOrderToVmcShopDTO.getPayInfo();
+        SeaportInfoDTO seaportInfo = sendOrderToVmcShopDTO.getSeaportInfo();
+
+        BeanUtils.copyProperties(orderInfo, entity);
+        BeanUtils.copyProperties(payInfo, entity);
+
+        entity.setSeaportCode(seaportInfo.getSeaportCode());
+        entity.setSeaportPlatform(seaportInfo.getPlatform());
+        entity.setIdentityCard(seaportInfo.getIdentityCard());
+        entity.setIdentityMobile(seaportInfo.getIdentityMobile());
+        entity.setIdentityName(seaportInfo.getIdentityName());
+        entity.setOrderProductInfo(JacksonUtil.toJson(seaportInfo.getOrderProductInfoList()));
+
+        return entity;
     }
 
     /**

+ 68 - 0
kmall-admin/src/main/java/com/kmall/admin/service/impl/haikong/HaiKongSendOrderInfoDetailRecordServiceImpl.java

@@ -0,0 +1,68 @@
+package com.kmall.admin.service.impl.haikong;
+
+import com.kmall.admin.dao.haikong.HaiKongSendOrderInfoDetailRecordDao;
+import com.kmall.admin.entity.haikong.HaiKongSendOrderInfoDetailRecordEntity;
+import com.kmall.admin.service.haikong.HaiKongSendOrderInfoDetailRecordService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 推送订单明细记录Service实现类
+ *
+ * @author emato
+ * @email admin@qhdswl.com
+ * @date 2021-12-10 14:24:19
+ */
+@Service("haiKongSendOrderInfoDetailRecordService")
+public class HaiKongSendOrderInfoDetailRecordServiceImpl implements HaiKongSendOrderInfoDetailRecordService {
+    @Autowired
+    private HaiKongSendOrderInfoDetailRecordDao haikongSendOrderInfoDetailRecordDao;
+
+    @Override
+    public HaiKongSendOrderInfoDetailRecordEntity queryObject(Integer id) {
+        return haikongSendOrderInfoDetailRecordDao.queryObject(id);
+    }
+
+    @Override
+    public List<HaiKongSendOrderInfoDetailRecordEntity> queryList(Map<String, Object> map) {
+        return haikongSendOrderInfoDetailRecordDao.queryList(map);
+    }
+
+    @Override
+    public int queryTotal(Map<String, Object> map) {
+        return haikongSendOrderInfoDetailRecordDao.queryTotal(map);
+    }
+
+    @Override
+    public int save(HaiKongSendOrderInfoDetailRecordEntity haikongSendOrderInfoDetailRecord) {
+        return haikongSendOrderInfoDetailRecordDao.save(haikongSendOrderInfoDetailRecord);
+    }
+
+    @Override
+    public int update(HaiKongSendOrderInfoDetailRecordEntity haikongSendOrderInfoDetailRecord) {
+        return haikongSendOrderInfoDetailRecordDao.update(haikongSendOrderInfoDetailRecord);
+    }
+
+    @Override
+    public int delete(Integer id) {
+        return haikongSendOrderInfoDetailRecordDao.delete(id);
+    }
+
+    @Override
+    public int deleteBatch(List<Integer> ids) {
+        return haikongSendOrderInfoDetailRecordDao.deleteBatch(ids);
+    }
+
+    @Override
+    public int saveBatch(List<HaiKongSendOrderInfoDetailRecordEntity> entities) {
+        return haikongSendOrderInfoDetailRecordDao.saveBatch(entities);
+    }
+
+    @Override
+    public List<HaiKongSendOrderInfoDetailRecordEntity> queryListByOrderId(String orderId) {
+        return haikongSendOrderInfoDetailRecordDao.queryListByOrderId(orderId);
+    }
+}

+ 74 - 0
kmall-admin/src/main/java/com/kmall/admin/service/impl/haikong/HaikongSendOrderInfoRecordServiceImpl.java

@@ -0,0 +1,74 @@
+package com.kmall.admin.service.impl.haikong;
+
+import com.kmall.admin.dao.haikong.HaiKongSendOrderInfoRecordDao;
+import com.kmall.admin.entity.haikong.HaiKongSendOrderInfoRecordEntity;
+import com.kmall.admin.service.haikong.HaiKongSendOrderInfoRecordService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Map;
+
+
+/**
+ * 推送订单信息记录Service实现类
+ *
+ * @author emato
+ * @email admin@qhdswl.com
+ * @date 2021-12-10 14:24:19
+ */
+@Service("haiKongSendOrderInfoRecordService")
+public class HaikongSendOrderInfoRecordServiceImpl implements HaiKongSendOrderInfoRecordService {
+    @Autowired
+    private HaiKongSendOrderInfoRecordDao haikongSendOrderInfoRecordDao;
+
+    @Override
+    public HaiKongSendOrderInfoRecordEntity queryObject(Integer id) {
+        return haikongSendOrderInfoRecordDao.queryObject(id);
+    }
+
+    @Override
+    public List<HaiKongSendOrderInfoRecordEntity> queryList(Map<String, Object> map) {
+        return haikongSendOrderInfoRecordDao.queryList(map);
+    }
+
+    @Override
+    public int queryTotal(Map<String, Object> map) {
+        return haikongSendOrderInfoRecordDao.queryTotal(map);
+    }
+
+    @Override
+    public int save(HaiKongSendOrderInfoRecordEntity haikongSendOrderInfoRecord) {
+        return haikongSendOrderInfoRecordDao.save(haikongSendOrderInfoRecord);
+    }
+
+    @Override
+    public int update(HaiKongSendOrderInfoRecordEntity haikongSendOrderInfoRecord) {
+        return haikongSendOrderInfoRecordDao.update(haikongSendOrderInfoRecord);
+    }
+
+    @Override
+    public int delete(Integer id) {
+        return haikongSendOrderInfoRecordDao.delete(id);
+    }
+
+    @Override
+    public int deleteBatch(List<Integer> ids) {
+        return haikongSendOrderInfoRecordDao.deleteBatch(ids);
+    }
+
+    @Override
+    public int saveBatch(List<HaiKongSendOrderInfoRecordEntity> entities) {
+        return haikongSendOrderInfoRecordDao.saveBatch(entities);
+    }
+
+    @Override
+    public List<HaiKongSendOrderInfoRecordEntity> queryListByResendStatus() {
+        return haikongSendOrderInfoRecordDao.queryListByResendStatus();
+    }
+
+    @Override
+    public void updateResendStatusBatch(List<HaiKongSendOrderInfoRecordEntity> entities) {
+        haikongSendOrderInfoRecordDao.updateResendStatusBatch(entities);
+    }
+}

+ 198 - 0
kmall-admin/src/main/resources/mybatis/mapper/haikong/HaikongSendOrderInfoDetailRecordDao.xml

@@ -0,0 +1,198 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+
+<mapper namespace="com.kmall.admin.dao.haikong.HaiKongSendOrderInfoDetailRecordDao">
+
+    <resultMap type="com.kmall.admin.entity.haikong.HaiKongSendOrderInfoDetailRecordEntity" id="haikongSendOrderInfoDetailRecordMap">
+        <result property="id" column="id"/>
+        <result property="orderId" column="order_id"/>
+        <result property="imageUrl" column="image_url"/>
+        <result property="bn" column="bn"/>
+        <result property="barcode" column="barcode"/>
+        <result property="name" column="name"/>
+        <result property="cost" column="cost"/>
+        <result property="price" column="price"/>
+        <result property="itemcode" column="itemcode"/>
+        <result property="amount" column="amount"/>
+        <result property="nums" column="nums"/>
+        <result property="isTax" column="is_tax"/>
+        <result property="taxPrice" column="tax_price"/>
+    </resultMap>
+
+	<select id="queryObject" resultType="com.kmall.admin.entity.haikong.HaiKongSendOrderInfoDetailRecordEntity">
+		select
+			`id`,
+			`order_id`,
+			`image_url`,
+			`bn`,
+			`barcode`,
+			`name`,
+			`cost`,
+			`price`,
+			`itemcode`,
+			`amount`,
+			`nums`,
+			`is_tax`,
+			`tax_price`
+		from haikong_send_order_info_detail_record
+		where id = #{id}
+	</select>
+
+	<select id="queryList" resultType="com.kmall.admin.entity.haikong.HaiKongSendOrderInfoDetailRecordEntity">
+		select
+    		`id`,
+    		`order_id`,
+    		`image_url`,
+    		`bn`,
+    		`barcode`,
+    		`name`,
+    		`cost`,
+    		`price`,
+    		`itemcode`,
+    		`amount`,
+    		`nums`,
+    		`is_tax`,
+			`tax_price`
+		from haikong_send_order_info_detail_record
+		WHERE 1=1
+		<if test="name != null and name.trim() != ''">
+			AND name LIKE concat('%',#{name},'%')
+		</if>
+        <choose>
+            <when test="sidx != null and sidx.trim() != ''">
+                order by ${sidx} ${order}
+            </when>
+			<otherwise>
+                order by id desc
+			</otherwise>
+        </choose>
+		<if test="offset != null and limit != null">
+			limit #{offset}, #{limit}
+		</if>
+	</select>
+
+	<select id="queryListByOrderId" resultType="com.kmall.admin.entity.haikong.HaiKongSendOrderInfoDetailRecordEntity">
+		select
+		`id`,
+		`order_id`,
+		`image_url`,
+		`bn`,
+		`barcode`,
+		`name`,
+		`cost`,
+		`price`,
+		`itemcode`,
+		`amount`,
+		`nums`,
+		`is_tax`,
+		`tax_price`
+		from haikong_send_order_info_detail_record
+		WHERE 1=1
+		<if test="orderId != null and orderId.trim() != ''">
+			AND order_id = #{orderId}
+		</if>
+	</select>
+	
+ 	<select id="queryTotal" resultType="int">
+		select count(*) from haikong_send_order_info_detail_record
+		WHERE 1=1
+        <if test="name != null and name.trim() != ''">
+            AND name LIKE concat('%',#{name},'%')
+        </if>
+	</select>
+	 
+	<insert id="save" parameterType="com.kmall.admin.entity.haikong.HaiKongSendOrderInfoDetailRecordEntity" useGeneratedKeys="true" keyProperty="id">
+		insert into haikong_send_order_info_detail_record(
+			`order_id`,
+			`image_url`,
+			`bn`,
+			`barcode`,
+			`name`,
+			`cost`,
+			`price`,
+			`itemcode`,
+			`amount`,
+			`nums`,
+			`is_tax`,
+			`tax_price`)
+		values(
+			#{orderId},
+			#{imageUrl},
+			#{bn},
+			#{barcode},
+			#{name},
+			#{cost},
+			#{price},
+			#{itemcode},
+			#{amount},
+			#{nums},
+			#{isTax},
+			#{taxPrice})
+	</insert>
+
+	<insert id="saveBatch">
+		insert into haikong_send_order_info_detail_record
+		(
+			`order_id`,
+			`image_url`,
+			`bn`,
+			`barcode`,
+			`name`,
+			`cost`,
+			`price`,
+			`itemcode`,
+			`amount`,
+			`nums`,
+			`is_tax`,
+			`tax_price`
+		)
+		values
+			<foreach collection="list" separator="," item="item">
+				(
+					#{item.orderId},
+					#{item.imageUrl},
+					#{item.bn},
+					#{item.barcode},
+					#{item.name},
+					#{item.cost},
+					#{item.price},
+					#{item.itemcode},
+					#{item.amount},
+					#{item.nums},
+					#{item.isTax},
+					#{item.taxPrice}
+				)
+			</foreach>
+ 	</insert>
+
+	<update id="update" parameterType="com.kmall.admin.entity.haikong.HaiKongSendOrderInfoDetailRecordEntity">
+		update haikong_send_order_info_detail_record 
+		<set>
+			<if test="orderId != null">`order_id` = #{orderId}, </if>
+			<if test="imageUrl != null">`image_url` = #{imageUrl}, </if>
+			<if test="bn != null">`bn` = #{bn}, </if>
+			<if test="barcode != null">`barcode` = #{barcode}, </if>
+			<if test="name != null">`name` = #{name}, </if>
+			<if test="cost != null">`cost` = #{cost}, </if>
+			<if test="price != null">`price` = #{price}, </if>
+			<if test="itemcode != null">`itemcode` = #{itemcode}, </if>
+			<if test="amount != null">`amount` = #{amount}, </if>
+			<if test="nums != null">`nums` = #{nums}, </if>
+			<if test="isTax != null">`is_tax` = #{isTax}</if>
+			<if test="taxPrice != null">`tax_price` = #{taxPrice}</if>
+		</set>
+		where id = #{id}
+	</update>
+	
+	<delete id="delete">
+		delete from haikong_send_order_info_detail_record where id = #{value}
+	</delete>
+	
+	<delete id="deleteBatch">
+		delete from haikong_send_order_info_detail_record where id in 
+		<foreach item="id" collection="list" open="(" separator="," close=")">
+			#{id}
+		</foreach>
+	</delete>
+
+</mapper>

+ 392 - 0
kmall-admin/src/main/resources/mybatis/mapper/haikong/HaikongSendOrderInfoRecordDao.xml

@@ -0,0 +1,392 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+
+<mapper namespace="com.kmall.admin.dao.haikong.HaiKongSendOrderInfoRecordDao">
+
+    <resultMap type="com.kmall.admin.entity.haikong.HaiKongSendOrderInfoRecordEntity" id="haikongSendOrderInfoRecordMap">
+        <result property="id" column="id"/>
+        <result property="outerOrderNo" column="outer_order_no"/>
+        <result property="payApp" column="pay_app"/>
+        <result property="dlytypeCode" column="dlytype_code"/>
+        <result property="consigneeName" column="consignee_name"/>
+        <result property="consigneeAreaProvince" column="consignee_area_province"/>
+        <result property="consigneeAreaCity" column="consignee_area_city"/>
+        <result property="consigneeAreaCounty" column="consignee_area_county"/>
+        <result property="consigneeAddress" column="consignee_address"/>
+        <result property="consigneeZip" column="consignee_zip"/>
+        <result property="consigneeTel" column="consignee_tel"/>
+        <result property="consigneeEmail" column="consignee_email"/>
+        <result property="consigneeMobile" column="consignee_mobile"/>
+        <result property="weight" column="weight"/>
+        <result property="quantity" column="quantity"/>
+        <result property="orderTotal" column="order_total"/>
+        <result property="platform" column="platform"/>
+        <result property="money" column="money"/>
+        <result property="payMode" column="pay_mode"/>
+        <result property="request" column="request"/>
+        <result property="response" column="response"/>
+        <result property="outTradeNo" column="out_trade_no"/>
+        <result property="seaportCode" column="seaport_code"/>
+        <result property="seaportPlatform" column="seaport_platform"/>
+        <result property="identityCard" column="identity_card"/>
+        <result property="identityName" column="identity_name"/>
+        <result property="identityMobile" column="identity_mobile"/>
+        <result property="orderProductInfo" column="order_product_info"/>
+        <result property="resendStatus" column="resend_status"/>
+    </resultMap>
+
+	<select id="queryObjectByOuterOrderNo" resultType="com.kmall.admin.entity.haikong.HaiKongSendOrderInfoRecordEntity">
+		select
+			`id`,
+			`outer_order_no`,
+			`pay_app`,
+			`dlytype_code`,
+			`consignee_name`,
+			`consignee_area_province`,
+			`consignee_area_city`,
+			`consignee_area_county`,
+			`consignee_address`,
+			`consignee_zip`,
+			`consignee_tel`,
+			`consignee_email`,
+			`consignee_mobile`,
+			`weight`,
+			`quantity`,
+			`order_total`,
+			`platform`,
+			`money`,
+			`pay_mode`,
+			`request`,
+			`response`,
+			`out_trade_no`,
+			`seaport_code`,
+			`seaport_platform`,
+			`identity_card`,
+			`identity_name`,
+			`identity_mobile`,
+			`order_product_info`,
+			`resend_status`
+		from haikong_send_order_info_record
+		where outer_order_no = #{outerOrderNo}
+	</select>
+
+	<select id="queryObject" resultType="com.kmall.admin.entity.haikong.HaiKongSendOrderInfoRecordEntity">
+		select
+			`id`,
+			`outer_order_no`,
+			`pay_app`,
+			`dlytype_code`,
+			`consignee_name`,
+			`consignee_area_province`,
+			`consignee_area_city`,
+			`consignee_area_county`,
+			`consignee_address`,
+			`consignee_zip`,
+			`consignee_tel`,
+			`consignee_email`,
+			`consignee_mobile`,
+			`weight`,
+			`quantity`,
+			`order_total`,
+			`platform`,
+			`money`,
+			`pay_mode`,
+			`request`,
+			`response`,
+			`out_trade_no`,
+			`seaport_code`,
+			`seaport_platform`,
+			`identity_card`,
+			`identity_name`,
+			`identity_mobile`,
+			`order_product_info`,
+			`resend_status`
+		from haikong_send_order_info_record
+		where id = #{id}
+	</select>
+
+	<select id="queryList" resultType="com.kmall.admin.entity.haikong.HaiKongSendOrderInfoRecordEntity">
+		select
+    		`id`,
+    		`outer_order_no`,
+    		`pay_app`,
+    		`dlytype_code`,
+    		`consignee_name`,
+    		`consignee_area_province`,
+    		`consignee_area_city`,
+    		`consignee_area_county`,
+    		`consignee_address`,
+    		`consignee_zip`,
+    		`consignee_tel`,
+    		`consignee_email`,
+    		`consignee_mobile`,
+    		`weight`,
+    		`quantity`,
+    		`order_total`,
+    		`platform`,
+    		`money`,
+    		`pay_mode`,
+    		`request`,
+    		`response`,
+    		`out_trade_no`,
+    		`seaport_code`,
+    		`seaport_platform`,
+    		`identity_card`,
+    		`identity_name`,
+    		`identity_mobile`,
+			`order_product_info`,
+    		`resend_status`
+		from haikong_send_order_info_record
+		WHERE 1=1
+		<if test="name != null and name.trim() != ''">
+			AND name LIKE concat('%',#{name},'%')
+		</if>
+        <choose>
+            <when test="sidx != null and sidx.trim() != ''">
+                order by ${sidx} ${order}
+            </when>
+			<otherwise>
+                order by id desc
+			</otherwise>
+        </choose>
+		<if test="offset != null and limit != null">
+			limit #{offset}, #{limit}
+		</if>
+	</select>
+
+	<select id="queryListByResendStatus" resultType="com.kmall.admin.entity.haikong.HaiKongSendOrderInfoRecordEntity">
+		select
+		`id`,
+		`outer_order_no`,
+		`pay_app`,
+		`dlytype_code`,
+		`consignee_name`,
+		`consignee_area_province`,
+		`consignee_area_city`,
+		`consignee_area_county`,
+		`consignee_address`,
+		`consignee_zip`,
+		`consignee_tel`,
+		`consignee_email`,
+		`consignee_mobile`,
+		`weight`,
+		`quantity`,
+		`order_total`,
+		`platform`,
+		`money`,
+		`pay_mode`,
+		`request`,
+		`response`,
+		`out_trade_no`,
+		`seaport_code`,
+		`seaport_platform`,
+		`identity_card`,
+		`identity_name`,
+		`identity_mobile`,
+		`order_product_info`,
+		`resend_status`
+		from haikong_send_order_info_record
+		WHERE resend_status in ('0', '2')
+	</select>
+	
+ 	<select id="queryTotal" resultType="int">
+		select count(*) from haikong_send_order_info_record
+		WHERE 1=1
+        <if test="name != null and name.trim() != ''">
+            AND name LIKE concat('%',#{name},'%')
+        </if>
+	</select>
+	 
+	<insert id="save" parameterType="com.kmall.admin.entity.haikong.HaiKongSendOrderInfoRecordEntity" useGeneratedKeys="true" keyProperty="id">
+		insert into haikong_send_order_info_record(
+			`outer_order_no`,
+			`pay_app`,
+			`dlytype_code`,
+			`consignee_name`,
+			`consignee_area_province`,
+			`consignee_area_city`,
+			`consignee_area_county`,
+			`consignee_address`,
+			`consignee_zip`,
+			`consignee_tel`,
+			`consignee_email`,
+			`consignee_mobile`,
+			`weight`,
+			`quantity`,
+			`order_total`,
+			`platform`,
+			`money`,
+			`pay_mode`,
+			`request`,
+			`response`,
+			`out_trade_no`,
+			`seaport_code`,
+			`seaport_platform`,
+			`identity_card`,
+			`identity_name`,
+			`identity_mobile`,
+			`order_product_info`,
+			`resend_status`)
+		values(
+			#{outerOrderNo},
+			#{payApp},
+			#{dlytypeCode},
+			#{consigneeName},
+			#{consigneeAreaProvince},
+			#{consigneeAreaCity},
+			#{consigneeAreaCounty},
+			#{consigneeAddress},
+			#{consigneeZip},
+			#{consigneeTel},
+			#{consigneeEmail},
+			#{consigneeMobile},
+			#{weight},
+			#{quantity},
+			#{orderTotal},
+			#{platform},
+			#{money},
+			#{payMode},
+			#{request},
+			#{response},
+			#{outTradeNo},
+			#{seaportCode},
+			#{seaportPlatform},
+			#{identityCard},
+			#{identityName},
+			#{identityMobile},
+			#{orderProductInfo},
+			#{resendStatus})
+	</insert>
+
+	<insert id="saveBatch">
+		insert into haikong_send_order_info_record
+		(
+			`outer_order_no`,
+			`pay_app`,
+			`dlytype_code`,
+			`consignee_name`,
+			`consignee_area_province`,
+			`consignee_area_city`,
+			`consignee_area_county`,
+			`consignee_address`,
+			`consignee_zip`,
+			`consignee_tel`,
+			`consignee_email`,
+			`consignee_mobile`,
+			`weight`,
+			`quantity`,
+			`order_total`,
+			`platform`,
+			`money`,
+			`pay_mode`,
+			`request`,
+			`response`,
+			`out_trade_no`,
+			`seaport_code`,
+			`seaport_platform`,
+			`identity_card`,
+			`identity_name`,
+			`identity_mobile`,
+			`order_product_info`,
+			`resend_status`
+		)
+		values
+			<foreach collection="list" item="item" separator=",">
+				(
+					#{item.outerOrderNo},
+					#{item.payApp},
+					#{item.dlytypeCode},
+					#{item.consigneeName},
+					#{item.consigneeAreaProvince},
+					#{item.consigneeAreaCity},
+					#{item.consigneeAreaCounty},
+					#{item.consigneeAddress},
+					#{item.consigneeZip},
+					#{item.consigneeTel},
+					#{item.consigneeEmail},
+					#{item.consigneeMobile},
+					#{item.weight},
+					#{item.quantity},
+					#{item.orderTotal},
+					#{item.platform},
+					#{item.money},
+					#{item.payMode},
+					#{item.request},
+					#{item.response},
+					#{item.outTradeNo},
+					#{item.seaportCode},
+					#{item.seaportPlatform},
+					#{item.identityCard},
+					#{item.identityName},
+					#{item.identityMobile},
+					#{item.orderProductInfo},
+					#{item.resendStatus}
+				)
+			</foreach>
+	</insert>
+
+	<update id="update" parameterType="com.kmall.admin.entity.haikong.HaiKongSendOrderInfoRecordEntity">
+		update haikong_send_order_info_record 
+		<set>
+			<if test="outerOrderNo != null">`outer_order_no` = #{outerOrderNo}, </if>
+			<if test="payApp != null">`pay_app` = #{payApp}, </if>
+			<if test="dlytypeCode != null">`dlytype_code` = #{dlytypeCode}, </if>
+			<if test="consigneeName != null">`consignee_name` = #{consigneeName}, </if>
+			<if test="consigneeAreaProvince != null">`consignee_area_province` = #{consigneeAreaProvince}, </if>
+			<if test="consigneeAreaCity != null">`consignee_area_city` = #{consigneeAreaCity}, </if>
+			<if test="consigneeAreaCounty != null">`consignee_area_county` = #{consigneeAreaCounty}, </if>
+			<if test="consigneeAddress != null">`consignee_address` = #{consigneeAddress}, </if>
+			<if test="consigneeZip != null">`consignee_zip` = #{consigneeZip}, </if>
+			<if test="consigneeTel != null">`consignee_tel` = #{consigneeTel}, </if>
+			<if test="consigneeEmail != null">`consignee_email` = #{consigneeEmail}, </if>
+			<if test="consigneeMobile != null">`consignee_mobile` = #{consigneeMobile}, </if>
+			<if test="weight != null">`weight` = #{weight}, </if>
+			<if test="quantity != null">`quantity` = #{quantity}, </if>
+			<if test="orderTotal != null">`order_total` = #{orderTotal}, </if>
+			<if test="platform != null">`platform` = #{platform}, </if>
+			<if test="money != null">`money` = #{money}, </if>
+			<if test="payMode != null">`pay_mode` = #{payMode}, </if>
+			<if test="request != null">`request` = #{request}, </if>
+			<if test="response != null">`response` = #{response}, </if>
+			<if test="outTradeNo != null">`out_trade_no` = #{outTradeNo}, </if>
+			<if test="seaportCode != null">`seaport_code` = #{seaportCode}, </if>
+			<if test="seaportPlatform != null">`seaport_platform` = #{seaportPlatform}, </if>
+			<if test="identityCard != null">`identity_card` = #{identityCard}, </if>
+			<if test="identityName != null">`identity_name` = #{identityName}, </if>
+			<if test="identityMobile != null">`identity_mobile` = #{identityMobile}, </if>
+			<if test="orderProductInfo != null">`order_product_info` = #{orderProductInfo}, </if>
+			<if test="resendStatus != null">`resend_status` = #{resendStatus}</if>
+		</set>
+		where id = #{id}
+	</update>
+
+	<update id="updateResendStatusBatch">
+		update haikong_send_order_info_record
+		<trim prefix="set" suffixOverrides=",">
+			resend_status =
+			<foreach collection="list" item="item" open="case " close=" end,">
+				when id = #{item.id} then #{item.resendStatus}
+			</foreach>
+			member_sys_order_id =
+			<foreach collection="list" item="item" open="case " close=" end,">
+				when id = #{item.id} then #{item.memberSysOrderId}
+			</foreach>
+		</trim>
+		where id in
+		<foreach collection="list" item="item" open="(" separator="," close=")">
+			#{item.id}
+		</foreach>
+	</update>
+
+	<delete id="delete">
+		delete from haikong_send_order_info_record where id = #{value}
+	</delete>
+	
+	<delete id="deleteBatch">
+		delete from haikong_send_order_info_record where id in 
+		<foreach item="id" collection="list" open="(" separator="," close=")">
+			#{id}
+		</foreach>
+	</delete>
+
+</mapper>

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

@@ -1450,7 +1450,7 @@ function openWebSocket() {
         //无法使用wss,浏览器打开WebSocket时报错
         //ws对应http、wss对应https。
         //kmall测试环境
-        //webSocket = new WebSocket("ws://183.62.225.124:8080/ws/server/"+storeId);
+        // webSocket = new WebSocket("ws://183.62.225.124:3080/ws/server/"+storeId);
         //kmall正式环境
         //webSocket = new WebSocket("ws://8.135.102.238:8080/ws/server/"+storeId);
         //kmall本地环境