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 技术中心发起改制订单
+用户进入技术中心“改制订单发起”页面。
+查询原始数据:
+- 订单编号
- 产品/部件名称
- 零件名称
- 图号
- 原自制订单
- 库存物料
- 毛坯物料
+发起改制时填写:
+- 改制订单号
- 原订单编号
- 原零件名称
- 原零件图号
- 改制零件名称
- 改制零件图号
- 改制数量
- 改制来源类型
- 是否毛坯
- 物料编号
- 物料名称
- 改制原因
- 改制要求
- 技术备注
- 精工期限
+提交时校验:
+- 改制数量必须大于 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 技术中心改制订单发起页面
+查询条件:
+
+表格列:
+- 订单编号
- 产品/部件名称
- 零件名称
- 零件图号
- 数量
- 当前状态
- 来源类型
- 物料编号
- 物料名称
- 操作
+操作:
+
+发起改制弹窗:
+- 原订单编号
- 原零件名称
- 原零件图号
- 改制零件名称
- 改制零件图号
- 改制数量
- 改制来源类型
- 是否毛坯
- 物料编号
- 物料名称
- 改制原因
- 改制要求
- 技术备注
- 精工期限
+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 @@
+
+
+
+
+
+
+
+
+
+
+
+ 创建日期
+
+
+
+
+
+ 查询
+
+ 资料修改记录
+
+ 合同
+
+
+ 配置清单
+
+
+
+
+
+
+
+
+ 终止执行
+
+ 未审批
+ 未提交
+ 未创建
+
+ 未审核
+
+
+ 未投产
+
+ 已投产
+ 生产中
+
+ 装配中
+
+ 待发货
+
+ 已完成
+
+
+
+
+
+ {{ scope.row.合同编号 }}
+
+
+
+
+ {{ scope.row.客户名称 }}
+
+
+
+
+ {{ scope.row.合同金额 ? Number(scope.row.合同金额).toFixed(2) : '' }}
+
+
+
+
+ {{ scope.row.交货期限 }}
+
+
+
+
+ {{ scope.row.已收金额 + '%' }}
+
+
+
+
+ {{ scope.row.税率 }}
+
+
+
+
+ {{ scope.row.收货人员 }}
+
+
+
+
+ {{ scope.row.合同备注 }}
+
+
+
+
+ {{ scope.row.签订日期 }}
+
+
+
+
+ {{ scope.row.经手人 }}
+
+
+
+
+ {{ scope.row.提交日期 }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 修改合同
+
+
+
+
+ 销 售 合 同 (含{{ taxRate }}增值税)
+
+
+
+
甲方:{{ partyB }}
+
乙方:{{ firstParty }}
+
+
+
合同编号:{{ number }}
+
签订日期:{{ date }}
+
+
签署地点:{{ addressA1 }}
+
+
+
+ | 序号 |
+ 规格品名 |
+ 单位 |
+ 数量 |
+ 单价 |
+ 金额(元) |
+
+
+ | {{ list.序号 }} |
+ |
+ {{ list.单位 }} |
+ {{ list.数量 }} |
+ {{ list.单价 }} |
+ {{ list.金额 }} |
+
+
+
+ | 合计: |
+ (大写){{
+ TotalAmount
+ }}(小写)¥:{{ TotalAmount1 }} |
+
+
+
+
+
+
+
+
(买家)
+
甲方:{{ partyB }}
+
地址:{{ addressB }}
+
联系电话:{{ contactNumberB }}
+
联系人:{{ contacts }}
+
行号:{{ FaxB }}
+
代表(签字并盖章):{{ representative }}
+
+
+
(卖家)
+
乙方:{{ firstParty }}
+
地址:{{ addressA }}
+
开户行:{{ BankOfDeposit }}
+
账号:{{ accountNumber }}
+
服务热线:{{ ServiceHotLine }}
+
联系电话:{{ contactNumberA }}
+
行号:{{ FaxA }}
+
+
+
+
+
+
+
+
+
+ | 序号 |
+ 规格品名 |
+ 单位 |
+ 数量 |
+ 单价 |
+ 金额(元) |
+
+
+ | {{ list.序号 }} |
+ {{ list.规格品名 }} |
+ {{ list.单位 }} |
+ {{ list.数量 }} |
+ {{ list.单价 }} |
+ {{ list.金额 }} |
+
+
+
+
+
+
+ 提交
+
+
+
+
+
+
+
+
+
+ {{ scope.row.机床名称 }}
+
+
+
+
+
+
+
+
+
+ {{ scope.row.详情 }}
+
+
+
+
+
+
+
+
+
+ {{ scope.row.单位 }}
+
+
+
+
+
+
+
+
+
+ {{ scope.row.数量 }}
+
+
+
+
+
+
+
+
+
+ {{ scope.row.单价 ? parseFloat(scope.row.单价).toFixed(2) : '' }}
+
+
+
+
+
+ {{ (scope.row.数量 * scope.row.单价).toFixed(2) }}
+
+
+
+
+ 确定
+ 取消
+
+
+
+
+
+
+
+ 机床配置单
+
+
+
+
+
+
+
+ {{ scope.row.顺序 }}
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ scope.row.产品名称 }}
+
+
+
+
+
+
+
+
+
+ {{ scope.row.产品详情 }}
+
+
+
+
+
+ {{ scope.row.机床数 }}
+
+
+
+
+
+
+
+
+ {{ scope.row.配置数 }}
+
+
+
+
+
+
+
+
+
+ {{ scope.row.单位 }}
+
+
+
+
+
+
+
+
+
+ {{ scope.row.数量 }}
+
+
+
+
+
+
+
+
+
+ {{ scope.row.单价 ? parseFloat(scope.row.单价).toFixed(2) : '' }}
+
+
+
+
+
+ {{ (scope.row.数量 * scope.row.单价).toFixed(2) }}
+
+
+
+
+ 确定
+ 取消
+
+
+
+
+
+
+
+ 模块
+
+
+ BOM零件
+
+
+ 物料
+
+
+ 非标件
+
+
+ 合同备注:
+
+
+
+
+
+
+
+
+
+
+ {{ scope.row.修改日期 }}
+
+
+
+
+ {{ scope.row.修改人 }}
+
+
+
+
+ {{ scope.row.合同备注 }}
+
+
+
+
+
+
+
+
+
+ 销 售 合 同 (含{{ taxRate1 }}增值税)
+
+
+
+
甲方:{{ firstParty1 }}
+
乙方:{{ partyB1 }}
+
+
+
合同编号:{{ number1 }}
+
签订日期:{{ date1 }}
+
+
+
签署地点:{{ addressA1 }}
+
+
+ | 序号 |
+ 规格品名 |
+ 单位 |
+ 数量 |
+ 单价 |
+ 金额(元) |
+
+
+ | {{ list.序号 }} |
+ {{ list.规格品名 }} |
+ {{ list.单位 }} |
+ {{ list.数量 }} |
+ {{ list.单价 }} |
+ {{ list.金额 }} |
+
+
+
+ | 合计: |
+ (大写){{
+ TotalAmount4
+ }}(小写)¥:{{ TotalAmount5 }} |
+
+
+
+
+
+ | 序号 |
+ 规格品名 |
+ 单位 |
+ 数量 |
+ 单价 |
+ 金额(元) |
+
+
+ | {{ list.序号 }} |
+ {{ list.规格品名 }} |
+ {{ list.单位 }} |
+ {{ list.数量 }} |
+ {{ list.单价 }} |
+ {{ list.金额 }} |
+
+
+
+ | 合计: |
+ (大写){{
+ TotalAmount2
+ }}(小写)¥:{{ TotalAmount3 }} |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 点击上传
+
+
+
+
+
+
+
+ 点击上传
+
+
+
+
+
+
+
+
+
+ {{ scope.row.产品名称 }}
+
+
+
+
+ {{ scope.row.零件名称 }}
+
+
+
+
+ {{ scope.row.图号或型号 }}
+
+
+
+
+ {{ scope.row.数量 }}
+
+
+
+
+ {{ scope.row.累计库存 }}
+
+
+
+
+ {{ scope.row.材料 }}
+
+
+
+
+
+
+
+
+
+ 名称:
+
+ 图号/型号:
+
+ 查询
+
+
+
+
+
+ {{ scope.row.名称 }}
+
+
+
+
+ {{ scope.row.代号 }}
+
+
+
+
+ {{ scope.row.库存 }}
+
+
+
+
+ {{ scope.row.材料 }}
+
+
+
+
+
+
+
+
+ 修改合同协议
+
+
+ 取消
+ 确定
+
+
+
+
+ 提交
+
+
+
+
+
+
+
+
+ {{ scope.row.顺序 }}
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ scope.row.产品名称 }}
+
+
+
+
+
+
+
+
+
+ {{ scope.row.产品详情 }}
+
+
+
+
+
+
+
+
+
+ {{ scope.row.单位 }}
+
+
+
+
+
+
+
+
+
+ {{ scope.row.数量 }}
+
+
+
+
+
+
+
+
+
+ {{ scope.row.单价 ? parseFloat(scope.row.单价).toFixed(2) : '' }}
+
+
+
+
+
+ {{ (scope.row.数量 * scope.row.单价).toFixed(2) }}
+
+
+
+
+ 确定
+ 取消
+
+
+
+
+
+
+
+ 模块
+
+
+ BOM零件
+
+
+ 物料
+
+
+ 非标件
+
+
+ 合同备注:
+
+
+
+
+
+
+ {{ editCustomerNameContractNo }}
+
+
+
+
+
+
+
+
+
+
+ 付款后
+
+ 日内
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ getPersonName(scope.row.修改人) }}
+
+
+
+
+ {{ scope.row.name }}{{ scope.row.suffix ? '.' + scope.row.suffix : '' }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
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 @@
+
+
+
+
+
+
+
+ 发货日期
+
+
+
+
+ 查询
+
+
+
+
+
+ 未审核
+ 待审核
+ 已审核
+ 已发货
+
+
+
+
+ {{ scope.row.发货单号 }}
+
+
+
+
+ {{ scope.row.发货日期 }}
+
+
+
+
+ {{ scope.row.收货人 }}
+
+
+
+
+ {{ scope.row.收货地址 }}
+
+
+
+
+ {{ scope.row.物流单号 }}
+
+
+
+
+ {{ Number(scope.row.发货金额).toFixed(2) }}
+
+
+
+
+ {{ scope.row.发货备注 }}
+
+
+
+
+ 照片
+
+
+
+
+
+
+ 审核
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ scope.row.订单号 }}
+
+
+
+
+ {{ scope.row.买方名称 }}
+
+
+
+
+ {{ scope.row.产品名称 }}
+
+
+
+
+ {{ scope.row.发货数量 ? scope.row.发货数量 : scope.row.查询实际发量 }}
+
+
+
+
+ {{ Number(scope.row.单价).toFixed(2) }}
+
+
+
+
+ {{ Number((scope.row.发货数量 ? scope.row.发货数量 : scope.row.查询实际发量) * scope.row.单价).toFixed(2) }}
+
+
+
+
+ {{ scope.row.订单数 }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
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 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ scope.row.通知日期 }}
+
+
+
+
+ {{ scope.row.订单编号 }}
+
+
+
+
+ {{ scope.row.买方名称 }}
+
+
+
+
+ {{ scope.row.地址 }}
+
+
+
+
+ {{ scope.row.合同备注 }}
+
+
+
+
+ {{ scope.row.产品名称 }}
+
+
+
+
+ {{ scope.row.状态 }}
+
+
+
+
+ {{ scope.row.本次发货 }}
+
+
+
+
+ {{ scope.row.本次已发数量 }}
+
+
+
+
+ {{ scope.row.已发数 }}
+
+
+
+
+ {{ scope.row.订单数量 }}
+
+
+
+
+ {{ scope.row.产品详情 }}
+
+
+
+
+ {{ scope.row.交货日期 }}
+
+
+
+
+
+
+ 发货日期
+
+
+ 发货单
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ scope.row.发货单号 }}
+
+
+
+
+ {{ scope.row.发货日期 }}
+
+
+
+
+ {{ scope.row.收货人 }}
+
+
+
+
+ {{ scope.row.收货地址 }}
+
+
+
+
+ {{ scope.row.物流单号 }}
+
+
+
+
+ {{ Number(scope.row.发货金额).toFixed(2) }}
+
+
+
+
+ {{ scope.row.发货备注 }}
+
+
+
+
+ 照片
+
+
+
+
+
+ 确认发货
+
+
+
+
+
+
+
+
+
+
+
+ {{ scope.row.订单号 }}
+
+
+
+
+ {{ scope.row.合同备注 }}
+
+
+
+
+ {{ scope.row.产品名称 }}
+
+
+
+
+ {{ scope.row.应发数量 }}
+
+
+
+
+
+
+
+
+
+ {{ Number(scope.row.单价).toFixed(2) }}
+
+
+
+
+ {{ Number(scope.row.单价 * scope.row.查询实际发量).toFixed(2) }}
+
+
+
+
+
+ 领料
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

+

+
浙 江 景 耀 数 控 科 技 有 限 公 司
ZHEJIANG JING YAO NUMERICAL CONTROL TECHNOLOGY CO. LTD
+
+
+ 销售出库单
+
+
+
+ 收货单位:{{
+ customer
+ }}
+
+
+ 销售方式:现销
+
+
+ 编号:{{ number }}
+
+
+
+ 摘要:{{ remarks }}
+ 日期:{{ date }}
+
+
+
+ | 序号 |
+ 产品名称 |
+ 辅助规格 |
+
+ 单位 |
+ 数量 |
+
+
+ 备注 |
+
+
+ | {{ list.序号 }} |
+ {{ list.产品名称 }} |
+ {{ list.辅助规格 }} |
+
+ {{ list.单位 }} |
+ {{ list.数量 }} |
+
+
+
+
+
+ {{ list.备注 }} |
+
+
+ | 合计 |
+
+
+
+
+
+ {{
+ // Number(totalAmount).toFixed(2)
+ totalCount
+ }}
+
+ |
+
+
+
+ 注:以上货品请核对数量,如有质量问题,请在收货后3天内通知本公司,逾期恕不负责。
+
+
审核:业务员:发货:保管:制单:收货:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 领料单
+
+ 领料单号:{{ DocumentNumber }}
+
+
+
+
+ {{ scope.row.订单编号 }}
+
+
+
+
+ {{ scope.row.零件名称 }}
+
+
+
+
+ {{ scope.row.累计库存 }}
+
+
+
+
+
+
+
+
+
+ {{ scope.row.数量 }}
+
+
+
+
+ {{ scope.row.已领数量 }}
+
+
+
+
+
+
+
+
+
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 技术中心改制订单发起页面
+查询条件:
+
+表格列:
+- 订单编号
- 产品/部件名称
- 零件名称
- 零件图号
- 数量
- 当前状态
- 来源类型
- 物料编号
- 物料名称
- 操作
+操作:
+
+发起改制弹窗:
+- 原订单编号
- 原零件名称
- 原零件图号
- 改制零件名称
- 改制零件图号
- 改制数量
- 改制来源类型
- 是否毛坯
- 物料编号
- 物料名称
- 改制原因
- 改制要求
- 技术备注
- 精工期限
+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. 现有流程承接关系
+
+根据项目现有页面,改制订单应承接以下流程:
+
+| 流程节点 | 现有承接页面 | 说明 |
+| ---- | ---------- | --------------- |
+| 技术发起 | 技术中心新增页面 | 发起改制订单,填写改制要求 |
+| 生成任务 | 精工车间生产任务查询 | 改制订单进入生产任务列表 |
+| 制定工艺 | 精工车间制定工艺 | 可复用或复制原工艺后调整 |
+| 车间派工 | 精工车间车间派工 | 工艺完成后派工 |
+| 领料判断 | 领料/仓储出库流程 | 根据物料类型决定是否生成领料单 |
+| 加工执行 | 精工车间现有加工流程 | 扫码、报工、质检等复用现有逻辑 |
+| 入库 | 仓储入库流程 | 改制完工后按现有流程办理入库 |
+| 记录查询 | 改制记录查询 | 查看改制全流程 |
+
+
+
+## 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 @@
+