当客户申请退款大师傅手中所有金额时:

如果派了单给子师傅,就不全退。
如果没有派单给子师傅,就全退。
This commit is contained in:
Hawking 2023-04-20 00:49:09 +08:00
parent 8d3a159405
commit fb30737591
11 changed files with 119 additions and 53 deletions

View File

@ -108,7 +108,7 @@ public class AfterServiceRecordController extends BaseController {
public AjaxResult addSave(@RequestBody AfterServiceRecord afterServiceRecord) {
logger.info("新增售后记录:{}", afterServiceRecord);
OrderDetail orderDetail = orderDetailService.selectById(afterServiceRecord.getOrderDetailId());
if(orderDetail.getDrawCashTime() != null){
if (orderDetail.getDrawCashTime() != null) {
return AjaxResult.error("已发起分账子单,请联系师傅处理线下售后!");
}
return toAjax(afterServiceRecordService.insertAfterServiceRecord(afterServiceRecord));
@ -134,10 +134,6 @@ public class AfterServiceRecordController extends BaseController {
public AjaxResult editSave(@RequestBody AfterServiceRecord afterServiceRecord) {
logger.info("修改售后记录:{}", afterServiceRecord);
try {
OrderDetail orderDetail = orderDetailService.selectById(afterServiceRecord.getOrderDetailId());
if(orderDetail.getDrawCashTime() != null){
return AjaxResult.error("已发起分账子单,请联系师傅处理线下售后!");
}
return toAjax(afterServiceRecordService.updateAfterServiceRecord(afterServiceRecord));
} catch (Exception exception) {
logger.error(ExceptionUtils.getStackTrace(exception));

View File

@ -292,6 +292,7 @@ public class OrderController extends BaseController {
@ResponseBody
@Transactional(rollbackFor = Exception.class)
public AjaxResult assign(@RequestBody AppOrderAssignRequest request) throws BaseAdaPayException {
logger.info("分配订单请求参数:{}", request);
OrderMaster om = orderMasterService.selectById(request.getOrderMasterId());
Assert.notNull(om, "订单不存在");
FinancialMaster fm = financialMasterService.selectByOrderMasterId(om.getId());
@ -689,7 +690,7 @@ public class OrderController extends BaseController {
response.setServingOrderNum(orderDetailService.countOrderDetailList(orderDetail));
// 统计待确认单量
orderDetail.setOrderStatus(null);
orderDetail.setOrderStatusList(new ArrayList<Integer>(){{
orderDetail.setOrderStatusList(new ArrayList<Integer>() {{
add(4);
add(5);
}});

View File

@ -6,6 +6,7 @@ import com.ghy.common.core.text.Convert;
import com.ghy.common.enums.PayStatus;
import com.ghy.common.enums.RefundType;
import com.ghy.common.exception.base.BaseException;
import com.ghy.common.utils.AdapayUtils;
import com.ghy.common.utils.ObjectUtils;
import com.ghy.order.domain.AfterServiceImgs;
import com.ghy.order.domain.AfterServiceRecord;
@ -140,6 +141,8 @@ public class AfterServiceRecordServiceImpl implements IAfterServiceRecordService
private int agreeRefund(AfterServiceRecord afterServiceRecord) throws BaseAdaPayException {
OrderDetail orderDetail = orderDetailService.selectById(afterServiceRecord.getOrderDetailId());
Assert.notNull(orderDetail, "子单不存在!");
// DrawCashTime不为空说明已经发起过分账
Assert.isTrue(orderDetail.getDrawCashTime() == null, "子单已发起分账,请联系师傅处理线下售后!");
FinancialDetail financialDetail = financialDetailService.selectByOrderDetailId(afterServiceRecord.getOrderDetailId());
Assert.notNull(financialDetail, "财务子单不存在!");
OrderMaster orderMaster = orderMasterService.selectById(orderDetail.getOrderMasterId());
@ -155,34 +158,84 @@ public class AfterServiceRecordServiceImpl implements IAfterServiceRecordService
} else {
refundMoney = afterServiceRecord.getRefund();
}
if (refundMoney.compareTo(financialDetail.getPayMoney()) < 0) {
// 申请退款金额 < 子单金额
afterServiceRecord.setOriginalRefund(refundMoney);
financialDetail.setPayMoney(financialDetail.getPayMoney().subtract(refundMoney));
financialMaster.setPayMoney(financialMaster.getPayMoney().subtract(refundMoney));
// 更新主/子财务单金额
financialMasterService.updateFinancialMaster(financialMaster);
financialDetailService.updateFinancialDetail(financialDetail);
// 发起支付撤销
JSONObject response = adapayService.payReverse(orderMaster.getDeptId(), financialMaster.getPaymentId(),
String.valueOf(refundMoney), RefundType.RAS);
if (!AdapayStatusEnum.pending.code.equals(response.getString("status"))) {
log.error("发起退款异常,异常信息:{}", response);
if ("reverse_amt_over".equals(response.getString("error_code"))) {
throw new BaseException("退款金额超出订单金额");
} else {
throw new BaseException("发起退款失败");
// 是不是大师傅的子单
boolean isMaster = orderMaster.getWorkerId().equals(orderDetail.getWorkerId());
if (isMaster) {
// 如果这是大师傅的子单 退款金额最大可以等于主单服务金额
// 判断退款金额 >= 主单服务金额
boolean refundAll = refundMoney.compareTo(financialMaster.getServerMoney()) > -1;
List<OrderDetail> orderDetails = orderDetailService.selectByOrderMasterId(orderMaster.getId());
// 判断是否有派单给子师傅
boolean noneSubWorker = true;
for (OrderDetail od : orderDetails) {
if (!orderMaster.getWorkerId().equals(od.getWorkerId())) {
noneSubWorker = false;
break;
}
}
if (refundAll && noneSubWorker) {
// 如果退款金额 >= 主单服务金额 并且 没有派单给子师傅 则退整个主单
orderMasterService.cancelAgree(orderMaster.getId(), 1);
afterServiceRecord.setOriginalRefund(financialMaster.getPayMoney());
} else if (refundAll) {
// 如果退款金额 >= 主单服务金额 但是有派单给子师傅
afterServiceRecord.setOriginalRefund(financialMaster.getServerMoney());
// 退款金额就是主单服务金额
String reverseAmt = AdapayUtils.bigDecimalToString(financialMaster.getServerMoney());
// 更新主财务单 PayMoney=PayMoney-ServerMoney ServerMoney=0
financialMaster.setPayMoney(financialMaster.getPayMoney().subtract(financialMaster.getServerMoney()));
financialMaster.setServerMoney(BigDecimal.ZERO);
financialMasterService.updateFinancialMaster(financialMaster);
// 发起支付撤销
payReverse(orderMaster.getDeptId(), financialMaster.getPaymentId(), reverseAmt);
} else {
// 如果退款金额 < 主单服务金额
afterServiceRecord.setOriginalRefund(refundMoney);
financialMaster.setPayMoney(financialMaster.getPayMoney().subtract(refundMoney));
financialMaster.setServerMoney(financialMaster.getServerMoney().subtract(refundMoney));
financialMasterService.updateFinancialMaster(financialMaster);
String reverseAmt = AdapayUtils.bigDecimalToString(refundMoney);
// 发起支付撤销
payReverse(orderMaster.getDeptId(), financialMaster.getPaymentId(), reverseAmt);
}
} else {
// 子单全额退款 直接走取消流程
orderDetailService.cancelAgree(orderDetail.getId(), 1);
afterServiceRecord.setOriginalRefund(financialDetail.getPayMoney());
// 是子师傅的子单 退款金额最大可以等于子单的派单金额
if (refundMoney.compareTo(financialDetail.getPayMoney()) > -1) {
// 子单全额退款 直接走取消流程
orderDetailService.cancelAgree(orderDetail.getId(), 1);
afterServiceRecord.setOriginalRefund(financialDetail.getPayMoney());
} else {
afterServiceRecord.setOriginalRefund(refundMoney);
financialDetail.setPayMoney(financialDetail.getPayMoney().subtract(refundMoney));
financialMaster.setPayMoney(financialMaster.getPayMoney().subtract(refundMoney));
// 更新主/子财务单金额
financialMasterService.updateFinancialMaster(financialMaster);
financialDetailService.updateFinancialDetail(financialDetail);
// 发起支付撤销
String reverseAmt = AdapayUtils.bigDecimalToString(financialMaster.getServerMoney());
payReverse(orderMaster.getDeptId(), financialMaster.getPaymentId(), reverseAmt);
}
}
afterServiceRecord.setRefundApplyTime(new Date());
return afterServiceRecordMapper.updateAfterServiceRecord(afterServiceRecord);
}
private void payReverse(Long deptId, String paymentId, String reverseAmt) throws BaseAdaPayException {
JSONObject response = adapayService.payReverse(deptId, paymentId, reverseAmt, RefundType.RAS);
if (!AdapayStatusEnum.pending.code.equals(response.getString("status"))) {
log.error("发起退款异常,异常信息:{}", response);
if ("reverse_amt_over".equals(response.getString("error_code"))) {
throw new BaseException("退款金额超出订单金额");
} else {
throw new BaseException("发起退款失败");
}
}
}
/**
* 批量删除售后记录
*

View File

@ -303,7 +303,7 @@ public class OrderDetailServiceImpl implements OrderDetailService {
// 先把这个子单的加价单全退了
for (FinancialChangeRecord fcr : fcrList) {
if (PayStatus.PAID.getCode().equals(fcr.getPayStatus()) || PayStatus.PAYED_ADD.getCode().equals(fcr.getPayStatus())) {
executor.execute(() -> financialChangeRecordService.refund(orderMaster.getDeptId(), fcr));
executor.execute(() -> financialChangeRecordService.refund(orderMaster.getDeptId(), fcr.getId()));
// /子财务单里也加上了加价单的金额 所以这里减掉
masterMoney = masterMoney.subtract(fcr.getChangeMoney());
detailMoney = detailMoney.subtract(fcr.getChangeMoney());

View File

@ -311,7 +311,7 @@ public class OrderMasterServiceImpl implements OrderMasterService {
orderDetailService.updateByOrderMasterId(update);
// 发起退款 -- 如果是未付款的单不需要退款
FinancialMaster financialMaster = financialMasterService.selectByOrderMasterId(orderMasterId);
if(PayStatus.PAID.getCode().equals(financialMaster.getPayStatus())){
if (PayStatus.PAID.getCode().equals(financialMaster.getPayStatus())) {
refund(orderMaster);
}
break;
@ -381,14 +381,12 @@ public class OrderMasterServiceImpl implements OrderMasterService {
Assert.isTrue(paid, "订单未支付");
Assert.hasText(financialMaster.getPaymentId(), "找不到订单的支付记录,请联系管理员");
// 改主订单的订单状态和支付状态
updateStatus(orderMasterId, OrderStatus.CANCEL.code());
// 改主订单的支付状态
updatePayStatus(orderMasterId, PayStatus.REFUND.getCode());
// 改子订单的订单状态和支付状态
// 改子订单的支付状态
OrderDetail odUpdate = new OrderDetail();
odUpdate.setOrderMasterId(orderMasterId);
odUpdate.setPayStatus(PayStatus.REFUND.getCode());
odUpdate.setOrderStatus(OrderStatus.CANCEL.code());
orderDetailService.updateByOrderMasterId(odUpdate);
// 主订单金额=订单原价+加价
@ -396,40 +394,37 @@ public class OrderMasterServiceImpl implements OrderMasterService {
List<FinancialChangeRecord> fcrList = financialChangeRecordService.selectByMasterId(orderMasterId);
for (FinancialChangeRecord fcr : fcrList) {
// 把已支付的加价单退了 并从主单金额里减去
if (PayStatus.PAID.getCode().equals(fcr.getPayStatus())) {
financialChangeRecordService.refund(orderMaster.getDeptId(), fcr);
if (financialChangeRecordService.refund(orderMaster.getDeptId(), fcr.getId())) {
payMoney = payMoney.subtract(fcr.getChangeMoney());
}
}
// 修改主财务单状态
financialMasterService.updatePayStatus(financialMaster.getId(), PayStatus.REVERSING.getCode());
// 修改子财务单状态
List<FinancialDetail> fdList = financialDetailService.selectByFinancialMasterId(financialMaster.getId());
for (FinancialDetail fd : fdList) {
// 如果有已退款或正在退款的子财务单 从主单金额里减去
if (PayStatus.REFUND.getCode().equals(fd.getPayStatus()) ||
PayStatus.REFUNDING.getCode().equals(fd.getPayStatus()) ||
PayStatus.REVERSING.getCode().equals(fd.getPayStatus())) {
payMoney = payMoney.subtract(fd.getPayMoney());
} else if (PayStatus.PAID.getCode().equals(fd.getPayStatus()) ||
PayStatus.PAYED_ADD.getCode().equals(fd.getPayStatus())) {
// 修改子单状态
financialDetailService.updatePayStatus(fd.getId(), PayStatus.REVERSING.getCode());
if (PayStatus.PAID.getCode().equals(fd.getPayStatus())) {
financialDetailService.updatePayStatus(fd.getId(), PayStatus.REFUND.getCode());
}
}
if (payMoney.compareTo(BigDecimal.ZERO) < 1) {
logger.info("无需退款 reverseAmt={}", payMoney);
logger.info("主订单[{}]无需退款 reverseAmt={}", orderMasterId, payMoney);
}
String reverseAmt = payMoney.setScale(2, RoundingMode.DOWN).toString();
JSONObject response = adapayService.payReverse(orderMaster.getDeptId(), financialMaster.getPaymentId(), reverseAmt, RefundType.ROM);
if (AdapayStatusEnum.succeeded.code.equals(response.getString("status")) ||
AdapayStatusEnum.pending.code.equals(response.getString("status"))) {
// 主订单退款 直接修改主财务单状态为退款中
// 保存reverseId
String reverseId = response.getString("id");
financialMaster.setPayStatus(PayStatus.REVERSING.getCode());
financialMaster.setReverseId(reverseId);
financialMasterService.updateFinancialMaster(financialMaster);
FinancialMaster fm2up = new FinancialMaster();
fm2up.setId(financialMaster.getId());
fm2up.setReverseId(reverseId);
financialMasterService.updateFinancialMaster(fm2up);
} else {
logger.error("FM[{}]撤销支付失败: {}", financialMaster.getId(), response.toJSONString());
logger.error("主订单[{}]退款失败: {}", orderMasterId, response);
}
}

View File

@ -84,4 +84,6 @@ public interface FinancialMasterMapper {
* @param reverseId 撤销支付ID
*/
void refundSucceeded(@Param("reverseId") String reverseId);
int updatePayStatus(@Param(value = "id") Long id, @Param(value = "payStatus") int payStatus);
}

View File

@ -75,9 +75,9 @@ public interface FinancialChangeRecordService {
* 但不修改财务单的金额<br>
*
* @param deptId 公司ID
* @param fcr 加价单
* @param id 加价单ID
*/
boolean refund(Long deptId, FinancialChangeRecord fcr);
boolean refund(Long deptId, Long id);
/**
* 退款成功时 退款回调接口里会调用这个方法

View File

@ -100,4 +100,6 @@ public interface FinancialMasterService {
FinancialMaster selectByPaymentId(String paymentId);
void refundSucceeded(String reverseId);
int updatePayStatus(Long id, int payStatus);
}

View File

@ -132,7 +132,11 @@ public class FinancialChangeRecordServiceImpl implements FinancialChangeRecordSe
}
@Override
public boolean refund(Long deptId, FinancialChangeRecord fcr) {
public boolean refund(Long deptId, Long id) {
FinancialChangeRecord fcr = selectFinancialChangeRecordById(id);
if (fcr == null) {
return false;
}
FinancialChangeRecord update = new FinancialChangeRecord();
update.setId(fcr.getId());
update.setPayStatus(PayStatus.REFUNDING.getCode());
@ -144,7 +148,8 @@ public class FinancialChangeRecordServiceImpl implements FinancialChangeRecordSe
try {
response = adapayService.payReverse(deptId, fcr.getPaymentId(), reverseAmt, RefundType.RCG);
} catch (BaseAdaPayException e) {
throw new RuntimeException(e);
log.error("加价单退款失败: {}", e.getMessage(), e);
return false;
}
boolean status = AdapayStatusEnum.succeeded.code.equals(response.getString("status")) ||
AdapayStatusEnum.pending.code.equals(response.getString("status"));

View File

@ -160,6 +160,11 @@ public class FinancialMasterServiceImpl implements FinancialMasterService {
financialMasterMapper.refundSucceeded(reverseId);
}
@Override
public int updatePayStatus(Long id, int payStatus) {
return financialMasterMapper.updatePayStatus(id, payStatus);
}
@Override
public List<FinancialMaster> selectByOrderMasterIds(Set<Long> orderMasterIds) {
if (CollectionUtils.isEmpty(orderMasterIds)) {

View File

@ -140,6 +140,13 @@
WHERE reverse_id = #{reverseId}
</update>
<update id="updatePayStatus">
UPDATE financial_master SET
pay_status = #{payStatus} ,
update_time = NOW()
WHERE id = #{id}
</update>
<insert id="insertFinancialMaster" parameterType="com.ghy.payment.domain.FinancialMaster" useGeneratedKeys="true" keyProperty="id">
INSERT INTO financial_master(
<if test="deptId != null">dept_id,</if>