拉卡拉sdk jar 安装到本地 maven 库,并引用,防止依赖不可传递性

This commit is contained in:
Jack 2025-06-08 23:49:19 +08:00
parent 62412721ea
commit dc2300397d
8 changed files with 131 additions and 26 deletions

View File

@ -1,6 +1,15 @@
项目备份录 项目备份录
account_user_bind_connect 用户手机、邮件、微博、QQ、微信绑定表 account_user_bind_connect 用户手机、邮件、微博、QQ、微信绑定表
admin_base_protocol admin_base_protocol
admin_rights_base admin_rights_base
权限赋值的表 权限赋值的表
拉卡拉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

View File

@ -283,8 +283,8 @@
<groupId>com.lkl.laop.sdk</groupId> <groupId>com.lkl.laop.sdk</groupId>
<artifactId>lkl-laop-java-sdk</artifactId> <artifactId>lkl-laop-java-sdk</artifactId>
<version>1.0.7</version> <version>1.0.7</version>
<systemPath>${project.basedir}/src/main/resources/lib/lkl-java-sdk-1.0.7.jar</systemPath> <!-- <systemPath>${project.basedir}/src/main/resources/lib/lkl-java-sdk-1.0.7.jar</systemPath>-->
<scope>system</scope> <!-- <scope>system</scope>-->
</dependency> </dependency>
<!--拉卡拉支付与分账 结束--> <!--拉卡拉支付与分账 结束-->
@ -294,12 +294,6 @@
<version>2.8.0</version> <version>2.8.0</version>
<scope>compile</scope> <scope>compile</scope>
</dependency> </dependency>
<!--jdbc数据库-->
<dependency>
<groupId>com.microsoft.sqlserver</groupId>
<artifactId>mssql-jdbc</artifactId>
<version>9.2.1.jre8</version>
</dependency>
</dependencies> </dependencies>

View File

@ -20,4 +20,13 @@ public interface LklOrderSeparateService extends IBaseService<LklOrderSeparate>
* @return * @return
*/ */
Boolean addOrUpdateByReceiverNo(LklOrderSeparate record); Boolean addOrUpdateByReceiverNo(LklOrderSeparate record);
/**
* 根据拉卡拉对账单流水号和平台订单号查询记录
*
* @param logNo
* @param outSeparateNo
* @return
*/
LklOrderSeparate getByOutTradeNo(String logNo, String outSeparateNo);
} }

View File

@ -1632,9 +1632,6 @@ public class LakalaApiServiceImpl implements LakalaApiService {
try { try {
// TODO 检查可分账余额是否足够 // TODO 检查可分账余额是否足够
// 初始化拉卡拉SDK
initLKLSDK();
// 查询订单信息 // 查询订单信息
List<ShopOrderLkl> shopOrderLklList = shopOrderLklService.selectByOrderId(orderId, "", storeId); List<ShopOrderLkl> shopOrderLklList = shopOrderLklService.selectByOrderId(orderId, "", storeId);
if (CollectionUtil.isEmpty(shopOrderLklList)) { if (CollectionUtil.isEmpty(shopOrderLklList)) {
@ -1645,16 +1642,36 @@ public class LakalaApiServiceImpl implements LakalaApiService {
int successCount = 0; int successCount = 0;
StringBuilder errorMessages = new StringBuilder(); StringBuilder errorMessages = new StringBuilder();
// 初始化拉卡拉SDK
initLKLSDK();
// 遍历处理每个店铺订单的分账 // 遍历处理每个店铺订单的分账
for (ShopOrderLkl order : shopOrderLklList) { for (ShopOrderLkl shopOrderLkl : shopOrderLklList) {
String merchantNo = order.getLkl_merchant_no();
Integer paymentAmount = order.getTotal_amt(); // TODO 检查已经分账的不再去分账了
Integer shoppingFee = order.getShopping_fee(); LklOrderSeparate lklOrderSeparateExist = lklOrderSeparateService.getByOutTradeNo(shopOrderLkl.getLkl_log_no(), orderId);
BigDecimal splitRatioMch = order.getSplit_ratio(); 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)) { 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); log.error(errorMsg);
errorMessages.append(errorMsg).append("; "); errorMessages.append(errorMsg).append("; ");
continue; continue;
@ -1665,7 +1682,7 @@ public class LakalaApiServiceImpl implements LakalaApiService {
List<LklLedgerMerReceiverBind> distributors = lklLedgerMerReceiverBindService.selectDistributorByMerCupNo(merchantNo); List<LklLedgerMerReceiverBind> distributors = lklLedgerMerReceiverBindService.selectDistributorByMerCupNo(merchantNo);
if (platform == null) { if (platform == null) {
String errorMsg = String.format("店铺[%s]未绑定平台方接收账户,跳过分账", order.getStore_id()); String errorMsg = String.format("店铺[%s]未绑定平台方接收账户,跳过分账", shopOrderLkl.getStore_id());
log.error(errorMsg); log.error(errorMsg);
errorMessages.append(errorMsg).append("; "); errorMessages.append(errorMsg).append("; ");
continue; continue;
@ -1674,14 +1691,14 @@ public class LakalaApiServiceImpl implements LakalaApiService {
// 判断是否可以分账商家比例非100% // 判断是否可以分账商家比例非100%
boolean canSplit = splitRatioMch != null && splitRatioMch.compareTo(new BigDecimal("100")) < 0; boolean canSplit = splitRatioMch != null && splitRatioMch.compareTo(new BigDecimal("100")) < 0;
if (!canSplit) { if (!canSplit) {
log.warn("店铺[{}]分账比例为0仅扣除运费", order.getStore_id()); log.warn("店铺[{}]分账比例为0仅扣除运费", shopOrderLkl.getStore_id());
} }
// 构建分账请求对象 // 构建分账请求对象
V3SacsSeparateRequest request = new V3SacsSeparateRequest(); V3SacsSeparateRequest request = new V3SacsSeparateRequest();
request.setMerchantNo(merchantNo); request.setMerchantNo(merchantNo);
request.setLogNo(order.getLkl_log_no()); request.setLogNo(shopOrderLkl.getLkl_log_no());
request.setLogDate(order.getLkl_log_date()); request.setLogDate(shopOrderLkl.getLkl_log_date());
request.setOutSeparateNo(orderId); request.setOutSeparateNo(orderId);
request.setTotalAmt(paymentAmount.toString()); request.setTotalAmt(paymentAmount.toString());
request.setLklOrgNo(orgCode); request.setLklOrgNo(orgCode);
@ -1776,7 +1793,7 @@ public class LakalaApiServiceImpl implements LakalaApiService {
lklOrderSeparate.setMerchant_no(merchantNo); lklOrderSeparate.setMerchant_no(merchantNo);
lklOrderSeparate.setLog_no(request.getLogNo()); lklOrderSeparate.setLog_no(request.getLogNo());
lklOrderSeparate.setLog_date(request.getLogDate()); lklOrderSeparate.setLog_date(request.getLogDate());
lklOrderSeparate.setOrder_id(order.getOrder_id()); lklOrderSeparate.setOrder_id(shopOrderLkl.getOrder_id());
lklOrderSeparate.setTotal_amt(request.getTotalAmt()); lklOrderSeparate.setTotal_amt(request.getTotalAmt());
lklOrderSeparate.setNotify_url(request.getNotifyUrl()); lklOrderSeparate.setNotify_url(request.getNotifyUrl());
lklOrderSeparate.setLkl_org_no(request.getLklOrgNo()); lklOrderSeparate.setLkl_org_no(request.getLklOrgNo());

View File

@ -8,6 +8,7 @@
package com.suisung.mall.shop.lakala.service.impl; package com.suisung.mall.shop.lakala.service.impl;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.suisung.mall.common.modules.lakala.LklOrderSeparate; 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 lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.List;
@Slf4j @Slf4j
@Service @Service
public class LklOrderSeparateServiceImpl extends BaseServiceImpl<LklOrderSeparateMapper, LklOrderSeparate> implements LklOrderSeparateService { public class LklOrderSeparateServiceImpl extends BaseServiceImpl<LklOrderSeparateMapper, LklOrderSeparate> implements LklOrderSeparateService {
@ -47,4 +50,35 @@ public class LklOrderSeparateServiceImpl extends BaseServiceImpl<LklOrderSeparat
return add(record); return add(record);
} }
/**
* 根据拉卡拉对账单流水号和平台订单号查询记录
*
* @param logNo
* @param outSeparateNo
* @return
*/
@Override
public LklOrderSeparate getByOutTradeNo(String logNo, String outSeparateNo) {
try {
if (StrUtil.isBlank(logNo) || StrUtil.isBlank(outSeparateNo)) {
log.warn("查询参数为空logNo={}, outSeparateNo={}", logNo, outSeparateNo);
return null;
}
List<LklOrderSeparate> list = list(new QueryWrapper<LklOrderSeparate>()
.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;
}
}
} }

View File

@ -113,7 +113,7 @@ public class ShopOrderReturnController extends BaseControllerImpl {
return CommonResult.success(shopOrderReturnService.refund(return_id)); return CommonResult.success(shopOrderReturnService.refund(return_id));
} }
@ApiOperation(value = "确认收货", notes = "确认收货") @ApiOperation(value = "退单审核", notes = "退单审核")
@RequestMapping(value = "/receive", method = RequestMethod.POST) @RequestMapping(value = "/receive", method = RequestMethod.POST)
public CommonResult receive(@RequestParam(name = "return_id") String return_id) { public CommonResult receive(@RequestParam(name = "return_id") String return_id) {

View File

@ -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.InvoicingStockBillItemService;
import com.suisung.mall.shop.invoicing.service.InvoicingStockBillService; import com.suisung.mall.shop.invoicing.service.InvoicingStockBillService;
import com.suisung.mall.shop.invoicing.service.InvoicingWarehouseBaseService; 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.MqMessageService;
import com.suisung.mall.shop.message.service.ShopMessageTemplateService; import com.suisung.mall.shop.message.service.ShopMessageTemplateService;
import com.suisung.mall.shop.message.vo.MqMessageVo; import com.suisung.mall.shop.message.vo.MqMessageVo;
@ -292,6 +293,10 @@ public class ShopOrderBaseServiceImpl extends BaseServiceImpl<ShopOrderBaseMappe
@Autowired @Autowired
private KdApiExpressSearchService kdApiExpressSearchService; private KdApiExpressSearchService kdApiExpressSearchService;
@Lazy
@Autowired
private LakalaApiService lakalaApiService;
@Value("${sf-express.enable}") @Value("${sf-express.enable}")
private Integer enable_sf_express; private Integer enable_sf_express;
@ -4736,6 +4741,7 @@ public class ShopOrderBaseServiceImpl extends BaseServiceImpl<ShopOrderBaseMappe
GlobalTransaction tx = GlobalTransactionContext.getCurrentOrCreate(); GlobalTransaction tx = GlobalTransactionContext.getCurrentOrCreate();
tx.begin(2000); tx.begin(2000);
if (plugin_crossBorder) { if (plugin_crossBorder) {
// 跨境订单
QueryWrapper<ShopOrderCb> cbQueryWrapper = new QueryWrapper<>(); QueryWrapper<ShopOrderCb> cbQueryWrapper = new QueryWrapper<>();
cbQueryWrapper.in("order_id", order_ids); cbQueryWrapper.in("order_id", order_ids);
ShopOrderCb shopOrderCb = new ShopOrderCb(); ShopOrderCb shopOrderCb = new ShopOrderCb();
@ -4743,6 +4749,7 @@ public class ShopOrderBaseServiceImpl extends BaseServiceImpl<ShopOrderBaseMappe
shopOrderCbService.edit(shopOrderCb, cbQueryWrapper); shopOrderCbService.edit(shopOrderCb, cbQueryWrapper);
} }
// 确认收货
receive(order_ids, orderBaseList); receive(order_ids, orderBaseList);
if (CollUtil.isNotEmpty(order_info_rows) && CollUtil.isNotEmpty(dist_order_id)) { if (CollUtil.isNotEmpty(order_info_rows) && CollUtil.isNotEmpty(dist_order_id)) {
@ -4755,7 +4762,8 @@ public class ShopOrderBaseServiceImpl extends BaseServiceImpl<ShopOrderBaseMappe
payService.editPayCard(order_id, shopProductIndex); payService.editPayCard(order_id, shopProductIndex);
} }
if (!"".equals(shopProductIndex.getVoucher_activity_id())) { if (StrUtil.isNotBlank(shopProductIndex.getVoucher_activity_id())) {
// if (!"".equals(shopProductIndex.getVoucher_activity_id())) {
String[] voucher_activity_ids = shopProductIndex.getVoucher_activity_id().split(","); String[] voucher_activity_ids = shopProductIndex.getVoucher_activity_id().split(",");
// 优惠券购买发优惠卷处理 // 优惠券购买发优惠卷处理
for (String activity_id : voucher_activity_ids) { for (String activity_id : voucher_activity_ids) {
@ -4845,6 +4853,12 @@ public class ShopOrderBaseServiceImpl extends BaseServiceImpl<ShopOrderBaseMappe
shopDistributionUserOrderService.settleDistributionUserOrder(order_id); shopDistributionUserOrderService.settleDistributionUserOrder(order_id);
} }
// 重要拉卡拉给平台和代理商分账
Pair<Boolean, String> 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); ShopStoreAnalytics analytics_row = shopStoreAnalyticsService.get(store_id);
BigDecimal order_payment_amount = order_row.getOrder_payment_amount(); BigDecimal order_payment_amount = order_row.getOrder_payment_amount();

View File

@ -27,7 +27,9 @@ import com.suisung.mall.shop.order.mapper.ShopOrderLogisticsMapper;
import com.suisung.mall.shop.order.service.*; import com.suisung.mall.shop.order.service.*;
import com.suisung.mall.shop.store.service.ShopStoreExpressLogisticsService; import com.suisung.mall.shop.store.service.ShopStoreExpressLogisticsService;
import com.suisung.mall.shop.store.service.ShopStoreShippingAddressService; 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.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
@ -81,6 +83,10 @@ public class ShopOrderLogisticsServiceImpl extends BaseServiceImpl<ShopOrderLogi
@Autowired @Autowired
private ShopOrderShippingAddressService shopOrderShippingAddressService; private ShopOrderShippingAddressService shopOrderShippingAddressService;
@Lazy
@Autowired
private WxOrderShippingService wxOrderShippingService;
@Override @Override
public boolean saveOrderLogistics(ShopOrderLogistics column_row, Integer store_id, ShopOrderBase order_base_row) { public boolean saveOrderLogistics(ShopOrderLogistics column_row, Integer store_id, ShopOrderBase order_base_row) {
if (CheckUtil.isEmpty(column_row.getStock_bill_id())) { if (CheckUtil.isEmpty(column_row.getStock_bill_id())) {
@ -247,7 +253,29 @@ public class ShopOrderLogisticsServiceImpl extends BaseServiceImpl<ShopOrderLogi
} else { } else {
throw new ApiException(_("请设置默认发货地址(基础->辅助资料->发货地址!")); throw new ApiException(_("请设置默认发货地址(基础->辅助资料->发货地址!"));
} }
// todo 添加发货通知 // 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(); return CommonResult.success();