package com.ruoyi.system.service.impl;
|
|
import com.alibaba.fastjson2.JSONObject;
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
import com.ruoyi.common.constant.AmountConstant;
|
import com.ruoyi.common.exception.ServiceException;
|
import com.ruoyi.common.utils.OrderNos;
|
import com.ruoyi.system.dto.MakeOrderDto;
|
import com.ruoyi.system.dto.MakeOrderResp;
|
import com.ruoyi.system.mapper.TPayOrderMapper;
|
import com.ruoyi.system.model.TBill;
|
import com.ruoyi.system.model.TOrderBill;
|
import com.ruoyi.system.model.TPayOrder;
|
import com.ruoyi.system.model.TTenant;
|
import com.ruoyi.system.service.TBillService;
|
import com.ruoyi.system.service.TOrderBillService;
|
import com.ruoyi.system.service.TPayOrderService;
|
import com.ruoyi.system.service.TTenantService;
|
import com.taxi591.bankapi.BankProperties;
|
import org.apache.poi.ss.formula.functions.T;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.stereotype.Service;
|
|
import java.math.BigDecimal;
|
import java.math.RoundingMode;
|
import java.net.URLEncoder;
|
import java.util.ArrayList;
|
import java.util.List;
|
import java.util.stream.Collectors;
|
|
/**
|
* <p>
|
* 支付订单表 服务实现类
|
* </p>
|
*
|
* @author xiaochen
|
* @since 2025-02-07
|
*/
|
@Service
|
public class TPayOrderServiceImpl extends ServiceImpl<TPayOrderMapper, TPayOrder> implements TPayOrderService {
|
|
@Autowired
|
TBillService billService;
|
|
@Autowired
|
TTenantService tTenantService;
|
|
@Autowired
|
TOrderBillService tOrderBillService;
|
|
|
public long caculateRentFee(TBill bill){
|
return bill.getOutstandingMoney()
|
.longValue();
|
}
|
|
|
public String createAppletUrl(String orderNo){
|
JSONObject param = new JSONObject();
|
param.put("input1",orderNo);
|
StringBuffer sb = new StringBuffer();
|
sb.append(BankProperties.H5_BANK_URL)
|
.append("?code=").append("JF-EPAY2025030510983")
|
.append("&userInput=")
|
.append(URLEncoder.encode(param.toJSONString()))
|
.append("&showBill=0");
|
return sb.toString();
|
}
|
|
@Override
|
public MakeOrderResp makeOrder(MakeOrderDto dto) {
|
|
TTenant user = tTenantService.getById(dto.getUserId());
|
if (user==null){
|
throw new ServiceException("租户不存在");
|
}
|
MakeOrderResp resp = new MakeOrderResp();
|
if (dto.getBillIds().size()==1){
|
TBill bill = billService.getById(dto.getBillIds().get(0));
|
if (bill == null) {
|
throw new ServiceException("账单不存在");
|
}
|
//欠费金额转成单位分比较
|
long rent = bill.getOutstandingMoney().multiply(AmountConstant.b100)
|
.setScale(2,RoundingMode.HALF_DOWN).longValue();
|
if (rent==0){
|
throw new ServiceException("该账单已缴费");
|
}
|
if (rent<dto.getAmount()){
|
throw new ServiceException("支付金额超过了账单欠费金额");
|
}
|
|
TPayOrder order = new TPayOrder();
|
order.setId(OrderNos.getDid(32));
|
order.setAmount(dto.getAmount());
|
order.setUserId(user.getId());
|
order.setPhone(user.getPhone());
|
order.setOpenId(dto.getOpenId());
|
order.setUserName(user.getResidentName());
|
save(order);
|
TOrderBill tOrderBill = new TOrderBill();
|
tOrderBill.setBillId(bill.getId());
|
tOrderBill.setOrderNo(order.getId());
|
tOrderBillService.save(tOrderBill);
|
resp.setAmount(dto.getAmount());
|
resp.setOrderNo(order.getId());
|
resp.setAppletUrl(createAppletUrl(order.getId()));
|
return resp;
|
}
|
List<TOrderBill> orderBills = new ArrayList<>();
|
String orderNo = OrderNos.getDid(32);
|
List<TBill> bills = dto.getBillIds().stream().map(id -> {
|
TBill bill = billService.getById(id);
|
if (bill == null) {
|
throw new ServiceException("billId:" + id + "不存在");
|
}
|
orderBills.add(new TOrderBill(orderNo,bill.getId()));
|
return bill;
|
}).collect(Collectors.toList());
|
//欠费金额转成单位分比较
|
long sumRent = bills.stream().mapToLong((bill)
|
-> bill.getOutstandingMoney().multiply(AmountConstant.b100)
|
.setScale(2,RoundingMode.HALF_DOWN).longValue())
|
.sum();
|
if (sumRent==0){
|
throw new ServiceException("账单已缴费");
|
}
|
if (dto.getAmount()>sumRent){
|
throw new ServiceException("支付金额超过所选账单欠费金额");
|
}
|
TPayOrder order = new TPayOrder();
|
order.setId(orderNo);
|
order.setAmount(dto.getAmount());
|
order.setUserId(user.getId());
|
order.setPhone(user.getPhone());
|
order.setOpenId(dto.getOpenId());
|
order.setUserName(user.getResidentName());
|
save(order);
|
tOrderBillService.saveBatch(orderBills);
|
resp.setAmount(dto.getAmount());
|
resp.setOrderNo(orderNo);
|
resp.setAppletUrl(createAppletUrl(orderNo));
|
return resp;
|
}
|
}
|