11-5-报销模块

This commit is contained in:
2025-11-05 16:25:57 +08:00
parent 30f916f8eb
commit 587cabc166
20 changed files with 2107 additions and 0 deletions

View File

@ -0,0 +1,105 @@
package org.dromara.xzd.bx.bxsq.bxlx.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;
import lombok.RequiredArgsConstructor;
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.excel.utils.ExcelUtil;
import org.dromara.common.idempotent.annotation.RepeatSubmit;
import org.dromara.common.log.annotation.Log;
import org.dromara.common.log.enums.BusinessType;
import org.dromara.common.web.core.BaseController;
import org.dromara.xzd.bx.bxsq.bxlx.domain.bo.XzdBxBxsqBxlxBo;
import org.dromara.xzd.bx.bxsq.bxlx.domain.vo.XzdBxBxsqBxlxVo;
import org.dromara.xzd.bx.bxsq.bxlx.service.IXzdBxBxsqBxlxService;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
* 报销申请-报销类型
*
* @author Lion Li
* @date 2025-11-05
*/
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/xzd/bxlx/bxlx")
public class XzdBxBxsqBxlxController extends BaseController {
private final IXzdBxBxsqBxlxService xzdBxBxsqBxlxService;
/**
* 查询报销申请-报销类型列表
*/
@SaCheckPermission("bxlx:bxlx:list")
@GetMapping("/list")
public R<List<XzdBxBxsqBxlxVo>> list(XzdBxBxsqBxlxBo bo) {
List<XzdBxBxsqBxlxVo> list = xzdBxBxsqBxlxService.queryList(bo);
return R.ok(list);
}
/**
* 导出报销申请-报销类型列表
*/
@SaCheckPermission("bxlx:bxlx:export")
@Log(title = "报销申请-报销类型", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(XzdBxBxsqBxlxBo bo, HttpServletResponse response) {
List<XzdBxBxsqBxlxVo> list = xzdBxBxsqBxlxService.queryList(bo);
ExcelUtil.exportExcel(list, "报销申请-报销类型", XzdBxBxsqBxlxVo.class, response);
}
/**
* 获取报销申请-报销类型详细信息
*
* @param id 主键
*/
@SaCheckPermission("bxlx:bxlx:query")
@GetMapping("/{id}")
public R<XzdBxBxsqBxlxVo> getInfo(@NotNull(message = "主键不能为空")
@PathVariable Long id) {
return R.ok(xzdBxBxsqBxlxService.queryById(id));
}
/**
* 新增报销申请-报销类型
*/
@SaCheckPermission("bxlx:bxlx:add")
@Log(title = "报销申请-报销类型", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping()
public R<Void> add(@Validated(AddGroup.class) @RequestBody XzdBxBxsqBxlxBo bo) {
return toAjax(xzdBxBxsqBxlxService.insertByBo(bo));
}
/**
* 修改报销申请-报销类型
*/
@SaCheckPermission("bxlx:bxlx:edit")
@Log(title = "报销申请-报销类型", businessType = BusinessType.UPDATE)
@RepeatSubmit()
@PutMapping()
public R<Void> edit(@Validated(EditGroup.class) @RequestBody XzdBxBxsqBxlxBo bo) {
return toAjax(xzdBxBxsqBxlxService.updateByBo(bo));
}
/**
* 删除报销申请-报销类型
*
* @param ids 主键串
*/
@SaCheckPermission("bxlx:bxlx:remove")
@Log(title = "报销申请-报销类型", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}")
public R<Void> remove(@NotEmpty(message = "主键不能为空")
@PathVariable Long[] ids) {
return toAjax(xzdBxBxsqBxlxService.deleteWithValidByIds(List.of(ids), true));
}
}

View File

@ -0,0 +1,47 @@
package org.dromara.xzd.bx.bxsq.bxlx.domain;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.dromara.common.mybatis.core.domain.BaseEntity;
import java.io.Serial;
/**
* 报销申请-报销类型对象 xzd_bx_bxsq_bxlx
*
* @author Lion Li
* @date 2025-11-04
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("xzd_bx_bxsq_bxlx")
public class XzdBxBxsqBxlx extends BaseEntity {
@Serial
private static final long serialVersionUID = 1L;
/**
* id
*/
@TableId(value = "id")
private Long id;
/**
* 父id
*/
private Long pid;
/**
* 类型编码
*/
private String lxbm;
/**
* 类型名称
*/
private String lxmc;
}

View File

@ -0,0 +1,41 @@
package org.dromara.xzd.bx.bxsq.bxlx.domain.bo;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.dromara.common.mybatis.core.domain.BaseEntity;
import org.dromara.xzd.bx.bxsq.bxlx.domain.XzdBxBxsqBxlx;
/**
* 报销申请-报销类型业务对象 xzd_bx_bxsq_bxlx
*
* @author Lion Li
* @date 2025-11-05
*/
@Data
@EqualsAndHashCode(callSuper = true)
@AutoMapper(target = XzdBxBxsqBxlx.class, reverseConvertGenerate = false)
public class XzdBxBxsqBxlxBo extends BaseEntity {
/**
* id
*/
private Long id;
/**
* 父id
*/
private Long pid;
/**
* 类型编码
*/
private String lxbm;
/**
* 类型名称
*/
private String lxmc;
}

View File

@ -0,0 +1,52 @@
package org.dromara.xzd.bx.bxsq.bxlx.domain.vo;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import org.dromara.xzd.bx.bxsq.bxlx.domain.XzdBxBxsqBxlx;
import java.io.Serial;
import java.io.Serializable;
/**
* 报销申请-报销类型视图对象 xzd_bx_bxsq_bxlx
*
* @author Lion Li
* @date 2025-11-04
*/
@Data
@ExcelIgnoreUnannotated
@AutoMapper(target = XzdBxBxsqBxlx.class)
public class XzdBxBxsqBxlxVo implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* id
*/
@ExcelProperty(value = "id")
private Long id;
/**
* 父id
*/
@ExcelProperty(value = "父id")
private Long pid;
/**
* 类型编码
*/
@ExcelProperty(value = "类型编码")
private String lxbm;
/**
* 类型名称
*/
@ExcelProperty(value = "类型名称")
private String lxmc;
}

View File

@ -0,0 +1,15 @@
package org.dromara.xzd.bx.bxsq.bxlx.mapper;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
import org.dromara.xzd.bx.bxsq.bxlx.domain.XzdBxBxsqBxlx;
import org.dromara.xzd.bx.bxsq.bxlx.domain.vo.XzdBxBxsqBxlxVo;
/**
* 报销申请-报销类型Mapper接口
*
* @author Lion Li
* @date 2025-11-04
*/
public interface XzdBxBxsqBxlxMapper extends BaseMapperPlus<XzdBxBxsqBxlx, XzdBxBxsqBxlxVo> {
}

View File

@ -0,0 +1,70 @@
package org.dromara.xzd.bx.bxsq.bxlx.service;
import com.baomidou.mybatisplus.extension.service.IService;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.xzd.bx.bxsq.bxlx.domain.XzdBxBxsqBxlx;
import org.dromara.xzd.bx.bxsq.bxlx.domain.bo.XzdBxBxsqBxlxBo;
import org.dromara.xzd.bx.bxsq.bxlx.domain.vo.XzdBxBxsqBxlxVo;
import java.util.Collection;
import java.util.List;
/**
* 报销申请-报销类型Service接口
*
* @author Lion Li
* @date 2025-11-04
*/
public interface IXzdBxBxsqBxlxService extends IService<XzdBxBxsqBxlx>{
/**
* 查询报销申请-报销类型
*
* @param id 主键
* @return 报销申请-报销类型
*/
XzdBxBxsqBxlxVo queryById(Long id);
/**
* 分页查询报销申请-报销类型列表
*
* @param bo 查询条件
* @param pageQuery 分页参数
* @return 报销申请-报销类型分页列表
*/
TableDataInfo<XzdBxBxsqBxlxVo> queryPageList(XzdBxBxsqBxlxBo bo, PageQuery pageQuery);
/**
* 查询符合条件的报销申请-报销类型列表
*
* @param bo 查询条件
* @return 报销申请-报销类型列表
*/
List<XzdBxBxsqBxlxVo> queryList(XzdBxBxsqBxlxBo bo);
/**
* 新增报销申请-报销类型
*
* @param bo 报销申请-报销类型
* @return 是否新增成功
*/
Boolean insertByBo(XzdBxBxsqBxlxBo bo);
/**
* 修改报销申请-报销类型
*
* @param bo 报销申请-报销类型
* @return 是否修改成功
*/
Boolean updateByBo(XzdBxBxsqBxlxBo bo);
/**
* 校验并批量删除报销申请-报销类型信息
*
* @param ids 待删除的主键集合
* @param isValid 是否进行有效性校验
* @return 是否删除成功
*/
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
}

View File

@ -0,0 +1,133 @@
package org.dromara.xzd.bx.bxsq.bxlx.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.RequiredArgsConstructor;
import org.dromara.common.core.utils.MapstructUtils;
import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.xzd.bx.bxsq.bxlx.domain.XzdBxBxsqBxlx;
import org.dromara.xzd.bx.bxsq.bxlx.domain.bo.XzdBxBxsqBxlxBo;
import org.dromara.xzd.bx.bxsq.bxlx.domain.vo.XzdBxBxsqBxlxVo;
import org.dromara.xzd.bx.bxsq.bxlx.mapper.XzdBxBxsqBxlxMapper;
import org.dromara.xzd.bx.bxsq.bxlx.service.IXzdBxBxsqBxlxService;
import org.springframework.stereotype.Service;
import java.util.Collection;
import java.util.List;
import java.util.Map;
/**
* 报销申请-报销类型Service业务层处理
*
* @author Lion Li
* @date 2025-11-04
*/
@RequiredArgsConstructor
@Service
public class XzdBxBxsqBxlxServiceImpl extends ServiceImpl<XzdBxBxsqBxlxMapper, XzdBxBxsqBxlx> implements IXzdBxBxsqBxlxService {
private final XzdBxBxsqBxlxMapper baseMapper;
/**
* 查询报销申请-报销类型
*
* @param id 主键
* @return 报销申请-报销类型
*/
@Override
public XzdBxBxsqBxlxVo queryById(Long id){
return baseMapper.selectVoById(id);
}
/**
* 分页查询报销申请-报销类型列表
*
* @param bo 查询条件
* @param pageQuery 分页参数
* @return 报销申请-报销类型分页列表
*/
@Override
public TableDataInfo<XzdBxBxsqBxlxVo> queryPageList(XzdBxBxsqBxlxBo bo, PageQuery pageQuery) {
LambdaQueryWrapper<XzdBxBxsqBxlx> lqw = buildQueryWrapper(bo);
Page<XzdBxBxsqBxlxVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
return TableDataInfo.build(result);
}
/**
* 查询符合条件的报销申请-报销类型列表
*
* @param bo 查询条件
* @return 报销申请-报销类型列表
*/
@Override
public List<XzdBxBxsqBxlxVo> queryList(XzdBxBxsqBxlxBo bo) {
LambdaQueryWrapper<XzdBxBxsqBxlx> lqw = buildQueryWrapper(bo);
return baseMapper.selectVoList(lqw);
}
private LambdaQueryWrapper<XzdBxBxsqBxlx> buildQueryWrapper(XzdBxBxsqBxlxBo bo) {
Map<String, Object> params = bo.getParams();
LambdaQueryWrapper<XzdBxBxsqBxlx> lqw = Wrappers.lambdaQuery();
lqw.orderByDesc(XzdBxBxsqBxlx::getId);
lqw.eq(bo.getPid() != null, XzdBxBxsqBxlx::getPid, bo.getPid());
lqw.eq(StringUtils.isNotBlank(bo.getLxbm()), XzdBxBxsqBxlx::getLxbm, bo.getLxbm());
lqw.eq(StringUtils.isNotBlank(bo.getLxmc()), XzdBxBxsqBxlx::getLxmc, bo.getLxmc());
return lqw;
}
/**
* 新增报销申请-报销类型
*
* @param bo 报销申请-报销类型
* @return 是否新增成功
*/
@Override
public Boolean insertByBo(XzdBxBxsqBxlxBo bo) {
XzdBxBxsqBxlx add = MapstructUtils.convert(bo, XzdBxBxsqBxlx.class);
validEntityBeforeSave(add);
boolean flag = baseMapper.insert(add) > 0;
if (flag) {
bo.setId(add.getId());
}
return flag;
}
/**
* 修改报销申请-报销类型
*
* @param bo 报销申请-报销类型
* @return 是否修改成功
*/
@Override
public Boolean updateByBo(XzdBxBxsqBxlxBo bo) {
XzdBxBxsqBxlx update = MapstructUtils.convert(bo, XzdBxBxsqBxlx.class);
validEntityBeforeSave(update);
return baseMapper.updateById(update) > 0;
}
/**
* 保存前的数据校验
*/
private void validEntityBeforeSave(XzdBxBxsqBxlx 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,106 @@
package org.dromara.xzd.bx.bxsq.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;
import lombok.RequiredArgsConstructor;
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.excel.utils.ExcelUtil;
import org.dromara.common.idempotent.annotation.RepeatSubmit;
import org.dromara.common.log.annotation.Log;
import org.dromara.common.log.enums.BusinessType;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.web.core.BaseController;
import org.dromara.xzd.bx.bxsq.domain.bo.XzdBxBxsqBo;
import org.dromara.xzd.bx.bxsq.domain.vo.XzdBxBxsqVo;
import org.dromara.xzd.bx.bxsq.service.IXzdBxBxsqService;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
* 报销-报销申请
*
* @author Lion Li
* @date 2025-11-04
*/
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/xzd/bxsq/bxsq")
public class XzdBxBxsqController extends BaseController {
private final IXzdBxBxsqService xzdBxBxsqService;
/**
* 查询报销-报销申请列表
*/
@SaCheckPermission("bxsq:bxsq:list")
@GetMapping("/list")
public TableDataInfo<XzdBxBxsqVo> list(XzdBxBxsqBo bo, PageQuery pageQuery) {
return xzdBxBxsqService.queryPageList(bo, pageQuery);
}
/**
* 导出报销-报销申请列表
*/
@SaCheckPermission("bxsq:bxsq:export")
@Log(title = "报销-报销申请", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(XzdBxBxsqBo bo, HttpServletResponse response) {
List<XzdBxBxsqVo> list = xzdBxBxsqService.queryList(bo);
ExcelUtil.exportExcel(list, "报销-报销申请", XzdBxBxsqVo.class, response);
}
/**
* 获取报销-报销申请详细信息
*
* @param id 主键
*/
@SaCheckPermission("bxsq:bxsq:query")
@GetMapping("/{id}")
public R<XzdBxBxsqVo> getInfo(@NotNull(message = "主键不能为空")
@PathVariable Long id) {
return R.ok(xzdBxBxsqService.queryById(id));
}
/**
* 新增报销-报销申请
*/
@SaCheckPermission("bxsq:bxsq:add")
@Log(title = "报销-报销申请", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping()
public R<Void> add(@Validated(AddGroup.class) @RequestBody XzdBxBxsqBo bo) {
return toAjax(xzdBxBxsqService.insertByBo(bo));
}
/**
* 修改报销-报销申请
*/
@SaCheckPermission("bxsq:bxsq:edit")
@Log(title = "报销-报销申请", businessType = BusinessType.UPDATE)
@RepeatSubmit()
@PutMapping()
public R<Void> edit(@Validated(EditGroup.class) @RequestBody XzdBxBxsqBo bo) {
return toAjax(xzdBxBxsqService.updateByBo(bo));
}
/**
* 删除报销-报销申请
*
* @param ids 主键串
*/
@SaCheckPermission("bxsq:bxsq:remove")
@Log(title = "报销-报销申请", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}")
public R<Void> remove(@NotEmpty(message = "主键不能为空")
@PathVariable Long[] ids) {
return toAjax(xzdBxBxsqService.deleteWithValidByIds(List.of(ids), true));
}
}

View File

@ -0,0 +1,155 @@
package org.dromara.xzd.bx.bxsq.domain;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.dromara.common.mybatis.core.domain.BaseEntity;
import java.io.Serial;
import java.math.BigDecimal;
import java.time.LocalDate;
/**
* 报销-报销申请对象 xzd_bx_bxsq
*
* @author Lion Li
* @date 2025-11-04
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("xzd_bx_bxsq")
public class XzdBxBxsq extends BaseEntity {
@Serial
private static final long serialVersionUID = 1L;
/**
* id
*/
@TableId(value = "id")
private Long id;
/**
* 审核状态
*/
private String shzt;
/**
* 单据编码
*/
private String djbm;
/**
* 申请日期
*/
private LocalDate sqrq;
/**
* 报销人
*/
private Long bxr;
/**
* 公司
*/
private Long gs;
/**
* 部门
*/
private Long bm;
/**
* 项目
*/
private Long xm;
/**
* 记账组织
*/
private String jzzz;
/**
* 报销类型
*/
private Long bxlx;
/**
* 事由
*/
private String sy;
/**
* 预算类型(字典)
*/
private String yslx;
/**
* 本次报销金额(元)
*/
private BigDecimal bcbxje;
/**
* 借款总余额
*/
private BigDecimal jkzye;
/**
* 冲销金额(元)
*/
private BigDecimal cxje;
/**
* 实领金额(元)
*/
private BigDecimal slje;
/**
* 还款金额(元)
*/
private BigDecimal hkje;
/**
* 审批金额(元)
*/
private BigDecimal spje;
/**
* 增值税税额(元)
*/
private BigDecimal zzsse;
/**
* 农产品税额(元)
*/
private BigDecimal ncpse;
/**
* 旅客运输税额(元)
*/
private BigDecimal lkysse;
/**
* 公司付款金额(元)
*/
private BigDecimal gsfkje;
/**
* 未付金额(元)
*/
private BigDecimal wfje;
/**
* 项目类型
*/
private String xmlx;
/**
* 项目大类
*/
private String xmdl;
private String fileId;
}

View File

@ -0,0 +1,157 @@
package org.dromara.xzd.bx.bxsq.domain.bo;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.dromara.common.mybatis.core.domain.BaseEntity;
import org.dromara.xzd.bx.bxsq.domain.XzdBxBxsq;
import org.dromara.xzd.bx.bxsq.fymx.domain.XzdBxBxsqFymx;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.List;
/**
* 报销-报销申请业务对象 xzd_bx_bxsq
*
* @author Lion Li
* @date 2025-11-04
*/
@Data
@EqualsAndHashCode(callSuper = true)
@AutoMapper(target = XzdBxBxsq.class, reverseConvertGenerate = false)
public class XzdBxBxsqBo extends BaseEntity {
/**
* id
*/
private Long id;
/**
* 审核状态
*/
private String shzt;
/**
* 单据编码
*/
private String djbm;
/**
* 申请日期
*/
private LocalDate sqrq;
/**
* 报销人
*/
private Long bxr;
/**
* 公司
*/
private Long gs;
/**
* 部门
*/
private Long bm;
/**
* 项目
*/
private Long xm;
/**
* 记账组织
*/
private String jzzz;
/**
* 报销类型
*/
private Long bxlx;
/**
* 事由
*/
private String sy;
/**
* 预算类型(字典)
*/
private String yslx;
/**
* 本次报销金额(元)
*/
private BigDecimal bcbxje;
/**
* 借款总余额
*/
private BigDecimal jkzye;
/**
* 冲销金额(元)
*/
private BigDecimal cxje;
/**
* 实领金额(元)
*/
private BigDecimal slje;
/**
* 还款金额(元)
*/
private BigDecimal hkje;
/**
* 审批金额(元)
*/
private BigDecimal spje;
/**
* 增值税税额(元)
*/
private BigDecimal zzsse;
/**
* 农产品税额(元)
*/
private BigDecimal ncpse;
/**
* 旅客运输税额(元)
*/
private BigDecimal lkysse;
/**
* 公司付款金额(元)
*/
private BigDecimal gsfkje;
/**
* 未付金额(元)
*/
private BigDecimal wfje;
/**
* 项目类型
*/
private String xmlx;
/**
* 项目大类
*/
private String xmdl;
private String fileId;
/**
* 费用明细
*/
private List<XzdBxBxsqFymx> fymx;
}

View File

@ -0,0 +1,213 @@
package org.dromara.xzd.bx.bxsq.domain.vo;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import org.dromara.xzd.bx.bxsq.domain.XzdBxBxsq;
import org.dromara.xzd.bx.bxsq.fymx.domain.vo.XzdBxBxsqFymxVo;
import java.io.Serial;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.List;
/**
* 报销-报销申请视图对象 xzd_bx_bxsq
*
* @author Lion Li
* @date 2025-11-04
*/
@Data
@ExcelIgnoreUnannotated
@AutoMapper(target = XzdBxBxsq.class)
public class XzdBxBxsqVo implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* id
*/
@ExcelProperty(value = "id")
private Long id;
/**
* 审核状态
*/
@ExcelProperty(value = "审核状态")
private String shzt;
/**
* 单据编码
*/
@ExcelProperty(value = "单据编码")
private String djbm;
/**
* 申请日期
*/
@ExcelProperty(value = "申请日期")
private LocalDate sqrq;
/**
* 报销人
*/
@ExcelProperty(value = "报销人")
private Long bxr;
/**
* 报销人名称
*/
private String bxrmc;
/**
* 公司
*/
@ExcelProperty(value = "公司")
private Long gs;
/**
* 公司名称
*/
private String gsmc;
/**
* 部门
*/
@ExcelProperty(value = "部门")
private Long bm;
/**
* 部门名称
*/
private String bmmc;
/**
* 项目
*/
@ExcelProperty(value = "项目")
private Long xm;
/**
* 项目名称
*/
private String xmmc;
/**
* 记账组织
*/
@ExcelProperty(value = "记账组织")
private String jzzz;
/**
* 报销类型
*/
@ExcelProperty(value = "报销类型")
private Long bxlx;
/**
* 报销类型名称
*/
private String bxlxmc;
/**
* 事由
*/
@ExcelProperty(value = "事由")
private String sy;
/**
* 预算类型(字典)
*/
@ExcelProperty(value = "预算类型(字典)")
private String yslx;
/**
* 本次报销金额(元)
*/
@ExcelProperty(value = "本次报销金额(元)")
private BigDecimal bcbxje;
/**
* 借款总余额
*/
@ExcelProperty(value = "借款总余额")
private BigDecimal jkzye;
/**
* 冲销金额(元)
*/
@ExcelProperty(value = "冲销金额(元)")
private BigDecimal cxje;
/**
* 实领金额(元)
*/
@ExcelProperty(value = "实领金额(元)")
private BigDecimal slje;
/**
* 还款金额(元)
*/
@ExcelProperty(value = "还款金额(元)")
private BigDecimal hkje;
/**
* 审批金额(元)
*/
@ExcelProperty(value = "审批金额(元)")
private BigDecimal spje;
/**
* 增值税税额(元)
*/
@ExcelProperty(value = "增值税税额(元)")
private BigDecimal zzsse;
/**
* 农产品税额(元)
*/
@ExcelProperty(value = "农产品税额(元)")
private BigDecimal ncpse;
/**
* 旅客运输税额(元)
*/
@ExcelProperty(value = "旅客运输税额(元)")
private BigDecimal lkysse;
/**
* 公司付款金额(元)
*/
@ExcelProperty(value = "公司付款金额(元)")
private BigDecimal gsfkje;
/**
* 未付金额(元)
*/
@ExcelProperty(value = "未付金额(元)")
private BigDecimal wfje;
/**
* 项目类型
*/
@ExcelProperty(value = "项目类型")
private String xmlx;
/**
* 项目大类
*/
@ExcelProperty(value = "项目大类")
private String xmdl;
private String fileId;
/**
* 费用明细
*/
private List<XzdBxBxsqFymxVo> fymx;
}

View File

@ -0,0 +1,99 @@
package org.dromara.xzd.bx.bxsq.fymx.domain;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.dromara.common.mybatis.core.domain.BaseEntity;
import java.io.Serial;
import java.math.BigDecimal;
import java.time.LocalDate;
/**
* 报销申请-费用明细对象 xzd_bx_bxsq_fymx
*
* @author Lion Li
* @date 2025-11-04
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("xzd_bx_bxsq_fymx")
public class XzdBxBxsqFymx extends BaseEntity {
@Serial
private static final long serialVersionUID = 1L;
/**
* id
*/
@TableId(value = "id")
private Long id;
/**
* 报销关联id
*/
private Long bxId;
/**
* 部门
*/
private Long deptId;
/**
* 费用类型(1农产品2旅客运输)
*/
private String fylx;
/**
* 报销金额
*/
private BigDecimal bxje;
/**
* 增值税税额
*/
private BigDecimal zzsse;
/**
* 用途
*/
private String yt;
/**
* 项目id
*/
private Long xm;
/**
* 发生日期
*/
private LocalDate fsrq;
/**
* 单据张数
*/
private Long djzs;
/**
* 费用承担组织
*/
private String fycdzz;
/**
* 费用承担部门
*/
private Long fycdbm;
/**
* wbs
*/
private String wbs;
/**
* cbs
*/
private String cbs;
}

View File

@ -0,0 +1,102 @@
package org.dromara.xzd.bx.bxsq.fymx.domain.bo;
import io.github.linpeilie.annotations.AutoMapper;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.core.validate.EditGroup;
import org.dromara.common.mybatis.core.domain.BaseEntity;
import org.dromara.xzd.bx.bxsq.fymx.domain.XzdBxBxsqFymx;
import java.math.BigDecimal;
import java.time.LocalDate;
/**
* 报销申请-费用明细业务对象 xzd_bx_bxsq_fymx
*
* @author Lion Li
* @date 2025-11-04
*/
@Data
@EqualsAndHashCode(callSuper = true)
@AutoMapper(target = XzdBxBxsqFymx.class, reverseConvertGenerate = false)
public class XzdBxBxsqFymxBo extends BaseEntity {
/**
* id
*/
private Long id;
/**
* 报销关联id
*/
private Long bxId;
/**
* 部门
*/
private Long deptId;
/**
* 费用类型(1农产品2旅客运输)
*/
@NotBlank(message = "费用类型(1农产品2旅客运输)不能为空", groups = { AddGroup.class, EditGroup.class })
private String fylx;
/**
* 报销金额
*/
@NotNull(message = "报销金额不能为空", groups = { AddGroup.class, EditGroup.class })
private BigDecimal bxje;
/**
* 增值税税额
*/
private BigDecimal zzsse;
/**
* 用途
*/
private String yt;
/**
* 项目id
*/
@NotNull(message = "项目id不能为空", groups = { AddGroup.class, EditGroup.class })
private Long xm;
/**
* 发生日期
*/
@NotNull(message = "发生日期不能为空", groups = { AddGroup.class, EditGroup.class })
private LocalDate fsrq;
/**
* 单据张数
*/
private Long djzs;
/**
* 费用承担组织
*/
private String fycdzz;
/**
* 费用承担部门
*/
private Long fycdbm;
/**
* wbs
*/
private String wbs;
/**
* cbs
*/
private String cbs;
}

View File

@ -0,0 +1,126 @@
package org.dromara.xzd.bx.bxsq.fymx.domain.vo;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import org.dromara.xzd.bx.bxsq.fymx.domain.XzdBxBxsqFymx;
import java.io.Serial;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDate;
/**
* 报销申请-费用明细视图对象 xzd_bx_bxsq_fymx
*
* @author Lion Li
* @date 2025-11-04
*/
@Data
@ExcelIgnoreUnannotated
@AutoMapper(target = XzdBxBxsqFymx.class)
public class XzdBxBxsqFymxVo implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* id
*/
@ExcelProperty(value = "id")
private Long id;
/**
* 报销关联id
*/
@ExcelProperty(value = "报销关联id")
private Long bxId;
/**
* 部门
*/
@ExcelProperty(value = "部门")
private Long deptId;
/**
* 部门名称
*/
private String deptName;
/**
* 费用类型
*/
@ExcelProperty(value = "费用类型")
private String fylx;
/**
* 报销金额
*/
@ExcelProperty(value = "报销金额")
private BigDecimal bxje;
/**
* 增值税税额
*/
@ExcelProperty(value = "增值税税额")
private BigDecimal zzsse;
/**
* 用途
*/
@ExcelProperty(value = "用途")
private String yt;
/**
* 项目id
*/
@ExcelProperty(value = "项目id")
private Long xm;
private String xmmc;
/**
* 发生日期
*/
@ExcelProperty(value = "发生日期")
private LocalDate fsrq;
/**
* 单据张数
*/
@ExcelProperty(value = "单据张数")
private Long djzs;
/**
* 费用承担组织
*/
@ExcelProperty(value = "费用承担组织")
private String fycdzz;
/**
* 费用承担部门
*/
@ExcelProperty(value = "费用承担部门")
private Long fycdbm;
/**
* 费用承担部门名称
*/
private String fycdbmmc;
/**
* wbs
*/
@ExcelProperty(value = "wbs")
private String wbs;
/**
* cbs
*/
@ExcelProperty(value = "cbs")
private String cbs;
}

View File

@ -0,0 +1,15 @@
package org.dromara.xzd.bx.bxsq.fymx.mapper;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
import org.dromara.xzd.bx.bxsq.fymx.domain.XzdBxBxsqFymx;
import org.dromara.xzd.bx.bxsq.fymx.domain.vo.XzdBxBxsqFymxVo;
/**
* 报销申请-费用明细Mapper接口
*
* @author Lion Li
* @date 2025-11-04
*/
public interface XzdBxBxsqFymxMapper extends BaseMapperPlus<XzdBxBxsqFymx, XzdBxBxsqFymxVo> {
}

View File

@ -0,0 +1,70 @@
package org.dromara.xzd.bx.bxsq.fymx.service;
import com.baomidou.mybatisplus.extension.service.IService;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.xzd.bx.bxsq.fymx.domain.XzdBxBxsqFymx;
import org.dromara.xzd.bx.bxsq.fymx.domain.bo.XzdBxBxsqFymxBo;
import org.dromara.xzd.bx.bxsq.fymx.domain.vo.XzdBxBxsqFymxVo;
import java.util.Collection;
import java.util.List;
/**
* 报销申请-费用明细Service接口
*
* @author Lion Li
* @date 2025-11-04
*/
public interface IXzdBxBxsqFymxService extends IService<XzdBxBxsqFymx>{
/**
* 查询报销申请-费用明细
*
* @param id 主键
* @return 报销申请-费用明细
*/
XzdBxBxsqFymxVo queryById(Long id);
/**
* 分页查询报销申请-费用明细列表
*
* @param bo 查询条件
* @param pageQuery 分页参数
* @return 报销申请-费用明细分页列表
*/
TableDataInfo<XzdBxBxsqFymxVo> queryPageList(XzdBxBxsqFymxBo bo, PageQuery pageQuery);
/**
* 查询符合条件的报销申请-费用明细列表
*
* @param bo 查询条件
* @return 报销申请-费用明细列表
*/
List<XzdBxBxsqFymxVo> queryList(XzdBxBxsqFymxBo bo);
/**
* 新增报销申请-费用明细
*
* @param bo 报销申请-费用明细
* @return 是否新增成功
*/
Boolean insertByBo(XzdBxBxsqFymxBo bo);
/**
* 修改报销申请-费用明细
*
* @param bo 报销申请-费用明细
* @return 是否修改成功
*/
Boolean updateByBo(XzdBxBxsqFymxBo bo);
/**
* 校验并批量删除报销申请-费用明细信息
*
* @param ids 待删除的主键集合
* @param isValid 是否进行有效性校验
* @return 是否删除成功
*/
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
}

View File

@ -0,0 +1,143 @@
package org.dromara.xzd.bx.bxsq.fymx.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.RequiredArgsConstructor;
import org.dromara.common.core.utils.MapstructUtils;
import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.xzd.bx.bxsq.fymx.domain.XzdBxBxsqFymx;
import org.dromara.xzd.bx.bxsq.fymx.domain.bo.XzdBxBxsqFymxBo;
import org.dromara.xzd.bx.bxsq.fymx.domain.vo.XzdBxBxsqFymxVo;
import org.dromara.xzd.bx.bxsq.fymx.mapper.XzdBxBxsqFymxMapper;
import org.dromara.xzd.bx.bxsq.fymx.service.IXzdBxBxsqFymxService;
import org.springframework.stereotype.Service;
import java.util.Collection;
import java.util.List;
import java.util.Map;
/**
* 报销申请-费用明细Service业务层处理
*
* @author Lion Li
* @date 2025-11-04
*/
@RequiredArgsConstructor
@Service
public class XzdBxBxsqFymxServiceImpl extends ServiceImpl<XzdBxBxsqFymxMapper, XzdBxBxsqFymx> implements IXzdBxBxsqFymxService {
private final XzdBxBxsqFymxMapper baseMapper;
/**
* 查询报销申请-费用明细
*
* @param id 主键
* @return 报销申请-费用明细
*/
@Override
public XzdBxBxsqFymxVo queryById(Long id){
return baseMapper.selectVoById(id);
}
/**
* 分页查询报销申请-费用明细列表
*
* @param bo 查询条件
* @param pageQuery 分页参数
* @return 报销申请-费用明细分页列表
*/
@Override
public TableDataInfo<XzdBxBxsqFymxVo> queryPageList(XzdBxBxsqFymxBo bo, PageQuery pageQuery) {
LambdaQueryWrapper<XzdBxBxsqFymx> lqw = buildQueryWrapper(bo);
Page<XzdBxBxsqFymxVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
return TableDataInfo.build(result);
}
/**
* 查询符合条件的报销申请-费用明细列表
*
* @param bo 查询条件
* @return 报销申请-费用明细列表
*/
@Override
public List<XzdBxBxsqFymxVo> queryList(XzdBxBxsqFymxBo bo) {
LambdaQueryWrapper<XzdBxBxsqFymx> lqw = buildQueryWrapper(bo);
return baseMapper.selectVoList(lqw);
}
private LambdaQueryWrapper<XzdBxBxsqFymx> buildQueryWrapper(XzdBxBxsqFymxBo bo) {
Map<String, Object> params = bo.getParams();
LambdaQueryWrapper<XzdBxBxsqFymx> lqw = Wrappers.lambdaQuery();
lqw.orderByDesc(XzdBxBxsqFymx::getId);
lqw.eq(bo.getBxId() != null, XzdBxBxsqFymx::getBxId, bo.getBxId());
lqw.eq(bo.getDeptId() != null, XzdBxBxsqFymx::getDeptId, bo.getDeptId());
lqw.eq(StringUtils.isNotBlank(bo.getFylx()), XzdBxBxsqFymx::getFylx, bo.getFylx());
lqw.eq(bo.getBxje() != null, XzdBxBxsqFymx::getBxje, bo.getBxje());
lqw.eq(bo.getZzsse() != null, XzdBxBxsqFymx::getZzsse, bo.getZzsse());
lqw.eq(StringUtils.isNotBlank(bo.getYt()), XzdBxBxsqFymx::getYt, bo.getYt());
lqw.eq(bo.getXm() != null, XzdBxBxsqFymx::getXm, bo.getXm());
lqw.eq(bo.getFsrq() != null, XzdBxBxsqFymx::getFsrq, bo.getFsrq());
lqw.eq(bo.getDjzs() != null, XzdBxBxsqFymx::getDjzs, bo.getDjzs());
lqw.eq(StringUtils.isNotBlank(bo.getFycdzz()), XzdBxBxsqFymx::getFycdzz, bo.getFycdzz());
lqw.eq(bo.getFycdbm() != null, XzdBxBxsqFymx::getFycdbm, bo.getFycdbm());
lqw.eq(StringUtils.isNotBlank(bo.getWbs()), XzdBxBxsqFymx::getWbs, bo.getWbs());
lqw.eq(StringUtils.isNotBlank(bo.getCbs()), XzdBxBxsqFymx::getCbs, bo.getCbs());
return lqw;
}
/**
* 新增报销申请-费用明细
*
* @param bo 报销申请-费用明细
* @return 是否新增成功
*/
@Override
public Boolean insertByBo(XzdBxBxsqFymxBo bo) {
XzdBxBxsqFymx add = MapstructUtils.convert(bo, XzdBxBxsqFymx.class);
validEntityBeforeSave(add);
boolean flag = baseMapper.insert(add) > 0;
if (flag) {
bo.setId(add.getId());
}
return flag;
}
/**
* 修改报销申请-费用明细
*
* @param bo 报销申请-费用明细
* @return 是否修改成功
*/
@Override
public Boolean updateByBo(XzdBxBxsqFymxBo bo) {
XzdBxBxsqFymx update = MapstructUtils.convert(bo, XzdBxBxsqFymx.class);
validEntityBeforeSave(update);
return baseMapper.updateById(update) > 0;
}
/**
* 保存前的数据校验
*/
private void validEntityBeforeSave(XzdBxBxsqFymx 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,15 @@
package org.dromara.xzd.bx.bxsq.mapper;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
import org.dromara.xzd.bx.bxsq.domain.XzdBxBxsq;
import org.dromara.xzd.bx.bxsq.domain.vo.XzdBxBxsqVo;
/**
* 报销-报销申请Mapper接口
*
* @author Lion Li
* @date 2025-11-04
*/
public interface XzdBxBxsqMapper extends BaseMapperPlus<XzdBxBxsq, XzdBxBxsqVo> {
}

View File

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

View File

@ -0,0 +1,373 @@
package org.dromara.xzd.bx.bxsq.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.dromara.common.core.domain.event.ProcessDeleteEvent;
import org.dromara.common.core.domain.event.ProcessEvent;
import org.dromara.common.core.domain.event.ProcessTaskEvent;
import org.dromara.common.core.utils.MapstructUtils;
import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.common.utils.BatchNumberGenerator;
import org.dromara.system.domain.vo.SysDeptVo;
import org.dromara.system.domain.vo.SysUserVo;
import org.dromara.system.service.impl.SysDeptServiceImpl;
import org.dromara.system.service.impl.SysUserServiceImpl;
import org.dromara.xzd.bx.bxsq.bxlx.domain.vo.XzdBxBxsqBxlxVo;
import org.dromara.xzd.bx.bxsq.bxlx.service.impl.XzdBxBxsqBxlxServiceImpl;
import org.dromara.xzd.bx.bxsq.domain.XzdBxBxsq;
import org.dromara.xzd.bx.bxsq.domain.bo.XzdBxBxsqBo;
import org.dromara.xzd.bx.bxsq.domain.vo.XzdBxBxsqVo;
import org.dromara.xzd.bx.bxsq.fymx.domain.XzdBxBxsqFymx;
import org.dromara.xzd.bx.bxsq.fymx.domain.vo.XzdBxBxsqFymxVo;
import org.dromara.xzd.bx.bxsq.fymx.service.impl.XzdBxBxsqFymxServiceImpl;
import org.dromara.xzd.bx.bxsq.mapper.XzdBxBxsqMapper;
import org.dromara.xzd.bx.bxsq.service.IXzdBxBxsqService;
import org.dromara.xzd.domain.XzdProject;
import org.dromara.xzd.service.impl.XzdProjectServiceImpl;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
/**
* 报销-报销申请Service业务层处理
*
* @author Lion Li
* @date 2025-11-04
*/
@RequiredArgsConstructor
@Service
@Slf4j
public class XzdBxBxsqServiceImpl extends ServiceImpl<XzdBxBxsqMapper, XzdBxBxsq> implements IXzdBxBxsqService {
private final XzdBxBxsqMapper baseMapper;
@Autowired
private XzdBxBxsqFymxServiceImpl xzdBxBxsqFymxService;
@Autowired
private SysDeptServiceImpl sysDeptService;
@Autowired
private XzdProjectServiceImpl xzdProjectService;
@Autowired
private XzdBxBxsqBxlxServiceImpl xzdBxBxsqBxlxService;
@Autowired
private SysUserServiceImpl sysUserService;
/**
* 查询报销-报销申请
*
* @param id 主键
* @return 报销-报销申请
*/
@Override
public XzdBxBxsqVo queryById(Long id){
XzdBxBxsqVo xzdBxBxsqVo = baseMapper.selectVoById(id);
List<XzdBxBxsqVo> xzdBxBxsqVo1 = List.of(xzdBxBxsqVo);
setValue(xzdBxBxsqVo1);
return xzdBxBxsqVo1.getFirst();
}
/**
* 分页查询报销-报销申请列表
*
* @param bo 查询条件
* @param pageQuery 分页参数
* @return 报销-报销申请分页列表
*/
@Override
public TableDataInfo<XzdBxBxsqVo> queryPageList(XzdBxBxsqBo bo, PageQuery pageQuery) {
LambdaQueryWrapper<XzdBxBxsq> lqw = buildQueryWrapper(bo);
Page<XzdBxBxsqVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
setValue(result.getRecords());
return TableDataInfo.build(result);
}
/**
* 查询符合条件的报销-报销申请列表
*
* @param bo 查询条件
* @return 报销-报销申请列表
*/
@Override
public List<XzdBxBxsqVo> queryList(XzdBxBxsqBo bo) {
LambdaQueryWrapper<XzdBxBxsq> lqw = buildQueryWrapper(bo);
return baseMapper.selectVoList(lqw);
}
private LambdaQueryWrapper<XzdBxBxsq> buildQueryWrapper(XzdBxBxsqBo bo) {
Map<String, Object> params = bo.getParams();
LambdaQueryWrapper<XzdBxBxsq> lqw = Wrappers.lambdaQuery();
lqw.orderByDesc(XzdBxBxsq::getId);
lqw.eq(StringUtils.isNotBlank(bo.getShzt()), XzdBxBxsq::getShzt, bo.getShzt());
lqw.eq(StringUtils.isNotBlank(bo.getDjbm()), XzdBxBxsq::getDjbm, bo.getDjbm());
lqw.eq(bo.getSqrq() != null, XzdBxBxsq::getSqrq, bo.getSqrq());
lqw.eq(bo.getBxr() != null, XzdBxBxsq::getBxr, bo.getBxr());
lqw.eq(bo.getGs() != null, XzdBxBxsq::getGs, bo.getGs());
lqw.eq(bo.getBm() != null, XzdBxBxsq::getBm, bo.getBm());
lqw.eq(bo.getXm() != null, XzdBxBxsq::getXm, bo.getXm());
lqw.eq(StringUtils.isNotBlank(bo.getJzzz()), XzdBxBxsq::getJzzz, bo.getJzzz());
lqw.eq(bo.getBxlx() != null, XzdBxBxsq::getBxlx, bo.getBxlx());
lqw.eq(StringUtils.isNotBlank(bo.getSy()), XzdBxBxsq::getSy, bo.getSy());
lqw.eq(StringUtils.isNotBlank(bo.getYslx()), XzdBxBxsq::getYslx, bo.getYslx());
lqw.eq(bo.getBcbxje() != null, XzdBxBxsq::getBcbxje, bo.getBcbxje());
lqw.eq(bo.getJkzye() != null, XzdBxBxsq::getJkzye, bo.getJkzye());
lqw.eq(bo.getCxje() != null, XzdBxBxsq::getCxje, bo.getCxje());
lqw.eq(bo.getSlje() != null, XzdBxBxsq::getSlje, bo.getSlje());
lqw.eq(bo.getHkje() != null, XzdBxBxsq::getHkje, bo.getHkje());
lqw.eq(bo.getSpje() != null, XzdBxBxsq::getSpje, bo.getSpje());
lqw.eq(bo.getZzsse() != null, XzdBxBxsq::getZzsse, bo.getZzsse());
lqw.eq(bo.getNcpse() != null, XzdBxBxsq::getNcpse, bo.getNcpse());
lqw.eq(bo.getLkysse() != null, XzdBxBxsq::getLkysse, bo.getLkysse());
lqw.eq(bo.getGsfkje() != null, XzdBxBxsq::getGsfkje, bo.getGsfkje());
lqw.eq(bo.getWfje() != null, XzdBxBxsq::getWfje, bo.getWfje());
lqw.eq(StringUtils.isNotBlank(bo.getXmlx()), XzdBxBxsq::getXmlx, bo.getXmlx());
lqw.eq(StringUtils.isNotBlank(bo.getXmdl()), XzdBxBxsq::getXmdl, bo.getXmdl());
return lqw;
}
/**
* 新增报销-报销申请
*
* @param bo 报销-报销申请
* @return 是否新增成功
*/
@Transactional
@Override
public Boolean insertByBo(XzdBxBxsqBo bo) {
XzdBxBxsq add = MapstructUtils.convert(bo, XzdBxBxsq.class);
validEntityBeforeSave(add);
String banBen = BatchNumberGenerator.generateBatchNumber("BXSQ-");
add.setBxr(LoginHelper.getUserId());
add.setDjbm(banBen);
add.setBm(LoginHelper.getDeptId());
//公司
SysDeptVo sysDeptVo = sysDeptService.selectDeptById(LoginHelper.getDeptId());
if (sysDeptVo != null && !sysDeptVo.getParentId().equals(100L)){
SysDeptVo sysDeptVo1 = getCompanyByDeptId(sysDeptVo);
if (sysDeptVo1 != null) {
add.setGs(sysDeptVo1.getDeptId());
}
}else if ((sysDeptVo != null && sysDeptVo.getParentId().equals(100L)) || (sysDeptVo != null && sysDeptVo.getDeptId() == 100L)){
add.setGs(sysDeptVo.getDeptId());
}
boolean flag = baseMapper.insert(add) > 0;
if (flag) {
bo.setId(add.getId());
}
if (bo.getFymx() != null && !bo.getFymx().isEmpty()){
for (XzdBxBxsqFymx fymx : bo.getFymx()) {
fymx.setBxId(add.getId());
}
xzdBxBxsqFymxService.saveBatch(bo.getFymx());
}
return flag;
}
/**
* 修改报销-报销申请
*
* @param bo 报销-报销申请
* @return 是否修改成功
*/
@Transactional
@Override
public Boolean updateByBo(XzdBxBxsqBo bo) {
XzdBxBxsq update = MapstructUtils.convert(bo, XzdBxBxsq.class);
validEntityBeforeSave(update);
XzdBxBxsqVo old = queryById(bo.getId());
//合同文本-预收款项
if (bo.getFymx() != null && !bo.getFymx().isEmpty()){
if (old.getFymx() != null && !old.getFymx().isEmpty()){
xzdBxBxsqFymxService.removeByIds(old.getFymx());
}
for (XzdBxBxsqFymx businessChange : bo.getFymx()) {
businessChange.setBxId(update.getId());
}
xzdBxBxsqFymxService.saveBatch(bo.getFymx());
}else {
if (old.getFymx() != null && !old.getFymx().isEmpty()){
xzdBxBxsqFymxService.removeByIds(old.getFymx());
}
}
return baseMapper.updateById(update) > 0;
}
/**
* 保存前的数据校验
*/
private void validEntityBeforeSave(XzdBxBxsq entity){
//TODO 做一些数据校验,如唯一约束
}
/**
* 校验并批量删除报销-报销申请信息
*
* @param ids 待删除的主键集合
* @param isValid 是否进行有效性校验
* @return 是否删除成功
*/
@Override
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
if(isValid){
//TODO 做一些业务上的校验,判断是否需要校验
}
LambdaQueryWrapper<XzdBxBxsqFymx> lqw = new LambdaQueryWrapper<>();
lqw.in(XzdBxBxsqFymx::getBxId, ids);
xzdBxBxsqFymxService.remove(lqw);
return baseMapper.deleteByIds(ids) > 0;
}
public void setValue(List<XzdBxBxsqVo> vos){
for (XzdBxBxsqVo vo : vos) {
//费用明细
LambdaQueryWrapper<XzdBxBxsqFymx> lqw = new LambdaQueryWrapper<>();
lqw.eq(XzdBxBxsqFymx::getBxId, vo.getId());
List<XzdBxBxsqFymx> list = xzdBxBxsqFymxService.list(lqw);
//费用明细处理
List<XzdBxBxsqFymxVo> voList = new ArrayList<>();
if (list != null && !list.isEmpty()){
for (XzdBxBxsqFymx fymx : list) {
XzdBxBxsqFymxVo fymxVo = new XzdBxBxsqFymxVo();
BeanUtils.copyProperties(fymx, fymxVo);
//部门
if (fymx.getDeptId() != null) {
SysDeptVo sysDeptVo = sysDeptService.selectDeptById(fymx.getDeptId());
if (sysDeptVo != null) {
fymxVo.setDeptName(sysDeptVo.getDeptName());
}
}
//项目
if (fymx.getXm() != null) {
XzdProject xzdProjectVo = xzdProjectService.getById(fymx.getXm());
if (xzdProjectVo != null) {
fymxVo.setXmmc(xzdProjectVo.getProjectName());
}
}
//费用承担部门
if (fymx.getFycdbm() != null){
SysDeptVo sysDeptVo = sysDeptService.selectDeptById(fymx.getFycdbm());
if (sysDeptVo != null) {
fymxVo.setFycdbmmc(sysDeptVo.getDeptName());
}
}
voList.add(fymxVo);
}
vo.setFymx(voList);
}
//报销人名称
if (vo.getBxr() != null){
SysUserVo sysUserVo = sysUserService.selectUserById(vo.getBxr());
if (sysUserVo != null){
vo.setBxrmc(sysUserVo.getNickName());
}
}
//报销人公司
if (vo.getGs() != null) {
SysDeptVo sysDeptVo = sysDeptService.selectDeptById(vo.getGs());
if (sysDeptVo != null) {
vo.setGsmc(sysDeptVo.getDeptName());
}
}
//部门
if (vo.getBm() != null) {
SysDeptVo bm = sysDeptService.selectDeptById(vo.getBm());
if (bm != null) {
vo.setBmmc(bm.getDeptName());
}
}
//项目
if (vo.getXm() != null) {
XzdProject byId = xzdProjectService.getById(vo.getXm());
if (byId != null) {
vo.setXmmc(byId.getProjectName());
}
}
//报销类型
if (vo.getBxlx() != null) {
XzdBxBxsqBxlxVo bxsqBxlxVo = xzdBxBxsqBxlxService.queryById(vo.getBxlx());
if (bxsqBxlxVo != null) {
vo.setBxlxmc(bxsqBxlxVo.getLxmc());
}
}
}
}
//通过部门查询出公司
private SysDeptVo getCompanyByDeptId(SysDeptVo deptVo){
if (!deptVo.getParentId().equals(100L)){
SysDeptVo sysDeptVo = sysDeptService.selectDeptById(deptVo.getParentId());
if (sysDeptVo == null){
return null;
}
getCompanyByDeptId(sysDeptVo);
}
return deptVo;
}
/**
* 总体流程监听(例如: 草稿,撤销,退回,作废,终止,已完成,单任务完成等)
* 正常使用只需#processEvent.flowCode=='leave1'
* 示例为了方便则使用startsWith匹配了全部示例key
*
* @param processEvent 参数
*/
@EventListener(condition = "#processEvent.flowCode.endsWith('XzdBxBxsq')")
@Transactional
public void processPlansHandler(ProcessEvent processEvent) {
log.info("报销申请审核任务执行了{}", processEvent.toString());
String id = processEvent.getBusinessId();
XzdBxBxsq byId = this.getById(Long.valueOf(id));
byId.setShzt(processEvent.getStatus());
boolean b = this.updateById(byId);
if (!b) {
log.error("报销申请审核任务更新状态失败");
}
}
/**
* 执行任务创建监听
* 示例:也可通过 @EventListener(condition = "#processTaskEvent.flowCode=='leave1'")进行判断
* 在方法中判断流程节点key
* if ("xxx".equals(processTaskEvent.getNodeCode())) {
* //执行业务逻辑
* }
*
* @param processTaskEvent 参数
*/
@org.springframework.context.event.EventListener(condition = "#processTaskEvent.flowCode.endsWith('XzdBxBxsq')")
public void processTaskPlansHandlerEquipmentList(ProcessTaskEvent processTaskEvent) {
log.info("报销申请审核任务创建了{}", processTaskEvent.toString());
}
/**
* 监听删除流程事件
* 正常使用只需#processDeleteEvent.flowCode=='leave1'
* 示例为了方便则使用startsWith匹配了全部示例key
*
* @param processDeleteEvent 参数
*/
@EventListener(condition = "#processDeleteEvent.flowCode.endsWith('XzdBxBxsq')")
public void processDeletePlansHandlerEquipmentList(ProcessDeleteEvent processDeleteEvent) {
log.info("报销申请计划删除流程事件{}", processDeleteEvent.toString());
}
}