优化商品售后的退款流程

This commit is contained in:
cb 2025-09-05 10:28:28 +08:00
parent a75d05bc9a
commit a64f1728ac
5 changed files with 151 additions and 4 deletions

View File

@ -186,4 +186,14 @@ public class AfterServiceRecordController extends BaseController {
public AjaxResult returnGoods(@RequestBody AfterServiceRecord afterServiceRecord) { public AjaxResult returnGoods(@RequestBody AfterServiceRecord afterServiceRecord) {
return afterServiceRecordService.returnGoods(afterServiceRecord); return afterServiceRecordService.returnGoods(afterServiceRecord);
} }
/**
* 师傅确认收货
* 师傅确认收到货物后根据同意处理方式决定是否执行退款
*/
@PostMapping("/workerConfirmReceive")
@ResponseBody
public AjaxResult workerConfirmReceive(@RequestBody AfterServiceRecord afterServiceRecord) {
return afterServiceRecordService.workerConfirmReceive(afterServiceRecord);
}
} }

View File

@ -161,6 +161,10 @@ public class AfterServiceRecord extends BaseEntity
@Excel(name = "师傅同意处理方式1-即时退单退款2-货物拦截后退单退款3-快递返回货物后退单退款4-退回货物后退单退款") @Excel(name = "师傅同意处理方式1-即时退单退款2-货物拦截后退单退款3-快递返回货物后退单退款4-退回货物后退单退款")
private Integer workerAgreeType; private Integer workerAgreeType;
/** 师傅收货确认0-未收货1-已收货 */
@Excel(name = "师傅收货确认0-未收货1-已收货")
private Integer workerReceiveConfirm;
/** 客户不同意图片 */ /** 客户不同意图片 */
@Excel(name = "客户不同意图片") @Excel(name = "客户不同意图片")
private String customerDisagreeImages; private String customerDisagreeImages;

View File

@ -128,4 +128,13 @@ public interface IAfterServiceRecordService {
* @return 超时的售后记录列表 * @return 超时的售后记录列表
*/ */
List<AfterServiceRecord> selectWorkerResendTimeoutRecords(); List<AfterServiceRecord> selectWorkerResendTimeoutRecords();
/**
* 师傅确认收货
* 师傅确认收到货物后根据同意处理方式决定是否执行退款
*
* @param afterServiceRecord 售后记录
* @return 操作结果
*/
AjaxResult workerConfirmReceive(AfterServiceRecord afterServiceRecord);
} }

View File

@ -431,9 +431,25 @@ public class AfterServiceRecordServiceImpl implements IAfterServiceRecordService
afterServiceRecord.setCustomerFinalCheck(1L); afterServiceRecord.setCustomerFinalCheck(1L);
log.info("商品售后-客户同意处理方案"); log.info("商品售后-客户同意处理方案");
// 注意客户同意重发补发方案后不立即结束售后流程 // 商品售后特殊处理客户同意且师傅选择即时退单退款时立即执行退款
// 而是等待倒计时结束由定时器自动处理 if (afterServiceRecord.getWorkerAgreeType() != null && afterServiceRecord.getWorkerAgreeType() == 1) {
// 这样可以给师傅时间完成重发补发操作 log.info("商品售后-客户同意且师傅选择即时退单退款立即执行退款记录ID{}", param.getId());
afterServiceRecord.setRefundApplyTime(new Date());
// 执行退款逻辑
try {
executeRefundLogic(afterServiceRecord);
log.info("商品售后-即时退单退款执行成功记录ID{}", param.getId());
} catch (Exception e) {
log.error("商品售后-即时退单退款执行失败记录ID{},错误:{}", param.getId(), e.getMessage());
}
} else {
// 注意客户同意重发补发方案后不立即结束售后流程
// 而是等待倒计时结束由定时器自动处理
// 这样可以给师傅时间完成重发补发操作
log.info("商品售后-非即时退款方式等待师傅确认收货后执行退款记录ID{},同意方式:{}",
param.getId(), afterServiceRecord.getWorkerAgreeType());
}
} else { } else {
afterServiceRecord.setCustomerFinalCheck(0L); afterServiceRecord.setCustomerFinalCheck(0L);
@ -689,6 +705,26 @@ public class AfterServiceRecordServiceImpl implements IAfterServiceRecordService
return; return;
} }
// 商品售后需要检查师傅收货确认状态
if (afterServiceRecord.getAfterServiceCategory() != null && afterServiceRecord.getAfterServiceCategory().equals(2)) {
// 商品售后
if (afterServiceRecord.getWorkerAgreeType() != null && afterServiceRecord.getWorkerAgreeType() != 1) {
// 非即时退单退款需要师傅确认收货
if (afterServiceRecord.getWorkerReceiveConfirm() == null || afterServiceRecord.getWorkerReceiveConfirm() != 1) {
log.info("商品售后非即时退款师傅未确认收货暂不执行退款售后记录ID{},同意方式:{},收货确认:{}",
afterServiceRecord.getId(), afterServiceRecord.getWorkerAgreeType(), afterServiceRecord.getWorkerReceiveConfirm());
return;
}
} else if (afterServiceRecord.getWorkerAgreeType() != null && afterServiceRecord.getWorkerAgreeType() == 1) {
// 即时退单退款需要客户同意
if (afterServiceRecord.getCustomerFinalCheck() == null || afterServiceRecord.getCustomerFinalCheck() != 1) {
log.info("商品售后即时退款客户未同意暂不执行退款售后记录ID{},客户确认:{}",
afterServiceRecord.getId(), afterServiceRecord.getCustomerFinalCheck());
return;
}
}
}
// 执行退款逻辑 // 执行退款逻辑
agreeRefund(afterServiceRecord); agreeRefund(afterServiceRecord);
log.info("定时器自动执行退款逻辑完成售后记录ID{}", afterServiceRecord.getId()); log.info("定时器自动执行退款逻辑完成售后记录ID{}", afterServiceRecord.getId());
@ -1087,4 +1123,88 @@ public class AfterServiceRecordServiceImpl implements IAfterServiceRecordService
log.info("等待客户退回货物确认记录ID{}", record.getId()); log.info("等待客户退回货物确认记录ID{}", record.getId());
} }
/**
* 师傅确认收货
* 师傅确认收到货物后根据同意处理方式决定是否执行退款
*/
@Override
public AjaxResult workerConfirmReceive(AfterServiceRecord param) {
try {
log.info("师傅确认收货售后记录ID{}", param.getId());
// 查询售后记录
AfterServiceRecord afterServiceRecord = afterServiceRecordMapper.selectAfterServiceRecordById(param.getId());
if (afterServiceRecord == null) {
return AjaxResult.error("售后记录不存在");
}
// 验证是否为商品售后
if (afterServiceRecord.getAfterServiceCategory() == null || !afterServiceRecord.getAfterServiceCategory().equals(2)) {
return AjaxResult.error("只有商品售后才能进行收货确认");
}
// 验证师傅同意处理方式
if (afterServiceRecord.getWorkerAgreeType() == null) {
return AjaxResult.error("请先选择师傅同意处理方式");
}
// 设置师傅收货确认
afterServiceRecord.setWorkerReceiveConfirm(1); // 1-已收货
afterServiceRecord.setUpdateTime(new Date());
// 根据师傅同意处理方式决定是否执行退款
int agreeType = afterServiceRecord.getWorkerAgreeType();
if (agreeType == 1) {
// 1-即时退单退款客户同意时已经执行退款师傅确认收货不需要再退款
log.info("即时退单退款客户同意时已执行退款师傅确认收货无需重复退款记录ID{}", param.getId());
} else if (agreeType == 2) {
// 2-货物拦截后退单退款需要等货物拦截成功
log.info("货物拦截后退单退款师傅确认收货后执行退款记录ID{}", param.getId());
afterServiceRecord.setRefundApplyTime(new Date());
// 执行退款逻辑
try {
executeRefundLogic(afterServiceRecord);
log.info("货物拦截后退单退款执行成功记录ID{}", param.getId());
} catch (Exception e) {
log.error("货物拦截后退单退款执行失败记录ID{},错误:{}", param.getId(), e.getMessage());
}
} else if (agreeType == 3) {
// 3-快递返回货物后退单退款需要等快递返回
log.info("快递返回货物后退单退款师傅确认收货后执行退款记录ID{}", param.getId());
afterServiceRecord.setRefundApplyTime(new Date());
// 执行退款逻辑
try {
executeRefundLogic(afterServiceRecord);
log.info("快递返回货物后退单退款执行成功记录ID{}", param.getId());
} catch (Exception e) {
log.error("快递返回货物后退单退款执行失败记录ID{},错误:{}", param.getId(), e.getMessage());
}
} else if (agreeType == 4) {
// 4-退回货物后退单退款需要等客户退回货物
log.info("退回货物后退单退款师傅确认收货后执行退款记录ID{}", param.getId());
afterServiceRecord.setRefundApplyTime(new Date());
// 执行退款逻辑
try {
executeRefundLogic(afterServiceRecord);
log.info("退回货物后退单退款执行成功记录ID{}", param.getId());
} catch (Exception e) {
log.error("退回货物后退单退款执行失败记录ID{},错误:{}", param.getId(), e.getMessage());
}
}
// 更新售后记录
afterServiceRecordMapper.updateAfterServiceRecord(afterServiceRecord);
log.info("师傅确认收货操作完成记录ID{},同意方式:{}", param.getId(), agreeType);
return AjaxResult.success("师傅确认收货成功");
} catch (Exception e) {
log.error("师傅确认收货操作异常记录ID{}", param.getId(), e);
return AjaxResult.error("师傅确认收货操作失败:" + e.getMessage());
}
}
} }

View File

@ -46,6 +46,7 @@
<result property="workerResendTrackingNumber" column="worker_resend_tracking_number" /> <result property="workerResendTrackingNumber" column="worker_resend_tracking_number" />
<result property="workerReceiveStatus" column="worker_receive_status" /> <result property="workerReceiveStatus" column="worker_receive_status" />
<result property="workerAgreeType" column="worker_agree_type" /> <result property="workerAgreeType" column="worker_agree_type" />
<result property="workerReceiveConfirm" column="worker_receive_confirm" />
<result property="customerDisagreeImages" column="customer_disagree_images" /> <result property="customerDisagreeImages" column="customer_disagree_images" />
<result property="customerDisagreeReason" column="customer_disagree_reason" /> <result property="customerDisagreeReason" column="customer_disagree_reason" />
</resultMap> </resultMap>
@ -55,7 +56,7 @@
worker_feedback_reason_type, worker_feedback_reason, refund, agreed_refund, original_refund, worker_feedback_reason_type, worker_feedback_reason, refund, agreed_refund, original_refund,
customer_final_check, create_by, create_time, update_by, update_time, remark, refund_apply_time, customer_agree_redo, customer_final_check, create_by, create_time, update_by, update_time, remark, refund_apply_time, customer_agree_redo,
redo_complete_time, redo_complete_remark, redo_complete_images, is_auto_processed, after_service_category, after_service_type, return_status, redo_complete_time, redo_complete_remark, redo_complete_images, is_auto_processed, after_service_category, after_service_type, return_status,
return_address, return_contact, return_phone, return_type, return_remark, return_images, return_tracking_number, return_ship_time, merchant_receive_time, worker_resend_plan, worker_resend_time, worker_resend_type, worker_resend_tracking_number, worker_receive_status, worker_agree_type, return_address, return_contact, return_phone, return_type, return_remark, return_images, return_tracking_number, return_ship_time, merchant_receive_time, worker_resend_plan, worker_resend_time, worker_resend_type, worker_resend_tracking_number, worker_receive_status, worker_agree_type, worker_receive_confirm,
customer_disagree_images, customer_disagree_reason customer_disagree_images, customer_disagree_reason
from after_service_record from after_service_record
</sql> </sql>
@ -125,6 +126,7 @@
<if test="workerResendTrackingNumber != null">worker_resend_tracking_number,</if> <if test="workerResendTrackingNumber != null">worker_resend_tracking_number,</if>
<if test="workerReceiveStatus != null">worker_receive_status,</if> <if test="workerReceiveStatus != null">worker_receive_status,</if>
<if test="workerAgreeType != null">worker_agree_type,</if> <if test="workerAgreeType != null">worker_agree_type,</if>
<if test="workerReceiveConfirm != null">worker_receive_confirm,</if>
<if test="customerDisagreeImages != null">customer_disagree_images,</if> <if test="customerDisagreeImages != null">customer_disagree_images,</if>
<if test="customerDisagreeReason != null">customer_disagree_reason,</if> <if test="customerDisagreeReason != null">customer_disagree_reason,</if>
<if test="createBy != null">create_by,</if> <if test="createBy != null">create_by,</if>
@ -166,6 +168,7 @@
<if test="workerResendTrackingNumber != null">#{workerResendTrackingNumber},</if> <if test="workerResendTrackingNumber != null">#{workerResendTrackingNumber},</if>
<if test="workerReceiveStatus != null">#{workerReceiveStatus},</if> <if test="workerReceiveStatus != null">#{workerReceiveStatus},</if>
<if test="workerAgreeType != null">#{workerAgreeType},</if> <if test="workerAgreeType != null">#{workerAgreeType},</if>
<if test="workerReceiveConfirm != null">#{workerReceiveConfirm},</if>
<if test="customerDisagreeImages != null">#{customerDisagreeImages},</if> <if test="customerDisagreeImages != null">#{customerDisagreeImages},</if>
<if test="customerDisagreeReason != null">#{customerDisagreeReason},</if> <if test="customerDisagreeReason != null">#{customerDisagreeReason},</if>
<if test="createBy != null">#{createBy},</if> <if test="createBy != null">#{createBy},</if>
@ -213,6 +216,7 @@
<if test="workerResendTrackingNumber != null">worker_resend_tracking_number = #{workerResendTrackingNumber},</if> <if test="workerResendTrackingNumber != null">worker_resend_tracking_number = #{workerResendTrackingNumber},</if>
<if test="workerReceiveStatus != null">worker_receive_status = #{workerReceiveStatus},</if> <if test="workerReceiveStatus != null">worker_receive_status = #{workerReceiveStatus},</if>
<if test="workerAgreeType != null">worker_agree_type = #{workerAgreeType},</if> <if test="workerAgreeType != null">worker_agree_type = #{workerAgreeType},</if>
<if test="workerReceiveConfirm != null">worker_receive_confirm = #{workerReceiveConfirm},</if>
<if test="customerDisagreeImages != null">customer_disagree_images = #{customerDisagreeImages},</if> <if test="customerDisagreeImages != null">customer_disagree_images = #{customerDisagreeImages},</if>
<if test="customerDisagreeReason != null">customer_disagree_reason = #{customerDisagreeReason},</if> <if test="customerDisagreeReason != null">customer_disagree_reason = #{customerDisagreeReason},</if>
<if test="createBy != null">create_by = #{createBy},</if> <if test="createBy != null">create_by = #{createBy},</if>