修改售后类型,以及平台操作类型,平台退款金额处理

This commit is contained in:
cb 2025-10-25 16:35:48 +08:00
parent 1485037c82
commit 40ba4652be
10 changed files with 216 additions and 12 deletions

View File

@ -2050,6 +2050,7 @@ public class OrderController extends BaseController {
// 编辑返回属性 // 编辑返回属性
orderListResponse.setAfterPlatformServiceStatus(master.getAfterServiceStatus());
orderListResponse.setShowInMonitor(master.getShowInMonitor()); orderListResponse.setShowInMonitor(master.getShowInMonitor());
orderListResponse.setShowAfterServiceRecord(hasMatchingAfterService ? 1 : 0); orderListResponse.setShowAfterServiceRecord(hasMatchingAfterService ? 1 : 0);
orderListResponse.setWorkerRemark(master.getWorkerRemark()); orderListResponse.setWorkerRemark(master.getWorkerRemark());
@ -2298,7 +2299,9 @@ public class OrderController extends BaseController {
=afterServiceRecordService.selectAfterServiceRecordList(afterServiceRecord); =afterServiceRecordService.selectAfterServiceRecordList(afterServiceRecord);
orderListResponse.setShowAfterServiceRecord( 1); orderListResponse.setShowAfterServiceRecord( 1);
// 编辑返回属性 // 编辑返回属性
orderListResponse.setAfterPlatformServiceStatus(detail.getAfterServiceStatus());
orderListResponse.setWorkerRemark(detail.getWorkerRemark()); orderListResponse.setWorkerRemark(detail.getWorkerRemark());
orderListResponse.setGoods(goods); orderListResponse.setGoods(goods);
orderListResponse.setGoodsBrand(orderMaster.getGoodsBrand()); orderListResponse.setGoodsBrand(orderMaster.getGoodsBrand());

View File

@ -535,6 +535,7 @@ public class OrderDetailController extends BaseController {
orderListResponse.setHandoverRemark(detail.getHandoverRemark()); orderListResponse.setHandoverRemark(detail.getHandoverRemark());
orderListResponse.setGoods(goods); orderListResponse.setGoods(goods);
orderListResponse.setAfterPlatformServiceStatus(detail.getAfterServiceStatus());
orderListResponse.setAddMoneyRemark(addMoneyRemark); orderListResponse.setAddMoneyRemark(addMoneyRemark);
orderListResponse.setAddMoney(addMoneyTotal); orderListResponse.setAddMoney(addMoneyTotal);
orderListResponse.setOrderDetailId(detail.getId()); orderListResponse.setOrderDetailId(detail.getId());

View File

@ -1825,6 +1825,7 @@ public class OrderMasterController extends BaseController {
} }
OrderStandardDetail orderStandardDetail = new OrderStandardDetail(); OrderStandardDetail orderStandardDetail = new OrderStandardDetail();
orderStandardDetail.setAfterPlatformServiceStatus(orderDetail.getAfterServiceStatus());
orderStandardDetail.setOrderImages(orderDetail.getOrderImages()); orderStandardDetail.setOrderImages(orderDetail.getOrderImages());
orderStandardDetail.setHandoverImages(orderDetail.getHandoverImages()); orderStandardDetail.setHandoverImages(orderDetail.getHandoverImages());
orderStandardDetail.setHandoverRemark(orderDetail.getHandoverRemark()); orderStandardDetail.setHandoverRemark(orderDetail.getHandoverRemark());
@ -2995,6 +2996,128 @@ public class OrderMasterController extends BaseController {
return shop; return shop;
} }
/**
* 取消售后
*
* @param afterServiceRecordId 售后记录ID
* @return 操作结果
*/
@PostMapping("/after/cancel")
@ResponseBody
@Log(title = "取消售后管理", businessType = BusinessType.UPDATE)
@Transactional(rollbackFor = Exception.class)
public AjaxResult cancelAfterService(@RequestParam("afterServiceRecordId") Long afterServiceRecordId,
@RequestParam("platformHandleReason") String platformHandleReason) {
try {
// 参数校验
if (afterServiceRecordId == null) {
return AjaxResult.error("售后记录ID不能为空");
}
if (StringUtils.isEmpty(platformHandleReason)) {
return AjaxResult.error("平台取消原因不能为空");
}
// 查询售后记录是否存在
AfterServiceRecord afterServiceRecord = afterServiceRecordService.selectAfterServiceRecordById(String.valueOf(afterServiceRecordId));
if (afterServiceRecord == null) {
return AjaxResult.error("售后记录不存在");
}
// 检查售后记录状态是否允许取消
if (afterServiceRecord.getAfterServiceStatus() != null && afterServiceRecord.getAfterServiceStatus() == 4) {
return AjaxResult.error("售后记录已完成,无法取消");
}
// 更新售后记录状态
AfterServiceRecord updateRecord = new AfterServiceRecord();
updateRecord.setId(String.valueOf(afterServiceRecordId));
// updateRecord.setAfterServiceStatus(3); // 3表示平台取消
updateRecord.setPlatformRefund(BigDecimal.ZERO); // 平台退款金额设为0
updateRecord.setAfterServiceStatus(2); // 售后状态改为已取消
updateRecord.setPlatformHandleReason(platformHandleReason);
updateRecord.setUpdateBy(getLoginName());
updateRecord.setUpdateTime(new Date());
afterServiceRecordService.updateAfterServiceRecord(updateRecord);
// 同步更新子单和主单的售后纠纷状态
// 1. 通过售后记录的orderDetailId查询对应的OrderDetail
Long orderDetailId = afterServiceRecord.getOrderDetailId();
if (orderDetailId != null) {
OrderDetail orderDetail = orderDetailService.selectById(orderDetailId);
if (orderDetail != null) {
// 2. 将OrderDetail的afterServiceStatus字段设为3售后已取消
OrderDetail updateOrderDetail = new OrderDetail();
updateOrderDetail.setId(orderDetailId);
updateOrderDetail.setAfterServiceStatus(3); // 0-无售后
updateOrderDetail.setUpdateBy(getLoginName());
updateOrderDetail.setUpdateTime(new Date());
orderDetailService.updateOrderDetail(updateOrderDetail);
logger.info("更新子单售后状态成功子单ID={}, 售后状态=0", orderDetailId);
// 3. 通过OrderDetail的orderMasterId查询对应的OrderMaster
Long orderMasterId = orderDetail.getOrderMasterId();
if (orderMasterId != null) {
// 4. 检查该主单下是否还有其他售后纠纷记录
// 首先通过主单ID查询该主单下的所有子单
OrderDetail queryOrderDetail = new OrderDetail();
queryOrderDetail.setOrderMasterId(orderMasterId);
List<OrderDetail> orderDetails = orderDetailService.selectOrderDetailList(queryOrderDetail);
// 获取所有子单ID列表
List<Long> orderDetailIds = orderDetails.stream()
.map(OrderDetail::getId)
.collect(Collectors.toList());
// 通过子单ID列表查询对应的售后记录
List<AfterServiceRecord> masterAfterRecords = new ArrayList<>();
for (Long detailId : orderDetailIds) {
AfterServiceRecord queryParam = new AfterServiceRecord();
queryParam.setOrderDetailId(detailId);
List<AfterServiceRecord> detailAfterRecords = afterServiceRecordService.selectAfterServiceRecordList(queryParam);
masterAfterRecords.addAll(detailAfterRecords);
}
// 过滤掉当前取消的售后记录检查是否还有其他进行中的售后
boolean hasOtherAfterService = masterAfterRecords.stream()
.anyMatch(record -> !record.getId().equals(String.valueOf(afterServiceRecordId))
&& record.getAfterServiceStatus() != null
&& record.getAfterServiceStatus() != 2); // 2表示已取消
// 5. 如果没有其他售后纠纷则将OrderMaster的afterServiceStatus字段也设为0无售后
if (!hasOtherAfterService) {
OrderMaster updateOrderMaster = new OrderMaster();
updateOrderMaster.setId(orderMasterId);
updateOrderMaster.setAfterServiceStatus(0); // 0-无售后
updateOrderMaster.setUpdateBy(getLoginName());
updateOrderMaster.setUpdateTime(new Date());
orderMasterService.updateOrderMaster(updateOrderMaster);
logger.info("更新主单售后状态成功主单ID={}, 售后状态=0", orderMasterId);
} else {
logger.info("主单下还有其他售后记录不更新主单售后状态主单ID={}", orderMasterId);
}
}
} else {
logger.warn("未找到对应的子单子单ID={}", orderDetailId);
}
} else {
logger.warn("售后记录中未找到对应的子单ID售后记录ID={}", afterServiceRecordId);
}
logger.info("取消售后成功售后记录ID={}, 操作人={}",
afterServiceRecordId, getLoginName());
return AjaxResult.success("取消售后成功");
} catch (Exception e) {
logger.error("取消售后失败售后记录ID={}, 错误信息={}", afterServiceRecordId, e.getMessage(), e);
return AjaxResult.error("取消售后失败:" + e.getMessage());
}
}
/** /**
* 获取售后纠纷的主单ID列表 * 获取售后纠纷的主单ID列表
* 通过查询AfterServiceRecord表中customerFinalCheck=0的记录 * 通过查询AfterServiceRecord表中customerFinalCheck=0的记录

View File

@ -328,4 +328,7 @@ public class OrderListResponse {
@Excel(name = "是否显示在监控单", cellType = Excel.ColumnType.NUMERIC, readConverterExp = "0=不显示,1=显示在监控单") @Excel(name = "是否显示在监控单", cellType = Excel.ColumnType.NUMERIC, readConverterExp = "0=不显示,1=显示在监控单")
private Integer showInMonitor; private Integer showInMonitor;
@Excel(name = "售后状态0-无售后1-售后纠纷,2-售后已完成,3-售后已取消")
private Integer afterPlatformServiceStatus;
} }

View File

@ -128,5 +128,6 @@ public class OrderStandardDetail {
private String handoverRemark; private String handoverRemark;
private String orderImages; private String orderImages;
//= "售后状态0-无售后1-售后纠纷,2-售后已完成,3-售后已取消"
private Integer afterPlatformServiceStatus;
} }

View File

@ -1031,20 +1031,18 @@
modalContent += '<table class="table table-bordered table-striped">'; modalContent += '<table class="table table-bordered table-striped">';
modalContent += '<thead><tr>'; modalContent += '<thead><tr>';
modalContent += '<th>子单号</th>'; modalContent += '<th>子单号</th>';
modalContent += '<th>售后类型</th>'; modalContent += '<th>申请退款金额</th>';
modalContent += '<th>师傅反馈</th>'; modalContent += '<th>师傅反馈</th>';
modalContent += '<th>客户确认</th>'; modalContent += '<th>客户确认</th>';
modalContent += '<th>申请退款金额</th>';
modalContent += '<th style="width: 280px;">操作</th>'; modalContent += '<th style="width: 280px;">操作</th>';
modalContent += '</tr></thead><tbody>'; modalContent += '</tr></thead><tbody>';
disputeRecords.forEach(function(record) { disputeRecords.forEach(function(record) {
modalContent += '<tr>'; modalContent += '<tr>';
modalContent += '<td>' + (record.orderDetailCode || record.id) + '</td>'; modalContent += '<td>' + (record.orderDetailCode || record.id) + '</td>';
modalContent += '<td>' + getAfterServiceTypeText(record.afterServiceType) + '</td>'; modalContent += '<td>¥' + (record.refund || record.agreedRefund || 0) + '</td>';
modalContent += '<td>' + getWorkerFeedbackText(record.workerFeedbackResult) + '</td>'; modalContent += '<td>' + getWorkerFeedbackText(record.workerFeedbackResult) + '</td>';
modalContent += '<td>' + getCustomerCheckText(record.customerFinalCheck) + '</td>'; modalContent += '<td>' + getCustomerCheckText(record.customerFinalCheck) + '</td>';
modalContent += '<td>¥' + (record.agreedRefund || 0) + '</td>';
modalContent += '<td>'; modalContent += '<td>';
modalContent += '<div style="margin-bottom: 8px;">'; modalContent += '<div style="margin-bottom: 8px;">';
modalContent += '<label style="font-size: 12px; color: #666; margin-bottom: 2px; display: block;">退款金额:</label>'; modalContent += '<label style="font-size: 12px; color: #666; margin-bottom: 2px; display: block;">退款金额:</label>';
@ -1055,6 +1053,7 @@
modalContent += '<input type="text" class="form-control" id="processReason_' + record.id + '" placeholder="请输入处理原因" style="width: 100%; font-size: 12px; height: 28px;">'; modalContent += '<input type="text" class="form-control" id="processReason_' + record.id + '" placeholder="请输入处理原因" style="width: 100%; font-size: 12px; height: 28px;">';
modalContent += '</div>'; modalContent += '</div>';
modalContent += '<button class="btn btn-primary btn-xs" onclick="processRefund(' + record.id + ', ' + orderDetailId + ')" style="width: 100%; font-size: 12px; height: 28px;">处理退款</button>'; modalContent += '<button class="btn btn-primary btn-xs" onclick="processRefund(' + record.id + ', ' + orderDetailId + ')" style="width: 100%; font-size: 12px; height: 28px;">处理退款</button>';
modalContent += '<button class="btn btn-warning btn-xs" onclick="cancelAfterService(' + record.id + ', ' + orderDetailId + ')" style="width: 100%; font-size: 12px; height: 28px; margin-top: 4px;">取消售后</button>';
modalContent += '</td>'; modalContent += '</td>';
modalContent += '</tr>'; modalContent += '</tr>';
}); });
@ -1118,6 +1117,43 @@
}); });
} }
// 取消售后
function cancelAfterService(recordId, orderDetailId) {
// 获取处理原因输入框的值
var processReason = $('#processReason_' + recordId).val();
if (!processReason || processReason.trim() === '') {
$.modal.msgError("请输入处理原因");
return;
}
$.modal.confirm("确认取消该售后申请吗?", function() {
$.ajax({
type: "POST",
dataType: "json",
url: ctx + "order/master/after/cancel",
data: {
afterServiceRecordId: recordId,
platformHandleReason: processReason.trim()
},
success: function (result) {
if (result.code == web_status.SUCCESS) {
$.modal.msgSuccess("取消售后成功");
// 关闭弹窗
layer.closeAll();
// 刷新表格
$.table.refresh();
} else {
$.modal.msgError("取消售后失败:" + result.msg);
}
},
error: function () {
$.modal.msgError("取消售后失败,请重试");
}
});
});
}
// 获取售后类型文本 // 获取售后类型文本
function getAfterServiceTypeText(type) { function getAfterServiceTypeText(type) {
var typeMap = { var typeMap = {

View File

@ -1268,15 +1268,13 @@
if (afterServiceRecords && afterServiceRecords.length > 0) { if (afterServiceRecords && afterServiceRecords.length > 0) {
html += '<div class="table-responsive">'; html += '<div class="table-responsive">';
html += '<table class="table table-bordered table-striped">'; html += '<table class="table table-bordered table-striped">';
html += '<thead><tr><th>子单号</th><th>售后类型</th><th>申请原因</th><th>申请金额</th><th>师傅反馈</th><th>客户确认</th><th>操作</th></tr></thead>'; html += '<thead><tr><th>子单号</th><th>申请退款金额</th><th>师傅反馈</th><th>客户确认</th><th>操作</th></tr></thead>';
html += '<tbody>'; html += '<tbody>';
afterServiceRecords.forEach(function(record) { afterServiceRecords.forEach(function(record) {
html += '<tr>'; html += '<tr>';
html += '<td>' + (record.orderDetailCode || '') + '</td>'; html += '<td>' + (record.orderDetailCode || '') + '</td>';
html += '<td>' + getAfterServiceTypeText(record.afterServiceType) + '</td>'; html += '<td>¥' + (record.refund || record.agreedRefund || 0) + '</td>';
html += '<td>' + (record.customerReason || '') + '</td>';
html += '<td>¥' + (record.refund || 0) + '</td>';
html += '<td>' + getWorkerFeedbackText(record.workerFeedbackResult) + '</td>'; html += '<td>' + getWorkerFeedbackText(record.workerFeedbackResult) + '</td>';
html += '<td>' + getCustomerCheckText(record.customerFinalCheck) + '</td>'; html += '<td>' + getCustomerCheckText(record.customerFinalCheck) + '</td>';
html += '<td style="width: 280px;">'; html += '<td style="width: 280px;">';
@ -1289,6 +1287,7 @@
html += '<input type="text" class="form-control" id="processReason_' + record.id + '" placeholder="请输入处理原因" style="width: 100%; font-size: 12px; height: 28px;">'; html += '<input type="text" class="form-control" id="processReason_' + record.id + '" placeholder="请输入处理原因" style="width: 100%; font-size: 12px; height: 28px;">';
html += '</div>'; html += '</div>';
html += '<button class="btn btn-primary btn-xs" onclick="processRefund(\'' + record.id + '\', \'' + orderMasterId + '\')" style="width: 100%; font-size: 12px; height: 28px;">处理退款</button>'; html += '<button class="btn btn-primary btn-xs" onclick="processRefund(\'' + record.id + '\', \'' + orderMasterId + '\')" style="width: 100%; font-size: 12px; height: 28px;">处理退款</button>';
html += '<button class="btn btn-warning btn-xs" onclick="cancelAfterService(\'' + record.id + '\', \'' + orderMasterId + '\')" style="width: 100%; font-size: 12px; height: 28px; margin-top: 4px;">取消售后</button>';
html += '</td>'; html += '</td>';
html += '</tr>'; html += '</tr>';
}); });
@ -1358,6 +1357,42 @@
}); });
} }
// 取消售后
function cancelAfterService(recordId, orderMasterId) {
// 获取处理原因输入框的值
var processReason = $('#processReason_' + recordId).val();
if (!processReason || processReason.trim() === '') {
$.modal.msgError("请输入处理原因");
return;
}
$.modal.confirm("确认取消该售后申请吗?", function() {
$.ajax({
type: "POST",
dataType: "json",
url: prefix + '/after/cancel',
data: {
afterServiceRecordId: recordId,
platformHandleReason: processReason.trim()
},
success: function (result) {
if (result.code == web_status.SUCCESS) {
$.modal.msgSuccess("取消售后成功");
$('#afterServiceDisputeModal').modal('hide');
// 刷新页面数据
$.table.refresh();
} else {
$.modal.msgError("取消售后失败:" + result.msg);
}
},
error: function() {
$.modal.msgError("取消售后失败,请重试!");
}
});
});
}
// 获取售后类型文本 // 获取售后类型文本
function getAfterServiceTypeText(type) { function getAfterServiceTypeText(type) {
var types = { var types = {

View File

@ -264,7 +264,7 @@ public class OrderDetail extends BaseEntity {
/** /**
* 售后状态0-无售后1-售后纠纷 * 售后状态0-无售后1-售后纠纷
*/ */
@Excel(name = "售后状态0-无售后1-售后纠纷2-售后已完成") @Excel(name = "售后状态0-无售后1-售后纠纷2-售后已完成3-售后已取消")
private Integer afterServiceStatus; private Integer afterServiceStatus;
/** /**

View File

@ -327,7 +327,7 @@ public class OrderMaster extends BaseEntity {
/** /**
* 售后状态0-无售后1-售后纠纷 * 售后状态0-无售后1-售后纠纷
*/ */
@Excel(name = "售后状态0-无售后1-售后纠纷") @Excel(name = "售后状态0-无售后1-售后纠纷,2-售后已完成,3-售后已取消")
private Integer afterServiceStatus; private Integer afterServiceStatus;
/** /**

View File

@ -878,7 +878,9 @@ public class AfterServiceRecordServiceImpl implements IAfterServiceRecordService
log.info("当前订单是否已支付: {}", payReverse); log.info("当前订单是否已支付: {}", payReverse);
// 申请退款金额 // 申请退款金额
BigDecimal refundMoney=BigDecimal.ZERO; BigDecimal refundMoney=BigDecimal.ZERO;
if (ObjectUtils.isNotEmpty(afterServiceRecord.getAgreedRefund())) { if (ObjectUtils.isNotEmpty(afterServiceRecord.getPlatformRefund())) {
refundMoney = afterServiceRecord.getPlatformRefund();
}else if (ObjectUtils.isNotEmpty(afterServiceRecord.getAgreedRefund())) {
refundMoney = afterServiceRecord.getAgreedRefund(); refundMoney = afterServiceRecord.getAgreedRefund();
} else { } else {
refundMoney = afterServiceRecord.getRefund(); refundMoney = afterServiceRecord.getRefund();