diff --git a/ghy-admin/src/main/java/com/ghy/web/controller/order/AfterServiceRecordController.java b/ghy-admin/src/main/java/com/ghy/web/controller/order/AfterServiceRecordController.java index 3c09611f..73f3b20a 100644 --- a/ghy-admin/src/main/java/com/ghy/web/controller/order/AfterServiceRecordController.java +++ b/ghy-admin/src/main/java/com/ghy/web/controller/order/AfterServiceRecordController.java @@ -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); + } } diff --git a/ghy-order/src/main/java/com/ghy/order/domain/AfterServiceRecord.java b/ghy-order/src/main/java/com/ghy/order/domain/AfterServiceRecord.java index 5dc10153..990a5221 100644 --- a/ghy-order/src/main/java/com/ghy/order/domain/AfterServiceRecord.java +++ b/ghy-order/src/main/java/com/ghy/order/domain/AfterServiceRecord.java @@ -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; diff --git a/ghy-order/src/main/java/com/ghy/order/service/IAfterServiceRecordService.java b/ghy-order/src/main/java/com/ghy/order/service/IAfterServiceRecordService.java index be8b71c4..53513732 100644 --- a/ghy-order/src/main/java/com/ghy/order/service/IAfterServiceRecordService.java +++ b/ghy-order/src/main/java/com/ghy/order/service/IAfterServiceRecordService.java @@ -128,4 +128,13 @@ public interface IAfterServiceRecordService { * @return 超时的售后记录列表 */ List selectWorkerResendTimeoutRecords(); + + /** + * 师傅确认收货 + * 师傅确认收到货物后,根据同意处理方式决定是否执行退款 + * + * @param afterServiceRecord 售后记录 + * @return 操作结果 + */ + AjaxResult workerConfirmReceive(AfterServiceRecord afterServiceRecord); } diff --git a/ghy-order/src/main/java/com/ghy/order/service/impl/AfterServiceRecordServiceImpl.java b/ghy-order/src/main/java/com/ghy/order/service/impl/AfterServiceRecordServiceImpl.java index 56a3482e..909b9176 100644 --- a/ghy-order/src/main/java/com/ghy/order/service/impl/AfterServiceRecordServiceImpl.java +++ b/ghy-order/src/main/java/com/ghy/order/service/impl/AfterServiceRecordServiceImpl.java @@ -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()); + } + } + } diff --git a/ghy-order/src/main/resources/mapper/order/AfterServiceRecordMapper.xml b/ghy-order/src/main/resources/mapper/order/AfterServiceRecordMapper.xml index bdf1590b..e70e32ec 100644 --- a/ghy-order/src/main/resources/mapper/order/AfterServiceRecordMapper.xml +++ b/ghy-order/src/main/resources/mapper/order/AfterServiceRecordMapper.xml @@ -46,6 +46,7 @@ + @@ -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 @@ -125,6 +126,7 @@ worker_resend_tracking_number, worker_receive_status, worker_agree_type, + worker_receive_confirm, customer_disagree_images, customer_disagree_reason, create_by, @@ -166,6 +168,7 @@ #{workerResendTrackingNumber}, #{workerReceiveStatus}, #{workerAgreeType}, + #{workerReceiveConfirm}, #{customerDisagreeImages}, #{customerDisagreeReason}, #{createBy}, @@ -213,6 +216,7 @@ worker_resend_tracking_number = #{workerResendTrackingNumber}, worker_receive_status = #{workerReceiveStatus}, worker_agree_type = #{workerAgreeType}, + worker_receive_confirm = #{workerReceiveConfirm}, customer_disagree_images = #{customerDisagreeImages}, customer_disagree_reason = #{customerDisagreeReason}, create_by = #{createBy},