diff --git a/ghy-admin/src/main/java/com/ghy/web/controller/order/AfterServiceRecordController.java b/ghy-admin/src/main/java/com/ghy/web/controller/order/AfterServiceRecordController.java index c89c0c11..d8de1c51 100644 --- a/ghy-admin/src/main/java/com/ghy/web/controller/order/AfterServiceRecordController.java +++ b/ghy-admin/src/main/java/com/ghy/web/controller/order/AfterServiceRecordController.java @@ -82,7 +82,7 @@ public class AfterServiceRecordController extends BaseController { @ResponseBody public AjaxResult export(AfterServiceRecord afterServiceRecord) { List list = afterServiceRecordService.selectAfterServiceRecordList(afterServiceRecord); - ExcelUtil util = new ExcelUtil(AfterServiceRecord.class); + ExcelUtil util = new ExcelUtil<>(AfterServiceRecord.class); return util.exportExcel(list, "售后记录数据"); } 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 b95245b2..96a47dc9 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 @@ -38,8 +38,8 @@ public class AfterServiceRecord extends BaseEntity @Excel(name = "操作原因:1为申请退款,2为发起售后") private Long operType; - /** 师傅反馈结果:0为拒绝,1为同意 */ - @Excel(name = "师傅反馈结果:0为拒绝,1为同意") + /** 师傅反馈结果:0为拒绝,1为同意,2为上门补做/重做 */ + @Excel(name = "师傅反馈结果:0为拒绝,1为同意,2为上门补做/重做") private Long workerFeedbackResult; /** 师傅反馈原因类型:1为客户原因,2为师傅原因,3为其他 */ diff --git a/ghy-order/src/main/java/com/ghy/order/mapper/AfterServiceRecordMapper.java b/ghy-order/src/main/java/com/ghy/order/mapper/AfterServiceRecordMapper.java index 01a85c6f..33fae398 100644 --- a/ghy-order/src/main/java/com/ghy/order/mapper/AfterServiceRecordMapper.java +++ b/ghy-order/src/main/java/com/ghy/order/mapper/AfterServiceRecordMapper.java @@ -1,23 +1,23 @@ package com.ghy.order.mapper; -import java.util.List; import com.ghy.order.domain.AfterServiceRecord; +import java.util.List; + /** * 售后记录Mapper接口 * * @author clunt * @date 2022-09-25 */ -public interface AfterServiceRecordMapper -{ +public interface AfterServiceRecordMapper { /** * 查询售后记录 * * @param id 售后记录主键 * @return 售后记录 */ - public AfterServiceRecord selectAfterServiceRecordById(String id); + AfterServiceRecord selectAfterServiceRecordById(String id); /** * 查询售后记录列表 @@ -25,7 +25,7 @@ public interface AfterServiceRecordMapper * @param afterServiceRecord 售后记录 * @return 售后记录集合 */ - public List selectAfterServiceRecordList(AfterServiceRecord afterServiceRecord); + List selectAfterServiceRecordList(AfterServiceRecord afterServiceRecord); /** * 新增售后记录 @@ -33,7 +33,7 @@ public interface AfterServiceRecordMapper * @param afterServiceRecord 售后记录 * @return 结果 */ - public int insertAfterServiceRecord(AfterServiceRecord afterServiceRecord); + int insertAfterServiceRecord(AfterServiceRecord afterServiceRecord); /** * 修改售后记录 @@ -41,7 +41,7 @@ public interface AfterServiceRecordMapper * @param afterServiceRecord 售后记录 * @return 结果 */ - public int updateAfterServiceRecord(AfterServiceRecord afterServiceRecord); + int updateAfterServiceRecord(AfterServiceRecord afterServiceRecord); /** * 删除售后记录 @@ -49,7 +49,7 @@ public interface AfterServiceRecordMapper * @param id 售后记录主键 * @return 结果 */ - public int deleteAfterServiceRecordById(String id); + int deleteAfterServiceRecordById(String id); /** * 批量删除售后记录 @@ -57,5 +57,12 @@ public interface AfterServiceRecordMapper * @param ids 需要删除的数据主键集合 * @return 结果 */ - public int deleteAfterServiceRecordByIds(String[] ids); + int deleteAfterServiceRecordByIds(String[] ids); + + /** + * 查询未完成的售后记录 customer_final_check IS NULL + * + * @return 未完成的售后记录 + */ + AfterServiceRecord unfinished(Long orderDetailId); } 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 df782927..94d5c2b9 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 @@ -6,17 +6,23 @@ import com.ghy.common.core.text.Convert; import com.ghy.common.enums.PayStatus; import com.ghy.common.enums.RefundType; import com.ghy.common.exception.base.BaseException; -import com.ghy.common.utils.DateUtils; import com.ghy.common.utils.ObjectUtils; -import com.ghy.order.domain.*; +import com.ghy.order.domain.AfterServiceImgs; +import com.ghy.order.domain.AfterServiceRecord; +import com.ghy.order.domain.OrderDetail; +import com.ghy.order.domain.OrderMaster; import com.ghy.order.mapper.AfterServiceRecordMapper; -import com.ghy.order.service.*; +import com.ghy.order.service.IAfterServiceImgsService; +import com.ghy.order.service.IAfterServiceRecordService; +import com.ghy.order.service.OrderDetailService; +import com.ghy.order.service.OrderMasterService; import com.ghy.payment.domain.FinancialDetail; import com.ghy.payment.domain.FinancialMaster; import com.ghy.payment.service.AdapayService; import com.ghy.payment.service.FinancialDetailService; import com.ghy.payment.service.FinancialMasterService; import com.huifu.adapay.core.exception.BaseAdaPayException; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.Assert; @@ -25,7 +31,6 @@ import javax.annotation.Resource; import java.math.BigDecimal; import java.util.Date; import java.util.List; -import java.util.Objects; /** * 售后记录Service业务层处理 @@ -33,6 +38,7 @@ import java.util.Objects; * @author clunt * @date 2022-09-25 */ +@Slf4j @Service public class AfterServiceRecordServiceImpl implements IAfterServiceRecordService { @Resource @@ -49,8 +55,6 @@ public class AfterServiceRecordServiceImpl implements IAfterServiceRecordService private AdapayService adapayService; @Resource private OrderDetailService orderDetailService; - @Resource - private OrderGoodsService orderGoodsService; /** * 查询售后记录 @@ -88,7 +92,10 @@ public class AfterServiceRecordServiceImpl implements IAfterServiceRecordService */ @Override public int insertAfterServiceRecord(AfterServiceRecord afterServiceRecord) { - afterServiceRecord.setCreateTime(DateUtils.getNowDate()); + AfterServiceRecord unfinished = unfinished(afterServiceRecord.getOrderDetailId()); + if (unfinished != null) { + throw new BaseException("存在未完成的售后记录,请勿重复申请!"); + } int result = afterServiceRecordMapper.insertAfterServiceRecord(afterServiceRecord); if (afterServiceRecord.getImgsList() != null && afterServiceRecord.getImgsList().size() > 0) { @@ -100,6 +107,15 @@ public class AfterServiceRecordServiceImpl implements IAfterServiceRecordService return result; } + /** + * 查询未完成的售后记录 用于判断是否可以申请售后 + * + * @return 未完成的售后记录 + */ + public AfterServiceRecord unfinished(Long orderDetailId) { + return afterServiceRecordMapper.unfinished(orderDetailId); + } + /** * 修改售后记录 * @@ -111,53 +127,59 @@ public class AfterServiceRecordServiceImpl implements IAfterServiceRecordService public int updateAfterServiceRecord(AfterServiceRecord param) throws BaseAdaPayException { AfterServiceRecord afterServiceRecord = this.selectAfterServiceRecordById(param.getId()); Assert.notNull(afterServiceRecord, "售后记录不存在!"); - // 实际同意,需要发起退款,减少原单分账金额-调用退款接口 - if (param.getCustomerFinalCheck() != null && param.getCustomerFinalCheck() == 1) { - OrderDetail orderDetail = orderDetailService.selectById(afterServiceRecord.getOrderDetailId()); - Assert.notNull(orderDetail, "子单不存在!"); - FinancialDetail financialDetail = financialDetailService.selectByOrderDetailId(afterServiceRecord.getOrderDetailId()); - Assert.notNull(financialDetail, "财务子单不存在!"); - OrderMaster orderMaster = orderMasterService.selectById(orderDetail.getOrderMasterId()); - Assert.notNull(orderMaster, "找不到对应的订单"); - FinancialMaster financialMaster = financialMasterService.selectByOrderMasterId(orderDetail.getOrderMasterId()); - Assert.notNull(financialMaster, "找不到支付记录"); - Assert.hasText(financialMaster.getPaymentId(), "找不到订单的支付记录,请联系管理员"); - Assert.isTrue(PayStatus.PAID.getCode().equals(financialMaster.getPayStatus()), "订单未支付"); - // 申请退款金额 - BigDecimal refundMoney; - if (ObjectUtils.isNotEmpty(afterServiceRecord.getAgreedRefund())) { - refundMoney = afterServiceRecord.getAgreedRefund(); - } else { - refundMoney = afterServiceRecord.getRefund(); - } - if (refundMoney.compareTo(financialDetail.getPayMoney()) < 0) { - // 申请退款金额 < 子单金额 - financialDetail.setPayMoney(financialDetail.getPayMoney().subtract(refundMoney)); - financialMaster.setPayMoney(financialMaster.getPayMoney().subtract(refundMoney)); - // 更新主/子财务单金额 - financialMasterService.updateFinancialMaster(financialMaster); - financialDetailService.updateFinancialDetail(financialDetail); - // 发起支付撤销 - JSONObject response = adapayService.payReverse(orderMaster.getDeptId(), financialMaster.getPaymentId(), - String.valueOf(refundMoney), RefundType.RAS); - if (AdapayStatusEnum.pending.code.equals(response.getString("status"))) { - param.setOriginalRefund(refundMoney); - param.setRefundApplyTime(new Date()); - } else { - if ("reverse_amt_over".equals(response.getString("error_code"))) { - throw new BaseException("退款金额超出订单金额"); - } else { - throw new BaseException("发起退款异常"); - } - } - } else { - // 子单全额退款 直接走取消流程 - orderDetailService.cancelAgree(orderDetail.getId(), 1); - param.setOriginalRefund(financialDetail.getPayMoney()); - } + if (Long.valueOf(1L).equals(param.getCustomerFinalCheck()) && Long.valueOf(1L).equals(afterServiceRecord.getWorkerFeedbackResult())) { + // 客户同意退款 + afterServiceRecord.setCustomerFinalCheck(1L); + return agreeRefund(afterServiceRecord); + } else { + return afterServiceRecordMapper.updateAfterServiceRecord(param); } - param.setUpdateTime(new Date()); - return afterServiceRecordMapper.updateAfterServiceRecord(param); + } + + private int agreeRefund(AfterServiceRecord afterServiceRecord) throws BaseAdaPayException { + OrderDetail orderDetail = orderDetailService.selectById(afterServiceRecord.getOrderDetailId()); + Assert.notNull(orderDetail, "子单不存在!"); + FinancialDetail financialDetail = financialDetailService.selectByOrderDetailId(afterServiceRecord.getOrderDetailId()); + Assert.notNull(financialDetail, "财务子单不存在!"); + OrderMaster orderMaster = orderMasterService.selectById(orderDetail.getOrderMasterId()); + Assert.notNull(orderMaster, "找不到对应的订单"); + FinancialMaster financialMaster = financialMasterService.selectByOrderMasterId(orderDetail.getOrderMasterId()); + Assert.notNull(financialMaster, "找不到支付记录"); + Assert.hasText(financialMaster.getPaymentId(), "找不到订单的支付记录,请联系管理员"); + Assert.isTrue(PayStatus.PAID.getCode().equals(financialMaster.getPayStatus()), "订单未支付"); + // 申请退款金额 + BigDecimal refundMoney; + if (ObjectUtils.isNotEmpty(afterServiceRecord.getAgreedRefund())) { + refundMoney = afterServiceRecord.getAgreedRefund(); + } else { + refundMoney = afterServiceRecord.getRefund(); + } + if (refundMoney.compareTo(financialDetail.getPayMoney()) < 0) { + // 申请退款金额 < 子单金额 + afterServiceRecord.setOriginalRefund(refundMoney); + financialDetail.setPayMoney(financialDetail.getPayMoney().subtract(refundMoney)); + financialMaster.setPayMoney(financialMaster.getPayMoney().subtract(refundMoney)); + // 更新主/子财务单金额 + financialMasterService.updateFinancialMaster(financialMaster); + financialDetailService.updateFinancialDetail(financialDetail); + // 发起支付撤销 + JSONObject response = adapayService.payReverse(orderMaster.getDeptId(), financialMaster.getPaymentId(), + String.valueOf(refundMoney), RefundType.RAS); + if (!AdapayStatusEnum.pending.code.equals(response.getString("status"))) { + log.error("发起退款异常,异常信息:{}", response); + if ("reverse_amt_over".equals(response.getString("error_code"))) { + throw new BaseException("退款金额超出订单金额"); + } else { + throw new BaseException("发起退款失败"); + } + } + } else { + // 子单全额退款 直接走取消流程 + orderDetailService.cancelAgree(orderDetail.getId(), 1); + afterServiceRecord.setOriginalRefund(financialDetail.getPayMoney()); + } + afterServiceRecord.setRefundApplyTime(new Date()); + return afterServiceRecordMapper.updateAfterServiceRecord(afterServiceRecord); } /** @@ -168,7 +190,6 @@ public class AfterServiceRecordServiceImpl implements IAfterServiceRecordService */ @Override public int deleteAfterServiceRecordByIds(String ids) { - return afterServiceRecordMapper.deleteAfterServiceRecordByIds(Convert.toStrArray(ids)); } @@ -183,33 +204,4 @@ public class AfterServiceRecordServiceImpl implements IAfterServiceRecordService return afterServiceRecordMapper.deleteAfterServiceRecordById(id); } - private boolean checkIsOnlyServer(Long orderMasterId, Long workId) { - // 找出原单的数量 - List orderGoodsList = orderGoodsService.selectByOrderMasterId(orderMasterId); - // 找出原单关联的细单的商品数量 - List orderDetailList = orderDetailService.selectByOrderMasterId(orderMasterId); - for (OrderDetail detail : orderDetailList) { - // 非一个师傅接单 - if (!workId.equals(detail.getWorkerId())) { - return false; - } - // 子单数量 - List orderDetailGoodsList = orderGoodsService.selectByOrderDetailId(detail.getId()); - // 计算剩余未分配的商品数量 - for (OrderGoods detailGoods : orderDetailGoodsList) { - for (OrderGoods masterGoods : orderGoodsList) { - if (Objects.equals(masterGoods.getGoodsStandardId(), detailGoods.getGoodsStandardId())) { - masterGoods.setGoodsNum(masterGoods.getGoodsNum() - detailGoods.getGoodsNum()); - } - } - } - } - // 有单派完. - for (OrderGoods orderGoods : orderGoodsList) { - if (orderGoods.getGoodsNum() > 0) { - return false; - } - } - return true; - } } diff --git a/ghy-order/src/main/resources/mapper/order/AfterServiceRecordMapper.xml b/ghy-order/src/main/resources/mapper/order/AfterServiceRecordMapper.xml index 3d374687..fed615c1 100644 --- a/ghy-order/src/main/resources/mapper/order/AfterServiceRecordMapper.xml +++ b/ghy-order/src/main/resources/mapper/order/AfterServiceRecordMapper.xml @@ -26,7 +26,10 @@ - select id, customer_reason_type, customer_reason, order_detail_id, oper_type, worker_feedback_result, 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 from after_service_record + select id, customer_reason_type, customer_reason, order_detail_id, oper_type, worker_feedback_result, + 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 + from after_service_record + + insert into after_service_record @@ -67,10 +75,9 @@ agreed_refund, customer_final_check, create_by, - create_time, update_by, - update_time, remark, + createTime, updateTime #{customerReasonType}, @@ -84,10 +91,9 @@ #{agreedRefund}, #{customerFinalCheck}, #{createBy}, - #{createTime}, #{updateBy}, - #{updateTime}, #{remark}, + NOW(), NOW() @@ -109,8 +115,8 @@ create_by = #{createBy}, create_time = #{createTime}, update_by = #{updateBy}, - update_time = #{updateTime}, remark = #{remark}, + update_time = NOW() where id = #{id}