diff --git a/mall-account/src/main/java/com/suisung/mall/account/service/impl/WeiXinServiceImpl.java b/mall-account/src/main/java/com/suisung/mall/account/service/impl/WeiXinServiceImpl.java index 1f705dc6..2f2d71d0 100644 --- a/mall-account/src/main/java/com/suisung/mall/account/service/impl/WeiXinServiceImpl.java +++ b/mall-account/src/main/java/com/suisung/mall/account/service/impl/WeiXinServiceImpl.java @@ -27,11 +27,11 @@ import com.suisung.mall.common.feignService.AuthService; import com.suisung.mall.common.feignService.SnsService; import com.suisung.mall.common.modules.account.AccountUserBase; import com.suisung.mall.common.modules.account.AccountUserBindConnect; -import com.suisung.mall.core.web.service.RedisService; import com.suisung.mall.common.utils.CheckUtil; import com.suisung.mall.common.utils.CookieUtils; import com.suisung.mall.common.utils.I18nUtil; import com.suisung.mall.common.utils.WxHttpUtil; +import com.suisung.mall.core.web.service.RedisService; import io.seata.spring.annotation.GlobalTransactional; import lombok.extern.slf4j.Slf4j; import org.apache.commons.codec.digest.DigestUtils; @@ -70,27 +70,20 @@ import java.util.Map; public class WeiXinServiceImpl implements WeiXinService { private static final String GET_TOKEN_URL = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET"; - + private final Logger logger = LoggerFactory.getLogger(WeiXinServiceImpl.class); @Autowired private AccountUserBindConnectService accountUserBindConnectService; - @Autowired private AccountUserBaseService accountUserBaseService; - @Autowired private AuthService authService; - @Autowired private AccountBaseConfigService accountBaseConfigService; - @Autowired private SnsService snsService; - @Autowired private RedisService redisService; - private Logger logger = LoggerFactory.getLogger(WeiXinServiceImpl.class); - /** * 接入校验 * @@ -177,7 +170,7 @@ public class WeiXinServiceImpl implements WeiXinService { /** * @param useCacheFlag 是否从缓存中读取 - * 获取AccessToken 向外提供 + * 获取AccessToken 向外提供 */ public String getMpAccessToken(boolean useCacheFlag) { if (useCacheFlag) { @@ -322,8 +315,7 @@ public class WeiXinServiceImpl implements WeiXinService { AccountUserBindConnect userBindConnect = accountUserBindConnectService.get(data.get("openid")); //判断是否存在bind_unionid - if (userBindConnect == null && ObjectUtil.isNotEmpty(data.get("unionid"))) - { + if (userBindConnect == null && ObjectUtil.isNotEmpty(data.get("unionid"))) { QueryWrapper where = new QueryWrapper<>(); where.eq("bind_unionid", data.get("unionid")); userBindConnect = accountUserBindConnectService.findOne(where); @@ -420,6 +412,8 @@ public class WeiXinServiceImpl implements WeiXinService { params.put("code", code); JSON parseParam = JSONUtil.parse(params); String responseStr = WxHttpUtil.request(WxHttpUtil.MethodType.POST, WxHttpUtil.WxType.XCX, accessToken, url, null, Convert.toStr(parseParam)); + log.debug("获取用户手机号返回的数据:{}", responseStr); + JSONObject jsonObject = JSONUtil.parseObj(responseStr); Integer errcode = jsonObject.get("errcode", Integer.class); @@ -543,6 +537,7 @@ public class WeiXinServiceImpl implements WeiXinService { /** * 微信网页登录生成二维码 + * * @return */ @Override @@ -566,6 +561,7 @@ public class WeiXinServiceImpl implements WeiXinService { /** * 微信网页登录回调 + * * @param code * @param response */ diff --git a/mall-common/src/main/java/com/suisung/mall/common/modules/base/ShopBaseStoreCategory.java b/mall-common/src/main/java/com/suisung/mall/common/modules/base/ShopBaseStoreCategory.java index eed0e3e4..afe77b6a 100644 --- a/mall-common/src/main/java/com/suisung/mall/common/modules/base/ShopBaseStoreCategory.java +++ b/mall-common/src/main/java/com/suisung/mall/common/modules/base/ShopBaseStoreCategory.java @@ -12,11 +12,12 @@ import lombok.experimental.Accessors; import java.io.Serializable; import java.math.BigDecimal; +import java.util.Date; import java.util.List; /** *

- * 市场分类表 + * 店铺分类表 *

* * @author Xinze @@ -26,7 +27,7 @@ import java.util.List; @EqualsAndHashCode(callSuper = false) @Accessors(chain = true) @TableName("shop_base_store_category") -@ApiModel(value = "ShopBaseStoreCategory对象", description = "市场分类表") +@ApiModel(value = "ShopBaseStoreCategory对象", description = "店铺分类表") public class ShopBaseStoreCategory implements Serializable { private static final long serialVersionUID = 1L; @@ -62,6 +63,24 @@ public class ShopBaseStoreCategory implements Serializable { @ApiModelProperty(value = "商品分类(DOT)") private String category_ids; + @ApiModelProperty(value = "分类简介") + private String description; + + @ApiModelProperty(value = "分成比例,范围是1.00-100.00") + private BigDecimal split_ratio; + + @ApiModelProperty(value = "创建用户") + private String created_by; + + @ApiModelProperty(value = "最后修改用户") + private String updated_by; + + @ApiModelProperty(value = "创建时间") + private Date created_at; + + @ApiModelProperty(value = "更新时间") + private Date updated_at; + @ApiModelProperty(value = "子集数据") @TableField(exist = false) private List children; diff --git a/mall-common/src/main/java/com/suisung/mall/common/utils/StringUtils.java b/mall-common/src/main/java/com/suisung/mall/common/utils/StringUtils.java index 9de7ca9a..3077e06b 100644 --- a/mall-common/src/main/java/com/suisung/mall/common/utils/StringUtils.java +++ b/mall-common/src/main/java/com/suisung/mall/common/utils/StringUtils.java @@ -36,6 +36,16 @@ public final class StringUtils extends org.apache.commons.lang3.StringUtils { private static final Random RANDOM = new Random(); private static final Logger logger = LoggerFactory.getLogger(StringUtils.class); private static final ObjectMapper objectMapper = new ObjectMapper(); + + // 老版 15 位营业执照注册号加权因子 + private static final int[] BIZLICS_OLD_WEIGHTS = {13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2}; + // 新版 18 位统一社会信用代码加权因子 + private static final int[] BIZLICS_NEW_WEIGHTS = {1, 3, 9, 27, 19, 26, 16, 17, 20, 29, 25, 13, 8, 24, 10, 30, 28}; + // 新版统一社会信用代码字符集 + private static final String NEW_BIZLICS_BASE_CODE_STRING = "0123456789ABCDEFGHJKLMNPQRTUWXY"; + private static final char[] NEW_BIZLICS_BASE_CODE_ARRAY = NEW_BIZLICS_BASE_CODE_STRING.toCharArray(); + + /** * 全地址去除省市区,保留详细地址 * @@ -47,7 +57,7 @@ public final class StringUtils extends org.apache.commons.lang3.StringUtils { public static void main(String[] args) { // System.out.println(removeProvinceCityDistrict("广西壮族自治区贵港市桂平市西山镇新安街粤桂花城1102号")); - System.out.println(genLklOrderNo(4)); + System.out.println(verifyBusinessLicense("99365484C3GKUAU964")); } public static String encode(String str) { @@ -593,6 +603,87 @@ public final class StringUtils extends org.apache.commons.lang3.StringUtils { } + /** + * 校验老版 15 位营业执照注册号 + * + * @param code 待校验的 15 位营业执照注册号 + * @return 若校验通过返回 true,否则返回 false + */ + public static boolean verifyOldBusinessLicense(String code) { + // 检查输入的代码长度是否为 15 位 + if (code == null || code.length() != 15) { + return false; + } + try { + int sum = 0; + // 计算前 14 位的加权和 + for (int i = 0; i < 14; i++) { + int num = Integer.parseInt(String.valueOf(code.charAt(i))); + sum += num * BIZLICS_OLD_WEIGHTS[i]; + } + // 计算加权和对 11 取模的结果 + int mod = sum % 11; + // 计算校验码 + int checkCode = (11 - mod) % 10; + // 比较计算出的校验码和输入代码的最后一位 + return checkCode == Integer.parseInt(String.valueOf(code.charAt(14))); + } catch (NumberFormatException e) { + // 若输入代码包含非数字字符,捕获异常并返回 false + return false; + } + } + + /** + * 校验新版 18 位统一社会信用代码 + * + * @param code 待校验的 18 位统一社会信用代码 + * @return 若校验通过返回 true,否则返回 false + */ + public static boolean verifyNewBusinessLicense(String code) { + // 检查输入的代码长度是否为 18 位 + if (code == null || code.length() != 18) { + return false; + } + char[] chars = code.toCharArray(); + char checkCode = chars[17]; + int sum = 0; + // 计算前 17 位的加权和 + for (int i = 0; i < 17; i++) { + int index = NEW_BIZLICS_BASE_CODE_STRING.indexOf(chars[i]); + // 若字符不在字符集中,返回 false + if (index == -1) { + return false; + } + sum += index * BIZLICS_NEW_WEIGHTS[i]; + } + // 计算加权和对 31 取模的结果 + int modulus = sum % 31; + // 计算校验码的索引 + int checkIndex = (31 - modulus) % 31; + // 比较计算出的校验码和输入代码的最后一位 + return checkCode == NEW_BIZLICS_BASE_CODE_ARRAY[checkIndex]; + } + + /** + * 兼容新老版营业执照的校验函数 + * + * @param code 待校验的营业执照代码 + * @return 若校验通过返回 true,否则返回 false + */ + public static boolean verifyBusinessLicense(String code) { + if (code == null) { + return false; + } + // 根据代码长度调用相应的校验方法 + if (code.length() == 15) { + return verifyOldBusinessLicense(code); + } else if (code.length() == 18) { + return verifyNewBusinessLicense(code); + } + return false; + } + + /** * 生成的随机数类型 */ diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/base/controller/admin/ShopBaseStoreCategoryController.java b/mall-shop/src/main/java/com/suisung/mall/shop/base/controller/admin/ShopBaseStoreCategoryAdminController.java similarity index 74% rename from mall-shop/src/main/java/com/suisung/mall/shop/base/controller/admin/ShopBaseStoreCategoryController.java rename to mall-shop/src/main/java/com/suisung/mall/shop/base/controller/admin/ShopBaseStoreCategoryAdminController.java index 470713a5..3663ee43 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/base/controller/admin/ShopBaseStoreCategoryController.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/base/controller/admin/ShopBaseStoreCategoryAdminController.java @@ -1,5 +1,7 @@ package com.suisung.mall.shop.base.controller.admin; +import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.suisung.mall.common.api.CommonResult; import com.suisung.mall.common.modules.base.ShopBaseStoreCategory; @@ -10,23 +12,20 @@ import com.suisung.mall.shop.store.service.ShopStoreBaseService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; 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; +import org.springframework.web.bind.annotation.*; /** *

- * 市场分类表 前端控制器 + * 店铺分类表 前端控制器 *

* * @author Xinze * @since 2021-04-23 */ -@Api(tags = "市场分类表") +@Api(tags = "店铺分类表") @RestController @RequestMapping("/admin/shop/shop-base-store-category") -public class ShopBaseStoreCategoryController { +public class ShopBaseStoreCategoryAdminController { @Autowired private ShopBaseStoreCategoryService shopBaseStoreCategoryService; @@ -42,22 +41,32 @@ public class ShopBaseStoreCategoryController { * @param pageSize * @return */ - @ApiOperation(value = "市场分类表-分页列表查询", notes = "市场分类表-分页列表查询") + @ApiOperation(value = "店铺分类表-分页列表查询", notes = "店铺分类表-分页列表查询") @RequestMapping(value = "/list", method = RequestMethod.GET) public CommonResult list(ShopBaseStoreCategory shopBaseStoreCategory, @RequestParam(name = "pageNum", defaultValue = "1") Integer pageNum, @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize) { QueryWrapper queryWrapper = new QueryWrapper<>(); - queryWrapper.orderByAsc("store_category_id"); + queryWrapper.orderByAsc("store_category_order").orderByAsc("store_category_id"); return CommonResult.success(shopBaseStoreCategoryService.lists(queryWrapper, pageNum, pageSize)); } + @ApiOperation(value = "店铺分类基础数据", notes = "店铺分类基础数据(适用于绑定下拉列表)") + @RequestMapping(value = "/base-list", method = RequestMethod.POST) + public CommonResult shopStoreBusinessCategoryList(@RequestBody(required = false) JSONObject params) { + String keyword = ""; + if (params != null && StrUtil.isNotBlank(params.getStr("keyword"))) { + keyword = params.getStr("keyword"); + } + return CommonResult.success(shopBaseStoreCategoryService.selectParentListWithChildren(keyword)); + } + /** * 列表查询 * * @return */ - @ApiOperation(value = "商品分类表-分类强调区别, 类型强调共性-分页列表查询", notes = "商品分类表-分类强调区别, 类型强调共性-分页列表查询") + @ApiOperation(value = "店铺分类表-分类强调区别, 类型强调共性-分页列表查询", notes = "店铺分类表-分类强调区别, 类型强调共性-分页列表查询") @RequestMapping(value = "/categoryTree", method = RequestMethod.GET) public CommonResult categoryTree(ShopBaseStoreCategory category) { QueryWrapper queryWrapper = new QueryWrapper<>(); @@ -73,7 +82,7 @@ public class ShopBaseStoreCategoryController { * @param shopBaseStoreCategory * @return */ - @ApiOperation(value = "市场分类表-编辑", notes = "市场分类表-编辑") + @ApiOperation(value = "店铺分类表-编辑", notes = "店铺分类表-编辑") @RequestMapping(value = "/edit", method = RequestMethod.POST) public CommonResult edit(ShopBaseStoreCategory shopBaseStoreCategory) { return CommonResult.success(shopBaseStoreCategoryService.saveOrUpdate(shopBaseStoreCategory)); @@ -85,7 +94,7 @@ public class ShopBaseStoreCategoryController { * @param store_category_id * @return */ - @ApiOperation(value = "市场分类表-通过store_category_id删除", notes = "市场分类表-通过store_category_id删除") + @ApiOperation(value = "店铺分类表-通过store_category_id删除", notes = "店铺分类表-通过store_category_id删除") @RequestMapping(value = "/delete", method = RequestMethod.POST) public CommonResult delete(@RequestParam(name = "store_category_id") String store_category_id) { QueryWrapper queryWrapper = new QueryWrapper<>(); diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/base/controller/mobile/ShopBaseStoreCategoryController.java b/mall-shop/src/main/java/com/suisung/mall/shop/base/controller/mobile/ShopBaseStoreCategoryController.java new file mode 100644 index 00000000..c62d4346 --- /dev/null +++ b/mall-shop/src/main/java/com/suisung/mall/shop/base/controller/mobile/ShopBaseStoreCategoryController.java @@ -0,0 +1,43 @@ +package com.suisung.mall.shop.base.controller.mobile; + +import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONObject; +import com.suisung.mall.common.api.CommonResult; +import com.suisung.mall.shop.base.service.ShopBaseStoreCategoryService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; + +/** + *

+ * 店铺分类表 前端控制器 + *

+ * + * @author Xinze + * @since 2021-06-28 + */ +@Api(tags = "店铺分类表") +@RestController +@RequestMapping("/mobile/shop/shop-base-store-category") +public class ShopBaseStoreCategoryController { + + + @Resource + private ShopBaseStoreCategoryService shopBaseStoreCategoryService; + + @ApiOperation(value = "店铺分类(类目)", notes = "店铺分类(类目)") + @RequestMapping(value = "/list", method = RequestMethod.POST) + public CommonResult shopStoreBusinessCategoryList(@RequestBody(required = false) JSONObject params) { + String keyword = ""; + if (params != null && StrUtil.isNotBlank(params.getStr("keyword"))) { + keyword = params.getStr("keyword"); + } + return CommonResult.success(shopBaseStoreCategoryService.selectParentListWithChildren(keyword)); + } +} + diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/base/mapper/ShopBaseStoreCategoryMapper.java b/mall-shop/src/main/java/com/suisung/mall/shop/base/mapper/ShopBaseStoreCategoryMapper.java index 6ae2a336..4a126baa 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/base/mapper/ShopBaseStoreCategoryMapper.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/base/mapper/ShopBaseStoreCategoryMapper.java @@ -2,8 +2,11 @@ package com.suisung.mall.shop.base.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.suisung.mall.common.modules.base.ShopBaseStoreCategory; +import org.apache.ibatis.annotations.Param; import org.springframework.stereotype.Repository; +import java.util.List; + /** *

* 市场分类表 Mapper 接口 @@ -16,4 +19,11 @@ import org.springframework.stereotype.Repository; @Repository public interface ShopBaseStoreCategoryMapper extends BaseMapper { + /** + * 根据关键字查询店铺一级营业分类信息 + * + * @param keyword + * @return + */ + List selectParentListWithChildren(@Param("keyword") String keyword); } diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/base/service/ShopBaseStoreCategoryService.java b/mall-shop/src/main/java/com/suisung/mall/shop/base/service/ShopBaseStoreCategoryService.java index 00bd7fe6..6491130e 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/base/service/ShopBaseStoreCategoryService.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/base/service/ShopBaseStoreCategoryService.java @@ -20,4 +20,14 @@ public interface ShopBaseStoreCategoryService extends IBaseService getCategoryTree(QueryWrapper queryWrapper); List getCategoryTree(Integer store_category_parent_id, Integer category_is_enable); + + + /** + * 根据关键字查询店铺一级店铺分类信息 + * + * @param keyword + * @return + */ + List selectParentListWithChildren(String keyword); + } diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/base/service/impl/ShopBaseStoreCategoryServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/base/service/impl/ShopBaseStoreCategoryServiceImpl.java index b34a8cdb..9fc078db 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/base/service/impl/ShopBaseStoreCategoryServiceImpl.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/base/service/impl/ShopBaseStoreCategoryServiceImpl.java @@ -9,6 +9,7 @@ import com.suisung.mall.shop.base.mapper.ShopBaseStoreCategoryMapper; import com.suisung.mall.shop.base.service.ShopBaseStoreCategoryService; import org.springframework.stereotype.Service; +import javax.annotation.Resource; import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -27,6 +28,9 @@ public class ShopBaseStoreCategoryServiceImpl extends BaseServiceImpl getCategoryTree(QueryWrapper queryWrapper) { List list = find(queryWrapper); @@ -75,6 +79,18 @@ public class ShopBaseStoreCategoryServiceImpl extends BaseServiceImpl selectParentListWithChildren(String keyword) { + return shopBaseStoreCategoryMapper.selectParentListWithChildren(keyword); + } + + /** * 递归构建tree * diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/sfexpress/controller/mobile/SFExpressController.java b/mall-shop/src/main/java/com/suisung/mall/shop/sfexpress/controller/mobile/SFExpressController.java index 13d3f15c..0ec7dcb1 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/sfexpress/controller/mobile/SFExpressController.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/sfexpress/controller/mobile/SFExpressController.java @@ -19,7 +19,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import org.springframework.web.servlet.mvc.method.annotation.SseEmitter; -import javax.annotation.Resource; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -93,6 +92,15 @@ public class SFExpressController { return sfExpressApiService.riderViewV2(params); } + @ApiOperation(value = "拣货完成", notes = "拣货完成(商家告知餐品制作完成接口)") + @RequestMapping(value = "/notifyproductready", method = RequestMethod.POST) + public ThirdApiRes notifyProductReady(@RequestParam(name = "store_id", defaultValue = "0") String storeId, @RequestParam(name = "order_id", defaultValue = "") String orderId) { + Map params = new HashMap<>(); + params.put("order_id", shopStoreSfOrderService.getSfOrderIdByShopOrderId(orderId)); + params.put("store_id", storeId); + return sfExpressApiService.notifyProductReady(params); + } + /** * 顺丰同城订单状态监听 SSE 服务 * diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/sfexpress/service/SFExpressApiService.java b/mall-shop/src/main/java/com/suisung/mall/shop/sfexpress/service/SFExpressApiService.java index 21689673..73eb6675 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/sfexpress/service/SFExpressApiService.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/sfexpress/service/SFExpressApiService.java @@ -15,6 +15,7 @@ import java.util.Map; public interface SFExpressApiService { + /** * (店铺)创建顺丰同城订单 * @@ -23,7 +24,6 @@ public interface SFExpressApiService { */ ThirdApiRes createOrder(String shopOrderId); - /** * 内部顺丰同城订单下单 * @@ -33,7 +33,6 @@ public interface SFExpressApiService { */ Pair innerCreateSfExpressOrder(String orderId, Long orderPickupNum); - /** * 取消订单,当商家处发生异常需要取消配送时,可调用此接口对订单进行取消操作,同步返回结果。 * @@ -44,7 +43,6 @@ public interface SFExpressApiService { */ ThirdApiRes cancelOrder(String sfOrderId, Integer cancelCode, String cancelReason); - /** * 取消订单,当商家处发生异常需要取消配送时,可调用此接口对订单进行取消操作,同步返回结果。 * @@ -102,6 +100,14 @@ public interface SFExpressApiService { */ ThirdApiRes changeOrder(Map params); + /** + * 拣货完成,商家告知餐品制作完成接口 + * + * @param params 综合参数,请参考:https://openic.sf-express.com/open/api/docs/index/#/apidoc + * @return + */ + ThirdApiRes notifyProductReady(Map params); + // *********** 顺丰同城回调相关业务 **************** diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/sfexpress/service/impl/SFExpressApiServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/sfexpress/service/impl/SFExpressApiServiceImpl.java index c5043680..11eb99eb 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/sfexpress/service/impl/SFExpressApiServiceImpl.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/sfexpress/service/impl/SFExpressApiServiceImpl.java @@ -18,6 +18,7 @@ import cn.hutool.json.JSONUtil; import com.suisung.mall.common.api.StateCode; import com.suisung.mall.common.constant.SFExpressConstant; import com.suisung.mall.common.exception.ApiException; +import com.suisung.mall.common.modules.store.ShopStoreSameCityTransportBase; import com.suisung.mall.common.modules.store.ShopStoreSfOrder; import com.suisung.mall.common.pojo.req.*; import com.suisung.mall.common.pojo.res.ThirdApiRes; @@ -28,16 +29,17 @@ import com.suisung.mall.common.utils.SseEmitterUtil; import com.suisung.mall.shop.order.service.ShopOrderBaseService; import com.suisung.mall.shop.order.service.ShopOrderInfoService; import com.suisung.mall.shop.sfexpress.service.SFExpressApiService; +import com.suisung.mall.shop.store.service.ShopStoreSameCityTransportBaseService; import com.suisung.mall.shop.store.service.ShopStoreSfOrderService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Lazy; import org.springframework.data.util.Pair; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import javax.annotation.Resource; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -64,6 +66,10 @@ public class SFExpressApiServiceImpl implements SFExpressApiService { @Autowired private ShopOrderInfoService shopOrderInfoService; + @Lazy + @Autowired + private ShopStoreSameCityTransportBaseService shopStoreSameCityTransportBaseService; + @Override public ThirdApiRes createOrder(String shopOrderId) { // 组织请求参数 @@ -452,6 +458,44 @@ public class SFExpressApiServiceImpl implements SFExpressApiService { return null; } + /** + * 拣货完成,商家告知餐品制作完成接口 + * + * @param params 综合参数,顺丰订单号order_id必填项,请参考:https://openic.sf-express.com/open/api/docs/index/#/apidoc + * @return + */ + @Override + public ThirdApiRes notifyProductReady(Map params) { + if (params == null || ObjectUtil.isEmpty(params.get("order_id")) || ObjectUtil.isEmpty(params.get("store_id"))) { + return new ThirdApiRes().fail(1003, "请求参数有误!"); + } + + ShopStoreSameCityTransportBase shopStoreSameCityTransportBase = shopStoreSameCityTransportBaseService.getShopStoreSameCityTransportBaseById((long) params.get("store_id")); + if (shopStoreSameCityTransportBase == null) { + logger.error("无法获取顺丰店铺 Id!"); + return new ThirdApiRes().fail(1003, "无法获取店铺Id"); + } + + params.put("order_type", 1); // 1表示顺丰订单号、2表示商家订单号 + params.put("shop_id", shopStoreSameCityTransportBase.getShop_id()); + params.put("shop_type", 2);// 1表示顺丰店铺id、2表示接入方店铺id + params.put("notice_ready_time", System.currentTimeMillis() / 1000); + params.putAll(buildCommonParams()); + + // 转换 json 字符串参数 + String paramJSON = JsonUtil.toJSONString(params); + + // 根据参数生成请求签名 + String send_url = buildUrl("notifyproductready", paramJSON); + String retRespStr = HttpUtil.post(send_url, paramJSON); + if (StrUtil.isBlank(retRespStr)) { + logger.error("顺丰同城:拣货完成接口异常,无返回值!"); + return new ThirdApiRes().fail(-1, "顺丰同城:无返回值!"); + } + + return JsonUtil.json2object(retRespStr, ThirdApiRes.class); + } + /** * 接收顺丰原因订单取消回调 diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/store/service/impl/ShopMerchEntryServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/store/service/impl/ShopMerchEntryServiceImpl.java index 20963311..e135b688 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/store/service/impl/ShopMerchEntryServiceImpl.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/store/service/impl/ShopMerchEntryServiceImpl.java @@ -164,6 +164,10 @@ public class ShopMerchEntryServiceImpl extends BaseServiceImpl 0) { + if (oldRecord.getSigned_status() >= 0) { return CommonResult.failed("已经签署合同,不能再次申请!"); } @@ -241,6 +245,11 @@ public class ShopMerchEntryServiceImpl extends BaseServiceImpl - store_category_id , store_category_name, store_category_deposit, store_category_parent_id, store_category_order, category_image, category_level, category_is_leaf, category_is_enable, category_ids + + + + + + + + + + + + + + + + + + + + diff --git a/mall-shop/src/main/resources/mapper/order/ShopOrderBaseMapper.xml b/mall-shop/src/main/resources/mapper/order/ShopOrderBaseMapper.xml index 7a80740c..e5e1b9ca 100644 --- a/mall-shop/src/main/resources/mapper/order/ShopOrderBaseMapper.xml +++ b/mall-shop/src/main/resources/mapper/order/ShopOrderBaseMapper.xml @@ -695,16 +695,19 @@ OR spi.item_barcode LIKE CONCAT('%', #{keyword}, '%')) + and ob.order_state_id IN (2020, 2030, 2040) and TIMESTAMPADD(MINUTE, #{expiredMinute}, oi.order_time) >= NOW() + and ob.order_state_id IN (2020, 2030, 2040) and TIMESTAMPADD(MINUTE, #{expiredMinute}, oi.order_time) <= NOW() + and od.order_refund_status IN (1, 2)