资金计划

This commit is contained in:
lg
2025-10-17 11:54:00 +08:00
parent c72275859f
commit 6bcddf50da
55 changed files with 5483 additions and 22 deletions

View File

@ -20,10 +20,8 @@ import java.time.LocalDateTime;
@EqualsAndHashCode(callSuper = true)
@TableName("xzd_subcontract")
public class XzdSubcontract extends BaseEntity {
@Serial
private static final long serialVersionUID = 1L;
/**
*
*/

View File

@ -27,13 +27,11 @@ public class XzdCbysWgcbtbBo extends BaseEntity {
/**
* 主键ID自增
*/
@NotNull(message = "主键ID自增不能为空", groups = { EditGroup.class })
private Long id;
private Long id;
/**
* 单据编码(带*,必填)
*/
@NotBlank(message = "单据编码(带*,必填)不能为空", groups = { AddGroup.class, EditGroup.class })
private String docCode;
/**

View File

@ -1,5 +1,7 @@
package org.dromara.xzd.costProjectApproval.costBudget.domain.vo;
import org.dromara.common.translation.annotation.Translation;
import org.dromara.common.translation.constant.TransConstant;
import org.dromara.xzd.costProjectApproval.costBudget.domain.XzdCbysWgcbtb;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
@ -68,12 +70,26 @@ public class XzdCbysWgcbtbVo implements Serializable {
@ExcelProperty(value = "工程项目")
private Long projectId;
/**
* 工程项目名称
*/
@ExcelProperty(value = "工程项目名称")
private String projectName;
/**
* 项目责任人
*/
@ExcelProperty(value = "项目责任人")
private Long projectLeader;
/**
* 项目责任人名称
*/
@ExcelProperty(value = "项目责任人名称")
@Translation(type = TransConstant.USER_ID_TO_NICKNAME, mapper = "projectLeader")
private String projectLeaderName;
/**
* 开工日期
*/

View File

@ -1,6 +1,7 @@
package org.dromara.xzd.costProjectApproval.costBudget.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.dromara.common.core.domain.R;
import org.dromara.common.core.exception.ServiceException;
import org.dromara.common.core.utils.MapstructUtils;
import org.dromara.common.core.utils.StringUtils;
@ -10,7 +11,15 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.RequiredArgsConstructor;
import org.dromara.common.utils.BatchNumberGenerator;
import org.dromara.system.service.impl.SysOssServiceImpl;
import org.dromara.xzd.costProjectApproval.costBudget.domain.XzdCbysWgcbtbFubiao;
import org.dromara.xzd.costProjectApproval.costBudget.service.IXzdCbysWgcbtbFubiaoService;
import org.dromara.xzd.domain.XzdContractDetails;
import org.dromara.xzd.domain.dto.QuerCorrespondentDto;
import org.dromara.xzd.fapiaotaizhang.zengzhishui.domain.TaxInfo;
import org.dromara.xzd.fapiaotaizhang.zengzhishui.domain.vo.AppreciationInvoiceVo;
import org.dromara.xzd.service.IXzdProjectService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.dromara.xzd.costProjectApproval.costBudget.domain.bo.XzdCbysWgcbtbBo;
@ -19,9 +28,8 @@ import org.dromara.xzd.costProjectApproval.costBudget.domain.XzdCbysWgcbtb;
import org.dromara.xzd.costProjectApproval.costBudget.mapper.XzdCbysWgcbtbMapper;
import org.dromara.xzd.costProjectApproval.costBudget.service.IXzdCbysWgcbtbService;
import java.util.List;
import java.util.Map;
import java.util.Collection;
import java.util.*;
import java.util.stream.Collectors;
/**
* 立项及成本-成本预算-完工成本填报Service业务层处理
@ -38,6 +46,13 @@ public class XzdCbysWgcbtbServiceImpl extends ServiceImpl<XzdCbysWgcbtbMapper, X
@Autowired
private IXzdCbysWgcbtbFubiaoService fubiaoService;
private final IXzdProjectService xzdProjectService;
@Autowired
private SysOssServiceImpl sysOssService;
/**
* 查询立项及成本-成本预算-完工成本填报
*
@ -46,7 +61,10 @@ public class XzdCbysWgcbtbServiceImpl extends ServiceImpl<XzdCbysWgcbtbMapper, X
*/
@Override
public XzdCbysWgcbtbVo queryById(Long id){
return baseMapper.selectVoById(id);
XzdCbysWgcbtbVo xzdCbysWgcbtbVo = baseMapper.selectVoById(id);
List<XzdCbysWgcbtbVo> vo = List.of(xzdCbysWgcbtbVo);
saveValu(vo);
return vo.getFirst();
}
/**
@ -60,9 +78,25 @@ public class XzdCbysWgcbtbServiceImpl extends ServiceImpl<XzdCbysWgcbtbMapper, X
public TableDataInfo<XzdCbysWgcbtbVo> queryPageList(XzdCbysWgcbtbBo bo, PageQuery pageQuery) {
LambdaQueryWrapper<XzdCbysWgcbtb> lqw = buildQueryWrapper(bo);
Page<XzdCbysWgcbtbVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
saveValu(result.getRecords());
return TableDataInfo.build(result);
}
private void saveValu(List<XzdCbysWgcbtbVo> records) {
for (XzdCbysWgcbtbVo item : records) {
//项目名称
if (item.getProjectId() != null){
String projectName = xzdProjectService.queryNameById(item.getProjectId());
if (projectName != null){
item.setProjectName(projectName);
}
}
}
}
/**
* 查询符合条件的立项及成本-成本预算-完工成本填报列表
*
@ -107,6 +141,8 @@ public class XzdCbysWgcbtbServiceImpl extends ServiceImpl<XzdCbysWgcbtbMapper, X
public Boolean insertByBo(XzdCbysWgcbtbBo bo) {
XzdCbysWgcbtb add = MapstructUtils.convert(bo, XzdCbysWgcbtb.class);
validEntityBeforeSave(add);
String banBen = BatchNumberGenerator.generateBatchNumber("CBTB");
add.setDocCode(banBen);
boolean flag = baseMapper.insert(add) > 0;
if (flag) {
bo.setId(add.getId());
@ -129,6 +165,16 @@ public class XzdCbysWgcbtbServiceImpl extends ServiceImpl<XzdCbysWgcbtbMapper, X
public Boolean updateByBo(XzdCbysWgcbtbBo bo) {
XzdCbysWgcbtb update = MapstructUtils.convert(bo, XzdCbysWgcbtb.class);
validEntityBeforeSave(update);
if (bo.getXzdCbysWgcbtbFubiao() == null || bo.getXzdCbysWgcbtbFubiao().isEmpty()) {
throw new ServiceException("成本明细不能为空");
}
HashMap<String, Object> hashMap = new HashMap<>();
hashMap.put("main_doc_id", update.getId());
fubiaoService.getBaseMapper().deleteByMap(hashMap);
bo.getXzdCbysWgcbtbFubiao().forEach(item -> {item.setMainDocId(update.getId());});
fubiaoService.saveBatch(bo.getXzdCbysWgcbtbFubiao());
return baseMapper.updateById(update) > 0;
}
@ -151,6 +197,17 @@ public class XzdCbysWgcbtbServiceImpl extends ServiceImpl<XzdCbysWgcbtbMapper, X
if(isValid){
//TODO 做一些业务上的校验,判断是否需要校验
}
for (Long id : ids) {
XzdCbysWgcbtbVo vo = baseMapper.selectVoById(id);
// 删除附件
if (!StringUtils.isEmpty(vo.getFileId())){
List<Long> collect = Arrays.stream(vo.getFileId().split(",")).map(item -> {
return Long.parseLong(item);
}).collect(Collectors.toList());
sysOssService.deleteWithValidByIds(collect, false);
}
}
fubiaoService.getBaseMapper().delete(new LambdaQueryWrapper<XzdCbysWgcbtbFubiao>().in(XzdCbysWgcbtbFubiao::getMainDocId, ids));
return baseMapper.deleteByIds(ids) > 0;
}
}

View File

@ -0,0 +1,105 @@
package org.dromara.xzd.fapiaotaizhang.zengzhishui.controller;
import java.util.List;
import lombok.RequiredArgsConstructor;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.constraints.*;
import cn.dev33.satoken.annotation.SaCheckPermission;
import org.springframework.web.bind.annotation.*;
import org.springframework.validation.annotation.Validated;
import org.dromara.common.idempotent.annotation.RepeatSubmit;
import org.dromara.common.log.annotation.Log;
import org.dromara.common.web.core.BaseController;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.core.domain.R;
import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.core.validate.EditGroup;
import org.dromara.common.log.enums.BusinessType;
import org.dromara.common.excel.utils.ExcelUtil;
import org.dromara.xzd.fapiaotaizhang.zengzhishui.domain.vo.AppreciationInvoiceVo;
import org.dromara.xzd.fapiaotaizhang.zengzhishui.domain.bo.AppreciationInvoiceBo;
import org.dromara.xzd.fapiaotaizhang.zengzhishui.service.IAppreciationInvoiceService;
import org.dromara.common.mybatis.core.page.TableDataInfo;
/**
* 增值税发票
*
* @author Lion Li
* @date 2025-10-17
*/
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/zengzhishui/invoice")
public class AppreciationInvoiceController extends BaseController {
private final IAppreciationInvoiceService appreciationInvoiceService;
/**
* 查询增值税发票列表
*/
@SaCheckPermission("zengzhishui:invoice:list")
@GetMapping("/list")
public TableDataInfo<AppreciationInvoiceVo> list(AppreciationInvoiceBo bo, PageQuery pageQuery) {
return appreciationInvoiceService.queryPageList(bo, pageQuery);
}
/**
* 导出增值税发票列表
*/
@SaCheckPermission("zengzhishui:invoice:export")
@Log(title = "增值税发票", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(AppreciationInvoiceBo bo, HttpServletResponse response) {
List<AppreciationInvoiceVo> list = appreciationInvoiceService.queryList(bo);
ExcelUtil.exportExcel(list, "增值税发票", AppreciationInvoiceVo.class, response);
}
/**
* 获取增值税发票详细信息
*
* @param id 主键
*/
@SaCheckPermission("zengzhishui:invoice:query")
@GetMapping("/{id}")
public R<AppreciationInvoiceVo> getInfo(@NotNull(message = "主键不能为空")
@PathVariable Long id) {
return R.ok(appreciationInvoiceService.queryById(id));
}
/**
* 新增增值税发票
*/
@SaCheckPermission("zengzhishui:invoice:add")
@Log(title = "增值税发票", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping()
public R<Void> add(@Validated(AddGroup.class) @RequestBody AppreciationInvoiceBo bo) {
return toAjax(appreciationInvoiceService.insertByBo(bo));
}
/**
* 修改增值税发票
*/
@SaCheckPermission("zengzhishui:invoice:edit")
@Log(title = "增值税发票", businessType = BusinessType.UPDATE)
@RepeatSubmit()
@PutMapping()
public R<Void> edit(@Validated(EditGroup.class) @RequestBody AppreciationInvoiceBo bo) {
return toAjax(appreciationInvoiceService.updateByBo(bo));
}
/**
* 删除增值税发票
*
* @param ids 主键串
*/
@SaCheckPermission("zengzhishui:invoice:remove")
@Log(title = "增值税发票", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}")
public R<Void> remove(@NotEmpty(message = "主键不能为空")
@PathVariable Long[] ids) {
return toAjax(appreciationInvoiceService.deleteWithValidByIds(List.of(ids), true));
}
}

View File

@ -0,0 +1,105 @@
package org.dromara.xzd.fapiaotaizhang.zengzhishui.controller;
import java.util.List;
import lombok.RequiredArgsConstructor;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.constraints.*;
import cn.dev33.satoken.annotation.SaCheckPermission;
import org.springframework.web.bind.annotation.*;
import org.springframework.validation.annotation.Validated;
import org.dromara.common.idempotent.annotation.RepeatSubmit;
import org.dromara.common.log.annotation.Log;
import org.dromara.common.web.core.BaseController;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.core.domain.R;
import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.core.validate.EditGroup;
import org.dromara.common.log.enums.BusinessType;
import org.dromara.common.excel.utils.ExcelUtil;
import org.dromara.xzd.fapiaotaizhang.zengzhishui.domain.vo.TaxInfoVo;
import org.dromara.xzd.fapiaotaizhang.zengzhishui.domain.bo.TaxInfoBo;
import org.dromara.xzd.fapiaotaizhang.zengzhishui.service.ITaxInfoService;
import org.dromara.common.mybatis.core.page.TableDataInfo;
/**
* 征税项目
*
* @author Lion Li
* @date 2025-10-17
*/
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/zengzhishui/info")
public class TaxInfoController extends BaseController {
private final ITaxInfoService taxInfoService;
/**
* 查询征税项目列表
*/
@SaCheckPermission("zengzhishui:info:list")
@GetMapping("/list")
public TableDataInfo<TaxInfoVo> list(TaxInfoBo bo, PageQuery pageQuery) {
return taxInfoService.queryPageList(bo, pageQuery);
}
/**
* 导出征税项目列表
*/
@SaCheckPermission("zengzhishui:info:export")
@Log(title = "征税项目", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(TaxInfoBo bo, HttpServletResponse response) {
List<TaxInfoVo> list = taxInfoService.queryList(bo);
ExcelUtil.exportExcel(list, "征税项目", TaxInfoVo.class, response);
}
/**
* 获取征税项目详细信息
*
* @param levyCode 主键
*/
@SaCheckPermission("zengzhishui:info:query")
@GetMapping("/{levyCode}")
public R<TaxInfoVo> getInfo(@NotNull(message = "主键不能为空")
@PathVariable String levyCode) {
return R.ok(taxInfoService.queryById(levyCode));
}
/**
* 新增征税项目
*/
@SaCheckPermission("zengzhishui:info:add")
@Log(title = "征税项目", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping()
public R<Void> add(@Validated(AddGroup.class) @RequestBody TaxInfoBo bo) {
return toAjax(taxInfoService.insertByBo(bo));
}
/**
* 修改征税项目
*/
@SaCheckPermission("zengzhishui:info:edit")
@Log(title = "征税项目", businessType = BusinessType.UPDATE)
@RepeatSubmit()
@PutMapping()
public R<Void> edit(@Validated(EditGroup.class) @RequestBody TaxInfoBo bo) {
return toAjax(taxInfoService.updateByBo(bo));
}
/**
* 删除征税项目
*
* @param levyCodes 主键串
*/
@SaCheckPermission("zengzhishui:info:remove")
@Log(title = "征税项目", businessType = BusinessType.DELETE)
@DeleteMapping("/{levyCodes}")
public R<Void> remove(@NotEmpty(message = "主键不能为空")
@PathVariable String[] levyCodes) {
return toAjax(taxInfoService.deleteWithValidByIds(List.of(levyCodes), true));
}
}

View File

@ -0,0 +1,210 @@
package org.dromara.xzd.fapiaotaizhang.zengzhishui.domain;
import org.dromara.common.mybatis.core.domain.BaseEntity;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
import java.io.Serial;
/**
* 增值税发票对象 appreciation_invoice
*
* @author Lion Li
* @date 2025-10-17
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("appreciation_invoice")
public class AppreciationInvoice extends BaseEntity {
@Serial
private static final long serialVersionUID = 1L;
/**
* 主键ID
*/
@TableId(value = "id")
private Long id;
/**
* 发票类型
*/
private String invoiceType;
/**
* 项目
*/
private Long project;
/**
* 合同号 承包合同
*/
private Long contractNo;
/**
* 录入日期
*/
private LocalDate entryDate;
/**
* 年度
*/
private Long year;
/**
* 会计期
*/
private Long accountingPeriod;
/**
* 销项类型
*/
private String taxType;
/**
* 征税项目
*/
private Long taxItem;
/**
* 所属组织
*/
private Long organization;
/**
* 经办人
*/
private Long handler;
/**
* 发票用途
*/
private String invoicePurpose;
/**
* 发票代码
*/
private String invoiceCode;
/**
* 发票号码
*/
private String invoiceNo;
/**
* 开票日期
*/
private LocalDate invoiceDate;
/**
* 公司税号
*/
private String companyTaxNo;
/**
* 公司名称
*/
private String companyName;
/**
* 金额
*/
private BigDecimal amount;
/**
* 税额
*/
private BigDecimal taxAmount;
/**
* 税率
*/
private BigDecimal taxRate;
/**
* 价税合计
*/
private BigDecimal totalAmount;
/**
* 购方税号
*/
private String buyerTaxNo;
/**
* 购方名称
*/
private Long buyerName;
/**
* 购方纳税人名称
*/
private String buyerTaxpayerName;
/**
* 跨区涉税报告
*/
private String crossTaxReport;
/**
* 3%征收率减按2%征收标识0为否1为是
*/
private Long percentageCharges;
/**
* 减征额
*/
private BigDecimal deductionAmount;
/**
* 拆分标志
*/
private String splitFlag;
/**
* 校验码
*/
private String checkCode;
/**
* 机器编码
*/
private String machineCode;
/**
* 备注信息1
*/
private String remark1;
/**
* 备注信息2
*/
private String remark2;
/**
* 数电票号码
*/
private String electronicInvoiceNo;
/**
* 文件ID
*/
private String fileId;
/**
* 备注
*/
private String remark;
/**
* 审核状态
*/
private String auditStatus;
}

View File

@ -0,0 +1,44 @@
package org.dromara.xzd.fapiaotaizhang.zengzhishui.domain;
import org.dromara.common.mybatis.core.domain.BaseEntity;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serial;
/**
* 征税项目对象 tax_info
*
* @author Lion Li
* @date 2025-10-17
*/
@Data
@TableName("tax_info")
public class TaxInfo {
@Serial
private static final long serialVersionUID = 1L;
/**
* 征收编码
*/
private String levyCode;
/**
* 征收方式
*/
private String levyMethod;
/**
* 征税项目
*/
private String taxItem;
/**
* 税率
*/
private String taxRate;
}

View File

@ -0,0 +1,209 @@
package org.dromara.xzd.fapiaotaizhang.zengzhishui.domain.bo;
import org.dromara.xzd.fapiaotaizhang.zengzhishui.domain.AppreciationInvoice;
import org.dromara.common.mybatis.core.domain.BaseEntity;
import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.core.validate.EditGroup;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import lombok.EqualsAndHashCode;
import jakarta.validation.constraints.*;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
/**
* 增值税发票业务对象 appreciation_invoice
*
* @author Lion Li
* @date 2025-10-17
*/
@Data
@EqualsAndHashCode(callSuper = true)
@AutoMapper(target = AppreciationInvoice.class, reverseConvertGenerate = false)
public class AppreciationInvoiceBo extends BaseEntity {
/**
* 主键ID
*/
@NotNull(message = "主键ID不能为空", groups = { EditGroup.class })
private Long id;
/**
* 发票类型
*/
private String invoiceType;
/**
* 项目
*/
private Long project;
/**
* 合同号 承包合同
*/
private Long contractNo;
/**
* 录入日期
*/
private LocalDate entryDate;
/**
* 年度
*/
private Long year;
/**
* 会计期
*/
private Long accountingPeriod;
/**
* 销项类型
*/
private String taxType;
/**
* 征税项目
*/
private Long taxItem;
/**
* 所属组织
*/
private Long organization;
/**
* 经办人
*/
private Long handler;
/**
* 发票用途
*/
private String invoicePurpose;
/**
* 发票代码
*/
private String invoiceCode;
/**
* 发票号码
*/
private String invoiceNo;
/**
* 开票日期
*/
private LocalDate invoiceDate;
/**
* 公司税号
*/
private String companyTaxNo;
/**
* 公司名称
*/
private String companyName;
/**
* 金额
*/
private BigDecimal amount;
/**
* 税额
*/
private BigDecimal taxAmount;
/**
* 税率
*/
private BigDecimal taxRate;
/**
* 价税合计
*/
private BigDecimal totalAmount;
/**
* 购方税号
*/
private String buyerTaxNo;
/**
* 购方名称
*/
private Long buyerName;
/**
* 购方纳税人名称
*/
private String buyerTaxpayerName;
/**
* 跨区涉税报告
*/
private String crossTaxReport;
/**
* 3%征收率减按2%征收标识0为否1为是
*/
private Long percentageCharges;
/**
* 减征额
*/
private BigDecimal deductionAmount;
/**
* 拆分标志
*/
private String splitFlag;
/**
* 校验码
*/
private String checkCode;
/**
* 机器编码
*/
private String machineCode;
/**
* 备注信息1
*/
private String remark1;
/**
* 备注信息2
*/
private String remark2;
/**
* 数电票号码
*/
private String electronicInvoiceNo;
/**
* 文件ID
*/
private String fileId;
/**
* 备注
*/
private String remark;
/**
* 审核状态
*/
private String auditStatus;
}

View File

@ -0,0 +1,43 @@
package org.dromara.xzd.fapiaotaizhang.zengzhishui.domain.bo;
import org.dromara.xzd.fapiaotaizhang.zengzhishui.domain.TaxInfo;
import org.dromara.common.mybatis.core.domain.BaseEntity;
import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.core.validate.EditGroup;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import lombok.EqualsAndHashCode;
import jakarta.validation.constraints.*;
/**
* 征税项目业务对象 tax_info
*
* @author Lion Li
* @date 2025-10-17
*/
@Data
@AutoMapper(target = TaxInfo.class, reverseConvertGenerate = false)
public class TaxInfoBo {
/**
* 征收编码
*/
private String levyCode;
/**
* 征收方式
*/
private String levyMethod;
/**
* 征税项目
*/
private String taxItem;
/**
* 税率
*/
private String taxRate;
}

View File

@ -0,0 +1,295 @@
package org.dromara.xzd.fapiaotaizhang.zengzhishui.domain.vo;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
import org.dromara.common.translation.annotation.Translation;
import org.dromara.common.translation.constant.TransConstant;
import org.dromara.xzd.fapiaotaizhang.zengzhishui.domain.AppreciationInvoice;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import org.dromara.common.excel.annotation.ExcelDictFormat;
import org.dromara.common.excel.convert.ExcelDictConvert;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.util.Date;
/**
* 增值税发票视图对象 appreciation_invoice
*
* @author Lion Li
* @date 2025-10-17
*/
@Data
@ExcelIgnoreUnannotated
@AutoMapper(target = AppreciationInvoice.class)
public class AppreciationInvoiceVo implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 主键ID
*/
@ExcelProperty(value = "主键ID")
private Long id;
/**
* 发票类型
*/
@ExcelProperty(value = "发票类型")
private String invoiceType;
/**
* 项目
*/
@ExcelProperty(value = "项目")
private Long project;
/**
* 项目名称
*/
@ExcelProperty(value = "项目名称")
private String projectName;
/**
* 合同号 承包合同
*/
@ExcelProperty(value = "合同号 承包合同")
private Long contractNo;
/**
* 合同号 承包合同编码
*/
@ExcelProperty(value = "合同号 承包合同编码")
private String contractNoName;
/**
* 录入日期
*/
@ExcelProperty(value = "录入日期")
private LocalDate entryDate;
/**
* 年度
*/
@ExcelProperty(value = "年度")
private Long year;
/**
* 会计期
*/
@ExcelProperty(value = "会计期")
private Long accountingPeriod;
/**
* 销项类型
*/
@ExcelProperty(value = "销项类型")
private String taxType;
/**
* 征税项目
*/
@ExcelProperty(value = "征税项目")
private Long taxItem;
/**
* 征税项目名称
*/
@ExcelProperty(value = "征税项目名称")
private String taxItemName;
/**
* 所属组织
*/
@ExcelProperty(value = "所属组织")
private Long organization;
/**
* 所属组织名称
*/
@ExcelProperty(value = "所属组织名称")
@Translation(type = TransConstant.DEPT_ID_TO_NAME, mapper = "organization")
private String organizationName;
/**
* 经办人
*/
@ExcelProperty(value = "经办人")
private Long handler;
/**
* 经办人名称
*/
@ExcelProperty(value = "经办人名称")
@Translation(type = TransConstant.USER_ID_TO_NICKNAME, mapper = "handler")
private String handlerNme;
/**
* 发票用途
*/
@ExcelProperty(value = "发票用途")
private String invoicePurpose;
/**
* 发票代码
*/
@ExcelProperty(value = "发票代码")
private String invoiceCode;
/**
* 发票号码
*/
@ExcelProperty(value = "发票号码")
private String invoiceNo;
/**
* 开票日期
*/
@ExcelProperty(value = "开票日期")
private LocalDate invoiceDate;
/**
* 公司税号
*/
@ExcelProperty(value = "公司税号")
private String companyTaxNo;
/**
* 公司名称
*/
@ExcelProperty(value = "公司名称")
private String companyName;
/**
* 金额
*/
@ExcelProperty(value = "金额")
private BigDecimal amount;
/**
* 税额
*/
@ExcelProperty(value = "税额")
private BigDecimal taxAmount;
/**
* 税率
*/
@ExcelProperty(value = "税率")
private BigDecimal taxRate;
/**
* 价税合计
*/
@ExcelProperty(value = "价税合计")
private BigDecimal totalAmount;
/**
* 购方税号
*/
@ExcelProperty(value = "购方税号")
private String buyerTaxNo;
/**
* 购方名称(客户id)
*/
@ExcelProperty(value = "购方名称 id")
private Long buyerName;
/**
* 购方名称
*/
@ExcelProperty(value = "购方名称")
private String buyerNameS;
/**
* 购方纳税人名称
*/
@ExcelProperty(value = "购方纳税人名称")
private String buyerTaxpayerName;
/**
* 跨区涉税报告
*/
@ExcelProperty(value = "跨区涉税报告")
private String crossTaxReport;
/**
* 3%征收率减按2%征收标识0为否1为是
*/
@ExcelProperty(value = "3%征收率减按2%征收标识", converter = ExcelDictConvert.class)
@ExcelDictFormat(readConverterExp = "0=为否1为是")
private Long percentageCharges;
/**
* 减征额
*/
@ExcelProperty(value = "减征额")
private BigDecimal deductionAmount;
/**
* 拆分标志
*/
@ExcelProperty(value = "拆分标志")
private String splitFlag;
/**
* 校验码
*/
@ExcelProperty(value = "校验码")
private String checkCode;
/**
* 机器编码
*/
@ExcelProperty(value = "机器编码")
private String machineCode;
/**
* 备注信息1
*/
@ExcelProperty(value = "备注信息1")
private String remark1;
/**
* 备注信息2
*/
@ExcelProperty(value = "备注信息2")
private String remark2;
/**
* 数电票号码
*/
@ExcelProperty(value = "数电票号码")
private String electronicInvoiceNo;
/**
* 文件ID
*/
@ExcelProperty(value = "文件ID")
private String fileId;
/**
* 备注
*/
@ExcelProperty(value = "备注")
private String remark;
/**
* 审核状态
*/
@ExcelProperty(value = "审核状态")
private String auditStatus;
}

View File

@ -0,0 +1,56 @@
package org.dromara.xzd.fapiaotaizhang.zengzhishui.domain.vo;
import org.dromara.xzd.fapiaotaizhang.zengzhishui.domain.TaxInfo;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import org.dromara.common.excel.annotation.ExcelDictFormat;
import org.dromara.common.excel.convert.ExcelDictConvert;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.util.Date;
/**
* 征税项目视图对象 tax_info
*
* @author Lion Li
* @date 2025-10-17
*/
@Data
@ExcelIgnoreUnannotated
@AutoMapper(target = TaxInfo.class)
public class TaxInfoVo implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 征收编码
*/
@ExcelProperty(value = "征收编码")
private String levyCode;
/**
* 征收方式
*/
@ExcelProperty(value = "征收方式")
private String levyMethod;
/**
* 征税项目
*/
@ExcelProperty(value = "征税项目")
private String taxItem;
/**
* 税率
*/
@ExcelProperty(value = "税率")
private String taxRate;
}

View File

@ -0,0 +1,15 @@
package org.dromara.xzd.fapiaotaizhang.zengzhishui.mapper;
import org.dromara.xzd.fapiaotaizhang.zengzhishui.domain.AppreciationInvoice;
import org.dromara.xzd.fapiaotaizhang.zengzhishui.domain.vo.AppreciationInvoiceVo;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
/**
* 增值税发票Mapper接口
*
* @author Lion Li
* @date 2025-10-17
*/
public interface AppreciationInvoiceMapper extends BaseMapperPlus<AppreciationInvoice, AppreciationInvoiceVo> {
}

View File

@ -0,0 +1,15 @@
package org.dromara.xzd.fapiaotaizhang.zengzhishui.mapper;
import org.dromara.xzd.fapiaotaizhang.zengzhishui.domain.TaxInfo;
import org.dromara.xzd.fapiaotaizhang.zengzhishui.domain.vo.TaxInfoVo;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
/**
* 征税项目Mapper接口
*
* @author Lion Li
* @date 2025-10-17
*/
public interface TaxInfoMapper extends BaseMapperPlus<TaxInfo, TaxInfoVo> {
}

View File

@ -0,0 +1,70 @@
package org.dromara.xzd.fapiaotaizhang.zengzhishui.service;
import org.dromara.xzd.fapiaotaizhang.zengzhishui.domain.vo.AppreciationInvoiceVo;
import org.dromara.xzd.fapiaotaizhang.zengzhishui.domain.bo.AppreciationInvoiceBo;
import org.dromara.xzd.fapiaotaizhang.zengzhishui.domain.AppreciationInvoice;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.mybatis.core.page.PageQuery;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.Collection;
import java.util.List;
/**
* 增值税发票Service接口
*
* @author Lion Li
* @date 2025-10-17
*/
public interface IAppreciationInvoiceService extends IService<AppreciationInvoice>{
/**
* 查询增值税发票
*
* @param id 主键
* @return 增值税发票
*/
AppreciationInvoiceVo queryById(Long id);
/**
* 分页查询增值税发票列表
*
* @param bo 查询条件
* @param pageQuery 分页参数
* @return 增值税发票分页列表
*/
TableDataInfo<AppreciationInvoiceVo> queryPageList(AppreciationInvoiceBo bo, PageQuery pageQuery);
/**
* 查询符合条件的增值税发票列表
*
* @param bo 查询条件
* @return 增值税发票列表
*/
List<AppreciationInvoiceVo> queryList(AppreciationInvoiceBo bo);
/**
* 新增增值税发票
*
* @param bo 增值税发票
* @return 是否新增成功
*/
Boolean insertByBo(AppreciationInvoiceBo bo);
/**
* 修改增值税发票
*
* @param bo 增值税发票
* @return 是否修改成功
*/
Boolean updateByBo(AppreciationInvoiceBo bo);
/**
* 校验并批量删除增值税发票信息
*
* @param ids 待删除的主键集合
* @param isValid 是否进行有效性校验
* @return 是否删除成功
*/
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
}

View File

@ -0,0 +1,70 @@
package org.dromara.xzd.fapiaotaizhang.zengzhishui.service;
import org.dromara.xzd.fapiaotaizhang.zengzhishui.domain.vo.TaxInfoVo;
import org.dromara.xzd.fapiaotaizhang.zengzhishui.domain.bo.TaxInfoBo;
import org.dromara.xzd.fapiaotaizhang.zengzhishui.domain.TaxInfo;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.mybatis.core.page.PageQuery;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.Collection;
import java.util.List;
/**
* 征税项目Service接口
*
* @author Lion Li
* @date 2025-10-17
*/
public interface ITaxInfoService extends IService<TaxInfo>{
/**
* 查询征税项目
*
* @param levyCode 主键
* @return 征税项目
*/
TaxInfoVo queryById(String levyCode);
/**
* 分页查询征税项目列表
*
* @param bo 查询条件
* @param pageQuery 分页参数
* @return 征税项目分页列表
*/
TableDataInfo<TaxInfoVo> queryPageList(TaxInfoBo bo, PageQuery pageQuery);
/**
* 查询符合条件的征税项目列表
*
* @param bo 查询条件
* @return 征税项目列表
*/
List<TaxInfoVo> queryList(TaxInfoBo bo);
/**
* 新增征税项目
*
* @param bo 征税项目
* @return 是否新增成功
*/
Boolean insertByBo(TaxInfoBo bo);
/**
* 修改征税项目
*
* @param bo 征税项目
* @return 是否修改成功
*/
Boolean updateByBo(TaxInfoBo bo);
/**
* 校验并批量删除征税项目信息
*
* @param ids 待删除的主键集合
* @param isValid 是否进行有效性校验
* @return 是否删除成功
*/
Boolean deleteWithValidByIds(Collection<String> ids, Boolean isValid);
}

View File

@ -0,0 +1,237 @@
package org.dromara.xzd.fapiaotaizhang.zengzhishui.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.dromara.common.core.domain.R;
import org.dromara.common.core.utils.MapstructUtils;
import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.mybatis.core.page.PageQuery;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.RequiredArgsConstructor;
import org.dromara.system.service.impl.SysOssServiceImpl;
import org.dromara.xzd.contractManagement.fenbaohetongxinxi.domain.vo.XzdSubcontractVo;
import org.dromara.xzd.contractManagement.fenbaohetongzhongzhi.domain.vo.XzdSubcontractTerminationVo;
import org.dromara.xzd.domain.*;
import org.dromara.xzd.domain.dto.QuerCorrespondentDto;
import org.dromara.xzd.fapiaotaizhang.zengzhishui.domain.TaxInfo;
import org.dromara.xzd.fapiaotaizhang.zengzhishui.domain.vo.TaxInfoVo;
import org.dromara.xzd.fapiaotaizhang.zengzhishui.service.ITaxInfoService;
import org.dromara.xzd.service.IXzdContractDetailsService;
import org.dromara.xzd.service.IXzdCorrespondentList;
import org.dromara.xzd.service.IXzdProjectService;
import org.dromara.xzd.service.impl.XzdProjectServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.dromara.xzd.fapiaotaizhang.zengzhishui.domain.bo.AppreciationInvoiceBo;
import org.dromara.xzd.fapiaotaizhang.zengzhishui.domain.vo.AppreciationInvoiceVo;
import org.dromara.xzd.fapiaotaizhang.zengzhishui.domain.AppreciationInvoice;
import org.dromara.xzd.fapiaotaizhang.zengzhishui.mapper.AppreciationInvoiceMapper;
import org.dromara.xzd.fapiaotaizhang.zengzhishui.service.IAppreciationInvoiceService;
import java.util.*;
import java.util.stream.Collectors;
/**
* 增值税发票Service业务层处理
*
* @author Lion Li
* @date 2025-10-17
*/
@RequiredArgsConstructor
@Service
public class AppreciationInvoiceServiceImpl extends ServiceImpl<AppreciationInvoiceMapper, AppreciationInvoice> implements IAppreciationInvoiceService {
private final AppreciationInvoiceMapper baseMapper;
private final IXzdProjectService xzdProjectService;
private final IXzdContractDetailsService xzdContractDetailsService;
private final ITaxInfoService iTaxInfoService;
@Autowired
private IXzdCorrespondentList iXzdCorrespondentList;
@Autowired
private SysOssServiceImpl sysOssService;
/**
* 查询增值税发票
*
* @param id 主键
* @return 增值税发票
*/
@Override
public AppreciationInvoiceVo queryById(Long id){
AppreciationInvoiceVo appreciationInvoiceVo = baseMapper.selectVoById(id);
List<AppreciationInvoiceVo> vo = List.of(appreciationInvoiceVo);
saveValue(vo);
return vo.getFirst();
}
/**
* 分页查询增值税发票列表
*
* @param bo 查询条件
* @param pageQuery 分页参数
* @return 增值税发票分页列表
*/
@Override
public TableDataInfo<AppreciationInvoiceVo> queryPageList(AppreciationInvoiceBo bo, PageQuery pageQuery) {
LambdaQueryWrapper<AppreciationInvoice> lqw = buildQueryWrapper(bo);
Page<AppreciationInvoiceVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
saveValue(result.getRecords());
return TableDataInfo.build(result);
}
private void saveValue(List<AppreciationInvoiceVo> records) {
for (AppreciationInvoiceVo item : records) {
//项目名称
if (item.getProject() != null){
String projectName = xzdProjectService.queryNameById(item.getProject());
if (projectName != null){
item.setProjectName(projectName);
}
}
// 合同
XzdContractDetails contractDetailsServiceById = xzdContractDetailsService.getById(item.getContractNo());
if(contractDetailsServiceById != null){
item.setContractNoName(contractDetailsServiceById.getContractName());
}
// 征税项目
TaxInfo taxInfoVo = iTaxInfoService.getBaseMapper().selectOne(new LambdaQueryWrapper<TaxInfo>().eq(TaxInfo::getLevyCode, item.getTaxItem()));
if (taxInfoVo != null){
item.setTaxItemName(taxInfoVo.getTaxItem());
}
//购方名称(客户信息列表)
R<QuerCorrespondentDto> byid = iXzdCorrespondentList.getCustomerByid(item.getBuyerName());
if (byid!=null){
if (byid.getData().getXzdCustomerinformation() != null){
item.setBuyerNameS(byid.getData().getXzdCustomerinformation().getUnitName());
}
}
}
}
/**
* 查询符合条件的增值税发票列表
*
* @param bo 查询条件
* @return 增值税发票列表
*/
@Override
public List<AppreciationInvoiceVo> queryList(AppreciationInvoiceBo bo) {
LambdaQueryWrapper<AppreciationInvoice> lqw = buildQueryWrapper(bo);
return baseMapper.selectVoList(lqw);
}
private LambdaQueryWrapper<AppreciationInvoice> buildQueryWrapper(AppreciationInvoiceBo bo) {
Map<String, Object> params = bo.getParams();
LambdaQueryWrapper<AppreciationInvoice> lqw = Wrappers.lambdaQuery();
lqw.orderByDesc(AppreciationInvoice::getId);
lqw.eq(StringUtils.isNotBlank(bo.getInvoiceType()), AppreciationInvoice::getInvoiceType, bo.getInvoiceType());
lqw.eq(bo.getProject() != null, AppreciationInvoice::getProject, bo.getProject());
lqw.eq(bo.getContractNo() != null, AppreciationInvoice::getContractNo, bo.getContractNo());
lqw.eq(bo.getEntryDate() != null, AppreciationInvoice::getEntryDate, bo.getEntryDate());
lqw.eq(bo.getYear() != null, AppreciationInvoice::getYear, bo.getYear());
lqw.eq(bo.getAccountingPeriod() != null, AppreciationInvoice::getAccountingPeriod, bo.getAccountingPeriod());
lqw.eq(StringUtils.isNotBlank(bo.getTaxType()), AppreciationInvoice::getTaxType, bo.getTaxType());
lqw.eq(bo.getTaxItem() != null, AppreciationInvoice::getTaxItem, bo.getTaxItem());
lqw.eq(bo.getOrganization() != null, AppreciationInvoice::getOrganization, bo.getOrganization());
lqw.eq(bo.getHandler() != null, AppreciationInvoice::getHandler, bo.getHandler());
lqw.eq(StringUtils.isNotBlank(bo.getInvoicePurpose()), AppreciationInvoice::getInvoicePurpose, bo.getInvoicePurpose());
lqw.eq(StringUtils.isNotBlank(bo.getInvoiceCode()), AppreciationInvoice::getInvoiceCode, bo.getInvoiceCode());
lqw.eq(StringUtils.isNotBlank(bo.getInvoiceNo()), AppreciationInvoice::getInvoiceNo, bo.getInvoiceNo());
lqw.eq(bo.getInvoiceDate() != null, AppreciationInvoice::getInvoiceDate, bo.getInvoiceDate());
lqw.eq(StringUtils.isNotBlank(bo.getCompanyTaxNo()), AppreciationInvoice::getCompanyTaxNo, bo.getCompanyTaxNo());
lqw.like(StringUtils.isNotBlank(bo.getCompanyName()), AppreciationInvoice::getCompanyName, bo.getCompanyName());
lqw.eq(bo.getAmount() != null, AppreciationInvoice::getAmount, bo.getAmount());
lqw.eq(bo.getTaxAmount() != null, AppreciationInvoice::getTaxAmount, bo.getTaxAmount());
lqw.eq(bo.getTaxRate() != null, AppreciationInvoice::getTaxRate, bo.getTaxRate());
lqw.eq(bo.getTotalAmount() != null, AppreciationInvoice::getTotalAmount, bo.getTotalAmount());
lqw.eq(StringUtils.isNotBlank(bo.getBuyerTaxNo()), AppreciationInvoice::getBuyerTaxNo, bo.getBuyerTaxNo());
lqw.like(bo.getBuyerName() != null, AppreciationInvoice::getBuyerName, bo.getBuyerName());
lqw.like(StringUtils.isNotBlank(bo.getBuyerTaxpayerName()), AppreciationInvoice::getBuyerTaxpayerName, bo.getBuyerTaxpayerName());
lqw.eq(StringUtils.isNotBlank(bo.getCrossTaxReport()), AppreciationInvoice::getCrossTaxReport, bo.getCrossTaxReport());
lqw.eq(bo.getPercentageCharges() != null, AppreciationInvoice::getPercentageCharges, bo.getPercentageCharges());
lqw.eq(bo.getDeductionAmount() != null, AppreciationInvoice::getDeductionAmount, bo.getDeductionAmount());
lqw.eq(StringUtils.isNotBlank(bo.getSplitFlag()), AppreciationInvoice::getSplitFlag, bo.getSplitFlag());
lqw.eq(StringUtils.isNotBlank(bo.getCheckCode()), AppreciationInvoice::getCheckCode, bo.getCheckCode());
lqw.eq(StringUtils.isNotBlank(bo.getMachineCode()), AppreciationInvoice::getMachineCode, bo.getMachineCode());
lqw.eq(StringUtils.isNotBlank(bo.getRemark1()), AppreciationInvoice::getRemark1, bo.getRemark1());
lqw.eq(StringUtils.isNotBlank(bo.getRemark2()), AppreciationInvoice::getRemark2, bo.getRemark2());
lqw.eq(StringUtils.isNotBlank(bo.getElectronicInvoiceNo()), AppreciationInvoice::getElectronicInvoiceNo, bo.getElectronicInvoiceNo());
lqw.eq(StringUtils.isNotBlank(bo.getFileId()), AppreciationInvoice::getFileId, bo.getFileId());
lqw.eq(StringUtils.isNotBlank(bo.getAuditStatus()), AppreciationInvoice::getAuditStatus, bo.getAuditStatus());
return lqw;
}
/**
* 新增增值税发票
*
* @param bo 增值税发票
* @return 是否新增成功
*/
@Override
public Boolean insertByBo(AppreciationInvoiceBo bo) {
AppreciationInvoice add = MapstructUtils.convert(bo, AppreciationInvoice.class);
validEntityBeforeSave(add);
boolean flag = baseMapper.insert(add) > 0;
if (flag) {
bo.setId(add.getId());
}
return flag;
}
/**
* 修改增值税发票
*
* @param bo 增值税发票
* @return 是否修改成功
*/
@Override
public Boolean updateByBo(AppreciationInvoiceBo bo) {
AppreciationInvoice update = MapstructUtils.convert(bo, AppreciationInvoice.class);
validEntityBeforeSave(update);
return baseMapper.updateById(update) > 0;
}
/**
* 保存前的数据校验
*/
private void validEntityBeforeSave(AppreciationInvoice entity){
//TODO 做一些数据校验,如唯一约束
}
/**
* 校验并批量删除增值税发票信息
*
* @param ids 待删除的主键集合
* @param isValid 是否进行有效性校验
* @return 是否删除成功
*/
@Override
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
if(isValid){
}
for (Long id : ids) {
AppreciationInvoiceVo vo = baseMapper.selectVoById(id);
// 删除附件
if (!StringUtils.isEmpty(vo.getFileId())){
List<Long> collect = Arrays.stream(vo.getFileId().split(",")).map(item -> {
return Long.parseLong(item);
}).collect(Collectors.toList());
sysOssService.deleteWithValidByIds(collect, false);
}
}
return baseMapper.deleteByIds(ids) > 0;
}
}

View File

@ -0,0 +1,132 @@
package org.dromara.xzd.fapiaotaizhang.zengzhishui.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.dromara.common.core.utils.MapstructUtils;
import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.mybatis.core.page.PageQuery;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.dromara.xzd.fapiaotaizhang.zengzhishui.domain.bo.TaxInfoBo;
import org.dromara.xzd.fapiaotaizhang.zengzhishui.domain.vo.TaxInfoVo;
import org.dromara.xzd.fapiaotaizhang.zengzhishui.domain.TaxInfo;
import org.dromara.xzd.fapiaotaizhang.zengzhishui.mapper.TaxInfoMapper;
import org.dromara.xzd.fapiaotaizhang.zengzhishui.service.ITaxInfoService;
import java.util.List;
import java.util.Map;
import java.util.Collection;
/**
* 征税项目Service业务层处理
*
* @author Lion Li
* @date 2025-10-17
*/
@RequiredArgsConstructor
@Service
public class TaxInfoServiceImpl extends ServiceImpl<TaxInfoMapper, TaxInfo> implements ITaxInfoService {
private final TaxInfoMapper baseMapper;
/**
* 查询征税项目
*
* @param levyCode 主键
* @return 征税项目
*/
@Override
public TaxInfoVo queryById(String levyCode){
return baseMapper.selectVoById(levyCode);
}
/**
* 分页查询征税项目列表
*
* @param bo 查询条件
* @param pageQuery 分页参数
* @return 征税项目分页列表
*/
@Override
public TableDataInfo<TaxInfoVo> queryPageList(TaxInfoBo bo, PageQuery pageQuery) {
LambdaQueryWrapper<TaxInfo> lqw = buildQueryWrapper(bo);
Page<TaxInfoVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
return TableDataInfo.build(result);
}
/**
* 查询符合条件的征税项目列表
*
* @param bo 查询条件
* @return 征税项目列表
*/
@Override
public List<TaxInfoVo> queryList(TaxInfoBo bo) {
LambdaQueryWrapper<TaxInfo> lqw = buildQueryWrapper(bo);
return baseMapper.selectVoList(lqw);
}
private LambdaQueryWrapper<TaxInfo> buildQueryWrapper(TaxInfoBo bo) {
LambdaQueryWrapper<TaxInfo> lqw = Wrappers.lambdaQuery();
lqw.eq(StringUtils.isNotBlank(bo.getLevyCode()), TaxInfo::getLevyCode, bo.getLevyCode());
lqw.eq(StringUtils.isNotBlank(bo.getLevyMethod()), TaxInfo::getLevyMethod, bo.getLevyMethod());
lqw.eq(StringUtils.isNotBlank(bo.getTaxItem()), TaxInfo::getTaxItem, bo.getTaxItem());
lqw.eq(StringUtils.isNotBlank(bo.getTaxRate()), TaxInfo::getTaxRate, bo.getTaxRate());
return lqw;
}
/**
* 新增征税项目
*
* @param bo 征税项目
* @return 是否新增成功
*/
@Override
public Boolean insertByBo(TaxInfoBo bo) {
TaxInfo add = MapstructUtils.convert(bo, TaxInfo.class);
validEntityBeforeSave(add);
boolean flag = baseMapper.insert(add) > 0;
if (flag) {
bo.setLevyCode(add.getLevyCode());
}
return flag;
}
/**
* 修改征税项目
*
* @param bo 征税项目
* @return 是否修改成功
*/
@Override
public Boolean updateByBo(TaxInfoBo bo) {
TaxInfo update = MapstructUtils.convert(bo, TaxInfo.class);
validEntityBeforeSave(update);
return baseMapper.updateById(update) > 0;
}
/**
* 保存前的数据校验
*/
private void validEntityBeforeSave(TaxInfo entity){
//TODO 做一些数据校验,如唯一约束
}
/**
* 校验并批量删除征税项目信息
*
* @param ids 待删除的主键集合
* @param isValid 是否进行有效性校验
* @return 是否删除成功
*/
@Override
public Boolean deleteWithValidByIds(Collection<String> ids, Boolean isValid) {
if(isValid){
//TODO 做一些业务上的校验,判断是否需要校验
}
return baseMapper.deleteByIds(ids) > 0;
}
}

View File

@ -67,7 +67,7 @@ public class SettlementOfSubcontractingCompletion extends BaseEntity {
/**
* 工程项目
*/
private String engineeringProject;
private Long engineeringProject;
/**
* 经营模式

View File

@ -25,13 +25,11 @@ public class SettlementOfSubcontractingCompletionBo extends BaseEntity {
/**
* 主键ID
*/
@NotNull(message = "主键ID不能为空", groups = { EditGroup.class })
private Long id;
/**
* 单据编号
*/
@NotBlank(message = "单据编号不能为空", groups = { AddGroup.class, EditGroup.class })
private String documentCode;
/**
@ -69,7 +67,7 @@ public class SettlementOfSubcontractingCompletionBo extends BaseEntity {
/**
* 工程项目
*/
private String engineeringProject;
private Long engineeringProject;
/**
* 经营模式

View File

@ -82,7 +82,13 @@ public class SettlementOfSubcontractingCompletionVo implements Serializable {
* 工程项目
*/
@ExcelProperty(value = "工程项目")
private String engineeringProject;
private Long engineeringProject;
/**
* 工程项目名称
*/
@ExcelProperty(value = "工程项目名称")
private String engineeringProjectName;
/**
* 经营模式

View File

@ -103,13 +103,13 @@ public class SettlementOfSubcontractingCompletionServiceImpl extends ServiceImpl
private void setValue(List<SettlementOfSubcontractingCompletionVo> records) {
for (SettlementOfSubcontractingCompletionVo item : records) {
// //项目名称
// if (item.getProject() != null){
// String projectName = xzdProjectService.queryNameById(item.getProject());
// if (projectName != null){
// item.setProjectName(projectName);
// }
// }
//项目名称
if (item.getEngineeringProject() != null){
String projectName = xzdProjectService.queryNameById(item.getEngineeringProject());
if (projectName != null){
item.setEngineeringProjectName(projectName);
}
}
//甲方单位(客户信息列表)
R<QuerCorrespondentDto> byid = iXzdCorrespondentList.getCustomerByid(item.getPartyAUnit());
if (byid!=null){
@ -194,7 +194,7 @@ public class SettlementOfSubcontractingCompletionServiceImpl extends ServiceImpl
lqw.like(StringUtils.isNotBlank(bo.getContractName()), SettlementOfSubcontractingCompletion::getContractName, bo.getContractName());
lqw.eq(bo.getApprovedTotalPrice() != null, SettlementOfSubcontractingCompletion::getApprovedTotalPrice, bo.getApprovedTotalPrice());
lqw.eq(bo.getApprovedDate() != null, SettlementOfSubcontractingCompletion::getApprovedDate, bo.getApprovedDate());
lqw.eq(StringUtils.isNotBlank(bo.getEngineeringProject()), SettlementOfSubcontractingCompletion::getEngineeringProject, bo.getEngineeringProject());
lqw.eq(bo.getEngineeringProject() != null, SettlementOfSubcontractingCompletion::getEngineeringProject, bo.getEngineeringProject());
lqw.eq(StringUtils.isNotBlank(bo.getBusinessModel()), SettlementOfSubcontractingCompletion::getBusinessModel, bo.getBusinessModel());
lqw.eq(bo.getPartyAUnit() != null, SettlementOfSubcontractingCompletion::getPartyAUnit, bo.getPartyAUnit());
lqw.eq(bo.getPartyBUnit() != null, SettlementOfSubcontractingCompletion::getPartyBUnit, bo.getPartyBUnit());

View File

@ -0,0 +1,106 @@
package org.dromara.xzd.zijinjihua.controller;
import java.util.List;
import lombok.RequiredArgsConstructor;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.constraints.*;
import cn.dev33.satoken.annotation.SaCheckPermission;
import org.dromara.xzd.zijinjihua.domain.bo.CbsTreeStructureBo;
import org.dromara.xzd.zijinjihua.domain.vo.CbsTreeStructureVo;
import org.dromara.xzd.zijinjihua.service.ICbsTreeStructureService;
import org.springframework.web.bind.annotation.*;
import org.springframework.validation.annotation.Validated;
import org.dromara.common.idempotent.annotation.RepeatSubmit;
import org.dromara.common.log.annotation.Log;
import org.dromara.common.web.core.BaseController;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.core.domain.R;
import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.core.validate.EditGroup;
import org.dromara.common.log.enums.BusinessType;
import org.dromara.common.excel.utils.ExcelUtil;
/**
* cbs树形结构
*
* @author Lion Li
* @date 2025-10-16
*/
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/system/treeStructure")
public class CbsTreeStructureController extends BaseController {
private final ICbsTreeStructureService cbsTreeStructureService;
/**
* 查询cbs树形结构列表
*/
@SaCheckPermission("system:treeStructure:list")
@GetMapping("/list")
public R<List<CbsTreeStructureVo>> list(CbsTreeStructureBo bo) {
List<CbsTreeStructureVo> list = cbsTreeStructureService.queryList(bo);
return R.ok(list);
}
/**
* 导出cbs树形结构列表
*/
@SaCheckPermission("system:treeStructure:export")
@Log(title = "cbs树形结构", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(CbsTreeStructureBo bo, HttpServletResponse response) {
List<CbsTreeStructureVo> list = cbsTreeStructureService.queryList(bo);
ExcelUtil.exportExcel(list, "cbs树形结构", CbsTreeStructureVo.class, response);
}
/**
* 获取cbs树形结构详细信息
*
* @param id 主键
*/
@SaCheckPermission("system:treeStructure:query")
@GetMapping("/{id}")
public R<CbsTreeStructureVo> getInfo(@NotNull(message = "主键不能为空")
@PathVariable Long id) {
return R.ok(cbsTreeStructureService.queryById(id));
}
/**
* 新增cbs树形结构
*/
@SaCheckPermission("system:treeStructure:add")
@Log(title = "cbs树形结构", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping()
public R<Void> add(@Validated(AddGroup.class) @RequestBody CbsTreeStructureBo bo) {
return toAjax(cbsTreeStructureService.insertByBo(bo));
}
/**
* 修改cbs树形结构
*/
@SaCheckPermission("system:treeStructure:edit")
@Log(title = "cbs树形结构", businessType = BusinessType.UPDATE)
@RepeatSubmit()
@PutMapping()
public R<Void> edit(@Validated(EditGroup.class) @RequestBody CbsTreeStructureBo bo) {
return toAjax(cbsTreeStructureService.updateByBo(bo));
}
/**
* 删除cbs树形结构
*
* @param ids 主键串
*/
@SaCheckPermission("system:treeStructure:remove")
@Log(title = "cbs树形结构", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}")
public R<Void> remove(@NotEmpty(message = "主键不能为空")
@PathVariable Long[] ids) {
return toAjax(cbsTreeStructureService.deleteWithValidByIds(List.of(ids), true));
}
}

View File

@ -0,0 +1,50 @@
package org.dromara.xzd.zijinjihua.domain;
import org.dromara.common.mybatis.core.domain.BaseEntity;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serial;
/**
* cbs树形结构对象 cbs_tree_structure
*
* @author Lion Li
* @date 2025-10-16
*/
@Data
@TableName("cbs_tree_structure")
public class CbsTreeStructure {
@Serial
private static final long serialVersionUID = 1L;
/**
* 节点ID无默认值业务层自行赋值
*/
@TableId(value = "id")
private Long id;
/**
* 父节点ID为空表示根节点
*/
private Long parentId;
/**
* 节点名称
*/
private String name;
/**
* 节点排序,用于同级节点的显示顺序
*/
private Long sortOrder;
/**
* 节点描述
*/
private String description;
}

View File

@ -0,0 +1,50 @@
package org.dromara.xzd.zijinjihua.domain.bo;
import org.dromara.common.mybatis.core.domain.BaseEntity;
import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.core.validate.EditGroup;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import lombok.EqualsAndHashCode;
import jakarta.validation.constraints.*;
import org.dromara.xzd.zijinjihua.domain.CbsTreeStructure;
/**
* cbs树形结构业务对象 cbs_tree_structure
*
* @author Lion Li
* @date 2025-10-16
*/
@Data
@AutoMapper(target = CbsTreeStructure.class, reverseConvertGenerate = false)
public class CbsTreeStructureBo {
/**
* 节点ID无默认值业务层自行赋值
*/
@NotNull(message = "节点ID无默认值业务层自行赋值不能为空", groups = { EditGroup.class })
private Long id;
/**
* 父节点ID为空表示根节点
*/
private Long parentId;
/**
* 节点名称
*/
@NotBlank(message = "节点名称不能为空", groups = { AddGroup.class, EditGroup.class })
private String name;
/**
* 节点排序,用于同级节点的显示顺序
*/
private Long sortOrder;
/**
* 节点描述
*/
private String description;
}

View File

@ -0,0 +1,62 @@
package org.dromara.xzd.zijinjihua.domain.vo;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import org.dromara.common.excel.annotation.ExcelDictFormat;
import org.dromara.common.excel.convert.ExcelDictConvert;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import org.dromara.xzd.zijinjihua.domain.CbsTreeStructure;
import java.io.Serial;
import java.io.Serializable;
import java.util.Date;
/**
* cbs树形结构视图对象 cbs_tree_structure
*
* @author Lion Li
* @date 2025-10-16
*/
@Data
@ExcelIgnoreUnannotated
@AutoMapper(target = CbsTreeStructure.class)
public class CbsTreeStructureVo implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 节点ID无默认值业务层自行赋值
*/
@ExcelProperty(value = "节点ID无默认值业务层自行赋值")
private Long id;
/**
* 父节点ID为空表示根节点
*/
@ExcelProperty(value = "父节点ID为空表示根节点")
private Long parentId;
/**
* 节点名称
*/
@ExcelProperty(value = "节点名称")
private String name;
/**
* 节点排序,用于同级节点的显示顺序
*/
@ExcelProperty(value = "节点排序,用于同级节点的显示顺序")
private Long sortOrder;
/**
* 节点描述
*/
@ExcelProperty(value = "节点描述")
private String description;
}

View File

@ -0,0 +1,16 @@
package org.dromara.xzd.zijinjihua.mapper;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
import org.dromara.xzd.zijinjihua.domain.CbsTreeStructure;
import org.dromara.xzd.zijinjihua.domain.vo.CbsTreeStructureVo;
/**
* cbs树形结构Mapper接口
*
* @author Lion Li
* @date 2025-10-16
*/
public interface CbsTreeStructureMapper extends BaseMapperPlus<CbsTreeStructure, CbsTreeStructureVo> {
}

View File

@ -0,0 +1,62 @@
package org.dromara.xzd.zijinjihua.service;
import com.baomidou.mybatisplus.extension.service.IService;
import org.dromara.xzd.zijinjihua.domain.CbsTreeStructure;
import org.dromara.xzd.zijinjihua.domain.bo.CbsTreeStructureBo;
import org.dromara.xzd.zijinjihua.domain.vo.CbsTreeStructureVo;
import java.util.Collection;
import java.util.List;
/**
* cbs树形结构Service接口
*
* @author Lion Li
* @date 2025-10-16
*/
public interface ICbsTreeStructureService extends IService<CbsTreeStructure>{
/**
* 查询cbs树形结构
*
* @param id 主键
* @return cbs树形结构
*/
CbsTreeStructureVo queryById(Long id);
/**
* 查询符合条件的cbs树形结构列表
*
* @param bo 查询条件
* @return cbs树形结构列表
*/
List<CbsTreeStructureVo> queryList(CbsTreeStructureBo bo);
/**
* 新增cbs树形结构
*
* @param bo cbs树形结构
* @return 是否新增成功
*/
Boolean insertByBo(CbsTreeStructureBo bo);
/**
* 修改cbs树形结构
*
* @param bo cbs树形结构
* @return 是否修改成功
*/
Boolean updateByBo(CbsTreeStructureBo bo);
/**
* 校验并批量删除cbs树形结构信息
*
* @param ids 待删除的主键集合
* @param isValid 是否进行有效性校验
* @return 是否删除成功
*/
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
}

View File

@ -0,0 +1,118 @@
package org.dromara.xzd.zijinjihua.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.dromara.common.core.utils.MapstructUtils;
import org.dromara.common.core.utils.StringUtils;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.RequiredArgsConstructor;
import org.dromara.xzd.zijinjihua.domain.CbsTreeStructure;
import org.dromara.xzd.zijinjihua.domain.bo.CbsTreeStructureBo;
import org.dromara.xzd.zijinjihua.domain.vo.CbsTreeStructureVo;
import org.dromara.xzd.zijinjihua.mapper.CbsTreeStructureMapper;
import org.dromara.xzd.zijinjihua.service.ICbsTreeStructureService;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Map;
import java.util.Collection;
/**
* cbs树形结构Service业务层处理
*
* @author Lion Li
* @date 2025-10-16
*/
@RequiredArgsConstructor
@Service
public class CbsTreeStructureServiceImpl extends ServiceImpl<CbsTreeStructureMapper, CbsTreeStructure> implements ICbsTreeStructureService {
private final CbsTreeStructureMapper baseMapper;
/**
* 查询cbs树形结构
*
* @param id 主键
* @return cbs树形结构
*/
@Override
public CbsTreeStructureVo queryById(Long id){
return baseMapper.selectVoById(id);
}
/**
* 查询符合条件的cbs树形结构列表
*
* @param bo 查询条件
* @return cbs树形结构列表
*/
@Override
public List<CbsTreeStructureVo> queryList(CbsTreeStructureBo bo) {
LambdaQueryWrapper<CbsTreeStructure> lqw = buildQueryWrapper(bo);
return baseMapper.selectVoList(lqw);
}
private LambdaQueryWrapper<CbsTreeStructure> buildQueryWrapper(CbsTreeStructureBo bo) {
LambdaQueryWrapper<CbsTreeStructure> lqw = Wrappers.lambdaQuery();
lqw.orderByDesc(CbsTreeStructure::getId);
lqw.eq(bo.getParentId() != null, CbsTreeStructure::getParentId, bo.getParentId());
lqw.like(StringUtils.isNotBlank(bo.getName()), CbsTreeStructure::getName, bo.getName());
lqw.eq(bo.getSortOrder() != null, CbsTreeStructure::getSortOrder, bo.getSortOrder());
lqw.eq(StringUtils.isNotBlank(bo.getDescription()), CbsTreeStructure::getDescription, bo.getDescription());
return lqw;
}
/**
* 新增cbs树形结构
*
* @param bo cbs树形结构
* @return 是否新增成功
*/
@Override
public Boolean insertByBo(CbsTreeStructureBo bo) {
CbsTreeStructure add = MapstructUtils.convert(bo, CbsTreeStructure.class);
validEntityBeforeSave(add);
boolean flag = baseMapper.insert(add) > 0;
if (flag) {
bo.setId(add.getId());
}
return flag;
}
/**
* 修改cbs树形结构
*
* @param bo cbs树形结构
* @return 是否修改成功
*/
@Override
public Boolean updateByBo(CbsTreeStructureBo bo) {
CbsTreeStructure update = MapstructUtils.convert(bo, CbsTreeStructure.class);
validEntityBeforeSave(update);
return baseMapper.updateById(update) > 0;
}
/**
* 保存前的数据校验
*/
private void validEntityBeforeSave(CbsTreeStructure entity){
//TODO 做一些数据校验,如唯一约束
}
/**
* 校验并批量删除cbs树形结构信息
*
* @param ids 待删除的主键集合
* @param isValid 是否进行有效性校验
* @return 是否删除成功
*/
@Override
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
if(isValid){
//TODO 做一些业务上的校验,判断是否需要校验
}
return baseMapper.deleteByIds(ids) > 0;
}
}

View File

@ -0,0 +1,106 @@
package org.dromara.xzd.zijinjihua.yueduzijinbiangeng.controller;
import java.util.List;
import cn.dev33.satoken.annotation.SaCheckPermission;
import lombok.RequiredArgsConstructor;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.constraints.*;
import org.springframework.web.bind.annotation.*;
import org.springframework.validation.annotation.Validated;
import org.dromara.common.idempotent.annotation.RepeatSubmit;
import org.dromara.common.log.annotation.Log;
import org.dromara.common.web.core.BaseController;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.core.domain.R;
import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.core.validate.EditGroup;
import org.dromara.common.log.enums.BusinessType;
import org.dromara.common.excel.utils.ExcelUtil;
import org.dromara.xzd.zijinjihua.yueduzijinbiangeng.domain.vo.FinancialRevenuePlanAlterationVo;
import org.dromara.xzd.zijinjihua.yueduzijinbiangeng.domain.bo.FinancialRevenuePlanAlterationBo;
import org.dromara.xzd.zijinjihua.yueduzijinbiangeng.service.IFinancialRevenuePlanAlterationService;
import org.dromara.common.mybatis.core.page.TableDataInfo;
/**
* 月度资金计划变更
*
* @author Lion Li
* @date 2025-10-16
*/
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/yueduzijinbiangeng/revenuePlanAlteration")
public class FinancialRevenuePlanAlterationController extends BaseController {
private final IFinancialRevenuePlanAlterationService financialRevenuePlanAlterationService;
/**
* 查询月度资金计划变更列表
*/
@SaCheckPermission("yueduzijinbiangeng:revenuePlanAlteration:list")
@GetMapping("/list")
public TableDataInfo<FinancialRevenuePlanAlterationVo> list(FinancialRevenuePlanAlterationBo bo, PageQuery pageQuery) {
return financialRevenuePlanAlterationService.queryPageList(bo, pageQuery);
}
/**
* 导出月度资金计划变更列表
*/
@SaCheckPermission("yueduzijinbiangeng:revenuePlanAlteration:export")
@Log(title = "月度资金计划变更", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(FinancialRevenuePlanAlterationBo bo, HttpServletResponse response) {
List<FinancialRevenuePlanAlterationVo> list = financialRevenuePlanAlterationService.queryList(bo);
ExcelUtil.exportExcel(list, "月度资金计划变更", FinancialRevenuePlanAlterationVo.class, response);
}
/**
* 获取月度资金计划变更详细信息
*
* @param id 主键
*/
@SaCheckPermission("yueduzijinbiangeng:revenuePlanAlteration:query")
@GetMapping("/{id}")
public R<FinancialRevenuePlanAlterationVo> getInfo(@NotNull(message = "主键不能为空")
@PathVariable Long id) {
return R.ok(financialRevenuePlanAlterationService.queryById(id));
}
/**
* 新增月度资金计划变更
*/
@SaCheckPermission("yueduzijinbiangeng:revenuePlanAlteration:add")
@Log(title = "月度资金计划变更", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping()
public R<Void> add(@Validated(AddGroup.class) @RequestBody FinancialRevenuePlanAlterationBo bo) {
return toAjax(financialRevenuePlanAlterationService.insertByBo(bo));
}
/**
* 修改月度资金计划变更
*/
@SaCheckPermission("yueduzijinbiangeng:revenuePlanAlteration:edit")
@Log(title = "月度资金计划变更", businessType = BusinessType.UPDATE)
@RepeatSubmit()
@PutMapping()
public R<Void> edit(@Validated(EditGroup.class) @RequestBody FinancialRevenuePlanAlterationBo bo) {
return toAjax(financialRevenuePlanAlterationService.updateByBo(bo));
}
/**
* 删除月度资金计划变更
*
* @param ids 主键串
*/
@SaCheckPermission("yueduzijinbiangeng:revenuePlanAlteration:remove")
@Log(title = "月度资金计划变更", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}")
public R<Void> remove(@NotEmpty(message = "主键不能为空")
@PathVariable Long[] ids) {
return toAjax(financialRevenuePlanAlterationService.deleteWithValidByIds(List.of(ids), true));
}
}

View File

@ -0,0 +1,103 @@
package org.dromara.xzd.zijinjihua.yueduzijinbiangeng.domain;
import org.dromara.common.mybatis.core.domain.BaseEntity;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.math.BigDecimal;
import java.io.Serial;
import java.time.LocalDate;
/**
* 月度资金计划变更对象 financial_revenue_plan_alteration
*
* @author Lion Li
* @date 2025-10-16
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("financial_revenue_plan_alteration")
public class FinancialRevenuePlanAlteration extends BaseEntity {
@Serial
private static final long serialVersionUID = 1L;
/**
*
*/
@TableId(value = "id")
private Long id;
/**
* 单据编码
*/
private String documentCode;
/**
* 单据名称
*/
private String documentName;
/**
* 项目
*/
private Long project;
/**
* 计划类型
*/
private String planType;
/**
* 工作周期
*/
private String workCycle;
/**
* 开始日期
*/
private LocalDate startDate;
/**
* 结束日期
*/
private LocalDate endDate;
/**
* 支出总额
*/
private BigDecimal expenseTotal;
/**
* 收入总额
*/
private BigDecimal incomeTotal;
/**
* 是否临时计划 正常计划,临时计划
*/
private String isTemporaryPlan;
/**
* 备注
*/
private String remarks;
/**
* 文件ID
*/
private String fileId;
/**
* 备注
*/
private String remark;
/**
* 审核状态
*/
private String auditStatus;
}

View File

@ -0,0 +1,119 @@
package org.dromara.xzd.zijinjihua.yueduzijinbiangeng.domain.bo;
import org.dromara.xzd.zijinjihua.yueduzijinbiangeng.domain.FinancialRevenuePlanAlteration;
import org.dromara.common.mybatis.core.domain.BaseEntity;
import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.core.validate.EditGroup;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import lombok.EqualsAndHashCode;
import jakarta.validation.constraints.*;
import org.dromara.xzd.zijinjihua.yueduzijinjihua.domain.bo.DetailOfEarningsBo;
import org.dromara.xzd.zijinjihua.yueduzijinjihua.domain.bo.StatementOfExpendituresBo;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.List;
/**
* 月度资金计划变更业务对象 financial_revenue_plan_alteration
*
* @author Lion Li
* @date 2025-10-16
*/
@Data
@EqualsAndHashCode(callSuper = true)
@AutoMapper(target = FinancialRevenuePlanAlteration.class, reverseConvertGenerate = false)
public class FinancialRevenuePlanAlterationBo extends BaseEntity {
/**
*
*/
private Long id;
/**
* 单据编码
*/
private String documentCode;
/**
* 单据名称
*/
private String documentName;
/**
* 项目
*/
@NotNull(message = "项目不能为空", groups = { AddGroup.class, EditGroup.class })
private Long project;
/**
* 计划类型
*/
private String planType;
/**
* 工作周期
*/
private String workCycle;
/**
* 开始日期
*/
@NotNull(message = "开始日期不能为空", groups = { AddGroup.class, EditGroup.class })
private LocalDate startDate;
/**
* 结束日期
*/
@NotNull(message = "结束日期不能为空", groups = { AddGroup.class, EditGroup.class })
private LocalDate endDate;
/**
* 支出总额
*/
private BigDecimal expenseTotal;
/**
* 收入总额
*/
private BigDecimal incomeTotal;
/**
* 是否临时计划 正常计划,临时计划
*/
@NotBlank(message = "是否临时计划 正常计划,临时计划不能为空", groups = { AddGroup.class, EditGroup.class })
private String isTemporaryPlan;
/**
* 备注
*/
private String remarks;
/**
* 文件ID
*/
private String fileId;
/**
* 备注
*/
private String remark;
/**
* 审核状态
*/
private String auditStatus;
/**
* 收入明细
*/
private List<DetailOfEarningsBo> detailOfEarnings;
/**
* 支出明细
*/
private List<StatementOfExpendituresBo> statementOfExpenditures;
}

View File

@ -0,0 +1,170 @@
package org.dromara.xzd.zijinjihua.yueduzijinbiangeng.domain.vo;
import java.math.BigDecimal;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import org.dromara.common.translation.annotation.Translation;
import org.dromara.common.translation.constant.TransConstant;
import org.dromara.xzd.zijinjihua.yueduzijinbiangeng.domain.FinancialRevenuePlanAlteration;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import org.dromara.common.excel.annotation.ExcelDictFormat;
import org.dromara.common.excel.convert.ExcelDictConvert;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import org.dromara.xzd.zijinjihua.yueduzijinjihua.domain.vo.DetailOfEarningsVo;
import org.dromara.xzd.zijinjihua.yueduzijinjihua.domain.vo.StatementOfExpendituresVo;
import java.io.Serial;
import java.io.Serializable;
import java.time.LocalDate;
import java.util.Date;
import java.util.List;
/**
* 月度资金计划变更视图对象 financial_revenue_plan_alteration
*
* @author Lion Li
* @date 2025-10-16
*/
@Data
@ExcelIgnoreUnannotated
@AutoMapper(target = FinancialRevenuePlanAlteration.class)
public class FinancialRevenuePlanAlterationVo implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
*
*/
@ExcelProperty(value = "")
private Long id;
/**
* 单据编码
*/
@ExcelProperty(value = "单据编码")
private String documentCode;
/**
* 单据名称
*/
@ExcelProperty(value = "单据名称")
private String documentName;
/**
* 项目
*/
@ExcelProperty(value = "项目")
private Long project;
/**
* 项目名称
*/
@ExcelProperty(value = "项目")
private String projectName;
/**
* 计划类型
*/
@ExcelProperty(value = "计划类型")
private String planType;
/**
* 工作周期
*/
@ExcelProperty(value = "工作周期")
private String workCycle;
/**
* 开始日期
*/
@ExcelProperty(value = "开始日期")
private LocalDate startDate;
/**
* 结束日期
*/
@ExcelProperty(value = "结束日期")
private LocalDate endDate;
/**
* 支出总额
*/
@ExcelProperty(value = "支出总额")
private BigDecimal expenseTotal;
/**
* 收入总额
*/
@ExcelProperty(value = "收入总额")
private BigDecimal incomeTotal;
/**
* 是否临时计划 正常计划,临时计划
*/
@ExcelProperty(value = "是否临时计划 正常计划,临时计划")
private String isTemporaryPlan;
/**
* 备注
*/
@ExcelProperty(value = "备注")
private String remarks;
/**
* 文件ID
*/
@ExcelProperty(value = "文件ID")
private String fileId;
/**
* 备注
*/
@ExcelProperty(value = "备注")
private String remark;
/**
* 审核状态
*/
@ExcelProperty(value = "审核状态")
private String auditStatus;
/**
* 创建部门
*/
@TableField(fill = FieldFill.INSERT)
private Long createDept;
@ExcelProperty(value = "创建部门名称")
@Translation(type = TransConstant.DEPT_ID_TO_NAME, mapper = "createDept")
private String createDeptName;
/**
* 创建者
*/
@ExcelProperty(value = "创建者")
@TableField(fill = FieldFill.INSERT)
private Long createBy;
@ExcelProperty(value = "创建者名称")
@Translation(type = TransConstant.USER_ID_TO_NICKNAME, mapper = "createBy")
private String createByName;
/**
* 收入明细
*/
private List<DetailOfEarningsVo> detailOfEarnings;
/**
* 支出明细
*/
private List<StatementOfExpendituresVo> statementOfExpenditures;
}

View File

@ -0,0 +1,15 @@
package org.dromara.xzd.zijinjihua.yueduzijinbiangeng.mapper;
import org.dromara.xzd.zijinjihua.yueduzijinbiangeng.domain.FinancialRevenuePlanAlteration;
import org.dromara.xzd.zijinjihua.yueduzijinbiangeng.domain.vo.FinancialRevenuePlanAlterationVo;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
/**
* 月度资金计划变更Mapper接口
*
* @author Lion Li
* @date 2025-10-16
*/
public interface FinancialRevenuePlanAlterationMapper extends BaseMapperPlus<FinancialRevenuePlanAlteration, FinancialRevenuePlanAlterationVo> {
}

View File

@ -0,0 +1,70 @@
package org.dromara.xzd.zijinjihua.yueduzijinbiangeng.service;
import org.dromara.xzd.zijinjihua.yueduzijinbiangeng.domain.vo.FinancialRevenuePlanAlterationVo;
import org.dromara.xzd.zijinjihua.yueduzijinbiangeng.domain.bo.FinancialRevenuePlanAlterationBo;
import org.dromara.xzd.zijinjihua.yueduzijinbiangeng.domain.FinancialRevenuePlanAlteration;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.mybatis.core.page.PageQuery;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.Collection;
import java.util.List;
/**
* 月度资金计划变更Service接口
*
* @author Lion Li
* @date 2025-10-16
*/
public interface IFinancialRevenuePlanAlterationService extends IService<FinancialRevenuePlanAlteration>{
/**
* 查询月度资金计划变更
*
* @param id 主键
* @return 月度资金计划变更
*/
FinancialRevenuePlanAlterationVo queryById(Long id);
/**
* 分页查询月度资金计划变更列表
*
* @param bo 查询条件
* @param pageQuery 分页参数
* @return 月度资金计划变更分页列表
*/
TableDataInfo<FinancialRevenuePlanAlterationVo> queryPageList(FinancialRevenuePlanAlterationBo bo, PageQuery pageQuery);
/**
* 查询符合条件的月度资金计划变更列表
*
* @param bo 查询条件
* @return 月度资金计划变更列表
*/
List<FinancialRevenuePlanAlterationVo> queryList(FinancialRevenuePlanAlterationBo bo);
/**
* 新增月度资金计划变更
*
* @param bo 月度资金计划变更
* @return 是否新增成功
*/
Boolean insertByBo(FinancialRevenuePlanAlterationBo bo);
/**
* 修改月度资金计划变更
*
* @param bo 月度资金计划变更
* @return 是否修改成功
*/
Boolean updateByBo(FinancialRevenuePlanAlterationBo bo);
/**
* 校验并批量删除月度资金计划变更信息
*
* @param ids 待删除的主键集合
* @param isValid 是否进行有效性校验
* @return 是否删除成功
*/
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
}

View File

@ -0,0 +1,326 @@
package org.dromara.xzd.zijinjihua.yueduzijinbiangeng.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.dromara.common.core.domain.R;
import org.dromara.common.core.utils.MapstructUtils;
import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.mybatis.core.page.PageQuery;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.RequiredArgsConstructor;
import org.dromara.system.service.impl.SysOssServiceImpl;
import org.dromara.xzd.domain.XzdContractDetails;
import org.dromara.xzd.domain.dto.QuerCorrespondentDto;
import org.dromara.xzd.service.IXzdContractDetailsService;
import org.dromara.xzd.service.IXzdCorrespondentList;
import org.dromara.xzd.service.impl.XzdProjectServiceImpl;
import org.dromara.xzd.service.impl.XzdSupplierInfoServiceImpl;
import org.dromara.xzd.utilS.AreaUtil;
import org.dromara.xzd.zijinjihua.service.ICbsTreeStructureService;
import org.dromara.xzd.zijinjihua.yueduzijinjihua.domain.DetailOfEarnings;
import org.dromara.xzd.zijinjihua.yueduzijinjihua.domain.FinancialRevenueExpenditurePlan;
import org.dromara.xzd.zijinjihua.yueduzijinjihua.domain.StatementOfExpenditures;
import org.dromara.xzd.zijinjihua.yueduzijinjihua.domain.bo.DetailOfEarningsBo;
import org.dromara.xzd.zijinjihua.yueduzijinjihua.domain.bo.StatementOfExpendituresBo;
import org.dromara.xzd.zijinjihua.yueduzijinjihua.domain.vo.DetailOfEarningsVo;
import org.dromara.xzd.zijinjihua.yueduzijinjihua.domain.vo.FinancialRevenueExpenditurePlanVo;
import org.dromara.xzd.zijinjihua.yueduzijinjihua.domain.vo.StatementOfExpendituresVo;
import org.dromara.xzd.zijinjihua.yueduzijinjihua.service.IDetailOfEarningsService;
import org.dromara.xzd.zijinjihua.yueduzijinjihua.service.IStatementOfExpendituresService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.dromara.xzd.zijinjihua.yueduzijinbiangeng.domain.bo.FinancialRevenuePlanAlterationBo;
import org.dromara.xzd.zijinjihua.yueduzijinbiangeng.domain.vo.FinancialRevenuePlanAlterationVo;
import org.dromara.xzd.zijinjihua.yueduzijinbiangeng.domain.FinancialRevenuePlanAlteration;
import org.dromara.xzd.zijinjihua.yueduzijinbiangeng.mapper.FinancialRevenuePlanAlterationMapper;
import org.dromara.xzd.zijinjihua.yueduzijinbiangeng.service.IFinancialRevenuePlanAlterationService;
import org.springframework.transaction.annotation.Transactional;
import java.time.LocalDate;
import java.util.*;
import java.util.stream.Collectors;
/**
* 月度资金计划变更Service业务层处理
*
* @author Lion Li
* @date 2025-10-16
*/
@RequiredArgsConstructor
@Service
public class FinancialRevenuePlanAlterationServiceImpl extends ServiceImpl<FinancialRevenuePlanAlterationMapper, FinancialRevenuePlanAlteration> implements IFinancialRevenuePlanAlterationService {
private final FinancialRevenuePlanAlterationMapper baseMapper;
private final AreaUtil areaUtil;
private final IDetailOfEarningsService iDetailOfEarningsService;
private final ICbsTreeStructureService iCbsTreeStructureService;
private final IStatementOfExpendituresService iStatementOfExpendituresService;
private final IXzdContractDetailsService xzdContractDetailsService;
@Autowired
private XzdProjectServiceImpl xzdProjectService;
@Autowired
private IXzdCorrespondentList iXzdCorrespondentList;
@Autowired
private XzdSupplierInfoServiceImpl xzdSupplierInfoService;
@Autowired
private SysOssServiceImpl sysOssService;
/**
* 查询月度资金计划变更
*
* @param id 主键
* @return 月度资金计划变更
*/
@Override
public FinancialRevenuePlanAlterationVo queryById(Long id){
FinancialRevenuePlanAlterationVo financialRevenuePlanAlterationVo = baseMapper.selectVoById(id);
List<FinancialRevenuePlanAlterationVo> vo = List.of(financialRevenuePlanAlterationVo);
savaValue(vo,true);
return vo.getFirst();
}
/**
* 分页查询月度资金计划变更列表
*
* @param bo 查询条件
* @param pageQuery 分页参数
* @return 月度资金计划变更分页列表
*/
@Override
public TableDataInfo<FinancialRevenuePlanAlterationVo> queryPageList(FinancialRevenuePlanAlterationBo bo, PageQuery pageQuery) {
LambdaQueryWrapper<FinancialRevenuePlanAlteration> lqw = buildQueryWrapper(bo);
Page<FinancialRevenuePlanAlterationVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
savaValue(result.getRecords(),false);
return TableDataInfo.build(result);
}
private void savaValue(List<FinancialRevenuePlanAlterationVo> records, boolean type) {
for (FinancialRevenuePlanAlterationVo item : records) {
//项目名称
if (item.getProject() != null){
String projectName = xzdProjectService.queryNameById(item.getProject());
if (projectName != null){
item.setProjectName(projectName);
}
}
HashMap<String, Object> hashMap = new HashMap<>();
hashMap.put("financial_revenue_id",item.getId());
// 收入
List<DetailOfEarnings> detail = iDetailOfEarningsService.getBaseMapper().selectByMap(hashMap);
if (detail != null && detail.size() > 0){
List<DetailOfEarningsVo> convert = MapstructUtils.convert(detail, DetailOfEarningsVo.class);
if (type){
convert.forEach(temp ->{
//甲方单位(客户信息列表)
R<QuerCorrespondentDto> byid = iXzdCorrespondentList.getCustomerByid(temp.getPartyAUnit());
if (byid!=null){
if (byid.getData().getXzdCustomerinformation() != null){
temp.setPartyAUnitName(byid.getData().getXzdCustomerinformation().getUnitName());
}
}
// cbs
Long cbs = temp.getCbs();
if (cbs != null){
String name = iCbsTreeStructureService.queryById(cbs).getName();
temp.setCbsName(name);
}
// 合同
XzdContractDetails contractDetailsServiceById = xzdContractDetailsService.getById(temp.getContractCode());
if(contractDetailsServiceById != null){
temp.setContractCodeName(contractDetailsServiceById.getContractCode());
}
});
}
item.setDetailOfEarnings(convert);
}
// 支出
List<StatementOfExpenditures> statementOfExpenditures = iStatementOfExpendituresService.getBaseMapper().selectByMap(hashMap);
if (statementOfExpenditures != null && statementOfExpenditures.size() > 0){
List<StatementOfExpendituresVo> convert = MapstructUtils.convert(statementOfExpenditures, StatementOfExpendituresVo.class);
if (type){
convert.forEach(temp ->{
//供应商 supplier
String unitName = xzdSupplierInfoService.queryNameById(temp.getSupplier());
if (StringUtils.isNotBlank(unitName)){
temp.setSupplierName(unitName);
}
Long cbs = temp.getCbs();
if (cbs != null){
String name = iCbsTreeStructureService.queryById(cbs).getName();
temp.setCbsName(name);
}
// 合同
XzdContractDetails contractDetailsServiceById = xzdContractDetailsService.getById(temp.getContractCode());
if(contractDetailsServiceById != null){
temp.setContractCodeName(contractDetailsServiceById.getContractCode());
}
});
}
item.setStatementOfExpenditures(convert);
}
}
}
/**
* 查询符合条件的月度资金计划变更列表
*
* @param bo 查询条件
* @return 月度资金计划变更列表
*/
@Override
public List<FinancialRevenuePlanAlterationVo> queryList(FinancialRevenuePlanAlterationBo bo) {
LambdaQueryWrapper<FinancialRevenuePlanAlteration> lqw = buildQueryWrapper(bo);
return baseMapper.selectVoList(lqw);
}
private LambdaQueryWrapper<FinancialRevenuePlanAlteration> buildQueryWrapper(FinancialRevenuePlanAlterationBo bo) {
Map<String, Object> params = bo.getParams();
LambdaQueryWrapper<FinancialRevenuePlanAlteration> lqw = Wrappers.lambdaQuery();
lqw.orderByDesc(FinancialRevenuePlanAlteration::getId);
lqw.eq(StringUtils.isNotBlank(bo.getDocumentCode()), FinancialRevenuePlanAlteration::getDocumentCode, bo.getDocumentCode());
lqw.like(StringUtils.isNotBlank(bo.getDocumentName()), FinancialRevenuePlanAlteration::getDocumentName, bo.getDocumentName());
lqw.eq(bo.getProject() != null, FinancialRevenuePlanAlteration::getProject, bo.getProject());
lqw.eq(StringUtils.isNotBlank(bo.getPlanType()), FinancialRevenuePlanAlteration::getPlanType, bo.getPlanType());
lqw.eq(StringUtils.isNotBlank(bo.getWorkCycle()), FinancialRevenuePlanAlteration::getWorkCycle, bo.getWorkCycle());
lqw.eq(bo.getStartDate() != null, FinancialRevenuePlanAlteration::getStartDate, bo.getStartDate());
lqw.eq(bo.getEndDate() != null, FinancialRevenuePlanAlteration::getEndDate, bo.getEndDate());
lqw.eq(bo.getExpenseTotal() != null, FinancialRevenuePlanAlteration::getExpenseTotal, bo.getExpenseTotal());
lqw.eq(bo.getIncomeTotal() != null, FinancialRevenuePlanAlteration::getIncomeTotal, bo.getIncomeTotal());
lqw.eq(StringUtils.isNotBlank(bo.getIsTemporaryPlan()), FinancialRevenuePlanAlteration::getIsTemporaryPlan, bo.getIsTemporaryPlan());
lqw.eq(StringUtils.isNotBlank(bo.getRemarks()), FinancialRevenuePlanAlteration::getRemarks, bo.getRemarks());
lqw.eq(StringUtils.isNotBlank(bo.getFileId()), FinancialRevenuePlanAlteration::getFileId, bo.getFileId());
lqw.eq(StringUtils.isNotBlank(bo.getAuditStatus()), FinancialRevenuePlanAlteration::getAuditStatus, bo.getAuditStatus());
return lqw;
}
/**
* 新增月度资金计划变更
*
* @param bo 月度资金计划变更
* @return 是否新增成功
*/
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean insertByBo(FinancialRevenuePlanAlterationBo bo) {
FinancialRevenuePlanAlteration add = MapstructUtils.convert(bo, FinancialRevenuePlanAlteration.class);
validEntityBeforeSave(add);
Long l = baseMapper.selectCount(new LambdaQueryWrapper<FinancialRevenuePlanAlteration>().gt(FinancialRevenuePlanAlteration::getCreateTime, LocalDate.now()));
String s = areaUtil.generateDateBasedNumber();
add.setDocumentCode( s+"-"+(l+1));
boolean flag = baseMapper.insert(add) > 0;
// 收入明细
List<DetailOfEarningsBo> detailOfEarnings = bo.getDetailOfEarnings();
if (detailOfEarnings != null && detailOfEarnings.size() > 0) {
detailOfEarnings.forEach(item -> {
item.setFinancialRevenueId(add.getId() );
});
iDetailOfEarningsService.saveBatch(MapstructUtils.convert(detailOfEarnings, DetailOfEarnings.class));
}
// 支出明细
List<StatementOfExpendituresBo> statementOfExpenditures = bo.getStatementOfExpenditures();
statementOfExpenditures.forEach(item -> {
item.setFinancialRevenueId(add.getId());
});
iStatementOfExpendituresService.saveBatch(MapstructUtils.convert(statementOfExpenditures, StatementOfExpenditures.class));
if (flag) {
bo.setId(add.getId());
}
return flag;
}
/**
* 修改月度资金计划变更
*
* @param bo 月度资金计划变更
* @return 是否修改成功
*/
@Override
public Boolean updateByBo(FinancialRevenuePlanAlterationBo bo) {
FinancialRevenuePlanAlteration update = MapstructUtils.convert(bo, FinancialRevenuePlanAlteration.class);
validEntityBeforeSave(update);
List<DetailOfEarningsBo> detailOfEarnings = bo.getDetailOfEarnings();
HashMap<String, Object> hashMap = new HashMap<>();
hashMap.put("financial_revenue_id",bo.getId());
// 收入
iDetailOfEarningsService.getBaseMapper().deleteByMap(hashMap);
if (detailOfEarnings != null && detailOfEarnings.size() > 0) {
detailOfEarnings.forEach(item ->{
item.setFinancialRevenueId(bo.getId());
});
iDetailOfEarningsService.saveBatch(MapstructUtils.convert(detailOfEarnings, DetailOfEarnings.class));
}
// 支出
iStatementOfExpendituresService.getBaseMapper().deleteByMap(hashMap);
List<StatementOfExpendituresBo> statementOfExpenditures = bo.getStatementOfExpenditures();
if (statementOfExpenditures != null && statementOfExpenditures.size() > 0) {
statementOfExpenditures.forEach(item ->{
item.setFinancialRevenueId(bo.getId());
});
iStatementOfExpendituresService.saveBatch(MapstructUtils.convert(statementOfExpenditures, StatementOfExpenditures.class));
}
return baseMapper.updateById(update) > 0;
}
/**
* 保存前的数据校验
*/
private void validEntityBeforeSave(FinancialRevenuePlanAlteration entity){
//TODO 做一些数据校验,如唯一约束
}
/**
* 校验并批量删除月度资金计划变更信息
*
* @param ids 待删除的主键集合
* @param isValid 是否进行有效性校验
* @return 是否删除成功
*/
@Override
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
if(isValid){
//TODO 做一些业务上的校验,判断是否需要校验
}
for (Long id : ids) {
FinancialRevenuePlanAlterationVo vo = baseMapper.selectVoById(id);
// 删除附件
if (!StringUtils.isEmpty(vo.getFileId())){
List<Long> collect = Arrays.stream(vo.getFileId().split(",")).map(item -> {
return Long.parseLong(item);
}).collect(Collectors.toList());
sysOssService.deleteWithValidByIds(collect, false);
}
}
// 删除支出,收入
LambdaQueryWrapper<DetailOfEarnings> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.in(DetailOfEarnings::getFinancialRevenueId, ids);
iDetailOfEarningsService.getBaseMapper().delete(lambdaQueryWrapper);
LambdaQueryWrapper<StatementOfExpenditures> lambdaQueryWrapper1 = new LambdaQueryWrapper<>();
lambdaQueryWrapper1.in(StatementOfExpenditures::getFinancialRevenueId, ids);
iStatementOfExpendituresService.getBaseMapper().delete(lambdaQueryWrapper1);
return baseMapper.deleteByIds(ids) > 0;
}
}

View File

@ -0,0 +1,108 @@
package org.dromara.xzd.zijinjihua.yueduzijinjihua.controller;
import java.util.List;
import lombok.RequiredArgsConstructor;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.constraints.*;
import cn.dev33.satoken.annotation.SaCheckPermission;
import org.dromara.xzd.zijinjihua.yueduzijinjihua.service.IDetailOfEarningsService;
import org.dromara.xzd.zijinjihua.yueduzijinjihua.service.IStatementOfExpendituresService;
import org.springframework.web.bind.annotation.*;
import org.springframework.validation.annotation.Validated;
import org.dromara.common.idempotent.annotation.RepeatSubmit;
import org.dromara.common.log.annotation.Log;
import org.dromara.common.web.core.BaseController;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.core.domain.R;
import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.core.validate.EditGroup;
import org.dromara.common.log.enums.BusinessType;
import org.dromara.common.excel.utils.ExcelUtil;
import org.dromara.xzd.zijinjihua.yueduzijinjihua.domain.vo.FinancialRevenueExpenditurePlanVo;
import org.dromara.xzd.zijinjihua.yueduzijinjihua.domain.bo.FinancialRevenueExpenditurePlanBo;
import org.dromara.xzd.zijinjihua.yueduzijinjihua.service.IFinancialRevenueExpenditurePlanService;
import org.dromara.common.mybatis.core.page.TableDataInfo;
/**
* 月度资金计划
*
* @author Lion Li
* @date 2025-10-15
*/
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/yueduzijinjihua/revenueExpenditurePlan")
public class FinancialRevenueExpenditurePlanController extends BaseController {
private final IFinancialRevenueExpenditurePlanService financialRevenueExpenditurePlanService;
/**
* 查询月度资金计划列表
*/
@SaCheckPermission("yueduzijinjihua:revenueExpenditurePlan:list")
@GetMapping("/list")
public TableDataInfo<FinancialRevenueExpenditurePlanVo> list(FinancialRevenueExpenditurePlanBo bo, PageQuery pageQuery) {
return financialRevenueExpenditurePlanService.queryPageList(bo, pageQuery);
}
/**
* 导出月度资金计划列表
*/
@SaCheckPermission("yueduzijinjihua:revenueExpenditurePlan:export")
@Log(title = "月度资金计划", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(FinancialRevenueExpenditurePlanBo bo, HttpServletResponse response) {
List<FinancialRevenueExpenditurePlanVo> list = financialRevenueExpenditurePlanService.queryList(bo);
ExcelUtil.exportExcel(list, "月度资金计划", FinancialRevenueExpenditurePlanVo.class, response);
}
/**
* 获取月度资金计划详细信息
*
* @param id 主键
*/
@SaCheckPermission("yueduzijinjihua:revenueExpenditurePlan:query")
@GetMapping("/{id}")
public R<FinancialRevenueExpenditurePlanVo> getInfo(@NotNull(message = "主键不能为空")
@PathVariable Long id) {
return R.ok(financialRevenueExpenditurePlanService.queryById(id));
}
/**
* 新增月度资金计划
*/
@SaCheckPermission("yueduzijinjihua:revenueExpenditurePlan:add")
@Log(title = "月度资金计划", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping()
public R<Void> add(@Validated(AddGroup.class) @RequestBody FinancialRevenueExpenditurePlanBo bo) {
return toAjax(financialRevenueExpenditurePlanService.insertByBo(bo));
}
/**
* 修改月度资金计划
*/
@SaCheckPermission("yueduzijinjihua:revenueExpenditurePlan:edit")
@Log(title = "月度资金计划", businessType = BusinessType.UPDATE)
@RepeatSubmit()
@PutMapping()
public R<Void> edit(@Validated(EditGroup.class) @RequestBody FinancialRevenueExpenditurePlanBo bo) {
return toAjax(financialRevenueExpenditurePlanService.updateByBo(bo));
}
/**
* 删除月度资金计划
*
* @param ids 主键串
*/
@SaCheckPermission("yueduzijinjihua:revenueExpenditurePlan:remove")
@Log(title = "月度资金计划", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}")
public R<Void> remove(@NotEmpty(message = "主键不能为空")
@PathVariable Long[] ids) {
return toAjax(financialRevenueExpenditurePlanService.deleteWithValidByIds(List.of(ids), true));
}
}

View File

@ -0,0 +1,116 @@
package org.dromara.xzd.zijinjihua.yueduzijinjihua.domain;
import org.dromara.common.mybatis.core.domain.BaseEntity;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.math.BigDecimal;
import java.io.Serial;
/**
* 资金计划-收入明细对象 detail_of_earnings
*
* @author Lion Li
* @date 2025-10-16
*/
@Data
@TableName("detail_of_earnings")
public class DetailOfEarnings {
@Serial
private static final long serialVersionUID = 1L;
/**
*
*/
@TableId(value = "id")
private Long id;
/**
* 月度资金id
*/
private Long financialRevenueId;
/**
* 预算项
*/
private String budgetItem;
/**
* 收入金额
*/
private BigDecimal incomeAmount;
/**
* 是否开票
*/
private String isInvoice;
/**
*
* 变更原因
*/
private String reasonsForChange;
/**
* 变更后金额
*/
private BigDecimal changedAmount;
/**
* CBS
*/
private Long cbs;
/**
* CBS金额
*/
private BigDecimal cbsAmount;
/**
* CBS余额
*/
private BigDecimal cbsBalance;
/**
* 甲方单位 客户
*/
private Long partyAUnit;
/**
* 合同编码
*/
private Long contractCode;
/**
* 合同名称
*/
private String contractName;
/**
* 合同金额
*/
private BigDecimal contractAmount;
/**
* 累计审定产值金额
*/
private BigDecimal cumulativeApprovedOutputValue;
/**
* 累计收款金额
*/
private BigDecimal cumulativeReceiptAmount;
/**
* 截止本期结算比例(结算/合同)
*/
private BigDecimal settlementRatio;
/**
* 截止本期收款比例(收款/结算)
*/
private BigDecimal receiptRatio;
}

View File

@ -0,0 +1,163 @@
package org.dromara.xzd.zijinjihua.yueduzijinjihua.domain;
import org.dromara.common.mybatis.core.domain.BaseEntity;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.math.BigDecimal;
import java.io.Serial;
import java.time.LocalDate;
/**
* 月度资金计划对象 financial_revenue_expenditure_plan
*
* @author Lion Li
* @date 2025-10-15
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("financial_revenue_expenditure_plan")
public class FinancialRevenueExpenditurePlan extends BaseEntity {
@Serial
private static final long serialVersionUID = 1L;
/**
*
*/
@TableId(value = "id")
private Long id;
/**
* 单据编码
*/
private String documentCode;
/**
* 单据名称
*/
private String documentName;
/**
* 项目
*/
private Long project;
/**
* 计划类型
*/
private String planType;
/**
* 工作周期
*/
private String workCycle;
/**
* 开始日期
*/
private LocalDate startDate;
/**
* 结束日期
*/
private LocalDate endDate;
/**
* 支出总额
*/
private BigDecimal expenseTotal;
/**
* 收入总额
*/
private BigDecimal incomeTotal;
/**
* 是否临时计划
*/
private String isTemporaryPlan;
/**
* 单据日期(上月)
*/
private LocalDate documentDateLastMonth;
/**
* 备注
*/
private String remarks;
/**
* 项目可用余额
*/
private BigDecimal projectAvailableBalance;
/**
* 累计收款金额
*/
private BigDecimal cumulativeReceiptAmount;
/**
* 累计支付金额
*/
private BigDecimal cumulativePaymentAmount;
/**
* 报销支出金额
*/
private BigDecimal reimbursementAmount;
/**
* 合同支付金额
*/
private BigDecimal contractPaymentAmount;
/**
* 剩余资金金额
*/
private BigDecimal remainingFunds;
/**
* 实时刷新0不刷新1刷新
*/
private Integer realTimeRefresh;
/**
* 月度支出余额
*/
private BigDecimal monthlyExpenditureBalance;
/**
* 月度累计支出
*/
private BigDecimal monthlyCumulativeExpenditure;
/**
* 年度支出余额
*/
private BigDecimal annualExpenditureBalance;
/**
* 年度累计支出
*/
private BigDecimal annualCumulativeExpenditure;
/**
* 文件ID
*/
private String fileId;
/**
* 备注
*/
private String remark;
/**
* 审核状态
*/
private String auditStatus;
}

View File

@ -0,0 +1,127 @@
package org.dromara.xzd.zijinjihua.yueduzijinjihua.domain;
import org.dromara.common.mybatis.core.domain.BaseEntity;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.math.BigDecimal;
import java.io.Serial;
/**
* 资金计划-支出明细对象 statement_of_expenditures
*
* @author Lion Li
* @date 2025-10-16
*/
@Data
@TableName("statement_of_expenditures")
public class StatementOfExpenditures {
@Serial
private static final long serialVersionUID = 1L;
/**
*
*/
@TableId(value = "id")
private Long id;
/**
* 月度资金id
*/
private Long financialRevenueId;
/**
* 预算项
*/
private String budgetItem;
/**
*
* 变更原因
*/
private String reasonsForChange;
/**
* 支出类型
*/
private String expenseType;
/**
* 支出金额
*/
private BigDecimal expenseAmount;
/**
* 变更后金额
*/
private BigDecimal changedAmount;
/**
* CBS
*/
private Long cbs;
/**
* CBS金额
*/
private BigDecimal cbsAmount;
/**
* CBS余额
*/
private BigDecimal cbsBalance;
/**
* 供应商
*/
private Long supplier;
/**
* 合同编码
*/
private Long contractCode;
/**
* 合同名称
*/
private String contractName;
/**
* 合同金额
*/
private BigDecimal contractAmount;
/**
* 累计进度结算金额
*/
private BigDecimal cumulativeProgressSettlement;
/**
* 累计支付金额
*/
private BigDecimal cumulativePaymentAmount;
/**
* 累计收票金额
*/
private BigDecimal cumulativeInvoiceAmount;
/**
* 截止至本期应付款金额
*/
private BigDecimal currentPeriodPayableAmount;
/**
* 累计支付占合同比例
*/
private BigDecimal paymentContractRatio;
/**
* 截止至本期进度支付占截止至本期应付款金额的比例
*/
private BigDecimal progressPaymentToCurrentPayableRatio;
}

View File

@ -0,0 +1,118 @@
package org.dromara.xzd.zijinjihua.yueduzijinjihua.domain.bo;
import org.dromara.xzd.zijinjihua.yueduzijinjihua.domain.DetailOfEarnings;
import org.dromara.common.mybatis.core.domain.BaseEntity;
import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.core.validate.EditGroup;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import lombok.EqualsAndHashCode;
import jakarta.validation.constraints.*;
import java.math.BigDecimal;
/**
* 资金计划-收入明细业务对象 detail_of_earnings
*
* @author Lion Li
* @date 2025-10-16
*/
@Data
@AutoMapper(target = DetailOfEarnings.class, reverseConvertGenerate = false)
public class DetailOfEarningsBo {
/**
*
*/
private Long id;
/**
* 月度资金id
*/
private Long financialRevenueId;
/**
* 预算项
*/
@NotBlank(message = "预算项不能为空", groups = { AddGroup.class, EditGroup.class })
private String budgetItem;
/**
* 收入金额
*/
@NotNull(message = "收入金额不能为空", groups = { AddGroup.class, EditGroup.class })
private BigDecimal incomeAmount;
/**
* 是否开票
*/
@NotBlank(message = "是否开票不能为空", groups = { AddGroup.class, EditGroup.class })
private String isInvoice;
/**
* 变更后金额
*/
private BigDecimal changedAmount;
/**
* CBS
*/
private Long cbs;
/**
*
* 变更原因
*/
private String reasonsForChange;
/**
* CBS金额
*/
private BigDecimal cbsAmount;
/**
* CBS余额
*/
private BigDecimal cbsBalance;
/**
* 甲方单位 客户
*/
private Long partyAUnit;
/**
* 合同编码
*/
private Long contractCode;
/**
* 合同名称
*/
private String contractName;
/**
* 合同金额
*/
private BigDecimal contractAmount;
/**
* 累计审定产值金额
*/
private BigDecimal cumulativeApprovedOutputValue;
/**
* 累计收款金额
*/
private BigDecimal cumulativeReceiptAmount;
/**
* 截止本期结算比例(结算/合同)
*/
private BigDecimal settlementRatio;
/**
* 截止本期收款比例(收款/结算)
*/
private BigDecimal receiptRatio;
}

View File

@ -0,0 +1,178 @@
package org.dromara.xzd.zijinjihua.yueduzijinjihua.domain.bo;
import org.dromara.xzd.zijinjihua.yueduzijinjihua.domain.FinancialRevenueExpenditurePlan;
import org.dromara.common.mybatis.core.domain.BaseEntity;
import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.core.validate.EditGroup;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import lombok.EqualsAndHashCode;
import jakarta.validation.constraints.*;
import org.dromara.xzd.zijinjihua.yueduzijinjihua.domain.vo.DetailOfEarningsVo;
import org.dromara.xzd.zijinjihua.yueduzijinjihua.domain.vo.StatementOfExpendituresVo;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.List;
/**
* 月度资金计划业务对象 financial_revenue_expenditure_plan
*
* @author Lion Li
* @date 2025-10-15
*/
@Data
@EqualsAndHashCode(callSuper = true)
@AutoMapper(target = FinancialRevenueExpenditurePlan.class, reverseConvertGenerate = false)
public class FinancialRevenueExpenditurePlanBo extends BaseEntity {
/**
*
*/
private Long id;
/**
* 单据编码
*/
private String documentCode;
/**
* 单据名称
*/
private String documentName;
/**
* 项目
*/
@NotNull(message = "项目不能为空", groups = { AddGroup.class, EditGroup.class })
private Long project;
/**
* 计划类型
*/
private String planType;
/**
* 工作周期
*/
private String workCycle;
/**
* 开始日期
*/
private LocalDate startDate;
/**
* 结束日期
*/
private LocalDate endDate;
/**
* 支出总额
*/
private BigDecimal expenseTotal;
/**
* 收入总额
*/
private BigDecimal incomeTotal;
/**
* 是否临时计划
*/
@NotBlank(message = "是否临时计划不能为空", groups = { AddGroup.class, EditGroup.class })
private String isTemporaryPlan;
/**
* 单据日期(上月)
*/
private LocalDate documentDateLastMonth;
/**
* 备注
*/
private String remarks;
/**
* 项目可用余额
*/
private BigDecimal projectAvailableBalance;
/**
* 累计收款金额
*/
private BigDecimal cumulativeReceiptAmount;
/**
* 累计支付金额
*/
private BigDecimal cumulativePaymentAmount;
/**
* 报销支出金额
*/
private BigDecimal reimbursementAmount;
/**
* 合同支付金额
*/
private BigDecimal contractPaymentAmount;
/**
* 剩余资金金额
*/
private BigDecimal remainingFunds;
/**
* 实时刷新0不刷新1刷新
*/
private Integer realTimeRefresh;
/**
* 月度支出余额
*/
private BigDecimal monthlyExpenditureBalance;
/**
* 月度累计支出
*/
private BigDecimal monthlyCumulativeExpenditure;
/**
* 年度支出余额
*/
private BigDecimal annualExpenditureBalance;
/**
* 年度累计支出
*/
private BigDecimal annualCumulativeExpenditure;
/**
* 文件ID
*/
private String fileId;
/**
* 备注
*/
private String remark;
/**
* 审核状态
*/
private String auditStatus;
/**
* 收入明细
*/
private List<DetailOfEarningsBo> detailOfEarnings;
/**
* 支出明细
*/
private List<StatementOfExpendituresBo> statementOfExpenditures;
}

View File

@ -0,0 +1,128 @@
package org.dromara.xzd.zijinjihua.yueduzijinjihua.domain.bo;
import org.dromara.xzd.zijinjihua.yueduzijinjihua.domain.StatementOfExpenditures;
import org.dromara.common.mybatis.core.domain.BaseEntity;
import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.core.validate.EditGroup;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import lombok.EqualsAndHashCode;
import jakarta.validation.constraints.*;
import java.math.BigDecimal;
/**
* 资金计划-支出明细业务对象 statement_of_expenditures
*
* @author Lion Li
* @date 2025-10-16
*/
@Data
@AutoMapper(target = StatementOfExpenditures.class, reverseConvertGenerate = false)
public class StatementOfExpendituresBo {
/**
*
*/
@NotNull(message = "不能为空", groups = { EditGroup.class })
private Long id;
/**
* 月度资金id
*/
private Long financialRevenueId;
/**
* 预算项
*/
@NotBlank(message = "预算项不能为空", groups = { AddGroup.class, EditGroup.class })
private String budgetItem;
/**
* 支出类型
*/
private String expenseType;
/**
*
* 变更原因
*/
private String reasonsForChange;
/**
* 支出金额
*/
private BigDecimal expenseAmount;
/**
* 变更后金额
*/
private BigDecimal changedAmount;
/**
* CBS
*/
private Long cbs;
/**
* CBS金额
*/
private BigDecimal cbsAmount;
/**
* CBS余额
*/
private BigDecimal cbsBalance;
/**
* 供应商
*/
@NotNull(message = "供应商不能为空", groups = { AddGroup.class, EditGroup.class })
private Long supplier;
/**
* 合同编码
*/
private Long contractCode;
/**
* 合同名称
*/
private String contractName;
/**
* 合同金额
*/
private BigDecimal contractAmount;
/**
* 累计进度结算金额
*/
private BigDecimal cumulativeProgressSettlement;
/**
* 累计支付金额
*/
private BigDecimal cumulativePaymentAmount;
/**
* 累计收票金额
*/
private BigDecimal cumulativeInvoiceAmount;
/**
* 截止至本期应付款金额
*/
private BigDecimal currentPeriodPayableAmount;
/**
* 累计支付占合同比例
*/
private BigDecimal paymentContractRatio;
/**
* 截止至本期进度支付占截止至本期应付款金额的比例
*/
private BigDecimal progressPaymentToCurrentPayableRatio;
}

View File

@ -0,0 +1,163 @@
package org.dromara.xzd.zijinjihua.yueduzijinjihua.domain.vo;
import java.math.BigDecimal;
import org.dromara.xzd.zijinjihua.yueduzijinjihua.domain.DetailOfEarnings;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import org.dromara.common.excel.annotation.ExcelDictFormat;
import org.dromara.common.excel.convert.ExcelDictConvert;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.util.Date;
/**
* 资金计划-收入明细视图对象 detail_of_earnings
*
* @author Lion Li
* @date 2025-10-16
*/
@Data
@ExcelIgnoreUnannotated
@AutoMapper(target = DetailOfEarnings.class)
public class DetailOfEarningsVo implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
*
*/
@ExcelProperty(value = "")
private Long id;
/**
* 月度资金id
*/
@ExcelProperty(value = "月度资金id")
private Long financialRevenueId;
/**
* 预算项
*/
@ExcelProperty(value = "预算项")
private String budgetItem;
/**
*
* 变更原因
*/
private String reasonsForChange;
/**
* 收入金额
*/
@ExcelProperty(value = "收入金额")
private BigDecimal incomeAmount;
/**
* 是否开票
*/
@ExcelProperty(value = "是否开票")
private String isInvoice;
/**
* 变更后金额
*/
@ExcelProperty(value = "变更后金额")
private BigDecimal changedAmount;
/**
* CBS
*/
@ExcelProperty(value = "CBS")
private Long cbs;
/**
* CBS名称
*/
@ExcelProperty(value = "CBS名称")
private String cbsName;
/**
* CBS金额
*/
@ExcelProperty(value = "CBS金额")
private BigDecimal cbsAmount;
/**
* CBS余额
*/
@ExcelProperty(value = "CBS余额")
private BigDecimal cbsBalance;
/**
* 甲方单位 客户
*/
@ExcelProperty(value = "甲方单位 客户")
private Long partyAUnit;
/**
* 甲方单位名称 客户
*/
@ExcelProperty(value = "甲方单位名称 客户")
private String partyAUnitName;
/**
* 合同编码
*/
@ExcelProperty(value = "合同编码 ")
private Long contractCode;
/**
* 合同编码 名称
*/
@ExcelProperty(value = "合同编码名称 ")
private String contractCodeName;
/**
* 合同名称
*/
@ExcelProperty(value = "合同名称")
private String contractName;
/**
* 合同金额
*/
@ExcelProperty(value = "合同金额")
private BigDecimal contractAmount;
/**
* 累计审定产值金额
*/
@ExcelProperty(value = "累计审定产值金额")
private BigDecimal cumulativeApprovedOutputValue;
/**
* 累计收款金额
*/
@ExcelProperty(value = "累计收款金额")
private BigDecimal cumulativeReceiptAmount;
/**
* 截止本期结算比例(结算/合同)
*/
@ExcelProperty(value = "截止本期结算比例", converter = ExcelDictConvert.class)
@ExcelDictFormat(readConverterExp = "结=算/合同")
private BigDecimal settlementRatio;
/**
* 截止本期收款比例(收款/结算)
*/
@ExcelProperty(value = "截止本期收款比例", converter = ExcelDictConvert.class)
@ExcelDictFormat(readConverterExp = "收=款/结算")
private BigDecimal receiptRatio;
}

View File

@ -0,0 +1,254 @@
package org.dromara.xzd.zijinjihua.yueduzijinjihua.domain.vo;
import java.math.BigDecimal;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import org.dromara.common.translation.annotation.Translation;
import org.dromara.common.translation.constant.TransConstant;
import org.dromara.xzd.zijinjihua.yueduzijinjihua.domain.FinancialRevenueExpenditurePlan;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import org.dromara.common.excel.annotation.ExcelDictFormat;
import org.dromara.common.excel.convert.ExcelDictConvert;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import org.dromara.xzd.zijinjihua.yueduzijinjihua.domain.bo.DetailOfEarningsBo;
import org.dromara.xzd.zijinjihua.yueduzijinjihua.domain.bo.StatementOfExpendituresBo;
import java.io.Serial;
import java.io.Serializable;
import java.time.LocalDate;
import java.util.Date;
import java.util.List;
/**
* 月度资金计划视图对象 financial_revenue_expenditure_plan
*
* @author Lion Li
* @date 2025-10-15
*/
@Data
@ExcelIgnoreUnannotated
@AutoMapper(target = FinancialRevenueExpenditurePlan.class)
public class FinancialRevenueExpenditurePlanVo implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
*
*/
@ExcelProperty(value = "")
private Long id;
/**
* 单据编码
*/
@ExcelProperty(value = "单据编码")
private String documentCode;
/**
* 单据名称
*/
@ExcelProperty(value = "单据名称")
private String documentName;
/**
* 项目
*/
@ExcelProperty(value = "项目")
private Long project;
/**
* 项目名称
*/
@ExcelProperty(value = "项目名称")
private String projectName;
/**
* 计划类型
*/
@ExcelProperty(value = "计划类型")
private String planType;
/**
* 工作周期
*/
@ExcelProperty(value = "工作周期")
private String workCycle;
/**
* 开始日期
*/
@ExcelProperty(value = "开始日期")
private LocalDate startDate;
/**
* 结束日期
*/
@ExcelProperty(value = "结束日期")
private LocalDate endDate;
/**
* 支出总额
*/
@ExcelProperty(value = "支出总额")
private BigDecimal expenseTotal;
/**
* 收入总额
*/
@ExcelProperty(value = "收入总额")
private BigDecimal incomeTotal;
/**
* 是否临时计划
*/
@ExcelProperty(value = "是否临时计划")
private String isTemporaryPlan;
/**
* 单据日期(上月)
*/
@ExcelProperty(value = "单据日期(上月)")
private LocalDate documentDateLastMonth;
/**
* 备注
*/
@ExcelProperty(value = "备注")
private String remarks;
/**
* 项目可用余额
*/
@ExcelProperty(value = "项目可用余额")
private BigDecimal projectAvailableBalance;
/**
* 累计收款金额
*/
@ExcelProperty(value = "累计收款金额")
private BigDecimal cumulativeReceiptAmount;
/**
* 累计支付金额
*/
@ExcelProperty(value = "累计支付金额")
private BigDecimal cumulativePaymentAmount;
/**
* 报销支出金额
*/
@ExcelProperty(value = "报销支出金额")
private BigDecimal reimbursementAmount;
/**
* 合同支付金额
*/
@ExcelProperty(value = "合同支付金额")
private BigDecimal contractPaymentAmount;
/**
* 剩余资金金额
*/
@ExcelProperty(value = "剩余资金金额")
private BigDecimal remainingFunds;
/**
* 实时刷新0不刷新1刷新
*/
@ExcelProperty(value = "实时刷新", converter = ExcelDictConvert.class)
@ExcelDictFormat(readConverterExp = "0=不刷新1刷新")
private Integer realTimeRefresh;
/**
* 月度支出余额
*/
@ExcelProperty(value = "月度支出余额")
private BigDecimal monthlyExpenditureBalance;
/**
* 月度累计支出
*/
@ExcelProperty(value = "月度累计支出")
private BigDecimal monthlyCumulativeExpenditure;
/**
* 年度支出余额
*/
@ExcelProperty(value = "年度支出余额")
private BigDecimal annualExpenditureBalance;
/**
* 年度累计支出
*/
@ExcelProperty(value = "年度累计支出")
private BigDecimal annualCumulativeExpenditure;
/**
* 文件ID
*/
@ExcelProperty(value = "文件ID")
private String fileId;
/**
* 备注
*/
@ExcelProperty(value = "备注")
private String remark;
/**
* 审核状态
*/
@ExcelProperty(value = "审核状态")
private String auditStatus;
/**
* 创建部门
*/
@TableField(fill = FieldFill.INSERT)
private Long createDept;
@ExcelProperty(value = "创建部门名称")
@Translation(type = TransConstant.DEPT_ID_TO_NAME, mapper = "createDept")
private String createDeptName;
/**
* 创建者
*/
@ExcelProperty(value = "创建者")
@TableField(fill = FieldFill.INSERT)
private Long createBy;
@ExcelProperty(value = "创建者名称")
@Translation(type = TransConstant.USER_ID_TO_NICKNAME, mapper = "createBy")
private String createByName;
/**
* 创建时间
*/
@TableField(fill = FieldFill.INSERT)
private Date createTime;
/**
* 收入明细
*/
private List<DetailOfEarningsVo> detailOfEarnings;
/**
* 支出明细
*/
private List<StatementOfExpendituresVo> statementOfExpenditures;
}

View File

@ -0,0 +1,171 @@
package org.dromara.xzd.zijinjihua.yueduzijinjihua.domain.vo;
import java.math.BigDecimal;
import org.dromara.xzd.zijinjihua.yueduzijinjihua.domain.StatementOfExpenditures;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import org.dromara.common.excel.annotation.ExcelDictFormat;
import org.dromara.common.excel.convert.ExcelDictConvert;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.util.Date;
/**
* 资金计划-支出明细视图对象 statement_of_expenditures
*
* @author Lion Li
* @date 2025-10-16
*/
@Data
@ExcelIgnoreUnannotated
@AutoMapper(target = StatementOfExpenditures.class)
public class StatementOfExpendituresVo implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
*
*/
@ExcelProperty(value = "")
private Long id;
/**
* 月度资金id
*/
@ExcelProperty(value = "月度资金id")
private Long financialRevenueId;
/**
* 预算项
*/
@ExcelProperty(value = "预算项")
private String budgetItem;
/**
* 支出类型
*/
@ExcelProperty(value = "支出类型")
private String expenseType;
/**
* 支出金额
*/
@ExcelProperty(value = "支出金额")
private BigDecimal expenseAmount;
/**
* 变更后金额
*/
@ExcelProperty(value = "变更后金额")
private BigDecimal changedAmount;
/**
* CBS
*/
@ExcelProperty(value = "CBS")
private Long cbs;
/**
* CBS名称
*/
@ExcelProperty(value = "CBS名称")
private String cbsName;
/**
* CBS金额
*/
@ExcelProperty(value = "CBS金额")
private BigDecimal cbsAmount;
/**
* CBS余额
*/
@ExcelProperty(value = "CBS余额")
private BigDecimal cbsBalance;
/**
* 供应商
*/
@ExcelProperty(value = "供应商")
private Long supplier;
/**
* 供应商名称
*/
@ExcelProperty(value = "供应商名称")
private String supplierName;
/**
* 合同编码
*/
@ExcelProperty(value = "合同编码")
private Long contractCode;
/**
* 合同编码名称
*/
@ExcelProperty(value = "合同编码名称")
private String contractCodeName;
/**
* 合同名称
*/
@ExcelProperty(value = "合同名称")
private String contractName;
/**
* 合同金额
*/
@ExcelProperty(value = "合同金额")
private BigDecimal contractAmount;
/**
*
* 变更原因
*/
private String reasonsForChange;
/**
* 累计进度结算金额
*/
@ExcelProperty(value = "累计进度结算金额")
private BigDecimal cumulativeProgressSettlement;
/**
* 累计支付金额
*/
@ExcelProperty(value = "累计支付金额")
private BigDecimal cumulativePaymentAmount;
/**
* 累计收票金额
*/
@ExcelProperty(value = "累计收票金额")
private BigDecimal cumulativeInvoiceAmount;
/**
* 截止至本期应付款金额
*/
@ExcelProperty(value = "截止至本期应付款金额")
private BigDecimal currentPeriodPayableAmount;
/**
* 累计支付占合同比例
*/
@ExcelProperty(value = "累计支付占合同比例")
private BigDecimal paymentContractRatio;
/**
* 截止至本期进度支付占截止至本期应付款金额的比例
*/
@ExcelProperty(value = "截止至本期进度支付占截止至本期应付款金额的比例")
private BigDecimal progressPaymentToCurrentPayableRatio;
}

View File

@ -0,0 +1,15 @@
package org.dromara.xzd.zijinjihua.yueduzijinjihua.mapper;
import org.dromara.xzd.zijinjihua.yueduzijinjihua.domain.DetailOfEarnings;
import org.dromara.xzd.zijinjihua.yueduzijinjihua.domain.vo.DetailOfEarningsVo;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
/**
* 资金计划-收入明细Mapper接口
*
* @author Lion Li
* @date 2025-10-16
*/
public interface DetailOfEarningsMapper extends BaseMapperPlus<DetailOfEarnings, DetailOfEarningsVo> {
}

View File

@ -0,0 +1,15 @@
package org.dromara.xzd.zijinjihua.yueduzijinjihua.mapper;
import org.dromara.xzd.zijinjihua.yueduzijinjihua.domain.FinancialRevenueExpenditurePlan;
import org.dromara.xzd.zijinjihua.yueduzijinjihua.domain.vo.FinancialRevenueExpenditurePlanVo;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
/**
* 月度资金计划Mapper接口
*
* @author Lion Li
* @date 2025-10-15
*/
public interface FinancialRevenueExpenditurePlanMapper extends BaseMapperPlus<FinancialRevenueExpenditurePlan, FinancialRevenueExpenditurePlanVo> {
}

View File

@ -0,0 +1,15 @@
package org.dromara.xzd.zijinjihua.yueduzijinjihua.mapper;
import org.dromara.xzd.zijinjihua.yueduzijinjihua.domain.StatementOfExpenditures;
import org.dromara.xzd.zijinjihua.yueduzijinjihua.domain.vo.StatementOfExpendituresVo;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
/**
* 资金计划-支出明细Mapper接口
*
* @author Lion Li
* @date 2025-10-16
*/
public interface StatementOfExpendituresMapper extends BaseMapperPlus<StatementOfExpenditures, StatementOfExpendituresVo> {
}

View File

@ -0,0 +1,70 @@
package org.dromara.xzd.zijinjihua.yueduzijinjihua.service;
import org.dromara.xzd.zijinjihua.yueduzijinjihua.domain.vo.DetailOfEarningsVo;
import org.dromara.xzd.zijinjihua.yueduzijinjihua.domain.bo.DetailOfEarningsBo;
import org.dromara.xzd.zijinjihua.yueduzijinjihua.domain.DetailOfEarnings;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.mybatis.core.page.PageQuery;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.Collection;
import java.util.List;
/**
* 资金计划-收入明细Service接口
*
* @author Lion Li
* @date 2025-10-16
*/
public interface IDetailOfEarningsService extends IService<DetailOfEarnings>{
/**
* 查询资金计划-收入明细
*
* @param id 主键
* @return 资金计划-收入明细
*/
DetailOfEarningsVo queryById(Long id);
/**
* 分页查询资金计划-收入明细列表
*
* @param bo 查询条件
* @param pageQuery 分页参数
* @return 资金计划-收入明细分页列表
*/
TableDataInfo<DetailOfEarningsVo> queryPageList(DetailOfEarningsBo bo, PageQuery pageQuery);
/**
* 查询符合条件的资金计划-收入明细列表
*
* @param bo 查询条件
* @return 资金计划-收入明细列表
*/
List<DetailOfEarningsVo> queryList(DetailOfEarningsBo bo);
/**
* 新增资金计划-收入明细
*
* @param bo 资金计划-收入明细
* @return 是否新增成功
*/
Boolean insertByBo(DetailOfEarningsBo bo);
/**
* 修改资金计划-收入明细
*
* @param bo 资金计划-收入明细
* @return 是否修改成功
*/
Boolean updateByBo(DetailOfEarningsBo bo);
/**
* 校验并批量删除资金计划-收入明细信息
*
* @param ids 待删除的主键集合
* @param isValid 是否进行有效性校验
* @return 是否删除成功
*/
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
}

View File

@ -0,0 +1,70 @@
package org.dromara.xzd.zijinjihua.yueduzijinjihua.service;
import org.dromara.xzd.zijinjihua.yueduzijinjihua.domain.vo.FinancialRevenueExpenditurePlanVo;
import org.dromara.xzd.zijinjihua.yueduzijinjihua.domain.bo.FinancialRevenueExpenditurePlanBo;
import org.dromara.xzd.zijinjihua.yueduzijinjihua.domain.FinancialRevenueExpenditurePlan;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.mybatis.core.page.PageQuery;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.Collection;
import java.util.List;
/**
* 月度资金计划Service接口
*
* @author Lion Li
* @date 2025-10-15
*/
public interface IFinancialRevenueExpenditurePlanService extends IService<FinancialRevenueExpenditurePlan>{
/**
* 查询月度资金计划
*
* @param id 主键
* @return 月度资金计划
*/
FinancialRevenueExpenditurePlanVo queryById(Long id);
/**
* 分页查询月度资金计划列表
*
* @param bo 查询条件
* @param pageQuery 分页参数
* @return 月度资金计划分页列表
*/
TableDataInfo<FinancialRevenueExpenditurePlanVo> queryPageList(FinancialRevenueExpenditurePlanBo bo, PageQuery pageQuery);
/**
* 查询符合条件的月度资金计划列表
*
* @param bo 查询条件
* @return 月度资金计划列表
*/
List<FinancialRevenueExpenditurePlanVo> queryList(FinancialRevenueExpenditurePlanBo bo);
/**
* 新增月度资金计划
*
* @param bo 月度资金计划
* @return 是否新增成功
*/
Boolean insertByBo(FinancialRevenueExpenditurePlanBo bo);
/**
* 修改月度资金计划
*
* @param bo 月度资金计划
* @return 是否修改成功
*/
Boolean updateByBo(FinancialRevenueExpenditurePlanBo bo);
/**
* 校验并批量删除月度资金计划信息
*
* @param ids 待删除的主键集合
* @param isValid 是否进行有效性校验
* @return 是否删除成功
*/
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
}

View File

@ -0,0 +1,70 @@
package org.dromara.xzd.zijinjihua.yueduzijinjihua.service;
import org.dromara.xzd.zijinjihua.yueduzijinjihua.domain.vo.StatementOfExpendituresVo;
import org.dromara.xzd.zijinjihua.yueduzijinjihua.domain.bo.StatementOfExpendituresBo;
import org.dromara.xzd.zijinjihua.yueduzijinjihua.domain.StatementOfExpenditures;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.mybatis.core.page.PageQuery;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.Collection;
import java.util.List;
/**
* 资金计划-支出明细Service接口
*
* @author Lion Li
* @date 2025-10-16
*/
public interface IStatementOfExpendituresService extends IService<StatementOfExpenditures>{
/**
* 查询资金计划-支出明细
*
* @param id 主键
* @return 资金计划-支出明细
*/
StatementOfExpendituresVo queryById(Long id);
/**
* 分页查询资金计划-支出明细列表
*
* @param bo 查询条件
* @param pageQuery 分页参数
* @return 资金计划-支出明细分页列表
*/
TableDataInfo<StatementOfExpendituresVo> queryPageList(StatementOfExpendituresBo bo, PageQuery pageQuery);
/**
* 查询符合条件的资金计划-支出明细列表
*
* @param bo 查询条件
* @return 资金计划-支出明细列表
*/
List<StatementOfExpendituresVo> queryList(StatementOfExpendituresBo bo);
/**
* 新增资金计划-支出明细
*
* @param bo 资金计划-支出明细
* @return 是否新增成功
*/
Boolean insertByBo(StatementOfExpendituresBo bo);
/**
* 修改资金计划-支出明细
*
* @param bo 资金计划-支出明细
* @return 是否修改成功
*/
Boolean updateByBo(StatementOfExpendituresBo bo);
/**
* 校验并批量删除资金计划-支出明细信息
*
* @param ids 待删除的主键集合
* @param isValid 是否进行有效性校验
* @return 是否删除成功
*/
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
}

View File

@ -0,0 +1,145 @@
package org.dromara.xzd.zijinjihua.yueduzijinjihua.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.dromara.common.core.utils.MapstructUtils;
import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.mybatis.core.page.PageQuery;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.dromara.xzd.zijinjihua.yueduzijinjihua.domain.bo.DetailOfEarningsBo;
import org.dromara.xzd.zijinjihua.yueduzijinjihua.domain.vo.DetailOfEarningsVo;
import org.dromara.xzd.zijinjihua.yueduzijinjihua.domain.DetailOfEarnings;
import org.dromara.xzd.zijinjihua.yueduzijinjihua.mapper.DetailOfEarningsMapper;
import org.dromara.xzd.zijinjihua.yueduzijinjihua.service.IDetailOfEarningsService;
import java.util.List;
import java.util.Map;
import java.util.Collection;
/**
* 资金计划-收入明细Service业务层处理
*
* @author Lion Li
* @date 2025-10-16
*/
@RequiredArgsConstructor
@Service
public class DetailOfEarningsServiceImpl extends ServiceImpl<DetailOfEarningsMapper, DetailOfEarnings> implements IDetailOfEarningsService {
private final DetailOfEarningsMapper baseMapper;
/**
* 查询资金计划-收入明细
*
* @param id 主键
* @return 资金计划-收入明细
*/
@Override
public DetailOfEarningsVo queryById(Long id){
return baseMapper.selectVoById(id);
}
/**
* 分页查询资金计划-收入明细列表
*
* @param bo 查询条件
* @param pageQuery 分页参数
* @return 资金计划-收入明细分页列表
*/
@Override
public TableDataInfo<DetailOfEarningsVo> queryPageList(DetailOfEarningsBo bo, PageQuery pageQuery) {
LambdaQueryWrapper<DetailOfEarnings> lqw = buildQueryWrapper(bo);
Page<DetailOfEarningsVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
return TableDataInfo.build(result);
}
/**
* 查询符合条件的资金计划-收入明细列表
*
* @param bo 查询条件
* @return 资金计划-收入明细列表
*/
@Override
public List<DetailOfEarningsVo> queryList(DetailOfEarningsBo bo) {
LambdaQueryWrapper<DetailOfEarnings> lqw = buildQueryWrapper(bo);
return baseMapper.selectVoList(lqw);
}
private LambdaQueryWrapper<DetailOfEarnings> buildQueryWrapper(DetailOfEarningsBo bo) {
LambdaQueryWrapper<DetailOfEarnings> lqw = Wrappers.lambdaQuery();
lqw.orderByDesc(DetailOfEarnings::getId);
lqw.eq(bo.getFinancialRevenueId() != null, DetailOfEarnings::getFinancialRevenueId, bo.getFinancialRevenueId());
lqw.eq(StringUtils.isNotBlank(bo.getBudgetItem()), DetailOfEarnings::getBudgetItem, bo.getBudgetItem());
lqw.eq(bo.getIncomeAmount() != null, DetailOfEarnings::getIncomeAmount, bo.getIncomeAmount());
lqw.eq(StringUtils.isNotBlank(bo.getIsInvoice()), DetailOfEarnings::getIsInvoice, bo.getIsInvoice());
lqw.eq(bo.getChangedAmount() != null, DetailOfEarnings::getChangedAmount, bo.getChangedAmount());
lqw.eq(bo.getCbs() != null, DetailOfEarnings::getCbs, bo.getCbs());
lqw.eq(bo.getCbsAmount() != null, DetailOfEarnings::getCbsAmount, bo.getCbsAmount());
lqw.eq(bo.getCbsBalance() != null, DetailOfEarnings::getCbsBalance, bo.getCbsBalance());
lqw.eq(bo.getPartyAUnit() != null, DetailOfEarnings::getPartyAUnit, bo.getPartyAUnit());
lqw.eq(bo.getContractCode() != null, DetailOfEarnings::getContractCode, bo.getContractCode());
lqw.like(StringUtils.isNotBlank(bo.getContractName()), DetailOfEarnings::getContractName, bo.getContractName());
lqw.eq(bo.getContractAmount() != null, DetailOfEarnings::getContractAmount, bo.getContractAmount());
lqw.eq(bo.getCumulativeApprovedOutputValue() != null, DetailOfEarnings::getCumulativeApprovedOutputValue, bo.getCumulativeApprovedOutputValue());
lqw.eq(bo.getCumulativeReceiptAmount() != null, DetailOfEarnings::getCumulativeReceiptAmount, bo.getCumulativeReceiptAmount());
lqw.eq(bo.getSettlementRatio() != null, DetailOfEarnings::getSettlementRatio, bo.getSettlementRatio());
lqw.eq(bo.getReceiptRatio() != null, DetailOfEarnings::getReceiptRatio, bo.getReceiptRatio());
return lqw;
}
/**
* 新增资金计划-收入明细
*
* @param bo 资金计划-收入明细
* @return 是否新增成功
*/
@Override
public Boolean insertByBo(DetailOfEarningsBo bo) {
DetailOfEarnings add = MapstructUtils.convert(bo, DetailOfEarnings.class);
validEntityBeforeSave(add);
boolean flag = baseMapper.insert(add) > 0;
if (flag) {
bo.setId(add.getId());
}
return flag;
}
/**
* 修改资金计划-收入明细
*
* @param bo 资金计划-收入明细
* @return 是否修改成功
*/
@Override
public Boolean updateByBo(DetailOfEarningsBo bo) {
DetailOfEarnings update = MapstructUtils.convert(bo, DetailOfEarnings.class);
validEntityBeforeSave(update);
return baseMapper.updateById(update) > 0;
}
/**
* 保存前的数据校验
*/
private void validEntityBeforeSave(DetailOfEarnings entity){
//TODO 做一些数据校验,如唯一约束
}
/**
* 校验并批量删除资金计划-收入明细信息
*
* @param ids 待删除的主键集合
* @param isValid 是否进行有效性校验
* @return 是否删除成功
*/
@Override
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
if(isValid){
//TODO 做一些业务上的校验,判断是否需要校验
}
return baseMapper.deleteByIds(ids) > 0;
}
}

View File

@ -0,0 +1,336 @@
package org.dromara.xzd.zijinjihua.yueduzijinjihua.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.dromara.common.core.domain.R;
import org.dromara.common.core.utils.MapstructUtils;
import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.mybatis.core.page.PageQuery;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.RequiredArgsConstructor;
import org.dromara.system.service.impl.SysOssServiceImpl;
import org.dromara.xzd.contractManagement.caigoucontractTermination.domain.vo.XzdPurchaseContractSuspendVo;
import org.dromara.xzd.contractManagement.fenbaohetongxinxi.domain.XzdSubcontract;
import org.dromara.xzd.contractManagement.fenbaohetongxinxi.domain.vo.XzdSubcontractVo;
import org.dromara.xzd.domain.*;
import org.dromara.xzd.domain.dto.QuerCorrespondentDto;
import org.dromara.xzd.service.IXzdContractDetailsService;
import org.dromara.xzd.service.IXzdCorrespondentList;
import org.dromara.xzd.service.impl.XzdProjectServiceImpl;
import org.dromara.xzd.service.impl.XzdSupplierInfoServiceImpl;
import org.dromara.xzd.utilS.AreaUtil;
import org.dromara.xzd.zijinjihua.service.ICbsTreeStructureService;
import org.dromara.xzd.zijinjihua.yueduzijinjihua.domain.DetailOfEarnings;
import org.dromara.xzd.zijinjihua.yueduzijinjihua.domain.StatementOfExpenditures;
import org.dromara.xzd.zijinjihua.yueduzijinjihua.domain.bo.DetailOfEarningsBo;
import org.dromara.xzd.zijinjihua.yueduzijinjihua.domain.bo.StatementOfExpendituresBo;
import org.dromara.xzd.zijinjihua.yueduzijinjihua.domain.vo.DetailOfEarningsVo;
import org.dromara.xzd.zijinjihua.yueduzijinjihua.domain.vo.StatementOfExpendituresVo;
import org.dromara.xzd.zijinjihua.yueduzijinjihua.service.IDetailOfEarningsService;
import org.dromara.xzd.zijinjihua.yueduzijinjihua.service.IStatementOfExpendituresService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.dromara.xzd.zijinjihua.yueduzijinjihua.domain.bo.FinancialRevenueExpenditurePlanBo;
import org.dromara.xzd.zijinjihua.yueduzijinjihua.domain.vo.FinancialRevenueExpenditurePlanVo;
import org.dromara.xzd.zijinjihua.yueduzijinjihua.domain.FinancialRevenueExpenditurePlan;
import org.dromara.xzd.zijinjihua.yueduzijinjihua.mapper.FinancialRevenueExpenditurePlanMapper;
import org.dromara.xzd.zijinjihua.yueduzijinjihua.service.IFinancialRevenueExpenditurePlanService;
import org.springframework.transaction.annotation.Transactional;
import java.time.LocalDate;
import java.util.*;
import java.util.stream.Collectors;
/**
* 月度资金计划Service业务层处理
*
* @author Lion Li
* @date 2025-10-15
*/
@RequiredArgsConstructor
@Service
public class FinancialRevenueExpenditurePlanServiceImpl extends ServiceImpl<FinancialRevenueExpenditurePlanMapper, FinancialRevenueExpenditurePlan> implements IFinancialRevenueExpenditurePlanService {
private final FinancialRevenueExpenditurePlanMapper baseMapper;
private final AreaUtil areaUtil;
private final IDetailOfEarningsService iDetailOfEarningsService;
private final IStatementOfExpendituresService iStatementOfExpendituresService;
private final IXzdContractDetailsService xzdContractDetailsService;
private final ICbsTreeStructureService iCbsTreeStructureService;
@Autowired
private XzdProjectServiceImpl xzdProjectService;
@Autowired
private IXzdCorrespondentList iXzdCorrespondentList;
@Autowired
private XzdSupplierInfoServiceImpl xzdSupplierInfoService;
@Autowired
private SysOssServiceImpl sysOssService;
/**
* 查询月度资金计划
*
* @param id 主键
* @return 月度资金计划
*/
@Override
public FinancialRevenueExpenditurePlanVo queryById(Long id){
FinancialRevenueExpenditurePlanVo financialRevenueExpenditurePlanVo = baseMapper.selectVoById(id);
List<FinancialRevenueExpenditurePlanVo> vo = List.of(financialRevenueExpenditurePlanVo);
savaValue(vo,true);
return vo.getFirst();
}
/**
* 分页查询月度资金计划列表
*
* @param bo 查询条件
* @param pageQuery 分页参数
* @return 月度资金计划分页列表
*/
@Override
public TableDataInfo<FinancialRevenueExpenditurePlanVo> queryPageList(FinancialRevenueExpenditurePlanBo bo, PageQuery pageQuery) {
LambdaQueryWrapper<FinancialRevenueExpenditurePlan> lqw = buildQueryWrapper(bo);
Page<FinancialRevenueExpenditurePlanVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
savaValue(result.getRecords(),false);
return TableDataInfo.build(result);
}
private void savaValue(List<FinancialRevenueExpenditurePlanVo> records,Boolean type) {
for (FinancialRevenueExpenditurePlanVo item : records) {
//项目名称
if (item.getProject() != null){
String projectName = xzdProjectService.queryNameById(item.getProject());
if (projectName != null){
item.setProjectName(projectName);
}
}
HashMap<String, Object> hashMap = new HashMap<>();
hashMap.put("financial_revenue_id",item.getId());
// 收入
List<DetailOfEarnings> detail = iDetailOfEarningsService.getBaseMapper().selectByMap(hashMap);
if (detail != null && detail.size() > 0){
List<DetailOfEarningsVo> convert = MapstructUtils.convert(detail, DetailOfEarningsVo.class);
if (type){
convert.forEach(temp ->{
//甲方单位(客户信息列表)
R<QuerCorrespondentDto> byid = iXzdCorrespondentList.getCustomerByid(temp.getPartyAUnit());
if (byid!=null){
if (byid.getData().getXzdCustomerinformation() != null){
temp.setPartyAUnitName(byid.getData().getXzdCustomerinformation().getUnitName());
}
}
// cbs
Long cbs = temp.getCbs();
if (cbs != null){
String name = iCbsTreeStructureService.queryById(cbs).getName();
temp.setCbsName(name);
}
// 合同
XzdContractDetails contractDetailsServiceById = xzdContractDetailsService.getById(temp.getContractCode());
if(contractDetailsServiceById != null){
temp.setContractCodeName(contractDetailsServiceById.getContractCode());
}
});
}
item.setDetailOfEarnings(convert);
}
// 支出
List<StatementOfExpenditures> statementOfExpenditures = iStatementOfExpendituresService.getBaseMapper().selectByMap(hashMap);
if (statementOfExpenditures != null && statementOfExpenditures.size() > 0){
List<StatementOfExpendituresVo> convert = MapstructUtils.convert(statementOfExpenditures, StatementOfExpendituresVo.class);
if (type){
convert.forEach(temp ->{
//供应商 supplier
String unitName = xzdSupplierInfoService.queryNameById(temp.getSupplier());
if (StringUtils.isNotBlank(unitName)){
temp.setSupplierName(unitName);
}
Long cbs = temp.getCbs();
if (cbs != null){
String name = iCbsTreeStructureService.queryById(cbs).getName();
temp.setCbsName(name);
}
// 合同
XzdContractDetails contractDetailsServiceById = xzdContractDetailsService.getById(temp.getContractCode());
if(contractDetailsServiceById != null){
temp.setContractCodeName(contractDetailsServiceById.getContractCode());
}
});
}
item.setStatementOfExpenditures(convert);
}
}
}
/**
* 查询符合条件的月度资金计划列表
*
* @param bo 查询条件
* @return 月度资金计划列表
*/
@Override
public List<FinancialRevenueExpenditurePlanVo> queryList(FinancialRevenueExpenditurePlanBo bo) {
LambdaQueryWrapper<FinancialRevenueExpenditurePlan> lqw = buildQueryWrapper(bo);
return baseMapper.selectVoList(lqw);
}
private LambdaQueryWrapper<FinancialRevenueExpenditurePlan> buildQueryWrapper(FinancialRevenueExpenditurePlanBo bo) {
Map<String, Object> params = bo.getParams();
LambdaQueryWrapper<FinancialRevenueExpenditurePlan> lqw = Wrappers.lambdaQuery();
lqw.orderByDesc(FinancialRevenueExpenditurePlan::getId);
lqw.eq(StringUtils.isNotBlank(bo.getDocumentCode()), FinancialRevenueExpenditurePlan::getDocumentCode, bo.getDocumentCode());
lqw.like(StringUtils.isNotBlank(bo.getDocumentName()), FinancialRevenueExpenditurePlan::getDocumentName, bo.getDocumentName());
lqw.eq(bo.getProject() != null, FinancialRevenueExpenditurePlan::getProject, bo.getProject());
lqw.eq(StringUtils.isNotBlank(bo.getPlanType()), FinancialRevenueExpenditurePlan::getPlanType, bo.getPlanType());
lqw.eq(bo.getWorkCycle() != null, FinancialRevenueExpenditurePlan::getWorkCycle, bo.getWorkCycle());
lqw.eq(bo.getStartDate() != null, FinancialRevenueExpenditurePlan::getStartDate, bo.getStartDate());
lqw.eq(bo.getEndDate() != null, FinancialRevenueExpenditurePlan::getEndDate, bo.getEndDate());
lqw.eq(bo.getExpenseTotal() != null, FinancialRevenueExpenditurePlan::getExpenseTotal, bo.getExpenseTotal());
lqw.eq(bo.getIncomeTotal() != null, FinancialRevenueExpenditurePlan::getIncomeTotal, bo.getIncomeTotal());
lqw.eq(StringUtils.isNotBlank(bo.getIsTemporaryPlan()), FinancialRevenueExpenditurePlan::getIsTemporaryPlan, bo.getIsTemporaryPlan());
lqw.eq(bo.getDocumentDateLastMonth() != null, FinancialRevenueExpenditurePlan::getDocumentDateLastMonth, bo.getDocumentDateLastMonth());
lqw.eq(StringUtils.isNotBlank(bo.getRemarks()), FinancialRevenueExpenditurePlan::getRemarks, bo.getRemarks());
lqw.eq(bo.getProjectAvailableBalance() != null, FinancialRevenueExpenditurePlan::getProjectAvailableBalance, bo.getProjectAvailableBalance());
lqw.eq(bo.getCumulativeReceiptAmount() != null, FinancialRevenueExpenditurePlan::getCumulativeReceiptAmount, bo.getCumulativeReceiptAmount());
lqw.eq(bo.getCumulativePaymentAmount() != null, FinancialRevenueExpenditurePlan::getCumulativePaymentAmount, bo.getCumulativePaymentAmount());
lqw.eq(bo.getReimbursementAmount() != null, FinancialRevenueExpenditurePlan::getReimbursementAmount, bo.getReimbursementAmount());
lqw.eq(bo.getContractPaymentAmount() != null, FinancialRevenueExpenditurePlan::getContractPaymentAmount, bo.getContractPaymentAmount());
lqw.eq(bo.getRemainingFunds() != null, FinancialRevenueExpenditurePlan::getRemainingFunds, bo.getRemainingFunds());
lqw.eq(bo.getRealTimeRefresh() != null, FinancialRevenueExpenditurePlan::getRealTimeRefresh, bo.getRealTimeRefresh());
lqw.eq(bo.getMonthlyExpenditureBalance() != null, FinancialRevenueExpenditurePlan::getMonthlyExpenditureBalance, bo.getMonthlyExpenditureBalance());
lqw.eq(bo.getMonthlyCumulativeExpenditure() != null, FinancialRevenueExpenditurePlan::getMonthlyCumulativeExpenditure, bo.getMonthlyCumulativeExpenditure());
lqw.eq(bo.getAnnualExpenditureBalance() != null, FinancialRevenueExpenditurePlan::getAnnualExpenditureBalance, bo.getAnnualExpenditureBalance());
lqw.eq(bo.getAnnualCumulativeExpenditure() != null, FinancialRevenueExpenditurePlan::getAnnualCumulativeExpenditure, bo.getAnnualCumulativeExpenditure());
lqw.eq(StringUtils.isNotBlank(bo.getFileId()), FinancialRevenueExpenditurePlan::getFileId, bo.getFileId());
lqw.eq(StringUtils.isNotBlank(bo.getAuditStatus()), FinancialRevenueExpenditurePlan::getAuditStatus, bo.getAuditStatus());
return lqw;
}
/**
* 新增月度资金计划
*
* @param bo 月度资金计划
* @return 是否新增成功
*/
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean insertByBo(FinancialRevenueExpenditurePlanBo bo) {
FinancialRevenueExpenditurePlan add = MapstructUtils.convert(bo, FinancialRevenueExpenditurePlan.class);
validEntityBeforeSave(add);
Long l = baseMapper.selectCount(new LambdaQueryWrapper<FinancialRevenueExpenditurePlan>().gt(FinancialRevenueExpenditurePlan::getCreateTime, LocalDate.now()));
String s = areaUtil.generateDateBasedNumber();
add.setDocumentCode(s+"-"+(l+1));
boolean flag = baseMapper.insert(add) > 0;
// 收入明细
List<DetailOfEarningsBo> detailOfEarnings = bo.getDetailOfEarnings();
if (detailOfEarnings != null && detailOfEarnings.size() > 0) {
detailOfEarnings.forEach(item -> {
item.setFinancialRevenueId(add.getId() );
});
iDetailOfEarningsService.saveBatch(MapstructUtils.convert(detailOfEarnings, DetailOfEarnings.class));
}
// 支出明细
List<StatementOfExpendituresBo> statementOfExpenditures = bo.getStatementOfExpenditures();
statementOfExpenditures.forEach(item -> {
item.setFinancialRevenueId(add.getId());
});
iStatementOfExpendituresService.saveBatch(MapstructUtils.convert(statementOfExpenditures, StatementOfExpenditures.class));
if (flag) {
bo.setId(add.getId());
}
return flag;
}
/**
* 修改月度资金计划
*
* @param bo 月度资金计划
* @return 是否修改成功
*/
@Override
public Boolean updateByBo(FinancialRevenueExpenditurePlanBo bo) {
FinancialRevenueExpenditurePlan update = MapstructUtils.convert(bo, FinancialRevenueExpenditurePlan.class);
List<DetailOfEarningsBo> detailOfEarnings = bo.getDetailOfEarnings();
HashMap<String, Object> hashMap = new HashMap<>();
hashMap.put("financial_revenue_id",bo.getId());
// 收入
iDetailOfEarningsService.getBaseMapper().deleteByMap(hashMap);
if (detailOfEarnings != null && detailOfEarnings.size() > 0) {
detailOfEarnings.forEach(item ->{
item.setFinancialRevenueId(bo.getId());
});
iDetailOfEarningsService.saveBatch(MapstructUtils.convert(detailOfEarnings, DetailOfEarnings.class));
}
// 支出
iStatementOfExpendituresService.getBaseMapper().deleteByMap(hashMap);
List<StatementOfExpendituresBo> statementOfExpenditures = bo.getStatementOfExpenditures();
if (statementOfExpenditures != null && statementOfExpenditures.size() > 0) {
statementOfExpenditures.forEach(item ->{
item.setFinancialRevenueId(bo.getId());
});
iStatementOfExpendituresService.saveBatch(MapstructUtils.convert(statementOfExpenditures, StatementOfExpenditures.class));
}
return baseMapper.updateById(update) > 0;
}
/**
* 保存前的数据校验
*/
private void validEntityBeforeSave(FinancialRevenueExpenditurePlan entity){
//TODO 做一些数据校验,如唯一约束
}
/**
* 校验并批量删除月度资金计划信息
*
* @param ids 待删除的主键集合
* @param isValid 是否进行有效性校验
* @return 是否删除成功
*/
@Override
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
if(isValid){
}
for (Long id : ids) {
FinancialRevenueExpenditurePlanVo vo = baseMapper.selectVoById(id);
// 删除附件
if (!StringUtils.isEmpty(vo.getFileId())){
List<Long> collect = Arrays.stream(vo.getFileId().split(",")).map(item -> {
return Long.parseLong(item);
}).collect(Collectors.toList());
sysOssService.deleteWithValidByIds(collect, false);
}
}
// 删除支出,收入
LambdaQueryWrapper<DetailOfEarnings> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.in(DetailOfEarnings::getFinancialRevenueId, ids);
iDetailOfEarningsService.getBaseMapper().delete(lambdaQueryWrapper);
LambdaQueryWrapper<StatementOfExpenditures> lambdaQueryWrapper1 = new LambdaQueryWrapper<>();
lambdaQueryWrapper1.in(StatementOfExpenditures::getFinancialRevenueId, ids);
iStatementOfExpendituresService.getBaseMapper().delete(lambdaQueryWrapper1);
return baseMapper.deleteByIds(ids) > 0;
}
}

View File

@ -0,0 +1,147 @@
package org.dromara.xzd.zijinjihua.yueduzijinjihua.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.dromara.common.core.utils.MapstructUtils;
import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.mybatis.core.page.PageQuery;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.dromara.xzd.zijinjihua.yueduzijinjihua.domain.bo.StatementOfExpendituresBo;
import org.dromara.xzd.zijinjihua.yueduzijinjihua.domain.vo.StatementOfExpendituresVo;
import org.dromara.xzd.zijinjihua.yueduzijinjihua.domain.StatementOfExpenditures;
import org.dromara.xzd.zijinjihua.yueduzijinjihua.mapper.StatementOfExpendituresMapper;
import org.dromara.xzd.zijinjihua.yueduzijinjihua.service.IStatementOfExpendituresService;
import java.util.List;
import java.util.Map;
import java.util.Collection;
/**
* 资金计划-支出明细Service业务层处理
*
* @author Lion Li
* @date 2025-10-16
*/
@RequiredArgsConstructor
@Service
public class StatementOfExpendituresServiceImpl extends ServiceImpl<StatementOfExpendituresMapper, StatementOfExpenditures> implements IStatementOfExpendituresService {
private final StatementOfExpendituresMapper baseMapper;
/**
* 查询资金计划-支出明细
*
* @param id 主键
* @return 资金计划-支出明细
*/
@Override
public StatementOfExpendituresVo queryById(Long id){
return baseMapper.selectVoById(id);
}
/**
* 分页查询资金计划-支出明细列表
*
* @param bo 查询条件
* @param pageQuery 分页参数
* @return 资金计划-支出明细分页列表
*/
@Override
public TableDataInfo<StatementOfExpendituresVo> queryPageList(StatementOfExpendituresBo bo, PageQuery pageQuery) {
LambdaQueryWrapper<StatementOfExpenditures> lqw = buildQueryWrapper(bo);
Page<StatementOfExpendituresVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
return TableDataInfo.build(result);
}
/**
* 查询符合条件的资金计划-支出明细列表
*
* @param bo 查询条件
* @return 资金计划-支出明细列表
*/
@Override
public List<StatementOfExpendituresVo> queryList(StatementOfExpendituresBo bo) {
LambdaQueryWrapper<StatementOfExpenditures> lqw = buildQueryWrapper(bo);
return baseMapper.selectVoList(lqw);
}
private LambdaQueryWrapper<StatementOfExpenditures> buildQueryWrapper(StatementOfExpendituresBo bo) {
LambdaQueryWrapper<StatementOfExpenditures> lqw = Wrappers.lambdaQuery();
lqw.orderByDesc(StatementOfExpenditures::getId);
lqw.eq(bo.getFinancialRevenueId() != null, StatementOfExpenditures::getFinancialRevenueId, bo.getFinancialRevenueId());
lqw.eq(StringUtils.isNotBlank(bo.getBudgetItem()), StatementOfExpenditures::getBudgetItem, bo.getBudgetItem());
lqw.eq(StringUtils.isNotBlank(bo.getExpenseType()), StatementOfExpenditures::getExpenseType, bo.getExpenseType());
lqw.eq(bo.getExpenseAmount() != null, StatementOfExpenditures::getExpenseAmount, bo.getExpenseAmount());
lqw.eq(bo.getChangedAmount() != null, StatementOfExpenditures::getChangedAmount, bo.getChangedAmount());
lqw.eq(bo.getCbs() != null, StatementOfExpenditures::getCbs, bo.getCbs());
lqw.eq(bo.getCbsAmount() != null, StatementOfExpenditures::getCbsAmount, bo.getCbsAmount());
lqw.eq(bo.getCbsBalance() != null, StatementOfExpenditures::getCbsBalance, bo.getCbsBalance());
lqw.eq(bo.getSupplier() != null, StatementOfExpenditures::getSupplier, bo.getSupplier());
lqw.eq(bo.getContractCode() != null, StatementOfExpenditures::getContractCode, bo.getContractCode());
lqw.like(StringUtils.isNotBlank(bo.getContractName()), StatementOfExpenditures::getContractName, bo.getContractName());
lqw.eq(bo.getContractAmount() != null, StatementOfExpenditures::getContractAmount, bo.getContractAmount());
lqw.eq(bo.getCumulativeProgressSettlement() != null, StatementOfExpenditures::getCumulativeProgressSettlement, bo.getCumulativeProgressSettlement());
lqw.eq(bo.getCumulativePaymentAmount() != null, StatementOfExpenditures::getCumulativePaymentAmount, bo.getCumulativePaymentAmount());
lqw.eq(bo.getCumulativeInvoiceAmount() != null, StatementOfExpenditures::getCumulativeInvoiceAmount, bo.getCumulativeInvoiceAmount());
lqw.eq(bo.getCurrentPeriodPayableAmount() != null, StatementOfExpenditures::getCurrentPeriodPayableAmount, bo.getCurrentPeriodPayableAmount());
lqw.eq(bo.getPaymentContractRatio() != null, StatementOfExpenditures::getPaymentContractRatio, bo.getPaymentContractRatio());
lqw.eq(bo.getProgressPaymentToCurrentPayableRatio() != null, StatementOfExpenditures::getProgressPaymentToCurrentPayableRatio, bo.getProgressPaymentToCurrentPayableRatio());
return lqw;
}
/**
* 新增资金计划-支出明细
*
* @param bo 资金计划-支出明细
* @return 是否新增成功
*/
@Override
public Boolean insertByBo(StatementOfExpendituresBo bo) {
StatementOfExpenditures add = MapstructUtils.convert(bo, StatementOfExpenditures.class);
validEntityBeforeSave(add);
boolean flag = baseMapper.insert(add) > 0;
if (flag) {
bo.setId(add.getId());
}
return flag;
}
/**
* 修改资金计划-支出明细
*
* @param bo 资金计划-支出明细
* @return 是否修改成功
*/
@Override
public Boolean updateByBo(StatementOfExpendituresBo bo) {
StatementOfExpenditures update = MapstructUtils.convert(bo, StatementOfExpenditures.class);
validEntityBeforeSave(update);
return baseMapper.updateById(update) > 0;
}
/**
* 保存前的数据校验
*/
private void validEntityBeforeSave(StatementOfExpenditures entity){
//TODO 做一些数据校验,如唯一约束
}
/**
* 校验并批量删除资金计划-支出明细信息
*
* @param ids 待删除的主键集合
* @param isValid 是否进行有效性校验
* @return 是否删除成功
*/
@Override
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
if(isValid){
//TODO 做一些业务上的校验,判断是否需要校验
}
return baseMapper.deleteByIds(ids) > 0;
}
}