From 62b594026bfa1c5cd30c223518cc1969de384231 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E6=96=87=E6=98=8A?= <15984991+wwh2328692301@user.noreply.gitee.com> Date: Mon, 20 Apr 2026 18:20:29 +0800 Subject: [PATCH] =?UTF-8?q?feat(wms):=20=E8=A7=84=E7=A8=8B=E4=B8=BB?= =?UTF-8?q?=E8=A1=A8=20wms=5Fprocess=5Fspec=20=E5=85=A8=E6=A0=88=20CRUD?= =?UTF-8?q?=EF=BC=88=E4=BB=BB=E5=8A=A12=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 新增规程档案后端(Entity/BO/VO/Mapper/Service/Controller),接口前缀 /wms/processSpec, 含分页查询、导出、详情、增删改;保存时校验规程编号唯一;逻辑删除与全局配置一致(0 未删 / 2 已删)。 新增 Flyway 脚本 V10 建表及唯一索引;前端增加 api/wms/processSpec.js 与 views/wms/processSpec/index.vue, 支持按编号/名称/类型/产线/产品类型/启用状态筛选,产线下拉关联现有产线接口。 说明:需在目标库执行迁移并在菜单中配置组件路径 wms/processSpec/index。 --- .../db/migration/V10__wms_process_spec.sql | 20 ++ klp-ui/src/api/wms/processSpec.js | 44 +++ klp-ui/src/views/wms/processSpec/index.vue | 306 ++++++++++++++++++ .../controller/WmsProcessSpecController.java | 99 ++++++ .../java/com/klp/domain/WmsProcessSpec.java | 68 ++++ .../com/klp/domain/bo/WmsProcessSpecBo.java | 65 ++++ .../com/klp/domain/vo/WmsProcessSpecVo.java | 82 +++++ .../com/klp/mapper/WmsProcessSpecMapper.java | 14 + .../klp/service/IWmsProcessSpecService.java | 47 +++ .../impl/WmsProcessSpecServiceImpl.java | 101 ++++++ .../mapper/klp/WmsProcessSpecMapper.xml | 23 ++ 11 files changed, 869 insertions(+) create mode 100644 klp-admin/src/main/resources/db/migration/V10__wms_process_spec.sql create mode 100644 klp-ui/src/api/wms/processSpec.js create mode 100644 klp-ui/src/views/wms/processSpec/index.vue create mode 100644 klp-wms/src/main/java/com/klp/controller/WmsProcessSpecController.java create mode 100644 klp-wms/src/main/java/com/klp/domain/WmsProcessSpec.java create mode 100644 klp-wms/src/main/java/com/klp/domain/bo/WmsProcessSpecBo.java create mode 100644 klp-wms/src/main/java/com/klp/domain/vo/WmsProcessSpecVo.java create mode 100644 klp-wms/src/main/java/com/klp/mapper/WmsProcessSpecMapper.java create mode 100644 klp-wms/src/main/java/com/klp/service/IWmsProcessSpecService.java create mode 100644 klp-wms/src/main/java/com/klp/service/impl/WmsProcessSpecServiceImpl.java create mode 100644 klp-wms/src/main/resources/mapper/klp/WmsProcessSpecMapper.xml diff --git a/klp-admin/src/main/resources/db/migration/V10__wms_process_spec.sql b/klp-admin/src/main/resources/db/migration/V10__wms_process_spec.sql new file mode 100644 index 00000000..211b8545 --- /dev/null +++ b/klp-admin/src/main/resources/db/migration/V10__wms_process_spec.sql @@ -0,0 +1,20 @@ +-- 冷轧涂镀数智运营 - 规程主表 +CREATE TABLE wms_process_spec ( + spec_id BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键', + spec_code VARCHAR(64) NOT NULL COMMENT '规程编号', + spec_name VARCHAR(200) NOT NULL COMMENT '规程名称', + spec_type VARCHAR(32) NOT NULL DEFAULT 'PROCESS' COMMENT '类型(PROCESS=工艺规程,STANDARD=标准)', + line_id BIGINT NOT NULL COMMENT '产线ID', + product_type VARCHAR(100) NULL COMMENT '产品类型', + is_enabled TINYINT NOT NULL DEFAULT 1 COMMENT '是否启用(0否1是)', + create_by VARCHAR(64) NULL COMMENT '创建人', + create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + update_by VARCHAR(64) NULL COMMENT '更新人', + update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + del_flag TINYINT NOT NULL DEFAULT 0 COMMENT '删除标志(0正常2删除,与全局逻辑删除配置一致)', + remark VARCHAR(500) NULL COMMENT '备注', + PRIMARY KEY (spec_id), + UNIQUE KEY uk_wms_process_spec_code (spec_code), + KEY idx_wms_process_spec_line (line_id), + KEY idx_wms_process_spec_type (spec_type) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='规程主表'; diff --git a/klp-ui/src/api/wms/processSpec.js b/klp-ui/src/api/wms/processSpec.js new file mode 100644 index 00000000..5fc0a17a --- /dev/null +++ b/klp-ui/src/api/wms/processSpec.js @@ -0,0 +1,44 @@ +import request from '@/utils/request' + +// 查询规程主表列表 +export function listProcessSpec(query) { + return request({ + url: '/wms/processSpec/list', + method: 'get', + params: query + }) +} + +// 查询规程主表详细 +export function getProcessSpec(specId) { + return request({ + url: '/wms/processSpec/' + specId, + method: 'get' + }) +} + +// 新增规程主表 +export function addProcessSpec(data) { + return request({ + url: '/wms/processSpec', + method: 'post', + data: data + }) +} + +// 修改规程主表 +export function updateProcessSpec(data) { + return request({ + url: '/wms/processSpec', + method: 'put', + data: data + }) +} + +// 删除规程主表 +export function delProcessSpec(specId) { + return request({ + url: '/wms/processSpec/' + specId, + method: 'delete' + }) +} diff --git a/klp-ui/src/views/wms/processSpec/index.vue b/klp-ui/src/views/wms/processSpec/index.vue new file mode 100644 index 00000000..68128c8e --- /dev/null +++ b/klp-ui/src/views/wms/processSpec/index.vue @@ -0,0 +1,306 @@ + + + diff --git a/klp-wms/src/main/java/com/klp/controller/WmsProcessSpecController.java b/klp-wms/src/main/java/com/klp/controller/WmsProcessSpecController.java new file mode 100644 index 00000000..54ea98a9 --- /dev/null +++ b/klp-wms/src/main/java/com/klp/controller/WmsProcessSpecController.java @@ -0,0 +1,99 @@ +package com.klp.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.domain.bo.WmsProcessSpecBo; +import com.klp.domain.vo.WmsProcessSpecVo; +import com.klp.service.IWmsProcessSpecService; +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 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/wms/processSpec") +public class WmsProcessSpecController extends BaseController { + + private final IWmsProcessSpecService wmsProcessSpecService; + + /** + * 查询规程主表列表 + */ + @GetMapping("/list") + public TableDataInfo list(WmsProcessSpecBo bo, PageQuery pageQuery) { + return wmsProcessSpecService.queryPageList(bo, pageQuery); + } + + /** + * 导出规程主表列表 + */ + @Log(title = "规程主表", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(WmsProcessSpecBo bo, HttpServletResponse response) { + List list = wmsProcessSpecService.queryList(bo); + ExcelUtil.exportExcel(list, "规程主表", WmsProcessSpecVo.class, response); + } + + /** + * 获取规程主表详细信息 + * + * @param specId 主键 + */ + @GetMapping("/{specId}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long specId) { + return R.ok(wmsProcessSpecService.queryById(specId)); + } + + /** + * 新增规程主表 + */ + @Log(title = "规程主表", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody WmsProcessSpecBo bo) { + return toAjax(wmsProcessSpecService.insertByBo(bo)); + } + + /** + * 修改规程主表 + */ + @Log(title = "规程主表", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody WmsProcessSpecBo bo) { + return toAjax(wmsProcessSpecService.updateByBo(bo)); + } + + /** + * 删除规程主表 + * + * @param specIds 主键串 + */ + @Log(title = "规程主表", businessType = BusinessType.DELETE) + @DeleteMapping("/{specIds}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] specIds) { + return toAjax(wmsProcessSpecService.deleteWithValidByIds(Arrays.asList(specIds), true)); + } +} diff --git a/klp-wms/src/main/java/com/klp/domain/WmsProcessSpec.java b/klp-wms/src/main/java/com/klp/domain/WmsProcessSpec.java new file mode 100644 index 00000000..98835514 --- /dev/null +++ b/klp-wms/src/main/java/com/klp/domain/WmsProcessSpec.java @@ -0,0 +1,68 @@ +package com.klp.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; + +/** + * 规程主表对象 wms_process_spec + * + * @author klp + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("wms_process_spec") +public class WmsProcessSpec extends BaseEntity { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "spec_id") + private Long specId; + + /** + * 规程编号 + */ + private String specCode; + + /** + * 规程名称 + */ + private String specName; + + /** + * 类型(PROCESS/STANDARD) + */ + private String specType; + + /** + * 产线ID + */ + private Long lineId; + + /** + * 产品类型 + */ + private String productType; + + /** + * 是否启用(0=否,1=是) + */ + private Integer isEnabled; + + /** + * 删除标志(0=正常,2=删除,与全局 logicDeleteValue 一致) + */ + @TableLogic + private Integer delFlag; + + /** + * 备注 + */ + private String remark; +} diff --git a/klp-wms/src/main/java/com/klp/domain/bo/WmsProcessSpecBo.java b/klp-wms/src/main/java/com/klp/domain/bo/WmsProcessSpecBo.java new file mode 100644 index 00000000..227cb06a --- /dev/null +++ b/klp-wms/src/main/java/com/klp/domain/bo/WmsProcessSpecBo.java @@ -0,0 +1,65 @@ +package com.klp.domain.bo; + +import com.klp.common.core.domain.BaseEntity; +import com.klp.common.core.validate.AddGroup; +import com.klp.common.core.validate.EditGroup; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +/** + * 规程主表业务对象 wms_process_spec + * + * @author klp + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class WmsProcessSpecBo extends BaseEntity { + + /** + * 主键 + */ + @NotNull(message = "主键不能为空", groups = {EditGroup.class}) + private Long specId; + + /** + * 规程编号 + */ + @NotBlank(message = "规程编号不能为空", groups = {AddGroup.class, EditGroup.class}) + private String specCode; + + /** + * 规程名称 + */ + @NotBlank(message = "规程名称不能为空", groups = {AddGroup.class, EditGroup.class}) + private String specName; + + /** + * 类型(PROCESS/STANDARD) + */ + @NotBlank(message = "规程类型不能为空", groups = {AddGroup.class, EditGroup.class}) + private String specType; + + /** + * 产线ID + */ + @NotNull(message = "产线不能为空", groups = {AddGroup.class, EditGroup.class}) + private Long lineId; + + /** + * 产品类型 + */ + private String productType; + + /** + * 是否启用(0=否,1=是) + */ + private Integer isEnabled; + + /** + * 备注 + */ + private String remark; +} diff --git a/klp-wms/src/main/java/com/klp/domain/vo/WmsProcessSpecVo.java b/klp-wms/src/main/java/com/klp/domain/vo/WmsProcessSpecVo.java new file mode 100644 index 00000000..3dcaf894 --- /dev/null +++ b/klp-wms/src/main/java/com/klp/domain/vo/WmsProcessSpecVo.java @@ -0,0 +1,82 @@ +package com.klp.domain.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; + +import java.util.Date; + +/** + * 规程主表视图对象 wms_process_spec + * + * @author klp + */ +@Data +@ExcelIgnoreUnannotated +public class WmsProcessSpecVo { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @ExcelProperty(value = "主键") + private Long specId; + + /** + * 规程编号 + */ + @ExcelProperty(value = "规程编号") + private String specCode; + + /** + * 规程名称 + */ + @ExcelProperty(value = "规程名称") + private String specName; + + /** + * 类型(PROCESS/STANDARD) + */ + @ExcelProperty(value = "规程类型") + private String specType; + + /** + * 产线ID + */ + @ExcelProperty(value = "产线ID") + private Long lineId; + + /** + * 产品类型 + */ + @ExcelProperty(value = "产品类型") + private String productType; + + /** + * 是否启用(0=否,1=是) + */ + @ExcelProperty(value = "是否启用") + private Integer isEnabled; + + /** + * 备注 + */ + @ExcelProperty(value = "备注") + private String remark; + + /** + * 创建时间 + */ + @ExcelProperty(value = "创建时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date createTime; + + /** + * 更新时间 + */ + @ExcelProperty(value = "更新时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date updateTime; +} diff --git a/klp-wms/src/main/java/com/klp/mapper/WmsProcessSpecMapper.java b/klp-wms/src/main/java/com/klp/mapper/WmsProcessSpecMapper.java new file mode 100644 index 00000000..69c1ad41 --- /dev/null +++ b/klp-wms/src/main/java/com/klp/mapper/WmsProcessSpecMapper.java @@ -0,0 +1,14 @@ +package com.klp.mapper; + +import com.klp.common.core.mapper.BaseMapperPlus; +import com.klp.domain.WmsProcessSpec; +import com.klp.domain.vo.WmsProcessSpecVo; + +/** + * 规程主表Mapper接口 + * + * @author klp + */ +public interface WmsProcessSpecMapper extends BaseMapperPlus { + +} diff --git a/klp-wms/src/main/java/com/klp/service/IWmsProcessSpecService.java b/klp-wms/src/main/java/com/klp/service/IWmsProcessSpecService.java new file mode 100644 index 00000000..22c0ead6 --- /dev/null +++ b/klp-wms/src/main/java/com/klp/service/IWmsProcessSpecService.java @@ -0,0 +1,47 @@ +package com.klp.service; + +import com.klp.common.core.domain.PageQuery; +import com.klp.common.core.page.TableDataInfo; +import com.klp.domain.bo.WmsProcessSpecBo; +import com.klp.domain.vo.WmsProcessSpecVo; + +import java.util.Collection; +import java.util.List; + +/** + * 规程主表Service接口 + * + * @author klp + */ +public interface IWmsProcessSpecService { + + /** + * 查询规程主表 + */ + WmsProcessSpecVo queryById(Long specId); + + /** + * 查询规程主表分页列表 + */ + TableDataInfo queryPageList(WmsProcessSpecBo bo, PageQuery pageQuery); + + /** + * 查询规程主表列表 + */ + List queryList(WmsProcessSpecBo bo); + + /** + * 新增规程主表 + */ + Boolean insertByBo(WmsProcessSpecBo bo); + + /** + * 修改规程主表 + */ + Boolean updateByBo(WmsProcessSpecBo bo); + + /** + * 校验并批量删除规程主表 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/klp-wms/src/main/java/com/klp/service/impl/WmsProcessSpecServiceImpl.java b/klp-wms/src/main/java/com/klp/service/impl/WmsProcessSpecServiceImpl.java new file mode 100644 index 00000000..6c5b080a --- /dev/null +++ b/klp-wms/src/main/java/com/klp/service/impl/WmsProcessSpecServiceImpl.java @@ -0,0 +1,101 @@ +package com.klp.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.exception.ServiceException; +import com.klp.common.utils.StringUtils; +import com.klp.domain.WmsProcessSpec; +import com.klp.domain.bo.WmsProcessSpecBo; +import com.klp.domain.vo.WmsProcessSpecVo; +import com.klp.mapper.WmsProcessSpecMapper; +import com.klp.service.IWmsProcessSpecService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.Collection; +import java.util.List; + +/** + * 规程主表Service业务层处理 + * + * @author klp + */ +@RequiredArgsConstructor +@Service +public class WmsProcessSpecServiceImpl implements IWmsProcessSpecService { + + private final WmsProcessSpecMapper baseMapper; + + @Override + public WmsProcessSpecVo queryById(Long specId) { + return baseMapper.selectVoById(specId); + } + + @Override + public TableDataInfo queryPageList(WmsProcessSpecBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + @Override + public List queryList(WmsProcessSpecBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(WmsProcessSpecBo bo) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(StringUtils.isNotBlank(bo.getSpecCode()), WmsProcessSpec::getSpecCode, bo.getSpecCode()); + lqw.like(StringUtils.isNotBlank(bo.getSpecName()), WmsProcessSpec::getSpecName, bo.getSpecName()); + lqw.eq(StringUtils.isNotBlank(bo.getSpecType()), WmsProcessSpec::getSpecType, bo.getSpecType()); + lqw.eq(bo.getLineId() != null, WmsProcessSpec::getLineId, bo.getLineId()); + lqw.like(StringUtils.isNotBlank(bo.getProductType()), WmsProcessSpec::getProductType, bo.getProductType()); + lqw.eq(bo.getIsEnabled() != null, WmsProcessSpec::getIsEnabled, bo.getIsEnabled()); + return lqw; + } + + @Override + public Boolean insertByBo(WmsProcessSpecBo bo) { + WmsProcessSpec add = BeanUtil.toBean(bo, WmsProcessSpec.class); + if (add.getIsEnabled() == null) { + add.setIsEnabled(1); + } + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setSpecId(add.getSpecId()); + } + return flag; + } + + @Override + public Boolean updateByBo(WmsProcessSpecBo bo) { + WmsProcessSpec update = BeanUtil.toBean(bo, WmsProcessSpec.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + private void validEntityBeforeSave(WmsProcessSpec entity) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(WmsProcessSpec::getSpecCode, entity.getSpecCode()); + if (entity.getSpecId() != null) { + lqw.ne(WmsProcessSpec::getSpecId, entity.getSpecId()); + } + if (baseMapper.selectCount(lqw) > 0) { + throw new ServiceException("规程编号已存在"); + } + } + + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if (Boolean.TRUE.equals(isValid)) { + // 任务3 可在此校验版本等从表数据 + } + return baseMapper.deleteBatchIds(ids) > 0; + } +} diff --git a/klp-wms/src/main/resources/mapper/klp/WmsProcessSpecMapper.xml b/klp-wms/src/main/resources/mapper/klp/WmsProcessSpecMapper.xml new file mode 100644 index 00000000..51df1fb3 --- /dev/null +++ b/klp-wms/src/main/resources/mapper/klp/WmsProcessSpecMapper.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + +