增加系统自动退款 相关逻辑。

This commit is contained in:
Jack 2025-07-03 18:27:43 +08:00
parent a39a0ab475
commit ff2b096a39
13 changed files with 274 additions and 82 deletions

View File

@ -280,7 +280,7 @@ public class StateCode {
public static final int RETURN_PROCESS_CHECK = 3105; //退单审核1ReturnReturn public static final int RETURN_PROCESS_CHECK = 3105; //退单审核1ReturnReturn
public static final int RETURN_PROCESS_RECEIVED = 3110; //收货确认0ReturnReturn public static final int RETURN_PROCESS_RECEIVED = 3110; //收货确认0ReturnReturn
public static final int RETURN_PROCESS_REFUND = 3115; //退款确认0ReturnReturn public static final int RETURN_PROCESS_REFUND = 3115; //退款确认0ReturnReturn
public static final int RETURN_PROCESS_RECEIPT_CONFIRMATION = 3120; //客户收款确认0ReturnReturn public static final int RETURN_PROCESS_RECEIPT_CONFIRMATION = 3120; //客户收款确认0ReturnReturn
public static final int RETURN_PROCESS_FINISH = 3125; //完成1ReturnReturn3130-商家拒绝退货 public static final int RETURN_PROCESS_FINISH = 3125; //完成1ReturnReturn3130-商家拒绝退货
public static final int RETURN_PROCESS_REFUSED = 3130; //-商家拒绝退货 public static final int RETURN_PROCESS_REFUSED = 3130; //-商家拒绝退货
public static final int RETURN_PROCESS_CANCEL = 3135; //-买家取消 public static final int RETURN_PROCESS_CANCEL = 3135; //-买家取消

View File

@ -134,6 +134,15 @@ public interface PayService {
@PostMapping(value = "/admin/pay/payController/aliPayRefund") @PostMapping(value = "/admin/pay/payController/aliPayRefund")
ShopOrderReturn aliPayRefund(@RequestBody ShopOrderReturn return_row); ShopOrderReturn aliPayRefund(@RequestBody ShopOrderReturn return_row);
/**
* 拉卡拉退款接口
*
* @param orderReturn
* @return
*/
@PostMapping(value = "/lklPayRefund")
ShopOrderReturn lklPayRefund(@RequestBody ShopOrderReturn orderReturn);
// 次卡处理发卡 // 次卡处理发卡
@PostMapping(value = "/card/pay/pay-card-info/editPayCard") @PostMapping(value = "/card/pay/pay-card-info/editPayCard")
boolean editPayCard(@RequestParam(name = "order_id") String order_id, boolean editPayCard(@RequestParam(name = "order_id") String order_id,

View File

@ -385,6 +385,12 @@ public class PayController {
return shopOrderReturn; return shopOrderReturn;
} }
@ApiOperation(value = "拉卡拉退款", notes = "拉卡拉退款")
@RequestMapping(value = "/lklPayRefund", method = RequestMethod.POST)
public ShopOrderReturn lklPayRefund(@RequestBody ShopOrderReturn orderReturn) {
return payUserPayService.wxPayRefund(orderReturn);
}
@ApiOperation(value = "获取用户资源信息", notes = "获取用户资源信息") @ApiOperation(value = "获取用户资源信息", notes = "获取用户资源信息")
@RequestMapping(value = "/resource", method = RequestMethod.GET) @RequestMapping(value = "/resource", method = RequestMethod.GET)
public CommonResult resourceIndex() { public CommonResult resourceIndex() {

View File

@ -49,6 +49,14 @@ public interface PayUserPayService extends IBaseService<PayUserPay> {
*/ */
ShopOrderReturn wxPayRefund(ShopOrderReturn orderReturn); ShopOrderReturn wxPayRefund(ShopOrderReturn orderReturn);
/**
* 拉卡拉 退款接口
*
* @param orderReturn
* @return
*/
ShopOrderReturn lklPayRefund(ShopOrderReturn orderReturn);
void wxRefundNotify(HttpServletRequest request); void wxRefundNotify(HttpServletRequest request);
ShopOrderReturn aliPayRefund(ShopOrderReturn orderReturn); ShopOrderReturn aliPayRefund(ShopOrderReturn orderReturn);

File diff suppressed because one or more lines are too long

View File

@ -1687,6 +1687,47 @@ public class PayUserPayServiceImpl extends BaseServiceImpl<PayUserPayMapper, Pay
return shopOrderReturn; return shopOrderReturn;
} }
/**
* 拉卡拉退款
*
* @param orderReturn
* @return
*/
@Override
public ShopOrderReturn lklPayRefund(ShopOrderReturn orderReturn) {
String deposit_trade_no = orderReturn.getDeposit_trade_no();
if (CheckUtil.isEmpty(deposit_trade_no)) {
deposit_trade_no = "";
}
BigDecimal trade_payment_amount = orderReturn.getTrade_payment_amount();
String refundAmount = Integer.toString(NumberUtil.mul(trade_payment_amount, 100).intValue());
WxPayApiConfig wxPayApiConfig = WxPayApiConfigKit.getWxPayApiConfig();
Map<String, String> params = RefundModel.builder().appid(wxPayApiConfig.getAppId()).mch_id(wxPayApiConfig.getMchId()).nonce_str(WxPayKit.generateStr()).transaction_id(deposit_trade_no).out_refund_no(WxPayKit.generateStr()).total_fee(refundAmount).refund_fee(refundAmount).build().createSign(wxPayApiConfig.getPartnerKey(), SignType.MD5);
logger.info(String.format(I18nUtil._("微信退款请求参数参数: params【%s】"), params.toString()));
InputStream certInStream = PayKit.getFileToStream(wxPayApiConfig.getCertPath());
//IJPAY低版本jdk环境使用退款方法jdk1.8.0_111以下
//String xmlResult = WxPayApi.orderRefund(false, params, certInStream, wxPayApiConfig.getMchId());
//下面的方法解决IJPAY高版本jdk导致退款协议不支持问题jdk1.8.0_111以上
String xmlResult = HttpKit.getDelegate().post(WxPayApi.getReqUrl(WxApiType.REFUND, null, false), WxPayKit.toXml(params), certInStream, wxPayApiConfig.getMchId(), "");
logger.info(String.format(I18nUtil._("微信退款返回参数: xmlResult【%s】"), xmlResult));
Map<String, String> resultMap = WxPayKit.xmlToMap(xmlResult);
String returnCode = resultMap.get("return_code");
String resultCode = resultMap.get("result_code");
if (!WxPayKit.codeIsOk(returnCode) || !WxPayKit.codeIsOk(resultCode)) {
LogUtil.error("微信退款异常!" + resultMap);
return null;
}
ShopOrderReturn shopOrderReturn = new ShopOrderReturn();
shopOrderReturn.setReturn_channel_flag(1);
shopOrderReturn.setDeposit_trade_no(deposit_trade_no);
shopOrderReturn.setOrder_id(orderReturn.getOrder_id());
shopOrderReturn.setReturn_channel_trans_id(resultMap.get("refund_id"));
shopOrderReturn.setReturn_channel_time(new Date());
return shopOrderReturn;
}
/** /**
* 微信退款成功回调 * 微信退款成功回调
* *

View File

@ -10,10 +10,10 @@ package com.suisung.mall.shop.lakala.controller.mobile;
import cn.hutool.json.JSONObject; import cn.hutool.json.JSONObject;
import com.suisung.mall.common.api.CommonResult; import com.suisung.mall.common.api.CommonResult;
import com.suisung.mall.common.service.GeTuiPushService;
import com.suisung.mall.common.service.impl.BaseControllerImpl; import com.suisung.mall.common.service.impl.BaseControllerImpl;
import com.suisung.mall.shop.lakala.service.LakalaApiService; import com.suisung.mall.shop.lakala.service.LakalaApiService;
import com.suisung.mall.shop.library.service.LibraryProductService; import com.suisung.mall.shop.library.service.LibraryProductService;
import com.suisung.mall.shop.order.service.ShopOrderReturnService;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import org.springframework.http.HttpStatus; import org.springframework.http.HttpStatus;
@ -35,7 +35,7 @@ public class LakalaController extends BaseControllerImpl {
private LakalaApiService lakalaPayService; private LakalaApiService lakalaPayService;
@Resource @Resource
private GeTuiPushService geTuiPushService; private ShopOrderReturnService shopOrderReturnService;
@Resource @Resource
private LibraryProductService libraryProductService; private LibraryProductService libraryProductService;
@ -43,7 +43,8 @@ public class LakalaController extends BaseControllerImpl {
@ApiOperation(value = "测试案例", notes = "测试案例") @ApiOperation(value = "测试案例", notes = "测试案例")
@RequestMapping(value = "/testcase", method = RequestMethod.POST) @RequestMapping(value = "/testcase", method = RequestMethod.POST)
public Object testcase(@RequestBody JSONObject paramsJSON) { public Object testcase(@RequestBody JSONObject paramsJSON) {
return lakalaPayService.applyLedgerMerEc(paramsJSON.getStr("mchMobile")); return shopOrderReturnService.sfExpressExpiredForceRefund(paramsJSON.getStr("orderId"), paramsJSON.getInt("returnFlag"));
// return lakalaPayService.applyLedgerMerEc(paramsJSON.getStr("mchMobile"));
// return lakalaPayService.LedgerMerEcDownload(975790666910121984L); // return lakalaPayService.LedgerMerEcDownload(975790666910121984L);
// return geTuiPushService.pushMessageToSingleByCid("f9da7081a7951cff6d7f1d4e2d2f270b", "", "从 shop 发消息", "none", ""); // return geTuiPushService.pushMessageToSingleByCid("f9da7081a7951cff6d7f1d4e2d2f270b", "", "从 shop 发消息", "none", "");

View File

@ -1632,7 +1632,7 @@ public class LakalaApiServiceImpl implements LakalaApiService {
String errorMsg = String.format("店铺[%s]未绑定平台方接收账户,跳过分账", shopOrderLkl.getStore_id()); String errorMsg = String.format("店铺[%s]未绑定平台方接收账户,跳过分账", shopOrderLkl.getStore_id());
log.error(errorMsg); log.error(errorMsg);
errorMessages.append(errorMsg).append("; "); errorMessages.append(errorMsg).append("; ");
lklOrderSeparateService.updateRemark(lklOrderSeparateExist.getId(), errorMsg); // lklOrderSeparateService.updateRemark(lklOrderSeparateExist.getId(), errorMsg);
continue; continue;
} }
@ -1641,7 +1641,6 @@ public class LakalaApiServiceImpl implements LakalaApiService {
if (!canSplit) { if (!canSplit) {
String errorMsg = String.format("店铺[%s]分账比例为0仅扣除运费", shopOrderLkl.getStore_id()); String errorMsg = String.format("店铺[%s]分账比例为0仅扣除运费", shopOrderLkl.getStore_id());
log.error(errorMsg); log.error(errorMsg);
lklOrderSeparateService.updateRemark(lklOrderSeparateExist.getId(), errorMsg);
} }
// 构建分账请求对象 // 构建分账请求对象
@ -1752,8 +1751,11 @@ public class LakalaApiServiceImpl implements LakalaApiService {
lklOrderSeparate.setTotal_separate_value(totalSeparateValue); lklOrderSeparate.setTotal_separate_value(totalSeparateValue);
try { try {
lklOrderSeparateService.addOrUpdateByReceiverNo(lklOrderSeparate); if (lklOrderSeparateService.addOrUpdateByReceiverNo(lklOrderSeparate)) {
successCount++; successCount++;
} else {
lklOrderSeparateService.updateRemark(lklOrderSeparate.getId(), errorMessages.toString());
}
} catch (Exception e) { } catch (Exception e) {
log.error("保存分账记录失败: {}", e.getMessage(), e); log.error("保存分账记录失败: {}", e.getMessage(), e);
errorMessages.append("保存分账记录失败; "); errorMessages.append("保存分账记录失败; ");
@ -1763,6 +1765,7 @@ public class LakalaApiServiceImpl implements LakalaApiService {
// 返回最终处理结果 // 返回最终处理结果
if (successCount == 0) { if (successCount == 0) {
return Pair.of(false, "分账全部失败: " + errorMessages); return Pair.of(false, "分账全部失败: " + errorMessages);
} else if (successCount < totalCount) { } else if (successCount < totalCount) {
return Pair.of(true, "部分分账成功,处理中: " + errorMessages); return Pair.of(true, "部分分账成功,处理中: " + errorMessages);
} else { } else {

View File

@ -82,6 +82,15 @@ public interface ShopOrderReturnService extends IBaseService<ShopOrderReturn> {
CommonResult doForceRefund(String return_id, Integer return_flag); CommonResult doForceRefund(String return_id, Integer return_flag);
/**
* 支付订单顺丰同城配送超时自动取消订单并退款加库存
*
* @param orderId 订单Id
* @param returnFlag 退货类型(ENUM): 0-不用退货;1-需要退货
* @return
*/
Boolean sfExpressExpiredForceRefund(String orderId, Integer returnFlag);
CommonResult editRefund(String return_id, BigDecimal return_refund_amount); CommonResult editRefund(String return_id, BigDecimal return_refund_amount);
/** /**

View File

@ -56,6 +56,7 @@ import com.suisung.mall.shop.store.service.ShopStoreBaseService;
import com.suisung.mall.shop.store.service.ShopStoreConfigService; import com.suisung.mall.shop.store.service.ShopStoreConfigService;
import com.suisung.mall.shop.store.service.ShopStoreShippingAddressService; import com.suisung.mall.shop.store.service.ShopStoreShippingAddressService;
import io.seata.spring.annotation.GlobalTransactional; import io.seata.spring.annotation.GlobalTransactional;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
@ -79,6 +80,7 @@ import static com.suisung.mall.common.utils.ContextUtil.getCurrentUser;
* @author Xinze * @author Xinze
* @since 2021-05-06 * @since 2021-05-06
*/ */
@Slf4j
@Service @Service
public class ShopOrderReturnServiceImpl extends BaseServiceImpl<ShopOrderReturnMapper, ShopOrderReturn> implements ShopOrderReturnService { public class ShopOrderReturnServiceImpl extends BaseServiceImpl<ShopOrderReturnMapper, ShopOrderReturn> implements ShopOrderReturnService {
@ -861,7 +863,7 @@ public class ShopOrderReturnServiceImpl extends BaseServiceImpl<ShopOrderReturnM
* 强制退货 * 强制退货
* *
* @param return_id * @param return_id
* @param return_flag * @param return_flag 退货类型(ENUM): 0-不用退货;1-需要退货
* @return * @return
*/ */
@Override @Override
@ -873,11 +875,12 @@ public class ShopOrderReturnServiceImpl extends BaseServiceImpl<ShopOrderReturnM
UserDto user = getCurrentUser(); UserDto user = getCurrentUser();
Integer store_id = Convert.toInt(user.getStore_id()); Integer store_id = Convert.toInt(user.getStore_id());
// 判断条件有问题吧平台 Platform 没有店铺id
if (user.isPlatform() || CheckUtil.checkDataRights(store_id, shopOrderReturn, ShopOrderReturn::getStore_id)) { if (user.isPlatform() || CheckUtil.checkDataRights(store_id, shopOrderReturn, ShopOrderReturn::getStore_id)) {
//平台方 强制退款 想将退款订单状态设置待审核状态 直接执行修改状态 然后再走退款流程 //平台方 强制退款 想将退款订单状态设置待审核状态 直接执行修改状态 然后再走退款流程
ShopOrderReturn orderReturn = new ShopOrderReturn(); ShopOrderReturn orderReturn = new ShopOrderReturn();
orderReturn.setReturn_state_id(StateCode.RETURN_PROCESS_CHECK); orderReturn.setReturn_state_id(StateCode.RETURN_PROCESS_CHECK);
editReturnNextState(return_ids, StateCode.RETURN_PROCESS_REFUSED, orderReturn); editShopOrderReturnAndItemNextState(return_ids, StateCode.RETURN_PROCESS_REFUSED, orderReturn);
shopOrderReturn.setReturn_state_id(StateCode.RETURN_PROCESS_CHECK); shopOrderReturn.setReturn_state_id(StateCode.RETURN_PROCESS_CHECK);
// end 待审核状态 // end 待审核状态
@ -895,6 +898,61 @@ public class ShopOrderReturnServiceImpl extends BaseServiceImpl<ShopOrderReturnM
return CommonResult.success(); return CommonResult.success();
} }
/**
* 支付订单顺丰同城配送超时自动取消订单并退款加库存
*
* @param orderId
* @param returnFlag 退货类型(ENUM): 0-不用退货;1-需要退货
* @return
*/
@GlobalTransactional
@Override
public Boolean sfExpressExpiredForceRefund(String orderId, Integer returnFlag) {
// 先整单退货申请
CommonResult commonResult = addWholeItems(orderId);
commonResult.checkFenResult();
QueryWrapper<ShopOrderReturn> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("order_id", orderId);
ShopOrderReturn shopOrderReturn = findOne(queryWrapper);
if (shopOrderReturn == null) {
throw new ApiException(I18nUtil._("订单信息异常!"));
}
returnFlag = CheckUtil.isEmpty(returnFlag) ? 0 : returnFlag;
// RETURN_PROCESS_SUBMIT = 3100; //客户提交退单1ReturnReturn
// RETURN_PROCESS_CHECK = 3105; //退单审核1ReturnReturn
// RETURN_PROCESS_RECEIVED = 3110; //收货确认0ReturnReturn
// RETURN_PROCESS_REFUND = 3115; //退款确认0ReturnReturn
// RETURN_PROCESS_RECEIPT_CONFIRMATION = 3120; //[客户收款确认0 ReturnReturn
// RETURN_PROCESS_FINISH = 3125; //完成1退货退款
// RETURN_PROCESS_REFUSED = 3130; //-商家拒绝退货
// RETURN_PROCESS_CANCEL = 3135; //-买家取消退款
List<String> return_ids = Collections.singletonList(shopOrderReturn.getReturn_id());
//订单已支付但拣货超时顺丰同城配送异常超时被取消 强制退款
ShopOrderReturn orderReturn = new ShopOrderReturn();
orderReturn.setReturn_state_id(StateCode.RETURN_PROCESS_RECEIVED);
orderReturn.setReturn_flag(returnFlag);
if (!editShopOrderReturnAndItemNextState(return_ids, StateCode.RETURN_PROCESS_CHECK, orderReturn)) {
throw new ApiException(I18nUtil._("修改订单信息失败!"));
}
shopOrderReturn.setReturn_state_id(StateCode.RETURN_PROCESS_RECEIVED);
shopOrderReturn.setReturn_flag(returnFlag);
// end 待审核状态
if (!edit(shopOrderReturn)) {
throw new ApiException(I18nUtil._("修改订单信息失败!"));
}
// 订单审核
return processReviewList(return_ids, Collections.singletonList(shopOrderReturn), StateCode.RETURN_PROCESS_RECEIVED, StateCode.RETURN_PROCESS_FINISH);
}
/** /**
* 修改退款退货记录 * 修改退款退货记录
* *
@ -979,7 +1037,8 @@ public class ShopOrderReturnServiceImpl extends BaseServiceImpl<ShopOrderReturnM
order_item_row.setOrder_item_return_num(order_item_row.getOrder_item_return_num() + return_item_num); order_item_row.setOrder_item_return_num(order_item_row.getOrder_item_return_num() + return_item_num);
order_item_row.setOrder_item_return_subtotal(NumberUtil.add(order_item_row.getOrder_item_return_subtotal(), return_item_subtotal)); order_item_row.setOrder_item_return_subtotal(NumberUtil.add(order_item_row.getOrder_item_return_subtotal(), return_item_subtotal));
// 乐观锁
order_item_row.setVersion(Optional.ofNullable(order_item_row.getVersion()).orElse(0) + 1);
if (!shopOrderItemService.edit(order_item_row)) { if (!shopOrderItemService.edit(order_item_row)) {
throw new ApiException(I18nUtil._("修改订单信息失败!")); throw new ApiException(I18nUtil._("修改订单信息失败!"));
} }
@ -1239,8 +1298,23 @@ public class ShopOrderReturnServiceImpl extends BaseServiceImpl<ShopOrderReturnM
return true; return true;
} }
/**
* @param return_ids 退单编号 return_ids return_rows 必须一个有值
* @param return_rows 退单数据 return_ids return_rows 必须一个有值
* @param return_curr_state_id 当前退单状态
* RETURN_PROCESS_SUBMIT = 3100; //客户提交退单1ReturnReturn
* RETURN_PROCESS_CHECK = 3105; //退单审核1ReturnReturn
* RETURN_PROCESS_RECEIVED = 3110; //收货确认0ReturnReturn
* RETURN_PROCESS_REFUND = 3115; //退款确认0ReturnReturn
* RETURN_PROCESS_RECEIPT_CONFIRMATION = 3120; //[客户收款确认0 ReturnReturn
* RETURN_PROCESS_FINISH = 3125; //完成1退货退款
* RETURN_PROCESS_REFUSED = 3130; //-商家拒绝退货
* RETURN_PROCESS_CANCEL = 3135; //-买家取消退款
* @param return_next_state_id
* @return
*/
@Override @Override
public boolean processReviewList(List<String> return_ids, List<ShopOrderReturn> return_rows, Integer state_id, Integer return_next_state_id) { public boolean processReviewList(List<String> return_ids, List<ShopOrderReturn> return_rows, Integer return_curr_state_id, Integer return_next_state_id) {
if (CollUtil.isEmpty(return_ids)) { if (CollUtil.isEmpty(return_ids)) {
throw new ApiException(I18nUtil._("请选择需要审核的退单!")); throw new ApiException(I18nUtil._("请选择需要审核的退单!"));
} }
@ -1256,7 +1330,7 @@ public class ShopOrderReturnServiceImpl extends BaseServiceImpl<ShopOrderReturnM
Integer return_state_id = return_row.getReturn_state_id(); Integer return_state_id = return_row.getReturn_state_id();
String return_id = return_row.getReturn_id(); String return_id = return_row.getReturn_id();
switch (state_id) { switch (return_curr_state_id) {
case StateCode.RETURN_PROCESS_CHECK: case StateCode.RETURN_PROCESS_CHECK:
// 退单审核1ReturnReturn // 退单审核1ReturnReturn
@ -1290,13 +1364,15 @@ public class ShopOrderReturnServiceImpl extends BaseServiceImpl<ShopOrderReturnM
ShopOrderReturn return_row = return_rows.get(0); ShopOrderReturn return_row = return_rows.get(0);
Integer store_id = return_row.getStore_id(); Integer store_id = return_row.getStore_id();
editNextState(review_ids, store_id, state_id, return_rows, return_next_state_id);
// 重要退款 加库存改状态
editNextState(review_ids, store_id, return_curr_state_id, return_rows, return_next_state_id);
return true; return true;
} }
/** /**
* 重要修改订单为下一个待处理状态实时退款 * 重要修改订单为下一个待处理状态加库存实时退款
* *
* @param return_ids 退货订单id * @param return_ids 退货订单id
* @param store_id 所属店铺 * @param store_id 所属店铺
@ -1306,9 +1382,9 @@ public class ShopOrderReturnServiceImpl extends BaseServiceImpl<ShopOrderReturnM
* RETURN_PROCESS_RECEIVED = 3110; //收货确认0ReturnReturn * RETURN_PROCESS_RECEIVED = 3110; //收货确认0ReturnReturn
* RETURN_PROCESS_REFUND = 3115; //退款确认0ReturnReturn * RETURN_PROCESS_REFUND = 3115; //退款确认0ReturnReturn
* RETURN_PROCESS_RECEIPT_CONFIRMATION = 3120; //[客户收款确认0 ReturnReturn * RETURN_PROCESS_RECEIPT_CONFIRMATION = 3120; //[客户收款确认0 ReturnReturn
* RETURN_PROCESS_FINISH = 3125; //完成1 ReturnReturn3130-商家拒绝退货 * RETURN_PROCESS_FINISH = 3125; //完成1退货退款
* RETURN_PROCESS_REFUSED = 3130; //-商家拒绝退货 * RETURN_PROCESS_REFUSED = 3130; //-商家拒绝退货
* RETURN_PROCESS_CANCEL = 3135; //-买家取消 * RETURN_PROCESS_CANCEL = 3135; //-买家取消退款
* @param return_rows 退货订单列表 * @param return_rows 退货订单列表
* @param return_next_state_id 下一个退单状态 * @param return_next_state_id 下一个退单状态
* @return * @return
@ -1381,7 +1457,7 @@ public class ShopOrderReturnServiceImpl extends BaseServiceImpl<ShopOrderReturnM
} }
//修改退货订单及其相关商品为下一个待处理状态 //修改退货订单及其相关商品为下一个待处理状态
editReturnNextState(return_ids, return_state_id, shopOrderReturn); editShopOrderReturnAndItemNextState(return_ids, return_state_id, shopOrderReturn);
// 当前状态旧状态 // 当前状态旧状态
if (ObjectUtil.equal(return_state_id, StateCode.RETURN_PROCESS_CHECK)) { if (ObjectUtil.equal(return_state_id, StateCode.RETURN_PROCESS_CHECK)) {
@ -1499,13 +1575,13 @@ public class ShopOrderReturnServiceImpl extends BaseServiceImpl<ShopOrderReturnM
* 修改退货订单及其相关商品为下一个待处理状态 * 修改退货订单及其相关商品为下一个待处理状态
* 这段代码实现了一个方法用于将退货订单及其相关商品的状态更新为下一个待处理状态 * 这段代码实现了一个方法用于将退货订单及其相关商品的状态更新为下一个待处理状态
* *
* @param return_ids 退货订单id * @param return_ids 退货订单id
* @param return_state_id 前订单状态 * @param return_curr_state_id 前订单状态
* @return * @return
*/ */
public boolean editReturnNextState(List<String> return_ids, Integer return_state_id, ShopOrderReturn shopOrderReturn) { public boolean editShopOrderReturnAndItemNextState(List<String> return_ids, Integer return_curr_state_id, ShopOrderReturn shopOrderReturn) {
QueryWrapper<ShopOrderReturn> returnQueryWrapper = new QueryWrapper<>(); QueryWrapper<ShopOrderReturn> returnQueryWrapper = new QueryWrapper<>();
returnQueryWrapper.in("return_id", return_ids).eq("return_state_id", return_state_id); returnQueryWrapper.in("return_id", return_ids).eq("return_state_id", return_curr_state_id);
if (!edit(shopOrderReturn, returnQueryWrapper)) { if (!edit(shopOrderReturn, returnQueryWrapper)) {
throw new ApiException(I18nUtil._("修改退单状态失败!")); throw new ApiException(I18nUtil._("修改退单状态失败!"));
} }
@ -1735,41 +1811,65 @@ public class ShopOrderReturnServiceImpl extends BaseServiceImpl<ShopOrderReturnM
@Override @Override
public List<String> getOnlineRefundReturnId() { public List<String> getOnlineRefundReturnId() {
QueryWrapper<ShopOrderReturn> queryWrapper = new QueryWrapper<>(); QueryWrapper<ShopOrderReturn> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("return_channel_flag", 0) queryWrapper.eq("return_channel_flag", 0) //渠道是否退款(ENUM): 0-待退; 1-已退; 2-异常
.in("return_channel_code", "alipay", "wx_native"); .in("return_channel_code", "alipay", "wx_native", "lakala");
return Convert.toList(String.class, findKey(queryWrapper)); return Convert.toList(String.class, findKey(queryWrapper));
} }
/** /**
* (支付宝微信)在线原路退款 * 在线原路退款支持支付宝微信拉卡拉
* <p>
* TODO 拉卡拉退款
* *
* @param return_id * @param return_id 退单ID
* @return * @return 退款操作是否成功
* <p>
* 功能说明根据退单ID获取退单信息依据支付渠道执行对应的退款操作并更新退款状态
*/ */
@Override @Override
public boolean doOnlineRefund(String return_id) { public boolean doOnlineRefund(String return_id) {
ShopOrderReturn shopOrderReturn = get(return_id); // 输入验证
String return_channel_code = shopOrderReturn.getReturn_channel_code(); if (StrUtil.isBlank(return_id)) {
if (StrUtil.equals(return_channel_code, "alipay")) { log.error("Invalid return_id: blank");
return false;
shopOrderReturn = payService.aliPayRefund(shopOrderReturn); }
if (shopOrderReturn == null) {
return false; ShopOrderReturn shopOrderReturn = get(return_id);
} if (shopOrderReturn == null) {
return updateRefundOrderReturn(shopOrderReturn); log.error("Order return not found: {}", return_id);
return false;
} else if (StrUtil.equals(return_channel_code, "wx_native")) { }
shopOrderReturn = payService.wxPayRefund(get(return_id)); String return_channel_code = shopOrderReturn.getReturn_channel_code();
if (shopOrderReturn == null) { if (StrUtil.isBlank(return_channel_code)) {
return false; log.error("Empty return_channel_code for return_id: {}", return_id);
} return false;
return updateRefundOrderReturn(shopOrderReturn); }
try {
// 统一处理不同支付渠道
switch (return_channel_code.toLowerCase()) {
case "alipay":
shopOrderReturn = payService.aliPayRefund(shopOrderReturn);
break;
case "wx_native":
shopOrderReturn = payService.wxPayRefund(shopOrderReturn);
break;
case "lakala":
shopOrderReturn = payService.lklPayRefund(shopOrderReturn);
break;
default:
log.warn("Unsupported payment channel: {}", return_channel_code);
return false;
}
if (shopOrderReturn == null) {
return false;
}
return updateRefundOrderReturn(shopOrderReturn);
} catch (Exception e) {
log.error("Error occurred during refund processing for return_id: {}", return_id, e);
return false;
} }
return false;
} }
/** /**
@ -1786,16 +1886,17 @@ public class ShopOrderReturnServiceImpl extends BaseServiceImpl<ShopOrderReturnM
queryWrapper.eq("order_id", shopOrderReturn.getOrder_id()) queryWrapper.eq("order_id", shopOrderReturn.getOrder_id())
.eq("deposit_trade_no", shopOrderReturn.getDeposit_trade_no()); .eq("deposit_trade_no", shopOrderReturn.getDeposit_trade_no());
ShopOrderReturn orderReturn = findOne(queryWrapper); ShopOrderReturn orderReturn = findOne(queryWrapper);
if (orderReturn != null && CheckUtil.isEmpty(orderReturn.getReturn_channel_flag())) { if (orderReturn != null && CheckUtil.isEmpty(orderReturn.getReturn_channel_flag())) {
logger.info(String.format("更新退款订单状态return_id : %s", orderReturn.getReturn_id())); logger.info(String.format("更新退款订单状态return_id : %s", orderReturn.getReturn_id()));
orderReturn.setReturn_channel_trans_id(shopOrderReturn.getReturn_channel_trans_id()); orderReturn.setReturn_channel_trans_id(shopOrderReturn.getReturn_channel_trans_id());
orderReturn.setReturn_channel_time(shopOrderReturn.getReturn_channel_time()); orderReturn.setReturn_channel_time(shopOrderReturn.getReturn_channel_time());
orderReturn.setReturn_channel_flag(shopOrderReturn.getReturn_channel_flag()); orderReturn.setReturn_channel_flag(shopOrderReturn.getReturn_channel_flag());
if (!edit(orderReturn)) { if (edit(orderReturn)) {
LogUtil.error(String.format("return_id : %s 退款失败!", orderReturn.getReturn_id())); return true;
return false;
} }
return true;
LogUtil.error(String.format("return_id : %s 退款失败!", orderReturn.getReturn_id()));
} }
return false; return false;
} }

View File

@ -28,6 +28,7 @@ import com.suisung.mall.common.utils.JsonUtil;
import com.suisung.mall.shop.message.service.PushMessageService; import com.suisung.mall.shop.message.service.PushMessageService;
import com.suisung.mall.shop.order.service.ShopOrderBaseService; import com.suisung.mall.shop.order.service.ShopOrderBaseService;
import com.suisung.mall.shop.order.service.ShopOrderInfoService; import com.suisung.mall.shop.order.service.ShopOrderInfoService;
import com.suisung.mall.shop.order.service.ShopOrderReturnService;
import com.suisung.mall.shop.sfexpress.service.SFExpressApiService; import com.suisung.mall.shop.sfexpress.service.SFExpressApiService;
import com.suisung.mall.shop.store.service.ShopStoreSameCityTransportBaseService; import com.suisung.mall.shop.store.service.ShopStoreSameCityTransportBaseService;
import com.suisung.mall.shop.store.service.ShopStoreSfOrderService; import com.suisung.mall.shop.store.service.ShopStoreSfOrderService;
@ -67,6 +68,9 @@ public class SFExpressApiServiceImpl implements SFExpressApiService {
@Autowired @Autowired
private ShopOrderInfoService shopOrderInfoService; private ShopOrderInfoService shopOrderInfoService;
@Autowired
private ShopOrderReturnService shopOrderReturnService;
@Lazy @Lazy
@Autowired @Autowired
private ShopStoreSameCityTransportBaseService shopStoreSameCityTransportBaseService; private ShopStoreSameCityTransportBaseService shopStoreSameCityTransportBaseService;
@ -265,7 +269,7 @@ public class SFExpressApiServiceImpl implements SFExpressApiService {
} }
// 转换 json 字符串参数 // 转换 json 字符串参数
String orderId = params.get("order_id").toString(); String sfOrderId = params.get("order_id").toString(); // 这是顺丰的订单号不是商城的订单号
params.putAll(buildCommonParams()); params.putAll(buildCommonParams());
String paramJSON = JsonUtil.toJSONString(params); String paramJSON = JsonUtil.toJSONString(params);
@ -290,7 +294,7 @@ public class SFExpressApiServiceImpl implements SFExpressApiService {
} }
// 判断订单的状态是否已经取消了已取消不再执行 // 判断订单的状态是否已经取消了已取消不再执行
ShopStoreSfOrder shopStoreSfOrderExist = shopStoreSfOrderService.getBySfOrderId(orderId); ShopStoreSfOrder shopStoreSfOrderExist = shopStoreSfOrderService.getByShopOrderId(sfOrderId);
if (shopStoreSfOrderExist == null) { if (shopStoreSfOrderExist == null) {
return new ThirdApiRes().fail(2, "订单有误!"); return new ThirdApiRes().fail(2, "订单有误!");
} }
@ -301,11 +305,11 @@ public class SFExpressApiServiceImpl implements SFExpressApiService {
return new ThirdApiRes().success("订单已取消过!"); return new ThirdApiRes().success("订单已取消过!");
} }
// 更改商城订单状态为已取消注意事务问题 // // 更改商城订单状态为已取消注意事务问题
List<String> orderList = new ArrayList<>(); // List<String> orderList = new ArrayList<>();
orderList.add(shopStoreSfOrderExist.getShop_order_id()); // orderList.add(shopStoreSfOrderExist.getShop_order_id());
// 取消订单, 流程订单状态积分众宝库存礼包优惠券 有就统统退还 // 取消订单, 流程订单状态积分众宝库存礼包优惠券 有就统统退还
Boolean success = shopOrderBaseService.cancel(orderList, null, false); // 不检查订单付款状态 Boolean success = shopOrderReturnService.sfExpressExpiredForceRefund(shopStoreSfOrderExist.getShop_order_id(), 0); // 不检查订单付款状态
if (!success) { if (!success) {
throw new ApiException(I18nUtil._("取消商家订单失败!")); throw new ApiException(I18nUtil._("取消商家订单失败!"));
} }
@ -549,9 +553,10 @@ public class SFExpressApiServiceImpl implements SFExpressApiService {
// 更改顺丰同城订单状态 // 更改顺丰同城订单状态
ShopStoreSfOrder shopStoreSfOrder = toShopStoreSfOrder(jsonData); ShopStoreSfOrder shopStoreSfOrder = toShopStoreSfOrder(jsonData);
String orderId = shopStoreSfOrder.getShop_order_id(); String shopOrderId = shopStoreSfOrder.getShop_order_id();
String sfOrderId = shopStoreSfOrder.getSf_order_id();
// 判断订单的状态是否已经取消了已取消不再执行 // 判断订单的状态是否已经取消了已取消不再执行
ShopStoreSfOrder shopStoreSfOrderExist = shopStoreSfOrderService.getBySfOrderId(orderId); ShopStoreSfOrder shopStoreSfOrderExist = shopStoreSfOrderService.getBySfOrderId(sfOrderId);
if (shopStoreSfOrderExist != null && shopStoreSfOrderExist.getOrder_status() != null if (shopStoreSfOrderExist != null && shopStoreSfOrderExist.getOrder_status() != null
&& (shopStoreSfOrderExist.getOrder_status().equals(StateCode.SF_ORDER_STATUS_CANCELED) || && (shopStoreSfOrderExist.getOrder_status().equals(StateCode.SF_ORDER_STATUS_CANCELED) ||
(shopStoreSfOrderExist.getOrder_status().equals(StateCode.SF_ORDER_STATUS_CANCELING)))) { (shopStoreSfOrderExist.getOrder_status().equals(StateCode.SF_ORDER_STATUS_CANCELING)))) {
@ -564,15 +569,18 @@ public class SFExpressApiServiceImpl implements SFExpressApiService {
} }
// 更改商城订单状态为已取消注意事务问题 // 更改商城订单状态为已取消注意事务问题
List<String> orderList = new ArrayList<>(); // List<String> orderList = new ArrayList<>();
orderList.add(shopStoreSfOrder.getShop_order_id()); // orderList.add(shopStoreSfOrder.getShop_order_id());
success = shopOrderBaseService.cancel(orderList, null, false);
// 重要订单取消
// success = shopOrderBaseService.cancel(orderList, null, false);
success = shopOrderReturnService.sfExpressExpiredForceRefund(shopOrderId, 0);
if (!success) { if (!success) {
return new ThirdApiRes().fail(-1, "取消订单业务处理失败!"); return new ThirdApiRes().fail(-1, "取消订单业务处理失败!");
} }
// 个推推送消息 // 个推推送消息
pushMessageService.noticeMerchantEmployeeOrderAction(null, orderId, "您有一笔取消订单", "您有一笔取消订单[" + orderId + "],请及时处理。", null); pushMessageService.noticeMerchantEmployeeOrderAction(null, shopOrderId, "您有一笔取消订单", "您有一笔取消订单[" + shopOrderId + "],请及时处理。", null);
return new ThirdApiRes().success("success"); return new ThirdApiRes().success("success");

View File

@ -201,22 +201,28 @@ public class ShopStoreConfigServiceImpl extends BaseServiceImpl<ShopStoreConfigM
/** /**
* 检查是否需要退款 * 检查是否需要退款
* *
* @param return_state_id RETURN_PROCESS_SUBMIT = 3100; //客户提交退单1ReturnReturn * @param return_state_id 当前退单状态
* RETURN_PROCESS_SUBMIT = 3100; //客户提交退单1ReturnReturn
* RETURN_PROCESS_CHECK = 3105; //退单审核1ReturnReturn * RETURN_PROCESS_CHECK = 3105; //退单审核1ReturnReturn
* RETURN_PROCESS_RECEIVED = 3110; //收货确认0ReturnReturn * RETURN_PROCESS_RECEIVED = 3110; //收货确认0ReturnReturn
* RETURN_PROCESS_REFUND = 3115; //退款确认0ReturnReturn * RETURN_PROCESS_REFUND = 3115; //退款确认0ReturnReturn
* RETURN_PROCESS_RECEIPT_CONFIRMATION = 3120; //客户收款确认0ReturnReturn * RETURN_PROCESS_RECEIPT_CONFIRMATION = 3120; //客户收款确认0 ReturnReturn
* RETURN_PROCESS_FINISH = 3125; //完成1ReturnReturn3130-商家拒绝退货 * RETURN_PROCESS_FINISH = 3125; //完成1退货退款
* RETURN_PROCESS_REFUSED = 3130; //-商家拒绝退货 * RETURN_PROCESS_REFUSED = 3130; //-商家拒绝退货
* RETURN_PROCESS_CANCEL = 3135; //-买家取消 * RETURN_PROCESS_CANCEL = 3135; //-买家取消退款
* @param return_next_state_id * @param return_next_state_id
* @return * @return
*/ */
@Override @Override
public boolean checkNeedRefund(Integer return_state_id, Integer return_next_state_id) { public boolean checkNeedRefund(Integer return_state_id, Integer return_next_state_id) {
//退款确认0ReturnReturn
Integer return_process_refund = StateCode.RETURN_PROCESS_MAP.get(StateCode.RETURN_PROCESS_REFUND); Integer return_process_refund = StateCode.RETURN_PROCESS_MAP.get(StateCode.RETURN_PROCESS_REFUND);
//客户收款确认
Integer return_process_receipt_confirmation = StateCode.RETURN_PROCESS_MAP.get(StateCode.RETURN_PROCESS_RECEIPT_CONFIRMATION); Integer return_process_receipt_confirmation = StateCode.RETURN_PROCESS_MAP.get(StateCode.RETURN_PROCESS_RECEIPT_CONFIRMATION);
// 当前退货状态
Integer return_process_return_state_id = StateCode.RETURN_PROCESS_MAP.get(return_state_id); Integer return_process_return_state_id = StateCode.RETURN_PROCESS_MAP.get(return_state_id);
// 下一个退货状态
Integer return_process_return_next_state_id = StateCode.RETURN_PROCESS_MAP.get(return_next_state_id); Integer return_process_return_next_state_id = StateCode.RETURN_PROCESS_MAP.get(return_next_state_id);
return ObjectUtil.notEqual(return_state_id, return_next_state_id) return ObjectUtil.notEqual(return_state_id, return_next_state_id)

24
pom.xml
View File

@ -317,18 +317,18 @@
<!-- sentinel配置 --> <!-- sentinel配置 -->
<sentinel.transport.dashboard>114.132.210.208:8718</sentinel.transport.dashboard> <sentinel.transport.dashboard>114.132.210.208:8718</sentinel.transport.dashboard>
<!-- mysql配置 --> <!-- mysql配置 -->
<mysql.host>42.194.196.179</mysql.host> <!-- <mysql.host>42.194.196.179</mysql.host>-->
<mysql.port>3306</mysql.port> <!-- <mysql.port>3306</mysql.port>-->
<mysql.db>mall_dev</mysql.db> <!-- <mysql.db>mall_dev</mysql.db>-->
<mysql.user>webdev</mysql.user> <!-- <mysql.user>webdev</mysql.user>-->
<mysql.pwd>jbFr9YewcA9Mihx6fnw51Kzq</mysql.pwd> <!-- <mysql.pwd>jbFr9YewcA9Mihx6fnw51Kzq</mysql.pwd>-->
<mysql.driver>com.mysql.cj.jdbc.Driver</mysql.driver> <!-- <mysql.driver>com.mysql.cj.jdbc.Driver</mysql.driver>-->
<!-- <mysql.host>127.0.0.1</mysql.host>--> <mysql.host>42.194.196.179</mysql.host>
<!-- <mysql.port>3306</mysql.port>--> <mysql.port>3306</mysql.port>
<!-- <mysql.db>mall_dev</mysql.db>--> <mysql.db>mall_prod</mysql.db>
<!-- <mysql.user>root</mysql.user>--> <mysql.user>root</mysql.user>
<!-- <mysql.pwd>123456</mysql.pwd>--> <mysql.pwd>J0XivNvAcR14}pA6Cysm.E27</mysql.pwd>
<!-- <mysql.driver>com.mysql.cj.jdbc.Driver</mysql.driver>--> <mysql.driver>com.mysql.cj.jdbc.Driver</mysql.driver>
<!-- redis配置 --> <!-- redis配置 -->
<redis.host>114.132.210.208</redis.host> <redis.host>114.132.210.208</redis.host>
<redis.database>15</redis.database> <redis.database>15</redis.database>