diff --git a/ghy-admin/src/main/resources/application.yaml b/ghy-admin/src/main/resources/application.yaml index 6cbd33f8..18bb5788 100644 --- a/ghy-admin/src/main/resources/application.yaml +++ b/ghy-admin/src/main/resources/application.yaml @@ -116,7 +116,7 @@ qiniu: accessKey: 'QTNOppkvtufxTxLjt1V7YZwvzV2Rc6WLD5yXLBVY' secretKey: 'V8SM9nkbO-dft4JmG7UaCH6RYxXdqzrvQ0zWO2W3' bucketName: 'gqz' - mediaUrl: 'http://gqz.opsoul.com/' + mediaUrl: 'https://gqz.opsoul.com/' adapay: debug: true 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 2f84ba99..4bfe3caa 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 @@ -137,6 +137,14 @@ public class AfterServiceRecord extends BaseEntity @Excel(name = "师傅重发/补发方案") private Integer workerResendPlan; + /** 客户不同意图片 */ + @Excel(name = "客户不同意图片") + private String customerDisagreeImages; + + /** 客户不同意理由 */ + @Excel(name = "客户不同意理由") + private String customerDisagreeReason; + private boolean excludeAfterServiceFinished; private List imgsList; diff --git a/ghy-order/src/main/java/com/ghy/order/domain/OrderDetail.java b/ghy-order/src/main/java/com/ghy/order/domain/OrderDetail.java index 71a68272..d8b0d078 100644 --- a/ghy-order/src/main/java/com/ghy/order/domain/OrderDetail.java +++ b/ghy-order/src/main/java/com/ghy/order/domain/OrderDetail.java @@ -249,4 +249,10 @@ public class OrderDetail extends BaseEntity { * 师傅备注 */ private String workerRemark; + + /** + * 售后状态:0-无售后,1-售后纠纷 + */ + @Excel(name = "售后状态:0-无售后,1-售后纠纷") + private Integer afterServiceStatus; } diff --git a/ghy-order/src/main/java/com/ghy/order/domain/OrderMaster.java b/ghy-order/src/main/java/com/ghy/order/domain/OrderMaster.java index 59552908..645c3221 100644 --- a/ghy-order/src/main/java/com/ghy/order/domain/OrderMaster.java +++ b/ghy-order/src/main/java/com/ghy/order/domain/OrderMaster.java @@ -323,4 +323,10 @@ public class OrderMaster extends BaseEntity { * 师傅备注 */ private String workerRemark; + + /** + * 售后状态:0-无售后,1-售后纠纷 + */ + @Excel(name = "售后状态:0-无售后,1-售后纠纷") + private Integer afterServiceStatus; } 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 f9d078ee..c61e69ef 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 @@ -209,6 +209,12 @@ public class AfterServiceRecordServiceImpl implements IAfterServiceRecordService } if (param.getCustomerFinalCheck()!=null ) { + // 检查是否已经被自动处理过,防止重复退款 + if (afterServiceRecord.getIsAutoProcessed() != null && afterServiceRecord.getIsAutoProcessed() == 1) { + log.warn("售后记录[{}]已被自动处理,不允许手动重复操作", afterServiceRecord.getId()); + return AjaxResult.error("该售后记录已被系统自动处理,无法重复操作"); + } + // 检查师傅是否已经重做完成 if (afterServiceRecord.getWorkerFeedbackResult() != null && afterServiceRecord.getWorkerFeedbackResult().equals(3L)) { // 师傅已重做完成 @@ -239,6 +245,15 @@ public class AfterServiceRecordServiceImpl implements IAfterServiceRecordService } else { // 客户不同意重做结果,按之前的逻辑走(可能需要退款) log.info("师傅重做完成后,客户不同意重做结果,按原逻辑处理"); + // 客户不同意时,保存不同意图片和理由 + if (param.getCustomerDisagreeImages() != null) { + afterServiceRecord.setCustomerDisagreeImages(param.getCustomerDisagreeImages()); + } + if (param.getCustomerDisagreeReason() != null) { + afterServiceRecord.setCustomerDisagreeReason(param.getCustomerDisagreeReason()); + } + // 更新子单和主单的售后状态为售后纠纷 + updateAfterServiceStatus(afterServiceRecord.getOrderDetailId(), 1); // 继续执行下面的退款逻辑 } } @@ -248,6 +263,15 @@ public class AfterServiceRecordServiceImpl implements IAfterServiceRecordService afterServiceRecord.setCustomerFinalCheck(1L); }else{ afterServiceRecord.setCustomerFinalCheck(0L); + // 客户不同意时,保存不同意图片和理由 + if (param.getCustomerDisagreeImages() != null) { + afterServiceRecord.setCustomerDisagreeImages(param.getCustomerDisagreeImages()); + } + if (param.getCustomerDisagreeReason() != null) { + afterServiceRecord.setCustomerDisagreeReason(param.getCustomerDisagreeReason()); + } + // 更新子单和主单的售后状态为售后纠纷 + updateAfterServiceStatus(afterServiceRecord.getOrderDetailId(), 1); } afterServiceRecord.setRefundApplyTime(new Date()); // 售后客户回复通知 @@ -314,6 +338,7 @@ public class AfterServiceRecordServiceImpl implements IAfterServiceRecordService Assert.notNull(financialMaster, "找不到支付记录"); // 是否已付款,用于判断是否需要退款 boolean payReverse = PayStatus.PAID.getCode().equals(financialMaster.getPayStatus()); + log.info("当前订单是否已支付: {}", payReverse); // 申请退款金额 BigDecimal refundMoney; if (ObjectUtils.isNotEmpty(afterServiceRecord.getAgreedRefund())) { @@ -358,6 +383,9 @@ public class AfterServiceRecordServiceImpl implements IAfterServiceRecordService // 发起支付撤销 if (payReverse) { payReverse(orderMaster.getDeptId(), financialMaster.getPaymentId(), reverseAmt); + }else{ + BigDecimal newRefundMoney=BigDecimal.ZERO; + afterServiceRecord.setOriginalRefund(newRefundMoney); } } else { // 如果退款金额 < 主单服务金额 @@ -365,11 +393,16 @@ public class AfterServiceRecordServiceImpl implements IAfterServiceRecordService afterServiceRecord.setOriginalRefund(refundMoney); financialMaster.setPayMoney(financialMaster.getPayMoney().subtract(refundMoney)); financialMaster.setServerMoney(financialMaster.getServerMoney().subtract(refundMoney)); + financialMaster.setDiscountMoney(refundMoney); financialMasterService.updateFinancialMaster(financialMaster); String reverseAmt = AdapayUtils.bigDecimalToString(refundMoney); // 发起支付撤销 if (payReverse) { + log.info("已支付[{}]退款 refundMoney: {}", orderDetail.getId(), reverseAmt); payReverse(orderMaster.getDeptId(), financialMaster.getPaymentId(), reverseAmt); + }else{ + BigDecimal newRefundMoney=BigDecimal.ZERO; + afterServiceRecord.setOriginalRefund(newRefundMoney); } } } else { @@ -392,6 +425,9 @@ public class AfterServiceRecordServiceImpl implements IAfterServiceRecordService if (payReverse) { String reverseAmt = AdapayUtils.bigDecimalToString(refundMoney); payReverse(orderMaster.getDeptId(), financialMaster.getPaymentId(), reverseAmt); + }else{ + BigDecimal newRefundMoney=BigDecimal.ZERO; + afterServiceRecord.setOriginalRefund(newRefundMoney); } } @@ -619,4 +655,33 @@ public class AfterServiceRecordServiceImpl implements IAfterServiceRecordService } } + /** + * 更新子单和主单的售后状态 + * @param orderDetailId 子单ID + * @param afterServiceStatus 售后状态:0-无售后,1-售后纠纷 + */ + private void updateAfterServiceStatus(Long orderDetailId, Integer afterServiceStatus) { + try { + // 更新子单售后状态 + OrderDetail orderDetail = new OrderDetail(); + orderDetail.setId(orderDetailId); + orderDetail.setAfterServiceStatus(afterServiceStatus); + orderDetailService.updateOrderDetail(orderDetail); + + // 获取主单ID并更新主单售后状态 + OrderDetail detail = orderDetailService.selectById(orderDetailId); + if (detail != null && detail.getOrderMasterId() != null) { + OrderMaster orderMaster = new OrderMaster(); + orderMaster.setId(detail.getOrderMasterId()); + orderMaster.setAfterServiceStatus(afterServiceStatus); + orderMasterService.updateOrderMaster(orderMaster); + + log.info("更新售后状态成功,子单ID:{},主单ID:{},售后状态:{}", + orderDetailId, detail.getOrderMasterId(), afterServiceStatus); + } + } catch (Exception e) { + log.error("更新售后状态失败,子单ID:{},售后状态:{}", orderDetailId, afterServiceStatus, e); + } + } + } diff --git a/ghy-order/src/main/resources/mapper/order/AfterServiceRecordMapper.xml b/ghy-order/src/main/resources/mapper/order/AfterServiceRecordMapper.xml index 624f6f58..b5c54a33 100644 --- a/ghy-order/src/main/resources/mapper/order/AfterServiceRecordMapper.xml +++ b/ghy-order/src/main/resources/mapper/order/AfterServiceRecordMapper.xml @@ -40,6 +40,8 @@ + + @@ -47,7 +49,8 @@ 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_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 + return_address, return_contact, return_phone, return_type, return_remark, return_images, return_tracking_number, return_ship_time, merchant_receive_time, worker_resend_plan, + customer_disagree_images, customer_disagree_reason from after_service_record @@ -110,6 +113,8 @@ return_ship_time, merchant_receive_time, worker_resend_plan, + customer_disagree_images, + customer_disagree_reason, create_by, update_by, remark, @@ -143,6 +148,8 @@ #{returnShipTime}, #{merchantReceiveTime}, #{workerResendPlan}, + #{customerDisagreeImages}, + #{customerDisagreeReason}, #{createBy}, #{updateBy}, #{remark}, @@ -182,6 +189,8 @@ return_ship_time = #{returnShipTime}, merchant_receive_time = #{merchantReceiveTime}, worker_resend_plan = #{workerResendPlan}, + customer_disagree_images = #{customerDisagreeImages}, + customer_disagree_reason = #{customerDisagreeReason}, create_by = #{createBy}, create_time = #{createTime}, update_by = #{updateBy},