diff --git a/klp-ui/src/api/pltcm/model.js b/klp-ui/src/api/pltcm/model.js
new file mode 100644
index 000000000..bc37ad25f
--- /dev/null
+++ b/klp-ui/src/api/pltcm/model.js
@@ -0,0 +1,154 @@
+import request from '@/utils/request'
+
+// ═══════════════════════════════════════
+// 厚度分类
+// ═══════════════════════════════════════
+export function listThickClass(query) {
+ return request({ url: '/pltcm/thickClass/list', method: 'get', params: query })
+}
+
+export function getThickClass(classId) {
+ return request({ url: '/pltcm/thickClass/' + classId, method: 'get' })
+}
+
+export function addThickClass(data) {
+ return request({ url: '/pltcm/thickClass', method: 'post', data })
+}
+
+export function updateThickClass(data) {
+ return request({ url: '/pltcm/thickClass', method: 'put', data })
+}
+
+export function delThickClass(classIds) {
+ return request({ url: '/pltcm/thickClass/' + classIds, method: 'delete' })
+}
+
+// ═══════════════════════════════════════
+// 宽度分类
+// ═══════════════════════════════════════
+export function listWidthClass(query) {
+ return request({ url: '/pltcm/widthClass/list', method: 'get', params: query })
+}
+
+export function getWidthClass(classId) {
+ return request({ url: '/pltcm/widthClass/' + classId, method: 'get' })
+}
+
+export function addWidthClass(data) {
+ return request({ url: '/pltcm/widthClass', method: 'post', data })
+}
+
+export function updateWidthClass(data) {
+ return request({ url: '/pltcm/widthClass', method: 'put', data })
+}
+
+export function delWidthClass(classIds) {
+ return request({ url: '/pltcm/widthClass/' + classIds, method: 'delete' })
+}
+
+// ═══════════════════════════════════════
+// 屈服强度分类
+// ═══════════════════════════════════════
+export function listYieldStressClass(query) {
+ return request({ url: '/pltcm/yieldStressClass/list', method: 'get', params: query })
+}
+
+export function getYieldStressClass(classId) {
+ return request({ url: '/pltcm/yieldStressClass/' + classId, method: 'get' })
+}
+
+export function addYieldStressClass(data) {
+ return request({ url: '/pltcm/yieldStressClass', method: 'post', data })
+}
+
+export function updateYieldStressClass(data) {
+ return request({ url: '/pltcm/yieldStressClass', method: 'put', data })
+}
+
+export function delYieldStressClass(classIds) {
+ return request({ url: '/pltcm/yieldStressClass/' + classIds, method: 'delete' })
+}
+
+// ═══════════════════════════════════════
+// 策略关联
+// ═══════════════════════════════════════
+export function listStrategy(query) {
+ return request({ url: '/pltcm/strategy/list', method: 'get', params: query })
+}
+
+export function getStrategy(id) {
+ return request({ url: '/pltcm/strategy/' + id, method: 'get' })
+}
+
+export function addStrategy(data) {
+ return request({ url: '/pltcm/strategy', method: 'post', data })
+}
+
+export function updateStrategy(data) {
+ return request({ url: '/pltcm/strategy', method: 'put', data })
+}
+
+export function delStrategy(ids) {
+ return request({ url: '/pltcm/strategy/' + ids, method: 'delete' })
+}
+
+// ═══════════════════════════════════════
+// 屈服强度与钢种对应关系
+// ═══════════════════════════════════════
+export function listSteelgrade(query) {
+ return request({ url: '/pltcm/steelgrade/list', method: 'get', params: query })
+}
+
+export function getSteelgrade(steelGrade) {
+ return request({ url: '/pltcm/steelgrade/' + steelGrade, method: 'get' })
+}
+
+export function addSteelgrade(data) {
+ return request({ url: '/pltcm/steelgrade', method: 'post', data })
+}
+
+export function updateSteelgrade(data) {
+ return request({ url: '/pltcm/steelgrade', method: 'put', data })
+}
+
+export function delSteelgrade(steelGrades) {
+ return request({ url: '/pltcm/steelgrade/' + steelGrades, method: 'delete' })
+}
+
+// ═══════════════════════════════════════
+// 比例标准表
+// ═══════════════════════════════════════
+export function listRatio(query) {
+ return request({ url: '/pltcm/ratio/list', method: 'get', params: query })
+}
+
+export function getRatio(id) {
+ return request({ url: '/pltcm/ratio/' + id, method: 'get' })
+}
+
+export function addRatio(data) {
+ return request({ url: '/pltcm/ratio', method: 'post', data })
+}
+
+export function updateRatio(data) {
+ return request({ url: '/pltcm/ratio', method: 'put', data })
+}
+
+export function delRatio(ids) {
+ return request({ url: '/pltcm/ratio/' + ids, method: 'delete' })
+}
+
+// ═══════════════════════════════════════
+// 设备启用状态
+// ═══════════════════════════════════════
+export function listDeviceEnable(query) {
+ return request({ url: '/pltcm/deviceEnable/list', method: 'get', params: query })
+}
+
+export function getDeviceEnable(id) {
+ return request({ url: '/pltcm/deviceEnable/' + id, method: 'get' })
+}
+
+export function updateDeviceEnable(data) {
+ return request({ url: '/pltcm/deviceEnable', method: 'put', data })
+}
diff --git a/klp-ui/src/components/MemoInput/index.vue b/klp-ui/src/components/MemoInput/index.vue
index 89b24fbe9..790555ac3 100644
--- a/klp-ui/src/components/MemoInput/index.vue
+++ b/klp-ui/src/components/MemoInput/index.vue
@@ -58,6 +58,12 @@ export default {
disabled: {
type: Boolean,
default: false
+ },
+ // 下拉最多展示条数,默认6条
+ maxSuggestions: {
+ type: Number,
+ default: 6,
+ validator: (value) => value > 0
}
},
data() {
@@ -118,7 +124,7 @@ export default {
});
}
- cb(results); // 回调返回匹配结果
+ cb(results.slice(0, this.maxSuggestions)); // 回调返回匹配结果(限制条数)
},
/**
diff --git a/klp-ui/src/views/mes/qc/qualityReview/index.vue b/klp-ui/src/views/mes/qc/qualityReview/index.vue
index 3d16e6490..09305fefc 100644
--- a/klp-ui/src/views/mes/qc/qualityReview/index.vue
+++ b/klp-ui/src/views/mes/qc/qualityReview/index.vue
@@ -411,7 +411,7 @@ import { listWarehouse } from '@/api/wms/warehouse'
export default {
name: 'QualityReview',
components: { CoilSelector },
- dicts: ['quality_review_status', 'regrade_quality_type', 'coil_quality_status'],
+ dicts: ['quality_review_status', 'coil_quality_status'],
data() {
return {
// 列表
diff --git a/klp-ui/src/views/mes/qc/qualityReview/todo.vue b/klp-ui/src/views/mes/qc/qualityReview/todo.vue
index fe0b5eb07..98b92aa24 100644
--- a/klp-ui/src/views/mes/qc/qualityReview/todo.vue
+++ b/klp-ui/src/views/mes/qc/qualityReview/todo.vue
@@ -93,7 +93,7 @@ import { listQualityReview, approveQualityReview, rejectQualityReview, getQualit
export default {
name: 'QualityReviewTodo',
- dicts: ['quality_review_status', 'regrade_quality_type', 'coil_quality_status'],
+ dicts: ['quality_review_status', 'coil_quality_status'],
data() {
return {
loading: false,
diff --git a/klp-ui/src/views/micro/pages/acid/components/Model.vue b/klp-ui/src/views/micro/pages/acid/components/Model.vue
new file mode 100644
index 000000000..2bada5921
--- /dev/null
+++ b/klp-ui/src/views/micro/pages/acid/components/Model.vue
@@ -0,0 +1,1359 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 冷卷号
+ {{ currentCoil.EXIT_COILID }}
+
+
+ 钢种
+ {{ currentCoil.ORDER_QUALITY }}
+
+
+ 来料厚度
+ {{ currentCoil.ENTRY_THICK }}
+ mm
+
+
+ 产品厚度
+ {{ currentCoil.EXIT_THICK }}
+ mm
+
+
+ 压下率
+ {{ currentCoil.reductionRate }}
+ %
+
+
+ 来料宽度
+ {{ currentCoil.ENTRY_WIDTH }}
+ mm
+
+
+ 产品宽度
+ {{ currentCoil.EXIT_WIDTH }}
+ mm
+
+
+
+
+
+
+
+ 冷卷号
+ {{ nextCoil.EXIT_COILID }}
+
+
+ 钢种
+ {{ nextCoil.ORDER_QUALITY }}
+
+
+ 来料厚度
+ {{ nextCoil.ENTRY_THICK }}
+ mm
+
+
+ 产品厚度
+ {{ nextCoil.EXIT_THICK }}
+ mm
+
+
+ 压下率
+ {{ nextCoil.reductionRate }}
+ %
+
+
+ 来料宽度
+ {{ nextCoil.ENTRY_WIDTH }}
+ mm
+
+
+ 产品宽度
+ {{ nextCoil.EXIT_WIDTH }}
+ mm
+
+
+
+
+
+
+
+
+
+
+
+
+ 新增
+
+
+
+
+
+
+ {{ formatDate(row.insDate) }}
+
+
+
+ 编辑
+ 删除
+
+
+
+
+
+
+
+
+
+ 新增
+
+
+
+
+
+
+ {{ formatDate(row.insDate) }}
+
+
+
+ 编辑
+ 删除
+
+
+
+
+
+
+
+
+
+ 新增
+
+
+
+
+
+
+ {{ formatDate(row.insDate) }}
+
+
+
+ 编辑
+ 删除
+
+
+
+
+
+
+
+
+
+ 新增
+
+
+
+
+
+
+
+
+ 编辑
+ 删除
+
+
+
+
+
+
+
+
+
+ 新增
+
+
+
+
+
+
+
+
+
+ {{ formatDate(row.insDate) }}
+
+
+
+ 编辑
+ 删除
+
+
+
+
+
+
+
+
+
+ 新增
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 编辑
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 取消
+ 确定
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 取消
+ 确定
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 取消
+ 确定
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 取消
+ 确定
+
+
+
+
+
+
+
+
+
+
+
+
{{ device.deviceName }}
+
+ {{ device.deviceCode }}
+ {{ device.deviceType }}
+
+
+ {{ [device.workshop, device.lineName].filter(Boolean).join(' / ') }}
+
+
+
+ handleDeviceToggle(device, val)" />
+
+
+
+ 暂无设备数据
+
+
+
+
+
+
+
+
+
diff --git a/klp-ui/src/views/micro/pages/acid/index.vue b/klp-ui/src/views/micro/pages/acid/index.vue
index e8e39034b..bb6e6b7ac 100644
--- a/klp-ui/src/views/micro/pages/acid/index.vue
+++ b/klp-ui/src/views/micro/pages/acid/index.vue
@@ -54,6 +54,10 @@
app
+
+
+ 模型
+
@@ -76,6 +80,7 @@ import Stoppage from '@/views/timing/stoppage/index.vue';
import AcidTiming from '@/views/lines/acid/index.vue';
import TrackingView from './components/TrackingView.vue';
import ProcessSpec from './components/ProcessSpec.vue';
+import Model from './components/Model.vue';
export default {
name: 'AcidSystem',
@@ -92,7 +97,8 @@ export default {
Stoppage,
AcidTiming,
TrackingView,
- ProcessSpec
+ ProcessSpec,
+ Model,
},
data() {
return {
@@ -115,6 +121,7 @@ export default {
acidTiming: 'AcidTiming',
tracking: 'TrackingView',
processSpec: 'ProcessSpec',
+ model: 'Model',
};
return componentMap[this.activeMenu];
},
diff --git a/klp-ui/src/views/wms/move/batch.vue b/klp-ui/src/views/wms/move/batch.vue
index 3d7034c3a..2f90f578b 100644
--- a/klp-ui/src/views/wms/move/batch.vue
+++ b/klp-ui/src/views/wms/move/batch.vue
@@ -2,11 +2,10 @@
-
+
-
+
删除
+ v-hasRole="['glc']" @click="handleDelete">删除
导出
@@ -80,8 +79,8 @@
查看
修改
- 删除
+ 删除
提交
-
+
-
+
{
- this.loading = true;
- return delTransferOrder(orderIds);
- }).then(() => {
- this.loading = false;
+ this.loading = true;
+ delTransferOrder(orderIds).then(() => {
this.getList();
this.$modal.msgSuccess("删除成功");
- }).catch(() => {
}).finally(() => {
this.loading = false;
});
diff --git a/klp-wms/src/main/java/com/klp/controller/WmsInspectionApplicationController.java b/klp-wms/src/main/java/com/klp/controller/WmsInspectionApplicationController.java
new file mode 100644
index 000000000..77a009a6f
--- /dev/null
+++ b/klp-wms/src/main/java/com/klp/controller/WmsInspectionApplicationController.java
@@ -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 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 list = iWmsInspectionApplicationService.queryList(bo);
+ ExcelUtil.exportExcel(list, "检化验申请单", WmsInspectionApplicationVo.class, response);
+ }
+
+ /**
+ * 获取检化验申请单详细信息
+ *
+ * @param applicationId 主键
+ */
+ @GetMapping("/{applicationId}")
+ public R getInfo(@NotNull(message = "主键不能为空")
+ @PathVariable Long applicationId) {
+ return R.ok(iWmsInspectionApplicationService.queryById(applicationId));
+ }
+
+ /**
+ * 新增检化验申请单
+ */
+ @Log(title = "检化验申请单", businessType = BusinessType.INSERT)
+ @RepeatSubmit()
+ @PostMapping()
+ public R add(@Validated(AddGroup.class) @RequestBody WmsInspectionApplicationBo bo) {
+ return toAjax(iWmsInspectionApplicationService.insertByBo(bo));
+ }
+
+ /**
+ * 修改检化验申请单
+ */
+ @Log(title = "检化验申请单", businessType = BusinessType.UPDATE)
+ @RepeatSubmit()
+ @PutMapping()
+ public R edit(@Validated(EditGroup.class) @RequestBody WmsInspectionApplicationBo bo) {
+ return toAjax(iWmsInspectionApplicationService.updateByBo(bo));
+ }
+
+ /**
+ * 删除检化验申请单
+ *
+ * @param applicationIds 主键串
+ */
+ @Log(title = "检化验申请单", businessType = BusinessType.DELETE)
+ @DeleteMapping("/{applicationIds}")
+ public R remove(@NotEmpty(message = "主键不能为空")
+ @PathVariable Long[] applicationIds) {
+ return toAjax(iWmsInspectionApplicationService.deleteWithValidByIds(Arrays.asList(applicationIds), true));
+ }
+}
diff --git a/klp-wms/src/main/java/com/klp/domain/WmsInspectionApplication.java b/klp-wms/src/main/java/com/klp/domain/WmsInspectionApplication.java
new file mode 100644
index 000000000..bb83b90e4
--- /dev/null
+++ b/klp-wms/src/main/java/com/klp/domain/WmsInspectionApplication.java
@@ -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_type:physical=物理检验 chemical=化学检验)
+ */
+ private String experimentType;
+ /**
+ * 样品名称
+ */
+ private String sampleName;
+ /**
+ * 样品批号
+ */
+ private String sampleBatchNo;
+ /**
+ * 样品来源(如:来料、过程样、成品样)
+ */
+ private String sampleSource;
+ /**
+ * 样品数量
+ */
+ private Long sampleQuantity;
+ /**
+ * 检验目的/用途说明
+ */
+ private String testPurpose;
+ /**
+ * 要求完成日期
+ */
+ private Date requiredDate;
+ /**
+ * 流程状态(字典:lab_application_status):1=草稿 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;
+
+}
diff --git a/klp-wms/src/main/java/com/klp/domain/bo/WmsInspectionApplicationBo.java b/klp-wms/src/main/java/com/klp/domain/bo/WmsInspectionApplicationBo.java
new file mode 100644
index 000000000..4c77b0734
--- /dev/null
+++ b/klp-wms/src/main/java/com/klp/domain/bo/WmsInspectionApplicationBo.java
@@ -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_type:physical=物理检验 chemical=化学检验)
+ */
+ private String experimentType;
+
+ /**
+ * 样品名称
+ */
+ private String sampleName;
+
+ /**
+ * 样品批号
+ */
+ private String sampleBatchNo;
+
+ /**
+ * 样品来源(如:来料、过程样、成品样)
+ */
+ private String sampleSource;
+
+ /**
+ * 样品数量
+ */
+ private Long sampleQuantity;
+
+ /**
+ * 检验目的/用途说明
+ */
+ private String testPurpose;
+
+ /**
+ * 要求完成日期
+ */
+ private Date requiredDate;
+
+ /**
+ * 流程状态(字典:lab_application_status):1=草稿 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;
+
+
+}
diff --git a/klp-wms/src/main/java/com/klp/domain/vo/WmsInspectionApplicationVo.java b/klp-wms/src/main/java/com/klp/domain/vo/WmsInspectionApplicationVo.java
new file mode 100644
index 000000000..1eeb59200
--- /dev/null
+++ b/klp-wms/src/main/java/com/klp/domain/vo/WmsInspectionApplicationVo.java
@@ -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_type:physical=物理检验 chemical=化学检验)
+ */
+ @ExcelProperty(value = "实验类型", converter = ExcelDictConvert.class)
+ @ExcelDictFormat(readConverterExp = "字=典:lab_experiment_type:physical=物理检验,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_status):1=草稿 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;
+
+
+}
diff --git a/klp-wms/src/main/java/com/klp/domain/vo/WmsInspectionMainVo.java b/klp-wms/src/main/java/com/klp/domain/vo/WmsInspectionMainVo.java
index aaa8d781c..bb030dc29 100644
--- a/klp-wms/src/main/java/com/klp/domain/vo/WmsInspectionMainVo.java
+++ b/klp-wms/src/main/java/com/klp/domain/vo/WmsInspectionMainVo.java
@@ -1,6 +1,7 @@
package com.klp.domain.vo;
import java.util.Date;
+import java.util.List;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
@@ -73,5 +74,9 @@ public class WmsInspectionMainVo {
@ExcelProperty(value = "备注")
private String remark;
+ /**
+ * 检验项目明细列表
+ */
+ private List detailList;
}
diff --git a/klp-wms/src/main/java/com/klp/mapper/WmsInspectionApplicationMapper.java b/klp-wms/src/main/java/com/klp/mapper/WmsInspectionApplicationMapper.java
new file mode 100644
index 000000000..110ddd1c9
--- /dev/null
+++ b/klp-wms/src/main/java/com/klp/mapper/WmsInspectionApplicationMapper.java
@@ -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 {
+
+}
diff --git a/klp-wms/src/main/java/com/klp/service/IWmsInspectionApplicationService.java b/klp-wms/src/main/java/com/klp/service/IWmsInspectionApplicationService.java
new file mode 100644
index 000000000..ae7593b79
--- /dev/null
+++ b/klp-wms/src/main/java/com/klp/service/IWmsInspectionApplicationService.java
@@ -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 queryPageList(WmsInspectionApplicationBo bo, PageQuery pageQuery);
+
+ /**
+ * 查询检化验申请单列表
+ */
+ List queryList(WmsInspectionApplicationBo bo);
+
+ /**
+ * 新增检化验申请单
+ */
+ Boolean insertByBo(WmsInspectionApplicationBo bo);
+
+ /**
+ * 修改检化验申请单
+ */
+ Boolean updateByBo(WmsInspectionApplicationBo bo);
+
+ /**
+ * 校验并批量删除检化验申请单信息
+ */
+ Boolean deleteWithValidByIds(Collection ids, Boolean isValid);
+}
diff --git a/klp-wms/src/main/java/com/klp/service/impl/WmsInspectionApplicationServiceImpl.java b/klp-wms/src/main/java/com/klp/service/impl/WmsInspectionApplicationServiceImpl.java
new file mode 100644
index 000000000..1969c89da
--- /dev/null
+++ b/klp-wms/src/main/java/com/klp/service/impl/WmsInspectionApplicationServiceImpl.java
@@ -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 queryPageList(WmsInspectionApplicationBo bo, PageQuery pageQuery) {
+ LambdaQueryWrapper lqw = buildQueryWrapper(bo);
+ Page result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+ return TableDataInfo.build(result);
+ }
+
+ /**
+ * 查询检化验申请单列表
+ */
+ @Override
+ public List queryList(WmsInspectionApplicationBo bo) {
+ LambdaQueryWrapper lqw = buildQueryWrapper(bo);
+ return baseMapper.selectVoList(lqw);
+ }
+
+ private LambdaQueryWrapper buildQueryWrapper(WmsInspectionApplicationBo bo) {
+ Map params = bo.getParams();
+ LambdaQueryWrapper 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 ids, Boolean isValid) {
+ if(isValid){
+ //TODO 做一些业务上的校验,判断是否需要校验
+ }
+ return baseMapper.deleteBatchIds(ids) > 0;
+ }
+}
diff --git a/klp-wms/src/main/java/com/klp/service/impl/WmsInspectionMainServiceImpl.java b/klp-wms/src/main/java/com/klp/service/impl/WmsInspectionMainServiceImpl.java
index a6b9c9850..9acf2a9cb 100644
--- a/klp-wms/src/main/java/com/klp/service/impl/WmsInspectionMainServiceImpl.java
+++ b/klp-wms/src/main/java/com/klp/service/impl/WmsInspectionMainServiceImpl.java
@@ -1,6 +1,7 @@
package com.klp.service.impl;
import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.collection.CollUtil;
import com.klp.common.core.page.TableDataInfo;
import com.klp.common.core.domain.PageQuery;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -11,13 +12,18 @@ import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import com.klp.domain.bo.WmsInspectionMainBo;
import com.klp.domain.vo.WmsInspectionMainVo;
+import com.klp.domain.vo.WmsInspectionDetailVo;
import com.klp.domain.WmsInspectionMain;
+import com.klp.domain.WmsInspectionDetail;
import com.klp.mapper.WmsInspectionMainMapper;
+import com.klp.mapper.WmsInspectionDetailMapper;
import com.klp.service.IWmsInspectionMainService;
+import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Collection;
+import java.util.stream.Collectors;
/**
* 检验主Service业务层处理
@@ -30,6 +36,7 @@ import java.util.Collection;
public class WmsInspectionMainServiceImpl implements IWmsInspectionMainService {
private final WmsInspectionMainMapper baseMapper;
+ private final WmsInspectionDetailMapper detailMapper;
/**
* 查询检验主
@@ -46,6 +53,7 @@ public class WmsInspectionMainServiceImpl implements IWmsInspectionMainService {
public TableDataInfo queryPageList(WmsInspectionMainBo bo, PageQuery pageQuery) {
LambdaQueryWrapper lqw = buildQueryWrapper(bo);
Page result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+ fillDetailList(result.getRecords());
return TableDataInfo.build(result);
}
@@ -55,7 +63,9 @@ public class WmsInspectionMainServiceImpl implements IWmsInspectionMainService {
@Override
public List queryList(WmsInspectionMainBo bo) {
LambdaQueryWrapper lqw = buildQueryWrapper(bo);
- return baseMapper.selectVoList(lqw);
+ List list = baseMapper.selectVoList(lqw);
+ fillDetailList(list);
+ return list;
}
private LambdaQueryWrapper buildQueryWrapper(WmsInspectionMainBo bo) {
@@ -72,6 +82,21 @@ public class WmsInspectionMainServiceImpl implements IWmsInspectionMainService {
return lqw;
}
+ private void fillDetailList(List voList) {
+ if (CollUtil.isEmpty(voList)) {
+ return;
+ }
+ List mainIds = voList.stream().map(WmsInspectionMainVo::getMainId).collect(Collectors.toList());
+ List allDetails = detailMapper.selectVoList(
+ new LambdaQueryWrapper().in(WmsInspectionDetail::getMainId, mainIds)
+ );
+ Map> detailMap = allDetails.stream()
+ .collect(Collectors.groupingBy(WmsInspectionDetailVo::getMainId));
+ for (WmsInspectionMainVo vo : voList) {
+ vo.setDetailList(detailMap.getOrDefault(vo.getMainId(), Collections.emptyList()));
+ }
+ }
+
/**
* 新增检验主
*/
diff --git a/klp-wms/src/main/resources/mapper/klp/WmsInspectionApplicationMapper.xml b/klp-wms/src/main/resources/mapper/klp/WmsInspectionApplicationMapper.xml
new file mode 100644
index 000000000..0a0bfade8
--- /dev/null
+++ b/klp-wms/src/main/resources/mapper/klp/WmsInspectionApplicationMapper.xml
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+