Преглед на файлове

订单详情,分享订单

chao преди 3 години
родител
ревизия
ad7d5138a1

+ 41 - 0
src/main/java/com/caimei365/order/controller/OrderClubApi.java

@@ -13,6 +13,7 @@ import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiOperation;
 import lombok.RequiredArgsConstructor;
 import org.apache.commons.lang3.StringUtils;
+import org.springframework.http.HttpHeaders;
 import org.springframework.web.bind.annotation.*;
 
 import java.util.List;
@@ -200,4 +201,44 @@ public class OrderClubApi {
         }
         return orderClubService.getOrderLogistics(orderId);
     }
+
+    /**
+     * 分享订单,获取分享码
+     */
+    @ApiOperation("分享订单,获取分享码(旧:/order/share)")
+    @ApiImplicitParam(required = true, name = "orderId", value = "订单Id")
+    @GetMapping("/share/code")
+    public ResponseJson<String> getOrderShareCode(Integer orderId) {
+        if (null == orderId) {
+            return ResponseJson.error("订单Id不能为空!", null);
+        }
+        return orderClubService.getOrderShareCode(orderId);
+    }
+
+    /**
+     * 分享订单,校验分享码
+     */
+    @ApiOperation("分享订单,校验分享码(旧:/order/shareCode)")
+    @ApiImplicitParams({
+            @ApiImplicitParam(required = true, name = "orderId", value = "订单Id"),
+            @ApiImplicitParam(required = false, name = "userId", value = "用户Id"),
+            @ApiImplicitParam(required = false, name = "serviceProviderId", value = "协销Id"),
+            @ApiImplicitParam(required = false, name = "shareCode", value = "分享码"),
+            @ApiImplicitParam(required = false, name = "code", value = "微信code"),
+            @ApiImplicitParam(required = false, name = "encryptedData", value = "微信加密数据"),
+            @ApiImplicitParam(required = false, name = "iv", value = "微信加密算法的初始向量")
+    })
+    @GetMapping("/share/code/check")
+    public ResponseJson<String> checkOrderShareCode( Integer orderId, Integer userId, Integer serviceProviderId, String shareCode, String code, String encryptedData, String iv, @RequestHeader HttpHeaders headers) {
+        if (null == userId) {
+            return ResponseJson.error("用户Id不能为空!", null);
+        }
+        if (null == orderId) {
+            return ResponseJson.error("订单Id不能为空!", null);
+        }
+        if (StringUtils.isEmpty(code)) {
+            return ResponseJson.error("微信code不能为空!", null);
+        }
+        return orderClubService.checkOrderShareCode(orderId, userId, serviceProviderId, shareCode, code, encryptedData, iv, headers);
+    }
 }

+ 31 - 0
src/main/java/com/caimei365/order/mapper/OrderClubMapper.java

@@ -17,6 +17,11 @@ import java.util.List;
  */
 @Mapper
 public interface OrderClubMapper {
+    /**
+     * 判断订单是否存在
+     * @param orderId 订单Id
+     */
+    int countMainOrderByOrderId(Integer orderId);
     /**
      * 根据订单Id查询订单
      * @param orderId 订单Id
@@ -241,4 +246,30 @@ public interface OrderClubMapper {
      * @param logisticsBatchId 物流批次Id
      */
     List<LogisticsInformationVo> getLogisticsInfoList(Integer logisticsBatchId);
+    /**
+     * 获取数据库已有分享码
+     * @param orderId 订单Id
+     */
+    OrderShareCodeVo getOrderCodeById(Integer orderId);
+    /**
+     * 删除分享码使用记录
+     * @param orderId 订单Id
+     */
+    void deleteOrderShareCodeRecord(Integer orderId);
+    /**
+     * 更新数据库的分享码
+     */
+    void updateOrderShareCode(OrderShareCodeVo orderShareCode);
+    /**
+     * 新增数据库的分享码
+     */
+    void insertOrderShareCode(OrderShareCodeVo orderShareCode);
+    /**
+     * 根据openId统计数据库内是否有有效分享码
+     */
+    int countShareCodeRecord(Integer orderId, String openId);
+    /**
+     * 保存分享码使用记录
+     */
+    void insertOrderShareCodeRecord(OrderShareCodeRecordVo codeRecord);
 }

+ 39 - 0
src/main/java/com/caimei365/order/model/vo/OrderShareCodeRecordVo.java

@@ -0,0 +1,39 @@
+package com.caimei365.order.model.vo;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * Description
+ *
+ * @author : Charles
+ * @date : 2021/7/23
+ */
+@Data
+public class OrderShareCodeRecordVo implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    private Integer id;
+    /**
+     * 使用分享码人的openid,方便码有效期内再次查看
+     */
+    private String openId;
+    /**
+     * 主订单ID,关联cm_order的ID
+     */
+    private Integer orderId;
+    /**
+     * 订单分享码,关联cm_mall_order_share_code表ID
+     */
+    private Integer shareCodeId;
+    /**
+     * 添加时间
+     */
+    private Date addTime;
+    /**
+     *  0 有效  其它无效
+     */
+    private Integer delFlag;
+}

+ 39 - 0
src/main/java/com/caimei365/order/model/vo/OrderShareCodeVo.java

@@ -0,0 +1,39 @@
+package com.caimei365.order.model.vo;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * Description
+ *
+ * @author : Charles
+ * @date : 2021/7/22
+ */
+@Data
+public class OrderShareCodeVo implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    private Integer id;
+    /**
+     * 主订单ID,关联cm_order的ID
+     */
+    private Integer orderId;
+    /**
+     * 订单分享码,默认24小时有效
+     */
+    private String shareCode;
+    /**
+     * 添加时间
+     */
+    private Date addTime;
+    /**
+     * 过期时间
+     */
+    private Date expiredTime;
+    /**
+     *  0 有效  其它无效
+     */
+    private Integer delFlag;
+}

+ 18 - 0
src/main/java/com/caimei365/order/service/OrderClubService.java

@@ -6,6 +6,7 @@ import com.caimei365.order.model.vo.OrderVo;
 import com.caimei365.order.model.vo.SearchHistoryVo;
 import com.github.pagehelper.PageInfo;
 import io.swagger.annotations.ApiImplicitParam;
+import org.springframework.http.HttpHeaders;
 
 import java.util.List;
 import java.util.Map;
@@ -79,4 +80,21 @@ public interface OrderClubService {
      * @param orderId 订单Id
      */
     ResponseJson<List<LogisticsBatchVo>> getOrderLogistics(Integer orderId);
+    /**
+     * 分享订单,获取分享码
+     * @param orderId 订单Id
+     */
+    ResponseJson<String> getOrderShareCode(Integer orderId);
+    /**
+     * 分享订单,校验分享码
+     * @param orderId 订单Id
+     * @param userId 用户Id
+     * @param serviceProviderId 协销Id
+     * @param shareCode 分享码
+     * @param code 微信code
+     * @param encryptedData 微信加密数据
+     * @param iv 微信加密算法的初始向量
+     * @param headers HttpHeaders
+     */
+    ResponseJson<String> checkOrderShareCode(Integer orderId, Integer userId, Integer serviceProviderId, String shareCode, String code, String encryptedData, String iv, HttpHeaders headers);
 }

+ 12 - 1
src/main/java/com/caimei365/order/service/MessagePushService.java → src/main/java/com/caimei365/order/service/RemoteCallService.java

@@ -1,12 +1,14 @@
 package com.caimei365.order.service;
 
+import org.springframework.http.HttpHeaders;
+
 /**
  * 订单推送服务
  *
  * @author : Charles
  * @date : 2021/7/15
  */
-public interface MessagePushService {
+public interface RemoteCallService {
     /**
      * 生成短链接
      *
@@ -26,4 +28,13 @@ public interface MessagePushService {
      * @return
      */
     boolean getSendSms(int markId, String mobile, String content);
+
+    /**
+     * 微信小程序授权登录(调用user服务,发送服务间调用POST请求)
+     * @param code              微信code
+     * @param encryptedData     微信加密数据
+     * @param iv                微信加密算法的初始向量
+     * @param headers           HttpHeaders
+     */
+    String appletsAuthorization(String code, String encryptedData, String iv, HttpHeaders headers);
 }

+ 140 - 7
src/main/java/com/caimei365/order/service/impl/OrderClubServiceImpl.java

@@ -1,6 +1,7 @@
 package com.caimei365.order.service.impl;
 
 import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
 import com.caimei365.order.components.ProductService;
 import com.caimei365.order.mapper.BaseMapper;
 import com.caimei365.order.mapper.OrderClubMapper;
@@ -11,7 +12,7 @@ import com.caimei365.order.model.po.OrderPo;
 import com.caimei365.order.model.po.OrderProductPo;
 import com.caimei365.order.model.po.UserBeansHistoryPo;
 import com.caimei365.order.model.vo.*;
-import com.caimei365.order.service.MessagePushService;
+import com.caimei365.order.service.RemoteCallService;
 import com.caimei365.order.service.OrderClubService;
 import com.caimei365.order.utils.ImageUtil;
 import com.caimei365.order.utils.MathUtil;
@@ -19,9 +20,11 @@ import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
 import com.google.common.util.concurrent.AtomicDouble;
 import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang.RandomStringUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Value;
+import org.springframework.http.HttpHeaders;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
@@ -46,7 +49,7 @@ public class OrderClubServiceImpl implements OrderClubService {
     @Resource
     private ProductService productService;
     @Resource
-    private MessagePushService messagePushService;
+    private RemoteCallService remoteCallService;
     @Value("${caimei.wwwDomain}")
     private String domain;
 
@@ -495,10 +498,10 @@ public class OrderClubServiceImpl implements OrderClubService {
         //取消订单短信推送
         String bindMobile = baseMapper.getBindMobileByUserId(order.getUserId());
         if (StringUtils.isNotBlank(bindMobile)) {
-            String shortLink = messagePushService.getShortLink(8, 11, domain + "/user/order/detail.html?orderId=" + orderId);
+            String shortLink = remoteCallService.getShortLink(8, 11, domain + "/user/order/detail.html?orderId=" + orderId);
             String content = "您已成功取消订单(订单编号:" + order.getOrderNo() + "),订单金额¥" + order.getPayTotalFee() + "。您可关注采美公众号或者访问采美微信小程序和网站查看订单。" +
                     "平台公众号:微信搜索“采美365网”; 微信小程序:微信搜索“采美采购商城”;网址:www.caimei365.com/t/" + shortLink;
-            boolean sendSms = messagePushService.getSendSms(11, bindMobile, content);
+            boolean sendSms = remoteCallService.getSendSms(11, bindMobile, content);
             if (!sendSms) {
                 log.info("取消订单推送失败,orderId>>>>" + orderId);
             }
@@ -624,8 +627,8 @@ public class OrderClubServiceImpl implements OrderClubService {
      */
     @Override
     public ResponseJson<List<LogisticsBatchVo>> getOrderLogistics(Integer orderId) {
-        OrderPo order = orderClubMapper.getMainOrderByOrderId(orderId);
-        if (null == order) {
+        int orderCount = orderClubMapper.countMainOrderByOrderId(orderId);
+        if (0 == orderCount) {
             return ResponseJson.error("订单不存在!", null);
         }
         // 获取物流批次列表
@@ -659,4 +662,134 @@ public class OrderClubServiceImpl implements OrderClubService {
 
         return ResponseJson.success(batchList);
     }
+
+    /**
+     * 分享订单,获取分享码
+     *
+     * @param orderId 订单Id
+     */
+    @Override
+    public ResponseJson<String> getOrderShareCode(Integer orderId) {
+        int orderCount = orderClubMapper.countMainOrderByOrderId(orderId);
+        if (0 == orderCount) {
+            return ResponseJson.error("订单不存在!", null);
+        }
+        // 生成分享码
+        String shareCode = RandomStringUtils.random(4, false, true);
+        // 过期时间
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(new Date());
+        calendar.add(Calendar.DATE, 1);
+        // 获取数据库已有分享码
+        OrderShareCodeVo orderCodeVo = orderClubMapper.getOrderCodeById(orderId);
+        if (orderCodeVo != null && orderCodeVo.getExpiredTime().compareTo(new Date()) >= 0 ) {
+            // 旧分享码还未过期,直接返回
+            return ResponseJson.success(orderCodeVo.getShareCode());
+        } else if (orderCodeVo != null) {
+            // 如果旧分享码已经过期,删除分享码使用记录
+            orderClubMapper.deleteOrderShareCodeRecord(orderId);
+            // 更新数据库的分享码
+            orderCodeVo.setShareCode(shareCode);
+            orderCodeVo.setExpiredTime(calendar.getTime());
+            orderCodeVo.setDelFlag(0);
+            orderClubMapper.updateOrderShareCode(orderCodeVo);
+        } else {
+            // 如果没有分享记录,新增数据库的分享码
+            OrderShareCodeVo newShareCodeVo = new OrderShareCodeVo();
+            newShareCodeVo.setOrderId(orderId);
+            newShareCodeVo.setShareCode(shareCode);
+            newShareCodeVo.setExpiredTime(calendar.getTime());
+            newShareCodeVo.setAddTime(new Date());
+            newShareCodeVo.setDelFlag(0);
+            orderClubMapper.insertOrderShareCode(newShareCodeVo);
+        }
+        // 返回新生成的分享码
+        return ResponseJson.success(shareCode);
+    }
+
+    /**
+     * 分享订单,校验分享码
+     *
+     * @param orderId           订单Id
+     * @param userId            用户Id
+     * @param serviceProviderId 协销Id
+     * @param shareCode         分享码
+     * @param code              微信code
+     * @param encryptedData     微信加密数据
+     * @param iv                微信加密算法的初始向量
+     * @param headers           HttpHeaders
+     */
+    @Override
+    public ResponseJson<String> checkOrderShareCode(Integer orderId, Integer userId, Integer serviceProviderId, String shareCode, String code, String encryptedData, String iv, HttpHeaders headers) {
+        int orderCount = orderClubMapper.countMainOrderByOrderId(orderId);
+        if (0 == orderCount) {
+            return ResponseJson.error("订单不存在!", null);
+        }
+        // 微信小程序授权登录(调用user服务,发送服务间调用POST请求)
+        String loginData = remoteCallService.appletsAuthorization(code, encryptedData, iv, headers);
+        if (StringUtils.isEmpty(loginData)){
+            return ResponseJson.error("微信授权登录异常!", null);
+        }
+        // 解析登录后得到 userIdentity,  openId等
+        JSONObject userInfo = JSONObject.parseObject(loginData);
+        String openId = userInfo.getString("openId");
+        if (StringUtils.isEmpty(openId)) {
+            return ResponseJson.error("微信授权登录异常!", null);
+        }
+        // 用户身份: 1协销 2会员机构 3供应商 4普通机构
+        Integer userIdentity = userInfo.getInteger("userIdentity");
+        Integer loginUserId = userInfo.getInteger("userId");
+        Integer loginSpId = userInfo.getInteger("serviceProviderId");
+        // 协销身份
+        boolean spFlag = (null != userIdentity && 1 == userIdentity);
+        // 机构身份
+        boolean clubFlag = (null != userIdentity && (2 == userIdentity || 4 ==userIdentity));
+        if (spFlag) {
+            if (null != serviceProviderId && serviceProviderId.equals(loginSpId)) {
+                // 该机构的协销
+                return ResponseJson.success(2, "该机构的协销查看分享订单!", loginData);
+            } else {
+                // 非该机构协销(游客)
+                return ResponseJson.success(0,"非该机构协销查看分享订单!", null);
+            }
+        } else if (clubFlag && userId.equals(loginUserId)) {
+            // 该机构的运营人员, 旧接口返回  0,true
+            return ResponseJson.success(1, "该机构的运营人员查看分享订单!", loginData);
+        }
+        /*
+         * 其他按游客权限处理
+         */
+        // 根据openId统计数据库内是否有有效分享码
+        int codeCount = orderClubMapper.countShareCodeRecord(orderId, openId);
+        if (codeCount > 0) {
+            // 游客权限
+            return ResponseJson.success(0,"游客权限查看分享订单!", null);
+        }
+        // 根据订单Id获取分享码
+        OrderShareCodeVo orderCodeVo = orderClubMapper.getOrderCodeById(orderId);
+        if (null == orderCodeVo) {
+            return ResponseJson.error("该订单没有生成分享码!", null);
+        }
+        // 校验分享码
+        if (orderCodeVo.getShareCode().equals(shareCode)){
+            if (orderCodeVo.getExpiredTime().compareTo(new Date()) > 0) {
+                // 分享码有效, 保存分享码使用记录
+                OrderShareCodeRecordVo codeRecord = new OrderShareCodeRecordVo();
+                codeRecord.setOpenId(openId);
+                codeRecord.setAddTime(new Date());
+                codeRecord.setOrderId(orderCodeVo.getOrderId());
+                codeRecord.setDelFlag(0);
+                codeRecord.setShareCodeId(orderCodeVo.getId());
+                orderClubMapper.insertOrderShareCodeRecord(codeRecord);
+                // 返回
+                return ResponseJson.success(0,"游客权限查看分享订单!", null);
+            } else {
+                // 分享码过期
+                return ResponseJson.error("分享码已失效!", null);
+            }
+        } else {
+            return ResponseJson.error("分享码不正确!", null);
+        }
+    }
+
 }

+ 41 - 2
src/main/java/com/caimei365/order/service/impl/MessagePushServiceImpl.java → src/main/java/com/caimei365/order/service/impl/RemoteCallServiceImpl.java

@@ -2,12 +2,13 @@ package com.caimei365.order.service.impl;
 
 import com.alibaba.fastjson.JSONObject;
 import com.caimei365.order.mapper.MessagePushMapper;
-import com.caimei365.order.service.MessagePushService;
+import com.caimei365.order.service.RemoteCallService;
 import com.caimei365.order.utils.CodeUtil;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
+import org.springframework.http.HttpHeaders;
 import org.springframework.http.MediaType;
 import org.springframework.stereotype.Service;
 import org.springframework.util.LinkedMultiValueMap;
@@ -20,6 +21,7 @@ import javax.annotation.Resource;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicReference;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
@@ -31,7 +33,7 @@ import java.util.regex.Pattern;
  */
 @Slf4j
 @Service
-public class MessagePushServiceImpl implements MessagePushService {
+public class RemoteCallServiceImpl implements RemoteCallService {
     @Value("${spring.cloud.config.profile}")
     private String profile;
     @Resource
@@ -108,4 +110,41 @@ public class MessagePushServiceImpl implements MessagePushService {
         }
         return returnValue.get();
     }
+
+    /**
+     * 微信小程序授权登录(调用user服务,发送服务间调用POST请求)
+     *
+     * @param code          微信code
+     * @param encryptedData 微信加密数据
+     * @param iv            微信加密算法的初始向量
+     * @param headers       HttpHeaders
+     */
+    @Override
+    public String appletsAuthorization(String code, String encryptedData, String iv, HttpHeaders headers) {
+        AtomicReference<String> resultData = new AtomicReference<>("");
+        // 获取当前微信小程序的环境
+        String referer = headers.getFirst("Referer");
+        //提交参数设置
+        MultiValueMap<String, String> map = new LinkedMultiValueMap<>();
+        map.add("code", code);
+        map.add("encryptedData", encryptedData);
+        map.add("iv", iv);
+        // 发送服务间调用POST请求
+        Mono<String> result = webClientBuilder.defaultHeader("Referer", referer).build()
+                .post()
+                .uri("http://CAIMEI365-CLOUD-USER/user/login/auth/applets")
+                .contentType(MediaType.APPLICATION_FORM_URLENCODED)
+                .body(BodyInserters.fromFormData(map))
+                .retrieve()
+                .bodyToMono(String.class);
+        result.subscribe(log::info);
+        result.subscribe(jsonStr -> {
+            JSONObject parseObject = JSONObject.parseObject(jsonStr);
+            if (0 == parseObject.getInteger("code")){
+                // 登录成功
+                resultData.set(parseObject.getString("data"));
+            }
+        });
+        return resultData.get();
+    }
 }

+ 4 - 4
src/main/java/com/caimei365/order/service/impl/SubmitServiceImpl.java

@@ -12,7 +12,7 @@ import com.caimei365.order.model.po.*;
 import com.caimei365.order.model.dto.SubmitDto;
 import com.caimei365.order.model.bo.OrderParamBo;
 import com.caimei365.order.model.vo.*;
-import com.caimei365.order.service.MessagePushService;
+import com.caimei365.order.service.RemoteCallService;
 import com.caimei365.order.service.SubmitService;
 import com.caimei365.order.utils.CodeUtil;
 import com.caimei365.order.utils.ImageUtil;
@@ -58,7 +58,7 @@ public class SubmitServiceImpl implements SubmitService {
     @Resource
     private CartSellerMapper cartSellerMapper;
     @Resource
-    private MessagePushService messagePushService;
+    private RemoteCallService remoteCallService;
     /**
      * 生成订单
      *
@@ -1204,14 +1204,14 @@ public class SubmitServiceImpl implements SubmitService {
          * 下单推送
          */
         if (StringUtils.isNotBlank(orderParamBo.getBindMobile())) {
-            String shortLink = messagePushService.getShortLink(8, 3, domain + "/user/order/detail.html?orderId=" + mainOrder.getOrderId());
+            String shortLink = remoteCallService.getShortLink(8, 3, domain + "/user/order/detail.html?orderId=" + mainOrder.getOrderId());
             String name = orderProductList.get(0).getName();
             if (name.length() > 10) {
                 name = name.substring(0, 10);
             }
             String content = "您已成功下单“" + name + "...”等" + mainOrder.getProductCount() + "件商品,订单编号:" + mainOrder.getOrderNo() + ",订单等待支付,支付完成后采美将尽快安排发货。" +
                     "您可关注采美公众号或者访问采美微信小程序和网站查看并支付订单。平台公众号:微信搜索“采美365网”; 微信小程序:微信搜索“采美采购商城”;网址:www.caimei365.com/t/" + shortLink;
-            boolean sendSms = messagePushService.getSendSms(3, orderParamBo.getBindMobile(), content);
+            boolean sendSms = remoteCallService.getSendSms(3, orderParamBo.getBindMobile(), content);
             if (!sendSms) {
                 log.info("下单推送失败,orderId>>>>" + mainOrder.getOrderId());
             }

+ 39 - 0
src/main/resources/mapper/OrderClubMapper.xml

@@ -95,6 +95,11 @@
             delFlag = #{delFlag}
         WHERE id = #{id}
     </update>
+    <update id="updateOrderShareCode">
+        UPDATE cm_mall_order_share_code
+        SET shareCode = #{shareCode}, expiredTime = #{expiredTime}, delFlag = #{delFlag}
+        WHERE orderID = #{orderId}
+    </update>
     <delete id="deleteSearchHistoryLimit">
         DELETE FROM user_order_history
         WHERE userId=#{userId}
@@ -105,10 +110,24 @@
     <delete id="deleteOrderSearchHistory">
         DELETE FROM user_order_history WHERE userId=#{userId}
     </delete>
+    <delete id="deleteOrderShareCodeRecord">
+        DELETE FROM cm_mall_share_code_record WHERE orderID = #{orderId}
+    </delete>
     <insert id="insertSearchHistory">
         INSERT INTO user_order_history (userId, searchWord, searchDate, delFlag)
         VALUES (#{userId}, #{searchWord}, #{searchDate}, #{delFlag})
     </insert>
+    <insert id="insertOrderShareCode">
+        INSERT INTO cm_mall_order_share_code (orderID, shareCode, addTime, expiredTime, delFlag)
+        VALUES (#{orderId}, #{shareCode}, #{addTime}, #{expiredTime}, #{delFlag})
+    </insert>
+    <insert id="insertOrderShareCodeRecord">
+        INSERT INTO cm_mall_share_code_record (openid, orderID, shareCodeId, addTime, delFlag)
+        VALUES (#{openId}, #{orderId}, #{shareCodeId}, #{addTime}, #{delFlag})
+    </insert>
+    <select id="countMainOrderByOrderId" resultType="java.lang.Integer">
+        SELECT COUNT(*) FROM cm_order WHERE orderID = #{orderId}
+    </select>
     <select id="getMainOrderByOrderId" resultType="com.caimei365.order.model.po.OrderPo">
         SELECT
             orderSource,
@@ -644,5 +663,25 @@
             li.remarks
             WHERE li.logisticsBatchID = #{logisticsBatchId}
     </select>
+    <select id="getOrderCodeById" resultType="com.caimei365.order.model.vo.OrderShareCodeVo">
+        SELECT
+            id,
+            orderID,
+            shareCode,
+            addTime,
+            expiredTime,
+            delFlag
+        FROM cm_mall_order_share_code
+        WHERE orderID = #{orderId} AND delFlag = '0'
+        LIMIT 1
+    </select>
+    <select id="countShareCodeRecord" resultType="java.lang.Integer">
+        SELECT COUNT(*)
+        FROM cm_mall_share_code_record scr
+        LEFT JOIN cm_mall_order_share_code osc ON scr.shareCodeId = osc.id
+        WHERE scr.openid = #{openId} AND osc.orderID = #{orderId}
+        AND scr.delFlag = '0' AND osc.expiredTime > NOW()
+    </select>
+
 
 </mapper>