no message

This commit is contained in:
cb 2025-11-01 11:15:02 +08:00
parent 174f6b4a82
commit a36d9374dd
7 changed files with 166 additions and 41 deletions

View File

@ -1485,29 +1485,50 @@ public class OrderController extends BaseController {
OrderMaster orderMasterReq = new OrderMaster();
BeanUtils.copyProperties(orderListRequest, orderMasterReq);
List<OrderListResponse> masterList = this.getMasterAfterList(orderMasterReq);
// 查询售后记录
AfterServiceRecord afterServiceRecord = new AfterServiceRecord();
afterServiceRecord.setExcludeAfterServiceFinished(Boolean.TRUE);
List<AfterServiceRecord> afterServiceRecordList = afterServiceRecordService
.selectAfterServiceRecordList(afterServiceRecord);
// 按子单ID分组售后记录
Map<Long, List<AfterServiceRecord>> detailRecordMap = afterServiceRecordList.stream()
.collect(Collectors.groupingBy(record -> record.getOrderDetailId()));
// 获取有售后记录的子单ID列表
List<Long> detailIds = afterServiceRecordList.stream()
.map(AfterServiceRecord::getOrderDetailId)
.distinct()
.collect(Collectors.toList());
// 需要排除同个师傅的主单子单同时出现
List<OrderListResponse> filteredMasterList = new ArrayList<OrderListResponse>();
for (OrderListResponse master : masterList) {
boolean isKeep = false;
List<OrderListResponse> filteredMasterList = masterList.stream()
.filter(master -> {
// 查询该主单下所有售后中的子单
OrderDetail detailAfterListOfMasterQry = new OrderDetail();
detailAfterListOfMasterQry.setOrderMasterCode(master.getOrderMasterCode());
List<OrderListResponse> detailAfterListOfMasters = this.getDetailAfterList(detailAfterListOfMasterQry);
for (OrderListResponse detailAfterListOfMaster : detailAfterListOfMasters) {
if (!detailAfterListOfMaster.getWorkerId().equals(orderListRequest.getWorkerId())) {
isKeep = true;
break;
}
}
long count = detailAfterListOfMasters.stream()
.filter(x -> (x.getAfterTimeout() != null && x.getAfterTimeout() == 1)).count();
if (isKeep) {
if (count > 0) {
// 注意这里使用getDetailAfterListLite方法该方法只返回必要字段性能更好
List<OrderListResponse> detailAfterList = this.getDetailAfterListLite(detailAfterListOfMasterQry, detailRecordMap,detailIds);
// List<OrderListResponse> detailAfterList = this.getDetailAfterList(detailAfterListOfMasterQry);
// 检查是否有其他师傅的售后单
boolean hasOtherWorkerAfterService = detailAfterList.stream()
.anyMatch(detail -> !detail.getWorkerId().equals(orderListRequest.getWorkerId()));
if (hasOtherWorkerAfterService) {
// 检查是否有超时的售后单如果有则标记主单为超时
boolean hasTimeout = detailAfterList.stream()
.anyMatch(detail -> detail.getAfterTimeout() != null && detail.getAfterTimeout() == 1);
if (hasTimeout) {
master.setAfterTimeout(1);
}
filteredMasterList.add(master);
}
return true;
}
return false;
})
.collect(Collectors.toList());
orderListResponses.addAll(filteredMasterList);
// 根据更新时间倒序排列
@ -1924,6 +1945,80 @@ public class OrderController extends BaseController {
return orderListResponses;
}
/**
* 轻量级售后订单查询方法
* 只返回必要字段提高查询性能
* @param orderDetail 查询条件
* @return 轻量级订单响应列表
*/
public List<OrderListResponse> getDetailAfterListLite(OrderDetail orderDetail,Map<Long, List<AfterServiceRecord>> detailRecordMap,List<Long> detailIds) {
// 设置查询条件
StringBuilder orderDetailIds = new StringBuilder();
detailIds.forEach(id -> orderDetailIds.append(id).append(","));
String ids = orderDetailIds.toString();
if (StringUtils.isNotEmpty(ids)) {
orderDetail.setOrderDetailIds(ids.substring(0, ids.length() - 1));
} else {
orderDetail.setOrderDetailIds("0");
}
// 查询订单详情
List<OrderDetail> orderDetailList = orderDetailService.selectOrderDetailList(orderDetail);
List<OrderListResponse> responseList = new ArrayList<>();
for (OrderDetail detail : orderDetailList) {
// 查询主单基本信息
OrderMaster orderMaster = orderMasterService.selectById(detail.getOrderMasterId());
if (orderMaster == null) continue;
// 查询师傅信息
Worker worker = workerService.selectById(detail.getWorkerId());
String workerName = "";
String workerId = "";
if (worker != null) {
workerId = worker.getWorkerId().toString();
}
// 检查是否显示售后记录和超时状态
List<AfterServiceRecord> currentDetailRecords = detailRecordMap.get(detail.getId());
int showAfterServiceRecord = 0;
Integer afterTimeout = null;
if (currentDetailRecords != null && !currentDetailRecords.isEmpty()) {
for (AfterServiceRecord record : currentDetailRecords) {
if (record.getAfterServiceStatus() != 1) {
showAfterServiceRecord = 1;
}
}
}
// 构建轻量级响应对象只设置必要字段
OrderListResponse response = new OrderListResponse();
response.setOrderDetailId(detail.getId());
response.setOrderMasterId(detail.getOrderMasterId());
response.setOrderDetailCode(detail.getCode());
response.setOrderMasterCode(detail.getOrderMasterCode());
response.setWorkerName(workerName);
response.setWorkerId(Long.valueOf(workerId)); // 必需字段用于hasOtherWorkerAfterService判断
response.setOrderStatus(detail.getOrderStatus());
response.setShowAfterServiceRecord(showAfterServiceRecord);
response.setAfterServiceRecordList(currentDetailRecords);
response.setAfterTimeout(afterTimeout); // 必需字段用于hasTimeout判断
responseList.add(response);
}
return responseList;
}
public List<OrderListResponse> getMasterList(OrderMaster orderMaster) {
List<OrderListResponse> orderListResponses = new ArrayList<>();
// 如果查询的是未约未排状态只查询未全部派完的主单

View File

@ -1773,9 +1773,9 @@ public class OrderMasterController extends BaseController {
}
}
}
if (totalPlatformRefundMoney.compareTo(BigDecimal.ZERO) > 0) {
totalPayMoney = totalPayMoney.subtract(totalPlatformRefundMoney);
}
// if (totalPlatformRefundMoney.compareTo(BigDecimal.ZERO) > 0) {
// totalPayMoney = totalPayMoney.subtract(totalPlatformRefundMoney);
// }
BigDecimal leaderMoney = BigDecimal.ZERO;

View File

@ -130,7 +130,7 @@ jim:
# 百度地图应用api
baidu:
ak: 'ZQTgMW7W0GTuE7Ripb0HDp5TqRaOI6PZ'
ak: 'i0sdnIsMmJVik7vJhfqMHA6DmS6d0fMB'
url: 'https://api.map.baidu.com/reverse_geocoding/v3/?ak=#AK#&output=json&coordtype=wgs84ll&location='
sms:

View File

@ -166,6 +166,10 @@ public class AfterServiceRecord extends BaseEntity
@Excel(name = "师傅重发/补发方案")
private Integer workerResendPlan;
/** 师傅选择重发/补发方案时间 */
@Excel(name = "师傅选择重发/补发方案时间")
private Date workerResendPlanTime;
/** 师傅重发/补发时间 */
@Excel(name = "师傅重发/补发时间", cellType = Excel.ColumnType.STRING)
private Date workerResendTime;

View File

@ -93,7 +93,8 @@ public class AfterServiceTimeoutTask {
/**
* 处理客户36小时不操作的情况
* 倒计时2师傅重做完成后客户36小时不操作自动同意完单
* 倒计时3师傅拒绝后客户36小时不操作自动取消售后
* 倒计时3师傅拒绝或同意后客户36小时不操作自动取消售后
* 倒计时4师傅选择重发/补发方案后客户36小时不操作自动取消售后
*/
private void processCustomerConfirmTimeout() {
log.info("开始处理客户确认超时情况");
@ -136,6 +137,13 @@ public class AfterServiceTimeoutTask {
// }
log.info("师傅拒绝/同意后客户超时自动取消售后单取消完成售后记录ID{}", record.getId());
}else if (record.getWorkerFeedbackResult() != null && record.getWorkerFeedbackResult().equals(2L)) {
// 倒计时4客户同意后36小时不操作自动同意完单
record.setCustomerFinalCheck(null);
record.setAfterServiceStatus(2); // 设置为已取消状态
record.setIsAutoProcessed(1); // 自动处理
log.info("客户同意后超时自动取消订单完成售后记录ID{}", record.getId());
}
// 更新记录
@ -155,8 +163,8 @@ public class AfterServiceTimeoutTask {
/**
* 师傅重发补发超时处理
* 快递/物流6天倒计时
* 非快递24小时倒计时
*
* 同意为4天
* 超时后自动按客户同意处理
*/
@Scheduled(fixedRate = 5 * 60 * 1000) // 5分钟执行一次
@ -193,10 +201,10 @@ public class AfterServiceTimeoutTask {
/**
* 定时任务自动处理超时的师傅确认收货
* 每天凌晨2点执行查询退货发货时间超过6天且师傅未确认收货的售后记录
* 查询退货发货时间超过6天且师傅未确认收货的售后记录
* 自动调用师傅确认收货方法进行退款处理
*/
@Scheduled(cron = "0 0 2 * * ?")
@Scheduled(cron = "0 0 8,12,18 * * ?")
public void autoConfirmReceiveTask() {
try {
log.info("开始执行自动确认收货定时任务");

View File

@ -604,6 +604,7 @@ public class AfterServiceRecordServiceImpl implements IAfterServiceRecordService
afterServiceRecord.setRedoCompleteImages(param.getRedoCompleteImages());
}
// 新增处理重发/补发相关字段
afterServiceRecord.setWorkerResendTime(new Date());
if (param.getWorkerResendType() != null) {
afterServiceRecord.setWorkerResendType(param.getWorkerResendType());
}
@ -666,6 +667,10 @@ public class AfterServiceRecordServiceImpl implements IAfterServiceRecordService
afterServiceRecord.setWorkerResendPlan(param.getWorkerResendPlan());
afterServiceRecord.setWorkerResendTime(new Date());
if (param.getWorkerFeedbackResult() != null && param.getWorkerFeedbackResult().equals(2L)) {
// afterServiceRecord.setWorkerFeedbackResult(2L);
afterServiceRecord.setWorkerResendPlanTime(new Date());
}
afterServiceRecord.setWorkerResendType(param.getWorkerResendType()); // 1-快递/物流2-送货上门3-自提
afterServiceRecord.setWorkerResendTrackingNumber(param.getWorkerResendTrackingNumber()); // 物流单号
// 新增设置师傅重发/补发备注和图片
@ -693,10 +698,10 @@ public class AfterServiceRecordServiceImpl implements IAfterServiceRecordService
if (param.getWorkerReceiveStatus() != null && param.getWorkerAgreeType() != null) {
afterServiceRecord.setWorkerReceiveStatus(param.getWorkerReceiveStatus());
afterServiceRecord.setWorkerAgreeType(param.getWorkerAgreeType());
Calendar calendar = Calendar.getInstance();
calendar.setTime(new Date());
calendar.add(Calendar.HOUR_OF_DAY, 36);
afterServiceRecord.setRedoCompleteTime(calendar.getTime());
// Calendar calendar = Calendar.getInstance();
// calendar.setTime(new Date());
// calendar.add(Calendar.HOUR_OF_DAY, 36);
afterServiceRecord.setRedoCompleteTime(new Date());
// 处理师傅反馈相关字段
if (param.getWorkerFeedbackReasonType() != null) {
afterServiceRecord.setWorkerFeedbackReasonType(param.getWorkerFeedbackReasonType());
@ -1158,6 +1163,8 @@ public class AfterServiceRecordServiceImpl implements IAfterServiceRecordService
}
// 更新重发/补发方案
afterServiceRecord.setWorkerFeedbackResult(param.getWorkerFeedbackResult());
afterServiceRecord.setWorkerResendPlanTime(new Date());
afterServiceRecord.setWorkerResendPlan(param.getWorkerResendPlan());
afterServiceRecord.setUpdateBy(param.getUpdateBy());
@ -1262,6 +1269,7 @@ public class AfterServiceRecordServiceImpl implements IAfterServiceRecordService
}
afterServiceRecord.setUpdateBy(param.getUpdateBy());
afterServiceRecord.setRedoCompleteTime(null);
// 设置客户操作时间
afterServiceRecord.setCustomerOperationTime(new Date());

View File

@ -44,6 +44,7 @@
<result property="returnShipTime" column="return_ship_time" />
<result property="merchantReceiveTime" column="merchant_receive_time" />
<result property="workerResendPlan" column="worker_resend_plan" />
<result property="workerResendPlanTime" column="worker_resend_plan_time" />
<result property="workerResendTime" column="worker_resend_time" />
<result property="workerResendType" column="worker_resend_type" />
<result property="workerResendTrackingNumber" column="worker_resend_tracking_number" />
@ -63,7 +64,7 @@
worker_feedback_reason_type, worker_feedback_reason, worker_feedback_images, refund, agreed_refund, platform_refund, original_refund,
customer_final_check, create_by, create_time, update_by, update_time, remark, refund_apply_time, customer_agree_redo, customer_operation_time,
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,
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_plan_time, 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, after_service_status, platform_handle_reason
from after_service_record
</sql>
@ -132,6 +133,7 @@
<if test="returnShipTime != null">return_ship_time,</if>
<if test="merchantReceiveTime != null">merchant_receive_time,</if>
<if test="workerResendPlan != null">worker_resend_plan,</if>
<if test="workerResendPlanTime != null">worker_resend_plan_time,</if>
<if test="workerResendTime != null">worker_resend_time,</if>
<if test="workerResendType != null">worker_resend_type,</if>
<if test="workerResendTrackingNumber != null">worker_resend_tracking_number,</if>
@ -181,6 +183,7 @@
<if test="returnShipTime != null">#{returnShipTime},</if>
<if test="merchantReceiveTime != null">#{merchantReceiveTime},</if>
<if test="workerResendPlan != null">#{workerResendPlan},</if>
<if test="workerResendPlanTime != null">#{workerResendPlanTime},</if>
<if test="workerResendTime != null">#{workerResendTime},</if>
<if test="workerResendType != null">#{workerResendType},</if>
<if test="workerResendTrackingNumber != null">#{workerResendTrackingNumber},</if>
@ -236,6 +239,7 @@
<if test="returnShipTime != null">return_ship_time = #{returnShipTime},</if>
<if test="merchantReceiveTime != null">merchant_receive_time = #{merchantReceiveTime},</if>
<if test="workerResendPlan != null">worker_resend_plan = #{workerResendPlan},</if>
<if test="workerResendPlanTime != null">worker_resend_plan_time = #{workerResendPlanTime},</if>
<if test="workerResendTime != null">worker_resend_time = #{workerResendTime},</if>
<if test="workerResendType != null">worker_resend_type = #{workerResendType},</if>
<if test="workerResendTrackingNumber != null">worker_resend_tracking_number = #{workerResendTrackingNumber},</if>
@ -282,6 +286,7 @@
<!-- 查询客户确认超时的售后记录 -->
<!-- 倒计时2师傅重做完成后客户36小时不操作 -->
<!-- 倒计时3师傅拒绝后客户36小时不操作 -->
<!-- 倒计时4师傅选择重发/补发方案后客户36小时不操作 -->
<select id="selectCustomerConfirmTimeoutRecords" resultMap="AfterServiceRecordResult">
<include refid="selectAfterServiceRecordVo"/>
WHERE customer_final_check IS NULL
@ -290,12 +295,17 @@
-- 倒计时2师傅重做完成后客户36小时不操作
(worker_feedback_result = 3
AND redo_complete_time &lt;= DATE_SUB(NOW(), INTERVAL 36 HOUR)
AND redo_complete_time &gt;= DATE_SUB(NOW(), INTERVAL 2190 MINUTE))
AND redo_complete_time &gt;= DATE_SUB(NOW(), INTERVAL 2220 MINUTE))
OR
-- 倒计时3师傅拒绝或同意后客户36小时不操作
(worker_feedback_result IN (0, 1)
AND update_time &lt;= DATE_SUB(NOW(), INTERVAL 36 HOUR)
AND update_time &gt;= DATE_SUB(NOW(), INTERVAL 2190 MINUTE))
AND update_time &gt;= DATE_SUB(NOW(), INTERVAL 2220 MINUTE))
OR
-- 倒计时4师傅选择重发/补发方案后客户36小时不操作
(worker_resend_plan_time IS NOT NULL
AND worker_resend_plan_time &lt;= DATE_SUB(NOW(), INTERVAL 36 HOUR)
AND worker_resend_plan_time &gt;= DATE_SUB(NOW(), INTERVAL 2220 MINUTE))
)
</select>
@ -306,7 +316,7 @@
AND customer_final_check IS NULL
AND (is_auto_processed IS NULL OR is_auto_processed = 0)
AND (
-- 所有类型统一:5天倒计时
-- 所有类型统一:4天倒计时
worker_resend_time &lt;= DATE_SUB(NOW(), INTERVAL 4 DAY)
AND worker_resend_time &gt;= DATE_SUB(NOW(), INTERVAL 5790 MINUTE)
)
@ -318,7 +328,7 @@
<include refid="selectAfterServiceRecordVo"/>
WHERE customer_operation_time IS NOT NULL
AND customer_operation_time &lt;= DATE_SUB(NOW(), INTERVAL 6 DAY)
AND customer_operation_time &gt;= DATE_SUB(NOW(), INTERVAL 8670 MINUTE)
AND customer_operation_time &gt;= DATE_SUB(NOW(), INTERVAL 7 DAY)
AND (worker_receive_confirm IS NULL OR worker_receive_confirm = 0)
AND after_service_status = 0
AND after_service_category = 2