feat(wms): 添加检化验申请单功能模块

- 创建检化验申请单实体类 WmsInspectionApplication
- 定义检化验申请单服务接口 IWmsInspectionApplicationService
- 实现检化验申请单服务业务逻辑 WmsInspectionApplicationServiceImpl
- 添加检化验申请单控制器 WmsInspectionApplicationController
- 创建检化验申请单数据访问层 WmsInspectionApplicationMapper
- 设计检化验申请单业务对象 WmsInspectionApplicationBo 和视图对象 WmsInspectionApplicationVo
- 配置检化验申请单 MyBatis 映射文件
- 实现检化验申请单的增删改查功能
- 添加检化验申请单列表查询和导出功能
This commit is contained in:
2026-07-08 10:25:41 +08:00
parent af7b73d29c
commit f0a74c1e1c
8 changed files with 812 additions and 0 deletions

View File

@@ -0,0 +1,99 @@
package com.klp.controller;
import java.util.List;
import java.util.Arrays;
import lombok.RequiredArgsConstructor;
import javax.servlet.http.HttpServletResponse;
import javax.validation.constraints.*;
import org.springframework.web.bind.annotation.*;
import org.springframework.validation.annotation.Validated;
import com.klp.common.annotation.RepeatSubmit;
import com.klp.common.annotation.Log;
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.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.domain.vo.WmsInspectionApplicationVo;
import com.klp.domain.bo.WmsInspectionApplicationBo;
import com.klp.service.IWmsInspectionApplicationService;
import com.klp.common.core.page.TableDataInfo;
/**
* 检化验申请单
*
* @author klp
* @date 2026-07-08
*/
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/wms/inspectionApplication")
public class WmsInspectionApplicationController extends BaseController {
private final IWmsInspectionApplicationService iWmsInspectionApplicationService;
/**
* 查询检化验申请单列表
*/
@GetMapping("/list")
public TableDataInfo<WmsInspectionApplicationVo> list(WmsInspectionApplicationBo bo, PageQuery pageQuery) {
return iWmsInspectionApplicationService.queryPageList(bo, pageQuery);
}
/**
* 导出检化验申请单列表
*/
@Log(title = "检化验申请单", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(WmsInspectionApplicationBo bo, HttpServletResponse response) {
List<WmsInspectionApplicationVo> list = iWmsInspectionApplicationService.queryList(bo);
ExcelUtil.exportExcel(list, "检化验申请单", WmsInspectionApplicationVo.class, response);
}
/**
* 获取检化验申请单详细信息
*
* @param applicationId 主键
*/
@GetMapping("/{applicationId}")
public R<WmsInspectionApplicationVo> getInfo(@NotNull(message = "主键不能为空")
@PathVariable Long applicationId) {
return R.ok(iWmsInspectionApplicationService.queryById(applicationId));
}
/**
* 新增检化验申请单
*/
@Log(title = "检化验申请单", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping()
public R<Void> add(@Validated(AddGroup.class) @RequestBody WmsInspectionApplicationBo bo) {
return toAjax(iWmsInspectionApplicationService.insertByBo(bo));
}
/**
* 修改检化验申请单
*/
@Log(title = "检化验申请单", businessType = BusinessType.UPDATE)
@RepeatSubmit()
@PutMapping()
public R<Void> edit(@Validated(EditGroup.class) @RequestBody WmsInspectionApplicationBo bo) {
return toAjax(iWmsInspectionApplicationService.updateByBo(bo));
}
/**
* 删除检化验申请单
*
* @param applicationIds 主键串
*/
@Log(title = "检化验申请单", businessType = BusinessType.DELETE)
@DeleteMapping("/{applicationIds}")
public R<Void> remove(@NotEmpty(message = "主键不能为空")
@PathVariable Long[] applicationIds) {
return toAjax(iWmsInspectionApplicationService.deleteWithValidByIds(Arrays.asList(applicationIds), true));
}
}

View File

@@ -0,0 +1,135 @@
package com.klp.domain;
import com.baomidou.mybatisplus.annotation.*;
import com.klp.common.core.domain.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
/**
* 检化验申请单对象 wms_inspection_application
*
* @author klp
* @date 2026-07-08
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("wms_inspection_application")
public class WmsInspectionApplication extends BaseEntity {
private static final long serialVersionUID=1L;
/**
* 申请单主键
*/
@TableId(value = "application_id")
private Long applicationId;
/**
* 申请单编号(如 LAB-20260708-0001
*/
private String applicationNo;
/**
* 申请标题
*/
private String applicationTitle;
/**
* 产线1#产线、2#产线)
*/
private String productionLine;
/**
* 实验类型字典lab_experiment_typephysical=物理检验 chemical=化学检验)
*/
private String experimentType;
/**
* 样品名称
*/
private String sampleName;
/**
* 样品批号
*/
private String sampleBatchNo;
/**
* 样品来源(如:来料、过程样、成品样)
*/
private String sampleSource;
/**
* 样品数量
*/
private Long sampleQuantity;
/**
* 检验目的/用途说明
*/
private String testPurpose;
/**
* 要求完成日期
*/
private Date requiredDate;
/**
* 流程状态字典lab_application_status1=草稿 2=待审批 3=已通过 4=已驳回 5=实验中 6=已完成
*/
private Integer flowStatus;
/**
* 提交送审时间
*/
private Date submitTime;
/**
* 审批人
*/
private String approveBy;
/**
* 审批时间
*/
private Date approveTime;
/**
* 审批意见
*/
private String approveOpinion;
/**
* 驳回原因
*/
private String rejectReason;
/**
* 主表id
*/
private Long mainId;
/**
* 记录此次操作结果ids
*/
private String detailIds;
/**
* 实验操作人
*/
private String experimentOperator;
/**
* 实验开始时间
*/
private Date experimentStartTime;
/**
* 实验结束时间
*/
private Date experimentEndTime;
/**
* 实验结果汇总/结论
*/
private String resultSummary;
/**
* 结果填报人(录入台账的人)
*/
private String resultFiller;
/**
* 结果填报时间
*/
private Date resultFillTime;
/**
* 删除标志0=正常 2=删除)
*/
@TableLogic
private Integer delFlag;
/**
* 备注
*/
private String remark;
}

View File

@@ -0,0 +1,153 @@
package com.klp.domain.bo;
import com.klp.common.core.domain.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import javax.validation.constraints.*;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
/**
* 检化验申请单业务对象 wms_inspection_application
*
* @author klp
* @date 2026-07-08
*/
@Data
@EqualsAndHashCode(callSuper = true)
public class WmsInspectionApplicationBo extends BaseEntity {
/**
* 申请单主键
*/
private Long applicationId;
/**
* 申请单编号(如 LAB-20260708-0001
*/
private String applicationNo;
/**
* 申请标题
*/
private String applicationTitle;
/**
* 产线1#产线、2#产线)
*/
private String productionLine;
/**
* 实验类型字典lab_experiment_typephysical=物理检验 chemical=化学检验)
*/
private String experimentType;
/**
* 样品名称
*/
private String sampleName;
/**
* 样品批号
*/
private String sampleBatchNo;
/**
* 样品来源(如:来料、过程样、成品样)
*/
private String sampleSource;
/**
* 样品数量
*/
private Long sampleQuantity;
/**
* 检验目的/用途说明
*/
private String testPurpose;
/**
* 要求完成日期
*/
private Date requiredDate;
/**
* 流程状态字典lab_application_status1=草稿 2=待审批 3=已通过 4=已驳回 5=实验中 6=已完成
*/
private Integer flowStatus;
/**
* 提交送审时间
*/
private Date submitTime;
/**
* 审批人
*/
private String approveBy;
/**
* 审批时间
*/
private Date approveTime;
/**
* 审批意见
*/
private String approveOpinion;
/**
* 驳回原因
*/
private String rejectReason;
/**
* 主表id
*/
private Long mainId;
/**
* 记录此次操作结果ids
*/
private String detailIds;
/**
* 实验操作人
*/
private String experimentOperator;
/**
* 实验开始时间
*/
private Date experimentStartTime;
/**
* 实验结束时间
*/
private Date experimentEndTime;
/**
* 实验结果汇总/结论
*/
private String resultSummary;
/**
* 结果填报人(录入台账的人)
*/
private String resultFiller;
/**
* 结果填报时间
*/
private Date resultFillTime;
/**
* 备注
*/
private String remark;
}

View File

@@ -0,0 +1,187 @@
package com.klp.domain.vo;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import com.klp.common.annotation.ExcelDictFormat;
import com.klp.common.convert.ExcelDictConvert;
import lombok.Data;
/**
* 检化验申请单视图对象 wms_inspection_application
*
* @author klp
* @date 2026-07-08
*/
@Data
@ExcelIgnoreUnannotated
public class WmsInspectionApplicationVo {
private static final long serialVersionUID = 1L;
/**
* 申请单主键
*/
@ExcelProperty(value = "申请单主键")
private Long applicationId;
/**
* 申请单编号(如 LAB-20260708-0001
*/
@ExcelProperty(value = "申请单编号", converter = ExcelDictConvert.class)
@ExcelDictFormat(readConverterExp = "如=,L=AB-20260708-0001")
private String applicationNo;
/**
* 申请标题
*/
@ExcelProperty(value = "申请标题")
private String applicationTitle;
/**
* 产线1#产线、2#产线)
*/
@ExcelProperty(value = "产线", converter = ExcelDictConvert.class)
@ExcelDictFormat(readConverterExp = "如=1#产线、2#产线")
private String productionLine;
/**
* 实验类型字典lab_experiment_typephysical=物理检验 chemical=化学检验)
*/
@ExcelProperty(value = "实验类型", converter = ExcelDictConvert.class)
@ExcelDictFormat(readConverterExp = "字=典lab_experiment_typephysical=物理检验,c=hemical=化学检验")
private String experimentType;
/**
* 样品名称
*/
@ExcelProperty(value = "样品名称")
private String sampleName;
/**
* 样品批号
*/
@ExcelProperty(value = "样品批号")
private String sampleBatchNo;
/**
* 样品来源(如:来料、过程样、成品样)
*/
@ExcelProperty(value = "样品来源", converter = ExcelDictConvert.class)
@ExcelDictFormat(readConverterExp = "如=:来料、过程样、成品样")
private String sampleSource;
/**
* 样品数量
*/
@ExcelProperty(value = "样品数量")
private Long sampleQuantity;
/**
* 检验目的/用途说明
*/
@ExcelProperty(value = "检验目的/用途说明")
private String testPurpose;
/**
* 要求完成日期
*/
@ExcelProperty(value = "要求完成日期")
private Date requiredDate;
/**
* 流程状态字典lab_application_status1=草稿 2=待审批 3=已通过 4=已驳回 5=实验中 6=已完成
*/
@ExcelProperty(value = "流程状态", converter = ExcelDictConvert.class)
@ExcelDictFormat(readConverterExp = "字=典lab_application_status")
private Integer flowStatus;
/**
* 提交送审时间
*/
@ExcelProperty(value = "提交送审时间")
private Date submitTime;
/**
* 审批人
*/
@ExcelProperty(value = "审批人")
private String approveBy;
/**
* 审批时间
*/
@ExcelProperty(value = "审批时间")
private Date approveTime;
/**
* 审批意见
*/
@ExcelProperty(value = "审批意见")
private String approveOpinion;
/**
* 驳回原因
*/
@ExcelProperty(value = "驳回原因")
private String rejectReason;
/**
* 主表id
*/
@ExcelProperty(value = "主表id")
private Long mainId;
/**
* 记录此次操作结果ids
*/
@ExcelProperty(value = "记录此次操作结果ids")
private String detailIds;
/**
* 实验操作人
*/
@ExcelProperty(value = "实验操作人")
private String experimentOperator;
/**
* 实验开始时间
*/
@ExcelProperty(value = "实验开始时间")
private Date experimentStartTime;
/**
* 实验结束时间
*/
@ExcelProperty(value = "实验结束时间")
private Date experimentEndTime;
/**
* 实验结果汇总/结论
*/
@ExcelProperty(value = "实验结果汇总/结论")
private String resultSummary;
/**
* 结果填报人(录入台账的人)
*/
@ExcelProperty(value = "结果填报人", converter = ExcelDictConvert.class)
@ExcelDictFormat(readConverterExp = "录=入台账的人")
private String resultFiller;
/**
* 结果填报时间
*/
@ExcelProperty(value = "结果填报时间")
private Date resultFillTime;
/**
* 备注
*/
@ExcelProperty(value = "备注")
private String remark;
}

View File

@@ -0,0 +1,15 @@
package com.klp.mapper;
import com.klp.domain.WmsInspectionApplication;
import com.klp.domain.vo.WmsInspectionApplicationVo;
import com.klp.common.core.mapper.BaseMapperPlus;
/**
* 检化验申请单Mapper接口
*
* @author klp
* @date 2026-07-08
*/
public interface WmsInspectionApplicationMapper extends BaseMapperPlus<WmsInspectionApplicationMapper, WmsInspectionApplication, WmsInspectionApplicationVo> {
}

View File

@@ -0,0 +1,49 @@
package com.klp.service;
import com.klp.domain.WmsInspectionApplication;
import com.klp.domain.vo.WmsInspectionApplicationVo;
import com.klp.domain.bo.WmsInspectionApplicationBo;
import com.klp.common.core.page.TableDataInfo;
import com.klp.common.core.domain.PageQuery;
import java.util.Collection;
import java.util.List;
/**
* 检化验申请单Service接口
*
* @author klp
* @date 2026-07-08
*/
public interface IWmsInspectionApplicationService {
/**
* 查询检化验申请单
*/
WmsInspectionApplicationVo queryById(Long applicationId);
/**
* 查询检化验申请单列表
*/
TableDataInfo<WmsInspectionApplicationVo> queryPageList(WmsInspectionApplicationBo bo, PageQuery pageQuery);
/**
* 查询检化验申请单列表
*/
List<WmsInspectionApplicationVo> queryList(WmsInspectionApplicationBo bo);
/**
* 新增检化验申请单
*/
Boolean insertByBo(WmsInspectionApplicationBo bo);
/**
* 修改检化验申请单
*/
Boolean updateByBo(WmsInspectionApplicationBo bo);
/**
* 校验并批量删除检化验申请单信息
*/
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
}

View File

@@ -0,0 +1,132 @@
package com.klp.service.impl;
import cn.hutool.core.bean.BeanUtil;
import com.klp.common.core.page.TableDataInfo;
import com.klp.common.core.domain.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 com.klp.common.utils.StringUtils;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import com.klp.domain.bo.WmsInspectionApplicationBo;
import com.klp.domain.vo.WmsInspectionApplicationVo;
import com.klp.domain.WmsInspectionApplication;
import com.klp.mapper.WmsInspectionApplicationMapper;
import com.klp.service.IWmsInspectionApplicationService;
import java.util.List;
import java.util.Map;
import java.util.Collection;
/**
* 检化验申请单Service业务层处理
*
* @author klp
* @date 2026-07-08
*/
@RequiredArgsConstructor
@Service
public class WmsInspectionApplicationServiceImpl implements IWmsInspectionApplicationService {
private final WmsInspectionApplicationMapper baseMapper;
/**
* 查询检化验申请单
*/
@Override
public WmsInspectionApplicationVo queryById(Long applicationId){
return baseMapper.selectVoById(applicationId);
}
/**
* 查询检化验申请单列表
*/
@Override
public TableDataInfo<WmsInspectionApplicationVo> queryPageList(WmsInspectionApplicationBo bo, PageQuery pageQuery) {
LambdaQueryWrapper<WmsInspectionApplication> lqw = buildQueryWrapper(bo);
Page<WmsInspectionApplicationVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
return TableDataInfo.build(result);
}
/**
* 查询检化验申请单列表
*/
@Override
public List<WmsInspectionApplicationVo> queryList(WmsInspectionApplicationBo bo) {
LambdaQueryWrapper<WmsInspectionApplication> lqw = buildQueryWrapper(bo);
return baseMapper.selectVoList(lqw);
}
private LambdaQueryWrapper<WmsInspectionApplication> buildQueryWrapper(WmsInspectionApplicationBo bo) {
Map<String, Object> params = bo.getParams();
LambdaQueryWrapper<WmsInspectionApplication> lqw = Wrappers.lambdaQuery();
lqw.eq(StringUtils.isNotBlank(bo.getApplicationNo()), WmsInspectionApplication::getApplicationNo, bo.getApplicationNo());
lqw.eq(StringUtils.isNotBlank(bo.getApplicationTitle()), WmsInspectionApplication::getApplicationTitle, bo.getApplicationTitle());
lqw.eq(StringUtils.isNotBlank(bo.getProductionLine()), WmsInspectionApplication::getProductionLine, bo.getProductionLine());
lqw.eq(StringUtils.isNotBlank(bo.getExperimentType()), WmsInspectionApplication::getExperimentType, bo.getExperimentType());
lqw.like(StringUtils.isNotBlank(bo.getSampleName()), WmsInspectionApplication::getSampleName, bo.getSampleName());
lqw.eq(StringUtils.isNotBlank(bo.getSampleBatchNo()), WmsInspectionApplication::getSampleBatchNo, bo.getSampleBatchNo());
lqw.eq(StringUtils.isNotBlank(bo.getSampleSource()), WmsInspectionApplication::getSampleSource, bo.getSampleSource());
lqw.eq(bo.getSampleQuantity() != null, WmsInspectionApplication::getSampleQuantity, bo.getSampleQuantity());
lqw.eq(StringUtils.isNotBlank(bo.getTestPurpose()), WmsInspectionApplication::getTestPurpose, bo.getTestPurpose());
lqw.eq(bo.getRequiredDate() != null, WmsInspectionApplication::getRequiredDate, bo.getRequiredDate());
lqw.eq(bo.getFlowStatus() != null, WmsInspectionApplication::getFlowStatus, bo.getFlowStatus());
lqw.eq(bo.getSubmitTime() != null, WmsInspectionApplication::getSubmitTime, bo.getSubmitTime());
lqw.eq(StringUtils.isNotBlank(bo.getApproveBy()), WmsInspectionApplication::getApproveBy, bo.getApproveBy());
lqw.eq(bo.getApproveTime() != null, WmsInspectionApplication::getApproveTime, bo.getApproveTime());
lqw.eq(StringUtils.isNotBlank(bo.getApproveOpinion()), WmsInspectionApplication::getApproveOpinion, bo.getApproveOpinion());
lqw.eq(StringUtils.isNotBlank(bo.getRejectReason()), WmsInspectionApplication::getRejectReason, bo.getRejectReason());
lqw.eq(bo.getMainId() != null, WmsInspectionApplication::getMainId, bo.getMainId());
lqw.eq(StringUtils.isNotBlank(bo.getDetailIds()), WmsInspectionApplication::getDetailIds, bo.getDetailIds());
lqw.eq(StringUtils.isNotBlank(bo.getExperimentOperator()), WmsInspectionApplication::getExperimentOperator, bo.getExperimentOperator());
lqw.eq(bo.getExperimentStartTime() != null, WmsInspectionApplication::getExperimentStartTime, bo.getExperimentStartTime());
lqw.eq(bo.getExperimentEndTime() != null, WmsInspectionApplication::getExperimentEndTime, bo.getExperimentEndTime());
lqw.eq(StringUtils.isNotBlank(bo.getResultSummary()), WmsInspectionApplication::getResultSummary, bo.getResultSummary());
lqw.eq(StringUtils.isNotBlank(bo.getResultFiller()), WmsInspectionApplication::getResultFiller, bo.getResultFiller());
lqw.eq(bo.getResultFillTime() != null, WmsInspectionApplication::getResultFillTime, bo.getResultFillTime());
return lqw;
}
/**
* 新增检化验申请单
*/
@Override
public Boolean insertByBo(WmsInspectionApplicationBo bo) {
WmsInspectionApplication add = BeanUtil.toBean(bo, WmsInspectionApplication.class);
validEntityBeforeSave(add);
boolean flag = baseMapper.insert(add) > 0;
if (flag) {
bo.setApplicationId(add.getApplicationId());
}
return flag;
}
/**
* 修改检化验申请单
*/
@Override
public Boolean updateByBo(WmsInspectionApplicationBo bo) {
WmsInspectionApplication update = BeanUtil.toBean(bo, WmsInspectionApplication.class);
validEntityBeforeSave(update);
return baseMapper.updateById(update) > 0;
}
/**
* 保存前的数据校验
*/
private void validEntityBeforeSave(WmsInspectionApplication entity){
//TODO 做一些数据校验,如唯一约束
}
/**
* 批量删除检化验申请单
*/
@Override
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
if(isValid){
//TODO 做一些业务上的校验,判断是否需要校验
}
return baseMapper.deleteBatchIds(ids) > 0;
}
}

View File

@@ -0,0 +1,42 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.klp.mapper.WmsInspectionApplicationMapper">
<resultMap type="com.klp.domain.WmsInspectionApplication" id="WmsInspectionApplicationResult">
<result property="applicationId" column="application_id"/>
<result property="applicationNo" column="application_no"/>
<result property="applicationTitle" column="application_title"/>
<result property="productionLine" column="production_line"/>
<result property="experimentType" column="experiment_type"/>
<result property="sampleName" column="sample_name"/>
<result property="sampleBatchNo" column="sample_batch_no"/>
<result property="sampleSource" column="sample_source"/>
<result property="sampleQuantity" column="sample_quantity"/>
<result property="testPurpose" column="test_purpose"/>
<result property="requiredDate" column="required_date"/>
<result property="flowStatus" column="flow_status"/>
<result property="submitTime" column="submit_time"/>
<result property="approveBy" column="approve_by"/>
<result property="approveTime" column="approve_time"/>
<result property="approveOpinion" column="approve_opinion"/>
<result property="rejectReason" column="reject_reason"/>
<result property="mainId" column="main_id"/>
<result property="detailIds" column="detail_ids"/>
<result property="experimentOperator" column="experiment_operator"/>
<result property="experimentStartTime" column="experiment_start_time"/>
<result property="experimentEndTime" column="experiment_end_time"/>
<result property="resultSummary" column="result_summary"/>
<result property="resultFiller" column="result_filler"/>
<result property="resultFillTime" column="result_fill_time"/>
<result property="delFlag" column="del_flag"/>
<result property="createBy" column="create_by"/>
<result property="createTime" column="create_time"/>
<result property="updateBy" column="update_by"/>
<result property="updateTime" column="update_time"/>
<result property="remark" column="remark"/>
</resultMap>
</mapper>