zangbin 3 سال پیش
والد
کامیت
cdcd6329e8
28فایلهای تغییر یافته به همراه918 افزوده شده و 9 حذف شده
  1. 80 0
      lb-app/src/main/java/com/ydd/app/ShopEditUtils.java
  2. 88 0
      lb-app/src/main/java/com/ydd/app/ShopEntityUtils.java
  3. 46 0
      lb-app/src/main/java/com/ydd/app/callback/controller/ShunfengDeliveryCallback.java
  4. 44 0
      lb-app/src/main/java/com/ydd/app/controller/DeliveryBindApi.java
  5. 56 0
      lb-app/src/main/java/com/ydd/app/controller/DeliveryRechargeApi.java
  6. 4 0
      lb-app/src/main/java/com/ydd/app/dto/ShopReq.java
  7. 25 0
      lb-app/src/main/java/com/ydd/app/service/ApiDeliveryBindService.java
  8. 21 0
      lb-app/src/main/java/com/ydd/app/service/ApiDeliveryRechargeService.java
  9. 186 8
      lb-app/src/main/java/com/ydd/app/service/impl/ApiDeliveryBindServiceImpl.java
  10. 101 0
      lb-app/src/main/java/com/ydd/app/service/impl/ApiDeliveryRechargeServiceImpl.java
  11. 3 1
      lb-feginclient/src/main/java/com/ydd/api/DeliveryCallbackApi.java
  12. 3 0
      lb-feginclient/src/main/java/com/ydd/api/DeliveryService.java
  13. 2 0
      lb-module/src/main/java/com/ydd/module/domain/Merchant.java
  14. 3 0
      lb-module/src/main/java/com/ydd/module/domain/Shop.java
  15. 16 0
      lb-module/src/main/java/com/ydd/module/dto/ShopDeliveryBindDto.java
  16. 2 0
      lb-module/src/main/java/com/ydd/module/mapper/ShopDeliveryBindMapper.java
  17. 7 0
      lb-module/src/main/java/com/ydd/module/service/IShopDeliveryBindService.java
  18. 5 0
      lb-module/src/main/java/com/ydd/module/service/impl/ShopDeliveryBindServiceImpl.java
  19. 22 0
      lb-module/src/main/resources/mapper/module/ShopDeliveryBindMapper.xml
  20. 3 0
      lb-third/lb-third-common/src/main/java/com/ydd/third/common/config/DeliveryConfig.java
  21. 50 0
      lb-third/lb-third-common/src/main/java/com/ydd/third/common/vo/callback/ShunfengCallbackShopVo.java
  22. 28 0
      lb-third/lb-third-common/src/main/java/com/ydd/third/common/vo/shop/ShopVo.java
  23. 10 0
      lb-third/lb-third-delivery/src/main/java/com/ydd/third/controller/DeliveryCallController.java
  24. 8 0
      lb-third/lb-third-delivery/src/main/java/com/ydd/third/controller/DeliveryController.java
  25. 25 0
      lb-third/lb-third-delivery/src/main/java/com/ydd/third/delivery/shunfeng/ShunfengCallback.java
  26. 29 0
      lb-third/lb-third-delivery/src/main/java/com/ydd/third/delivery/shunfeng/ShunfengClient.java
  27. 19 0
      lb-third/lb-third-delivery/src/main/java/com/ydd/third/delivery/shunfeng/constant/RequestConstant.java
  28. 32 0
      lb-third/lb-third-delivery/src/main/java/com/ydd/third/delivery/shunfeng/request/MerchantRechargeRequest.java

+ 80 - 0
lb-app/src/main/java/com/ydd/app/ShopEditUtils.java

@@ -208,7 +208,87 @@ public class ShopEditUtils {
             shopVo.setOperationType(2);
         }else if (DeliveryTypeEnums.SHUN_FENG.getType().equals(delivery.getType())){
             shopVo.setLbClient(DeliveryTypeEnums.SHUN_FENG.getName());
+            /**
+             * 门店名称
+             * 顺丰:storeName门店名称,店铺名称
+             * */
+            shopVo.setShopName(shop.getName());
+
+            /**
+             * 门店编码
+             * 顺丰
+             * 顺丰:out_shop_id,必传,第三⽅店铺id
+             */
+            shopVo.setShopId(shop.getCode());
+
+            /**
+             * 城市名称
+             * 顺丰:city_name 必传,城市名称
+             */
+            shopVo.setCityName(shop.getCityName());
 
+            /**
+             * 业务类型
+             * 顺丰:shop_product_type,必传,店铺经营类型
+             * 1:快餐 2:药品 3:百货 4:脏⾐服收 5:⼲净⾐服派 6:⽣鲜 8:⾼端饮品 9:现场勘验 10:快递 12:⽂件 13:蛋糕 14:鲜花 15:数码 16:服装 17:汽配 18:珠宝 20:披萨 21:中餐
+             * 22:⽔产 27:专⼈直送 32:中端饮品 33:便利店 34:⾯包糕点 35:⽕锅 36:证照 40:烧烤⼩⻰虾 41:外部落地配 47:烟酒⾏ 48:成⼈⽤品 99:其他
+             */
+            shopVo.setBusiness(merchant.getSfProductType());
+
+            /**
+             * 门店地址
+             * 顺丰:shop_address 必传,门店地址
+             */
+            shopVo.setShopAddress(poiAddress + shop.getAddress() + shop.getStreet());
+
+            /**
+             *门店经度
+             * 顺丰:longitude 必传,门店经度
+             *
+             */
+            shopVo.setShopLng(new BigDecimal(shop.getLng()));
+
+            /**
+             * 门店纬度
+             * 顺丰:latitude,必传,门店纬度
+             */
+            shopVo.setShopLat(new BigDecimal(shop.getLat()));
+
+            /**
+             * 联系人姓名
+             * 顺丰: shop_contact _name 必传 店铺联系人
+             */
+            shopVo.setContactName(shop.getContactName());
+
+            /**
+             * 联系人电话
+             * 顺丰:shop_contact_phone 必传,店铺联系人电话
+             */
+            shopVo.setContactPhone(shop.getMobile());
+
+            /**
+             * 负责人姓名
+             * 顺丰: account_contact_name 必传 负责人姓名
+             */
+            shopVo.setAccountContactName(shop.getLegalPerson());
+
+            /**
+             * 负责人联系电话
+             * 顺丰:shop_contact_phone 必传,负责人联系电话
+             */
+            shopVo.setAccountContactPhone(shop.getAccountContactPhone());
+
+            /**
+             * 负责人身份证号
+             * 顺丰:account_id_card 必传 负责人身份证号
+             */
+            shopVo.setAccountIdCard(shop.getIdcardNo());
+
+            /**
+             * 营业执照
+             * 顺丰:businessLicense 必传 营业执照
+             */
+            shopVo.setBusinessLicense(shop.getBizLicense());
         } else if (DeliveryTypeEnums.MEI_TUAN_ZB.getType().equals(delivery.getType())) {
             shopVo.setLbClient(DeliveryTypeEnums.MEI_TUAN_ZB.getName());
 

+ 88 - 0
lb-app/src/main/java/com/ydd/app/ShopEntityUtils.java

@@ -178,6 +178,94 @@ public class ShopEntityUtils {
         } else if (DeliveryTypeEnums.SHUN_FENG.getType().equals(delivery.getType())) {
             shopVo.setLbClient(DeliveryTypeEnums.SHUN_FENG.getName());
 
+            /**
+             * 门店名称
+             * 顺丰:storeName门店名称,店铺名称
+             * */
+            shopVo.setShopName(shop.getName());
+
+            /**
+             * 门店编码
+             * 顺丰
+             * 顺丰:out_shop_id,必传,第三⽅店铺id
+             */
+            shopVo.setShopId(shop.getCode());
+
+            /**
+             * 城市名称
+             * 顺丰:city_name 必传,城市名称
+             */
+            shopVo.setCityName(shop.getCityName());
+
+            /**
+             * 业务类型
+             * 顺丰:shop_product_type,必传,店铺经营类型
+             * 1:快餐 2:药品 3:百货 4:脏⾐服收 5:⼲净⾐服派 6:⽣鲜 8:⾼端饮品 9:现场勘验 10:快递 12:⽂件 13:蛋糕 14:鲜花 15:数码 16:服装 17:汽配 18:珠宝 20:披萨 21:中餐
+             * 22:⽔产 27:专⼈直送 32:中端饮品 33:便利店 34:⾯包糕点 35:⽕锅 36:证照 40:烧烤⼩⻰虾 41:外部落地配 47:烟酒⾏ 48:成⼈⽤品 99:其他
+             */
+            shopVo.setBusiness(merchant.getSfProductType());
+
+            /**
+             * 门店地址
+             * 顺丰:shop_address 必传,门店地址
+             */
+            shopVo.setShopAddress(poiAddress + shop.getAddress() + shop.getStreet());
+
+            /**
+             *门店经度
+             * 顺丰:longitude 必传,门店经度
+             *
+             */
+            shopVo.setShopLng(new BigDecimal(shop.getLng()));
+
+            /**
+             * 门店纬度
+             * 顺丰:latitude,必传,门店纬度
+             */
+            shopVo.setShopLat(new BigDecimal(shop.getLat()));
+
+            /**
+             * 联系人姓名
+             * 顺丰: shop_contact _name 必传 店铺联系人
+             */
+            shopVo.setContactName(shop.getContactName());
+
+            /**
+             * 联系人电话
+             * 顺丰:shop_contact_phone 必传,店铺联系人电话
+             */
+            shopVo.setContactPhone(shop.getMobile());
+
+            /**
+             * 负责人姓名
+             * 顺丰: account_contact_name 必传 负责人姓名
+             */
+            shopVo.setAccountContactName(shop.getLegalPerson());
+
+            /**
+             * 负责人联系电话
+             * 顺丰:shop_contact_phone 必传,负责人联系电话
+             */
+            shopVo.setAccountContactPhone(shop.getDirectorMobile());
+
+            /**
+             * 负责人身份证号
+             * 顺丰:account_id_card 必传 负责人身份证号
+             */
+            shopVo.setAccountIdCard(shop.getIdcardNo());
+
+            /**
+             * 营业执照
+             * 顺丰:businessLicense 必传 营业执照
+             */
+            shopVo.setBusinessLicense(shop.getBizLicense());
+
+            /**
+             * 卫生许可证
+             * 顺丰:health_permits 非必传 卫生许可证
+             */
+            shopVo.setFoodLicensePicHash(shop.getFoodLicensePic());
+
         } else if (DeliveryTypeEnums.MEI_TUAN_ZB.getType().equals(delivery.getType())) {
             shopVo.setLbClient(DeliveryTypeEnums.MEI_TUAN_ZB.getName());
 

+ 46 - 0
lb-app/src/main/java/com/ydd/app/callback/controller/ShunfengDeliveryCallback.java

@@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.ydd.api.DeliveryCallbackApi;
+import com.ydd.app.service.ApiDeliveryBindService;
 import com.ydd.app.service.ApiOrderBackService;
 import com.ydd.app.service.impl.ApiCallBackContent;
 import com.ydd.app.service.impl.ApiCallBackShunFeng;
@@ -16,6 +17,7 @@ import com.ydd.third.common.vo.ResObject;
 import com.ydd.third.common.vo.callback.CallBackOrderVo;
 import com.ydd.third.common.vo.callback.MeituanCallbackOrderVo;
 import com.ydd.third.common.vo.callback.ShunfengCallbackOrderVo;
+import com.ydd.third.common.vo.callback.ShunfengCallbackShopVo;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.PostMapping;
@@ -39,6 +41,9 @@ public class ShunfengDeliveryCallback {
     @Resource
     private IOrderDeliveryService iOrderDeliveryService;
 
+    @Resource
+    private ApiDeliveryBindService apiDeliveryBindService;
+
     @PostMapping("/doOrder")
     public String doOrder(HttpServletRequest request, @RequestBody JSONObject jsonParam){
         log.info("顺丰回调参数:"+jsonParam.toJSONString());
@@ -130,4 +135,45 @@ public class ShunfengDeliveryCallback {
         return res.toJSONString();
     }
 
+    /**
+     * 顺丰异步通知建店回调
+     * @param jsonParam
+     */
+    @RequestMapping("/doAuth")
+    public String doAuth(HttpServletRequest request, @RequestBody JSONObject jsonParam) {
+        log.info("顺丰建店回调参数----->>>>>>" + jsonParam.toJSONString());
+         JSONObject res = new JSONObject();
+        String sign = request.getParameter("sign");
+        if (StringUtils.isBlank(sign)) {
+            res.put("error_code",1);
+            res.put("error_msg","fail");
+            log.error("sign签名为空");
+            return res.toJSONString();
+        }
+        if (null == jsonParam) {
+            res.put("error_code",1);
+            res.put("error_msg","fail");
+            log.error("json参数为空");
+
+            return res.toJSONString();
+        }
+
+        ResObject<ShunfengCallbackShopVo> callbackRes = callback.sfAuth(sign, jsonParam);
+        if (callbackRes.getCode() == 0) {
+            ShunfengCallbackShopVo shopVo = callbackRes.getData();
+            apiDeliveryBindService.bindShunfeng(shopVo.getOutShopId(), shopVo.getShopId(), DeliveryTypeEnums.SHUN_FENG.getType());
+            /**
+             * 对返数的数据作处理
+             */
+            res.put ("error_code",0);
+            res.put("error_msg","success");
+        }else {
+            res.put("error_code",1);
+            res.put("error_msg","fail");
+            String failReason = jsonParam.getString("fail_reason");
+            log.error(failReason);
+        }
+        return res.toJSONString();
+    }
+
 }

+ 44 - 0
lb-app/src/main/java/com/ydd/app/controller/DeliveryBindApi.java

@@ -8,11 +8,14 @@ import com.ydd.common.core.controller.BaseController;
 import com.ydd.common.core.domain.BaseResult;
 import com.ydd.common.utils.ip.IpUtils;
 import com.ydd.module.domain.Member;
+import com.ydd.module.domain.Shop;
 import com.ydd.module.dto.ShopBindDto;
 import com.ydd.module.dto.ShopDeliveryBindDto;
 import com.ydd.module.dto.UpdateDadaShopNoDto;
 import com.ydd.third.common.dto.AiptUnBindDto;
 import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiOperation;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
@@ -134,4 +137,45 @@ public class DeliveryBindApi extends BaseController {
         return "Success".equals(dto.getState()) ? BaseResult.success() : BaseResult.error(dto.getInfo());
     }
 
+    @ApiOperation("顺丰-门店绑定")
+    @RequestMapping(value = "/sfBind", method = RequestMethod.POST)
+    @AccessToken
+    @ControllerLog("顺丰-门店绑定")
+    @RepeatSubmit
+    @ApiImplicitParams({
+            @ApiImplicitParam(required = true, paramType = "query", name = "shopId", value = "猎豹门店ID"),
+            @ApiImplicitParam(required = true, paramType = "query", name = "accountContactName", value = "负责人姓名,需保证和营业执照上的经营者姓名⼀致(否则三要素校验会失败)"),
+            @ApiImplicitParam(required = true, paramType = "query", name = "accountContactPhone", value = "负责人联系电话,建店唯⼀标识,⼀个⼿机号只能建⼀个店铺"),
+            @ApiImplicitParam(required = true, paramType = "query", name = "accountIdCard", value = "负责人身份证号,需保证和营业执照上的经营者姓名⼀致(否则三要素校验会失败)"),
+            @ApiImplicitParam(required = true, paramType = "query", name = "businessLicense", value = "营业执照"),
+            @ApiImplicitParam(required = false, paramType = "query", name = "healthPermits", value = "食品许可证")
+    })
+    public BaseResult sfBind(@RequestParam("shopId") Long shopId,
+                             @RequestParam("accountContactName") String accountContactName,
+                             @RequestParam("accountContactPhone") String accountContactPhone,
+                             @RequestParam("accountIdCard") String accountIdCard,
+                             @RequestParam("businessLicense") String businessLicense,
+                             @RequestParam(value = "healthPermits", required = false) String healthPermits) {
+        Shop shop = apiDeliveryBindService.sfBind(shopId, accountContactName, accountContactPhone, accountIdCard, businessLicense, healthPermits);
+        return BaseResult.success(shop);
+    }
+
+    @ApiOperation("顺丰未绑定门店列表")
+    @RequestMapping(value = "/sf/shopList", method = RequestMethod.GET)
+    @AccessToken
+    public BaseResult<List<ShopBindDto>> sfShopList(@RequestParam("deliveryId") Long deliveryId) {
+        if (deliveryId == null || deliveryId == 0) {
+            return BaseResult.error("运力ID必传!");
+        }
+        Member loginMember = (Member) getLoginMember();
+        return BaseResult.success(apiDeliveryBindService.sfShopList(loginMember, deliveryId));
+    }
+
+    @ApiOperation("顺丰绑定配送平台列表")
+    @RequestMapping(value = "/sf/list", method = RequestMethod.GET)
+    @AccessToken
+    public BaseResult<List<ShopDeliveryBindDto>> sfList() {
+        Member loginMember = (Member) getLoginMember();
+        return BaseResult.success(apiDeliveryBindService.sfList(loginMember));
+    }
 }

+ 56 - 0
lb-app/src/main/java/com/ydd/app/controller/DeliveryRechargeApi.java

@@ -0,0 +1,56 @@
+package com.ydd.app.controller;
+
+import com.ydd.app.service.ApiDeliveryRechargeService;
+import com.ydd.common.annotation.AccessToken;
+import com.ydd.common.annotation.ControllerLog;
+import com.ydd.common.annotation.RepeatSubmit;
+import com.ydd.common.core.controller.BaseController;
+import com.ydd.common.core.domain.BaseResult;
+import com.ydd.module.domain.Member;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * Demo class
+ *
+ * @author 14027
+ * @date 2022/5/9 15:04
+ */
+@Api(value = "配送平台充值接口", tags = {"配送平台充值接口"})
+@Slf4j
+@RestController
+@RequestMapping("/app/deliveryRecharge")
+@RequiredArgsConstructor(onConstructor_ = @Autowired)
+public class DeliveryRechargeApi extends BaseController {
+
+    private final ApiDeliveryRechargeService apiDeliveryRechargeService;
+
+    @ApiOperation("运力平台充值")
+    @RequestMapping(value = "/recharge", method = RequestMethod.POST)
+    @ControllerLog("运力平台充值")
+    @RepeatSubmit
+    @ApiImplicitParams({
+            @ApiImplicitParam(required = true, paramType = "query", name = "deliveryId", value = "运力对应id,具体看枚举参数"),
+            @ApiImplicitParam(required = false, paramType = "query", name = "shopId", value = "店铺ID(可传猎豹门店id和顺丰店铺id,与shopType对应)"),
+            @ApiImplicitParam(required = false, paramType = "query", name = "shopType", value = "店铺类型:1->顺丰店铺ID,2->猎豹店铺ID"),
+            @ApiImplicitParam(required = true, paramType = "query", name = "type", value = "页面请求类型:1->H5请求,2->WEB请求(H5请求shopId和shopType必传)")
+    })
+    @AccessToken
+    public BaseResult<String> recharge(@RequestParam("deliveryId") Long deliveryId,
+                                       @RequestParam(required = false, name = "shopId") String shopId,
+                                       @RequestParam(required = false, name = "shopType") Integer shopType,
+                                       @RequestParam(required = true, name = "type") Integer type) {
+        Member loginMember = (Member) getLoginMember();
+        return BaseResult.success("OK", apiDeliveryRechargeService.recharge(getLoginId(), deliveryId, shopId, shopType, type));
+    }
+
+}

+ 4 - 0
lb-app/src/main/java/com/ydd/app/dto/ShopReq.java

@@ -128,6 +128,10 @@ public class ShopReq implements Serializable {
     @ApiModelProperty(value = "门店分类ID")
     private Long categoryId;
 
+    /** 负责人联系电话 */
+    @ApiModelProperty(value = "负责人联系电话")
+    private String accountContactPhone;
+
     /**
      * poi地址
      */

+ 25 - 0
lb-app/src/main/java/com/ydd/app/service/ApiDeliveryBindService.java

@@ -1,6 +1,7 @@
 package com.ydd.app.service;
 
 import com.ydd.module.domain.Member;
+import com.ydd.module.domain.Shop;
 import com.ydd.module.dto.ShopBindDto;
 import com.ydd.module.dto.ShopDeliveryBindDto;
 import com.ydd.module.dto.UpdateDadaShopNoDto;
@@ -39,6 +40,14 @@ public interface ApiDeliveryBindService {
     void bindDaDa(String sourceId, String state, Integer type, String shopNo);
 
     /**
+     * 顺丰门店自运力绑定
+     * @param outShopId 三方店铺id
+     * @param shopId 顺丰店铺id
+     * @param type 运力类型
+     */
+    void bindShunfeng(String outShopId, Integer shopId, Integer type);
+
+    /**
      * 绑定配送平台列表
      * @param loginMember 登录用户
      * @return 运力列表
@@ -113,4 +122,20 @@ public interface ApiDeliveryBindService {
      */
     List<ShopBindDto> shopList(Member loginMember, Long deliveryId);
 
+    /**
+     * 获取顺丰未绑定门店列表
+     * @param loginMember 登录用户
+     * @param deliveryId 运力id
+     * @return 门店列表
+     */
+    List<ShopBindDto> sfShopList(Member loginMember, Long deliveryId);
+
+    Shop sfBind(Long shopId, String accountContactName, String accountContactPhone, String accountIdCard, String businessLicense, String healthPermits);
+
+    /**
+     * 绑定配送平台列表
+     * @param loginMember 登录用户
+     * @return 运力列表
+     */
+    List<ShopDeliveryBindDto> sfList(Member loginMember);
 }

+ 21 - 0
lb-app/src/main/java/com/ydd/app/service/ApiDeliveryRechargeService.java

@@ -0,0 +1,21 @@
+package com.ydd.app.service;
+
+/**
+ * Demo class
+ *
+ * @author 14027
+ * @date 2022/5/9 15:08
+ */
+public interface ApiDeliveryRechargeService {
+
+    /**
+     * 运力平台充值
+     * @param loginId 登录用户
+     * @param deliveryId 运力id
+     * @param shopId 店铺Id
+     * @param shopType 店铺Id类型:1->顺丰店铺id,2->接入方店铺id
+     * @param type 请求类型:1->H5请求,2->WEB请求
+     * @return
+     */
+    String recharge(Long loginId, Long deliveryId, String shopId, Integer shopType, Integer type);
+}

+ 186 - 8
lb-app/src/main/java/com/ydd/app/service/impl/ApiDeliveryBindServiceImpl.java

@@ -4,22 +4,17 @@ import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.ydd.api.DeliveryService;
 import com.ydd.app.QueryAmountEntityUtils;
+import com.ydd.app.ShopEntityUtils;
 import com.ydd.app.service.ApiDeliveryBindService;
 import com.ydd.common.enums.DeliveryTypeEnums;
 import com.ydd.common.utils.StringUtils;
 import com.ydd.ecloud.core.utils.JsonMapper;
-import com.ydd.module.domain.DspDelivery;
-import com.ydd.module.domain.Member;
-import com.ydd.module.domain.Merchant;
-import com.ydd.module.domain.ShopDeliveryBind;
+import com.ydd.module.domain.*;
 import com.ydd.module.dto.DeliveryInfo;
 import com.ydd.module.dto.ShopBindDto;
 import com.ydd.module.dto.ShopDeliveryBindDto;
 import com.ydd.module.dto.UpdateDadaShopNoDto;
-import com.ydd.module.enums.BindStatusEnum;
-import com.ydd.module.enums.DadaBindTypeEnum;
-import com.ydd.module.enums.IsDeleteEnum;
-import com.ydd.module.enums.MemberTypeEnum;
+import com.ydd.module.enums.*;
 import com.ydd.module.expection.CustomAppException;
 import com.ydd.module.service.IDspDeliveryService;
 import com.ydd.module.service.IMerchantService;
@@ -31,9 +26,12 @@ import com.ydd.third.common.vo.ResObject;
 import com.ydd.third.common.vo.callback.ShansongTokenVo;
 import com.ydd.third.common.vo.shop.AmountResultVo;
 import com.ydd.third.common.vo.shop.QueryAmount;
+import com.ydd.third.common.vo.shop.ShopResultVo;
+import com.ydd.third.common.vo.shop.ShopVo;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.compress.utils.Lists;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -314,6 +312,36 @@ public class ApiDeliveryBindServiceImpl implements ApiDeliveryBindService {
         }
     }
 
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void bindShunfeng(String outShopId, Integer shopId, Integer type) {
+        log.info("绑定顺丰回调: outShopId: {}, shopId: {}, type: {}", outShopId, shopId, type);
+        Shop shop = iShopService.getOne(new QueryWrapper<Shop>().eq("deleted", 0).eq("code", outShopId));
+
+        Merchant merchant = null;
+        if (shop.getMerchantId() != null) {
+            merchant = iMerchantService.getById(shop.getMerchantId());
+        }
+        if (merchant == null) {
+            log.info("顺丰绑定商家为空");
+            return;
+        }
+        DspDelivery delivery = iDspDeliveryService.findOne(type);
+        ShopDeliveryBind shopDeliveryBind = iShopDeliveryBindService.getOne(new QueryWrapper<ShopDeliveryBind>().eq("merchant_id", merchant.getId()).
+                eq("delivery_id", delivery.getId()).eq("shop_id", shop.getId()).eq("deleted",0));
+        if (shopDeliveryBind == null) {
+            shopDeliveryBind = new ShopDeliveryBind();
+        }
+        shopDeliveryBind.setThirdShopId(shopId.toString());
+        shopDeliveryBind.setMerchantId(merchant.getId());
+        shopDeliveryBind.setShopId(shop.getId());
+        shopDeliveryBind.setBindStatus(BindStatusEnum.BIND.status);
+        shopDeliveryBind.setDeliveryId(delivery.getId());
+        iShopDeliveryBindService.saveOrUpdate(shopDeliveryBind);
+        // 更新余额
+        this.changeShunfengBalance(shopDeliveryBind, delivery.getType());
+    }
+
     private void changeDadaBalance(ShopDeliveryBind shopDeliveryBind, Integer deliveryType){
         QueryAmount queryAmount = new QueryAmount();
         queryAmount.setIsDirectDelivery(0);
@@ -332,6 +360,19 @@ public class ApiDeliveryBindServiceImpl implements ApiDeliveryBindService {
         }
     }
 
+    private void changeShunfengBalance(ShopDeliveryBind shopDeliveryBind, Integer deliveryType){
+        QueryAmount queryAmount = new QueryAmount();
+        // 查询余额
+        queryAmount.setMerchantId(shopDeliveryBind.getThirdShopId());
+        queryAmount.setShopType(1);
+        ResObject<AmountResultVo> res = client.queryAmount(queryAmount);
+        if(res.getCode() == 0) {
+            BigDecimal balanceAmount = res.getData().getBalanceAmount();
+            // 变更余额
+            iShopDeliveryBindService.updateShopAmount(shopDeliveryBind.getMerchantId(), shopDeliveryBind.getDeliveryId(), shopDeliveryBind.getThirdShopId(), balanceAmount);
+        }
+    }
+
     @Override
     public void updateDadaShopNo(Member member, UpdateDadaShopNoDto updateDadaShopNoDto) {
         int merchantCount = iShopDeliveryBindService.count(new QueryWrapper<ShopDeliveryBind>()
@@ -641,4 +682,141 @@ public class ApiDeliveryBindServiceImpl implements ApiDeliveryBindService {
         return list.stream().sorted(Comparator.comparing(ShopBindDto::getShopId)).collect(Collectors.toList());
     }
 
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Shop sfBind(Long shopId, String accountContactName, String accountContactPhone, String accountIdCard, String businessLicense, String healthPermits) {
+        Shop shop = iShopService.getById(shopId);
+        if (Objects.isNull(shop)) {
+            throw new CustomAppException("门店不存在或被删除!");
+        }
+
+        if (shop.getMerchantId() == null) {
+            throw new CustomAppException("请先申请成为商家!");
+        }
+        Merchant merchant = iMerchantService.getById(shop.getMerchantId());
+        if (merchant.getStatus().equals(MerchantStatusEnum.STOP.status)) {
+            throw new CustomAppException("该商家已禁用!");
+        }
+        if (merchant.getStatus().equals(MerchantStatusEnum.TO_BE_CERTIFIED.status)) {
+            throw new CustomAppException("请等待商家通过认证!");
+        }
+
+        DspDelivery dspDelivery = iDspDeliveryService.findOne(DeliveryTypeEnums.SHUN_FENG.getType());
+        List<ShopDeliveryBind> deliveryBindList = iShopDeliveryBindService.list(new QueryWrapper<ShopDeliveryBind>().eq("deleted", 0).eq("shop_id", shopId)
+                .eq("delivery_id", dspDelivery.getId()).eq("bind_status", BindStatusEnum.BIND.getStatus()));
+        if (CollectionUtils.isNotEmpty(deliveryBindList)) {
+            throw new CustomAppException("该门店已经绑定顺丰!");
+        }
+
+        shop.setLegalPerson(accountContactName);
+        shop.setDirectorMobile(accountContactPhone);
+        shop.setIdcardNo(accountIdCard);
+        shop.setBizLicenseIdcard(businessLicense);
+        shop.setFoodLicensePic(healthPermits);
+        iShopService.updateById(shop);
+
+        ShopVo shopVo = ShopEntityUtils.createShopVo(shop, dspDelivery, merchant);
+        log.info("门店信息:" + JsonMapper.nonEmptyMapper().toJson(shopVo));
+        ResObject<ShopResultVo> res = client.createShop(shopVo);
+        // 顺丰自运力绑定插入数据
+        if ("shunfeng".equals(shopVo.getLbClient())) {
+            ShopDeliveryBind deliveryBind= iShopDeliveryBindService.getOne(new QueryWrapper<ShopDeliveryBind>()
+                    .eq("deleted", 0)
+                    .eq("merchant_id", merchant.getId())
+                    .eq("shop_id", shop.getId())
+                    .eq("delivery_id", dspDelivery.getId()));
+
+            if (Objects.isNull(deliveryBind)) {
+                deliveryBind = new ShopDeliveryBind();
+            }
+
+            deliveryBind.setMerchantId(merchant.getId());
+            deliveryBind.setShopId(shop.getId());
+            deliveryBind.setDeliveryId(dspDelivery.getId());
+            if (res.getCode() == 0) {
+                deliveryBind.setBindStatus(BindStatusEnum.CHECK.getStatus());
+            }else {
+                deliveryBind.setAuthMsg(res.getMsg());
+                deliveryBind.setBindStatus(BindStatusEnum.REFUND.getStatus());
+            }
+            iShopDeliveryBindService.saveOrUpdate(deliveryBind);
+        }
+        return shop;
+    }
+
+    @Override
+    public List<ShopBindDto> sfShopList(Member member, Long deliveryId) {
+        List<ShopBindDto> list = Lists.newArrayList();
+        if (MemberTypeEnum.MERCHANT.type.equals(member.getMemberType())) {
+            list = iShopService.findListByMerchantId(member.getMerchantId());
+        } else if (MemberTypeEnum.SHOP.type.equals(member.getMemberType())) {
+            list = iShopService.findListById(member.getShopId());
+        } else {
+            throw new CustomAppException("无效的用户类型!");
+        }
+        List<Shop> shopList = iShopService.list(new QueryWrapper<Shop>()
+                .eq("merchant_id", member.getMerchantId())
+                .eq("deleted", 0));
+
+        // 已经绑定的顺丰店铺
+        List<ShopDeliveryBind> shopDeliveryBindList = iShopDeliveryBindService.list(new QueryWrapper<ShopDeliveryBind>()
+                .eq("merchant_id", member.getMerchantId())
+                .eq("delivery_id", deliveryId)
+                .eq("deleted", 0)
+                .isNotNull("third_shop_id"));
+        List<Long> shopBinds = shopDeliveryBindList.stream().map(ShopDeliveryBind::getShopId).collect(Collectors.toList());
+
+        List<Shop> newShopList = null;
+        if (CollectionUtils.isNotEmpty(shopBinds)) {
+            newShopList = shopList.stream().filter(shop -> !shopBinds.contains(shop.getId())).collect(Collectors.toList());
+        }
+
+        if (CollectionUtils.isEmpty(newShopList)) {
+           newShopList = shopList;
+        }
+
+        for (Shop shop : newShopList) {
+            ShopBindDto dto = new ShopBindDto();
+            dto.setShopId(shop.getId());
+            dto.setShopName(shop.getName());
+            list.add(dto);
+        }
+
+        return list.stream().sorted(Comparator.comparing(ShopBindDto::getShopId)).collect(Collectors.toList());
+    }
+
+    @Override
+    public List<ShopDeliveryBindDto> sfList(Member member) {
+        List<ShopDeliveryBindDto> bindList = iShopDeliveryBindService.sfList(member.getMerchantId());
+
+        if (CollectionUtils.isNotEmpty(bindList)) {
+            for (ShopDeliveryBindDto dto : bindList) {
+                Shop shop = iShopService.getById(dto.getShopId());
+                dto.setShopCode(shop.getCode());
+                if (BindStatusEnum.BIND.getStatus().equals(dto.getBindStatus())) {
+                    dto.setAccountContactPhone(shop.getDirectorMobile());
+                    // 查询余额
+                    DeliveryInfo delivery = new DeliveryInfo();
+                    delivery.setThirdShopId(dto.getThirdShopId());
+                    delivery.setShopId(dto.getThirdShopId());
+                    delivery.setAuthToken(dto.getAuthToken());
+                    delivery.setPhone(dto.getAccount());
+                    delivery.setType(dto.getDeliveryType());
+                    DspDelivery dspDelivery = iDspDeliveryService.getById(dto.getDeliveryId());
+                    QueryAmount queryAmount = QueryAmountEntityUtils.queryAmount(delivery, member.getMerchantId(),1);
+                    ResObject<AmountResultVo> amountRes = client.queryAmount(queryAmount);
+                    if (amountRes.getCode() == 0) {
+                        // 更新余额
+                        AmountResultVo vo = amountRes.getData();
+                        this.updateAmount(dspDelivery, member.getMerchantId(), dto.getShopId(), vo.getBalanceAmount());
+                        dto.setBalance(vo.getBalanceAmount());
+                    }
+                }
+            }
+        }
+
+
+        return bindList;
+    }
+
 }

+ 101 - 0
lb-app/src/main/java/com/ydd/app/service/impl/ApiDeliveryRechargeServiceImpl.java

@@ -0,0 +1,101 @@
+package com.ydd.app.service.impl;
+
+import com.ydd.api.DeliveryService;
+import com.ydd.app.service.ApiDeliveryRechargeService;
+import com.ydd.common.enums.DeliveryTypeEnums;
+import com.ydd.common.utils.StringUtils;
+import com.ydd.module.domain.DspDelivery;
+import com.ydd.module.domain.Member;
+import com.ydd.module.domain.Merchant;
+import com.ydd.module.expection.CustomAppException;
+import com.ydd.module.service.IDspDeliveryService;
+import com.ydd.module.service.IMemberService;
+import com.ydd.module.service.IMerchantService;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.Objects;
+
+/**
+ * Demo class
+ *
+ * @author 14027
+ * @date 2022/5/9 15:08
+ */
+@Slf4j
+@Service
+@RequiredArgsConstructor(onConstructor_ = @Autowired)
+public class ApiDeliveryRechargeServiceImpl implements ApiDeliveryRechargeService {
+
+    private final IMerchantService iMerchantService;
+
+    private final IMemberService iMemberService;
+
+    private final IDspDeliveryService iDspDeliveryService;
+
+    private final DeliveryService client;
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public String recharge(Long loginId, Long deliveryId, String shopId, Integer shopType, Integer type) {
+        Member member = iMemberService.getById(loginId);
+
+        if (Objects.isNull(member)) {
+            throw new CustomAppException("账号不存在或被禁用!");
+        }
+        if (member.getMerchantId() == null) {
+            throw new CustomAppException("请先申请成为商家!");
+        }
+        Merchant merchant = iMerchantService.getById(member.getMerchantId());
+        if (Objects.isNull(merchant)) {
+            throw new CustomAppException("商家信息异常,请联系管理员!");
+        }
+        DspDelivery delivery = iDspDeliveryService.getById(deliveryId);
+        if (Objects.isNull(delivery)) {
+            throw new CustomAppException("暂不支持该运力绑定!");
+        }
+
+        Integer deliveryType = delivery.getType();
+
+        String url = null;
+        if (DeliveryTypeEnums.SHAN_SONG.getType().equals(deliveryType)) {
+            log.info("闪送充值接口暂未开放!");
+        }
+        if (DeliveryTypeEnums.FENG_NIAO.getType().equals(deliveryType)) {
+            log.info("蜂鸟充值接口暂未开放!");
+        }
+        if (DeliveryTypeEnums.FENG_NIAO_PT.getType().equals(deliveryType)) {
+            log.info("蜂鸟跑腿充值接口暂未开放!");
+        }
+        if (DeliveryTypeEnums.AIPT.getType().equals(deliveryType)) {
+            log.info("爱跑腿充值接口暂未开放!");
+        }
+        if (DeliveryTypeEnums.HUO_LA_LA.getType().equals(deliveryType)) {
+            log.info("货拉拉充值接口暂未开放!");
+        }
+        if (DeliveryTypeEnums.KUAI_FU.getType().equals(deliveryType)) {
+            log.info("快服务充值接口暂未开放!");
+        }
+        if (DeliveryTypeEnums.MEI_TUAN_ZB.getType().equals(deliveryType)) {
+            log.info("美团众包充值接口暂未开放!");
+        }
+        if (DeliveryTypeEnums.DADA_YZ.getType().equals(deliveryType)) {
+           log.info("达达优质充值接口暂未开放!");
+        }
+        if (DeliveryTypeEnums.SHUN_FENG.getType().equals(deliveryType)) {
+            if (type == 1 && (StringUtils.isBlank(shopId) || shopType == null)) {
+                throw new CustomAppException("H5请求店铺id和类型不能为空!");
+            }
+
+            // 根据请求类型处理充值链接
+            url = client.getSfRechargeUrl(type, shopId, shopType);
+        }
+
+
+        return url;
+    }
+
+}

+ 3 - 1
lb-feginclient/src/main/java/com/ydd/api/DeliveryCallbackApi.java

@@ -7,6 +7,7 @@ import com.ydd.third.common.vo.ResObject;
 import com.ydd.third.common.vo.callback.CallBackOrderVo;
 import com.ydd.third.common.vo.callback.FengniaoV3CallbackStoreVo;
 import com.ydd.third.common.vo.callback.ShansongTokenVo;
+import com.ydd.third.common.vo.callback.ShunfengCallbackShopVo;
 import com.ydd.third.common.vo.waimai.meituan.MeituanToken;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.web.bind.annotation.PostMapping;
@@ -36,5 +37,6 @@ public interface DeliveryCallbackApi {
     @PostMapping(value = "/callback/mtAuth")
     ResObject<MeituanToken> mtAuth(@RequestParam("params") Map<String, String> params);
 
-
+    @PostMapping(value = "/callback/sfAuth")
+    ResObject<ShunfengCallbackShopVo> sfAuth(@RequestParam("sign") String sign, @RequestParam("jsonParam") JSONObject jsonParam);
 }

+ 3 - 0
lb-feginclient/src/main/java/com/ydd/api/DeliveryService.java

@@ -108,4 +108,7 @@ public interface DeliveryService {
 
     @GetMapping(value = "/ssRefreshToken")
     ResObject<ShansongTokenVo> ssRefreshToken(@RequestParam("token") String refreshToken, @RequestParam("thirdShopId") String thirdShopId) ;
+
+    @GetMapping(value = "/sf/recharge")
+    String getSfRechargeUrl(@RequestParam("type") Integer type, @RequestParam("shopId") String shopId, @RequestParam("shopType") Integer shopType);
 }

+ 2 - 0
lb-module/src/main/java/com/ydd/module/domain/Merchant.java

@@ -219,6 +219,8 @@ private static final long serialVersionUID=1L;
     private Integer ddCcategory;
     @TableField(exist = false)
     private Integer ssProductType;
+    @TableField(exist = false)
+    private Integer sfProductType;
 
     @TableField(exist = false)
     private Map<String, Object> params = new HashMap<>();

+ 3 - 0
lb-module/src/main/java/com/ydd/module/domain/Shop.java

@@ -197,6 +197,9 @@ private static final long serialVersionUID=1L;
     @ApiModelProperty(value = "食品经营许可")
     private String foodLicensePic;
 
+    @ApiModelProperty(value = "顺丰负责人联系电话")
+    private String directorMobile;
+
     /**
      * 打印二维码:1->打印,0->不打印
      */

+ 16 - 0
lb-module/src/main/java/com/ydd/module/dto/ShopDeliveryBindDto.java

@@ -31,6 +31,7 @@ public class ShopDeliveryBindDto implements Serializable {
     /**
      * 门店ID
      */
+    @ApiModelProperty(value = "猎豹门店ID")
     private Long shopId;
 
     /**
@@ -41,11 +42,13 @@ public class ShopDeliveryBindDto implements Serializable {
     /**
      * 配送平台ID
      */
+    @ApiModelProperty(value = "配送平台ID")
     private Long deliveryId;
 
     /**
      * 配送平台type
      */
+    @ApiModelProperty(value = "配送平台type")
     private Integer deliveryType;
 
     /**
@@ -56,16 +59,19 @@ public class ShopDeliveryBindDto implements Serializable {
     /**
      * 配送平台余额
      */
+    @ApiModelProperty(value = "配送平台余额")
     private BigDecimal balance;
 
     /**
      * 绑定状态:1->绑定,0:未绑定
      */
+    @ApiModelProperty(value = "绑定状态:1->绑定,0:未绑定,2-> 审核中,3->拒绝,4->待完善资料")
     private Integer bindStatus;
 
     /**
      * 三方门店ID
      */
+    @ApiModelProperty(value = "三方门店ID")
     private String thirdShopId;
 
     /**
@@ -91,6 +97,7 @@ public class ShopDeliveryBindDto implements Serializable {
     /**
      * 授权原因
      */
+    @ApiModelProperty(value = "授权原因/(或者:达达和顺丰失败原因)")
     private String authMsg;
 
     /**
@@ -122,18 +129,27 @@ public class ShopDeliveryBindDto implements Serializable {
     /**
      * 运力名称
      */
+    @ApiModelProperty(value = "运力名称")
     private String name;
 
     /**
      * 运力logo
      */
+    @ApiModelProperty(value = "运力logo")
     private String logo;
 
     /**
      * pc运力logo
      */
+    @ApiModelProperty(value = "pc运力logo")
     private String pcLogo;
 
+    @ApiModelProperty(value = "顺丰同城负责人联系电话")
+    private String accountContactPhone;
+
+    @ApiModelProperty(value = "接入方店铺ID")
+    private String shopCode;
+
     @Override
     public boolean equals(Object o) {
         if (this == o) return true;

+ 2 - 0
lb-module/src/main/java/com/ydd/module/mapper/ShopDeliveryBindMapper.java

@@ -44,4 +44,6 @@ public interface ShopDeliveryBindMapper extends BaseMapper<ShopDeliveryBind> {
 
     void updateMerchantAmount(@Param("bindId") Long bindId, @Param("accountAmount") BigDecimal accountAmount);
 
+    List<ShopDeliveryBindDto> sfList(@Param("merchantId") Long merchantId);
+
 }

+ 7 - 0
lb-module/src/main/java/com/ydd/module/service/IShopDeliveryBindService.java

@@ -119,4 +119,11 @@ public interface IShopDeliveryBindService extends IService<ShopDeliveryBind> {
      */
     ShopDeliveryBind getShopDeliveryBindInfo(Long merchantId, Long shopId, Long deliveryId, Integer deliveryType);
 
+    /**
+     * 获取顺丰商户已绑定自运力列表
+     *
+     * @param merchantId
+     * @return
+     */
+    List<ShopDeliveryBindDto> sfList(Long merchantId);
 }

+ 5 - 0
lb-module/src/main/java/com/ydd/module/service/impl/ShopDeliveryBindServiceImpl.java

@@ -310,4 +310,9 @@ public class ShopDeliveryBindServiceImpl extends ServiceImpl<ShopDeliveryBindMap
         return shopDeliveryBind;
     }
 
+    @Override
+    public List<ShopDeliveryBindDto> sfList(Long merchantId) {
+        return baseMapper.sfList(merchantId);
+    }
+
 }

+ 22 - 0
lb-module/src/main/resources/mapper/module/ShopDeliveryBindMapper.xml

@@ -222,6 +222,28 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         WHERE third_shop_id= #{thirdShopId} and deleted = 0
     </select>
 
+    <select id="sfList" resultType="com.ydd.module.dto.ShopDeliveryBindDto">
+        select
+            sdb.delivery_id,
+            sdb.id,
+            sdb.shop_id,
+            sdb.balance,
+            sdb.bind_status,
+            sdb.third_shop_id,
+            sdb.auth_token,
+            sdb.auth_msg,
+            d.name,
+            d.logo,
+            d.pc_logo,
+            d.type as deliveryType
+        from
+        lb_shop_delivery_bind as sdb
+        left join lb_dsp_delivery as d
+        on d.id = sdb.delivery_id
+        where
+            sdb.merchant_id = #{merchantId} and sdb.deleted = 0 and sdb.delivery_id = 13
+    </select>
+
     <delete id="updateMerchantAmount">
         UPDATE lb_shop_delivery_bind SET balance = #{accountAmount} WHERE id = #{bindId}
     </delete>

+ 3 - 0
lb-third/lb-third-common/src/main/java/com/ydd/third/common/config/DeliveryConfig.java

@@ -44,6 +44,9 @@ public class DeliveryConfig {
     @Value("${delivery.shunfeng.developerKey}")
     private String sfDeveloperKey;
 
+    @Value("${delivery.shunfeng.webRechargeUrl}")
+    private String sfWebRechargeUrl;
+
     /**
      * 闪送开放平台应用ID
      */

+ 50 - 0
lb-third/lb-third-common/src/main/java/com/ydd/third/common/vo/callback/ShunfengCallbackShopVo.java

@@ -0,0 +1,50 @@
+package com.ydd.third.common.vo.callback;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import lombok.Data;
+
+/**
+ * Demo class
+ *
+ * @author 14027
+ * @date 2022/5/7 11:33
+ */
+@Data
+public class ShunfengCallbackShopVo {
+
+    /**
+     * 第三⽅店铺id
+     */
+    @JSONField(name = "out_shop_id")
+    private String outShopId;
+
+    /**
+     * 顺丰店铺id
+     */
+    @JSONField(name = "shop_id")
+    private Integer shopId;
+
+    /**
+     * 枚举值:success成功,fail失败
+     */
+    @JSONField(name = "status")
+    private String status;
+
+    /**
+     * 固定为 autocreateshop
+     */
+    @JSONField(name = "url_index")
+    private String urlIndex;
+
+    /**
+     * 当status为fail时,此字段为具体失败原因
+     */
+    @JSONField(name = "fail_reason")
+    private String failReason;
+
+    /**
+     * 结果发⽣时秒级时间戳
+     */
+    @JSONField(name = "push_time")
+    private Integer pushTime;
+}

+ 28 - 0
lb-third/lb-third-common/src/main/java/com/ydd/third/common/vo/shop/ShopVo.java

@@ -297,6 +297,34 @@ public class ShopVo {
     private Integer operationType;
 
     /**
+     * 顺丰
+     * 负责人姓名
+     * 顺丰:account_contact_name 必传 负责人姓名,需保证和营业执照上的经营者姓名⼀致
+     */
+    private String accountContactName;
+
+    /**
+     * 顺丰
+     * 负责人联系电话
+     * 顺丰:account_contact_phone 必传 负责人联系电话,建店唯⼀标识,⼀个⼿机号只能建⼀个店铺
+     */
+    private String accountContactPhone;
+
+    /**
+     * 顺丰
+     * 负责⼈⾝份证号
+     * 顺丰:account_id_card 负责⼈⾝份证号、需保证是营业执照上的经营者⾝份证号
+     */
+    private String accountIdCard;
+
+    /**
+     * 顺丰
+     * 营业执照
+     * 顺丰:business_license 营业执照、公⽹可访问图⽚链接
+     */
+    private String businessLicense;
+
+    /**
      * 列表门店编号
      */
     private String lbShopCode;

+ 10 - 0
lb-third/lb-third-delivery/src/main/java/com/ydd/third/controller/DeliveryCallController.java

@@ -7,6 +7,7 @@ import com.ydd.third.common.vo.ResObject;
 import com.ydd.third.common.vo.callback.CallBackOrderVo;
 import com.ydd.third.common.vo.callback.FengniaoV3CallbackStoreVo;
 import com.ydd.third.common.vo.callback.ShansongTokenVo;
+import com.ydd.third.common.vo.callback.ShunfengCallbackShopVo;
 import com.ydd.third.common.vo.vo.order.OrderQueryResultVo;
 import com.ydd.third.common.vo.vo.order.OrderQueryVo;
 import com.ydd.third.common.vo.vo.order.RiderLocationResultVo;
@@ -19,6 +20,8 @@ import com.ydd.third.delivery.fengniao.FengniaoCallback;
 import com.ydd.third.delivery.huolala.HuolalaClient;
 import com.ydd.third.delivery.meituan.MeituanAuthClient;
 import com.ydd.third.delivery.shansong.ShansongClient;
+import com.ydd.third.delivery.shunfeng.ShunfengCallback;
+import com.ydd.third.delivery.shunfeng.ShunfengClient;
 import io.swagger.annotations.Api;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
@@ -49,6 +52,8 @@ public class DeliveryCallController {
 
     private final MeituanAuthClient meituanAuthClient;
 
+    private final ShunfengCallback shunfengCallback;
+
     @RequestMapping(value = "/callBack/doOrder",method = RequestMethod.POST)
     public Object list(@RequestBody CallBackOrderVo order) {
         return callBackFactory.doOrder(order);
@@ -79,4 +84,9 @@ public class DeliveryCallController {
        return  meituanAuthClient.doOAuthToken(params);
     }
 
+    @PostMapping(value = "/callback/sfAuth")
+    ResObject<ShunfengCallbackShopVo> sfAuth(@RequestParam("sign") String sign, @RequestParam("jsonParam") JSONObject jsonParam) {
+        return shunfengCallback.doAuth(sign, jsonParam);
+    }
+
 }

+ 8 - 0
lb-third/lb-third-delivery/src/main/java/com/ydd/third/controller/DeliveryController.java

@@ -19,6 +19,7 @@ import com.ydd.third.delivery.fengniao.entity.FengniaoV3Token;
 import com.ydd.third.delivery.huolala.HuolalaClient;
 import com.ydd.third.delivery.kuaifu.KfClient;
 import com.ydd.third.delivery.shansong.ShansongClient;
+import com.ydd.third.delivery.shunfeng.ShunfengClient;
 import com.ydd.third.delivery.uupt.service.UuptUserDeliveryService;
 import io.swagger.annotations.Api;
 import lombok.RequiredArgsConstructor;
@@ -59,6 +60,8 @@ public class DeliveryController {
 
     private final DadaClient dadaClient;
 
+    private final ShunfengClient shunfengClient;
+
     @RequestMapping(value = "/queryOrderInfo", method = RequestMethod.POST)
     public ResObject<OrderQueryResultVo> list(@RequestBody OrderQueryVo orderQueryVo) {
 
@@ -208,4 +211,9 @@ public class DeliveryController {
     public ResObject<ShopQueryResultVo> queryShop(@RequestBody ShopQueryVo shopQueryVo) {
         return client.queryShop(shopQueryVo);
     }
+
+    @GetMapping(value = "/sf/recharge")
+    public String getSfRechargeUrl(@RequestParam("type") Integer type, @RequestParam("shopId") String shopId, @RequestParam("shopType") Integer shopType) {
+        return shunfengClient.getRechargeUrl(type, shopId, shopType);
+    }
 }

+ 25 - 0
lb-third/lb-third-delivery/src/main/java/com/ydd/third/delivery/shunfeng/ShunfengCallback.java

@@ -3,8 +3,10 @@ package com.ydd.third.delivery.shunfeng;
 import com.alibaba.fastjson.JSONObject;
 import com.ydd.third.common.config.DeliveryConfig;
 import com.ydd.third.common.utils.DateUtils;
+import com.ydd.third.common.utils.StringUtils;
 import com.ydd.third.common.vo.ResObject;
 import com.ydd.third.common.vo.callback.ShunfengCallbackOrderVo;
+import com.ydd.third.common.vo.callback.ShunfengCallbackShopVo;
 import com.ydd.third.delivery.shunfeng.util.SignUtil;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
@@ -38,4 +40,27 @@ public class ShunfengCallback {
         }
         return resObject;
     }
+
+    public ResObject<ShunfengCallbackShopVo> doAuth(String sign, JSONObject jsonParams) {
+        String newSign = SignUtil.sign((appConfig.getSfDeveloperId()).toString(), appConfig.getSfDeveloperKey(), jsonParams.toJSONString());
+        String outSHopId = jsonParams.getString("out_shop_id");
+        String shopId = jsonParams.getString("shop_id");
+        String status = jsonParams.getString("status");
+        ResObject<ShunfengCallbackShopVo> resObject = new ResObject<>();
+        if (1==1 && StringUtils.isNotBlank(outSHopId) && StringUtils.isNotBlank(shopId) && "success".equals(status)) { //null != newSign && newSign.equals(sign)) {
+            Integer push_time = jsonParams.getInteger("push_time");
+            if (null != push_time && push_time != 0) {
+                jsonParams.put("push_time_str", DateUtils.format(new Date(push_time * 1000l), "yyyy-MM-dd HH:mm:ss"));
+            }
+            ShunfengCallbackShopVo shopVo = jsonParams.toJavaObject(ShunfengCallbackShopVo.class);
+            resObject.setCode(0);
+            resObject.setMsg("操作成功");
+            resObject.setData(shopVo);
+        } else {
+            resObject.setCode(1);
+            resObject.setMsg("签名不正确,非法访问");
+            log.error("签名不正确,非法访问");
+        }
+        return resObject;
+    }
 }

+ 29 - 0
lb-third/lb-third-delivery/src/main/java/com/ydd/third/delivery/shunfeng/ShunfengClient.java

@@ -41,6 +41,35 @@ public class ShunfengClient implements ClientHandler {
     private DeliveryConfig appConfig;
 
     /**
+     * 获取WEB端充值URL
+     *
+     * @param shopId 店铺Id
+     * @param shopType 店铺Id类型:1->顺丰店铺id,2->接入方店铺id
+     * @param type 请求类型:1->H5请求,2->WEB请求
+     * @return 返回url
+     */
+    public String getRechargeUrl(Integer type, String shopId, Integer shopType) {
+        String url = null;
+        if (type == 1) {
+            MerchantRechargeRequest request = new MerchantRechargeRequest();
+            request.setShopId(shopId);
+            request.setShopType(shopType);
+
+            Response response = request.doRequest(appConfig, RequestConstant.MERCHANT_RECHARGE_URL);
+            int code = response.getErrorCode();
+
+            if (code == 0) {
+                url = response.toString();
+            } else {
+                log.error("errCode:" + code + ", errMsg:" + response.getErrorMsg());
+            }
+        }else {
+            url = appConfig.getSfWebRechargeUrl();
+        }
+        return url;
+    }
+
+    /**
      * 创建订单
      *
      * @param order

+ 19 - 0
lb-third/lb-third-delivery/src/main/java/com/ydd/third/delivery/shunfeng/constant/RequestConstant.java

@@ -71,6 +71,25 @@ public class RequestConstant {
      */
     public static final String GET_SHOP_ACCOUNT_BALANCE = API_URL + "/open/api/external/getshopaccountbalance";
     /**
+     * 新增门店
+     */
+    public static final String ADD_SHOP_URL = API_URL + "/open/api/external/createretail";
+
+    /**
+     * 修改门店
+     */
+    public static final String MODIFY_SHOP_URL = API_URL + "/open/api/external/updateretail";
+
+    /**
+     * 查询门店
+     */
+    public static final String QUERY_SHOP_URL = API_URL + "/open/api/external/retailinfo";
+
+    /**
+     * 查询门店
+     */
+    public static final String MERCHANT_RECHARGE_URL = API_URL + "/artascope/cx/receipt/getpage/product/artascope/page/storeTopUp";
+    /**
      public static String getCreateOrderUrl() {
      return sfCityHost + CREATE_ORDER_URL;
      }

+ 32 - 0
lb-third/lb-third-delivery/src/main/java/com/ydd/third/delivery/shunfeng/request/MerchantRechargeRequest.java

@@ -0,0 +1,32 @@
+package com.ydd.third.delivery.shunfeng.request;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+/**
+ * Demo class
+ *
+ * @author 14027
+ * @date 2022/5/9 15:57
+ */
+@Data
+public class MerchantRechargeRequest extends Request {
+
+    //	int(11)	0	是	同城开发者ID	可在顺丰同城开放平台上自助申请
+    @JsonProperty("dev_id")
+    private Integer devId;
+
+    //	string(64)	0	是	店铺id
+    @JsonProperty("shop_id")
+    private String shopId;
+
+    //	int(11)	0	是	店铺id类型,1:顺丰店铺ID 2:接入方店铺ID
+    @JsonProperty("shop_type")
+    private Integer shopType;
+
+    @Override
+    void initDevId(Integer devId) {
+        this.devId = devId;
+    }
+
+}