支付后更新生成服务主单财务状态,修改监控单的查询条件,增加商品主单 全单退款

This commit is contained in:
cb 2025-10-10 16:13:24 +08:00
parent 4388cbb3f6
commit bba67251af
8 changed files with 250 additions and 12 deletions

View File

@ -8,6 +8,8 @@ import com.ghy.common.adapay.model.PayCallback;
import com.ghy.common.adapay.model.PaymentDTO;
import com.ghy.common.enums.PayStatus;
import com.ghy.order.domain.OrderAddSubtract;
import com.ghy.order.domain.OrderMaster;
import com.ghy.order.mapper.OrderMasterMapper;
import com.ghy.order.service.IOrderAddSubtractService;
import com.ghy.order.service.OrderMasterService;
import com.ghy.payment.domain.FinancialChangeRecord;
@ -39,6 +41,7 @@ public class PayCallbackService implements CallBackService {
@Resource
OrderMasterService orderMasterService;
@Resource
FinancialMasterService financialMasterService;
@Resource
@ -97,6 +100,31 @@ public class PayCallbackService implements CallBackService {
financialMasterService.updatePay(relationId, paymentId, PayStatus.PAID.getCode());
log.info("主财务单[{}]支付成功", relationId);
// 检查是否为商品订单且有关联的服务订单需要同步更新服务订单财务主单支付状态
try {
OrderMaster orderMaster = orderMasterService.selectById(financialMaster.getOrderMasterId());
if (orderMaster != null && orderMaster.getOrderType() == 1 && orderMaster.getHasServiceOrder() == 1) {
// 查询关联的服务订单
OrderMaster serviceOrder = orderMasterService.selectByGoodsOrderMasterId(orderMaster.getId());
if (serviceOrder != null) {
// 查询服务订单对应的财务主单
FinancialMaster serviceFinancialMaster = financialMasterService.selectByOrderMasterId(serviceOrder.getId());
if (serviceFinancialMaster != null && !PayStatus.PAID.getCode().equals(serviceFinancialMaster.getPayStatus())) {
// 更新服务订单财务主单支付状态
financialMasterService.updatePay(serviceFinancialMaster.getId(), paymentId, PayStatus.PAID.getCode());
// 更新服务订单支付状态
orderMasterService.updatePayStatus(serviceOrder.getId(), PayStatus.PAID.getCode());
log.info("商品订单[{}]关联的服务订单[{}]财务主单[{}]支付状态已同步更新为已支付",
orderMaster.getId(), serviceOrder.getId(), serviceFinancialMaster.getId());
}
}
}
} catch (Exception e) {
log.error("同步更新商品订单关联服务订单支付状态时发生异常商品订单ID: {}, 异常信息: {}",
financialMaster.getOrderMasterId(), e.getMessage(), e);
}
} else if (PaymentRelation.FINANCIAL_CHANGE.equals(relation.getRelationIdType())) {
// 更新加价单的支付信息

View File

@ -578,14 +578,14 @@ public class OrderController extends BaseController {
Set<Long> workIds = orderDetailService.selectByOrderMasterId(om.getId()).stream()
.map(OrderDetail::getWorkerId).collect(Collectors.toSet());
if (workIds.size() > 1 || !workIds.contains(om.getWorkerId())) {
// 派完单 并且有其他师傅接单监控单
// 派完单 并且有其他师傅接单包含其他人监控单需要显示
om2up.setHasDispatchedAll(1);
om2up.setAllSelfAssigned(1);
om2up.setAllSelfAssigned(1); // 1表示有其他师傅参与
om2up.setOrderStatus(OrderStatus.PLAIN.code());
} else {
// 派完单 但是只有自己接单
// 派完单 但是只有自己接单只有自己监控单不显示
om2up.setHasDispatchedAll(1);
om2up.setAllSelfAssigned(0);
om2up.setAllSelfAssigned(0); // 0表示只有自己承接
if (request.getIsQuicklyDelivery() != null && request.getIsQuicklyDelivery() == 1) {
om2up.setOrderStatus(OrderStatus.SERVER.code());
} else {
@ -593,8 +593,8 @@ public class OrderController extends BaseController {
}
}
} else {
// 未派完单
om2up.setAllSelfAssigned(0);
// 未派完单还未完全派单暂不显示在监控单
om2up.setAllSelfAssigned(0); // 0表示未完成派单或只有自己
om2up.setHasDispatchedAll(0);
om2up.setOrderStatus(OrderStatus.PLAIN.code());
}

View File

@ -1,6 +1,8 @@
package com.ghy.web.controller.order;
import cn.hutool.core.date.DateUtil;
import com.alibaba.fastjson.JSONObject;
import com.ghy.common.annotation.Log;
import com.ghy.common.constant.UserConstants;
import com.ghy.common.core.controller.BaseController;
@ -26,6 +28,10 @@ import com.ghy.web.controller.order.AfterServiceDisputeRequest;
import com.ghy.payment.domain.FinancialChangeRecord;
import com.ghy.payment.domain.FinancialDetail;
import com.ghy.payment.domain.FinancialMaster;
import java.math.BigDecimal;
import java.util.List;
import org.apache.commons.lang3.StringUtils;
import com.ghy.payment.service.AdapayService;
import com.ghy.payment.service.FinancialChangeRecordService;
import com.ghy.payment.service.FinancialDetailService;
import com.ghy.payment.service.FinancialMasterService;
@ -117,6 +123,8 @@ public class OrderMasterController extends BaseController {
@Resource
private CustomerAddressService customerAddressService;
@Resource
private AdapayService adapayService;
@Resource
private IOrderAttachmentRecordService orderAttachmentRecordService;
@Resource
private InsuranceService insuranceService;
@ -1875,7 +1883,7 @@ public class OrderMasterController extends BaseController {
goodsWorker = workerService.selectById(goodsOrderMaster.getWorkerId());
goodsWorkerRealInfo = workerCertificationService.selectByWorkerId(goodsOrderMaster.getWorkerId());
orderStandardList=orderGoodsService.selectByOrderMasterId(goodsOrderMaster.getId());
orderListResponse.setOriginalOrderMasterCode(goodsOrderMaster.getCode());
}
if (masterWorker != null) {
// 大师傅实名信息
@ -2427,7 +2435,7 @@ public class OrderMasterController extends BaseController {
}
try {
// 判断是否为服务订单且需要退还服务金额
// 判断是否为服务订单且需要退还服务金额
if (isServiceOrder(orderMasterInfo) &&
orderMasterInfo.getGoodsOrderMasterId() != null &&
orderMasterInfo.getServerGoodsMoney() != null &&
@ -2514,6 +2522,180 @@ public class OrderMasterController extends BaseController {
}
}
/**
* 商品主单退单退款
* 用于商品主单生成了服务主单后先退服务主单然后再退商品主单
* 前提是这两个主单状态都必须是没有进入确认中状态不能是4-待确认
*
* @param goodsOrderMasterId 商品主单ID
*/
@PostMapping("/goodsOrderRefund")
@ResponseBody
@Transactional(rollbackFor = Exception.class)
public AjaxResult goodsOrderRefund(@RequestParam Long goodsOrderMasterId) {
logger.info("商品主单退单退款开始goodsOrderMasterId={}", goodsOrderMasterId);
try {
// 1. 检查商品主单是否存在
OrderMaster goodsOrderMaster = orderMasterService.selectById(goodsOrderMasterId);
if (goodsOrderMaster == null) {
return AjaxResult.error("商品主单不存在!");
}
// 2. 检查商品主单状态不能是待确认状态4
if (goodsOrderMaster.getOrderStatus().equals(OrderStatus.FINISH_CHECK.code())) {
return AjaxResult.error("商品主单已进入确认中状态,无法退单!");
}
// 3. 检查商品主单是否有关联的服务主单
if (goodsOrderMaster.getHasServiceOrder() != null && goodsOrderMaster.getHasServiceOrder() == 1) {
// 查找关联的服务主单
OrderMaster serviceOrderMaster = orderMasterService.selectByGoodsOrderMasterId(goodsOrderMasterId);
if (serviceOrderMaster != null) {
// 检查服务主单状态不能是待确认状态4
if (serviceOrderMaster.getOrderStatus().equals(OrderStatus.FINISH_CHECK.code())) {
return AjaxResult.error("关联的服务主单已进入确认中状态,无法退单!");
}
// 4. 先退服务主单
logger.info("开始退服务主单serviceOrderMasterId={}", serviceOrderMaster.getId());
OrderMaster serviceOrderParam = new OrderMaster();
serviceOrderParam.setId(serviceOrderMaster.getId());
AjaxResult serviceResult = consoleCancel(serviceOrderParam);
if (!serviceResult.get("code").equals(0)) {
logger.error("退服务主单失败:{}", serviceResult.get("msg"));
throw new RuntimeException("退服务主单失败:" + serviceResult.get("msg"));
}
logger.info("退服务主单成功serviceOrderMasterId={}", serviceOrderMaster.getId());
}
}
// 5. 再退商品主单
logger.info("开始退商品主单goodsOrderMasterId={}", goodsOrderMasterId);
OrderMaster goodsOrderParam = new OrderMaster();
goodsOrderParam.setId(goodsOrderMasterId);
AjaxResult goodsResult = consoleCancel(goodsOrderParam);
if (!goodsResult.get("code").equals(0)) {
logger.error("退商品主单失败:{}", goodsResult.get("msg"));
throw new RuntimeException("退商品主单失败:" + goodsResult.get("msg"));
}
logger.info("退商品主单成功goodsOrderMasterId={}", goodsOrderMasterId);
// 6. 退单成功后进行退款操作
try {
// 获取商品主单的财务信息
FinancialMaster financialMaster = financialMasterService.selectByOrderMasterId(goodsOrderMasterId);
if (financialMaster == null) {
logger.warn("未找到商品主单的财务信息goodsOrderMasterId={}", goodsOrderMasterId);
return AjaxResult.success("商品主单退单成功,但未找到财务信息,无法自动退款");
}
// 添加重复退款检查
if (financialMaster.getPayStatus() != null && (financialMaster.getPayStatus() == 3 || financialMaster.getPayStatus() == 4)) {
logger.warn("财务主单已处于退款中或已退款状态无法重复退款goodsOrderMasterId={}, payStatus={}", goodsOrderMasterId, financialMaster.getPayStatus());
return AjaxResult.error("订单已处于退款中或已退款状态,无法重复退款");
}
// 计算退款金额使用财务主单的payMoney
BigDecimal refundAmount = financialMaster.getPayMoney();
if (refundAmount == null || refundAmount.compareTo(BigDecimal.ZERO) <= 0) {
logger.info("商品主单退款金额为零goodsOrderMasterId={}, refundAmount={}", goodsOrderMasterId, refundAmount);
return AjaxResult.success("商品主单退单成功,无需退款(金额为零)");
}
// 检查支付状态只有已支付的订单才需要退款
if (financialMaster.getPayStatus() == null || financialMaster.getPayStatus() != 1) {
logger.info("商品主单未支付无需退款goodsOrderMasterId={}, payStatus={}", goodsOrderMasterId, financialMaster.getPayStatus());
return AjaxResult.success("商品主单退单成功,无需退款(未支付)");
}
// 更新财务主单状态为退款中
financialMaster.setPayStatus(3); // 3表示退款中
financialMasterService.updateFinancialMaster(financialMaster);
logger.info("更新财务主单状态为退款中financialMasterId={}", financialMaster.getId());
// 更新财务子单状态为退款中
List<FinancialDetail> financialDetails = financialDetailService.selectByFinancialMasterId(financialMaster.getId());
for (FinancialDetail detail : financialDetails) {
detail.setPayStatus(3); // 3表示退款中
financialDetailService.updateFinancialDetail(detail);
}
logger.info("更新财务子单状态为退款中,财务子单数量={}", financialDetails.size());
// 调用支付撤销接口进行退款
logger.info("开始调用支付撤销接口paymentId={}, refundAmount={}", financialMaster.getPaymentId(), refundAmount);
JSONObject reverseResult = adapayService.payReverse(goodsOrderMasterId, financialMaster.getPaymentId(), refundAmount.toPlainString(), RefundType.ROM);
// 修复退款结果判断逻辑
if (reverseResult != null && reverseResult.containsKey("reverseId") && reverseResult.getString("reverseId") != null) {
// 完善reverseId保存逻辑添加空值检查
String reverseId = reverseResult.getString("reverseId");
if (reverseId != null && !reverseId.trim().isEmpty()) {
financialMaster.setReverseId(reverseId);
financialMaster.setPayStatus(4); // 更新为已退款状态
financialMasterService.updateFinancialMaster(financialMaster);
// 更新财务子单状态为已退款
for (FinancialDetail detail : financialDetails) {
detail.setPayStatus(4); // 4表示已退款
financialDetailService.updateFinancialDetail(detail);
}
logger.info("退款成功reverseId={}, goodsOrderMasterId={}", reverseId, goodsOrderMasterId);
return AjaxResult.success("商品主单退单退款成功退款ID" + reverseId);
} else {
logger.error("退款接口返回的reverseId为空goodsOrderMasterId={}, reverseResult={}", goodsOrderMasterId, reverseResult);
}
} else {
logger.error("退款接口返回异常结果goodsOrderMasterId={}, reverseResult={}", goodsOrderMasterId, reverseResult);
}
// 退款失败恢复财务状态
logger.error("退款失败开始恢复财务状态goodsOrderMasterId={}", goodsOrderMasterId);
financialMaster.setPayStatus(1); // 恢复为已支付状态
financialMasterService.updateFinancialMaster(financialMaster);
for (FinancialDetail detail : financialDetails) {
detail.setPayStatus(1); // 恢复为已支付状态
financialDetailService.updateFinancialDetail(detail);
}
return AjaxResult.error("退单成功但退款失败,请联系管理员处理");
} catch (Exception refundException) {
// 退款异常处理 - 改进异常处理和日志记录
logger.error("退款过程中发生异常goodsOrderMasterId={}, 异常类型={}, 异常信息={}",
goodsOrderMasterId, refundException.getClass().getSimpleName(), refundException.getMessage(), refundException);
// 尝试恢复财务状态
try {
FinancialMaster financialMaster = financialMasterService.selectByOrderMasterId(goodsOrderMasterId);
if (financialMaster != null && financialMaster.getPayStatus() == 3) {
financialMaster.setPayStatus(1); // 恢复为已支付状态
financialMasterService.updateFinancialMaster(financialMaster);
List<FinancialDetail> financialDetails = financialDetailService.selectByFinancialMasterId(financialMaster.getId());
for (FinancialDetail detail : financialDetails) {
if (detail.getPayStatus() == 3) {
detail.setPayStatus(1); // 恢复为已支付状态
financialDetailService.updateFinancialDetail(detail);
}
}
logger.info("异常情况下成功恢复财务状态goodsOrderMasterId={}", goodsOrderMasterId);
}
} catch (Exception recoverException) {
logger.error("恢复财务状态时发生异常goodsOrderMasterId={}, 恢复异常信息={}",
goodsOrderMasterId, recoverException.getMessage(), recoverException);
}
return AjaxResult.error("退单成功但退款过程中发生异常:" + refundException.getMessage());
}
} catch (Exception e) {
logger.error("商品主单退单退款失败goodsOrderMasterId={}, 错误信息={}", goodsOrderMasterId, e.getMessage(), e);
return AjaxResult.error("商品主单退单退款失败:" + e.getMessage());
}
}
/**
* 师傅审核取消主订单申请
*

View File

@ -33,6 +33,8 @@ public class OrderListResponse {
private String orderMasterCode;
private String originalOrderMasterCode;
private Long orderDetailId;
private String orderDetailCode;

View File

@ -119,4 +119,12 @@ public interface OrderMasterMapper {
int updateCreateTime(Long id);
int updateOrderMasterAddressById(OrderMaster orderMaster);
/**
* 根据商品主单ID查询服务主单
*
* @param goodsOrderMasterId 商品主单ID
* @return 服务主单
*/
OrderMaster selectByGoodsOrderMasterId(Long goodsOrderMasterId);
}

View File

@ -204,4 +204,12 @@ public interface OrderMasterService {
*/
int saveMasterWorkerRemark(Long orderMasterId, String workerRemark);
/**
* 根据商品主单ID查询服务主单
*
* @param goodsOrderMasterId 商品主单ID
* @return 服务主单
*/
OrderMaster selectByGoodsOrderMasterId(Long goodsOrderMasterId);
}

View File

@ -803,4 +803,9 @@ public class OrderMasterServiceImpl implements OrderMasterService {
return orderMasterMapper.updateOrderMaster(orderMaster);
}
@Override
public OrderMaster selectByGoodsOrderMasterId(Long goodsOrderMasterId) {
return orderMasterMapper.selectByGoodsOrderMasterId(goodsOrderMasterId);
}
}

View File

@ -250,7 +250,7 @@
AND ca.country_id = #{district}
</if>
<if test="isMonitoredOrder">
AND (om.has_dispatched_all = 0 OR (om.has_dispatched_all = 1 AND om.all_self_assigned = 0)) AND om.order_status in (0,1,2,3,4) and om.worker_id is not null
AND om.all_self_assigned = 1 AND om.order_status in (0,1,2,3,4) and om.worker_id is not null
</if>
<if test="allSelfAssigned != null">
AND all_self_assigned = #{allSelfAssigned}
@ -399,7 +399,7 @@
LEFT JOIN financial_master fm ON om.id = fm.order_master_id
<where>
<if test="isMonitoredOrder">
AND (om.has_dispatched_all = 0 OR (om.has_dispatched_all = 1 AND om.all_self_assigned = 0)) AND om.order_status in (1,2,3,4)
AND om.all_self_assigned = 1 AND om.order_status in (1,2,3,4)
</if>
<if test="allSelfAssigned != null">
AND all_self_assigned = #{allSelfAssigned}
@ -612,7 +612,8 @@
<if test="workerRemark != null">worker_remark,</if>
<if test="shareAccountCountdownEndTime != null">share_account_countdown_end_time,</if>
<if test="shareAccountCountdownDuration != null">share_account_countdown_duration,</if>
create_time
create_time,
update_time
)VALUES(
<if test="deptId != null and deptId != 0">#{deptId},</if>
<if test="code != null">#{code},</if>
@ -667,6 +668,7 @@
<if test="workerRemark != null">#{workerRemark},</if>
<if test="shareAccountCountdownEndTime != null">#{shareAccountCountdownEndTime},</if>
<if test="shareAccountCountdownDuration != null">#{shareAccountCountdownDuration},</if>
SYSDATE(),
SYSDATE()
)
</insert>
@ -780,6 +782,9 @@
WHERE id = #{id}
</update>
<select id="selectByGoodsOrderMasterId" parameterType="Long" resultMap="OrderMasterResult">
<include refid="selectOrderMaster"/>
WHERE goods_order_master_id = #{goodsOrderMasterId}
</select>
</mapper>