电子请购单

This commit is contained in:
jhd
2026-06-29 14:33:10 +08:00
parent 8c7cce90ba
commit 356d7e9496
13 changed files with 6174 additions and 0 deletions

View File

@@ -0,0 +1,82 @@
package com.klp.erp.controller;
import com.klp.common.annotation.Log;
import com.klp.common.annotation.RepeatSubmit;
import com.klp.common.core.controller.BaseController;
import com.klp.common.core.domain.PageQuery;
import com.klp.common.core.domain.R;
import com.klp.common.core.page.TableDataInfo;
import com.klp.common.core.validate.AddGroup;
import com.klp.common.core.validate.EditGroup;
import com.klp.common.enums.BusinessType;
import com.klp.common.utils.poi.ExcelUtil;
import com.klp.erp.domain.bo.ErpPurchaseRequisitionBo;
import com.klp.erp.domain.vo.ErpPurchaseRequisitionVo;
import com.klp.erp.service.IErpPurchaseRequisitionService;
import lombok.RequiredArgsConstructor;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.util.Arrays;
import java.util.List;
/**
* 请购及采购单
*
* @author klp
* @date 2026-06-29
*/
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/erp/purchaseRequisition")
public class ErpPurchaseRequisitionController extends BaseController {
private final IErpPurchaseRequisitionService iErpPurchaseRequisitionService;
/** 查询请购单列表 */
@GetMapping("/list")
public TableDataInfo<ErpPurchaseRequisitionVo> list(ErpPurchaseRequisitionBo bo, PageQuery pageQuery) {
return iErpPurchaseRequisitionService.queryPageList(bo, pageQuery);
}
/** 导出请购单列表 */
@Log(title = "请购及采购单", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(ErpPurchaseRequisitionBo bo, HttpServletResponse response) {
List<ErpPurchaseRequisitionVo> list = iErpPurchaseRequisitionService.queryList(bo);
ExcelUtil.exportExcel(list, "请购及采购单", ErpPurchaseRequisitionVo.class, response);
}
/** 获取请购单详细信息(含明细) */
@GetMapping("/{reqId}")
public R<ErpPurchaseRequisitionVo> getInfo(@NotNull(message = "主键不能为空") @PathVariable Long reqId) {
return R.ok(iErpPurchaseRequisitionService.queryById(reqId));
}
/** 新增请购单 */
@Log(title = "请购及采购单", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping()
public R<Void> add(@Validated(AddGroup.class) @RequestBody ErpPurchaseRequisitionBo bo) {
return toAjax(iErpPurchaseRequisitionService.insertByBo(bo));
}
/** 修改请购单 */
@Log(title = "请购及采购单", businessType = BusinessType.UPDATE)
@RepeatSubmit()
@PutMapping()
public R<Void> edit(@Validated(EditGroup.class) @RequestBody ErpPurchaseRequisitionBo bo) {
return toAjax(iErpPurchaseRequisitionService.updateByBo(bo));
}
/** 删除请购单 */
@Log(title = "请购及采购单", businessType = BusinessType.DELETE)
@DeleteMapping("/{reqIds}")
public R<Void> remove(@NotEmpty(message = "主键不能为空") @PathVariable Long[] reqIds) {
return toAjax(iErpPurchaseRequisitionService.deleteWithValidByIds(Arrays.asList(reqIds), true));
}
}

View File

@@ -0,0 +1,48 @@
package com.klp.erp.domain;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.annotation.TableName;
import com.klp.common.core.domain.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* 请购及采购单明细对象 erp_purchase_requisition_item
*
* @author klp
* @date 2026-06-29
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("erp_purchase_requisition_item")
public class ErpPurchaseRequisitionItem extends BaseEntity {
private static final long serialVersionUID = 1L;
/** 明细ID */
@TableId(value = "item_id")
private Long itemId;
/** 关联请购单ID */
private Long reqId;
/** 项次 */
private String seq;
/** 品名 */
private String itemName;
/** 规格 */
private String specification;
/** 单位 */
private String unit;
/** 请购量 */
private String quantity;
/** 删除标志 */
@TableLogic
private String delFlag;
}

View File

@@ -0,0 +1,108 @@
package com.klp.erp.domain.bo;
import com.klp.common.core.domain.BaseEntity;
import com.klp.common.core.validate.EditGroup;
import lombok.Data;
import lombok.EqualsAndHashCode;
import javax.validation.constraints.NotNull;
import java.util.List;
/**
* 请购及采购单业务对象 erp_purchase_requisition
*
* @author klp
* @date 2026-06-29
*/
@Data
@EqualsAndHashCode(callSuper = true)
public class ErpPurchaseRequisitionBo extends BaseEntity {
/** 主键 */
@NotNull(message = "主键不能为空", groups = {EditGroup.class})
private Long reqId;
/** 请购部门 */
private String reqDept;
/** 品名 */
private String itemName;
/** 规格 */
private String specification;
/** 单位 */
private String unit;
/** 请购量 */
private String quantity;
/** 类别 */
private String category;
/** 需求日期 */
private String requiredDate;
/** 用途说明 */
private String purposeDesc;
/** 使用部门 */
private String useDept;
/** 品检条件 */
private String inspectionCondition;
/** 试用天数 */
private String trialDays;
/** 前期采购记录 */
private String prevPurchaseRecord;
/** 采购拟办 */
private String purchaseProposal;
/** 付款条件 */
private String paymentTerms;
/** 采购金额 */
private String totalAmount;
/** 董事长(采购单位) */
private String signPurchaseChairman;
/** 部长/厂长(采购单位) */
private String signPurchaseManager;
/** 主任(采购单位) */
private String signPurchaseDirector;
/** 经办(采购单位) */
private String signPurchaseHandler;
/** 生产总经理(请购单位) */
private String signRequestGm;
/** 厂长(请购单位) */
private String signRequestFactoryMgr;
/** 主任(请购单位) */
private String signRequestDirector;
/** 经办(请购单位) */
private String signRequestHandler;
/** 指定卸货位 */
private String unloadLocation;
/** 卸货其他位置 */
private String unloadOther;
/** 状态 */
private String formStatus;
/** 备注 */
private String remark;
/** 明细行 */
private List<ErpPurchaseRequisitionItemBo> items;
}

View File

@@ -0,0 +1,37 @@
package com.klp.erp.domain.bo;
import com.klp.common.core.domain.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* 请购及采购单明细业务对象 erp_purchase_requisition_item
*
* @author klp
* @date 2026-06-29
*/
@Data
@EqualsAndHashCode(callSuper = true)
public class ErpPurchaseRequisitionItemBo extends BaseEntity {
/** 明细ID */
private Long itemId;
/** 关联请购单ID */
private Long reqId;
/** 项次 */
private String seq;
/** 品名 */
private String itemName;
/** 规格 */
private String specification;
/** 单位 */
private String unit;
/** 请购量 */
private String quantity;
}

View File

@@ -0,0 +1,40 @@
package com.klp.erp.domain.vo;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;
import java.io.Serializable;
/**
* 请购及采购单明细视图对象 erp_purchase_requisition_item
*
* @author klp
* @date 2026-06-29
*/
@Data
@ExcelIgnoreUnannotated
public class ErpPurchaseRequisitionItemVo implements Serializable {
private static final long serialVersionUID = 1L;
@ExcelProperty(value = "明细ID")
private Long itemId;
private Long reqId;
@ExcelProperty(value = "项次")
private String seq;
@ExcelProperty(value = "品名")
private String itemName;
@ExcelProperty(value = "规格")
private String specification;
@ExcelProperty(value = "单位")
private String unit;
@ExcelProperty(value = "请购量")
private String quantity;
}

View File

@@ -0,0 +1,108 @@
package com.klp.erp.domain.vo;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;
import java.io.Serializable;
import java.util.List;
/**
* 请购及采购单视图对象 erp_purchase_requisition
*
* @author klp
* @date 2026-06-29
*/
@Data
@ExcelIgnoreUnannotated
public class ErpPurchaseRequisitionVo implements Serializable {
private static final long serialVersionUID = 1L;
@ExcelProperty(value = "主键")
private Long reqId;
@ExcelProperty(value = "请购部门")
private String reqDept;
@ExcelProperty(value = "品名")
private String itemName;
@ExcelProperty(value = "规格")
private String specification;
@ExcelProperty(value = "单位")
private String unit;
@ExcelProperty(value = "请购量")
private String quantity;
@ExcelProperty(value = "类别")
private String category;
@ExcelProperty(value = "需求日期")
private String requiredDate;
@ExcelProperty(value = "用途说明")
private String purposeDesc;
@ExcelProperty(value = "使用部门")
private String useDept;
@ExcelProperty(value = "品检条件")
private String inspectionCondition;
@ExcelProperty(value = "试用天数")
private String trialDays;
@ExcelProperty(value = "前期采购记录")
private String prevPurchaseRecord;
@ExcelProperty(value = "采购拟办")
private String purchaseProposal;
@ExcelProperty(value = "付款条件")
private String paymentTerms;
@ExcelProperty(value = "采购金额")
private String totalAmount;
@ExcelProperty(value = "董事长(采购单位)")
private String signPurchaseChairman;
@ExcelProperty(value = "部长/厂长(采购单位)")
private String signPurchaseManager;
@ExcelProperty(value = "主任(采购单位)")
private String signPurchaseDirector;
@ExcelProperty(value = "经办(采购单位)")
private String signPurchaseHandler;
@ExcelProperty(value = "生产总经理(请购单位)")
private String signRequestGm;
@ExcelProperty(value = "厂长(请购单位)")
private String signRequestFactoryMgr;
@ExcelProperty(value = "主任(请购单位)")
private String signRequestDirector;
@ExcelProperty(value = "经办(请购单位)")
private String signRequestHandler;
@ExcelProperty(value = "指定卸货位")
private String unloadLocation;
@ExcelProperty(value = "卸货其他位置")
private String unloadOther;
@ExcelProperty(value = "状态")
private String formStatus;
@ExcelProperty(value = "备注")
private String remark;
/** 明细行 */
private List<ErpPurchaseRequisitionItemVo> items;
}

View File

@@ -0,0 +1,15 @@
package com.klp.erp.mapper;
import com.klp.common.core.mapper.BaseMapperPlus;
import com.klp.erp.domain.ErpPurchaseRequisitionItem;
import com.klp.erp.domain.vo.ErpPurchaseRequisitionItemVo;
/**
* 请购及采购单明细Mapper接口
*
* @author klp
* @date 2026-06-29
*/
public interface ErpPurchaseRequisitionItemMapper extends BaseMapperPlus<ErpPurchaseRequisitionItemMapper, ErpPurchaseRequisitionItem, ErpPurchaseRequisitionItemVo> {
}

View File

@@ -0,0 +1,15 @@
package com.klp.erp.mapper;
import com.klp.common.core.mapper.BaseMapperPlus;
import com.klp.erp.domain.ErpPurchaseRequisition;
import com.klp.erp.domain.vo.ErpPurchaseRequisitionVo;
/**
* 请购及采购单Mapper接口
*
* @author klp
* @date 2026-06-29
*/
public interface ErpPurchaseRequisitionMapper extends BaseMapperPlus<ErpPurchaseRequisitionMapper, ErpPurchaseRequisition, ErpPurchaseRequisitionVo> {
}

View File

@@ -0,0 +1,36 @@
package com.klp.erp.service;
import com.klp.common.core.domain.PageQuery;
import com.klp.common.core.page.TableDataInfo;
import com.klp.erp.domain.bo.ErpPurchaseRequisitionBo;
import com.klp.erp.domain.vo.ErpPurchaseRequisitionVo;
import java.util.Collection;
import java.util.List;
/**
* 请购及采购单Service接口
*
* @author klp
* @date 2026-06-29
*/
public interface IErpPurchaseRequisitionService {
/** 查询请购单详情(含明细) */
ErpPurchaseRequisitionVo queryById(Long reqId);
/** 分页查询请购单 */
TableDataInfo<ErpPurchaseRequisitionVo> queryPageList(ErpPurchaseRequisitionBo bo, PageQuery pageQuery);
/** 查询请购单列表 */
List<ErpPurchaseRequisitionVo> queryList(ErpPurchaseRequisitionBo bo);
/** 新增请购单(含明细) */
Boolean insertByBo(ErpPurchaseRequisitionBo bo);
/** 修改请购单(含明细) */
Boolean updateByBo(ErpPurchaseRequisitionBo bo);
/** 校验并批量删除请购单 */
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
}

View File

@@ -0,0 +1,124 @@
package com.klp.erp.service.impl;
import cn.hutool.core.bean.BeanUtil;
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.klp.common.core.domain.PageQuery;
import com.klp.common.core.page.TableDataInfo;
import com.klp.common.utils.StringUtils;
import com.klp.erp.domain.ErpPurchaseRequisition;
import com.klp.erp.domain.ErpPurchaseRequisitionItem;
import com.klp.erp.domain.bo.ErpPurchaseRequisitionBo;
import com.klp.erp.domain.bo.ErpPurchaseRequisitionItemBo;
import com.klp.erp.domain.vo.ErpPurchaseRequisitionVo;
import com.klp.erp.mapper.ErpPurchaseRequisitionItemMapper;
import com.klp.erp.mapper.ErpPurchaseRequisitionMapper;
import com.klp.erp.service.IErpPurchaseRequisitionService;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.Collection;
import java.util.List;
/**
* 请购及采购单Service业务层处理
*
* @author klp
* @date 2026-06-29
*/
@RequiredArgsConstructor
@Service
public class ErpPurchaseRequisitionServiceImpl implements IErpPurchaseRequisitionService {
private final ErpPurchaseRequisitionMapper baseMapper;
private final ErpPurchaseRequisitionItemMapper itemMapper;
@Override
public ErpPurchaseRequisitionVo queryById(Long reqId) {
ErpPurchaseRequisitionVo vo = baseMapper.selectVoById(reqId);
if (vo == null) {
return null;
}
// 明细
vo.setItems(itemMapper.selectVoList(Wrappers.lambdaQuery(ErpPurchaseRequisitionItem.class)
.eq(ErpPurchaseRequisitionItem::getReqId, reqId)));
return vo;
}
@Override
public TableDataInfo<ErpPurchaseRequisitionVo> queryPageList(ErpPurchaseRequisitionBo bo, PageQuery pageQuery) {
Page<ErpPurchaseRequisitionVo> result = baseMapper.selectVoPage(pageQuery.build(), buildQueryWrapper(bo));
return TableDataInfo.build(result);
}
@Override
public List<ErpPurchaseRequisitionVo> queryList(ErpPurchaseRequisitionBo bo) {
return baseMapper.selectVoList(buildQueryWrapper(bo));
}
private LambdaQueryWrapper<ErpPurchaseRequisition> buildQueryWrapper(ErpPurchaseRequisitionBo bo) {
LambdaQueryWrapper<ErpPurchaseRequisition> lqw = Wrappers.lambdaQuery();
lqw.like(StringUtils.isNotBlank(bo.getReqDept()), ErpPurchaseRequisition::getReqDept, bo.getReqDept());
lqw.like(StringUtils.isNotBlank(bo.getItemName()), ErpPurchaseRequisition::getItemName, bo.getItemName());
lqw.eq(StringUtils.isNotBlank(bo.getFormStatus()), ErpPurchaseRequisition::getFormStatus, bo.getFormStatus());
lqw.orderByDesc(ErpPurchaseRequisition::getReqId);
return lqw;
}
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean insertByBo(ErpPurchaseRequisitionBo bo) {
ErpPurchaseRequisition add = BeanUtil.toBean(bo, ErpPurchaseRequisition.class);
if (StringUtils.isBlank(add.getFormStatus())) {
add.setFormStatus("0");
}
add.setReqId(null);
if (baseMapper.insert(add) <= 0) {
return false;
}
bo.setReqId(add.getReqId());
saveItems(add.getReqId(), bo.getItems());
return true;
}
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean updateByBo(ErpPurchaseRequisitionBo bo) {
ErpPurchaseRequisition update = baseMapper.selectById(bo.getReqId());
if (update == null) {
return false;
}
BeanUtil.copyProperties(bo, update, "reqId", "createBy", "createTime");
baseMapper.updateById(update);
// 覆盖式重写明细
itemMapper.delete(Wrappers.lambdaQuery(ErpPurchaseRequisitionItem.class)
.eq(ErpPurchaseRequisitionItem::getReqId, bo.getReqId()));
saveItems(bo.getReqId(), bo.getItems());
return true;
}
private void saveItems(Long reqId, List<ErpPurchaseRequisitionItemBo> items) {
if (items == null || items.isEmpty()) {
return;
}
for (ErpPurchaseRequisitionItemBo itemBo : items) {
ErpPurchaseRequisitionItem item = BeanUtil.toBean(itemBo, ErpPurchaseRequisitionItem.class);
item.setItemId(null);
item.setReqId(reqId);
itemMapper.insert(item);
}
}
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
for (Long reqId : ids) {
itemMapper.delete(Wrappers.lambdaQuery(ErpPurchaseRequisitionItem.class)
.eq(ErpPurchaseRequisitionItem::getReqId, reqId));
}
return baseMapper.deleteBatchIds(ids) > 0;
}
}