package com.ruoyi.cwgl.controller;
|
|
import java.util.List;
|
|
import com.ruoyi.cwgl.domain.ReceivableBillCustomerSummary;
|
import com.ruoyi.cwgl.domain.vo.ReceivableBillAccountAnalysisVo;
|
import com.ruoyi.cwgl.domain.vo.ReceivableBillAgingAnalysisVo;
|
import org.springframework.security.access.prepost.PreAuthorize;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.web.bind.annotation.GetMapping;
|
import org.springframework.web.bind.annotation.PostMapping;
|
import org.springframework.web.bind.annotation.PutMapping;
|
import org.springframework.web.bind.annotation.DeleteMapping;
|
import org.springframework.web.bind.annotation.PathVariable;
|
import org.springframework.web.bind.annotation.RequestBody;
|
import org.springframework.web.bind.annotation.RequestMapping;
|
import org.springframework.web.bind.annotation.RestController;
|
import com.ruoyi.common.utils.file.DownloadExportUtil;
|
import com.ruoyi.common.annotation.Log;
|
import com.ruoyi.common.core.controller.BaseController;
|
import com.ruoyi.common.core.domain.AjaxResult;
|
import com.ruoyi.common.enums.BusinessType;
|
import java.math.BigDecimal;
|
import java.util.List;
|
import java.util.Objects;
|
import com.ruoyi.cwgl.domain.InvoiceManage;
|
import com.ruoyi.cwgl.domain.ReceivableBillManagement;
|
import com.ruoyi.cwgl.domain.ReceivableInvoiceBusiness;
|
import com.ruoyi.cwgl.domain.dto.BillAuditDto;
|
import com.ruoyi.cwgl.domain.dto.ReceivableAuditLog;
|
import com.ruoyi.cwgl.service.IInvoiceManageService;
|
import com.ruoyi.cwgl.service.IReceivableBillManagementService;
|
import com.ruoyi.cwgl.service.IReceivableInvoiceBusinessService;
|
import com.ruoyi.cwgl.service.ITmsAuditLogPushService;
|
import com.ruoyi.common.utils.poi.ExcelUtil;
|
import com.ruoyi.common.core.page.TableDataInfo;
|
|
/**
|
* 应收账单管理Controller
|
*
|
* @author ruoyi
|
* @date 2025-12-17
|
*/
|
@RestController
|
@RequestMapping("/cwgl/receivableBillManagement")
|
public class ReceivableBillManagementController extends BaseController
|
{
|
@Autowired
|
private IReceivableBillManagementService receivableBillManagementService;
|
|
@Autowired
|
private IInvoiceManageService invoiceManageService;
|
|
@Autowired
|
private IReceivableInvoiceBusinessService receivableInvoiceBusinessService;
|
|
@Autowired
|
private ITmsAuditLogPushService tmsAuditLogPushService;
|
|
|
|
/**
|
* 查询应收账单管理列表
|
*/
|
@PreAuthorize("@ss.hasPermi('cwgl:receivableBillManagement:list')")
|
@GetMapping("/list")
|
public TableDataInfo list(ReceivableBillManagement receivableBillManagement)
|
{
|
startPage();
|
List<ReceivableBillManagement> list = receivableBillManagementService.selectReceivableBillManagementList(receivableBillManagement);
|
return getDataTable(list);
|
}
|
|
/**
|
* 导出应收账单管理列表
|
* @param receivableBillManagement 查询条件对象
|
*/
|
@PreAuthorize("@ss.hasPermi('cwgl:receivableBillManagement:export')")
|
@Log(title = "应收账单管理", businessType = BusinessType.EXPORT)
|
@GetMapping("/export")
|
public AjaxResult export(ReceivableBillManagement receivableBillManagement,String exportKey)
|
{
|
receivableBillManagementService.export(receivableBillManagement,exportKey);
|
return AjaxResult.success("导出请求成功,请稍后点击下载...!");
|
}
|
|
|
|
/**
|
* 获取应收账单管理详细信息
|
*/
|
@PreAuthorize("@ss.hasPermi('cwgl:receivableBillManagement:query')")
|
@GetMapping(value = "/{id}")
|
public AjaxResult getInfo(@PathVariable("id") Integer id)
|
{
|
return AjaxResult.success(receivableBillManagementService.selectReceivableBillManagementById(id));
|
}
|
|
/**
|
* 新增应收账单管理
|
*/
|
@PreAuthorize("@ss.hasPermi('cwgl:receivableBillManagement:add')")
|
@Log(title = "应收账单管理", businessType = BusinessType.INSERT)
|
@PostMapping
|
public AjaxResult add(@RequestBody ReceivableBillManagement receivableBillManagement)
|
{
|
return toAjax(receivableBillManagementService.insertReceivableBillManagement(receivableBillManagement));
|
}
|
|
/**
|
* 修改应收账单管理
|
*/
|
@PreAuthorize("@ss.hasPermi('cwgl:receivableBillManagement:edit')")
|
@Log(title = "应收账单管理", businessType = BusinessType.UPDATE)
|
@PutMapping
|
public AjaxResult edit(@RequestBody ReceivableBillManagement receivableBillManagement)
|
{
|
return toAjax(receivableBillManagementService.updateReceivableBillManagement(receivableBillManagement));
|
} /**
|
* 修改应收账单管理
|
*/
|
@PreAuthorize("@ss.hasPermi('cwgl:receivableBillManagement:edit')")
|
@PutMapping("aging")
|
public AjaxResult aging(@RequestBody ReceivableBillManagement receivableBillManagement)
|
{
|
return toAjax(receivableBillManagementService.aging(receivableBillManagement));
|
}
|
@PreAuthorize("@ss.hasPermi('cwgl:receivableBillManagement:edit')")
|
@PutMapping("account")
|
public AjaxResult account(@RequestBody ReceivableBillManagement receivableBillManagement)
|
{
|
return toAjax(receivableBillManagementService.account(receivableBillManagement));
|
}
|
|
/**
|
* 删除应收账单管理
|
*/
|
@PreAuthorize("@ss.hasPermi('cwgl:receivableBillManagement:remove')")
|
@Log(title = "应收账单管理", businessType = BusinessType.DELETE)
|
@DeleteMapping("/{ids}")
|
public AjaxResult remove(@PathVariable Integer[] ids)
|
{
|
return toAjax(receivableBillManagementService.deleteReceivableBillManagementByIds(ids));
|
}
|
|
/**
|
* 作废应收账单管理记录
|
*/
|
@PreAuthorize("@ss.hasPermi('cwgl:receivableBillManagement:void')")
|
@Log(title = "应收账单管理", businessType = BusinessType.UPDATE)
|
@PutMapping("/void/{id}")
|
public AjaxResult voidReceivableBill(@PathVariable("id") Integer id)
|
{
|
return toAjax(receivableBillManagementService.voidReceivableBillManagement(id));
|
}
|
|
/**
|
* 应收账单申请开票
|
* @param invoiceManage 发票管理对象
|
* @param id 应收账单ID
|
* @return 结果
|
*/
|
@PreAuthorize("@ss.hasPermi('cwgl:receivableBillManagement:invoice')")
|
@Log(title = "应收账单管理", businessType = BusinessType.OTHER)
|
@PostMapping("/invoice/{id}")
|
public AjaxResult applyReceivableInvoice(@RequestBody InvoiceManage invoiceManage, @PathVariable("id") Integer id)
|
{
|
return invoiceManageService.applyReceivableInvoice(invoiceManage, id);
|
}
|
|
/**
|
* 查询应收账单已开票金额
|
* @param id 应收账单ID
|
* @return 已开票金额
|
*/
|
@PreAuthorize("@ss.hasPermi('cwgl:receivableBillManagement:query')")
|
@GetMapping("/invoice/amount/{id}")
|
public AjaxResult getReceivableInvoicedAmount(@PathVariable("id") Integer id)
|
{
|
// 查询receivable_invoice_business表中status为1的记录
|
ReceivableInvoiceBusiness query = new ReceivableInvoiceBusiness();
|
query.setHeadId(id);
|
query.setStatus(1);
|
List<ReceivableInvoiceBusiness> invoices = receivableInvoiceBusinessService.selectReceivableInvoiceBusinessList(query);
|
|
// 计算已开票金额
|
BigDecimal invoicedAmount = invoices.stream()
|
.map(ReceivableInvoiceBusiness::getInvoicingAmount)
|
.filter(Objects::nonNull)
|
.reduce(BigDecimal.ZERO, BigDecimal::add);
|
|
return AjaxResult.success(invoicedAmount);
|
}
|
|
/**
|
* 查询应收账单客户汇总列表
|
*/
|
@PreAuthorize("@ss.hasPermi('cwgl:receivableBillManagement:list')")
|
@GetMapping("/customerSummary")
|
public TableDataInfo customerSummary(ReceivableBillManagement receivableBillManagement)
|
{
|
List<ReceivableBillCustomerSummary> list = receivableBillManagementService.selectReceivableBillCustomerSummaryList(receivableBillManagement);
|
return getDataTable(list);
|
}
|
/**
|
* 导出应收账单管理列表
|
* @param receivableBillManagement 查询条件对象
|
*/
|
@PreAuthorize("@ss.hasPermi('cwgl:receivableBillManagement:export')")
|
@GetMapping("/customerSummary/export")
|
public AjaxResult customerSummaryExport(ReceivableBillManagement receivableBillManagement,String exportKey)
|
{
|
receivableBillManagementService.customerSummaryExport(receivableBillManagement,exportKey);
|
return AjaxResult.success("导出请求成功,请稍后点击下载...!");
|
}
|
|
/**
|
* 查询应收账单账龄分析列表
|
*/
|
@PreAuthorize("@ss.hasPermi('cwgl:receivableBillManagement:list')")
|
@GetMapping("/agingAnalysis")
|
public TableDataInfo agingAnalysis(ReceivableBillManagement receivableBillManagement)
|
{
|
startPage();
|
List<ReceivableBillAgingAnalysisVo> list = receivableBillManagementService.selectReceivableBillAgingAnalysisList(receivableBillManagement);
|
return getDataTable(list);
|
}
|
|
@PreAuthorize("@ss.hasPermi('cwgl:receivableBillManagement:export')")
|
@GetMapping("/agingAnalysis/export")
|
public AjaxResult agingAnalysisExport(ReceivableBillManagement receivableBillManagement,String exportKey)
|
{
|
receivableBillManagementService.agingAnalysisExport(receivableBillManagement,exportKey);
|
return AjaxResult.success("导出请求成功,请稍后点击下载...!");
|
}
|
/**
|
* 查询应收账单账款分析列表
|
*/
|
@PreAuthorize("@ss.hasPermi('cwgl:receivableBillManagement:list')")
|
@GetMapping("/accountAnalysis")
|
public TableDataInfo accountAnalysis(ReceivableBillManagement receivableBillManagement)
|
{
|
startPage();
|
List<ReceivableBillAccountAnalysisVo> list = receivableBillManagementService.selectReceivableBillAccountAnalysisList(receivableBillManagement);
|
return getDataTable(list);
|
}
|
@PreAuthorize("@ss.hasPermi('cwgl:receivableBillManagement:export')")
|
@GetMapping("/accountAnalysis/export")
|
public AjaxResult accountAnalysisExport(ReceivableBillManagement receivableBillManagement,String exportKey)
|
{
|
receivableBillManagementService.accountAnalysisExport(receivableBillManagement,exportKey);
|
return AjaxResult.success("导出请求成功,请稍后点击下载...!");
|
}
|
|
/**
|
* 应收账单审核接口
|
* @param billAuditDto 审核数据传输对象
|
* @return 审核结果
|
*/
|
@PreAuthorize("@ss.hasPermi('cwgl:receivableBillManagement:audit')")
|
@Log(title = "应收账单管理", businessType = BusinessType.UPDATE)
|
@PutMapping("/audit")
|
public AjaxResult auditReceivableBill(@RequestBody BillAuditDto billAuditDto) {
|
try {
|
// 1. 查询应收账单
|
ReceivableBillManagement bill = receivableBillManagementService.selectReceivableBillManagementById(billAuditDto.getBillId());
|
if (bill == null) {
|
return AjaxResult.error("应收账单不存在,ID:" + billAuditDto.getBillId());
|
}
|
|
// 2. 记录审核前状态
|
Integer beforeAuditStatus = bill.getAuditStatus();
|
|
// 3. 更新审核状态
|
bill.setAuditStatus(billAuditDto.getAuditResult());
|
bill.setUpdateTime(new java.util.Date());
|
bill.setUpdateBy(getUsername());
|
|
// 4. 更新账单
|
int rows = receivableBillManagementService.updateReceivableBillManagement(bill);
|
if (rows <= 0) {
|
return AjaxResult.error("更新应收账单审核状态失败");
|
}
|
|
// 5. 记录审核日志
|
saveReceivableAuditLog(billAuditDto, bill, beforeAuditStatus);
|
|
// 6. 如果来源系统是TMS,推送审核日志到TMS
|
if (tmsAuditLogPushService.isReceivableBillFromTms(bill.getSystemNo())) {
|
try {
|
ReceivableAuditLog auditLog = createReceivableAuditLog(billAuditDto, bill, beforeAuditStatus);
|
tmsAuditLogPushService.pushReceivableAuditLog(auditLog);
|
} catch (Exception e) {
|
logger.error("推送应收账单审核日志到TMS失败,账单ID:{}", bill.getId(), e);
|
// 推送失败不影响主流程,只记录日志
|
}
|
}
|
|
return AjaxResult.success("应收账单审核成功");
|
|
} catch (Exception e) {
|
return AjaxResult.error("应收账单审核失败:" + e.getMessage());
|
}
|
}
|
|
/**
|
* 保存应收账单审核日志
|
*/
|
private void saveReceivableAuditLog(BillAuditDto billAuditDto, ReceivableBillManagement bill, Integer beforeAuditStatus) {
|
// 这里需要实现日志记录逻辑
|
// 可以使用原有的日志服务或系统日志
|
logger.info("应收账单审核日志 - 账单ID:{},账单编号:{},审核前状态:{},审核结果:{},审核意见:{}",
|
bill.getId(), bill.getSystemNo(),
|
getAuditStatusText(beforeAuditStatus),
|
getAuditResultText(billAuditDto.getAuditResult()),
|
billAuditDto.getAuditComment() != null ? billAuditDto.getAuditComment() : "无");
|
}
|
|
/**
|
* 获取审核状态文本
|
*/
|
private String getAuditStatusText(Integer auditStatus) {
|
switch (auditStatus) {
|
case 0: return "待审核";
|
case 1: return "审核通过";
|
case 2: return "审核驳回";
|
default: return "未知状态";
|
}
|
}
|
|
/**
|
* 获取审核结果文本
|
*/
|
private String getAuditResultText(Integer auditResult) {
|
switch (auditResult) {
|
case 1: return "通过";
|
case 2: return "驳回";
|
default: return "未知结果";
|
}
|
}
|
|
/**
|
* 创建应收账单审核日志对象
|
*/
|
private ReceivableAuditLog createReceivableAuditLog(BillAuditDto billAuditDto, ReceivableBillManagement bill, Integer beforeAuditStatus) {
|
ReceivableAuditLog auditLog = new ReceivableAuditLog();
|
auditLog.setBillId(bill.getId());
|
auditLog.setBillNo(bill.getSystemNo());
|
auditLog.setBillName(bill.getBillName());
|
auditLog.setCustomerName(bill.getCustomerName());
|
auditLog.setSourceSystem(tmsAuditLogPushService.getReceivableBillSourceSystem(bill.getSystemNo()));
|
auditLog.setBeforeAuditStatus(beforeAuditStatus);
|
auditLog.setAuditResult(billAuditDto.getAuditResult());
|
auditLog.setAuditComment(billAuditDto.getAuditComment());
|
auditLog.setAuditUser(getUsername());
|
auditLog.setAuditTime(new java.util.Date());
|
auditLog.setTotalAmount(bill.getTotalAmount());
|
return auditLog;
|
}
|
|
}
|