From 3c6a682a64ce8089e000026f9d035eb329aebf47 Mon Sep 17 00:00:00 2001 From: yupeng <roc__yu@163.com> Date: 星期五, 28 二月 2025 16:01:50 +0800 Subject: [PATCH] feat: 完善后台批量发送邮件接口 --- ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TBillController.java | 23 ++++ ruoyi-admin/pom.xml | 10 +- ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TBankFlowController.java | 14 ++ ruoyi-common/src/main/resources/META-INF/spring.factories | 2 ruoyi-system/src/main/java/com/ruoyi/system/dto/CachPayDto.java | 33 ++++++ ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TBankFlowServiceImpl.java | 9 + ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TBillServiceImpl.java | 138 +++++++++++++++++++++------ ruoyi-system/src/main/java/com/ruoyi/system/service/TBillService.java | 7 ruoyi-system/src/main/java/com/ruoyi/system/dto/OfflinePayCheckDto.java | 15 ++ ruoyi-system/src/main/java/com/ruoyi/system/dto/OfflinePayDto.java | 3 ruoyi-system/src/main/java/com/ruoyi/system/dto/TBillDto.java | 5 + 11 files changed, 204 insertions(+), 55 deletions(-) diff --git a/ruoyi-admin/pom.xml b/ruoyi-admin/pom.xml index 97f4520..3fa05b9 100644 --- a/ruoyi-admin/pom.xml +++ b/ruoyi-admin/pom.xml @@ -32,11 +32,11 @@ <version>31.1-jre</version> <!-- 请根据需要选择合适的版本 --> </dependency> <!-- spring-boot-devtools --> - <dependency> - <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-devtools</artifactId> - <optional>true</optional> <!-- 表示依赖不会传递 --> - </dependency> +<!-- <dependency>--> +<!-- <groupId>org.springframework.boot</groupId>--> +<!-- <artifactId>spring-boot-devtools</artifactId>--> +<!-- <optional>true</optional> <!– 表示依赖不会传递 –>--> +<!-- </dependency>--> <!-- swagger3--> <dependency> diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TBankFlowController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TBankFlowController.java index e6849a9..1419bca 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TBankFlowController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TBankFlowController.java @@ -6,6 +6,7 @@ import com.alibaba.excel.event.AnalysisEventListener; import com.ruoyi.common.basic.PageInfo; import com.ruoyi.common.core.domain.R; +import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.WebUtils; import com.ruoyi.system.importExcel.TBankFlowImportExcel; import com.ruoyi.system.model.TBankFlow; @@ -15,10 +16,7 @@ import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletResponse; @@ -113,6 +111,14 @@ System.err.println("银行流水返回结果导出失败"); } } + + @GetMapping("getByBankSerialNumber") + public R<List<TBankFlow>> searchByBankSerialNumber(@RequestParam String bankSerialNumber){ + List<TBankFlow> tBankFlows = flowService.searchByBankSerialNumber(bankSerialNumber); + return R.ok(tBankFlows); + } + + } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TBillController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TBillController.java index 18e6005..dc7b6bf 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TBillController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TBillController.java @@ -4,10 +4,13 @@ import com.ruoyi.common.basic.PageInfo; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.exception.ServiceException; +import com.ruoyi.common.utils.StringUtils; import com.ruoyi.system.dto.*; import com.ruoyi.system.model.TBill; +import com.ruoyi.system.model.TBillConfirm; import com.ruoyi.system.model.TBillDetail; import com.ruoyi.system.query.TBillQuery; +import com.ruoyi.system.service.TBillConfirmService; import com.ruoyi.system.service.TBillDetailService; import com.ruoyi.system.service.TBillService; import io.swagger.annotations.Api; @@ -39,6 +42,8 @@ @Autowired TBillDetailService tBillDetailService; + @Autowired + TBillConfirmService tBillConfirmService; @PreAuthorize("@ss.hasPermi('system:bill:list')") @PostMapping("list") @@ -58,7 +63,10 @@ @ApiOperation("通过ID查找详情") @GetMapping("getDetailById") - public R<TBillDto> getDetailById(@Validated @NotEmpty String id){ + public R<TBillDto> getDetailById(@RequestParam String id){ + if (StringUtils.isEmpty(id)){ + return R.fail(); + } TBillDto dto = tBillService.getDetailByBillId(id); if (dto.getBillType().equals("3")){ List<TBillDetail> details = tBillDetailService.getByBillId(id); @@ -66,6 +74,10 @@ if (detail.getLiveType()==1)dto.setWater(detail); //水费 else dto.setElect(detail); //电费 } + } + if (StringUtils.isNotEmpty(dto.getConfirmId())){ + TBillConfirm confirm = tBillConfirmService.getById(dto.getConfirmId()); + dto.setConfirm(confirm); } return R.ok(dto); } @@ -96,11 +108,14 @@ return R.ok(failNum); } + + + @PreAuthorize("@ss.hasPermi('system:bill:cashPay')") @ApiOperation("收款") @PostMapping("cashPay") - public R cashPay(@RequestBody OfflinePayDto offlinePayDto){ - + public R cashPay(@RequestBody CachPayDto cachPayDto){ + tBillService.cashPay(cachPayDto); return null; } @@ -108,5 +123,7 @@ + + } diff --git a/ruoyi-common/src/main/resources/META-INF/spring.factories b/ruoyi-common/src/main/resources/META-INF/spring.factories new file mode 100644 index 0000000..dc976e7 --- /dev/null +++ b/ruoyi-common/src/main/resources/META-INF/spring.factories @@ -0,0 +1,2 @@ +org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ +com.ruoyi.common.config.SmsConfig diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/dto/CachPayDto.java b/ruoyi-system/src/main/java/com/ruoyi/system/dto/CachPayDto.java new file mode 100644 index 0000000..fbc237e --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/dto/CachPayDto.java @@ -0,0 +1,33 @@ +package com.ruoyi.system.dto; + +import com.ruoyi.system.model.TBankFlow; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * 收款对象 + */ +@Data +public class CachPayDto implements Serializable { + + @ApiModelProperty(value = "支付类型:1.银行、2.现金") + private Integer payType; + + @ApiModelProperty(value = "账单ID") + private String billId; + + @ApiModelProperty(value = "金额") + private BigDecimal amount; + + @ApiModelProperty(value = "付款人姓名") + private String payer; + + @ApiModelProperty(value = "银行支付的付款凭证") + private String voucher; + + @ApiModelProperty("银行支付的银行流水") + private TBankFlow tBankFlow; +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/dto/OfflinePayCheckDto.java b/ruoyi-system/src/main/java/com/ruoyi/system/dto/OfflinePayCheckDto.java index 8e088b9..97d1159 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/dto/OfflinePayCheckDto.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/dto/OfflinePayCheckDto.java @@ -1,6 +1,7 @@ package com.ruoyi.system.dto; import com.fasterxml.jackson.annotation.JsonFormat; +import com.ruoyi.system.model.TBankFlow; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -19,6 +20,11 @@ @ApiModelProperty("账单ID列表,管理员处理后的") @NotEmpty(message = "账单列表不能为空") private List<String> billIds; + + @ApiModelProperty(value = "账单ID") + @NotEmpty(message = "账单ID不能为空") + private String billId; + @ApiModelProperty("实际支付金额") @NotNull(message = "实际支付金额不能为空") private BigDecimal amount; @@ -27,14 +33,15 @@ @NotNull(message = "确认单ID不能为空") private String confirmId; - @ApiModelProperty("银行流水号,用于生成流水") - @NotEmpty(message = "银行流水号不能为空") - private String bankSerilNum; - @ApiModelProperty("支付人") private String payer; @ApiModelProperty("支付时间") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private LocalDateTime payTime; + @ApiModelProperty("支付凭证") + private String voucher; + + @ApiModelProperty("银行流水") + private TBankFlow tBankFlow; } diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/dto/OfflinePayDto.java b/ruoyi-system/src/main/java/com/ruoyi/system/dto/OfflinePayDto.java index fdaf862..9af180e 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/dto/OfflinePayDto.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/dto/OfflinePayDto.java @@ -27,6 +27,7 @@ @ApiModelProperty(value = "账单列表") @NotEmpty(message = "账单ID不能为空") private List<String> billIds; + /** * 凭证文件ID */ @@ -39,4 +40,6 @@ private Date payTime; + + } diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/dto/TBillDto.java b/ruoyi-system/src/main/java/com/ruoyi/system/dto/TBillDto.java index 6619889..1babbce 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/dto/TBillDto.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/dto/TBillDto.java @@ -1,6 +1,7 @@ package com.ruoyi.system.dto; import com.ruoyi.system.model.TBill; +import com.ruoyi.system.model.TBillConfirm; import com.ruoyi.system.model.TBillDetail; import lombok.Data; @@ -40,5 +41,9 @@ * 电费 */ private TBillDetail elect; + /** + * 线下打款确认单 + */ + private TBillConfirm confirm; } diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/TBillService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/TBillService.java index 1a08a95..f25fc38 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/TBillService.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/TBillService.java @@ -2,10 +2,7 @@ import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.common.basic.PageInfo; -import com.ruoyi.system.dto.OfflinePayCheckDto; -import com.ruoyi.system.dto.SmsByBillDto; -import com.ruoyi.system.dto.TBillDto; -import com.ruoyi.system.dto.TbillSaveDto; +import com.ruoyi.system.dto.*; import com.ruoyi.system.model.TBill; import com.ruoyi.system.query.TBillQuery; import com.taxi591.bankapi.dto.ChargeBillRequest; @@ -84,4 +81,6 @@ Integer sendMailBatchByBillIds(SmsByBillDto dto); TBillDto getDetailByBillId(@NotEmpty String id); + + Boolean cashPay(CachPayDto offlinePayDto); } diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TBankFlowServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TBankFlowServiceImpl.java index fc5e23e..cff875a 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TBankFlowServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TBankFlowServiceImpl.java @@ -9,6 +9,7 @@ import com.ruoyi.system.importExcel.TBankFlowImportExcel; import com.ruoyi.system.mapper.TBankFlowMapper; import com.ruoyi.system.model.TBankFlow; +import com.ruoyi.system.model.TBill; import com.ruoyi.system.model.TFlowManagement; import com.ruoyi.system.query.TBankFlowQuery; import com.ruoyi.system.query.TFlowManagementQuery; @@ -74,8 +75,12 @@ @Override public List<TBankFlow> searchByBankSerialNumber(String bankSerialNumber) { LambdaQueryWrapper<TBankFlow> queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.like(StringUtils.isNotEmpty(bankSerialNumber),TBankFlow::getBankSerialNumber,bankSerialNumber); - return this.baseMapper.selectList(queryWrapper); + queryWrapper.like(StringUtils.isNotEmpty(bankSerialNumber),TBankFlow::getBankSerialNumber,bankSerialNumber) + .orderByDesc(TBankFlow::getPayTime); + + PageInfo<TBankFlow> pageInfo = new PageInfo<>(1, 20); + pageInfo = this.baseMapper.selectPage(pageInfo, queryWrapper); + return pageInfo.getRecords(); } @Override diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TBillServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TBillServiceImpl.java index 2d13e31..6da60f4 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TBillServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TBillServiceImpl.java @@ -11,10 +11,7 @@ import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.TencentMailUtil; import com.ruoyi.common.utils.uuid.UUID; -import com.ruoyi.system.dto.OfflinePayCheckDto; -import com.ruoyi.system.dto.SmsByBillDto; -import com.ruoyi.system.dto.TBillDto; -import com.ruoyi.system.dto.TbillSaveDto; +import com.ruoyi.system.dto.*; import com.ruoyi.system.mapper.TBillMapper; import com.ruoyi.system.model.*; import com.ruoyi.system.query.TBillQuery; @@ -242,32 +239,50 @@ } @Override + @Transactional(rollbackFor = Exception.class) public boolean checkOfflinePay(OfflinePayCheckDto dto) { - List<TBill> tBills = listByIds(dto.getBillIds()); - TBillConfirm confirm = tBillConfirmService.getById(dto.getConfirmId()); - lockAndUpdateByAmountBatch(tBills,dto.getAmount(),(bill)->{ - TFlowManagement save = new TFlowManagement(); - save.setPayType(3); - save.setPayer(dto.getPayer()); - save.setPayTime(dto.getPayTime()==null?DateUtils.dateToLocalDateTime(confirm.getPayTime()):dto.getPayTime()); - save.setBankSerialNumber(dto.getBankSerilNum()); - save.setFlowType(2); - save.setPaymentBillId(bill.getId()); - save.setDeductionMoney(bill.getDeductionMoney()); - save.setFlowMoney(dto.getAmount()); - save.setRemainingMoney(bill.getOutstandingMoney()); - save.setPreOutstand(bill.getPreOutstand()); - tFlowManagementService.save(save); - }); - TBankFlow bankFlow = new TBankFlow(); - bankFlow.setPayType(3); - bankFlow.setPayer(dto.getPayer()); - bankFlow.setPayTime(dto.getPayTime()==null?DateUtils.dateToLocalDateTime(confirm.getPayTime()):dto.getPayTime()); - bankFlow.setBankSerialNumber(dto.getBankSerilNum()); - bankFlow.setFlowMoney(dto.getAmount()); - bankFlow.setFlowStatus(1); - tBankFlowService.save(bankFlow); - return false; + TBankFlow bankflow = tBankFlowService.getById(dto.getTBankFlow().getId()); + TBillDto bill = getDetailByBillId(dto.getBillId()); + if (bankflow.getRemainingMoney().compareTo(BigDecimal.ZERO)<=0){ + throw new ServiceException("该流水已无可抵扣剩余金额"); + } + if (bankflow.getRemainingMoney().compareTo(dto.getAmount())<0){ + throw new ServiceException("实付金额不能高于于流水可抵扣剩余金额"); + } + //如果实付金额大于欠费金额 + if (dto.getAmount().compareTo(bill.getOutstandingMoney())>=0){ + throw new ServiceException("实付金额不能高于该账单欠费金额"); + } + + TBill billSave = new TBill(); + billSave.setId(bill.getId()); + billSave.setPayFeesMoney(dto.getAmount()); + billSave.setBankSerialNumber(dto.getTBankFlow().getBankSerialNumber()); + billSave.setPayFeesTime(dto.getTBankFlow().getPayTime()); + billSave.setVoucher(dto.getVoucher()); + billSave.setPayFeesType(2); + TBill back = lockAndUpdateInfo(billSave, 2); + + //更新银行流水的已抵扣金额和剩余可抵扣金额 + TBankFlow saveBankFlow = new TBankFlow(); + saveBankFlow.setId(bankflow.getId()); + saveBankFlow.setDeductionMoney(bankflow.getDeductionMoney().add(dto.getAmount())); + saveBankFlow.setRemainingMoney(bankflow.getRemainingMoney().subtract(dto.getAmount())); + tBankFlowService.updateById(saveBankFlow); + //存流水 + TFlowManagement save = new TFlowManagement(); + save.setPayType(3); + save.setPayer(dto.getPayer()); + save.setPayTime(dto.getTBankFlow().getPayTime()); + save.setBankSerialNumber(dto.getTBankFlow().getBankSerialNumber()); + save.setFlowType(2); + save.setPaymentBillId(back.getId()); + save.setDeductionMoney(back.getDeductionMoney()); + save.setFlowMoney(dto.getAmount()); + save.setRemainingMoney(back.getOutstandingMoney()); + save.setPreOutstand(back.getPreOutstand()); + tFlowManagementService.save(save); + return true; } @Override @@ -376,7 +391,7 @@ TBill save = new TBill(); save.setId(bill.getId()); try { - smsUtil.sendSms(bill.getPhone(), "", new String[]{""}); + smsUtil.sendSms(bill.getPhone(), "2365726", new String[]{bill.getPartyTwoName()}); save.setSmsStatus(1); }catch (ServiceException e){ failNum++; @@ -394,9 +409,9 @@ int failNum = 0; for (String billId : dto.getBillIds()) { TBillDto bill = getDetailByBillId(billId); - if (bill.getSmsLastTime()!=null - && (System.currentTimeMillis()-bill.getSmsLastTime().getTime()<mailUtil.getPro().getBillMailDelayPeriod()*60*1000L)){ - throw new ServiceException("有账单最近一次发送的时间是:"+DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS,bill.getSmsLastTime())); + if (bill.getMailLastTime()!=null + && (System.currentTimeMillis()-bill.getMailLastTime().getTime()<mailUtil.getPro().getBillMailDelayPeriod()*60*1000L)){ + throw new ServiceException("有账单最近一次发送的时间是:"+DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS,bill.getMailLastTime())); } if (StringUtils.isEmpty(bill.getEmail())){ failNum++; @@ -422,5 +437,62 @@ return getBaseMapper().selectDetailByBillId(billId); } + /** + * 收款、类型可能是现金、银行 + * @param dto + * @return + */ + @Transactional(rollbackFor = Exception.class) + @Override + public Boolean cashPay(CachPayDto dto) { + TBill back = null; + TBankFlow bankflow = null; + if (dto.getPayType()==1){ + bankflow = tBankFlowService.getById(dto.getTBankFlow().getId()); + TBillDto bill = getDetailByBillId(dto.getBillId()); + if (bankflow.getRemainingMoney().compareTo(BigDecimal.ZERO)<=0){ + throw new ServiceException("该流水已无可抵扣剩余金额"); + } + if (bankflow.getRemainingMoney().compareTo(dto.getAmount())<0){ + throw new ServiceException("实付金额不能高于于流水可抵扣剩余金额"); + } + //如果实付金额大于欠费金额 + if (dto.getAmount().compareTo(bill.getOutstandingMoney())>=0){ + throw new ServiceException("实付金额不能高于该账单欠费金额"); + } + } + TBillDto bill = getDetailByBillId(dto.getBillId()); + TBill billSave = new TBill(); + billSave.setId(bill.getId()); + billSave.setPayFeesMoney(dto.getAmount()); + billSave.setBankSerialNumber(dto.getTBankFlow().getBankSerialNumber()); + billSave.setPayFeesTime(dto.getTBankFlow().getPayTime()); + billSave.setVoucher(dto.getVoucher()); + billSave.setPayFeesType(2); + back = lockAndUpdateInfo(billSave, 2); + if (dto.getPayType()==1){ + //更新银行流水的已抵扣金额和剩余可抵扣金额 + TBankFlow saveBankFlow = new TBankFlow(); + saveBankFlow.setId(bankflow.getId()); + saveBankFlow.setDeductionMoney(bankflow.getDeductionMoney().add(dto.getAmount())); + saveBankFlow.setRemainingMoney(bankflow.getRemainingMoney().subtract(dto.getAmount())); + tBankFlowService.updateById(saveBankFlow); + } + //存流水 + TFlowManagement save = new TFlowManagement(); + save.setPayType(3); + save.setPayer(dto.getPayer()); + save.setPayTime(dto.getTBankFlow().getPayTime()); + save.setBankSerialNumber(dto.getTBankFlow().getBankSerialNumber()); + save.setFlowType(dto.getPayType()==1?2:1); + save.setPaymentBillId(back.getId()); + save.setDeductionMoney(back.getDeductionMoney()); + save.setFlowMoney(dto.getAmount()); + save.setRemainingMoney(back.getOutstandingMoney()); + save.setPreOutstand(back.getPreOutstand()); + tFlowManagementService.save(save); + return true; + } + } -- Gitblit v1.7.1