支付后更新生成服务主单财务状态,修改监控单的查询条件,增加商品主单 全单退款
This commit is contained in:
parent
4388cbb3f6
commit
bba67251af
|
|
@ -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
|
||||
|
|
@ -96,6 +99,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())) {
|
||||
|
||||
|
|
|
|||
|
|
@ -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());
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 师傅审核取消主订单申请
|
||||
*
|
||||
|
|
|
|||
|
|
@ -33,6 +33,8 @@ public class OrderListResponse {
|
|||
|
||||
private String orderMasterCode;
|
||||
|
||||
private String originalOrderMasterCode;
|
||||
|
||||
private Long orderDetailId;
|
||||
|
||||
private String orderDetailCode;
|
||||
|
|
|
|||
|
|
@ -119,4 +119,12 @@ public interface OrderMasterMapper {
|
|||
int updateCreateTime(Long id);
|
||||
|
||||
int updateOrderMasterAddressById(OrderMaster orderMaster);
|
||||
|
||||
/**
|
||||
* 根据商品主单ID查询服务主单
|
||||
*
|
||||
* @param goodsOrderMasterId 商品主单ID
|
||||
* @return 服务主单
|
||||
*/
|
||||
OrderMaster selectByGoodsOrderMasterId(Long goodsOrderMasterId);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -204,4 +204,12 @@ public interface OrderMasterService {
|
|||
*/
|
||||
int saveMasterWorkerRemark(Long orderMasterId, String workerRemark);
|
||||
|
||||
/**
|
||||
* 根据商品主单ID查询服务主单
|
||||
*
|
||||
* @param goodsOrderMasterId 商品主单ID
|
||||
* @return 服务主单
|
||||
*/
|
||||
OrderMaster selectByGoodsOrderMasterId(Long goodsOrderMasterId);
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -803,4 +803,9 @@ public class OrderMasterServiceImpl implements OrderMasterService {
|
|||
return orderMasterMapper.updateOrderMaster(orderMaster);
|
||||
}
|
||||
|
||||
@Override
|
||||
public OrderMaster selectByGoodsOrderMasterId(Long goodsOrderMasterId) {
|
||||
return orderMasterMapper.selectByGoodsOrderMasterId(goodsOrderMasterId);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
Loading…
Reference in New Issue