From f99b0c64abaf0e755b7592c02a7ccdc428f990be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=AD=E5=87=AF=E5=87=AF?= Date: Wed, 11 Dec 2024 09:48:24 +0800 Subject: [PATCH] =?UTF-8?q?=E6=94=AF=E6=8C=81=E6=8C=82=E8=B4=A6=E9=83=A8?= =?UTF-8?q?=E5=88=86=E9=80=80=E6=AC=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/TbCreditBuyerOrderService.java | 14 +++- .../impl/TbCreditBuyerOrderServiceImpl.java | 69 +++++++++++++++++++ .../cn/ysk/cashier/pojo/shop/TbShopInfo.java | 5 ++ .../impl/shopimpl/TbShopInfoServiceImpl.java | 12 ++++ .../impl/shopimpl/TbShopTableServiceImpl.java | 9 +-- 5 files changed, 104 insertions(+), 5 deletions(-) diff --git a/eladmin-system/src/main/java/cn/ysk/cashier/mybatis/service/TbCreditBuyerOrderService.java b/eladmin-system/src/main/java/cn/ysk/cashier/mybatis/service/TbCreditBuyerOrderService.java index 01b0c8ab..91064124 100644 --- a/eladmin-system/src/main/java/cn/ysk/cashier/mybatis/service/TbCreditBuyerOrderService.java +++ b/eladmin-system/src/main/java/cn/ysk/cashier/mybatis/service/TbCreditBuyerOrderService.java @@ -4,6 +4,7 @@ import cn.ysk.cashier.mybatis.entity.TbCreditBuyerOrder; import cn.ysk.cashier.mybatis.entity.TbCreditPaymentRecord; import com.baomidou.mybatisplus.extension.service.IService; +import java.math.BigDecimal; import java.util.Map; /** @@ -27,11 +28,22 @@ public interface TbCreditBuyerOrderService extends IService boolean save(String creditBuyerId, Long orderId); /** - * 挂账人退款 + * 挂账人退款(整单退款) * @param creditBuyerId 挂账人id * @param orderId 订单id * @return */ + @Deprecated boolean refund(String creditBuyerId, Long orderId); + + /** + * 挂账人退款(部分退款) + * @param creditBuyerId 挂账人id + * @param orderId 订单id + * @param refundAmount 退款金额 + * @return + */ + boolean partRefund(String creditBuyerId, Long orderId, BigDecimal refundAmount); + } \ No newline at end of file diff --git a/eladmin-system/src/main/java/cn/ysk/cashier/mybatis/service/impl/TbCreditBuyerOrderServiceImpl.java b/eladmin-system/src/main/java/cn/ysk/cashier/mybatis/service/impl/TbCreditBuyerOrderServiceImpl.java index 2f6fa687..2d420988 100644 --- a/eladmin-system/src/main/java/cn/ysk/cashier/mybatis/service/impl/TbCreditBuyerOrderServiceImpl.java +++ b/eladmin-system/src/main/java/cn/ysk/cashier/mybatis/service/impl/TbCreditBuyerOrderServiceImpl.java @@ -240,6 +240,7 @@ public class TbCreditBuyerOrderServiceImpl extends ServiceImpl params = new HashMap<>(2); + params.put("creditBuyerId", creditBuyerId); + params.put("orderId", orderId); + CreditBuyerOrderDTO dto = baseMapper.getOne(params); + if (dto == null) { + throw new BadRequestException("挂账订单不存在"); + } + // 1.只挂账未还款的情况,直接返回挂账额度 + if ("unpaid".equals(dto.getStatus())) { + // 退回额度 + creditBuyer.setCreditAmount(NumberUtil.add(creditBuyer.getCreditAmount(), refundAmount)); + tbCreditBuyerService.updateById(creditBuyer); + return true; + } + // 2.部分还款/已还款,删除挂账订单+红冲还款记录,并把已还款金额退回余额或挂账额度 + if ("partial".equals(dto.getStatus()) || "paid".equals(dto.getStatus())) { + // 已还款金额小于退款金额,需要把已还款金额退回余额 + if (NumberUtil.isLessOrEqual(dto.getPaidAmount(), refundAmount)) { + creditBuyer.setAccountBalance(NumberUtil.add(creditBuyer.getAccountBalance(), dto.getPaidAmount())); + // 这部分需要返回到额度 + BigDecimal subAmount = NumberUtil.sub(refundAmount, dto.getPaidAmount()); + creditBuyer.setCreditAmount(NumberUtil.add(creditBuyer.getCreditAmount(), subAmount)); + // 已还款金额进行冲红 + TbCreditPaymentRecord record = new TbCreditPaymentRecord(); + record.setCreditBuyerId(creditBuyerId); + record.setOrderId(orderId); + record.setRepaymentAmount(NumberUtil.sub(BigDecimal.ZERO, dto.getPaidAmount())); + record.setPaymentMethod("挂账退款"); + record.setPaymentTime(new Date()); + record.setRemark(StrUtil.format("挂账订单:{}申请退款¥{}元,还款部分¥{}元已归还至账户余额,剩余¥{}元已归还至挂账额度。", orderInfo.getOrderNo(), refundAmount, dto.getPaidAmount(), subAmount)); + record.setCreateTime(new Date()); + tbCreditPaymentRecordMapper.insert(record); + tbCreditBuyerService.updateById(creditBuyer); + return true; + } + // 已还款金额大于退款金额,需要把已还款金额退回余额 + creditBuyer.setAccountBalance(NumberUtil.add(creditBuyer.getAccountBalance(), refundAmount)); + // 已还款金额进行冲红 + TbCreditPaymentRecord record = new TbCreditPaymentRecord(); + record.setCreditBuyerId(creditBuyerId); + record.setOrderId(orderId); + record.setRepaymentAmount(NumberUtil.sub(BigDecimal.ZERO, refundAmount)); + record.setPaymentMethod("挂账退款"); + record.setPaymentTime(new Date()); + record.setRemark(StrUtil.format("挂账订单:{}申请退款¥{}元,还款部分¥{}元已归还至账户余额。", orderInfo.getOrderNo(), refundAmount, refundAmount)); + record.setCreateTime(new Date()); + tbCreditPaymentRecordMapper.insert(record); + tbCreditBuyerService.updateById(creditBuyer); + tbCreditBuyerService.updateById(creditBuyer); + return true; + } + return false; + } } diff --git a/eladmin-system/src/main/java/cn/ysk/cashier/pojo/shop/TbShopInfo.java b/eladmin-system/src/main/java/cn/ysk/cashier/pojo/shop/TbShopInfo.java index fcabc2ae..64f57aee 100644 --- a/eladmin-system/src/main/java/cn/ysk/cashier/pojo/shop/TbShopInfo.java +++ b/eladmin-system/src/main/java/cn/ysk/cashier/pojo/shop/TbShopInfo.java @@ -17,6 +17,7 @@ package cn.ysk.cashier.pojo.shop; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.bean.copier.CopyOptions; +import com.baomidou.mybatisplus.annotation.TableField; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -299,6 +300,10 @@ public class TbShopInfo implements Serializable { @ApiModelProperty(value = "台桌预订短信") private String bookingSms; + @Transient + @TableField(exist = false) + private String registerCode; + public void copy(TbShopInfo source){ BeanUtil.copyProperties(source,this, CopyOptions.create().setIgnoreNullValue(true)); } diff --git a/eladmin-system/src/main/java/cn/ysk/cashier/service/impl/shopimpl/TbShopInfoServiceImpl.java b/eladmin-system/src/main/java/cn/ysk/cashier/service/impl/shopimpl/TbShopInfoServiceImpl.java index b6acf46b..82e7e6c9 100644 --- a/eladmin-system/src/main/java/cn/ysk/cashier/service/impl/shopimpl/TbShopInfoServiceImpl.java +++ b/eladmin-system/src/main/java/cn/ysk/cashier/service/impl/shopimpl/TbShopInfoServiceImpl.java @@ -323,6 +323,18 @@ public class TbShopInfoServiceImpl implements TbShopInfoService { ValidationUtil.isNull(tbShopInfo.getId(), "TbShopInfo", "id", resources.getId()); tbShopInfo.copy(resources); tbShopInfo.setUpdatedAt(Instant.now().toEpochMilli()); + if (resources.getRegisterCode() != null) { + TbMerchantRegister tbMerchantRegister = merchantRegisterRepository.findByRegisterCode(resources.getRegisterCode()); + if (tbMerchantRegister == null) { + throw new BadRequestException("激活码有误"); + } + if (tbMerchantRegister.getStatus() == 1) { + throw new BadRequestException("激活码已激活,不能重复绑定"); + } + tbShopInfo.setExpireAt(DateUtil.addMonthsAndGetTimestamp(tbMerchantRegister.getPeriodYear())); + //向redis中存入key + redisUtils.set(CacheKey.ACT_CODE + resources.getAccount(), "1", tbShopInfo.getExpireAt() - Instant.now().toEpochMilli()); + } tbShopInfoRepository.save(tbShopInfo); } diff --git a/eladmin-system/src/main/java/cn/ysk/cashier/service/impl/shopimpl/TbShopTableServiceImpl.java b/eladmin-system/src/main/java/cn/ysk/cashier/service/impl/shopimpl/TbShopTableServiceImpl.java index 2a5506b2..80a8a182 100644 --- a/eladmin-system/src/main/java/cn/ysk/cashier/service/impl/shopimpl/TbShopTableServiceImpl.java +++ b/eladmin-system/src/main/java/cn/ysk/cashier/service/impl/shopimpl/TbShopTableServiceImpl.java @@ -2883,11 +2883,12 @@ public class TbShopTableServiceImpl implements TbShopTableService { .eq(TbOrderDetail::getShopId, returnOrderDTO.getShopId()) .eq(TbOrderDetail::getStatus, "closed") .eq(TbOrderDetail::getOrderId, returnOrderDTO.getOrderId()) + .in(TbOrderDetail::getId, detailIds) .orderByDesc(TbOrderDetail::getUserCouponId)); - if (detailList.size() != returnOrderDTO.getOrderDetails().size()) { + /*if (detailList.size() != returnOrderDTO.getOrderDetails().size()) { throw new BadRequestException("挂账退款必须全退"); - } + }*/ } else { detailList = orderDetailMapper.selectList(new LambdaQueryWrapper() .eq(TbOrderDetail::getShopId, returnOrderDTO.getShopId()) @@ -3122,7 +3123,7 @@ public class TbShopTableServiceImpl implements TbShopTableService { @Override - @Transactional + @Transactional(rollbackFor = Exception.class) public Object returnOrder(ReturnOrderDTO returnOrderDTO) { TbOrderInfo orderInfo = orderInfoMapper.selectOne(new LambdaQueryWrapper() .eq(TbOrderInfo::getId, returnOrderDTO.getOrderId()) @@ -3164,7 +3165,7 @@ public class TbShopTableServiceImpl implements TbShopTableService { mpOrderDetailService.updateStatusByOrderIdAndIds(OrderStatusEnums.REFUNDING, OrderStatusEnums.REFUND, returnOrderDTO.getOrderId(), returnOrderDTO.getOrderDetails().stream().map(ReturnOrderDTO.OrderDetail::getId).collect(Collectors.toList())); } else if (TableConstant.OrderInfo.PayType.CREDIT_BUYER.equalsVals(payType)) { - creditBuyerOrderService.refund(orderInfo.getCreditBuyerId(), Long.valueOf(orderInfo.getId())); + creditBuyerOrderService.partRefund(orderInfo.getCreditBuyerId(), Long.valueOf(orderInfo.getId()), returnAmount); } orderInfo.setStatus(TableConstant.OrderInfo.Status.CLOSED.getValue());