余额额度流水加导出

This commit is contained in:
luojiaquan
2026-09-21 17:35:20 +08:00
parent bbb312f49b
commit 8c650e7ef2
12 changed files with 743 additions and 47 deletions
@@ -2,6 +2,8 @@ package com.ruoyi.web.controller.customer.customermoney;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.GetMapping;
@@ -17,6 +19,7 @@ import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.customer.customermoney.api.ICustomerAccountApi;
import com.ruoyi.customer.customermoney.domain.CustomerBalanceFlow;
import com.ruoyi.customer.customermoney.domain.CustomerCreditApply;
@@ -25,6 +28,9 @@ import com.ruoyi.customer.customermoney.domain.CustomerReceipt;
import com.ruoyi.customer.customermoney.service.ICreditQuotaService;
import com.ruoyi.customer.customermoney.service.ICustomerMoneyService;
import com.ruoyi.customer.customermoney.vo.CustomerAccountStatusVO;
import com.ruoyi.customer.customermoney.vo.CustomerBalanceFlowExportVO;
import com.ruoyi.customer.customermoney.vo.CustomerCreditFlowExportVO;
import com.ruoyi.customer.customermoney.vo.CustomerReceiptExportVO;
import com.ruoyi.common.utils.SecurityUtils;
/**
@@ -89,6 +95,24 @@ public class CustomerMoneyController extends BaseController
List<CustomerReceipt> list = customerMoneyService.selectReceiptList(query);
return getDataTable(list);
}
/**
* 导出收款记录(按当前筛选条件,全量导出不分页)
*/
@PreAuthorize("@ss.hasPermi('customersupplier:customerinfo:export')")
@Log(title = "客户收款记录", businessType = BusinessType.EXPORT)
@PostMapping("/receipt/export")
public void receiptExport(HttpServletResponse response, CustomerReceipt query)
{
List<CustomerReceiptExportVO> list = Collections.emptyList();
if (query != null && query.getCustomerId() != null && query.getCustomerId() != 0L)
{
list = customerMoneyService.selectReceiptList(query).stream()
.map(CustomerReceiptExportVO::from).collect(Collectors.toList());
}
ExcelUtil<CustomerReceiptExportVO> util = new ExcelUtil<>(CustomerReceiptExportVO.class);
util.exportExcel(response, list, "收款记录");
}
/**
* 获取收款单详情(含收款附件)
*/
@@ -149,6 +173,24 @@ public class CustomerMoneyController extends BaseController
return getDataTable(list);
}
/**
* 导出余额流水(按当前筛选条件,全量导出不分页)
*/
@PreAuthorize("@ss.hasPermi('customersupplier:customerinfo:export')")
@Log(title = "客户余额流水", businessType = BusinessType.EXPORT)
@PostMapping("/flow/export")
public void flowExport(HttpServletResponse response, CustomerBalanceFlow query)
{
List<CustomerBalanceFlowExportVO> list = Collections.emptyList();
if (query != null && query.getCustomerId() != null && query.getCustomerId() != 0L)
{
list = customerMoneyService.selectFlowList(query).stream()
.map(CustomerBalanceFlowExportVO::from).collect(Collectors.toList());
}
ExcelUtil<CustomerBalanceFlowExportVO> util = new ExcelUtil<>(CustomerBalanceFlowExportVO.class);
util.exportExcel(response, list, "余额流水");
}
/**
* 查询额度流水列表
*/
@@ -164,6 +206,24 @@ public class CustomerMoneyController extends BaseController
return getDataTable(list);
}
/**
* 导出额度流水(按当前筛选条件,全量导出不分页)
*/
@PreAuthorize("@ss.hasPermi('customersupplier:customerinfo:export')")
@Log(title = "客户额度流水", businessType = BusinessType.EXPORT)
@PostMapping("/credit/flow/export")
public void creditFlowExport(HttpServletResponse response, CustomerCreditFlow query)
{
List<CustomerCreditFlowExportVO> list = Collections.emptyList();
if (query != null && query.getCustomerId() != null && query.getCustomerId() != 0L)
{
list = customerMoneyService.selectCreditFlowList(query).stream()
.map(CustomerCreditFlowExportVO::from).collect(Collectors.toList());
}
ExcelUtil<CustomerCreditFlowExportVO> util = new ExcelUtil<>(CustomerCreditFlowExportVO.class);
util.exportExcel(response, list, "额度流水");
}
/**
* 提交额度调整申请(信用额度/临时额度),申请待审批通过后才真正调整额度
*/
@@ -0,0 +1,91 @@
package com.ruoyi.customer.customermoney.vo;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
import com.ruoyi.common.annotation.Excel;
import com.ruoyi.customer.customermoney.domain.CustomerBalanceFlow;
import lombok.Data;
/**
* 客户余额流水导出 VO(列与页面余额流水 tab 对齐,枚举导出为中文文案)
*
* @author ruoyi
* @date 2026-09-21
*/
@Data
public class CustomerBalanceFlowExportVO implements Serializable
{
private static final long serialVersionUID = 1L;
@Excel(name = "流水号", width = 22)
private String flowNo;
@Excel(name = "时间", width = 20, dateFormat = "yyyy-MM-dd HH:mm:ss")
private Date createTime;
@Excel(name = "业务类型", width = 12)
private String bizTypeLabel;
@Excel(name = "收支", width = 8)
private String directionLabel;
@Excel(name = "原币金额", width = 16)
private String amountText;
@Excel(name = "汇率", width = 12)
private String exchangeRate;
@Excel(name = "本位币变动(CNY)", width = 18)
private BigDecimal baseChangeAmount;
@Excel(name = "变动前余额", width = 14)
private BigDecimal beforeBalance;
@Excel(name = "变动后余额", width = 14)
private BigDecimal afterBalance;
@Excel(name = "关联单号", width = 22)
private String bizNo;
@Excel(name = "操作人", width = 12)
private String createBy;
@Excel(name = "备注", width = 30)
private String remark;
public static CustomerBalanceFlowExportVO from(CustomerBalanceFlow f)
{
CustomerBalanceFlowExportVO vo = new CustomerBalanceFlowExportVO();
vo.setFlowNo(f.getFlowNo());
vo.setCreateTime(f.getCreateTime());
vo.setBizTypeLabel(bizTypeLabel(f.getBizType()));
boolean income = f.getDirection() != null && f.getDirection() == 1;
vo.setDirectionLabel(income ? "收入" : "支出");
String amt = f.getAmount() == null ? "" : f.getAmount().stripTrailingZeros().toPlainString();
vo.setAmountText((f.getCurrency() == null ? "" : f.getCurrency() + " ") + amt);
vo.setExchangeRate(f.getExchangeRate() == null ? null : f.getExchangeRate().stripTrailingZeros().toPlainString());
BigDecimal base = f.getBaseAmount() != null ? f.getBaseAmount() : f.getAmount();
// 支出导出为负数(配合“收支”列阅读,同时保持 Excel 数值类型)
vo.setBaseChangeAmount(base == null ? null : (income ? base : base.negate()));
vo.setBeforeBalance(f.getBeforeBalance());
vo.setAfterBalance(f.getAfterBalance());
vo.setBizNo(f.getBizNo());
vo.setCreateBy(f.getCreateBy());
vo.setRemark(f.getRemark());
return vo;
}
private static String bizTypeLabel(String v)
{
if ("RECEIPT".equals(v)) return "收款";
if ("AR_BILL".equals(v)) return "应收账单";
if ("BILL_PAY".equals(v)) return "账单核销";
if ("ORDER".equals(v)) return "计费订单";
if ("REFUND".equals(v)) return "退款";
if ("ADJUST".equals(v)) return "手工调整";
if ("FREEZE".equals(v)) return "冻结";
if ("UNFREEZE".equals(v)) return "解冻";
return v;
}
}
@@ -0,0 +1,117 @@
package com.ruoyi.customer.customermoney.vo;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
import com.ruoyi.common.annotation.Excel;
import com.ruoyi.customer.customermoney.domain.CustomerCreditFlow;
import lombok.Data;
/**
* 客户额度流水导出 VO(列与页面额度流水 tab 对齐,枚举导出为中文文案)
*
* @author ruoyi
* @date 2026-09-21
*/
@Data
public class CustomerCreditFlowExportVO implements Serializable
{
private static final long serialVersionUID = 1L;
@Excel(name = "流水号", width = 22)
private String flowNo;
@Excel(name = "时间", width = 20, dateFormat = "yyyy-MM-dd HH:mm:ss")
private Date createTime;
@Excel(name = "业务单号", width = 22)
private String bizNo;
@Excel(name = "变动类型", width = 12)
private String changeTypeLabel;
@Excel(name = "变动维度", width = 18)
private String dimensionLabel;
@Excel(name = "调整方式", width = 10)
private String adjustModeLabel;
@Excel(name = "方向", width = 8)
private String directionLabel;
@Excel(name = "变动前", width = 12)
private BigDecimal beforeAmount;
@Excel(name = "变动额", width = 12)
private BigDecimal changeAmount;
@Excel(name = "变动后", width = 12)
private BigDecimal afterAmount;
@Excel(name = "已用额度快照", width = 14)
private BigDecimal usedCredit;
@Excel(name = "生效日期", width = 12, dateFormat = "yyyy-MM-dd")
private Date effectiveDate;
@Excel(name = "失效日期", width = 12)
private String expireDateText;
@Excel(name = "调整原因", width = 30)
private String reason;
@Excel(name = "操作人", width = 12)
private String createBy;
@Excel(name = "备注", width = 30)
private String remark;
public static CustomerCreditFlowExportVO from(CustomerCreditFlow f)
{
CustomerCreditFlowExportVO vo = new CustomerCreditFlowExportVO();
vo.setFlowNo(f.getFlowNo());
vo.setCreateTime(f.getCreateTime());
vo.setBizNo(f.getBizNo());
vo.setChangeTypeLabel(changeTypeLabel(f.getChangeType()));
boolean usageFlow = "OCCUPY".equals(f.getChangeType()) || "RELEASE".equals(f.getChangeType());
vo.setDimensionLabel(usageFlow ? "授信占用(已用额度)" : "授信额度");
vo.setAdjustModeLabel(adjustModeLabel(f.getAdjustMode()));
Integer dir = f.getDirection();
vo.setDirectionLabel(dir == null ? "-" : (dir == 1 ? "增加" : "减少"));
vo.setBeforeAmount(f.getBeforeAmount());
// 减少导出为负数(配合“方向”列阅读,同时保持 Excel 数值类型)
BigDecimal change = f.getChangeAmount();
if (change != null && dir != null && dir == -1)
{
change = change.negate();
}
vo.setChangeAmount(change);
vo.setAfterAmount(f.getAfterAmount());
// 占用/释放流水的已用额度快照在页面上不展示
vo.setUsedCredit(usageFlow ? null : f.getUsedCredit());
vo.setEffectiveDate(f.getEffectiveDate());
vo.setExpireDateText(f.getExpireDate() == null ? "长期" : new java.text.SimpleDateFormat("yyyy-MM-dd").format(f.getExpireDate()));
vo.setReason(f.getReason());
vo.setCreateBy(f.getCreateBy());
vo.setRemark(f.getRemark());
return vo;
}
private static String changeTypeLabel(String v)
{
if ("INIT".equals(v)) return "初始化";
if ("ADJUST".equals(v)) return "手工调整";
if ("EXPIRE".equals(v)) return "到期失效";
if ("OCCUPY".equals(v)) return "授信占用";
if ("RELEASE".equals(v)) return "授信释放";
return v;
}
private static String adjustModeLabel(String v)
{
if ("SET".equals(v)) return "设置为";
if ("ADD".equals(v)) return "增加";
if ("SUB".equals(v)) return "减少";
return v;
}
}
@@ -0,0 +1,116 @@
package com.ruoyi.customer.customermoney.vo;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
import com.ruoyi.common.annotation.Excel;
import com.ruoyi.customer.customermoney.domain.CustomerReceipt;
import lombok.Data;
/**
* 客户收款记录导出 VO(列与页面收款记录 tab 对齐,枚举导出为中文文案)
*
* @author ruoyi
* @date 2026-09-21
*/
@Data
public class CustomerReceiptExportVO implements Serializable
{
private static final long serialVersionUID = 1L;
@Excel(name = "收款单号", width = 22)
private String receiptNo;
@Excel(name = "收款日期", width = 20, dateFormat = "yyyy-MM-dd HH:mm:ss")
private Date receivedAt;
@Excel(name = "收款类型", width = 12)
private String receiptTypeLabel;
@Excel(name = "币种", width = 8)
private String currency;
@Excel(name = "原币金额", width = 14)
private BigDecimal amount;
@Excel(name = "汇率", width = 12)
private String exchangeRate;
@Excel(name = "汇率来源", width = 10)
private String rateSourceLabel;
@Excel(name = "本位币金额(CNY)", width = 16)
private BigDecimal baseAmount;
@Excel(name = "收款方式", width = 12)
private String payMethodLabel;
@Excel(name = "客户银行账号", width = 24)
private String bankAccountNo;
@Excel(name = "银行/平台流水号", width = 22)
private String bankTransactionNo;
@Excel(name = "状态", width = 10)
private String statusLabel;
@Excel(name = "登记人", width = 12)
private String createBy;
@Excel(name = "备注", width = 30)
private String remark;
public static CustomerReceiptExportVO from(CustomerReceipt r)
{
CustomerReceiptExportVO vo = new CustomerReceiptExportVO();
vo.setReceiptNo(r.getReceiptNo());
vo.setReceivedAt(r.getReceivedAt());
vo.setReceiptTypeLabel(receiptTypeLabel(r.getReceiptType()));
vo.setCurrency(r.getCurrency());
vo.setAmount(r.getAmount());
vo.setExchangeRate(r.getExchangeRate() == null ? null : r.getExchangeRate().stripTrailingZeros().toPlainString());
vo.setRateSourceLabel(rateSourceLabel(r.getRateSource()));
vo.setBaseAmount(r.getBaseAmount());
vo.setPayMethodLabel(payMethodLabel(r.getPayMethod()));
vo.setBankAccountNo(r.getBankAccountNo());
vo.setBankTransactionNo(r.getBankTransactionNo());
vo.setStatusLabel(statusLabel(r.getStatus()));
vo.setCreateBy(r.getCreateBy());
vo.setRemark(r.getRemark());
return vo;
}
private static String receiptTypeLabel(String v)
{
if ("PREPAY".equals(v)) return "预充值";
if ("REPAY".equals(v)) return "还款核销";
if ("MIXED".equals(v)) return "混合";
return v;
}
private static String statusLabel(String v)
{
if ("PENDING".equals(v)) return "待确认";
if ("CONFIRMED".equals(v)) return "已确认";
if ("CANCELLED".equals(v)) return "已取消";
return v;
}
private static String payMethodLabel(String v)
{
if ("BANK_TRANSFER".equals(v)) return "银行转账";
if ("ALIPAY".equals(v)) return "支付宝";
if ("WECHAT".equals(v)) return "微信";
if ("CASH".equals(v)) return "现金";
if ("OTHER".equals(v)) return "其他";
return v;
}
private static String rateSourceLabel(String v)
{
if ("RATE_TABLE".equals(v)) return "汇率表";
if ("MANUAL".equals(v)) return "手工修改";
if ("SYSTEM".equals(v)) return "系统默认";
return v;
}
}