no message
This commit is contained in:
parent
174f6b4a82
commit
a36d9374dd
|
|
@ -1469,7 +1469,7 @@ public class OrderController extends BaseController {
|
|||
@PostMapping("/app/mix/after/list")
|
||||
@ResponseBody
|
||||
public AjaxResult appMixAfterList(@RequestBody OrderListRequest orderListRequest) {
|
||||
List<OrderListResponse> orderListResponses = new ArrayList<>();
|
||||
List<OrderListResponse> orderListResponses = new ArrayList<>();
|
||||
|
||||
// 校验参数
|
||||
Assert.notNull(orderListRequest.getWorkerId(), "师傅id不能为空");
|
||||
|
|
@ -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;
|
||||
// 查询该主单下所有售后中的子单
|
||||
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) {
|
||||
master.setAfterTimeout(1);
|
||||
}
|
||||
filteredMasterList.add(master);
|
||||
}
|
||||
}
|
||||
List<OrderListResponse> filteredMasterList = masterList.stream()
|
||||
.filter(master -> {
|
||||
// 查询该主单下所有售后中的子单
|
||||
OrderDetail detailAfterListOfMasterQry = new OrderDetail();
|
||||
detailAfterListOfMasterQry.setOrderMasterCode(master.getOrderMasterCode());
|
||||
// 注意:这里使用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);
|
||||
}
|
||||
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<>();
|
||||
// 如果查询的是未约未排状态,只查询未全部派完的主单
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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("开始执行自动确认收货定时任务");
|
||||
|
|
|
|||
|
|
@ -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());
|
||||
|
||||
|
|
|
|||
|
|
@ -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 <= DATE_SUB(NOW(), INTERVAL 36 HOUR)
|
||||
AND redo_complete_time >= DATE_SUB(NOW(), INTERVAL 2190 MINUTE))
|
||||
AND redo_complete_time >= DATE_SUB(NOW(), INTERVAL 2220 MINUTE))
|
||||
OR
|
||||
-- 倒计时3:师傅拒绝或同意后客户36小时不操作
|
||||
(worker_feedback_result IN (0, 1)
|
||||
AND update_time <= DATE_SUB(NOW(), INTERVAL 36 HOUR)
|
||||
AND update_time >= DATE_SUB(NOW(), INTERVAL 2190 MINUTE))
|
||||
AND update_time >= DATE_SUB(NOW(), INTERVAL 2220 MINUTE))
|
||||
OR
|
||||
-- 倒计时4:师傅选择重发/补发方案后客户36小时不操作
|
||||
(worker_resend_plan_time IS NOT NULL
|
||||
AND worker_resend_plan_time <= DATE_SUB(NOW(), INTERVAL 36 HOUR)
|
||||
AND worker_resend_plan_time >= 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 <= DATE_SUB(NOW(), INTERVAL 4 DAY)
|
||||
AND worker_resend_time >= DATE_SUB(NOW(), INTERVAL 5790 MINUTE)
|
||||
)
|
||||
|
|
@ -318,7 +328,7 @@
|
|||
<include refid="selectAfterServiceRecordVo"/>
|
||||
WHERE customer_operation_time IS NOT NULL
|
||||
AND customer_operation_time <= DATE_SUB(NOW(), INTERVAL 6 DAY)
|
||||
AND customer_operation_time >= DATE_SUB(NOW(), INTERVAL 8670 MINUTE)
|
||||
AND customer_operation_time >= 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
|
||||
|
|
|
|||
Loading…
Reference in New Issue