Browse Source

小程序分享发货-分享权限控制

chao 3 năm trước cách đây
mục cha
commit
13b6dbe0aa

+ 29 - 0
src/main/java/com/caimei365/order/controller/ShipApi.java

@@ -10,6 +10,7 @@ import com.github.pagehelper.PageInfo;
 import io.swagger.annotations.*;
 import lombok.RequiredArgsConstructor;
 import org.apache.commons.lang3.StringUtils;
+import org.springframework.http.HttpHeaders;
 import org.springframework.web.bind.annotation.*;
 
 import java.util.List;
@@ -222,6 +223,34 @@ public class ShipApi {
         return shipService.deleteLogisticsInfo(logisticsBatchId);
     }
 
+    /**
+     * 小程序分享发货-分享权限控制
+     */
+    @ApiOperation("小程序分享发货-分享权限控制(旧:/supplier/miniShipments)")
+    @ApiImplicitParams({
+            @ApiImplicitParam(required = false, name = "source", value = "来源:1:客服扫码,2:供应商运营人员查看,3:分享码查看"),
+            @ApiImplicitParam(required = false, name = "shopOrderId", 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<Map<String, Object>> checkShipShareCode( Integer source, Integer shopOrderId, String shareCode, String code, String encryptedData, String iv, @RequestHeader HttpHeaders headers) {
+        if (null == source) {
+            return ResponseJson.error("来源不能为空!", null);
+        }
+        if (null == shopOrderId) {
+            return ResponseJson.error("子订单Id不能为空!", null);
+        }
+        if (StringUtils.isEmpty(code)) {
+            return ResponseJson.error("微信code不能为空!", null);
+        }
+        return shipService.checkShipShareCode(source, shopOrderId, shareCode, code, encryptedData, iv, headers);
+    }
+
+
+
 
 
 }

+ 20 - 1
src/main/java/com/caimei365/order/mapper/ShipMapper.java

@@ -125,5 +125,24 @@ public interface ShipMapper {
      * @param shopOrderId 子订单Id
      */
     List<PayShopRecordPo> getPayShopRecordList(Integer shopOrderId);
-
+    /**
+     * 获取客服名称
+     */
+    String getConsignmentName(String openId);
+    /**
+     * 子订单所属供应商Id
+     */
+    Integer getShopIdByShopOrderId(Integer shopOrderId);
+    /**
+     * 采美供应商发货分享码使用记录Id
+     */
+    Integer getConsignmentShareRecordId(String openId, Integer shopOrderId);
+    /**
+     * 采美供应商发货分享码
+     */
+    OrderShareCodeVo getConsignmentShare(String shareCode, Integer shopOrderId);
+    /**
+     * 保存发货分享码使用记录
+     */
+    void insertConsignmentShareRecord(OrderShareCodeRecordVo codeRecord);
 }

+ 12 - 3
src/main/java/com/caimei365/order/service/ShipService.java

@@ -6,6 +6,7 @@ import com.caimei365.order.model.dto.LogisticsDto;
 import com.caimei365.order.model.vo.CompanyVo;
 import com.caimei365.order.model.vo.ShopOrderVo;
 import com.github.pagehelper.PageInfo;
+import org.springframework.http.HttpHeaders;
 
 import java.util.List;
 import java.util.Map;
@@ -101,7 +102,15 @@ public interface ShipService {
      * @param logisticsInfoId  发货物流信息Id
      */
     ResponseJson<Void> deleteLogisticsInfo(Integer logisticsInfoId);
-
-
-
+    /**
+     * 小程序分享发货-分享权限控制
+     * @param source 来源:1:客服扫码,2:供应商运营人员查看,3:分享码查看
+     * @param shopOrderId 子订单Id
+     * @param shareCode 分享码
+     * @param code 微信code
+     * @param encryptedData 微信加密数据
+     * @param iv 微信加密算法的初始向量
+     * @param headers HttpHeaders
+     */
+    ResponseJson<Map<String, Object>> checkShipShareCode(Integer source, Integer shopOrderId, String shareCode, String code, String encryptedData, String iv, HttpHeaders headers);
 }

+ 88 - 1
src/main/java/com/caimei365/order/service/impl/ShipServiceImpl.java

@@ -22,6 +22,7 @@ import com.github.pagehelper.PageInfo;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang.StringUtils;
 import org.springframework.beans.factory.annotation.Value;
+import org.springframework.http.HttpHeaders;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.interceptor.TransactionAspectSupport;
 import org.springframework.util.CollectionUtils;
@@ -635,7 +636,93 @@ public class ShipServiceImpl implements ShipService {
         return ResponseJson.success(null);
     }
 
-
+    /**
+     * 小程序分享发货-分享权限控制
+     *
+     * @param source        来源:1:客服扫码,2:供应商运营人员查看,3:分享码查看
+     * @param shopOrderId   子订单Id
+     * @param shareCode     分享码
+     * @param code          微信code
+     * @param encryptedData 微信加密数据
+     * @param iv            微信加密算法的初始向量
+     * @param headers       HttpHeaders
+     */
+    @Override
+    public ResponseJson<Map<String, Object>> checkShipShareCode(Integer source, Integer shopOrderId, String shareCode, String code, String encryptedData, String iv, HttpHeaders headers) {
+        // 微信小程序授权登录(调用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);
+        }
+        Map<String, Object> resultMap = new HashMap<>();
+        resultMap.put("shopOrderId", shopOrderId);
+        if (1 == source) {
+            // 客服扫码进入
+            String name = shipMapper.getConsignmentName(openId);
+            if (StringUtils.isBlank(name)) {
+                return ResponseJson.error("暂无权限查看", null);
+            }
+            log.info("小程序发货,客服登入>>>>>>" + name);
+            resultMap.put("resultCode", 1);
+            return ResponseJson.success("客服权限", resultMap);
+        }
+        // 用户身份: 1协销 2会员机构 3供应商 4普通机构
+        Integer userIdentity = userInfo.getInteger("userIdentity");
+        Integer loginShopId = userInfo.getInteger("shopId");
+        // 供应商身份
+        boolean shopFlag = (null != userIdentity && 3 == userIdentity);
+        // 子订单所属供应商Id
+        Integer dbShopId = shipMapper.getShopIdByShopOrderId(shopOrderId);
+        if (shopFlag && loginShopId.equals(dbShopId)) {
+            // 供应商进入
+            resultMap.put("resultCode", 2);
+            return ResponseJson.success("供应商运营人员权限", resultMap);
+        }
+        if (2 == source) {
+            resultMap.put("resultCode", 2);
+            Integer loginUserId = userInfo.getInteger("userId");
+            String unionId = userInfo.getString("unionId");
+            resultMap.put("shopId", loginShopId);
+            resultMap.put("openid", openId);
+            resultMap.put("unionId", unionId);
+            resultMap.put("userId", loginUserId);
+            return ResponseJson.error(-1, "绑定供应商运营人员", resultMap);
+        } else {
+            // 分享码进入
+            resultMap.put("resultCode", 3);
+            // 获取采美供应商发货分享码使用记录
+            Integer shareCodeRecordId = shipMapper.getConsignmentShareRecordId(openId, shopOrderId);
+            if (null != shareCodeRecordId && shareCodeRecordId > 0) {
+                return ResponseJson.success("分享码人员权限", resultMap);
+            }
+            if (StringUtils.isBlank(shareCode)) {
+                return ResponseJson.error("请联系分享人获取分享码", null);
+            }
+            OrderShareCodeVo orderCodeVo = shipMapper.getConsignmentShare(shareCode, shopOrderId);
+            Date date = new Date();
+            if (null == orderCodeVo) {
+                return ResponseJson.error("分享码错误", null);
+            } else if (orderCodeVo.getExpiredTime().compareTo(date) < 0) {
+                return ResponseJson.error("分享码已失效", null);
+            } else {
+                // 分享码有效, 保存分享码使用记录
+                OrderShareCodeRecordVo codeRecord = new OrderShareCodeRecordVo();
+                codeRecord.setOpenId(openId);
+                codeRecord.setAddTime(date);
+                codeRecord.setOrderId(shopOrderId);
+                codeRecord.setDelFlag(0);
+                codeRecord.setShareCodeId(orderCodeVo.getId());
+                shipMapper.insertConsignmentShareRecord(codeRecord);
+                return ResponseJson.success("分享码人员权限", resultMap);
+            }
+        }
+    }
 
 
 }

+ 29 - 0
src/main/resources/mapper/ShipMapper.xml

@@ -15,6 +15,10 @@
         INSERT INTO logistics_information (logisticsBatchID, type, shopOrderID, orderID, nu, logisticsCompanyName, logisticsCompanyCode, shopID, updateDate)
         VALUES (#{logisticsBatchId}, #{type}, #{shopOrderId}, #{orderId}, #{nu}, #{logisticsCompanyName}, #{logisticsCompanyCode}, #{shopId}, #{updateDate})
     </insert>
+    <insert id="insertConsignmentShareRecord">
+        INSERT INTO cm_shop_consignment_share_code_record (openid, shopOrderID, shareCodeId, addTime, delFlag)
+        VALUES (#{openId}, #{orderId}, #{shareCodeId}, #{addTime}, #{delFlag})
+    </insert>
     <update id="updateNotOutStore">
         UPDATE cm_order_product SET notOutStore = #{notOutStore} WHERE orderProductID = #{orderProductId}
     </update>
@@ -248,4 +252,29 @@
         AND shopOrderID = #{shopOrderId}
         ORDER BY payTime desc
     </select>
+    <select id="getConsignmentName" resultType="java.lang.String">
+        SELECT name FROM cm_authorized_consignment WHERE openid = #{openId} AND STATUS='0'
+    </select>
+    <select id="getShopIdByShopOrderId" resultType="java.lang.Integer">
+        SELECT shopID FROM cm_shop_order
+        WHERE shopOrderID = #{shopOrderId} AND delFlag = '0'
+    </select>
+    <select id="getConsignmentShareRecordId" resultType="java.lang.Integer">
+        SELECT id
+        FROM cm_shop_consignment_share_code_record
+        WHERE openid = #{openId} AND shopOrderID = #{shopOrderId} AND delFlag='0'
+    </select>
+    <select id="getConsignmentShare" resultType="com.caimei365.order.model.vo.OrderShareCodeVo">
+        SELECT
+            id,
+            shopOrderID AS orderId,
+            shareCode,
+            addTime,
+            expiredTime,
+            delFlag
+        FROM
+        cm_shop_consignment_share_code
+        WHERE shopOrderID = #{shopOrderId} AND shareCode = #{shareCode}
+        AND delFlag = '0'
+    </select>
 </mapper>