diff --git a/dist.7z b/dist.7z index 00dd57ac..39667915 100644 Binary files a/dist.7z and b/dist.7z differ diff --git a/dist.zip b/dist.zip index 8bf25961..370984ef 100644 Binary files a/dist.zip and b/dist.zip differ diff --git a/part-modification-plan.html b/part-modification-plan.html new file mode 100644 index 00000000..2c41aa91 --- /dev/null +++ b/part-modification-plan.html @@ -0,0 +1,477 @@ + + + + + 零件改制功能设计方案 + + + +

零件改制功能设计方案

+

0. 需求背景

+

0.1 需求提出

+

本需求由罗总牵头,组织技术中心、精工车间、仓储等相关部门讨论后提出。

+

0.2 提出原因

+

当前现场存在零件改制业务,但改制过程尚未完整纳入系统管理。由于现场计件、派工生产、完工入库和后续统计都需要明确的数据来源,原有线下记录或零散流转方式无法满足计件核算、过程追溯和部门协同要求。

+

因此,需要在系统内补充零件改制订单流程,将改制订单从技术中心发起、精工车间派工生产到完工入库的全过程纳入系统管理。

+

0.3 应用场景

+

本功能主要应用于以下场景:

+ +

1. 需求目标

+

基于项目现有精工车间生产流程,新增“零件改制”业务。

+

本次方案调整为:

+ +

核心原则:

+ +

2. 现有流程承接关系

+

根据项目现有页面,改制订单应承接以下流程:

+ + + + + + + + + + + + +
流程节点现有承接页面说明
技术发起技术中心新增页面发起改制订单,填写改制要求
生成任务精工车间生产任务查询改制订单进入生产任务列表
制定工艺精工车间制定工艺可复用或复制原工艺后调整
车间派工精工车间车间派工工艺完成后派工
领料判断领料/仓储出库流程根据物料类型决定是否生成领料单
加工执行精工车间现有加工流程扫码、报工、质检等复用现有逻辑
入库仓储入库流程改制完工后按现有流程办理入库
记录查询改制记录查询查看改制全流程
+
零件改制业务流程图
零件改制业务流程图
+

3. 页面设计

+

3.1 技术中心新增页面:改制订单发起

+

建议路径:

+
src/views/TechnologyCenter/PartModificationOrder/index.vue
+

页面名称:

+
改制订单发起
+

归属模块:

+
技术中心
+

主要功能:

+ +

3.2 精工车间修改页面:生产任务查询

+

现有路径:

+
src/views/SeikoWorkshop/ProductionTaskQuery/index.vue
+

需要支持:

+ +

3.3 精工车间修改页面:车间派工

+

现有路径:

+
src/views/SeikoWorkshop/WorkshopAssignment/index.vue
+

需要支持:

+ +

3.4 新增页面:改制记录查询

+

建议路径:

+
src/views/TechnologyCenter/PartModificationRecord/index.vue
+

也可以放在精工车间模块,建议最终按业务归属确认。

+

页面名称:

+
改制记录查询
+

主要功能:

+ +

4. 改制订单类型

+

改制订单需要明确物料来源,建议增加字段:

+
改制来源类型
+

建议枚举:

+ + + + + + + +
改制来源类型说明是否生成领料单
原现自制订单使用原现有自制订单零件进行改制
毛坯改制直接使用已有毛坯进行改制
非毛坯物料改制使用仓库其他物料、半成品或成品改制
+

说明:

+ +

5. 领料规则

+

5.1 领料判断条件

+

领料时增加判断:

+
如果是改制订单,并且使用的物料不是毛坯,则生成领料单,由仓库物料出库。
+如果是原现自制订单改制,或者直接使用毛坯改制,则不生成领料单。
+

规则可表达为:

+
是否生成领料单 =
+  是否改制订单 === 1
+  且 改制来源类型 === 非毛坯物料改制
+  且 是否毛坯 !== 1
+

5.2 生成领料单场景

+

以下场景需要生成领料单:

+ +

生成后流程:

+

1. 技术中心发起改制订单。 2. 系统判断需要领料。 3. 生成领料单。 4. 仓库根据领料单出库。 5. 出库完成后,精工车间继续生产、工艺、派工。

+

5.3 不生成领料单场景

+

以下场景不生成领料单:

+ +

不生成领料单时:

+ +

5.4 领料状态字段

+

建议改制订单增加以下字段:

+ + + + + + + + + + +
字段名说明
是否需要领料1 是,0 否
是否已生成领料单1 是,0 否
领料单号生成的领料单编号
领料状态未生成、待出库、已出库、已取消
出库日期仓库出库日期
出库人仓库操作人
+

6. 业务流程

+

6.1 技术中心发起改制订单

+

用户进入技术中心“改制订单发起”页面。

+

查询原始数据:

+ +

发起改制时填写:

+ +

提交时校验:

+ +

6.2 后端生成改制订单

+

提交后,后端需要同时处理:

+ +

6.3 进入精工车间生产任务查询

+

改制订单生成后,应能在现有接口中查到:

+
精工车间_生成任务_查询数据
+

建议返回字段增加:

+ +

生产任务查询页面显示:

+ +

是否允许工艺/派工,需要按业务决定:

+ +

建议采用更稳妥规则:

+
需要领料且未出库:允许制定工艺,不允许派工。
+不需要领料:正常工艺、派工。
+需要领料且已出库:正常工艺、派工。
+

6.4 制定工艺

+

改制订单在生产任务查询中点击 工艺,进入现有:

+
/SeikoWorkshop/DevelopProcess
+

工艺规则:

+ +

6.5 车间派工

+

工艺完成后进入现有车间派工页面:

+
src/views/SeikoWorkshop/WorkshopAssignment/index.vue
+

现有查询接口:

+
精工车间_车间派工_查询
+

改制订单派工前判断:

+ +

派工明细继续复用现有接口:

+
车间生产管理工艺_零件工序_已派工查询
+车间生产管理工艺_零件工序_派工_工序查询
+车间生产管理工艺_零件工序_派工
+车间生产管理工艺_零件工序_取消派工
+

6.6 仓库出库

+

当改制订单需要领料时,系统生成领料单。

+

仓库根据领料单完成出库后,需要回写:

+ +

出库完成后,精工车间派工限制解除。

+

6.7 加工和完工

+

改制订单派工后,继续走现有精工车间加工流程:

+ +

完工后改制记录状态同步为:

+
已完成
+

7. 数据字段设计

+

7.1 改制订单主记录字段

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
字段名说明
改制订单号改制业务编号
原订单编号原订单编号
原订单流水号原订单流水号
原组件流水号原组件流水号
原基本件流水号原零件流水号
原工艺计划流水号原工艺计划流水号
原零件名称改制前零件名称
原零件图号改制前零件图号
原数量原数量
改制零件名称改制后零件名称
改制零件图号改制后零件图号
改制数量改制数量
改制来源类型原现自制订单、毛坯改制、非毛坯物料改制
是否毛坯1 是,0 否
物料编号使用物料编号
物料名称使用物料名称
物料流水号使用物料流水号
是否需要领料1 是,0 否
是否已生成领料单1 是,0 否
领料单号领料单编号
领料状态未生成、待出库、已出库、已取消
改制原因改制原因
改制要求改制要求
技术备注技术备注
精工期限精工完工期限
新基本件流水号改制任务生成的新零件流水号
新工艺计划流水号改制任务生成的新工艺计划流水号
发起人当前用户 ID
发起日期发起时间
状态改制订单状态
是否启用逻辑删除标识
+

7.2 改制订单状态

+ + + + + + + + + + + +
状态说明
待领料需要领料,领料单未出库
待工艺不需要领料或已出库,等待制定工艺
工艺完成工艺已保存,等待派工
待派工工艺完成且满足派工条件
加工中已派工或已开始加工
已完成改制任务完工
已取消改制订单取消
+

说明:

+ +

8. API 设计

+

项目请求继续使用:

+
this.CreateData(type, name, param, pageSize, pageCurrent)
+this.ExecDatabase(Data)
+

8.1 技术中心查询可改制对象

+
var Data = this.CreateData('11', '技术中心_改制订单_可改制对象_查询', param, this.pageSize, this.pageCurrent)
+

8.2 技术中心发起改制订单

+
var Data = this.CreateData('12', '技术中心_改制订单_发起改制', param)
+

参数建议:

+ + + + + + + + + + + + + + + + + + + + + + + + +
参数名说明
原订单流水号原订单流水号
原组件流水号原组件流水号
原基本件流水号原基本件流水号
原工艺计划流水号原工艺计划流水号
原订单编号原订单编号
原零件名称原零件名称
原零件图号原零件图号
改制零件名称改制零件名称
改制零件图号改制零件图号
改制数量改制数量
改制来源类型原现自制订单、毛坯改制、非毛坯物料改制
是否毛坯是否毛坯
物料流水号使用物料流水号
物料编号物料编号
物料名称物料名称
改制原因改制原因
改制要求改制要求
技术备注技术备注
精工期限精工期限
发起人当前用户 ID
+

后端处理结果:

+ +

8.3 改制记录查询

+
var Data = this.CreateData('11', '技术中心_改制订单_记录_查询', param, this.pageSize, this.pageCurrent)
+

8.4 改制订单详情

+
var Data = this.CreateData('11', '技术中心_改制订单_详情_查询', param)
+

8.5 取消改制订单

+
var Data = this.CreateData('12', '技术中心_改制订单_取消', param)
+

取消前后端需要校验:

+ +

9. 现有接口扩展

+

9.1 生产任务查询接口

+

现有接口:

+
精工车间_生成任务_查询数据
+

新增查询参数:

+ + + + + + + + +
参数名说明
任务类型\_check是否按任务类型过滤
任务类型全部、正常、改制、报废补投
领料状态\_check是否按领料状态过滤
领料状态待出库、已出库、不需要领料
+

新增返回字段:

+ + + + + + + + + + + + + +
字段名说明
任务类型正常、改制、报废补投
是否改制1 是,0 否
改制订单号改制订单编号
改制来源类型原现自制订单、毛坯改制、非毛坯物料改制
是否需要领料1 是,0 否
领料状态未生成、待出库、已出库、已取消
领料单号领料单号
改制原因改制原因
改制要求改制要求
+

9.2 车间派工查询接口

+

现有接口:

+
精工车间_车间派工_查询
+

新增查询参数:

+ + + + + + +
参数名说明
任务类型\_check是否按任务类型过滤
任务类型全部、正常、改制、报废补投
+

新增返回字段:

+ + + + + + + + + + + +
字段名说明
任务类型正常、改制、报废补投
是否改制1 是,0 否
改制订单号改制订单编号
改制来源类型改制来源类型
是否需要领料1 是,0 否
领料状态领料状态
领料单号领料单号
+

派工前端限制:

+
如果 是否改制 = 1 且 是否需要领料 = 1 且 领料状态 != 已出库,则不允许派工。
+

10. 前端交互调整

+

10.1 技术中心改制订单发起页面

+

查询条件:

+ +

表格列:

+ +

操作:

+ +

发起改制弹窗:

+ +

10.2 生产任务查询页面

+

新增筛选:

+
任务类型:全部 / 正常 / 改制 / 报废补投
+领料状态:全部 / 不需要领料 / 待出库 / 已出库
+

新增列:

+ +

显示建议:

+
<el-tag type="warning" size="mini">改制</el-tag>
+<el-tag type="danger" size="mini">待出库</el-tag>
+<el-tag type="success" size="mini">已出库</el-tag>
+<el-tag type="info" size="mini">不需要领料</el-tag>
+

10.3 车间派工页面

+

新增筛选:

+
任务类型:全部 / 正常 / 改制 / 报废补投
+

新增列:

+ +

派工按钮或派工操作前增加判断:

+
if (Number(row.是否改制) === 1 && Number(row.是否需要领料) === 1 && row.领料状态 !== '已出库') {
+  this.$message.warning('改制订单物料未出库,不能派工')
+  return
+}
+

10.4 改制记录查询页面

+

查询条件:

+ +

表格列:

+ +

操作:

+ +

11. 菜单配置

+

建议后端菜单配置:

+
技术中心
+  改制订单发起
+  改制记录查询
+

组件路径:

+
TechnologyCenter/PartModificationOrder/index
+TechnologyCenter/PartModificationRecord/index
+

精工车间不新增发起入口,只扩展现有页面:

+
SeikoWorkshop/ProductionTaskQuery/index
+SeikoWorkshop/WorkshopAssignment/index
+

12. 实施顺序

+

建议按以下顺序实施:

+

1. 后端新增改制订单主记录表。 2. 后端新增技术中心发起改制订单接口。 3. 后端在发起接口中加入领料判断规则。 4. 后端按规则生成或不生成领料单。 5. 后端生成标准精工生产任务,并标记 任务类型 = 改制。 6. 扩展生产任务查询接口,返回改制和领料字段。 7. 扩展车间派工查询接口,返回改制和领料字段。 8. 前端新增技术中心改制订单发起页面。 9. 前端新增改制记录查询页面。 10. 前端修改生产任务查询页面,增加任务类型和领料状态显示。 11. 前端修改车间派工页面,增加改制任务显示和派工前领料状态校验。 12. 联调从技术中心发起、领料判断、仓库出库、精工工艺、车间派工、加工完工、记录查询的完整流程。

+

13. 风险点

+

13.1 领料判断风险

+

改制订单是否生成领料单,必须以后端判断为准。

+

前端可以显示和提示,但不能只依赖前端判断,避免绕过仓库出库流程。

+

13.2 派工前物料状态风险

+

如果改制订单需要仓库出库,但尚未出库,直接派工会导致车间无物料加工。

+

建议车间派工接口或派工保存接口再次校验:

+
需要领料且未出库,不允许派工。
+

13.3 原任务数据覆盖风险

+

改制订单必须生成新的生产任务和新的工艺计划流水号。

+

不能直接覆盖原自制订单或原零件工艺,否则会影响原订单追溯、工时和质量记录。

+

13.4 取消改制风险

+

已生成领料单、已出库、已派工或已加工的改制订单取消规则需要严格控制。

+

建议:

+ +

13.5 统计口径风险

+

改制订单进入精工生产任务后,会影响生产任务数量、工时统计、完工统计。

+

建议所有统计接口增加任务类型维度:

+
正常
+改制
+报废补投
+

14. 总结

+

本方案采用:

+
技术中心发起改制订单,精工车间承接生产,仓库按需出库,改制记录统一查询。
+

关键规则:

+ + + diff --git a/part-modification-plan.pdf b/part-modification-plan.pdf new file mode 100644 index 00000000..1ef16870 Binary files /dev/null and b/part-modification-plan.pdf differ diff --git a/src.zip b/src.zip new file mode 100644 index 00000000..583f1d76 Binary files /dev/null and b/src.zip differ diff --git a/src/views/SalesManagement/ContractSearch/index5.vue b/src/views/SalesManagement/ContractSearch/index5.vue new file mode 100644 index 00000000..ee9037e8 --- /dev/null +++ b/src/views/SalesManagement/ContractSearch/index5.vue @@ -0,0 +1,2971 @@ + + + + + + + + + + + + + + + + + + diff --git a/src/views/SalesManagement/DeliveryRecord/index3.vue b/src/views/SalesManagement/DeliveryRecord/index3.vue new file mode 100644 index 00000000..892d8c69 --- /dev/null +++ b/src/views/SalesManagement/DeliveryRecord/index3.vue @@ -0,0 +1,570 @@ + + + + diff --git a/src/views/SalesManagement/ProductDelivery/index4.vue b/src/views/SalesManagement/ProductDelivery/index4.vue new file mode 100644 index 00000000..8a003bfc --- /dev/null +++ b/src/views/SalesManagement/ProductDelivery/index4.vue @@ -0,0 +1,1371 @@ + + + + diff --git a/src/views/WarehouseManagement/InventoryCheck/index.vue b/src/views/WarehouseManagement/InventoryCheck/index.vue index e0dd1b7a..9caef566 100644 --- a/src/views/WarehouseManagement/InventoryCheck/index.vue +++ b/src/views/WarehouseManagement/InventoryCheck/index.vue @@ -7,6 +7,7 @@ 查询 + 导入查询 导出 增加物料存货 批量打印 @@ -162,6 +163,22 @@ 确定 + + +
+ + +
+ +
@@ -200,11 +217,14 @@ import { ExecDatabase } from '@/main' import { wsuri } from '@/utils/request' import { mapGetters } from 'vuex' +import UploadExcelComponent from '@/views/TechnologyCenter/ImportBOM/UploadExcel/index.vue' export default { + components: { UploadExcelComponent }, data() { return { dialogFormVisible: false, dialogFormVisible1: false, + dialogFormVisibleExcel: false, title: '', materialName: '', materialSpec: '', @@ -223,6 +243,8 @@ export default { productName: [], editorialStaff: [], multipleSelection: [], + itemFile: [], + worksheet: [], rules: { 入库数: [{ required: true, message: '请输入入库数' }], 产品名称: [{ required: true, message: '请选择产品名称' }] @@ -362,6 +384,157 @@ export default { } }) }, + handleExcel() { + this.dialogFormVisibleExcel = true + }, + selected(data) { + this.worksheet = data.worksheet + this.itemFile = data.itemFile + }, + handleRemove(file) { + for (let i = 0; i < this.itemFile.length; i++) { + if (this.itemFile[i].name === file.name) { + this.worksheet.splice(i, 1) + this.itemFile.splice(i, 1) + } + } + }, + removeAll() { + this.worksheet = [] + this.itemFile = [] + }, + getExcelCellValue(sheet, col, row) { + var cell = sheet[col + row] + if (!cell || cell.v === undefined || cell.v === null) { + return '' + } + return String(cell.v).trim() + }, + getImportColumns(sheet) { + var cols = [ + 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', + 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z' + ] + var result = { + headerRow: 1, + nameCol: 'B', + drawingCol: 'A' + } + for (let row = 1; row <= 10; row++) { + let nameCol = '' + let drawingCol = '' + for (let i = 0; i < cols.length; i++) { + var title = this.getExcelCellValue(sheet, cols[i], row).replace(/\s/g, '') + if (title === '物料名称' || title === '名称' || title === '零件名称') { + nameCol = cols[i] + } + if (title === '图号' || title === '图号型号' || title === '图号或型号' || title === '图号/型号' || title === '规格型号') { + drawingCol = cols[i] + } + } + if (nameCol || drawingCol) { + result.headerRow = row + result.nameCol = nameCol || result.nameCol + result.drawingCol = drawingCol || result.drawingCol + return result + } + } + return result + }, + getImportDetail() { + var detail = [] + for (let j = 0; j < this.worksheet.length; j++) { + var sheet = this.worksheet[j] + var columns = this.getImportColumns(sheet) + var emptyCount = 0 + for (let row = columns.headerRow + 1; row <= 2000; row++) { + var materialName = this.getExcelCellValue(sheet, columns.nameCol, row) + var specificationsModel = this.getExcelCellValue(sheet, columns.drawingCol, row) + if (!materialName && !specificationsModel) { + emptyCount++ + if (emptyCount >= 20) { + break + } + continue + } + emptyCount = 0 + detail.push({ + 物料名称: materialName, + 图号或型号: specificationsModel + }) + } + } + return detail + }, + getImportConditionList(detail) { + var conditionMap = {} + var conditionList = [] + for (let i = 0; i < detail.length; i++) { + var materialName = String(detail[i].物料名称 || '').trim() + var drawing = String(detail[i].图号或型号 || '').trim() + var condition = materialName + '^' + drawing + if ((materialName || drawing) && !conditionMap[condition]) { + conditionMap[condition] = true + conditionList.push(condition) + } + } + return conditionList.join(',') + }, + setTableData(rows) { + this.tableData = [] + for (let i = 0; i < rows.length; i++) { + this.tableData.push({ + 物料编码: rows[i].物料编码, + 物料名称: rows[i].物料名称, + 图号或型号: rows[i].图号或型号, + 物料与货位流水号: rows[i].物料与货位流水号, + 类型: rows[i].类型, + 单位: rows[i].单位, + 库存: rows[i].库存, + 货位流水号: rows[i].货位流水号, + 货位名称: rows[i].货位名称, + 批次编号: rows[i].批次编号, + 编辑人: rows[i].编辑人, + 编辑时间: rows[i].编辑时间, + 库存_before: rows[i].库存, + 货位流水号_before: rows[i].货位流水号, + 货位名称_before: rows[i].货位名称, + 打印条码数: 1, + edit: false + }) + } + }, + importExcelSearch() { + var detail = this.getImportDetail() + if (detail.length === 0) { + this.$message.warning('请导入包含物料名称或图号的表格') + return + } + let LocationName_check + this.LocationName ? LocationName_check = 1 : LocationName_check = 0 + var param = [] + param[0] = ['物料名称_check', 0] + param[1] = ['物料名称', ''] + param[2] = ['图号或型号_check', 1] + param[3] = ['图号或型号', this.getImportConditionList(detail)] + param[4] = ['库位_check', LocationName_check] + param[5] = ['库位', this.LocationName] + param[6] = ['排序名称', this.orderName] + param[7] = ['排序方式', this.order] + this.pageCurrent = 1 + var Data = this.CreateData('11', '仓储管理_库存盘点_查询', param, this.pageSize, this.pageCurrent) + this.loading = true + this.ExecDatabase(Data).then(response => { + var rows = response.data.rows || response.data || [] + this.setTableData(rows) + this.total = response.data.total || rows.length + this.dialogFormVisibleExcel = false + this.loading = false + this.$message.success('导入查询完成') + }).catch(() => { + this.loading = false + }) + }, exportExcel() { if (this.tableData.length === 0) { this.$message.warning('暂无数据') @@ -403,28 +576,7 @@ export default { ExecDatabase(Data).then(response => { // console.log(response.data) if (response.data.rows.length !== 0) { - for (let i = 0; i < response.data.rows.length; i++) { - this.tableData.push({ - // 表示将从数据库中查询到的数据,分别对应填充到表格中 - 物料编码: response.data.rows[i].物料编码, - 物料名称: response.data.rows[i].物料名称, - 图号或型号: response.data.rows[i].图号或型号, - 物料与货位流水号: response.data.rows[i].物料与货位流水号, - 类型: response.data.rows[i].类型, - 单位: response.data.rows[i].单位, - 库存: response.data.rows[i].库存, - 货位流水号: response.data.rows[i].货位流水号, - 货位名称: response.data.rows[i].货位名称, - 批次编号: response.data.rows[i].批次编号, - 编辑人: response.data.rows[i].编辑人, - 编辑时间: response.data.rows[i].编辑时间, - 库存_before: response.data.rows[i].库存, - 货位流水号_before: response.data.rows[i].货位流水号, - 货位名称_before: response.data.rows[i].货位名称, - 打印条码数: 1, - edit: false - }) - } + this.setTableData(response.data.rows) } this.total = response.data.total this.loading = false diff --git a/库存调拨功能设计方案.md b/库存调拨功能设计方案.md new file mode 100644 index 00000000..8b6c329b --- /dev/null +++ b/库存调拨功能设计方案.md @@ -0,0 +1,541 @@ +# 库存盘点组件库存调拨功能设计方案 + +## 0. 需求背景 + +当前库存盘点页面 `src/views/WarehouseManagement/InventoryCheck/index.vue` 已支持查询物料库存、编辑库存数、选择库位,并已存在新增物料货位数量的相关接口。现场盘点时,经常会发现同一物料的实际库存需要从原库位拆分到另一个库位,例如: + +- 盘点发现物料实际摆放到了新库位。 +- 原库位库存数量过多,需要拆一部分到新库位。 +- 系统中还没有目标库位,需要现场一键新建库位后立即调拨。 +- 需要保留原库位库存,只把输入的调拨数量从原库位扣掉,并增加到目标库位。 + +因此本次功能不设计完整调拨单流程,而是在“库存盘点”组件内增加轻量级库存调拨能力:选择一行库存,输入调拨数量,选择或新建目标库位,提交后直接完成原库位库存扣减和目标库位库存增加。 + +## 1. 设计目标 + +本功能面向库存盘点页面,核心目标如下: + +- 在库存盘点表格行上增加“调拨”操作。 +- 调拨弹窗中自动带出当前物料、原库位、原库存数。 +- 支持选择已有目标库位。 +- 支持一键新建目标库位,并自动回填为调入库位。 +- 输入调拨数量后,提交时从原库位库存数中减掉该调拨数量。 +- 如果目标库位已有同物料库存,则目标库位库存数增加调拨数量。 +- 如果目标库位没有同物料库存,则新增一条物料与货位数量记录。 +- 调拨后刷新库存盘点列表,保持页面显示与数据库一致。 + +## 2. 功能范围 + +本次只处理库存盘点组件内的库位库存调整,不新增独立“库存调拨单”页面。 + +包含: + +- 盘点列表行内调拨。 +- 一键新增库位。 +- 原库位扣减库存。 +- 目标库位增加库存。 +- 调拨操作记录。 + +不包含: + +- 调拨单主表和明细表。 +- 调出确认、调入确认两段式流程。 +- 审批流程。 +- 跨仓库复杂调拨。 +- 打印调拨单。 +- 外协调拨。 + +## 3. 页面改造位置 + +现有页面: + +```text +src/views/WarehouseManagement/InventoryCheck/index.vue +``` + +当前页面已有相关字段和接口: + +- 表格字段:`库存`、`货位流水号`、`货位名称`、`物料与货位流水号` +- 库位下拉查询:`仓储管理_库位_查询` +- 盘点查询:`仓储管理_库存盘点_查询` +- 库存编辑:`仓储管理_库存盘点_货位数量_编辑数据` +- 新增物料货位数量验证:`仓储管理_库存盘点_物料货位数量_增加数据_验证是否存在` +- 新增物料货位数量:`仓储管理_库存盘点_物料货位数量_增加数据` + +## 4. 前端交互设计 + +### 4.1 表格增加操作按钮 + +在库存盘点表格操作列增加: + +```text +调拨 +``` + +按钮显示规则: + +- 当前行 `物料与货位流水号` 存在时显示。 +- 当前行 `库存 > 0` 时允许点击。 +- 如果库存为 0,按钮禁用或点击提示“当前库位库存为0,不能调拨”。 + +建议按钮: + +```html +调拨 +``` + +### 4.2 调拨弹窗 + +新增 `el-dialog`: + +```text +库存调拨 +``` + +弹窗字段: + +| 字段 | 控件 | 说明 | +| --- | --- | --- | +| 物料名称 | 文本 | 当前行带出,只读 | +| 图号或型号 | 文本 | 当前行带出,只读 | +| 原库位 | 文本 | 当前行 `货位名称`,只读 | +| 原库存数 | 文本 | 当前行 `库存`,只读 | +| 目标库位 | el-select | 选择已有库位 | +| 新库位名称 | el-input | 一键新建库位时填写 | +| 调拨数量 | el-input-number | 需要从原库位调出的数量 | +| 调拨备注 | el-input | 可选 | + +弹窗按钮: + +- 新建库位 +- 确定调拨 +- 取消 + +### 4.3 一键新建库位 + +在调拨弹窗中增加“新建库位”小区域: + +```text +新库位名称 + 新建按钮 +``` + +用户输入新库位名称后点击“新建库位”: + +1. 校验库位名称不能为空。 +2. 调用后端新增库位接口。 +3. 新增成功后重新查询库位下拉。 +4. 将新库位流水号自动赋值给 `transferForm.目标货位流水号`。 +5. 提示“库位新增成功”。 + +接口建议: + +```js +var Data = this.CreateData('12', '仓储管理_库位_增加', param) +``` + +参数建议: + +| 参数名 | 说明 | +| --- | --- | +| 货位名称 | 新库位名称 | +| UserID | 当前用户 | +| ModularID | 当前路由 | + +如果后端已有通用库位新增接口,应优先复用现有接口,不重复新增存储过程。 + +## 5. 调拨业务规则 + +### 5.1 数量规则 + +调拨数量必须满足: + +```text +0 < 调拨数量 <= 原库存数 +``` + +前端校验: + +```js +if (Number(this.transferForm.调拨数量) <= 0) { + this.$message.warning('调拨数量必须大于0') + return +} +if (Number(this.transferForm.调拨数量) > Number(this.transferForm.原库存数)) { + this.$message.warning('调拨数量不能大于原库存数') + return +} +``` + +后端也必须重复校验,避免多人同时操作导致库存被扣成负数。 + +### 5.2 库位规则 + +目标库位必须满足: + +- 目标库位不能为空。 +- 目标库位不能等于原库位。 +- 新建库位名称不能与已有库位重复。 + +### 5.3 库存更新规则 + +提交调拨后,后端一次性完成两个动作: + +```text +原库位库存 = 原库位库存 - 调拨数量 +目标库位库存 = 目标库位库存 + 调拨数量 +``` + +如果目标库位不存在该物料库存记录: + +```text +新增 物料 + 目标库位 的库存记录,库存数 = 调拨数量 +``` + +如果目标库位已存在该物料库存记录: + +```text +更新目标库位库存数,库存数 = 原目标库位库存数 + 调拨数量 +``` + +### 5.4 原库位库存为 0 的处理 + +调拨后如果原库位库存变为 0,建议保留该物料货位记录,并显示库存为 0。 + +原因: + +- 便于追溯原库位曾经存在该物料。 +- 避免删除记录影响历史盘点记录。 +- 与当前盘点页面“库存数可为 0”的逻辑一致。 + +如果现场明确要求隐藏 0 库存,可以在查询接口中过滤,不建议物理删除。 + +## 6. 数据字段设计 + +### 6.1 前端弹窗对象 + +建议新增: + +```js +transferForm: { + 物料与货位流水号: '', + 物料流水号: '', + 物料名称: '', + 图号或型号: '', + 原货位流水号: '', + 原货位名称: '', + 原库存数: 0, + 目标货位流水号: '', + 目标货位名称: '', + 新货位名称: '', + 调拨数量: 1, + 调拨备注: '' +} +``` + +### 6.2 后端调拨接口参数 + +建议新增一个原子接口,避免前端连续调用两个编辑接口导致只扣不加或只加不扣。 + +接口: + +```js +var Data = this.CreateData('12', '仓储管理_库存盘点_库存调拨', param) +``` + +参数: + +| 参数名 | 说明 | +| --- | --- | +| 物料与货位流水号 | 原库存记录流水号 | +| 物料流水号 | 当前物料流水号 | +| 原货位流水号 | 原库位流水号 | +| 目标货位流水号 | 目标库位流水号 | +| 调拨数量 | 本次调拨数量 | +| 原库存数 | 页面带出的原库存数,仅用于校验参考 | +| 调拨备注 | 调拨备注 | +| 操作人 | UserID | + +后端处理必须放在同一个事务中: + +1. 查询原库存记录,并锁定或重新校验当前库存。 +2. 校验当前库存是否大于等于调拨数量。 +3. 扣减原库位库存。 +4. 查询目标库位是否已有同物料记录。 +5. 有则累加目标库位库存。 +6. 无则新增目标库位库存记录。 +7. 写入库存调拨记录。 +8. 返回成功。 + +## 7. 调拨记录设计 + +建议新增轻量级调拨记录表,便于盘点后追溯谁把多少库存从哪个库位调到哪个库位。 + +字段建议: + +| 字段名 | 说明 | +| --- | --- | +| 库存调拨流水号 | 主键 | +| 物料流水号 | 物料流水号 | +| 物料名称 | 冗余名称,便于查询 | +| 图号或型号 | 冗余图号 | +| 原物料与货位流水号 | 原库存记录 | +| 原货位流水号 | 原库位 | +| 原货位名称 | 原库位名称 | +| 目标物料与货位流水号 | 目标库存记录 | +| 目标货位流水号 | 目标库位 | +| 目标货位名称 | 目标库位名称 | +| 调拨数量 | 调拨数量 | +| 调拨前原库存 | 扣减前原库位库存 | +| 调拨后原库存 | 扣减后原库位库存 | +| 调拨前目标库存 | 增加前目标库位库存 | +| 调拨后目标库存 | 增加后目标库位库存 | +| 调拨备注 | 备注 | +| 操作人 | UserID | +| 操作时间 | 调拨时间 | + +查询接口建议: + +```js +var Data = this.CreateData('11', '仓储管理_库存盘点_库存调拨记录_查询', param, this.pageSize, this.pageCurrent) +``` + +第一版可以不新增独立页面,只在库存盘点页面增加“调拨记录”按钮或弹窗。 + +## 8. API 设计 + +### 8.1 查询库位 + +沿用现有: + +```js +var Data = this.CreateData('11', '仓储管理_库位_查询', param) +``` + +### 8.2 新增库位 + +建议新增或复用: + +```js +var Data = this.CreateData('12', '仓储管理_库位_增加', param) +``` + +参数: + +| 参数名 | 说明 | +| --- | --- | +| 货位名称 | 新库位名称 | +| 备注 | 可选 | +| UserID | 当前用户 | + +返回: + +| 字段 | 说明 | +| --- | --- | +| result | 是否成功 | +| 货位流水号 | 新增库位流水号 | +| 货位名称 | 新增库位名称 | + +### 8.3 库存调拨 + +建议新增: + +```js +var Data = this.CreateData('12', '仓储管理_库存盘点_库存调拨', param) +``` + +这是本功能最核心接口,必须由后端事务保证扣减和增加同时成功或同时失败。 + +### 8.4 调拨记录查询 + +建议新增: + +```js +var Data = this.CreateData('11', '仓储管理_库存盘点_库存调拨记录_查询', param, this.pageSize, this.pageCurrent) +``` + +查询参数: + +| 参数名 | 说明 | +| --- | --- | +| 物料名称_check | 是否按物料名称查询 | +| 物料名称 | 物料名称 | +| 图号或型号_check | 是否按图号查询 | +| 图号或型号 | 图号或型号 | +| 原货位流水号_check | 是否按原库位查询 | +| 原货位流水号 | 原库位 | +| 目标货位流水号_check | 是否按目标库位查询 | +| 目标货位流水号 | 目标库位 | +| 操作时间_check | 是否按时间查询 | +| 开始时间 | 开始时间 | +| 结束时间 | 结束时间 | + +## 9. 前端方法设计 + +### 9.1 打开调拨弹窗 + +```js +openTransfer(row) { + if (Number(row.库存) <= 0) { + this.$message.warning('当前库位库存为0,不能调拨') + return + } + this.transferForm.物料与货位流水号 = row.物料与货位流水号 + this.transferForm.物料流水号 = row.物料流水号 + this.transferForm.物料名称 = row.物料名称 + this.transferForm.图号或型号 = row.图号或型号 + this.transferForm.原货位流水号 = row.货位流水号 + this.transferForm.原货位名称 = row.货位名称 + this.transferForm.原库存数 = Number(row.库存) + this.transferForm.目标货位流水号 = '' + this.transferForm.目标货位名称 = '' + this.transferForm.新货位名称 = '' + this.transferForm.调拨数量 = 1 + this.transferForm.调拨备注 = '' + this.transferDialogVisible = true +} +``` + +### 9.2 新建库位 + +```js +addTransferLocation() { + if (!this.transferForm.新货位名称) { + this.$message.warning('请输入新库位名称') + return + } + var param = [] + param[0] = ['货位名称', this.transferForm.新货位名称] + var Data = this.CreateData('12', '仓储管理_库位_增加', param) + this.ExecDatabase(Data).then(response => { + if (response.data && response.data.length > 0) { + this.getStorageLocation() + this.transferForm.目标货位流水号 = response.data[0].货位流水号 + this.$message.success('库位新增成功') + } + }) +} +``` + +说明:具体返回结构以现有后端为准,若只返回成功标识,则新增后通过库位名称重新查询并回填。 + +### 9.3 提交调拨 + +```js +submitTransfer() { + if (!this.transferForm.目标货位流水号) { + this.$message.warning('请选择目标库位') + return + } + if (this.transferForm.目标货位流水号 === this.transferForm.原货位流水号) { + this.$message.warning('目标库位不能与原库位相同') + return + } + if (Number(this.transferForm.调拨数量) <= 0) { + this.$message.warning('调拨数量必须大于0') + return + } + if (Number(this.transferForm.调拨数量) > Number(this.transferForm.原库存数)) { + this.$message.warning('调拨数量不能大于原库存数') + return + } + + var param = [] + param[0] = ['物料与货位流水号', this.transferForm.物料与货位流水号] + param[1] = ['物料流水号', this.transferForm.物料流水号] + param[2] = ['原货位流水号', this.transferForm.原货位流水号] + param[3] = ['目标货位流水号', this.transferForm.目标货位流水号] + param[4] = ['调拨数量', this.transferForm.调拨数量] + param[5] = ['原库存数', this.transferForm.原库存数] + param[6] = ['调拨备注', this.transferForm.调拨备注] + var Data = this.CreateData('12', '仓储管理_库存盘点_库存调拨', param) + this.ExecDatabase(Data).then(response => { + this.$message.success('调拨成功') + this.transferDialogVisible = false + this.searchTable() + }) +} +``` + +## 10. 后端事务逻辑 + +后端存储过程建议逻辑: + +```text +开始事务 + 查询原物料货位库存记录 + 如果不存在,返回“原库存记录不存在” + 如果当前库存 < 调拨数量,返回“库存不足” + 如果原货位流水号 = 目标货位流水号,返回“目标库位不能与原库位相同” + + 更新原库位库存 = 当前库存 - 调拨数量 + + 查询目标货位是否存在同物料库存记录 + 如果存在: + 更新目标库位库存 = 当前目标库存 + 调拨数量 + 如果不存在: + 新增目标货位库存记录,库存 = 调拨数量 + + 写入库存调拨记录 +提交事务 +``` + +任何一步失败必须回滚,避免库存只扣不加。 + +## 11. 与现有编辑库存功能的关系 + +当前库存盘点页面已有“编辑库存数”和“编辑库位”的能力: + +```js +var Data = this.CreateData('12', '仓储管理_库存盘点_货位数量_编辑数据', param) +``` + +新调拨功能不建议复用前端两次调用该接口来完成扣减和增加,因为: + +- 两次请求中间失败会造成库存不一致。 +- 多人并发时容易出现负库存。 +- 目标库位不存在同物料记录时还需要新增记录。 + +因此建议新增一个后端原子接口: + +```text +仓储管理_库存盘点_库存调拨 +``` + +该接口内部统一完成扣减、增加、新增目标记录、写调拨记录。 + +## 12. 实施步骤 + +1. 后端新增或确认库位新增接口:`仓储管理_库位_增加`。 +2. 后端新增库存调拨接口:`仓储管理_库存盘点_库存调拨`。 +3. 后端新增库存调拨记录表。 +4. 后端新增库存调拨记录查询接口。 +5. 前端 `InventoryCheck/index.vue` 增加“调拨”按钮。 +6. 前端增加调拨弹窗和 `transferForm`。 +7. 前端增加“一键新建库位”方法。 +8. 前端增加“确定调拨”方法。 +9. 调拨成功后调用 `searchTable()` 刷新盘点列表。 +10. 联调库存扣减、目标库位增加、目标库位不存在时新增记录。 + +## 13. 风险点 + +### 13.1 并发扣减风险 + +盘点期间多人可能同时调拨同一库位库存。后端必须以数据库当前库存为准,不能只相信前端传入的 `原库存数`。 + +### 13.2 目标库位重复风险 + +一键新建库位时需要校验 `货位名称` 是否已存在。若已存在,应直接提示或返回已有库位,不应重复新增同名库位。 + +### 13.3 只扣不加风险 + +调拨不能由前端拆成“编辑原库存”和“新增目标库存”两个独立请求。必须由一个后端事务接口完成。 + +### 13.4 数据追溯风险 + +虽然不做完整调拨单,也必须保留调拨记录,记录调拨前后库存、原库位、目标库位、操作人和时间。 + +## 14. 总结 + +本方案将库存调拨限定在库存盘点组件内,采用“行内调拨弹窗 + 一键新建库位 + 后端事务扣减/增加库存”的轻量设计。用户在盘点时选择一行库存,输入调拨数量和目标库位,系统直接将调拨数量从原库位库存中减掉,并增加到目标库位库存中。 + +关键点是新增一个原子后端接口 `仓储管理_库存盘点_库存调拨`,避免前端多次请求造成库存不一致。同时保留调拨记录,满足后续盘点追溯。 diff --git a/景耀项目工作日志.xlsx b/景耀项目工作日志.xlsx new file mode 100644 index 00000000..73bf2847 Binary files /dev/null and b/景耀项目工作日志.xlsx differ diff --git a/车间派工移动端自适应设计方案.md b/车间派工移动端自适应设计方案.md new file mode 100644 index 00000000..144ea182 --- /dev/null +++ b/车间派工移动端自适应设计方案.md @@ -0,0 +1,521 @@ +# 车间派工移动端自适应设计方案 + +## 1. 需求目标 + +需求:车间需求一个车间派工组件的移动端功能,车间内及时操作 + +本次方案包含两部分: + +1. 将现有车间派工组件复制并改造为移动端自适应页面。 +2. 移动端用户登录系统后,首页只显示该自适应派工页面,不显示桌面端首页、侧边栏、顶部导航和标签栏。 + +总体原则: + +- 不影响现有 PC 端车间派工页面。 +- 不修改后端接口和参数格式。 +- 移动端只改交互和布局,业务逻辑尽量复用现有页面。 +- 保持 Vue 2 + Element UI + Options API 写法。 + +## 2. 当前代码基础 + +现有车间派工页面: + +```text +src/views/SeikoWorkshop/WorkshopAssignment/index.vue +``` + +现有登录后首页: + +```text +src/views/dashboard/index.vue +``` + +现有主布局: + +```text +src/views/layout/Layout.vue +src/views/layout/components/AppMain.vue +``` + +现有动态路由生成: + +```text +src/router/getRouter.js +src/permission.js +``` + +现有设备判断逻辑: + +```text +src/views/layout/mixin/ResizeHandler.js +src/store/modules/app.js +``` + +项目中已有类似移动端/滑动版页面命名示例: + +```text +src/views/AssemblyManagement/AssemblyExecutionSliding/index.vue +src/views/AssemblyManagement/ReceiveAssemblyTaskSliding/index.vue +src/views/AssemblyManagement/ReplenishmentOrdersSliding/index.vue +``` + +因此本次建议采用“新增独立移动端页面”的方式,而不是直接改造现有 PC 页面。 + +## 3. 总体设计 + +新增移动端页面: + +```text +src/views/SeikoWorkshop/WorkshopAssignmentMobile/index.vue +``` + +新增移动端空布局: + +```text +src/views/layout/MobileLayout.vue +``` + +新增设备判断工具: + +```text +src/utils/device.js +``` + +修改路由配置: + +```text +src/router/index.js +``` + +修改登录后跳转逻辑: + +```text +src/permission.js +``` + +移动端访问路径建议为: + +```text +/mobile/workshop-assignment +``` + +PC 端继续使用现有动态菜单路径: + +```text +/SeikoWorkshop/WorkshopAssignment +``` + +## 4. 移动端页面结构设计 + +现有 PC 页面是左右两栏布局: + +- 左侧:订单/零件待派工列表。 +- 右侧:选中零件后的工序派工列表。 + +移动端不适合继续使用左右两栏和大表格,建议改为纵向流程。 + +### 4.1 顶部筛选区 + +移动端顶部展示查询条件: + +- 订单号 +- 产品/零件名称 +- 名称或图号 +- 查询按钮 +- 查看图纸按钮 +- 加急/取消加急按钮 +- 手动报废结单按钮,按原权限控制 + +布局方式: + +- 筛选项纵向排列。 +- 输入框、下拉框宽度 `100%`。 +- 操作按钮使用两列或满宽布局。 +- 顶部筛选区可固定,也可随页面滚动。第一版建议随页面滚动,避免遮挡内容。 + +### 4.2 待派工零件列表 + +将 PC 端左侧 `el-table` 改为卡片列表。 + +每张卡片展示核心字段: + +- 订单号 +- 产品名称 +- 零件图号 +- 零件名称 +- 数量 +- 毛坯库存 +- 下达日期 +- 完工期限 +- 订单备注 +- 技术备注 + +交互: + +- 点击卡片后调用现有行点击逻辑,加载该零件的工序列表。 +- 当前选中卡片需要有明显选中态。 +- 列表底部保留分页,移动端分页建议简化为“上一页 / 下一页 / 当前页”。 + +### 4.3 工序派工列表 + +将 PC 端右侧工序表格改为工序卡片列表。 + +每张工序卡片展示: + +- 工序顺序 +- 工序名称 +- 投产数 +- 完成数 +- 操作者 +- 报废数量 +- 加工设备 +- 派工状态 + +卡片操作按钮: + +- 编辑 +- 派工 +- 取消派工 + +按钮禁用条件沿用现有 PC 页面判断逻辑。 + +### 4.4 派工编辑区 + +移动端保留人员和设备选择: + +- 操作者 +- 设备 +- 派工数量 +- 计划完成日期 + +建议使用 `el-dialog` 或底部弹层形式。 + +Element UI 项目中现有弹窗较多,第一版建议继续使用 `el-dialog`,移动端适配如下: + +```vue + +``` + +表单布局: + +- `el-form-item` 纵向排列。 +- `el-select`、`el-input`、`el-date-picker`、`el-input-number` 宽度统一 `100%`。 +- 底部按钮固定为“取消 / 确定”。 + +### 4.5 文件和图纸查看 + +现有页面中图纸、文件查看逻辑继续保留。 + +移动端展示方式: + +- 文件使用纵向列表。 +- 每个文件展示图标、文件名。 +- 点击后沿用现有下载/预览地址。 +- 弹窗宽度 `94%`。 + +## 5. 业务接口复用 + +移动端页面不新增后端接口,复用现有车间派工页面中的请求。 + +主要请求包括: + +```text +精工车间_车间派工_查询 +车间生产管理工艺_零件工序_已派工查询 +车间生产管理工艺_零件工序_派工_工序查询 +车间生产管理工艺_零件工序_派工 +车间生产管理工艺_零件工序_取消派工 +车间生产管理工艺_零件工序_派工_修改数量 +车间生产管理工艺_零件工序_派工_设置计划完成日期 +人事档案管理_人员_部门与人员_派工_查询数据_根据部门编号 +车间派工_手动报废结单_查询信息 +车间派工_手动报废结单 +``` + +请求规范继续遵守项目约定: + +- 统一 POST 到 `MESCommonBase.ashx`。 +- `url` 字段留空。 +- 使用 `CreateData` 构建请求。 +- 使用 `ExecDatabase` 或现有全局工具方法发送请求。 +- 参数继续使用 `key=value&key2=value2` 字符串。 +- 字段名继续使用后端返回的中文字段。 + +## 6. 路由设计 + +### 6.1 新增移动端空布局 + +新增文件: + +```text +src/views/layout/MobileLayout.vue +``` + +职责: + +- 不显示侧边栏。 +- 不显示顶部导航。 +- 不显示标签栏。 +- 只渲染当前移动端页面。 + +结构示例: + +```vue + + + + + +``` + +### 6.2 新增静态隐藏路由 + +修改: + +```text +src/router/index.js +``` + +新增: + +```js +import MobileLayout from '../views/layout/MobileLayout' +``` + +在 `constantRouterMap` 中增加: + +```js +{ + path: '/mobile', + component: MobileLayout, + hidden: true, + children: [{ + path: 'workshop-assignment', + component: () => import('@/views/SeikoWorkshop/WorkshopAssignmentMobile/index'), + meta: { title: '车间派工' } + }] +} +``` + +最终移动端首页路径: + +```text +/mobile/workshop-assignment +``` + +## 7. 移动端登录后首页跳转设计 + +新增工具: + +```text +src/utils/device.js +``` + +内容: + +```js +export function isMobileDevice() { + if (!document || !document.body) { + return false + } + return document.body.getBoundingClientRect().width < 1024 +} +``` + +修改: + +```text +src/permission.js +``` + +在已登录逻辑中增加判断: + +- 用户已登录。 +- 当前目标路径是 `/` 或 `/dashboard`。 +- 当前设备为移动端。 +- 自动跳转 `/mobile/workshop-assignment`。 + +设计示例: + +```js +import { isMobileDevice } from '@/utils/device' + +// beforeEach 内部,已登录分支中 +if ((to.path === '/' || to.path === '/dashboard') && isMobileDevice()) { + next({ path: '/mobile/workshop-assignment', replace: true }) + NProgress.done() + return +} +``` + +这样移动端登录后不会进入桌面首页,而是直接进入移动端派工页。 + +## 8. 样式设计 + +移动端页面样式建议: + +- 根节点使用 `.mobile-assignment-page`。 +- 页面最小高度 `100vh`。 +- 主背景使用浅灰色。 +- 卡片使用白底、细边框、轻阴影。 +- 卡片圆角控制在 `6px` 或 `8px`。 +- 字号保持可读,不使用随视口缩放的字体。 +- 所有按钮、输入框高度适合触摸操作。 +- 避免横向滚动。 + +建议结构: + +```scss +.mobile-assignment-page { + min-height: 100vh; + padding: 10px; + background: #f5f7fa; +} + +.mobile-filter { + background: #fff; + border-radius: 6px; + padding: 10px; + margin-bottom: 10px; +} + +.assignment-card { + background: #fff; + border: 1px solid #ebeef5; + border-radius: 6px; + padding: 10px; + margin-bottom: 10px; +} + +.assignment-card.is-active { + border-color: #409EFF; +} + +.card-title { + font-size: 15px; + font-weight: bold; + color: #303133; +} + +.card-row { + display: flex; + justify-content: space-between; + line-height: 24px; + font-size: 13px; +} + +.card-label { + color: #909399; +} + +.card-value { + color: #303133; + text-align: right; +} +``` + +## 9. 实施步骤 + +1. 新建 `src/views/SeikoWorkshop/WorkshopAssignmentMobile/index.vue`。 +2. 从 `WorkshopAssignment/index.vue` 复制业务数据、方法和接口调用。 +3. 将模板改为移动端筛选区、零件卡片列表、工序卡片列表。 +4. 将弹窗宽度、表单布局和按钮布局改为移动端适配。 +5. 新建 `src/views/layout/MobileLayout.vue`。 +6. 新建 `src/utils/device.js`。 +7. 修改 `src/router/index.js`,增加 `/mobile/workshop-assignment` 静态隐藏路由。 +8. 修改 `src/permission.js`,移动端登录后访问 `/` 或 `/dashboard` 时跳转移动端派工页。 +9. 本地运行项目,分别验证 PC 和移动端宽度。 + +## 10. 验收标准 + +PC 端: + +- 原车间派工页面正常访问。 +- 原首页正常显示。 +- 原动态菜单不受影响。 + +移动端: + +- 登录后自动进入 `/mobile/workshop-assignment`。 +- 页面不显示侧边栏、顶部导航、标签栏。 +- 页面只显示移动端车间派工自适应页面。 +- 查询条件可正常使用。 +- 零件列表可正常加载和分页。 +- 点击零件后可加载工序列表。 +- 派工、取消派工、编辑数量、设置计划完成日期功能正常。 +- 查看图纸和文件功能正常。 +- 权限按钮显示逻辑与 PC 端一致。 +- 页面无明显横向滚动、文字重叠、按钮遮挡。 + +## 11. 风险与控制 + +### 11.1 现有页面体量较大 + +风险: + +- 直接抽公共逻辑可能引入 PC 页面回归问题。 + +控制: + +- 第一版复制现有页面业务逻辑,只重写移动端模板。 +- 待移动端稳定后,再考虑抽公共 mixin。 + +### 11.2 移动端首页跳转时机 + +风险: + +- `Layout` 中的设备判断发生较晚,登录跳转时可能还未写入 Vuex。 + +控制: + +- 在 `permission.js` 中直接使用 DOM 宽度判断,不依赖 Vuex 中的 `device`。 + +### 11.3 动态菜单权限 + +风险: + +- 移动端隐藏路由如果依赖后端菜单,可能因为菜单未配置导致无法访问。 + +控制: + +- 将移动端派工路由注册为静态隐藏路由。 +- 登录后仍经过 token 校验,但不依赖菜单显示。 + +### 11.4 手机端表格不可用 + +风险: + +- 继续使用大表格会产生横向滚动,操作困难。 + +控制: + +- 移动端核心列表统一改为卡片式展示。 +- 表格只在确实需要多列批量选择时使用,并控制宽度。 + +## 12. 推荐结论 + +建议第一版采用“独立移动端页面 + 移动端空布局 + 登录后设备重定向”的实现方式。 + +该方案改动边界清晰: + +- PC 端页面不动。 +- 后端接口不动。 +- 权限体系基本不动。 +- 移动端首页可直接进入派工工作流。 + +后续如果移动端使用稳定,再将 PC 和移动端共用的派工请求、字段处理、校验逻辑抽成公共 mixin,减少长期维护成本。 diff --git a/零件改制功能设计方案.html b/零件改制功能设计方案.html new file mode 100644 index 00000000..2c41aa91 --- /dev/null +++ b/零件改制功能设计方案.html @@ -0,0 +1,477 @@ + + + + + 零件改制功能设计方案 + + + +

零件改制功能设计方案

+

0. 需求背景

+

0.1 需求提出

+

本需求由罗总牵头,组织技术中心、精工车间、仓储等相关部门讨论后提出。

+

0.2 提出原因

+

当前现场存在零件改制业务,但改制过程尚未完整纳入系统管理。由于现场计件、派工生产、完工入库和后续统计都需要明确的数据来源,原有线下记录或零散流转方式无法满足计件核算、过程追溯和部门协同要求。

+

因此,需要在系统内补充零件改制订单流程,将改制订单从技术中心发起、精工车间派工生产到完工入库的全过程纳入系统管理。

+

0.3 应用场景

+

本功能主要应用于以下场景:

+
  • 技术中心根据现场或订单需求发起零件改制订单。
  • 精工车间根据改制订单制定工艺、派工生产。
  • 改制订单涉及非毛坯物料时,由系统生成领料单并交由仓库出库。
  • 改制加工完成后,按现有流程办理入库。
  • 现场计件、生产统计、入库记录和后续追溯均以系统内改制订单数据为依据。
+

1. 需求目标

+

基于项目现有精工车间生产流程,新增“零件改制”业务。

+

本次方案调整为:

+
  • 在技术中心新增组件发起改制订单。
  • 改制订单生成后进入现有精工车间生产任务流程。
  • 精工车间生产任务查询组件可以查看改制订单。
  • 车间派工组件可以查看改制订单并继续派工。
  • 新增改制记录查询,用于查看改制订单的发起、生产、派工、领料和完工状态。
  • 领料时根据改制订单和物料来源判断是否生成领料单。
+

核心原则:

+
  • 技术中心负责发起改制订单。
  • 精工车间复用现有生产任务、工艺、派工、加工流程。
  • 仓储只在需要额外领用非毛坯物料时介入。
  • 改制记录独立查询,但状态关联现有生产任务状态。
+

2. 现有流程承接关系

+

根据项目现有页面,改制订单应承接以下流程:

+ + + + + + + + + + + + +
流程节点现有承接页面说明
技术发起技术中心新增页面发起改制订单,填写改制要求
生成任务精工车间生产任务查询改制订单进入生产任务列表
制定工艺精工车间制定工艺可复用或复制原工艺后调整
车间派工精工车间车间派工工艺完成后派工
领料判断领料/仓储出库流程根据物料类型决定是否生成领料单
加工执行精工车间现有加工流程扫码、报工、质检等复用现有逻辑
入库仓储入库流程改制完工后按现有流程办理入库
记录查询改制记录查询查看改制全流程
+
零件改制业务流程图
零件改制业务流程图
+

3. 页面设计

+

3.1 技术中心新增页面:改制订单发起

+

建议路径:

+
src/views/TechnologyCenter/PartModificationOrder/index.vue
+

页面名称:

+
改制订单发起
+

归属模块:

+
技术中心
+

主要功能:

+
  • 查询需要改制的原订单、原零件或原自制件。
  • 发起改制订单。
  • 填写改制后零件信息、改制数量、改制原因、技术要求。
  • 指定是否使用原件改制、毛坯改制或其他物料改制。
  • 提交后生成改制订单,并进入精工车间生产任务查询。
+

3.2 精工车间修改页面:生产任务查询

+

现有路径:

+
src/views/SeikoWorkshop/ProductionTaskQuery/index.vue
+

需要支持:

+
  • 查询改制订单生成的生产任务。
  • 增加任务类型筛选。
  • 增加任务类型列。
  • 改制任务显示 改制 标识。
  • 改制任务继续使用现有 工艺派工 按钮。
+

3.3 精工车间修改页面:车间派工

+

现有路径:

+
src/views/SeikoWorkshop/WorkshopAssignment/index.vue
+

需要支持:

+
  • 查询改制订单对应的待派工任务。
  • 增加任务类型筛选。
  • 增加任务类型列。
  • 复用现有已派工查询、待派工工序查询、派工、取消派工逻辑。
+

3.4 新增页面:改制记录查询

+

建议路径:

+
src/views/TechnologyCenter/PartModificationRecord/index.vue
+

也可以放在精工车间模块,建议最终按业务归属确认。

+

页面名称:

+
改制记录查询
+

主要功能:

+
  • 查询改制订单记录。
  • 查看改制订单状态。
  • 查看是否生成领料单。
  • 查看仓库是否已出库。
  • 查看精工生产任务、工艺、派工、完工状态。
  • 支持跳转生产任务查询、车间派工、零件追溯。
+

4. 改制订单类型

+

改制订单需要明确物料来源,建议增加字段:

+
改制来源类型
+

建议枚举:

+ + + + + + + +
改制来源类型说明是否生成领料单
原现自制订单使用原现有自制订单零件进行改制
毛坯改制直接使用已有毛坯进行改制
非毛坯物料改制使用仓库其他物料、半成品或成品改制
+

说明:

+
  • “原现自制订单”指当前已经存在的自制订单或自制零件,改制时不需要额外从仓库领料。
  • “毛坯改制”指直接使用毛坯进行改制,不额外生成领料单。
  • “非毛坯物料改制”指改制需要领用库存中的非毛坯物料,需要生成领料单并由仓库出库。
+

5. 领料规则

+

5.1 领料判断条件

+

领料时增加判断:

+
如果是改制订单,并且使用的物料不是毛坯,则生成领料单,由仓库物料出库。
+如果是原现自制订单改制,或者直接使用毛坯改制,则不生成领料单。
+

规则可表达为:

+
是否生成领料单 =
+  是否改制订单 === 1
+  且 改制来源类型 === 非毛坯物料改制
+  且 是否毛坯 !== 1
+

5.2 生成领料单场景

+

以下场景需要生成领料单:

+
  • 改制订单使用库存半成品。
  • 改制订单使用库存成品。
  • 改制订单使用其他非毛坯物料。
  • 改制订单指定的物料需要仓库出库。
+

生成后流程:

+

1. 技术中心发起改制订单。 2. 系统判断需要领料。 3. 生成领料单。 4. 仓库根据领料单出库。 5. 出库完成后,精工车间继续生产、工艺、派工。

+

5.3 不生成领料单场景

+

以下场景不生成领料单:

+
  • 原现自制订单改制。
  • 直接使用毛坯改制。
  • 改制对象已经在精工车间现场,不需要仓库出库。
+

不生成领料单时:

+
  • 改制订单直接进入精工生产任务。
  • 生产任务查询可查看。
  • 车间派工可查看并派工。
+

5.4 领料状态字段

+

建议改制订单增加以下字段:

+ + + + + + + + + + +
字段名说明
是否需要领料1 是,0 否
是否已生成领料单1 是,0 否
领料单号生成的领料单编号
领料状态未生成、待出库、已出库、已取消
出库日期仓库出库日期
出库人仓库操作人
+

6. 业务流程

+

6.1 技术中心发起改制订单

+

用户进入技术中心“改制订单发起”页面。

+

查询原始数据:

+
  • 订单编号
  • 产品/部件名称
  • 零件名称
  • 图号
  • 原自制订单
  • 库存物料
  • 毛坯物料
+

发起改制时填写:

+
  • 改制订单号
  • 原订单编号
  • 原零件名称
  • 原零件图号
  • 改制零件名称
  • 改制零件图号
  • 改制数量
  • 改制来源类型
  • 是否毛坯
  • 物料编号
  • 物料名称
  • 改制原因
  • 改制要求
  • 技术备注
  • 精工期限
+

提交时校验:

+
  • 改制数量必须大于 0。
  • 改制来源类型不能为空。
  • 改制原因不能为空。
  • 改制要求不能为空。
  • 精工期限不能为空。
  • 如果来源类型为非毛坯物料改制,必须选择物料编号。
+

6.2 后端生成改制订单

+

提交后,后端需要同时处理:

+
  • 写入改制订单主记录。
  • 根据改制来源类型判断是否生成领料单。
  • 生成精工车间生产任务。
  • 写入任务类型为 改制
  • 关联改制订单号和新工艺计划流水号。
+

6.3 进入精工车间生产任务查询

+

改制订单生成后,应能在现有接口中查到:

+
精工车间_生成任务_查询数据
+

建议返回字段增加:

+
  • 任务类型
  • 是否改制
  • 改制订单号
  • 改制来源类型
  • 是否需要领料
  • 领料状态
  • 改制原因
  • 改制要求
+

生产任务查询页面显示:

+
  • 任务类型 = 改制
  • 是否需要领料 = 1领料状态 !== 已出库,可显示领料状态提示。
+

是否允许工艺/派工,需要按业务决定:

+
  • 如果非毛坯物料改制必须先出库,建议未出库前允许制定工艺,但不允许派工。
  • 如果现场允许先派工后补出库,则只做提示,不阻断派工。
+

建议采用更稳妥规则:

+
需要领料且未出库:允许制定工艺,不允许派工。
+不需要领料:正常工艺、派工。
+需要领料且已出库:正常工艺、派工。
+

6.4 制定工艺

+

改制订单在生产任务查询中点击 工艺,进入现有:

+
/SeikoWorkshop/DevelopProcess
+

工艺规则:

+
  • 改制订单必须生成新的工艺计划流水号。
  • 不覆盖原自制订单或原零件工艺。
  • 可支持从原工艺复制后调整。
  • 工艺保存后,任务状态进入 工艺完成
+

6.5 车间派工

+

工艺完成后进入现有车间派工页面:

+
src/views/SeikoWorkshop/WorkshopAssignment/index.vue
+

现有查询接口:

+
精工车间_车间派工_查询
+

改制订单派工前判断:

+
  • 不需要领料:允许派工。
  • 需要领料且已出库:允许派工。
  • 需要领料但未出库:禁止派工,并提示“改制订单物料未出库,不能派工”。
+

派工明细继续复用现有接口:

+
车间生产管理工艺_零件工序_已派工查询
+车间生产管理工艺_零件工序_派工_工序查询
+车间生产管理工艺_零件工序_派工
+车间生产管理工艺_零件工序_取消派工
+

6.6 仓库出库

+

当改制订单需要领料时,系统生成领料单。

+

仓库根据领料单完成出库后,需要回写:

+
  • 领料状态 = 已出库
  • 出库日期
  • 出库人
  • 出库数量
+

出库完成后,精工车间派工限制解除。

+

6.7 加工和完工

+

改制订单派工后,继续走现有精工车间加工流程:

+
  • 工序派工
  • 扫码加工
  • 完工报工
  • 质检
  • 零件追溯
  • 工时统计
+

完工后改制记录状态同步为:

+
已完成
+

7. 数据字段设计

+

7.1 改制订单主记录字段

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
字段名说明
改制订单号改制业务编号
原订单编号原订单编号
原订单流水号原订单流水号
原组件流水号原组件流水号
原基本件流水号原零件流水号
原工艺计划流水号原工艺计划流水号
原零件名称改制前零件名称
原零件图号改制前零件图号
原数量原数量
改制零件名称改制后零件名称
改制零件图号改制后零件图号
改制数量改制数量
改制来源类型原现自制订单、毛坯改制、非毛坯物料改制
是否毛坯1 是,0 否
物料编号使用物料编号
物料名称使用物料名称
物料流水号使用物料流水号
是否需要领料1 是,0 否
是否已生成领料单1 是,0 否
领料单号领料单编号
领料状态未生成、待出库、已出库、已取消
改制原因改制原因
改制要求改制要求
技术备注技术备注
精工期限精工完工期限
新基本件流水号改制任务生成的新零件流水号
新工艺计划流水号改制任务生成的新工艺计划流水号
发起人当前用户 ID
发起日期发起时间
状态改制订单状态
是否启用逻辑删除标识
+

7.2 改制订单状态

+ + + + + + + + + + + +
状态说明
待领料需要领料,领料单未出库
待工艺不需要领料或已出库,等待制定工艺
工艺完成工艺已保存,等待派工
待派工工艺完成且满足派工条件
加工中已派工或已开始加工
已完成改制任务完工
已取消改制订单取消
+

说明:

+
  • 如果不需要领料,提交后可直接进入 待工艺
  • 如果需要领料,提交后进入 待领料
  • 仓库出库后从 待领料 转为 待工艺 或保持生产任务状态,由查询时关联显示。
+

8. API 设计

+

项目请求继续使用:

+
this.CreateData(type, name, param, pageSize, pageCurrent)
+this.ExecDatabase(Data)
+

8.1 技术中心查询可改制对象

+
var Data = this.CreateData('11', '技术中心_改制订单_可改制对象_查询', param, this.pageSize, this.pageCurrent)
+

8.2 技术中心发起改制订单

+
var Data = this.CreateData('12', '技术中心_改制订单_发起改制', param)
+

参数建议:

+ + + + + + + + + + + + + + + + + + + + + + + + +
参数名说明
原订单流水号原订单流水号
原组件流水号原组件流水号
原基本件流水号原基本件流水号
原工艺计划流水号原工艺计划流水号
原订单编号原订单编号
原零件名称原零件名称
原零件图号原零件图号
改制零件名称改制零件名称
改制零件图号改制零件图号
改制数量改制数量
改制来源类型原现自制订单、毛坯改制、非毛坯物料改制
是否毛坯是否毛坯
物料流水号使用物料流水号
物料编号物料编号
物料名称物料名称
改制原因改制原因
改制要求改制要求
技术备注技术备注
精工期限精工期限
发起人当前用户 ID
+

后端处理结果:

+
  • 生成改制订单。
  • 判断是否生成领料单。
  • 生成精工生产任务。
  • 返回 result改制订单号领料单号是否需要领料
+

8.3 改制记录查询

+
var Data = this.CreateData('11', '技术中心_改制订单_记录_查询', param, this.pageSize, this.pageCurrent)
+

8.4 改制订单详情

+
var Data = this.CreateData('11', '技术中心_改制订单_详情_查询', param)
+

8.5 取消改制订单

+
var Data = this.CreateData('12', '技术中心_改制订单_取消', param)
+

取消前后端需要校验:

+
  • 未派工可以取消。
  • 已派工未加工,需要先取消派工。
  • 已加工、已有质检记录或已完成,不允许取消。
  • 已生成领料单且已出库,不允许直接取消,需要走退料或异常处理。
+

9. 现有接口扩展

+

9.1 生产任务查询接口

+

现有接口:

+
精工车间_生成任务_查询数据
+

新增查询参数:

+ + + + + + + + +
参数名说明
任务类型\_check是否按任务类型过滤
任务类型全部、正常、改制、报废补投
领料状态\_check是否按领料状态过滤
领料状态待出库、已出库、不需要领料
+

新增返回字段:

+ + + + + + + + + + + + + +
字段名说明
任务类型正常、改制、报废补投
是否改制1 是,0 否
改制订单号改制订单编号
改制来源类型原现自制订单、毛坯改制、非毛坯物料改制
是否需要领料1 是,0 否
领料状态未生成、待出库、已出库、已取消
领料单号领料单号
改制原因改制原因
改制要求改制要求
+

9.2 车间派工查询接口

+

现有接口:

+
精工车间_车间派工_查询
+

新增查询参数:

+ + + + + + +
参数名说明
任务类型\_check是否按任务类型过滤
任务类型全部、正常、改制、报废补投
+

新增返回字段:

+ + + + + + + + + + + +
字段名说明
任务类型正常、改制、报废补投
是否改制1 是,0 否
改制订单号改制订单编号
改制来源类型改制来源类型
是否需要领料1 是,0 否
领料状态领料状态
领料单号领料单号
+

派工前端限制:

+
如果 是否改制 = 1 且 是否需要领料 = 1 且 领料状态 != 已出库,则不允许派工。
+

10. 前端交互调整

+

10.1 技术中心改制订单发起页面

+

查询条件:

+
  • 订单编号
  • 零件名称
  • 图号
  • 物料编号
  • 物料名称
  • 改制来源类型
+

表格列:

+
  • 订单编号
  • 产品/部件名称
  • 零件名称
  • 零件图号
  • 数量
  • 当前状态
  • 来源类型
  • 物料编号
  • 物料名称
  • 操作
+

操作:

+
  • 发起改制
  • 图纸
  • PLM传入工艺
  • 追溯
+

发起改制弹窗:

+
  • 原订单编号
  • 原零件名称
  • 原零件图号
  • 改制零件名称
  • 改制零件图号
  • 改制数量
  • 改制来源类型
  • 是否毛坯
  • 物料编号
  • 物料名称
  • 改制原因
  • 改制要求
  • 技术备注
  • 精工期限
+

10.2 生产任务查询页面

+

新增筛选:

+
任务类型:全部 / 正常 / 改制 / 报废补投
+领料状态:全部 / 不需要领料 / 待出库 / 已出库
+

新增列:

+
  • 任务类型
  • 改制订单号
  • 改制来源类型
  • 领料状态
+

显示建议:

+
<el-tag type="warning" size="mini">改制</el-tag>
+<el-tag type="danger" size="mini">待出库</el-tag>
+<el-tag type="success" size="mini">已出库</el-tag>
+<el-tag type="info" size="mini">不需要领料</el-tag>
+

10.3 车间派工页面

+

新增筛选:

+
任务类型:全部 / 正常 / 改制 / 报废补投
+

新增列:

+
  • 任务类型
  • 改制订单号
  • 领料状态
+

派工按钮或派工操作前增加判断:

+
if (Number(row.是否改制) === 1 && Number(row.是否需要领料) === 1 && row.领料状态 !== '已出库') {
+  this.$message.warning('改制订单物料未出库,不能派工')
+  return
+}
+

10.4 改制记录查询页面

+

查询条件:

+
  • 改制订单号
  • 原订单编号
  • 零件名称或图号
  • 改制来源类型
  • 领料状态
  • 改制状态
  • 发起日期
  • 发起人
+

表格列:

+
  • 改制订单号
  • 状态
  • 原订单编号
  • 原零件名称
  • 原零件图号
  • 改制零件名称
  • 改制零件图号
  • 改制数量
  • 改制来源类型
  • 是否需要领料
  • 领料单号
  • 领料状态
  • 改制原因
  • 发起人
  • 发起日期
  • 精工期限
  • 完成日期
  • 操作
+

操作:

+
  • 详情
  • 生产任务
  • 派工
  • 追溯
  • 取消
+

11. 菜单配置

+

建议后端菜单配置:

+
技术中心
+  改制订单发起
+  改制记录查询
+

组件路径:

+
TechnologyCenter/PartModificationOrder/index
+TechnologyCenter/PartModificationRecord/index
+

精工车间不新增发起入口,只扩展现有页面:

+
SeikoWorkshop/ProductionTaskQuery/index
+SeikoWorkshop/WorkshopAssignment/index
+

12. 实施顺序

+

建议按以下顺序实施:

+

1. 后端新增改制订单主记录表。 2. 后端新增技术中心发起改制订单接口。 3. 后端在发起接口中加入领料判断规则。 4. 后端按规则生成或不生成领料单。 5. 后端生成标准精工生产任务,并标记 任务类型 = 改制。 6. 扩展生产任务查询接口,返回改制和领料字段。 7. 扩展车间派工查询接口,返回改制和领料字段。 8. 前端新增技术中心改制订单发起页面。 9. 前端新增改制记录查询页面。 10. 前端修改生产任务查询页面,增加任务类型和领料状态显示。 11. 前端修改车间派工页面,增加改制任务显示和派工前领料状态校验。 12. 联调从技术中心发起、领料判断、仓库出库、精工工艺、车间派工、加工完工、记录查询的完整流程。

+

13. 风险点

+

13.1 领料判断风险

+

改制订单是否生成领料单,必须以后端判断为准。

+

前端可以显示和提示,但不能只依赖前端判断,避免绕过仓库出库流程。

+

13.2 派工前物料状态风险

+

如果改制订单需要仓库出库,但尚未出库,直接派工会导致车间无物料加工。

+

建议车间派工接口或派工保存接口再次校验:

+
需要领料且未出库,不允许派工。
+

13.3 原任务数据覆盖风险

+

改制订单必须生成新的生产任务和新的工艺计划流水号。

+

不能直接覆盖原自制订单或原零件工艺,否则会影响原订单追溯、工时和质量记录。

+

13.4 取消改制风险

+

已生成领料单、已出库、已派工或已加工的改制订单取消规则需要严格控制。

+

建议:

+
  • 未出库、未派工:允许取消。
  • 已出库:需要退料后取消。
  • 已派工未加工:先取消派工再取消。
  • 已加工:不允许取消,只能走异常处理。
+

13.5 统计口径风险

+

改制订单进入精工生产任务后,会影响生产任务数量、工时统计、完工统计。

+

建议所有统计接口增加任务类型维度:

+
正常
+改制
+报废补投
+

14. 总结

+

本方案采用:

+
技术中心发起改制订单,精工车间承接生产,仓库按需出库,改制记录统一查询。
+

关键规则:

+
  • 技术中心新增组件发起改制订单。
  • 改制订单生成后进入精工车间生产任务查询。
  • 改制订单工艺和派工复用现有精工流程。
  • 领料时如果是改制订单,并且使用物料不是毛坯,则生成领料单,由仓库物料出库。
  • 如果是原现自制订单改制,或者直接使用毛坯改制,则不生成领料单。
  • 改制记录查询独立展示全流程状态。
+ + diff --git a/零件改制功能设计方案.md b/零件改制功能设计方案.md new file mode 100644 index 00000000..8a53ba38 --- /dev/null +++ b/零件改制功能设计方案.md @@ -0,0 +1,841 @@ +# 零件改制功能设计方案 + +## 0. 需求背景 + +### 0.1 需求提出 + +本需求由罗总牵头,组织技术中心、精工车间、仓储等相关部门讨论后提出。 + +### 0.2 提出原因 + +当前现场存在零件改制业务,但改制过程尚未完整纳入系统管理。由于现场计件、派工生产、完工入库和后续统计都需要明确的数据来源,原有线下记录或零散流转方式无法满足计件核算、过程追溯和部门协同要求。 + +因此,需要在系统内补充零件改制订单流程,将改制订单从技术中心发起、精工车间派工生产到完工入库的全过程纳入系统管理。 + +### 0.3 应用场景 + +本功能主要应用于以下场景: + +- 技术中心根据现场或订单需求发起零件改制订单。 +- 精工车间根据改制订单制定工艺、派工生产。 +- 改制订单涉及非毛坯物料时,由系统生成领料单并交由仓库出库。 +- 改制加工完成后,按现有流程办理入库。 +- 现场计件、生产统计、入库记录和后续追溯均以系统内改制订单数据为依据。 + +## 1. 需求目标 + +基于项目现有精工车间生产流程,新增“零件改制”业务。 + +本次方案调整为: + +- 在技术中心新增组件发起改制订单。 +- 改制订单生成后进入现有精工车间生产任务流程。 +- 精工车间生产任务查询组件可以查看改制订单。 +- 车间派工组件可以查看改制订单并继续派工。 +- 新增改制记录查询,用于查看改制订单的发起、生产、派工、领料和完工状态。 +- 领料时根据改制订单和物料来源判断是否生成领料单。 + +核心原则: + +- 技术中心负责发起改制订单。 +- 精工车间复用现有生产任务、工艺、派工、加工流程。 +- 仓储只在需要额外领用非毛坯物料时介入。 +- 改制记录独立查询,但状态关联现有生产任务状态。 + +## 2. 现有流程承接关系 + +根据项目现有页面,改制订单应承接以下流程: + +| 流程节点 | 现有承接页面 | 说明 | +| ---- | ---------- | --------------- | +| 技术发起 | 技术中心新增页面 | 发起改制订单,填写改制要求 | +| 生成任务 | 精工车间生产任务查询 | 改制订单进入生产任务列表 | +| 制定工艺 | 精工车间制定工艺 | 可复用或复制原工艺后调整 | +| 车间派工 | 精工车间车间派工 | 工艺完成后派工 | +| 领料判断 | 领料/仓储出库流程 | 根据物料类型决定是否生成领料单 | +| 加工执行 | 精工车间现有加工流程 | 扫码、报工、质检等复用现有逻辑 | +| 入库 | 仓储入库流程 | 改制完工后按现有流程办理入库 | +| 记录查询 | 改制记录查询 | 查看改制全流程 | + +![零件改制业务流程图](零件改制流程图.svg) + +## 3. 页面设计 + +### 3.1 技术中心新增页面:改制订单发起 + +建议路径: + +```text +src/views/TechnologyCenter/PartModificationOrder/index.vue +``` + +页面名称: + +```text +改制订单发起 +``` + +归属模块: + +```text +技术中心 +``` + +主要功能: + +- 查询需要改制的原订单、原零件或原自制件。 +- 发起改制订单。 +- 填写改制后零件信息、改制数量、改制原因、技术要求。 +- 指定是否使用原件改制、毛坯改制或其他物料改制。 +- 提交后生成改制订单,并进入精工车间生产任务查询。 + +### 3.2 精工车间修改页面:生产任务查询 + +现有路径: + +```text +src/views/SeikoWorkshop/ProductionTaskQuery/index.vue +``` + +需要支持: + +- 查询改制订单生成的生产任务。 +- 增加任务类型筛选。 +- 增加任务类型列。 +- 改制任务显示 `改制` 标识。 +- 改制任务继续使用现有 `工艺`、`派工` 按钮。 + +### 3.3 精工车间修改页面:车间派工 + +现有路径: + +```text +src/views/SeikoWorkshop/WorkshopAssignment/index.vue +``` + +需要支持: + +- 查询改制订单对应的待派工任务。 +- 增加任务类型筛选。 +- 增加任务类型列。 +- 复用现有已派工查询、待派工工序查询、派工、取消派工逻辑。 + +### 3.4 新增页面:改制记录查询 + +建议路径: + +```text +src/views/TechnologyCenter/PartModificationRecord/index.vue +``` + +也可以放在精工车间模块,建议最终按业务归属确认。 + +页面名称: + +```text +改制记录查询 +``` + +主要功能: + +- 查询改制订单记录。 +- 查看改制订单状态。 +- 查看是否生成领料单。 +- 查看仓库是否已出库。 +- 查看精工生产任务、工艺、派工、完工状态。 +- 支持跳转生产任务查询、车间派工、零件追溯。 + +## 4. 改制订单类型 + +改制订单需要明确物料来源,建议增加字段: + +```text +改制来源类型 +``` + +建议枚举: + +| 改制来源类型 | 说明 | 是否生成领料单 | +| ------- | ----------------- | ------- | +| 原现自制订单 | 使用原现有自制订单零件进行改制 | 否 | +| 毛坯改制 | 直接使用已有毛坯进行改制 | 否 | +| 非毛坯物料改制 | 使用仓库其他物料、半成品或成品改制 | 是 | + +说明: + +- “原现自制订单”指当前已经存在的自制订单或自制零件,改制时不需要额外从仓库领料。 +- “毛坯改制”指直接使用毛坯进行改制,不额外生成领料单。 +- “非毛坯物料改制”指改制需要领用库存中的非毛坯物料,需要生成领料单并由仓库出库。 + +## 5. 领料规则 + +### 5.1 领料判断条件 + +领料时增加判断: + +```text +如果是改制订单,并且使用的物料不是毛坯,则生成领料单,由仓库物料出库。 +如果是原现自制订单改制,或者直接使用毛坯改制,则不生成领料单。 +``` + +规则可表达为: + +```text +是否生成领料单 = + 是否改制订单 === 1 + 且 改制来源类型 === 非毛坯物料改制 + 且 是否毛坯 !== 1 +``` + +### 5.2 生成领料单场景 + +以下场景需要生成领料单: + +- 改制订单使用库存半成品。 +- 改制订单使用库存成品。 +- 改制订单使用其他非毛坯物料。 +- 改制订单指定的物料需要仓库出库。 + +生成后流程: + +1. 技术中心发起改制订单。 +2. 系统判断需要领料。 +3. 生成领料单。 +4. 仓库根据领料单出库。 +5. 出库完成后,精工车间继续生产、工艺、派工。 + +### 5.3 不生成领料单场景 + +以下场景不生成领料单: + +- 原现自制订单改制。 +- 直接使用毛坯改制。 +- 改制对象已经在精工车间现场,不需要仓库出库。 + +不生成领料单时: + +- 改制订单直接进入精工生产任务。 +- 生产任务查询可查看。 +- 车间派工可查看并派工。 + +### 5.4 领料状态字段 + +建议改制订单增加以下字段: + +| 字段名 | 说明 | +| -------- | --------------- | +| 是否需要领料 | 1 是,0 否 | +| 是否已生成领料单 | 1 是,0 否 | +| 领料单号 | 生成的领料单编号 | +| 领料状态 | 未生成、待出库、已出库、已取消 | +| 出库日期 | 仓库出库日期 | +| 出库人 | 仓库操作人 | + +## 6. 业务流程 + +### 6.1 技术中心发起改制订单 + +用户进入技术中心“改制订单发起”页面。 + +查询原始数据: + +- 订单编号 +- 产品/部件名称 +- 零件名称 +- 图号 +- 原自制订单 +- 库存物料 +- 毛坯物料 + +发起改制时填写: + +- 改制订单号 +- 原订单编号 +- 原零件名称 +- 原零件图号 +- 改制零件名称 +- 改制零件图号 +- 改制数量 +- 改制来源类型 +- 是否毛坯 +- 物料编号 +- 物料名称 +- 改制原因 +- 改制要求 +- 技术备注 +- 精工期限 + +提交时校验: + +- 改制数量必须大于 0。 +- 改制来源类型不能为空。 +- 改制原因不能为空。 +- 改制要求不能为空。 +- 精工期限不能为空。 +- 如果来源类型为非毛坯物料改制,必须选择物料编号。 + +### 6.2 后端生成改制订单 + +提交后,后端需要同时处理: + +- 写入改制订单主记录。 +- 根据改制来源类型判断是否生成领料单。 +- 生成精工车间生产任务。 +- 写入任务类型为 `改制`。 +- 关联改制订单号和新工艺计划流水号。 + +### 6.3 进入精工车间生产任务查询 + +改制订单生成后,应能在现有接口中查到: + +```text +精工车间_生成任务_查询数据 +``` + +建议返回字段增加: + +- 任务类型 +- 是否改制 +- 改制订单号 +- 改制来源类型 +- 是否需要领料 +- 领料状态 +- 改制原因 +- 改制要求 + +生产任务查询页面显示: + +- `任务类型 = 改制` +- 若 `是否需要领料 = 1` 且 `领料状态 !== 已出库`,可显示领料状态提示。 + +是否允许工艺/派工,需要按业务决定: + +- 如果非毛坯物料改制必须先出库,建议未出库前允许制定工艺,但不允许派工。 +- 如果现场允许先派工后补出库,则只做提示,不阻断派工。 + +建议采用更稳妥规则: + +```text +需要领料且未出库:允许制定工艺,不允许派工。 +不需要领料:正常工艺、派工。 +需要领料且已出库:正常工艺、派工。 +``` + +### 6.4 制定工艺 + +改制订单在生产任务查询中点击 `工艺`,进入现有: + +```text +/SeikoWorkshop/DevelopProcess +``` + +工艺规则: + +- 改制订单必须生成新的工艺计划流水号。 +- 不覆盖原自制订单或原零件工艺。 +- 可支持从原工艺复制后调整。 +- 工艺保存后,任务状态进入 `工艺完成`。 + +### 6.5 车间派工 + +工艺完成后进入现有车间派工页面: + +```text +src/views/SeikoWorkshop/WorkshopAssignment/index.vue +``` + +现有查询接口: + +```text +精工车间_车间派工_查询 +``` + +改制订单派工前判断: + +- 不需要领料:允许派工。 +- 需要领料且已出库:允许派工。 +- 需要领料但未出库:禁止派工,并提示“改制订单物料未出库,不能派工”。 + +派工明细继续复用现有接口: + +```text +车间生产管理工艺_零件工序_已派工查询 +车间生产管理工艺_零件工序_派工_工序查询 +车间生产管理工艺_零件工序_派工 +车间生产管理工艺_零件工序_取消派工 +``` + +### 6.6 仓库出库 + +当改制订单需要领料时,系统生成领料单。 + +仓库根据领料单完成出库后,需要回写: + +- 领料状态 = 已出库 +- 出库日期 +- 出库人 +- 出库数量 + +出库完成后,精工车间派工限制解除。 + +### 6.7 加工和完工 + +改制订单派工后,继续走现有精工车间加工流程: + +- 工序派工 +- 扫码加工 +- 完工报工 +- 质检 +- 零件追溯 +- 工时统计 + +完工后改制记录状态同步为: + +```text +已完成 +``` + +## 7. 数据字段设计 + +### 7.1 改制订单主记录字段 + +| 字段名 | 说明 | +| -------- | ------------------- | +| 改制订单号 | 改制业务编号 | +| 原订单编号 | 原订单编号 | +| 原订单流水号 | 原订单流水号 | +| 原组件流水号 | 原组件流水号 | +| 原基本件流水号 | 原零件流水号 | +| 原工艺计划流水号 | 原工艺计划流水号 | +| 原零件名称 | 改制前零件名称 | +| 原零件图号 | 改制前零件图号 | +| 原数量 | 原数量 | +| 改制零件名称 | 改制后零件名称 | +| 改制零件图号 | 改制后零件图号 | +| 改制数量 | 改制数量 | +| 改制来源类型 | 原现自制订单、毛坯改制、非毛坯物料改制 | +| 是否毛坯 | 1 是,0 否 | +| 物料编号 | 使用物料编号 | +| 物料名称 | 使用物料名称 | +| 物料流水号 | 使用物料流水号 | +| 是否需要领料 | 1 是,0 否 | +| 是否已生成领料单 | 1 是,0 否 | +| 领料单号 | 领料单编号 | +| 领料状态 | 未生成、待出库、已出库、已取消 | +| 改制原因 | 改制原因 | +| 改制要求 | 改制要求 | +| 技术备注 | 技术备注 | +| 精工期限 | 精工完工期限 | +| 新基本件流水号 | 改制任务生成的新零件流水号 | +| 新工艺计划流水号 | 改制任务生成的新工艺计划流水号 | +| 发起人 | 当前用户 ID | +| 发起日期 | 发起时间 | +| 状态 | 改制订单状态 | +| 是否启用 | 逻辑删除标识 | + +### 7.2 改制订单状态 + +| 状态 | 说明 | +| ---- | ---------------- | +| 待领料 | 需要领料,领料单未出库 | +| 待工艺 | 不需要领料或已出库,等待制定工艺 | +| 工艺完成 | 工艺已保存,等待派工 | +| 待派工 | 工艺完成且满足派工条件 | +| 加工中 | 已派工或已开始加工 | +| 已完成 | 改制任务完工 | +| 已取消 | 改制订单取消 | + +说明: + +- 如果不需要领料,提交后可直接进入 `待工艺`。 +- 如果需要领料,提交后进入 `待领料`。 +- 仓库出库后从 `待领料` 转为 `待工艺` 或保持生产任务状态,由查询时关联显示。 + +## 8. API 设计 + +项目请求继续使用: + +```js +this.CreateData(type, name, param, pageSize, pageCurrent) +this.ExecDatabase(Data) +``` + +### 8.1 技术中心查询可改制对象 + +```js +var Data = this.CreateData('11', '技术中心_改制订单_可改制对象_查询', param, this.pageSize, this.pageCurrent) +``` + +### 8.2 技术中心发起改制订单 + +```js +var Data = this.CreateData('12', '技术中心_改制订单_发起改制', param) +``` + +参数建议: + +| 参数名 | 说明 | +| -------- | ------------------- | +| 原订单流水号 | 原订单流水号 | +| 原组件流水号 | 原组件流水号 | +| 原基本件流水号 | 原基本件流水号 | +| 原工艺计划流水号 | 原工艺计划流水号 | +| 原订单编号 | 原订单编号 | +| 原零件名称 | 原零件名称 | +| 原零件图号 | 原零件图号 | +| 改制零件名称 | 改制零件名称 | +| 改制零件图号 | 改制零件图号 | +| 改制数量 | 改制数量 | +| 改制来源类型 | 原现自制订单、毛坯改制、非毛坯物料改制 | +| 是否毛坯 | 是否毛坯 | +| 物料流水号 | 使用物料流水号 | +| 物料编号 | 物料编号 | +| 物料名称 | 物料名称 | +| 改制原因 | 改制原因 | +| 改制要求 | 改制要求 | +| 技术备注 | 技术备注 | +| 精工期限 | 精工期限 | +| 发起人 | 当前用户 ID | + +后端处理结果: + +- 生成改制订单。 +- 判断是否生成领料单。 +- 生成精工生产任务。 +- 返回 `result`、`改制订单号`、`领料单号`、`是否需要领料`。 + +### 8.3 改制记录查询 + +```js +var Data = this.CreateData('11', '技术中心_改制订单_记录_查询', param, this.pageSize, this.pageCurrent) +``` + +### 8.4 改制订单详情 + +```js +var Data = this.CreateData('11', '技术中心_改制订单_详情_查询', param) +``` + +### 8.5 取消改制订单 + +```js +var Data = this.CreateData('12', '技术中心_改制订单_取消', param) +``` + +取消前后端需要校验: + +- 未派工可以取消。 +- 已派工未加工,需要先取消派工。 +- 已加工、已有质检记录或已完成,不允许取消。 +- 已生成领料单且已出库,不允许直接取消,需要走退料或异常处理。 + +## 9. 现有接口扩展 + +### 9.1 生产任务查询接口 + +现有接口: + +```text +精工车间_生成任务_查询数据 +``` + +新增查询参数: + +| 参数名 | 说明 | +| ----------- | ------------- | +| 任务类型\_check | 是否按任务类型过滤 | +| 任务类型 | 全部、正常、改制、报废补投 | +| 领料状态\_check | 是否按领料状态过滤 | +| 领料状态 | 待出库、已出库、不需要领料 | + +新增返回字段: + +| 字段名 | 说明 | +| ------ | ------------------- | +| 任务类型 | 正常、改制、报废补投 | +| 是否改制 | 1 是,0 否 | +| 改制订单号 | 改制订单编号 | +| 改制来源类型 | 原现自制订单、毛坯改制、非毛坯物料改制 | +| 是否需要领料 | 1 是,0 否 | +| 领料状态 | 未生成、待出库、已出库、已取消 | +| 领料单号 | 领料单号 | +| 改制原因 | 改制原因 | +| 改制要求 | 改制要求 | + +### 9.2 车间派工查询接口 + +现有接口: + +```text +精工车间_车间派工_查询 +``` + +新增查询参数: + +| 参数名 | 说明 | +| ----------- | ------------- | +| 任务类型\_check | 是否按任务类型过滤 | +| 任务类型 | 全部、正常、改制、报废补投 | + +新增返回字段: + +| 字段名 | 说明 | +| ------ | ---------- | +| 任务类型 | 正常、改制、报废补投 | +| 是否改制 | 1 是,0 否 | +| 改制订单号 | 改制订单编号 | +| 改制来源类型 | 改制来源类型 | +| 是否需要领料 | 1 是,0 否 | +| 领料状态 | 领料状态 | +| 领料单号 | 领料单号 | + +派工前端限制: + +```text +如果 是否改制 = 1 且 是否需要领料 = 1 且 领料状态 != 已出库,则不允许派工。 +``` + +## 10. 前端交互调整 + +### 10.1 技术中心改制订单发起页面 + +查询条件: + +- 订单编号 +- 零件名称 +- 图号 +- 物料编号 +- 物料名称 +- 改制来源类型 + +表格列: + +- 订单编号 +- 产品/部件名称 +- 零件名称 +- 零件图号 +- 数量 +- 当前状态 +- 来源类型 +- 物料编号 +- 物料名称 +- 操作 + +操作: + +- 发起改制 +- 图纸 +- PLM传入工艺 +- 追溯 + +发起改制弹窗: + +- 原订单编号 +- 原零件名称 +- 原零件图号 +- 改制零件名称 +- 改制零件图号 +- 改制数量 +- 改制来源类型 +- 是否毛坯 +- 物料编号 +- 物料名称 +- 改制原因 +- 改制要求 +- 技术备注 +- 精工期限 + +### 10.2 生产任务查询页面 + +新增筛选: + +```text +任务类型:全部 / 正常 / 改制 / 报废补投 +领料状态:全部 / 不需要领料 / 待出库 / 已出库 +``` + +新增列: + +- 任务类型 +- 改制订单号 +- 改制来源类型 +- 领料状态 + +显示建议: + +```html +改制 +待出库 +已出库 +不需要领料 +``` + +### 10.3 车间派工页面 + +新增筛选: + +```text +任务类型:全部 / 正常 / 改制 / 报废补投 +``` + +新增列: + +- 任务类型 +- 改制订单号 +- 领料状态 + +派工按钮或派工操作前增加判断: + +```js +if (Number(row.是否改制) === 1 && Number(row.是否需要领料) === 1 && row.领料状态 !== '已出库') { + this.$message.warning('改制订单物料未出库,不能派工') + return +} +``` + +### 10.4 改制记录查询页面 + +查询条件: + +- 改制订单号 +- 原订单编号 +- 零件名称或图号 +- 改制来源类型 +- 领料状态 +- 改制状态 +- 发起日期 +- 发起人 + +表格列: + +- 改制订单号 +- 状态 +- 原订单编号 +- 原零件名称 +- 原零件图号 +- 改制零件名称 +- 改制零件图号 +- 改制数量 +- 改制来源类型 +- 是否需要领料 +- 领料单号 +- 领料状态 +- 改制原因 +- 发起人 +- 发起日期 +- 精工期限 +- 完成日期 +- 操作 + +操作: + +- 详情 +- 生产任务 +- 派工 +- 追溯 +- 取消 + +## 11. 菜单配置 + +建议后端菜单配置: + +```text +技术中心 + 改制订单发起 + 改制记录查询 +``` + +组件路径: + +```text +TechnologyCenter/PartModificationOrder/index +TechnologyCenter/PartModificationRecord/index +``` + +精工车间不新增发起入口,只扩展现有页面: + +```text +SeikoWorkshop/ProductionTaskQuery/index +SeikoWorkshop/WorkshopAssignment/index +``` + +## 12. 实施顺序 + +建议按以下顺序实施: + +1. 后端新增改制订单主记录表。 +2. 后端新增技术中心发起改制订单接口。 +3. 后端在发起接口中加入领料判断规则。 +4. 后端按规则生成或不生成领料单。 +5. 后端生成标准精工生产任务,并标记 `任务类型 = 改制`。 +6. 扩展生产任务查询接口,返回改制和领料字段。 +7. 扩展车间派工查询接口,返回改制和领料字段。 +8. 前端新增技术中心改制订单发起页面。 +9. 前端新增改制记录查询页面。 +10. 前端修改生产任务查询页面,增加任务类型和领料状态显示。 +11. 前端修改车间派工页面,增加改制任务显示和派工前领料状态校验。 +12. 联调从技术中心发起、领料判断、仓库出库、精工工艺、车间派工、加工完工、记录查询的完整流程。 + +## 13. 风险点 + +### 13.1 领料判断风险 + +改制订单是否生成领料单,必须以后端判断为准。 + +前端可以显示和提示,但不能只依赖前端判断,避免绕过仓库出库流程。 + +### 13.2 派工前物料状态风险 + +如果改制订单需要仓库出库,但尚未出库,直接派工会导致车间无物料加工。 + +建议车间派工接口或派工保存接口再次校验: + +```text +需要领料且未出库,不允许派工。 +``` + +### 13.3 原任务数据覆盖风险 + +改制订单必须生成新的生产任务和新的工艺计划流水号。 + +不能直接覆盖原自制订单或原零件工艺,否则会影响原订单追溯、工时和质量记录。 + +### 13.4 取消改制风险 + +已生成领料单、已出库、已派工或已加工的改制订单取消规则需要严格控制。 + +建议: + +- 未出库、未派工:允许取消。 +- 已出库:需要退料后取消。 +- 已派工未加工:先取消派工再取消。 +- 已加工:不允许取消,只能走异常处理。 + +### 13.5 统计口径风险 + +改制订单进入精工生产任务后,会影响生产任务数量、工时统计、完工统计。 + +建议所有统计接口增加任务类型维度: + +```text +正常 +改制 +报废补投 +``` + +## 14. 总结 + +本方案采用: + +```text +技术中心发起改制订单,精工车间承接生产,仓库按需出库,改制记录统一查询。 +``` + +关键规则: + +- 技术中心新增组件发起改制订单。 +- 改制订单生成后进入精工车间生产任务查询。 +- 改制订单工艺和派工复用现有精工流程。 +- 领料时如果是改制订单,并且使用物料不是毛坯,则生成领料单,由仓库物料出库。 +- 如果是原现自制订单改制,或者直接使用毛坯改制,则不生成领料单。 +- 改制记录查询独立展示全流程状态。 diff --git a/零件改制功能设计方案.pdf b/零件改制功能设计方案.pdf new file mode 100644 index 00000000..1ef16870 Binary files /dev/null and b/零件改制功能设计方案.pdf differ diff --git a/零件改制流程图.svg b/零件改制流程图.svg new file mode 100644 index 00000000..a933d04d --- /dev/null +++ b/零件改制流程图.svg @@ -0,0 +1,85 @@ + + + + + + + + + + 零件改制业务流程图 + + + 技术中心:改制订单发起 + 选择原订单/零件/物料,填写改制数量、来源类型、原因、要求、精工期限 + + + + + 是否改制订单 + 且使用物料不是毛坯? + + + + + + 生成领料单 + 仓库按领料单物料出库 + + + 已出库 + + + + 原现自制订单改制 + 或直接毛坯改制 + 不生成领料单 + + + 生成精工 + 生产任务 + + + + + 精工车间:生产任务查询 + 显示任务类型=改制、领料状态、改制订单号 + + + + + 制定工艺 + 生成新工艺计划,可复制原工艺后调整 + + + + + 车间派工与加工完工 + 需要领料且未出库时禁止派工,出库后正常派工 + + + + + 仓储入库 + 改制完工后按现有流程办理入库并回写状态 + + + + 改制记录查询贯穿全流程 + + + + 状态回写与追溯关联 +