增加售后倒计时 以及 师傅状态查询

This commit is contained in:
cb 2025-09-25 15:53:14 +08:00
parent 47f717fcb2
commit c84c39a28f
5 changed files with 94 additions and 36 deletions

View File

@ -60,6 +60,26 @@ public class AfterServiceRecord extends BaseEntity
@Excel(name = "本单退款金额")
private BigDecimal refund;
public BigDecimal getRefund() {
return refund;
}
public void setRefund(BigDecimal refund) {
this.refund = refund;
}
/** 售后状态0-进行中1-已完成2-已取消3-已超时 */
@Excel(name = "售后状态0-进行中1-已完成2-已取消3-已超时")
private Integer afterServiceStatus;
public Integer getAfterServiceStatus() {
return afterServiceStatus;
}
public void setAfterServiceStatus(Integer afterServiceStatus) {
this.afterServiceStatus = afterServiceStatus;
}
/** 协商后的退款金额 */
@Excel(name = "协商后的退款金额")
private BigDecimal agreedRefund;

View File

@ -116,6 +116,7 @@ public class AfterServiceTimeoutTask {
(record.getWorkerFeedbackResult().equals(0L) || record.getWorkerFeedbackResult().equals(1L))) {
// 倒计时3师傅拒绝或同意后客户36小时不操作自动取消售后
record.setCustomerFinalCheck(null);
record.setAfterServiceStatus(2); // 设置为已取消状态
// 售后单取消完成不需要退款不设置refundApplyTime
record.setIsAutoProcessed(1); // 自动处理

View File

@ -39,6 +39,7 @@ import org.springframework.util.Assert;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
@ -72,6 +73,8 @@ public class AfterServiceRecordServiceImpl implements IAfterServiceRecordService
@Autowired
private CustomerAddressService customerAddressService;
/**
* 查询售后记录
*
@ -123,6 +126,8 @@ public class AfterServiceRecordServiceImpl implements IAfterServiceRecordService
// 根据订单类型自动设置售后大类
setAfterServiceCategory(afterServiceRecord);
int result = afterServiceRecordMapper.insertAfterServiceRecord(afterServiceRecord);
// 暂停确认中倒计时
@ -214,6 +219,22 @@ public class AfterServiceRecordServiceImpl implements IAfterServiceRecordService
return AjaxResult.success("重做/补做完成状态已更新");
}
// 新增处理师傅反馈结果为0或1时设置redoCompleteTime为当前时间+36小时
if (param.getWorkerFeedbackResult() != null && (param.getWorkerFeedbackResult().equals(0L) || param.getWorkerFeedbackResult().equals(1L))) {
afterServiceRecord.setWorkerFeedbackResult(param.getWorkerFeedbackResult());
// 设置当前时间推后36小时
Calendar calendar = Calendar.getInstance();
calendar.setTime(new Date());
calendar.add(Calendar.HOUR_OF_DAY, 36);
afterServiceRecord.setRedoCompleteTime(calendar.getTime());
afterServiceRecordMapper.updateAfterServiceRecord(afterServiceRecord);
log.info("师傅反馈结果为{}记录ID{}redoCompleteTime设置为{}", param.getWorkerFeedbackResult(), param.getId(), afterServiceRecord.getRedoCompleteTime());
return AjaxResult.success("师傅反馈结果已更新");
}
if (param.getCustomerFinalCheck()!=null ) {
// 检查是否已经被自动处理过防止重复退款
if (afterServiceRecord.getIsAutoProcessed() != null && afterServiceRecord.getIsAutoProcessed() == 1) {
@ -227,6 +248,13 @@ public class AfterServiceRecordServiceImpl implements IAfterServiceRecordService
if (one.equals(param.getCustomerFinalCheck())) {
// 客户同意重做结果订单完成结束不执行退款
afterServiceRecord.setCustomerFinalCheck(1L);
// 如果redoCompleteTime字段有值且师傅操作为0或1且客户同意则将其设置为null
if (afterServiceRecord.getRedoCompleteTime() != null &&
(afterServiceRecord.getWorkerFeedbackResult() != null &&
(afterServiceRecord.getWorkerFeedbackResult().equals(0L) || afterServiceRecord.getWorkerFeedbackResult().equals(1L)))) {
afterServiceRecord.setRedoCompleteTime(null);
}
afterServiceRecord.setRefundApplyTime(new Date());
log.info("师傅重做完成后,客户同意重做结果,订单完成结束,不执行退款");
@ -255,6 +283,12 @@ public class AfterServiceRecordServiceImpl implements IAfterServiceRecordService
} else {
// 客户不同意重做结果按之前的逻辑走可能需要退款
log.info("师傅重做完成后,客户不同意重做结果,按原逻辑处理");
// 如果redoCompleteTime字段有值且师傅操作为0或1且客户不同意则将其设置为null
if (afterServiceRecord.getRedoCompleteTime() != null &&
(afterServiceRecord.getWorkerFeedbackResult() != null &&
(afterServiceRecord.getWorkerFeedbackResult().equals(0L) || afterServiceRecord.getWorkerFeedbackResult().equals(1L)))) {
afterServiceRecord.setRedoCompleteTime(null);
}
// 客户不同意时保存不同意图片和理由
if (param.getCustomerDisagreeImages() != null) {
afterServiceRecord.setCustomerDisagreeImages(param.getCustomerDisagreeImages());
@ -262,8 +296,7 @@ public class AfterServiceRecordServiceImpl implements IAfterServiceRecordService
if (param.getCustomerDisagreeReason() != null) {
afterServiceRecord.setCustomerDisagreeReason(param.getCustomerDisagreeReason());
}
// 更新子单和主单的售后状态为售后纠纷
updateAfterServiceStatus(afterServiceRecord.getOrderDetailId(), 1);
// 继续执行下面的退款逻辑
}
}
@ -271,8 +304,22 @@ public class AfterServiceRecordServiceImpl implements IAfterServiceRecordService
// 师傅未重做完成按原逻辑处理退款
if (one.equals(param.getCustomerFinalCheck())) {
afterServiceRecord.setCustomerFinalCheck(1L);
// 如果redoCompleteTime字段有值且师傅操作为0或1且客户同意则将其设置为null
if (afterServiceRecord.getRedoCompleteTime() != null &&
(afterServiceRecord.getWorkerFeedbackResult() != null &&
(afterServiceRecord.getWorkerFeedbackResult().equals(0L) || afterServiceRecord.getWorkerFeedbackResult().equals(1L)))) {
afterServiceRecord.setRedoCompleteTime(null);
}
}else{
afterServiceRecord.setCustomerFinalCheck(0L);
// 如果redoCompleteTime字段有值且师傅操作为0或1且客户不同意则将其设置为null
if (afterServiceRecord.getRedoCompleteTime() != null &&
(afterServiceRecord.getWorkerFeedbackResult() != null &&
(afterServiceRecord.getWorkerFeedbackResult().equals(0L) || afterServiceRecord.getWorkerFeedbackResult().equals(1L)))) {
afterServiceRecord.setRedoCompleteTime(null);
}
// 客户不同意时保存不同意图片和理由
if (param.getCustomerDisagreeImages() != null) {
afterServiceRecord.setCustomerDisagreeImages(param.getCustomerDisagreeImages());
@ -280,10 +327,10 @@ public class AfterServiceRecordServiceImpl implements IAfterServiceRecordService
if (param.getCustomerDisagreeReason() != null) {
afterServiceRecord.setCustomerDisagreeReason(param.getCustomerDisagreeReason());
}
// 更新子单和主单的售后状态为售后纠纷
updateAfterServiceStatus(afterServiceRecord.getOrderDetailId(), 1);
}
afterServiceRecord.setRefundApplyTime(new Date());
// 售后客户回复通知
// 通知师傅新订单
try {
@ -456,6 +503,12 @@ public class AfterServiceRecordServiceImpl implements IAfterServiceRecordService
// 商品售后的处理逻辑
if (one.equals(param.getCustomerFinalCheck())) {
afterServiceRecord.setCustomerFinalCheck(1L);
// 如果redoCompleteTime字段有值且师傅操作为0或1且客户同意则将其设置为null
if (afterServiceRecord.getRedoCompleteTime() != null &&
(afterServiceRecord.getWorkerFeedbackResult() != null &&
(afterServiceRecord.getWorkerFeedbackResult().equals(0L) || afterServiceRecord.getWorkerFeedbackResult().equals(1L)))) {
afterServiceRecord.setRedoCompleteTime(null);
}
// 保存操作者和退款金额
if (param.getUpdateBy() != null) {
afterServiceRecord.setUpdateBy(param.getUpdateBy());
@ -487,6 +540,12 @@ public class AfterServiceRecordServiceImpl implements IAfterServiceRecordService
} else {
afterServiceRecord.setCustomerFinalCheck(0L);
// 如果redoCompleteTime字段有值且师傅操作为0或1且客户不同意则将其设置为null
if (afterServiceRecord.getRedoCompleteTime() != null &&
(afterServiceRecord.getWorkerFeedbackResult() != null &&
(afterServiceRecord.getWorkerFeedbackResult().equals(0L) || afterServiceRecord.getWorkerFeedbackResult().equals(1L)))) {
afterServiceRecord.setRedoCompleteTime(null);
}
// 客户不同意时保存不同意图片和理由
if (param.getCustomerDisagreeImages() != null) {
afterServiceRecord.setCustomerDisagreeImages(param.getCustomerDisagreeImages());
@ -501,8 +560,7 @@ public class AfterServiceRecordServiceImpl implements IAfterServiceRecordService
if (param.getRefund() != null) {
afterServiceRecord.setRefund(param.getRefund());
}
// 更新子单和主单的售后状态为售后纠纷
updateAfterServiceStatus(afterServiceRecord.getOrderDetailId(), 1);
log.info("商品售后-客户不同意处理方案");
}
@ -926,35 +984,7 @@ public class AfterServiceRecordServiceImpl implements IAfterServiceRecordService
* @param orderDetailId 子单ID
* @param afterServiceStatus 售后状态0-无售后1-售后纠纷
*/
private void updateAfterServiceStatus(Long orderDetailId, Integer afterServiceStatus) {
try {
log.info("开始更新售后状态子单ID{},售后状态:{}", orderDetailId, afterServiceStatus);
// 更新子单售后状态
OrderDetail orderDetail = new OrderDetail();
orderDetail.setId(orderDetailId);
orderDetail.setAfterServiceStatus(afterServiceStatus);
int updateResult = orderDetailService.updateOrderDetail(orderDetail);
log.info("子单售后状态更新结果:{}", updateResult);
// 获取主单ID并更新主单售后状态
OrderDetail detail = orderDetailService.selectById(orderDetailId);
if (detail != null && detail.getOrderMasterId() != null) {
OrderMaster orderMaster = new OrderMaster();
orderMaster.setId(detail.getOrderMasterId());
orderMaster.setAfterServiceStatus(afterServiceStatus);
int masterUpdateResult = orderMasterService.updateOrderMaster(orderMaster);
log.info("主单售后状态更新结果:{}", masterUpdateResult);
log.info("更新售后状态成功子单ID{}主单ID{},售后状态:{}",
orderDetailId, detail.getOrderMasterId(), afterServiceStatus);
} else {
log.warn("未找到子单或主单ID为空子单ID{}", orderDetailId);
}
} catch (Exception e) {
log.error("更新售后状态失败子单ID{},售后状态:{}", orderDetailId, afterServiceStatus, e);
}
}
/**
* 暂停确认中倒计时

View File

@ -52,6 +52,7 @@
<result property="workerResendImages" column="worker_resend_images" />
<result property="customerDisagreeImages" column="customer_disagree_images" />
<result property="customerDisagreeReason" column="customer_disagree_reason" />
<result property="afterServiceStatus" column="after_service_status" />
</resultMap>
<sql id="selectAfterServiceRecordVo">
@ -60,7 +61,7 @@
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, worker_receive_confirm, worker_resend_remark, worker_resend_images,
customer_disagree_images, customer_disagree_reason
customer_disagree_images, customer_disagree_reason, after_service_status
from after_service_record
</sql>
@ -136,6 +137,7 @@
<if test="workerResendImages != null">worker_resend_images,</if>
<if test="customerDisagreeImages != null">customer_disagree_images,</if>
<if test="customerDisagreeReason != null">customer_disagree_reason,</if>
<if test="afterServiceStatus != null">after_service_status,</if>
<if test="createBy != null">create_by,</if>
<if test="updateBy != null">update_by,</if>
<if test="remark != null">remark,</if>
@ -181,6 +183,7 @@
<if test="workerResendImages != null">#{workerResendImages},</if>
<if test="customerDisagreeImages != null">#{customerDisagreeImages},</if>
<if test="customerDisagreeReason != null">#{customerDisagreeReason},</if>
<if test="afterServiceStatus != null">#{afterServiceStatus},</if>
<if test="createBy != null">#{createBy},</if>
<if test="updateBy != null">#{updateBy},</if>
<if test="remark != null">#{remark},</if>
@ -232,6 +235,7 @@
<if test="workerResendImages != null">worker_resend_images = #{workerResendImages},</if>
<if test="customerDisagreeImages != null">customer_disagree_images = #{customerDisagreeImages},</if>
<if test="customerDisagreeReason != null">customer_disagree_reason = #{customerDisagreeReason},</if>
<if test="afterServiceStatus != null">after_service_status = #{afterServiceStatus},</if>
<if test="createBy != null">create_by = #{createBy},</if>
<if test="createTime != null">create_time = #{createTime},</if>
<if test="updateBy != null">update_by = #{updateBy},</if>

View File

@ -64,6 +64,9 @@
LEFT JOIN worker_goods_category wgc ON wgc.worker_id = w.worker_id
LEFT JOIN worker_certification wc on w.worker_id = wc.worker_id
<where>
<if test="status != null">
AND w.status = #{status}
</if>
<if test="deptId != null and deptId != ''">
AND dept_id = #{deptId}
</if>