优化商品售后的退款流程
This commit is contained in:
parent
a75d05bc9a
commit
a64f1728ac
|
|
@ -186,4 +186,14 @@ public class AfterServiceRecordController extends BaseController {
|
|||
public AjaxResult returnGoods(@RequestBody AfterServiceRecord afterServiceRecord) {
|
||||
return afterServiceRecordService.returnGoods(afterServiceRecord);
|
||||
}
|
||||
|
||||
/**
|
||||
* 师傅确认收货
|
||||
* 师傅确认收到货物后,根据同意处理方式决定是否执行退款
|
||||
*/
|
||||
@PostMapping("/workerConfirmReceive")
|
||||
@ResponseBody
|
||||
public AjaxResult workerConfirmReceive(@RequestBody AfterServiceRecord afterServiceRecord) {
|
||||
return afterServiceRecordService.workerConfirmReceive(afterServiceRecord);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -161,6 +161,10 @@ public class AfterServiceRecord extends BaseEntity
|
|||
@Excel(name = "师傅同意处理方式:1-即时退单退款,2-货物拦截后退单退款,3-快递返回货物后退单退款,4-退回货物后退单退款")
|
||||
private Integer workerAgreeType;
|
||||
|
||||
/** 师傅收货确认:0-未收货,1-已收货 */
|
||||
@Excel(name = "师傅收货确认:0-未收货,1-已收货")
|
||||
private Integer workerReceiveConfirm;
|
||||
|
||||
/** 客户不同意图片 */
|
||||
@Excel(name = "客户不同意图片")
|
||||
private String customerDisagreeImages;
|
||||
|
|
|
|||
|
|
@ -128,4 +128,13 @@ public interface IAfterServiceRecordService {
|
|||
* @return 超时的售后记录列表
|
||||
*/
|
||||
List<AfterServiceRecord> selectWorkerResendTimeoutRecords();
|
||||
|
||||
/**
|
||||
* 师傅确认收货
|
||||
* 师傅确认收到货物后,根据同意处理方式决定是否执行退款
|
||||
*
|
||||
* @param afterServiceRecord 售后记录
|
||||
* @return 操作结果
|
||||
*/
|
||||
AjaxResult workerConfirmReceive(AfterServiceRecord afterServiceRecord);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -431,9 +431,25 @@ public class AfterServiceRecordServiceImpl implements IAfterServiceRecordService
|
|||
afterServiceRecord.setCustomerFinalCheck(1L);
|
||||
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 {
|
||||
afterServiceRecord.setCustomerFinalCheck(0L);
|
||||
|
|
@ -689,6 +705,26 @@ public class AfterServiceRecordServiceImpl implements IAfterServiceRecordService
|
|||
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);
|
||||
log.info("定时器自动执行退款逻辑完成,售后记录ID:{}", afterServiceRecord.getId());
|
||||
|
|
@ -1087,4 +1123,88 @@ public class AfterServiceRecordServiceImpl implements IAfterServiceRecordService
|
|||
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());
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -46,6 +46,7 @@
|
|||
<result property="workerResendTrackingNumber" column="worker_resend_tracking_number" />
|
||||
<result property="workerReceiveStatus" column="worker_receive_status" />
|
||||
<result property="workerAgreeType" column="worker_agree_type" />
|
||||
<result property="workerReceiveConfirm" column="worker_receive_confirm" />
|
||||
<result property="customerDisagreeImages" column="customer_disagree_images" />
|
||||
<result property="customerDisagreeReason" column="customer_disagree_reason" />
|
||||
</resultMap>
|
||||
|
|
@ -55,7 +56,7 @@
|
|||
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,
|
||||
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
|
||||
from after_service_record
|
||||
</sql>
|
||||
|
|
@ -125,6 +126,7 @@
|
|||
<if test="workerResendTrackingNumber != null">worker_resend_tracking_number,</if>
|
||||
<if test="workerReceiveStatus != null">worker_receive_status,</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="customerDisagreeReason != null">customer_disagree_reason,</if>
|
||||
<if test="createBy != null">create_by,</if>
|
||||
|
|
@ -166,6 +168,7 @@
|
|||
<if test="workerResendTrackingNumber != null">#{workerResendTrackingNumber},</if>
|
||||
<if test="workerReceiveStatus != null">#{workerReceiveStatus},</if>
|
||||
<if test="workerAgreeType != null">#{workerAgreeType},</if>
|
||||
<if test="workerReceiveConfirm != null">#{workerReceiveConfirm},</if>
|
||||
<if test="customerDisagreeImages != null">#{customerDisagreeImages},</if>
|
||||
<if test="customerDisagreeReason != null">#{customerDisagreeReason},</if>
|
||||
<if test="createBy != null">#{createBy},</if>
|
||||
|
|
@ -213,6 +216,7 @@
|
|||
<if test="workerResendTrackingNumber != null">worker_resend_tracking_number = #{workerResendTrackingNumber},</if>
|
||||
<if test="workerReceiveStatus != null">worker_receive_status = #{workerReceiveStatus},</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="customerDisagreeReason != null">customer_disagree_reason = #{customerDisagreeReason},</if>
|
||||
<if test="createBy != null">create_by = #{createBy},</if>
|
||||
|
|
|
|||
Loading…
Reference in New Issue