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..544b916b 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 @@ -46,6 +46,8 @@ 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("挂账订单不存在"); + } + // 已还款金额进行红冲 + 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)); + record.setCreateTime(new Date()); + tbCreditPaymentRecordMapper.insert(record); + dto = baseMapper.getOne(params); + BigDecimal sub = NumberUtil.sub(refundAmount, dto.getUnpaidAmount()); + if (NumberUtil.isGreater(sub, BigDecimal.ZERO)) { + TbCreditPaymentRecord flow = new TbCreditPaymentRecord(); + flow.setCreditBuyerId(creditBuyerId); + flow.setOrderId(orderId); + flow.setRepaymentAmount(NumberUtil.sub(BigDecimal.ZERO, sub)); + flow.setPaymentMethod("挂账退款"); + flow.setPaymentTime(new Date()); + flow.setRemark(StrUtil.format("挂账订单:{},申请退款¥{}元,由于此挂账订单已提前还款,溢出部分¥{}元将转储至账户余额。", orderInfo.getOrderNo(), refundAmount, sub)); + flow.setCreateTime(new Date()); + tbCreditPaymentRecordMapper.insert(flow); + tbCreditBuyerOrderMapper.update(Wrappers.lambdaUpdate() + .eq(TbCreditBuyerOrder::getId, dto.getId()) + .set(TbCreditBuyerOrder::getPaidAmount, NumberUtil.sub(dto.getPaidAmount(), sub)) + ); + // 退回余额 + creditBuyer.setAccountBalance(NumberUtil.add(creditBuyer.getAccountBalance(), sub)); + tbCreditBuyerService.updateById(creditBuyer); + } + return true; + } } 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 85eac4a1..787b45ed 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 @@ -2891,11 +2891,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()) @@ -3130,7 +3131,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()) @@ -3172,7 +3173,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());