diff --git a/mall-shop/README.MD b/mall-shop/README.MD index 1607608e..57402a34 100644 --- a/mall-shop/README.MD +++ b/mall-shop/README.MD @@ -1,6 +1,15 @@ 项目备份录 -account_user_bind_connect 用户手机、邮件、微博、QQ、微信绑定表 +account_user_bind_connect 用户手机、邮件、微博、QQ、微信绑定表 admin_base_protocol admin_rights_base -权限赋值的表 \ No newline at end of file +权限赋值的表 + +拉卡拉sdk jar 本地 maven 安装: + +mvn install:install-file \ +-Dfile=/Users/panjunjie/code/java-mall/mall-shop/src/main/resources/lib/lkl-java-sdk-1.0.7.jar \ +-DgroupId=com.lkl.laop.sdk \ +-DartifactId=lkl-laop-java-sdk \ +-Dversion=1.0.7 \ +-Dpackaging=jar \ No newline at end of file diff --git a/mall-shop/pom.xml b/mall-shop/pom.xml index 7edcf4b9..d09326d8 100644 --- a/mall-shop/pom.xml +++ b/mall-shop/pom.xml @@ -283,8 +283,8 @@ com.lkl.laop.sdk lkl-laop-java-sdk 1.0.7 - ${project.basedir}/src/main/resources/lib/lkl-java-sdk-1.0.7.jar - system + + @@ -294,12 +294,6 @@ 2.8.0 compile - - - com.microsoft.sqlserver - mssql-jdbc - 9.2.1.jre8 - diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/LklOrderSeparateService.java b/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/LklOrderSeparateService.java index 07ea7bac..910102a0 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/LklOrderSeparateService.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/LklOrderSeparateService.java @@ -20,4 +20,13 @@ public interface LklOrderSeparateService extends IBaseService * @return */ Boolean addOrUpdateByReceiverNo(LklOrderSeparate record); + + /** + * 根据拉卡拉对账单流水号和平台订单号查询记录 + * + * @param logNo + * @param outSeparateNo + * @return + */ + LklOrderSeparate getByOutTradeNo(String logNo, String outSeparateNo); } diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/impl/LakalaApiServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/impl/LakalaApiServiceImpl.java index 9783f394..91d41df2 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/impl/LakalaApiServiceImpl.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/impl/LakalaApiServiceImpl.java @@ -1632,9 +1632,6 @@ public class LakalaApiServiceImpl implements LakalaApiService { try { // TODO 检查可分账余额是否足够? - // 初始化拉卡拉SDK - initLKLSDK(); - // 查询订单信息 List shopOrderLklList = shopOrderLklService.selectByOrderId(orderId, "", storeId); if (CollectionUtil.isEmpty(shopOrderLklList)) { @@ -1645,16 +1642,36 @@ public class LakalaApiServiceImpl implements LakalaApiService { int successCount = 0; StringBuilder errorMessages = new StringBuilder(); + // 初始化拉卡拉SDK + initLKLSDK(); + // 遍历处理每个店铺订单的分账 - for (ShopOrderLkl order : shopOrderLklList) { - String merchantNo = order.getLkl_merchant_no(); - Integer paymentAmount = order.getTotal_amt(); - Integer shoppingFee = order.getShopping_fee(); - BigDecimal splitRatioMch = order.getSplit_ratio(); + for (ShopOrderLkl shopOrderLkl : shopOrderLklList) { + + // TODO 检查已经分账的,不再去分账了 + LklOrderSeparate lklOrderSeparateExist = lklOrderSeparateService.getByOutTradeNo(shopOrderLkl.getLkl_log_no(), orderId); + if (lklOrderSeparateExist != null) { + String status = lklOrderSeparateExist.getStatus(); + if ("SUCCESS".equals(status)) { + log.warn("订单 [{}] 已完成分账,跳过处理。", orderId); + successCount++; + continue; + } + if ("PROCESSING".equals(status) || "ACCEPTED".equals(status)) { + log.warn("订单 [{}] 分账处理中或已受理,跳过处理。", orderId); + successCount++; + continue; + } + } + + String merchantNo = shopOrderLkl.getLkl_merchant_no(); + Integer paymentAmount = shopOrderLkl.getTotal_amt(); + Integer shoppingFee = shopOrderLkl.getShopping_fee(); + BigDecimal splitRatioMch = shopOrderLkl.getSplit_ratio(); // 金额合法性校验 if (paymentAmount <= 0 || (shoppingFee != null && paymentAmount <= shoppingFee)) { - String errorMsg = String.format("店铺[%s]订单金额异常或运费过高,跳过分账", order.getStore_id()); + String errorMsg = String.format("店铺[%s]订单金额异常或运费过高,跳过分账", shopOrderLkl.getStore_id()); log.error(errorMsg); errorMessages.append(errorMsg).append("; "); continue; @@ -1665,7 +1682,7 @@ public class LakalaApiServiceImpl implements LakalaApiService { List distributors = lklLedgerMerReceiverBindService.selectDistributorByMerCupNo(merchantNo); if (platform == null) { - String errorMsg = String.format("店铺[%s]未绑定平台方接收账户,跳过分账", order.getStore_id()); + String errorMsg = String.format("店铺[%s]未绑定平台方接收账户,跳过分账", shopOrderLkl.getStore_id()); log.error(errorMsg); errorMessages.append(errorMsg).append("; "); continue; @@ -1674,14 +1691,14 @@ public class LakalaApiServiceImpl implements LakalaApiService { // 判断是否可以分账(商家比例非100%) boolean canSplit = splitRatioMch != null && splitRatioMch.compareTo(new BigDecimal("100")) < 0; if (!canSplit) { - log.warn("店铺[{}]分账比例为0,仅扣除运费", order.getStore_id()); + log.warn("店铺[{}]分账比例为0,仅扣除运费", shopOrderLkl.getStore_id()); } // 构建分账请求对象 V3SacsSeparateRequest request = new V3SacsSeparateRequest(); request.setMerchantNo(merchantNo); - request.setLogNo(order.getLkl_log_no()); - request.setLogDate(order.getLkl_log_date()); + request.setLogNo(shopOrderLkl.getLkl_log_no()); + request.setLogDate(shopOrderLkl.getLkl_log_date()); request.setOutSeparateNo(orderId); request.setTotalAmt(paymentAmount.toString()); request.setLklOrgNo(orgCode); @@ -1776,7 +1793,7 @@ public class LakalaApiServiceImpl implements LakalaApiService { lklOrderSeparate.setMerchant_no(merchantNo); lklOrderSeparate.setLog_no(request.getLogNo()); lklOrderSeparate.setLog_date(request.getLogDate()); - lklOrderSeparate.setOrder_id(order.getOrder_id()); + lklOrderSeparate.setOrder_id(shopOrderLkl.getOrder_id()); lklOrderSeparate.setTotal_amt(request.getTotalAmt()); lklOrderSeparate.setNotify_url(request.getNotifyUrl()); lklOrderSeparate.setLkl_org_no(request.getLklOrgNo()); diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/impl/LklOrderSeparateServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/impl/LklOrderSeparateServiceImpl.java index d285873e..d86b7ce8 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/impl/LklOrderSeparateServiceImpl.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/impl/LklOrderSeparateServiceImpl.java @@ -8,6 +8,7 @@ package com.suisung.mall.shop.lakala.service.impl; +import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.suisung.mall.common.modules.lakala.LklOrderSeparate; @@ -17,6 +18,8 @@ import com.suisung.mall.shop.lakala.service.LklOrderSeparateService; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; +import java.util.List; + @Slf4j @Service public class LklOrderSeparateServiceImpl extends BaseServiceImpl implements LklOrderSeparateService { @@ -47,4 +50,35 @@ public class LklOrderSeparateServiceImpl extends BaseServiceImpl list = list(new QueryWrapper() + .eq("log_no", logNo) + .eq("out_separate_no", outSeparateNo)); + + if (CollUtil.isEmpty(list)) { + log.info("未找到记录:logNo={}, outSeparateNo={}", logNo, outSeparateNo); + return null; + } + + return list.get(0); + } catch (Exception e) { + log.error("查询记录时发生异常:logNo={}, outSeparateNo={}, 异常信息={}", logNo, outSeparateNo, e.getMessage(), e); + return null; + } + } } diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/order/controller/admin/ShopOrderReturnController.java b/mall-shop/src/main/java/com/suisung/mall/shop/order/controller/admin/ShopOrderReturnController.java index 7e88f609..4964d0fa 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/order/controller/admin/ShopOrderReturnController.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/order/controller/admin/ShopOrderReturnController.java @@ -113,7 +113,7 @@ public class ShopOrderReturnController extends BaseControllerImpl { return CommonResult.success(shopOrderReturnService.refund(return_id)); } - @ApiOperation(value = "确认收货", notes = "确认收货") + @ApiOperation(value = "退单审核", notes = "退单审核") @RequestMapping(value = "/receive", method = RequestMethod.POST) public CommonResult receive(@RequestParam(name = "return_id") String return_id) { diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/order/service/impl/ShopOrderBaseServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/order/service/impl/ShopOrderBaseServiceImpl.java index f6ac6ef8..dd0e9f53 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/order/service/impl/ShopOrderBaseServiceImpl.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/order/service/impl/ShopOrderBaseServiceImpl.java @@ -80,6 +80,7 @@ import com.suisung.mall.shop.invoicing.service.InvoicingCustomerBaseService; import com.suisung.mall.shop.invoicing.service.InvoicingStockBillItemService; import com.suisung.mall.shop.invoicing.service.InvoicingStockBillService; import com.suisung.mall.shop.invoicing.service.InvoicingWarehouseBaseService; +import com.suisung.mall.shop.lakala.service.LakalaApiService; import com.suisung.mall.shop.message.service.MqMessageService; import com.suisung.mall.shop.message.service.ShopMessageTemplateService; import com.suisung.mall.shop.message.vo.MqMessageVo; @@ -292,6 +293,10 @@ public class ShopOrderBaseServiceImpl extends BaseServiceImpl cbQueryWrapper = new QueryWrapper<>(); cbQueryWrapper.in("order_id", order_ids); ShopOrderCb shopOrderCb = new ShopOrderCb(); @@ -4743,6 +4749,7 @@ public class ShopOrderBaseServiceImpl extends BaseServiceImpl retOrderSeparateRet = lakalaApiService.innerDoOrderSeparate(order_row.getOrder_id(), Convert.toStr(order_row.getOrder_state_id())); + if (!retOrderSeparateRet.getFirst()) { + throw new ApiException(I18nUtil._("平台或代理商分账失败: " + retOrderSeparateRet.getSecond())); + } + // 统计总营业额 ShopStoreAnalytics analytics_row = shopStoreAnalyticsService.get(store_id); BigDecimal order_payment_amount = order_row.getOrder_payment_amount(); diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/order/service/impl/ShopOrderLogisticsServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/order/service/impl/ShopOrderLogisticsServiceImpl.java index 7d1dae64..3f15a1d9 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/order/service/impl/ShopOrderLogisticsServiceImpl.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/order/service/impl/ShopOrderLogisticsServiceImpl.java @@ -27,7 +27,9 @@ import com.suisung.mall.shop.order.mapper.ShopOrderLogisticsMapper; import com.suisung.mall.shop.order.service.*; import com.suisung.mall.shop.store.service.ShopStoreExpressLogisticsService; import com.suisung.mall.shop.store.service.ShopStoreShippingAddressService; +import com.suisung.mall.shop.wechat.service.WxOrderShippingService; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -81,6 +83,10 @@ public class ShopOrderLogisticsServiceImpl extends BaseServiceImpl辅助资料->发货地址!")); } + // todo 添加发货通知 + + // 上传发货信息到微信 + if (order_info_row != null) { + //配送方式(ENUM):1-快递配送(运费 10 元);5-自提;10-快递;16-同城配送; + Integer deliveryType = order_info_row.getDelivery_type_id(); + //订单种类(ENUM): 1201-实物 ; 1202-虚拟 ; 1203-电子卡券 ; 1204-外卖订单 + Integer kindId = order_info_row.getKind_id(); + //物流模式,发货方式枚举值:1、实体物流配送采用快递公司进行实体物流配送形式 2、同城配送 3、虚拟商品,虚拟商品,例如话费充值,点卡等,无实体配送形式 4、用户自提 + Integer logisticsType = 1; + if (kindId != null && (kindId.equals(1202) || kindId.equals(1203))) { + logisticsType = 3; + } + + if (deliveryType != null && deliveryType.equals(5)) { + logisticsType = 4; + } + + // 上传发货信息到微信 + wxOrderShippingService.uploadShippingInfoToWx(logisticsType, orderId); + } + } return CommonResult.success();