更新销售合同/提成/业绩、精工工序工价/生产审核/工时统计、仓储盘点/库存/补货/入库/库房管理,新增提成设置/销售业绩/库房管理/入库单移动端等模块及SQL脚本
BIN
docs/JY1.0库房管理文档.docx
Normal file
BIN
docs/assets/warehouse-management-doc/flow_count.png
Normal file
|
After Width: | Height: | Size: 56 KiB |
BIN
docs/assets/warehouse-management-doc/flow_inbound.png
Normal file
|
After Width: | Height: | Size: 51 KiB |
BIN
docs/assets/warehouse-management-doc/flow_outbound.png
Normal file
|
After Width: | Height: | Size: 50 KiB |
BIN
docs/assets/warehouse-management-doc/flow_replenishment.png
Normal file
|
After Width: | Height: | Size: 57 KiB |
BIN
docs/assets/warehouse-management-doc/flow_return.png
Normal file
|
After Width: | Height: | Size: 60 KiB |
BIN
docs/assets/warehouse-management-doc/flow_transfer.png
Normal file
|
After Width: | Height: | Size: 60 KiB |
BIN
docs/库房管理/dataflow_charts/01_数据流总览.png
Normal file
|
After Width: | Height: | Size: 98 KiB |
BIN
docs/库房管理/dataflow_charts/02_主数据流.png
Normal file
|
After Width: | Height: | Size: 27 KiB |
BIN
docs/库房管理/dataflow_charts/03_入库数据流.png
Normal file
|
After Width: | Height: | Size: 37 KiB |
BIN
docs/库房管理/dataflow_charts/04_出库数据流.png
Normal file
|
After Width: | Height: | Size: 29 KiB |
BIN
docs/库房管理/dataflow_charts/05_移库数据流.png
Normal file
|
After Width: | Height: | Size: 56 KiB |
BIN
docs/库房管理/dataflow_charts/06_盘点数据流.png
Normal file
|
After Width: | Height: | Size: 51 KiB |
BIN
docs/库房管理/dataflow_charts/07_综合查询数据流.png
Normal file
|
After Width: | Height: | Size: 36 KiB |
BIN
docs/库房管理/dataflow_charts/08_正向查询数据流.png
Normal file
|
After Width: | Height: | Size: 40 KiB |
BIN
docs/库房管理/dataflow_charts/09_逆向查询数据流.png
Normal file
|
After Width: | Height: | Size: 34 KiB |
BIN
docs/库房管理/dataflow_charts/10_前端页面数据流.png
Normal file
|
After Width: | Height: | Size: 40 KiB |
BIN
docs/库房管理/实施计划_补充完善版.docx
Normal file
BIN
docs/库房管理/实施计划_补充完善版_含库房管理界面.docx
Normal file
BIN
docs/库房管理/库房管理实施方案.docx
Normal file
885
docs/库房管理/库房管理实施方案.md
Normal file
@@ -0,0 +1,885 @@
|
|||||||
|
# 库房管理模块实施方案
|
||||||
|
|
||||||
|
## 1. 建设目标
|
||||||
|
|
||||||
|
本方案用于先把库房管理业务闭环走通,再进入前端页面、后端接口和 SQL 脚本开发。第一版建设范围包括:
|
||||||
|
|
||||||
|
1. 库房管理模块。
|
||||||
|
2. 库房对应库位管理。
|
||||||
|
3. 物料入库、出库、退库、移库、调拨等库存变动。
|
||||||
|
4. 物料盘点、盘盈、盘亏、差异确认。
|
||||||
|
5. 物料综合查询。
|
||||||
|
6. 物料正向查询和逆向查询:查物料在哪些库位,也查某个库位放置了哪些物料。
|
||||||
|
|
||||||
|
核心原则:真实库存必须落到具体库房、具体库位、具体物料,所有库存数量变化都必须通过业务单据和库存流水产生,不允许只修改结果表而不留变动记录。
|
||||||
|
|
||||||
|
## 2. 总体业务架构
|
||||||
|
|
||||||
|
### 2.1 主数据
|
||||||
|
|
||||||
|
库房管理依赖以下主数据:
|
||||||
|
|
||||||
|
| 主数据 | 说明 | 维护入口 |
|
||||||
|
| --- | --- | --- |
|
||||||
|
| 库房 | 仓储空间的一级单位,如一楼仓库、三楼仓库、外协暂存库 | 新增库房管理页面 |
|
||||||
|
| 库位 | 库房下的具体存放位置,如 A01-01、B02-03 | 新增或复用货位管理页面 |
|
||||||
|
| 物料 | 现有物料主文件,字段包含物料编码、物料名称、图号或型号、规格、单位等 | 现有物料维护 |
|
||||||
|
| 库存现存量 | 某物料在某库房、某库位的当前库存数量 | 由出入库、盘点、调拨自动维护 |
|
||||||
|
| 库存变动流水 | 每一次入库、出库、盘点、调拨产生的数量变化记录 | 由业务单据自动写入 |
|
||||||
|
|
||||||
|
### 2.2 单据数据
|
||||||
|
|
||||||
|
| 单据 | 说明 | 影响库存 |
|
||||||
|
| --- | --- | --- |
|
||||||
|
| 入库单 | 采购件、自制件、退料、其他入库 | 增加指定库位库存 |
|
||||||
|
| 出库单 | 领料、生产出库、销售出库、其他出库 | 减少指定库位库存 |
|
||||||
|
| 移库单 | 同库房或跨库房从一个库位移动到另一个库位 | 原库位减少,目标库位增加 |
|
||||||
|
| 盘点单 | 按库房、库位、物料生成盘点任务并录入实盘数量 | 差异确认后调整库存 |
|
||||||
|
| 库存调整单 | 非盘点场景的库存调整,需权限控制 | 按调整方向增减库存 |
|
||||||
|
|
||||||
|
## 3. 业务流程设计
|
||||||
|
|
||||||
|
### 3.1 库房与库位建档流程
|
||||||
|
|
||||||
|
1. 仓库主管新增库房,维护库房编号、库房名称、库房类型、负责人、启用状态。
|
||||||
|
2. 在库房下新增库位,维护库位编号、库位名称、库区、货架、层号、容量、是否允许混放、启用状态。
|
||||||
|
3. 系统校验同一库房下库位编号唯一。
|
||||||
|
4. 已发生库存业务的库位不允许物理删除,只允许停用。
|
||||||
|
5. 停用库位如果仍有库存,禁止停用或提示先完成移库。
|
||||||
|
|
||||||
|
### 3.2 入库流程
|
||||||
|
|
||||||
|
1. 用户选择入库来源:采购入库、自制件入库、退料入库、其他入库。
|
||||||
|
2. 系统带出物料、批次、供应商、订单或生产任务等来源信息。
|
||||||
|
3. 仓库人员选择实际上架库房和库位。
|
||||||
|
4. 系统校验库房、库位启用状态,校验数量大于 0。
|
||||||
|
5. 提交后写入入库单主表、入库单明细表。
|
||||||
|
6. 同一事务内更新库存现存量:
|
||||||
|
- 如果该物料、批次、库位已存在库存记录,则累加库存数量。
|
||||||
|
- 如果不存在,则新增库存现存量记录。
|
||||||
|
7. 写入库存变动流水,变动类型为“入库”,变动数量为正数。
|
||||||
|
|
||||||
|
### 3.3 出库流程
|
||||||
|
|
||||||
|
1. 用户选择出库来源:领料单、生产任务、销售发货、其他出库。
|
||||||
|
2. 系统按物料查询可用库存,展示该物料在哪些库房、库位有库存。
|
||||||
|
3. 仓库人员选择出库库位和出库数量。
|
||||||
|
4. 系统校验出库数量必须小于等于该库位可用库存。
|
||||||
|
5. 提交后写入出库单主表、出库单明细表。
|
||||||
|
6. 同一事务内扣减库存现存量。
|
||||||
|
7. 写入库存变动流水,变动类型为“出库”,变动数量为负数。
|
||||||
|
8. 如果库存扣减后为 0,保留库存现存量记录,便于追溯历史库位;查询时可默认过滤 0 库存。
|
||||||
|
|
||||||
|
### 3.4 移库和调拨流程
|
||||||
|
|
||||||
|
移库用于同一库房或不同库房之间调整物料位置。
|
||||||
|
|
||||||
|
1. 用户选择需要移动的物料库存记录。
|
||||||
|
2. 系统带出原库房、原库位、当前库存。
|
||||||
|
3. 用户选择目标库房、目标库位和移库数量。
|
||||||
|
4. 系统校验移库数量大于 0 且不超过原库位库存。
|
||||||
|
5. 提交后写入移库单主表、移库单明细表。
|
||||||
|
6. 同一事务内扣减原库位库存、增加目标库位库存。
|
||||||
|
7. 写入两条库存变动流水:
|
||||||
|
- 原库位“移出”,数量为负数。
|
||||||
|
- 目标库位“移入”,数量为正数。
|
||||||
|
|
||||||
|
### 3.5 盘点流程
|
||||||
|
|
||||||
|
1. 仓库主管创建盘点单,选择盘点库房、库位范围、物料范围。
|
||||||
|
2. 系统按当前库存现存量生成盘点明细,记录账面数量。
|
||||||
|
3. 盘点人员录入实盘数量,也可补录账面不存在但现场存在的物料和库位。
|
||||||
|
4. 系统计算差异数量:差异数量 = 实盘数量 - 账面数量。
|
||||||
|
5. 无差异明细可直接确认。
|
||||||
|
6. 有差异明细需要仓库主管确认差异原因。
|
||||||
|
7. 确认后生成库存调整:
|
||||||
|
- 盘盈:增加库存。
|
||||||
|
- 盘亏:减少库存。
|
||||||
|
8. 写入库存变动流水,变动类型为“盘盈”或“盘亏”。
|
||||||
|
9. 盘点单状态流转为:草稿、盘点中、待确认、已确认、已作废。
|
||||||
|
|
||||||
|
### 3.6 物料综合查询流程
|
||||||
|
|
||||||
|
物料综合查询用于按物料维度查看当前库存、库位分布和出入库历史。
|
||||||
|
|
||||||
|
查询条件:
|
||||||
|
|
||||||
|
| 条件 | 说明 |
|
||||||
|
| --- | --- |
|
||||||
|
| 物料编码 | 精确或模糊查询 |
|
||||||
|
| 物料名称 | 模糊查询 |
|
||||||
|
| 图号或型号 | 模糊查询 |
|
||||||
|
| 规格 | 模糊查询 |
|
||||||
|
| 库房 | 按库房过滤 |
|
||||||
|
| 库位 | 按库位过滤 |
|
||||||
|
| 是否只看有库存 | 默认是 |
|
||||||
|
|
||||||
|
返回内容:
|
||||||
|
|
||||||
|
| 信息 | 说明 |
|
||||||
|
| --- | --- |
|
||||||
|
| 物料基础信息 | 编码、名称、图号、规格、单位 |
|
||||||
|
| 总库存 | 该物料所有库位库存合计 |
|
||||||
|
| 主库位 | 库存数量最大的库位,用于快速定位 |
|
||||||
|
| 库位明细 | 每个库位的库存数量 |
|
||||||
|
| 最近入库 | 最近一次入库时间、数量、来源单号 |
|
||||||
|
| 最近出库 | 最近一次出库时间、数量、来源单号 |
|
||||||
|
|
||||||
|
### 3.7 正向查询和逆向查询
|
||||||
|
|
||||||
|
正向查询:物料在哪些库位。
|
||||||
|
|
||||||
|
1. 输入物料编码、物料名称、图号或型号。
|
||||||
|
2. 系统查询库存现存量表。
|
||||||
|
3. 返回该物料所有库存大于 0 的库房、库位、批次、库存数量。
|
||||||
|
4. 支持点击库位查看该库位其他物料。
|
||||||
|
|
||||||
|
逆向查询:某库位放置哪些物料。
|
||||||
|
|
||||||
|
1. 选择库房和库位。
|
||||||
|
2. 系统查询该库位所有库存大于 0 的物料。
|
||||||
|
3. 返回物料编码、物料名称、图号或型号、规格、批次、库存数量。
|
||||||
|
4. 支持点击物料反查该物料在其他库位的分布。
|
||||||
|
|
||||||
|
## 4. 表结构设计
|
||||||
|
|
||||||
|
以下为推荐新表或标准化表结构。若数据库中已有同名或相近表,应优先复用现有表,并通过新增字段、视图或存储过程兼容现有业务。
|
||||||
|
|
||||||
|
### 4.1 库房主表
|
||||||
|
|
||||||
|
表名:`仓储管理_库房主表`
|
||||||
|
|
||||||
|
| 字段名 | 类型 | 必填 | 说明 |
|
||||||
|
| --- | --- | --- | --- |
|
||||||
|
| 库房流水号 | int identity | 是 | 主键 |
|
||||||
|
| 库房编号 | nvarchar(50) | 是 | 业务编号,唯一 |
|
||||||
|
| 库房名称 | nvarchar(100) | 是 | 库房名称 |
|
||||||
|
| 库房类型 | nvarchar(50) | 否 | 原料库、成品库、半成品库、暂存库等 |
|
||||||
|
| 地址 | nvarchar(200) | 否 | 库房位置 |
|
||||||
|
| 负责人流水号 | int | 否 | 对应人员表 |
|
||||||
|
| 负责人 | nvarchar(50) | 否 | 冗余显示 |
|
||||||
|
| 联系电话 | nvarchar(50) | 否 | 联系方式 |
|
||||||
|
| 是否启用 | bit | 是 | 默认 1 |
|
||||||
|
| 排序号 | int | 否 | 页面排序 |
|
||||||
|
| 备注 | nvarchar(500) | 否 | 备注 |
|
||||||
|
| 创建人 | int | 是 | UserID |
|
||||||
|
| 创建时间 | datetime | 是 | 默认 GETDATE() |
|
||||||
|
| 修改人 | int | 否 | UserID |
|
||||||
|
| 修改时间 | datetime | 否 | 修改时间 |
|
||||||
|
|
||||||
|
主键:`PK_仓储管理_库房主表`,字段 `库房流水号`。
|
||||||
|
|
||||||
|
唯一约束:`UK_仓储管理_库房主表_库房编号`,字段 `库房编号`。
|
||||||
|
|
||||||
|
### 4.2 库位主表
|
||||||
|
|
||||||
|
表名:`仓储管理_库位主表`
|
||||||
|
|
||||||
|
| 字段名 | 类型 | 必填 | 说明 |
|
||||||
|
| --- | --- | --- | --- |
|
||||||
|
| 库位流水号 | int identity | 是 | 主键 |
|
||||||
|
| 库房流水号 | int | 是 | 外键,关联库房 |
|
||||||
|
| 库位编号 | nvarchar(50) | 是 | 同一库房下唯一 |
|
||||||
|
| 库位名称 | nvarchar(100) | 是 | 页面显示名称 |
|
||||||
|
| 库区 | nvarchar(50) | 否 | 如 A 区、B 区 |
|
||||||
|
| 货架 | nvarchar(50) | 否 | 货架编号 |
|
||||||
|
| 层号 | nvarchar(50) | 否 | 货架层号 |
|
||||||
|
| 容量 | decimal(18,4) | 否 | 可选容量 |
|
||||||
|
| 容量单位 | nvarchar(20) | 否 | 件、箱、kg 等 |
|
||||||
|
| 是否允许混放 | bit | 是 | 默认 1 |
|
||||||
|
| 是否启用 | bit | 是 | 默认 1 |
|
||||||
|
| 备注 | nvarchar(500) | 否 | 备注 |
|
||||||
|
| 创建人 | int | 是 | UserID |
|
||||||
|
| 创建时间 | datetime | 是 | 默认 GETDATE() |
|
||||||
|
| 修改人 | int | 否 | UserID |
|
||||||
|
| 修改时间 | datetime | 否 | 修改时间 |
|
||||||
|
|
||||||
|
主键:`PK_仓储管理_库位主表`,字段 `库位流水号`。
|
||||||
|
|
||||||
|
外键:`FK_仓储管理_库位主表_库房`,`库房流水号` 关联 `仓储管理_库房主表.库房流水号`。
|
||||||
|
|
||||||
|
唯一约束:`UK_仓储管理_库位主表_库房库位编号`,字段 `库房流水号、库位编号`。
|
||||||
|
|
||||||
|
### 4.3 库存现存量表
|
||||||
|
|
||||||
|
表名:`仓储管理_库存现存量`
|
||||||
|
|
||||||
|
| 字段名 | 类型 | 必填 | 说明 |
|
||||||
|
| --- | --- | --- | --- |
|
||||||
|
| 库存流水号 | bigint identity | 是 | 主键 |
|
||||||
|
| 物料流水号 | int | 是 | 关联物料主文件 |
|
||||||
|
| 物料编码 | nvarchar(100) | 否 | 冗余字段,便于查询 |
|
||||||
|
| 物料名称 | nvarchar(200) | 是 | 冗余字段 |
|
||||||
|
| 图号或型号 | nvarchar(200) | 否 | 冗余字段 |
|
||||||
|
| 规格 | nvarchar(200) | 否 | 冗余字段 |
|
||||||
|
| 单位 | nvarchar(50) | 否 | 冗余字段 |
|
||||||
|
| 库房流水号 | int | 是 | 外键,关联库房 |
|
||||||
|
| 库位流水号 | int | 是 | 外键,关联库位 |
|
||||||
|
| 批次编号 | nvarchar(100) | 否 | 有批次管理时必填 |
|
||||||
|
| 库存数量 | decimal(18,4) | 是 | 当前库存数量 |
|
||||||
|
| 冻结数量 | decimal(18,4) | 是 | 默认 0 |
|
||||||
|
| 可用数量 | AS | 否 | 建议计算列:库存数量 - 冻结数量 |
|
||||||
|
| 最后入库时间 | datetime | 否 | 最近入库时间 |
|
||||||
|
| 最后出库时间 | datetime | 否 | 最近出库时间 |
|
||||||
|
| 最后变动时间 | datetime | 是 | 最近库存变化时间 |
|
||||||
|
| 状态 | nvarchar(20) | 是 | 正常、冻结、停用 |
|
||||||
|
| 创建人 | int | 是 | UserID |
|
||||||
|
| 创建时间 | datetime | 是 | 默认 GETDATE() |
|
||||||
|
| 修改人 | int | 否 | UserID |
|
||||||
|
| 修改时间 | datetime | 否 | 修改时间 |
|
||||||
|
|
||||||
|
主键:`PK_仓储管理_库存现存量`,字段 `库存流水号`。
|
||||||
|
|
||||||
|
外键:
|
||||||
|
|
||||||
|
| 外键 | 字段 | 关联表 |
|
||||||
|
| --- | --- | --- |
|
||||||
|
| FK_仓储管理_库存现存量_库房 | 库房流水号 | 仓储管理_库房主表.库房流水号 |
|
||||||
|
| FK_仓储管理_库存现存量_库位 | 库位流水号 | 仓储管理_库位主表.库位流水号 |
|
||||||
|
| FK_仓储管理_库存现存量_物料 | 物料流水号 | 库存管理_物料主文件_基本.物料流水号 |
|
||||||
|
|
||||||
|
唯一约束:`UK_仓储管理_库存现存量_物料库位批次`,字段 `物料流水号、库位流水号、批次编号`。如果批次允许为空,需要在存储过程中统一把空批次处理为固定空值,避免 SQL Server 唯一约束对 NULL 的差异影响。
|
||||||
|
|
||||||
|
### 4.4 库存变动流水表
|
||||||
|
|
||||||
|
表名:`仓储管理_库存变动流水`
|
||||||
|
|
||||||
|
| 字段名 | 类型 | 必填 | 说明 |
|
||||||
|
| --- | --- | --- | --- |
|
||||||
|
| 库存变动流水号 | bigint identity | 是 | 主键 |
|
||||||
|
| 库存流水号 | bigint | 否 | 关联库存现存量 |
|
||||||
|
| 业务类型 | nvarchar(50) | 是 | 入库、出库、退库、移库、盘盈、盘亏、调整 |
|
||||||
|
| 业务单号 | nvarchar(100) | 否 | 入库单号、出库单号、盘点单号等 |
|
||||||
|
| 业务主表流水号 | bigint | 否 | 来源主表流水号 |
|
||||||
|
| 业务明细流水号 | bigint | 否 | 来源明细流水号 |
|
||||||
|
| 物料流水号 | int | 是 | 物料 |
|
||||||
|
| 物料编码 | nvarchar(100) | 否 | 冗余 |
|
||||||
|
| 物料名称 | nvarchar(200) | 是 | 冗余 |
|
||||||
|
| 图号或型号 | nvarchar(200) | 否 | 冗余 |
|
||||||
|
| 库房流水号 | int | 是 | 变动发生库房 |
|
||||||
|
| 库位流水号 | int | 是 | 变动发生库位 |
|
||||||
|
| 批次编号 | nvarchar(100) | 否 | 批次 |
|
||||||
|
| 变动前数量 | decimal(18,4) | 是 | 变动前库存 |
|
||||||
|
| 变动数量 | decimal(18,4) | 是 | 入库为正,出库为负 |
|
||||||
|
| 变动后数量 | decimal(18,4) | 是 | 变动后库存 |
|
||||||
|
| 对方库房流水号 | int | 否 | 移库时使用 |
|
||||||
|
| 对方库位流水号 | int | 否 | 移库时使用 |
|
||||||
|
| 操作人 | int | 是 | UserID |
|
||||||
|
| 操作时间 | datetime | 是 | 默认 GETDATE() |
|
||||||
|
| 备注 | nvarchar(500) | 否 | 备注 |
|
||||||
|
|
||||||
|
主键:`PK_仓储管理_库存变动流水`,字段 `库存变动流水号`。
|
||||||
|
|
||||||
|
索引:
|
||||||
|
|
||||||
|
| 索引 | 字段 | 用途 |
|
||||||
|
| --- | --- | --- |
|
||||||
|
| IX_库存变动流水_物料时间 | 物料流水号、操作时间 | 物料追溯 |
|
||||||
|
| IX_库存变动流水_库位时间 | 库位流水号、操作时间 | 库位追溯 |
|
||||||
|
| IX_库存变动流水_业务单据 | 业务类型、业务主表流水号、业务明细流水号 | 单据追溯 |
|
||||||
|
|
||||||
|
### 4.5 入库单主表
|
||||||
|
|
||||||
|
表名:`仓储管理_入库单主表`
|
||||||
|
|
||||||
|
| 字段名 | 类型 | 必填 | 说明 |
|
||||||
|
| --- | --- | --- | --- |
|
||||||
|
| 入库单流水号 | bigint identity | 是 | 主键 |
|
||||||
|
| 入库单号 | nvarchar(100) | 是 | 业务单号 |
|
||||||
|
| 入库类型 | nvarchar(50) | 是 | 采购入库、自制件入库、退料入库、其他入库 |
|
||||||
|
| 来源单号 | nvarchar(100) | 否 | 采购合同、生产任务等 |
|
||||||
|
| 供应商 | nvarchar(200) | 否 | 采购入库时使用 |
|
||||||
|
| 入库人 | int | 是 | UserID |
|
||||||
|
| 入库日期 | datetime | 是 | 入库时间 |
|
||||||
|
| 状态 | nvarchar(20) | 是 | 草稿、已入库、已作废 |
|
||||||
|
| 备注 | nvarchar(500) | 否 | 备注 |
|
||||||
|
| 创建人 | int | 是 | UserID |
|
||||||
|
| 创建时间 | datetime | 是 | 默认 GETDATE() |
|
||||||
|
| 修改人 | int | 否 | UserID |
|
||||||
|
| 修改时间 | datetime | 否 | 修改时间 |
|
||||||
|
|
||||||
|
主键:`PK_仓储管理_入库单主表`。
|
||||||
|
|
||||||
|
唯一约束:`UK_仓储管理_入库单主表_入库单号`。
|
||||||
|
|
||||||
|
### 4.6 入库单明细表
|
||||||
|
|
||||||
|
表名:`仓储管理_入库单明细表`
|
||||||
|
|
||||||
|
| 字段名 | 类型 | 必填 | 说明 |
|
||||||
|
| --- | --- | --- | --- |
|
||||||
|
| 入库明细流水号 | bigint identity | 是 | 主键 |
|
||||||
|
| 入库单流水号 | bigint | 是 | 外键,关联入库主表 |
|
||||||
|
| 物料流水号 | int | 是 | 物料 |
|
||||||
|
| 物料编码 | nvarchar(100) | 否 | 冗余 |
|
||||||
|
| 物料名称 | nvarchar(200) | 是 | 冗余 |
|
||||||
|
| 图号或型号 | nvarchar(200) | 否 | 冗余 |
|
||||||
|
| 规格 | nvarchar(200) | 否 | 冗余 |
|
||||||
|
| 单位 | nvarchar(50) | 否 | 冗余 |
|
||||||
|
| 库房流水号 | int | 是 | 入库库房 |
|
||||||
|
| 库位流水号 | int | 是 | 入库库位 |
|
||||||
|
| 批次编号 | nvarchar(100) | 否 | 批次 |
|
||||||
|
| 入库数量 | decimal(18,4) | 是 | 入库数量 |
|
||||||
|
| 来源明细流水号 | bigint | 否 | 来源明细 |
|
||||||
|
| 备注 | nvarchar(500) | 否 | 备注 |
|
||||||
|
|
||||||
|
主键:`PK_仓储管理_入库单明细表`。
|
||||||
|
|
||||||
|
外键:
|
||||||
|
|
||||||
|
| 外键 | 字段 | 关联表 |
|
||||||
|
| --- | --- | --- |
|
||||||
|
| FK_入库明细_主表 | 入库单流水号 | 仓储管理_入库单主表.入库单流水号 |
|
||||||
|
| FK_入库明细_库房 | 库房流水号 | 仓储管理_库房主表.库房流水号 |
|
||||||
|
| FK_入库明细_库位 | 库位流水号 | 仓储管理_库位主表.库位流水号 |
|
||||||
|
|
||||||
|
### 4.7 出库单主表
|
||||||
|
|
||||||
|
表名:`仓储管理_出库单主表`
|
||||||
|
|
||||||
|
| 字段名 | 类型 | 必填 | 说明 |
|
||||||
|
| --- | --- | --- | --- |
|
||||||
|
| 出库单流水号 | bigint identity | 是 | 主键 |
|
||||||
|
| 出库单号 | nvarchar(100) | 是 | 业务单号 |
|
||||||
|
| 出库类型 | nvarchar(50) | 是 | 领料出库、生产出库、销售出库、其他出库 |
|
||||||
|
| 来源单号 | nvarchar(100) | 否 | 领料单、销售单等 |
|
||||||
|
| 领用部门 | nvarchar(100) | 否 | 领用部门 |
|
||||||
|
| 领用人 | nvarchar(100) | 否 | 领用人 |
|
||||||
|
| 出库人 | int | 是 | UserID |
|
||||||
|
| 出库日期 | datetime | 是 | 出库时间 |
|
||||||
|
| 状态 | nvarchar(20) | 是 | 草稿、已出库、已作废 |
|
||||||
|
| 备注 | nvarchar(500) | 否 | 备注 |
|
||||||
|
| 创建人 | int | 是 | UserID |
|
||||||
|
| 创建时间 | datetime | 是 | 默认 GETDATE() |
|
||||||
|
| 修改人 | int | 否 | UserID |
|
||||||
|
| 修改时间 | datetime | 否 | 修改时间 |
|
||||||
|
|
||||||
|
主键:`PK_仓储管理_出库单主表`。
|
||||||
|
|
||||||
|
唯一约束:`UK_仓储管理_出库单主表_出库单号`。
|
||||||
|
|
||||||
|
### 4.8 出库单明细表
|
||||||
|
|
||||||
|
表名:`仓储管理_出库单明细表`
|
||||||
|
|
||||||
|
| 字段名 | 类型 | 必填 | 说明 |
|
||||||
|
| --- | --- | --- | --- |
|
||||||
|
| 出库明细流水号 | bigint identity | 是 | 主键 |
|
||||||
|
| 出库单流水号 | bigint | 是 | 外键,关联出库主表 |
|
||||||
|
| 物料流水号 | int | 是 | 物料 |
|
||||||
|
| 物料编码 | nvarchar(100) | 否 | 冗余 |
|
||||||
|
| 物料名称 | nvarchar(200) | 是 | 冗余 |
|
||||||
|
| 图号或型号 | nvarchar(200) | 否 | 冗余 |
|
||||||
|
| 规格 | nvarchar(200) | 否 | 冗余 |
|
||||||
|
| 单位 | nvarchar(50) | 否 | 冗余 |
|
||||||
|
| 库房流水号 | int | 是 | 出库库房 |
|
||||||
|
| 库位流水号 | int | 是 | 出库库位 |
|
||||||
|
| 批次编号 | nvarchar(100) | 否 | 批次 |
|
||||||
|
| 出库数量 | decimal(18,4) | 是 | 出库数量 |
|
||||||
|
| 来源明细流水号 | bigint | 否 | 来源明细 |
|
||||||
|
| 备注 | nvarchar(500) | 否 | 备注 |
|
||||||
|
|
||||||
|
主键:`PK_仓储管理_出库单明细表`。
|
||||||
|
|
||||||
|
外键:
|
||||||
|
|
||||||
|
| 外键 | 字段 | 关联表 |
|
||||||
|
| --- | --- | --- |
|
||||||
|
| FK_出库明细_主表 | 出库单流水号 | 仓储管理_出库单主表.出库单流水号 |
|
||||||
|
| FK_出库明细_库房 | 库房流水号 | 仓储管理_库房主表.库房流水号 |
|
||||||
|
| FK_出库明细_库位 | 库位流水号 | 仓储管理_库位主表.库位流水号 |
|
||||||
|
|
||||||
|
### 4.9 移库单主表
|
||||||
|
|
||||||
|
表名:`仓储管理_移库单主表`
|
||||||
|
|
||||||
|
| 字段名 | 类型 | 必填 | 说明 |
|
||||||
|
| --- | --- | --- | --- |
|
||||||
|
| 移库单流水号 | bigint identity | 是 | 主键 |
|
||||||
|
| 移库单号 | nvarchar(100) | 是 | 业务单号 |
|
||||||
|
| 移库类型 | nvarchar(50) | 是 | 同库移位、跨库调拨 |
|
||||||
|
| 移库人 | int | 是 | UserID |
|
||||||
|
| 移库日期 | datetime | 是 | 移库时间 |
|
||||||
|
| 状态 | nvarchar(20) | 是 | 草稿、已移库、已作废 |
|
||||||
|
| 备注 | nvarchar(500) | 否 | 备注 |
|
||||||
|
| 创建人 | int | 是 | UserID |
|
||||||
|
| 创建时间 | datetime | 是 | 默认 GETDATE() |
|
||||||
|
| 修改人 | int | 否 | UserID |
|
||||||
|
| 修改时间 | datetime | 否 | 修改时间 |
|
||||||
|
|
||||||
|
### 4.10 移库单明细表
|
||||||
|
|
||||||
|
表名:`仓储管理_移库单明细表`
|
||||||
|
|
||||||
|
| 字段名 | 类型 | 必填 | 说明 |
|
||||||
|
| --- | --- | --- | --- |
|
||||||
|
| 移库明细流水号 | bigint identity | 是 | 主键 |
|
||||||
|
| 移库单流水号 | bigint | 是 | 外键,关联移库主表 |
|
||||||
|
| 物料流水号 | int | 是 | 物料 |
|
||||||
|
| 批次编号 | nvarchar(100) | 否 | 批次 |
|
||||||
|
| 原库房流水号 | int | 是 | 原库房 |
|
||||||
|
| 原库位流水号 | int | 是 | 原库位 |
|
||||||
|
| 目标库房流水号 | int | 是 | 目标库房 |
|
||||||
|
| 目标库位流水号 | int | 是 | 目标库位 |
|
||||||
|
| 移库数量 | decimal(18,4) | 是 | 移库数量 |
|
||||||
|
| 备注 | nvarchar(500) | 否 | 备注 |
|
||||||
|
|
||||||
|
### 4.11 盘点单主表
|
||||||
|
|
||||||
|
表名:`仓储管理_盘点单主表`
|
||||||
|
|
||||||
|
| 字段名 | 类型 | 必填 | 说明 |
|
||||||
|
| --- | --- | --- | --- |
|
||||||
|
| 盘点单流水号 | bigint identity | 是 | 主键 |
|
||||||
|
| 盘点单号 | nvarchar(100) | 是 | 业务单号 |
|
||||||
|
| 盘点名称 | nvarchar(200) | 是 | 盘点任务名称 |
|
||||||
|
| 盘点范围 | nvarchar(50) | 是 | 全库、库房、库位、物料 |
|
||||||
|
| 库房流水号 | int | 否 | 按库房盘点时使用 |
|
||||||
|
| 开始时间 | datetime | 否 | 开始时间 |
|
||||||
|
| 结束时间 | datetime | 否 | 结束时间 |
|
||||||
|
| 状态 | nvarchar(20) | 是 | 草稿、盘点中、待确认、已确认、已作废 |
|
||||||
|
| 创建人 | int | 是 | UserID |
|
||||||
|
| 创建时间 | datetime | 是 | 默认 GETDATE() |
|
||||||
|
| 确认人 | int | 否 | UserID |
|
||||||
|
| 确认时间 | datetime | 否 | 确认时间 |
|
||||||
|
| 备注 | nvarchar(500) | 否 | 备注 |
|
||||||
|
|
||||||
|
### 4.12 盘点单明细表
|
||||||
|
|
||||||
|
表名:`仓储管理_盘点单明细表`
|
||||||
|
|
||||||
|
| 字段名 | 类型 | 必填 | 说明 |
|
||||||
|
| --- | --- | --- | --- |
|
||||||
|
| 盘点明细流水号 | bigint identity | 是 | 主键 |
|
||||||
|
| 盘点单流水号 | bigint | 是 | 外键,关联盘点主表 |
|
||||||
|
| 库存流水号 | bigint | 否 | 来源库存记录 |
|
||||||
|
| 物料流水号 | int | 是 | 物料 |
|
||||||
|
| 物料编码 | nvarchar(100) | 否 | 冗余 |
|
||||||
|
| 物料名称 | nvarchar(200) | 是 | 冗余 |
|
||||||
|
| 图号或型号 | nvarchar(200) | 否 | 冗余 |
|
||||||
|
| 库房流水号 | int | 是 | 库房 |
|
||||||
|
| 库位流水号 | int | 是 | 库位 |
|
||||||
|
| 批次编号 | nvarchar(100) | 否 | 批次 |
|
||||||
|
| 账面数量 | decimal(18,4) | 是 | 生成盘点时库存数量 |
|
||||||
|
| 实盘数量 | decimal(18,4) | 否 | 盘点录入数量 |
|
||||||
|
| 差异数量 | decimal(18,4) | 否 | 实盘 - 账面 |
|
||||||
|
| 差异原因 | nvarchar(500) | 否 | 差异说明 |
|
||||||
|
| 处理方式 | nvarchar(50) | 否 | 盘盈、盘亏、不调整 |
|
||||||
|
| 是否已确认 | bit | 是 | 默认 0 |
|
||||||
|
| 备注 | nvarchar(500) | 否 | 备注 |
|
||||||
|
|
||||||
|
## 5. 表关系设计
|
||||||
|
|
||||||
|
```mermaid
|
||||||
|
erDiagram
|
||||||
|
仓储管理_库房主表 ||--o{ 仓储管理_库位主表 : 包含
|
||||||
|
仓储管理_库房主表 ||--o{ 仓储管理_库存现存量 : 拥有
|
||||||
|
仓储管理_库位主表 ||--o{ 仓储管理_库存现存量 : 存放
|
||||||
|
库存管理_物料主文件_基本 ||--o{ 仓储管理_库存现存量 : 对应
|
||||||
|
仓储管理_入库单主表 ||--o{ 仓储管理_入库单明细表 : 包含
|
||||||
|
仓储管理_出库单主表 ||--o{ 仓储管理_出库单明细表 : 包含
|
||||||
|
仓储管理_移库单主表 ||--o{ 仓储管理_移库单明细表 : 包含
|
||||||
|
仓储管理_盘点单主表 ||--o{ 仓储管理_盘点单明细表 : 包含
|
||||||
|
仓储管理_库存现存量 ||--o{ 仓储管理_库存变动流水 : 产生
|
||||||
|
```
|
||||||
|
|
||||||
|
关系说明:
|
||||||
|
|
||||||
|
| 关系 | 说明 |
|
||||||
|
| --- | --- |
|
||||||
|
| 一个库房有多个库位 | `仓储管理_库位主表.库房流水号` 指向库房 |
|
||||||
|
| 一个库位可放多个物料 | 通过 `仓储管理_库存现存量` 表体现 |
|
||||||
|
| 一个物料可在多个库位 | 通过 `仓储管理_库存现存量` 表体现 |
|
||||||
|
| 入库、出库、移库、盘点都写流水 | `仓储管理_库存变动流水` 记录库存变化来源 |
|
||||||
|
| 查询库存以现存量为准 | 综合查询不直接汇总单据,默认读取库存现存量 |
|
||||||
|
| 追溯库存以流水为准 | 查原因时读取库存变动流水和来源单据 |
|
||||||
|
|
||||||
|
## 6. 库存处理存储过程设计
|
||||||
|
|
||||||
|
### 6.1 公共库存增加过程
|
||||||
|
|
||||||
|
建议新增公共过程:`仓储管理_库存_增加`
|
||||||
|
|
||||||
|
入参:
|
||||||
|
|
||||||
|
| 参数 | 说明 |
|
||||||
|
| --- | --- |
|
||||||
|
| 物料流水号 | 物料 |
|
||||||
|
| 库房流水号 | 库房 |
|
||||||
|
| 库位流水号 | 库位 |
|
||||||
|
| 批次编号 | 批次 |
|
||||||
|
| 数量 | 增加数量 |
|
||||||
|
| 业务类型 | 入库、退料、盘盈、移入 |
|
||||||
|
| 业务单号 | 来源单号 |
|
||||||
|
| 业务主表流水号 | 来源主表 |
|
||||||
|
| 业务明细流水号 | 来源明细 |
|
||||||
|
| 操作人 | UserID |
|
||||||
|
| 备注 | 备注 |
|
||||||
|
|
||||||
|
处理规则:
|
||||||
|
|
||||||
|
1. 在事务内锁定 `仓储管理_库存现存量` 的对应物料、库位、批次记录。
|
||||||
|
2. 存在则更新 `库存数量 = 库存数量 + 数量`。
|
||||||
|
3. 不存在则新增库存记录。
|
||||||
|
4. 写入库存变动流水。
|
||||||
|
5. 返回库存流水号和变动后数量。
|
||||||
|
|
||||||
|
### 6.2 公共库存扣减过程
|
||||||
|
|
||||||
|
建议新增公共过程:`仓储管理_库存_扣减`
|
||||||
|
|
||||||
|
处理规则:
|
||||||
|
|
||||||
|
1. 在事务内锁定对应库存记录。
|
||||||
|
2. 校验库存记录存在。
|
||||||
|
3. 校验 `库存数量 - 冻结数量 >= 数量`。
|
||||||
|
4. 更新 `库存数量 = 库存数量 - 数量`。
|
||||||
|
5. 写入库存变动流水,`变动数量 = -数量`。
|
||||||
|
6. 返回库存流水号和变动后数量。
|
||||||
|
|
||||||
|
### 6.3 公共库存移库过程
|
||||||
|
|
||||||
|
建议新增公共过程:`仓储管理_库存_移库`
|
||||||
|
|
||||||
|
处理规则:
|
||||||
|
|
||||||
|
1. 开启事务。
|
||||||
|
2. 调用或复用扣减逻辑扣减原库位库存。
|
||||||
|
3. 调用或复用增加逻辑增加目标库位库存。
|
||||||
|
4. 写入移库单和移库明细。
|
||||||
|
5. 写入库存变动流水。
|
||||||
|
6. 提交事务。
|
||||||
|
|
||||||
|
注意:扣减和增加必须在同一个事务内完成,不能由前端拆成两个请求。
|
||||||
|
|
||||||
|
### 6.4 公共盘点确认过程
|
||||||
|
|
||||||
|
建议新增公共过程:`仓储管理_库存盘点_确认`
|
||||||
|
|
||||||
|
处理规则:
|
||||||
|
|
||||||
|
1. 校验盘点单状态为待确认。
|
||||||
|
2. 遍历盘点明细。
|
||||||
|
3. 差异数量为 0 的明细只标记确认。
|
||||||
|
4. 差异数量大于 0 的明细调用库存增加逻辑,业务类型为“盘盈”。
|
||||||
|
5. 差异数量小于 0 的明细调用库存扣减逻辑,业务类型为“盘亏”。
|
||||||
|
6. 明细全部处理完成后,盘点单状态改为已确认。
|
||||||
|
|
||||||
|
## 7. 前端页面设计
|
||||||
|
|
||||||
|
### 7.1 库房管理页面
|
||||||
|
|
||||||
|
建议路径:`src/views/WarehouseManagement/Warehouse/index.vue`
|
||||||
|
|
||||||
|
页面结构:
|
||||||
|
|
||||||
|
1. 搜索栏:库房编号、库房名称、库房类型、是否启用。
|
||||||
|
2. 表格:库房编号、库房名称、库房类型、地址、负责人、是否启用、备注。
|
||||||
|
3. 操作:新增、编辑、停用、查看库位。
|
||||||
|
|
||||||
|
接口名称建议:
|
||||||
|
|
||||||
|
| 操作 | name |
|
||||||
|
| --- | --- |
|
||||||
|
| 查询 | 仓储管理_库房_查询 |
|
||||||
|
| 新增 | 仓储管理_库房_增加 |
|
||||||
|
| 编辑 | 仓储管理_库房_编辑 |
|
||||||
|
| 停用 | 仓储管理_库房_停用 |
|
||||||
|
|
||||||
|
### 7.2 库位管理页面
|
||||||
|
|
||||||
|
建议优先复用或改造现有 `src/views/WarehouseManagement/LocationManagement`。
|
||||||
|
|
||||||
|
页面结构:
|
||||||
|
|
||||||
|
1. 搜索栏:库房、库区、库位编号、库位名称、是否启用。
|
||||||
|
2. 表格:库房名称、库位编号、库位名称、库区、货架、层号、容量、是否允许混放、是否启用。
|
||||||
|
3. 操作:新增、编辑、停用、查看物料。
|
||||||
|
|
||||||
|
接口名称建议:
|
||||||
|
|
||||||
|
| 操作 | name |
|
||||||
|
| --- | --- |
|
||||||
|
| 查询 | 仓储管理_库位_查询 |
|
||||||
|
| 新增 | 仓储管理_库位_增加 |
|
||||||
|
| 编辑 | 仓储管理_库位_编辑 |
|
||||||
|
| 停用 | 仓储管理_库位_停用 |
|
||||||
|
| 查询库位物料 | 仓储管理_库位_物料明细_查询 |
|
||||||
|
|
||||||
|
### 7.3 物料入库页面
|
||||||
|
|
||||||
|
建议优先兼容现有 `src/views/WarehouseManagement/PurchasePartsStorage`、`Inboundscanning`、`WarehousingRecord` 等入库入口。
|
||||||
|
|
||||||
|
页面要求:
|
||||||
|
|
||||||
|
1. 入库时必须选择库房和库位。
|
||||||
|
2. 优先显示该物料已有库存库位。
|
||||||
|
3. 没有已有库存库位时显示全部启用库位。
|
||||||
|
4. 提交时传入 `库房流水号`、`库位流水号`、`物料流水号`、`入库数量`。
|
||||||
|
5. 后端必须通过公共库存增加过程维护库存。
|
||||||
|
|
||||||
|
### 7.4 物料出库页面
|
||||||
|
|
||||||
|
建议路径可结合现有领料和出库页面,例如 `MaterialRequisition`、`OutboundDetails`。
|
||||||
|
|
||||||
|
页面要求:
|
||||||
|
|
||||||
|
1. 选择物料后展示该物料所有可用库存库位。
|
||||||
|
2. 用户选择具体库位和出库数量。
|
||||||
|
3. 页面校验数量,但最终以数据库事务校验为准。
|
||||||
|
4. 出库成功后刷新物料库位库存。
|
||||||
|
|
||||||
|
### 7.5 物料盘点页面
|
||||||
|
|
||||||
|
建议优先改造现有 `src/views/WarehouseManagement/InventoryCheck/index.vue`。
|
||||||
|
|
||||||
|
页面功能:
|
||||||
|
|
||||||
|
1. 创建盘点单。
|
||||||
|
2. 生成盘点明细。
|
||||||
|
3. 按库房、库位、物料录入实盘数量。
|
||||||
|
4. 显示账面数量、实盘数量、差异数量。
|
||||||
|
5. 差异确认后更新库存。
|
||||||
|
6. 支持导出盘点表。
|
||||||
|
|
||||||
|
### 7.6 物料综合查询页面
|
||||||
|
|
||||||
|
建议优先改造现有 `src/views/WarehouseManagement/InventoryQuery/index.vue`。
|
||||||
|
|
||||||
|
页面功能:
|
||||||
|
|
||||||
|
1. 主表按物料聚合显示总库存。
|
||||||
|
2. 主库位显示库存数量最大的库位。
|
||||||
|
3. 点击主库位弹出库位明细。
|
||||||
|
4. 点击物料编码弹出库存流水。
|
||||||
|
5. 支持正向查询和逆向查询切换。
|
||||||
|
|
||||||
|
## 8. 查询 SQL 设计思路
|
||||||
|
|
||||||
|
### 8.1 物料正向查询
|
||||||
|
|
||||||
|
```sql
|
||||||
|
SELECT
|
||||||
|
k.物料流水号,
|
||||||
|
k.物料编码,
|
||||||
|
k.物料名称,
|
||||||
|
k.图号或型号,
|
||||||
|
k.规格,
|
||||||
|
f.库房编号,
|
||||||
|
f.库房名称,
|
||||||
|
w.库位编号,
|
||||||
|
w.库位名称,
|
||||||
|
k.批次编号,
|
||||||
|
k.库存数量,
|
||||||
|
k.冻结数量,
|
||||||
|
k.最后变动时间
|
||||||
|
FROM 仓储管理_库存现存量 k
|
||||||
|
LEFT JOIN 仓储管理_库房主表 f ON k.库房流水号 = f.库房流水号
|
||||||
|
LEFT JOIN 仓储管理_库位主表 w ON k.库位流水号 = w.库位流水号
|
||||||
|
WHERE ISNULL(k.库存数量, 0) > 0
|
||||||
|
AND (@物料流水号 IS NULL OR k.物料流水号 = @物料流水号)
|
||||||
|
ORDER BY f.库房编号, w.库位编号;
|
||||||
|
```
|
||||||
|
|
||||||
|
### 8.2 库位逆向查询
|
||||||
|
|
||||||
|
```sql
|
||||||
|
SELECT
|
||||||
|
f.库房编号,
|
||||||
|
f.库房名称,
|
||||||
|
w.库位编号,
|
||||||
|
w.库位名称,
|
||||||
|
k.物料流水号,
|
||||||
|
k.物料编码,
|
||||||
|
k.物料名称,
|
||||||
|
k.图号或型号,
|
||||||
|
k.规格,
|
||||||
|
k.批次编号,
|
||||||
|
k.库存数量,
|
||||||
|
k.最后变动时间
|
||||||
|
FROM 仓储管理_库存现存量 k
|
||||||
|
LEFT JOIN 仓储管理_库房主表 f ON k.库房流水号 = f.库房流水号
|
||||||
|
LEFT JOIN 仓储管理_库位主表 w ON k.库位流水号 = w.库位流水号
|
||||||
|
WHERE ISNULL(k.库存数量, 0) > 0
|
||||||
|
AND k.库位流水号 = @库位流水号
|
||||||
|
ORDER BY k.物料编码, k.物料名称;
|
||||||
|
```
|
||||||
|
|
||||||
|
### 8.3 物料综合查询
|
||||||
|
|
||||||
|
```sql
|
||||||
|
WITH 汇总 AS (
|
||||||
|
SELECT
|
||||||
|
物料流水号,
|
||||||
|
MAX(物料编码) AS 物料编码,
|
||||||
|
MAX(物料名称) AS 物料名称,
|
||||||
|
MAX(图号或型号) AS 图号或型号,
|
||||||
|
MAX(规格) AS 规格,
|
||||||
|
SUM(ISNULL(库存数量, 0)) AS 总库存
|
||||||
|
FROM 仓储管理_库存现存量
|
||||||
|
WHERE ISNULL(库存数量, 0) > 0
|
||||||
|
GROUP BY 物料流水号
|
||||||
|
),
|
||||||
|
主库位 AS (
|
||||||
|
SELECT
|
||||||
|
k.物料流水号,
|
||||||
|
f.库房名称,
|
||||||
|
w.库位名称,
|
||||||
|
k.库存数量,
|
||||||
|
ROW_NUMBER() OVER (
|
||||||
|
PARTITION BY k.物料流水号
|
||||||
|
ORDER BY ISNULL(k.库存数量, 0) DESC, k.库位流水号 ASC
|
||||||
|
) AS 排名
|
||||||
|
FROM 仓储管理_库存现存量 k
|
||||||
|
LEFT JOIN 仓储管理_库房主表 f ON k.库房流水号 = f.库房流水号
|
||||||
|
LEFT JOIN 仓储管理_库位主表 w ON k.库位流水号 = w.库位流水号
|
||||||
|
WHERE ISNULL(k.库存数量, 0) > 0
|
||||||
|
)
|
||||||
|
SELECT
|
||||||
|
h.物料流水号,
|
||||||
|
h.物料编码,
|
||||||
|
h.物料名称,
|
||||||
|
h.图号或型号,
|
||||||
|
h.规格,
|
||||||
|
h.总库存,
|
||||||
|
z.库房名称 AS 主库房名称,
|
||||||
|
z.库位名称 AS 主库位名称,
|
||||||
|
z.库存数量 AS 主库位库存
|
||||||
|
FROM 汇总 h
|
||||||
|
LEFT JOIN 主库位 z ON h.物料流水号 = z.物料流水号 AND z.排名 = 1;
|
||||||
|
```
|
||||||
|
|
||||||
|
## 9. 实施步骤
|
||||||
|
|
||||||
|
### 9.1 第一阶段:数据库方案落地
|
||||||
|
|
||||||
|
1. 核对现有表:库房、货位、物料与货位对照、入库记录、出库记录、库存盘点。
|
||||||
|
2. 确认哪些表复用,哪些表新增。
|
||||||
|
3. 建立或补齐主外键关系。
|
||||||
|
4. 建立库存现存量唯一约束。
|
||||||
|
5. 建立库存变动流水表。
|
||||||
|
6. 编写公共库存增加、扣减、移库、盘点确认存储过程。
|
||||||
|
7. 在测试库 `ERPTOOL_JY_20250826Back` 编译并验证。
|
||||||
|
|
||||||
|
### 9.2 第二阶段:入库和出库闭环
|
||||||
|
|
||||||
|
1. 改造入库接口,提交时必须传库房和库位。
|
||||||
|
2. 入库接口调用公共库存增加过程。
|
||||||
|
3. 改造出库接口,出库时必须指定库存现存量或库位。
|
||||||
|
4. 出库接口调用公共库存扣减过程。
|
||||||
|
5. 验证同一物料多库位、多批次场景。
|
||||||
|
|
||||||
|
### 9.3 第三阶段:盘点闭环
|
||||||
|
|
||||||
|
1. 盘点页面支持生成盘点单。
|
||||||
|
2. 盘点明细记录账面数量。
|
||||||
|
3. 支持录入实盘数量和差异原因。
|
||||||
|
4. 确认盘点时调用盘点确认过程。
|
||||||
|
5. 验证盘盈、盘亏、无差异三类场景。
|
||||||
|
|
||||||
|
### 9.4 第四阶段:综合查询闭环
|
||||||
|
|
||||||
|
1. 新增物料综合查询接口。
|
||||||
|
2. 新增物料库位明细查询接口。
|
||||||
|
3. 新增库位物料明细查询接口。
|
||||||
|
4. 前端支持正向查询和逆向查询。
|
||||||
|
5. 前端支持点击主库位查看全部库位库存。
|
||||||
|
6. 前端支持点击物料查看库存变动流水。
|
||||||
|
|
||||||
|
### 9.5 第五阶段:历史数据整理
|
||||||
|
|
||||||
|
1. 从现有 `库存管理_物料与货位对照表` 或相近库存表迁移当前库存。
|
||||||
|
2. 迁移时必须保留物料、货位、库存数量、批次等关键字段。
|
||||||
|
3. 对没有库房归属的货位先补齐库房。
|
||||||
|
4. 对重复物料库位批次记录进行合并。
|
||||||
|
5. 迁移后核对物料总库存和原库存查询结果是否一致。
|
||||||
|
6. 历史 0 库存记录可暂不迁移,后续按盘点结果清理。
|
||||||
|
|
||||||
|
## 10. 验收标准
|
||||||
|
|
||||||
|
| 验收项 | 标准 |
|
||||||
|
| --- | --- |
|
||||||
|
| 库房管理 | 可新增、编辑、停用库房 |
|
||||||
|
| 库位管理 | 库位必须归属库房,同一库房库位编号不可重复 |
|
||||||
|
| 入库 | 入库后指定库位库存增加,并生成库存流水 |
|
||||||
|
| 出库 | 出库后指定库位库存减少,并生成库存流水 |
|
||||||
|
| 库存不足 | 出库、移库、盘亏时库存不足必须阻止提交 |
|
||||||
|
| 移库 | 原库位减少,目标库位增加,事务一致 |
|
||||||
|
| 盘点 | 差异确认后库存正确增减 |
|
||||||
|
| 正向查询 | 可查询某物料在哪些库位 |
|
||||||
|
| 逆向查询 | 可查询某库位有哪些物料 |
|
||||||
|
| 综合查询 | 总库存等于所有库位库存合计 |
|
||||||
|
| 追溯 | 每一次库存变化都能查到来源单据和操作人 |
|
||||||
|
|
||||||
|
## 11. 风险与控制
|
||||||
|
|
||||||
|
| 风险 | 控制措施 |
|
||||||
|
| --- | --- |
|
||||||
|
| 多人同时出库导致负库存 | 数据库事务内加锁并重新校验库存 |
|
||||||
|
| 前端拆分请求导致只扣不加 | 移库、盘点确认必须由后端单事务完成 |
|
||||||
|
| 历史库存和新库存表不一致 | 迁移前备份,迁移后做总量对账 |
|
||||||
|
| 库位停用后仍被选择 | 所有业务查询默认只返回启用库位 |
|
||||||
|
| 物料多库位导致扣错库存 | 出库必须指定库位或库存流水号 |
|
||||||
|
| 批次为空导致唯一约束失效 | 存储过程统一处理空批次 |
|
||||||
|
|
||||||
|
## 12. 推荐开发顺序
|
||||||
|
|
||||||
|
1. 先建立库房、库位、库存现存量、库存变动流水四张核心表。
|
||||||
|
2. 再做公共库存增加和扣减过程。
|
||||||
|
3. 再把入库和出库接入公共库存过程。
|
||||||
|
4. 再做移库和盘点。
|
||||||
|
5. 最后做综合查询、正向查询、逆向查询和报表优化。
|
||||||
|
|
||||||
|
这样做的原因是:只要库存现存量和库存变动流水先稳定,后续所有业务都只是围绕“增加、扣减、移动、调整”四类库存动作扩展,业务链路会更稳。
|
||||||
|
|
||||||
|
## 13. 后续开发对象清单
|
||||||
|
|
||||||
|
### 13.1 SQL 脚本
|
||||||
|
|
||||||
|
建议新增:
|
||||||
|
|
||||||
|
```text
|
||||||
|
sql/仓储管理_库房库位库存基础表.sql
|
||||||
|
sql/仓储管理_库存公共过程.sql
|
||||||
|
sql/仓储管理_入库出库接入库存.sql
|
||||||
|
sql/仓储管理_盘点流程.sql
|
||||||
|
sql/仓储管理_库存综合查询.sql
|
||||||
|
```
|
||||||
|
|
||||||
|
### 13.2 前端页面
|
||||||
|
|
||||||
|
建议新增或改造:
|
||||||
|
|
||||||
|
```text
|
||||||
|
src/views/WarehouseManagement/Warehouse/index.vue
|
||||||
|
src/views/WarehouseManagement/LocationManagement/index.vue
|
||||||
|
src/views/WarehouseManagement/InventoryQuery/index.vue
|
||||||
|
src/views/WarehouseManagement/InventoryCheck/index.vue
|
||||||
|
src/views/WarehouseManagement/PurchasePartsStorage/index.vue
|
||||||
|
src/views/WarehouseManagement/OutboundDetails/index.vue
|
||||||
|
```
|
||||||
|
|
||||||
|
### 13.3 后端接口名称
|
||||||
|
|
||||||
|
建议新增:
|
||||||
|
|
||||||
|
```text
|
||||||
|
仓储管理_库房_查询
|
||||||
|
仓储管理_库房_增加
|
||||||
|
仓储管理_库房_编辑
|
||||||
|
仓储管理_库房_停用
|
||||||
|
仓储管理_库位_查询
|
||||||
|
仓储管理_库位_增加
|
||||||
|
仓储管理_库位_编辑
|
||||||
|
仓储管理_库位_停用
|
||||||
|
仓储管理_库存_物料正向查询
|
||||||
|
仓储管理_库存_库位逆向查询
|
||||||
|
仓储管理_库存_综合查询
|
||||||
|
仓储管理_库存_变动流水_查询
|
||||||
|
仓储管理_库存盘点_创建
|
||||||
|
仓储管理_库存盘点_明细_查询
|
||||||
|
仓储管理_库存盘点_实盘_编辑
|
||||||
|
仓储管理_库存盘点_确认
|
||||||
|
```
|
||||||
|
|
||||||
|
修改人:Ld 修改时间:2026-07-28 15:37:19
|
||||||
BIN
docs/库房管理/库房管理方案数据流.docx
Normal file
349
docs/库房管理/库房管理方案数据流.md
Normal file
@@ -0,0 +1,349 @@
|
|||||||
|
# 库房管理方案数据流
|
||||||
|
|
||||||
|
## 1. 数据流总览
|
||||||
|
|
||||||
|
库房管理模块的数据流以 `库存现存量` 为当前结果表,以 `库存变动流水` 为全过程追溯表。所有入库、出库、移库、盘点确认都不能直接只改现存量,必须同步写入业务单据和库存流水。
|
||||||
|
|
||||||
|
```mermaid
|
||||||
|
flowchart LR
|
||||||
|
A["库房主数据"] --> C["库位主数据"]
|
||||||
|
B["物料主文件"] --> D["库存现存量"]
|
||||||
|
C --> D
|
||||||
|
E["入库单"] --> P1["库存增加过程"]
|
||||||
|
F["出库单"] --> P2["库存扣减过程"]
|
||||||
|
G["移库单"] --> P3["库存移库过程"]
|
||||||
|
H["盘点单"] --> P4["盘点确认过程"]
|
||||||
|
P1 --> D
|
||||||
|
P2 --> D
|
||||||
|
P3 --> D
|
||||||
|
P4 --> D
|
||||||
|
P1 --> L["库存变动流水"]
|
||||||
|
P2 --> L
|
||||||
|
P3 --> L
|
||||||
|
P4 --> L
|
||||||
|
D --> Q1["物料综合查询"]
|
||||||
|
D --> Q2["物料正向查询"]
|
||||||
|
D --> Q3["库位逆向查询"]
|
||||||
|
L --> Q4["库存追溯查询"]
|
||||||
|
```
|
||||||
|
|
||||||
|
## 2. 核心数据对象
|
||||||
|
|
||||||
|
| 数据对象 | 数据来源 | 写入时机 | 主要用途 |
|
||||||
|
| --- | --- | --- | --- |
|
||||||
|
| 库房主表 | 库房管理页面 | 新增、编辑库房时 | 定义仓储空间一级单位 |
|
||||||
|
| 库位主表 | 库位管理页面 | 新增、编辑库位时 | 定义物料实际存放位置 |
|
||||||
|
| 物料主文件 | 现有物料维护 | 物料建档时 | 提供物料编码、名称、图号、规格、单位 |
|
||||||
|
| 入库单主表/明细表 | 入库页面 | 入库提交成功时 | 记录入库业务来源 |
|
||||||
|
| 出库单主表/明细表 | 出库页面 | 出库提交成功时 | 记录出库业务来源 |
|
||||||
|
| 移库单主表/明细表 | 移库页面 | 移库提交成功时 | 记录库位之间库存移动 |
|
||||||
|
| 盘点单主表/明细表 | 盘点页面 | 创建盘点、录入实盘、确认盘点时 | 记录账面、实盘和差异 |
|
||||||
|
| 库存现存量 | 公共库存过程 | 入库、出库、移库、盘点确认时 | 查询当前库存结果 |
|
||||||
|
| 库存变动流水 | 公共库存过程 | 每次库存数量变化时 | 追溯库存变化原因 |
|
||||||
|
|
||||||
|
## 3. 主数据流
|
||||||
|
|
||||||
|
主数据先建立库房,再建立库位,物料主文件沿用现有数据。库存业务发生前,库位必须归属一个有效库房。
|
||||||
|
|
||||||
|
```mermaid
|
||||||
|
flowchart TD
|
||||||
|
A["维护库房"] --> B["写入 仓储管理_库房主表"]
|
||||||
|
B --> C["维护库位"]
|
||||||
|
C --> D["写入 仓储管理_库位主表"]
|
||||||
|
E["现有物料维护"] --> F["库存管理_物料主文件_基本"]
|
||||||
|
D --> G["入库/出库/移库/盘点可选择库位"]
|
||||||
|
F --> G
|
||||||
|
```
|
||||||
|
|
||||||
|
数据规则:
|
||||||
|
|
||||||
|
1. `库位主表.库房流水号` 必须关联 `库房主表.库房流水号`。
|
||||||
|
2. 同一库房下 `库位编号` 不允许重复。
|
||||||
|
3. 停用库位不允许在新业务中选择。
|
||||||
|
4. 已有库存的库位不允许直接删除。
|
||||||
|
|
||||||
|
## 4. 入库数据流
|
||||||
|
|
||||||
|
入库数据流从入库页面开始,先形成入库单据,再调用公共库存增加过程,最后更新库存现存量并写流水。
|
||||||
|
|
||||||
|
```mermaid
|
||||||
|
sequenceDiagram
|
||||||
|
participant UI as 入库页面
|
||||||
|
participant API as MESCommonBase.ashx
|
||||||
|
participant SP as 入库存储过程
|
||||||
|
participant ADD as 仓储管理_库存_增加
|
||||||
|
participant STOCK as 库存现存量
|
||||||
|
participant LOG as 库存变动流水
|
||||||
|
|
||||||
|
UI->>API: 提交物料、批次、库房、库位、入库数量
|
||||||
|
API->>SP: name=仓储管理_入库_增加
|
||||||
|
SP->>SP: 写入入库单主表/明细表
|
||||||
|
SP->>ADD: 调用库存增加过程
|
||||||
|
ADD->>STOCK: 存在则累加,不存在则新增
|
||||||
|
ADD->>LOG: 写入变动类型=入库,数量为正数
|
||||||
|
ADD-->>SP: 返回变动后库存
|
||||||
|
SP-->>API: 返回成功
|
||||||
|
API-->>UI: 刷新入库记录和库存查询
|
||||||
|
```
|
||||||
|
|
||||||
|
入库关键字段:
|
||||||
|
|
||||||
|
| 字段 | 去向 |
|
||||||
|
| --- | --- |
|
||||||
|
| 物料流水号 | 入库明细表、库存现存量、库存变动流水 |
|
||||||
|
| 库房流水号 | 入库明细表、库存现存量、库存变动流水 |
|
||||||
|
| 库位流水号 | 入库明细表、库存现存量、库存变动流水 |
|
||||||
|
| 批次编号 | 入库明细表、库存现存量、库存变动流水 |
|
||||||
|
| 入库数量 | 入库明细表,库存流水正数 |
|
||||||
|
| 入库单号 | 入库主表,库存流水业务单号 |
|
||||||
|
|
||||||
|
## 5. 出库数据流
|
||||||
|
|
||||||
|
出库必须先查询可用库存,再指定具体库位扣减。后端以数据库当前库存为准重新校验,不能只相信前端显示数量。
|
||||||
|
|
||||||
|
```mermaid
|
||||||
|
sequenceDiagram
|
||||||
|
participant UI as 出库页面
|
||||||
|
participant QUERY as 可用库存查询
|
||||||
|
participant API as MESCommonBase.ashx
|
||||||
|
participant SP as 出库存储过程
|
||||||
|
participant SUB as 仓储管理_库存_扣减
|
||||||
|
participant STOCK as 库存现存量
|
||||||
|
participant LOG as 库存变动流水
|
||||||
|
|
||||||
|
UI->>QUERY: 按物料查询可用库位库存
|
||||||
|
QUERY-->>UI: 返回库房、库位、批次、可用数量
|
||||||
|
UI->>API: 提交出库库位和出库数量
|
||||||
|
API->>SP: name=仓储管理_出库_增加
|
||||||
|
SP->>SP: 写入出库单主表/明细表
|
||||||
|
SP->>SUB: 调用库存扣减过程
|
||||||
|
SUB->>STOCK: 锁定库存并校验可用数量
|
||||||
|
SUB->>STOCK: 扣减库存数量
|
||||||
|
SUB->>LOG: 写入变动类型=出库,数量为负数
|
||||||
|
SP-->>API: 返回成功或库存不足
|
||||||
|
API-->>UI: 刷新出库记录和库存查询
|
||||||
|
```
|
||||||
|
|
||||||
|
出库控制点:
|
||||||
|
|
||||||
|
1. 出库数量必须大于 0。
|
||||||
|
2. 出库数量不能超过数据库当前可用库存。
|
||||||
|
3. 同一物料多库位时,必须传入 `库位流水号` 或 `库存流水号`。
|
||||||
|
4. 库存扣减后为 0 时,建议保留库存现存量记录,查询默认过滤 0 库存。
|
||||||
|
|
||||||
|
## 6. 移库数据流
|
||||||
|
|
||||||
|
移库是同一事务内完成“原库位扣减”和“目标库位增加”。前端不能拆成两个接口。
|
||||||
|
|
||||||
|
```mermaid
|
||||||
|
flowchart TD
|
||||||
|
A["选择原库存记录"] --> B["输入移库数量"]
|
||||||
|
B --> C["选择目标库房/目标库位"]
|
||||||
|
C --> D["提交移库单"]
|
||||||
|
D --> E["写移库单主表/明细表"]
|
||||||
|
E --> F{"原库位库存是否足够"}
|
||||||
|
F -->|否| X["回滚并提示库存不足"]
|
||||||
|
F -->|是| G["原库位库存减少"]
|
||||||
|
G --> H["目标库位库存增加"]
|
||||||
|
H --> I["写库存流水:移出"]
|
||||||
|
H --> J["写库存流水:移入"]
|
||||||
|
I --> K["提交事务"]
|
||||||
|
J --> K
|
||||||
|
```
|
||||||
|
|
||||||
|
移库流水规则:
|
||||||
|
|
||||||
|
| 流水 | 变动类型 | 库位 | 数量 |
|
||||||
|
| --- | --- | --- | --- |
|
||||||
|
| 第一条 | 移出 | 原库位 | 负数 |
|
||||||
|
| 第二条 | 移入 | 目标库位 | 正数 |
|
||||||
|
|
||||||
|
## 7. 盘点数据流
|
||||||
|
|
||||||
|
盘点分为生成账面、录入实盘、确认差异三段。只有确认差异时才改变库存。
|
||||||
|
|
||||||
|
```mermaid
|
||||||
|
flowchart TD
|
||||||
|
A["创建盘点单"] --> B["按库房/库位/物料范围读取库存现存量"]
|
||||||
|
B --> C["生成盘点明细:记录账面数量"]
|
||||||
|
C --> D["盘点人员录入实盘数量"]
|
||||||
|
D --> E["系统计算差异数量=实盘-账面"]
|
||||||
|
E --> F{"差异是否为0"}
|
||||||
|
F -->|是| G["明细标记无差异"]
|
||||||
|
F -->|否| H["填写差异原因和处理方式"]
|
||||||
|
H --> I["主管确认盘点"]
|
||||||
|
I --> J{"差异方向"}
|
||||||
|
J -->|盘盈| K["调用库存增加过程"]
|
||||||
|
J -->|盘亏| L["调用库存扣减过程"]
|
||||||
|
K --> M["写库存流水"]
|
||||||
|
L --> M
|
||||||
|
G --> N["盘点单已确认"]
|
||||||
|
M --> N
|
||||||
|
```
|
||||||
|
|
||||||
|
盘点数据状态:
|
||||||
|
|
||||||
|
| 阶段 | 写入表 | 是否影响库存 |
|
||||||
|
| --- | --- | --- |
|
||||||
|
| 创建盘点 | 盘点单主表、盘点单明细表 | 否 |
|
||||||
|
| 录入实盘 | 盘点单明细表 | 否 |
|
||||||
|
| 确认盘盈 | 库存现存量、库存变动流水 | 是,增加 |
|
||||||
|
| 确认盘亏 | 库存现存量、库存变动流水 | 是,减少 |
|
||||||
|
|
||||||
|
## 8. 综合查询数据流
|
||||||
|
|
||||||
|
综合查询不从单据实时汇总,而是读取 `库存现存量`,再关联物料、库房、库位,并可继续钻取库存流水。
|
||||||
|
|
||||||
|
```mermaid
|
||||||
|
flowchart LR
|
||||||
|
A["查询条件:物料/库房/库位/是否有库存"] --> B["库存现存量"]
|
||||||
|
B --> C["关联物料主文件"]
|
||||||
|
B --> D["关联库房主表"]
|
||||||
|
B --> E["关联库位主表"]
|
||||||
|
C --> F["按物料汇总总库存"]
|
||||||
|
D --> F
|
||||||
|
E --> F
|
||||||
|
F --> G["取库存最多库位作为主库位"]
|
||||||
|
G --> H["库存综合查询主表"]
|
||||||
|
H --> I["点击主库位:库位明细"]
|
||||||
|
H --> J["点击物料:库存流水"]
|
||||||
|
```
|
||||||
|
|
||||||
|
综合查询输出:
|
||||||
|
|
||||||
|
| 输出字段 | 来源 |
|
||||||
|
| --- | --- |
|
||||||
|
| 物料编码、物料名称、图号或型号、规格、单位 | 物料主文件/库存现存量冗余字段 |
|
||||||
|
| 总库存 | 库存现存量按物料汇总 |
|
||||||
|
| 主库房、主库位 | 库存数量最大的库位 |
|
||||||
|
| 库位明细 | 库存现存量按物料展开 |
|
||||||
|
| 最近变动 | 库存变动流水 |
|
||||||
|
|
||||||
|
## 9. 正向查询和逆向查询数据流
|
||||||
|
|
||||||
|
### 9.1 物料正向查询
|
||||||
|
|
||||||
|
正向查询回答:某个物料在哪些库位。
|
||||||
|
|
||||||
|
```mermaid
|
||||||
|
flowchart LR
|
||||||
|
A["输入物料编码/名称/图号"] --> B["定位物料流水号"]
|
||||||
|
B --> C["查询库存现存量"]
|
||||||
|
C --> D["关联库房/库位"]
|
||||||
|
D --> E["返回库房、库位、批次、库存数量"]
|
||||||
|
```
|
||||||
|
|
||||||
|
### 9.2 库位逆向查询
|
||||||
|
|
||||||
|
逆向查询回答:某个库位放了哪些物料。
|
||||||
|
|
||||||
|
```mermaid
|
||||||
|
flowchart LR
|
||||||
|
A["选择库房/库位"] --> B["定位库位流水号"]
|
||||||
|
B --> C["查询库存现存量"]
|
||||||
|
C --> D["关联物料主文件"]
|
||||||
|
D --> E["返回物料、图号、规格、批次、库存数量"]
|
||||||
|
```
|
||||||
|
|
||||||
|
## 10. 数据一致性控制
|
||||||
|
|
||||||
|
| 控制点 | 说明 |
|
||||||
|
| --- | --- |
|
||||||
|
| 单事务 | 入库、出库、移库、盘点确认必须在数据库事务内完成 |
|
||||||
|
| 防负库存 | 出库、移库、盘亏都必须重新读取数据库库存并校验 |
|
||||||
|
| 流水必写 | 只要库存数量变化,就必须写库存变动流水 |
|
||||||
|
| 单据关联 | 库存流水必须记录业务类型、业务单号、业务主表流水号、业务明细流水号 |
|
||||||
|
| 库位精确 | 库存扣减必须精确到库位,不能只按物料扣减 |
|
||||||
|
| 0 库存保留 | 库存为 0 的现存量记录可保留,查询默认过滤 |
|
||||||
|
| 历史追溯 | 查询当前库存看现存量,查变化原因看库存流水 |
|
||||||
|
|
||||||
|
## 11. 数据落表顺序
|
||||||
|
|
||||||
|
### 11.1 入库落表顺序
|
||||||
|
|
||||||
|
1. 校验物料、库房、库位、数量。
|
||||||
|
2. 写入入库单主表。
|
||||||
|
3. 写入入库单明细表。
|
||||||
|
4. 调用库存增加过程。
|
||||||
|
5. 更新或新增库存现存量。
|
||||||
|
6. 写入库存变动流水。
|
||||||
|
7. 提交事务。
|
||||||
|
|
||||||
|
### 11.2 出库落表顺序
|
||||||
|
|
||||||
|
1. 校验物料、库位、数量。
|
||||||
|
2. 写入出库单主表。
|
||||||
|
3. 写入出库单明细表。
|
||||||
|
4. 调用库存扣减过程。
|
||||||
|
5. 锁定库存现存量并校验可用数量。
|
||||||
|
6. 扣减库存现存量。
|
||||||
|
7. 写入库存变动流水。
|
||||||
|
8. 提交事务。
|
||||||
|
|
||||||
|
### 11.3 移库落表顺序
|
||||||
|
|
||||||
|
1. 校验原库位、目标库位、移库数量。
|
||||||
|
2. 写入移库单主表。
|
||||||
|
3. 写入移库单明细表。
|
||||||
|
4. 锁定原库位库存并扣减。
|
||||||
|
5. 更新或新增目标库位库存。
|
||||||
|
6. 写入移出流水。
|
||||||
|
7. 写入移入流水。
|
||||||
|
8. 提交事务。
|
||||||
|
|
||||||
|
### 11.4 盘点确认落表顺序
|
||||||
|
|
||||||
|
1. 读取盘点单明细。
|
||||||
|
2. 校验盘点单状态为待确认。
|
||||||
|
3. 按明细计算差异。
|
||||||
|
4. 无差异只确认明细。
|
||||||
|
5. 盘盈调用库存增加过程。
|
||||||
|
6. 盘亏调用库存扣减过程。
|
||||||
|
7. 写库存变动流水。
|
||||||
|
8. 更新盘点单状态为已确认。
|
||||||
|
9. 提交事务。
|
||||||
|
|
||||||
|
## 12. 前端页面数据流
|
||||||
|
|
||||||
|
```mermaid
|
||||||
|
flowchart TD
|
||||||
|
A["页面 created 初始化"] --> B["读取库房下拉"]
|
||||||
|
A --> C["读取启用库位"]
|
||||||
|
A --> D["读取库存汇总表"]
|
||||||
|
E["用户输入查询条件"] --> F["CreateData 构建 param 字符串"]
|
||||||
|
F --> G["ExecDatabase POST MESCommonBase.ashx"]
|
||||||
|
G --> H["后端按 name 路由存储过程"]
|
||||||
|
H --> I["返回中文字段结果集"]
|
||||||
|
I --> J["el-table 展示中文字段"]
|
||||||
|
J --> K["点击物料/库位"]
|
||||||
|
K --> L["再次查询明细或流水"]
|
||||||
|
```
|
||||||
|
|
||||||
|
前端传参要求:
|
||||||
|
|
||||||
|
| 参数 | 来源 |
|
||||||
|
| --- | --- |
|
||||||
|
| UserID | Cookie 当前用户 |
|
||||||
|
| ModularID | 当前路由路径 |
|
||||||
|
| name | 中文接口名称 |
|
||||||
|
| type | 查询为 1,增删改为 2,批量为 7 |
|
||||||
|
| param | `key=value&key2=value2` 字符串 |
|
||||||
|
|
||||||
|
## 13. 推荐接口数据流名称
|
||||||
|
|
||||||
|
| 页面动作 | name |
|
||||||
|
| --- | --- |
|
||||||
|
| 查询库房 | 仓储管理_库房_查询 |
|
||||||
|
| 查询库位 | 仓储管理_库位_查询 |
|
||||||
|
| 入库提交 | 仓储管理_入库_增加 |
|
||||||
|
| 出库提交 | 仓储管理_出库_增加 |
|
||||||
|
| 移库提交 | 仓储管理_库存_移库 |
|
||||||
|
| 创建盘点 | 仓储管理_库存盘点_创建 |
|
||||||
|
| 录入实盘 | 仓储管理_库存盘点_实盘_编辑 |
|
||||||
|
| 确认盘点 | 仓储管理_库存盘点_确认 |
|
||||||
|
| 综合查询 | 仓储管理_库存_综合查询 |
|
||||||
|
| 物料正向查询 | 仓储管理_库存_物料正向查询 |
|
||||||
|
| 库位逆向查询 | 仓储管理_库存_库位逆向查询 |
|
||||||
|
| 库存流水查询 | 仓储管理_库存_变动流水_查询 |
|
||||||
|
|
||||||
|
修改人:Ld 修改时间:2026-07-29 10:42:45
|
||||||
BIN
docs/库房管理/库房管理方案数据流_替换流程图前备份.docx
Normal file
BIN
docs/库房管理/库房管理方案数据流_流程图.png
Normal file
|
After Width: | Height: | Size: 108 KiB |
BIN
docs/库房管理/库房管理方案数据流_流程图版.docx
Normal file
BIN
docs/库房管理/库房管理界面预览图.png
Normal file
|
After Width: | Height: | Size: 94 KiB |
BIN
docs/排产优化方案.docx
Normal file
397
scripts/create_warehouse_post_implementation_manual.py
Normal file
@@ -0,0 +1,397 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
"""修改人:Ld 修改时间:2026-07-31 09:04:47; 生成库房管理实施后说明书与推进方案。"""
|
||||||
|
|
||||||
|
from docx import Document
|
||||||
|
from docx.enum.section import WD_SECTION_START
|
||||||
|
from docx.enum.table import WD_ALIGN_VERTICAL
|
||||||
|
from docx.enum.text import WD_ALIGN_PARAGRAPH
|
||||||
|
from docx.oxml import OxmlElement
|
||||||
|
from docx.oxml.ns import qn
|
||||||
|
from docx.shared import Cm, Pt, RGBColor
|
||||||
|
|
||||||
|
|
||||||
|
OUTPUT = r"D:\景耀\JY1.0\docs\库房管理\库房管理方案实施后说明书与推进方案.docx"
|
||||||
|
MODIFY_TIME = "2026-07-31 09:04:47"
|
||||||
|
|
||||||
|
|
||||||
|
def set_cell_shading(cell, fill):
|
||||||
|
tc_pr = cell._tc.get_or_add_tcPr()
|
||||||
|
shd = OxmlElement("w:shd")
|
||||||
|
shd.set(qn("w:fill"), fill)
|
||||||
|
tc_pr.append(shd)
|
||||||
|
|
||||||
|
|
||||||
|
def set_cell_width(cell, width_cm):
|
||||||
|
tc_pr = cell._tc.get_or_add_tcPr()
|
||||||
|
tc_w = OxmlElement("w:tcW")
|
||||||
|
tc_w.set(qn("w:w"), str(int(width_cm * 567)))
|
||||||
|
tc_w.set(qn("w:type"), "dxa")
|
||||||
|
tc_pr.append(tc_w)
|
||||||
|
|
||||||
|
|
||||||
|
def set_cell_text(cell, text, bold=False, color=None):
|
||||||
|
cell.text = ""
|
||||||
|
p = cell.paragraphs[0]
|
||||||
|
p.paragraph_format.space_after = Pt(0)
|
||||||
|
run = p.add_run(str(text))
|
||||||
|
run.font.name = "微软雅黑"
|
||||||
|
run._element.rPr.rFonts.set(qn("w:eastAsia"), "微软雅黑")
|
||||||
|
run.font.size = Pt(9)
|
||||||
|
run.bold = bold
|
||||||
|
if color:
|
||||||
|
run.font.color.rgb = RGBColor.from_string(color)
|
||||||
|
cell.vertical_alignment = WD_ALIGN_VERTICAL.CENTER
|
||||||
|
|
||||||
|
|
||||||
|
def add_table(doc, headers, rows, widths=None):
|
||||||
|
table = doc.add_table(rows=1, cols=len(headers))
|
||||||
|
table.style = "Table Grid"
|
||||||
|
table.autofit = False
|
||||||
|
header_cells = table.rows[0].cells
|
||||||
|
for i, header in enumerate(headers):
|
||||||
|
set_cell_text(header_cells[i], header, bold=True, color="0B2545")
|
||||||
|
set_cell_shading(header_cells[i], "E8EEF5")
|
||||||
|
if widths:
|
||||||
|
set_cell_width(header_cells[i], widths[i])
|
||||||
|
for row in rows:
|
||||||
|
cells = table.add_row().cells
|
||||||
|
for i, value in enumerate(row):
|
||||||
|
set_cell_text(cells[i], value)
|
||||||
|
if widths:
|
||||||
|
set_cell_width(cells[i], widths[i])
|
||||||
|
doc.add_paragraph()
|
||||||
|
return table
|
||||||
|
|
||||||
|
|
||||||
|
def add_heading(doc, text, level=1):
|
||||||
|
p = doc.add_heading(text, level=level)
|
||||||
|
for run in p.runs:
|
||||||
|
run.font.name = "微软雅黑"
|
||||||
|
run._element.rPr.rFonts.set(qn("w:eastAsia"), "微软雅黑")
|
||||||
|
run.font.color.rgb = RGBColor(46, 116, 181) if level <= 2 else RGBColor(31, 77, 120)
|
||||||
|
return p
|
||||||
|
|
||||||
|
|
||||||
|
def add_para(doc, text, bold_prefix=None):
|
||||||
|
p = doc.add_paragraph()
|
||||||
|
p.paragraph_format.space_after = Pt(6)
|
||||||
|
p.paragraph_format.line_spacing = 1.25
|
||||||
|
if bold_prefix and text.startswith(bold_prefix):
|
||||||
|
r1 = p.add_run(bold_prefix)
|
||||||
|
r1.bold = True
|
||||||
|
r1.font.name = "微软雅黑"
|
||||||
|
r1._element.rPr.rFonts.set(qn("w:eastAsia"), "微软雅黑")
|
||||||
|
r1.font.size = Pt(10.5)
|
||||||
|
text = text[len(bold_prefix):]
|
||||||
|
r = p.add_run(text)
|
||||||
|
r.font.name = "微软雅黑"
|
||||||
|
r._element.rPr.rFonts.set(qn("w:eastAsia"), "微软雅黑")
|
||||||
|
r.font.size = Pt(10.5)
|
||||||
|
return p
|
||||||
|
|
||||||
|
|
||||||
|
def add_bullets(doc, items):
|
||||||
|
for item in items:
|
||||||
|
p = doc.add_paragraph(style="List Bullet")
|
||||||
|
p.paragraph_format.space_after = Pt(4)
|
||||||
|
p.paragraph_format.line_spacing = 1.25
|
||||||
|
run = p.add_run(item)
|
||||||
|
run.font.name = "微软雅黑"
|
||||||
|
run._element.rPr.rFonts.set(qn("w:eastAsia"), "微软雅黑")
|
||||||
|
run.font.size = Pt(10.5)
|
||||||
|
|
||||||
|
|
||||||
|
def add_numbered(doc, items):
|
||||||
|
for item in items:
|
||||||
|
p = doc.add_paragraph(style="List Number")
|
||||||
|
p.paragraph_format.space_after = Pt(4)
|
||||||
|
p.paragraph_format.line_spacing = 1.25
|
||||||
|
run = p.add_run(item)
|
||||||
|
run.font.name = "微软雅黑"
|
||||||
|
run._element.rPr.rFonts.set(qn("w:eastAsia"), "微软雅黑")
|
||||||
|
run.font.size = Pt(10.5)
|
||||||
|
|
||||||
|
|
||||||
|
def build_doc():
|
||||||
|
doc = Document()
|
||||||
|
section = doc.sections[0]
|
||||||
|
section.top_margin = Cm(2.2)
|
||||||
|
section.bottom_margin = Cm(2.0)
|
||||||
|
section.left_margin = Cm(2.2)
|
||||||
|
section.right_margin = Cm(2.2)
|
||||||
|
section.header_distance = Cm(1.25)
|
||||||
|
section.footer_distance = Cm(1.25)
|
||||||
|
|
||||||
|
styles = doc.styles
|
||||||
|
normal = styles["Normal"]
|
||||||
|
normal.font.name = "微软雅黑"
|
||||||
|
normal._element.rPr.rFonts.set(qn("w:eastAsia"), "微软雅黑")
|
||||||
|
normal.font.size = Pt(10.5)
|
||||||
|
normal.paragraph_format.space_after = Pt(6)
|
||||||
|
normal.paragraph_format.line_spacing = 1.25
|
||||||
|
|
||||||
|
title = doc.add_paragraph()
|
||||||
|
title.alignment = WD_ALIGN_PARAGRAPH.CENTER
|
||||||
|
run = title.add_run("库房管理方案实施后说明书与推进方案")
|
||||||
|
run.bold = True
|
||||||
|
run.font.name = "微软雅黑"
|
||||||
|
run._element.rPr.rFonts.set(qn("w:eastAsia"), "微软雅黑")
|
||||||
|
run.font.size = Pt(20)
|
||||||
|
run.font.color.rgb = RGBColor(11, 37, 69)
|
||||||
|
|
||||||
|
sub = doc.add_paragraph()
|
||||||
|
sub.alignment = WD_ALIGN_PARAGRAPH.CENTER
|
||||||
|
run = sub.add_run("适用范围:JY1.0 测试库库房管理模块试运行、验收、推广")
|
||||||
|
run.font.name = "微软雅黑"
|
||||||
|
run._element.rPr.rFonts.set(qn("w:eastAsia"), "微软雅黑")
|
||||||
|
run.font.size = Pt(10.5)
|
||||||
|
run.font.color.rgb = RGBColor(85, 85, 85)
|
||||||
|
|
||||||
|
add_table(
|
||||||
|
doc,
|
||||||
|
["项目", "内容"],
|
||||||
|
[
|
||||||
|
["当前环境", "测试库 ERPTOOL_JY_20250826Back;正式库 ERPTOOL_JY 未修改"],
|
||||||
|
["前端页面", "src/views/WarehouseManagement/WarehouseRoomManagement/index.vue"],
|
||||||
|
["菜单路径", "WarehouseManagement/WarehouseRoomManagement;菜单标题:库房管理"],
|
||||||
|
["实施原则", "新增隔离模块,复用原组件和稳定接口,不覆盖原仓储页面、原仓储管理过程"],
|
||||||
|
["文档日期", "2026-07-31"],
|
||||||
|
],
|
||||||
|
[3.0, 12.5],
|
||||||
|
)
|
||||||
|
|
||||||
|
add_heading(doc, "1. 实施后总体说明")
|
||||||
|
add_para(
|
||||||
|
doc,
|
||||||
|
"本说明书用于库房管理模块实施后的使用、验收和推广。当前方案已经在测试库完成隔离落地,核心目标是把“库房-库区-库位-物料-库存流水”业务链路先走通,再逐步接入入库、出库、盘点等生产业务。",
|
||||||
|
)
|
||||||
|
add_bullets(
|
||||||
|
doc,
|
||||||
|
[
|
||||||
|
"库房被定义为放置库位和物料的区域,库位是具体存放位置。",
|
||||||
|
"库位归属按已有库位编码规则自动识别,不强制重建原库位数据。",
|
||||||
|
"三楼仓库提供可点击可视化布局,按 8 排、每排 24 列、3 层展示。",
|
||||||
|
"物料库位查询复用原稳定接口,并在新页面内补充库房归属,避免影响原物料库位功能。",
|
||||||
|
"所有落地对象均先在测试库验证,正式库上线前必须完成数据核对和用户验收。",
|
||||||
|
]
|
||||||
|
)
|
||||||
|
|
||||||
|
add_heading(doc, "2. 已实施内容")
|
||||||
|
add_heading(doc, "2.1 数据库对象", 2)
|
||||||
|
add_table(
|
||||||
|
doc,
|
||||||
|
["类别", "对象", "实施说明"],
|
||||||
|
[
|
||||||
|
["新表", "库房管理_库房主文件", "保存库房编号、名称、类型、地址、状态、排数、列数、层数等信息。"],
|
||||||
|
["新表", "库房管理_库区主文件", "保存库房下的库区信息,与库房主文件建立外键关系。"],
|
||||||
|
["新表", "库房管理_业务记录", "保存库房相关业务记录,为后续出入库、盘点、移库追溯预留。"],
|
||||||
|
["完善表", "库存管理_货位主文件", "补充库房流水号、库区流水号、排号、列号、层号、库位状态、库位容量、是否启用、修改人、修改时间。"],
|
||||||
|
["索引", "库房库区排列层索引", "支持按库房、库区、排、列、层快速查询可视化库位。"],
|
||||||
|
["同步过程", "库房管理_库位编码归属_同步", "按库位编码规则把原货位归属同步到二楼隔层、立库、三楼仓库。"],
|
||||||
|
],
|
||||||
|
[2.0, 4.3, 9.2],
|
||||||
|
)
|
||||||
|
|
||||||
|
add_heading(doc, "2.2 已建立过程与接口策略", 2)
|
||||||
|
add_table(
|
||||||
|
doc,
|
||||||
|
["过程/接口", "用途", "当前策略"],
|
||||||
|
[
|
||||||
|
["库房管理_库房_查询/保存/停用", "库房主数据维护", "测试库新增,前端库房管理页签调用。"],
|
||||||
|
["库房管理_库区_查询/保存", "库房下库区维护", "测试库新增,前端库区/库位页签调用。"],
|
||||||
|
["库房管理_库位_查询/保存", "库位列表维护和按布局建库位", "测试库新增,复用原货位表并补充库房字段。"],
|
||||||
|
["库房管理_可视化库位_查询", "三楼仓库可视化布局", "默认三楼仓库,未建库位按 x-xx-xx-xx 生成预览编码。"],
|
||||||
|
["仓储管理_物料库位_查询数据", "物料综合/正向/逆向查询", "复用原稳定接口,新页面内按编码规则补充库房归属。"],
|
||||||
|
["库房管理_库存流水_查询", "出入库/盘点流水查询", "测试库新增,用于后续业务记录和追溯。"],
|
||||||
|
],
|
||||||
|
[4.3, 5.3, 5.9],
|
||||||
|
)
|
||||||
|
|
||||||
|
add_heading(doc, "2.3 前端页面功能", 2)
|
||||||
|
add_table(
|
||||||
|
doc,
|
||||||
|
["页签", "主要功能", "当前用途"],
|
||||||
|
[
|
||||||
|
["库房管理", "查询、新增、编辑、停用库房;查看库区数、库位数、有库存库位数。", "维护库房基础资料,作为库区和库位的上级。"],
|
||||||
|
["库区/库位", "按库房、库区、库位名称、状态查询;新增/编辑库区和库位。", "完成库房对应库位维护。"],
|
||||||
|
["三楼仓库可视化", "按层展示 8 排 x 24 列库位;点击库位查看状态或建库位。", "对照现场三楼仓库布局进行可视化操作。"],
|
||||||
|
["物料综合查询", "综合、正向、逆向查询;支持全部库房或指定库房过滤。", "查询物料在哪些库位、某库位有哪些物料。"],
|
||||||
|
["出入库/盘点流水", "按关键字、日期、库房查询业务流水。", "为后续出入库、盘点闭环提供追溯入口。"],
|
||||||
|
],
|
||||||
|
[3.0, 6.8, 5.7],
|
||||||
|
)
|
||||||
|
|
||||||
|
add_heading(doc, "3. 库房与库位编码规则")
|
||||||
|
add_table(
|
||||||
|
doc,
|
||||||
|
["库房", "库位编码格式", "示例", "系统处理"],
|
||||||
|
[
|
||||||
|
["二楼隔层仓库", "字母数字-数字", "A1-1、K2-18", "归属到二楼隔层库区,不参与三楼可视化网格。"],
|
||||||
|
["立库仓库", "xx-xx-xx", "01-01-01、06-07-03", "归属到立库库区,可用于立库查询统计。"],
|
||||||
|
["三楼仓库", "x-xx-xx-xx", "1-01-01-01", "参与三楼可视化布局,排、列、层按编码识别。"],
|
||||||
|
["未归类库位", "不符合以上规则", "A000、耗材、毛坯库", "在物料综合查询中标识为未归类,后续由仓库确认是否纳入库房体系。"],
|
||||||
|
],
|
||||||
|
[3.2, 3.6, 3.0, 5.7],
|
||||||
|
)
|
||||||
|
|
||||||
|
add_heading(doc, "4. 实施后业务操作说明")
|
||||||
|
add_heading(doc, "4.1 建库房与建库位", 2)
|
||||||
|
add_numbered(
|
||||||
|
doc,
|
||||||
|
[
|
||||||
|
"进入“库房管理”页签,先维护库房编号、库房名称、库房类型、排数、每排列数、层数和状态。",
|
||||||
|
"进入“库区/库位”页签,选择库房后维护库区,再维护具体库位。",
|
||||||
|
"三楼仓库可进入“三楼仓库可视化”页签,点击未建库位,系统带出排、列、层和预览库位编号。",
|
||||||
|
"已发生库存业务的库位不建议物理删除;如不再使用,应先移库清空,再停用。",
|
||||||
|
],
|
||||||
|
)
|
||||||
|
add_heading(doc, "4.2 物料查询", 2)
|
||||||
|
add_numbered(
|
||||||
|
doc,
|
||||||
|
[
|
||||||
|
"综合查询:输入物料编码、名称、图号或库位关键字,可选择全部库房或指定库房。",
|
||||||
|
"正向查询:用于回答“物料在哪个库位”,按物料信息定位所有有库存的库位。",
|
||||||
|
"逆向查询:用于回答“哪个库位放置哪些物料”,可从三楼可视化库位直接跳转带入库位。",
|
||||||
|
"查询结果显示物料编码、物料名称、图号或型号、库房、库区、库位、库存数量、批次号和库存状态。",
|
||||||
|
],
|
||||||
|
)
|
||||||
|
add_heading(doc, "4.3 出入库与盘点衔接", 2)
|
||||||
|
add_para(
|
||||||
|
doc,
|
||||||
|
"当前模块已经预留出入库/盘点流水入口。后续推进时,应把现有入库、出库、调拨、盘点业务的库存变动统一写入库房业务记录或可追溯流水,避免只改结果、不留过程。",
|
||||||
|
)
|
||||||
|
add_bullets(
|
||||||
|
doc,
|
||||||
|
[
|
||||||
|
"入库:选择物料、数量、库房和库位,库存增加并写入入库流水。",
|
||||||
|
"出库:校验库位库存充足后扣减,库存减少并写入出库流水。",
|
||||||
|
"盘点:生成账面数,录入实盘数,差异确认后生成盘盈或盘亏调整流水。",
|
||||||
|
"移库:原库位扣减、目标库位增加,同一业务写入移出和移入两条流水。",
|
||||||
|
]
|
||||||
|
)
|
||||||
|
|
||||||
|
add_heading(doc, "5. 数据流说明")
|
||||||
|
add_table(
|
||||||
|
doc,
|
||||||
|
["数据流", "入口", "处理", "输出"],
|
||||||
|
[
|
||||||
|
["库房主数据", "库房管理页签", "写入库房主文件,维护状态和布局参数", "库房下拉、统计、库位归属依据"],
|
||||||
|
["库区/库位数据", "库区/库位页签或可视化点击建库位", "写入原货位表扩展字段,保留原货位主键", "库位列表、可视化单元格、物料查询维度"],
|
||||||
|
["原库位同步", "库位编码归属同步过程", "按编码规则回填库房、库区、排列层", "二楼、立库、三楼的库位归属清单"],
|
||||||
|
["物料库位查询", "物料综合查询页签", "调用原稳定接口,再按编码规则补库房归属", "物料在哪、库位放什么的正逆向查询结果"],
|
||||||
|
["业务流水", "入库、出库、盘点、移库后续接入", "写业务记录并关联物料、库位、数量变化", "出入库/盘点流水和追溯报表"],
|
||||||
|
],
|
||||||
|
[3.0, 3.8, 5.2, 3.8],
|
||||||
|
)
|
||||||
|
|
||||||
|
add_heading(doc, "6. 验收标准")
|
||||||
|
add_table(
|
||||||
|
doc,
|
||||||
|
["验收项", "验收方法", "通过标准"],
|
||||||
|
[
|
||||||
|
["不影响原功能", "原库位管理、原物料库位页面查询", "页面可正常打开,查询结果与实施前一致。"],
|
||||||
|
["库房主数据", "新增、编辑、停用测试库房", "数据写入测试库,重复编号有校验,停用状态正确。"],
|
||||||
|
["库位归属", "抽查 A1-1、01-01-01、1-01-01-01 等编码", "分别归属二楼隔层、立库、三楼仓库。"],
|
||||||
|
["三楼可视化", "切换层号并点击库位", "展示 8 排、24 列、3 层,点击后显示库位明细。"],
|
||||||
|
["物料正逆向查询", "按物料查库位、按库位查物料", "能返回库房、库区、库位和库存数量,不再出现 result=0。"],
|
||||||
|
["构建验证", "执行前端 lint 和 build", "无编译错误;允许已有体积和 Browserslist 警告。"],
|
||||||
|
],
|
||||||
|
[3.2, 5.2, 7.1],
|
||||||
|
)
|
||||||
|
|
||||||
|
add_heading(doc, "7. 推进方案")
|
||||||
|
add_heading(doc, "7.1 推进原则", 2)
|
||||||
|
add_bullets(
|
||||||
|
doc,
|
||||||
|
[
|
||||||
|
"先测试库、再小范围试点、最后正式库上线。",
|
||||||
|
"先查清现有库位数据,再让仓库人员确认库房归属。",
|
||||||
|
"先上线查询和可视化,再逐步接入会改库存的入库、出库、盘点、移库。",
|
||||||
|
"每一步都保留回退方案,正式库脚本上线前必须备份对象定义和关键数据。",
|
||||||
|
]
|
||||||
|
)
|
||||||
|
add_heading(doc, "7.2 推进计划", 2)
|
||||||
|
add_table(
|
||||||
|
doc,
|
||||||
|
["阶段", "工作内容", "责任角色", "预计工时", "交付物"],
|
||||||
|
[
|
||||||
|
["0. 方案确认", "确认库房定义、编码规则、菜单权限、试点范围。", "仓库主管、实施人员、开发", "4 小时", "确认记录和试点名单"],
|
||||||
|
["1. 测试库核对", "核对三类库房、库区、库位归属;抽样检查物料库位。", "仓库主管、实施人员", "8 小时", "数据核对表"],
|
||||||
|
["2. 页面试用", "仓库人员按实际业务试用库房、库区/库位、可视化、物料查询。", "仓库操作员、实施人员", "8 小时", "问题清单和优化记录"],
|
||||||
|
["3. 数据清洗", "处理未归类库位、异常编码、重复或废弃库位。", "仓库主管、开发", "16 小时", "清洗脚本和确认清单"],
|
||||||
|
["4. 培训与验收", "培训查询、建库位、可视化操作;按验收标准逐项签字。", "实施人员、关键用户", "8 小时", "培训签到和验收单"],
|
||||||
|
["5. 正式库上线准备", "生成正式库脚本、备份对象、安排低峰上线窗口。", "开发、DBA/管理员", "8 小时", "上线脚本、回退脚本、备份记录"],
|
||||||
|
["6. 正式上线", "执行正式库脚本、发布前端、验证菜单和查询。", "开发、实施人员", "8 小时", "上线记录和验证结果"],
|
||||||
|
["7. 运行观察", "连续观察查询性能、用户反馈、出入库/盘点接入需求。", "仓库主管、开发", "16 小时", "试运行报告和二期清单"],
|
||||||
|
],
|
||||||
|
[2.2, 5.0, 3.0, 2.0, 3.3],
|
||||||
|
)
|
||||||
|
|
||||||
|
add_heading(doc, "7.3 正式上线前检查清单", 2)
|
||||||
|
add_bullets(
|
||||||
|
doc,
|
||||||
|
[
|
||||||
|
"确认正式库脚本只包含已验收对象,不包含测试数据。",
|
||||||
|
"确认原仓储页面和原存储过程未被覆盖。",
|
||||||
|
"确认 `库存管理_货位主文件` 新增字段为兼容字段,不破坏原字段含义。",
|
||||||
|
"确认菜单权限只授权给需要使用库房管理的角色。",
|
||||||
|
"确认可回退:正式库执行前导出相关对象定义和关键表数据备份。",
|
||||||
|
"确认上线后首日安排仓库关键用户和开发人员共同值守。",
|
||||||
|
]
|
||||||
|
)
|
||||||
|
|
||||||
|
add_heading(doc, "8. 风险与控制")
|
||||||
|
add_table(
|
||||||
|
doc,
|
||||||
|
["风险", "表现", "控制措施"],
|
||||||
|
[
|
||||||
|
["库位编码不规范", "部分库位无法归属到二楼、立库、三楼", "输出未归类清单,由仓库确认后再批量修正。"],
|
||||||
|
["用户误解默认库房", "综合查询只看到某一库房", "材料查询页提供独立“全部库房/指定库房”筛选。"],
|
||||||
|
["接口兼容问题", "新建过程经接口返回 result=0", "查询类优先复用原稳定接口;新过程上线前单独做接口验证。"],
|
||||||
|
["影响原功能", "原库位管理或物料库位页面异常", "原页面不改;新增模块隔离;上线前做原功能回归。"],
|
||||||
|
["库存变动不可追溯", "只改库存结果,没有业务流水", "出入库、盘点、移库接入时必须同事务写库存变动流水。"],
|
||||||
|
],
|
||||||
|
[3.0, 5.0, 7.5],
|
||||||
|
)
|
||||||
|
|
||||||
|
add_heading(doc, "9. 后续二期建议")
|
||||||
|
add_bullets(
|
||||||
|
doc,
|
||||||
|
[
|
||||||
|
"把采购入库、自制件入库、领料出库、退料、移库、盘点全部接入库房业务记录。",
|
||||||
|
"为三楼可视化增加库位物料明细弹窗、颜色按库存/容量/异常区分。",
|
||||||
|
"增加未归类库位治理页面,支持仓库人员批量指定库房和库区。",
|
||||||
|
"增加库位容量、混放规则、冻结库存、异常库存预警。",
|
||||||
|
"形成“库存账面数-库位现存-业务流水”三方核对报表。",
|
||||||
|
]
|
||||||
|
)
|
||||||
|
|
||||||
|
add_heading(doc, "10. 使用责任分工")
|
||||||
|
add_table(
|
||||||
|
doc,
|
||||||
|
["角色", "职责"],
|
||||||
|
[
|
||||||
|
["仓库主管", "确认库房和库位规则,审核未归类库位,组织试点和验收。"],
|
||||||
|
["仓库操作员", "按实际收发料和盘点场景试用页面,反馈无法落地的问题。"],
|
||||||
|
["实施人员", "组织培训、收集问题、跟踪整改、推进验收。"],
|
||||||
|
["开发人员", "维护测试库脚本、前端页面、接口兼容和上线回退方案。"],
|
||||||
|
["系统管理员", "控制菜单权限、安排上线窗口、保存备份和发布记录。"],
|
||||||
|
],
|
||||||
|
[3.2, 12.3],
|
||||||
|
)
|
||||||
|
|
||||||
|
add_para(doc, "修改人:Ld 修改时间:" + MODIFY_TIME + ";")
|
||||||
|
|
||||||
|
footer = section.footer.paragraphs[0]
|
||||||
|
footer.alignment = WD_ALIGN_PARAGRAPH.RIGHT
|
||||||
|
run = footer.add_run("库房管理方案实施后说明书")
|
||||||
|
run.font.name = "微软雅黑"
|
||||||
|
run._element.rPr.rFonts.set(qn("w:eastAsia"), "微软雅黑")
|
||||||
|
run.font.size = Pt(9)
|
||||||
|
run.font.color.rgb = RGBColor(85, 85, 85)
|
||||||
|
|
||||||
|
doc.save(OUTPUT)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
build_doc()
|
||||||
321
scripts/generate_scheduling_optimization_doc.py
Normal file
@@ -0,0 +1,321 @@
|
|||||||
|
# 修改人:Ld 修改时间:2026-08-03 14:07:13; 生成排产优化方案 Word 文档。
|
||||||
|
from docx import Document
|
||||||
|
from docx.enum.section import WD_SECTION
|
||||||
|
from docx.enum.table import WD_TABLE_ALIGNMENT, WD_CELL_VERTICAL_ALIGNMENT
|
||||||
|
from docx.enum.text import WD_ALIGN_PARAGRAPH
|
||||||
|
from docx.oxml import OxmlElement
|
||||||
|
from docx.oxml.ns import qn
|
||||||
|
from docx.shared import Inches, Pt, RGBColor
|
||||||
|
|
||||||
|
|
||||||
|
OUTPUT = r"D:\景耀\JY1.0\docs\排产优化方案.docx"
|
||||||
|
MOD_TIME = "2026-08-03 14:07:13"
|
||||||
|
|
||||||
|
|
||||||
|
def set_run_font(run, size=11, bold=False, color=None, name="Calibri"):
|
||||||
|
run.font.name = name
|
||||||
|
run._element.rPr.rFonts.set(qn("w:ascii"), name)
|
||||||
|
run._element.rPr.rFonts.set(qn("w:hAnsi"), name)
|
||||||
|
run._element.rPr.rFonts.set(qn("w:eastAsia"), "Microsoft YaHei")
|
||||||
|
run.font.size = Pt(size)
|
||||||
|
run.bold = bold
|
||||||
|
if color:
|
||||||
|
run.font.color.rgb = RGBColor.from_string(color)
|
||||||
|
|
||||||
|
|
||||||
|
def set_para_format(paragraph, before=0, after=6, line=1.10):
|
||||||
|
paragraph.paragraph_format.space_before = Pt(before)
|
||||||
|
paragraph.paragraph_format.space_after = Pt(after)
|
||||||
|
paragraph.paragraph_format.line_spacing = line
|
||||||
|
|
||||||
|
|
||||||
|
def add_heading(doc, text, level=1):
|
||||||
|
p = doc.add_paragraph()
|
||||||
|
set_para_format(p, before=16 if level == 1 else 10, after=8 if level == 1 else 5)
|
||||||
|
r = p.add_run(text)
|
||||||
|
if level == 1:
|
||||||
|
set_run_font(r, size=16, bold=True, color="2E74B5")
|
||||||
|
else:
|
||||||
|
set_run_font(r, size=13, bold=True, color="2E74B5")
|
||||||
|
return p
|
||||||
|
|
||||||
|
|
||||||
|
def add_para(doc, text, bold_prefix=None):
|
||||||
|
p = doc.add_paragraph()
|
||||||
|
set_para_format(p)
|
||||||
|
if bold_prefix and text.startswith(bold_prefix):
|
||||||
|
r1 = p.add_run(bold_prefix)
|
||||||
|
set_run_font(r1, bold=True)
|
||||||
|
r2 = p.add_run(text[len(bold_prefix):])
|
||||||
|
set_run_font(r2)
|
||||||
|
else:
|
||||||
|
r = p.add_run(text)
|
||||||
|
set_run_font(r)
|
||||||
|
return p
|
||||||
|
|
||||||
|
|
||||||
|
def add_bullet(doc, text):
|
||||||
|
p = doc.add_paragraph(style="List Bullet")
|
||||||
|
set_para_format(p, after=4, line=1.167)
|
||||||
|
r = p.add_run(text)
|
||||||
|
set_run_font(r)
|
||||||
|
return p
|
||||||
|
|
||||||
|
|
||||||
|
def add_number(doc, text):
|
||||||
|
p = doc.add_paragraph(style="List Number")
|
||||||
|
set_para_format(p, after=4, line=1.167)
|
||||||
|
r = p.add_run(text)
|
||||||
|
set_run_font(r)
|
||||||
|
return p
|
||||||
|
|
||||||
|
|
||||||
|
def shade_cell(cell, fill):
|
||||||
|
tc_pr = cell._tc.get_or_add_tcPr()
|
||||||
|
shd = OxmlElement("w:shd")
|
||||||
|
shd.set(qn("w:fill"), fill)
|
||||||
|
tc_pr.append(shd)
|
||||||
|
|
||||||
|
|
||||||
|
def set_cell_text(cell, text, bold=False, align=WD_ALIGN_PARAGRAPH.LEFT):
|
||||||
|
cell.text = ""
|
||||||
|
p = cell.paragraphs[0]
|
||||||
|
p.alignment = align
|
||||||
|
set_para_format(p, after=0, line=1.10)
|
||||||
|
r = p.add_run(text)
|
||||||
|
set_run_font(r, size=10.5, bold=bold)
|
||||||
|
cell.vertical_alignment = WD_CELL_VERTICAL_ALIGNMENT.CENTER
|
||||||
|
|
||||||
|
|
||||||
|
def add_table(doc, headers, rows, widths):
|
||||||
|
table = doc.add_table(rows=1, cols=len(headers))
|
||||||
|
table.alignment = WD_TABLE_ALIGNMENT.CENTER
|
||||||
|
table.style = "Table Grid"
|
||||||
|
for i, header in enumerate(headers):
|
||||||
|
set_cell_text(table.rows[0].cells[i], header, bold=True, align=WD_ALIGN_PARAGRAPH.CENTER)
|
||||||
|
shade_cell(table.rows[0].cells[i], "F2F4F7")
|
||||||
|
table.rows[0].cells[i].width = Inches(widths[i])
|
||||||
|
for row in rows:
|
||||||
|
cells = table.add_row().cells
|
||||||
|
for i, value in enumerate(row):
|
||||||
|
set_cell_text(cells[i], str(value), align=WD_ALIGN_PARAGRAPH.LEFT if i > 0 else WD_ALIGN_PARAGRAPH.CENTER)
|
||||||
|
cells[i].width = Inches(widths[i])
|
||||||
|
doc.add_paragraph()
|
||||||
|
return table
|
||||||
|
|
||||||
|
|
||||||
|
def add_callout(doc, title, body):
|
||||||
|
table = doc.add_table(rows=1, cols=1)
|
||||||
|
table.alignment = WD_TABLE_ALIGNMENT.CENTER
|
||||||
|
table.style = "Table Grid"
|
||||||
|
cell = table.rows[0].cells[0]
|
||||||
|
shade_cell(cell, "F4F6F9")
|
||||||
|
p = cell.paragraphs[0]
|
||||||
|
set_para_format(p, after=3)
|
||||||
|
r = p.add_run(title)
|
||||||
|
set_run_font(r, size=11, bold=True, color="1F4D78")
|
||||||
|
p2 = cell.add_paragraph()
|
||||||
|
set_para_format(p2, after=0)
|
||||||
|
r2 = p2.add_run(body)
|
||||||
|
set_run_font(r2, size=10.5)
|
||||||
|
doc.add_paragraph()
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
doc = Document()
|
||||||
|
section = doc.sections[0]
|
||||||
|
section.top_margin = Inches(1)
|
||||||
|
section.bottom_margin = Inches(1)
|
||||||
|
section.left_margin = Inches(1)
|
||||||
|
section.right_margin = Inches(1)
|
||||||
|
section.header_distance = Inches(0.492)
|
||||||
|
section.footer_distance = Inches(0.492)
|
||||||
|
|
||||||
|
styles = doc.styles
|
||||||
|
normal = styles["Normal"]
|
||||||
|
normal.font.name = "Calibri"
|
||||||
|
normal._element.rPr.rFonts.set(qn("w:eastAsia"), "Microsoft YaHei")
|
||||||
|
normal.font.size = Pt(11)
|
||||||
|
normal.paragraph_format.space_after = Pt(6)
|
||||||
|
normal.paragraph_format.line_spacing = 1.10
|
||||||
|
|
||||||
|
header = section.header.paragraphs[0]
|
||||||
|
header.alignment = WD_ALIGN_PARAGRAPH.RIGHT
|
||||||
|
set_para_format(header, after=0)
|
||||||
|
rh = header.add_run("景耀 JY1.0 MES | 排产优化方案")
|
||||||
|
set_run_font(rh, size=9, color="555555")
|
||||||
|
|
||||||
|
footer = section.footer.paragraphs[0]
|
||||||
|
footer.alignment = WD_ALIGN_PARAGRAPH.CENTER
|
||||||
|
rf = footer.add_run("内部方案讨论稿")
|
||||||
|
set_run_font(rf, size=9, color="555555")
|
||||||
|
|
||||||
|
title = doc.add_paragraph()
|
||||||
|
set_para_format(title, before=10, after=4)
|
||||||
|
tr = title.add_run("排产优化方案")
|
||||||
|
set_run_font(tr, size=24, bold=True, color="0B2545")
|
||||||
|
|
||||||
|
subtitle = doc.add_paragraph()
|
||||||
|
set_para_format(subtitle, after=14)
|
||||||
|
sr = subtitle.add_run("结合 JY1.0 现有销售合同、补货、生产计划、工序派工与设备任务链路")
|
||||||
|
set_run_font(sr, size=12, color="555555")
|
||||||
|
|
||||||
|
meta = [
|
||||||
|
["适用系统", "景耀 JY1.0 MES 前端(Vue 2 + Element UI)及 ASP.NET .ashx 后端"],
|
||||||
|
["数据库范围", "测试库 ERPTOOL_JY_20250826Back;正式库 ERPTOOL_JY 上线前同步评审"],
|
||||||
|
["方案版本", "V1.0"],
|
||||||
|
["生成时间", MOD_TIME],
|
||||||
|
]
|
||||||
|
add_table(doc, ["项目", "说明"], meta, [1.5, 5.0])
|
||||||
|
|
||||||
|
add_callout(
|
||||||
|
doc,
|
||||||
|
"核心结论",
|
||||||
|
"建议采用“两步走”:第一阶段先做订单补货可溯源、当前工序高亮、机台任务看板三项可视化闭环;第二阶段在数据稳定后接入有限产能、交期、设备状态、工序前后置约束的自动排产建议。这样能最大限度复用现有页面和 MESCommonBase.ashx 通信模式,避免一次性重构带来的风险。",
|
||||||
|
)
|
||||||
|
|
||||||
|
add_heading(doc, "一、现有系统依据")
|
||||||
|
add_para(doc, "本次方案基于代码结构和现有业务链路梳理,重点参考以下模块:")
|
||||||
|
for item in [
|
||||||
|
"仓储补货:src/views/WarehouseManagement/Replenishment/index.vue,已具备报缺补货、外购/自制补货中间表、提交补货、补货期限、补货图片、打回通知等能力。",
|
||||||
|
"销售订单:src/views/SalesManagement/OrderInquiry/index.vue 与 OrderRelease/index.vue,已具备订单编号、合同类型、补货明细查询/修改、订单投产、订单分配等能力。",
|
||||||
|
"销售合同:src/views/SalesManagement/SalesContractNew/index.vue 与 ContractSearchNew/index.vue,已具备合同编号、项目流水号、客户、合同状态和资料留存等合同主数据能力。",
|
||||||
|
"生产计划:src/views/SeikoWorkshop/ProductionPlan/index.vue,已具备月度计划、状态、完成率、OP010-OP110 工序列和可视化看板雏形。",
|
||||||
|
"生产任务查询与追溯:src/views/SeikoWorkshop/ProductionTaskQuery/index.vue,已具备任务状态、派工、零件追溯、工序明细、加工设备和工序状态变色能力。",
|
||||||
|
"生产执行/派工:src/views/SeikoWorkshop/ProductionExecution/index.vue,已具备设备查询、工序信息查询、工序编辑及派工、上移/下移/插入/删除工序、工艺保存派工等能力。",
|
||||||
|
"设备监控:src/views/SeikoWorkshop/EquipmentMonitoringNew/index.vue 与 ManufacturingCenter/EquipmentMonitoringNew/index.vue,已具备设备状态展示和设备状态分布图基础。",
|
||||||
|
]:
|
||||||
|
add_bullet(doc, item)
|
||||||
|
|
||||||
|
add_heading(doc, "二、目标与边界")
|
||||||
|
add_para(doc, "本方案优先解决“计划看得见、任务找得到、来源追得回”的排产基础问题,再逐步进入算法优化。")
|
||||||
|
add_table(
|
||||||
|
doc,
|
||||||
|
["目标", "说明", "优先级"],
|
||||||
|
[
|
||||||
|
["补货订单可溯源", "创建补货订单时必须关联销售合同或销售订单,后续可从补货单反查合同、客户、订单、零件、需求来源。", "P0"],
|
||||||
|
["当前工序凸显", "生产计划和任务查询中对正在加工/待处理的当前工序做高亮、标签和进度提示,减少人工查找。", "P0"],
|
||||||
|
["机台任务显示", "按设备/工位展示当前任务、下一任务、排队任务、预计开完工、异常状态,为排产调整提供现场视角。", "P1"],
|
||||||
|
["排产算法建议", "在数据字段稳定后,按交期、工序顺序、设备能力、在制数量、设备状态给出推荐排产。", "P2"],
|
||||||
|
],
|
||||||
|
[1.25, 4.2, 1.05],
|
||||||
|
)
|
||||||
|
|
||||||
|
add_heading(doc, "三、方案一:补货订单关联销售合同")
|
||||||
|
add_para(doc, "现状:补货页面已能按物料选择补货并提交,但补货提交参数当前主要围绕“是否外购、操作者、补货期限、订单备注”;需求明细弹窗已能展示订单编号、需求量、客户。建议在补货创建时把合同/订单来源显式固化。")
|
||||||
|
add_number(doc, "在补货单提交弹窗中增加“关联销售合同”选择框,支持合同编号、客户、订单编号模糊查询。")
|
||||||
|
add_number(doc, "选择合同后,联动显示该合同下未完成订单;如用户从需求量明细进入,可自动带入订单编号和合同编号。")
|
||||||
|
add_number(doc, "补货中间表增加合同与订单字段,选入物料时即记录来源;提交生成补货单时把来源写入补货单主表和明细表。")
|
||||||
|
add_number(doc, "补货查询、新补货查询、销售订单补货明细中增加合同编号、客户名称、来源订单编号列,并提供跳转到合同查询/订单查询的入口。")
|
||||||
|
add_table(
|
||||||
|
doc,
|
||||||
|
["位置", "建议字段/控件", "处理逻辑"],
|
||||||
|
[
|
||||||
|
["补货创建弹窗", "关联销售合同、来源订单编号、客户名称", "提交前必填;若为安全库存补货可选择“库存备货”,但需填写备货原因。"],
|
||||||
|
["补货中间表", "项目流水号、合同编号、订单流水号、订单编号、来源类型", "选入物料时写入,选出时同步清理。"],
|
||||||
|
["补货单主表/明细表", "补货单号、合同编号、订单编号、客户名称、补货原因", "生成正式补货单后用于追溯、看板统计和报表导出。"],
|
||||||
|
["订单查询", "补货明细关联合同", "现有“订单信息_补货明细_查询/修改”扩展返回字段。"],
|
||||||
|
],
|
||||||
|
[1.35, 2.0, 3.15],
|
||||||
|
)
|
||||||
|
|
||||||
|
add_heading(doc, "四、方案二:生产计划当前工序高亮")
|
||||||
|
add_para(doc, "现状:生产计划已有 OP010-OP110 横向工序列,生产任务查询的工序明细已有 tableRowClassName1 变色逻辑,完成工序会显示为蓝色背景。建议扩展为“已完成、正在进行、待开始、异常/超期”四类视觉状态。")
|
||||||
|
add_table(
|
||||||
|
doc,
|
||||||
|
["状态", "判断规则", "前端表现"],
|
||||||
|
[
|
||||||
|
["已完成", "工序状态大于完成阈值、存在加工完成时间或完成状态=1", "浅蓝底 + 完成标签"],
|
||||||
|
["正在进行", "存在开始加工时间且无完成时间;或工序状态=加工中", "绿色高亮边框/底色 + “当前”标签"],
|
||||||
|
["待开始", "前序已完成、本工序未开始", "淡黄底 + “待加工”标签"],
|
||||||
|
["异常/超期", "超过精工期限、设备停机、暂停时间过长、质检不良待处理", "红色文字/标签 + 置顶或筛选项"],
|
||||||
|
],
|
||||||
|
[1.2, 3.2, 2.1],
|
||||||
|
)
|
||||||
|
add_para(doc, "前端建议:在 ProductionPlan 的 OP 列中增加 scoped-slot,根据后端返回的“当前工序顺序/当前工序状态/当前设备”或前端解析后的状态决定 class;在 ProductionTaskQuery 的工序追溯弹窗中把“当前工序”与“已完成工序”区分开。")
|
||||||
|
add_para(doc, "后端建议:生产计划查询过程返回 当前工序顺序、当前工序名称、当前工序状态、当前设备、当前操作者、计划开始、计划完成、实际开始、实际完成、是否超期。前端只负责展示,不在页面内重复推导复杂状态。")
|
||||||
|
|
||||||
|
add_heading(doc, "五、方案三:机台生产任务显示")
|
||||||
|
add_para(doc, "现状:生产执行已有设备下拉和工序派工,设备监控已有设备状态分布图,但缺少按机台汇总的“当前正在做什么、后面排了什么”。建议新增“机台任务看板”,可挂在精工车间或设备监控模块下。")
|
||||||
|
add_table(
|
||||||
|
doc,
|
||||||
|
["看板区块", "显示内容", "数据来源建议"],
|
||||||
|
[
|
||||||
|
["机台卡片", "设备名称/工位号、设备状态、当前订单、零件、图号、当前工序、操作者、已完成/计划数量", "基础数据_设备工位点检表 + 车间生产管理_零件工序_视图 + 完成过程情况"],
|
||||||
|
["当前任务", "正在加工任务、开始时间、已用时、预计剩余、是否超期", "工序完成过程情况、工序状态、设备状态"],
|
||||||
|
["排队任务", "下一道/后续任务,按交期、优先级、工序顺序排序", "派工表/工艺计划表/生产计划查询过程"],
|
||||||
|
["异常提示", "停机、暂停、质检不良、缺料、未派设备、超期", "设备状态、质检、仓储需求、任务状态"],
|
||||||
|
["操作入口", "跳转生产任务查询、工序追溯、生产执行派工", "保持现有路由跳转方式"],
|
||||||
|
],
|
||||||
|
[1.25, 2.75, 2.5],
|
||||||
|
)
|
||||||
|
add_para(doc, "第一版建议只做展示和筛选,不直接在看板上拖拽改排产;待现场认可数据准确性后,再开放“调整设备/调整顺序/插单”的受控操作。")
|
||||||
|
|
||||||
|
add_heading(doc, "六、数据库与接口改造建议")
|
||||||
|
add_table(
|
||||||
|
doc,
|
||||||
|
["类型", "名称建议", "用途"],
|
||||||
|
[
|
||||||
|
["查询", "仓储管理_补货关联合同_查询数据", "按合同编号、客户、订单编号查询可关联的销售合同/订单。"],
|
||||||
|
["编辑", "报缺补货_选入_带来源", "在选入补货物料时同步写入项目流水号、合同编号、订单流水号、订单编号。"],
|
||||||
|
["编辑", "报缺补货_提交_带来源", "提交补货单时校验合同/订单来源并写入正式单据。"],
|
||||||
|
["查询", "车间生产管理_生产计划_查询数据", "扩展返回当前工序、当前设备、工序状态码、计划/实际时间等字段。"],
|
||||||
|
["查询", "精工车间_机台任务看板_查询数据", "按设备/工位汇总当前任务和排队任务。"],
|
||||||
|
],
|
||||||
|
[1.1, 2.4, 3.0],
|
||||||
|
)
|
||||||
|
add_para(doc, "所有接口继续走 MESCommonBase.ashx,前端仍使用 this.CreateData 和 this.ExecDatabase;参数仍按 key=value 字符串规则由全局方法生成,避免新增 Axios 封装。")
|
||||||
|
|
||||||
|
add_heading(doc, "七、前端改造建议")
|
||||||
|
add_bullet(doc, "WarehouseManagement/Replenishment:提交弹窗增加合同选择、来源订单选择、备货原因;表格右侧补货单增加合同编号/订单编号隐藏列或 tooltip。")
|
||||||
|
add_bullet(doc, "WarehouseManagement/NewReplenishmentQuery:增加合同编号、订单编号、客户名称列和筛选条件;补货单号点击可查看来源。")
|
||||||
|
add_bullet(doc, "SalesManagement/OrderInquiry:补货明细弹窗增加合同关联和修改记录展示,补货订单可反跳补货查询。")
|
||||||
|
add_bullet(doc, "SeikoWorkshop/ProductionPlan:OP 列改为状态单元格,增加当前工序高亮;看板图表增加按设备、按当前工序、按超期统计。")
|
||||||
|
add_bullet(doc, "SeikoWorkshop/ProductionTaskQuery:工序追溯弹窗区分当前工序、已完成工序、待开始工序、异常工序。")
|
||||||
|
add_bullet(doc, "SeikoWorkshop 或 DeviceManagement:新增机台任务看板页面,沿用 app-container > el-card > 搜索栏 + 表格/卡片布局。")
|
||||||
|
|
||||||
|
add_heading(doc, "八、实施阶段")
|
||||||
|
add_table(
|
||||||
|
doc,
|
||||||
|
["阶段", "范围", "交付物", "建议周期"],
|
||||||
|
[
|
||||||
|
["阶段1", "补货订单关联合同/订单;补货查询追溯字段", "数据库字段、接口、补货页面、查询页面", "2-4天"],
|
||||||
|
["阶段2", "生产计划当前工序高亮;任务查询工序状态优化", "生产计划 OP 状态单元格、工序追溯弹窗优化", "2-3天"],
|
||||||
|
["阶段3", "机台任务看板", "设备筛选、当前任务、排队任务、异常提示、跳转入口", "4-6天"],
|
||||||
|
["阶段4", "排产算法建议", "规则配置、推荐顺序、人工确认、调整记录", "视规则复杂度评估"],
|
||||||
|
],
|
||||||
|
[1.0, 2.35, 2.2, 0.95],
|
||||||
|
)
|
||||||
|
|
||||||
|
add_heading(doc, "九、验收标准")
|
||||||
|
for item in [
|
||||||
|
"创建补货订单时,除库存备货场景外,必须能看到并保存销售合同/订单来源。",
|
||||||
|
"从补货查询能反查到合同编号、客户、订单编号、物料、补货数量、补货人、补货期限和当前状态。",
|
||||||
|
"生产计划列表中当前工序一眼可识别,且已完成、待开始、异常状态不会混淆。",
|
||||||
|
"机台任务看板能按设备查看当前任务和后续任务,当前任务字段与生产任务查询一致。",
|
||||||
|
"所有新增接口均遵循 MESCommonBase.ashx + CreateData/ExecDatabase 模式,正式库上线前在测试库完成验证。",
|
||||||
|
"所有新增代码注释和文档末尾记录满足“修改人:Ld 修改时间”规则。",
|
||||||
|
]:
|
||||||
|
add_bullet(doc, item)
|
||||||
|
|
||||||
|
add_heading(doc, "十、需要业务补充确认的问题")
|
||||||
|
for item in [
|
||||||
|
"补货订单是否必须关联“销售合同”,还是关联到“销售订单/订单编号”即可,合同通过订单反推?建议两者都保存,页面主选订单、自动带出合同。",
|
||||||
|
"安全库存补货、备品备件补货是否允许没有销售合同?如果允许,需要定义来源类型和审批/备注要求。",
|
||||||
|
"当前工序的业务定义:以“已开始未完成”为准,还是以前序完成后下一道未开始为准?建议同时显示“正在加工”和“下一待加工”。",
|
||||||
|
"机台任务看板需要显示哪些设备范围:仅精工车间设备,还是包含装配/外协/仓储相关工位?",
|
||||||
|
"是否需要在第一版支持手动调整机台任务顺序?建议第一版只展示,第二版再加受控调整和操作日志。",
|
||||||
|
"排产优先级规则:交期优先、客户优先、订单加急、设备能力、换型成本、工序等待时间,各项权重需业务确认。",
|
||||||
|
]:
|
||||||
|
add_bullet(doc, item)
|
||||||
|
|
||||||
|
add_heading(doc, "十一、推荐落地口径")
|
||||||
|
add_para(doc, "建议第一版不要直接宣传为“自动排产”,而定义为“排产可视化与任务追溯增强”。先把补货来源、当前工序、机台任务三块数据打通,现场使用一周后再根据实际反馈调整排产规则。这样既能快速解决当前痛点,也能为后续真正的排产优化算法沉淀可靠数据。")
|
||||||
|
|
||||||
|
add_para(doc, f"修改人:Ld 修改时间:{MOD_TIME};")
|
||||||
|
|
||||||
|
doc.save(OUTPUT)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
5
sql/PDM_组件名称_确认更改新_ERPTOOL_JY_before_20260724.sql
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
Sqlcmd: Error: Microsoft ODBC Driver 11 for SQL Server : Encryption not supported on the client..
|
||||||
|
Sqlcmd: Error: Microsoft ODBC Driver 11 for SQL Server : SSL Provider: 安全包中没有可用的凭证
|
||||||
|
.
|
||||||
|
Sqlcmd: Error: Microsoft ODBC Driver 11 for SQL Server : Client unable to establish connection.
|
||||||
|
Sqlcmd: Error: Microsoft ODBC Driver 11 for SQL Server : A network-related or instance-specific error has occurred while establishing a connection to SQL Server. Server is not found or not accessible. Check if instance name is correct and if SQL Server is configured to allow remote connections. For more information see SQL Server Books Online..
|
||||||
97
sql/PDM_组件名称_确认更改新_ERPTOOL_JY_deploy_20260724.sql
Normal file
@@ -0,0 +1,97 @@
|
|||||||
|
USE [ERPTOOL_JY]
|
||||||
|
GO
|
||||||
|
|
||||||
|
DECLARE @sql NVARCHAR(MAX)
|
||||||
|
DECLARE @anchor NVARCHAR(500)
|
||||||
|
DECLARE @new NVARCHAR(MAX)
|
||||||
|
DECLARE @pos INT
|
||||||
|
|
||||||
|
SELECT @sql = OBJECT_DEFINITION(OBJECT_ID(N'dbo.PDM_组件名称_确认更改新'))
|
||||||
|
|
||||||
|
SET @new = CAST(N'
|
||||||
|
-- 修改人:Ld 修改时间:2026-07-23 允许合同修改时删除未领料机床,已领料机床保留,避免误删已领料数据
|
||||||
|
IF EXISTS (SELECT 1 FROM PDM_机床名称_修改记录_临时表 WHERE 项目流水号 = @项目流水号)
|
||||||
|
BEGIN
|
||||||
|
DELETE r FROM 车间装配管理_装配任务 r
|
||||||
|
INNER JOIN PDM_组件名称 c ON c.组件流水号 = r.组件流水号
|
||||||
|
INNER JOIN PDM_机床名称 m ON m.机床流水号 = c.机床流水号
|
||||||
|
WHERE m.项目流水号 = @项目流水号
|
||||||
|
AND NOT EXISTS (SELECT 1 FROM PDM_机床名称_修改记录_临时表 t WHERE t.项目流水号 = @项目流水号 AND t.机床流水号 = m.机床流水号)
|
||||||
|
AND NOT EXISTS (SELECT 1 FROM PDM_组件名称 c2 WHERE c2.机床流水号 = m.机床流水号 AND ISNULL(c2.是否领料, 0) <> 0)
|
||||||
|
|
||||||
|
DELETE r FROM 车间装配管理_装配执行_临时领料明细 r
|
||||||
|
INNER JOIN PDM_组件名称 c ON c.组件流水号 = r.组件流水号
|
||||||
|
INNER JOIN PDM_机床名称 m ON m.机床流水号 = c.机床流水号
|
||||||
|
WHERE m.项目流水号 = @项目流水号
|
||||||
|
AND NOT EXISTS (SELECT 1 FROM PDM_机床名称_修改记录_临时表 t WHERE t.项目流水号 = @项目流水号 AND t.机床流水号 = m.机床流水号)
|
||||||
|
AND NOT EXISTS (SELECT 1 FROM PDM_组件名称 c2 WHERE c2.机床流水号 = m.机床流水号 AND ISNULL(c2.是否领料, 0) <> 0)
|
||||||
|
|
||||||
|
DELETE r FROM 车间装配管理_领料单明细 r
|
||||||
|
INNER JOIN PDM_组件名称 c ON c.组件流水号 = r.组件流水号
|
||||||
|
INNER JOIN PDM_机床名称 m ON m.机床流水号 = c.机床流水号
|
||||||
|
WHERE m.项目流水号 = @项目流水号
|
||||||
|
AND NOT EXISTS (SELECT 1 FROM PDM_机床名称_修改记录_临时表 t WHERE t.项目流水号 = @项目流水号 AND t.机床流水号 = m.机床流水号)
|
||||||
|
AND NOT EXISTS (SELECT 1 FROM PDM_组件名称 c2 WHERE c2.机床流水号 = m.机床流水号 AND ISNULL(c2.是否领料, 0) <> 0)
|
||||||
|
' AS NVARCHAR(MAX)) + CAST(N'
|
||||||
|
DELETE r FROM 车间装配管理_领料单 r
|
||||||
|
INNER JOIN PDM_组件名称 c ON c.组件流水号 = r.组件流水号
|
||||||
|
INNER JOIN PDM_机床名称 m ON m.机床流水号 = c.机床流水号
|
||||||
|
WHERE m.项目流水号 = @项目流水号
|
||||||
|
AND NOT EXISTS (SELECT 1 FROM PDM_机床名称_修改记录_临时表 t WHERE t.项目流水号 = @项目流水号 AND t.机床流水号 = m.机床流水号)
|
||||||
|
AND NOT EXISTS (SELECT 1 FROM PDM_组件名称 c2 WHERE c2.机床流水号 = m.机床流水号 AND ISNULL(c2.是否领料, 0) <> 0)
|
||||||
|
|
||||||
|
DELETE r FROM PDM_零件明细表_基本件 r
|
||||||
|
INNER JOIN PDM_组件名称 c ON c.组件流水号 = r.组件流水号
|
||||||
|
INNER JOIN PDM_机床名称 m ON m.机床流水号 = c.机床流水号
|
||||||
|
WHERE m.项目流水号 = @项目流水号
|
||||||
|
AND NOT EXISTS (SELECT 1 FROM PDM_机床名称_修改记录_临时表 t WHERE t.项目流水号 = @项目流水号 AND t.机床流水号 = m.机床流水号)
|
||||||
|
AND NOT EXISTS (SELECT 1 FROM PDM_组件名称 c2 WHERE c2.机床流水号 = m.机床流水号 AND ISNULL(c2.是否领料, 0) <> 0)
|
||||||
|
|
||||||
|
DELETE r FROM PDM_零件明细表_标准件和外购件 r
|
||||||
|
INNER JOIN PDM_组件名称 c ON c.组件流水号 = r.组件流水号
|
||||||
|
INNER JOIN PDM_机床名称 m ON m.机床流水号 = c.机床流水号
|
||||||
|
WHERE m.项目流水号 = @项目流水号
|
||||||
|
AND NOT EXISTS (SELECT 1 FROM PDM_机床名称_修改记录_临时表 t WHERE t.项目流水号 = @项目流水号 AND t.机床流水号 = m.机床流水号)
|
||||||
|
AND NOT EXISTS (SELECT 1 FROM PDM_组件名称 c2 WHERE c2.机床流水号 = m.机床流水号 AND ISNULL(c2.是否领料, 0) <> 0)
|
||||||
|
|
||||||
|
DELETE c FROM PDM_组件名称 c
|
||||||
|
INNER JOIN PDM_机床名称 m ON m.机床流水号 = c.机床流水号
|
||||||
|
WHERE m.项目流水号 = @项目流水号
|
||||||
|
AND NOT EXISTS (SELECT 1 FROM PDM_机床名称_修改记录_临时表 t WHERE t.项目流水号 = @项目流水号 AND t.机床流水号 = m.机床流水号)
|
||||||
|
AND NOT EXISTS (SELECT 1 FROM PDM_组件名称 c2 WHERE c2.机床流水号 = m.机床流水号 AND ISNULL(c2.是否领料, 0) <> 0)
|
||||||
|
|
||||||
|
DELETE m FROM PDM_机床名称 m
|
||||||
|
WHERE m.项目流水号 = @项目流水号
|
||||||
|
AND NOT EXISTS (SELECT 1 FROM PDM_机床名称_修改记录_临时表 t WHERE t.项目流水号 = @项目流水号 AND t.机床流水号 = m.机床流水号)
|
||||||
|
AND NOT EXISTS (SELECT 1 FROM PDM_组件名称 c WHERE c.机床流水号 = m.机床流水号 AND ISNULL(c.是否领料, 0) <> 0)
|
||||||
|
END
|
||||||
|
|
||||||
|
' AS NVARCHAR(MAX))
|
||||||
|
|
||||||
|
SET @anchor = N'delete from PDM_机床名称_修改记录_临时表 where 项目流水号 = @项目流水号'
|
||||||
|
|
||||||
|
IF @sql IS NULL
|
||||||
|
BEGIN
|
||||||
|
RAISERROR(N'未找到存储过程 PDM_组件名称_确认更改新', 16, 1)
|
||||||
|
RETURN
|
||||||
|
END
|
||||||
|
|
||||||
|
IF CHARINDEX(N'修改人:Ld 修改时间:2026-07-23 允许合同修改时删除未领料机床', @sql) > 0
|
||||||
|
BEGIN
|
||||||
|
PRINT N'测试库过程已包含本次删除机床加固逻辑,无需重复修改'
|
||||||
|
RETURN
|
||||||
|
END
|
||||||
|
|
||||||
|
SET @sql = REPLACE(@sql, N'CREATE PROCEDURE', N'ALTER PROCEDURE')
|
||||||
|
SET @pos = CHARINDEX(@anchor, @sql)
|
||||||
|
|
||||||
|
IF @pos = 0
|
||||||
|
BEGIN
|
||||||
|
RAISERROR(N'未找到预期插入位置,未执行修改', 16, 1)
|
||||||
|
RETURN
|
||||||
|
END
|
||||||
|
|
||||||
|
SET @sql = STUFF(@sql, @pos, 0, @new)
|
||||||
|
|
||||||
|
EXEC sp_executesql @sql
|
||||||
|
GO
|
||||||
97
sql/PDM_组件名称_确认更改新_测试库_删除机床加固.sql
Normal file
@@ -0,0 +1,97 @@
|
|||||||
|
USE [ERPTOOL_JY_20250826Back]
|
||||||
|
GO
|
||||||
|
|
||||||
|
DECLARE @sql NVARCHAR(MAX)
|
||||||
|
DECLARE @anchor NVARCHAR(500)
|
||||||
|
DECLARE @new NVARCHAR(MAX)
|
||||||
|
DECLARE @pos INT
|
||||||
|
|
||||||
|
SELECT @sql = OBJECT_DEFINITION(OBJECT_ID(N'dbo.PDM_组件名称_确认更改新'))
|
||||||
|
|
||||||
|
SET @new = CAST(N'
|
||||||
|
-- 修改人:Ld 修改时间:2026-07-23 允许合同修改时删除未领料机床,已领料机床保留,避免误删已领料数据
|
||||||
|
IF EXISTS (SELECT 1 FROM PDM_机床名称_修改记录_临时表 WHERE 项目流水号 = @项目流水号)
|
||||||
|
BEGIN
|
||||||
|
DELETE r FROM 车间装配管理_装配任务 r
|
||||||
|
INNER JOIN PDM_组件名称 c ON c.组件流水号 = r.组件流水号
|
||||||
|
INNER JOIN PDM_机床名称 m ON m.机床流水号 = c.机床流水号
|
||||||
|
WHERE m.项目流水号 = @项目流水号
|
||||||
|
AND NOT EXISTS (SELECT 1 FROM PDM_机床名称_修改记录_临时表 t WHERE t.项目流水号 = @项目流水号 AND t.机床流水号 = m.机床流水号)
|
||||||
|
AND NOT EXISTS (SELECT 1 FROM PDM_组件名称 c2 WHERE c2.机床流水号 = m.机床流水号 AND ISNULL(c2.是否领料, 0) <> 0)
|
||||||
|
|
||||||
|
DELETE r FROM 车间装配管理_装配执行_临时领料明细 r
|
||||||
|
INNER JOIN PDM_组件名称 c ON c.组件流水号 = r.组件流水号
|
||||||
|
INNER JOIN PDM_机床名称 m ON m.机床流水号 = c.机床流水号
|
||||||
|
WHERE m.项目流水号 = @项目流水号
|
||||||
|
AND NOT EXISTS (SELECT 1 FROM PDM_机床名称_修改记录_临时表 t WHERE t.项目流水号 = @项目流水号 AND t.机床流水号 = m.机床流水号)
|
||||||
|
AND NOT EXISTS (SELECT 1 FROM PDM_组件名称 c2 WHERE c2.机床流水号 = m.机床流水号 AND ISNULL(c2.是否领料, 0) <> 0)
|
||||||
|
|
||||||
|
DELETE r FROM 车间装配管理_领料单明细 r
|
||||||
|
INNER JOIN PDM_组件名称 c ON c.组件流水号 = r.组件流水号
|
||||||
|
INNER JOIN PDM_机床名称 m ON m.机床流水号 = c.机床流水号
|
||||||
|
WHERE m.项目流水号 = @项目流水号
|
||||||
|
AND NOT EXISTS (SELECT 1 FROM PDM_机床名称_修改记录_临时表 t WHERE t.项目流水号 = @项目流水号 AND t.机床流水号 = m.机床流水号)
|
||||||
|
AND NOT EXISTS (SELECT 1 FROM PDM_组件名称 c2 WHERE c2.机床流水号 = m.机床流水号 AND ISNULL(c2.是否领料, 0) <> 0)
|
||||||
|
' AS NVARCHAR(MAX)) + CAST(N'
|
||||||
|
DELETE r FROM 车间装配管理_领料单 r
|
||||||
|
INNER JOIN PDM_组件名称 c ON c.组件流水号 = r.组件流水号
|
||||||
|
INNER JOIN PDM_机床名称 m ON m.机床流水号 = c.机床流水号
|
||||||
|
WHERE m.项目流水号 = @项目流水号
|
||||||
|
AND NOT EXISTS (SELECT 1 FROM PDM_机床名称_修改记录_临时表 t WHERE t.项目流水号 = @项目流水号 AND t.机床流水号 = m.机床流水号)
|
||||||
|
AND NOT EXISTS (SELECT 1 FROM PDM_组件名称 c2 WHERE c2.机床流水号 = m.机床流水号 AND ISNULL(c2.是否领料, 0) <> 0)
|
||||||
|
|
||||||
|
DELETE r FROM PDM_零件明细表_基本件 r
|
||||||
|
INNER JOIN PDM_组件名称 c ON c.组件流水号 = r.组件流水号
|
||||||
|
INNER JOIN PDM_机床名称 m ON m.机床流水号 = c.机床流水号
|
||||||
|
WHERE m.项目流水号 = @项目流水号
|
||||||
|
AND NOT EXISTS (SELECT 1 FROM PDM_机床名称_修改记录_临时表 t WHERE t.项目流水号 = @项目流水号 AND t.机床流水号 = m.机床流水号)
|
||||||
|
AND NOT EXISTS (SELECT 1 FROM PDM_组件名称 c2 WHERE c2.机床流水号 = m.机床流水号 AND ISNULL(c2.是否领料, 0) <> 0)
|
||||||
|
|
||||||
|
DELETE r FROM PDM_零件明细表_标准件和外购件 r
|
||||||
|
INNER JOIN PDM_组件名称 c ON c.组件流水号 = r.组件流水号
|
||||||
|
INNER JOIN PDM_机床名称 m ON m.机床流水号 = c.机床流水号
|
||||||
|
WHERE m.项目流水号 = @项目流水号
|
||||||
|
AND NOT EXISTS (SELECT 1 FROM PDM_机床名称_修改记录_临时表 t WHERE t.项目流水号 = @项目流水号 AND t.机床流水号 = m.机床流水号)
|
||||||
|
AND NOT EXISTS (SELECT 1 FROM PDM_组件名称 c2 WHERE c2.机床流水号 = m.机床流水号 AND ISNULL(c2.是否领料, 0) <> 0)
|
||||||
|
|
||||||
|
DELETE c FROM PDM_组件名称 c
|
||||||
|
INNER JOIN PDM_机床名称 m ON m.机床流水号 = c.机床流水号
|
||||||
|
WHERE m.项目流水号 = @项目流水号
|
||||||
|
AND NOT EXISTS (SELECT 1 FROM PDM_机床名称_修改记录_临时表 t WHERE t.项目流水号 = @项目流水号 AND t.机床流水号 = m.机床流水号)
|
||||||
|
AND NOT EXISTS (SELECT 1 FROM PDM_组件名称 c2 WHERE c2.机床流水号 = m.机床流水号 AND ISNULL(c2.是否领料, 0) <> 0)
|
||||||
|
|
||||||
|
DELETE m FROM PDM_机床名称 m
|
||||||
|
WHERE m.项目流水号 = @项目流水号
|
||||||
|
AND NOT EXISTS (SELECT 1 FROM PDM_机床名称_修改记录_临时表 t WHERE t.项目流水号 = @项目流水号 AND t.机床流水号 = m.机床流水号)
|
||||||
|
AND NOT EXISTS (SELECT 1 FROM PDM_组件名称 c WHERE c.机床流水号 = m.机床流水号 AND ISNULL(c.是否领料, 0) <> 0)
|
||||||
|
END
|
||||||
|
|
||||||
|
' AS NVARCHAR(MAX))
|
||||||
|
|
||||||
|
SET @anchor = N'delete from PDM_机床名称_修改记录_临时表 where 项目流水号 = @项目流水号'
|
||||||
|
|
||||||
|
IF @sql IS NULL
|
||||||
|
BEGIN
|
||||||
|
RAISERROR(N'未找到存储过程 PDM_组件名称_确认更改新', 16, 1)
|
||||||
|
RETURN
|
||||||
|
END
|
||||||
|
|
||||||
|
IF CHARINDEX(N'修改人:Ld 修改时间:2026-07-23 允许合同修改时删除未领料机床', @sql) > 0
|
||||||
|
BEGIN
|
||||||
|
PRINT N'测试库过程已包含本次删除机床加固逻辑,无需重复修改'
|
||||||
|
RETURN
|
||||||
|
END
|
||||||
|
|
||||||
|
SET @sql = REPLACE(@sql, N'CREATE PROCEDURE', N'ALTER PROCEDURE')
|
||||||
|
SET @pos = CHARINDEX(@anchor, @sql)
|
||||||
|
|
||||||
|
IF @pos = 0
|
||||||
|
BEGIN
|
||||||
|
RAISERROR(N'未找到预期插入位置,未执行修改', 16, 1)
|
||||||
|
RETURN
|
||||||
|
END
|
||||||
|
|
||||||
|
SET @sql = STUFF(@sql, @pos, 0, @new)
|
||||||
|
|
||||||
|
EXEC sp_executesql @sql
|
||||||
|
GO
|
||||||
102
sql/apply_PDM_confirm_test_patch.ps1
Normal file
@@ -0,0 +1,102 @@
|
|||||||
|
$ErrorActionPreference = 'Stop'
|
||||||
|
|
||||||
|
$server = '192.168.1.27'
|
||||||
|
$db = 'ERPTOOL_JY_20250826Back'
|
||||||
|
$user = 'sa'
|
||||||
|
$pwd = '126.com'
|
||||||
|
$connStr = "Server=$server;Database=$db;User ID=$user;Password=$pwd;TrustServerCertificate=True;"
|
||||||
|
|
||||||
|
$conn = New-Object System.Data.SqlClient.SqlConnection $connStr
|
||||||
|
$conn.Open()
|
||||||
|
|
||||||
|
try {
|
||||||
|
$cmd = $conn.CreateCommand()
|
||||||
|
$cmd.CommandText = "SELECT OBJECT_DEFINITION(OBJECT_ID(N'dbo.PDM_组件名称_确认更改新'))"
|
||||||
|
$sql = [string]$cmd.ExecuteScalar()
|
||||||
|
|
||||||
|
if ([string]::IsNullOrEmpty($sql)) {
|
||||||
|
throw '未找到存储过程 PDM_组件名称_确认更改新'
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($sql.Contains('修改人:Ld 修改时间:2026-07-23 允许合同修改时删除未领料机床')) {
|
||||||
|
Write-Output '测试库过程已包含本次删除机床加固逻辑,无需重复修改'
|
||||||
|
exit 0
|
||||||
|
}
|
||||||
|
|
||||||
|
$anchor = 'delete from PDM_机床名称_修改记录_临时表 where 项目流水号 = @项目流水号'
|
||||||
|
$alter = [regex]::Replace($sql, '^CREATE\s+PROCEDURE', 'ALTER PROCEDURE')
|
||||||
|
$pos = $alter.IndexOf($anchor, [System.StringComparison]::Ordinal)
|
||||||
|
if ($pos -lt 0) {
|
||||||
|
throw '未找到预期插入位置,未执行修改'
|
||||||
|
}
|
||||||
|
|
||||||
|
$new = @'
|
||||||
|
-- 修改人:Ld 修改时间:2026-07-23 允许合同修改时删除未领料机床,已领料机床保留,避免误删已领料数据
|
||||||
|
IF EXISTS (SELECT 1 FROM PDM_机床名称_修改记录_临时表 WHERE 项目流水号 = @项目流水号)
|
||||||
|
BEGIN
|
||||||
|
DELETE r FROM 车间装配管理_装配任务 r
|
||||||
|
INNER JOIN PDM_组件名称 c ON c.组件流水号 = r.组件流水号
|
||||||
|
INNER JOIN PDM_机床名称 m ON m.机床流水号 = c.机床流水号
|
||||||
|
WHERE m.项目流水号 = @项目流水号
|
||||||
|
AND NOT EXISTS (SELECT 1 FROM PDM_机床名称_修改记录_临时表 t WHERE t.项目流水号 = @项目流水号 AND t.机床流水号 = m.机床流水号)
|
||||||
|
AND NOT EXISTS (SELECT 1 FROM PDM_组件名称 c2 WHERE c2.机床流水号 = m.机床流水号 AND ISNULL(c2.是否领料, 0) <> 0)
|
||||||
|
|
||||||
|
DELETE r FROM 车间装配管理_装配执行_临时领料明细 r
|
||||||
|
INNER JOIN PDM_组件名称 c ON c.组件流水号 = r.组件流水号
|
||||||
|
INNER JOIN PDM_机床名称 m ON m.机床流水号 = c.机床流水号
|
||||||
|
WHERE m.项目流水号 = @项目流水号
|
||||||
|
AND NOT EXISTS (SELECT 1 FROM PDM_机床名称_修改记录_临时表 t WHERE t.项目流水号 = @项目流水号 AND t.机床流水号 = m.机床流水号)
|
||||||
|
AND NOT EXISTS (SELECT 1 FROM PDM_组件名称 c2 WHERE c2.机床流水号 = m.机床流水号 AND ISNULL(c2.是否领料, 0) <> 0)
|
||||||
|
|
||||||
|
DELETE r FROM 车间装配管理_领料单明细 r
|
||||||
|
INNER JOIN PDM_组件名称 c ON c.组件流水号 = r.组件流水号
|
||||||
|
INNER JOIN PDM_机床名称 m ON m.机床流水号 = c.机床流水号
|
||||||
|
WHERE m.项目流水号 = @项目流水号
|
||||||
|
AND NOT EXISTS (SELECT 1 FROM PDM_机床名称_修改记录_临时表 t WHERE t.项目流水号 = @项目流水号 AND t.机床流水号 = m.机床流水号)
|
||||||
|
AND NOT EXISTS (SELECT 1 FROM PDM_组件名称 c2 WHERE c2.机床流水号 = m.机床流水号 AND ISNULL(c2.是否领料, 0) <> 0)
|
||||||
|
|
||||||
|
DELETE r FROM 车间装配管理_领料单 r
|
||||||
|
INNER JOIN PDM_组件名称 c ON c.组件流水号 = r.组件流水号
|
||||||
|
INNER JOIN PDM_机床名称 m ON m.机床流水号 = c.机床流水号
|
||||||
|
WHERE m.项目流水号 = @项目流水号
|
||||||
|
AND NOT EXISTS (SELECT 1 FROM PDM_机床名称_修改记录_临时表 t WHERE t.项目流水号 = @项目流水号 AND t.机床流水号 = m.机床流水号)
|
||||||
|
AND NOT EXISTS (SELECT 1 FROM PDM_组件名称 c2 WHERE c2.机床流水号 = m.机床流水号 AND ISNULL(c2.是否领料, 0) <> 0)
|
||||||
|
|
||||||
|
DELETE r FROM PDM_零件明细表_基本件 r
|
||||||
|
INNER JOIN PDM_组件名称 c ON c.组件流水号 = r.组件流水号
|
||||||
|
INNER JOIN PDM_机床名称 m ON m.机床流水号 = c.机床流水号
|
||||||
|
WHERE m.项目流水号 = @项目流水号
|
||||||
|
AND NOT EXISTS (SELECT 1 FROM PDM_机床名称_修改记录_临时表 t WHERE t.项目流水号 = @项目流水号 AND t.机床流水号 = m.机床流水号)
|
||||||
|
AND NOT EXISTS (SELECT 1 FROM PDM_组件名称 c2 WHERE c2.机床流水号 = m.机床流水号 AND ISNULL(c2.是否领料, 0) <> 0)
|
||||||
|
|
||||||
|
DELETE r FROM PDM_零件明细表_标准件和外购件 r
|
||||||
|
INNER JOIN PDM_组件名称 c ON c.组件流水号 = r.组件流水号
|
||||||
|
INNER JOIN PDM_机床名称 m ON m.机床流水号 = c.机床流水号
|
||||||
|
WHERE m.项目流水号 = @项目流水号
|
||||||
|
AND NOT EXISTS (SELECT 1 FROM PDM_机床名称_修改记录_临时表 t WHERE t.项目流水号 = @项目流水号 AND t.机床流水号 = m.机床流水号)
|
||||||
|
AND NOT EXISTS (SELECT 1 FROM PDM_组件名称 c2 WHERE c2.机床流水号 = m.机床流水号 AND ISNULL(c2.是否领料, 0) <> 0)
|
||||||
|
|
||||||
|
DELETE c FROM PDM_组件名称 c
|
||||||
|
INNER JOIN PDM_机床名称 m ON m.机床流水号 = c.机床流水号
|
||||||
|
WHERE m.项目流水号 = @项目流水号
|
||||||
|
AND NOT EXISTS (SELECT 1 FROM PDM_机床名称_修改记录_临时表 t WHERE t.项目流水号 = @项目流水号 AND t.机床流水号 = m.机床流水号)
|
||||||
|
AND NOT EXISTS (SELECT 1 FROM PDM_组件名称 c2 WHERE c2.机床流水号 = m.机床流水号 AND ISNULL(c2.是否领料, 0) <> 0)
|
||||||
|
|
||||||
|
DELETE m FROM PDM_机床名称 m
|
||||||
|
WHERE m.项目流水号 = @项目流水号
|
||||||
|
AND NOT EXISTS (SELECT 1 FROM PDM_机床名称_修改记录_临时表 t WHERE t.项目流水号 = @项目流水号 AND t.机床流水号 = m.机床流水号)
|
||||||
|
AND NOT EXISTS (SELECT 1 FROM PDM_组件名称 c WHERE c.机床流水号 = m.机床流水号 AND ISNULL(c.是否领料, 0) <> 0)
|
||||||
|
END
|
||||||
|
|
||||||
|
'@
|
||||||
|
|
||||||
|
$alter = $alter.Insert($pos, $new)
|
||||||
|
$cmd = $conn.CreateCommand()
|
||||||
|
$cmd.CommandTimeout = 120
|
||||||
|
$cmd.CommandText = $alter
|
||||||
|
[void]$cmd.ExecuteNonQuery()
|
||||||
|
Write-Output '测试库 PDM_组件名称_确认更改新 修改完成'
|
||||||
|
}
|
||||||
|
finally {
|
||||||
|
$conn.Close()
|
||||||
|
}
|
||||||
29
sql/contract_search_edit_commission_type_20260731.sql
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
/*
|
||||||
|
修改人:Ld 修改时间:2026-07-31 08:43:08;
|
||||||
|
合同查询编辑合同信息支持修改提成类型。
|
||||||
|
*/
|
||||||
|
|
||||||
|
ALTER PROCEDURE [dbo].[PDM_项目名称_修改客户]
|
||||||
|
@项目流水号 int,
|
||||||
|
@收货人 nvarchar(50)=null,
|
||||||
|
@客户流水号 int = null,
|
||||||
|
@交货期限 int = null,
|
||||||
|
@付款方式流水号 int = null,
|
||||||
|
@税率 float = null,
|
||||||
|
@提成类型 nvarchar(50) = null
|
||||||
|
AS
|
||||||
|
BEGIN
|
||||||
|
SET NOCOUNT ON;
|
||||||
|
-- 修改人:Ld 修改时间:2026-07-31 08:43:08; 合同查询编辑合同信息同步保存提成类型。
|
||||||
|
UPDATE [dbo].[PDM_项目名称]
|
||||||
|
SET [客户流水号] = @客户流水号,
|
||||||
|
[收货人员] = @收货人,
|
||||||
|
[交货期限] = @交货期限,
|
||||||
|
[付款方式流水号] = @付款方式流水号,
|
||||||
|
[税率] = @税率,
|
||||||
|
[提成类型] = @提成类型
|
||||||
|
WHERE 项目流水号 = @项目流水号;
|
||||||
|
|
||||||
|
SELECT CAST(1 AS int) AS result;
|
||||||
|
END;
|
||||||
|
GO
|
||||||
189
sql/insert_sales_performance_test_data_20260728.sql
Normal file
@@ -0,0 +1,189 @@
|
|||||||
|
-- 修改人:Ld 修改时间:2026-07-28 15:26:14; 销售绩效组件测试数据,合同编号统一使用 TEST-JX- 前缀。
|
||||||
|
SET NOCOUNT ON;
|
||||||
|
|
||||||
|
BEGIN TRY
|
||||||
|
BEGIN TRANSACTION;
|
||||||
|
|
||||||
|
DECLARE @待清理项目 TABLE (项目流水号 int PRIMARY KEY);
|
||||||
|
|
||||||
|
INSERT INTO @待清理项目 (项目流水号)
|
||||||
|
SELECT 项目流水号
|
||||||
|
FROM dbo.PDM_项目名称
|
||||||
|
WHERE 合同编号 LIKE N'TEST-JX-%';
|
||||||
|
|
||||||
|
DELETE r
|
||||||
|
FROM dbo.财务管理_收款记录 r
|
||||||
|
INNER JOIN @待清理项目 p ON r.项目流水号 = p.项目流水号;
|
||||||
|
|
||||||
|
DELETE p
|
||||||
|
FROM dbo.PDM_项目名称 p
|
||||||
|
INNER JOIN @待清理项目 d ON p.项目流水号 = d.项目流水号;
|
||||||
|
|
||||||
|
DECLARE @测试项目 TABLE
|
||||||
|
(
|
||||||
|
场景 nvarchar(50) NOT NULL,
|
||||||
|
项目流水号 int NOT NULL
|
||||||
|
);
|
||||||
|
|
||||||
|
INSERT INTO dbo.PDM_项目名称
|
||||||
|
(
|
||||||
|
合同编号,
|
||||||
|
客户流水号,
|
||||||
|
合同金额,
|
||||||
|
付款方式流水号,
|
||||||
|
客户要求,
|
||||||
|
签订日期,
|
||||||
|
交货日期,
|
||||||
|
签订人,
|
||||||
|
合同备注,
|
||||||
|
是否生成订单,
|
||||||
|
操作日期,
|
||||||
|
合同类型,
|
||||||
|
操作者,
|
||||||
|
税率,
|
||||||
|
交货人,
|
||||||
|
提交日期,
|
||||||
|
收货人员,
|
||||||
|
交货期限,
|
||||||
|
是否启用,
|
||||||
|
通知人,
|
||||||
|
通知日期,
|
||||||
|
合同协议,
|
||||||
|
是否审核,
|
||||||
|
未收款项,
|
||||||
|
收款日期,
|
||||||
|
提成类型
|
||||||
|
)
|
||||||
|
OUTPUT N'跨月达标模块首单', inserted.项目流水号 INTO @测试项目(场景, 项目流水号)
|
||||||
|
VALUES
|
||||||
|
(
|
||||||
|
N'TEST-JX-202607-A',
|
||||||
|
2507,
|
||||||
|
100000,
|
||||||
|
2,
|
||||||
|
N'销售绩效测试:6月回款40%,7月累计达到90%,8月尾款。',
|
||||||
|
'2026-06-20',
|
||||||
|
'2026-08-20',
|
||||||
|
273,
|
||||||
|
N'销售绩效测试数据,可按 TEST-JX- 前缀清理。',
|
||||||
|
1,
|
||||||
|
GETDATE(),
|
||||||
|
1,
|
||||||
|
273,
|
||||||
|
0.13,
|
||||||
|
273,
|
||||||
|
'2026-06-20',
|
||||||
|
N'罗伟',
|
||||||
|
N'付款后30日',
|
||||||
|
1,
|
||||||
|
273,
|
||||||
|
GETDATE(),
|
||||||
|
N'销售绩效测试合同',
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
'2026-08-12',
|
||||||
|
N'首单提成(模块)'
|
||||||
|
);
|
||||||
|
|
||||||
|
INSERT INTO dbo.PDM_项目名称
|
||||||
|
(
|
||||||
|
合同编号, 客户流水号, 合同金额, 付款方式流水号, 客户要求, 签订日期, 交货日期, 签订人,
|
||||||
|
合同备注, 是否生成订单, 操作日期, 合同类型, 操作者, 税率, 交货人, 提交日期, 收货人员,
|
||||||
|
交货期限, 是否启用, 通知人, 通知日期, 合同协议, 是否审核, 未收款项, 收款日期, 提成类型
|
||||||
|
)
|
||||||
|
OUTPUT N'当月达标专机首单', inserted.项目流水号 INTO @测试项目(场景, 项目流水号)
|
||||||
|
VALUES
|
||||||
|
(
|
||||||
|
N'TEST-JX-202607-B', 2506, 200000, 2, N'销售绩效测试:7月全额回款。',
|
||||||
|
'2026-07-02', '2026-09-02', 5, N'销售绩效测试数据,可按 TEST-JX- 前缀清理。',
|
||||||
|
1, GETDATE(), 2, 5, 0.13, 5, '2026-07-02', N'最高管理员', N'付款后45日',
|
||||||
|
1, 5, GETDATE(), N'销售绩效测试合同', 1, 0, '2026-07-21', N'首单提成(专机)'
|
||||||
|
);
|
||||||
|
|
||||||
|
INSERT INTO dbo.PDM_项目名称
|
||||||
|
(
|
||||||
|
合同编号, 客户流水号, 合同金额, 付款方式流水号, 客户要求, 签订日期, 交货日期, 签订人,
|
||||||
|
合同备注, 是否生成订单, 操作日期, 合同类型, 操作者, 税率, 交货人, 提交日期, 收货人员,
|
||||||
|
交货期限, 是否启用, 通知人, 通知日期, 合同协议, 是否审核, 未收款项, 收款日期, 提成类型
|
||||||
|
)
|
||||||
|
OUTPUT N'复购当月达标', inserted.项目流水号 INTO @测试项目(场景, 项目流水号)
|
||||||
|
VALUES
|
||||||
|
(
|
||||||
|
N'TEST-JX-202608-C', 2505, 50000, 2, N'销售绩效测试:8月达到90%。',
|
||||||
|
'2026-08-03', '2026-09-15', 28, N'销售绩效测试数据,可按 TEST-JX- 前缀清理。',
|
||||||
|
1, GETDATE(), 1, 28, 0.13, 28, '2026-08-03', N'章乐红', N'付款后20日',
|
||||||
|
1, 28, GETDATE(), N'销售绩效测试合同', 1, 0, '2026-08-28', N'复购提成'
|
||||||
|
);
|
||||||
|
|
||||||
|
INSERT INTO dbo.PDM_项目名称
|
||||||
|
(
|
||||||
|
合同编号, 客户流水号, 合同金额, 付款方式流水号, 客户要求, 签订日期, 交货日期, 签订人,
|
||||||
|
合同备注, 是否生成订单, 操作日期, 合同类型, 操作者, 税率, 交货人, 提交日期, 收货人员,
|
||||||
|
交货期限, 是否启用, 通知人, 通知日期, 合同协议, 是否审核, 未收款项, 收款日期, 提成类型
|
||||||
|
)
|
||||||
|
OUTPUT N'退款扣回绩效', inserted.项目流水号 INTO @测试项目(场景, 项目流水号)
|
||||||
|
VALUES
|
||||||
|
(
|
||||||
|
N'TEST-JX-202608-D', 2504, 80000, 2, N'销售绩效测试:8月达标,9月退款扣回。',
|
||||||
|
'2026-08-10', '2026-10-10', 273, N'销售绩效测试数据,可按 TEST-JX- 前缀清理。',
|
||||||
|
1, GETDATE(), 2, 273, 0.13, 273, '2026-08-10', N'罗伟', N'付款后30日',
|
||||||
|
1, 273, GETDATE(), N'销售绩效测试合同', 1, 0, '2026-09-05', N'转介绍提成(专机)'
|
||||||
|
);
|
||||||
|
|
||||||
|
INSERT INTO dbo.PDM_项目名称
|
||||||
|
(
|
||||||
|
合同编号, 客户流水号, 合同金额, 付款方式流水号, 客户要求, 签订日期, 交货日期, 签订人,
|
||||||
|
合同备注, 是否生成订单, 操作日期, 合同类型, 操作者, 税率, 交货人, 提交日期, 收货人员,
|
||||||
|
交货期限, 是否启用, 通知人, 通知日期, 合同协议, 是否审核, 未收款项, 收款日期, 提成类型
|
||||||
|
)
|
||||||
|
OUTPUT N'未达90不计绩效', inserted.项目流水号 INTO @测试项目(场景, 项目流水号)
|
||||||
|
VALUES
|
||||||
|
(
|
||||||
|
N'TEST-JX-202609-E', 2503, 120000, 2, N'销售绩效测试:只回款60%,不应进入绩效。',
|
||||||
|
'2026-09-01', '2026-11-01', 5, N'销售绩效测试数据,可按 TEST-JX- 前缀清理。',
|
||||||
|
1, GETDATE(), 1, 5, 0.13, 5, '2026-09-01', N'最高管理员', N'付款后30日',
|
||||||
|
1, 5, GETDATE(), N'销售绩效测试合同', 1, 48000, '2026-09-18', N'转介绍提成(模块)'
|
||||||
|
);
|
||||||
|
|
||||||
|
INSERT INTO dbo.财务管理_收款记录 (项目流水号, 金额, 时间, 备注)
|
||||||
|
SELECT 项目流水号, 40000, '2026-06-25T10:00:00', N'销售绩效测试:首付款40%' FROM @测试项目 WHERE 场景 = N'跨月达标模块首单'
|
||||||
|
UNION ALL SELECT 项目流水号, 50000, '2026-07-10T15:30:00', N'销售绩效测试:累计达到90%' FROM @测试项目 WHERE 场景 = N'跨月达标模块首单'
|
||||||
|
UNION ALL SELECT 项目流水号, 10000, '2026-08-12T09:20:00', N'销售绩效测试:尾款10%' FROM @测试项目 WHERE 场景 = N'跨月达标模块首单'
|
||||||
|
UNION ALL SELECT 项目流水号, 120000, '2026-07-08T11:00:00', N'销售绩效测试:第一笔回款60%' FROM @测试项目 WHERE 场景 = N'当月达标专机首单'
|
||||||
|
UNION ALL SELECT 项目流水号, 80000, '2026-07-21T16:45:00', N'销售绩效测试:第二笔回款40%' FROM @测试项目 WHERE 场景 = N'当月达标专机首单'
|
||||||
|
UNION ALL SELECT 项目流水号, 45000, '2026-08-28T14:10:00', N'销售绩效测试:复购达到90%' FROM @测试项目 WHERE 场景 = N'复购当月达标'
|
||||||
|
UNION ALL SELECT 项目流水号, 72000, '2026-08-18T10:10:00', N'销售绩效测试:转介绍专机达到90%' FROM @测试项目 WHERE 场景 = N'退款扣回绩效'
|
||||||
|
UNION ALL SELECT 项目流水号, -8000, '2026-09-05T13:40:00', N'销售绩效测试:退款扣回绩效' FROM @测试项目 WHERE 场景 = N'退款扣回绩效'
|
||||||
|
UNION ALL SELECT 项目流水号, 72000, '2026-09-18T09:35:00', N'销售绩效测试:未达到90%,不计绩效' FROM @测试项目 WHERE 场景 = N'未达90不计绩效';
|
||||||
|
|
||||||
|
COMMIT TRANSACTION;
|
||||||
|
|
||||||
|
SELECT
|
||||||
|
t.场景,
|
||||||
|
p.项目流水号,
|
||||||
|
p.合同编号,
|
||||||
|
p.合同金额,
|
||||||
|
p.提成类型,
|
||||||
|
v.客户名称,
|
||||||
|
v.经手人 AS 销售员
|
||||||
|
FROM @测试项目 t
|
||||||
|
INNER JOIN dbo.PDM_项目名称 p ON t.项目流水号 = p.项目流水号
|
||||||
|
LEFT JOIN dbo.PDM_项目名称_视图 v ON p.项目流水号 = v.项目流水号
|
||||||
|
ORDER BY p.项目流水号;
|
||||||
|
END TRY
|
||||||
|
BEGIN CATCH
|
||||||
|
IF @@TRANCOUNT > 0
|
||||||
|
ROLLBACK TRANSACTION;
|
||||||
|
|
||||||
|
-- 修改人:Ld 修改时间:2026-07-28 15:26:14; 测试库 SQL Server 兼容旧版本错误抛出方式。
|
||||||
|
DECLARE @错误信息 nvarchar(4000);
|
||||||
|
DECLARE @错误级别 int;
|
||||||
|
DECLARE @错误状态 int;
|
||||||
|
|
||||||
|
SELECT
|
||||||
|
@错误信息 = ERROR_MESSAGE(),
|
||||||
|
@错误级别 = ERROR_SEVERITY(),
|
||||||
|
@错误状态 = ERROR_STATE();
|
||||||
|
|
||||||
|
RAISERROR(@错误信息, @错误级别, @错误状态);
|
||||||
|
END CATCH;
|
||||||
@@ -0,0 +1,178 @@
|
|||||||
|
-- 库存查询需求量明细排除待发货且部件全完成订单
|
||||||
|
-- 修改人:Ld 修改时间:2026-07-24 15:57:46;
|
||||||
|
|
||||||
|
ALTER PROCEDURE [dbo].[仓储管理_报缺补货_需求量明细_查询]
|
||||||
|
@物料流水号 INT = 15448
|
||||||
|
AS
|
||||||
|
BEGIN
|
||||||
|
SET NOCOUNT ON;
|
||||||
|
|
||||||
|
;WITH 待发货且部件全完成订单 AS
|
||||||
|
(
|
||||||
|
SELECT o.订单编号
|
||||||
|
FROM dbo.合同管理_订单信息_基础表 o
|
||||||
|
INNER JOIN dbo.PDM_项目名称 p ON o.项目流水号 = p.项目流水号
|
||||||
|
INNER JOIN dbo.PDM_组件名称_视图 c ON p.项目流水号 = c.项目流水号
|
||||||
|
WHERE ISNULL(o.是否提交, 0) = 5
|
||||||
|
GROUP BY o.订单编号
|
||||||
|
HAVING SUM(CASE WHEN ISNULL(c.产品状态, 0) = 4 OR ISNULL(c.完成数量, 0) >= ISNULL(c.数量, 0) THEN 1 ELSE 0 END) = COUNT(*)
|
||||||
|
),
|
||||||
|
组件订单 AS
|
||||||
|
(
|
||||||
|
SELECT
|
||||||
|
c.组件流水号,
|
||||||
|
o.订单编号,
|
||||||
|
c.是否分配,
|
||||||
|
o.订单类型,
|
||||||
|
o.是否提交,
|
||||||
|
p.是否启用,
|
||||||
|
ISNULL(k.简称, '') AS 简称
|
||||||
|
FROM dbo.PDM_组件名称 c
|
||||||
|
INNER JOIN dbo.PDM_机床名称 m ON c.机床流水号 = m.机床流水号
|
||||||
|
INNER JOIN dbo.PDM_项目名称 p ON m.项目流水号 = p.项目流水号
|
||||||
|
INNER JOIN dbo.合同管理_订单信息_基础表 o ON p.项目流水号 = o.项目流水号
|
||||||
|
LEFT JOIN dbo.客户关系管理系统_客户名称 k ON p.客户流水号 = k.客户流水号
|
||||||
|
WHERE NOT EXISTS (SELECT 1 FROM 待发货且部件全完成订单 x WHERE x.订单编号 = o.订单编号) -- 修改人:Ld 修改时间:2026-07-24 15:57:46; 待发货且部件全完成的订单平掉库存需求明细
|
||||||
|
),
|
||||||
|
需求明细 AS
|
||||||
|
(
|
||||||
|
SELECT
|
||||||
|
co.订单编号,
|
||||||
|
b.组件流水号,
|
||||||
|
b.物料流水号,
|
||||||
|
SUM(ISNULL(b.零件数量, 0)) AS 需求量,
|
||||||
|
N'生产订单需求' AS 来源
|
||||||
|
FROM dbo.PDM_零件明细表_基本件 b
|
||||||
|
INNER JOIN 组件订单 co ON b.组件流水号 = co.组件流水号
|
||||||
|
WHERE co.是否分配 = 1
|
||||||
|
AND co.订单类型 <> 3
|
||||||
|
AND NOT (ISNULL(co.是否提交, 0) = 6 AND ISNULL(co.是否启用, 0) = 1) -- 修改人:Ld 修改时间:2026-07-14 16:35:00; 明细不显示已完成订单
|
||||||
|
AND (@物料流水号 IS NULL OR b.物料流水号 = @物料流水号)
|
||||||
|
GROUP BY co.订单编号, b.组件流水号, b.物料流水号
|
||||||
|
|
||||||
|
UNION ALL
|
||||||
|
|
||||||
|
SELECT
|
||||||
|
co.订单编号,
|
||||||
|
s.组件流水号,
|
||||||
|
s.物料流水号,
|
||||||
|
SUM(ISNULL(s.零件数量, 0)) AS 需求量,
|
||||||
|
N'生产订单需求' AS 来源
|
||||||
|
FROM dbo.PDM_零件明细表_标准件和外购件 s
|
||||||
|
INNER JOIN 组件订单 co ON s.组件流水号 = co.组件流水号
|
||||||
|
WHERE co.是否分配 = 1
|
||||||
|
AND co.订单类型 <> 3
|
||||||
|
AND NOT (ISNULL(co.是否提交, 0) = 6 AND ISNULL(co.是否启用, 0) = 1) -- 修改人:Ld 修改时间:2026-07-14 16:35:00; 明细不显示已完成订单
|
||||||
|
AND (@物料流水号 IS NULL OR s.物料流水号 = @物料流水号)
|
||||||
|
GROUP BY co.订单编号, s.组件流水号, s.物料流水号
|
||||||
|
|
||||||
|
UNION ALL
|
||||||
|
|
||||||
|
SELECT
|
||||||
|
co.订单编号,
|
||||||
|
t.组件流水号,
|
||||||
|
t.物料流水号,
|
||||||
|
SUM(ISNULL(t.实领数, 0)) AS 需求量,
|
||||||
|
N'临时领料需求' AS 来源
|
||||||
|
FROM dbo.车间装配管理_装配执行_临时领料明细 t
|
||||||
|
LEFT JOIN 组件订单 co ON t.组件流水号 = co.组件流水号
|
||||||
|
WHERE t.物料流水号 IS NOT NULL
|
||||||
|
AND co.订单编号 IS NOT NULL
|
||||||
|
AND NOT (ISNULL(co.是否提交, 0) = 6 AND ISNULL(co.是否启用, 0) = 1) -- 修改人:Ld 修改时间:2026-07-14 16:35:00; 临时领料明细不显示已完成订单
|
||||||
|
AND (@物料流水号 IS NULL OR t.物料流水号 = @物料流水号)
|
||||||
|
GROUP BY co.订单编号, t.组件流水号, t.物料流水号
|
||||||
|
),
|
||||||
|
已领明细 AS
|
||||||
|
(
|
||||||
|
SELECT
|
||||||
|
co.订单编号,
|
||||||
|
b.组件流水号,
|
||||||
|
b.物料流水号,
|
||||||
|
SUM(ISNULL(l.已领数量, 0)) AS 已领数
|
||||||
|
FROM dbo.车间装配管理_领料单明细 l
|
||||||
|
INNER JOIN dbo.PDM_零件明细表_基本件 b ON l.基本件流水号 = b.基本件流水号
|
||||||
|
INNER JOIN 组件订单 co ON b.组件流水号 = co.组件流水号
|
||||||
|
WHERE NOT (ISNULL(co.是否提交, 0) = 6 AND ISNULL(co.是否启用, 0) = 1) -- 修改人:Ld 修改时间:2026-07-14 16:35:00; 明细扣减已领数时同步排除已完成订单
|
||||||
|
AND (@物料流水号 IS NULL OR b.物料流水号 = @物料流水号)
|
||||||
|
GROUP BY co.订单编号, b.组件流水号, b.物料流水号
|
||||||
|
|
||||||
|
UNION ALL
|
||||||
|
|
||||||
|
SELECT
|
||||||
|
co.订单编号,
|
||||||
|
s.组件流水号,
|
||||||
|
s.物料流水号,
|
||||||
|
SUM(ISNULL(l.已领数量, 0)) AS 已领数
|
||||||
|
FROM dbo.车间装配管理_领料单明细 l
|
||||||
|
INNER JOIN dbo.PDM_零件明细表_标准件和外购件 s ON l.标准件和外购件流水号 = s.标准件和外购件流水号
|
||||||
|
INNER JOIN 组件订单 co ON s.组件流水号 = co.组件流水号
|
||||||
|
WHERE NOT (ISNULL(co.是否提交, 0) = 6 AND ISNULL(co.是否启用, 0) = 1) -- 修改人:Ld 修改时间:2026-07-14 16:35:00; 明细扣减已领数时同步排除已完成订单
|
||||||
|
AND (@物料流水号 IS NULL OR s.物料流水号 = @物料流水号)
|
||||||
|
GROUP BY co.订单编号, s.组件流水号, s.物料流水号
|
||||||
|
|
||||||
|
UNION ALL
|
||||||
|
|
||||||
|
SELECT
|
||||||
|
co.订单编号,
|
||||||
|
l.组件流水号,
|
||||||
|
l.物料流水号,
|
||||||
|
SUM(ISNULL(l.已领数量, 0)) AS 已领数
|
||||||
|
FROM dbo.车间装配管理_领料单明细 l
|
||||||
|
LEFT JOIN 组件订单 co ON l.组件流水号 = co.组件流水号
|
||||||
|
WHERE l.物料流水号 IS NOT NULL
|
||||||
|
AND ISNULL(l.物料流水号, 0) <> 0
|
||||||
|
AND ISNULL(l.基本件流水号, 0) = 0
|
||||||
|
AND ISNULL(l.标准件和外购件流水号, 0) = 0
|
||||||
|
AND NOT (ISNULL(co.是否提交, 0) = 6 AND ISNULL(co.是否启用, 0) = 1) -- 修改人:Ld 修改时间:2026-07-14 16:35:00; 临时件明细扣减已领数时同步排除已完成订单
|
||||||
|
AND (@物料流水号 IS NULL OR l.物料流水号 = @物料流水号)
|
||||||
|
GROUP BY co.订单编号, l.组件流水号, l.物料流水号
|
||||||
|
),
|
||||||
|
已领汇总 AS
|
||||||
|
(
|
||||||
|
SELECT 订单编号, 组件流水号, 物料流水号, SUM(已领数) AS 已领数
|
||||||
|
FROM 已领明细
|
||||||
|
GROUP BY 订单编号, 组件流水号, 物料流水号
|
||||||
|
),
|
||||||
|
明细 AS
|
||||||
|
(
|
||||||
|
SELECT
|
||||||
|
d.订单编号,
|
||||||
|
d.组件流水号,
|
||||||
|
d.物料流水号,
|
||||||
|
d.需求量,
|
||||||
|
ISNULL(l.已领数, 0) AS 已领数,
|
||||||
|
CASE WHEN d.需求量 > ISNULL(l.已领数, 0) THEN d.需求量 - ISNULL(l.已领数, 0) ELSE 0 END AS 最终需求量,
|
||||||
|
d.来源
|
||||||
|
FROM 需求明细 d
|
||||||
|
LEFT JOIN 已领汇总 l
|
||||||
|
ON d.物料流水号 = l.物料流水号
|
||||||
|
AND d.组件流水号 = l.组件流水号
|
||||||
|
AND ISNULL(d.订单编号, '') = ISNULL(l.订单编号, '')
|
||||||
|
)
|
||||||
|
SELECT
|
||||||
|
d.订单编号,
|
||||||
|
d.组件流水号,
|
||||||
|
d.物料流水号,
|
||||||
|
d.需求量,
|
||||||
|
d.已领数,
|
||||||
|
d.最终需求量,
|
||||||
|
ISNULL(co.简称, '') AS 简称,
|
||||||
|
d.来源
|
||||||
|
FROM 明细 d
|
||||||
|
LEFT JOIN 组件订单 co ON d.组件流水号 = co.组件流水号
|
||||||
|
ORDER BY d.订单编号, d.组件流水号, d.来源;
|
||||||
|
|
||||||
|
;WITH 汇总 AS
|
||||||
|
(
|
||||||
|
SELECT 物料流水号, 需求量
|
||||||
|
FROM dbo.物料管理_需求量_视图
|
||||||
|
WHERE (@物料流水号 IS NULL OR 物料流水号 = @物料流水号)
|
||||||
|
)
|
||||||
|
SELECT
|
||||||
|
物料流水号,
|
||||||
|
需求量 AS 总需求量,
|
||||||
|
0 AS 总已领数,
|
||||||
|
需求量 AS 总最终需求量
|
||||||
|
FROM 汇总
|
||||||
|
ORDER BY 物料流水号;
|
||||||
|
END;
|
||||||
@@ -1,322 +1,306 @@
|
|||||||
-- 库存查询需求量性能优化:直连基础表判断订单完成状态,减少重视图展开
|
-- 搴撳瓨鏌ヨ闇€姹傞噺鎬ц兘浼樺寲锛氱洿杩炲熀纭€琛ㄥ垽鏂鍗曞畬鎴愮姸鎬侊紝鍑忓皯閲嶈鍥惧睍寮€
|
||||||
-- 修改人:Ld 修改时间:2026-07-14 16:35:00;
|
-- 淇敼浜?Ld 淇敼鏃堕棿:2026-07-14 16:35:00;
|
||||||
|
|
||||||
IF NOT EXISTS (SELECT 1 FROM sys.indexes WHERE name = N'IX_Ld_零件基本件_物料组件_20260714' AND object_id = OBJECT_ID(N'dbo.PDM_零件明细表_基本件'))
|
IF NOT EXISTS (SELECT 1 FROM sys.indexes WHERE name = N'IX_Ld_闆朵欢鍩烘湰浠禵鐗╂枡缁勪欢_20260714' AND object_id = OBJECT_ID(N'dbo.PDM_闆朵欢鏄庣粏琛╛鍩烘湰浠?))
|
||||||
BEGIN
|
BEGIN
|
||||||
CREATE NONCLUSTERED INDEX IX_Ld_零件基本件_物料组件_20260714
|
CREATE NONCLUSTERED INDEX IX_Ld_闆朵欢鍩烘湰浠禵鐗╂枡缁勪欢_20260714
|
||||||
ON dbo.PDM_零件明细表_基本件 (物料流水号, 组件流水号)
|
ON dbo.PDM_闆朵欢鏄庣粏琛╛鍩烘湰浠?(鐗╂枡娴佹按鍙? 缁勪欢娴佹按鍙?
|
||||||
INCLUDE (零件数量, 已领数量);
|
INCLUDE (闆朵欢鏁伴噺, 宸查鏁伴噺);
|
||||||
END;
|
END;
|
||||||
GO
|
GO
|
||||||
|
|
||||||
IF NOT EXISTS (SELECT 1 FROM sys.indexes WHERE name = N'IX_Ld_零件标准外购_物料组件_20260714' AND object_id = OBJECT_ID(N'dbo.PDM_零件明细表_标准件和外购件'))
|
IF NOT EXISTS (SELECT 1 FROM sys.indexes WHERE name = N'IX_Ld_闆朵欢鏍囧噯澶栬喘_鐗╂枡缁勪欢_20260714' AND object_id = OBJECT_ID(N'dbo.PDM_闆朵欢鏄庣粏琛╛鏍囧噯浠跺拰澶栬喘浠?))
|
||||||
BEGIN
|
BEGIN
|
||||||
CREATE NONCLUSTERED INDEX IX_Ld_零件标准外购_物料组件_20260714
|
CREATE NONCLUSTERED INDEX IX_Ld_闆朵欢鏍囧噯澶栬喘_鐗╂枡缁勪欢_20260714
|
||||||
ON dbo.PDM_零件明细表_标准件和外购件 (物料流水号, 组件流水号)
|
ON dbo.PDM_闆朵欢鏄庣粏琛╛鏍囧噯浠跺拰澶栬喘浠?(鐗╂枡娴佹按鍙? 缁勪欢娴佹按鍙?
|
||||||
INCLUDE (零件数量, 已领数量);
|
INCLUDE (闆朵欢鏁伴噺, 宸查鏁伴噺);
|
||||||
END;
|
END;
|
||||||
GO
|
GO
|
||||||
|
|
||||||
IF NOT EXISTS (SELECT 1 FROM sys.indexes WHERE name = N'IX_Ld_临时领料_物料组件_20260714' AND object_id = OBJECT_ID(N'dbo.车间装配管理_装配执行_临时领料明细'))
|
IF NOT EXISTS (SELECT 1 FROM sys.indexes WHERE name = N'IX_Ld_涓存椂棰嗘枡_鐗╂枡缁勪欢_20260714' AND object_id = OBJECT_ID(N'dbo.杞﹂棿瑁呴厤绠$悊_瑁呴厤鎵ц_涓存椂棰嗘枡鏄庣粏'))
|
||||||
BEGIN
|
BEGIN
|
||||||
CREATE NONCLUSTERED INDEX IX_Ld_临时领料_物料组件_20260714
|
CREATE NONCLUSTERED INDEX IX_Ld_涓存椂棰嗘枡_鐗╂枡缁勪欢_20260714
|
||||||
ON dbo.车间装配管理_装配执行_临时领料明细 (物料流水号, 组件流水号)
|
ON dbo.杞﹂棿瑁呴厤绠$悊_瑁呴厤鎵ц_涓存椂棰嗘枡鏄庣粏 (鐗╂枡娴佹按鍙? 缁勪欢娴佹按鍙?
|
||||||
INCLUDE (实领数);
|
INCLUDE (瀹為鏁?;
|
||||||
END;
|
END;
|
||||||
GO
|
GO
|
||||||
|
|
||||||
IF NOT EXISTS (SELECT 1 FROM sys.indexes WHERE name = N'IX_Ld_领料明细_基本件_20260714' AND object_id = OBJECT_ID(N'dbo.车间装配管理_领料单明细'))
|
IF NOT EXISTS (SELECT 1 FROM sys.indexes WHERE name = N'IX_Ld_棰嗘枡鏄庣粏_鍩烘湰浠禵20260714' AND object_id = OBJECT_ID(N'dbo.杞﹂棿瑁呴厤绠$悊_棰嗘枡鍗曟槑缁?))
|
||||||
BEGIN
|
BEGIN
|
||||||
CREATE NONCLUSTERED INDEX IX_Ld_领料明细_基本件_20260714
|
CREATE NONCLUSTERED INDEX IX_Ld_棰嗘枡鏄庣粏_鍩烘湰浠禵20260714
|
||||||
ON dbo.车间装配管理_领料单明细 (基本件流水号)
|
ON dbo.杞﹂棿瑁呴厤绠$悊_棰嗘枡鍗曟槑缁?(鍩烘湰浠舵祦姘村彿)
|
||||||
INCLUDE (已领数量);
|
INCLUDE (宸查鏁伴噺);
|
||||||
END;
|
END;
|
||||||
GO
|
GO
|
||||||
|
|
||||||
IF NOT EXISTS (SELECT 1 FROM sys.indexes WHERE name = N'IX_Ld_领料明细_标准外购_20260714' AND object_id = OBJECT_ID(N'dbo.车间装配管理_领料单明细'))
|
IF NOT EXISTS (SELECT 1 FROM sys.indexes WHERE name = N'IX_Ld_棰嗘枡鏄庣粏_鏍囧噯澶栬喘_20260714' AND object_id = OBJECT_ID(N'dbo.杞﹂棿瑁呴厤绠$悊_棰嗘枡鍗曟槑缁?))
|
||||||
BEGIN
|
BEGIN
|
||||||
CREATE NONCLUSTERED INDEX IX_Ld_领料明细_标准外购_20260714
|
CREATE NONCLUSTERED INDEX IX_Ld_棰嗘枡鏄庣粏_鏍囧噯澶栬喘_20260714
|
||||||
ON dbo.车间装配管理_领料单明细 (标准件和外购件流水号)
|
ON dbo.杞﹂棿瑁呴厤绠$悊_棰嗘枡鍗曟槑缁?(鏍囧噯浠跺拰澶栬喘浠舵祦姘村彿)
|
||||||
INCLUDE (已领数量);
|
INCLUDE (宸查鏁伴噺);
|
||||||
END;
|
END;
|
||||||
GO
|
GO
|
||||||
|
|
||||||
IF NOT EXISTS (SELECT 1 FROM sys.indexes WHERE name = N'IX_Ld_领料明细_物料组件_20260714' AND object_id = OBJECT_ID(N'dbo.车间装配管理_领料单明细'))
|
IF NOT EXISTS (SELECT 1 FROM sys.indexes WHERE name = N'IX_Ld_棰嗘枡鏄庣粏_鐗╂枡缁勪欢_20260714' AND object_id = OBJECT_ID(N'dbo.杞﹂棿瑁呴厤绠$悊_棰嗘枡鍗曟槑缁?))
|
||||||
BEGIN
|
BEGIN
|
||||||
CREATE NONCLUSTERED INDEX IX_Ld_领料明细_物料组件_20260714
|
CREATE NONCLUSTERED INDEX IX_Ld_棰嗘枡鏄庣粏_鐗╂枡缁勪欢_20260714
|
||||||
ON dbo.车间装配管理_领料单明细 (物料流水号, 组件流水号)
|
ON dbo.杞﹂棿瑁呴厤绠$悊_棰嗘枡鍗曟槑缁?(鐗╂枡娴佹按鍙? 缁勪欢娴佹按鍙?
|
||||||
INCLUDE (已领数量);
|
INCLUDE (宸查鏁伴噺);
|
||||||
END;
|
END;
|
||||||
GO
|
GO
|
||||||
|
|
||||||
ALTER VIEW dbo.物料管理_需求量_视图
|
ALTER VIEW dbo.鐗╂枡绠$悊_闇€姹傞噺_瑙嗗浘
|
||||||
AS
|
AS
|
||||||
WITH 组件订单 AS
|
WITH 待发货且部件全完成订单 AS
|
||||||
|
(
|
||||||
|
SELECT o.订单编号
|
||||||
|
FROM dbo.合同管理_订单信息_基础表 o
|
||||||
|
INNER JOIN dbo.PDM_项目名称 p ON o.项目流水号 = p.项目流水号
|
||||||
|
INNER JOIN dbo.PDM_组件名称_视图 c ON p.项目流水号 = c.项目流水号
|
||||||
|
WHERE ISNULL(o.是否提交, 0) = 5
|
||||||
|
GROUP BY o.订单编号
|
||||||
|
HAVING SUM(CASE WHEN ISNULL(c.产品状态, 0) = 4 OR ISNULL(c.完成数量, 0) >= ISNULL(c.数量, 0) THEN 1 ELSE 0 END) = COUNT(*)
|
||||||
|
),
|
||||||
|
组件订单 AS
|
||||||
(
|
(
|
||||||
SELECT
|
SELECT
|
||||||
c.组件流水号,
|
c.缁勪欢娴佹按鍙?,
|
||||||
c.是否分配,
|
c.鏄惁鍒嗛厤,
|
||||||
o.订单类型,
|
o.璁㈠崟绫诲瀷,
|
||||||
o.是否提交,
|
o.鏄惁鎻愪氦,
|
||||||
p.是否启用
|
p.鏄惁鍚敤
|
||||||
FROM dbo.PDM_组件名称 c
|
FROM dbo.PDM_缁勪欢鍚嶇О c
|
||||||
INNER JOIN dbo.PDM_机床名称 m ON c.机床流水号 = m.机床流水号
|
INNER JOIN dbo.PDM_鏈哄簥鍚嶇О m ON c.鏈哄簥娴佹按鍙?= m.鏈哄簥娴佹按鍙? INNER JOIN dbo.PDM_椤圭洰鍚嶇О p ON m.椤圭洰娴佹按鍙?= p.椤圭洰娴佹按鍙? INNER JOIN dbo.鍚堝悓绠$悊_璁㈠崟淇℃伅_鍩虹琛?o ON p.椤圭洰娴佹按鍙?= o.椤圭洰娴佹按鍙?
|
||||||
INNER JOIN dbo.PDM_项目名称 p ON m.项目流水号 = p.项目流水号
|
WHERE NOT EXISTS (SELECT 1 FROM 待发货且部件全完成订单 x WHERE x.订单编号 = o.订单编号) -- 修改人:Ld 修改时间:2026-07-24 14:12:57; 待发货且部件全完成的订单平掉库存需求
|
||||||
INNER JOIN dbo.合同管理_订单信息_基础表 o ON p.项目流水号 = o.项目流水号
|
|
||||||
),
|
),
|
||||||
需求 AS
|
闇€姹?AS
|
||||||
(
|
(
|
||||||
SELECT b.物料流水号, SUM(ISNULL(b.零件数量, 0)) AS 需求量
|
SELECT b.鐗╂枡娴佹按鍙? SUM(ISNULL(b.闆朵欢鏁伴噺, 0)) AS 闇€姹傞噺
|
||||||
FROM dbo.PDM_零件明细表_基本件 b
|
FROM dbo.PDM_闆朵欢鏄庣粏琛╛鍩烘湰浠?b
|
||||||
INNER JOIN 组件订单 co ON b.组件流水号 = co.组件流水号
|
INNER JOIN 缁勪欢璁㈠崟 co ON b.缁勪欢娴佹按鍙?= co.缁勪欢娴佹按鍙? WHERE co.鏄惁鍒嗛厤 = 1
|
||||||
WHERE co.是否分配 = 1
|
AND co.璁㈠崟绫诲瀷 <> 3
|
||||||
AND co.订单类型 <> 3
|
AND NOT (ISNULL(co.鏄惁鎻愪氦, 0) = 6 AND ISNULL(co.鏄惁鍚敤, 0) = 1) -- 淇敼浜?Ld 淇敼鏃堕棿:2026-07-14 16:35:00; 鐩存帴鐢ㄥ熀纭€瀛楁鎺掗櫎宸插畬鎴愯鍗? GROUP BY b.鐗╂枡娴佹按鍙?
|
||||||
AND NOT (ISNULL(co.是否提交, 0) = 6 AND ISNULL(co.是否启用, 0) = 1) -- 修改人:Ld 修改时间:2026-07-14 16:35:00; 直接用基础字段排除已完成订单
|
|
||||||
GROUP BY b.物料流水号
|
|
||||||
|
|
||||||
UNION ALL
|
UNION ALL
|
||||||
|
|
||||||
SELECT s.物料流水号, SUM(ISNULL(s.零件数量, 0)) AS 需求量
|
SELECT s.鐗╂枡娴佹按鍙? SUM(ISNULL(s.闆朵欢鏁伴噺, 0)) AS 闇€姹傞噺
|
||||||
FROM dbo.PDM_零件明细表_标准件和外购件 s
|
FROM dbo.PDM_闆朵欢鏄庣粏琛╛鏍囧噯浠跺拰澶栬喘浠?s
|
||||||
INNER JOIN 组件订单 co ON s.组件流水号 = co.组件流水号
|
INNER JOIN 缁勪欢璁㈠崟 co ON s.缁勪欢娴佹按鍙?= co.缁勪欢娴佹按鍙? WHERE co.鏄惁鍒嗛厤 = 1
|
||||||
WHERE co.是否分配 = 1
|
AND co.璁㈠崟绫诲瀷 <> 3
|
||||||
AND co.订单类型 <> 3
|
AND NOT (ISNULL(co.鏄惁鎻愪氦, 0) = 6 AND ISNULL(co.鏄惁鍚敤, 0) = 1) -- 淇敼浜?Ld 淇敼鏃堕棿:2026-07-14 16:35:00; 鐩存帴鐢ㄥ熀纭€瀛楁鎺掗櫎宸插畬鎴愯鍗? GROUP BY s.鐗╂枡娴佹按鍙?
|
||||||
AND NOT (ISNULL(co.是否提交, 0) = 6 AND ISNULL(co.是否启用, 0) = 1) -- 修改人:Ld 修改时间:2026-07-14 16:35:00; 直接用基础字段排除已完成订单
|
|
||||||
GROUP BY s.物料流水号
|
|
||||||
|
|
||||||
UNION ALL
|
UNION ALL
|
||||||
|
|
||||||
SELECT t.物料流水号, SUM(ISNULL(t.实领数, 0)) AS 需求量
|
SELECT t.鐗╂枡娴佹按鍙? SUM(ISNULL(t.瀹為鏁? 0)) AS 闇€姹傞噺
|
||||||
FROM dbo.车间装配管理_装配执行_临时领料明细 t
|
FROM dbo.杞﹂棿瑁呴厤绠$悊_瑁呴厤鎵ц_涓存椂棰嗘枡鏄庣粏 t
|
||||||
LEFT JOIN 组件订单 co ON t.组件流水号 = co.组件流水号
|
LEFT JOIN 缁勪欢璁㈠崟 co ON t.缁勪欢娴佹按鍙?= co.缁勪欢娴佹按鍙? WHERE t.鐗╂枡娴佹按鍙?IS NOT NULL
|
||||||
WHERE t.物料流水号 IS NOT NULL
|
AND NOT (ISNULL(co.鏄惁鎻愪氦, 0) = 6 AND ISNULL(co.鏄惁鍚敤, 0) = 1) -- 淇敼浜?Ld 淇敼鏃堕棿:2026-07-14 16:35:00; 涓存椂棰嗘枡鍚屽彛寰勬帓闄ゅ凡瀹屾垚璁㈠崟
|
||||||
AND NOT (ISNULL(co.是否提交, 0) = 6 AND ISNULL(co.是否启用, 0) = 1) -- 修改人:Ld 修改时间:2026-07-14 16:35:00; 临时领料同口径排除已完成订单
|
GROUP BY t.鐗╂枡娴佹按鍙?),
|
||||||
GROUP BY t.物料流水号
|
闇€姹傛眹鎬?AS
|
||||||
),
|
|
||||||
需求汇总 AS
|
|
||||||
(
|
(
|
||||||
SELECT 物料流水号, SUM(需求量) AS 需求量
|
SELECT 鐗╂枡娴佹按鍙? SUM(闇€姹傞噺) AS 闇€姹傞噺
|
||||||
FROM 需求
|
FROM 闇€姹? GROUP BY 鐗╂枡娴佹按鍙?),
|
||||||
GROUP BY 物料流水号
|
宸查 AS
|
||||||
),
|
|
||||||
已领 AS
|
|
||||||
(
|
(
|
||||||
SELECT b.物料流水号, SUM(ISNULL(l.已领数量, 0)) AS 已领数
|
SELECT b.鐗╂枡娴佹按鍙? SUM(ISNULL(l.宸查鏁伴噺, 0)) AS 宸查鏁? FROM dbo.杞﹂棿瑁呴厤绠$悊_棰嗘枡鍗曟槑缁?l
|
||||||
FROM dbo.车间装配管理_领料单明细 l
|
INNER JOIN dbo.PDM_闆朵欢鏄庣粏琛╛鍩烘湰浠?b ON l.鍩烘湰浠舵祦姘村彿 = b.鍩烘湰浠舵祦姘村彿
|
||||||
INNER JOIN dbo.PDM_零件明细表_基本件 b ON l.基本件流水号 = b.基本件流水号
|
INNER JOIN 缁勪欢璁㈠崟 co ON b.缁勪欢娴佹按鍙?= co.缁勪欢娴佹按鍙? WHERE NOT (ISNULL(co.鏄惁鎻愪氦, 0) = 6 AND ISNULL(co.鏄惁鍚敤, 0) = 1) -- 淇敼浜?Ld 淇敼鏃堕棿:2026-07-14 16:35:00; 鎵e噺宸查鏁版椂鍚屾鎺掗櫎宸插畬鎴愯鍗? GROUP BY b.鐗╂枡娴佹按鍙?
|
||||||
INNER JOIN 组件订单 co ON b.组件流水号 = co.组件流水号
|
|
||||||
WHERE NOT (ISNULL(co.是否提交, 0) = 6 AND ISNULL(co.是否启用, 0) = 1) -- 修改人:Ld 修改时间:2026-07-14 16:35:00; 扣减已领数时同步排除已完成订单
|
|
||||||
GROUP BY b.物料流水号
|
|
||||||
|
|
||||||
UNION ALL
|
UNION ALL
|
||||||
|
|
||||||
SELECT s.物料流水号, SUM(ISNULL(l.已领数量, 0)) AS 已领数
|
SELECT s.鐗╂枡娴佹按鍙? SUM(ISNULL(l.宸查鏁伴噺, 0)) AS 宸查鏁? FROM dbo.杞﹂棿瑁呴厤绠$悊_棰嗘枡鍗曟槑缁?l
|
||||||
FROM dbo.车间装配管理_领料单明细 l
|
INNER JOIN dbo.PDM_闆朵欢鏄庣粏琛╛鏍囧噯浠跺拰澶栬喘浠?s ON l.鏍囧噯浠跺拰澶栬喘浠舵祦姘村彿 = s.鏍囧噯浠跺拰澶栬喘浠舵祦姘村彿
|
||||||
INNER JOIN dbo.PDM_零件明细表_标准件和外购件 s ON l.标准件和外购件流水号 = s.标准件和外购件流水号
|
INNER JOIN 缁勪欢璁㈠崟 co ON s.缁勪欢娴佹按鍙?= co.缁勪欢娴佹按鍙? WHERE NOT (ISNULL(co.鏄惁鎻愪氦, 0) = 6 AND ISNULL(co.鏄惁鍚敤, 0) = 1) -- 淇敼浜?Ld 淇敼鏃堕棿:2026-07-14 16:35:00; 鎵e噺宸查鏁版椂鍚屾鎺掗櫎宸插畬鎴愯鍗? GROUP BY s.鐗╂枡娴佹按鍙?
|
||||||
INNER JOIN 组件订单 co ON s.组件流水号 = co.组件流水号
|
|
||||||
WHERE NOT (ISNULL(co.是否提交, 0) = 6 AND ISNULL(co.是否启用, 0) = 1) -- 修改人:Ld 修改时间:2026-07-14 16:35:00; 扣减已领数时同步排除已完成订单
|
|
||||||
GROUP BY s.物料流水号
|
|
||||||
|
|
||||||
UNION ALL
|
UNION ALL
|
||||||
|
|
||||||
SELECT l.物料流水号, SUM(ISNULL(l.已领数量, 0)) AS 已领数
|
SELECT l.鐗╂枡娴佹按鍙? SUM(ISNULL(l.宸查鏁伴噺, 0)) AS 宸查鏁? FROM dbo.杞﹂棿瑁呴厤绠$悊_棰嗘枡鍗曟槑缁?l
|
||||||
FROM dbo.车间装配管理_领料单明细 l
|
LEFT JOIN 缁勪欢璁㈠崟 co ON l.缁勪欢娴佹按鍙?= co.缁勪欢娴佹按鍙? WHERE l.鐗╂枡娴佹按鍙?IS NOT NULL
|
||||||
LEFT JOIN 组件订单 co ON l.组件流水号 = co.组件流水号
|
AND ISNULL(l.鐗╂枡娴佹按鍙? 0) <> 0
|
||||||
WHERE l.物料流水号 IS NOT NULL
|
AND ISNULL(l.鍩烘湰浠舵祦姘村彿, 0) = 0
|
||||||
AND ISNULL(l.物料流水号, 0) <> 0
|
AND ISNULL(l.鏍囧噯浠跺拰澶栬喘浠舵祦姘村彿, 0) = 0
|
||||||
AND ISNULL(l.基本件流水号, 0) = 0
|
AND NOT (ISNULL(co.鏄惁鎻愪氦, 0) = 6 AND ISNULL(co.鏄惁鍚敤, 0) = 1) -- 淇敼浜?Ld 淇敼鏃堕棿:2026-07-14 16:35:00; 涓存椂浠舵墸鍑忓凡棰嗘暟鏃跺悓姝ユ帓闄ゅ凡瀹屾垚璁㈠崟
|
||||||
AND ISNULL(l.标准件和外购件流水号, 0) = 0
|
GROUP BY l.鐗╂枡娴佹按鍙?),
|
||||||
AND NOT (ISNULL(co.是否提交, 0) = 6 AND ISNULL(co.是否启用, 0) = 1) -- 修改人:Ld 修改时间:2026-07-14 16:35:00; 临时件扣减已领数时同步排除已完成订单
|
宸查姹囨€?AS
|
||||||
GROUP BY l.物料流水号
|
|
||||||
),
|
|
||||||
已领汇总 AS
|
|
||||||
(
|
(
|
||||||
SELECT 物料流水号, SUM(已领数) AS 已领数
|
SELECT 鐗╂枡娴佹按鍙? SUM(宸查鏁? AS 宸查鏁? FROM 宸查
|
||||||
FROM 已领
|
GROUP BY 鐗╂枡娴佹按鍙?)
|
||||||
GROUP BY 物料流水号
|
|
||||||
)
|
|
||||||
SELECT
|
SELECT
|
||||||
d.物料流水号,
|
d.鐗╂枡娴佹按鍙?
|
||||||
CASE WHEN d.需求量 > ISNULL(l.已领数, 0) THEN d.需求量 - ISNULL(l.已领数, 0) ELSE 0 END AS 需求量
|
CASE WHEN d.闇€姹傞噺 > ISNULL(l.宸查鏁? 0) THEN d.闇€姹傞噺 - ISNULL(l.宸查鏁? 0) ELSE 0 END AS 闇€姹傞噺
|
||||||
FROM 需求汇总 d
|
FROM 闇€姹傛眹鎬?d
|
||||||
LEFT JOIN 已领汇总 l ON d.物料流水号 = l.物料流水号;
|
LEFT JOIN 宸查姹囨€?l ON d.鐗╂枡娴佹按鍙?= l.鐗╂枡娴佹按鍙?
|
||||||
GO
|
GO
|
||||||
|
|
||||||
ALTER PROCEDURE [dbo].[物料管理_需求量_更新]
|
ALTER PROCEDURE [dbo].[鐗╂枡绠$悊_闇€姹傞噺_鏇存柊]
|
||||||
AS
|
AS
|
||||||
BEGIN
|
BEGIN
|
||||||
SET NOCOUNT ON;
|
SET NOCOUNT ON;
|
||||||
|
|
||||||
DELETE FROM dbo.物料管理_需求量;
|
DELETE FROM dbo.鐗╂枡绠$悊_闇€姹傞噺;
|
||||||
|
|
||||||
INSERT INTO dbo.物料管理_需求量
|
INSERT INTO dbo.鐗╂枡绠$悊_闇€姹傞噺
|
||||||
SELECT 物料流水号, 需求量
|
SELECT 鐗╂枡娴佹按鍙? 闇€姹傞噺
|
||||||
FROM dbo.物料管理_需求量_视图
|
FROM dbo.鐗╂枡绠$悊_闇€姹傞噺_瑙嗗浘
|
||||||
WHERE 需求量 > 0;
|
WHERE 闇€姹傞噺 > 0;
|
||||||
END;
|
END;
|
||||||
GO
|
GO
|
||||||
|
|
||||||
ALTER PROCEDURE [dbo].[仓储管理_报缺补货_需求量明细_查询]
|
ALTER PROCEDURE [dbo].[浠撳偍绠$悊_鎶ョ己琛ヨ揣_闇€姹傞噺鏄庣粏_鏌ヨ]
|
||||||
@物料流水号 INT = 15448
|
@鐗╂枡娴佹按鍙?INT = 15448
|
||||||
AS
|
AS
|
||||||
BEGIN
|
BEGIN
|
||||||
SET NOCOUNT ON;
|
SET NOCOUNT ON;
|
||||||
|
;WITH 待发货且部件全完成订单 AS
|
||||||
;WITH 组件订单 AS
|
|
||||||
(
|
(
|
||||||
SELECT
|
SELECT o.订单编号
|
||||||
c.组件流水号,
|
FROM dbo.合同管理_订单信息_基础表 o
|
||||||
o.订单编号,
|
INNER JOIN dbo.PDM_项目名称 p ON o.项目流水号 = p.项目流水号
|
||||||
c.是否分配,
|
INNER JOIN dbo.PDM_组件名称_视图 c ON p.项目流水号 = c.项目流水号
|
||||||
o.订单类型,
|
WHERE ISNULL(o.是否提交, 0) = 5
|
||||||
o.是否提交,
|
GROUP BY o.订单编号
|
||||||
p.是否启用,
|
HAVING SUM(CASE WHEN ISNULL(c.产品状态, 0) = 4 OR ISNULL(c.完成数量, 0) >= ISNULL(c.数量, 0) THEN 1 ELSE 0 END) = COUNT(*)
|
||||||
ISNULL(k.简称, '') AS 简称
|
|
||||||
FROM dbo.PDM_组件名称 c
|
|
||||||
INNER JOIN dbo.PDM_机床名称 m ON c.机床流水号 = m.机床流水号
|
|
||||||
INNER JOIN dbo.PDM_项目名称 p ON m.项目流水号 = p.项目流水号
|
|
||||||
INNER JOIN dbo.合同管理_订单信息_基础表 o ON p.项目流水号 = o.项目流水号
|
|
||||||
LEFT JOIN dbo.客户关系管理系统_客户名称 k ON p.客户流水号 = k.客户流水号
|
|
||||||
),
|
),
|
||||||
需求明细 AS
|
组件订单 AS
|
||||||
(
|
(
|
||||||
SELECT
|
SELECT
|
||||||
co.订单编号,
|
c.缁勪欢娴佹按鍙?,
|
||||||
b.组件流水号,
|
o.璁㈠崟缂栧彿,
|
||||||
b.物料流水号,
|
c.鏄惁鍒嗛厤,
|
||||||
SUM(ISNULL(b.零件数量, 0)) AS 需求量,
|
o.璁㈠崟绫诲瀷,
|
||||||
N'生产订单需求' AS 来源
|
o.鏄惁鎻愪氦,
|
||||||
FROM dbo.PDM_零件明细表_基本件 b
|
p.鏄惁鍚敤,
|
||||||
INNER JOIN 组件订单 co ON b.组件流水号 = co.组件流水号
|
ISNULL(k.绠€绉? '') AS 绠€绉?
|
||||||
WHERE co.是否分配 = 1
|
FROM dbo.PDM_缁勪欢鍚嶇О c
|
||||||
AND co.订单类型 <> 3
|
INNER JOIN dbo.PDM_鏈哄簥鍚嶇О m ON c.鏈哄簥娴佹按鍙?= m.鏈哄簥娴佹按鍙?
|
||||||
AND NOT (ISNULL(co.是否提交, 0) = 6 AND ISNULL(co.是否启用, 0) = 1) -- 修改人:Ld 修改时间:2026-07-14 16:35:00; 明细不显示已完成订单
|
INNER JOIN dbo.PDM_椤圭洰鍚嶇О p ON m.椤圭洰娴佹按鍙?= p.椤圭洰娴佹按鍙?
|
||||||
AND (@物料流水号 IS NULL OR b.物料流水号 = @物料流水号)
|
INNER JOIN dbo.鍚堝悓绠$悊_璁㈠崟淇℃伅_鍩虹琛?o ON p.椤圭洰娴佹按鍙?= o.椤圭洰娴佹按鍙?
|
||||||
GROUP BY co.订单编号, b.组件流水号, b.物料流水号
|
LEFT JOIN dbo.瀹㈡埛鍏崇郴绠$悊绯荤粺_瀹㈡埛鍚嶇О k ON p.瀹㈡埛娴佹按鍙?= k.瀹㈡埛娴佹按鍙?
|
||||||
|
WHERE NOT EXISTS (SELECT 1 FROM 待发货且部件全完成订单 x WHERE x.订单编号 = o.订单编号) -- 修改人:Ld 修改时间:2026-07-24 14:12:57; 待发货且部件全完成的订单平掉库存需求
|
||||||
|
),
|
||||||
|
缁勪欢璁㈠崟 AS
|
||||||
|
(
|
||||||
|
SELECT
|
||||||
|
c.缁勪欢娴佹按鍙?
|
||||||
|
o.璁㈠崟缂栧彿,
|
||||||
|
c.鏄惁鍒嗛厤,
|
||||||
|
o.璁㈠崟绫诲瀷,
|
||||||
|
o.鏄惁鎻愪氦,
|
||||||
|
p.鏄惁鍚敤,
|
||||||
|
ISNULL(k.绠€绉? '') AS 绠€绉? FROM dbo.PDM_缁勪欢鍚嶇О c
|
||||||
|
INNER JOIN dbo.PDM_鏈哄簥鍚嶇О m ON c.鏈哄簥娴佹按鍙?= m.鏈哄簥娴佹按鍙? INNER JOIN dbo.PDM_椤圭洰鍚嶇О p ON m.椤圭洰娴佹按鍙?= p.椤圭洰娴佹按鍙? INNER JOIN dbo.鍚堝悓绠$悊_璁㈠崟淇℃伅_鍩虹琛?o ON p.椤圭洰娴佹按鍙?= o.椤圭洰娴佹按鍙? LEFT JOIN dbo.瀹㈡埛鍏崇郴绠$悊绯荤粺_瀹㈡埛鍚嶇О k ON p.瀹㈡埛娴佹按鍙?= k.瀹㈡埛娴佹按鍙? ),
|
||||||
|
闇€姹傛槑缁?AS
|
||||||
|
(
|
||||||
|
SELECT
|
||||||
|
co.璁㈠崟缂栧彿,
|
||||||
|
b.缁勪欢娴佹按鍙?
|
||||||
|
b.鐗╂枡娴佹按鍙?
|
||||||
|
SUM(ISNULL(b.闆朵欢鏁伴噺, 0)) AS 闇€姹傞噺,
|
||||||
|
N'鐢熶骇璁㈠崟闇€姹? AS 鏉ユ簮
|
||||||
|
FROM dbo.PDM_闆朵欢鏄庣粏琛╛鍩烘湰浠?b
|
||||||
|
INNER JOIN 缁勪欢璁㈠崟 co ON b.缁勪欢娴佹按鍙?= co.缁勪欢娴佹按鍙? WHERE co.鏄惁鍒嗛厤 = 1
|
||||||
|
AND co.璁㈠崟绫诲瀷 <> 3
|
||||||
|
AND NOT (ISNULL(co.鏄惁鎻愪氦, 0) = 6 AND ISNULL(co.鏄惁鍚敤, 0) = 1) -- 淇敼浜?Ld 淇敼鏃堕棿:2026-07-14 16:35:00; 鏄庣粏涓嶆樉绀哄凡瀹屾垚璁㈠崟
|
||||||
|
AND (@鐗╂枡娴佹按鍙?IS NULL OR b.鐗╂枡娴佹按鍙?= @鐗╂枡娴佹按鍙?
|
||||||
|
GROUP BY co.璁㈠崟缂栧彿, b.缁勪欢娴佹按鍙? b.鐗╂枡娴佹按鍙?
|
||||||
UNION ALL
|
UNION ALL
|
||||||
|
|
||||||
SELECT
|
SELECT
|
||||||
co.订单编号,
|
co.璁㈠崟缂栧彿,
|
||||||
s.组件流水号,
|
s.缁勪欢娴佹按鍙?
|
||||||
s.物料流水号,
|
s.鐗╂枡娴佹按鍙?
|
||||||
SUM(ISNULL(s.零件数量, 0)) AS 需求量,
|
SUM(ISNULL(s.闆朵欢鏁伴噺, 0)) AS 闇€姹傞噺,
|
||||||
N'生产订单需求' AS 来源
|
N'鐢熶骇璁㈠崟闇€姹? AS 鏉ユ簮
|
||||||
FROM dbo.PDM_零件明细表_标准件和外购件 s
|
FROM dbo.PDM_闆朵欢鏄庣粏琛╛鏍囧噯浠跺拰澶栬喘浠?s
|
||||||
INNER JOIN 组件订单 co ON s.组件流水号 = co.组件流水号
|
INNER JOIN 缁勪欢璁㈠崟 co ON s.缁勪欢娴佹按鍙?= co.缁勪欢娴佹按鍙? WHERE co.鏄惁鍒嗛厤 = 1
|
||||||
WHERE co.是否分配 = 1
|
AND co.璁㈠崟绫诲瀷 <> 3
|
||||||
AND co.订单类型 <> 3
|
AND NOT (ISNULL(co.鏄惁鎻愪氦, 0) = 6 AND ISNULL(co.鏄惁鍚敤, 0) = 1) -- 淇敼浜?Ld 淇敼鏃堕棿:2026-07-14 16:35:00; 鏄庣粏涓嶆樉绀哄凡瀹屾垚璁㈠崟
|
||||||
AND NOT (ISNULL(co.是否提交, 0) = 6 AND ISNULL(co.是否启用, 0) = 1) -- 修改人:Ld 修改时间:2026-07-14 16:35:00; 明细不显示已完成订单
|
AND (@鐗╂枡娴佹按鍙?IS NULL OR s.鐗╂枡娴佹按鍙?= @鐗╂枡娴佹按鍙?
|
||||||
AND (@物料流水号 IS NULL OR s.物料流水号 = @物料流水号)
|
GROUP BY co.璁㈠崟缂栧彿, s.缁勪欢娴佹按鍙? s.鐗╂枡娴佹按鍙?
|
||||||
GROUP BY co.订单编号, s.组件流水号, s.物料流水号
|
|
||||||
|
|
||||||
UNION ALL
|
UNION ALL
|
||||||
|
|
||||||
SELECT
|
SELECT
|
||||||
co.订单编号,
|
co.璁㈠崟缂栧彿,
|
||||||
t.组件流水号,
|
t.缁勪欢娴佹按鍙?
|
||||||
t.物料流水号,
|
t.鐗╂枡娴佹按鍙?
|
||||||
SUM(ISNULL(t.实领数, 0)) AS 需求量,
|
SUM(ISNULL(t.瀹為鏁? 0)) AS 闇€姹傞噺,
|
||||||
N'临时领料需求' AS 来源
|
N'涓存椂棰嗘枡闇€姹? AS 鏉ユ簮
|
||||||
FROM dbo.车间装配管理_装配执行_临时领料明细 t
|
FROM dbo.杞﹂棿瑁呴厤绠$悊_瑁呴厤鎵ц_涓存椂棰嗘枡鏄庣粏 t
|
||||||
LEFT JOIN 组件订单 co ON t.组件流水号 = co.组件流水号
|
LEFT JOIN 缁勪欢璁㈠崟 co ON t.缁勪欢娴佹按鍙?= co.缁勪欢娴佹按鍙? WHERE t.鐗╂枡娴佹按鍙?IS NOT NULL
|
||||||
WHERE t.物料流水号 IS NOT NULL
|
AND NOT (ISNULL(co.鏄惁鎻愪氦, 0) = 6 AND ISNULL(co.鏄惁鍚敤, 0) = 1) -- 淇敼浜?Ld 淇敼鏃堕棿:2026-07-14 16:35:00; 涓存椂棰嗘枡鏄庣粏涓嶆樉绀哄凡瀹屾垚璁㈠崟
|
||||||
AND NOT (ISNULL(co.是否提交, 0) = 6 AND ISNULL(co.是否启用, 0) = 1) -- 修改人:Ld 修改时间:2026-07-14 16:35:00; 临时领料明细不显示已完成订单
|
AND (@鐗╂枡娴佹按鍙?IS NULL OR t.鐗╂枡娴佹按鍙?= @鐗╂枡娴佹按鍙?
|
||||||
AND (@物料流水号 IS NULL OR t.物料流水号 = @物料流水号)
|
GROUP BY co.璁㈠崟缂栧彿, t.缁勪欢娴佹按鍙? t.鐗╂枡娴佹按鍙? ),
|
||||||
GROUP BY co.订单编号, t.组件流水号, t.物料流水号
|
宸查鏄庣粏 AS
|
||||||
),
|
|
||||||
已领明细 AS
|
|
||||||
(
|
(
|
||||||
SELECT
|
SELECT
|
||||||
co.订单编号,
|
co.璁㈠崟缂栧彿,
|
||||||
b.组件流水号,
|
b.缁勪欢娴佹按鍙?
|
||||||
b.物料流水号,
|
b.鐗╂枡娴佹按鍙?
|
||||||
SUM(ISNULL(l.已领数量, 0)) AS 已领数
|
SUM(ISNULL(l.宸查鏁伴噺, 0)) AS 宸查鏁? FROM dbo.杞﹂棿瑁呴厤绠$悊_棰嗘枡鍗曟槑缁?l
|
||||||
FROM dbo.车间装配管理_领料单明细 l
|
INNER JOIN dbo.PDM_闆朵欢鏄庣粏琛╛鍩烘湰浠?b ON l.鍩烘湰浠舵祦姘村彿 = b.鍩烘湰浠舵祦姘村彿
|
||||||
INNER JOIN dbo.PDM_零件明细表_基本件 b ON l.基本件流水号 = b.基本件流水号
|
INNER JOIN 缁勪欢璁㈠崟 co ON b.缁勪欢娴佹按鍙?= co.缁勪欢娴佹按鍙? WHERE NOT (ISNULL(co.鏄惁鎻愪氦, 0) = 6 AND ISNULL(co.鏄惁鍚敤, 0) = 1) -- 淇敼浜?Ld 淇敼鏃堕棿:2026-07-14 16:35:00; 鏄庣粏鎵e噺宸查鏁版椂鍚屾鎺掗櫎宸插畬鎴愯鍗? AND (@鐗╂枡娴佹按鍙?IS NULL OR b.鐗╂枡娴佹按鍙?= @鐗╂枡娴佹按鍙?
|
||||||
INNER JOIN 组件订单 co ON b.组件流水号 = co.组件流水号
|
GROUP BY co.璁㈠崟缂栧彿, b.缁勪欢娴佹按鍙? b.鐗╂枡娴佹按鍙?
|
||||||
WHERE NOT (ISNULL(co.是否提交, 0) = 6 AND ISNULL(co.是否启用, 0) = 1) -- 修改人:Ld 修改时间:2026-07-14 16:35:00; 明细扣减已领数时同步排除已完成订单
|
|
||||||
AND (@物料流水号 IS NULL OR b.物料流水号 = @物料流水号)
|
|
||||||
GROUP BY co.订单编号, b.组件流水号, b.物料流水号
|
|
||||||
|
|
||||||
UNION ALL
|
UNION ALL
|
||||||
|
|
||||||
SELECT
|
SELECT
|
||||||
co.订单编号,
|
co.璁㈠崟缂栧彿,
|
||||||
s.组件流水号,
|
s.缁勪欢娴佹按鍙?
|
||||||
s.物料流水号,
|
s.鐗╂枡娴佹按鍙?
|
||||||
SUM(ISNULL(l.已领数量, 0)) AS 已领数
|
SUM(ISNULL(l.宸查鏁伴噺, 0)) AS 宸查鏁? FROM dbo.杞﹂棿瑁呴厤绠$悊_棰嗘枡鍗曟槑缁?l
|
||||||
FROM dbo.车间装配管理_领料单明细 l
|
INNER JOIN dbo.PDM_闆朵欢鏄庣粏琛╛鏍囧噯浠跺拰澶栬喘浠?s ON l.鏍囧噯浠跺拰澶栬喘浠舵祦姘村彿 = s.鏍囧噯浠跺拰澶栬喘浠舵祦姘村彿
|
||||||
INNER JOIN dbo.PDM_零件明细表_标准件和外购件 s ON l.标准件和外购件流水号 = s.标准件和外购件流水号
|
INNER JOIN 缁勪欢璁㈠崟 co ON s.缁勪欢娴佹按鍙?= co.缁勪欢娴佹按鍙? WHERE NOT (ISNULL(co.鏄惁鎻愪氦, 0) = 6 AND ISNULL(co.鏄惁鍚敤, 0) = 1) -- 淇敼浜?Ld 淇敼鏃堕棿:2026-07-14 16:35:00; 鏄庣粏鎵e噺宸查鏁版椂鍚屾鎺掗櫎宸插畬鎴愯鍗? AND (@鐗╂枡娴佹按鍙?IS NULL OR s.鐗╂枡娴佹按鍙?= @鐗╂枡娴佹按鍙?
|
||||||
INNER JOIN 组件订单 co ON s.组件流水号 = co.组件流水号
|
GROUP BY co.璁㈠崟缂栧彿, s.缁勪欢娴佹按鍙? s.鐗╂枡娴佹按鍙?
|
||||||
WHERE NOT (ISNULL(co.是否提交, 0) = 6 AND ISNULL(co.是否启用, 0) = 1) -- 修改人:Ld 修改时间:2026-07-14 16:35:00; 明细扣减已领数时同步排除已完成订单
|
|
||||||
AND (@物料流水号 IS NULL OR s.物料流水号 = @物料流水号)
|
|
||||||
GROUP BY co.订单编号, s.组件流水号, s.物料流水号
|
|
||||||
|
|
||||||
UNION ALL
|
UNION ALL
|
||||||
|
|
||||||
SELECT
|
SELECT
|
||||||
co.订单编号,
|
co.璁㈠崟缂栧彿,
|
||||||
l.组件流水号,
|
l.缁勪欢娴佹按鍙?
|
||||||
l.物料流水号,
|
l.鐗╂枡娴佹按鍙?
|
||||||
SUM(ISNULL(l.已领数量, 0)) AS 已领数
|
SUM(ISNULL(l.宸查鏁伴噺, 0)) AS 宸查鏁? FROM dbo.杞﹂棿瑁呴厤绠$悊_棰嗘枡鍗曟槑缁?l
|
||||||
FROM dbo.车间装配管理_领料单明细 l
|
LEFT JOIN 缁勪欢璁㈠崟 co ON l.缁勪欢娴佹按鍙?= co.缁勪欢娴佹按鍙? WHERE l.鐗╂枡娴佹按鍙?IS NOT NULL
|
||||||
LEFT JOIN 组件订单 co ON l.组件流水号 = co.组件流水号
|
AND ISNULL(l.鐗╂枡娴佹按鍙? 0) <> 0
|
||||||
WHERE l.物料流水号 IS NOT NULL
|
AND ISNULL(l.鍩烘湰浠舵祦姘村彿, 0) = 0
|
||||||
AND ISNULL(l.物料流水号, 0) <> 0
|
AND ISNULL(l.鏍囧噯浠跺拰澶栬喘浠舵祦姘村彿, 0) = 0
|
||||||
AND ISNULL(l.基本件流水号, 0) = 0
|
AND NOT (ISNULL(co.鏄惁鎻愪氦, 0) = 6 AND ISNULL(co.鏄惁鍚敤, 0) = 1) -- 淇敼浜?Ld 淇敼鏃堕棿:2026-07-14 16:35:00; 涓存椂浠舵槑缁嗘墸鍑忓凡棰嗘暟鏃跺悓姝ユ帓闄ゅ凡瀹屾垚璁㈠崟
|
||||||
AND ISNULL(l.标准件和外购件流水号, 0) = 0
|
AND (@鐗╂枡娴佹按鍙?IS NULL OR l.鐗╂枡娴佹按鍙?= @鐗╂枡娴佹按鍙?
|
||||||
AND NOT (ISNULL(co.是否提交, 0) = 6 AND ISNULL(co.是否启用, 0) = 1) -- 修改人:Ld 修改时间:2026-07-14 16:35:00; 临时件明细扣减已领数时同步排除已完成订单
|
GROUP BY co.璁㈠崟缂栧彿, l.缁勪欢娴佹按鍙? l.鐗╂枡娴佹按鍙? ),
|
||||||
AND (@物料流水号 IS NULL OR l.物料流水号 = @物料流水号)
|
宸查姹囨€?AS
|
||||||
GROUP BY co.订单编号, l.组件流水号, l.物料流水号
|
|
||||||
),
|
|
||||||
已领汇总 AS
|
|
||||||
(
|
(
|
||||||
SELECT 订单编号, 组件流水号, 物料流水号, SUM(已领数) AS 已领数
|
SELECT 璁㈠崟缂栧彿, 缁勪欢娴佹按鍙? 鐗╂枡娴佹按鍙? SUM(宸查鏁? AS 宸查鏁? FROM 宸查鏄庣粏
|
||||||
FROM 已领明细
|
GROUP BY 璁㈠崟缂栧彿, 缁勪欢娴佹按鍙? 鐗╂枡娴佹按鍙? ),
|
||||||
GROUP BY 订单编号, 组件流水号, 物料流水号
|
鏄庣粏 AS
|
||||||
),
|
|
||||||
明细 AS
|
|
||||||
(
|
(
|
||||||
SELECT
|
SELECT
|
||||||
d.订单编号,
|
d.璁㈠崟缂栧彿,
|
||||||
d.组件流水号,
|
d.缁勪欢娴佹按鍙?
|
||||||
d.物料流水号,
|
d.鐗╂枡娴佹按鍙?
|
||||||
d.需求量,
|
d.闇€姹傞噺,
|
||||||
ISNULL(l.已领数, 0) AS 已领数,
|
ISNULL(l.宸查鏁? 0) AS 宸查鏁?
|
||||||
CASE WHEN d.需求量 > ISNULL(l.已领数, 0) THEN d.需求量 - ISNULL(l.已领数, 0) ELSE 0 END AS 最终需求量,
|
CASE WHEN d.闇€姹傞噺 > ISNULL(l.宸查鏁? 0) THEN d.闇€姹傞噺 - ISNULL(l.宸查鏁? 0) ELSE 0 END AS 鏈€缁堥渶姹傞噺,
|
||||||
d.来源
|
d.鏉ユ簮
|
||||||
FROM 需求明细 d
|
FROM 闇€姹傛槑缁?d
|
||||||
LEFT JOIN 已领汇总 l
|
LEFT JOIN 宸查姹囨€?l
|
||||||
ON d.物料流水号 = l.物料流水号
|
ON d.鐗╂枡娴佹按鍙?= l.鐗╂枡娴佹按鍙? AND d.缁勪欢娴佹按鍙?= l.缁勪欢娴佹按鍙? AND ISNULL(d.璁㈠崟缂栧彿, '') = ISNULL(l.璁㈠崟缂栧彿, '')
|
||||||
AND d.组件流水号 = l.组件流水号
|
|
||||||
AND ISNULL(d.订单编号, '') = ISNULL(l.订单编号, '')
|
|
||||||
)
|
)
|
||||||
SELECT
|
SELECT
|
||||||
d.订单编号,
|
d.璁㈠崟缂栧彿,
|
||||||
d.组件流水号,
|
d.缁勪欢娴佹按鍙?
|
||||||
d.物料流水号,
|
d.鐗╂枡娴佹按鍙?
|
||||||
d.需求量,
|
d.闇€姹傞噺,
|
||||||
d.已领数,
|
d.宸查鏁?
|
||||||
d.最终需求量,
|
d.鏈€缁堥渶姹傞噺,
|
||||||
ISNULL(co.简称, '') AS 简称,
|
ISNULL(co.绠€绉? '') AS 绠€绉?
|
||||||
d.来源
|
d.鏉ユ簮
|
||||||
FROM 明细 d
|
FROM 鏄庣粏 d
|
||||||
LEFT JOIN 组件订单 co ON d.组件流水号 = co.组件流水号
|
LEFT JOIN 缁勪欢璁㈠崟 co ON d.缁勪欢娴佹按鍙?= co.缁勪欢娴佹按鍙? ORDER BY d.璁㈠崟缂栧彿, d.缁勪欢娴佹按鍙? d.鏉ユ簮;
|
||||||
ORDER BY d.订单编号, d.组件流水号, d.来源;
|
|
||||||
|
|
||||||
;WITH 汇总 AS
|
;WITH 姹囨€?AS
|
||||||
(
|
(
|
||||||
SELECT 物料流水号, 需求量
|
SELECT 鐗╂枡娴佹按鍙? 闇€姹傞噺
|
||||||
FROM dbo.物料管理_需求量_视图
|
FROM dbo.鐗╂枡绠$悊_闇€姹傞噺_瑙嗗浘
|
||||||
WHERE (@物料流水号 IS NULL OR 物料流水号 = @物料流水号)
|
WHERE (@鐗╂枡娴佹按鍙?IS NULL OR 鐗╂枡娴佹按鍙?= @鐗╂枡娴佹按鍙?
|
||||||
)
|
)
|
||||||
SELECT
|
SELECT
|
||||||
物料流水号,
|
鐗╂枡娴佹按鍙?
|
||||||
需求量 AS 总需求量,
|
闇€姹傞噺 AS 鎬婚渶姹傞噺,
|
||||||
0 AS 总已领数,
|
0 AS 鎬诲凡棰嗘暟,
|
||||||
需求量 AS 总最终需求量
|
闇€姹傞噺 AS 鎬绘渶缁堥渶姹傞噺
|
||||||
FROM 汇总
|
FROM 姹囨€? ORDER BY 鐗╂枡娴佹按鍙?
|
||||||
ORDER BY 物料流水号;
|
|
||||||
END;
|
END;
|
||||||
GO
|
GO
|
||||||
|
|||||||
57
sql/order_inquiry_add_contract_no_test_20260803.sql
Normal file
@@ -0,0 +1,57 @@
|
|||||||
|
-- 订单查询增加关联合同号列测试库脚本;修改人:Ld 修改时间:2026-08-03 17:02:31;
|
||||||
|
USE [ERPTOOL_JY_20250826Back];
|
||||||
|
GO
|
||||||
|
|
||||||
|
ALTER PROCEDURE [dbo].[订单信息_查询数据_加收货人]
|
||||||
|
@买方名称_check bit=null,
|
||||||
|
@客户 nvarchar(50)= null,
|
||||||
|
@创建人_check bit=null,
|
||||||
|
@创建人 nvarchar(50)= null,
|
||||||
|
@订单编号_check bit=null,
|
||||||
|
@订单流水号 int=null,
|
||||||
|
@下单日期_check bit=null,
|
||||||
|
@开始时间 datetime=null,
|
||||||
|
@结束时间 datetime=null,
|
||||||
|
@订单状态_check bit=null,
|
||||||
|
@订单状态 nvarchar(50)=null
|
||||||
|
AS
|
||||||
|
BEGIN
|
||||||
|
SET NOCOUNT ON;
|
||||||
|
|
||||||
|
DECLARE @selectStr nvarchar(4000);
|
||||||
|
DECLARE @selectStrWhere nvarchar(4000);
|
||||||
|
|
||||||
|
-- 订单查询主表追加项目合同编号,便于查看补货订单关联的销售合同;修改人:Ld 修改时间:2026-08-03 17:02:31;
|
||||||
|
SET @selectStr =
|
||||||
|
' select PDM_订单信息_视图.*, PDM_项目名称.合同编号 AS 合同编号, A.暂停原因数量 from PDM_订单信息_视图
|
||||||
|
LEFT JOIN dbo.PDM_项目名称 ON PDM_订单信息_视图.项目流水号 = PDM_项目名称.项目流水号
|
||||||
|
LEFT JOIN
|
||||||
|
( select PDM_订单信息_视图.订单流水号 ,ISNULL(COUNT([车间装配管理_暂停装配_记录表].暂停原因) ,0)AS 暂停原因数量
|
||||||
|
FROM PDM_订单信息_视图
|
||||||
|
LEFT join PDM_机床名称 on PDM_订单信息_视图.项目流水号 = PDM_机床名称.项目流水号
|
||||||
|
LEFT join [dbo].[PDM_组件名称] on PDM_机床名称.机床流水号 = PDM_组件名称.机床流水号
|
||||||
|
LEFT join [dbo].[车间装配管理_装配任务] on PDM_组件名称.组件流水号 = 车间装配管理_装配任务.组件流水号
|
||||||
|
LEFT join [dbo].[车间装配管理_暂停装配_记录表] on [dbo].[车间装配管理_暂停装配_记录表].装配任务流水号 = 车间装配管理_装配任务.装配任务流水号
|
||||||
|
group by PDM_订单信息_视图.订单流水号 ) AS A
|
||||||
|
ON A.订单流水号 = PDM_订单信息_视图.订单流水号 ';
|
||||||
|
|
||||||
|
SET @selectStrWhere = 'where 是否提交 <> 0 ';
|
||||||
|
|
||||||
|
IF(@买方名称_check = 1)
|
||||||
|
SET @selectStrWhere = @selectStrWhere+' and 买方 + isnull(收货人,'''') like + ''%'' + @客户 + ''%'' ';
|
||||||
|
IF(@创建人_check = 1)
|
||||||
|
SET @selectStrWhere = @selectStrWhere+' and isnull(创建人,'''') like + ''%'' + @创建人 + ''%'' ';
|
||||||
|
IF(@订单编号_check = 1)
|
||||||
|
SET @selectStrWhere = @selectStrWhere+' and PDM_订单信息_视图.订单流水号 = @订单流水号 ';
|
||||||
|
IF(@下单日期_check = 1)
|
||||||
|
SET @selectStrWhere = @selectStrWhere+' and 创建日期 >=@开始时间 and 创建日期 <=@结束时间 ';
|
||||||
|
IF(@订单状态_check = 1)
|
||||||
|
SET @selectStrWhere = @selectStrWhere+' and 订单状态 = @订单状态 ';
|
||||||
|
|
||||||
|
SET @selectStr = @selectStr+@selectStrWhere+'order by 合同操作日期 DESC';
|
||||||
|
PRINT @selectStr;
|
||||||
|
EXEC sp_executesql @selectStr,
|
||||||
|
N'@客户 nvarchar(50),@创建人 nvarchar(50),@订单流水号 int,@开始时间 datetime,@结束时间 datetime,@订单状态 nvarchar(50)',
|
||||||
|
@客户,@创建人,@订单流水号,@开始时间,@结束时间,@订单状态;
|
||||||
|
END;
|
||||||
|
GO
|
||||||
217
sql/production_plan_add_contract_no_test_20260804.sql
Normal file
@@ -0,0 +1,217 @@
|
|||||||
|
-- 生产计划增加关联合同编号列测试库脚本;修改人:Ld 修改时间:2026-08-04 14:57:36;
|
||||||
|
USE [ERPTOOL_JY_20250826Back];
|
||||||
|
GO
|
||||||
|
|
||||||
|
ALTER PROCEDURE [dbo].[车间生产管理_生产计划_查询数据]
|
||||||
|
@合同编号_check bit = null,
|
||||||
|
@合同编号 nvarchar(50) = null,
|
||||||
|
@零件名称_check bit = null,
|
||||||
|
@零件名称 nvarchar(50) = null,
|
||||||
|
@产品名称_check bit = null,
|
||||||
|
@产品名称 nvarchar(50) = null,
|
||||||
|
@状态_check bit = null,
|
||||||
|
@状态 nvarchar(50) = null,
|
||||||
|
@月份 nvarchar(50) = '2026-5'
|
||||||
|
AS
|
||||||
|
BEGIN
|
||||||
|
SET NOCOUNT ON;
|
||||||
|
|
||||||
|
DECLARE @年 nvarchar(50);
|
||||||
|
DECLARE @月 nvarchar(50);
|
||||||
|
DECLARE @selectStr nvarchar(MAX);
|
||||||
|
DECLARE @selectStrWhere nvarchar(MAX);
|
||||||
|
|
||||||
|
IF CHARINDEX('-', @月份) > 0
|
||||||
|
BEGIN
|
||||||
|
SET @年 = LEFT(@月份, CHARINDEX('-', @月份) - 1);
|
||||||
|
SET @月 = SUBSTRING(@月份, CHARINDEX('-', @月份) + 1, LEN(@月份) - CHARINDEX('-', @月份));
|
||||||
|
END
|
||||||
|
ELSE
|
||||||
|
BEGIN
|
||||||
|
SET @年 = LEFT(@月份, 4);
|
||||||
|
SET @月 = RIGHT(@月份, 2);
|
||||||
|
END;
|
||||||
|
|
||||||
|
SELECT TOP (0) *
|
||||||
|
INTO #生产计划
|
||||||
|
FROM dbo.车间生产管理_生产计划_视图_新;
|
||||||
|
|
||||||
|
SET @selectStr = N'INSERT INTO #生产计划 SELECT * FROM dbo.车间生产管理_生产计划_视图_新 ';
|
||||||
|
SET @selectStrWhere = N' WHERE 年 = @年 AND 月 = @月 ';
|
||||||
|
|
||||||
|
IF (@零件名称_check = 1 AND ISNULL(@零件名称, N'') <> N'')
|
||||||
|
SET @selectStrWhere += N' AND (零件名称 + ISNULL(零件图号, N'''')) LIKE N''%'' + @零件名称 + N''%'' ';
|
||||||
|
|
||||||
|
IF (@合同编号_check = 1 AND ISNULL(@合同编号, N'') <> N'')
|
||||||
|
SET @selectStrWhere += N' AND 订单号 LIKE N''%'' + @合同编号 + N''%'' ';
|
||||||
|
|
||||||
|
IF (@产品名称_check = 1 AND ISNULL(@产品名称, N'') <> N'')
|
||||||
|
SET @selectStrWhere += N' AND 产品名称 LIKE N''%'' + @产品名称 + N''%'' ';
|
||||||
|
|
||||||
|
IF (@状态_check = 1 AND ISNULL(@状态, N'') <> N'')
|
||||||
|
SET @selectStrWhere += N' AND 状态 LIKE N''%'' + @状态 + N''%'' ';
|
||||||
|
|
||||||
|
SET @selectStr += @selectStrWhere + N';';
|
||||||
|
|
||||||
|
EXEC sp_executesql
|
||||||
|
@selectStr,
|
||||||
|
N'@零件名称 nvarchar(50), @合同编号 nvarchar(50), @产品名称 nvarchar(50), @状态 nvarchar(50), @年 nvarchar(50), @月 nvarchar(50)',
|
||||||
|
@零件名称 = @零件名称,
|
||||||
|
@合同编号 = @合同编号,
|
||||||
|
@产品名称 = @产品名称,
|
||||||
|
@状态 = @状态,
|
||||||
|
@年 = @年,
|
||||||
|
@月 = @月;
|
||||||
|
|
||||||
|
CREATE TABLE #BHZZOrders (
|
||||||
|
订单流水号 int,
|
||||||
|
订单编号 nvarchar(100),
|
||||||
|
订单备注 nvarchar(500),
|
||||||
|
合同日期 date,
|
||||||
|
备注中数字 nvarchar(50),
|
||||||
|
备注中人名 nvarchar(50)
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE #MKOrders (
|
||||||
|
订单流水号 int,
|
||||||
|
订单编号 nvarchar(100),
|
||||||
|
订单备注 nvarchar(500),
|
||||||
|
合同日期 date,
|
||||||
|
备注数字部分 nvarchar(50),
|
||||||
|
备注人名部分 nvarchar(50)
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE #收货人信息 (
|
||||||
|
订单流水号 int,
|
||||||
|
订单编号 nvarchar(100),
|
||||||
|
收货人 nvarchar(100),
|
||||||
|
地址 nvarchar(500)
|
||||||
|
);
|
||||||
|
|
||||||
|
INSERT INTO #BHZZOrders
|
||||||
|
SELECT DISTINCT
|
||||||
|
o.订单流水号,
|
||||||
|
o.订单编号,
|
||||||
|
o.订单备注,
|
||||||
|
CAST(o.合同日期 AS date) AS 合同日期,
|
||||||
|
dbo.提取备注中的数字(o.订单备注) AS 备注中数字,
|
||||||
|
dbo.提取备注中的中文(o.订单备注) AS 备注中人名
|
||||||
|
FROM dbo.PDM_订单信息_视图 o
|
||||||
|
WHERE o.订单编号 LIKE N'BHZZ%'
|
||||||
|
AND EXISTS (
|
||||||
|
SELECT 1
|
||||||
|
FROM #生产计划 p
|
||||||
|
WHERE NULLIF(LTRIM(RTRIM(CONVERT(nvarchar(100), p.订单号))), N'') = o.订单编号
|
||||||
|
);
|
||||||
|
|
||||||
|
INSERT INTO #MKOrders
|
||||||
|
SELECT
|
||||||
|
o.订单流水号,
|
||||||
|
o.订单编号,
|
||||||
|
o.订单备注,
|
||||||
|
CAST(o.合同日期 AS date) AS 合同日期,
|
||||||
|
dbo.提取备注中的数字(o.订单备注) AS 备注数字部分,
|
||||||
|
dbo.提取备注中的中文(o.订单备注) AS 备注人名部分
|
||||||
|
FROM dbo.PDM_订单信息_视图 o
|
||||||
|
WHERE o.订单编号 LIKE N'%MK%';
|
||||||
|
|
||||||
|
INSERT INTO #收货人信息
|
||||||
|
SELECT DISTINCT
|
||||||
|
o.订单流水号,
|
||||||
|
o.订单编号,
|
||||||
|
c.收货人,
|
||||||
|
c.地址
|
||||||
|
FROM dbo.PDM_订单信息_视图 o
|
||||||
|
LEFT JOIN dbo.客户关系管理系统_客户名称 c ON o.客户流水号 = c.客户流水号
|
||||||
|
WHERE o.订单编号 LIKE N'%MK%'
|
||||||
|
OR EXISTS (SELECT 1 FROM #BHZZOrders b WHERE b.订单编号 = o.订单编号);
|
||||||
|
|
||||||
|
;WITH AllMatches AS (
|
||||||
|
SELECT
|
||||||
|
B.订单流水号 AS BHZZ订单流水号,
|
||||||
|
B.订单编号 AS BHZZ订单编号,
|
||||||
|
B.合同日期 AS BHZZ合同日期,
|
||||||
|
B.订单备注 AS BHZZ订单备注,
|
||||||
|
B.备注中数字 AS BHZZ备注提取数字,
|
||||||
|
B.备注中人名 AS BHZZ备注提取人名,
|
||||||
|
M.订单流水号 AS MK订单流水号,
|
||||||
|
M.订单编号 AS MK订单编号,
|
||||||
|
M.合同日期 AS MK合同日期,
|
||||||
|
M.订单备注 AS MK订单备注,
|
||||||
|
M.备注数字部分 AS MK备注数字部分,
|
||||||
|
M.备注人名部分 AS MK备注提取人名,
|
||||||
|
R.收货人 AS MK订单收货人,
|
||||||
|
R.地址 AS MK订单收货地址,
|
||||||
|
DATEDIFF(DAY, M.合同日期, B.合同日期) AS 日期差天数,
|
||||||
|
CASE
|
||||||
|
WHEN B.备注中数字 IS NOT NULL AND M.备注数字部分 IS NOT NULL
|
||||||
|
AND B.备注中数字 = M.备注数字部分 THEN N'数字匹配'
|
||||||
|
WHEN B.备注中数字 IS NOT NULL AND CHARINDEX(B.备注中数字, M.订单编号) > 0 THEN N'订单编号包含数字'
|
||||||
|
WHEN B.备注中人名 IS NOT NULL AND M.备注人名部分 IS NOT NULL
|
||||||
|
AND B.备注中人名 = M.备注人名部分 THEN N'人名匹配'
|
||||||
|
WHEN B.备注中人名 IS NOT NULL AND R.收货人 IS NOT NULL
|
||||||
|
AND B.备注中人名 = R.收货人 THEN N'人名与收货人匹配'
|
||||||
|
WHEN M.备注人名部分 IS NOT NULL AND R.收货人 IS NOT NULL
|
||||||
|
AND M.备注人名部分 = R.收货人 THEN N'MK备注人名与收货人匹配'
|
||||||
|
ELSE N'其他关联'
|
||||||
|
END AS 关联类型
|
||||||
|
FROM #BHZZOrders B
|
||||||
|
INNER JOIN #MKOrders M ON
|
||||||
|
(B.备注中数字 IS NOT NULL AND M.备注数字部分 IS NOT NULL AND B.备注中数字 = M.备注数字部分)
|
||||||
|
OR (B.备注中数字 IS NOT NULL AND CHARINDEX(B.备注中数字, M.订单编号) > 0)
|
||||||
|
OR (B.备注中人名 IS NOT NULL AND M.备注人名部分 IS NOT NULL AND B.备注中人名 = M.备注人名部分)
|
||||||
|
LEFT JOIN #收货人信息 R ON M.订单流水号 = R.订单流水号
|
||||||
|
),
|
||||||
|
RankedMatches AS (
|
||||||
|
SELECT
|
||||||
|
*,
|
||||||
|
ROW_NUMBER() OVER (
|
||||||
|
PARTITION BY BHZZ订单流水号
|
||||||
|
ORDER BY
|
||||||
|
CASE
|
||||||
|
WHEN 关联类型 = N'人名与收货人匹配' THEN 1
|
||||||
|
WHEN 关联类型 = N'数字匹配' THEN 2
|
||||||
|
WHEN 关联类型 = N'订单编号包含数字' THEN 3
|
||||||
|
WHEN 关联类型 = N'人名匹配' THEN 4
|
||||||
|
WHEN 关联类型 = N'MK备注人名与收货人匹配' THEN 5
|
||||||
|
ELSE 6
|
||||||
|
END,
|
||||||
|
ABS(日期差天数)
|
||||||
|
) AS rn
|
||||||
|
FROM AllMatches
|
||||||
|
)
|
||||||
|
SELECT *
|
||||||
|
INTO #ClosestMatches
|
||||||
|
FROM RankedMatches
|
||||||
|
WHERE rn = 1;
|
||||||
|
|
||||||
|
-- 优先返回方案一写入订单项目流水号关联到的合同编号;没有时前端继续显示原MK提取关联值;修改人:Ld 修改时间:2026-08-04 14:57:36;
|
||||||
|
EXEC sp_executesql N'
|
||||||
|
SELECT
|
||||||
|
p.*,
|
||||||
|
linkProject.合同编号 AS 关联合同编号,
|
||||||
|
c.BHZZ订单流水号,
|
||||||
|
c.BHZZ订单编号,
|
||||||
|
c.BHZZ合同日期,
|
||||||
|
c.BHZZ订单备注,
|
||||||
|
c.BHZZ备注提取数字,
|
||||||
|
c.BHZZ备注提取人名,
|
||||||
|
c.MK订单流水号,
|
||||||
|
c.MK订单编号,
|
||||||
|
c.MK合同日期,
|
||||||
|
c.MK订单备注,
|
||||||
|
c.MK备注数字部分,
|
||||||
|
c.MK备注提取人名,
|
||||||
|
c.MK订单收货人,
|
||||||
|
c.MK订单收货地址,
|
||||||
|
c.日期差天数,
|
||||||
|
c.关联类型
|
||||||
|
FROM #生产计划 p
|
||||||
|
LEFT JOIN #ClosestMatches c ON c.BHZZ订单编号 = CONVERT(nvarchar(100), p.订单号)
|
||||||
|
LEFT JOIN dbo.合同管理_订单信息_基础表 linkOrder
|
||||||
|
ON linkOrder.订单编号 = CONVERT(nvarchar(100), p.订单号)
|
||||||
|
LEFT JOIN dbo.PDM_项目名称 linkProject
|
||||||
|
ON linkOrder.项目流水号 = linkProject.项目流水号
|
||||||
|
ORDER BY p.订单号, p.工序顺序;';
|
||||||
|
END;
|
||||||
|
GO
|
||||||
56
sql/repair_JY_FA_830_14_01_reopen.sql
Normal file
@@ -0,0 +1,56 @@
|
|||||||
|
-- 恢复 BHZZ-20250707004 / JY-FA-830-14.01 到车间可加工状态
|
||||||
|
-- 修改人:Ld 修改时间:2026-07-31 16:45:00;
|
||||||
|
SET NOCOUNT ON;
|
||||||
|
SET XACT_ABORT ON;
|
||||||
|
|
||||||
|
-- 修复前快照,便于回溯。修改人:Ld 修改时间:2026-07-31 16:45:00;
|
||||||
|
IF OBJECT_ID(N'dbo.GPT_恢复可加工_4935_20260731_1645_工艺计划', N'U') IS NULL
|
||||||
|
SELECT *
|
||||||
|
INTO dbo.GPT_恢复可加工_4935_20260731_1645_工艺计划
|
||||||
|
FROM dbo.车间生产管理工艺_零件工艺计划
|
||||||
|
WHERE 工艺计划流水号 = 4935;
|
||||||
|
|
||||||
|
BEGIN TRAN;
|
||||||
|
|
||||||
|
IF NOT EXISTS (
|
||||||
|
SELECT 1
|
||||||
|
FROM dbo.车间生产管理工艺_零件工艺计划
|
||||||
|
WHERE 工艺计划流水号 = 4935
|
||||||
|
AND 零件图号 = N'JY-FA-830-14.01'
|
||||||
|
AND 考核状态 = 3
|
||||||
|
AND 批次数量 = 100
|
||||||
|
AND ISNULL(完成数量, 0) = 42
|
||||||
|
AND ISNULL(报废数量, 0) = 0
|
||||||
|
)
|
||||||
|
BEGIN
|
||||||
|
RAISERROR(N'工艺计划 4935 当前状态不符合恢复条件,停止修复', 16, 1);
|
||||||
|
ROLLBACK TRAN;
|
||||||
|
RETURN;
|
||||||
|
END
|
||||||
|
|
||||||
|
-- 仅恢复工艺计划状态为加工中,保留已完成/已入库/到货等历史数量。修改人:Ld 修改时间:2026-07-31 16:45:00;
|
||||||
|
UPDATE dbo.车间生产管理工艺_零件工艺计划
|
||||||
|
SET 考核状态 = 2
|
||||||
|
WHERE 工艺计划流水号 = 4935;
|
||||||
|
|
||||||
|
COMMIT TRAN;
|
||||||
|
|
||||||
|
SELECT N'修复完成' AS 结果;
|
||||||
|
|
||||||
|
SELECT 工艺计划流水号,基本件流水号,批次数量,报废数量,入库数量,完成日期,零件图号,考核状态,完成数量,分配日期,工艺更新时间
|
||||||
|
FROM dbo.车间生产管理工艺_零件工艺计划
|
||||||
|
WHERE 工艺计划流水号 = 4935;
|
||||||
|
|
||||||
|
EXEC dbo.精工车间_车间派工_查询
|
||||||
|
@订单流水号 = 14210,
|
||||||
|
@订单流水号_check = 1,
|
||||||
|
@组件流水号 = 23354,
|
||||||
|
@组件流水号_check = 1,
|
||||||
|
@零件名称_check = 1,
|
||||||
|
@零件名称 = N'JY-FA-830-14.01',
|
||||||
|
@图号_check = 0,
|
||||||
|
@图号 = N'',
|
||||||
|
@订单状态_check = 0,
|
||||||
|
@订单状态 = N'',
|
||||||
|
@精工期限_check = 0,
|
||||||
|
@精工期限 = N'';
|
||||||
116
sql/repair_WX_20260730001_002.sql
Normal file
@@ -0,0 +1,116 @@
|
|||||||
|
-- 修复 WX-20260730001 / WX-20260730002 调拨明细归属异常
|
||||||
|
-- 修改人:Ld 修改时间:2026-07-31 15:56:00;
|
||||||
|
SET NOCOUNT ON;
|
||||||
|
SET XACT_ABORT ON;
|
||||||
|
|
||||||
|
-- 修复前快照,便于回溯。修改人:Ld 修改时间:2026-07-31 15:56:00;
|
||||||
|
IF OBJECT_ID(N'dbo.GPT_调拨修复备份_20260731_1556_单', N'U') IS NULL
|
||||||
|
SELECT * INTO dbo.GPT_调拨修复备份_20260731_1556_单 FROM dbo.车间生产管理_外协调拨单 WHERE 外协调拨单流水号 IN (2369,2370);
|
||||||
|
IF OBJECT_ID(N'dbo.GPT_调拨修复备份_20260731_1556_明细', N'U') IS NULL
|
||||||
|
SELECT * INTO dbo.GPT_调拨修复备份_20260731_1556_明细 FROM dbo.车间生产管理_外协调拨单明细 WHERE 外协调拨单流水号 IN (2369,2370) OR 外协调拨单明细流水号 IN (6325,6326,6327,6328,6329);
|
||||||
|
IF OBJECT_ID(N'dbo.GPT_调拨修复备份_20260731_1556_工序', N'U') IS NULL
|
||||||
|
SELECT * INTO dbo.GPT_调拨修复备份_20260731_1556_工序 FROM dbo.车间生产管理_外协调拨单明细_工序 WHERE 外协调拨单流水号 IN (2369,2370) OR 外协调拨单明细流水号 IN (6325,6326,6327,6328,6329) OR 工序流水号 IN (108349,81720,30967);
|
||||||
|
IF OBJECT_ID(N'dbo.GPT_调拨修复备份_20260731_1556_零件工序', N'U') IS NULL
|
||||||
|
SELECT * INTO dbo.GPT_调拨修复备份_20260731_1556_零件工序 FROM dbo.车间生产管理工艺_零件工序 WHERE 工序流水号 IN (108349,81720,30967);
|
||||||
|
IF OBJECT_ID(N'dbo.GPT_调拨修复备份_20260731_1556_任务分配', N'U') IS NULL
|
||||||
|
SELECT * INTO dbo.GPT_调拨修复备份_20260731_1556_任务分配 FROM dbo.车间生产管理工艺_零件工序_任务分配 WHERE 工艺任务流水号 IN (39177,36624,38805) OR 工序流水号 IN (108349,81720,30967);
|
||||||
|
|
||||||
|
BEGIN TRAN;
|
||||||
|
|
||||||
|
IF NOT EXISTS (SELECT 1 FROM dbo.车间生产管理_外协调拨单 WHERE 外协调拨单流水号 = 2369 AND 调拨单号 = N'WX-20260730001')
|
||||||
|
BEGIN
|
||||||
|
RAISERROR(N'未找到 WX-20260730001 对应流水号 2369,停止修复', 16, 1);
|
||||||
|
ROLLBACK TRAN;
|
||||||
|
RETURN;
|
||||||
|
END
|
||||||
|
IF NOT EXISTS (SELECT 1 FROM dbo.车间生产管理_外协调拨单 WHERE 外协调拨单流水号 = 2370 AND 调拨单号 = N'WX-20260730002')
|
||||||
|
BEGIN
|
||||||
|
RAISERROR(N'未找到 WX-20260730002 对应流水号 2370,停止修复', 16, 1);
|
||||||
|
ROLLBACK TRAN;
|
||||||
|
RETURN;
|
||||||
|
END
|
||||||
|
IF NOT EXISTS (SELECT 1 FROM dbo.车间生产管理_外协调拨单明细 WHERE 外协调拨单明细流水号 = 6328 AND 外协调拨单流水号 = 2369 AND 工艺计划流水号 = 1724 AND 外协数量 = 1)
|
||||||
|
BEGIN
|
||||||
|
RAISERROR(N'未找到待移动明细 6328,停止修复', 16, 1);
|
||||||
|
ROLLBACK TRAN;
|
||||||
|
RETURN;
|
||||||
|
END
|
||||||
|
IF EXISTS (SELECT 1 FROM dbo.车间生产管理_外协调拨单明细 WHERE 外协调拨单明细流水号 IN (6325,6326))
|
||||||
|
BEGIN
|
||||||
|
RAISERROR(N'原明细流水号 6325/6326 已存在,停止修复', 16, 1);
|
||||||
|
ROLLBACK TRAN;
|
||||||
|
RETURN;
|
||||||
|
END
|
||||||
|
IF NOT EXISTS (SELECT 1 FROM dbo.车间生产管理_外协调拨单明细 WHERE 外协调拨单明细流水号 = 6329 AND 外协调拨单流水号 = 2369 AND 工艺计划流水号 = 4313 AND 外协数量 = 100)
|
||||||
|
BEGIN
|
||||||
|
RAISERROR(N'未找到待替换明细 6329,停止修复', 16, 1);
|
||||||
|
ROLLBACK TRAN;
|
||||||
|
RETURN;
|
||||||
|
END
|
||||||
|
|
||||||
|
-- 将本应属于 WX-20260730002 的明细移到新单。修改人:Ld 修改时间:2026-07-31 15:56:00;
|
||||||
|
UPDATE dbo.车间生产管理_外协调拨单明细
|
||||||
|
SET 外协调拨单流水号 = 2370
|
||||||
|
WHERE 外协调拨单明细流水号 = 6328;
|
||||||
|
|
||||||
|
UPDATE dbo.车间生产管理_外协调拨单明细_工序
|
||||||
|
SET 外协调拨单流水号 = 2370
|
||||||
|
WHERE 外协调拨单明细流水号 = 6328;
|
||||||
|
|
||||||
|
-- 恢复 WX-20260730001 原明细流水号,避免保留误补流水号。修改人:Ld 修改时间:2026-07-31 15:56:00;
|
||||||
|
DELETE FROM dbo.车间生产管理_外协调拨单明细_工序
|
||||||
|
WHERE 外协调拨单明细流水号 = 6329;
|
||||||
|
|
||||||
|
DELETE FROM dbo.车间生产管理_外协调拨单明细
|
||||||
|
WHERE 外协调拨单明细流水号 = 6329;
|
||||||
|
|
||||||
|
SET IDENTITY_INSERT dbo.车间生产管理_外协调拨单明细 ON;
|
||||||
|
INSERT INTO dbo.车间生产管理_外协调拨单明细
|
||||||
|
(外协调拨单明细流水号, 外协调拨单流水号, 工艺计划流水号, 外协价格, 外协数量, 到货状态, 到货数量, 操作日期, 到货时间, 备注)
|
||||||
|
VALUES
|
||||||
|
(6325, 2369, 5710, NULL, 171, 0, NULL, '2026-07-30T10:48:58.617', NULL, NULL),
|
||||||
|
(6326, 2369, 4313, NULL, 100, 0, NULL, '2026-07-30T10:49:29.737', NULL, NULL);
|
||||||
|
SET IDENTITY_INSERT dbo.车间生产管理_外协调拨单明细 OFF;
|
||||||
|
|
||||||
|
SET IDENTITY_INSERT dbo.车间生产管理_外协调拨单明细_工序 ON;
|
||||||
|
INSERT INTO dbo.车间生产管理_外协调拨单明细_工序
|
||||||
|
(id, 外协调拨单流水号, 外协调拨单明细流水号, 工序流水号, 工序工时, 操作日期)
|
||||||
|
VALUES
|
||||||
|
(6325, 2369, 6325, 108349, NULL, '2026-07-30T10:48:58.617'),
|
||||||
|
(6326, 2369, 6326, 81720, NULL, '2026-07-30T10:49:29.737');
|
||||||
|
SET IDENTITY_INSERT dbo.车间生产管理_外协调拨单明细_工序 OFF;
|
||||||
|
|
||||||
|
-- 修正工序和任务选中/加工状态,不重复累加已外协数。修改人:Ld 修改时间:2026-07-31 15:56:00;
|
||||||
|
UPDATE dbo.车间生产管理工艺_零件工序
|
||||||
|
SET 是否选进外协单中 = CASE WHEN 工序流水号 = 30967 THEN 1 ELSE 0 END
|
||||||
|
WHERE 工序流水号 IN (108349,81720,30967);
|
||||||
|
|
||||||
|
UPDATE dbo.车间生产管理工艺_零件工序_任务分配
|
||||||
|
SET 是否加工中 = 1
|
||||||
|
WHERE 工艺任务流水号 IN (39177,36624,38805);
|
||||||
|
|
||||||
|
COMMIT TRAN;
|
||||||
|
|
||||||
|
SELECT N'修复完成' AS 结果;
|
||||||
|
|
||||||
|
SELECT o.外协调拨单流水号,o.调拨单号,o.单据状态,o.操作日期,o.备注
|
||||||
|
FROM dbo.车间生产管理_外协调拨单 o
|
||||||
|
WHERE o.外协调拨单流水号 IN (2369,2370)
|
||||||
|
ORDER BY o.外协调拨单流水号;
|
||||||
|
|
||||||
|
SELECT d.外协调拨单明细流水号,d.外协调拨单流水号,o.调拨单号,d.工艺计划流水号,g.工序流水号,d.外协数量,d.到货状态,d.到货数量,d.操作日期,d.到货时间,d.备注
|
||||||
|
FROM dbo.车间生产管理_外协调拨单明细 d
|
||||||
|
LEFT JOIN dbo.车间生产管理_外协调拨单 o ON d.外协调拨单流水号 = o.外协调拨单流水号
|
||||||
|
LEFT JOIN dbo.车间生产管理_外协调拨单明细_工序 g ON d.外协调拨单明细流水号 = g.外协调拨单明细流水号
|
||||||
|
WHERE d.外协调拨单流水号 IN (2369,2370)
|
||||||
|
ORDER BY d.外协调拨单流水号,d.外协调拨单明细流水号;
|
||||||
|
|
||||||
|
SELECT 工序流水号,工艺计划流水号,是否选进外协单中,已外协数,外协数量,到货数量,工序状态
|
||||||
|
FROM dbo.车间生产管理工艺_零件工序
|
||||||
|
WHERE 工序流水号 IN (108349,81720,30967)
|
||||||
|
ORDER BY 工序流水号;
|
||||||
|
|
||||||
|
SELECT 工艺任务流水号,工序流水号,人员编号,数量,已领数量,是否加工中
|
||||||
|
FROM dbo.车间生产管理工艺_零件工序_任务分配
|
||||||
|
WHERE 工艺任务流水号 IN (39177,36624,38805)
|
||||||
|
ORDER BY 工艺任务流水号;
|
||||||
229
sql/replenishment_contract_link_test_20260803.sql
Normal file
@@ -0,0 +1,229 @@
|
|||||||
|
-- 方案一补货关联合同测试库增量脚本;修改人:Ld 修改时间:2026-08-03 16:06:00;
|
||||||
|
USE [ERPTOOL_JY_20250826Back];
|
||||||
|
GO
|
||||||
|
|
||||||
|
IF OBJECT_ID(N'[dbo].[仓储管理_补货关联合同_查询数据]', N'P') IS NOT NULL
|
||||||
|
DROP PROCEDURE [dbo].[仓储管理_补货关联合同_查询数据];
|
||||||
|
GO
|
||||||
|
|
||||||
|
-- 补货创建时查询可关联的销售合同/订单;修改人:Ld 修改时间:2026-08-03 16:06:00;
|
||||||
|
CREATE PROCEDURE [dbo].[仓储管理_补货关联合同_查询数据]
|
||||||
|
@关键字 NVARCHAR(100) = NULL,
|
||||||
|
@合同编号 NVARCHAR(100) = NULL,
|
||||||
|
@客户 NVARCHAR(100) = NULL,
|
||||||
|
@订单编号 NVARCHAR(100) = NULL
|
||||||
|
AS
|
||||||
|
BEGIN
|
||||||
|
SET NOCOUNT ON;
|
||||||
|
|
||||||
|
SELECT TOP 50
|
||||||
|
p.项目流水号,
|
||||||
|
p.合同编号,
|
||||||
|
ISNULL(c.客户名称, N'') AS 客户名称,
|
||||||
|
ISNULL(c.简称, c.客户名称) AS 客户简称,
|
||||||
|
o.订单流水号,
|
||||||
|
o.订单编号,
|
||||||
|
CONVERT(VARCHAR(10), p.签订日期, 23) AS 签订日期,
|
||||||
|
CONVERT(VARCHAR(10), ISNULL(o.完成期限, p.交货日期), 23) AS 交货日期
|
||||||
|
FROM dbo.PDM_项目名称 AS p
|
||||||
|
LEFT JOIN dbo.客户关系管理系统_客户名称 AS c
|
||||||
|
ON p.客户流水号 = c.客户流水号
|
||||||
|
LEFT JOIN dbo.合同管理_订单信息_基础表 AS o
|
||||||
|
ON p.项目流水号 = o.项目流水号
|
||||||
|
WHERE ISNULL(p.是否启用, 1) = 1
|
||||||
|
AND ISNULL(p.合同编号, N'') <> N''
|
||||||
|
AND (ISNULL(@关键字, N'') = N''
|
||||||
|
OR p.合同编号 LIKE N'%' + @关键字 + N'%'
|
||||||
|
OR ISNULL(c.客户名称, N'') LIKE N'%' + @关键字 + N'%'
|
||||||
|
OR ISNULL(c.简称, N'') LIKE N'%' + @关键字 + N'%'
|
||||||
|
OR ISNULL(o.订单编号, N'') LIKE N'%' + @关键字 + N'%')
|
||||||
|
AND (ISNULL(@合同编号, N'') = N'' OR p.合同编号 LIKE N'%' + @合同编号 + N'%')
|
||||||
|
AND (ISNULL(@客户, N'') = N'' OR ISNULL(c.客户名称, N'') LIKE N'%' + @客户 + N'%' OR ISNULL(c.简称, N'') LIKE N'%' + @客户 + N'%')
|
||||||
|
AND (ISNULL(@订单编号, N'') = N'' OR ISNULL(o.订单编号, N'') LIKE N'%' + @订单编号 + N'%')
|
||||||
|
ORDER BY p.项目流水号 DESC, o.订单流水号 DESC;
|
||||||
|
END;
|
||||||
|
GO
|
||||||
|
|
||||||
|
IF OBJECT_ID(N'[dbo].[报缺补货_提交_关联合同]', N'P') IS NOT NULL
|
||||||
|
DROP PROCEDURE [dbo].[报缺补货_提交_关联合同];
|
||||||
|
GO
|
||||||
|
|
||||||
|
-- 补货提交时挂到选定销售合同/订单或仓库备货合同;不改原报缺补货_提交;修改人:Ld 修改时间:2026-08-03 16:06:00;
|
||||||
|
-- 仓库备货提交时自动生成CKBH前缀合同号,并写入仓库补货合同明细;修改人:Ld 修改时间:2026-08-04 08:29:13;
|
||||||
|
CREATE PROCEDURE [dbo].[报缺补货_提交_关联合同]
|
||||||
|
@是否外购 INT = NULL,
|
||||||
|
@操作者 INT = NULL,
|
||||||
|
@订单备注 NVARCHAR(200) = NULL,
|
||||||
|
@补货期限 DATETIME = NULL,
|
||||||
|
@来源类型 NVARCHAR(20) = NULL,
|
||||||
|
@项目流水号 INT = NULL,
|
||||||
|
@订单流水号 INT = NULL
|
||||||
|
AS
|
||||||
|
BEGIN
|
||||||
|
SET NOCOUNT ON;
|
||||||
|
SET XACT_ABORT ON;
|
||||||
|
|
||||||
|
DECLARE @单号 VARCHAR(100);
|
||||||
|
DECLARE @单号前缀 VARCHAR(20);
|
||||||
|
DECLARE @序号 INT;
|
||||||
|
DECLARE @机床流水号 INT;
|
||||||
|
DECLARE @组件流水号 INT;
|
||||||
|
DECLARE @仓库备货合同编号 NVARCHAR(50);
|
||||||
|
DECLARE @补货类型名称 NVARCHAR(50);
|
||||||
|
DECLARE @订单类型 INT = 3;
|
||||||
|
|
||||||
|
IF @补货期限 IS NULL
|
||||||
|
BEGIN
|
||||||
|
SELECT '0' AS result, N'请选择补货期限' AS message;
|
||||||
|
RETURN;
|
||||||
|
END;
|
||||||
|
|
||||||
|
IF ISNULL(@来源类型, N'') = N''
|
||||||
|
BEGIN
|
||||||
|
SELECT '0' AS result, N'请选择补货来源' AS message;
|
||||||
|
RETURN;
|
||||||
|
END;
|
||||||
|
|
||||||
|
IF @是否外购 = 1
|
||||||
|
BEGIN
|
||||||
|
IF NOT EXISTS (SELECT 1 FROM dbo.外购件补货明细中间表)
|
||||||
|
BEGIN
|
||||||
|
SELECT '0' AS result, N'外购补货单为空' AS message;
|
||||||
|
RETURN;
|
||||||
|
END;
|
||||||
|
SET @单号前缀 = 'BHWG-';
|
||||||
|
SET @补货类型名称 = N'外购补货';
|
||||||
|
END
|
||||||
|
ELSE
|
||||||
|
BEGIN
|
||||||
|
IF NOT EXISTS (SELECT 1 FROM dbo.自制件补货明细中间表)
|
||||||
|
BEGIN
|
||||||
|
SELECT '0' AS result, N'自制补货单为空' AS message;
|
||||||
|
RETURN;
|
||||||
|
END;
|
||||||
|
SET @单号前缀 = 'BHZZ-';
|
||||||
|
SET @补货类型名称 = N'自制补货';
|
||||||
|
END;
|
||||||
|
|
||||||
|
BEGIN TRY
|
||||||
|
BEGIN TRANSACTION;
|
||||||
|
|
||||||
|
IF @来源类型 = N'仓库备货'
|
||||||
|
BEGIN
|
||||||
|
-- 仓库备货每次创建独立CKBH合同,编号规则按补货单日期+三位序号生成;修改人:Ld 修改时间:2026-08-04 08:29:13;
|
||||||
|
SET @序号 = 1;
|
||||||
|
SET @仓库备货合同编号 = N'CKBH-' + CONVERT(VARCHAR(8), GETDATE(), 112) + RIGHT('000' + CONVERT(VARCHAR(10), @序号), 3);
|
||||||
|
|
||||||
|
WHILE EXISTS (SELECT 1 FROM dbo.PDM_项目名称 WITH (UPDLOCK, HOLDLOCK) WHERE 合同编号 = @仓库备货合同编号)
|
||||||
|
BEGIN
|
||||||
|
SET @序号 = @序号 + 1;
|
||||||
|
SET @仓库备货合同编号 = N'CKBH-' + CONVERT(VARCHAR(8), GETDATE(), 112) + RIGHT('000' + CONVERT(VARCHAR(10), @序号), 3);
|
||||||
|
END;
|
||||||
|
|
||||||
|
INSERT INTO dbo.PDM_项目名称(合同编号, 合同类型, 操作者, 税率, 签订日期, 交货日期, 是否生成订单, 提交日期, 客户流水号, 是否审核, 合同备注, 是否启用, 收货人员, 合同金额, 未收款项)
|
||||||
|
VALUES(@仓库备货合同编号, 3, @操作者, 0.13, GETDATE(), @补货期限, 1, GETDATE(), 8, 1, N'仓库发起备货补货合同', 1, N'仓库', 0, 0);
|
||||||
|
|
||||||
|
SET @项目流水号 = SCOPE_IDENTITY();
|
||||||
|
|
||||||
|
-- 合同明细视图规格品名来源于机床名称+详情,此处写入仓库补货、单价0;修改人:Ld 修改时间:2026-08-04 08:29:13;
|
||||||
|
INSERT INTO dbo.PDM_机床名称(项目流水号, 机床名称, 数量, 单价, 单位)
|
||||||
|
VALUES(@项目流水号, N'仓库补货', 1, 0, N'项');
|
||||||
|
SET @机床流水号 = SCOPE_IDENTITY();
|
||||||
|
END;
|
||||||
|
ELSE
|
||||||
|
BEGIN
|
||||||
|
IF @项目流水号 IS NULL
|
||||||
|
BEGIN
|
||||||
|
SELECT '0' AS result, N'请选择关联销售合同' AS message;
|
||||||
|
ROLLBACK TRANSACTION;
|
||||||
|
RETURN;
|
||||||
|
END;
|
||||||
|
|
||||||
|
IF NOT EXISTS (SELECT 1 FROM dbo.PDM_项目名称 WHERE 项目流水号 = @项目流水号 AND ISNULL(是否启用, 1) = 1)
|
||||||
|
BEGIN
|
||||||
|
SELECT '0' AS result, N'关联销售合同不存在或已停用' AS message;
|
||||||
|
ROLLBACK TRANSACTION;
|
||||||
|
RETURN;
|
||||||
|
END;
|
||||||
|
END;
|
||||||
|
|
||||||
|
SET @序号 = 1;
|
||||||
|
SET @单号 = @单号前缀 + CONVERT(VARCHAR(8), GETDATE(), 112) + RIGHT('000' + CONVERT(VARCHAR(10), @序号), 3);
|
||||||
|
|
||||||
|
WHILE EXISTS (SELECT 1 FROM dbo.合同管理_订单信息_基础表 WHERE 订单编号 = @单号)
|
||||||
|
BEGIN
|
||||||
|
SET @序号 = @序号 + 1;
|
||||||
|
SET @单号 = @单号前缀 + CONVERT(VARCHAR(8), GETDATE(), 112) + RIGHT('000' + CONVERT(VARCHAR(10), @序号), 3);
|
||||||
|
END;
|
||||||
|
|
||||||
|
IF @机床流水号 IS NULL
|
||||||
|
BEGIN
|
||||||
|
INSERT INTO dbo.PDM_机床名称(项目流水号)
|
||||||
|
VALUES(@项目流水号);
|
||||||
|
SET @机床流水号 = SCOPE_IDENTITY();
|
||||||
|
END;
|
||||||
|
|
||||||
|
INSERT INTO dbo.PDM_组件名称(机床流水号, 是否合同创建, 产品名称, 产品流水号, 数量, 配置数)
|
||||||
|
VALUES(@机床流水号, 1, @补货类型名称, 0, 1, 1);
|
||||||
|
SET @组件流水号 = SCOPE_IDENTITY();
|
||||||
|
|
||||||
|
IF @是否外购 = 1
|
||||||
|
BEGIN
|
||||||
|
INSERT INTO dbo.合同管理_订单信息_基础表(项目流水号, 订单编号, 订单类型, 是否提交, 下单人, 下单日期, 采购期限, 订单备注)
|
||||||
|
VALUES(@项目流水号, @单号, @订单类型, 1, @操作者, GETDATE(), @补货期限,
|
||||||
|
ISNULL(@订单备注, N'') + CASE WHEN ISNULL(@来源类型, N'') <> N'' THEN N';补货来源:' + @来源类型 ELSE N'' END);
|
||||||
|
|
||||||
|
INSERT INTO dbo.PDM_零件明细表_标准件和外购件(组件流水号, 物料流水号, 零件数量, 零件类型, 材料流水号, 导入人员编号)
|
||||||
|
SELECT @组件流水号, 物料流水号, 补货数量, 2, 材料流水号, @操作者
|
||||||
|
FROM dbo.外购件补货明细中间表;
|
||||||
|
|
||||||
|
INSERT INTO dbo.外购件补货单_图片(标准件和外购件流水号, [文件标识], [文件名称], [文件后缀], [是否启用], [文件内容])
|
||||||
|
SELECT 标准件和外购件流水号, [文件标识], [文件名称], [文件后缀], 补货单_图片.[是否启用], [文件内容]
|
||||||
|
FROM dbo.补货单_图片
|
||||||
|
INNER JOIN dbo.外购件补货明细中间表
|
||||||
|
ON dbo.补货单_图片.补货单明细中间表流水号 = dbo.外购件补货明细中间表.补货单明细中间表流水号
|
||||||
|
INNER JOIN dbo.PDM_零件明细表_标准件和外购件
|
||||||
|
ON dbo.外购件补货明细中间表.物料流水号 = dbo.PDM_零件明细表_标准件和外购件.物料流水号
|
||||||
|
WHERE 组件流水号 = @组件流水号
|
||||||
|
AND 是否外购 = 1;
|
||||||
|
|
||||||
|
DELETE FROM dbo.外购件补货明细中间表;
|
||||||
|
DELETE FROM dbo.补货单_图片 WHERE 是否外购 = 1;
|
||||||
|
END;
|
||||||
|
ELSE
|
||||||
|
BEGIN
|
||||||
|
INSERT INTO dbo.合同管理_订单信息_基础表(项目流水号, 订单编号, 订单类型, 是否提交, 下单人, 下单日期, 精工期限, 订单备注)
|
||||||
|
VALUES(@项目流水号, @单号, @订单类型, 1, @操作者, GETDATE(), @补货期限,
|
||||||
|
ISNULL(@订单备注, N'') + CASE WHEN ISNULL(@来源类型, N'') <> N'' THEN N';补货来源:' + @来源类型 ELSE N'' END);
|
||||||
|
|
||||||
|
INSERT INTO dbo.PDM_零件明细表_基本件(组件流水号, 物料流水号, 零件数量, 零件类型, 材料流水号, 导入人员编号, 是否投产, 投产数)
|
||||||
|
SELECT @组件流水号, 物料流水号, 补货数量, 3, 材料流水号, @操作者, 1, 补货数量
|
||||||
|
FROM dbo.自制件补货明细中间表;
|
||||||
|
|
||||||
|
INSERT INTO dbo.自制件补货单_图片(基本件流水号, [文件标识], [文件名称], [文件后缀], [是否启用], [文件内容])
|
||||||
|
SELECT 基本件流水号, [文件标识], [文件名称], [文件后缀], [是否启用], [文件内容]
|
||||||
|
FROM dbo.补货单_图片
|
||||||
|
INNER JOIN dbo.自制件补货明细中间表
|
||||||
|
ON dbo.补货单_图片.补货单明细中间表流水号 = dbo.自制件补货明细中间表.补货单明细中间表流水号
|
||||||
|
INNER JOIN dbo.PDM_零件明细表_基本件
|
||||||
|
ON dbo.自制件补货明细中间表.物料流水号 = dbo.PDM_零件明细表_基本件.物料流水号
|
||||||
|
WHERE 组件流水号 = @组件流水号
|
||||||
|
AND 是否外购 = 0;
|
||||||
|
|
||||||
|
DELETE FROM dbo.自制件补货明细中间表;
|
||||||
|
DELETE FROM dbo.补货单_图片 WHERE 是否外购 = 0;
|
||||||
|
END;
|
||||||
|
|
||||||
|
COMMIT TRANSACTION;
|
||||||
|
|
||||||
|
SELECT '1' AS result, @单号 AS 订单编号, @项目流水号 AS 项目流水号, @仓库备货合同编号 AS 合同编号, N'提交成功' AS message;
|
||||||
|
END TRY
|
||||||
|
BEGIN CATCH
|
||||||
|
IF @@TRANCOUNT > 0
|
||||||
|
ROLLBACK TRANSACTION;
|
||||||
|
|
||||||
|
SELECT '0' AS result, ERROR_MESSAGE() AS message;
|
||||||
|
END CATCH;
|
||||||
|
END;
|
||||||
|
GO
|
||||||
|
|
||||||
456
sql/sales_performance_commission_test_20260727.sql
Normal file
@@ -0,0 +1,456 @@
|
|||||||
|
/*
|
||||||
|
修改人:Ld 修改时间:2026-07-27 12:00:00;
|
||||||
|
销售绩效与提成比例设置部署脚本,适用于测试库和正式库;正式库不插入测试合同数据。
|
||||||
|
*/
|
||||||
|
|
||||||
|
-- 修改人:Ld 修改时间:2026-07-29 09:20:00; 正式库同步时补充合同提成类型字段。
|
||||||
|
IF COL_LENGTH(N'dbo.PDM_项目名称', N'提成类型') IS NULL
|
||||||
|
BEGIN
|
||||||
|
ALTER TABLE dbo.PDM_项目名称 ADD 提成类型 nvarchar(50) NULL;
|
||||||
|
END;
|
||||||
|
GO
|
||||||
|
|
||||||
|
-- 修改人:Ld 修改时间:2026-07-29 09:20:00; 合同编辑保存提成类型。
|
||||||
|
ALTER PROCEDURE [dbo].[PDM_项目名称_编辑数据]
|
||||||
|
@项目流水号 int,
|
||||||
|
@客户流水号 int=null,
|
||||||
|
@付款方式流水号 int=null,
|
||||||
|
@交货期限 nvarchar(50)=null,
|
||||||
|
@客户要求 nvarchar(200)=null,
|
||||||
|
@操作者 int=null,
|
||||||
|
@收货人 nvarchar(50)=null,
|
||||||
|
@签订日期 nvarchar(50)=null,
|
||||||
|
@税率 float=null,
|
||||||
|
@合同备注 nvarchar(50)=null,
|
||||||
|
@提成类型 nvarchar(50)=null
|
||||||
|
AS
|
||||||
|
update PDM_项目名称 set 客户流水号=@客户流水号,付款方式流水号=@付款方式流水号,交货期限=@交货期限,操作者=@操作者,客户要求=@客户要求,合同备注=@合同备注,提成类型=@提成类型
|
||||||
|
,签订日期=@签订日期,税率=@税率,收货人员=@收货人 where 项目流水号=@项目流水号
|
||||||
|
GO
|
||||||
|
|
||||||
|
-- 修改人:Ld 修改时间:2026-07-29 09:20:00; 合同查询视图带出提成类型。
|
||||||
|
ALTER VIEW [dbo].[PDM_项目名称_视图]
|
||||||
|
AS
|
||||||
|
SELECT CASE WHEN PDM_项目名称.提交日期 IS NULL AND
|
||||||
|
PDM_项目名称.是否启用 = 1 THEN '未提交' WHEN PDM_项目名称.是否启用 = 0 THEN '终止执行' WHEN PDM_项目名称.提交日期
|
||||||
|
IS NOT NULL AND PDM_项目名称.是否启用 = 1 AND 是否提交 IS NULL
|
||||||
|
THEN '未创建' WHEN PDM_项目名称.提交日期 IS NOT NULL AND PDM_项目名称.是否启用 = 1 AND 是否提交 = 1 AND
|
||||||
|
是否审核 = 0 THEN '未审批' WHEN PDM_项目名称.提交日期 IS NOT NULL AND PDM_项目名称.是否启用 = 1 AND
|
||||||
|
是否提交 = 1 AND 技术审核 = 0 AND 是否审核 = 1 THEN '未投产' WHEN PDM_项目名称.提交日期 IS NOT NULL AND
|
||||||
|
PDM_项目名称.是否启用 = 1 AND 是否提交 = 1 AND 技术审核 = 1 AND
|
||||||
|
是否审核 = 1 THEN '未审核' WHEN PDM_项目名称.提交日期 IS NOT NULL AND PDM_项目名称.是否启用 = 1 AND
|
||||||
|
是否提交 = 2 THEN '已投产' WHEN PDM_项目名称.提交日期 IS NOT NULL AND PDM_项目名称.是否启用 = 1 AND
|
||||||
|
是否提交 = 3 THEN '生产中' WHEN PDM_项目名称.提交日期 IS NOT NULL AND PDM_项目名称.是否启用 = 1 AND
|
||||||
|
是否提交 = 4 THEN '装配中' WHEN PDM_项目名称.提交日期 IS NOT NULL AND PDM_项目名称.是否启用 = 1 AND
|
||||||
|
是否提交 = 5 THEN '待发货' WHEN PDM_项目名称.提交日期 IS NOT NULL AND PDM_项目名称.是否启用 = 1 AND
|
||||||
|
是否提交 = 6 THEN '已完成' END AS 状态, dbo.PDM_项目名称.合同编号, dbo.客户关系管理系统_客户名称.客户名称,
|
||||||
|
dbo.PDM_项目名称.合同金额, dbo.合同管理_付款方式_基础表.付款方式, CASE WHEN CONVERT(varchar(100),
|
||||||
|
dbo.PDM_项目名称.交货日期, 23) = '1900-01-01' THEN NULL ELSE CONVERT(varchar(100),
|
||||||
|
dbo.PDM_项目名称.交货日期, 23) END AS 交货日期, dbo.PDM_项目名称.合同备注, dbo.PDM_项目名称.提成类型, dbo.PDM_项目名称.操作者,
|
||||||
|
CASE WHEN CONVERT(varchar(100), dbo.PDM_项目名称.签订日期, 23) = '1900-01-01' THEN NULL
|
||||||
|
ELSE CONVERT(varchar(100), dbo.PDM_项目名称.签订日期, 23) END AS 签订日期, CONVERT(varchar(100),
|
||||||
|
dbo.PDM_项目名称.提交日期, 23) AS 提交日期, dbo.PDM_项目名称.是否生成订单, dbo.PDM_项目名称.项目流水号,
|
||||||
|
dbo.PDM_项目名称.操作日期, dbo.PDM_项目名称.客户流水号, dbo.人事档案管理_人员名单.姓名 AS 经手人,
|
||||||
|
ISNULL(dbo.合同管理_订单信息_基础表.是否提交, 0) AS 是否提交, dbo.PDM_项目名称.合同类型,
|
||||||
|
dbo.PDM_项目名称.客户要求, dbo.客户关系管理系统_客户名称.省份流水号, dbo.基础表_省份表.省份,
|
||||||
|
CASE WHEN CONVERT(varchar(7), dbo.PDM_项目名称.签订日期, 120) = '1900-01' THEN NULL
|
||||||
|
ELSE CONVERT(varchar(7), dbo.PDM_项目名称.签订日期, 120) END AS 签订日期月, 1 AS 条数,
|
||||||
|
CASE WHEN CONVERT(varchar(4), dbo.PDM_项目名称.签订日期, 120) = '1900' THEN NULL ELSE CONVERT(varchar(4),
|
||||||
|
dbo.PDM_项目名称.签订日期, 120) END AS 签订日期年, dbo.客户关系管理系统_客户名称.地址,
|
||||||
|
dbo.客户关系管理系统_客户名称.电话, dbo.客户关系管理系统_客户名称.联系人,
|
||||||
|
dbo.客户关系管理系统_客户名称.传真, dbo.PDM_项目机床_视图.机床流水号,
|
||||||
|
ISNULL(dbo.PDM_项目是否存在修改.条数, 0) AS 是否修改, CASE WHEN 交货期限 IS NULL
|
||||||
|
THEN '' ELSE '付款后' + 交货期限 + '日' END AS 交货期限, CONVERT(nvarchar(50), dbo.PDM_项目名称.税率 * 100)
|
||||||
|
+ N'%' AS 税率, dbo.PDM_项目名称.交货期限 AS 交货, dbo.PDM_项目名称.是否启用,
|
||||||
|
CASE WHEN 项目_合同留存信息_视图.项目流水号 IS NOT NULL THEN 1 ELSE 0 END AS 留存信息,
|
||||||
|
CASE WHEN 项目_客户提供资料_视图.项目流水号 IS NOT NULL THEN 1 ELSE 0 END AS 客户资料,
|
||||||
|
ISNULL(dbo.PDM_项目是否可删_视图.是否接收, 0) AS 是否接收, dbo.PDM_项目名称.收货人员,
|
||||||
|
人事档案管理_人员名单_1.姓名 AS 通知人, CONVERT(varchar(10), dbo.PDM_项目名称.通知日期, 23) AS 通知日期,
|
||||||
|
dbo.PDM_项目名称.合同协议, dbo.客户关系管理系统_客户名称.收货人, dbo.PDM_项目名称.是否审核,
|
||||||
|
dbo.PDM_项目名称.付款方式流水号, dbo.PDM_项目名称.税率 AS 税率小数, dbo.PDM_项目名称.售后原因,
|
||||||
|
dbo.PDM_项目名称.解决方案, dbo.合同管理_订单信息_基础表.订单备注, CASE WHEN 合同金额 = 0 OR
|
||||||
|
未收款项 = 0 THEN 0 ELSE CONVERT(int, CONVERT(decimal(18, 2), (未收款项 / 合同金额)) * 100) END AS 已收金额,
|
||||||
|
dbo.PDM_项目名称.未收款项
|
||||||
|
FROM dbo.项目_客户提供资料_视图 RIGHT OUTER JOIN
|
||||||
|
dbo.PDM_项目名称 INNER JOIN
|
||||||
|
dbo.人事档案管理_人员名单 ON dbo.PDM_项目名称.操作者 = dbo.人事档案管理_人员名单.人员编号 LEFT OUTER JOIN
|
||||||
|
dbo.人事档案管理_人员名单 AS 人事档案管理_人员名单_1 ON
|
||||||
|
dbo.PDM_项目名称.通知人 = 人事档案管理_人员名单_1.人员编号 LEFT OUTER JOIN
|
||||||
|
dbo.PDM_项目是否可删_视图 ON dbo.PDM_项目名称.项目流水号 = dbo.PDM_项目是否可删_视图.项目流水号 ON
|
||||||
|
dbo.项目_客户提供资料_视图.项目流水号 = dbo.PDM_项目名称.项目流水号 LEFT OUTER JOIN
|
||||||
|
dbo.项目_合同留存信息_视图 ON
|
||||||
|
dbo.PDM_项目名称.项目流水号 = dbo.项目_合同留存信息_视图.项目流水号 LEFT OUTER JOIN
|
||||||
|
dbo.PDM_项目是否存在修改 ON
|
||||||
|
dbo.PDM_项目名称.项目流水号 = dbo.PDM_项目是否存在修改.项目流水号 LEFT OUTER JOIN
|
||||||
|
dbo.PDM_项目机床_视图 ON dbo.PDM_项目名称.项目流水号 = dbo.PDM_项目机床_视图.项目流水号 LEFT OUTER JOIN
|
||||||
|
dbo.合同管理_订单信息_基础表 ON
|
||||||
|
dbo.PDM_项目名称.项目流水号 = dbo.合同管理_订单信息_基础表.项目流水号 LEFT OUTER JOIN
|
||||||
|
dbo.合同管理_付款方式_基础表 ON
|
||||||
|
dbo.PDM_项目名称.付款方式流水号 = dbo.合同管理_付款方式_基础表.付款方式流水号 LEFT OUTER JOIN
|
||||||
|
dbo.基础表_省份表 RIGHT OUTER JOIN
|
||||||
|
dbo.客户关系管理系统_客户名称 ON dbo.基础表_省份表.省份流水号 = dbo.客户关系管理系统_客户名称.省份流水号 ON
|
||||||
|
dbo.PDM_项目名称.客户流水号 = dbo.客户关系管理系统_客户名称.客户流水号
|
||||||
|
GO
|
||||||
|
|
||||||
|
IF OBJECT_ID(N'dbo.销售管理_提成比例设置', N'U') IS NULL
|
||||||
|
BEGIN
|
||||||
|
CREATE TABLE dbo.销售管理_提成比例设置
|
||||||
|
(
|
||||||
|
提成比例ID int IDENTITY(1,1) NOT NULL PRIMARY KEY,
|
||||||
|
提成类型 nvarchar(50) NOT NULL,
|
||||||
|
提成比例 decimal(9,4) NOT NULL CONSTRAINT DF_销售管理_提成比例设置_提成比例 DEFAULT(0),
|
||||||
|
是否启用 int NOT NULL CONSTRAINT DF_销售管理_提成比例设置_是否启用 DEFAULT(1),
|
||||||
|
备注 nvarchar(500) NULL,
|
||||||
|
操作者 int NULL,
|
||||||
|
操作日期 datetime NOT NULL CONSTRAINT DF_销售管理_提成比例设置_操作日期 DEFAULT(GETDATE())
|
||||||
|
);
|
||||||
|
CREATE UNIQUE INDEX UX_销售管理_提成比例设置_提成类型 ON dbo.销售管理_提成比例设置(提成类型);
|
||||||
|
END;
|
||||||
|
GO
|
||||||
|
|
||||||
|
MERGE dbo.销售管理_提成比例设置 AS target
|
||||||
|
USING
|
||||||
|
(
|
||||||
|
SELECT N'首单提成(专机)' AS 提成类型 UNION ALL
|
||||||
|
SELECT N'首单提成(模块)' UNION ALL
|
||||||
|
SELECT N'转介绍提成(专机)' UNION ALL
|
||||||
|
SELECT N'转介绍提成(模块)' UNION ALL
|
||||||
|
SELECT N'复购提成'
|
||||||
|
) AS source
|
||||||
|
ON target.提成类型 = source.提成类型
|
||||||
|
WHEN NOT MATCHED THEN
|
||||||
|
INSERT(提成类型, 提成比例, 是否启用, 备注, 操作日期)
|
||||||
|
VALUES(source.提成类型, 0, 1, N'初始化提成类型,请维护百分比', GETDATE());
|
||||||
|
GO
|
||||||
|
|
||||||
|
IF OBJECT_ID(N'dbo.销售管理_提成比例设置_查询数据', N'P') IS NOT NULL
|
||||||
|
DROP PROCEDURE dbo.销售管理_提成比例设置_查询数据;
|
||||||
|
GO
|
||||||
|
|
||||||
|
CREATE PROCEDURE dbo.销售管理_提成比例设置_查询数据
|
||||||
|
@提成类型_check int = 0,
|
||||||
|
@提成类型 nvarchar(50) = NULL,
|
||||||
|
@人员编号 int = NULL
|
||||||
|
AS
|
||||||
|
BEGIN
|
||||||
|
SET NOCOUNT ON;
|
||||||
|
-- 修改人:Ld 修改时间:2026-07-27 14:35:00; 提成比例设置仅允许人员编号5和273查看。
|
||||||
|
IF ISNULL(@人员编号, 0) NOT IN (5, 273)
|
||||||
|
BEGIN
|
||||||
|
SELECT CAST(0 AS int) AS result, N'无权查看提成比例设置' AS msg;
|
||||||
|
RETURN;
|
||||||
|
END;
|
||||||
|
|
||||||
|
SELECT 提成比例ID, 提成类型, CAST(提成比例 AS float) AS 提成比例, 是否启用, 备注,
|
||||||
|
CONVERT(varchar(19), 操作日期, 120) AS 操作日期
|
||||||
|
FROM dbo.销售管理_提成比例设置
|
||||||
|
WHERE (@提成类型_check = 0 OR 提成类型 = @提成类型)
|
||||||
|
ORDER BY 提成比例ID;
|
||||||
|
END;
|
||||||
|
GO
|
||||||
|
|
||||||
|
IF OBJECT_ID(N'dbo.销售管理_提成比例设置_保存数据', N'P') IS NOT NULL
|
||||||
|
DROP PROCEDURE dbo.销售管理_提成比例设置_保存数据;
|
||||||
|
GO
|
||||||
|
|
||||||
|
CREATE PROCEDURE dbo.销售管理_提成比例设置_保存数据
|
||||||
|
@提成比例ID int = NULL,
|
||||||
|
@提成类型 nvarchar(50) = NULL,
|
||||||
|
@提成比例 float = NULL,
|
||||||
|
@是否启用 int = 1,
|
||||||
|
@备注 nvarchar(500) = NULL,
|
||||||
|
@操作者 int = NULL,
|
||||||
|
@人员编号 int = NULL
|
||||||
|
AS
|
||||||
|
BEGIN
|
||||||
|
SET NOCOUNT ON;
|
||||||
|
-- 修改人:Ld 修改时间:2026-07-27 14:35:00; 保存时再次校验指定人员编号。
|
||||||
|
IF ISNULL(@人员编号, 0) NOT IN (5, 273)
|
||||||
|
BEGIN
|
||||||
|
SELECT CAST(0 AS int) AS result, N'无权维护提成比例设置' AS msg;
|
||||||
|
RETURN;
|
||||||
|
END;
|
||||||
|
|
||||||
|
IF ISNULL(LTRIM(RTRIM(@提成类型)), N'') = N''
|
||||||
|
BEGIN
|
||||||
|
SELECT CAST(0 AS int) AS result, N'提成类型不能为空' AS msg;
|
||||||
|
RETURN;
|
||||||
|
END;
|
||||||
|
|
||||||
|
IF ISNULL(@提成比例, -1) < 0
|
||||||
|
BEGIN
|
||||||
|
SELECT CAST(0 AS int) AS result, N'提成比例不能小于0' AS msg;
|
||||||
|
RETURN;
|
||||||
|
END;
|
||||||
|
|
||||||
|
IF EXISTS(SELECT 1 FROM dbo.销售管理_提成比例设置 WHERE 提成类型 = @提成类型 AND ISNULL(提成比例ID, 0) <> ISNULL(@提成比例ID, 0))
|
||||||
|
BEGIN
|
||||||
|
SELECT CAST(0 AS int) AS result, N'提成类型已存在' AS msg;
|
||||||
|
RETURN;
|
||||||
|
END;
|
||||||
|
|
||||||
|
IF EXISTS(SELECT 1 FROM dbo.销售管理_提成比例设置 WHERE 提成比例ID = @提成比例ID)
|
||||||
|
BEGIN
|
||||||
|
UPDATE dbo.销售管理_提成比例设置
|
||||||
|
SET 提成类型 = @提成类型,
|
||||||
|
提成比例 = CAST(@提成比例 AS decimal(9,4)),
|
||||||
|
是否启用 = ISNULL(@是否启用, 1),
|
||||||
|
备注 = @备注,
|
||||||
|
操作者 = @操作者,
|
||||||
|
操作日期 = GETDATE()
|
||||||
|
WHERE 提成比例ID = @提成比例ID;
|
||||||
|
END
|
||||||
|
ELSE
|
||||||
|
BEGIN
|
||||||
|
INSERT INTO dbo.销售管理_提成比例设置(提成类型, 提成比例, 是否启用, 备注, 操作者, 操作日期)
|
||||||
|
VALUES(@提成类型, CAST(@提成比例 AS decimal(9,4)), ISNULL(@是否启用, 1), @备注, @操作者, GETDATE());
|
||||||
|
END;
|
||||||
|
|
||||||
|
SELECT CAST(1 AS int) AS result, N'保存成功' AS msg;
|
||||||
|
END;
|
||||||
|
GO
|
||||||
|
|
||||||
|
IF OBJECT_ID(N'dbo.销售管理_提成比例设置_删除数据', N'P') IS NOT NULL
|
||||||
|
DROP PROCEDURE dbo.销售管理_提成比例设置_删除数据;
|
||||||
|
GO
|
||||||
|
|
||||||
|
CREATE PROCEDURE dbo.销售管理_提成比例设置_删除数据
|
||||||
|
@提成比例ID int = NULL,
|
||||||
|
@操作者 int = NULL,
|
||||||
|
@人员编号 int = NULL
|
||||||
|
AS
|
||||||
|
BEGIN
|
||||||
|
SET NOCOUNT ON;
|
||||||
|
-- 修改人:Ld 修改时间:2026-07-27 12:00:00; 删除采用停用方式保留历史比例记录。
|
||||||
|
-- 修改人:Ld 修改时间:2026-07-27 14:35:00; 停用时再次校验指定人员编号。
|
||||||
|
IF ISNULL(@人员编号, 0) NOT IN (5, 273)
|
||||||
|
BEGIN
|
||||||
|
SELECT CAST(0 AS int) AS result, N'无权停用提成比例设置' AS msg;
|
||||||
|
RETURN;
|
||||||
|
END;
|
||||||
|
|
||||||
|
UPDATE dbo.销售管理_提成比例设置
|
||||||
|
SET 是否启用 = 0, 操作者 = @操作者, 操作日期 = GETDATE()
|
||||||
|
WHERE 提成比例ID = @提成比例ID;
|
||||||
|
|
||||||
|
SELECT CAST(1 AS int) AS result, N'停用成功' AS msg;
|
||||||
|
END;
|
||||||
|
GO
|
||||||
|
|
||||||
|
IF OBJECT_ID(N'dbo.销售管理_销售绩效_查询数据', N'P') IS NOT NULL
|
||||||
|
DROP PROCEDURE dbo.销售管理_销售绩效_查询数据;
|
||||||
|
GO
|
||||||
|
|
||||||
|
CREATE PROCEDURE dbo.销售管理_销售绩效_查询数据
|
||||||
|
@绩效月份 nvarchar(7) = NULL,
|
||||||
|
@销售员_check int = 0,
|
||||||
|
@销售员 nvarchar(50) = NULL,
|
||||||
|
@提成类型_check int = 0,
|
||||||
|
@提成类型 nvarchar(50) = NULL,
|
||||||
|
@合同编号_check int = 0,
|
||||||
|
@合同编号 nvarchar(50) = NULL
|
||||||
|
AS
|
||||||
|
BEGIN
|
||||||
|
SET NOCOUNT ON;
|
||||||
|
-- 修改人:Ld 修改时间:2026-07-27 12:00:00; 达到90%当月补算此前回款,退款按发生月份扣回绩效。
|
||||||
|
;WITH 收款流水 AS
|
||||||
|
(
|
||||||
|
SELECT
|
||||||
|
r.id,
|
||||||
|
r.项目流水号,
|
||||||
|
CAST(ISNULL(r.金额, 0) AS decimal(18,2)) AS 金额,
|
||||||
|
r.时间,
|
||||||
|
p.合同编号,
|
||||||
|
CAST(ISNULL(p.合同金额, 0) AS decimal(18,2)) AS 合同金额,
|
||||||
|
v.客户名称,
|
||||||
|
ISNULL(v.经手人, N'') AS 销售员,
|
||||||
|
ISNULL(p.提成类型, N'') AS 提成类型,
|
||||||
|
CAST(ISNULL(s.提成比例, 0) AS decimal(18,4)) AS 提成比例
|
||||||
|
FROM dbo.财务管理_收款记录 r
|
||||||
|
INNER JOIN dbo.PDM_项目名称 p ON r.项目流水号 = p.项目流水号
|
||||||
|
LEFT JOIN dbo.PDM_项目名称_视图 v ON p.项目流水号 = v.项目流水号
|
||||||
|
LEFT JOIN dbo.销售管理_提成比例设置 s ON p.提成类型 = s.提成类型 AND s.是否启用 = 1
|
||||||
|
WHERE ISNULL(p.是否启用, 1) = 1
|
||||||
|
AND ISNULL(p.合同金额, 0) > 0
|
||||||
|
AND ISNULL(p.提成类型, N'') <> N''
|
||||||
|
),
|
||||||
|
累计流水 AS
|
||||||
|
(
|
||||||
|
SELECT a.*,
|
||||||
|
(
|
||||||
|
SELECT ISNULL(SUM(b.金额), 0)
|
||||||
|
FROM 收款流水 b
|
||||||
|
WHERE b.项目流水号 = a.项目流水号
|
||||||
|
AND (b.时间 < a.时间 OR (b.时间 = a.时间 AND b.id <= a.id))
|
||||||
|
) AS 累计回款
|
||||||
|
FROM 收款流水 a
|
||||||
|
),
|
||||||
|
达标 AS
|
||||||
|
(
|
||||||
|
SELECT 项目流水号, MIN(时间) AS 达标时间
|
||||||
|
FROM 累计流水
|
||||||
|
WHERE 累计回款 >= 合同金额 * 0.9
|
||||||
|
GROUP BY 项目流水号
|
||||||
|
),
|
||||||
|
绩效流水 AS
|
||||||
|
(
|
||||||
|
SELECT
|
||||||
|
l.*,
|
||||||
|
d.达标时间,
|
||||||
|
CASE
|
||||||
|
WHEN l.时间 <= d.达标时间 THEN CONVERT(varchar(7), d.达标时间, 120)
|
||||||
|
ELSE CONVERT(varchar(7), l.时间, 120)
|
||||||
|
END AS 绩效月份
|
||||||
|
FROM 累计流水 l
|
||||||
|
INNER JOIN 达标 d ON l.项目流水号 = d.项目流水号
|
||||||
|
),
|
||||||
|
绩效汇总 AS
|
||||||
|
(
|
||||||
|
SELECT
|
||||||
|
绩效月份,
|
||||||
|
项目流水号,
|
||||||
|
合同编号,
|
||||||
|
客户名称,
|
||||||
|
销售员,
|
||||||
|
合同金额,
|
||||||
|
提成类型,
|
||||||
|
提成比例,
|
||||||
|
SUM(金额) AS 本月回款金额,
|
||||||
|
SUM(金额 * 提成比例 / 100.0) AS 本月绩效金额
|
||||||
|
FROM 绩效流水
|
||||||
|
GROUP BY 绩效月份, 项目流水号, 合同编号, 客户名称, 销售员, 合同金额, 提成类型, 提成比例
|
||||||
|
)
|
||||||
|
SELECT
|
||||||
|
h.绩效月份,
|
||||||
|
h.销售员,
|
||||||
|
h.合同编号,
|
||||||
|
h.客户名称,
|
||||||
|
CAST(h.合同金额 AS float) AS 合同金额,
|
||||||
|
CAST((SELECT ISNULL(SUM(r2.金额), 0) FROM dbo.财务管理_收款记录 r2 WHERE r2.项目流水号 = h.项目流水号 AND CONVERT(varchar(7), r2.时间, 120) <= h.绩效月份) AS float) AS 累计回款金额,
|
||||||
|
CAST(h.本月回款金额 AS float) AS 本月回款金额,
|
||||||
|
CAST(CASE WHEN h.合同金额 = 0 THEN 0 ELSE (SELECT ISNULL(SUM(r2.金额), 0) FROM dbo.财务管理_收款记录 r2 WHERE r2.项目流水号 = h.项目流水号 AND CONVERT(varchar(7), r2.时间, 120) <= h.绩效月份) / h.合同金额 * 100 END AS decimal(18,2)) AS 回款比例,
|
||||||
|
h.提成类型,
|
||||||
|
CAST(h.提成比例 AS float) AS 提成比例,
|
||||||
|
CAST(h.本月绩效金额 AS decimal(18,2)) AS 本月绩效金额,
|
||||||
|
h.项目流水号
|
||||||
|
FROM 绩效汇总 h
|
||||||
|
WHERE (@绩效月份 IS NULL OR @绩效月份 = N'' OR h.绩效月份 = @绩效月份)
|
||||||
|
AND (@销售员_check = 0 OR h.销售员 LIKE N'%' + @销售员 + N'%')
|
||||||
|
AND (@提成类型_check = 0 OR h.提成类型 = @提成类型)
|
||||||
|
AND (@合同编号_check = 0 OR h.合同编号 LIKE N'%' + @合同编号 + N'%')
|
||||||
|
ORDER BY h.绩效月份 DESC, h.销售员, h.合同编号;
|
||||||
|
END;
|
||||||
|
GO
|
||||||
|
|
||||||
|
IF OBJECT_ID(N'dbo.报表_销售管理_销售绩效_查询数据', N'P') IS NOT NULL
|
||||||
|
DROP PROCEDURE dbo.报表_销售管理_销售绩效_查询数据;
|
||||||
|
GO
|
||||||
|
|
||||||
|
IF OBJECT_ID(N'dbo.销售管理_销售绩效_回款明细_查询数据', N'P') IS NOT NULL
|
||||||
|
DROP PROCEDURE dbo.销售管理_销售绩效_回款明细_查询数据;
|
||||||
|
GO
|
||||||
|
|
||||||
|
CREATE PROCEDURE dbo.销售管理_销售绩效_回款明细_查询数据
|
||||||
|
@项目流水号 int = NULL
|
||||||
|
AS
|
||||||
|
BEGIN
|
||||||
|
SET NOCOUNT ON;
|
||||||
|
-- 修改人:Ld 修改时间:2026-07-28 13:45:00; 销售绩效展开行查看合同回款明细。
|
||||||
|
SELECT
|
||||||
|
id AS 回款记录ID,
|
||||||
|
项目流水号,
|
||||||
|
CAST(ISNULL(金额, 0) AS float) AS 回款金额,
|
||||||
|
CONVERT(varchar(19), 时间, 120) AS 回款时间,
|
||||||
|
备注
|
||||||
|
FROM dbo.财务管理_收款记录
|
||||||
|
WHERE 项目流水号 = @项目流水号
|
||||||
|
ORDER BY 时间 DESC, id DESC;
|
||||||
|
END;
|
||||||
|
GO
|
||||||
|
|
||||||
|
CREATE PROCEDURE dbo.报表_销售管理_销售绩效_查询数据
|
||||||
|
@绩效月份 nvarchar(7) = NULL,
|
||||||
|
@销售员_check int = 0,
|
||||||
|
@销售员 nvarchar(50) = NULL,
|
||||||
|
@提成类型_check int = 0,
|
||||||
|
@提成类型 nvarchar(50) = NULL,
|
||||||
|
@合同编号_check int = 0,
|
||||||
|
@合同编号 nvarchar(50) = NULL
|
||||||
|
AS
|
||||||
|
BEGIN
|
||||||
|
SET NOCOUNT ON;
|
||||||
|
-- 修改人:Ld 修改时间:2026-07-27 12:00:00; 销售绩效导出列宽和数据。
|
||||||
|
SELECT N'销售绩效_' + CONVERT(varchar(8), GETDATE(), 112) + N'-' + REPLACE(CONVERT(varchar(8), GETDATE(), 108), ':', '') AS tablename, N'07' AS tabletype;
|
||||||
|
SELECT
|
||||||
|
120 * 20 AS 绩效月份,
|
||||||
|
100 * 20 AS 销售员,
|
||||||
|
160 * 20 AS 合同编号,
|
||||||
|
220 * 20 AS 客户名称,
|
||||||
|
120 * 20 AS 合同金额,
|
||||||
|
120 * 20 AS 累计回款金额,
|
||||||
|
120 * 20 AS 本月回款金额,
|
||||||
|
100 * 20 AS 回款比例,
|
||||||
|
160 * 20 AS 提成类型,
|
||||||
|
100 * 20 AS 提成比例,
|
||||||
|
120 * 20 AS 本月绩效金额;
|
||||||
|
|
||||||
|
EXEC dbo.销售管理_销售绩效_查询数据
|
||||||
|
@绩效月份 = @绩效月份,
|
||||||
|
@销售员_check = @销售员_check,
|
||||||
|
@销售员 = @销售员,
|
||||||
|
@提成类型_check = @提成类型_check,
|
||||||
|
@提成类型 = @提成类型,
|
||||||
|
@合同编号_check = @合同编号_check,
|
||||||
|
@合同编号 = @合同编号;
|
||||||
|
END;
|
||||||
|
GO
|
||||||
|
|
||||||
|
-- 修改人:Ld 修改时间:2026-07-29 09:20:00; 正式库模块ID可能已占用,按路径查找或自动分配空闲ID。
|
||||||
|
DECLARE @销售绩效模块ID int;
|
||||||
|
DECLARE @提成比例模块ID int;
|
||||||
|
|
||||||
|
SELECT @销售绩效模块ID = id
|
||||||
|
FROM dbo.基础表_模块信息
|
||||||
|
WHERE path = N'SalesManagement/SalesPerformance'
|
||||||
|
OR component = N'/SalesManagement/SalesPerformance'
|
||||||
|
OR name = N'SalesPerformance'
|
||||||
|
OR title = N'销售绩效';
|
||||||
|
|
||||||
|
IF @销售绩效模块ID IS NULL
|
||||||
|
BEGIN
|
||||||
|
SET @销售绩效模块ID = CASE WHEN NOT EXISTS(SELECT 1 FROM dbo.基础表_模块信息 WHERE id = 155) THEN 155 ELSE (SELECT ISNULL(MAX(id), 0) + 1 FROM dbo.基础表_模块信息) END;
|
||||||
|
|
||||||
|
SET IDENTITY_INSERT dbo.基础表_模块信息 ON;
|
||||||
|
INSERT INTO dbo.基础表_模块信息(id, path, component, redirect, name, title, icon, 是否通知, 消息通知来源, 通知条件, dashboardIcon, 是否禁用)
|
||||||
|
VALUES(@销售绩效模块ID, N'SalesManagement/SalesPerformance', N'/SalesManagement/SalesPerformance', NULL, N'SalesPerformance', N'销售绩效', N'ContractCapitalManagement', 0, NULL, NULL, NULL, 0);
|
||||||
|
SET IDENTITY_INSERT dbo.基础表_模块信息 OFF;
|
||||||
|
END;
|
||||||
|
|
||||||
|
SELECT @提成比例模块ID = id
|
||||||
|
FROM dbo.基础表_模块信息
|
||||||
|
WHERE path = N'SalesManagement/CommissionRateSetting'
|
||||||
|
OR component = N'/SalesManagement/CommissionRateSetting'
|
||||||
|
OR name = N'CommissionRateSetting'
|
||||||
|
OR title = N'提成比例设置';
|
||||||
|
|
||||||
|
IF @提成比例模块ID IS NULL
|
||||||
|
BEGIN
|
||||||
|
SET @提成比例模块ID = CASE WHEN NOT EXISTS(SELECT 1 FROM dbo.基础表_模块信息 WHERE id = 156) THEN 156 ELSE (SELECT ISNULL(MAX(id), 0) + 1 FROM dbo.基础表_模块信息) END;
|
||||||
|
|
||||||
|
SET IDENTITY_INSERT dbo.基础表_模块信息 ON;
|
||||||
|
INSERT INTO dbo.基础表_模块信息(id, path, component, redirect, name, title, icon, 是否通知, 消息通知来源, 通知条件, dashboardIcon, 是否禁用)
|
||||||
|
VALUES(@提成比例模块ID, N'SalesManagement/CommissionRateSetting', N'/SalesManagement/CommissionRateSetting', NULL, N'CommissionRateSetting', N'提成比例设置', N'ProductMaintenance', 0, NULL, NULL, NULL, 0);
|
||||||
|
SET IDENTITY_INSERT dbo.基础表_模块信息 OFF;
|
||||||
|
END;
|
||||||
|
|
||||||
|
INSERT INTO dbo.基础表_角色模块信息(id, pid, 模块顺序, 角色编号, 是否启用, 角色模块顺序)
|
||||||
|
SELECT @销售绩效模块ID, 10, @销售绩效模块ID, v.角色编号, 1, 32
|
||||||
|
FROM (VALUES(2),(3),(9),(11)) v(角色编号)
|
||||||
|
WHERE NOT EXISTS(SELECT 1 FROM dbo.基础表_角色模块信息 WHERE id = @销售绩效模块ID AND 角色编号 = v.角色编号);
|
||||||
|
|
||||||
|
INSERT INTO dbo.基础表_角色模块信息(id, pid, 模块顺序, 角色编号, 是否启用, 角色模块顺序)
|
||||||
|
SELECT @提成比例模块ID, 10, @提成比例模块ID, 2, 1, 33
|
||||||
|
WHERE NOT EXISTS(SELECT 1 FROM dbo.基础表_角色模块信息 WHERE id = @提成比例模块ID AND 角色编号 = 2);
|
||||||
|
|
||||||
|
SELECT @销售绩效模块ID AS 销售绩效模块ID, @提成比例模块ID AS 提成比例设置模块ID;
|
||||||
|
GO
|
||||||
243
sql/sales_performance_full_flow_verify_cleanup_20260730.sql
Normal file
@@ -0,0 +1,243 @@
|
|||||||
|
-- 修改人:Ld 修改时间:2026-07-30 08:10:00; 销售绩效从合同创建、收款到发货的测试库全流程验证,结束后清理测试数据。
|
||||||
|
SET NOCOUNT ON;
|
||||||
|
|
||||||
|
DECLARE @合同编号 nvarchar(50) = N'FLOW-JX-' + CONVERT(varchar(8), GETDATE(), 112) + N'-' + REPLACE(CONVERT(varchar(8), GETDATE(), 108), ':', '');
|
||||||
|
DECLARE @项目流水号 int;
|
||||||
|
DECLARE @机床流水号 int;
|
||||||
|
DECLARE @组件流水号 int;
|
||||||
|
DECLARE @订单流水号 int;
|
||||||
|
DECLARE @发货通知流水号 int;
|
||||||
|
DECLARE @发货单流水号 int;
|
||||||
|
DECLARE @发货单明细流水号 int;
|
||||||
|
DECLARE @发货单号 nvarchar(50);
|
||||||
|
DECLARE @销售绩效条数 int;
|
||||||
|
DECLARE @回款明细条数 int;
|
||||||
|
DECLARE @发货完成条数 int;
|
||||||
|
|
||||||
|
BEGIN TRY
|
||||||
|
-- 修改人:Ld 修改时间:2026-07-30 08:10:00; 先清理历史测试前缀,保证本次验证不留下测试数据。
|
||||||
|
DECLARE @历史项目 TABLE (项目流水号 int PRIMARY KEY);
|
||||||
|
|
||||||
|
INSERT INTO @历史项目 (项目流水号)
|
||||||
|
SELECT 项目流水号
|
||||||
|
FROM dbo.PDM_项目名称
|
||||||
|
WHERE 合同编号 LIKE N'FLOW-JX-%'
|
||||||
|
OR 合同编号 LIKE N'TEST-JX-%';
|
||||||
|
|
||||||
|
DELETE d
|
||||||
|
FROM dbo.发货管理_发货单明细 d
|
||||||
|
INNER JOIN dbo.通知发货_记录表 n ON d.发货通知流水号 = n.发货通知流水号
|
||||||
|
INNER JOIN dbo.PDM_组件名称 c ON n.组件流水号 = c.组件流水号
|
||||||
|
INNER JOIN dbo.PDM_机床名称 m ON c.机床流水号 = m.机床流水号
|
||||||
|
INNER JOIN @历史项目 p ON m.项目流水号 = p.项目流水号;
|
||||||
|
|
||||||
|
DELETE f
|
||||||
|
FROM dbo.发货管理_发货单 f
|
||||||
|
WHERE f.发货单号 LIKE N'FLOW-JX-%';
|
||||||
|
|
||||||
|
DELETE n
|
||||||
|
FROM dbo.通知发货_记录表 n
|
||||||
|
INNER JOIN dbo.PDM_组件名称 c ON n.组件流水号 = c.组件流水号
|
||||||
|
INNER JOIN dbo.PDM_机床名称 m ON c.机床流水号 = m.机床流水号
|
||||||
|
INNER JOIN @历史项目 p ON m.项目流水号 = p.项目流水号;
|
||||||
|
|
||||||
|
DELETE r
|
||||||
|
FROM dbo.财务管理_收款记录 r
|
||||||
|
INNER JOIN @历史项目 p ON r.项目流水号 = p.项目流水号;
|
||||||
|
|
||||||
|
DELETE o
|
||||||
|
FROM dbo.合同管理_订单信息_基础表 o
|
||||||
|
INNER JOIN @历史项目 p ON o.项目流水号 = p.项目流水号;
|
||||||
|
|
||||||
|
DELETE c
|
||||||
|
FROM dbo.PDM_组件名称 c
|
||||||
|
INNER JOIN dbo.PDM_机床名称 m ON c.机床流水号 = m.机床流水号
|
||||||
|
INNER JOIN @历史项目 p ON m.项目流水号 = p.项目流水号;
|
||||||
|
|
||||||
|
DELETE m
|
||||||
|
FROM dbo.PDM_机床名称 m
|
||||||
|
INNER JOIN @历史项目 p ON m.项目流水号 = p.项目流水号;
|
||||||
|
|
||||||
|
DELETE p
|
||||||
|
FROM dbo.PDM_项目名称 p
|
||||||
|
INNER JOIN @历史项目 h ON p.项目流水号 = h.项目流水号;
|
||||||
|
|
||||||
|
-- 修改人:Ld 修改时间:2026-07-30 08:10:00; 使用系统合同创建过程生成模块合同。
|
||||||
|
EXEC dbo.PDM_项目名称_增加数据 @合同类型 = 1, @操作者 = 5;
|
||||||
|
|
||||||
|
SELECT TOP 1 @项目流水号 = 项目流水号
|
||||||
|
FROM dbo.PDM_项目名称
|
||||||
|
WHERE 合同类型 = 1
|
||||||
|
AND 操作者 = 5
|
||||||
|
ORDER BY 项目流水号 DESC;
|
||||||
|
|
||||||
|
UPDATE dbo.PDM_项目名称
|
||||||
|
SET 合同编号 = @合同编号,
|
||||||
|
客户流水号 = 2507,
|
||||||
|
交货期限 = N'10',
|
||||||
|
客户要求 = N'销售绩效全流程验证',
|
||||||
|
合同备注 = N'销售绩效全流程验证,验证后自动清理',
|
||||||
|
收货人员 = N'测试收货人',
|
||||||
|
提成类型 = N'首单提成(模块)',
|
||||||
|
签订日期 = GETDATE(),
|
||||||
|
是否启用 = 1,
|
||||||
|
未收款项 = 0
|
||||||
|
WHERE 项目流水号 = @项目流水号;
|
||||||
|
|
||||||
|
SELECT TOP 1 @机床流水号 = 机床流水号
|
||||||
|
FROM dbo.PDM_机床名称
|
||||||
|
WHERE 项目流水号 = @项目流水号
|
||||||
|
ORDER BY 机床流水号 DESC;
|
||||||
|
|
||||||
|
EXEC dbo.PDM_组件名称_增加数据 @机床流水号 = @机床流水号, @是否可选 = 1;
|
||||||
|
|
||||||
|
SELECT TOP 1 @组件流水号 = 组件流水号
|
||||||
|
FROM dbo.PDM_组件名称
|
||||||
|
WHERE 机床流水号 = @机床流水号
|
||||||
|
ORDER BY 组件流水号 DESC;
|
||||||
|
|
||||||
|
UPDATE dbo.PDM_组件名称
|
||||||
|
SET 产品流水号 = 0,
|
||||||
|
产品名称 = N'销售绩效流程测试组件',
|
||||||
|
数量 = 1,
|
||||||
|
单价 = 10000,
|
||||||
|
单位 = N'套',
|
||||||
|
产品状态 = 4,
|
||||||
|
完成数量 = 1,
|
||||||
|
已通知发货数量 = 0,
|
||||||
|
已发数量 = 0,
|
||||||
|
已删 = 0
|
||||||
|
WHERE 组件流水号 = @组件流水号;
|
||||||
|
|
||||||
|
EXEC dbo.PDM_项目名称_提交数据 @项目流水号 = @项目流水号, @合同类型 = 1, @提交人 = 5;
|
||||||
|
|
||||||
|
EXEC dbo.PDM_订单信息_增加数据 @项目流水号 = @项目流水号, @订单类型 = 1, @下单人 = 5;
|
||||||
|
|
||||||
|
SELECT TOP 1 @订单流水号 = 订单流水号
|
||||||
|
FROM dbo.合同管理_订单信息_基础表
|
||||||
|
WHERE 项目流水号 = @项目流水号
|
||||||
|
ORDER BY 订单流水号 DESC;
|
||||||
|
|
||||||
|
UPDATE dbo.合同管理_订单信息_基础表
|
||||||
|
SET 是否提交 = 5,
|
||||||
|
是否确认 = 1,
|
||||||
|
技术审核 = 1,
|
||||||
|
是否查看 = 0,
|
||||||
|
发货通知是否查看 = 0,
|
||||||
|
已发货是否查看 = 0,
|
||||||
|
下单日期 = GETDATE(),
|
||||||
|
完成期限 = GETDATE()
|
||||||
|
WHERE 订单流水号 = @订单流水号;
|
||||||
|
|
||||||
|
-- 修改人:Ld 修改时间:2026-07-30 08:10:00; 使用系统收款过程写入回款,达到90%绩效规则。
|
||||||
|
EXEC dbo.发货通知_订单信息_收款 @项目流水号 = @项目流水号, @收款金额 = 9000, @备注 = N'销售绩效全流程验证回款90%';
|
||||||
|
|
||||||
|
SELECT @销售绩效条数 = COUNT(1)
|
||||||
|
FROM
|
||||||
|
(
|
||||||
|
SELECT 1 AS n
|
||||||
|
FROM dbo.财务管理_收款记录 r
|
||||||
|
INNER JOIN dbo.PDM_项目名称 p ON r.项目流水号 = p.项目流水号
|
||||||
|
WHERE p.项目流水号 = @项目流水号
|
||||||
|
AND p.提成类型 = N'首单提成(模块)'
|
||||||
|
AND ISNULL(p.合同金额, 0) > 0
|
||||||
|
GROUP BY p.项目流水号
|
||||||
|
HAVING SUM(ISNULL(r.金额, 0)) >= ISNULL(MAX(p.合同金额), 0) * 0.9
|
||||||
|
) x;
|
||||||
|
|
||||||
|
SELECT @回款明细条数 = COUNT(1)
|
||||||
|
FROM dbo.财务管理_收款记录
|
||||||
|
WHERE 项目流水号 = @项目流水号;
|
||||||
|
|
||||||
|
-- 修改人:Ld 修改时间:2026-07-30 08:10:00; 使用系统发货通知和发货单过程完成发货。
|
||||||
|
EXEC dbo.发货管理_通知发货 @组件流水号组 = @组件流水号, @本次发货数组 = N'1', @订单流水号 = @订单流水号;
|
||||||
|
|
||||||
|
SELECT TOP 1 @发货通知流水号 = 发货通知流水号
|
||||||
|
FROM dbo.通知发货_记录表
|
||||||
|
WHERE 组件流水号 = @组件流水号
|
||||||
|
ORDER BY 发货通知流水号 DESC;
|
||||||
|
|
||||||
|
SET @发货单号 = N'FLOW-JX-FH-' + CONVERT(varchar(8), GETDATE(), 112) + N'-' + REPLACE(CONVERT(varchar(8), GETDATE(), 108), ':', '');
|
||||||
|
|
||||||
|
EXEC dbo.产品发货_发货单_增加
|
||||||
|
@发货单号 = @发货单号,
|
||||||
|
@发货日期 = NULL,
|
||||||
|
@收货人 = N'测试收货人',
|
||||||
|
@收货地址 = N'测试地址',
|
||||||
|
@发货备注 = N'销售绩效全流程验证发货',
|
||||||
|
@物流单号 = N'FLOW-JX-LOGISTICS',
|
||||||
|
@客户流水号 = 2507;
|
||||||
|
|
||||||
|
SELECT TOP 1 @发货单流水号 = 发货单流水号
|
||||||
|
FROM dbo.发货管理_发货单
|
||||||
|
WHERE 发货单号 = @发货单号
|
||||||
|
ORDER BY 发货单流水号 DESC;
|
||||||
|
|
||||||
|
EXEC dbo.产品发货_发货单明细_增加 @发货单流水号 = @发货单流水号, @发货通知流水号 = @发货通知流水号, @发货数量 = 1;
|
||||||
|
|
||||||
|
SELECT TOP 1 @发货单明细流水号 = 发货单明细流水号
|
||||||
|
FROM dbo.发货管理_发货单明细
|
||||||
|
WHERE 发货单流水号 = @发货单流水号
|
||||||
|
ORDER BY 发货单明细流水号 DESC;
|
||||||
|
|
||||||
|
EXEC dbo.产品发货_发货单_确认发货
|
||||||
|
@发货单流水号 = @发货单流水号,
|
||||||
|
@发货单明细流水号组 = @发货单明细流水号,
|
||||||
|
@实际发量组 = N'1';
|
||||||
|
|
||||||
|
SELECT @发货完成条数 = COUNT(1)
|
||||||
|
FROM dbo.合同管理_订单信息_基础表
|
||||||
|
WHERE 订单流水号 = @订单流水号
|
||||||
|
AND 是否提交 = 6;
|
||||||
|
|
||||||
|
SELECT
|
||||||
|
@合同编号 AS 合同编号,
|
||||||
|
@项目流水号 AS 项目流水号,
|
||||||
|
@订单流水号 AS 订单流水号,
|
||||||
|
@组件流水号 AS 组件流水号,
|
||||||
|
@发货通知流水号 AS 发货通知流水号,
|
||||||
|
@发货单流水号 AS 发货单流水号,
|
||||||
|
@销售绩效条数 AS 达到绩效规则,
|
||||||
|
@回款明细条数 AS 回款明细条数,
|
||||||
|
@发货完成条数 AS 发货完成条数;
|
||||||
|
|
||||||
|
EXEC dbo.销售管理_销售绩效_查询数据 @绩效月份 = NULL, @合同编号_check = 1, @合同编号 = @合同编号;
|
||||||
|
EXEC dbo.销售管理_销售绩效_回款明细_查询数据 @项目流水号 = @项目流水号;
|
||||||
|
|
||||||
|
-- 修改人:Ld 修改时间:2026-07-30 08:10:00; 验证后立即清理本次测试数据,不留下测试合同、回款和发货记录。
|
||||||
|
DELETE FROM dbo.发货管理_发货单明细 WHERE 发货单流水号 = @发货单流水号;
|
||||||
|
DELETE FROM dbo.发货管理_发货单 WHERE 发货单流水号 = @发货单流水号;
|
||||||
|
DELETE FROM dbo.通知发货_记录表 WHERE 发货通知流水号 = @发货通知流水号;
|
||||||
|
DELETE FROM dbo.财务管理_收款记录 WHERE 项目流水号 = @项目流水号;
|
||||||
|
DELETE FROM dbo.合同管理_订单信息_基础表 WHERE 订单流水号 = @订单流水号;
|
||||||
|
DELETE FROM dbo.PDM_组件名称 WHERE 组件流水号 = @组件流水号;
|
||||||
|
DELETE FROM dbo.PDM_机床名称 WHERE 机床流水号 = @机床流水号;
|
||||||
|
DELETE FROM dbo.PDM_项目名称 WHERE 项目流水号 = @项目流水号;
|
||||||
|
|
||||||
|
SELECT
|
||||||
|
(SELECT COUNT(1) FROM dbo.PDM_项目名称 WHERE 合同编号 = @合同编号) AS 剩余合同数,
|
||||||
|
(SELECT COUNT(1) FROM dbo.财务管理_收款记录 WHERE 项目流水号 = @项目流水号) AS 剩余回款数,
|
||||||
|
(SELECT COUNT(1) FROM dbo.发货管理_发货单 WHERE 发货单号 = @发货单号) AS 剩余发货单数;
|
||||||
|
END TRY
|
||||||
|
BEGIN CATCH
|
||||||
|
-- 修改人:Ld 修改时间:2026-07-30 08:10:00; 异常时也尽量清理已生成测试数据。
|
||||||
|
IF @发货单流水号 IS NOT NULL DELETE FROM dbo.发货管理_发货单明细 WHERE 发货单流水号 = @发货单流水号;
|
||||||
|
IF @发货单流水号 IS NOT NULL DELETE FROM dbo.发货管理_发货单 WHERE 发货单流水号 = @发货单流水号;
|
||||||
|
IF @发货通知流水号 IS NOT NULL DELETE FROM dbo.通知发货_记录表 WHERE 发货通知流水号 = @发货通知流水号;
|
||||||
|
IF @项目流水号 IS NOT NULL DELETE FROM dbo.财务管理_收款记录 WHERE 项目流水号 = @项目流水号;
|
||||||
|
IF @订单流水号 IS NOT NULL DELETE FROM dbo.合同管理_订单信息_基础表 WHERE 订单流水号 = @订单流水号;
|
||||||
|
IF @组件流水号 IS NOT NULL DELETE FROM dbo.PDM_组件名称 WHERE 组件流水号 = @组件流水号;
|
||||||
|
IF @机床流水号 IS NOT NULL DELETE FROM dbo.PDM_机床名称 WHERE 机床流水号 = @机床流水号;
|
||||||
|
IF @项目流水号 IS NOT NULL DELETE FROM dbo.PDM_项目名称 WHERE 项目流水号 = @项目流水号;
|
||||||
|
|
||||||
|
DECLARE @错误信息 nvarchar(4000);
|
||||||
|
DECLARE @错误级别 int;
|
||||||
|
DECLARE @错误状态 int;
|
||||||
|
|
||||||
|
SELECT
|
||||||
|
@错误信息 = ERROR_MESSAGE(),
|
||||||
|
@错误级别 = ERROR_SEVERITY(),
|
||||||
|
@错误状态 = ERROR_STATE();
|
||||||
|
|
||||||
|
RAISERROR(@错误信息, @错误级别, @错误状态);
|
||||||
|
END CATCH;
|
||||||
129
sql/仓储管理_库存查询_采购中排除已入库.sql
Normal file
@@ -0,0 +1,129 @@
|
|||||||
|
USE [ERPTOOL_JY]
|
||||||
|
GO
|
||||||
|
|
||||||
|
-- 库存查询采购中排除已入库数据;修改人:Ld 修改时间:2026-07-23 16:39:41;
|
||||||
|
ALTER PROCEDURE [dbo].[仓储管理_库存查询_查询]
|
||||||
|
@物料名称_check bit = null,
|
||||||
|
@物料名称 nvarchar(50) = null,
|
||||||
|
@物料编码_check bit = null,
|
||||||
|
@物料编码 nvarchar(50) = null,
|
||||||
|
@图号_check bit = null,
|
||||||
|
@图号 nvarchar(50) = null,
|
||||||
|
@类型_check bit = null,
|
||||||
|
@类型 nvarchar(50) = null,
|
||||||
|
@库位_check bit = null,
|
||||||
|
@库位 nvarchar(50) = null,
|
||||||
|
@排序名称 int = null,
|
||||||
|
@排序方式 int = null
|
||||||
|
AS
|
||||||
|
|
||||||
|
declare @selectStr nvarchar(4000)
|
||||||
|
declare @selectStrWhere nvarchar(4000)
|
||||||
|
--(select 车间生产管理_零件工艺计划_视图.物料流水号,isnull(SUM(数量) - SUM(车间生产管理_零件工艺计划_视图.入库数量) - SUM(P.报废数量),0) as 加工中 from 车间生产管理_零件工艺计划_视图 inner join (select 工艺计划流水号,工序流水号 from dbo.车间生产管理工艺_零件工序 where dbo.车间生产管理工艺_零件工序.工序顺序 = 1) as n
|
||||||
|
-- 这是改动前
|
||||||
|
set @selectStr =
|
||||||
|
'Select 仓储管理_累计库存查询_视图.*,批次,isnull(需求量,0) as 需求量,毛坯库存,isnull(加工中,0) as 加工中,isnull(采购中,0) as 采购中,isnull(补货毛坯,0) as 补货毛坯 from 仓储管理_累计库存查询_视图
|
||||||
|
left join
|
||||||
|
(select count(*) as 批次,物料流水号 from 库存管理_物料与货位对照表 where 货位存量 > 0 group by 物料流水号)
|
||||||
|
as a on 仓储管理_累计库存查询_视图.物料流水号 = a.物料流水号 LEFT JOIN dbo.物料管理_需求量_视图 ON a.物料流水号 = dbo.物料管理_需求量_视图.物料流水号
|
||||||
|
left join
|
||||||
|
(select 车间生产管理_零件工艺计划_视图.物料流水号,isnull(SUM(数量) - SUM(车间生产管理_零件工艺计划_视图.入库数量) - ISNULL(SUM(P.报废数量),0),0) as 加工中 from 车间生产管理_零件工艺计划_视图 inner join (select 工艺计划流水号,工序流水号 from dbo.车间生产管理工艺_零件工序 where dbo.车间生产管理工艺_零件工序.工序顺序 = 1) as n
|
||||||
|
on 车间生产管理_零件工艺计划_视图.工艺计划流水号 = n.工艺计划流水号 inner join
|
||||||
|
(select SUM(ISNULL(已领数量,0)) as 数量,工序流水号 from 车间生产管理工艺_零件工序_任务分配 group by 工序流水号) as m on n.工序流水号 = m.工序流水号 left join
|
||||||
|
|
||||||
|
(select sum(报废数量) as 报废数量,工艺计划流水号 from 车间生产管理工艺_零件工艺计划_报废零件记录 group by 工艺计划流水号) as P on 车间生产管理_零件工艺计划_视图.工艺计划流水号 = P.工艺计划流水号 where 车间生产管理_零件工艺计划_视图.是否提交 < 5 and 车间生产管理_零件工艺计划_视图.考核状态 < 3
|
||||||
|
group by 物料流水号)
|
||||||
|
as D on 仓储管理_累计库存查询_视图.物料流水号 = D.物料流水号
|
||||||
|
left join
|
||||||
|
(select sum(isnull(采购数,0)-isnull(到货数,0)) as 采购中,物料流水号 from 采购管理_采购合同明细_全部_查询视图 where 是否滑台 <> 1 and 是否滑台 <> 2 and 已删 = 0 and 采购状态 <> ''已到'' and 采购状态 <> ''已入库''
|
||||||
|
GROUP BY 物料流水号)
|
||||||
|
as T on 仓储管理_累计库存查询_视图.物料流水号 = T.物料流水号
|
||||||
|
left join
|
||||||
|
(select isnull(sum(isnull(累计库存,0)),0) as 毛坯库存,库存管理_物料主文件_基本.代号,库存管理_物料主文件_基本.名称 from 库存管理_物料主文件_基本
|
||||||
|
left join 库存管理_外购件累计库存 on 库存管理_物料主文件_基本.物料流水号 = 库存管理_外购件累计库存.物料流水号 where 库存管理_物料主文件_基本.是否禁用 = 0 group by 库存管理_物料主文件_基本.代号,库存管理_物料主文件_基本.名称) as C on 仓储管理_累计库存查询_视图.图号或型号 + ''MP'' = C.代号 AND 仓储管理_累计库存查询_视图.物料名称 + ''MP'' = C.名称
|
||||||
|
left join
|
||||||
|
(SELECT dbo.库存管理_物料主文件_基本.名称, dbo.库存管理_物料主文件_基本.代号, isnull(SUM(dbo.采购管理_采购合同明细.数量 - dbo.采购管理_采购合同明细.已到货数量),0) AS 补货毛坯
|
||||||
|
FROM dbo.采购管理_采购合同明细 INNER JOIN
|
||||||
|
dbo.PDM_零件明细表_标准件和外购件 ON dbo.采购管理_采购合同明细.标准件和外购件流水号 = dbo.PDM_零件明细表_标准件和外购件.标准件和外购件流水号 INNER JOIN
|
||||||
|
dbo.库存管理_物料主文件_基本 ON dbo.PDM_零件明细表_标准件和外购件.物料流水号 = dbo.库存管理_物料主文件_基本.物料流水号
|
||||||
|
GROUP BY dbo.库存管理_物料主文件_基本.名称, dbo.库存管理_物料主文件_基本.代号) as E on 仓储管理_累计库存查询_视图.图号或型号 + ''MP'' = E.代号 AND 仓储管理_累计库存查询_视图.物料名称 + ''MP'' = E.名称 '
|
||||||
|
|
||||||
|
set @selectStrWhere = 'where 1 = 1 '
|
||||||
|
|
||||||
|
--2024-04-29改动备注:isnull(SUM(数量 - 车间生产管理_零件工艺计划_视图.入库数量 - P.报废数量),0) as 加工中
|
||||||
|
--isnull(SUM(数量) - SUM(车间生产管理_零件工艺计划_视图.入库数量) - SUM(P.报废数量),0) as 加工中
|
||||||
|
if(@物料名称_check = 1)
|
||||||
|
set @selectStrWhere = @selectStrWhere+' and isnull(物料名称,'''') like + ''%'' + @物料名称 + ''%'' '
|
||||||
|
if(@物料编码_check = 1)
|
||||||
|
set @selectStrWhere = @selectStrWhere+' and isnull(物料编码,'''') like + ''%'' + @物料编码 + ''%'' '
|
||||||
|
if(@图号_check = 1)
|
||||||
|
set @selectStrWhere = @selectStrWhere+' and isnull(图号或型号,'''') like + ''%'' + @图号 + ''%'' '
|
||||||
|
if(@类型_check = 1)
|
||||||
|
set @selectStrWhere = @selectStrWhere+' and 类型 = @类型 '
|
||||||
|
if(@库位_check = 1)
|
||||||
|
set @selectStrWhere = @selectStrWhere+' and isnull(货位名称,'''') like + ''%'' + @库位 + ''%'' '
|
||||||
|
|
||||||
|
|
||||||
|
if @排序名称 = 1
|
||||||
|
begin
|
||||||
|
if @排序方式 = 1
|
||||||
|
begin
|
||||||
|
set @selectStr = @selectStr+@selectStrWhere+'order by 物料编码 DESC'
|
||||||
|
end
|
||||||
|
else
|
||||||
|
begin
|
||||||
|
set @selectStr = @selectStr+@selectStrWhere+'order by 物料编码 ASC'
|
||||||
|
end
|
||||||
|
end
|
||||||
|
else if @排序名称 = 2
|
||||||
|
begin
|
||||||
|
if @排序方式 = 1
|
||||||
|
begin
|
||||||
|
set @selectStr = @selectStr+@selectStrWhere+'order by 物料名称 DESC'
|
||||||
|
end
|
||||||
|
else
|
||||||
|
begin
|
||||||
|
set @selectStr = @selectStr+@selectStrWhere+'order by 物料名称 ASC'
|
||||||
|
end
|
||||||
|
end
|
||||||
|
else if @排序名称 = 3
|
||||||
|
begin
|
||||||
|
if @排序方式 = 1
|
||||||
|
begin
|
||||||
|
set @selectStr = @selectStr+@selectStrWhere+'order by 货位名称 DESC'
|
||||||
|
end
|
||||||
|
else
|
||||||
|
begin
|
||||||
|
set @selectStr = @selectStr+@selectStrWhere+'order by 货位名称 ASC'
|
||||||
|
end
|
||||||
|
end
|
||||||
|
else if @排序名称 = 4
|
||||||
|
begin
|
||||||
|
if @排序方式 = 1
|
||||||
|
begin
|
||||||
|
set @selectStr = @selectStr+@selectStrWhere+'order by 库存 DESC'
|
||||||
|
end
|
||||||
|
else
|
||||||
|
begin
|
||||||
|
set @selectStr = @selectStr+@selectStrWhere+'order by 库存 ASC'
|
||||||
|
end
|
||||||
|
end
|
||||||
|
else if @排序名称 = 5
|
||||||
|
begin
|
||||||
|
if @排序方式 = 1
|
||||||
|
begin
|
||||||
|
set @selectStr = @selectStr+@selectStrWhere+'order by 最低库存 DESC'
|
||||||
|
end
|
||||||
|
else
|
||||||
|
begin
|
||||||
|
set @selectStr = @selectStr+@selectStrWhere+'order by 最低库存 ASC'
|
||||||
|
end
|
||||||
|
end
|
||||||
|
else
|
||||||
|
begin
|
||||||
|
set @selectStr = @selectStr+@selectStrWhere
|
||||||
|
end
|
||||||
|
print @selectStr
|
||||||
|
EXEC sp_executesql @selectStr,N'@物料名称 nvarchar(50),@物料编码 nvarchar(50), @图号 nvarchar(50),@类型 nvarchar(50),@库位 nvarchar(50)',
|
||||||
|
@物料名称,@物料编码,@图号,@类型,@库位
|
||||||
|
GO
|
||||||
354
sql/工序工价_字段公式_正式库_20260804.sql
Normal file
@@ -0,0 +1,354 @@
|
|||||||
|
USE [ERPTOOL_JY]
|
||||||
|
GO
|
||||||
|
|
||||||
|
SET ANSI_NULLS ON
|
||||||
|
GO
|
||||||
|
|
||||||
|
SET QUOTED_IDENTIFIER ON
|
||||||
|
GO
|
||||||
|
|
||||||
|
-- 补齐正式库截图中的工价计算字段;修改人:Ld 修改时间:2026-08-04 09:49:39;
|
||||||
|
IF OBJECT_ID(N'[dbo].[车间生产管理工艺_工序工价]', N'U') IS NOT NULL AND COL_LENGTH(N'[dbo].[车间生产管理工艺_工序工价]', N'工作时间(时)') IS NULL
|
||||||
|
ALTER TABLE [dbo].[车间生产管理工艺_工序工价] ADD [工作时间(时)] DECIMAL(18, 4) NOT NULL CONSTRAINT [DF_车间生产管理工艺_工序工价_工作时间时] DEFAULT ((0));
|
||||||
|
GO
|
||||||
|
|
||||||
|
IF OBJECT_ID(N'[dbo].[车间生产管理工艺_工序工价]', N'U') IS NOT NULL AND COL_LENGTH(N'[dbo].[车间生产管理工艺_工序工价]', N'宽放时间(时)') IS NULL
|
||||||
|
ALTER TABLE [dbo].[车间生产管理工艺_工序工价] ADD [宽放时间(时)] DECIMAL(18, 4) NOT NULL CONSTRAINT [DF_车间生产管理工艺_工序工价_宽放时间时] DEFAULT ((0));
|
||||||
|
GO
|
||||||
|
|
||||||
|
IF OBJECT_ID(N'[dbo].[车间生产管理工艺_工序工价]', N'U') IS NOT NULL AND COL_LENGTH(N'[dbo].[车间生产管理工艺_工序工价]', N'日工资(元)') IS NULL
|
||||||
|
ALTER TABLE [dbo].[车间生产管理工艺_工序工价] ADD [日工资(元)] DECIMAL(18, 4) NOT NULL CONSTRAINT [DF_车间生产管理工艺_工序工价_日工资元] DEFAULT ((0));
|
||||||
|
GO
|
||||||
|
|
||||||
|
IF OBJECT_ID(N'[dbo].[车间生产管理工艺_工序工价]', N'U') IS NOT NULL AND COL_LENGTH(N'[dbo].[车间生产管理工艺_工序工价]', N'标准产能(件/天)') IS NULL
|
||||||
|
ALTER TABLE [dbo].[车间生产管理工艺_工序工价] ADD [标准产能(件/天)] DECIMAL(18, 4) NOT NULL CONSTRAINT [DF_车间生产管理工艺_工序工价_标准产能件天] DEFAULT ((0));
|
||||||
|
GO
|
||||||
|
|
||||||
|
IF OBJECT_ID(N'[dbo].[车间生产管理工艺_工序工价]', N'U') IS NOT NULL AND COL_LENGTH(N'[dbo].[车间生产管理工艺_工序工价]', N'工价定额') IS NULL
|
||||||
|
ALTER TABLE [dbo].[车间生产管理工艺_工序工价] ADD [工价定额] DECIMAL(18, 4) NOT NULL CONSTRAINT [DF_车间生产管理工艺_工序工价_工价定额] DEFAULT ((0));
|
||||||
|
GO
|
||||||
|
|
||||||
|
-- 保护正式库旧数据:按已有日产能和最终单价反推新公式输入字段;修改人:Ld 修改时间:2026-08-04 09:49:39;
|
||||||
|
IF OBJECT_ID(N'[dbo].[车间生产管理工艺_工序工价]', N'U') IS NOT NULL
|
||||||
|
BEGIN
|
||||||
|
UPDATE price
|
||||||
|
SET [总时间s] = ISNULL([机动时间s], 0) + ISNULL([辅助时间s], 0),
|
||||||
|
[标准产能(件/天)] = ISNULL([日产能(件)], 0),
|
||||||
|
[工价定额] = ISNULL([最终单价(元/件)], 0),
|
||||||
|
[工作时间(时)] = CASE
|
||||||
|
WHEN ISNULL([工作时间(时)], 0) <> 0 THEN [工作时间(时)]
|
||||||
|
WHEN ISNULL([日产能(件)], 0) <> 0 AND ISNULL([机动时间s], 0) + ISNULL([辅助时间s], 0) <> 0
|
||||||
|
THEN ISNULL([日产能(件)], 0) * (ISNULL([机动时间s], 0) + ISNULL([辅助时间s], 0)) / 3600
|
||||||
|
ELSE 0
|
||||||
|
END,
|
||||||
|
[日工资(元)] = CASE
|
||||||
|
WHEN ISNULL([日工资(元)], 0) <> 0 THEN [日工资(元)]
|
||||||
|
WHEN ISNULL([最终单价(元/件)], 0) <> 0 AND ISNULL([日产能(件)], 0) <> 0
|
||||||
|
THEN ISNULL([最终单价(元/件)], 0) * ISNULL([日产能(件)], 0)
|
||||||
|
ELSE 0
|
||||||
|
END
|
||||||
|
FROM [dbo].[车间生产管理工艺_工序工价] price;
|
||||||
|
END
|
||||||
|
GO
|
||||||
|
|
||||||
|
-- 用完整字段公式触发器替代之前仅计算总时间的触发器;修改人:Ld 修改时间:2026-08-04 09:49:39;
|
||||||
|
IF OBJECT_ID(N'[dbo].[TR_车间生产管理工艺_工序工价_总时间自动计算]', N'TR') IS NOT NULL
|
||||||
|
DROP TRIGGER [dbo].[TR_车间生产管理工艺_工序工价_总时间自动计算];
|
||||||
|
GO
|
||||||
|
|
||||||
|
IF OBJECT_ID(N'[dbo].[TR_车间生产管理工艺_工序工价_字段公式计算]', N'TR') IS NOT NULL
|
||||||
|
DROP TRIGGER [dbo].[TR_车间生产管理工艺_工序工价_字段公式计算];
|
||||||
|
GO
|
||||||
|
|
||||||
|
CREATE TRIGGER [dbo].[TR_车间生产管理工艺_工序工价_字段公式计算]
|
||||||
|
ON [dbo].[车间生产管理工艺_工序工价]
|
||||||
|
AFTER INSERT, UPDATE
|
||||||
|
AS
|
||||||
|
BEGIN
|
||||||
|
SET NOCOUNT ON;
|
||||||
|
|
||||||
|
IF TRIGGER_NESTLEVEL() > 1
|
||||||
|
RETURN;
|
||||||
|
|
||||||
|
;WITH FormulaSource AS (
|
||||||
|
SELECT
|
||||||
|
price.工价流水号,
|
||||||
|
ISNULL(price.[机动时间s], 0) AS 机动时间s,
|
||||||
|
ISNULL(price.[辅助时间s], 0) AS 辅助时间s,
|
||||||
|
ISNULL(price.[机动时间s], 0) + ISNULL(price.[辅助时间s], 0) AS 总时间s,
|
||||||
|
-- 修改人:Ld 修改时间:2026-08-04 09:49:39; 前端编辑过程仍通过旧字段提交,优先按日产能反推工作时间。
|
||||||
|
CASE
|
||||||
|
WHEN ISNULL(price.[日产能(件)], 0) <> 0 AND ISNULL(price.[机动时间s], 0) + ISNULL(price.[辅助时间s], 0) <> 0
|
||||||
|
THEN ISNULL(price.[日产能(件)], 0) * (ISNULL(price.[机动时间s], 0) + ISNULL(price.[辅助时间s], 0)) / 3600
|
||||||
|
ELSE 0
|
||||||
|
END AS 工作时间时,
|
||||||
|
ISNULL(price.[宽放时间(时)], 0) AS 宽放时间时,
|
||||||
|
-- 修改人:Ld 修改时间:2026-08-04 09:49:39; 前端编辑过程仍通过旧字段提交,优先按工价定额和标准产能反推日工资。
|
||||||
|
CASE
|
||||||
|
WHEN ISNULL(price.[最终单价(元/件)], 0) <> 0 AND ISNULL(price.[日产能(件)], 0) <> 0
|
||||||
|
THEN ISNULL(price.[最终单价(元/件)], 0) * ISNULL(price.[日产能(件)], 0)
|
||||||
|
ELSE 0
|
||||||
|
END AS 日工资元
|
||||||
|
FROM [dbo].[车间生产管理工艺_工序工价] price
|
||||||
|
INNER JOIN inserted i ON price.工价流水号 = i.工价流水号
|
||||||
|
),
|
||||||
|
FormulaResult AS (
|
||||||
|
SELECT
|
||||||
|
工价流水号,
|
||||||
|
总时间s,
|
||||||
|
工作时间时,
|
||||||
|
宽放时间时,
|
||||||
|
日工资元,
|
||||||
|
CASE WHEN 总时间s <> 0 THEN 工作时间时 * 3600 / 总时间s ELSE 0 END AS 标准产能件天
|
||||||
|
FROM FormulaSource
|
||||||
|
)
|
||||||
|
UPDATE price
|
||||||
|
SET price.[总时间s] = calc.总时间s,
|
||||||
|
price.[工作时间(时)] = calc.工作时间时,
|
||||||
|
price.[宽放时间(时)] = calc.宽放时间时,
|
||||||
|
price.[日工资(元)] = calc.日工资元,
|
||||||
|
price.[标准产能(件/天)] = calc.标准产能件天,
|
||||||
|
price.[工价定额] = CASE WHEN calc.标准产能件天 <> 0 THEN calc.日工资元 / calc.标准产能件天 ELSE 0 END,
|
||||||
|
-- 修改人:Ld 修改时间:2026-08-04 09:49:39; 旧字段继续同步,兼容现有页面和历史接口。
|
||||||
|
price.[日产能(件)] = calc.标准产能件天,
|
||||||
|
price.[最终单价(元/件)] = CASE WHEN calc.标准产能件天 <> 0 THEN calc.日工资元 / calc.标准产能件天 ELSE 0 END,
|
||||||
|
price.单件工价 = CASE WHEN calc.标准产能件天 <> 0 THEN calc.日工资元 / calc.标准产能件天 ELSE 0 END
|
||||||
|
FROM [dbo].[车间生产管理工艺_工序工价] price
|
||||||
|
INNER JOIN FormulaResult calc ON price.工价流水号 = calc.工价流水号;
|
||||||
|
END
|
||||||
|
GO
|
||||||
|
|
||||||
|
-- 触发一次计算,确保正式库现有数据按公式同步;修改人:Ld 修改时间:2026-08-04 09:49:39;
|
||||||
|
IF OBJECT_ID(N'[dbo].[车间生产管理工艺_工序工价]', N'U') IS NOT NULL
|
||||||
|
BEGIN
|
||||||
|
UPDATE [dbo].[车间生产管理工艺_工序工价]
|
||||||
|
SET [机动时间s] = [机动时间s];
|
||||||
|
END
|
||||||
|
GO
|
||||||
|
|
||||||
|
-- 工序工价分页查询增加截图字段,并保留旧字段兼容前端;修改人:Ld 修改时间:2026-08-04 09:49:39;
|
||||||
|
ALTER PROCEDURE [dbo].[车间生产管理工艺_工序工价_查询数据]
|
||||||
|
@订单流水号_check INT = 0,
|
||||||
|
@订单流水号 INT = NULL,
|
||||||
|
@组件流水号_check INT = 0,
|
||||||
|
@组件流水号 INT = NULL,
|
||||||
|
@工艺计划流水号_check INT = 0,
|
||||||
|
@工艺计划流水号 INT = NULL,
|
||||||
|
@工艺名称_check INT = 0,
|
||||||
|
@工艺名称 NVARCHAR(100) = N'',
|
||||||
|
@工序名称_check INT = 0,
|
||||||
|
@工序名称 NVARCHAR(100) = N'',
|
||||||
|
@零件名称_check INT = 0,
|
||||||
|
@零件名称 NVARCHAR(100) = N'',
|
||||||
|
@图号_check INT = 0,
|
||||||
|
@图号 NVARCHAR(100) = N'',
|
||||||
|
@是否启用_check INT = 0,
|
||||||
|
@是否启用 NVARCHAR(20) = N'',
|
||||||
|
@PageCurrent INT = 1,
|
||||||
|
@PageSize INT = 1000
|
||||||
|
AS
|
||||||
|
BEGIN
|
||||||
|
SET NOCOUNT ON;
|
||||||
|
|
||||||
|
IF @PageCurrent IS NULL OR @PageCurrent < 1 SET @PageCurrent = 1;
|
||||||
|
IF @PageSize IS NULL OR @PageSize < 1 SET @PageSize = 1000;
|
||||||
|
|
||||||
|
;WITH PlanData AS (
|
||||||
|
-- 与制定工艺组件订单、产品、零件选择保持同一工艺计划来源口径;修改人:Ld 修改时间:2026-08-04 09:49:39;
|
||||||
|
SELECT gp.*
|
||||||
|
FROM [dbo].[车间生产管理_零件工艺计划_视图] gp
|
||||||
|
WHERE gp.考核状态 >= 1
|
||||||
|
AND (@订单流水号_check = 0 OR gp.订单流水号 = @订单流水号)
|
||||||
|
AND (@组件流水号_check = 0 OR gp.组件流水号 = @组件流水号)
|
||||||
|
AND (@工艺计划流水号_check = 0 OR gp.工艺计划流水号 = @工艺计划流水号)
|
||||||
|
AND (@零件名称_check = 0 OR gp.零件名称 + gp.零件图号 LIKE N'%' + @零件名称 + N'%')
|
||||||
|
AND (@图号_check = 0 OR gp.零件图号 LIKE N'%' + @图号 + N'%')
|
||||||
|
),
|
||||||
|
ProcessData AS (
|
||||||
|
SELECT
|
||||||
|
ROW_NUMBER() OVER (
|
||||||
|
ORDER BY gp.工艺更新时间 DESC, gp.工艺计划流水号 DESC, gx.工序顺序 ASC, gx.工序流水号 ASC
|
||||||
|
) AS RowNum,
|
||||||
|
price.工价流水号,
|
||||||
|
gx.工序流水号,
|
||||||
|
gx.工艺计划流水号,
|
||||||
|
gp.订单号,
|
||||||
|
gp.产品名称,
|
||||||
|
base.工艺名称 AS 工艺名称,
|
||||||
|
base.工艺名称 AS 工序名称,
|
||||||
|
gp.零件名称,
|
||||||
|
gp.零件图号 AS 图号,
|
||||||
|
gx.工序顺序,
|
||||||
|
gx.定额工时,
|
||||||
|
gx.准结工时,
|
||||||
|
ISNULL(price.[单装数量(件)], 0) AS [单装数量(件)],
|
||||||
|
ISNULL(price.[操作台数], 0) AS [操作台数],
|
||||||
|
ISNULL(price.[机动时间s], 0) AS [机动时间s],
|
||||||
|
ISNULL(price.[辅助时间s], 0) AS [辅助时间s],
|
||||||
|
ISNULL(price.[机动时间s], 0) + ISNULL(price.[辅助时间s], 0) AS [总时间s],
|
||||||
|
ISNULL(price.[工作时间(时)], 0) AS [工作时间(时)],
|
||||||
|
ISNULL(price.[宽放时间(时)], 0) AS [宽放时间(时)],
|
||||||
|
ISNULL(price.[日工资(元)], 0) AS [日工资(元)],
|
||||||
|
ISNULL(price.[标准产能(件/天)], 0) AS [标准产能(件/天)],
|
||||||
|
ISNULL(price.[工价定额], 0) AS 工价定额,
|
||||||
|
ISNULL(price.[标准产能(件/天)], ISNULL(price.[日产能(件)], 0)) AS [日产能(件)],
|
||||||
|
ISNULL(price.[工价定额], ISNULL(price.[最终单价(元/件)], 0)) AS [最终单价(元/件)],
|
||||||
|
CONVERT(VARCHAR(10), price.生效日期, 23) AS 生效日期,
|
||||||
|
ISNULL(price.变更次数, 0) AS 变更次数,
|
||||||
|
ISNULL(price.是否启用, 1) AS 是否启用,
|
||||||
|
price.备注,
|
||||||
|
price.创建人,
|
||||||
|
CONVERT(VARCHAR(19), price.创建时间, 120) AS 创建时间,
|
||||||
|
price.修改人,
|
||||||
|
CONVERT(VARCHAR(19), price.修改时间, 120) AS 修改时间
|
||||||
|
FROM PlanData gp
|
||||||
|
INNER JOIN [dbo].[车间生产管理工艺_零件工序] gx ON gp.工艺计划流水号 = gx.工艺计划流水号
|
||||||
|
LEFT JOIN [dbo].[车间生产管理工艺_基础表_工艺名称] base ON gx.工艺编号 = base.工艺编号
|
||||||
|
LEFT JOIN [dbo].[车间生产管理工艺_工序工价] price ON gx.工序流水号 = price.工序流水号
|
||||||
|
WHERE NULLIF(LTRIM(RTRIM(base.工艺名称)), N'') IS NOT NULL
|
||||||
|
AND (@工艺名称_check = 0 OR base.工艺名称 LIKE N'%' + @工艺名称 + N'%')
|
||||||
|
AND (@工序名称_check = 0 OR base.工艺名称 LIKE N'%' + @工序名称 + N'%')
|
||||||
|
AND (@是否启用_check = 0 OR CAST(ISNULL(price.是否启用, 1) AS NVARCHAR(20)) = @是否启用)
|
||||||
|
)
|
||||||
|
SELECT
|
||||||
|
工价流水号,
|
||||||
|
工序流水号,
|
||||||
|
工艺计划流水号,
|
||||||
|
订单号,
|
||||||
|
产品名称,
|
||||||
|
工艺名称,
|
||||||
|
工序名称,
|
||||||
|
零件名称,
|
||||||
|
图号,
|
||||||
|
工序顺序,
|
||||||
|
定额工时,
|
||||||
|
准结工时,
|
||||||
|
[单装数量(件)],
|
||||||
|
操作台数,
|
||||||
|
[机动时间s],
|
||||||
|
[辅助时间s],
|
||||||
|
[总时间s],
|
||||||
|
[工作时间(时)],
|
||||||
|
[宽放时间(时)],
|
||||||
|
[日工资(元)],
|
||||||
|
[标准产能(件/天)],
|
||||||
|
工价定额,
|
||||||
|
[日产能(件)],
|
||||||
|
[最终单价(元/件)],
|
||||||
|
生效日期,
|
||||||
|
变更次数,
|
||||||
|
是否启用,
|
||||||
|
备注,
|
||||||
|
创建人,
|
||||||
|
创建时间,
|
||||||
|
修改人,
|
||||||
|
修改时间
|
||||||
|
FROM ProcessData
|
||||||
|
WHERE RowNum BETWEEN ((@PageCurrent - 1) * @PageSize + 1) AND (@PageCurrent * @PageSize)
|
||||||
|
ORDER BY RowNum;
|
||||||
|
|
||||||
|
SELECT COUNT(1) AS total
|
||||||
|
FROM [dbo].[车间生产管理_零件工艺计划_视图] gp
|
||||||
|
INNER JOIN [dbo].[车间生产管理工艺_零件工序] gx ON gp.工艺计划流水号 = gx.工艺计划流水号
|
||||||
|
LEFT JOIN [dbo].[车间生产管理工艺_基础表_工艺名称] base ON gx.工艺编号 = base.工艺编号
|
||||||
|
LEFT JOIN [dbo].[车间生产管理工艺_工序工价] price ON gx.工序流水号 = price.工序流水号
|
||||||
|
WHERE gp.考核状态 >= 1
|
||||||
|
AND (@订单流水号_check = 0 OR gp.订单流水号 = @订单流水号)
|
||||||
|
AND (@组件流水号_check = 0 OR gp.组件流水号 = @组件流水号)
|
||||||
|
AND (@工艺计划流水号_check = 0 OR gp.工艺计划流水号 = @工艺计划流水号)
|
||||||
|
AND NULLIF(LTRIM(RTRIM(base.工艺名称)), N'') IS NOT NULL
|
||||||
|
AND (@工艺名称_check = 0 OR base.工艺名称 LIKE N'%' + @工艺名称 + N'%')
|
||||||
|
AND (@工序名称_check = 0 OR base.工艺名称 LIKE N'%' + @工序名称 + N'%')
|
||||||
|
AND (@零件名称_check = 0 OR gp.零件名称 + gp.零件图号 LIKE N'%' + @零件名称 + N'%')
|
||||||
|
AND (@图号_check = 0 OR gp.零件图号 LIKE N'%' + @图号 + N'%')
|
||||||
|
AND (@是否启用_check = 0 OR CAST(ISNULL(price.是否启用, 1) AS NVARCHAR(20)) = @是否启用);
|
||||||
|
END
|
||||||
|
GO
|
||||||
|
|
||||||
|
-- 工序工价导出增加截图字段;修改人:Ld 修改时间:2026-08-04 09:49:39;
|
||||||
|
ALTER PROCEDURE [dbo].[车间生产管理工艺_工序工价_导出表格_查询]
|
||||||
|
@订单流水号_check INT = 0,
|
||||||
|
@订单流水号 INT = NULL,
|
||||||
|
@组件流水号_check INT = 0,
|
||||||
|
@组件流水号 INT = NULL,
|
||||||
|
@工艺计划流水号_check INT = 0,
|
||||||
|
@工艺计划流水号 INT = NULL,
|
||||||
|
@工艺名称_check INT = 0,
|
||||||
|
@工艺名称 NVARCHAR(100) = N'',
|
||||||
|
@工序名称_check INT = 0,
|
||||||
|
@工序名称 NVARCHAR(100) = N'',
|
||||||
|
@零件名称_check INT = 0,
|
||||||
|
@零件名称 NVARCHAR(100) = N'',
|
||||||
|
@图号_check INT = 0,
|
||||||
|
@图号 NVARCHAR(100) = N'',
|
||||||
|
@是否启用_check INT = 0,
|
||||||
|
@是否启用 NVARCHAR(20) = N''
|
||||||
|
AS
|
||||||
|
BEGIN
|
||||||
|
SET NOCOUNT ON;
|
||||||
|
|
||||||
|
SELECT N'工序工价_' + REPLACE(REPLACE(REPLACE(CONVERT(NVARCHAR(19), GETDATE(), 21), ':', ''), '-', ''), ' ', '-') AS tablename, '15' AS tabletype;
|
||||||
|
|
||||||
|
SELECT
|
||||||
|
256 * 20 AS 工价名称,
|
||||||
|
256 * 28 AS 工序内容,
|
||||||
|
256 * 16 AS [单装数量(件)],
|
||||||
|
256 * 18 AS [操作台数(台/人)],
|
||||||
|
256 * 16 AS [机动时间(秒)],
|
||||||
|
256 * 16 AS [辅助时间(秒)],
|
||||||
|
256 * 14 AS [总时间(秒)],
|
||||||
|
256 * 16 AS [工作时间(时)],
|
||||||
|
256 * 16 AS [宽放时间(时)],
|
||||||
|
256 * 14 AS [日工资(元)],
|
||||||
|
256 * 20 AS [标准产能(件/天)],
|
||||||
|
256 * 14 AS 工价定额;
|
||||||
|
|
||||||
|
SELECT
|
||||||
|
0 AS 工价名称,
|
||||||
|
0 AS 工序内容,
|
||||||
|
1 AS [单装数量(件)],
|
||||||
|
1 AS [操作台数(台/人)],
|
||||||
|
1 AS [机动时间(秒)],
|
||||||
|
1 AS [辅助时间(秒)],
|
||||||
|
1 AS [总时间(秒)],
|
||||||
|
1 AS [工作时间(时)],
|
||||||
|
1 AS [宽放时间(时)],
|
||||||
|
1 AS [日工资(元)],
|
||||||
|
1 AS [标准产能(件/天)],
|
||||||
|
1 AS 工价定额;
|
||||||
|
|
||||||
|
;WITH PlanData AS (
|
||||||
|
-- 页面查询同源工艺计划数据源,确保导出与列表一致;修改人:Ld 修改时间:2026-08-04 09:49:39;
|
||||||
|
SELECT gp.*
|
||||||
|
FROM [dbo].[车间生产管理_零件工艺计划_视图] gp
|
||||||
|
WHERE gp.考核状态 >= 1
|
||||||
|
AND (@订单流水号_check = 0 OR gp.订单流水号 = @订单流水号)
|
||||||
|
AND (@组件流水号_check = 0 OR gp.组件流水号 = @组件流水号)
|
||||||
|
AND (@工艺计划流水号_check = 0 OR gp.工艺计划流水号 = @工艺计划流水号)
|
||||||
|
AND (@零件名称_check = 0 OR gp.零件名称 + gp.零件图号 LIKE N'%' + @零件名称 + N'%')
|
||||||
|
AND (@图号_check = 0 OR gp.零件图号 LIKE N'%' + @图号 + N'%')
|
||||||
|
)
|
||||||
|
SELECT
|
||||||
|
base.工艺名称 AS 工价名称,
|
||||||
|
gp.零件名称 + N' ' + gp.零件图号 AS 工序内容,
|
||||||
|
ISNULL(price.[单装数量(件)], 0) AS [单装数量(件)],
|
||||||
|
ISNULL(price.[操作台数], 0) AS [操作台数(台/人)],
|
||||||
|
ISNULL(price.[机动时间s], 0) AS [机动时间(秒)],
|
||||||
|
ISNULL(price.[辅助时间s], 0) AS [辅助时间(秒)],
|
||||||
|
ISNULL(price.[机动时间s], 0) + ISNULL(price.[辅助时间s], 0) AS [总时间(秒)],
|
||||||
|
ISNULL(price.[工作时间(时)], 0) AS [工作时间(时)],
|
||||||
|
ISNULL(price.[宽放时间(时)], 0) AS [宽放时间(时)],
|
||||||
|
ISNULL(price.[日工资(元)], 0) AS [日工资(元)],
|
||||||
|
ISNULL(price.[标准产能(件/天)], 0) AS [标准产能(件/天)],
|
||||||
|
ISNULL(price.[工价定额], 0) AS 工价定额
|
||||||
|
FROM PlanData gp
|
||||||
|
INNER JOIN [dbo].[车间生产管理工艺_零件工序] gx ON gp.工艺计划流水号 = gx.工艺计划流水号
|
||||||
|
LEFT JOIN [dbo].[车间生产管理工艺_基础表_工艺名称] base ON gx.工艺编号 = base.工艺编号
|
||||||
|
LEFT JOIN [dbo].[车间生产管理工艺_工序工价] price ON gx.工序流水号 = price.工序流水号
|
||||||
|
WHERE NULLIF(LTRIM(RTRIM(base.工艺名称)), N'') IS NOT NULL
|
||||||
|
AND (@工艺名称_check = 0 OR base.工艺名称 LIKE N'%' + @工艺名称 + N'%')
|
||||||
|
AND (@工序名称_check = 0 OR base.工艺名称 LIKE N'%' + @工序名称 + N'%')
|
||||||
|
AND (@是否启用_check = 0 OR CAST(ISNULL(price.是否启用, 1) AS NVARCHAR(20)) = @是否启用)
|
||||||
|
ORDER BY gp.工艺更新时间 DESC, gp.工艺计划流水号 DESC, gx.工序顺序 ASC, gx.工序流水号 ASC;
|
||||||
|
END
|
||||||
|
GO
|
||||||
350
sql/工序工价_字段公式_测试库_20260804.sql
Normal file
@@ -0,0 +1,350 @@
|
|||||||
|
USE [ERPTOOL_JY_20250826Back]
|
||||||
|
GO
|
||||||
|
|
||||||
|
SET ANSI_NULLS ON
|
||||||
|
GO
|
||||||
|
|
||||||
|
SET QUOTED_IDENTIFIER ON
|
||||||
|
GO
|
||||||
|
|
||||||
|
-- 补齐截图中的工价计算字段;修改人:Ld 修改时间:2026-08-04 09:27:01;
|
||||||
|
IF OBJECT_ID(N'[dbo].[车间生产管理工艺_工序工价]', N'U') IS NOT NULL AND COL_LENGTH(N'[dbo].[车间生产管理工艺_工序工价]', N'工作时间(时)') IS NULL
|
||||||
|
ALTER TABLE [dbo].[车间生产管理工艺_工序工价] ADD [工作时间(时)] DECIMAL(18, 4) NOT NULL CONSTRAINT [DF_车间生产管理工艺_工序工价_工作时间时] DEFAULT ((0));
|
||||||
|
GO
|
||||||
|
|
||||||
|
IF OBJECT_ID(N'[dbo].[车间生产管理工艺_工序工价]', N'U') IS NOT NULL AND COL_LENGTH(N'[dbo].[车间生产管理工艺_工序工价]', N'宽放时间(时)') IS NULL
|
||||||
|
ALTER TABLE [dbo].[车间生产管理工艺_工序工价] ADD [宽放时间(时)] DECIMAL(18, 4) NOT NULL CONSTRAINT [DF_车间生产管理工艺_工序工价_宽放时间时] DEFAULT ((0));
|
||||||
|
GO
|
||||||
|
|
||||||
|
IF OBJECT_ID(N'[dbo].[车间生产管理工艺_工序工价]', N'U') IS NOT NULL AND COL_LENGTH(N'[dbo].[车间生产管理工艺_工序工价]', N'日工资(元)') IS NULL
|
||||||
|
ALTER TABLE [dbo].[车间生产管理工艺_工序工价] ADD [日工资(元)] DECIMAL(18, 4) NOT NULL CONSTRAINT [DF_车间生产管理工艺_工序工价_日工资元] DEFAULT ((0));
|
||||||
|
GO
|
||||||
|
|
||||||
|
IF OBJECT_ID(N'[dbo].[车间生产管理工艺_工序工价]', N'U') IS NOT NULL AND COL_LENGTH(N'[dbo].[车间生产管理工艺_工序工价]', N'标准产能(件/天)') IS NULL
|
||||||
|
ALTER TABLE [dbo].[车间生产管理工艺_工序工价] ADD [标准产能(件/天)] DECIMAL(18, 4) NOT NULL CONSTRAINT [DF_车间生产管理工艺_工序工价_标准产能件天] DEFAULT ((0));
|
||||||
|
GO
|
||||||
|
|
||||||
|
IF OBJECT_ID(N'[dbo].[车间生产管理工艺_工序工价]', N'U') IS NOT NULL AND COL_LENGTH(N'[dbo].[车间生产管理工艺_工序工价]', N'工价定额') IS NULL
|
||||||
|
ALTER TABLE [dbo].[车间生产管理工艺_工序工价] ADD [工价定额] DECIMAL(18, 4) NOT NULL CONSTRAINT [DF_车间生产管理工艺_工序工价_工价定额] DEFAULT ((0));
|
||||||
|
GO
|
||||||
|
|
||||||
|
-- 保护旧数据:按已有日产能和最终单价反推新公式输入字段;修改人:Ld 修改时间:2026-08-04 09:27:01;
|
||||||
|
IF OBJECT_ID(N'[dbo].[车间生产管理工艺_工序工价]', N'U') IS NOT NULL
|
||||||
|
BEGIN
|
||||||
|
UPDATE price
|
||||||
|
SET [总时间s] = ISNULL([机动时间s], 0) + ISNULL([辅助时间s], 0),
|
||||||
|
[标准产能(件/天)] = ISNULL([日产能(件)], 0),
|
||||||
|
[工价定额] = ISNULL([最终单价(元/件)], 0),
|
||||||
|
[工作时间(时)] = CASE
|
||||||
|
WHEN ISNULL([工作时间(时)], 0) <> 0 THEN [工作时间(时)]
|
||||||
|
WHEN ISNULL([日产能(件)], 0) <> 0 AND ISNULL([机动时间s], 0) + ISNULL([辅助时间s], 0) <> 0
|
||||||
|
THEN ISNULL([日产能(件)], 0) * (ISNULL([机动时间s], 0) + ISNULL([辅助时间s], 0)) / 3600
|
||||||
|
ELSE 0
|
||||||
|
END,
|
||||||
|
[日工资(元)] = CASE
|
||||||
|
WHEN ISNULL([日工资(元)], 0) <> 0 THEN [日工资(元)]
|
||||||
|
WHEN ISNULL([最终单价(元/件)], 0) <> 0 AND ISNULL([日产能(件)], 0) <> 0
|
||||||
|
THEN ISNULL([最终单价(元/件)], 0) * ISNULL([日产能(件)], 0)
|
||||||
|
ELSE 0
|
||||||
|
END
|
||||||
|
FROM [dbo].[车间生产管理工艺_工序工价] price;
|
||||||
|
END
|
||||||
|
GO
|
||||||
|
|
||||||
|
-- 工序工价字段公式触发器:E=C+D,I=F*3600/E,J=H/I;修改人:Ld 修改时间:2026-08-04 09:27:01;
|
||||||
|
IF OBJECT_ID(N'[dbo].[TR_车间生产管理工艺_工序工价_字段公式计算]', N'TR') IS NOT NULL
|
||||||
|
DROP TRIGGER [dbo].[TR_车间生产管理工艺_工序工价_字段公式计算];
|
||||||
|
GO
|
||||||
|
|
||||||
|
CREATE TRIGGER [dbo].[TR_车间生产管理工艺_工序工价_字段公式计算]
|
||||||
|
ON [dbo].[车间生产管理工艺_工序工价]
|
||||||
|
AFTER INSERT, UPDATE
|
||||||
|
AS
|
||||||
|
BEGIN
|
||||||
|
SET NOCOUNT ON;
|
||||||
|
|
||||||
|
IF TRIGGER_NESTLEVEL() > 1
|
||||||
|
RETURN;
|
||||||
|
|
||||||
|
;WITH FormulaSource AS (
|
||||||
|
SELECT
|
||||||
|
price.工价流水号,
|
||||||
|
ISNULL(price.[机动时间s], 0) AS 机动时间s,
|
||||||
|
ISNULL(price.[辅助时间s], 0) AS 辅助时间s,
|
||||||
|
ISNULL(price.[机动时间s], 0) + ISNULL(price.[辅助时间s], 0) AS 总时间s,
|
||||||
|
-- 修改人:Ld 修改时间:2026-08-04 09:39:18; 前端编辑过程仍通过旧字段提交,优先按日产能反推工作时间。
|
||||||
|
CASE
|
||||||
|
WHEN ISNULL(price.[日产能(件)], 0) <> 0 AND ISNULL(price.[机动时间s], 0) + ISNULL(price.[辅助时间s], 0) <> 0
|
||||||
|
THEN ISNULL(price.[日产能(件)], 0) * (ISNULL(price.[机动时间s], 0) + ISNULL(price.[辅助时间s], 0)) / 3600
|
||||||
|
ELSE 0
|
||||||
|
END AS 工作时间时,
|
||||||
|
ISNULL(price.[宽放时间(时)], 0) AS 宽放时间时,
|
||||||
|
-- 修改人:Ld 修改时间:2026-08-04 09:39:18; 前端编辑过程仍通过旧字段提交,优先按工价定额和标准产能反推日工资。
|
||||||
|
CASE
|
||||||
|
WHEN ISNULL(price.[最终单价(元/件)], 0) <> 0 AND ISNULL(price.[日产能(件)], 0) <> 0
|
||||||
|
THEN ISNULL(price.[最终单价(元/件)], 0) * ISNULL(price.[日产能(件)], 0)
|
||||||
|
ELSE 0
|
||||||
|
END AS 日工资元
|
||||||
|
FROM [dbo].[车间生产管理工艺_工序工价] price
|
||||||
|
INNER JOIN inserted i ON price.工价流水号 = i.工价流水号
|
||||||
|
),
|
||||||
|
FormulaResult AS (
|
||||||
|
SELECT
|
||||||
|
工价流水号,
|
||||||
|
总时间s,
|
||||||
|
工作时间时,
|
||||||
|
宽放时间时,
|
||||||
|
日工资元,
|
||||||
|
CASE WHEN 总时间s <> 0 THEN 工作时间时 * 3600 / 总时间s ELSE 0 END AS 标准产能件天
|
||||||
|
FROM FormulaSource
|
||||||
|
)
|
||||||
|
UPDATE price
|
||||||
|
SET price.[总时间s] = calc.总时间s,
|
||||||
|
price.[工作时间(时)] = calc.工作时间时,
|
||||||
|
price.[宽放时间(时)] = calc.宽放时间时,
|
||||||
|
price.[日工资(元)] = calc.日工资元,
|
||||||
|
price.[标准产能(件/天)] = calc.标准产能件天,
|
||||||
|
price.[工价定额] = CASE WHEN calc.标准产能件天 <> 0 THEN calc.日工资元 / calc.标准产能件天 ELSE 0 END,
|
||||||
|
-- 修改人:Ld 修改时间:2026-08-04 09:27:01; 旧字段继续同步,兼容现有页面和历史接口。
|
||||||
|
price.[日产能(件)] = calc.标准产能件天,
|
||||||
|
price.[最终单价(元/件)] = CASE WHEN calc.标准产能件天 <> 0 THEN calc.日工资元 / calc.标准产能件天 ELSE 0 END,
|
||||||
|
price.单件工价 = CASE WHEN calc.标准产能件天 <> 0 THEN calc.日工资元 / calc.标准产能件天 ELSE 0 END
|
||||||
|
FROM [dbo].[车间生产管理工艺_工序工价] price
|
||||||
|
INNER JOIN FormulaResult calc ON price.工价流水号 = calc.工价流水号;
|
||||||
|
END
|
||||||
|
GO
|
||||||
|
|
||||||
|
-- 触发一次计算,确保测试库现有数据按公式同步;修改人:Ld 修改时间:2026-08-04 09:27:01;
|
||||||
|
IF OBJECT_ID(N'[dbo].[车间生产管理工艺_工序工价]', N'U') IS NOT NULL
|
||||||
|
BEGIN
|
||||||
|
UPDATE [dbo].[车间生产管理工艺_工序工价]
|
||||||
|
SET [机动时间s] = [机动时间s];
|
||||||
|
END
|
||||||
|
GO
|
||||||
|
|
||||||
|
-- 工序工价分页查询增加截图字段,并保留旧字段兼容前端;修改人:Ld 修改时间:2026-08-04 09:27:01;
|
||||||
|
ALTER PROCEDURE [dbo].[车间生产管理工艺_工序工价_查询数据]
|
||||||
|
@订单流水号_check INT = 0,
|
||||||
|
@订单流水号 INT = NULL,
|
||||||
|
@组件流水号_check INT = 0,
|
||||||
|
@组件流水号 INT = NULL,
|
||||||
|
@工艺计划流水号_check INT = 0,
|
||||||
|
@工艺计划流水号 INT = NULL,
|
||||||
|
@工艺名称_check INT = 0,
|
||||||
|
@工艺名称 NVARCHAR(100) = N'',
|
||||||
|
@工序名称_check INT = 0,
|
||||||
|
@工序名称 NVARCHAR(100) = N'',
|
||||||
|
@零件名称_check INT = 0,
|
||||||
|
@零件名称 NVARCHAR(100) = N'',
|
||||||
|
@图号_check INT = 0,
|
||||||
|
@图号 NVARCHAR(100) = N'',
|
||||||
|
@是否启用_check INT = 0,
|
||||||
|
@是否启用 NVARCHAR(20) = N'',
|
||||||
|
@PageCurrent INT = 1,
|
||||||
|
@PageSize INT = 1000
|
||||||
|
AS
|
||||||
|
BEGIN
|
||||||
|
SET NOCOUNT ON;
|
||||||
|
|
||||||
|
IF @PageCurrent IS NULL OR @PageCurrent < 1 SET @PageCurrent = 1;
|
||||||
|
IF @PageSize IS NULL OR @PageSize < 1 SET @PageSize = 1000;
|
||||||
|
|
||||||
|
;WITH PlanData AS (
|
||||||
|
-- 与制定工艺组件订单、产品、零件选择保持同一工艺计划来源口径;修改人:Ld 修改时间:2026-08-04 09:27:01;
|
||||||
|
SELECT gp.*
|
||||||
|
FROM [dbo].[车间生产管理_零件工艺计划_视图] gp
|
||||||
|
WHERE gp.考核状态 >= 1
|
||||||
|
AND (@订单流水号_check = 0 OR gp.订单流水号 = @订单流水号)
|
||||||
|
AND (@组件流水号_check = 0 OR gp.组件流水号 = @组件流水号)
|
||||||
|
AND (@工艺计划流水号_check = 0 OR gp.工艺计划流水号 = @工艺计划流水号)
|
||||||
|
AND (@零件名称_check = 0 OR gp.零件名称 + gp.零件图号 LIKE N'%' + @零件名称 + N'%')
|
||||||
|
AND (@图号_check = 0 OR gp.零件图号 LIKE N'%' + @图号 + N'%')
|
||||||
|
),
|
||||||
|
ProcessData AS (
|
||||||
|
SELECT
|
||||||
|
ROW_NUMBER() OVER (
|
||||||
|
ORDER BY gp.工艺更新时间 DESC, gp.工艺计划流水号 DESC, gx.工序顺序 ASC, gx.工序流水号 ASC
|
||||||
|
) AS RowNum,
|
||||||
|
price.工价流水号,
|
||||||
|
gx.工序流水号,
|
||||||
|
gx.工艺计划流水号,
|
||||||
|
gp.订单号,
|
||||||
|
gp.产品名称,
|
||||||
|
base.工艺名称 AS 工艺名称,
|
||||||
|
base.工艺名称 AS 工序名称,
|
||||||
|
gp.零件名称,
|
||||||
|
gp.零件图号 AS 图号,
|
||||||
|
gx.工序顺序,
|
||||||
|
gx.定额工时,
|
||||||
|
gx.准结工时,
|
||||||
|
ISNULL(price.[单装数量(件)], 0) AS [单装数量(件)],
|
||||||
|
ISNULL(price.[操作台数], 0) AS [操作台数],
|
||||||
|
ISNULL(price.[机动时间s], 0) AS [机动时间s],
|
||||||
|
ISNULL(price.[辅助时间s], 0) AS [辅助时间s],
|
||||||
|
ISNULL(price.[机动时间s], 0) + ISNULL(price.[辅助时间s], 0) AS [总时间s],
|
||||||
|
ISNULL(price.[工作时间(时)], 0) AS [工作时间(时)],
|
||||||
|
ISNULL(price.[宽放时间(时)], 0) AS [宽放时间(时)],
|
||||||
|
ISNULL(price.[日工资(元)], 0) AS [日工资(元)],
|
||||||
|
ISNULL(price.[标准产能(件/天)], 0) AS [标准产能(件/天)],
|
||||||
|
ISNULL(price.[工价定额], 0) AS 工价定额,
|
||||||
|
ISNULL(price.[标准产能(件/天)], ISNULL(price.[日产能(件)], 0)) AS [日产能(件)],
|
||||||
|
ISNULL(price.[工价定额], ISNULL(price.[最终单价(元/件)], 0)) AS [最终单价(元/件)],
|
||||||
|
CONVERT(VARCHAR(10), price.生效日期, 23) AS 生效日期,
|
||||||
|
ISNULL(price.变更次数, 0) AS 变更次数,
|
||||||
|
ISNULL(price.是否启用, 1) AS 是否启用,
|
||||||
|
price.备注,
|
||||||
|
price.创建人,
|
||||||
|
CONVERT(VARCHAR(19), price.创建时间, 120) AS 创建时间,
|
||||||
|
price.修改人,
|
||||||
|
CONVERT(VARCHAR(19), price.修改时间, 120) AS 修改时间
|
||||||
|
FROM PlanData gp
|
||||||
|
INNER JOIN [dbo].[车间生产管理工艺_零件工序] gx ON gp.工艺计划流水号 = gx.工艺计划流水号
|
||||||
|
LEFT JOIN [dbo].[车间生产管理工艺_基础表_工艺名称] base ON gx.工艺编号 = base.工艺编号
|
||||||
|
LEFT JOIN [dbo].[车间生产管理工艺_工序工价] price ON gx.工序流水号 = price.工序流水号
|
||||||
|
WHERE NULLIF(LTRIM(RTRIM(base.工艺名称)), N'') IS NOT NULL
|
||||||
|
AND (@工艺名称_check = 0 OR base.工艺名称 LIKE N'%' + @工艺名称 + N'%')
|
||||||
|
AND (@工序名称_check = 0 OR base.工艺名称 LIKE N'%' + @工序名称 + N'%')
|
||||||
|
AND (@是否启用_check = 0 OR CAST(ISNULL(price.是否启用, 1) AS NVARCHAR(20)) = @是否启用)
|
||||||
|
)
|
||||||
|
SELECT
|
||||||
|
工价流水号,
|
||||||
|
工序流水号,
|
||||||
|
工艺计划流水号,
|
||||||
|
订单号,
|
||||||
|
产品名称,
|
||||||
|
工艺名称,
|
||||||
|
工序名称,
|
||||||
|
零件名称,
|
||||||
|
图号,
|
||||||
|
工序顺序,
|
||||||
|
定额工时,
|
||||||
|
准结工时,
|
||||||
|
[单装数量(件)],
|
||||||
|
操作台数,
|
||||||
|
[机动时间s],
|
||||||
|
[辅助时间s],
|
||||||
|
[总时间s],
|
||||||
|
[工作时间(时)],
|
||||||
|
[宽放时间(时)],
|
||||||
|
[日工资(元)],
|
||||||
|
[标准产能(件/天)],
|
||||||
|
工价定额,
|
||||||
|
[日产能(件)],
|
||||||
|
[最终单价(元/件)],
|
||||||
|
生效日期,
|
||||||
|
变更次数,
|
||||||
|
是否启用,
|
||||||
|
备注,
|
||||||
|
创建人,
|
||||||
|
创建时间,
|
||||||
|
修改人,
|
||||||
|
修改时间
|
||||||
|
FROM ProcessData
|
||||||
|
WHERE RowNum BETWEEN ((@PageCurrent - 1) * @PageSize + 1) AND (@PageCurrent * @PageSize)
|
||||||
|
ORDER BY RowNum;
|
||||||
|
|
||||||
|
SELECT COUNT(1) AS total
|
||||||
|
FROM [dbo].[车间生产管理_零件工艺计划_视图] gp
|
||||||
|
INNER JOIN [dbo].[车间生产管理工艺_零件工序] gx ON gp.工艺计划流水号 = gx.工艺计划流水号
|
||||||
|
LEFT JOIN [dbo].[车间生产管理工艺_基础表_工艺名称] base ON gx.工艺编号 = base.工艺编号
|
||||||
|
LEFT JOIN [dbo].[车间生产管理工艺_工序工价] price ON gx.工序流水号 = price.工序流水号
|
||||||
|
WHERE gp.考核状态 >= 1
|
||||||
|
AND (@订单流水号_check = 0 OR gp.订单流水号 = @订单流水号)
|
||||||
|
AND (@组件流水号_check = 0 OR gp.组件流水号 = @组件流水号)
|
||||||
|
AND (@工艺计划流水号_check = 0 OR gp.工艺计划流水号 = @工艺计划流水号)
|
||||||
|
AND NULLIF(LTRIM(RTRIM(base.工艺名称)), N'') IS NOT NULL
|
||||||
|
AND (@工艺名称_check = 0 OR base.工艺名称 LIKE N'%' + @工艺名称 + N'%')
|
||||||
|
AND (@工序名称_check = 0 OR base.工艺名称 LIKE N'%' + @工序名称 + N'%')
|
||||||
|
AND (@零件名称_check = 0 OR gp.零件名称 + gp.零件图号 LIKE N'%' + @零件名称 + N'%')
|
||||||
|
AND (@图号_check = 0 OR gp.零件图号 LIKE N'%' + @图号 + N'%')
|
||||||
|
AND (@是否启用_check = 0 OR CAST(ISNULL(price.是否启用, 1) AS NVARCHAR(20)) = @是否启用);
|
||||||
|
END
|
||||||
|
GO
|
||||||
|
|
||||||
|
-- 工序工价导出增加截图字段;修改人:Ld 修改时间:2026-08-04 09:27:01;
|
||||||
|
ALTER PROCEDURE [dbo].[车间生产管理工艺_工序工价_导出表格_查询]
|
||||||
|
@订单流水号_check INT = 0,
|
||||||
|
@订单流水号 INT = NULL,
|
||||||
|
@组件流水号_check INT = 0,
|
||||||
|
@组件流水号 INT = NULL,
|
||||||
|
@工艺计划流水号_check INT = 0,
|
||||||
|
@工艺计划流水号 INT = NULL,
|
||||||
|
@工艺名称_check INT = 0,
|
||||||
|
@工艺名称 NVARCHAR(100) = N'',
|
||||||
|
@工序名称_check INT = 0,
|
||||||
|
@工序名称 NVARCHAR(100) = N'',
|
||||||
|
@零件名称_check INT = 0,
|
||||||
|
@零件名称 NVARCHAR(100) = N'',
|
||||||
|
@图号_check INT = 0,
|
||||||
|
@图号 NVARCHAR(100) = N'',
|
||||||
|
@是否启用_check INT = 0,
|
||||||
|
@是否启用 NVARCHAR(20) = N''
|
||||||
|
AS
|
||||||
|
BEGIN
|
||||||
|
SET NOCOUNT ON;
|
||||||
|
|
||||||
|
SELECT N'工序工价_' + REPLACE(REPLACE(REPLACE(CONVERT(NVARCHAR(19), GETDATE(), 21), ':', ''), '-', ''), ' ', '-') AS tablename, '15' AS tabletype;
|
||||||
|
|
||||||
|
SELECT
|
||||||
|
256 * 20 AS 工价名称,
|
||||||
|
256 * 28 AS 工序内容,
|
||||||
|
256 * 16 AS [单装数量(件)],
|
||||||
|
256 * 18 AS [操作台数(台/人)],
|
||||||
|
256 * 16 AS [机动时间(秒)],
|
||||||
|
256 * 16 AS [辅助时间(秒)],
|
||||||
|
256 * 14 AS [总时间(秒)],
|
||||||
|
256 * 16 AS [工作时间(时)],
|
||||||
|
256 * 16 AS [宽放时间(时)],
|
||||||
|
256 * 14 AS [日工资(元)],
|
||||||
|
256 * 20 AS [标准产能(件/天)],
|
||||||
|
256 * 14 AS 工价定额;
|
||||||
|
|
||||||
|
SELECT
|
||||||
|
0 AS 工价名称,
|
||||||
|
0 AS 工序内容,
|
||||||
|
1 AS [单装数量(件)],
|
||||||
|
1 AS [操作台数(台/人)],
|
||||||
|
1 AS [机动时间(秒)],
|
||||||
|
1 AS [辅助时间(秒)],
|
||||||
|
1 AS [总时间(秒)],
|
||||||
|
1 AS [工作时间(时)],
|
||||||
|
1 AS [宽放时间(时)],
|
||||||
|
1 AS [日工资(元)],
|
||||||
|
1 AS [标准产能(件/天)],
|
||||||
|
1 AS 工价定额;
|
||||||
|
|
||||||
|
;WITH PlanData AS (
|
||||||
|
-- 页面查询同源工艺计划数据源,确保导出与列表一致;修改人:Ld 修改时间:2026-08-04 09:27:01;
|
||||||
|
SELECT gp.*
|
||||||
|
FROM [dbo].[车间生产管理_零件工艺计划_视图] gp
|
||||||
|
WHERE gp.考核状态 >= 1
|
||||||
|
AND (@订单流水号_check = 0 OR gp.订单流水号 = @订单流水号)
|
||||||
|
AND (@组件流水号_check = 0 OR gp.组件流水号 = @组件流水号)
|
||||||
|
AND (@工艺计划流水号_check = 0 OR gp.工艺计划流水号 = @工艺计划流水号)
|
||||||
|
AND (@零件名称_check = 0 OR gp.零件名称 + gp.零件图号 LIKE N'%' + @零件名称 + N'%')
|
||||||
|
AND (@图号_check = 0 OR gp.零件图号 LIKE N'%' + @图号 + N'%')
|
||||||
|
)
|
||||||
|
SELECT
|
||||||
|
base.工艺名称 AS 工价名称,
|
||||||
|
gp.零件名称 + N' ' + gp.零件图号 AS 工序内容,
|
||||||
|
ISNULL(price.[单装数量(件)], 0) AS [单装数量(件)],
|
||||||
|
ISNULL(price.[操作台数], 0) AS [操作台数(台/人)],
|
||||||
|
ISNULL(price.[机动时间s], 0) AS [机动时间(秒)],
|
||||||
|
ISNULL(price.[辅助时间s], 0) AS [辅助时间(秒)],
|
||||||
|
ISNULL(price.[机动时间s], 0) + ISNULL(price.[辅助时间s], 0) AS [总时间(秒)],
|
||||||
|
ISNULL(price.[工作时间(时)], 0) AS [工作时间(时)],
|
||||||
|
ISNULL(price.[宽放时间(时)], 0) AS [宽放时间(时)],
|
||||||
|
ISNULL(price.[日工资(元)], 0) AS [日工资(元)],
|
||||||
|
ISNULL(price.[标准产能(件/天)], 0) AS [标准产能(件/天)],
|
||||||
|
ISNULL(price.[工价定额], 0) AS 工价定额
|
||||||
|
FROM PlanData gp
|
||||||
|
INNER JOIN [dbo].[车间生产管理工艺_零件工序] gx ON gp.工艺计划流水号 = gx.工艺计划流水号
|
||||||
|
LEFT JOIN [dbo].[车间生产管理工艺_基础表_工艺名称] base ON gx.工艺编号 = base.工艺编号
|
||||||
|
LEFT JOIN [dbo].[车间生产管理工艺_工序工价] price ON gx.工序流水号 = price.工序流水号
|
||||||
|
WHERE NULLIF(LTRIM(RTRIM(base.工艺名称)), N'') IS NOT NULL
|
||||||
|
AND (@工艺名称_check = 0 OR base.工艺名称 LIKE N'%' + @工艺名称 + N'%')
|
||||||
|
AND (@工序名称_check = 0 OR base.工艺名称 LIKE N'%' + @工序名称 + N'%')
|
||||||
|
AND (@是否启用_check = 0 OR CAST(ISNULL(price.是否启用, 1) AS NVARCHAR(20)) = @是否启用)
|
||||||
|
ORDER BY gp.工艺更新时间 DESC, gp.工艺计划流水号 DESC, gx.工序顺序 ASC, gx.工序流水号 ASC;
|
||||||
|
END
|
||||||
|
GO
|
||||||
@@ -79,6 +79,14 @@ AND NOT EXISTS (
|
|||||||
WHERE name = N'UX_车间生产管理工艺_工序工价_工序流水号'
|
WHERE name = N'UX_车间生产管理工艺_工序工价_工序流水号'
|
||||||
AND object_id = OBJECT_ID(N'[dbo].[车间生产管理工艺_工序工价]')
|
AND object_id = OBJECT_ID(N'[dbo].[车间生产管理工艺_工序工价]')
|
||||||
)
|
)
|
||||||
|
-- 修改人:Ld 修改时间:2026-07-31 10:53:08; 测试库存在历史重复工序流水号时跳过唯一索引创建,避免阻断存储过程部署
|
||||||
|
AND NOT EXISTS (
|
||||||
|
SELECT 1
|
||||||
|
FROM [dbo].[车间生产管理工艺_工序工价]
|
||||||
|
WHERE 工序流水号 IS NOT NULL
|
||||||
|
GROUP BY 工序流水号
|
||||||
|
HAVING COUNT(1) > 1
|
||||||
|
)
|
||||||
BEGIN
|
BEGIN
|
||||||
CREATE UNIQUE NONCLUSTERED INDEX [UX_车间生产管理工艺_工序工价_工序流水号]
|
CREATE UNIQUE NONCLUSTERED INDEX [UX_车间生产管理工艺_工序工价_工序流水号]
|
||||||
ON [dbo].[车间生产管理工艺_工序工价]([工序流水号])
|
ON [dbo].[车间生产管理工艺_工序工价]([工序流水号])
|
||||||
@@ -86,7 +94,7 @@ BEGIN
|
|||||||
END
|
END
|
||||||
GO
|
GO
|
||||||
|
|
||||||
-- 工序工价历史表,仅记录最终单价前后数据;修改人:Ld 修改时间:2026-07-06 09:27:09;
|
-- 工序工价历史表,记录设置弹窗完整字段变更前后数据;修改人:Ld 修改时间:2026-07-31 10:53:08;
|
||||||
IF OBJECT_ID(N'[dbo].[车间生产管理工艺_工序工价历史记录]', N'U') IS NULL
|
IF OBJECT_ID(N'[dbo].[车间生产管理工艺_工序工价历史记录]', N'U') IS NULL
|
||||||
BEGIN
|
BEGIN
|
||||||
CREATE TABLE [dbo].[车间生产管理工艺_工序工价历史记录](
|
CREATE TABLE [dbo].[车间生产管理工艺_工序工价历史记录](
|
||||||
@@ -108,8 +116,39 @@ BEGIN
|
|||||||
END
|
END
|
||||||
GO
|
GO
|
||||||
|
|
||||||
-- 清理旧历史中的多字段内容,历史弹窗只保留最终单价数据;修改人:Ld 修改时间:2026-07-06 09:27:09;
|
IF OBJECT_ID(N'[dbo].[车间生产管理工艺_工序工价_历史快照]', N'FN') IS NOT NULL
|
||||||
IF OBJECT_ID(N'[dbo].[车间生产管理工艺_工序工价历史记录]', N'U') IS NOT NULL
|
DROP FUNCTION [dbo].[车间生产管理工艺_工序工价_历史快照];
|
||||||
|
GO
|
||||||
|
|
||||||
|
-- 设置弹窗完整字段历史快照;修改人:Ld 修改时间:2026-07-31 10:53:08;
|
||||||
|
CREATE FUNCTION [dbo].[车间生产管理工艺_工序工价_历史快照](
|
||||||
|
@机动时间s DECIMAL(18, 4),
|
||||||
|
@辅助时间s DECIMAL(18, 4),
|
||||||
|
@总时间s DECIMAL(18, 4),
|
||||||
|
@单装数量件 DECIMAL(18, 4),
|
||||||
|
@操作台数 DECIMAL(18, 4),
|
||||||
|
@日产能件 DECIMAL(18, 4),
|
||||||
|
@最终单价元件 DECIMAL(18, 4),
|
||||||
|
@生效日期 DATE,
|
||||||
|
@变更次数 INT
|
||||||
|
)
|
||||||
|
RETURNS NVARCHAR(MAX)
|
||||||
|
AS
|
||||||
|
BEGIN
|
||||||
|
RETURN N'机动时间s=' + CONVERT(NVARCHAR(50), ISNULL(@机动时间s, 0))
|
||||||
|
+ N';辅助时间s=' + CONVERT(NVARCHAR(50), ISNULL(@辅助时间s, 0))
|
||||||
|
+ N';总时间s=' + CONVERT(NVARCHAR(50), ISNULL(@总时间s, 0))
|
||||||
|
+ N';单装数量(件)=' + CONVERT(NVARCHAR(50), ISNULL(@单装数量件, 0))
|
||||||
|
+ N';操作台数=' + CONVERT(NVARCHAR(50), ISNULL(@操作台数, 0))
|
||||||
|
+ N';日产能(件)=' + CONVERT(NVARCHAR(50), ISNULL(@日产能件, 0))
|
||||||
|
+ N';最终单价(元/件)=' + CONVERT(NVARCHAR(50), ISNULL(@最终单价元件, 0))
|
||||||
|
+ N';生效日期=' + ISNULL(CONVERT(NVARCHAR(10), @生效日期, 120), N'')
|
||||||
|
+ N';变更次数=' + CONVERT(NVARCHAR(50), ISNULL(@变更次数, 0));
|
||||||
|
END
|
||||||
|
GO
|
||||||
|
|
||||||
|
-- 旧历史不再压缩字段,保留后续完整字段快照;修改人:Ld 修改时间:2026-07-31 10:53:08;
|
||||||
|
IF 1 = 0 AND OBJECT_ID(N'[dbo].[车间生产管理工艺_工序工价历史记录]', N'U') IS NOT NULL
|
||||||
BEGIN
|
BEGIN
|
||||||
UPDATE [dbo].[车间生产管理工艺_工序工价历史记录]
|
UPDATE [dbo].[车间生产管理工艺_工序工价历史记录]
|
||||||
SET 变更前 = CASE
|
SET 变更前 = CASE
|
||||||
@@ -461,8 +500,18 @@ BEGIN
|
|||||||
BEGIN
|
BEGIN
|
||||||
SELECT
|
SELECT
|
||||||
@Old工序流水号 = 工序流水号,
|
@Old工序流水号 = 工序流水号,
|
||||||
-- 修改人:Ld 修改时间:2026-07-06 09:27:09; 历史数据只存储最终单价
|
-- 修改人:Ld 修改时间:2026-07-31 10:53:08; 历史记录保留设置弹窗全部字段
|
||||||
@旧数据 = N'最终单价(元/件)=' + CONVERT(NVARCHAR(50), ISNULL([最终单价(元/件)], 0))
|
@旧数据 = [dbo].[车间生产管理工艺_工序工价_历史快照](
|
||||||
|
[机动时间s],
|
||||||
|
[辅助时间s],
|
||||||
|
[总时间s],
|
||||||
|
[单装数量(件)],
|
||||||
|
[操作台数],
|
||||||
|
[日产能(件)],
|
||||||
|
[最终单价(元/件)],
|
||||||
|
生效日期,
|
||||||
|
变更次数
|
||||||
|
)
|
||||||
FROM [dbo].[车间生产管理工艺_工序工价]
|
FROM [dbo].[车间生产管理工艺_工序工价]
|
||||||
WHERE 工价流水号 = @Id;
|
WHERE 工价流水号 = @Id;
|
||||||
|
|
||||||
@@ -545,8 +594,18 @@ BEGIN
|
|||||||
SET @旧数据 = N'';
|
SET @旧数据 = N'';
|
||||||
END;
|
END;
|
||||||
|
|
||||||
-- 修改人:Ld 修改时间:2026-07-06 09:27:09; 历史数据只存储最终单价
|
-- 修改人:Ld 修改时间:2026-07-31 10:53:08; 历史记录保留设置弹窗全部字段
|
||||||
SET @新数据 = N'最终单价(元/件)=' + CONVERT(NVARCHAR(50), @Safe最终单价元件);
|
SET @新数据 = [dbo].[车间生产管理工艺_工序工价_历史快照](
|
||||||
|
@Safe机动时间s,
|
||||||
|
@Safe辅助时间s,
|
||||||
|
@Safe总时间s,
|
||||||
|
@Safe单装数量件,
|
||||||
|
@Safe操作台数,
|
||||||
|
@Safe日产能件,
|
||||||
|
@Safe最终单价元件,
|
||||||
|
@Safe生效日期,
|
||||||
|
@Safe变更次数
|
||||||
|
);
|
||||||
|
|
||||||
INSERT INTO [dbo].[车间生产管理工艺_工序工价历史记录](
|
INSERT INTO [dbo].[车间生产管理工艺_工序工价历史记录](
|
||||||
工价流水号,
|
工价流水号,
|
||||||
@@ -612,6 +671,15 @@ BEGIN
|
|||||||
DECLARE @零件名称 NVARCHAR(100);
|
DECLARE @零件名称 NVARCHAR(100);
|
||||||
DECLARE @图号 NVARCHAR(100);
|
DECLARE @图号 NVARCHAR(100);
|
||||||
DECLARE @变更后 NVARCHAR(MAX);
|
DECLARE @变更后 NVARCHAR(MAX);
|
||||||
|
DECLARE @机动时间s DECIMAL(18, 4);
|
||||||
|
DECLARE @辅助时间s DECIMAL(18, 4);
|
||||||
|
DECLARE @总时间s DECIMAL(18, 4);
|
||||||
|
DECLARE @单装数量件 DECIMAL(18, 4);
|
||||||
|
DECLARE @操作台数 DECIMAL(18, 4);
|
||||||
|
DECLARE @日产能件 DECIMAL(18, 4);
|
||||||
|
DECLARE @最终单价元件 DECIMAL(18, 4);
|
||||||
|
DECLARE @生效日期 DATE;
|
||||||
|
DECLARE @变更次数 INT;
|
||||||
|
|
||||||
SET @Id = CASE WHEN ISNUMERIC(NULLIF(@工价流水号, N'')) = 1 THEN CONVERT(INT, @工价流水号) ELSE NULL END;
|
SET @Id = CASE WHEN ISNUMERIC(NULLIF(@工价流水号, N'')) = 1 THEN CONVERT(INT, @工价流水号) ELSE NULL END;
|
||||||
|
|
||||||
@@ -640,8 +708,27 @@ BEGIN
|
|||||||
@工序名称 = 工序名称,
|
@工序名称 = 工序名称,
|
||||||
@零件名称 = 零件名称,
|
@零件名称 = 零件名称,
|
||||||
@图号 = 图号,
|
@图号 = 图号,
|
||||||
-- 修改人:Ld 修改时间:2026-07-06 09:27:09; 停用历史只记录最终单价
|
@机动时间s = [机动时间s],
|
||||||
@旧数据 = N'最终单价(元/件)=' + CONVERT(NVARCHAR(50), ISNULL([最终单价(元/件)], 0))
|
@辅助时间s = [辅助时间s],
|
||||||
|
@总时间s = [总时间s],
|
||||||
|
@单装数量件 = [单装数量(件)],
|
||||||
|
@操作台数 = [操作台数],
|
||||||
|
@日产能件 = [日产能(件)],
|
||||||
|
@最终单价元件 = [最终单价(元/件)],
|
||||||
|
@生效日期 = 生效日期,
|
||||||
|
@变更次数 = 变更次数,
|
||||||
|
-- 修改人:Ld 修改时间:2026-07-31 10:53:08; 停用历史记录设置弹窗全部字段
|
||||||
|
@旧数据 = [dbo].[车间生产管理工艺_工序工价_历史快照](
|
||||||
|
[机动时间s],
|
||||||
|
[辅助时间s],
|
||||||
|
[总时间s],
|
||||||
|
[单装数量(件)],
|
||||||
|
[操作台数],
|
||||||
|
[日产能(件)],
|
||||||
|
[最终单价(元/件)],
|
||||||
|
生效日期,
|
||||||
|
变更次数
|
||||||
|
)
|
||||||
FROM [dbo].[车间生产管理工艺_工序工价]
|
FROM [dbo].[车间生产管理工艺_工序工价]
|
||||||
WHERE 工价流水号 = @Id;
|
WHERE 工价流水号 = @Id;
|
||||||
|
|
||||||
@@ -651,8 +738,18 @@ BEGIN
|
|||||||
修改时间 = @当前时间
|
修改时间 = @当前时间
|
||||||
WHERE 工价流水号 = @Id;
|
WHERE 工价流水号 = @Id;
|
||||||
|
|
||||||
-- 修改人:Ld 修改时间:2026-07-06 09:27:09; 停用历史只记录最终单价
|
-- 修改人:Ld 修改时间:2026-07-31 10:53:08; 停用后历史仍展示设置弹窗字段快照
|
||||||
SET @变更后 = @旧数据;
|
SET @变更后 = [dbo].[车间生产管理工艺_工序工价_历史快照](
|
||||||
|
@机动时间s,
|
||||||
|
@辅助时间s,
|
||||||
|
@总时间s,
|
||||||
|
@单装数量件,
|
||||||
|
@操作台数,
|
||||||
|
@日产能件,
|
||||||
|
@最终单价元件,
|
||||||
|
@生效日期,
|
||||||
|
@变更次数
|
||||||
|
);
|
||||||
|
|
||||||
INSERT INTO [dbo].[车间生产管理工艺_工序工价历史记录](
|
INSERT INTO [dbo].[车间生产管理工艺_工序工价历史记录](
|
||||||
工价流水号,
|
工价流水号,
|
||||||
@@ -947,7 +1044,18 @@ BEGIN
|
|||||||
price.图号,
|
price.图号,
|
||||||
N'拷贝',
|
N'拷贝',
|
||||||
N'源零件图号=' + ISNULL(@源零件图号, N''),
|
N'源零件图号=' + ISNULL(@源零件图号, N''),
|
||||||
N'最终单价(元/件)=' + CONVERT(NVARCHAR(50), price.[最终单价(元/件)]),
|
-- 修改人:Ld 修改时间:2026-07-31 10:53:08; 拷贝历史记录设置弹窗全部字段
|
||||||
|
[dbo].[车间生产管理工艺_工序工价_历史快照](
|
||||||
|
price.[机动时间s],
|
||||||
|
price.[辅助时间s],
|
||||||
|
price.[总时间s],
|
||||||
|
price.[单装数量(件)],
|
||||||
|
price.[操作台数],
|
||||||
|
price.[日产能(件)],
|
||||||
|
price.[最终单价(元/件)],
|
||||||
|
price.生效日期,
|
||||||
|
price.变更次数
|
||||||
|
),
|
||||||
@操作人,
|
@操作人,
|
||||||
@当前时间,
|
@当前时间,
|
||||||
N'工序工价拷贝'
|
N'工序工价拷贝'
|
||||||
|
|||||||
1148
sql/工序工价_存储过程_正式库_20260731.sql
Normal file
170
sql/工序工价_导出与总时间_正式库_20260803.sql
Normal file
@@ -0,0 +1,170 @@
|
|||||||
|
USE [ERPTOOL_JY]
|
||||||
|
GO
|
||||||
|
|
||||||
|
SET ANSI_NULLS ON
|
||||||
|
GO
|
||||||
|
|
||||||
|
SET QUOTED_IDENTIFIER ON
|
||||||
|
GO
|
||||||
|
|
||||||
|
-- 同步正式库历史工序工价总时间,确保总时间等于机动时间加辅助时间;修改人:Ld 修改时间:2026-08-03 15:24:31;
|
||||||
|
IF OBJECT_ID(N'[dbo].[车间生产管理工艺_工序工价]', N'U') IS NOT NULL
|
||||||
|
BEGIN
|
||||||
|
UPDATE [dbo].[车间生产管理工艺_工序工价]
|
||||||
|
SET [总时间s] = ISNULL([机动时间s], 0) + ISNULL([辅助时间s], 0),
|
||||||
|
修改时间 = GETDATE()
|
||||||
|
WHERE ISNULL([总时间s], 0) <> ISNULL([机动时间s], 0) + ISNULL([辅助时间s], 0);
|
||||||
|
END
|
||||||
|
GO
|
||||||
|
|
||||||
|
-- 工序工价总时间数据库兜底,后续新增或修改时自动保持总时间=机动时间+辅助时间;修改人:Ld 修改时间:2026-08-03 15:24:31;
|
||||||
|
IF OBJECT_ID(N'[dbo].[TR_车间生产管理工艺_工序工价_总时间自动计算]', N'TR') IS NOT NULL
|
||||||
|
DROP TRIGGER [dbo].[TR_车间生产管理工艺_工序工价_总时间自动计算];
|
||||||
|
GO
|
||||||
|
|
||||||
|
CREATE TRIGGER [dbo].[TR_车间生产管理工艺_工序工价_总时间自动计算]
|
||||||
|
ON [dbo].[车间生产管理工艺_工序工价]
|
||||||
|
AFTER INSERT, UPDATE
|
||||||
|
AS
|
||||||
|
BEGIN
|
||||||
|
SET NOCOUNT ON;
|
||||||
|
|
||||||
|
IF TRIGGER_NESTLEVEL() > 1
|
||||||
|
RETURN;
|
||||||
|
|
||||||
|
-- 修改人:Ld 修改时间:2026-08-03 15:24:31; 仅修正本次变动行,避免人工或接口传入错误总时间。
|
||||||
|
UPDATE price
|
||||||
|
SET price.[总时间s] = ISNULL(price.[机动时间s], 0) + ISNULL(price.[辅助时间s], 0)
|
||||||
|
FROM [dbo].[车间生产管理工艺_工序工价] price
|
||||||
|
INNER JOIN inserted i ON price.工价流水号 = i.工价流水号
|
||||||
|
WHERE ISNULL(price.[总时间s], 0) <> ISNULL(price.[机动时间s], 0) + ISNULL(price.[辅助时间s], 0);
|
||||||
|
END
|
||||||
|
GO
|
||||||
|
|
||||||
|
-- 工序工价导出,正式库复用页面查询筛选口径并导出全部匹配数据;修改人:Ld 修改时间:2026-08-03 15:24:31;
|
||||||
|
IF OBJECT_ID(N'[dbo].[车间生产管理工艺_工序工价_导出表格_查询]', N'P') IS NOT NULL
|
||||||
|
DROP PROCEDURE [dbo].[车间生产管理工艺_工序工价_导出表格_查询];
|
||||||
|
GO
|
||||||
|
|
||||||
|
CREATE PROCEDURE [dbo].[车间生产管理工艺_工序工价_导出表格_查询]
|
||||||
|
@订单流水号_check INT = 0,
|
||||||
|
@订单流水号 INT = NULL,
|
||||||
|
@组件流水号_check INT = 0,
|
||||||
|
@组件流水号 INT = NULL,
|
||||||
|
@工艺计划流水号_check INT = 0,
|
||||||
|
@工艺计划流水号 INT = NULL,
|
||||||
|
@工艺名称_check INT = 0,
|
||||||
|
@工艺名称 NVARCHAR(100) = N'',
|
||||||
|
@工序名称_check INT = 0,
|
||||||
|
@工序名称 NVARCHAR(100) = N'',
|
||||||
|
@零件名称_check INT = 0,
|
||||||
|
@零件名称 NVARCHAR(100) = N'',
|
||||||
|
@图号_check INT = 0,
|
||||||
|
@图号 NVARCHAR(100) = N'',
|
||||||
|
@是否启用_check INT = 0,
|
||||||
|
@是否启用 NVARCHAR(20) = N''
|
||||||
|
AS
|
||||||
|
BEGIN
|
||||||
|
SET NOCOUNT ON;
|
||||||
|
|
||||||
|
SELECT N'工序工价_' + REPLACE(REPLACE(REPLACE(CONVERT(NVARCHAR(19), GETDATE(), 21), ':', ''), '-', ''), ' ', '-') AS tablename, '15' AS tabletype;
|
||||||
|
|
||||||
|
SELECT
|
||||||
|
256 * 20 AS 订单号,
|
||||||
|
256 * 20 AS 产品名称,
|
||||||
|
256 * 20 AS 工艺名称,
|
||||||
|
256 * 20 AS 工序名称,
|
||||||
|
256 * 24 AS 零件名称,
|
||||||
|
256 * 20 AS 图号,
|
||||||
|
256 * 12 AS 工序顺序,
|
||||||
|
256 * 12 AS 定额工时,
|
||||||
|
256 * 12 AS 准结工时,
|
||||||
|
256 * 12 AS [机动时间s],
|
||||||
|
256 * 12 AS [辅助时间s],
|
||||||
|
256 * 12 AS [总时间s],
|
||||||
|
256 * 16 AS [单装数量(件)],
|
||||||
|
256 * 12 AS 操作台数,
|
||||||
|
256 * 14 AS [日产能(件)],
|
||||||
|
256 * 18 AS [最终单价(元/件)],
|
||||||
|
256 * 14 AS 生效日期,
|
||||||
|
256 * 12 AS 变更次数,
|
||||||
|
256 * 12 AS 启用状态,
|
||||||
|
256 * 24 AS 备注,
|
||||||
|
256 * 14 AS 创建人,
|
||||||
|
256 * 20 AS 创建时间,
|
||||||
|
256 * 14 AS 修改人,
|
||||||
|
256 * 20 AS 修改时间;
|
||||||
|
|
||||||
|
SELECT
|
||||||
|
0 AS 订单号,
|
||||||
|
0 AS 产品名称,
|
||||||
|
0 AS 工艺名称,
|
||||||
|
0 AS 工序名称,
|
||||||
|
0 AS 零件名称,
|
||||||
|
0 AS 图号,
|
||||||
|
1 AS 工序顺序,
|
||||||
|
1 AS 定额工时,
|
||||||
|
1 AS 准结工时,
|
||||||
|
1 AS [机动时间s],
|
||||||
|
1 AS [辅助时间s],
|
||||||
|
1 AS [总时间s],
|
||||||
|
1 AS [单装数量(件)],
|
||||||
|
1 AS 操作台数,
|
||||||
|
1 AS [日产能(件)],
|
||||||
|
1 AS [最终单价(元/件)],
|
||||||
|
0 AS 生效日期,
|
||||||
|
1 AS 变更次数,
|
||||||
|
0 AS 启用状态,
|
||||||
|
0 AS 备注,
|
||||||
|
0 AS 创建人,
|
||||||
|
0 AS 创建时间,
|
||||||
|
0 AS 修改人,
|
||||||
|
0 AS 修改时间;
|
||||||
|
|
||||||
|
;WITH PlanData AS (
|
||||||
|
-- 页面查询同源工艺计划数据源,确保正式库导出与列表一致;修改人:Ld 修改时间:2026-08-03 15:24:31;
|
||||||
|
SELECT gp.*
|
||||||
|
FROM [dbo].[车间生产管理_零件工艺计划_视图] gp
|
||||||
|
WHERE gp.考核状态 >= 1
|
||||||
|
AND (@订单流水号_check = 0 OR gp.订单流水号 = @订单流水号)
|
||||||
|
AND (@组件流水号_check = 0 OR gp.组件流水号 = @组件流水号)
|
||||||
|
AND (@工艺计划流水号_check = 0 OR gp.工艺计划流水号 = @工艺计划流水号)
|
||||||
|
AND (@零件名称_check = 0 OR gp.零件名称 + gp.零件图号 LIKE N'%' + @零件名称 + N'%')
|
||||||
|
AND (@图号_check = 0 OR gp.零件图号 LIKE N'%' + @图号 + N'%')
|
||||||
|
)
|
||||||
|
SELECT
|
||||||
|
gp.订单号,
|
||||||
|
gp.产品名称,
|
||||||
|
base.工艺名称 AS 工艺名称,
|
||||||
|
base.工艺名称 AS 工序名称,
|
||||||
|
gp.零件名称,
|
||||||
|
gp.零件图号 AS 图号,
|
||||||
|
gx.工序顺序,
|
||||||
|
gx.定额工时,
|
||||||
|
gx.准结工时,
|
||||||
|
ISNULL(price.[机动时间s], 0) AS [机动时间s],
|
||||||
|
ISNULL(price.[辅助时间s], 0) AS [辅助时间s],
|
||||||
|
ISNULL(price.[机动时间s], 0) + ISNULL(price.[辅助时间s], 0) AS [总时间s],
|
||||||
|
ISNULL(price.[单装数量(件)], 0) AS [单装数量(件)],
|
||||||
|
ISNULL(price.[操作台数], 0) AS 操作台数,
|
||||||
|
ISNULL(price.[日产能(件)], 0) AS [日产能(件)],
|
||||||
|
ISNULL(price.[最终单价(元/件)], 0) AS [最终单价(元/件)],
|
||||||
|
CONVERT(VARCHAR(10), price.生效日期, 23) AS 生效日期,
|
||||||
|
ISNULL(price.变更次数, 0) AS 变更次数,
|
||||||
|
CASE WHEN ISNULL(price.是否启用, 1) = 1 THEN N'启用' ELSE N'停用' END AS 启用状态,
|
||||||
|
price.备注,
|
||||||
|
price.创建人,
|
||||||
|
CONVERT(VARCHAR(19), price.创建时间, 120) AS 创建时间,
|
||||||
|
price.修改人,
|
||||||
|
CONVERT(VARCHAR(19), price.修改时间, 120) AS 修改时间
|
||||||
|
FROM PlanData gp
|
||||||
|
INNER JOIN [dbo].[车间生产管理工艺_零件工序] gx ON gp.工艺计划流水号 = gx.工艺计划流水号
|
||||||
|
LEFT JOIN [dbo].[车间生产管理工艺_基础表_工艺名称] base ON gx.工艺编号 = base.工艺编号
|
||||||
|
LEFT JOIN [dbo].[车间生产管理工艺_工序工价] price ON gx.工序流水号 = price.工序流水号
|
||||||
|
WHERE NULLIF(LTRIM(RTRIM(base.工艺名称)), N'') IS NOT NULL
|
||||||
|
AND (@工艺名称_check = 0 OR base.工艺名称 LIKE N'%' + @工艺名称 + N'%')
|
||||||
|
AND (@工序名称_check = 0 OR base.工艺名称 LIKE N'%' + @工序名称 + N'%')
|
||||||
|
AND (@是否启用_check = 0 OR CAST(ISNULL(price.是否启用, 1) AS NVARCHAR(20)) = @是否启用)
|
||||||
|
ORDER BY gp.工艺更新时间 DESC, gp.工艺计划流水号 DESC, gx.工序顺序 ASC, gx.工序流水号 ASC;
|
||||||
|
END
|
||||||
|
GO
|
||||||
138
sql/工序工价_导出功能_测试库_20260803.sql
Normal file
@@ -0,0 +1,138 @@
|
|||||||
|
USE [ERPTOOL_JY_20250826Back]
|
||||||
|
GO
|
||||||
|
|
||||||
|
SET ANSI_NULLS ON
|
||||||
|
GO
|
||||||
|
|
||||||
|
SET QUOTED_IDENTIFIER ON
|
||||||
|
GO
|
||||||
|
|
||||||
|
-- 工序工价导出,复用页面查询筛选口径并导出全部匹配数据;修改人:Ld 修改时间:2026-08-03 14:24:48;
|
||||||
|
-- 修改人:Ld 修改时间:2026-08-03 14:40:10; 总时间按机动时间加辅助时间计算,不再直接使用历史存储值。
|
||||||
|
IF OBJECT_ID(N'[dbo].[车间生产管理工艺_工序工价_导出表格_查询]', N'P') IS NOT NULL
|
||||||
|
DROP PROCEDURE [dbo].[车间生产管理工艺_工序工价_导出表格_查询];
|
||||||
|
GO
|
||||||
|
|
||||||
|
-- 工序工价导出存储过程,仅部署测试库 ERPTOOL_JY_20250826Back;修改人:Ld 修改时间:2026-08-03 14:24:48;
|
||||||
|
CREATE PROCEDURE [dbo].[车间生产管理工艺_工序工价_导出表格_查询]
|
||||||
|
@订单流水号_check INT = 0,
|
||||||
|
@订单流水号 INT = NULL,
|
||||||
|
@组件流水号_check INT = 0,
|
||||||
|
@组件流水号 INT = NULL,
|
||||||
|
@工艺计划流水号_check INT = 0,
|
||||||
|
@工艺计划流水号 INT = NULL,
|
||||||
|
@工艺名称_check INT = 0,
|
||||||
|
@工艺名称 NVARCHAR(100) = N'',
|
||||||
|
@工序名称_check INT = 0,
|
||||||
|
@工序名称 NVARCHAR(100) = N'',
|
||||||
|
@零件名称_check INT = 0,
|
||||||
|
@零件名称 NVARCHAR(100) = N'',
|
||||||
|
@图号_check INT = 0,
|
||||||
|
@图号 NVARCHAR(100) = N'',
|
||||||
|
@是否启用_check INT = 0,
|
||||||
|
@是否启用 NVARCHAR(20) = N''
|
||||||
|
AS
|
||||||
|
BEGIN
|
||||||
|
SET NOCOUNT ON;
|
||||||
|
|
||||||
|
SELECT N'工序工价_' + REPLACE(REPLACE(REPLACE(CONVERT(NVARCHAR(19), GETDATE(), 21), ':', ''), '-', ''), ' ', '-') AS tablename, '15' AS tabletype;
|
||||||
|
|
||||||
|
SELECT
|
||||||
|
256 * 20 AS 订单号,
|
||||||
|
256 * 20 AS 产品名称,
|
||||||
|
256 * 20 AS 工艺名称,
|
||||||
|
256 * 20 AS 工序名称,
|
||||||
|
256 * 24 AS 零件名称,
|
||||||
|
256 * 20 AS 图号,
|
||||||
|
256 * 12 AS 工序顺序,
|
||||||
|
256 * 12 AS 定额工时,
|
||||||
|
256 * 12 AS 准结工时,
|
||||||
|
256 * 12 AS [机动时间s],
|
||||||
|
256 * 12 AS [辅助时间s],
|
||||||
|
256 * 12 AS [总时间s],
|
||||||
|
256 * 16 AS [单装数量(件)],
|
||||||
|
256 * 12 AS 操作台数,
|
||||||
|
256 * 14 AS [日产能(件)],
|
||||||
|
256 * 18 AS [最终单价(元/件)],
|
||||||
|
256 * 14 AS 生效日期,
|
||||||
|
256 * 12 AS 变更次数,
|
||||||
|
256 * 12 AS 启用状态,
|
||||||
|
256 * 24 AS 备注,
|
||||||
|
256 * 14 AS 创建人,
|
||||||
|
256 * 20 AS 创建时间,
|
||||||
|
256 * 14 AS 修改人,
|
||||||
|
256 * 20 AS 修改时间;
|
||||||
|
|
||||||
|
SELECT
|
||||||
|
0 AS 订单号,
|
||||||
|
0 AS 产品名称,
|
||||||
|
0 AS 工艺名称,
|
||||||
|
0 AS 工序名称,
|
||||||
|
0 AS 零件名称,
|
||||||
|
0 AS 图号,
|
||||||
|
1 AS 工序顺序,
|
||||||
|
1 AS 定额工时,
|
||||||
|
1 AS 准结工时,
|
||||||
|
1 AS [机动时间s],
|
||||||
|
1 AS [辅助时间s],
|
||||||
|
1 AS [总时间s],
|
||||||
|
1 AS [单装数量(件)],
|
||||||
|
1 AS 操作台数,
|
||||||
|
1 AS [日产能(件)],
|
||||||
|
1 AS [最终单价(元/件)],
|
||||||
|
0 AS 生效日期,
|
||||||
|
1 AS 变更次数,
|
||||||
|
0 AS 启用状态,
|
||||||
|
0 AS 备注,
|
||||||
|
0 AS 创建人,
|
||||||
|
0 AS 创建时间,
|
||||||
|
0 AS 修改人,
|
||||||
|
0 AS 修改时间;
|
||||||
|
|
||||||
|
;WITH PlanData AS (
|
||||||
|
-- 页面查询同源工艺计划数据源,确保导出与列表一致;修改人:Ld 修改时间:2026-08-03 14:24:48;
|
||||||
|
SELECT gp.*
|
||||||
|
FROM [dbo].[车间生产管理_零件工艺计划_视图] gp
|
||||||
|
WHERE gp.考核状态 >= 1
|
||||||
|
AND (@订单流水号_check = 0 OR gp.订单流水号 = @订单流水号)
|
||||||
|
AND (@组件流水号_check = 0 OR gp.组件流水号 = @组件流水号)
|
||||||
|
AND (@工艺计划流水号_check = 0 OR gp.工艺计划流水号 = @工艺计划流水号)
|
||||||
|
AND (@零件名称_check = 0 OR gp.零件名称 + gp.零件图号 LIKE N'%' + @零件名称 + N'%')
|
||||||
|
AND (@图号_check = 0 OR gp.零件图号 LIKE N'%' + @图号 + N'%')
|
||||||
|
)
|
||||||
|
SELECT
|
||||||
|
gp.订单号,
|
||||||
|
gp.产品名称,
|
||||||
|
base.工艺名称 AS 工艺名称,
|
||||||
|
base.工艺名称 AS 工序名称,
|
||||||
|
gp.零件名称,
|
||||||
|
gp.零件图号 AS 图号,
|
||||||
|
gx.工序顺序,
|
||||||
|
gx.定额工时,
|
||||||
|
gx.准结工时,
|
||||||
|
ISNULL(price.[机动时间s], 0) AS [机动时间s],
|
||||||
|
ISNULL(price.[辅助时间s], 0) AS [辅助时间s],
|
||||||
|
ISNULL(price.[机动时间s], 0) + ISNULL(price.[辅助时间s], 0) AS [总时间s],
|
||||||
|
ISNULL(price.[单装数量(件)], 0) AS [单装数量(件)],
|
||||||
|
ISNULL(price.[操作台数], 0) AS 操作台数,
|
||||||
|
ISNULL(price.[日产能(件)], 0) AS [日产能(件)],
|
||||||
|
ISNULL(price.[最终单价(元/件)], 0) AS [最终单价(元/件)],
|
||||||
|
CONVERT(VARCHAR(10), price.生效日期, 23) AS 生效日期,
|
||||||
|
ISNULL(price.变更次数, 0) AS 变更次数,
|
||||||
|
CASE WHEN ISNULL(price.是否启用, 1) = 1 THEN N'启用' ELSE N'停用' END AS 启用状态,
|
||||||
|
price.备注,
|
||||||
|
price.创建人,
|
||||||
|
CONVERT(VARCHAR(19), price.创建时间, 120) AS 创建时间,
|
||||||
|
price.修改人,
|
||||||
|
CONVERT(VARCHAR(19), price.修改时间, 120) AS 修改时间
|
||||||
|
FROM PlanData gp
|
||||||
|
INNER JOIN [dbo].[车间生产管理工艺_零件工序] gx ON gp.工艺计划流水号 = gx.工艺计划流水号
|
||||||
|
LEFT JOIN [dbo].[车间生产管理工艺_基础表_工艺名称] base ON gx.工艺编号 = base.工艺编号
|
||||||
|
LEFT JOIN [dbo].[车间生产管理工艺_工序工价] price ON gx.工序流水号 = price.工序流水号
|
||||||
|
WHERE NULLIF(LTRIM(RTRIM(base.工艺名称)), N'') IS NOT NULL
|
||||||
|
AND (@工艺名称_check = 0 OR base.工艺名称 LIKE N'%' + @工艺名称 + N'%')
|
||||||
|
AND (@工序名称_check = 0 OR base.工艺名称 LIKE N'%' + @工序名称 + N'%')
|
||||||
|
AND (@是否启用_check = 0 OR CAST(ISNULL(price.是否启用, 1) AS NVARCHAR(20)) = @是否启用)
|
||||||
|
ORDER BY gp.工艺更新时间 DESC, gp.工艺计划流水号 DESC, gx.工序顺序 ASC, gx.工序流水号 ASC;
|
||||||
|
END
|
||||||
|
GO
|
||||||
345
sql/工序工价_自动化拷贝_正式库_20260804.sql
Normal file
@@ -0,0 +1,345 @@
|
|||||||
|
USE [ERPTOOL_JY]
|
||||||
|
GO
|
||||||
|
|
||||||
|
SET ANSI_NULLS ON
|
||||||
|
GO
|
||||||
|
|
||||||
|
SET QUOTED_IDENTIFIER ON
|
||||||
|
GO
|
||||||
|
|
||||||
|
-- 工序工价自动补齐,按零件名称和图号检索已有工价,未找到则默认 0;修改人:Ld 修改时间:2026-08-04 16:31:18;
|
||||||
|
IF OBJECT_ID(N'[dbo].[车间生产管理工艺_工序工价_自动补齐数据]', N'P') IS NOT NULL
|
||||||
|
DROP PROCEDURE [dbo].[车间生产管理工艺_工序工价_自动补齐数据];
|
||||||
|
GO
|
||||||
|
|
||||||
|
CREATE PROCEDURE [dbo].[车间生产管理工艺_工序工价_自动补齐数据]
|
||||||
|
@工艺计划流水号 INT = NULL,
|
||||||
|
@修改人 NVARCHAR(50) = N'',
|
||||||
|
@是否返回结果 BIT = 1
|
||||||
|
AS
|
||||||
|
BEGIN
|
||||||
|
SET NOCOUNT ON;
|
||||||
|
|
||||||
|
DECLARE @操作人 NVARCHAR(50) = NULLIF(@修改人, N'');
|
||||||
|
DECLARE @当前时间 DATETIME = GETDATE();
|
||||||
|
|
||||||
|
IF @工艺计划流水号 IS NULL
|
||||||
|
BEGIN
|
||||||
|
IF @是否返回结果 = 1
|
||||||
|
SELECT N'0' AS result, N'工艺计划流水号不能为空' AS message;
|
||||||
|
RETURN;
|
||||||
|
END;
|
||||||
|
|
||||||
|
IF NOT EXISTS (
|
||||||
|
SELECT 1
|
||||||
|
FROM [dbo].[车间生产管理_零件工艺计划_视图]
|
||||||
|
WHERE 工艺计划流水号 = @工艺计划流水号
|
||||||
|
AND 考核状态 >= 1
|
||||||
|
)
|
||||||
|
BEGIN
|
||||||
|
IF @是否返回结果 = 1
|
||||||
|
SELECT N'0' AS result, N'工艺计划不存在或未生效' AS message;
|
||||||
|
RETURN;
|
||||||
|
END;
|
||||||
|
|
||||||
|
;WITH TargetRows AS (
|
||||||
|
SELECT
|
||||||
|
gp.工艺计划流水号,
|
||||||
|
gx.工序流水号,
|
||||||
|
gx.工序顺序,
|
||||||
|
gp.零件名称,
|
||||||
|
gp.零件图号 AS 图号,
|
||||||
|
ISNULL(base.工艺名称, N'未设置工序') AS 工艺名称
|
||||||
|
FROM [dbo].[车间生产管理_零件工艺计划_视图] gp
|
||||||
|
INNER JOIN [dbo].[车间生产管理工艺_零件工序] gx ON gp.工艺计划流水号 = gx.工艺计划流水号
|
||||||
|
LEFT JOIN [dbo].[车间生产管理工艺_基础表_工艺名称] base ON gx.工艺编号 = base.工艺编号
|
||||||
|
WHERE gp.工艺计划流水号 = @工艺计划流水号
|
||||||
|
AND gp.考核状态 >= 1
|
||||||
|
AND NULLIF(LTRIM(RTRIM(base.工艺名称)), N'') IS NOT NULL
|
||||||
|
AND NOT EXISTS (
|
||||||
|
SELECT 1
|
||||||
|
FROM [dbo].[车间生产管理工艺_工序工价] price
|
||||||
|
WHERE price.工序流水号 = gx.工序流水号
|
||||||
|
)
|
||||||
|
)
|
||||||
|
INSERT INTO [dbo].[车间生产管理工艺_工序工价](
|
||||||
|
工序流水号,
|
||||||
|
工艺名称,
|
||||||
|
工序名称,
|
||||||
|
零件名称,
|
||||||
|
图号,
|
||||||
|
[机动时间s],
|
||||||
|
[辅助时间s],
|
||||||
|
[总时间s],
|
||||||
|
[单装数量(件)],
|
||||||
|
[操作台数],
|
||||||
|
[日产能(件)],
|
||||||
|
[最终单价(元/件)],
|
||||||
|
生效日期,
|
||||||
|
变更次数,
|
||||||
|
是否启用,
|
||||||
|
备注,
|
||||||
|
创建人,
|
||||||
|
创建时间,
|
||||||
|
修改人,
|
||||||
|
修改时间,
|
||||||
|
计价方式,
|
||||||
|
单件工价,
|
||||||
|
单时工价,
|
||||||
|
准结工价,
|
||||||
|
难度系数,
|
||||||
|
质量系数,
|
||||||
|
设备系数
|
||||||
|
)
|
||||||
|
SELECT
|
||||||
|
targetRow.工序流水号,
|
||||||
|
targetRow.工艺名称,
|
||||||
|
targetRow.工艺名称,
|
||||||
|
targetRow.零件名称,
|
||||||
|
targetRow.图号,
|
||||||
|
COALESCE(exactPrice.[机动时间s], fallbackPrice.[机动时间s], 0),
|
||||||
|
COALESCE(exactPrice.[辅助时间s], fallbackPrice.[辅助时间s], 0),
|
||||||
|
COALESCE(exactPrice.[总时间s], fallbackPrice.[总时间s], 0),
|
||||||
|
COALESCE(exactPrice.[单装数量(件)], fallbackPrice.[单装数量(件)], 0),
|
||||||
|
COALESCE(exactPrice.[操作台数], fallbackPrice.[操作台数], 0),
|
||||||
|
COALESCE(exactPrice.[日产能(件)], fallbackPrice.[日产能(件)], 0),
|
||||||
|
COALESCE(exactPrice.[最终单价(元/件)], fallbackPrice.[最终单价(元/件)], 0),
|
||||||
|
COALESCE(exactPrice.生效日期, fallbackPrice.生效日期),
|
||||||
|
COALESCE(exactPrice.变更次数, fallbackPrice.变更次数, 0),
|
||||||
|
COALESCE(exactPrice.是否启用, fallbackPrice.是否启用, 1),
|
||||||
|
NULL,
|
||||||
|
@操作人,
|
||||||
|
@当前时间,
|
||||||
|
@操作人,
|
||||||
|
@当前时间,
|
||||||
|
N'按件',
|
||||||
|
COALESCE(exactPrice.[最终单价(元/件)], fallbackPrice.[最终单价(元/件)], 0),
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1
|
||||||
|
FROM TargetRows targetRow
|
||||||
|
OUTER APPLY (
|
||||||
|
-- 修改人:Ld 修改时间:2026-08-04 16:31:18; 优先同零件名称、图号、工序顺序和工艺名称精确匹配
|
||||||
|
SELECT TOP 1
|
||||||
|
price.*
|
||||||
|
FROM [dbo].[车间生产管理_零件工艺计划_视图] sourceGp
|
||||||
|
INNER JOIN [dbo].[车间生产管理工艺_零件工序] sourceGx ON sourceGp.工艺计划流水号 = sourceGx.工艺计划流水号
|
||||||
|
LEFT JOIN [dbo].[车间生产管理工艺_基础表_工艺名称] sourceBase ON sourceGx.工艺编号 = sourceBase.工艺编号
|
||||||
|
INNER JOIN [dbo].[车间生产管理工艺_工序工价] price ON sourceGx.工序流水号 = price.工序流水号
|
||||||
|
WHERE sourceGp.考核状态 >= 1
|
||||||
|
AND sourceGp.工艺计划流水号 <> targetRow.工艺计划流水号
|
||||||
|
AND sourceGp.零件名称 = targetRow.零件名称
|
||||||
|
AND sourceGp.零件图号 = targetRow.图号
|
||||||
|
AND sourceGx.工序顺序 = targetRow.工序顺序
|
||||||
|
AND ISNULL(sourceBase.工艺名称, N'未设置工序') = targetRow.工艺名称
|
||||||
|
ORDER BY sourceGp.工艺更新时间 DESC, sourceGp.工艺计划流水号 DESC, price.修改时间 DESC, price.工价流水号 DESC
|
||||||
|
) exactPrice
|
||||||
|
OUTER APPLY (
|
||||||
|
-- 修改人:Ld 修改时间:2026-08-04 16:31:18; 精确工序未命中时,按零件名称和图号取最近一条已有工价兜底
|
||||||
|
SELECT TOP 1
|
||||||
|
price.*
|
||||||
|
FROM [dbo].[车间生产管理_零件工艺计划_视图] sourceGp
|
||||||
|
INNER JOIN [dbo].[车间生产管理工艺_零件工序] sourceGx ON sourceGp.工艺计划流水号 = sourceGx.工艺计划流水号
|
||||||
|
INNER JOIN [dbo].[车间生产管理工艺_工序工价] price ON sourceGx.工序流水号 = price.工序流水号
|
||||||
|
WHERE exactPrice.工价流水号 IS NULL
|
||||||
|
AND sourceGp.考核状态 >= 1
|
||||||
|
AND sourceGp.工艺计划流水号 <> targetRow.工艺计划流水号
|
||||||
|
AND sourceGp.零件名称 = targetRow.零件名称
|
||||||
|
AND sourceGp.零件图号 = targetRow.图号
|
||||||
|
ORDER BY sourceGp.工艺更新时间 DESC, sourceGp.工艺计划流水号 DESC, price.修改时间 DESC, price.工价流水号 DESC
|
||||||
|
) fallbackPrice;
|
||||||
|
|
||||||
|
IF @是否返回结果 = 1
|
||||||
|
SELECT N'1' AS result, @@ROWCOUNT AS 工价流水数;
|
||||||
|
END
|
||||||
|
GO
|
||||||
|
|
||||||
|
-- 工序工序插入时自动补齐工价,按零件名称和图号直接拷贝已有数据;修改人:Ld 修改时间:2026-08-04 16:31:18;
|
||||||
|
IF OBJECT_ID(N'[dbo].[TR_车间生产管理工艺_零件工序_工价自动补齐]', N'TR') IS NOT NULL
|
||||||
|
DROP TRIGGER [dbo].[TR_车间生产管理工艺_零件工序_工价自动补齐];
|
||||||
|
GO
|
||||||
|
|
||||||
|
CREATE TRIGGER [dbo].[TR_车间生产管理工艺_零件工序_工价自动补齐]
|
||||||
|
ON [dbo].[车间生产管理工艺_零件工序]
|
||||||
|
AFTER INSERT
|
||||||
|
AS
|
||||||
|
BEGIN
|
||||||
|
SET NOCOUNT ON;
|
||||||
|
|
||||||
|
DECLARE @工艺计划流水号 INT;
|
||||||
|
DECLARE 工艺游标 CURSOR LOCAL FAST_FORWARD FOR
|
||||||
|
SELECT DISTINCT i.工艺计划流水号
|
||||||
|
FROM inserted i
|
||||||
|
WHERE i.工艺计划流水号 IS NOT NULL;
|
||||||
|
|
||||||
|
OPEN 工艺游标;
|
||||||
|
FETCH NEXT FROM 工艺游标 INTO @工艺计划流水号;
|
||||||
|
WHILE @@FETCH_STATUS = 0
|
||||||
|
BEGIN
|
||||||
|
EXEC [dbo].[车间生产管理工艺_工序工价_自动补齐数据]
|
||||||
|
@工艺计划流水号 = @工艺计划流水号,
|
||||||
|
@修改人 = N'Ld',
|
||||||
|
@是否返回结果 = 0;
|
||||||
|
FETCH NEXT FROM 工艺游标 INTO @工艺计划流水号;
|
||||||
|
END
|
||||||
|
CLOSE 工艺游标;
|
||||||
|
DEALLOCATE 工艺游标;
|
||||||
|
END
|
||||||
|
GO
|
||||||
|
|
||||||
|
-- 清理历史自动备注,取消自动写入备注后的残留文案;修改人:Ld 修改时间:2026-08-04 16:31:18;
|
||||||
|
UPDATE [dbo].[车间生产管理工艺_工序工价]
|
||||||
|
SET 备注 = NULL
|
||||||
|
WHERE 备注 LIKE N'自动拷贝来源工价流水号:%'
|
||||||
|
OR 备注 LIKE N'自动按零件图号兜底拷贝来源工价流水号:%'
|
||||||
|
OR 备注 = N'自动生成默认工价';
|
||||||
|
GO
|
||||||
|
|
||||||
|
-- 工序工价分页查询增加自动补齐调用,确保打开零件后立即生成缺失工价;修改人:Ld 修改时间:2026-08-04 16:31:18;
|
||||||
|
ALTER PROCEDURE [dbo].[车间生产管理工艺_工序工价_查询数据]
|
||||||
|
@订单流水号_check INT = 0,
|
||||||
|
@订单流水号 INT = NULL,
|
||||||
|
@组件流水号_check INT = 0,
|
||||||
|
@组件流水号 INT = NULL,
|
||||||
|
@工艺计划流水号_check INT = 0,
|
||||||
|
@工艺计划流水号 INT = NULL,
|
||||||
|
@工艺名称_check INT = 0,
|
||||||
|
@工艺名称 NVARCHAR(100) = N'',
|
||||||
|
@工序名称_check INT = 0,
|
||||||
|
@工序名称 NVARCHAR(100) = N'',
|
||||||
|
@零件名称_check INT = 0,
|
||||||
|
@零件名称 NVARCHAR(100) = N'',
|
||||||
|
@图号_check INT = 0,
|
||||||
|
@图号 NVARCHAR(100) = N'',
|
||||||
|
@是否启用_check INT = 0,
|
||||||
|
@是否启用 NVARCHAR(20) = N'',
|
||||||
|
@PageCurrent INT = 1,
|
||||||
|
@PageSize INT = 1000
|
||||||
|
AS
|
||||||
|
BEGIN
|
||||||
|
SET NOCOUNT ON;
|
||||||
|
|
||||||
|
IF @工艺计划流水号_check = 1 AND @工艺计划流水号 IS NOT NULL
|
||||||
|
BEGIN
|
||||||
|
EXEC [dbo].[车间生产管理工艺_工序工价_自动补齐数据]
|
||||||
|
@工艺计划流水号 = @工艺计划流水号,
|
||||||
|
@修改人 = N'Ld',
|
||||||
|
@是否返回结果 = 0;
|
||||||
|
END
|
||||||
|
|
||||||
|
IF @PageCurrent IS NULL OR @PageCurrent < 1 SET @PageCurrent = 1;
|
||||||
|
IF @PageSize IS NULL OR @PageSize < 1 SET @PageSize = 1000;
|
||||||
|
|
||||||
|
;WITH PlanData AS (
|
||||||
|
-- 与制定工艺组件订单、产品、零件选择保持同一工艺计划来源口径;修改人:Ld 修改时间:2026-08-04 16:31:18;
|
||||||
|
SELECT gp.*
|
||||||
|
FROM [dbo].[车间生产管理_零件工艺计划_视图] gp
|
||||||
|
WHERE gp.考核状态 >= 1
|
||||||
|
AND (@订单流水号_check = 0 OR gp.订单流水号 = @订单流水号)
|
||||||
|
AND (@组件流水号_check = 0 OR gp.组件流水号 = @组件流水号)
|
||||||
|
AND (@工艺计划流水号_check = 0 OR gp.工艺计划流水号 = @工艺计划流水号)
|
||||||
|
AND (@零件名称_check = 0 OR gp.零件名称 + gp.零件图号 LIKE N'%' + @零件名称 + N'%')
|
||||||
|
AND (@图号_check = 0 OR gp.零件图号 LIKE N'%' + @图号 + N'%')
|
||||||
|
),
|
||||||
|
ProcessData AS (
|
||||||
|
SELECT
|
||||||
|
ROW_NUMBER() OVER (
|
||||||
|
ORDER BY gp.工艺更新时间 DESC, gp.工艺计划流水号 DESC, gx.工序顺序 ASC, gx.工序流水号 ASC
|
||||||
|
) AS RowNum,
|
||||||
|
price.工价流水号,
|
||||||
|
gx.工序流水号,
|
||||||
|
gx.工艺计划流水号,
|
||||||
|
gp.订单号,
|
||||||
|
gp.产品名称,
|
||||||
|
base.工艺名称 AS 工艺名称,
|
||||||
|
base.工艺名称 AS 工序名称,
|
||||||
|
gp.零件名称,
|
||||||
|
gp.零件图号 AS 图号,
|
||||||
|
gx.工序顺序,
|
||||||
|
gx.定额工时,
|
||||||
|
gx.准结工时,
|
||||||
|
ISNULL(price.[单装数量(件)], 0) AS [单装数量(件)],
|
||||||
|
ISNULL(price.[操作台数], 0) AS [操作台数],
|
||||||
|
ISNULL(price.[机动时间s], 0) AS [机动时间s],
|
||||||
|
ISNULL(price.[辅助时间s], 0) AS [辅助时间s],
|
||||||
|
ISNULL(price.[机动时间s], 0) + ISNULL(price.[辅助时间s], 0) AS [总时间s],
|
||||||
|
ISNULL(price.[工作时间(时)], 0) AS [工作时间(时)],
|
||||||
|
ISNULL(price.[宽放时间(时)], 0) AS [宽放时间(时)],
|
||||||
|
ISNULL(price.[日工资(元)], 0) AS [日工资(元)],
|
||||||
|
ISNULL(price.[标准产能(件/天)], 0) AS [标准产能(件/天)],
|
||||||
|
ISNULL(price.[工价定额], 0) AS 工价定额,
|
||||||
|
ISNULL(price.[标准产能(件/天)], ISNULL(price.[日产能(件)], 0)) AS [日产能(件)],
|
||||||
|
ISNULL(price.[工价定额], ISNULL(price.[最终单价(元/件)], 0)) AS [最终单价(元/件)],
|
||||||
|
CONVERT(VARCHAR(10), price.生效日期, 23) AS 生效日期,
|
||||||
|
ISNULL(price.变更次数, 0) AS 变更次数,
|
||||||
|
ISNULL(price.是否启用, 1) AS 是否启用,
|
||||||
|
price.备注,
|
||||||
|
price.创建人,
|
||||||
|
CONVERT(VARCHAR(19), price.创建时间, 120) AS 创建时间,
|
||||||
|
price.修改人,
|
||||||
|
CONVERT(VARCHAR(19), price.修改时间, 120) AS 修改时间
|
||||||
|
FROM PlanData gp
|
||||||
|
INNER JOIN [dbo].[车间生产管理工艺_零件工序] gx ON gp.工艺计划流水号 = gx.工艺计划流水号
|
||||||
|
LEFT JOIN [dbo].[车间生产管理工艺_基础表_工艺名称] base ON gx.工艺编号 = base.工艺编号
|
||||||
|
LEFT JOIN [dbo].[车间生产管理工艺_工序工价] price ON gx.工序流水号 = price.工序流水号
|
||||||
|
WHERE NULLIF(LTRIM(RTRIM(base.工艺名称)), N'') IS NOT NULL
|
||||||
|
AND (@工艺名称_check = 0 OR base.工艺名称 LIKE N'%' + @工艺名称 + N'%')
|
||||||
|
AND (@工序名称_check = 0 OR base.工艺名称 LIKE N'%' + @工序名称 + N'%')
|
||||||
|
AND (@是否启用_check = 0 OR CAST(ISNULL(price.是否启用, 1) AS NVARCHAR(20)) = @是否启用)
|
||||||
|
)
|
||||||
|
SELECT
|
||||||
|
工价流水号,
|
||||||
|
工序流水号,
|
||||||
|
工艺计划流水号,
|
||||||
|
订单号,
|
||||||
|
产品名称,
|
||||||
|
工艺名称,
|
||||||
|
工序名称,
|
||||||
|
零件名称,
|
||||||
|
图号,
|
||||||
|
工序顺序,
|
||||||
|
定额工时,
|
||||||
|
准结工时,
|
||||||
|
[单装数量(件)],
|
||||||
|
操作台数,
|
||||||
|
[机动时间s],
|
||||||
|
[辅助时间s],
|
||||||
|
[总时间s],
|
||||||
|
[工作时间(时)],
|
||||||
|
[宽放时间(时)],
|
||||||
|
[日工资(元)],
|
||||||
|
[标准产能(件/天)],
|
||||||
|
工价定额,
|
||||||
|
[日产能(件)],
|
||||||
|
[最终单价(元/件)],
|
||||||
|
生效日期,
|
||||||
|
变更次数,
|
||||||
|
是否启用,
|
||||||
|
备注,
|
||||||
|
创建人,
|
||||||
|
创建时间,
|
||||||
|
修改人,
|
||||||
|
修改时间
|
||||||
|
FROM ProcessData
|
||||||
|
WHERE RowNum BETWEEN ((@PageCurrent - 1) * @PageSize + 1) AND (@PageCurrent * @PageSize)
|
||||||
|
ORDER BY RowNum;
|
||||||
|
|
||||||
|
SELECT COUNT(1) AS total
|
||||||
|
FROM [dbo].[车间生产管理_零件工艺计划_视图] gp
|
||||||
|
INNER JOIN [dbo].[车间生产管理工艺_零件工序] gx ON gp.工艺计划流水号 = gx.工艺计划流水号
|
||||||
|
LEFT JOIN [dbo].[车间生产管理工艺_基础表_工艺名称] base ON gx.工艺编号 = base.工艺编号
|
||||||
|
LEFT JOIN [dbo].[车间生产管理工艺_工序工价] price ON gx.工序流水号 = price.工序流水号
|
||||||
|
WHERE gp.考核状态 >= 1
|
||||||
|
AND (@订单流水号_check = 0 OR gp.订单流水号 = @订单流水号)
|
||||||
|
AND (@组件流水号_check = 0 OR gp.组件流水号 = @组件流水号)
|
||||||
|
AND (@工艺计划流水号_check = 0 OR gp.工艺计划流水号 = @工艺计划流水号)
|
||||||
|
AND NULLIF(LTRIM(RTRIM(base.工艺名称)), N'') IS NOT NULL
|
||||||
|
AND (@工艺名称_check = 0 OR base.工艺名称 LIKE N'%' + @工艺名称 + N'%')
|
||||||
|
AND (@工序名称_check = 0 OR base.工艺名称 LIKE N'%' + @工序名称 + N'%')
|
||||||
|
AND (@零件名称_check = 0 OR gp.零件名称 + gp.零件图号 LIKE N'%' + @零件名称 + N'%')
|
||||||
|
AND (@图号_check = 0 OR gp.零件图号 LIKE N'%' + @图号 + N'%')
|
||||||
|
AND (@是否启用_check = 0 OR CAST(ISNULL(price.是否启用, 1) AS NVARCHAR(20)) = @是否启用);
|
||||||
|
END
|
||||||
|
GO
|
||||||
345
sql/工序工价_自动化拷贝_测试库_20260804.sql
Normal file
@@ -0,0 +1,345 @@
|
|||||||
|
USE [ERPTOOL_JY_20250826Back]
|
||||||
|
GO
|
||||||
|
|
||||||
|
SET ANSI_NULLS ON
|
||||||
|
GO
|
||||||
|
|
||||||
|
SET QUOTED_IDENTIFIER ON
|
||||||
|
GO
|
||||||
|
|
||||||
|
-- 工序工价自动补齐,按零件名称和图号检索已有工价,未找到则默认 0;修改人:Ld 修改时间:2026-08-04 16:31:18;
|
||||||
|
IF OBJECT_ID(N'[dbo].[车间生产管理工艺_工序工价_自动补齐数据]', N'P') IS NOT NULL
|
||||||
|
DROP PROCEDURE [dbo].[车间生产管理工艺_工序工价_自动补齐数据];
|
||||||
|
GO
|
||||||
|
|
||||||
|
CREATE PROCEDURE [dbo].[车间生产管理工艺_工序工价_自动补齐数据]
|
||||||
|
@工艺计划流水号 INT = NULL,
|
||||||
|
@修改人 NVARCHAR(50) = N'',
|
||||||
|
@是否返回结果 BIT = 1
|
||||||
|
AS
|
||||||
|
BEGIN
|
||||||
|
SET NOCOUNT ON;
|
||||||
|
|
||||||
|
DECLARE @操作人 NVARCHAR(50) = NULLIF(@修改人, N'');
|
||||||
|
DECLARE @当前时间 DATETIME = GETDATE();
|
||||||
|
|
||||||
|
IF @工艺计划流水号 IS NULL
|
||||||
|
BEGIN
|
||||||
|
IF @是否返回结果 = 1
|
||||||
|
SELECT N'0' AS result, N'工艺计划流水号不能为空' AS message;
|
||||||
|
RETURN;
|
||||||
|
END;
|
||||||
|
|
||||||
|
IF NOT EXISTS (
|
||||||
|
SELECT 1
|
||||||
|
FROM [dbo].[车间生产管理_零件工艺计划_视图]
|
||||||
|
WHERE 工艺计划流水号 = @工艺计划流水号
|
||||||
|
AND 考核状态 >= 1
|
||||||
|
)
|
||||||
|
BEGIN
|
||||||
|
IF @是否返回结果 = 1
|
||||||
|
SELECT N'0' AS result, N'工艺计划不存在或未生效' AS message;
|
||||||
|
RETURN;
|
||||||
|
END;
|
||||||
|
|
||||||
|
;WITH TargetRows AS (
|
||||||
|
SELECT
|
||||||
|
gp.工艺计划流水号,
|
||||||
|
gx.工序流水号,
|
||||||
|
gx.工序顺序,
|
||||||
|
gp.零件名称,
|
||||||
|
gp.零件图号 AS 图号,
|
||||||
|
ISNULL(base.工艺名称, N'未设置工序') AS 工艺名称
|
||||||
|
FROM [dbo].[车间生产管理_零件工艺计划_视图] gp
|
||||||
|
INNER JOIN [dbo].[车间生产管理工艺_零件工序] gx ON gp.工艺计划流水号 = gx.工艺计划流水号
|
||||||
|
LEFT JOIN [dbo].[车间生产管理工艺_基础表_工艺名称] base ON gx.工艺编号 = base.工艺编号
|
||||||
|
WHERE gp.工艺计划流水号 = @工艺计划流水号
|
||||||
|
AND gp.考核状态 >= 1
|
||||||
|
AND NULLIF(LTRIM(RTRIM(base.工艺名称)), N'') IS NOT NULL
|
||||||
|
AND NOT EXISTS (
|
||||||
|
SELECT 1
|
||||||
|
FROM [dbo].[车间生产管理工艺_工序工价] price
|
||||||
|
WHERE price.工序流水号 = gx.工序流水号
|
||||||
|
)
|
||||||
|
)
|
||||||
|
INSERT INTO [dbo].[车间生产管理工艺_工序工价](
|
||||||
|
工序流水号,
|
||||||
|
工艺名称,
|
||||||
|
工序名称,
|
||||||
|
零件名称,
|
||||||
|
图号,
|
||||||
|
[机动时间s],
|
||||||
|
[辅助时间s],
|
||||||
|
[总时间s],
|
||||||
|
[单装数量(件)],
|
||||||
|
[操作台数],
|
||||||
|
[日产能(件)],
|
||||||
|
[最终单价(元/件)],
|
||||||
|
生效日期,
|
||||||
|
变更次数,
|
||||||
|
是否启用,
|
||||||
|
备注,
|
||||||
|
创建人,
|
||||||
|
创建时间,
|
||||||
|
修改人,
|
||||||
|
修改时间,
|
||||||
|
计价方式,
|
||||||
|
单件工价,
|
||||||
|
单时工价,
|
||||||
|
准结工价,
|
||||||
|
难度系数,
|
||||||
|
质量系数,
|
||||||
|
设备系数
|
||||||
|
)
|
||||||
|
SELECT
|
||||||
|
targetRow.工序流水号,
|
||||||
|
targetRow.工艺名称,
|
||||||
|
targetRow.工艺名称,
|
||||||
|
targetRow.零件名称,
|
||||||
|
targetRow.图号,
|
||||||
|
COALESCE(exactPrice.[机动时间s], fallbackPrice.[机动时间s], 0),
|
||||||
|
COALESCE(exactPrice.[辅助时间s], fallbackPrice.[辅助时间s], 0),
|
||||||
|
COALESCE(exactPrice.[总时间s], fallbackPrice.[总时间s], 0),
|
||||||
|
COALESCE(exactPrice.[单装数量(件)], fallbackPrice.[单装数量(件)], 0),
|
||||||
|
COALESCE(exactPrice.[操作台数], fallbackPrice.[操作台数], 0),
|
||||||
|
COALESCE(exactPrice.[日产能(件)], fallbackPrice.[日产能(件)], 0),
|
||||||
|
COALESCE(exactPrice.[最终单价(元/件)], fallbackPrice.[最终单价(元/件)], 0),
|
||||||
|
COALESCE(exactPrice.生效日期, fallbackPrice.生效日期),
|
||||||
|
COALESCE(exactPrice.变更次数, fallbackPrice.变更次数, 0),
|
||||||
|
COALESCE(exactPrice.是否启用, fallbackPrice.是否启用, 1),
|
||||||
|
NULL,
|
||||||
|
@操作人,
|
||||||
|
@当前时间,
|
||||||
|
@操作人,
|
||||||
|
@当前时间,
|
||||||
|
N'按件',
|
||||||
|
COALESCE(exactPrice.[最终单价(元/件)], fallbackPrice.[最终单价(元/件)], 0),
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1
|
||||||
|
FROM TargetRows targetRow
|
||||||
|
OUTER APPLY (
|
||||||
|
-- 修改人:Ld 修改时间:2026-08-04 16:31:18; 优先同零件名称、图号、工序顺序和工艺名称精确匹配
|
||||||
|
SELECT TOP 1
|
||||||
|
price.*
|
||||||
|
FROM [dbo].[车间生产管理_零件工艺计划_视图] sourceGp
|
||||||
|
INNER JOIN [dbo].[车间生产管理工艺_零件工序] sourceGx ON sourceGp.工艺计划流水号 = sourceGx.工艺计划流水号
|
||||||
|
LEFT JOIN [dbo].[车间生产管理工艺_基础表_工艺名称] sourceBase ON sourceGx.工艺编号 = sourceBase.工艺编号
|
||||||
|
INNER JOIN [dbo].[车间生产管理工艺_工序工价] price ON sourceGx.工序流水号 = price.工序流水号
|
||||||
|
WHERE sourceGp.考核状态 >= 1
|
||||||
|
AND sourceGp.工艺计划流水号 <> targetRow.工艺计划流水号
|
||||||
|
AND sourceGp.零件名称 = targetRow.零件名称
|
||||||
|
AND sourceGp.零件图号 = targetRow.图号
|
||||||
|
AND sourceGx.工序顺序 = targetRow.工序顺序
|
||||||
|
AND ISNULL(sourceBase.工艺名称, N'未设置工序') = targetRow.工艺名称
|
||||||
|
ORDER BY sourceGp.工艺更新时间 DESC, sourceGp.工艺计划流水号 DESC, price.修改时间 DESC, price.工价流水号 DESC
|
||||||
|
) exactPrice
|
||||||
|
OUTER APPLY (
|
||||||
|
-- 修改人:Ld 修改时间:2026-08-04 16:31:18; 精确工序未命中时,按零件名称和图号取最近一条已有工价兜底
|
||||||
|
SELECT TOP 1
|
||||||
|
price.*
|
||||||
|
FROM [dbo].[车间生产管理_零件工艺计划_视图] sourceGp
|
||||||
|
INNER JOIN [dbo].[车间生产管理工艺_零件工序] sourceGx ON sourceGp.工艺计划流水号 = sourceGx.工艺计划流水号
|
||||||
|
INNER JOIN [dbo].[车间生产管理工艺_工序工价] price ON sourceGx.工序流水号 = price.工序流水号
|
||||||
|
WHERE exactPrice.工价流水号 IS NULL
|
||||||
|
AND sourceGp.考核状态 >= 1
|
||||||
|
AND sourceGp.工艺计划流水号 <> targetRow.工艺计划流水号
|
||||||
|
AND sourceGp.零件名称 = targetRow.零件名称
|
||||||
|
AND sourceGp.零件图号 = targetRow.图号
|
||||||
|
ORDER BY sourceGp.工艺更新时间 DESC, sourceGp.工艺计划流水号 DESC, price.修改时间 DESC, price.工价流水号 DESC
|
||||||
|
) fallbackPrice;
|
||||||
|
|
||||||
|
IF @是否返回结果 = 1
|
||||||
|
SELECT N'1' AS result, @@ROWCOUNT AS 工价流水数;
|
||||||
|
END
|
||||||
|
GO
|
||||||
|
|
||||||
|
-- 工序工序插入时自动补齐工价,按零件名称和图号直接拷贝已有数据;修改人:Ld 修改时间:2026-08-04 16:31:18;
|
||||||
|
IF OBJECT_ID(N'[dbo].[TR_车间生产管理工艺_零件工序_工价自动补齐]', N'TR') IS NOT NULL
|
||||||
|
DROP TRIGGER [dbo].[TR_车间生产管理工艺_零件工序_工价自动补齐];
|
||||||
|
GO
|
||||||
|
|
||||||
|
CREATE TRIGGER [dbo].[TR_车间生产管理工艺_零件工序_工价自动补齐]
|
||||||
|
ON [dbo].[车间生产管理工艺_零件工序]
|
||||||
|
AFTER INSERT
|
||||||
|
AS
|
||||||
|
BEGIN
|
||||||
|
SET NOCOUNT ON;
|
||||||
|
|
||||||
|
DECLARE @工艺计划流水号 INT;
|
||||||
|
DECLARE 工艺游标 CURSOR LOCAL FAST_FORWARD FOR
|
||||||
|
SELECT DISTINCT i.工艺计划流水号
|
||||||
|
FROM inserted i
|
||||||
|
WHERE i.工艺计划流水号 IS NOT NULL;
|
||||||
|
|
||||||
|
OPEN 工艺游标;
|
||||||
|
FETCH NEXT FROM 工艺游标 INTO @工艺计划流水号;
|
||||||
|
WHILE @@FETCH_STATUS = 0
|
||||||
|
BEGIN
|
||||||
|
EXEC [dbo].[车间生产管理工艺_工序工价_自动补齐数据]
|
||||||
|
@工艺计划流水号 = @工艺计划流水号,
|
||||||
|
@修改人 = N'Ld',
|
||||||
|
@是否返回结果 = 0;
|
||||||
|
FETCH NEXT FROM 工艺游标 INTO @工艺计划流水号;
|
||||||
|
END
|
||||||
|
CLOSE 工艺游标;
|
||||||
|
DEALLOCATE 工艺游标;
|
||||||
|
END
|
||||||
|
GO
|
||||||
|
|
||||||
|
-- 清理历史自动备注,取消自动写入备注后的残留文案;修改人:Ld 修改时间:2026-08-04 16:31:18;
|
||||||
|
UPDATE [dbo].[车间生产管理工艺_工序工价]
|
||||||
|
SET 备注 = NULL
|
||||||
|
WHERE 备注 LIKE N'自动拷贝来源工价流水号:%'
|
||||||
|
OR 备注 LIKE N'自动按零件图号兜底拷贝来源工价流水号:%'
|
||||||
|
OR 备注 = N'自动生成默认工价';
|
||||||
|
GO
|
||||||
|
|
||||||
|
-- 工序工价分页查询增加自动补齐调用,确保打开零件后立即生成缺失工价;修改人:Ld 修改时间:2026-08-04 16:31:18;
|
||||||
|
ALTER PROCEDURE [dbo].[车间生产管理工艺_工序工价_查询数据]
|
||||||
|
@订单流水号_check INT = 0,
|
||||||
|
@订单流水号 INT = NULL,
|
||||||
|
@组件流水号_check INT = 0,
|
||||||
|
@组件流水号 INT = NULL,
|
||||||
|
@工艺计划流水号_check INT = 0,
|
||||||
|
@工艺计划流水号 INT = NULL,
|
||||||
|
@工艺名称_check INT = 0,
|
||||||
|
@工艺名称 NVARCHAR(100) = N'',
|
||||||
|
@工序名称_check INT = 0,
|
||||||
|
@工序名称 NVARCHAR(100) = N'',
|
||||||
|
@零件名称_check INT = 0,
|
||||||
|
@零件名称 NVARCHAR(100) = N'',
|
||||||
|
@图号_check INT = 0,
|
||||||
|
@图号 NVARCHAR(100) = N'',
|
||||||
|
@是否启用_check INT = 0,
|
||||||
|
@是否启用 NVARCHAR(20) = N'',
|
||||||
|
@PageCurrent INT = 1,
|
||||||
|
@PageSize INT = 1000
|
||||||
|
AS
|
||||||
|
BEGIN
|
||||||
|
SET NOCOUNT ON;
|
||||||
|
|
||||||
|
IF @工艺计划流水号_check = 1 AND @工艺计划流水号 IS NOT NULL
|
||||||
|
BEGIN
|
||||||
|
EXEC [dbo].[车间生产管理工艺_工序工价_自动补齐数据]
|
||||||
|
@工艺计划流水号 = @工艺计划流水号,
|
||||||
|
@修改人 = N'Ld',
|
||||||
|
@是否返回结果 = 0;
|
||||||
|
END
|
||||||
|
|
||||||
|
IF @PageCurrent IS NULL OR @PageCurrent < 1 SET @PageCurrent = 1;
|
||||||
|
IF @PageSize IS NULL OR @PageSize < 1 SET @PageSize = 1000;
|
||||||
|
|
||||||
|
;WITH PlanData AS (
|
||||||
|
-- 与制定工艺组件订单、产品、零件选择保持同一工艺计划来源口径;修改人:Ld 修改时间:2026-08-04 16:31:18;
|
||||||
|
SELECT gp.*
|
||||||
|
FROM [dbo].[车间生产管理_零件工艺计划_视图] gp
|
||||||
|
WHERE gp.考核状态 >= 1
|
||||||
|
AND (@订单流水号_check = 0 OR gp.订单流水号 = @订单流水号)
|
||||||
|
AND (@组件流水号_check = 0 OR gp.组件流水号 = @组件流水号)
|
||||||
|
AND (@工艺计划流水号_check = 0 OR gp.工艺计划流水号 = @工艺计划流水号)
|
||||||
|
AND (@零件名称_check = 0 OR gp.零件名称 + gp.零件图号 LIKE N'%' + @零件名称 + N'%')
|
||||||
|
AND (@图号_check = 0 OR gp.零件图号 LIKE N'%' + @图号 + N'%')
|
||||||
|
),
|
||||||
|
ProcessData AS (
|
||||||
|
SELECT
|
||||||
|
ROW_NUMBER() OVER (
|
||||||
|
ORDER BY gp.工艺更新时间 DESC, gp.工艺计划流水号 DESC, gx.工序顺序 ASC, gx.工序流水号 ASC
|
||||||
|
) AS RowNum,
|
||||||
|
price.工价流水号,
|
||||||
|
gx.工序流水号,
|
||||||
|
gx.工艺计划流水号,
|
||||||
|
gp.订单号,
|
||||||
|
gp.产品名称,
|
||||||
|
base.工艺名称 AS 工艺名称,
|
||||||
|
base.工艺名称 AS 工序名称,
|
||||||
|
gp.零件名称,
|
||||||
|
gp.零件图号 AS 图号,
|
||||||
|
gx.工序顺序,
|
||||||
|
gx.定额工时,
|
||||||
|
gx.准结工时,
|
||||||
|
ISNULL(price.[单装数量(件)], 0) AS [单装数量(件)],
|
||||||
|
ISNULL(price.[操作台数], 0) AS [操作台数],
|
||||||
|
ISNULL(price.[机动时间s], 0) AS [机动时间s],
|
||||||
|
ISNULL(price.[辅助时间s], 0) AS [辅助时间s],
|
||||||
|
ISNULL(price.[机动时间s], 0) + ISNULL(price.[辅助时间s], 0) AS [总时间s],
|
||||||
|
ISNULL(price.[工作时间(时)], 0) AS [工作时间(时)],
|
||||||
|
ISNULL(price.[宽放时间(时)], 0) AS [宽放时间(时)],
|
||||||
|
ISNULL(price.[日工资(元)], 0) AS [日工资(元)],
|
||||||
|
ISNULL(price.[标准产能(件/天)], 0) AS [标准产能(件/天)],
|
||||||
|
ISNULL(price.[工价定额], 0) AS 工价定额,
|
||||||
|
ISNULL(price.[标准产能(件/天)], ISNULL(price.[日产能(件)], 0)) AS [日产能(件)],
|
||||||
|
ISNULL(price.[工价定额], ISNULL(price.[最终单价(元/件)], 0)) AS [最终单价(元/件)],
|
||||||
|
CONVERT(VARCHAR(10), price.生效日期, 23) AS 生效日期,
|
||||||
|
ISNULL(price.变更次数, 0) AS 变更次数,
|
||||||
|
ISNULL(price.是否启用, 1) AS 是否启用,
|
||||||
|
price.备注,
|
||||||
|
price.创建人,
|
||||||
|
CONVERT(VARCHAR(19), price.创建时间, 120) AS 创建时间,
|
||||||
|
price.修改人,
|
||||||
|
CONVERT(VARCHAR(19), price.修改时间, 120) AS 修改时间
|
||||||
|
FROM PlanData gp
|
||||||
|
INNER JOIN [dbo].[车间生产管理工艺_零件工序] gx ON gp.工艺计划流水号 = gx.工艺计划流水号
|
||||||
|
LEFT JOIN [dbo].[车间生产管理工艺_基础表_工艺名称] base ON gx.工艺编号 = base.工艺编号
|
||||||
|
LEFT JOIN [dbo].[车间生产管理工艺_工序工价] price ON gx.工序流水号 = price.工序流水号
|
||||||
|
WHERE NULLIF(LTRIM(RTRIM(base.工艺名称)), N'') IS NOT NULL
|
||||||
|
AND (@工艺名称_check = 0 OR base.工艺名称 LIKE N'%' + @工艺名称 + N'%')
|
||||||
|
AND (@工序名称_check = 0 OR base.工艺名称 LIKE N'%' + @工序名称 + N'%')
|
||||||
|
AND (@是否启用_check = 0 OR CAST(ISNULL(price.是否启用, 1) AS NVARCHAR(20)) = @是否启用)
|
||||||
|
)
|
||||||
|
SELECT
|
||||||
|
工价流水号,
|
||||||
|
工序流水号,
|
||||||
|
工艺计划流水号,
|
||||||
|
订单号,
|
||||||
|
产品名称,
|
||||||
|
工艺名称,
|
||||||
|
工序名称,
|
||||||
|
零件名称,
|
||||||
|
图号,
|
||||||
|
工序顺序,
|
||||||
|
定额工时,
|
||||||
|
准结工时,
|
||||||
|
[单装数量(件)],
|
||||||
|
操作台数,
|
||||||
|
[机动时间s],
|
||||||
|
[辅助时间s],
|
||||||
|
[总时间s],
|
||||||
|
[工作时间(时)],
|
||||||
|
[宽放时间(时)],
|
||||||
|
[日工资(元)],
|
||||||
|
[标准产能(件/天)],
|
||||||
|
工价定额,
|
||||||
|
[日产能(件)],
|
||||||
|
[最终单价(元/件)],
|
||||||
|
生效日期,
|
||||||
|
变更次数,
|
||||||
|
是否启用,
|
||||||
|
备注,
|
||||||
|
创建人,
|
||||||
|
创建时间,
|
||||||
|
修改人,
|
||||||
|
修改时间
|
||||||
|
FROM ProcessData
|
||||||
|
WHERE RowNum BETWEEN ((@PageCurrent - 1) * @PageSize + 1) AND (@PageCurrent * @PageSize)
|
||||||
|
ORDER BY RowNum;
|
||||||
|
|
||||||
|
SELECT COUNT(1) AS total
|
||||||
|
FROM [dbo].[车间生产管理_零件工艺计划_视图] gp
|
||||||
|
INNER JOIN [dbo].[车间生产管理工艺_零件工序] gx ON gp.工艺计划流水号 = gx.工艺计划流水号
|
||||||
|
LEFT JOIN [dbo].[车间生产管理工艺_基础表_工艺名称] base ON gx.工艺编号 = base.工艺编号
|
||||||
|
LEFT JOIN [dbo].[车间生产管理工艺_工序工价] price ON gx.工序流水号 = price.工序流水号
|
||||||
|
WHERE gp.考核状态 >= 1
|
||||||
|
AND (@订单流水号_check = 0 OR gp.订单流水号 = @订单流水号)
|
||||||
|
AND (@组件流水号_check = 0 OR gp.组件流水号 = @组件流水号)
|
||||||
|
AND (@工艺计划流水号_check = 0 OR gp.工艺计划流水号 = @工艺计划流水号)
|
||||||
|
AND NULLIF(LTRIM(RTRIM(base.工艺名称)), N'') IS NOT NULL
|
||||||
|
AND (@工艺名称_check = 0 OR base.工艺名称 LIKE N'%' + @工艺名称 + N'%')
|
||||||
|
AND (@工序名称_check = 0 OR base.工艺名称 LIKE N'%' + @工序名称 + N'%')
|
||||||
|
AND (@零件名称_check = 0 OR gp.零件名称 + gp.零件图号 LIKE N'%' + @零件名称 + N'%')
|
||||||
|
AND (@图号_check = 0 OR gp.零件图号 LIKE N'%' + @图号 + N'%')
|
||||||
|
AND (@是否启用_check = 0 OR CAST(ISNULL(price.是否启用, 1) AS NVARCHAR(20)) = @是否启用);
|
||||||
|
END
|
||||||
|
GO
|
||||||
186
sql/库存查询_2026年前未完成订单需求明细.sql
Normal file
@@ -0,0 +1,186 @@
|
|||||||
|
-- 库存查询2026年前未完成订单需求明细,按组件完成状态排除已完成组件并汇总导出;修改人:Ld 修改时间:2026-07-24 11:30:00;
|
||||||
|
SET NOCOUNT ON;
|
||||||
|
|
||||||
|
;WITH 组件订单 AS
|
||||||
|
(
|
||||||
|
SELECT
|
||||||
|
c.组件流水号,
|
||||||
|
o.订单编号,
|
||||||
|
o.下单日期,
|
||||||
|
o.下单人,
|
||||||
|
ISNULL(kh.客户名称, '') AS 客户名称,
|
||||||
|
ISNULL(psn.姓名, CONVERT(nvarchar(50), o.下单人)) AS 下单人姓名,
|
||||||
|
c.是否分配,
|
||||||
|
c.产品状态,
|
||||||
|
c.数量 AS 组件数量,
|
||||||
|
c.完成数量 AS 组件完成数量,
|
||||||
|
o.订单类型,
|
||||||
|
o.是否提交,
|
||||||
|
p.是否启用
|
||||||
|
FROM dbo.PDM_组件名称 c
|
||||||
|
INNER JOIN dbo.PDM_机床名称 m ON c.机床流水号 = m.机床流水号
|
||||||
|
INNER JOIN dbo.PDM_项目名称 p ON m.项目流水号 = p.项目流水号
|
||||||
|
INNER JOIN dbo.合同管理_订单信息_基础表 o ON p.项目流水号 = o.项目流水号
|
||||||
|
LEFT JOIN dbo.客户关系管理系统_客户名称 kh ON p.客户流水号 = kh.客户流水号
|
||||||
|
LEFT JOIN dbo.人事档案管理_人员名单 psn ON o.下单人 = psn.人员编号
|
||||||
|
),
|
||||||
|
需求明细 AS
|
||||||
|
(
|
||||||
|
SELECT
|
||||||
|
co.订单编号,
|
||||||
|
co.下单日期,
|
||||||
|
co.客户名称,
|
||||||
|
co.下单人姓名,
|
||||||
|
b.组件流水号,
|
||||||
|
b.物料流水号,
|
||||||
|
ISNULL(mat.名称, b.名称) AS 零件名称,
|
||||||
|
ISNULL(mat.代号, b.代号) AS 图号,
|
||||||
|
SUM(ISNULL(b.零件数量, 0)) AS 需求量
|
||||||
|
FROM dbo.PDM_零件明细表_基本件 b
|
||||||
|
INNER JOIN 组件订单 co ON b.组件流水号 = co.组件流水号
|
||||||
|
LEFT JOIN dbo.库存管理_物料主文件_基本 mat ON b.物料流水号 = mat.物料流水号
|
||||||
|
WHERE co.是否分配 = 1
|
||||||
|
AND co.订单类型 <> 3
|
||||||
|
AND co.下单日期 < '2026-01-01'
|
||||||
|
AND NOT (ISNULL(co.是否提交, 0) = 6 AND ISNULL(co.是否启用, 0) = 1)
|
||||||
|
AND NOT (ISNULL(co.产品状态, 0) = 4 OR (ISNULL(co.组件数量, 0) > 0 AND ISNULL(co.组件完成数量, 0) >= ISNULL(co.组件数量, 0)))
|
||||||
|
GROUP BY co.订单编号, co.下单日期, co.客户名称, co.下单人姓名, b.组件流水号, b.物料流水号, ISNULL(mat.名称, b.名称), ISNULL(mat.代号, b.代号)
|
||||||
|
|
||||||
|
UNION ALL
|
||||||
|
|
||||||
|
SELECT
|
||||||
|
co.订单编号,
|
||||||
|
co.下单日期,
|
||||||
|
co.客户名称,
|
||||||
|
co.下单人姓名,
|
||||||
|
s.组件流水号,
|
||||||
|
s.物料流水号,
|
||||||
|
mat.名称 AS 零件名称,
|
||||||
|
mat.代号 AS 图号,
|
||||||
|
SUM(ISNULL(s.零件数量, 0)) AS 需求量
|
||||||
|
FROM dbo.PDM_零件明细表_标准件和外购件 s
|
||||||
|
INNER JOIN 组件订单 co ON s.组件流水号 = co.组件流水号
|
||||||
|
LEFT JOIN dbo.库存管理_物料主文件_基本 mat ON s.物料流水号 = mat.物料流水号
|
||||||
|
WHERE co.是否分配 = 1
|
||||||
|
AND co.订单类型 <> 3
|
||||||
|
AND co.下单日期 < '2026-01-01'
|
||||||
|
AND NOT (ISNULL(co.是否提交, 0) = 6 AND ISNULL(co.是否启用, 0) = 1)
|
||||||
|
AND NOT (ISNULL(co.产品状态, 0) = 4 OR (ISNULL(co.组件数量, 0) > 0 AND ISNULL(co.组件完成数量, 0) >= ISNULL(co.组件数量, 0)))
|
||||||
|
GROUP BY co.订单编号, co.下单日期, co.客户名称, co.下单人姓名, s.组件流水号, s.物料流水号, mat.名称, mat.代号
|
||||||
|
|
||||||
|
UNION ALL
|
||||||
|
|
||||||
|
SELECT
|
||||||
|
co.订单编号,
|
||||||
|
co.下单日期,
|
||||||
|
co.客户名称,
|
||||||
|
co.下单人姓名,
|
||||||
|
t.组件流水号,
|
||||||
|
t.物料流水号,
|
||||||
|
mat.名称 AS 零件名称,
|
||||||
|
mat.代号 AS 图号,
|
||||||
|
SUM(ISNULL(t.实领数, 0)) AS 需求量
|
||||||
|
FROM dbo.车间装配管理_装配执行_临时领料明细 t
|
||||||
|
LEFT JOIN 组件订单 co ON t.组件流水号 = co.组件流水号
|
||||||
|
LEFT JOIN dbo.库存管理_物料主文件_基本 mat ON t.物料流水号 = mat.物料流水号
|
||||||
|
WHERE t.物料流水号 IS NOT NULL
|
||||||
|
AND co.下单日期 < '2026-01-01'
|
||||||
|
AND NOT (ISNULL(co.是否提交, 0) = 6 AND ISNULL(co.是否启用, 0) = 1)
|
||||||
|
AND NOT (ISNULL(co.产品状态, 0) = 4 OR (ISNULL(co.组件数量, 0) > 0 AND ISNULL(co.组件完成数量, 0) >= ISNULL(co.组件数量, 0)))
|
||||||
|
GROUP BY co.订单编号, co.下单日期, co.客户名称, co.下单人姓名, t.组件流水号, t.物料流水号, mat.名称, mat.代号
|
||||||
|
),
|
||||||
|
已领明细 AS
|
||||||
|
(
|
||||||
|
SELECT co.订单编号, b.组件流水号, b.物料流水号, SUM(ISNULL(l.已领数量, 0)) AS 已领数
|
||||||
|
FROM dbo.车间装配管理_领料单明细 l
|
||||||
|
INNER JOIN dbo.PDM_零件明细表_基本件 b ON l.基本件流水号 = b.基本件流水号
|
||||||
|
INNER JOIN 组件订单 co ON b.组件流水号 = co.组件流水号
|
||||||
|
WHERE co.下单日期 < '2026-01-01'
|
||||||
|
AND NOT (ISNULL(co.是否提交, 0) = 6 AND ISNULL(co.是否启用, 0) = 1)
|
||||||
|
GROUP BY co.订单编号, b.组件流水号, b.物料流水号
|
||||||
|
|
||||||
|
UNION ALL
|
||||||
|
|
||||||
|
SELECT co.订单编号, s.组件流水号, s.物料流水号, SUM(ISNULL(l.已领数量, 0)) AS 已领数
|
||||||
|
FROM dbo.车间装配管理_领料单明细 l
|
||||||
|
INNER JOIN dbo.PDM_零件明细表_标准件和外购件 s ON l.标准件和外购件流水号 = s.标准件和外购件流水号
|
||||||
|
INNER JOIN 组件订单 co ON s.组件流水号 = co.组件流水号
|
||||||
|
WHERE co.下单日期 < '2026-01-01'
|
||||||
|
AND NOT (ISNULL(co.是否提交, 0) = 6 AND ISNULL(co.是否启用, 0) = 1)
|
||||||
|
GROUP BY co.订单编号, s.组件流水号, s.物料流水号
|
||||||
|
|
||||||
|
UNION ALL
|
||||||
|
|
||||||
|
SELECT co.订单编号, l.组件流水号, l.物料流水号, SUM(ISNULL(l.已领数量, 0)) AS 已领数
|
||||||
|
FROM dbo.车间装配管理_领料单明细 l
|
||||||
|
LEFT JOIN 组件订单 co ON l.组件流水号 = co.组件流水号
|
||||||
|
WHERE l.物料流水号 IS NOT NULL
|
||||||
|
AND ISNULL(l.物料流水号, 0) <> 0
|
||||||
|
AND ISNULL(l.基本件流水号, 0) = 0
|
||||||
|
AND ISNULL(l.标准件和外购件流水号, 0) = 0
|
||||||
|
AND co.下单日期 < '2026-01-01'
|
||||||
|
AND NOT (ISNULL(co.是否提交, 0) = 6 AND ISNULL(co.是否启用, 0) = 1)
|
||||||
|
GROUP BY co.订单编号, l.组件流水号, l.物料流水号
|
||||||
|
),
|
||||||
|
已领汇总 AS
|
||||||
|
(
|
||||||
|
SELECT 订单编号, 组件流水号, 物料流水号, SUM(已领数) AS 已领数
|
||||||
|
FROM 已领明细
|
||||||
|
GROUP BY 订单编号, 组件流水号, 物料流水号
|
||||||
|
),
|
||||||
|
基本未完成 AS
|
||||||
|
(
|
||||||
|
SELECT b.组件流水号, COUNT(*) AS 未完成数
|
||||||
|
FROM dbo.PDM_零件明细表_基本件 b
|
||||||
|
LEFT JOIN dbo.车间生产管理_零件工艺计划_视图 v ON b.基本件流水号 = v.基本件流水号
|
||||||
|
WHERE ISNULL(v.考核状态, 0) < 3
|
||||||
|
GROUP BY b.组件流水号
|
||||||
|
),
|
||||||
|
采购未完成 AS
|
||||||
|
(
|
||||||
|
SELECT 组件流水号, COUNT(*) AS 未完成数
|
||||||
|
FROM dbo.采购管理_采购合同明细_查询视图
|
||||||
|
WHERE ISNULL(采购状态, N'') <> N'已入库'
|
||||||
|
GROUP BY 组件流水号
|
||||||
|
),
|
||||||
|
存在部件组件 AS
|
||||||
|
(
|
||||||
|
SELECT 组件流水号 FROM dbo.PDM_零件明细表_基本件
|
||||||
|
UNION
|
||||||
|
SELECT 组件流水号 FROM dbo.PDM_零件明细表_标准件和外购件
|
||||||
|
UNION
|
||||||
|
SELECT 组件流水号 FROM dbo.采购管理_采购合同明细_查询视图
|
||||||
|
),
|
||||||
|
全部完成组件 AS
|
||||||
|
(
|
||||||
|
SELECT e.组件流水号
|
||||||
|
FROM 存在部件组件 e
|
||||||
|
LEFT JOIN 基本未完成 b ON e.组件流水号 = b.组件流水号
|
||||||
|
LEFT JOIN 采购未完成 p ON e.组件流水号 = p.组件流水号
|
||||||
|
WHERE ISNULL(b.未完成数, 0) = 0
|
||||||
|
AND ISNULL(p.未完成数, 0) = 0
|
||||||
|
),
|
||||||
|
最终明细 AS
|
||||||
|
(
|
||||||
|
SELECT
|
||||||
|
d.订单编号,
|
||||||
|
CONVERT(varchar(10), d.下单日期, 23) AS 下单日期,
|
||||||
|
d.客户名称,
|
||||||
|
d.下单人姓名 AS 下单人,
|
||||||
|
d.零件名称,
|
||||||
|
d.图号,
|
||||||
|
d.需求量,
|
||||||
|
ISNULL(l.已领数, 0) AS 已领数,
|
||||||
|
CASE WHEN d.需求量 > ISNULL(l.已领数, 0) THEN d.需求量 - ISNULL(l.已领数, 0) ELSE 0 END AS 最终需求量
|
||||||
|
FROM 需求明细 d
|
||||||
|
LEFT JOIN 已领汇总 l
|
||||||
|
ON d.订单编号 = l.订单编号
|
||||||
|
AND d.组件流水号 = l.组件流水号
|
||||||
|
AND d.物料流水号 = l.物料流水号
|
||||||
|
WHERE NOT EXISTS (SELECT 1 FROM 全部完成组件 c WHERE c.组件流水号 = d.组件流水号)
|
||||||
|
)
|
||||||
|
SELECT 订单编号, 下单日期, 客户名称, 下单人, 零件名称, 图号, SUM(需求量) AS 需求量, SUM(已领数) AS 已领数, SUM(最终需求量) AS 最终需求量
|
||||||
|
FROM 最终明细
|
||||||
|
WHERE 最终需求量 > 0
|
||||||
|
GROUP BY 订单编号, 下单日期, 客户名称, 下单人, 零件名称, 图号
|
||||||
|
ORDER BY 下单日期 DESC, 订单编号, 零件名称, 图号;
|
||||||
143
sql/库存查询_需求量与明细一致性排查.sql
Normal file
@@ -0,0 +1,143 @@
|
|||||||
|
-- 库存查询需求量与需求量明细一致性排查;修改人:Ld 修改时间:2026-07-24 08:00:00;
|
||||||
|
SET NOCOUNT ON;
|
||||||
|
|
||||||
|
;WITH 组件订单 AS
|
||||||
|
(
|
||||||
|
SELECT c.组件流水号,o.订单编号,c.是否分配,o.订单类型,o.是否提交,p.是否启用,ISNULL(k.简称,'') AS 简称
|
||||||
|
FROM dbo.PDM_组件名称 c
|
||||||
|
INNER JOIN dbo.PDM_机床名称 m ON c.机床流水号=m.机床流水号
|
||||||
|
INNER JOIN dbo.PDM_项目名称 p ON m.项目流水号=p.项目流水号
|
||||||
|
INNER JOIN dbo.合同管理_订单信息_基础表 o ON p.项目流水号=o.项目流水号
|
||||||
|
LEFT JOIN dbo.客户关系管理系统_客户名称 k ON p.客户流水号=k.客户流水号
|
||||||
|
),
|
||||||
|
需求明细 AS
|
||||||
|
(
|
||||||
|
SELECT co.订单编号,b.组件流水号,b.物料流水号,SUM(ISNULL(b.零件数量,0)) AS 需求量,N'生产订单需求' AS 来源
|
||||||
|
FROM dbo.PDM_零件明细表_基本件 b
|
||||||
|
INNER JOIN 组件订单 co ON b.组件流水号=co.组件流水号
|
||||||
|
WHERE co.是否分配=1 AND co.订单类型<>3 AND NOT (ISNULL(co.是否提交,0)=6 AND ISNULL(co.是否启用,0)=1)
|
||||||
|
GROUP BY co.订单编号,b.组件流水号,b.物料流水号
|
||||||
|
UNION ALL
|
||||||
|
SELECT co.订单编号,s.组件流水号,s.物料流水号,SUM(ISNULL(s.零件数量,0)) AS 需求量,N'生产订单需求' AS 来源
|
||||||
|
FROM dbo.PDM_零件明细表_标准件和外购件 s
|
||||||
|
INNER JOIN 组件订单 co ON s.组件流水号=co.组件流水号
|
||||||
|
WHERE co.是否分配=1 AND co.订单类型<>3 AND NOT (ISNULL(co.是否提交,0)=6 AND ISNULL(co.是否启用,0)=1)
|
||||||
|
GROUP BY co.订单编号,s.组件流水号,s.物料流水号
|
||||||
|
UNION ALL
|
||||||
|
SELECT co.订单编号,t.组件流水号,t.物料流水号,SUM(ISNULL(t.实领数,0)) AS 需求量,N'临时领料需求' AS 来源
|
||||||
|
FROM dbo.车间装配管理_装配执行_临时领料明细 t
|
||||||
|
LEFT JOIN 组件订单 co ON t.组件流水号=co.组件流水号
|
||||||
|
WHERE t.物料流水号 IS NOT NULL AND NOT (ISNULL(co.是否提交,0)=6 AND ISNULL(co.是否启用,0)=1)
|
||||||
|
GROUP BY co.订单编号,t.组件流水号,t.物料流水号
|
||||||
|
),
|
||||||
|
已领明细 AS
|
||||||
|
(
|
||||||
|
SELECT co.订单编号,b.组件流水号,b.物料流水号,SUM(ISNULL(l.已领数量,0)) AS 已领数
|
||||||
|
FROM dbo.车间装配管理_领料单明细 l
|
||||||
|
INNER JOIN dbo.PDM_零件明细表_基本件 b ON l.基本件流水号=b.基本件流水号
|
||||||
|
INNER JOIN 组件订单 co ON b.组件流水号=co.组件流水号
|
||||||
|
WHERE NOT (ISNULL(co.是否提交,0)=6 AND ISNULL(co.是否启用,0)=1)
|
||||||
|
GROUP BY co.订单编号,b.组件流水号,b.物料流水号
|
||||||
|
UNION ALL
|
||||||
|
SELECT co.订单编号,s.组件流水号,s.物料流水号,SUM(ISNULL(l.已领数量,0)) AS 已领数
|
||||||
|
FROM dbo.车间装配管理_领料单明细 l
|
||||||
|
INNER JOIN dbo.PDM_零件明细表_标准件和外购件 s ON l.标准件和外购件流水号=s.标准件和外购件流水号
|
||||||
|
INNER JOIN 组件订单 co ON s.组件流水号=co.组件流水号
|
||||||
|
WHERE NOT (ISNULL(co.是否提交,0)=6 AND ISNULL(co.是否启用,0)=1)
|
||||||
|
GROUP BY co.订单编号,s.组件流水号,s.物料流水号
|
||||||
|
UNION ALL
|
||||||
|
SELECT co.订单编号,l.组件流水号,l.物料流水号,SUM(ISNULL(l.已领数量,0)) AS 已领数
|
||||||
|
FROM dbo.车间装配管理_领料单明细 l
|
||||||
|
LEFT JOIN 组件订单 co ON l.组件流水号=co.组件流水号
|
||||||
|
WHERE l.物料流水号 IS NOT NULL AND ISNULL(l.物料流水号,0)<>0 AND ISNULL(l.基本件流水号,0)=0 AND ISNULL(l.标准件和外购件流水号,0)=0 AND NOT (ISNULL(co.是否提交,0)=6 AND ISNULL(co.是否启用,0)=1)
|
||||||
|
GROUP BY co.订单编号,l.组件流水号,l.物料流水号
|
||||||
|
),
|
||||||
|
已领汇总 AS
|
||||||
|
(
|
||||||
|
SELECT 订单编号,组件流水号,物料流水号,SUM(已领数) AS 已领数
|
||||||
|
FROM 已领明细 GROUP BY 订单编号,组件流水号,物料流水号
|
||||||
|
),
|
||||||
|
明细 AS
|
||||||
|
(
|
||||||
|
SELECT d.订单编号,d.组件流水号,d.物料流水号,d.需求量,ISNULL(l.已领数,0) AS 已领数,
|
||||||
|
CASE WHEN d.需求量>ISNULL(l.已领数,0) THEN d.需求量-ISNULL(l.已领数,0) ELSE 0 END AS 最终需求量,d.来源
|
||||||
|
FROM 需求明细 d
|
||||||
|
LEFT JOIN 已领汇总 l ON d.物料流水号=l.物料流水号 AND d.组件流水号=l.组件流水号 AND ISNULL(d.订单编号,'')=ISNULL(l.订单编号,'')
|
||||||
|
),
|
||||||
|
明细汇总 AS
|
||||||
|
(
|
||||||
|
SELECT 物料流水号,SUM(最终需求量) AS 明细最终需求量
|
||||||
|
FROM 明细 WHERE 最终需求量<>0 GROUP BY 物料流水号
|
||||||
|
)
|
||||||
|
SELECT COUNT(*) AS 明细有需求物料数,SUM(明细最终需求量) AS 明细最终需求量合计 FROM 明细汇总;
|
||||||
|
|
||||||
|
;WITH 组件订单 AS
|
||||||
|
(
|
||||||
|
SELECT c.组件流水号,o.订单编号,c.是否分配,o.订单类型,o.是否提交,p.是否启用
|
||||||
|
FROM dbo.PDM_组件名称 c
|
||||||
|
INNER JOIN dbo.PDM_机床名称 m ON c.机床流水号=m.机床流水号
|
||||||
|
INNER JOIN dbo.PDM_项目名称 p ON m.项目流水号=p.项目流水号
|
||||||
|
INNER JOIN dbo.合同管理_订单信息_基础表 o ON p.项目流水号=o.项目流水号
|
||||||
|
),
|
||||||
|
需求明细 AS
|
||||||
|
(
|
||||||
|
SELECT co.订单编号,b.组件流水号,b.物料流水号,SUM(ISNULL(b.零件数量,0)) AS 需求量
|
||||||
|
FROM dbo.PDM_零件明细表_基本件 b
|
||||||
|
INNER JOIN 组件订单 co ON b.组件流水号=co.组件流水号
|
||||||
|
WHERE co.是否分配=1 AND co.订单类型<>3 AND NOT (ISNULL(co.是否提交,0)=6 AND ISNULL(co.是否启用,0)=1)
|
||||||
|
GROUP BY co.订单编号,b.组件流水号,b.物料流水号
|
||||||
|
UNION ALL
|
||||||
|
SELECT co.订单编号,s.组件流水号,s.物料流水号,SUM(ISNULL(s.零件数量,0)) AS 需求量
|
||||||
|
FROM dbo.PDM_零件明细表_标准件和外购件 s
|
||||||
|
INNER JOIN 组件订单 co ON s.组件流水号=co.组件流水号
|
||||||
|
WHERE co.是否分配=1 AND co.订单类型<>3 AND NOT (ISNULL(co.是否提交,0)=6 AND ISNULL(co.是否启用,0)=1)
|
||||||
|
GROUP BY co.订单编号,s.组件流水号,s.物料流水号
|
||||||
|
UNION ALL
|
||||||
|
SELECT co.订单编号,t.组件流水号,t.物料流水号,SUM(ISNULL(t.实领数,0)) AS 需求量
|
||||||
|
FROM dbo.车间装配管理_装配执行_临时领料明细 t
|
||||||
|
LEFT JOIN 组件订单 co ON t.组件流水号=co.组件流水号
|
||||||
|
WHERE t.物料流水号 IS NOT NULL AND NOT (ISNULL(co.是否提交,0)=6 AND ISNULL(co.是否启用,0)=1)
|
||||||
|
GROUP BY co.订单编号,t.组件流水号,t.物料流水号
|
||||||
|
),
|
||||||
|
已领明细 AS
|
||||||
|
(
|
||||||
|
SELECT co.订单编号,b.组件流水号,b.物料流水号,SUM(ISNULL(l.已领数量,0)) AS 已领数
|
||||||
|
FROM dbo.车间装配管理_领料单明细 l
|
||||||
|
INNER JOIN dbo.PDM_零件明细表_基本件 b ON l.基本件流水号=b.基本件流水号
|
||||||
|
INNER JOIN 组件订单 co ON b.组件流水号=co.组件流水号
|
||||||
|
WHERE NOT (ISNULL(co.是否提交,0)=6 AND ISNULL(co.是否启用,0)=1)
|
||||||
|
GROUP BY co.订单编号,b.组件流水号,b.物料流水号
|
||||||
|
UNION ALL
|
||||||
|
SELECT co.订单编号,s.组件流水号,s.物料流水号,SUM(ISNULL(l.已领数量,0)) AS 已领数
|
||||||
|
FROM dbo.车间装配管理_领料单明细 l
|
||||||
|
INNER JOIN dbo.PDM_零件明细表_标准件和外购件 s ON l.标准件和外购件流水号=s.标准件和外购件流水号
|
||||||
|
INNER JOIN 组件订单 co ON s.组件流水号=co.组件流水号
|
||||||
|
WHERE NOT (ISNULL(co.是否提交,0)=6 AND ISNULL(co.是否启用,0)=1)
|
||||||
|
GROUP BY co.订单编号,s.组件流水号,s.物料流水号
|
||||||
|
UNION ALL
|
||||||
|
SELECT co.订单编号,l.组件流水号,l.物料流水号,SUM(ISNULL(l.已领数量,0)) AS 已领数
|
||||||
|
FROM dbo.车间装配管理_领料单明细 l
|
||||||
|
LEFT JOIN 组件订单 co ON l.组件流水号=co.组件流水号
|
||||||
|
WHERE l.物料流水号 IS NOT NULL AND ISNULL(l.物料流水号,0)<>0 AND ISNULL(l.基本件流水号,0)=0 AND ISNULL(l.标准件和外购件流水号,0)=0 AND NOT (ISNULL(co.是否提交,0)=6 AND ISNULL(co.是否启用,0)=1)
|
||||||
|
GROUP BY co.订单编号,l.组件流水号,l.物料流水号
|
||||||
|
),
|
||||||
|
已领汇总 AS
|
||||||
|
(
|
||||||
|
SELECT 订单编号,组件流水号,物料流水号,SUM(已领数) AS 已领数
|
||||||
|
FROM 已领明细 GROUP BY 订单编号,组件流水号,物料流水号
|
||||||
|
),
|
||||||
|
明细 AS
|
||||||
|
(
|
||||||
|
SELECT d.订单编号,d.组件流水号,d.物料流水号,
|
||||||
|
CASE WHEN d.需求量>ISNULL(l.已领数,0) THEN d.需求量-ISNULL(l.已领数,0) ELSE 0 END AS 最终需求量
|
||||||
|
FROM 需求明细 d
|
||||||
|
LEFT JOIN 已领汇总 l ON d.物料流水号=l.物料流水号 AND d.组件流水号=l.组件流水号 AND ISNULL(d.订单编号,'')=ISNULL(l.订单编号,'')
|
||||||
|
),
|
||||||
|
明细汇总 AS
|
||||||
|
(
|
||||||
|
SELECT 物料流水号,SUM(最终需求量) AS 明细最终需求量
|
||||||
|
FROM 明细 WHERE 最终需求量<>0 GROUP BY 物料流水号
|
||||||
|
)
|
||||||
|
SELECT COUNT(*) AS 明细与需求视图不一致物料数,SUM(ISNULL(m.明细最终需求量,0)) AS 明细合计,SUM(ISNULL(v.需求量,0)) AS 视图合计,SUM(ISNULL(m.明细最终需求量,0)-ISNULL(v.需求量,0)) AS 差异合计
|
||||||
|
FROM 明细汇总 m FULL JOIN dbo.物料管理_需求量_视图 v ON m.物料流水号=v.物料流水号
|
||||||
|
WHERE ISNULL(m.明细最终需求量,0)<>ISNULL(v.需求量,0);
|
||||||
105
sql/库房管理_库位_分页查询_测试库_20260731.sql
Normal file
@@ -0,0 +1,105 @@
|
|||||||
|
/*
|
||||||
|
库房管理库位分页查询脚本(测试库 ERPTOOL_JY_20250826Back)
|
||||||
|
修改人:Ld 修改时间:2026-07-31 14:19:37;
|
||||||
|
说明:将库房管理新模块使用的库位查询过程改为分页版,不修改原仓储库位页面。
|
||||||
|
*/
|
||||||
|
|
||||||
|
SET NOCOUNT ON;
|
||||||
|
GO
|
||||||
|
|
||||||
|
IF OBJECT_ID(N'dbo.库房管理_库位_查询', N'P') IS NOT NULL
|
||||||
|
DROP PROCEDURE dbo.库房管理_库位_查询;
|
||||||
|
GO
|
||||||
|
|
||||||
|
CREATE PROCEDURE dbo.库房管理_库位_查询
|
||||||
|
@库房流水号 INT = NULL,
|
||||||
|
@库区流水号 INT = NULL,
|
||||||
|
@库位名称_check BIT = 0,
|
||||||
|
@库位名称 NVARCHAR(50) = NULL,
|
||||||
|
@库位状态_check BIT = 0,
|
||||||
|
@库位状态 NVARCHAR(20) = NULL,
|
||||||
|
@PageCurrent INT = NULL,
|
||||||
|
@PageSize INT = NULL,
|
||||||
|
@PageCount INT = NULL OUTPUT,
|
||||||
|
@ItemCount INT = NULL OUTPUT
|
||||||
|
AS
|
||||||
|
BEGIN
|
||||||
|
SET NOCOUNT ON;
|
||||||
|
|
||||||
|
DECLARE @tbname NVARCHAR(MAX);
|
||||||
|
DECLARE @fieldkey NVARCHAR(1000);
|
||||||
|
DECLARE @where NVARCHAR(1000);
|
||||||
|
DECLARE @fieldshow NVARCHAR(MAX);
|
||||||
|
DECLARE @fieldOrder NVARCHAR(1000);
|
||||||
|
DECLARE @locationName NVARCHAR(100);
|
||||||
|
DECLARE @locationStatus NVARCHAR(100);
|
||||||
|
|
||||||
|
SET @库房流水号 = NULLIF(@库房流水号, 0);
|
||||||
|
SET @库区流水号 = NULLIF(@库区流水号, 0);
|
||||||
|
SET @locationName = REPLACE(ISNULL(@库位名称, N''), N'''', N'''''');
|
||||||
|
SET @locationStatus = REPLACE(ISNULL(@库位状态, N''), N'''', N'''''');
|
||||||
|
SET @PageCurrent = ISNULL(NULLIF(@PageCurrent, 0), 1);
|
||||||
|
SET @PageSize = ISNULL(NULLIF(@PageSize, 0), 20);
|
||||||
|
|
||||||
|
SET @tbname = N'(
|
||||||
|
SELECT
|
||||||
|
h.货位流水号 AS 库位流水号,
|
||||||
|
h.货位名称 AS 库位名称,
|
||||||
|
h.库房流水号,
|
||||||
|
k.库房名称,
|
||||||
|
h.库区流水号,
|
||||||
|
q.库区名称,
|
||||||
|
h.排号,
|
||||||
|
h.列号,
|
||||||
|
h.层号,
|
||||||
|
CASE
|
||||||
|
WHEN ISNULL(h.是否启用, 1) = 0 THEN N''停用''
|
||||||
|
WHEN ISNULL(s.库存数量, 0) > 0 AND ISNULL(h.库位容量, 0) > 0 AND ISNULL(s.库存数量, 0) >= ISNULL(h.库位容量, 0) THEN N''满库位''
|
||||||
|
WHEN ISNULL(s.库存数量, 0) > 0 THEN N''有库存''
|
||||||
|
ELSE ISNULL(h.库位状态, N''空库位'')
|
||||||
|
END AS 库位状态,
|
||||||
|
ISNULL(h.库位容量, 0) AS 库位容量,
|
||||||
|
ISNULL(s.物料种类, 0) AS 物料种类,
|
||||||
|
ISNULL(s.库存数量, 0) AS 库存数量,
|
||||||
|
h.操作日期,
|
||||||
|
h.修改时间
|
||||||
|
FROM dbo.库存管理_货位主文件 h
|
||||||
|
LEFT JOIN dbo.库房管理_库房主文件 k ON h.库房流水号 = k.库房流水号
|
||||||
|
LEFT JOIN dbo.库房管理_库区主文件 q ON h.库区流水号 = q.库区流水号
|
||||||
|
LEFT JOIN
|
||||||
|
(
|
||||||
|
SELECT 货位流水号, COUNT(DISTINCT 物料流水号) AS 物料种类, SUM(ISNULL(货位存量, 0)) AS 库存数量
|
||||||
|
FROM dbo.库存管理_物料与货位对照表
|
||||||
|
WHERE ISNULL(货位存量, 0) > 0
|
||||||
|
GROUP BY 货位流水号
|
||||||
|
) s ON h.货位流水号 = s.货位流水号
|
||||||
|
) AS T';
|
||||||
|
SET @fieldkey = N'库位流水号';
|
||||||
|
SET @fieldshow = N'库位流水号,库位名称,库房流水号,库房名称,库区流水号,库区名称,排号,列号,层号,库位状态,库位容量,物料种类,库存数量,操作日期,修改时间';
|
||||||
|
SET @fieldOrder = N'排号 ASC, 列号 ASC, 层号 ASC, 库位名称 ASC, 库位流水号 ASC';
|
||||||
|
SET @where = N'1 = 1';
|
||||||
|
|
||||||
|
IF @库房流水号 IS NOT NULL
|
||||||
|
SET @where = @where + N' AND 库房流水号 = ' + CAST(@库房流水号 AS NVARCHAR(20));
|
||||||
|
|
||||||
|
IF @库区流水号 IS NOT NULL
|
||||||
|
SET @where = @where + N' AND 库区流水号 = ' + CAST(@库区流水号 AS NVARCHAR(20));
|
||||||
|
|
||||||
|
IF @库位名称_check = 1 AND @locationName <> N''
|
||||||
|
SET @where = @where + N' AND 库位名称 LIKE N''%' + @locationName + N'%''';
|
||||||
|
|
||||||
|
IF @库位状态_check = 1 AND @locationStatus <> N''
|
||||||
|
SET @where = @where + N' AND 库位状态 = N''' + @locationStatus + N'''';
|
||||||
|
|
||||||
|
EXEC dbo.sp_xt_pagesplit2
|
||||||
|
@tbname,
|
||||||
|
@fieldkey,
|
||||||
|
@where,
|
||||||
|
@fieldshow,
|
||||||
|
@fieldOrder,
|
||||||
|
@PageCurrent,
|
||||||
|
@PageSize,
|
||||||
|
@PageCount OUTPUT,
|
||||||
|
@ItemCount OUTPUT;
|
||||||
|
END
|
||||||
|
GO
|
||||||
98
sql/库房管理_库位归类规则_测试库_20260731.sql
Normal file
@@ -0,0 +1,98 @@
|
|||||||
|
/*
|
||||||
|
库房管理库位归类规则脚本(测试库 ERPTOOL_JY_20250826Back)
|
||||||
|
修改人:Ld 修改时间:2026-07-31 14:26:30;
|
||||||
|
说明:毛坯库归一楼毛坯库,耗材归耗材库,其余未归类库位归库房A区。
|
||||||
|
*/
|
||||||
|
|
||||||
|
SET NOCOUNT ON;
|
||||||
|
GO
|
||||||
|
|
||||||
|
IF NOT EXISTS (SELECT 1 FROM dbo.库房管理_库房主文件 WHERE 库房编号 = N'KF-A')
|
||||||
|
BEGIN
|
||||||
|
INSERT INTO dbo.库房管理_库房主文件(库房编号, 库房名称, 库房类型, 地址, 状态, 排数, 每排列数, 层数, 备注, 创建人)
|
||||||
|
VALUES(N'KF-A', N'库房A区', N'标准库房', N'库房A区', N'启用', 1, 99, 1, N'未归类库位默认归属库房', 0);
|
||||||
|
END
|
||||||
|
GO
|
||||||
|
|
||||||
|
IF NOT EXISTS (SELECT 1 FROM dbo.库房管理_库房主文件 WHERE 库房编号 = N'KF-MP')
|
||||||
|
BEGIN
|
||||||
|
INSERT INTO dbo.库房管理_库房主文件(库房编号, 库房名称, 库房类型, 地址, 状态, 排数, 每排列数, 层数, 备注, 创建人)
|
||||||
|
VALUES(N'KF-MP', N'一楼毛坯库', N'毛坯库', N'一楼毛坯库', N'启用', 1, 99, 1, N'毛坯库库位归属', 0);
|
||||||
|
END
|
||||||
|
GO
|
||||||
|
|
||||||
|
IF NOT EXISTS (SELECT 1 FROM dbo.库房管理_库房主文件 WHERE 库房编号 = N'KF-HC')
|
||||||
|
BEGIN
|
||||||
|
INSERT INTO dbo.库房管理_库房主文件(库房编号, 库房名称, 库房类型, 地址, 状态, 排数, 每排列数, 层数, 备注, 创建人)
|
||||||
|
VALUES(N'KF-HC', N'耗材库', N'耗材库', N'耗材库', N'启用', 1, 99, 1, N'耗材库位归属', 0);
|
||||||
|
END
|
||||||
|
GO
|
||||||
|
|
||||||
|
;WITH DefaultArea AS
|
||||||
|
(
|
||||||
|
SELECT N'KF-A' AS 库房编号, N'A01' AS 库区编号, N'标准库位区' AS 库区名称, N'标准库区' AS 库区类型, N'未归类库位默认库区' AS 备注
|
||||||
|
UNION ALL SELECT N'KF-MP', N'MP', N'一楼毛坯库区', N'毛坯库区', N'毛坯库库位默认库区'
|
||||||
|
UNION ALL SELECT N'KF-HC', N'HC', N'耗材库区', N'耗材库区', N'耗材库位默认库区'
|
||||||
|
)
|
||||||
|
INSERT INTO dbo.库房管理_库区主文件(库房流水号, 库区编号, 库区名称, 库区类型, 排序, 备注, 创建人)
|
||||||
|
SELECT k.库房流水号, a.库区编号, a.库区名称, a.库区类型, 1, a.备注, 0
|
||||||
|
FROM DefaultArea a
|
||||||
|
INNER JOIN dbo.库房管理_库房主文件 k ON a.库房编号 = k.库房编号
|
||||||
|
WHERE NOT EXISTS
|
||||||
|
(
|
||||||
|
SELECT 1
|
||||||
|
FROM dbo.库房管理_库区主文件 x
|
||||||
|
WHERE x.库房流水号 = k.库房流水号
|
||||||
|
AND x.库区编号 = a.库区编号
|
||||||
|
);
|
||||||
|
GO
|
||||||
|
|
||||||
|
DECLARE @库房A INT;
|
||||||
|
DECLARE @库区A INT;
|
||||||
|
DECLARE @毛坯库 INT;
|
||||||
|
DECLARE @毛坯库区 INT;
|
||||||
|
DECLARE @耗材库 INT;
|
||||||
|
DECLARE @耗材库区 INT;
|
||||||
|
|
||||||
|
SELECT @库房A = 库房流水号 FROM dbo.库房管理_库房主文件 WHERE 库房编号 = N'KF-A';
|
||||||
|
SELECT @库区A = 库区流水号 FROM dbo.库房管理_库区主文件 WHERE 库房流水号 = @库房A AND 库区编号 = N'A01';
|
||||||
|
SELECT @毛坯库 = 库房流水号 FROM dbo.库房管理_库房主文件 WHERE 库房编号 = N'KF-MP';
|
||||||
|
SELECT @毛坯库区 = 库区流水号 FROM dbo.库房管理_库区主文件 WHERE 库房流水号 = @毛坯库 AND 库区编号 = N'MP';
|
||||||
|
SELECT @耗材库 = 库房流水号 FROM dbo.库房管理_库房主文件 WHERE 库房编号 = N'KF-HC';
|
||||||
|
SELECT @耗材库区 = 库区流水号 FROM dbo.库房管理_库区主文件 WHERE 库房流水号 = @耗材库 AND 库区编号 = N'HC';
|
||||||
|
|
||||||
|
UPDATE h
|
||||||
|
SET 库房流水号 = @毛坯库,
|
||||||
|
库区流水号 = @毛坯库区,
|
||||||
|
库位状态 = ISNULL(h.库位状态, N'空库位'),
|
||||||
|
修改人 = 0,
|
||||||
|
修改时间 = GETDATE()
|
||||||
|
FROM dbo.库存管理_货位主文件 h
|
||||||
|
WHERE h.货位名称 LIKE N'%毛坯%';
|
||||||
|
|
||||||
|
UPDATE h
|
||||||
|
SET 库房流水号 = @耗材库,
|
||||||
|
库区流水号 = @耗材库区,
|
||||||
|
库位状态 = ISNULL(h.库位状态, N'空库位'),
|
||||||
|
修改人 = 0,
|
||||||
|
修改时间 = GETDATE()
|
||||||
|
FROM dbo.库存管理_货位主文件 h
|
||||||
|
WHERE h.货位名称 LIKE N'%耗材%';
|
||||||
|
|
||||||
|
UPDATE h
|
||||||
|
SET 库房流水号 = @库房A,
|
||||||
|
库区流水号 = @库区A,
|
||||||
|
库位状态 = ISNULL(h.库位状态, N'空库位'),
|
||||||
|
修改人 = 0,
|
||||||
|
修改时间 = GETDATE()
|
||||||
|
FROM dbo.库存管理_货位主文件 h
|
||||||
|
LEFT JOIN dbo.库房管理_库房主文件 k ON h.库房流水号 = k.库房流水号
|
||||||
|
WHERE k.库房流水号 IS NULL;
|
||||||
|
|
||||||
|
SELECT
|
||||||
|
SUM(CASE WHEN h.库房流水号 = @毛坯库 THEN 1 ELSE 0 END) AS 一楼毛坯库库位数,
|
||||||
|
SUM(CASE WHEN h.库房流水号 = @耗材库 THEN 1 ELSE 0 END) AS 耗材库库位数,
|
||||||
|
SUM(CASE WHEN h.库房流水号 = @库房A THEN 1 ELSE 0 END) AS 库房A区库位数,
|
||||||
|
SUM(CASE WHEN h.库房流水号 IS NULL THEN 1 ELSE 0 END) AS 未归类库位数
|
||||||
|
FROM dbo.库存管理_货位主文件 h;
|
||||||
|
GO
|
||||||
40
sql/库房管理_库位找物料_查询数据_测试库_20260731.sql
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
/*
|
||||||
|
库房管理库位找物料隔离查询脚本(测试库 ERPTOOL_JY_20250826Back)
|
||||||
|
修改人:Ld 修改时间:2026-07-31 10:03:26;
|
||||||
|
说明:新增独立查询过程供库房管理新页面“库位找物料”使用,不修改原仓储管理物料库位查询过程。
|
||||||
|
*/
|
||||||
|
|
||||||
|
SET NOCOUNT ON;
|
||||||
|
GO
|
||||||
|
|
||||||
|
IF OBJECT_ID(N'dbo.库房管理_库位找物料_查询数据', N'P') IS NOT NULL
|
||||||
|
DROP PROCEDURE dbo.库房管理_库位找物料_查询数据;
|
||||||
|
GO
|
||||||
|
|
||||||
|
CREATE PROCEDURE dbo.库房管理_库位找物料_查询数据
|
||||||
|
@库位 NVARCHAR(50) = NULL,
|
||||||
|
@库位_check BIT = 0
|
||||||
|
AS
|
||||||
|
BEGIN
|
||||||
|
SET NOCOUNT ON;
|
||||||
|
|
||||||
|
SELECT
|
||||||
|
m.名称,
|
||||||
|
m.代号,
|
||||||
|
m.物料编码,
|
||||||
|
h.货位名称,
|
||||||
|
m.物料流水号,
|
||||||
|
h.货位流水号,
|
||||||
|
k.库房名称,
|
||||||
|
q.库区名称,
|
||||||
|
d.货位存量 AS 库存数量,
|
||||||
|
CASE WHEN ISNULL(d.货位存量, 0) > 0 THEN N'有库存' ELSE N'' END AS 库存状态
|
||||||
|
FROM dbo.库存管理_物料主文件_基本 m
|
||||||
|
LEFT JOIN dbo.库存管理_货位主文件 h ON m.货位流水号 = h.货位流水号
|
||||||
|
LEFT JOIN dbo.库房管理_库房主文件 k ON h.库房流水号 = k.库房流水号
|
||||||
|
LEFT JOIN dbo.库房管理_库区主文件 q ON h.库区流水号 = q.库区流水号
|
||||||
|
LEFT JOIN dbo.库存管理_物料与货位对照表 d ON m.物料流水号 = d.物料流水号 AND h.货位流水号 = d.货位流水号
|
||||||
|
WHERE (@库位_check = 0 OR h.货位名称 LIKE N'%' + ISNULL(@库位, N'') + N'%')
|
||||||
|
ORDER BY h.货位名称, m.物料编码;
|
||||||
|
END
|
||||||
|
GO
|
||||||
110
sql/库房管理_测试库菜单_20260730.sql
Normal file
@@ -0,0 +1,110 @@
|
|||||||
|
/* 修改人:Ld 修改时间:2026-07-30 09:05:58; 新增库房管理测试库菜单,仅给已有库位管理权限的角色授权 */
|
||||||
|
SET XACT_ABORT ON;
|
||||||
|
BEGIN TRAN;
|
||||||
|
|
||||||
|
DECLARE @ModuleId INT;
|
||||||
|
DECLARE @ParentId INT = 42;
|
||||||
|
|
||||||
|
SELECT @ModuleId = id
|
||||||
|
FROM dbo.基础表_模块信息
|
||||||
|
WHERE [path] = N'WarehouseManagement/WarehouseRoomManagement'
|
||||||
|
OR component = N'/WarehouseManagement/WarehouseRoomManagement'
|
||||||
|
OR title = N'库房管理';
|
||||||
|
|
||||||
|
IF @ModuleId IS NULL
|
||||||
|
BEGIN
|
||||||
|
INSERT INTO dbo.基础表_模块信息
|
||||||
|
(
|
||||||
|
[path],
|
||||||
|
component,
|
||||||
|
redirect,
|
||||||
|
name,
|
||||||
|
title,
|
||||||
|
icon,
|
||||||
|
是否通知,
|
||||||
|
消息通知来源,
|
||||||
|
通知条件,
|
||||||
|
dashboardIcon,
|
||||||
|
是否禁用
|
||||||
|
)
|
||||||
|
VALUES
|
||||||
|
(
|
||||||
|
N'WarehouseManagement/WarehouseRoomManagement',
|
||||||
|
N'/WarehouseManagement/WarehouseRoomManagement',
|
||||||
|
NULL,
|
||||||
|
N'WarehouseRoomManagement',
|
||||||
|
N'库房管理',
|
||||||
|
N'MaterialArrivalManagement',
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
0
|
||||||
|
);
|
||||||
|
|
||||||
|
SET @ModuleId = SCOPE_IDENTITY();
|
||||||
|
END
|
||||||
|
ELSE
|
||||||
|
BEGIN
|
||||||
|
UPDATE dbo.基础表_模块信息
|
||||||
|
SET [path] = N'WarehouseManagement/WarehouseRoomManagement',
|
||||||
|
component = N'/WarehouseManagement/WarehouseRoomManagement',
|
||||||
|
redirect = NULL,
|
||||||
|
name = N'WarehouseRoomManagement',
|
||||||
|
title = N'库房管理',
|
||||||
|
icon = N'MaterialArrivalManagement',
|
||||||
|
是否禁用 = 0
|
||||||
|
WHERE id = @ModuleId;
|
||||||
|
END;
|
||||||
|
|
||||||
|
;WITH RoleList AS
|
||||||
|
(
|
||||||
|
SELECT DISTINCT 角色编号
|
||||||
|
FROM dbo.基础表_角色模块信息
|
||||||
|
WHERE id = 92
|
||||||
|
AND pid = @ParentId
|
||||||
|
AND ISNULL(是否启用, 1) = 1
|
||||||
|
)
|
||||||
|
INSERT INTO dbo.基础表_角色模块信息
|
||||||
|
(
|
||||||
|
id,
|
||||||
|
pid,
|
||||||
|
模块顺序,
|
||||||
|
角色编号,
|
||||||
|
是否启用,
|
||||||
|
角色模块顺序
|
||||||
|
)
|
||||||
|
SELECT
|
||||||
|
@ModuleId,
|
||||||
|
@ParentId,
|
||||||
|
@ModuleId,
|
||||||
|
RoleList.角色编号,
|
||||||
|
1,
|
||||||
|
ISNULL(RoleOrder.MaxOrder, 0) + 1
|
||||||
|
FROM RoleList
|
||||||
|
OUTER APPLY
|
||||||
|
(
|
||||||
|
SELECT MAX(角色模块顺序) AS MaxOrder
|
||||||
|
FROM dbo.基础表_角色模块信息
|
||||||
|
WHERE 角色编号 = RoleList.角色编号
|
||||||
|
AND pid = @ParentId
|
||||||
|
) RoleOrder
|
||||||
|
WHERE NOT EXISTS
|
||||||
|
(
|
||||||
|
SELECT 1
|
||||||
|
FROM dbo.基础表_角色模块信息
|
||||||
|
WHERE id = @ModuleId
|
||||||
|
AND pid = @ParentId
|
||||||
|
AND 角色编号 = RoleList.角色编号
|
||||||
|
);
|
||||||
|
|
||||||
|
SELECT @ModuleId AS 库房管理模块ID;
|
||||||
|
SELECT id, [path], component, name, title, icon, 是否禁用
|
||||||
|
FROM dbo.基础表_模块信息
|
||||||
|
WHERE id = @ModuleId;
|
||||||
|
SELECT id, pid, 角色编号, 是否启用, 角色模块顺序
|
||||||
|
FROM dbo.基础表_角色模块信息
|
||||||
|
WHERE id = @ModuleId
|
||||||
|
ORDER BY 角色编号;
|
||||||
|
|
||||||
|
COMMIT TRAN;
|
||||||
117
sql/库房管理_物料库位_分页查询_测试库_20260731.sql
Normal file
@@ -0,0 +1,117 @@
|
|||||||
|
/*
|
||||||
|
库房管理物料库位分页查询脚本(测试库 ERPTOOL_JY_20250826Back)
|
||||||
|
修改人:Ld 修改时间:2026-07-31 13:05:48;
|
||||||
|
说明:新增独立分页查询过程供库房管理新页面“物料综合查询/物料找库位/库位找物料”使用,不修改原仓储管理过程。
|
||||||
|
*/
|
||||||
|
|
||||||
|
SET NOCOUNT ON;
|
||||||
|
GO
|
||||||
|
|
||||||
|
IF OBJECT_ID(N'dbo.仓储管理_物料库位_分页查询_库房管理', N'P') IS NOT NULL
|
||||||
|
DROP PROCEDURE dbo.仓储管理_物料库位_分页查询_库房管理;
|
||||||
|
GO
|
||||||
|
|
||||||
|
CREATE PROCEDURE dbo.仓储管理_物料库位_分页查询_库房管理
|
||||||
|
@查询方向 NVARCHAR(20) = N'综合',
|
||||||
|
@关键字 NVARCHAR(50) = NULL,
|
||||||
|
@关键字_check BIT = 0,
|
||||||
|
@库房名称 NVARCHAR(50) = NULL,
|
||||||
|
@库房名称_check BIT = 0,
|
||||||
|
@PageCurrent INT = NULL,
|
||||||
|
@PageSize INT = NULL,
|
||||||
|
@PageCount INT = NULL OUTPUT,
|
||||||
|
@ItemCount INT = NULL OUTPUT
|
||||||
|
AS
|
||||||
|
BEGIN
|
||||||
|
SET NOCOUNT ON;
|
||||||
|
|
||||||
|
DECLARE @tbname NVARCHAR(MAX);
|
||||||
|
DECLARE @fieldkey NVARCHAR(1000);
|
||||||
|
DECLARE @where NVARCHAR(MAX);
|
||||||
|
DECLARE @fieldshow NVARCHAR(MAX);
|
||||||
|
DECLARE @fieldOrder NVARCHAR(1000);
|
||||||
|
DECLARE @keyword NVARCHAR(100);
|
||||||
|
DECLARE @warehouse NVARCHAR(100);
|
||||||
|
|
||||||
|
SET @keyword = REPLACE(ISNULL(@关键字, N''), N'''', N'''''');
|
||||||
|
SET @warehouse = REPLACE(ISNULL(@库房名称, N''), N'''', N'''''');
|
||||||
|
SET @PageCurrent = ISNULL(NULLIF(@PageCurrent, 0), 1);
|
||||||
|
SET @PageSize = ISNULL(NULLIF(@PageSize, 0), 20);
|
||||||
|
|
||||||
|
SET @tbname = N'(
|
||||||
|
SELECT
|
||||||
|
ROW_NUMBER() OVER (ORDER BY ISNULL(A.货位名称, N''''), ISNULL(A.物料编码, N''''), A.物料与货位流水号) AS 分页流水号,
|
||||||
|
A.物料名称 AS 名称,
|
||||||
|
A.图号或型号 AS 代号,
|
||||||
|
A.物料编码,
|
||||||
|
A.物料名称,
|
||||||
|
A.图号或型号,
|
||||||
|
A.类型,
|
||||||
|
A.单位,
|
||||||
|
A.库存,
|
||||||
|
A.库存 AS 库存数量,
|
||||||
|
A.货位名称,
|
||||||
|
A.货位名称 AS 库位,
|
||||||
|
A.物料与货位流水号,
|
||||||
|
ISNULL(m.物料流水号, 0) AS 物料流水号,
|
||||||
|
A.货位流水号,
|
||||||
|
A.货位流水号 AS 库位流水号,
|
||||||
|
A.批次编号,
|
||||||
|
A.编辑人,
|
||||||
|
A.编辑时间,
|
||||||
|
ISNULL(k.库房名称,
|
||||||
|
CASE
|
||||||
|
WHEN A.货位名称 LIKE N''%毛坯%'' THEN N''一楼毛坯库''
|
||||||
|
WHEN A.货位名称 LIKE N''%耗材%'' THEN N''耗材库''
|
||||||
|
WHEN A.货位名称 LIKE N''[A-Za-z][0-9]%-[0-9]%'' AND A.货位名称 NOT LIKE N''%-%-%'' THEN N''二楼隔层仓库''
|
||||||
|
WHEN A.货位名称 LIKE N''[0-9][0-9]-[0-9][0-9]-[0-9][0-9]'' THEN N''立库仓库''
|
||||||
|
WHEN A.货位名称 LIKE N''[0-9]-[0-9][0-9]-[0-9][0-9]-[0-9][0-9]'' THEN N''三楼仓库''
|
||||||
|
ELSE N''库房A区''
|
||||||
|
END) AS 库房名称,
|
||||||
|
ISNULL(q.库区名称,
|
||||||
|
CASE
|
||||||
|
WHEN A.货位名称 LIKE N''%毛坯%'' THEN N''一楼毛坯库区''
|
||||||
|
WHEN A.货位名称 LIKE N''%耗材%'' THEN N''耗材库区''
|
||||||
|
WHEN A.货位名称 LIKE N''[A-Za-z][0-9]%-[0-9]%'' AND A.货位名称 NOT LIKE N''%-%-%'' THEN N''二楼隔层库区''
|
||||||
|
WHEN A.货位名称 LIKE N''[0-9][0-9]-[0-9][0-9]-[0-9][0-9]'' THEN N''立库库区''
|
||||||
|
WHEN A.货位名称 LIKE N''[0-9]-[0-9][0-9]-[0-9][0-9]-[0-9][0-9]'' THEN N''三楼可视化库区''
|
||||||
|
ELSE N''标准库位区''
|
||||||
|
END) AS 库区名称,
|
||||||
|
CASE WHEN ISNULL(A.库存, 0) > 0 THEN N''有库存'' ELSE N'''' END AS 库存状态
|
||||||
|
FROM dbo.外购件库存_视图 A
|
||||||
|
LEFT JOIN dbo.库存管理_货位主文件 h ON A.货位流水号 = h.货位流水号
|
||||||
|
LEFT JOIN dbo.库存管理_物料主文件_基本 m ON A.物料编码 = m.物料编码
|
||||||
|
LEFT JOIN dbo.库房管理_库房主文件 k ON h.库房流水号 = k.库房流水号
|
||||||
|
LEFT JOIN dbo.库房管理_库区主文件 q ON h.库区流水号 = q.库区流水号
|
||||||
|
WHERE ((ISNULL(A.批次编号, N'''') <> N'''' AND ISNULL(A.库存, 0) > 0) OR ISNULL(A.批次编号, N'''') = N'''')
|
||||||
|
) AS T';
|
||||||
|
SET @fieldkey = N'分页流水号';
|
||||||
|
SET @fieldOrder = N'库位 ASC, 物料编码 ASC, 物料与货位流水号 ASC';
|
||||||
|
SET @fieldshow = N'名称,代号,物料编码,物料名称,图号或型号,类型,单位,库存,库存数量,货位名称,库位,物料与货位流水号,物料流水号,货位流水号,库位流水号,批次编号,编辑人,编辑时间,库房名称,库区名称,库存状态';
|
||||||
|
SET @where = N'1 = 1';
|
||||||
|
|
||||||
|
IF @关键字_check = 1 AND @keyword <> N''
|
||||||
|
BEGIN
|
||||||
|
IF @查询方向 = N'逆向'
|
||||||
|
SET @where = @where + N' AND (库位 LIKE N''%' + @keyword + N'%'' OR 货位名称 LIKE N''%' + @keyword + N'%'')';
|
||||||
|
ELSE IF @查询方向 = N'正向'
|
||||||
|
SET @where = @where + N' AND (名称 LIKE N''%' + @keyword + N'%'' OR 代号 LIKE N''%' + @keyword + N'%'' OR 物料名称 LIKE N''%' + @keyword + N'%'' OR 图号或型号 LIKE N''%' + @keyword + N'%'' OR 物料编码 LIKE N''%' + @keyword + N'%'')';
|
||||||
|
ELSE
|
||||||
|
SET @where = @where + N' AND (名称 LIKE N''%' + @keyword + N'%'' OR 代号 LIKE N''%' + @keyword + N'%'' OR 物料名称 LIKE N''%' + @keyword + N'%'' OR 图号或型号 LIKE N''%' + @keyword + N'%'' OR 物料编码 LIKE N''%' + @keyword + N'%'' OR 库位 LIKE N''%' + @keyword + N'%'' OR 货位名称 LIKE N''%' + @keyword + N'%'')';
|
||||||
|
END
|
||||||
|
|
||||||
|
IF @库房名称_check = 1 AND @warehouse <> N''
|
||||||
|
SET @where = @where + N' AND 库房名称 = N''' + @warehouse + N'''';
|
||||||
|
|
||||||
|
EXEC dbo.sp_xt_pagesplit2
|
||||||
|
@tbname,
|
||||||
|
@fieldkey,
|
||||||
|
@where,
|
||||||
|
@fieldshow,
|
||||||
|
@fieldOrder,
|
||||||
|
@PageCurrent,
|
||||||
|
@PageSize,
|
||||||
|
@PageCount OUTPUT,
|
||||||
|
@ItemCount OUTPUT;
|
||||||
|
END
|
||||||
|
GO
|
||||||
818
sql/库房管理_隔离实施_测试库_20260730.sql
Normal file
@@ -0,0 +1,818 @@
|
|||||||
|
/*
|
||||||
|
库房管理隔离实施脚本(测试库 ERPTOOL_JY_20250826Back)
|
||||||
|
修改人:Ld 修改时间:2026-07-30 09:23:13;
|
||||||
|
说明:
|
||||||
|
1. 新增库房、库区、库房业务记录表。
|
||||||
|
2. 对库存管理_货位主文件仅补充可空字段,不改变原字段和原存储过程。
|
||||||
|
3. 新增存储过程全部使用“库房管理_”前缀,不覆盖现有“仓储管理_”过程。
|
||||||
|
*/
|
||||||
|
|
||||||
|
SET NOCOUNT ON;
|
||||||
|
GO
|
||||||
|
|
||||||
|
IF OBJECT_ID(N'dbo.库房管理_库房主文件', N'U') IS NULL
|
||||||
|
BEGIN
|
||||||
|
CREATE TABLE dbo.库房管理_库房主文件
|
||||||
|
(
|
||||||
|
库房流水号 INT IDENTITY(1,1) NOT NULL CONSTRAINT PK_库房管理_库房主文件 PRIMARY KEY,
|
||||||
|
库房编号 NVARCHAR(50) NOT NULL,
|
||||||
|
库房名称 NVARCHAR(100) NOT NULL,
|
||||||
|
库房类型 NVARCHAR(50) NULL,
|
||||||
|
地址 NVARCHAR(200) NULL,
|
||||||
|
负责人 INT NULL,
|
||||||
|
状态 NVARCHAR(20) NOT NULL CONSTRAINT DF_库房管理_库房主文件_状态 DEFAULT(N'启用'),
|
||||||
|
排数 INT NOT NULL CONSTRAINT DF_库房管理_库房主文件_排数 DEFAULT(8),
|
||||||
|
每排列数 INT NOT NULL CONSTRAINT DF_库房管理_库房主文件_每排列数 DEFAULT(24),
|
||||||
|
层数 INT NOT NULL CONSTRAINT DF_库房管理_库房主文件_层数 DEFAULT(3),
|
||||||
|
备注 NVARCHAR(500) NULL,
|
||||||
|
创建人 INT NULL,
|
||||||
|
创建时间 DATETIME NOT NULL CONSTRAINT DF_库房管理_库房主文件_创建时间 DEFAULT(GETDATE()),
|
||||||
|
修改人 INT NULL,
|
||||||
|
修改时间 DATETIME NULL,
|
||||||
|
CONSTRAINT UQ_库房管理_库房主文件_库房编号 UNIQUE(库房编号)
|
||||||
|
);
|
||||||
|
END
|
||||||
|
GO
|
||||||
|
|
||||||
|
IF OBJECT_ID(N'dbo.库房管理_库区主文件', N'U') IS NULL
|
||||||
|
BEGIN
|
||||||
|
CREATE TABLE dbo.库房管理_库区主文件
|
||||||
|
(
|
||||||
|
库区流水号 INT IDENTITY(1,1) NOT NULL CONSTRAINT PK_库房管理_库区主文件 PRIMARY KEY,
|
||||||
|
库房流水号 INT NOT NULL,
|
||||||
|
库区编号 NVARCHAR(50) NOT NULL,
|
||||||
|
库区名称 NVARCHAR(100) NOT NULL,
|
||||||
|
库区类型 NVARCHAR(50) NULL,
|
||||||
|
状态 NVARCHAR(20) NOT NULL CONSTRAINT DF_库房管理_库区主文件_状态 DEFAULT(N'启用'),
|
||||||
|
排序 INT NULL,
|
||||||
|
备注 NVARCHAR(500) NULL,
|
||||||
|
创建人 INT NULL,
|
||||||
|
创建时间 DATETIME NOT NULL CONSTRAINT DF_库房管理_库区主文件_创建时间 DEFAULT(GETDATE()),
|
||||||
|
修改人 INT NULL,
|
||||||
|
修改时间 DATETIME NULL,
|
||||||
|
CONSTRAINT FK_库房管理_库区主文件_库房 FOREIGN KEY(库房流水号) REFERENCES dbo.库房管理_库房主文件(库房流水号),
|
||||||
|
CONSTRAINT UQ_库房管理_库区主文件_库房库区编号 UNIQUE(库房流水号, 库区编号)
|
||||||
|
);
|
||||||
|
END
|
||||||
|
GO
|
||||||
|
|
||||||
|
IF OBJECT_ID(N'dbo.库房管理_业务记录', N'U') IS NULL
|
||||||
|
BEGIN
|
||||||
|
CREATE TABLE dbo.库房管理_业务记录
|
||||||
|
(
|
||||||
|
业务记录流水号 INT IDENTITY(1,1) NOT NULL CONSTRAINT PK_库房管理_业务记录 PRIMARY KEY,
|
||||||
|
业务类型 NVARCHAR(50) NOT NULL,
|
||||||
|
业务单号 NVARCHAR(100) NULL,
|
||||||
|
库房流水号 INT NULL,
|
||||||
|
库区流水号 INT NULL,
|
||||||
|
货位流水号 INT NULL,
|
||||||
|
物料流水号 INT NULL,
|
||||||
|
物料与货位流水号 INT NULL,
|
||||||
|
变动数量 FLOAT NULL,
|
||||||
|
变动前数量 FLOAT NULL,
|
||||||
|
变动后数量 FLOAT NULL,
|
||||||
|
备注 NVARCHAR(500) NULL,
|
||||||
|
操作人 INT NULL,
|
||||||
|
操作时间 DATETIME NOT NULL CONSTRAINT DF_库房管理_业务记录_操作时间 DEFAULT(GETDATE()),
|
||||||
|
CONSTRAINT FK_库房管理_业务记录_库房 FOREIGN KEY(库房流水号) REFERENCES dbo.库房管理_库房主文件(库房流水号),
|
||||||
|
CONSTRAINT FK_库房管理_业务记录_库区 FOREIGN KEY(库区流水号) REFERENCES dbo.库房管理_库区主文件(库区流水号)
|
||||||
|
);
|
||||||
|
END
|
||||||
|
GO
|
||||||
|
|
||||||
|
IF COL_LENGTH(N'dbo.库存管理_货位主文件', N'库房流水号') IS NULL
|
||||||
|
ALTER TABLE dbo.库存管理_货位主文件 ADD 库房流水号 INT NULL;
|
||||||
|
GO
|
||||||
|
IF COL_LENGTH(N'dbo.库存管理_货位主文件', N'库区流水号') IS NULL
|
||||||
|
ALTER TABLE dbo.库存管理_货位主文件 ADD 库区流水号 INT NULL;
|
||||||
|
GO
|
||||||
|
IF COL_LENGTH(N'dbo.库存管理_货位主文件', N'排号') IS NULL
|
||||||
|
ALTER TABLE dbo.库存管理_货位主文件 ADD 排号 INT NULL;
|
||||||
|
GO
|
||||||
|
IF COL_LENGTH(N'dbo.库存管理_货位主文件', N'列号') IS NULL
|
||||||
|
ALTER TABLE dbo.库存管理_货位主文件 ADD 列号 INT NULL;
|
||||||
|
GO
|
||||||
|
IF COL_LENGTH(N'dbo.库存管理_货位主文件', N'层号') IS NULL
|
||||||
|
ALTER TABLE dbo.库存管理_货位主文件 ADD 层号 INT NULL;
|
||||||
|
GO
|
||||||
|
IF COL_LENGTH(N'dbo.库存管理_货位主文件', N'库位状态') IS NULL
|
||||||
|
ALTER TABLE dbo.库存管理_货位主文件 ADD 库位状态 NVARCHAR(20) NULL;
|
||||||
|
GO
|
||||||
|
IF COL_LENGTH(N'dbo.库存管理_货位主文件', N'库位容量') IS NULL
|
||||||
|
ALTER TABLE dbo.库存管理_货位主文件 ADD 库位容量 FLOAT NULL;
|
||||||
|
GO
|
||||||
|
IF COL_LENGTH(N'dbo.库存管理_货位主文件', N'是否启用') IS NULL
|
||||||
|
ALTER TABLE dbo.库存管理_货位主文件 ADD 是否启用 BIT NOT NULL CONSTRAINT DF_库存管理_货位主文件_是否启用 DEFAULT(1);
|
||||||
|
GO
|
||||||
|
IF COL_LENGTH(N'dbo.库存管理_货位主文件', N'修改人') IS NULL
|
||||||
|
ALTER TABLE dbo.库存管理_货位主文件 ADD 修改人 INT NULL;
|
||||||
|
GO
|
||||||
|
IF COL_LENGTH(N'dbo.库存管理_货位主文件', N'修改时间') IS NULL
|
||||||
|
ALTER TABLE dbo.库存管理_货位主文件 ADD 修改时间 DATETIME NULL;
|
||||||
|
GO
|
||||||
|
|
||||||
|
IF NOT EXISTS (SELECT 1 FROM sys.foreign_keys WHERE name = N'FK_库存管理_货位主文件_库房管理库房')
|
||||||
|
BEGIN
|
||||||
|
ALTER TABLE dbo.库存管理_货位主文件 WITH CHECK
|
||||||
|
ADD CONSTRAINT FK_库存管理_货位主文件_库房管理库房 FOREIGN KEY(库房流水号) REFERENCES dbo.库房管理_库房主文件(库房流水号);
|
||||||
|
END
|
||||||
|
GO
|
||||||
|
IF NOT EXISTS (SELECT 1 FROM sys.foreign_keys WHERE name = N'FK_库存管理_货位主文件_库房管理库区')
|
||||||
|
BEGIN
|
||||||
|
ALTER TABLE dbo.库存管理_货位主文件 WITH CHECK
|
||||||
|
ADD CONSTRAINT FK_库存管理_货位主文件_库房管理库区 FOREIGN KEY(库区流水号) REFERENCES dbo.库房管理_库区主文件(库区流水号);
|
||||||
|
END
|
||||||
|
GO
|
||||||
|
|
||||||
|
IF NOT EXISTS (SELECT 1 FROM sys.indexes WHERE object_id = OBJECT_ID(N'dbo.库存管理_货位主文件') AND name = N'IX_库存管理_货位主文件_库房库区排列层')
|
||||||
|
CREATE INDEX IX_库存管理_货位主文件_库房库区排列层 ON dbo.库存管理_货位主文件(库房流水号, 库区流水号, 排号, 列号, 层号);
|
||||||
|
GO
|
||||||
|
IF NOT EXISTS (SELECT 1 FROM sys.indexes WHERE object_id = OBJECT_ID(N'dbo.库房管理_业务记录') AND name = N'IX_库房管理_业务记录_库位物料时间')
|
||||||
|
CREATE INDEX IX_库房管理_业务记录_库位物料时间 ON dbo.库房管理_业务记录(货位流水号, 物料流水号, 操作时间 DESC);
|
||||||
|
GO
|
||||||
|
|
||||||
|
IF NOT EXISTS (SELECT 1 FROM dbo.库房管理_库房主文件 WHERE 库房编号 = N'KF-2F')
|
||||||
|
BEGIN
|
||||||
|
INSERT INTO dbo.库房管理_库房主文件(库房编号, 库房名称, 库房类型, 地址, 状态, 排数, 每排列数, 层数, 备注, 创建人)
|
||||||
|
VALUES(N'KF-2F', N'二楼隔层仓库', N'隔层仓库', N'二楼隔层', N'启用', 1, 99, 1, N'库位格式:字母数字-数字,例如 A1-1', 0);
|
||||||
|
END
|
||||||
|
GO
|
||||||
|
IF NOT EXISTS (SELECT 1 FROM dbo.库房管理_库房主文件 WHERE 库房编号 = N'KF-LK')
|
||||||
|
BEGIN
|
||||||
|
INSERT INTO dbo.库房管理_库房主文件(库房编号, 库房名称, 库房类型, 地址, 状态, 排数, 每排列数, 层数, 备注, 创建人)
|
||||||
|
VALUES(N'KF-LK', N'立库仓库', N'立库仓库', N'立库区域', N'启用', 99, 99, 99, N'库位格式:xx-xx-xx,例如 01-01-01', 0);
|
||||||
|
END
|
||||||
|
GO
|
||||||
|
IF NOT EXISTS (SELECT 1 FROM dbo.库房管理_库房主文件 WHERE 库房编号 = N'KF-3F')
|
||||||
|
BEGIN
|
||||||
|
INSERT INTO dbo.库房管理_库房主文件(库房编号, 库房名称, 库房类型, 地址, 状态, 排数, 每排列数, 层数, 备注, 创建人)
|
||||||
|
VALUES(N'KF-3F', N'三楼仓库', N'三楼可视化仓库', N'三楼仓库', N'启用', 8, 24, 3, N'库位格式:x-xx-xx-xx,可视化界面按三楼布局展示', 0);
|
||||||
|
END
|
||||||
|
GO
|
||||||
|
|
||||||
|
;WITH DefaultArea AS
|
||||||
|
(
|
||||||
|
SELECT N'KF-2F' AS 库房编号, N'2F' AS 库区编号, N'二楼隔层库区' AS 库区名称, N'隔层库区' AS 库区类型, N'字母数字-数字库位区' AS 备注
|
||||||
|
UNION ALL SELECT N'KF-LK', N'LK', N'立库库区', N'立库库区', N'xx-xx-xx 库位区'
|
||||||
|
UNION ALL SELECT N'KF-3F', N'3F', N'三楼可视化库区', N'三楼库区', N'x-xx-xx-xx 可视化库位区'
|
||||||
|
)
|
||||||
|
INSERT INTO dbo.库房管理_库区主文件(库房流水号, 库区编号, 库区名称, 库区类型, 排序, 备注, 创建人)
|
||||||
|
SELECT k.库房流水号, a.库区编号, a.库区名称, a.库区类型, 1, a.备注, 0
|
||||||
|
FROM DefaultArea a
|
||||||
|
INNER JOIN dbo.库房管理_库房主文件 k ON a.库房编号 = k.库房编号
|
||||||
|
WHERE NOT EXISTS
|
||||||
|
(
|
||||||
|
SELECT 1
|
||||||
|
FROM dbo.库房管理_库区主文件 x
|
||||||
|
WHERE x.库房流水号 = k.库房流水号
|
||||||
|
AND x.库区编号 = a.库区编号
|
||||||
|
);
|
||||||
|
GO
|
||||||
|
|
||||||
|
IF EXISTS (SELECT 1 FROM dbo.库存管理_货位主文件 WHERE 货位名称 = N'KF-A-01-01-1')
|
||||||
|
BEGIN
|
||||||
|
UPDATE dbo.库存管理_货位主文件
|
||||||
|
SET 货位名称 = N'1-01-01-01',
|
||||||
|
修改人 = 0,
|
||||||
|
修改时间 = GETDATE()
|
||||||
|
WHERE 货位名称 = N'KF-A-01-01-1';
|
||||||
|
END
|
||||||
|
GO
|
||||||
|
|
||||||
|
IF OBJECT_ID(N'dbo.库房管理_库位编码归属_同步', N'P') IS NOT NULL
|
||||||
|
DROP PROCEDURE dbo.库房管理_库位编码归属_同步;
|
||||||
|
GO
|
||||||
|
CREATE PROCEDURE dbo.库房管理_库位编码归属_同步
|
||||||
|
AS
|
||||||
|
BEGIN
|
||||||
|
SET NOCOUNT ON;
|
||||||
|
|
||||||
|
DECLARE @二楼库房 INT;
|
||||||
|
DECLARE @二楼库区 INT;
|
||||||
|
DECLARE @立库库房 INT;
|
||||||
|
DECLARE @立库库区 INT;
|
||||||
|
DECLARE @三楼库房 INT;
|
||||||
|
DECLARE @三楼库区 INT;
|
||||||
|
|
||||||
|
SELECT @二楼库房 = 库房流水号 FROM dbo.库房管理_库房主文件 WHERE 库房编号 = N'KF-2F';
|
||||||
|
SELECT @二楼库区 = 库区流水号 FROM dbo.库房管理_库区主文件 WHERE 库房流水号 = @二楼库房 AND 库区编号 = N'2F';
|
||||||
|
SELECT @立库库房 = 库房流水号 FROM dbo.库房管理_库房主文件 WHERE 库房编号 = N'KF-LK';
|
||||||
|
SELECT @立库库区 = 库区流水号 FROM dbo.库房管理_库区主文件 WHERE 库房流水号 = @立库库房 AND 库区编号 = N'LK';
|
||||||
|
SELECT @三楼库房 = 库房流水号 FROM dbo.库房管理_库房主文件 WHERE 库房编号 = N'KF-3F';
|
||||||
|
SELECT @三楼库区 = 库区流水号 FROM dbo.库房管理_库区主文件 WHERE 库房流水号 = @三楼库房 AND 库区编号 = N'3F';
|
||||||
|
|
||||||
|
UPDATE h
|
||||||
|
SET 库房流水号 = @二楼库房,
|
||||||
|
库区流水号 = @二楼库区,
|
||||||
|
排号 = NULL,
|
||||||
|
列号 = NULL,
|
||||||
|
层号 = NULL,
|
||||||
|
库位状态 = ISNULL(h.库位状态, N'空库位'),
|
||||||
|
修改时间 = GETDATE()
|
||||||
|
FROM dbo.库存管理_货位主文件 h
|
||||||
|
WHERE h.货位名称 LIKE N'[A-Za-z][0-9]%-[0-9]%'
|
||||||
|
AND LEN(h.货位名称) - LEN(REPLACE(h.货位名称, N'-', N'')) = 1;
|
||||||
|
|
||||||
|
UPDATE h
|
||||||
|
SET 库房流水号 = @立库库房,
|
||||||
|
库区流水号 = @立库库区,
|
||||||
|
排号 = CONVERT(INT, PARSENAME(REPLACE(h.货位名称, N'-', N'.'), 3)),
|
||||||
|
列号 = CONVERT(INT, PARSENAME(REPLACE(h.货位名称, N'-', N'.'), 2)),
|
||||||
|
层号 = CONVERT(INT, PARSENAME(REPLACE(h.货位名称, N'-', N'.'), 1)),
|
||||||
|
库位状态 = ISNULL(h.库位状态, N'空库位'),
|
||||||
|
修改时间 = GETDATE()
|
||||||
|
FROM dbo.库存管理_货位主文件 h
|
||||||
|
WHERE LEN(h.货位名称) - LEN(REPLACE(h.货位名称, N'-', N'')) = 2
|
||||||
|
AND ISNUMERIC(PARSENAME(REPLACE(h.货位名称, N'-', N'.'), 3)) = 1
|
||||||
|
AND ISNUMERIC(PARSENAME(REPLACE(h.货位名称, N'-', N'.'), 2)) = 1
|
||||||
|
AND ISNUMERIC(PARSENAME(REPLACE(h.货位名称, N'-', N'.'), 1)) = 1;
|
||||||
|
|
||||||
|
UPDATE h
|
||||||
|
SET 库房流水号 = @三楼库房,
|
||||||
|
库区流水号 = @三楼库区,
|
||||||
|
排号 = CONVERT(INT, PARSENAME(REPLACE(h.货位名称, N'-', N'.'), 4)),
|
||||||
|
列号 = CONVERT(INT, PARSENAME(REPLACE(h.货位名称, N'-', N'.'), 3)),
|
||||||
|
层号 = CONVERT(INT, PARSENAME(REPLACE(h.货位名称, N'-', N'.'), 2)),
|
||||||
|
库位状态 = ISNULL(h.库位状态, N'空库位'),
|
||||||
|
修改时间 = GETDATE()
|
||||||
|
FROM dbo.库存管理_货位主文件 h
|
||||||
|
WHERE LEN(h.货位名称) - LEN(REPLACE(h.货位名称, N'-', N'')) = 3
|
||||||
|
AND ISNUMERIC(PARSENAME(REPLACE(h.货位名称, N'-', N'.'), 4)) = 1
|
||||||
|
AND ISNUMERIC(PARSENAME(REPLACE(h.货位名称, N'-', N'.'), 3)) = 1
|
||||||
|
AND ISNUMERIC(PARSENAME(REPLACE(h.货位名称, N'-', N'.'), 2)) = 1
|
||||||
|
AND ISNUMERIC(PARSENAME(REPLACE(h.货位名称, N'-', N'.'), 1)) = 1;
|
||||||
|
|
||||||
|
SELECT
|
||||||
|
SUM(CASE WHEN 库房流水号 = @二楼库房 THEN 1 ELSE 0 END) AS 二楼隔层库位数,
|
||||||
|
SUM(CASE WHEN 库房流水号 = @立库库房 THEN 1 ELSE 0 END) AS 立库库位数,
|
||||||
|
SUM(CASE WHEN 库房流水号 = @三楼库房 THEN 1 ELSE 0 END) AS 三楼库位数
|
||||||
|
FROM dbo.库存管理_货位主文件;
|
||||||
|
END
|
||||||
|
GO
|
||||||
|
|
||||||
|
EXEC dbo.库房管理_库位编码归属_同步;
|
||||||
|
GO
|
||||||
|
|
||||||
|
IF OBJECT_ID(N'dbo.库房管理_库房_查询', N'P') IS NOT NULL
|
||||||
|
DROP PROCEDURE dbo.库房管理_库房_查询;
|
||||||
|
GO
|
||||||
|
CREATE PROCEDURE dbo.库房管理_库房_查询
|
||||||
|
@库房名称_check BIT = 0,
|
||||||
|
@库房名称 NVARCHAR(100) = NULL,
|
||||||
|
@状态_check BIT = 0,
|
||||||
|
@状态 NVARCHAR(20) = NULL
|
||||||
|
AS
|
||||||
|
BEGIN
|
||||||
|
SET NOCOUNT ON;
|
||||||
|
SELECT
|
||||||
|
k.库房流水号,
|
||||||
|
k.库房编号,
|
||||||
|
k.库房名称,
|
||||||
|
k.库房类型,
|
||||||
|
k.地址,
|
||||||
|
k.负责人,
|
||||||
|
k.状态,
|
||||||
|
k.排数,
|
||||||
|
k.每排列数,
|
||||||
|
k.层数,
|
||||||
|
k.备注,
|
||||||
|
ISNULL(q.库区数, 0) AS 库区数,
|
||||||
|
ISNULL(h.库位数, 0) AS 库位数,
|
||||||
|
ISNULL(s.有库存库位数, 0) AS 有库存库位数,
|
||||||
|
ISNULL(s.库存数量, 0) AS 库存数量,
|
||||||
|
k.创建时间,
|
||||||
|
k.修改时间
|
||||||
|
FROM dbo.库房管理_库房主文件 k
|
||||||
|
LEFT JOIN
|
||||||
|
(
|
||||||
|
SELECT 库房流水号, COUNT(1) AS 库区数
|
||||||
|
FROM dbo.库房管理_库区主文件
|
||||||
|
GROUP BY 库房流水号
|
||||||
|
) q ON k.库房流水号 = q.库房流水号
|
||||||
|
LEFT JOIN
|
||||||
|
(
|
||||||
|
SELECT 库房流水号, COUNT(1) AS 库位数
|
||||||
|
FROM dbo.库存管理_货位主文件
|
||||||
|
WHERE 库房流水号 IS NOT NULL
|
||||||
|
GROUP BY 库房流水号
|
||||||
|
) h ON k.库房流水号 = h.库房流水号
|
||||||
|
LEFT JOIN
|
||||||
|
(
|
||||||
|
SELECT
|
||||||
|
h.库房流水号,
|
||||||
|
COUNT(DISTINCT h.货位流水号) AS 有库存库位数,
|
||||||
|
SUM(ISNULL(m.货位存量, 0)) AS 库存数量
|
||||||
|
FROM dbo.库存管理_货位主文件 h
|
||||||
|
INNER JOIN dbo.库存管理_物料与货位对照表 m ON h.货位流水号 = m.货位流水号 AND ISNULL(m.货位存量, 0) > 0
|
||||||
|
WHERE h.库房流水号 IS NOT NULL
|
||||||
|
GROUP BY h.库房流水号
|
||||||
|
) s ON k.库房流水号 = s.库房流水号
|
||||||
|
WHERE (@库房名称_check = 0 OR k.库房编号 LIKE N'%' + ISNULL(@库房名称, N'') + N'%' OR k.库房名称 LIKE N'%' + ISNULL(@库房名称, N'') + N'%')
|
||||||
|
AND (@状态_check = 0 OR k.状态 = @状态)
|
||||||
|
ORDER BY k.库房编号;
|
||||||
|
END
|
||||||
|
GO
|
||||||
|
|
||||||
|
IF OBJECT_ID(N'dbo.库房管理_库房_保存', N'P') IS NOT NULL
|
||||||
|
DROP PROCEDURE dbo.库房管理_库房_保存;
|
||||||
|
GO
|
||||||
|
CREATE PROCEDURE dbo.库房管理_库房_保存
|
||||||
|
@库房流水号 INT = NULL,
|
||||||
|
@库房编号 NVARCHAR(50),
|
||||||
|
@库房名称 NVARCHAR(100),
|
||||||
|
@库房类型 NVARCHAR(50) = NULL,
|
||||||
|
@地址 NVARCHAR(200) = NULL,
|
||||||
|
@负责人 INT = NULL,
|
||||||
|
@状态 NVARCHAR(20) = N'启用',
|
||||||
|
@排数 INT = 8,
|
||||||
|
@每排列数 INT = 24,
|
||||||
|
@层数 INT = 3,
|
||||||
|
@备注 NVARCHAR(500) = NULL,
|
||||||
|
@UserID INT = NULL
|
||||||
|
AS
|
||||||
|
BEGIN
|
||||||
|
SET NOCOUNT ON;
|
||||||
|
IF EXISTS (SELECT 1 FROM dbo.库房管理_库房主文件 WHERE 库房编号 = @库房编号 AND ISNULL(@库房流水号, 0) <> 库房流水号)
|
||||||
|
BEGIN
|
||||||
|
SELECT '0' AS result, N'库房编号已存在' AS msg;
|
||||||
|
RETURN;
|
||||||
|
END
|
||||||
|
|
||||||
|
IF ISNULL(@库房流水号, 0) = 0
|
||||||
|
BEGIN
|
||||||
|
INSERT INTO dbo.库房管理_库房主文件(库房编号, 库房名称, 库房类型, 地址, 负责人, 状态, 排数, 每排列数, 层数, 备注, 创建人)
|
||||||
|
VALUES(@库房编号, @库房名称, @库房类型, @地址, @负责人, ISNULL(@状态, N'启用'), ISNULL(@排数, 8), ISNULL(@每排列数, 24), ISNULL(@层数, 3), @备注, @UserID);
|
||||||
|
|
||||||
|
SELECT '1' AS result, SCOPE_IDENTITY() AS 库房流水号, N'新增成功' AS msg;
|
||||||
|
END
|
||||||
|
ELSE
|
||||||
|
BEGIN
|
||||||
|
UPDATE dbo.库房管理_库房主文件
|
||||||
|
SET 库房编号 = @库房编号,
|
||||||
|
库房名称 = @库房名称,
|
||||||
|
库房类型 = @库房类型,
|
||||||
|
地址 = @地址,
|
||||||
|
负责人 = @负责人,
|
||||||
|
状态 = ISNULL(@状态, 状态),
|
||||||
|
排数 = ISNULL(@排数, 排数),
|
||||||
|
每排列数 = ISNULL(@每排列数, 每排列数),
|
||||||
|
层数 = ISNULL(@层数, 层数),
|
||||||
|
备注 = @备注,
|
||||||
|
修改人 = @UserID,
|
||||||
|
修改时间 = GETDATE()
|
||||||
|
WHERE 库房流水号 = @库房流水号;
|
||||||
|
|
||||||
|
SELECT '1' AS result, @库房流水号 AS 库房流水号, N'编辑成功' AS msg;
|
||||||
|
END
|
||||||
|
END
|
||||||
|
GO
|
||||||
|
|
||||||
|
IF OBJECT_ID(N'dbo.库房管理_库房_停用', N'P') IS NOT NULL
|
||||||
|
DROP PROCEDURE dbo.库房管理_库房_停用;
|
||||||
|
GO
|
||||||
|
CREATE PROCEDURE dbo.库房管理_库房_停用
|
||||||
|
@库房流水号 INT,
|
||||||
|
@UserID INT = NULL
|
||||||
|
AS
|
||||||
|
BEGIN
|
||||||
|
SET NOCOUNT ON;
|
||||||
|
IF EXISTS
|
||||||
|
(
|
||||||
|
SELECT 1
|
||||||
|
FROM dbo.库存管理_货位主文件 h
|
||||||
|
INNER JOIN dbo.库存管理_物料与货位对照表 m ON h.货位流水号 = m.货位流水号
|
||||||
|
WHERE h.库房流水号 = @库房流水号 AND ISNULL(m.货位存量, 0) > 0
|
||||||
|
)
|
||||||
|
BEGIN
|
||||||
|
SELECT '0' AS result, N'库房下仍有库存,不能停用' AS msg;
|
||||||
|
RETURN;
|
||||||
|
END
|
||||||
|
|
||||||
|
UPDATE dbo.库房管理_库房主文件
|
||||||
|
SET 状态 = N'停用', 修改人 = @UserID, 修改时间 = GETDATE()
|
||||||
|
WHERE 库房流水号 = @库房流水号;
|
||||||
|
|
||||||
|
UPDATE dbo.库存管理_货位主文件
|
||||||
|
SET 是否启用 = 0, 修改人 = @UserID, 修改时间 = GETDATE()
|
||||||
|
WHERE 库房流水号 = @库房流水号;
|
||||||
|
|
||||||
|
SELECT '1' AS result, N'停用成功' AS msg;
|
||||||
|
END
|
||||||
|
GO
|
||||||
|
|
||||||
|
IF OBJECT_ID(N'dbo.库房管理_库区_查询', N'P') IS NOT NULL
|
||||||
|
DROP PROCEDURE dbo.库房管理_库区_查询;
|
||||||
|
GO
|
||||||
|
CREATE PROCEDURE dbo.库房管理_库区_查询
|
||||||
|
@库房流水号 INT = NULL,
|
||||||
|
@状态_check BIT = 0,
|
||||||
|
@状态 NVARCHAR(20) = NULL
|
||||||
|
AS
|
||||||
|
BEGIN
|
||||||
|
SET NOCOUNT ON;
|
||||||
|
SET @库房流水号 = NULLIF(@库房流水号, 0);
|
||||||
|
SELECT
|
||||||
|
q.库区流水号,
|
||||||
|
q.库房流水号,
|
||||||
|
k.库房名称,
|
||||||
|
q.库区编号,
|
||||||
|
q.库区名称,
|
||||||
|
q.库区类型,
|
||||||
|
q.状态,
|
||||||
|
q.排序,
|
||||||
|
q.备注,
|
||||||
|
ISNULL(h.库位数, 0) AS 库位数
|
||||||
|
FROM dbo.库房管理_库区主文件 q
|
||||||
|
INNER JOIN dbo.库房管理_库房主文件 k ON q.库房流水号 = k.库房流水号
|
||||||
|
LEFT JOIN
|
||||||
|
(
|
||||||
|
SELECT 库区流水号, COUNT(1) AS 库位数
|
||||||
|
FROM dbo.库存管理_货位主文件
|
||||||
|
WHERE 库区流水号 IS NOT NULL
|
||||||
|
GROUP BY 库区流水号
|
||||||
|
) h ON q.库区流水号 = h.库区流水号
|
||||||
|
WHERE (@库房流水号 IS NULL OR q.库房流水号 = @库房流水号)
|
||||||
|
AND (@状态_check = 0 OR q.状态 = @状态)
|
||||||
|
ORDER BY q.排序, q.库区编号;
|
||||||
|
END
|
||||||
|
GO
|
||||||
|
|
||||||
|
IF OBJECT_ID(N'dbo.库房管理_库区_保存', N'P') IS NOT NULL
|
||||||
|
DROP PROCEDURE dbo.库房管理_库区_保存;
|
||||||
|
GO
|
||||||
|
CREATE PROCEDURE dbo.库房管理_库区_保存
|
||||||
|
@库区流水号 INT = NULL,
|
||||||
|
@库房流水号 INT,
|
||||||
|
@库区编号 NVARCHAR(50),
|
||||||
|
@库区名称 NVARCHAR(100),
|
||||||
|
@库区类型 NVARCHAR(50) = NULL,
|
||||||
|
@状态 NVARCHAR(20) = N'启用',
|
||||||
|
@排序 INT = NULL,
|
||||||
|
@备注 NVARCHAR(500) = NULL,
|
||||||
|
@UserID INT = NULL
|
||||||
|
AS
|
||||||
|
BEGIN
|
||||||
|
SET NOCOUNT ON;
|
||||||
|
IF EXISTS (SELECT 1 FROM dbo.库房管理_库区主文件 WHERE 库房流水号 = @库房流水号 AND 库区编号 = @库区编号 AND ISNULL(@库区流水号, 0) <> 库区流水号)
|
||||||
|
BEGIN
|
||||||
|
SELECT '0' AS result, N'库区编号已存在' AS msg;
|
||||||
|
RETURN;
|
||||||
|
END
|
||||||
|
|
||||||
|
IF ISNULL(@库区流水号, 0) = 0
|
||||||
|
BEGIN
|
||||||
|
INSERT INTO dbo.库房管理_库区主文件(库房流水号, 库区编号, 库区名称, 库区类型, 状态, 排序, 备注, 创建人)
|
||||||
|
VALUES(@库房流水号, @库区编号, @库区名称, @库区类型, ISNULL(@状态, N'启用'), @排序, @备注, @UserID);
|
||||||
|
|
||||||
|
SELECT '1' AS result, SCOPE_IDENTITY() AS 库区流水号, N'新增成功' AS msg;
|
||||||
|
END
|
||||||
|
ELSE
|
||||||
|
BEGIN
|
||||||
|
UPDATE dbo.库房管理_库区主文件
|
||||||
|
SET 库房流水号 = @库房流水号,
|
||||||
|
库区编号 = @库区编号,
|
||||||
|
库区名称 = @库区名称,
|
||||||
|
库区类型 = @库区类型,
|
||||||
|
状态 = ISNULL(@状态, 状态),
|
||||||
|
排序 = @排序,
|
||||||
|
备注 = @备注,
|
||||||
|
修改人 = @UserID,
|
||||||
|
修改时间 = GETDATE()
|
||||||
|
WHERE 库区流水号 = @库区流水号;
|
||||||
|
|
||||||
|
SELECT '1' AS result, @库区流水号 AS 库区流水号, N'编辑成功' AS msg;
|
||||||
|
END
|
||||||
|
END
|
||||||
|
GO
|
||||||
|
|
||||||
|
IF OBJECT_ID(N'dbo.库房管理_库位_查询', N'P') IS NOT NULL
|
||||||
|
DROP PROCEDURE dbo.库房管理_库位_查询;
|
||||||
|
GO
|
||||||
|
CREATE PROCEDURE dbo.库房管理_库位_查询
|
||||||
|
@库房流水号 INT = NULL,
|
||||||
|
@库区流水号 INT = NULL,
|
||||||
|
@库位名称_check BIT = 0,
|
||||||
|
@库位名称 NVARCHAR(50) = NULL,
|
||||||
|
@库位状态_check BIT = 0,
|
||||||
|
@库位状态 NVARCHAR(20) = NULL
|
||||||
|
AS
|
||||||
|
BEGIN
|
||||||
|
SET NOCOUNT ON;
|
||||||
|
SET @库房流水号 = NULLIF(@库房流水号, 0);
|
||||||
|
SET @库区流水号 = NULLIF(@库区流水号, 0);
|
||||||
|
SELECT
|
||||||
|
h.货位流水号 AS 库位流水号,
|
||||||
|
h.货位名称 AS 库位名称,
|
||||||
|
h.库房流水号,
|
||||||
|
k.库房名称,
|
||||||
|
h.库区流水号,
|
||||||
|
q.库区名称,
|
||||||
|
h.排号,
|
||||||
|
h.列号,
|
||||||
|
h.层号,
|
||||||
|
CASE
|
||||||
|
WHEN ISNULL(h.是否启用, 1) = 0 THEN N'停用'
|
||||||
|
WHEN ISNULL(s.库存数量, 0) > 0 AND ISNULL(h.库位容量, 0) > 0 AND ISNULL(s.库存数量, 0) >= ISNULL(h.库位容量, 0) THEN N'满库位'
|
||||||
|
WHEN ISNULL(s.库存数量, 0) > 0 THEN N'有库存'
|
||||||
|
ELSE ISNULL(h.库位状态, N'空库位')
|
||||||
|
END AS 库位状态,
|
||||||
|
ISNULL(h.库位容量, 0) AS 库位容量,
|
||||||
|
ISNULL(s.物料种类, 0) AS 物料种类,
|
||||||
|
ISNULL(s.库存数量, 0) AS 库存数量,
|
||||||
|
h.操作日期,
|
||||||
|
h.修改时间
|
||||||
|
FROM dbo.库存管理_货位主文件 h
|
||||||
|
LEFT JOIN dbo.库房管理_库房主文件 k ON h.库房流水号 = k.库房流水号
|
||||||
|
LEFT JOIN dbo.库房管理_库区主文件 q ON h.库区流水号 = q.库区流水号
|
||||||
|
LEFT JOIN
|
||||||
|
(
|
||||||
|
SELECT 货位流水号, COUNT(DISTINCT 物料流水号) AS 物料种类, SUM(ISNULL(货位存量, 0)) AS 库存数量
|
||||||
|
FROM dbo.库存管理_物料与货位对照表
|
||||||
|
WHERE ISNULL(货位存量, 0) > 0
|
||||||
|
GROUP BY 货位流水号
|
||||||
|
) s ON h.货位流水号 = s.货位流水号
|
||||||
|
WHERE (@库房流水号 IS NULL OR h.库房流水号 = @库房流水号)
|
||||||
|
AND (@库区流水号 IS NULL OR h.库区流水号 = @库区流水号)
|
||||||
|
AND (@库位名称_check = 0 OR h.货位名称 LIKE N'%' + ISNULL(@库位名称, N'') + N'%')
|
||||||
|
AND (@库位状态_check = 0 OR
|
||||||
|
CASE
|
||||||
|
WHEN ISNULL(h.是否启用, 1) = 0 THEN N'停用'
|
||||||
|
WHEN ISNULL(s.库存数量, 0) > 0 AND ISNULL(h.库位容量, 0) > 0 AND ISNULL(s.库存数量, 0) >= ISNULL(h.库位容量, 0) THEN N'满库位'
|
||||||
|
WHEN ISNULL(s.库存数量, 0) > 0 THEN N'有库存'
|
||||||
|
ELSE ISNULL(h.库位状态, N'空库位')
|
||||||
|
END = @库位状态)
|
||||||
|
ORDER BY h.排号, h.列号, h.层号, h.货位名称;
|
||||||
|
END
|
||||||
|
GO
|
||||||
|
|
||||||
|
IF OBJECT_ID(N'dbo.库房管理_库位_保存', N'P') IS NOT NULL
|
||||||
|
DROP PROCEDURE dbo.库房管理_库位_保存;
|
||||||
|
GO
|
||||||
|
CREATE PROCEDURE dbo.库房管理_库位_保存
|
||||||
|
@库位流水号 INT = NULL,
|
||||||
|
@库位名称 NVARCHAR(50),
|
||||||
|
@库房流水号 INT,
|
||||||
|
@库区流水号 INT = NULL,
|
||||||
|
@排号 INT = NULL,
|
||||||
|
@列号 INT = NULL,
|
||||||
|
@层号 INT = NULL,
|
||||||
|
@库位状态 NVARCHAR(20) = N'空库位',
|
||||||
|
@库位容量 FLOAT = NULL,
|
||||||
|
@是否启用 BIT = 1,
|
||||||
|
@UserID INT = NULL
|
||||||
|
AS
|
||||||
|
BEGIN
|
||||||
|
SET NOCOUNT ON;
|
||||||
|
SET @库区流水号 = NULLIF(@库区流水号, 0);
|
||||||
|
IF EXISTS (SELECT 1 FROM dbo.库存管理_货位主文件 WHERE 货位名称 = @库位名称 AND ISNULL(@库位流水号, 0) <> 货位流水号)
|
||||||
|
BEGIN
|
||||||
|
SELECT '0' AS result, N'库位名称已存在' AS msg;
|
||||||
|
RETURN;
|
||||||
|
END
|
||||||
|
|
||||||
|
IF ISNULL(@库位流水号, 0) = 0
|
||||||
|
BEGIN
|
||||||
|
INSERT INTO dbo.库存管理_货位主文件(货位名称, 库房流水号, 库区流水号, 排号, 列号, 层号, 库位状态, 库位容量, 是否启用, 操作日期, 修改人, 修改时间)
|
||||||
|
VALUES(@库位名称, @库房流水号, @库区流水号, @排号, @列号, @层号, ISNULL(@库位状态, N'空库位'), @库位容量, ISNULL(@是否启用, 1), GETDATE(), @UserID, GETDATE());
|
||||||
|
|
||||||
|
SELECT '1' AS result, SCOPE_IDENTITY() AS 库位流水号, N'新增成功' AS msg;
|
||||||
|
END
|
||||||
|
ELSE
|
||||||
|
BEGIN
|
||||||
|
UPDATE dbo.库存管理_货位主文件
|
||||||
|
SET 货位名称 = @库位名称,
|
||||||
|
库房流水号 = @库房流水号,
|
||||||
|
库区流水号 = @库区流水号,
|
||||||
|
排号 = @排号,
|
||||||
|
列号 = @列号,
|
||||||
|
层号 = @层号,
|
||||||
|
库位状态 = ISNULL(@库位状态, 库位状态),
|
||||||
|
库位容量 = @库位容量,
|
||||||
|
是否启用 = ISNULL(@是否启用, 是否启用),
|
||||||
|
修改人 = @UserID,
|
||||||
|
修改时间 = GETDATE()
|
||||||
|
WHERE 货位流水号 = @库位流水号;
|
||||||
|
|
||||||
|
SELECT '1' AS result, @库位流水号 AS 库位流水号, N'编辑成功' AS msg;
|
||||||
|
END
|
||||||
|
END
|
||||||
|
GO
|
||||||
|
|
||||||
|
IF OBJECT_ID(N'dbo.库房管理_可视化库位_查询', N'P') IS NOT NULL
|
||||||
|
DROP PROCEDURE dbo.库房管理_可视化库位_查询;
|
||||||
|
GO
|
||||||
|
CREATE PROCEDURE dbo.库房管理_可视化库位_查询
|
||||||
|
@库房流水号 INT = NULL,
|
||||||
|
@库区流水号 INT = NULL,
|
||||||
|
@层号 INT = 1
|
||||||
|
AS
|
||||||
|
BEGIN
|
||||||
|
SET NOCOUNT ON;
|
||||||
|
SET @库房流水号 = NULLIF(@库房流水号, 0);
|
||||||
|
SET @库区流水号 = NULLIF(@库区流水号, 0);
|
||||||
|
IF @库房流水号 IS NULL
|
||||||
|
SELECT @库房流水号 = 库房流水号 FROM dbo.库房管理_库房主文件 WHERE 库房编号 = N'KF-3F';
|
||||||
|
|
||||||
|
DECLARE @排数 INT = 8;
|
||||||
|
DECLARE @每排列数 INT = 24;
|
||||||
|
DECLARE @层数 INT = 3;
|
||||||
|
DECLARE @库房编号 NVARCHAR(50) = N'KF';
|
||||||
|
|
||||||
|
SELECT TOP 1
|
||||||
|
@排数 = ISNULL(排数, 8),
|
||||||
|
@每排列数 = ISNULL(每排列数, 24),
|
||||||
|
@层数 = ISNULL(层数, 3),
|
||||||
|
@库房编号 = ISNULL(库房编号, N'KF')
|
||||||
|
FROM dbo.库房管理_库房主文件
|
||||||
|
WHERE (@库房流水号 IS NULL OR 库房流水号 = @库房流水号)
|
||||||
|
ORDER BY 库房流水号;
|
||||||
|
|
||||||
|
;WITH row_num AS
|
||||||
|
(
|
||||||
|
SELECT 1 AS n
|
||||||
|
UNION ALL SELECT n + 1 FROM row_num WHERE n < @排数
|
||||||
|
),
|
||||||
|
col_num AS
|
||||||
|
(
|
||||||
|
SELECT 1 AS n
|
||||||
|
UNION ALL SELECT n + 1 FROM col_num WHERE n < @每排列数
|
||||||
|
),
|
||||||
|
cell AS
|
||||||
|
(
|
||||||
|
SELECT r.n AS 排号, c.n AS 列号, @层号 AS 层号
|
||||||
|
FROM row_num r
|
||||||
|
CROSS JOIN col_num c
|
||||||
|
),
|
||||||
|
stock AS
|
||||||
|
(
|
||||||
|
SELECT 货位流水号, COUNT(DISTINCT 物料流水号) AS 物料种类, SUM(ISNULL(货位存量, 0)) AS 库存数量
|
||||||
|
FROM dbo.库存管理_物料与货位对照表
|
||||||
|
WHERE ISNULL(货位存量, 0) > 0
|
||||||
|
GROUP BY 货位流水号
|
||||||
|
)
|
||||||
|
SELECT
|
||||||
|
cell.排号,
|
||||||
|
cell.列号,
|
||||||
|
cell.层号,
|
||||||
|
ISNULL(h.货位名称, CONVERT(NVARCHAR(10), cell.排号) + N'-' + RIGHT(N'00' + CONVERT(NVARCHAR(10), cell.列号), 2) + N'-' + RIGHT(N'00' + CONVERT(NVARCHAR(10), cell.层号), 2) + N'-01') AS 库位编号,
|
||||||
|
h.货位流水号 AS 库位流水号,
|
||||||
|
CASE
|
||||||
|
WHEN h.货位流水号 IS NULL THEN N'未建库位'
|
||||||
|
WHEN ISNULL(h.是否启用, 1) = 0 THEN N'停用'
|
||||||
|
WHEN ISNULL(stock.库存数量, 0) > 0 AND ISNULL(h.库位容量, 0) > 0 AND ISNULL(stock.库存数量, 0) >= ISNULL(h.库位容量, 0) THEN N'满库位'
|
||||||
|
WHEN ISNULL(stock.库存数量, 0) > 0 THEN N'有库存'
|
||||||
|
ELSE ISNULL(h.库位状态, N'空库位')
|
||||||
|
END AS 库位状态,
|
||||||
|
ISNULL(stock.物料种类, 0) AS 物料种类,
|
||||||
|
ISNULL(stock.库存数量, 0) AS 库存数量,
|
||||||
|
ISNULL(h.库位容量, 0) AS 库位容量
|
||||||
|
FROM cell
|
||||||
|
LEFT JOIN dbo.库存管理_货位主文件 h
|
||||||
|
ON h.排号 = cell.排号
|
||||||
|
AND h.列号 = cell.列号
|
||||||
|
AND h.层号 = cell.层号
|
||||||
|
AND (@库房流水号 IS NULL OR h.库房流水号 = @库房流水号)
|
||||||
|
AND (@库区流水号 IS NULL OR h.库区流水号 = @库区流水号)
|
||||||
|
AND LEN(h.货位名称) - LEN(REPLACE(h.货位名称, N'-', N'')) = 3
|
||||||
|
LEFT JOIN stock ON h.货位流水号 = stock.货位流水号
|
||||||
|
ORDER BY cell.排号, cell.列号
|
||||||
|
OPTION (MAXRECURSION 0);
|
||||||
|
END
|
||||||
|
GO
|
||||||
|
|
||||||
|
IF OBJECT_ID(N'dbo.库房管理_物料库位_查询', N'P') IS NOT NULL
|
||||||
|
DROP PROCEDURE dbo.库房管理_物料库位_查询;
|
||||||
|
GO
|
||||||
|
CREATE PROCEDURE dbo.库房管理_物料库位_查询
|
||||||
|
@查询方向 NVARCHAR(10) = N'综合',
|
||||||
|
@关键字_check BIT = 0,
|
||||||
|
@关键字 NVARCHAR(100) = NULL,
|
||||||
|
@库房流水号 INT = NULL,
|
||||||
|
@库位流水号 INT = NULL
|
||||||
|
AS
|
||||||
|
BEGIN
|
||||||
|
SET NOCOUNT ON;
|
||||||
|
SET @库房流水号 = NULLIF(@库房流水号, 0);
|
||||||
|
SET @库位流水号 = NULLIF(@库位流水号, 0);
|
||||||
|
SELECT
|
||||||
|
m.物料流水号,
|
||||||
|
m.物料编码,
|
||||||
|
m.名称 AS 物料名称,
|
||||||
|
m.代号 AS 图号或型号,
|
||||||
|
h.货位流水号 AS 库位流水号,
|
||||||
|
h.货位名称 AS 库位名称,
|
||||||
|
h.库房流水号,
|
||||||
|
k.库房名称,
|
||||||
|
h.库区流水号,
|
||||||
|
q.库区名称,
|
||||||
|
h.排号,
|
||||||
|
h.列号,
|
||||||
|
h.层号,
|
||||||
|
d.货位存量 AS 库存数量,
|
||||||
|
d.批次号,
|
||||||
|
CASE
|
||||||
|
WHEN ISNULL(d.货位存量, 0) > 0 THEN N'有库存'
|
||||||
|
ELSE N'无库存'
|
||||||
|
END AS 库存状态,
|
||||||
|
d.操作日期,
|
||||||
|
@查询方向 AS 查询方向
|
||||||
|
FROM dbo.库存管理_物料与货位对照表 d
|
||||||
|
INNER JOIN dbo.库存管理_物料主文件_基本 m ON d.物料流水号 = m.物料流水号
|
||||||
|
INNER JOIN dbo.库存管理_货位主文件 h ON d.货位流水号 = h.货位流水号
|
||||||
|
LEFT JOIN dbo.库房管理_库房主文件 k ON h.库房流水号 = k.库房流水号
|
||||||
|
LEFT JOIN dbo.库房管理_库区主文件 q ON h.库区流水号 = q.库区流水号
|
||||||
|
WHERE ISNULL(d.货位存量, 0) > 0
|
||||||
|
AND (@库房流水号 IS NULL OR h.库房流水号 = @库房流水号)
|
||||||
|
AND (@库位流水号 IS NULL OR h.货位流水号 = @库位流水号)
|
||||||
|
AND
|
||||||
|
(
|
||||||
|
@关键字_check = 0
|
||||||
|
OR m.物料编码 LIKE N'%' + ISNULL(@关键字, N'') + N'%'
|
||||||
|
OR m.名称 LIKE N'%' + ISNULL(@关键字, N'') + N'%'
|
||||||
|
OR m.代号 LIKE N'%' + ISNULL(@关键字, N'') + N'%'
|
||||||
|
OR h.货位名称 LIKE N'%' + ISNULL(@关键字, N'') + N'%'
|
||||||
|
)
|
||||||
|
ORDER BY k.库房名称, h.排号, h.列号, h.层号, m.物料编码;
|
||||||
|
END
|
||||||
|
GO
|
||||||
|
|
||||||
|
IF OBJECT_ID(N'dbo.库房管理_库存流水_查询', N'P') IS NOT NULL
|
||||||
|
DROP PROCEDURE dbo.库房管理_库存流水_查询;
|
||||||
|
GO
|
||||||
|
CREATE PROCEDURE dbo.库房管理_库存流水_查询
|
||||||
|
@关键字_check BIT = 0,
|
||||||
|
@关键字 NVARCHAR(100) = NULL,
|
||||||
|
@库房流水号 INT = NULL,
|
||||||
|
@开始日期 DATE = NULL,
|
||||||
|
@结束日期 DATE = NULL
|
||||||
|
AS
|
||||||
|
BEGIN
|
||||||
|
SET NOCOUNT ON;
|
||||||
|
SET @库房流水号 = NULLIF(@库房流水号, 0);
|
||||||
|
SELECT TOP 500 *
|
||||||
|
FROM
|
||||||
|
(
|
||||||
|
SELECT
|
||||||
|
N'入库' AS 业务类型,
|
||||||
|
r.入库记录流水号 AS 业务流水号,
|
||||||
|
m.物料编码,
|
||||||
|
m.名称 AS 物料名称,
|
||||||
|
m.代号 AS 图号或型号,
|
||||||
|
h.货位名称 AS 库位名称,
|
||||||
|
k.库房名称,
|
||||||
|
CONVERT(FLOAT, r.实际到货数量) AS 数量,
|
||||||
|
r.入库时间 AS 业务时间
|
||||||
|
FROM dbo.库存管理_外购件_入库记录 r
|
||||||
|
LEFT JOIN dbo.库存管理_物料主文件_基本 m ON r.标准件和外购件流水号 = m.物料流水号
|
||||||
|
LEFT JOIN dbo.库存管理_货位主文件 h ON r.货位流水号 = h.货位流水号
|
||||||
|
LEFT JOIN dbo.库房管理_库房主文件 k ON h.库房流水号 = k.库房流水号
|
||||||
|
UNION ALL
|
||||||
|
SELECT
|
||||||
|
N'出库' AS 业务类型,
|
||||||
|
r.出库记录流水号 AS 业务流水号,
|
||||||
|
m.物料编码,
|
||||||
|
m.名称 AS 物料名称,
|
||||||
|
m.代号 AS 图号或型号,
|
||||||
|
h.货位名称 AS 库位名称,
|
||||||
|
k.库房名称,
|
||||||
|
CONVERT(FLOAT, r.出库数量) AS 数量,
|
||||||
|
r.操作日期 AS 业务时间
|
||||||
|
FROM dbo.库存管理_物料出库_出库记录 r
|
||||||
|
LEFT JOIN dbo.库存管理_物料主文件_基本 m ON r.物料流水号 = m.物料流水号
|
||||||
|
LEFT JOIN dbo.库存管理_货位主文件 h ON r.货位流水号 = h.货位流水号
|
||||||
|
LEFT JOIN dbo.库房管理_库房主文件 k ON h.库房流水号 = k.库房流水号
|
||||||
|
UNION ALL
|
||||||
|
SELECT
|
||||||
|
N'盘点' AS 业务类型,
|
||||||
|
r.修改记录流水号 AS 业务流水号,
|
||||||
|
m.物料编码,
|
||||||
|
m.名称 AS 物料名称,
|
||||||
|
m.代号 AS 图号或型号,
|
||||||
|
h.货位名称 AS 库位名称,
|
||||||
|
k.库房名称,
|
||||||
|
CONVERT(FLOAT, ISNULL(r.更改后数量, 0) - ISNULL(r.原数量, 0)) AS 数量,
|
||||||
|
r.修改时间 AS 业务时间
|
||||||
|
FROM dbo.库存盘点_修改记录 r
|
||||||
|
LEFT JOIN dbo.库存管理_物料主文件_基本 m ON r.物料流水号 = m.物料流水号
|
||||||
|
LEFT JOIN dbo.库存管理_物料与货位对照表 d ON r.物料与货位流水号 = d.物料与货位流水号
|
||||||
|
LEFT JOIN dbo.库存管理_货位主文件 h ON d.货位流水号 = h.货位流水号
|
||||||
|
LEFT JOIN dbo.库房管理_库房主文件 k ON h.库房流水号 = k.库房流水号
|
||||||
|
) x
|
||||||
|
WHERE (@库房流水号 IS NULL OR x.库房名称 IN (SELECT 库房名称 FROM dbo.库房管理_库房主文件 WHERE 库房流水号 = @库房流水号))
|
||||||
|
AND (@开始日期 IS NULL OR x.业务时间 >= @开始日期)
|
||||||
|
AND (@结束日期 IS NULL OR x.业务时间 < DATEADD(DAY, 1, @结束日期))
|
||||||
|
AND
|
||||||
|
(
|
||||||
|
@关键字_check = 0
|
||||||
|
OR x.物料编码 LIKE N'%' + ISNULL(@关键字, N'') + N'%'
|
||||||
|
OR x.物料名称 LIKE N'%' + ISNULL(@关键字, N'') + N'%'
|
||||||
|
OR x.图号或型号 LIKE N'%' + ISNULL(@关键字, N'') + N'%'
|
||||||
|
OR x.库位名称 LIKE N'%' + ISNULL(@关键字, N'') + N'%'
|
||||||
|
)
|
||||||
|
ORDER BY x.业务时间 DESC;
|
||||||
|
END
|
||||||
|
GO
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -94,7 +94,8 @@ BEGIN
|
|||||||
A.设备号,
|
A.设备号,
|
||||||
A.设备名,
|
A.设备名,
|
||||||
A.操作者,
|
A.操作者,
|
||||||
ISNULL(操作者人员.姓名, A.操作者) AS 操作者姓名,
|
-- 操作者人名查询兼容操作者、工作者和录工票人员;修改人:Ld 修改时间:2026-07-23 16:08:35;
|
||||||
|
COALESCE(操作者人员.姓名, 工作者.姓名, 录工票人员.姓名, A.操作者) AS 操作者姓名,
|
||||||
A.整修状态,
|
A.整修状态,
|
||||||
A.整修记录id,
|
A.整修记录id,
|
||||||
A.整修方案,
|
A.整修方案,
|
||||||
@@ -138,7 +139,12 @@ BEGIN
|
|||||||
) priceData
|
) priceData
|
||||||
WHERE (@审核状态_check = 0 OR A.审核状态 = @审核状态)
|
WHERE (@审核状态_check = 0 OR A.审核状态 = @审核状态)
|
||||||
AND (@审核类型_check = 0 OR A.审核类型 = @审核类型)
|
AND (@审核类型_check = 0 OR A.审核类型 = @审核类型)
|
||||||
AND (@操作者_check = 0 OR ISNULL(操作者人员.姓名, ISNULL(A.操作者, N'')) LIKE N'%' + @操作者 + N'%')
|
AND (
|
||||||
|
@操作者_check = 0
|
||||||
|
OR ISNULL(操作者人员.姓名, ISNULL(A.操作者, N'')) LIKE N'%' + @操作者 + N'%'
|
||||||
|
OR ISNULL(工作者.姓名, N'') LIKE N'%' + @操作者 + N'%'
|
||||||
|
OR ISNULL(录工票人员.姓名, N'') LIKE N'%' + @操作者 + N'%'
|
||||||
|
)
|
||||||
AND (@时间_check = 0 OR CONVERT(DATE, A.提交时间) BETWEEN CONVERT(DATE, @开始时间) AND CONVERT(DATE, @结束时间))
|
AND (@时间_check = 0 OR CONVERT(DATE, A.提交时间) BETWEEN CONVERT(DATE, @开始时间) AND CONVERT(DATE, @结束时间))
|
||||||
)
|
)
|
||||||
SELECT
|
SELECT
|
||||||
@@ -193,13 +199,23 @@ BEGIN
|
|||||||
|
|
||||||
SELECT COUNT(1) AS total
|
SELECT COUNT(1) AS total
|
||||||
FROM [dbo].[MES_机加工MES_加工完成整修审核表] AS A
|
FROM [dbo].[MES_机加工MES_加工完成整修审核表] AS A
|
||||||
|
LEFT JOIN [dbo].[人事档案管理_人员名单] AS 工作者
|
||||||
|
ON A.工作者考勤编号 = 工作者.考勤编号
|
||||||
|
LEFT JOIN [dbo].[人事档案管理_人员名单] AS 录工票人员
|
||||||
|
ON A.录工票人员编号 = 录工票人员.序号
|
||||||
|
OR A.录工票人员编号 = 录工票人员.人员编号
|
||||||
LEFT JOIN [dbo].[人事档案管理_人员名单] AS 操作者人员
|
LEFT JOIN [dbo].[人事档案管理_人员名单] AS 操作者人员
|
||||||
ON A.操作者 = CONVERT(NVARCHAR(100), 操作者人员.人员编号)
|
ON A.操作者 = CONVERT(NVARCHAR(100), 操作者人员.人员编号)
|
||||||
OR A.操作者 = CONVERT(NVARCHAR(100), 操作者人员.序号)
|
OR A.操作者 = CONVERT(NVARCHAR(100), 操作者人员.序号)
|
||||||
OR A.操作者 = 操作者人员.姓名
|
OR A.操作者 = 操作者人员.姓名
|
||||||
WHERE (@审核状态_check = 0 OR A.审核状态 = @审核状态)
|
WHERE (@审核状态_check = 0 OR A.审核状态 = @审核状态)
|
||||||
AND (@审核类型_check = 0 OR A.审核类型 = @审核类型)
|
AND (@审核类型_check = 0 OR A.审核类型 = @审核类型)
|
||||||
AND (@操作者_check = 0 OR ISNULL(操作者人员.姓名, ISNULL(A.操作者, N'')) LIKE N'%' + @操作者 + N'%')
|
AND (
|
||||||
|
@操作者_check = 0
|
||||||
|
OR ISNULL(操作者人员.姓名, ISNULL(A.操作者, N'')) LIKE N'%' + @操作者 + N'%'
|
||||||
|
OR ISNULL(工作者.姓名, N'') LIKE N'%' + @操作者 + N'%'
|
||||||
|
OR ISNULL(录工票人员.姓名, N'') LIKE N'%' + @操作者 + N'%'
|
||||||
|
)
|
||||||
AND (@时间_check = 0 OR CONVERT(DATE, A.提交时间) BETWEEN CONVERT(DATE, @开始时间) AND CONVERT(DATE, @结束时间));
|
AND (@时间_check = 0 OR CONVERT(DATE, A.提交时间) BETWEEN CONVERT(DATE, @开始时间) AND CONVERT(DATE, @结束时间));
|
||||||
END;
|
END;
|
||||||
GO
|
GO
|
||||||
@@ -227,6 +243,9 @@ BEGIN
|
|||||||
DECLARE @原完成数量 FLOAT;
|
DECLARE @原完成数量 FLOAT;
|
||||||
DECLARE @最终完成数量 FLOAT;
|
DECLARE @最终完成数量 FLOAT;
|
||||||
DECLARE @数量差 FLOAT;
|
DECLARE @数量差 FLOAT;
|
||||||
|
DECLARE @投产数量 FLOAT;
|
||||||
|
DECLARE @当前工序完成数量 FLOAT;
|
||||||
|
DECLARE @修改后工序完成数量 FLOAT;
|
||||||
DECLARE @录工票人员编号 INT;
|
DECLARE @录工票人员编号 INT;
|
||||||
DECLARE @工位号 NVARCHAR(100);
|
DECLARE @工位号 NVARCHAR(100);
|
||||||
DECLARE @设备流水号 INT;
|
DECLARE @设备流水号 INT;
|
||||||
@@ -297,6 +316,24 @@ BEGIN
|
|||||||
RETURN;
|
RETURN;
|
||||||
END;
|
END;
|
||||||
|
|
||||||
|
-- 修改完成数量后的累计结果不能超过投产数量;修改人:Ld 修改时间:2026-07-23 16:22:46;
|
||||||
|
IF @是否修改加工 = 1 AND @审核完成数量 IS NOT NULL
|
||||||
|
BEGIN
|
||||||
|
SELECT
|
||||||
|
@投产数量 = ISNULL(V.数量, 0),
|
||||||
|
@当前工序完成数量 = ISNULL(V.已完成数, 0)
|
||||||
|
FROM [dbo].[车间生产管理_零件工序_视图] AS V
|
||||||
|
WHERE V.工序流水号 = @工序流水号;
|
||||||
|
|
||||||
|
SET @修改后工序完成数量 = ISNULL(@当前工序完成数量, 0) + ISNULL(@数量差, 0);
|
||||||
|
|
||||||
|
IF ISNULL(@投产数量, 0) > 0 AND @修改后工序完成数量 > @投产数量
|
||||||
|
BEGIN
|
||||||
|
SELECT N'0' AS result, N'修改后的已完成数不能超过投产数量' AS message;
|
||||||
|
RETURN;
|
||||||
|
END;
|
||||||
|
END;
|
||||||
|
|
||||||
SELECT TOP 1 @单件工价 = CASE
|
SELECT TOP 1 @单件工价 = CASE
|
||||||
WHEN ISNULL(price.[单件工价], 0) <> 0 THEN price.[单件工价]
|
WHEN ISNULL(price.[单件工价], 0) <> 0 THEN price.[单件工价]
|
||||||
ELSE ISNULL(price.[最终单价(元/件)], 0)
|
ELSE ISNULL(price.[最终单价(元/件)], 0)
|
||||||
|
|||||||
116
sql/物料标准维护_查看禁用物料_测试库_20260803.sql
Normal file
@@ -0,0 +1,116 @@
|
|||||||
|
USE [ERPTOOL_JY_20250826Back]
|
||||||
|
GO
|
||||||
|
|
||||||
|
ALTER PROCEDURE [dbo].[物料管理_查询数据_分页]
|
||||||
|
@物料名称_check bit = null,
|
||||||
|
@物料名称 nvarchar(50) = null,
|
||||||
|
@物料编码_check bit = null,
|
||||||
|
@物料编码 nvarchar(50) = null,
|
||||||
|
@图号_check bit = null,
|
||||||
|
@图号 nvarchar(50) = null,
|
||||||
|
@类型_check bit = null,
|
||||||
|
@类型 int = null,
|
||||||
|
@时间_check bit = null,
|
||||||
|
@开始时间 nvarchar(50) = null,
|
||||||
|
@结束时间 nvarchar(50) = null,
|
||||||
|
@排序名称 int =null,
|
||||||
|
@排序方式 int =null,
|
||||||
|
@物料库_check bit = null,
|
||||||
|
@物料库 int = null,
|
||||||
|
@是否禁用_check bit = null, -- 修改人:Ld 修改时间:2026-08-03 07:55:23; 支持前端切换查看启用/禁用物料
|
||||||
|
@是否禁用 bit = null, -- 修改人:Ld 修改时间:2026-08-03 07:55:23; 1 查询禁用物料,0 查询启用物料
|
||||||
|
|
||||||
|
@PageCurrent int=1, --要显示的页码
|
||||||
|
@PageSize int = 20, --每页的大小(记录数)
|
||||||
|
@PageCount int = '1111' OUTPUT, --总页数
|
||||||
|
@ItemCount int = '1111' OUTPUT --总记录数
|
||||||
|
AS
|
||||||
|
|
||||||
|
declare @selectStrWhere nvarchar(4000)
|
||||||
|
|
||||||
|
|
||||||
|
set @selectStrWhere = '1=1 ' -- 修改人:Ld 修改时间:2026-08-03 07:55:23; 默认条件改为可拼接启用状态
|
||||||
|
|
||||||
|
if (ISNULL(@是否禁用_check, 0) = 1) -- 修改人:Ld 修改时间:2026-08-03 07:55:23; 按按钮传入状态筛选禁用/启用物料
|
||||||
|
set @selectStrWhere = @selectStrWhere + ' and 是否禁用 = ' + str(ISNULL(@是否禁用, 0))
|
||||||
|
else
|
||||||
|
set @selectStrWhere = @selectStrWhere + ' and 是否禁用=0 '
|
||||||
|
|
||||||
|
|
||||||
|
--if(@物料名称_check = 1)
|
||||||
|
-- set @selectStrWhere = @selectStrWhere+' and 名称 like + ''%'' + @物料名称 + ''%'' '
|
||||||
|
--if(@时间_check = 1)
|
||||||
|
-- set @selectStrWhere = @selectStrWhere+' and 修改日期 >=@开始时间 and 修改日期 <=@结束时间 '
|
||||||
|
--if(@图号_check = 1)
|
||||||
|
-- set @selectStrWhere = @selectStrWhere+' and 代号 like + ''%'' + @图号 + ''%'' '
|
||||||
|
--if(@类型_check = 1)
|
||||||
|
-- set @selectStrWhere = @selectStrWhere+' and 类型 = @类型 '
|
||||||
|
|
||||||
|
|
||||||
|
if (@物料名称_check = 1)
|
||||||
|
if(@物料名称 is not null)
|
||||||
|
set @selectStrWhere = @selectStrWhere+' and 名称 like '+N'''%'+@物料名称+N'%'''
|
||||||
|
|
||||||
|
if (@物料编码_check = 1)
|
||||||
|
if(@物料编码 is not null)
|
||||||
|
set @selectStrWhere = @selectStrWhere+' and 物料编码 like '+N'''%'+@物料编码+N'%'''
|
||||||
|
|
||||||
|
|
||||||
|
if (@时间_check = 1)
|
||||||
|
if(@开始时间 is not null and @结束时间 is not null)
|
||||||
|
set @selectStrWhere = @selectStrWhere+' and ' + N''''+@开始时间+N'''' + '<=修改日期' + ' and '+ N''''+@结束时间+N'''' + '>=修改日期'
|
||||||
|
|
||||||
|
if (@图号_check = 1)
|
||||||
|
if(@图号 is not null)
|
||||||
|
set @selectStrWhere = @selectStrWhere+' and 代号 like '+N'''%'+@图号+N'%'''
|
||||||
|
|
||||||
|
if (@类型_check = 1)
|
||||||
|
if(@类型 is not null)
|
||||||
|
set @selectStrWhere = @selectStrWhere+' and 类型 = '+str(@类型)
|
||||||
|
|
||||||
|
---if (@物料库_check = 1)
|
||||||
|
-- if(@物料库 is not null)
|
||||||
|
-- set @selectStrWhere = @selectStrWhere+' and 物料库流水号 = '+ str(@物料库)
|
||||||
|
|
||||||
|
|
||||||
|
declare @tbname sysname --要分页显示的表名
|
||||||
|
declare @fieldkey sysname --用于定位记录的主键(唯一键)字段,只能是单个字段
|
||||||
|
declare @where nvarchar(4000) --查询条件
|
||||||
|
declare @fieldshow nvarchar(1000) --以逗号分隔的要显示的字段列表,如果不指定,则显示所有字段
|
||||||
|
declare @fieldOrder nvarchar(1000) ----以逗号分隔的排序字段列表,可以指定在字段后面指定DESC/ASC --不指定则按主键顺序
|
||||||
|
|
||||||
|
set @tbname = '物料视图'
|
||||||
|
set @fieldkey = '物料流水号'
|
||||||
|
set @where = @selectStrWhere
|
||||||
|
set @fieldshow =' [代号], [修改人], [修改日期], [单位], [单位流水号],[名称], [库位], [货位流水号], [操作日期],[文件内容],[文件后缀], [物料类型],[物料库流水号],
|
||||||
|
[是否启用], [是否禁用], [材料], [材料流水号],
|
||||||
|
[物料流水号], [物料编码], [类型], [类型名称], [物料说明],[规格],[曾用物料编码],[Expr1]' -- 修改人:Ld 修改时间:2026-08-03 07:55:23; 保持原输出字段并继续返回是否禁用状态
|
||||||
|
if @排序名称 = 1
|
||||||
|
begin
|
||||||
|
if @排序方式 = 1
|
||||||
|
begin
|
||||||
|
set @fieldOrder ='名称 DESC'
|
||||||
|
end
|
||||||
|
else
|
||||||
|
begin
|
||||||
|
set @fieldOrder = '名称 ASC'
|
||||||
|
end
|
||||||
|
end
|
||||||
|
else if @排序名称 = 2
|
||||||
|
begin
|
||||||
|
if @排序方式 = 1
|
||||||
|
begin
|
||||||
|
set @fieldOrder = '代号 DESC'
|
||||||
|
end
|
||||||
|
else
|
||||||
|
begin
|
||||||
|
set @fieldOrder = '代号 ASC'
|
||||||
|
end
|
||||||
|
end
|
||||||
|
else
|
||||||
|
begin
|
||||||
|
set @fieldOrder = '操作日期 DESC'
|
||||||
|
end
|
||||||
|
|
||||||
|
exec sp_xt_pagesplit @tbname,@fieldkey,@where,@fieldshow,@fieldOrder,'',@PageCurrent,@PageSize,@PageCount out,@ItemCount out
|
||||||
|
GO
|
||||||
211
sql/物料标准维护_禁用物料功能_正式库_20260804.sql
Normal file
@@ -0,0 +1,211 @@
|
|||||||
|
USE [ERPTOOL_JY]
|
||||||
|
GO
|
||||||
|
|
||||||
|
ALTER PROCEDURE [dbo].[物料管理_查询数据_分页]
|
||||||
|
@物料名称_check bit = null,
|
||||||
|
@物料名称 nvarchar(50) = null,
|
||||||
|
@物料编码_check bit = null,
|
||||||
|
@物料编码 nvarchar(50) = null,
|
||||||
|
@图号_check bit = null,
|
||||||
|
@图号 nvarchar(50) = null,
|
||||||
|
@类型_check bit = null,
|
||||||
|
@类型 int = null,
|
||||||
|
@时间_check bit = null,
|
||||||
|
@开始时间 nvarchar(50) = null,
|
||||||
|
@结束时间 nvarchar(50) = null,
|
||||||
|
@排序名称 int =null,
|
||||||
|
@排序方式 int =null,
|
||||||
|
@物料库_check bit = null,
|
||||||
|
@物料库 int = null,
|
||||||
|
@是否禁用_check bit = null, -- 修改人:Ld 修改时间:2026-08-04 08:34:47; 正式库支持前端切换查看启用/禁用物料
|
||||||
|
@是否禁用 bit = null, -- 修改人:Ld 修改时间:2026-08-04 08:34:47; 1 查询禁用物料,0 查询启用物料
|
||||||
|
|
||||||
|
@PageCurrent int=1, --要显示的页码
|
||||||
|
@PageSize int = 20, --每页的大小(记录数)
|
||||||
|
@PageCount int = '1111' OUTPUT, --总页数
|
||||||
|
@ItemCount int = '1111' OUTPUT --总记录数
|
||||||
|
AS
|
||||||
|
|
||||||
|
declare @selectStrWhere nvarchar(4000)
|
||||||
|
|
||||||
|
|
||||||
|
set @selectStrWhere = '1=1 ' -- 修改人:Ld 修改时间:2026-08-04 08:34:47; 默认条件改为可拼接启用状态
|
||||||
|
|
||||||
|
if (ISNULL(@是否禁用_check, 0) = 1) -- 修改人:Ld 修改时间:2026-08-04 08:34:47; 按按钮传入状态筛选禁用/启用物料
|
||||||
|
set @selectStrWhere = @selectStrWhere + ' and 是否禁用 = ' + str(ISNULL(@是否禁用, 0))
|
||||||
|
else
|
||||||
|
set @selectStrWhere = @selectStrWhere + ' and 是否禁用=0 '
|
||||||
|
|
||||||
|
|
||||||
|
--if(@物料名称_check = 1)
|
||||||
|
-- set @selectStrWhere = @selectStrWhere+' and 名称 like + ''%'' + @物料名称 + ''%'' '
|
||||||
|
--if(@时间_check = 1)
|
||||||
|
-- set @selectStrWhere = @selectStrWhere+' and 修改日期 >=@开始时间 and 修改日期 <=@结束时间 '
|
||||||
|
--if(@图号_check = 1)
|
||||||
|
-- set @selectStrWhere = @selectStrWhere+' and 代号 like + ''%'' + @图号 + ''%'' '
|
||||||
|
--if(@类型_check = 1)
|
||||||
|
-- set @selectStrWhere = @selectStrWhere+' and 类型 = @类型 '
|
||||||
|
|
||||||
|
|
||||||
|
if (@物料名称_check = 1)
|
||||||
|
if(@物料名称 is not null)
|
||||||
|
set @selectStrWhere = @selectStrWhere+' and 名称 like '+N'''%'+@物料名称+N'%'''
|
||||||
|
|
||||||
|
if (@物料编码_check = 1)
|
||||||
|
if(@物料编码 is not null)
|
||||||
|
set @selectStrWhere = @selectStrWhere+' and 物料编码 like '+N'''%'+@物料编码+N'%'''
|
||||||
|
|
||||||
|
|
||||||
|
if (@时间_check = 1)
|
||||||
|
if(@开始时间 is not null and @结束时间 is not null)
|
||||||
|
set @selectStrWhere = @selectStrWhere+' and ' + N''''+@开始时间+N'''' + '<=修改日期' + ' and '+ N''''+@结束时间+N'''' + '>=修改日期'
|
||||||
|
|
||||||
|
if (@图号_check = 1)
|
||||||
|
if(@图号 is not null)
|
||||||
|
set @selectStrWhere = @selectStrWhere+' and 代号 like '+N'''%'+@图号+N'%'''
|
||||||
|
|
||||||
|
if (@类型_check = 1)
|
||||||
|
if(@类型 is not null)
|
||||||
|
set @selectStrWhere = @selectStrWhere+' and 类型 = '+str(@类型)
|
||||||
|
|
||||||
|
---if (@物料库_check = 1)
|
||||||
|
-- if(@物料库 is not null)
|
||||||
|
-- set @selectStrWhere = @selectStrWhere+' and 物料库流水号 = '+ str(@物料库)
|
||||||
|
|
||||||
|
|
||||||
|
declare @tbname sysname --要分页显示的表名
|
||||||
|
declare @fieldkey sysname --用于定位记录的主键(唯一键)字段,只能是单个字段
|
||||||
|
declare @where nvarchar(4000) --查询条件
|
||||||
|
declare @fieldshow nvarchar(1000) --以逗号分隔的要显示的字段列表,如果不指定,则显示所有字段
|
||||||
|
declare @fieldOrder nvarchar(1000) ----以逗号分隔的排序字段列表,可以指定在字段后面指定DESC/ASC --不指定则按主键顺序
|
||||||
|
|
||||||
|
set @tbname = '物料视图'
|
||||||
|
set @fieldkey = '物料流水号'
|
||||||
|
set @where = @selectStrWhere
|
||||||
|
set @fieldshow =' [代号], [修改人], [修改日期], [单位], [单位流水号],[名称], [库位], [货位流水号], [操作日期],[文件内容],[文件后缀], [物料类型],[物料库流水号],
|
||||||
|
[是否启用], [是否禁用], [材料], [材料流水号],
|
||||||
|
[物料流水号], [物料编码], [类型], [类型名称], [物料说明],[规格],[曾用物料编码],[Expr1]' -- 修改人:Ld 修改时间:2026-08-04 08:34:47; 保持原输出字段并继续返回是否禁用状态
|
||||||
|
if @排序名称 = 1
|
||||||
|
begin
|
||||||
|
if @排序方式 = 1
|
||||||
|
begin
|
||||||
|
set @fieldOrder ='名称 DESC'
|
||||||
|
end
|
||||||
|
else
|
||||||
|
begin
|
||||||
|
set @fieldOrder = '名称 ASC'
|
||||||
|
end
|
||||||
|
end
|
||||||
|
else if @排序名称 = 2
|
||||||
|
begin
|
||||||
|
if @排序方式 = 1
|
||||||
|
begin
|
||||||
|
set @fieldOrder = '代号 DESC'
|
||||||
|
end
|
||||||
|
else
|
||||||
|
begin
|
||||||
|
set @fieldOrder = '代号 ASC'
|
||||||
|
end
|
||||||
|
end
|
||||||
|
else
|
||||||
|
begin
|
||||||
|
set @fieldOrder = '操作日期 DESC'
|
||||||
|
end
|
||||||
|
|
||||||
|
exec sp_xt_pagesplit @tbname,@fieldkey,@where,@fieldshow,@fieldOrder,'',@PageCurrent,@PageSize,@PageCount out,@ItemCount out
|
||||||
|
GO
|
||||||
|
|
||||||
|
ALTER PROCEDURE [dbo].[物料管理_删除]
|
||||||
|
@物料流水号 int=null
|
||||||
|
AS
|
||||||
|
BEGIN
|
||||||
|
SET NOCOUNT ON;
|
||||||
|
|
||||||
|
IF @物料流水号 IS NULL OR NOT EXISTS (SELECT 1 FROM dbo.库存管理_物料主文件_基本 WHERE 物料流水号 = @物料流水号)
|
||||||
|
BEGIN
|
||||||
|
SELECT '0' AS result, N'物料不存在' AS msg;
|
||||||
|
RETURN;
|
||||||
|
END
|
||||||
|
|
||||||
|
UPDATE dbo.库存管理_物料主文件_基本
|
||||||
|
SET 是否禁用 = 1
|
||||||
|
WHERE 物料流水号 = @物料流水号; -- 修改人:Ld 修改时间:2026-08-04 08:34:47; 删除保持原逻辑删除语义
|
||||||
|
|
||||||
|
DELETE FROM dbo.库存管理_物料_图片
|
||||||
|
WHERE 物料流水号 = @物料流水号; -- 修改人:Ld 修改时间:2026-08-04 08:34:47; 删除后继续清理物料图片
|
||||||
|
|
||||||
|
SELECT '1' AS result, N'删除成功' AS msg; -- 修改人:Ld 修改时间:2026-08-04 08:34:47; 返回前端可识别结果
|
||||||
|
END
|
||||||
|
GO
|
||||||
|
|
||||||
|
IF OBJECT_ID(N'[dbo].[物料管理_启用]', N'P') IS NOT NULL
|
||||||
|
DROP PROCEDURE [dbo].[物料管理_启用]
|
||||||
|
GO
|
||||||
|
|
||||||
|
CREATE PROCEDURE [dbo].[物料管理_启用]
|
||||||
|
@物料流水号 int=null,
|
||||||
|
@操作者 int=null
|
||||||
|
AS
|
||||||
|
BEGIN
|
||||||
|
SET NOCOUNT ON;
|
||||||
|
|
||||||
|
IF @物料流水号 IS NULL OR NOT EXISTS (SELECT 1 FROM dbo.库存管理_物料主文件_基本 WHERE 物料流水号 = @物料流水号)
|
||||||
|
BEGIN
|
||||||
|
SELECT '0' AS result, N'物料不存在' AS msg;
|
||||||
|
RETURN;
|
||||||
|
END
|
||||||
|
|
||||||
|
UPDATE dbo.库存管理_物料主文件_基本
|
||||||
|
SET 是否禁用 = 0,
|
||||||
|
修改人 = @操作者,
|
||||||
|
修改日期 = GETDATE()
|
||||||
|
WHERE 物料流水号 = @物料流水号; -- 修改人:Ld 修改时间:2026-08-04 08:34:47; 禁用物料重新启用
|
||||||
|
|
||||||
|
SELECT '1' AS result, N'启用成功' AS msg; -- 修改人:Ld 修改时间:2026-08-04 08:34:47; 返回前端可识别结果
|
||||||
|
END
|
||||||
|
GO
|
||||||
|
|
||||||
|
IF OBJECT_ID(N'[dbo].[物料管理_物理删除]', N'P') IS NOT NULL
|
||||||
|
DROP PROCEDURE [dbo].[物料管理_物理删除]
|
||||||
|
GO
|
||||||
|
|
||||||
|
CREATE PROCEDURE [dbo].[物料管理_物理删除]
|
||||||
|
@物料流水号 int=null
|
||||||
|
AS
|
||||||
|
BEGIN
|
||||||
|
SET NOCOUNT ON;
|
||||||
|
|
||||||
|
IF @物料流水号 IS NULL OR NOT EXISTS (SELECT 1 FROM dbo.库存管理_物料主文件_基本 WHERE 物料流水号 = @物料流水号)
|
||||||
|
BEGIN
|
||||||
|
SELECT '0' AS result, N'物料不存在' AS msg;
|
||||||
|
RETURN;
|
||||||
|
END
|
||||||
|
|
||||||
|
IF EXISTS (SELECT 1 FROM dbo.库存管理_物料主文件_基本 WHERE 物料流水号 = @物料流水号 AND ISNULL(是否禁用, 0) = 0)
|
||||||
|
BEGIN
|
||||||
|
SELECT '0' AS result, N'启用物料不能物理删除,请先删除禁用后再操作' AS msg;
|
||||||
|
RETURN;
|
||||||
|
END
|
||||||
|
|
||||||
|
BEGIN TRY
|
||||||
|
BEGIN TRAN;
|
||||||
|
|
||||||
|
DELETE FROM dbo.库存管理_物料_图片
|
||||||
|
WHERE 物料流水号 = @物料流水号; -- 修改人:Ld 修改时间:2026-08-04 08:34:47; 物理删除禁用物料时同步清理图片
|
||||||
|
|
||||||
|
DELETE FROM dbo.库存管理_物料主文件_基本
|
||||||
|
WHERE 物料流水号 = @物料流水号
|
||||||
|
AND ISNULL(是否禁用, 0) = 1; -- 修改人:Ld 修改时间:2026-08-04 08:34:47; 仅允许已禁用物料物理删除
|
||||||
|
|
||||||
|
COMMIT TRAN;
|
||||||
|
|
||||||
|
SELECT '1' AS result, N'永久删除成功' AS msg; -- 修改人:Ld 修改时间:2026-08-04 08:34:47; 返回前端可识别结果
|
||||||
|
END TRY
|
||||||
|
BEGIN CATCH
|
||||||
|
IF @@TRANCOUNT > 0
|
||||||
|
ROLLBACK TRAN;
|
||||||
|
|
||||||
|
SELECT '0' AS result, ERROR_MESSAGE() AS msg;
|
||||||
|
END CATCH
|
||||||
|
END
|
||||||
|
GO
|
||||||
52
sql/物料标准维护_禁用物料启用删除_测试库_20260803.sql
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
USE [ERPTOOL_JY_20250826Back]
|
||||||
|
GO
|
||||||
|
|
||||||
|
ALTER PROCEDURE [dbo].[物料管理_删除]
|
||||||
|
@物料流水号 int=null
|
||||||
|
AS
|
||||||
|
BEGIN
|
||||||
|
SET NOCOUNT ON;
|
||||||
|
|
||||||
|
IF @物料流水号 IS NULL OR NOT EXISTS (SELECT 1 FROM dbo.库存管理_物料主文件_基本 WHERE 物料流水号 = @物料流水号)
|
||||||
|
BEGIN
|
||||||
|
SELECT '0' AS result, N'物料不存在' AS msg;
|
||||||
|
RETURN;
|
||||||
|
END
|
||||||
|
|
||||||
|
UPDATE dbo.库存管理_物料主文件_基本
|
||||||
|
SET 是否禁用 = 1
|
||||||
|
WHERE 物料流水号 = @物料流水号; -- 修改人:Ld 修改时间:2026-08-03 08:15:00; 删除保持原逻辑删除语义
|
||||||
|
|
||||||
|
DELETE FROM dbo.库存管理_物料_图片
|
||||||
|
WHERE 物料流水号 = @物料流水号; -- 修改人:Ld 修改时间:2026-08-03 08:15:00; 删除后继续清理物料图片
|
||||||
|
|
||||||
|
SELECT '1' AS result, N'删除成功' AS msg; -- 修改人:Ld 修改时间:2026-08-03 08:15:00; 返回前端可识别结果
|
||||||
|
END
|
||||||
|
GO
|
||||||
|
|
||||||
|
IF OBJECT_ID(N'[dbo].[物料管理_启用]', N'P') IS NOT NULL
|
||||||
|
DROP PROCEDURE [dbo].[物料管理_启用]
|
||||||
|
GO
|
||||||
|
|
||||||
|
CREATE PROCEDURE [dbo].[物料管理_启用]
|
||||||
|
@物料流水号 int=null,
|
||||||
|
@操作者 int=null
|
||||||
|
AS
|
||||||
|
BEGIN
|
||||||
|
SET NOCOUNT ON;
|
||||||
|
|
||||||
|
IF @物料流水号 IS NULL OR NOT EXISTS (SELECT 1 FROM dbo.库存管理_物料主文件_基本 WHERE 物料流水号 = @物料流水号)
|
||||||
|
BEGIN
|
||||||
|
SELECT '0' AS result, N'物料不存在' AS msg;
|
||||||
|
RETURN;
|
||||||
|
END
|
||||||
|
|
||||||
|
UPDATE dbo.库存管理_物料主文件_基本
|
||||||
|
SET 是否禁用 = 0,
|
||||||
|
修改人 = @操作者,
|
||||||
|
修改日期 = GETDATE()
|
||||||
|
WHERE 物料流水号 = @物料流水号; -- 修改人:Ld 修改时间:2026-08-03 08:15:00; 禁用物料重新启用
|
||||||
|
|
||||||
|
SELECT '1' AS result, N'启用成功' AS msg; -- 修改人:Ld 修改时间:2026-08-03 08:15:00; 返回前端可识别结果
|
||||||
|
END
|
||||||
|
GO
|
||||||
47
sql/物料标准维护_禁用物料物理删除_测试库_20260803.sql
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
USE [ERPTOOL_JY_20250826Back]
|
||||||
|
GO
|
||||||
|
|
||||||
|
IF OBJECT_ID(N'[dbo].[物料管理_物理删除]', N'P') IS NOT NULL
|
||||||
|
DROP PROCEDURE [dbo].[物料管理_物理删除]
|
||||||
|
GO
|
||||||
|
|
||||||
|
CREATE PROCEDURE [dbo].[物料管理_物理删除]
|
||||||
|
@物料流水号 int=null
|
||||||
|
AS
|
||||||
|
BEGIN
|
||||||
|
SET NOCOUNT ON;
|
||||||
|
|
||||||
|
IF @物料流水号 IS NULL OR NOT EXISTS (SELECT 1 FROM dbo.库存管理_物料主文件_基本 WHERE 物料流水号 = @物料流水号)
|
||||||
|
BEGIN
|
||||||
|
SELECT '0' AS result, N'物料不存在' AS msg;
|
||||||
|
RETURN;
|
||||||
|
END
|
||||||
|
|
||||||
|
IF EXISTS (SELECT 1 FROM dbo.库存管理_物料主文件_基本 WHERE 物料流水号 = @物料流水号 AND ISNULL(是否禁用, 0) = 0)
|
||||||
|
BEGIN
|
||||||
|
SELECT '0' AS result, N'启用物料不能物理删除,请先删除禁用后再操作' AS msg;
|
||||||
|
RETURN;
|
||||||
|
END
|
||||||
|
|
||||||
|
BEGIN TRY
|
||||||
|
BEGIN TRAN;
|
||||||
|
|
||||||
|
DELETE FROM dbo.库存管理_物料_图片
|
||||||
|
WHERE 物料流水号 = @物料流水号; -- 修改人:Ld 修改时间:2026-08-03 08:35:00; 物理删除禁用物料时同步清理图片
|
||||||
|
|
||||||
|
DELETE FROM dbo.库存管理_物料主文件_基本
|
||||||
|
WHERE 物料流水号 = @物料流水号
|
||||||
|
AND ISNULL(是否禁用, 0) = 1; -- 修改人:Ld 修改时间:2026-08-03 08:35:00; 仅允许已禁用物料物理删除
|
||||||
|
|
||||||
|
COMMIT TRAN;
|
||||||
|
|
||||||
|
SELECT '1' AS result, N'永久删除成功' AS msg; -- 修改人:Ld 修改时间:2026-08-03 08:35:00; 返回前端可识别结果
|
||||||
|
END TRY
|
||||||
|
BEGIN CATCH
|
||||||
|
IF @@TRANCOUNT > 0
|
||||||
|
ROLLBACK TRAN;
|
||||||
|
|
||||||
|
SELECT '0' AS result, ERROR_MESSAGE() AS msg;
|
||||||
|
END CATCH
|
||||||
|
END
|
||||||
|
GO
|
||||||
185
sql/生产审核_操作者人名查询修复.sql
Normal file
@@ -0,0 +1,185 @@
|
|||||||
|
-- 生产审核操作者输入框按人名查询兼容工作者和录工票人员;修改人:Ld 修改时间:2026-07-23 16:08:35;
|
||||||
|
ALTER PROCEDURE [dbo].[机加工MES_加工完成整修审核_查询数据]
|
||||||
|
@审核状态_check INT = 0,
|
||||||
|
@审核状态 NVARCHAR(20) = N'',
|
||||||
|
@审核类型_check INT = 0,
|
||||||
|
@审核类型 NVARCHAR(50) = N'',
|
||||||
|
@操作者_check INT = 0,
|
||||||
|
@操作者 NVARCHAR(100) = N'',
|
||||||
|
@时间_check INT = 0,
|
||||||
|
@开始时间 NVARCHAR(20) = N'',
|
||||||
|
@结束时间 NVARCHAR(20) = N'',
|
||||||
|
@PageCurrent INT = 1,
|
||||||
|
@PageSize INT = 100
|
||||||
|
AS
|
||||||
|
BEGIN
|
||||||
|
SET NOCOUNT ON;
|
||||||
|
|
||||||
|
IF @PageCurrent IS NULL OR @PageCurrent < 1 SET @PageCurrent = 1;
|
||||||
|
IF @PageSize IS NULL OR @PageSize < 1 SET @PageSize = 100;
|
||||||
|
|
||||||
|
;WITH AuditData AS (
|
||||||
|
SELECT
|
||||||
|
ROW_NUMBER() OVER (
|
||||||
|
ORDER BY
|
||||||
|
CASE WHEN A.审核状态 = N'待审核' THEN 0 ELSE 1 END,
|
||||||
|
A.提交时间 DESC,
|
||||||
|
A.id DESC
|
||||||
|
) AS RowNum,
|
||||||
|
A.id,
|
||||||
|
A.审核类型,
|
||||||
|
A.审核状态,
|
||||||
|
V.订单号,
|
||||||
|
V.产品名称,
|
||||||
|
V.零件名称,
|
||||||
|
V.零件图号,
|
||||||
|
V.工序,
|
||||||
|
V.工艺计划流水号,
|
||||||
|
V.数量 AS 投产数量,
|
||||||
|
V.已完成数,
|
||||||
|
V.工序顺序,
|
||||||
|
V.物料编码,
|
||||||
|
V.材料,
|
||||||
|
A.工序流水号,
|
||||||
|
A.工作者考勤编号,
|
||||||
|
工作者.姓名 AS 工作者姓名,
|
||||||
|
A.完成数量,
|
||||||
|
A.完成类型,
|
||||||
|
ISNULL(NULLIF(A.计价方式, N''), N'计件') AS 计价方式,
|
||||||
|
CASE WHEN ISNULL(A.单件工价, 0) <> 0 THEN A.单件工价 ELSE ISNULL(priceData.单件工价, 0) END AS 单件工价,
|
||||||
|
ISNULL(A.单时工价, 0) AS 单时工价,
|
||||||
|
A.录工票人员编号,
|
||||||
|
录工票人员.姓名 AS 录工票人员姓名,
|
||||||
|
A.工位号,
|
||||||
|
ISNULL(SB.设备名称, A.设备名) AS 工位设备名称,
|
||||||
|
A.备注,
|
||||||
|
A.剩余工时,
|
||||||
|
A.剩余数量,
|
||||||
|
A.设备号,
|
||||||
|
A.设备名,
|
||||||
|
A.操作者,
|
||||||
|
-- 操作者人名查询兼容操作者、工作者和录工票人员;修改人:Ld 修改时间:2026-07-23 16:08:35;
|
||||||
|
COALESCE(操作者人员.姓名, 工作者.姓名, 录工票人员.姓名, A.操作者) AS 操作者姓名,
|
||||||
|
A.整修状态,
|
||||||
|
A.整修记录id,
|
||||||
|
A.整修方案,
|
||||||
|
CONVERT(VARCHAR(19), A.开始时间, 120) AS 开始时间,
|
||||||
|
CONVERT(VARCHAR(19), A.结束时间, 120) AS 结束时间,
|
||||||
|
CONVERT(VARCHAR(19), A.提交时间, 120) AS 提交时间,
|
||||||
|
A.审核人,
|
||||||
|
审核人员.姓名 AS 审核人姓名,
|
||||||
|
CONVERT(VARCHAR(19), A.审核时间, 120) AS 审核时间,
|
||||||
|
A.审核意见,
|
||||||
|
A.修改人,
|
||||||
|
CONVERT(VARCHAR(19), A.修改时间, 120) AS 修改时间
|
||||||
|
FROM [dbo].[MES_机加工MES_加工完成整修审核表] AS A
|
||||||
|
LEFT JOIN [dbo].[车间生产管理_零件工序_视图] AS V
|
||||||
|
ON A.工序流水号 = V.工序流水号
|
||||||
|
LEFT JOIN [dbo].[人事档案管理_人员名单] AS 工作者
|
||||||
|
ON A.工作者考勤编号 = 工作者.考勤编号
|
||||||
|
LEFT JOIN [dbo].[人事档案管理_人员名单] AS 录工票人员
|
||||||
|
ON A.录工票人员编号 = 录工票人员.序号
|
||||||
|
OR A.录工票人员编号 = 录工票人员.人员编号
|
||||||
|
LEFT JOIN [dbo].[人事档案管理_人员名单] AS 操作者人员
|
||||||
|
ON A.操作者 = CONVERT(NVARCHAR(100), 操作者人员.人员编号)
|
||||||
|
OR A.操作者 = CONVERT(NVARCHAR(100), 操作者人员.序号)
|
||||||
|
OR A.操作者 = 操作者人员.姓名
|
||||||
|
LEFT JOIN [dbo].[人事档案管理_人员名单] AS 审核人员
|
||||||
|
ON A.审核人 = CONVERT(NVARCHAR(100), 审核人员.人员编号)
|
||||||
|
OR A.审核人 = CONVERT(NVARCHAR(100), 审核人员.序号)
|
||||||
|
OR A.审核人 = 审核人员.姓名
|
||||||
|
LEFT JOIN [dbo].[基础数据_设备工位点检表] AS SB
|
||||||
|
ON A.工位号 = SB.工位号
|
||||||
|
OUTER APPLY (
|
||||||
|
SELECT TOP 1
|
||||||
|
CASE
|
||||||
|
WHEN ISNULL(price.[单件工价], 0) <> 0 THEN price.[单件工价]
|
||||||
|
ELSE ISNULL(price.[最终单价(元/件)], 0)
|
||||||
|
END AS 单件工价
|
||||||
|
FROM [dbo].[车间生产管理工艺_工序工价] price
|
||||||
|
WHERE price.工序流水号 = A.工序流水号
|
||||||
|
AND ISNULL(price.是否启用, 1) = 1
|
||||||
|
ORDER BY ISNULL(price.生效日期, CONVERT(DATE, '1900-01-01')) DESC, price.修改时间 DESC, price.工价流水号 DESC
|
||||||
|
) priceData
|
||||||
|
WHERE (@审核状态_check = 0 OR A.审核状态 = @审核状态)
|
||||||
|
AND (@审核类型_check = 0 OR A.审核类型 = @审核类型)
|
||||||
|
AND (
|
||||||
|
@操作者_check = 0
|
||||||
|
OR ISNULL(操作者人员.姓名, ISNULL(A.操作者, N'')) LIKE N'%' + @操作者 + N'%'
|
||||||
|
OR ISNULL(工作者.姓名, N'') LIKE N'%' + @操作者 + N'%'
|
||||||
|
OR ISNULL(录工票人员.姓名, N'') LIKE N'%' + @操作者 + N'%'
|
||||||
|
)
|
||||||
|
AND (@时间_check = 0 OR CONVERT(DATE, A.提交时间) BETWEEN CONVERT(DATE, @开始时间) AND CONVERT(DATE, @结束时间))
|
||||||
|
)
|
||||||
|
SELECT
|
||||||
|
id,
|
||||||
|
审核类型,
|
||||||
|
审核状态,
|
||||||
|
订单号,
|
||||||
|
产品名称,
|
||||||
|
零件名称,
|
||||||
|
零件图号,
|
||||||
|
工序,
|
||||||
|
工艺计划流水号,
|
||||||
|
投产数量,
|
||||||
|
已完成数,
|
||||||
|
工序顺序,
|
||||||
|
物料编码,
|
||||||
|
材料,
|
||||||
|
工序流水号,
|
||||||
|
工作者考勤编号,
|
||||||
|
工作者姓名,
|
||||||
|
完成数量,
|
||||||
|
完成类型,
|
||||||
|
计价方式,
|
||||||
|
单件工价,
|
||||||
|
单时工价,
|
||||||
|
录工票人员编号,
|
||||||
|
录工票人员姓名,
|
||||||
|
工位号,
|
||||||
|
工位设备名称,
|
||||||
|
备注,
|
||||||
|
剩余工时,
|
||||||
|
剩余数量,
|
||||||
|
设备号,
|
||||||
|
设备名,
|
||||||
|
操作者,
|
||||||
|
操作者姓名,
|
||||||
|
整修状态,
|
||||||
|
整修记录id,
|
||||||
|
整修方案,
|
||||||
|
开始时间,
|
||||||
|
结束时间,
|
||||||
|
提交时间,
|
||||||
|
审核人,
|
||||||
|
审核人姓名,
|
||||||
|
审核时间,
|
||||||
|
审核意见,
|
||||||
|
修改人,
|
||||||
|
修改时间
|
||||||
|
FROM AuditData
|
||||||
|
WHERE RowNum BETWEEN ((@PageCurrent - 1) * @PageSize + 1) AND (@PageCurrent * @PageSize)
|
||||||
|
ORDER BY RowNum;
|
||||||
|
|
||||||
|
SELECT COUNT(1) AS total
|
||||||
|
FROM [dbo].[MES_机加工MES_加工完成整修审核表] AS A
|
||||||
|
LEFT JOIN [dbo].[人事档案管理_人员名单] AS 工作者
|
||||||
|
ON A.工作者考勤编号 = 工作者.考勤编号
|
||||||
|
LEFT JOIN [dbo].[人事档案管理_人员名单] AS 录工票人员
|
||||||
|
ON A.录工票人员编号 = 录工票人员.序号
|
||||||
|
OR A.录工票人员编号 = 录工票人员.人员编号
|
||||||
|
LEFT JOIN [dbo].[人事档案管理_人员名单] AS 操作者人员
|
||||||
|
ON A.操作者 = CONVERT(NVARCHAR(100), 操作者人员.人员编号)
|
||||||
|
OR A.操作者 = CONVERT(NVARCHAR(100), 操作者人员.序号)
|
||||||
|
OR A.操作者 = 操作者人员.姓名
|
||||||
|
WHERE (@审核状态_check = 0 OR A.审核状态 = @审核状态)
|
||||||
|
AND (@审核类型_check = 0 OR A.审核类型 = @审核类型)
|
||||||
|
AND (
|
||||||
|
@操作者_check = 0
|
||||||
|
OR ISNULL(操作者人员.姓名, ISNULL(A.操作者, N'')) LIKE N'%' + @操作者 + N'%'
|
||||||
|
OR ISNULL(工作者.姓名, N'') LIKE N'%' + @操作者 + N'%'
|
||||||
|
OR ISNULL(录工票人员.姓名, N'') LIKE N'%' + @操作者 + N'%'
|
||||||
|
)
|
||||||
|
AND (@时间_check = 0 OR CONVERT(DATE, A.提交时间) BETWEEN CONVERT(DATE, @开始时间) AND CONVERT(DATE, @结束时间));
|
||||||
|
END;
|
||||||
|
GO
|
||||||
@@ -21,6 +21,9 @@ BEGIN
|
|||||||
DECLARE @原完成数量 FLOAT;
|
DECLARE @原完成数量 FLOAT;
|
||||||
DECLARE @最终完成数量 FLOAT;
|
DECLARE @最终完成数量 FLOAT;
|
||||||
DECLARE @数量差 FLOAT;
|
DECLARE @数量差 FLOAT;
|
||||||
|
DECLARE @投产数量 FLOAT;
|
||||||
|
DECLARE @当前工序完成数量 FLOAT;
|
||||||
|
DECLARE @修改后工序完成数量 FLOAT;
|
||||||
DECLARE @录工票人员编号 INT;
|
DECLARE @录工票人员编号 INT;
|
||||||
DECLARE @工位号 NVARCHAR(100);
|
DECLARE @工位号 NVARCHAR(100);
|
||||||
DECLARE @设备流水号 INT;
|
DECLARE @设备流水号 INT;
|
||||||
@@ -91,6 +94,24 @@ BEGIN
|
|||||||
RETURN;
|
RETURN;
|
||||||
END;
|
END;
|
||||||
|
|
||||||
|
-- 修改完成数量后的累计结果不能超过投产数量;修改人:Ld 修改时间:2026-07-23 16:22:46;
|
||||||
|
IF @是否修改加工 = 1 AND @审核完成数量 IS NOT NULL
|
||||||
|
BEGIN
|
||||||
|
SELECT
|
||||||
|
@投产数量 = ISNULL(V.数量, 0),
|
||||||
|
@当前工序完成数量 = ISNULL(V.已完成数, 0)
|
||||||
|
FROM [dbo].[车间生产管理_零件工序_视图] AS V
|
||||||
|
WHERE V.工序流水号 = @工序流水号;
|
||||||
|
|
||||||
|
SET @修改后工序完成数量 = ISNULL(@当前工序完成数量, 0) + ISNULL(@数量差, 0);
|
||||||
|
|
||||||
|
IF ISNULL(@投产数量, 0) > 0 AND @修改后工序完成数量 > @投产数量
|
||||||
|
BEGIN
|
||||||
|
SELECT N'0' AS result, N'修改后的已完成数不能超过投产数量' AS message;
|
||||||
|
RETURN;
|
||||||
|
END;
|
||||||
|
END;
|
||||||
|
|
||||||
SELECT TOP 1 @单件工价 = CASE
|
SELECT TOP 1 @单件工价 = CASE
|
||||||
WHEN ISNULL(price.[单件工价], 0) <> 0 THEN price.[单件工价]
|
WHEN ISNULL(price.[单件工价], 0) <> 0 THEN price.[单件工价]
|
||||||
ELSE ISNULL(price.[最终单价(元/件)], 0)
|
ELSE ISNULL(price.[最终单价(元/件)], 0)
|
||||||
|
|||||||
105
sql/车间派工移动端菜单_正式库_20260804.sql
Normal file
@@ -0,0 +1,105 @@
|
|||||||
|
/* 修改人:Ld 修改时间:2026-08-04 14:33:59; 同步车间派工移动端菜单到正式库 */
|
||||||
|
SET XACT_ABORT ON;
|
||||||
|
BEGIN TRAN;
|
||||||
|
|
||||||
|
DECLARE @ModuleId INT;
|
||||||
|
|
||||||
|
SELECT @ModuleId = id
|
||||||
|
FROM dbo.基础表_模块信息
|
||||||
|
WHERE [path] = N'SeikoWorkshop/WorkshopAssignmentMobile';
|
||||||
|
|
||||||
|
IF @ModuleId IS NULL
|
||||||
|
BEGIN
|
||||||
|
INSERT INTO dbo.基础表_模块信息
|
||||||
|
(
|
||||||
|
[path],
|
||||||
|
component,
|
||||||
|
redirect,
|
||||||
|
name,
|
||||||
|
title,
|
||||||
|
icon,
|
||||||
|
是否通知,
|
||||||
|
消息通知来源,
|
||||||
|
通知条件,
|
||||||
|
dashboardIcon,
|
||||||
|
是否禁用
|
||||||
|
)
|
||||||
|
VALUES
|
||||||
|
(
|
||||||
|
N'SeikoWorkshop/WorkshopAssignmentMobile',
|
||||||
|
N'/SeikoWorkshop/WorkshopAssignmentMobile',
|
||||||
|
NULL,
|
||||||
|
N'WorkshopAssignmentMobile',
|
||||||
|
N'车间派工移动端',
|
||||||
|
N'ShopScheduling',
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
0
|
||||||
|
);
|
||||||
|
|
||||||
|
SET @ModuleId = SCOPE_IDENTITY();
|
||||||
|
END
|
||||||
|
ELSE
|
||||||
|
BEGIN
|
||||||
|
UPDATE dbo.基础表_模块信息
|
||||||
|
SET component = N'/SeikoWorkshop/WorkshopAssignmentMobile',
|
||||||
|
redirect = NULL,
|
||||||
|
name = N'WorkshopAssignmentMobile',
|
||||||
|
title = N'车间派工移动端',
|
||||||
|
icon = N'ShopScheduling',
|
||||||
|
是否禁用 = 0
|
||||||
|
WHERE id = @ModuleId;
|
||||||
|
END;
|
||||||
|
|
||||||
|
/* 修改人:Ld 修改时间:2026-08-04 14:33:59; 按测试库配置给角色2追加精工车间移动端派工菜单权限 */
|
||||||
|
IF NOT EXISTS
|
||||||
|
(
|
||||||
|
SELECT 1
|
||||||
|
FROM dbo.基础表_角色模块信息
|
||||||
|
WHERE id = @ModuleId
|
||||||
|
AND pid = 26
|
||||||
|
AND 角色编号 = 2
|
||||||
|
)
|
||||||
|
BEGIN
|
||||||
|
INSERT INTO dbo.基础表_角色模块信息
|
||||||
|
(
|
||||||
|
id,
|
||||||
|
pid,
|
||||||
|
模块顺序,
|
||||||
|
角色编号,
|
||||||
|
是否启用,
|
||||||
|
角色模块顺序
|
||||||
|
)
|
||||||
|
SELECT
|
||||||
|
@ModuleId,
|
||||||
|
26,
|
||||||
|
@ModuleId,
|
||||||
|
2,
|
||||||
|
1,
|
||||||
|
ISNULL(MAX(角色模块顺序), 0) + 1
|
||||||
|
FROM dbo.基础表_角色模块信息
|
||||||
|
WHERE 角色编号 = 2
|
||||||
|
AND pid = 26;
|
||||||
|
END
|
||||||
|
ELSE
|
||||||
|
BEGIN
|
||||||
|
UPDATE dbo.基础表_角色模块信息
|
||||||
|
SET 是否启用 = 1
|
||||||
|
WHERE id = @ModuleId
|
||||||
|
AND pid = 26
|
||||||
|
AND 角色编号 = 2;
|
||||||
|
END;
|
||||||
|
|
||||||
|
SELECT @ModuleId AS 模块ID;
|
||||||
|
SELECT id, [path], component, name, title, icon, 是否禁用
|
||||||
|
FROM dbo.基础表_模块信息
|
||||||
|
WHERE id = @ModuleId;
|
||||||
|
|
||||||
|
SELECT id, pid, 模块顺序, 角色编号, 是否启用, 角色模块顺序
|
||||||
|
FROM dbo.基础表_角色模块信息
|
||||||
|
WHERE id = @ModuleId
|
||||||
|
ORDER BY 角色编号;
|
||||||
|
|
||||||
|
COMMIT TRAN;
|
||||||
107
sql/采购合同生成入库单移动端菜单_测试库_20260729.sql
Normal file
@@ -0,0 +1,107 @@
|
|||||||
|
/* 修改人:Ld 修改时间:2026-07-29 15:27:40; 新增采购合同生成入库单移动端页面测试库菜单 */
|
||||||
|
SET XACT_ABORT ON;
|
||||||
|
BEGIN TRAN;
|
||||||
|
|
||||||
|
DECLARE @ModuleId INT;
|
||||||
|
|
||||||
|
SELECT @ModuleId = id
|
||||||
|
FROM dbo.基础表_模块信息
|
||||||
|
WHERE [path] = N'PurchasingManagement/PurchaseInboundCreateMobile';
|
||||||
|
|
||||||
|
IF @ModuleId IS NULL
|
||||||
|
BEGIN
|
||||||
|
INSERT INTO dbo.基础表_模块信息
|
||||||
|
(
|
||||||
|
[path],
|
||||||
|
component,
|
||||||
|
redirect,
|
||||||
|
name,
|
||||||
|
title,
|
||||||
|
icon,
|
||||||
|
是否通知,
|
||||||
|
消息通知来源,
|
||||||
|
通知条件,
|
||||||
|
dashboardIcon,
|
||||||
|
是否禁用
|
||||||
|
)
|
||||||
|
VALUES
|
||||||
|
(
|
||||||
|
N'PurchasingManagement/PurchaseInboundCreateMobile',
|
||||||
|
N'/PurchasingManagement/PurchaseInboundCreateMobile',
|
||||||
|
NULL,
|
||||||
|
N'PurchaseInboundCreateMobile',
|
||||||
|
N'生成入库单(移动端)',
|
||||||
|
N'PurchasePartsStorage',
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
0
|
||||||
|
);
|
||||||
|
|
||||||
|
SET @ModuleId = SCOPE_IDENTITY();
|
||||||
|
END
|
||||||
|
ELSE
|
||||||
|
BEGIN
|
||||||
|
UPDATE dbo.基础表_模块信息
|
||||||
|
SET component = N'/PurchasingManagement/PurchaseInboundCreateMobile',
|
||||||
|
redirect = NULL,
|
||||||
|
name = N'PurchaseInboundCreateMobile',
|
||||||
|
title = N'生成入库单(移动端)',
|
||||||
|
icon = N'PurchasePartsStorage',
|
||||||
|
是否禁用 = 0
|
||||||
|
WHERE id = @ModuleId;
|
||||||
|
END;
|
||||||
|
|
||||||
|
/* 修改人:Ld 修改时间:2026-07-29 15:27:40; 给已拥有采购合同查询的采购管理角色追加新菜单权限 */
|
||||||
|
;WITH RoleList AS
|
||||||
|
(
|
||||||
|
SELECT DISTINCT 角色编号
|
||||||
|
FROM dbo.基础表_角色模块信息
|
||||||
|
WHERE id = 36
|
||||||
|
AND pid = 34
|
||||||
|
AND ISNULL(是否启用, 1) = 1
|
||||||
|
)
|
||||||
|
INSERT INTO dbo.基础表_角色模块信息
|
||||||
|
(
|
||||||
|
id,
|
||||||
|
pid,
|
||||||
|
模块顺序,
|
||||||
|
角色编号,
|
||||||
|
是否启用,
|
||||||
|
角色模块顺序
|
||||||
|
)
|
||||||
|
SELECT
|
||||||
|
@ModuleId,
|
||||||
|
34,
|
||||||
|
@ModuleId,
|
||||||
|
RoleList.角色编号,
|
||||||
|
1,
|
||||||
|
ISNULL(RoleOrder.MaxOrder, 0) + 1
|
||||||
|
FROM RoleList
|
||||||
|
OUTER APPLY
|
||||||
|
(
|
||||||
|
SELECT MAX(角色模块顺序) AS MaxOrder
|
||||||
|
FROM dbo.基础表_角色模块信息
|
||||||
|
WHERE 角色编号 = RoleList.角色编号
|
||||||
|
AND pid = 34
|
||||||
|
) RoleOrder
|
||||||
|
WHERE NOT EXISTS
|
||||||
|
(
|
||||||
|
SELECT 1
|
||||||
|
FROM dbo.基础表_角色模块信息
|
||||||
|
WHERE id = @ModuleId
|
||||||
|
AND pid = 34
|
||||||
|
AND 角色编号 = RoleList.角色编号
|
||||||
|
);
|
||||||
|
|
||||||
|
SELECT @ModuleId AS 新增模块ID;
|
||||||
|
SELECT *
|
||||||
|
FROM dbo.基础表_模块信息
|
||||||
|
WHERE id = @ModuleId;
|
||||||
|
SELECT *
|
||||||
|
FROM dbo.基础表_角色模块信息
|
||||||
|
WHERE id = @ModuleId
|
||||||
|
ORDER BY 角色编号;
|
||||||
|
|
||||||
|
COMMIT TRAN;
|
||||||
234
sql/采购明细_PDM源跟随变更_测试库.sql
Normal file
@@ -0,0 +1,234 @@
|
|||||||
|
/* 采购合同明细跟随PDM标准外购件源流水号变更(测试库)
|
||||||
|
修改人:Ld 修改时间:2026-07-24 10:48:00;
|
||||||
|
*/
|
||||||
|
SET NOCOUNT ON;
|
||||||
|
|
||||||
|
IF OBJECT_ID(N'dbo.GPT_采购明细PDM跟随变更_待处理', N'U') IS NULL
|
||||||
|
BEGIN
|
||||||
|
CREATE TABLE dbo.GPT_采购明细PDM跟随变更_待处理
|
||||||
|
(
|
||||||
|
ID int IDENTITY(1,1) NOT NULL PRIMARY KEY,
|
||||||
|
项目流水号 int NULL,
|
||||||
|
订单流水号 int NULL,
|
||||||
|
机床流水号 int NULL,
|
||||||
|
旧组件流水号 int NULL,
|
||||||
|
旧产品名称 nvarchar(200) NULL,
|
||||||
|
采购合同流水号 int NULL,
|
||||||
|
采购合同明细流水号 int NOT NULL,
|
||||||
|
旧标准件和外购件流水号 int NOT NULL,
|
||||||
|
物料流水号 int NOT NULL,
|
||||||
|
旧零件数量 int NULL,
|
||||||
|
新组件流水号 int NULL,
|
||||||
|
新标准件和外购件流水号 int NULL,
|
||||||
|
处理状态 int NOT NULL CONSTRAINT DF_GPT_采购明细PDM跟随变更_待处理_处理状态 DEFAULT(0),
|
||||||
|
处理说明 nvarchar(400) NULL,
|
||||||
|
创建时间 datetime NOT NULL CONSTRAINT DF_GPT_采购明细PDM跟随变更_待处理_创建时间 DEFAULT(GETDATE()),
|
||||||
|
处理时间 datetime NULL,
|
||||||
|
修改人 nvarchar(50) NULL,
|
||||||
|
修改时间 datetime NULL
|
||||||
|
);
|
||||||
|
END;
|
||||||
|
GO
|
||||||
|
|
||||||
|
IF OBJECT_ID(N'dbo.GPT_采购明细PDM跟随变更_执行', N'P') IS NOT NULL
|
||||||
|
DROP PROCEDURE dbo.GPT_采购明细PDM跟随变更_执行;
|
||||||
|
GO
|
||||||
|
|
||||||
|
CREATE PROCEDURE dbo.GPT_采购明细PDM跟随变更_执行
|
||||||
|
@新组件流水号 int
|
||||||
|
AS
|
||||||
|
BEGIN
|
||||||
|
SET NOCOUNT ON;
|
||||||
|
|
||||||
|
DECLARE @项目流水号 int;
|
||||||
|
DECLARE @订单流水号 int;
|
||||||
|
DECLARE @机床流水号 int;
|
||||||
|
|
||||||
|
SELECT TOP 1
|
||||||
|
@项目流水号 = v.项目流水号,
|
||||||
|
@订单流水号 = v.订单流水号,
|
||||||
|
@机床流水号 = c.机床流水号
|
||||||
|
FROM dbo.PDM_组件名称 c
|
||||||
|
LEFT JOIN dbo.PDM_组件名称_视图 v ON v.组件流水号 = c.组件流水号
|
||||||
|
WHERE c.组件流水号 = @新组件流水号;
|
||||||
|
|
||||||
|
DECLARE @Map TABLE
|
||||||
|
(
|
||||||
|
ID int PRIMARY KEY,
|
||||||
|
采购合同明细流水号 int NOT NULL,
|
||||||
|
新标准件和外购件流水号 int NOT NULL
|
||||||
|
);
|
||||||
|
|
||||||
|
;WITH MatchRows AS
|
||||||
|
(
|
||||||
|
SELECT
|
||||||
|
p.ID,
|
||||||
|
p.采购合同明细流水号,
|
||||||
|
n.标准件和外购件流水号 AS 新标准件和外购件流水号,
|
||||||
|
ROW_NUMBER() OVER(PARTITION BY p.ID ORDER BY n.标准件和外购件流水号) AS rn
|
||||||
|
FROM dbo.GPT_采购明细PDM跟随变更_待处理 p
|
||||||
|
INNER JOIN dbo.采购管理_采购合同明细 d
|
||||||
|
ON d.采购合同明细流水号 = p.采购合同明细流水号
|
||||||
|
AND d.标准件和外购件流水号 = p.旧标准件和外购件流水号
|
||||||
|
INNER JOIN dbo.PDM_零件明细表_标准件和外购件 n
|
||||||
|
ON n.组件流水号 = @新组件流水号
|
||||||
|
AND n.物料流水号 = p.物料流水号
|
||||||
|
WHERE p.处理状态 = 0
|
||||||
|
AND ISNULL(p.项目流水号, 0) = ISNULL(@项目流水号, 0)
|
||||||
|
AND ISNULL(p.订单流水号, 0) = ISNULL(@订单流水号, 0)
|
||||||
|
AND ISNULL(p.机床流水号, 0) = ISNULL(@机床流水号, 0)
|
||||||
|
AND ISNULL(d.已到货数量, 0) = 0
|
||||||
|
AND NOT EXISTS (SELECT 1 FROM dbo.库存管理_外购件_入库记录 r WHERE r.采购合同明细流水号 = d.采购合同明细流水号)
|
||||||
|
AND NOT EXISTS (SELECT 1 FROM dbo.质检管理_质检记录_主表 q WHERE q.零部件流水号 = d.采购合同明细流水号 AND ISNULL(q.是否禁用, 0) = 0)
|
||||||
|
AND NOT EXISTS (SELECT 1 FROM dbo.采购管理_采购批次 b WHERE b.采购合同明细流水号 = d.采购合同明细流水号 AND (ISNULL(b.是否入库, 0) <> 0 OR ISNULL(b.已到数, 0) <> 0))
|
||||||
|
AND NOT EXISTS (SELECT 1 FROM dbo.采购管理_采购合同明细 d2 WHERE d2.采购合同流水号 = d.采购合同流水号 AND d2.标准件和外购件流水号 = n.标准件和外购件流水号 AND d2.采购合同明细流水号 <> d.采购合同明细流水号)
|
||||||
|
)
|
||||||
|
INSERT INTO @Map(ID, 采购合同明细流水号, 新标准件和外购件流水号)
|
||||||
|
SELECT ID, 采购合同明细流水号, 新标准件和外购件流水号
|
||||||
|
FROM MatchRows
|
||||||
|
WHERE rn = 1;
|
||||||
|
|
||||||
|
-- 采购明细未发生到货、入库、质检时,允许跟随到同项目同机床同物料的新PDM源流水号;修改人:Ld 修改时间:2026-07-24 10:48:00;
|
||||||
|
UPDATE d
|
||||||
|
SET d.标准件和外购件流水号 = m.新标准件和外购件流水号
|
||||||
|
FROM dbo.采购管理_采购合同明细 d
|
||||||
|
INNER JOIN @Map m ON m.采购合同明细流水号 = d.采购合同明细流水号;
|
||||||
|
|
||||||
|
UPDATE p
|
||||||
|
SET p.新组件流水号 = @新组件流水号,
|
||||||
|
p.新标准件和外购件流水号 = m.新标准件和外购件流水号,
|
||||||
|
p.处理状态 = 1,
|
||||||
|
p.处理说明 = N'已按同项目同机床同物料自动跟随到新PDM标准外购件流水号',
|
||||||
|
p.处理时间 = GETDATE(),
|
||||||
|
p.修改人 = N'Ld',
|
||||||
|
p.修改时间 = GETDATE()
|
||||||
|
FROM dbo.GPT_采购明细PDM跟随变更_待处理 p
|
||||||
|
INNER JOIN @Map m ON m.ID = p.ID;
|
||||||
|
END;
|
||||||
|
GO
|
||||||
|
|
||||||
|
DECLARE @def nvarchar(max);
|
||||||
|
|
||||||
|
SELECT @def = OBJECT_DEFINITION(OBJECT_ID(N'dbo.PDM_组件名称_确认更改新'));
|
||||||
|
IF @def NOT LIKE N'%GPT_采购明细PDM跟随变更_待处理%'
|
||||||
|
BEGIN
|
||||||
|
SET @def = REPLACE(@def, N'CREATE PROCEDURE [dbo].[PDM_组件名称_确认更改新]', N'ALTER PROCEDURE [dbo].[PDM_组件名称_确认更改新]');
|
||||||
|
SET @def = REPLACE(@def, N'CREATE PROCEDURE [dbo].[PDM_组件名称_确认更改新]', N'ALTER PROCEDURE [dbo].[PDM_组件名称_确认更改新]');
|
||||||
|
SET @def = REPLACE(@def, N'CREATE PROCEDURE [dbo].[PDM_组件名称_确认更改新]', N'ALTER PROCEDURE [dbo].[PDM_组件名称_确认更改新]');
|
||||||
|
|
||||||
|
SET @def = REPLACE(@def,
|
||||||
|
N' if @产品流水号临时 <> @产品流水号
|
||||||
|
begin
|
||||||
|
update dbo.PDM_组件名称 set 修改状态 = 2,是否分配 = 0 where 组件流水号 = @orderN',
|
||||||
|
N' if @产品流水号临时 <> @产品流水号
|
||||||
|
begin
|
||||||
|
-- 记录被产品替换影响且已加入采购合同的PDM标准外购件,后续新BOM生成后自动跟随;修改人:Ld 修改时间:2026-07-24 10:48:00;
|
||||||
|
INSERT INTO dbo.GPT_采购明细PDM跟随变更_待处理(项目流水号,订单流水号,机床流水号,旧组件流水号,旧产品名称,采购合同流水号,采购合同明细流水号,旧标准件和外购件流水号,物料流水号,旧零件数量,修改人,修改时间)
|
||||||
|
SELECT DISTINCT @项目流水号,@订单流水号,@机床流水号,@orderN,@产品名称,d.采购合同流水号,d.采购合同明细流水号,s.标准件和外购件流水号,s.物料流水号,s.零件数量,N''Ld'',GETDATE()
|
||||||
|
FROM dbo.PDM_零件明细表_标准件和外购件 s
|
||||||
|
INNER JOIN dbo.采购管理_采购合同明细 d ON d.标准件和外购件流水号 = s.标准件和外购件流水号
|
||||||
|
WHERE s.组件流水号 = @orderN
|
||||||
|
AND NOT EXISTS (SELECT 1 FROM dbo.GPT_采购明细PDM跟随变更_待处理 p WHERE p.处理状态 = 0 AND p.采购合同明细流水号 = d.采购合同明细流水号 AND p.旧标准件和外购件流水号 = s.标准件和外购件流水号);
|
||||||
|
|
||||||
|
update dbo.PDM_组件名称 set 修改状态 = 2,是否分配 = 0 where 组件流水号 = @orderN');
|
||||||
|
|
||||||
|
SET @def = REPLACE(@def,
|
||||||
|
N'delete from 车间装配管理_装配任务 where 组件流水号 in (select 组件流水号 from PDM_组件名称 where 组件流水号 not in (select 组件流水号 from PDM_组件名称_修改记录_临时表 where 机床流水号=@机床流水号 and 组件流水号 is not null) and 机床流水号=@机床流水号 and 是否合同创建 = 1 and 产品状态 = 0)',
|
||||||
|
N'-- 记录删除组件影响且已加入采购合同的PDM标准外购件,后续新BOM生成后自动跟随;修改人:Ld 修改时间:2026-07-24 10:48:00;
|
||||||
|
insert into dbo.GPT_采购明细PDM跟随变更_待处理(项目流水号,订单流水号,机床流水号,旧组件流水号,旧产品名称,采购合同流水号,采购合同明细流水号,旧标准件和外购件流水号,物料流水号,旧零件数量,修改人,修改时间)
|
||||||
|
select distinct @项目流水号,@订单流水号,@机床流水号,c.组件流水号,c.产品名称,d.采购合同流水号,d.采购合同明细流水号,s.标准件和外购件流水号,s.物料流水号,s.零件数量,N''Ld'',GETDATE()
|
||||||
|
from dbo.PDM_组件名称 c
|
||||||
|
inner join dbo.PDM_零件明细表_标准件和外购件 s on s.组件流水号 = c.组件流水号
|
||||||
|
inner join dbo.采购管理_采购合同明细 d on d.标准件和外购件流水号 = s.标准件和外购件流水号
|
||||||
|
where c.组件流水号 not in (select 组件流水号 from PDM_组件名称_修改记录_临时表 where 机床流水号=@机床流水号 and 组件流水号 is not null)
|
||||||
|
and c.机床流水号=@机床流水号 and c.是否合同创建 = 1 and c.产品状态 = 0
|
||||||
|
and not exists (select 1 from dbo.GPT_采购明细PDM跟随变更_待处理 p where p.处理状态 = 0 and p.采购合同明细流水号 = d.采购合同明细流水号 and p.旧标准件和外购件流水号 = s.标准件和外购件流水号);
|
||||||
|
|
||||||
|
delete from 车间装配管理_装配任务 where 组件流水号 in (select 组件流水号 from PDM_组件名称 where 组件流水号 not in (select 组件流水号 from PDM_组件名称_修改记录_临时表 where 机床流水号=@机床流水号 and 组件流水号 is not null) and 机床流水号=@机床流水号 and 是否合同创建 = 1 and 产品状态 = 0)');
|
||||||
|
|
||||||
|
EXEC(@def);
|
||||||
|
END;
|
||||||
|
GO
|
||||||
|
|
||||||
|
DECLARE @def2 nvarchar(max);
|
||||||
|
|
||||||
|
SELECT @def2 = OBJECT_DEFINITION(OBJECT_ID(N'dbo.技术确认_刷新BOM'));
|
||||||
|
IF @def2 NOT LIKE N'%GPT_采购明细PDM跟随变更_执行%'
|
||||||
|
BEGIN
|
||||||
|
SET @def2 = REPLACE(@def2, N'CREATE PROCEDURE [dbo].[技术确认_刷新BOM]', N'ALTER PROCEDURE [dbo].[技术确认_刷新BOM]');
|
||||||
|
SET @def2 = REPLACE(@def2, N'CREATE PROCEDURE [dbo].[技术确认_刷新BOM]', N'ALTER PROCEDURE [dbo].[技术确认_刷新BOM]');
|
||||||
|
SET @def2 = @def2 + N'
|
||||||
|
|
||||||
|
-- 新BOM标准外购件生成后,回填采购合同明细PDM源流水号;修改人:Ld 修改时间:2026-07-24 10:48:00;
|
||||||
|
EXEC dbo.GPT_采购明细PDM跟随变更_执行 @新组件流水号 = @组件流水号
|
||||||
|
';
|
||||||
|
EXEC(@def2);
|
||||||
|
END;
|
||||||
|
GO
|
||||||
|
|
||||||
|
DECLARE @def3 nvarchar(max);
|
||||||
|
|
||||||
|
SELECT @def3 = OBJECT_DEFINITION(OBJECT_ID(N'dbo.PDM_组件名称_老组件_增加数据_批量零件'));
|
||||||
|
IF @def3 NOT LIKE N'%GPT_采购明细PDM跟随变更_执行%'
|
||||||
|
BEGIN
|
||||||
|
SET @def3 = REPLACE(@def3, N'CREATE PROCEDURE [dbo].[PDM_组件名称_老组件_增加数据_批量零件]', N'ALTER PROCEDURE [dbo].[PDM_组件名称_老组件_增加数据_批量零件]');
|
||||||
|
SET @def3 = @def3 + N'
|
||||||
|
|
||||||
|
-- 批量新增标准外购件后,回填采购合同明细PDM源流水号;修改人:Ld 修改时间:2026-07-24 10:48:00;
|
||||||
|
EXEC dbo.GPT_采购明细PDM跟随变更_执行 @新组件流水号 = @组件流水号
|
||||||
|
';
|
||||||
|
EXEC(@def3);
|
||||||
|
END;
|
||||||
|
GO
|
||||||
|
|
||||||
|
DECLARE @def4 nvarchar(max);
|
||||||
|
|
||||||
|
SELECT @def4 = OBJECT_DEFINITION(OBJECT_ID(N'dbo.PDM_组件名称_增加数据_批量零件'));
|
||||||
|
IF @def4 NOT LIKE N'%GPT_采购明细PDM跟随变更_执行%'
|
||||||
|
BEGIN
|
||||||
|
SET @def4 = REPLACE(@def4, N'CREATE PROCEDURE [dbo].[PDM_组件名称_增加数据_批量零件]', N'ALTER PROCEDURE [dbo].[PDM_组件名称_增加数据_批量零件]');
|
||||||
|
SET @def4 = @def4 + N'
|
||||||
|
|
||||||
|
-- 新组件批量新增标准外购件后,回填采购合同明细PDM源流水号;修改人:Ld 修改时间:2026-07-24 10:48:00;
|
||||||
|
EXEC dbo.GPT_采购明细PDM跟随变更_执行 @新组件流水号 = @组件流水号
|
||||||
|
';
|
||||||
|
EXEC(@def4);
|
||||||
|
END;
|
||||||
|
GO
|
||||||
|
|
||||||
|
DECLARE @def5 nvarchar(max);
|
||||||
|
|
||||||
|
SELECT @def5 = OBJECT_DEFINITION(OBJECT_ID(N'dbo.物料管理_专机_新增物料'));
|
||||||
|
IF @def5 NOT LIKE N'%GPT_采购明细PDM跟随变更_执行%'
|
||||||
|
BEGIN
|
||||||
|
SET @def5 = REPLACE(@def5, N'CREATE PROCEDURE [dbo].[物料管理_专机_新增物料]', N'ALTER PROCEDURE [dbo].[物料管理_专机_新增物料]');
|
||||||
|
SET @def5 = @def5 + N'
|
||||||
|
|
||||||
|
-- 专机新增标准外购件后,回填采购合同明细PDM源流水号;修改人:Ld 修改时间:2026-07-24 10:48:00;
|
||||||
|
EXEC dbo.GPT_采购明细PDM跟随变更_执行 @新组件流水号 = @组件流水号
|
||||||
|
';
|
||||||
|
EXEC(@def5);
|
||||||
|
END;
|
||||||
|
GO
|
||||||
|
|
||||||
|
DECLARE @def6 nvarchar(max);
|
||||||
|
|
||||||
|
SELECT @def6 = OBJECT_DEFINITION(OBJECT_ID(N'dbo.订单信息_下达订单'));
|
||||||
|
IF @def6 NOT LIKE N'%GPT_采购明细PDM跟随变更_执行%'
|
||||||
|
BEGIN
|
||||||
|
SET @def6 = REPLACE(@def6, N'CREATE PROCEDURE [dbo].[订单信息_下达订单]', N'ALTER PROCEDURE [dbo].[订单信息_下达订单]');
|
||||||
|
SET @def6 = REPLACE(@def6,
|
||||||
|
N'insert into PDM_零件明细表_标准件和外购件(组件流水号,物料流水号,零件数量,零件类型,材料流水号)
|
||||||
|
select @组件流水号,物料流水号,零件数量,零件类型,材料流水号 from 产品信息_外购件_基础表 where 产品流水号=@产品流水号
|
||||||
|
|
||||||
|
set @id = @id + 1',
|
||||||
|
N'insert into PDM_零件明细表_标准件和外购件(组件流水号,物料流水号,零件数量,零件类型,材料流水号)
|
||||||
|
select @组件流水号,物料流水号,零件数量,零件类型,材料流水号 from 产品信息_外购件_基础表 where 产品流水号=@产品流水号
|
||||||
|
|
||||||
|
-- 下达订单生成标准外购件后,回填采购合同明细PDM源流水号;修改人:Ld 修改时间:2026-07-24 10:48:00;
|
||||||
|
EXEC dbo.GPT_采购明细PDM跟随变更_执行 @新组件流水号 = @组件流水号
|
||||||
|
|
||||||
|
set @id = @id + 1');
|
||||||
|
EXEC(@def6);
|
||||||
|
END;
|
||||||
|
GO
|
||||||
@@ -0,0 +1,713 @@
|
|||||||
|
<template>
|
||||||
|
<!-- 修改人:Ld 修改时间:2026-07-29 15:27:40; 新增采购入库单移动端独立页面,原采购合同查询组件不改动 -->
|
||||||
|
<div class="app-container purchase-inbound-mobile">
|
||||||
|
<el-card class="inbound-shell">
|
||||||
|
<div class="page-header">
|
||||||
|
<div>
|
||||||
|
<div class="page-title">生成入库单</div>
|
||||||
|
<div class="page-subtitle">{{ arrivalContractLabel || '请选择供应商和合同号' }}</div>
|
||||||
|
</div>
|
||||||
|
<el-tag :type="hasArrivalData ? 'warning' : 'info'" size="small">
|
||||||
|
{{ hasArrivalData ? '待提交' : '待选择' }}
|
||||||
|
</el-tag>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="query-panel">
|
||||||
|
<el-select
|
||||||
|
v-model="arrivalSupplierName"
|
||||||
|
class="query-control"
|
||||||
|
filterable
|
||||||
|
clearable
|
||||||
|
placeholder="请选择供应商"
|
||||||
|
size="small"
|
||||||
|
@change="getArrivalContract">
|
||||||
|
<el-option
|
||||||
|
v-for="item in suppliers"
|
||||||
|
:key="item.value"
|
||||||
|
:label="item.label"
|
||||||
|
:value="item.value"/>
|
||||||
|
</el-select>
|
||||||
|
<el-select
|
||||||
|
v-model="arrivalContractNo"
|
||||||
|
class="query-control"
|
||||||
|
filterable
|
||||||
|
clearable
|
||||||
|
placeholder="请选择合同号"
|
||||||
|
size="small"
|
||||||
|
@change="onArrivalContractChange">
|
||||||
|
<el-option
|
||||||
|
v-for="item in arrivalContract"
|
||||||
|
:key="item.value"
|
||||||
|
:label="item.label"
|
||||||
|
:value="item.value"/>
|
||||||
|
</el-select>
|
||||||
|
<el-button
|
||||||
|
class="query-button"
|
||||||
|
icon="el-icon-search"
|
||||||
|
type="primary"
|
||||||
|
plain
|
||||||
|
size="small"
|
||||||
|
@click="searchArrivalDetail">
|
||||||
|
查询
|
||||||
|
</el-button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="summary-grid">
|
||||||
|
<div class="summary-item summary-blue">
|
||||||
|
<span>入库单号</span>
|
||||||
|
<strong>{{ 入库单号 || '-' }}</strong>
|
||||||
|
</div>
|
||||||
|
<div class="summary-item summary-green">
|
||||||
|
<span>本次到货</span>
|
||||||
|
<strong>{{ arrivalCount }}</strong>
|
||||||
|
</div>
|
||||||
|
<div class="summary-item summary-orange">
|
||||||
|
<span>需质检</span>
|
||||||
|
<strong>{{ qualityCheckCount }}</strong>
|
||||||
|
</div>
|
||||||
|
<div class="summary-item summary-cyan">
|
||||||
|
<span>直入库</span>
|
||||||
|
<strong>{{ noQualityCheckCount }}</strong>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div v-loading="loading" class="detail-area">
|
||||||
|
<el-empty v-if="arrivalTableData.length === 0" description="暂无合同明细"/>
|
||||||
|
<div v-else class="detail-list">
|
||||||
|
<div v-for="(item, index) in arrivalTableData" :key="getRowKey(item, index)" class="material-card">
|
||||||
|
<div class="material-main">
|
||||||
|
<div class="material-title">{{ item.物料名称 || item.采购件 || '-' }}</div>
|
||||||
|
<el-tag :type="item.需要质检 ? 'warning' : 'success'" size="mini">
|
||||||
|
{{ item.需要质检 ? '质检部' : '仓库' }}
|
||||||
|
</el-tag>
|
||||||
|
</div>
|
||||||
|
<div class="material-meta">
|
||||||
|
<span>合同:{{ item.采购合同编号 || arrivalContractLabel || '-' }}</span>
|
||||||
|
<span>图号:{{ item.图号或型号 || item.图号 || '-' }}</span>
|
||||||
|
</div>
|
||||||
|
<div class="quantity-row">
|
||||||
|
<div>
|
||||||
|
<span>采购数</span>
|
||||||
|
<strong>{{ item.采购数 || 0 }}</strong>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<span>已到数</span>
|
||||||
|
<strong>{{ item.已到数 || 0 }}</strong>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<span>可到数</span>
|
||||||
|
<strong>{{ getCanArrivalCount(item) }}</strong>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="card-actions">
|
||||||
|
<div class="arrival-input">
|
||||||
|
<span>本次到货数量</span>
|
||||||
|
<el-input-number
|
||||||
|
v-model="item.到货数量"
|
||||||
|
:max="getCanArrivalCount(item)"
|
||||||
|
:min="0"
|
||||||
|
size="small"
|
||||||
|
controls-position="right"
|
||||||
|
@change="onArrivalCountChange(item)"/>
|
||||||
|
</div>
|
||||||
|
<div class="quality-switch">
|
||||||
|
<span>需要质检</span>
|
||||||
|
<el-switch
|
||||||
|
v-model="item.需要质检"
|
||||||
|
:disabled="Number(item.到货数量) === 0"
|
||||||
|
active-text="是"
|
||||||
|
inactive-text="否"/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</el-card>
|
||||||
|
|
||||||
|
<div class="bottom-submit">
|
||||||
|
<el-button size="small" @click="clearArrivalCount">清空数量</el-button>
|
||||||
|
<el-button :disabled="!hasArrivalData" type="primary" size="small" @click="submitArrivalNotice">提交入库单</el-button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import { mapGetters } from 'vuex'
|
||||||
|
|
||||||
|
export default {
|
||||||
|
name: 'PurchaseInboundCreateMobile',
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
loading: false,
|
||||||
|
suppliers: [],
|
||||||
|
arrivalSupplierName: '',
|
||||||
|
arrivalContractNo: '',
|
||||||
|
arrivalContract: [],
|
||||||
|
arrivalContractLabel: '',
|
||||||
|
arrivalNoticeLabel: '',
|
||||||
|
arrivalTableData: [],
|
||||||
|
入库单号: ''
|
||||||
|
}
|
||||||
|
},
|
||||||
|
computed: {
|
||||||
|
...mapGetters([
|
||||||
|
'id',
|
||||||
|
'token'
|
||||||
|
]),
|
||||||
|
hasArrivalData() {
|
||||||
|
return this.arrivalTableData.some(function(item) {
|
||||||
|
return Number(item.到货数量) > 0
|
||||||
|
})
|
||||||
|
},
|
||||||
|
arrivalCount() {
|
||||||
|
return this.arrivalTableData.filter(function(item) {
|
||||||
|
return Number(item.到货数量) > 0
|
||||||
|
}).length
|
||||||
|
},
|
||||||
|
qualityCheckCount() {
|
||||||
|
return this.arrivalTableData.filter(function(item) {
|
||||||
|
return Number(item.到货数量) > 0 && item.需要质检
|
||||||
|
}).length
|
||||||
|
},
|
||||||
|
noQualityCheckCount() {
|
||||||
|
return this.arrivalTableData.filter(function(item) {
|
||||||
|
return Number(item.到货数量) > 0 && !item.需要质检
|
||||||
|
}).length
|
||||||
|
}
|
||||||
|
},
|
||||||
|
created() {
|
||||||
|
this.getSuppliers()
|
||||||
|
},
|
||||||
|
mounted() {
|
||||||
|
// 修改人:Ld 修改时间:2026-07-30 13:41:07; 参考车间派工移动端页面,进入本页时覆盖全局固定最小宽度。
|
||||||
|
document.body.classList.add('purchase-inbound-mobile-page')
|
||||||
|
},
|
||||||
|
beforeDestroy() {
|
||||||
|
document.body.classList.remove('purchase-inbound-mobile-page')
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
// 修改人:Ld 修改时间:2026-07-29 15:27:40; 移动端页面独立加载可入库供应商
|
||||||
|
getSuppliers() {
|
||||||
|
var param = []
|
||||||
|
var Data = this.CreateData('11', '供应商_入库查询', param)
|
||||||
|
this.ExecDatabase(Data).then(response => {
|
||||||
|
this.suppliers = response.data.map(function(item) {
|
||||||
|
return {
|
||||||
|
label: item.供应商名称,
|
||||||
|
value: item.供应商流水号
|
||||||
|
}
|
||||||
|
})
|
||||||
|
})
|
||||||
|
},
|
||||||
|
// 修改人:Ld 修改时间:2026-07-29 15:27:40; 供应商变化后联动查询可生成入库单的采购合同
|
||||||
|
getArrivalContract() {
|
||||||
|
this.arrivalContract = []
|
||||||
|
this.arrivalContractNo = ''
|
||||||
|
this.arrivalContractLabel = ''
|
||||||
|
this.arrivalNoticeLabel = ''
|
||||||
|
this.arrivalTableData = []
|
||||||
|
this.入库单号 = ''
|
||||||
|
if (!this.arrivalSupplierName) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
var param = []
|
||||||
|
param[0] = ['供应商流水号_check', 1]
|
||||||
|
param[1] = ['供应商流水号', this.arrivalSupplierName]
|
||||||
|
var Data = this.CreateData('11', '仓储管理_采购入库合同_查询', param)
|
||||||
|
this.ExecDatabase(Data).then(response => {
|
||||||
|
this.arrivalContract = response.data.map(function(item) {
|
||||||
|
return {
|
||||||
|
label: item.采购合同编号,
|
||||||
|
value: item.采购合同流水号
|
||||||
|
}
|
||||||
|
})
|
||||||
|
})
|
||||||
|
},
|
||||||
|
onArrivalContractChange(val) {
|
||||||
|
var selected = this.arrivalContract.find(function(item) {
|
||||||
|
return item.value === val
|
||||||
|
})
|
||||||
|
if (selected) {
|
||||||
|
this.arrivalContractLabel = selected.label
|
||||||
|
this.arrivalNoticeLabel = selected.label
|
||||||
|
this.searchArrivalDetail()
|
||||||
|
} else {
|
||||||
|
this.arrivalContractLabel = ''
|
||||||
|
this.arrivalNoticeLabel = ''
|
||||||
|
this.arrivalTableData = []
|
||||||
|
this.入库单号 = ''
|
||||||
|
}
|
||||||
|
},
|
||||||
|
// 修改人:Ld 修改时间:2026-07-29 15:27:40; 合同明细使用卡片录入,保留原提交字段
|
||||||
|
searchArrivalDetail() {
|
||||||
|
if (!this.arrivalSupplierName) {
|
||||||
|
this.$message.warning('请先选择供应商')
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if (!this.arrivalContractNo) {
|
||||||
|
this.$message.warning('请先选择合同号')
|
||||||
|
return
|
||||||
|
}
|
||||||
|
this.loading = true
|
||||||
|
var param = []
|
||||||
|
param[0] = ['供应商流水号', this.arrivalSupplierName]
|
||||||
|
param[1] = ['采购合同流水号', this.arrivalContractNo]
|
||||||
|
var Data = this.CreateData('11', '采购管理_采购入库合同明细_查询', param)
|
||||||
|
this.ExecDatabase(Data).then(response => {
|
||||||
|
var data = response.data || []
|
||||||
|
this.arrivalTableData = data.map(function(item) {
|
||||||
|
return Object.assign({}, item, {
|
||||||
|
到货数量: 0,
|
||||||
|
需要质检: false
|
||||||
|
})
|
||||||
|
})
|
||||||
|
if (data.length > 0 && data[0].入库单号) {
|
||||||
|
this.入库单号 = data[0].入库单号
|
||||||
|
} else {
|
||||||
|
this.入库单号 = ''
|
||||||
|
}
|
||||||
|
if (this.arrivalTableData.length === 0) {
|
||||||
|
this.$message.info('该合同下没有物料明细')
|
||||||
|
}
|
||||||
|
}).finally(() => {
|
||||||
|
this.loading = false
|
||||||
|
})
|
||||||
|
},
|
||||||
|
onArrivalCountChange(row) {
|
||||||
|
if (Number(row.到货数量) === 0) {
|
||||||
|
row.需要质检 = false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
getCanArrivalCount(row) {
|
||||||
|
var purchaseCount = Number(row.采购数 || 0)
|
||||||
|
var arrivedCount = Number(row.已到数 || 0)
|
||||||
|
var canArrivalCount = purchaseCount - arrivedCount
|
||||||
|
return canArrivalCount > 0 ? canArrivalCount : 0
|
||||||
|
},
|
||||||
|
getRowKey(row, index) {
|
||||||
|
return row.物料流水号 || row.采购合同明细流水号 || index
|
||||||
|
},
|
||||||
|
clearArrivalCount() {
|
||||||
|
this.arrivalTableData.forEach(function(item) {
|
||||||
|
item.到货数量 = 0
|
||||||
|
item.需要质检 = false
|
||||||
|
})
|
||||||
|
},
|
||||||
|
// 修改人:Ld 修改时间:2026-07-29 15:27:40; 提交接口和原采购合同查询弹窗保持一致
|
||||||
|
submitArrivalNotice() {
|
||||||
|
var arrivalData = this.arrivalTableData.filter(function(item) {
|
||||||
|
return Number(item.到货数量) > 0
|
||||||
|
})
|
||||||
|
if (arrivalData.length === 0) {
|
||||||
|
this.$message.warning('请至少填写一个物料的到货数量')
|
||||||
|
return
|
||||||
|
}
|
||||||
|
var toQualityCheck = arrivalData.filter(function(item) {
|
||||||
|
return item.需要质检 === true
|
||||||
|
})
|
||||||
|
var toWarehouse = arrivalData.filter(function(item) {
|
||||||
|
return item.需要质检 === false
|
||||||
|
})
|
||||||
|
var param = []
|
||||||
|
param[0] = ['通知内容', this.arrivalNoticeLabel]
|
||||||
|
param[1] = ['发起人', this.id]
|
||||||
|
param[2] = ['采购合同流水号', this.arrivalContractNo]
|
||||||
|
param[3] = ['到货数组', arrivalData.map(function(item) { return item.到货数量 }).join(',')]
|
||||||
|
param[4] = ['物料流水号组', arrivalData.map(function(item) { return item.物料流水号 }).join(',')]
|
||||||
|
param[5] = ['质检标志组', arrivalData.map(function(item) { return item.需要质检 ? 1 : 0 }).join(',')]
|
||||||
|
param[6] = ['采购合同', this.arrivalContractLabel]
|
||||||
|
param[7] = ['供应商流水号', this.arrivalSupplierName]
|
||||||
|
param[8] = ['入库单号', this.入库单号]
|
||||||
|
var Data = this.CreateData('12', '采购管理_到货内容_新增', param)
|
||||||
|
this.ExecDatabase(Data).then(response => {
|
||||||
|
if (response.data[0].result === '1') {
|
||||||
|
var message = '通知成功:'
|
||||||
|
if (toQualityCheck.length > 0) {
|
||||||
|
message += toQualityCheck.length + '个物料送质检部'
|
||||||
|
}
|
||||||
|
if (toWarehouse.length > 0) {
|
||||||
|
message += (toQualityCheck.length > 0 ? ',' : '') + toWarehouse.length + '个物料直接入库'
|
||||||
|
}
|
||||||
|
this.$message({
|
||||||
|
message: message,
|
||||||
|
type: 'success',
|
||||||
|
duration: 3000
|
||||||
|
})
|
||||||
|
this.searchArrivalDetail()
|
||||||
|
} else {
|
||||||
|
this.$message.error('通知失败')
|
||||||
|
}
|
||||||
|
}).catch(() => {
|
||||||
|
this.$message.error('操作失败,请重试')
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style scoped>
|
||||||
|
/* 修改人:Ld 修改时间:2026-07-29 15:27:40; 新增移动端自适应样式 */
|
||||||
|
.purchase-inbound-mobile,
|
||||||
|
.purchase-inbound-mobile * {
|
||||||
|
box-sizing: border-box;
|
||||||
|
}
|
||||||
|
|
||||||
|
.purchase-inbound-mobile {
|
||||||
|
width: 100%;
|
||||||
|
max-width: 100%;
|
||||||
|
min-height: calc(100vh - 84px);
|
||||||
|
overflow-x: hidden;
|
||||||
|
padding: 10px 12px 78px;
|
||||||
|
background: #f5f7fb;
|
||||||
|
}
|
||||||
|
|
||||||
|
.inbound-shell {
|
||||||
|
width: 100%;
|
||||||
|
max-width: 100%;
|
||||||
|
min-height: calc(100vh - 150px);
|
||||||
|
overflow: hidden;
|
||||||
|
border-radius: 6px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.inbound-shell >>> .el-card__body {
|
||||||
|
width: 100%;
|
||||||
|
padding: 12px !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.page-header {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: space-between;
|
||||||
|
margin-bottom: 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.page-title {
|
||||||
|
font-size: 20px;
|
||||||
|
font-weight: 700;
|
||||||
|
color: #1f2d3d;
|
||||||
|
}
|
||||||
|
|
||||||
|
.page-subtitle {
|
||||||
|
max-width: 100%;
|
||||||
|
margin-top: 4px;
|
||||||
|
overflow: hidden;
|
||||||
|
font-size: 12px;
|
||||||
|
color: #8492a6;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
white-space: nowrap;
|
||||||
|
}
|
||||||
|
|
||||||
|
.query-panel {
|
||||||
|
display: grid;
|
||||||
|
grid-template-columns: minmax(180px, 1fr) minmax(180px, 1fr) 90px;
|
||||||
|
gap: 10px;
|
||||||
|
margin-bottom: 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.query-control,
|
||||||
|
.query-button {
|
||||||
|
min-width: 0;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.purchase-inbound-mobile >>> .el-select,
|
||||||
|
.purchase-inbound-mobile >>> .el-input-number,
|
||||||
|
.purchase-inbound-mobile >>> .el-input,
|
||||||
|
.purchase-inbound-mobile >>> .el-button {
|
||||||
|
max-width: 100%;
|
||||||
|
min-width: 0;
|
||||||
|
box-sizing: border-box;
|
||||||
|
}
|
||||||
|
|
||||||
|
.purchase-inbound-mobile >>> .el-select,
|
||||||
|
.purchase-inbound-mobile >>> .el-input-number,
|
||||||
|
.purchase-inbound-mobile >>> .el-input {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.purchase-inbound-mobile >>> .el-input__inner {
|
||||||
|
min-width: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.summary-grid {
|
||||||
|
display: grid;
|
||||||
|
grid-template-columns: repeat(4, 1fr);
|
||||||
|
gap: 10px;
|
||||||
|
margin-bottom: 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.summary-item {
|
||||||
|
padding: 10px 12px;
|
||||||
|
border-radius: 6px;
|
||||||
|
border: 1px solid #dcdfe6;
|
||||||
|
background: #fff;
|
||||||
|
}
|
||||||
|
|
||||||
|
.summary-item span {
|
||||||
|
display: block;
|
||||||
|
margin-bottom: 6px;
|
||||||
|
font-size: 12px;
|
||||||
|
color: #606266;
|
||||||
|
}
|
||||||
|
|
||||||
|
.summary-item strong {
|
||||||
|
display: block;
|
||||||
|
min-width: 0;
|
||||||
|
overflow: hidden;
|
||||||
|
font-size: 18px;
|
||||||
|
color: #303133;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
white-space: nowrap;
|
||||||
|
}
|
||||||
|
|
||||||
|
.summary-blue {
|
||||||
|
background: #eff6ff;
|
||||||
|
border-color: #bfdbfe;
|
||||||
|
}
|
||||||
|
|
||||||
|
.summary-green {
|
||||||
|
background: #f0fdf4;
|
||||||
|
border-color: #bbf7d0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.summary-orange {
|
||||||
|
background: #fff7ed;
|
||||||
|
border-color: #fed7aa;
|
||||||
|
}
|
||||||
|
|
||||||
|
.summary-cyan {
|
||||||
|
background: #ecfeff;
|
||||||
|
border-color: #a5f3fc;
|
||||||
|
}
|
||||||
|
|
||||||
|
.detail-list {
|
||||||
|
display: grid;
|
||||||
|
grid-template-columns: repeat(2, minmax(260px, 1fr));
|
||||||
|
gap: 12px;
|
||||||
|
width: 100%;
|
||||||
|
max-width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.material-card {
|
||||||
|
min-width: 0;
|
||||||
|
padding: 12px;
|
||||||
|
border: 1px solid #dcdfe6;
|
||||||
|
border-radius: 6px;
|
||||||
|
background: #fff;
|
||||||
|
}
|
||||||
|
|
||||||
|
.material-main,
|
||||||
|
.card-actions {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: space-between;
|
||||||
|
gap: 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.material-title {
|
||||||
|
min-width: 0;
|
||||||
|
overflow: hidden;
|
||||||
|
color: #303133;
|
||||||
|
font-size: 15px;
|
||||||
|
font-weight: 700;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
white-space: nowrap;
|
||||||
|
}
|
||||||
|
|
||||||
|
.material-meta {
|
||||||
|
display: grid;
|
||||||
|
grid-template-columns: repeat(2, minmax(0, 1fr));
|
||||||
|
gap: 8px;
|
||||||
|
margin-top: 8px;
|
||||||
|
color: #606266;
|
||||||
|
font-size: 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.material-meta span {
|
||||||
|
min-width: 0;
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
white-space: nowrap;
|
||||||
|
}
|
||||||
|
|
||||||
|
.quantity-row {
|
||||||
|
display: grid;
|
||||||
|
grid-template-columns: repeat(3, 1fr);
|
||||||
|
gap: 8px;
|
||||||
|
margin-top: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.quantity-row div {
|
||||||
|
padding: 8px;
|
||||||
|
border-radius: 4px;
|
||||||
|
background: #f5f7fa;
|
||||||
|
}
|
||||||
|
|
||||||
|
.quantity-row span,
|
||||||
|
.arrival-input span,
|
||||||
|
.quality-switch span {
|
||||||
|
display: block;
|
||||||
|
margin-bottom: 4px;
|
||||||
|
color: #909399;
|
||||||
|
font-size: 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.quantity-row strong {
|
||||||
|
color: #303133;
|
||||||
|
font-size: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.card-actions {
|
||||||
|
align-items: flex-end;
|
||||||
|
margin-top: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.arrival-input {
|
||||||
|
flex: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.arrival-input >>> .el-input-number {
|
||||||
|
width: 150px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.quality-switch {
|
||||||
|
min-width: 142px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.bottom-submit {
|
||||||
|
position: fixed;
|
||||||
|
right: 20px;
|
||||||
|
bottom: 16px;
|
||||||
|
left: 200px;
|
||||||
|
z-index: 10;
|
||||||
|
display: flex;
|
||||||
|
justify-content: flex-end;
|
||||||
|
gap: 10px;
|
||||||
|
padding: 10px 16px;
|
||||||
|
border: 1px solid #dcdfe6;
|
||||||
|
border-radius: 6px;
|
||||||
|
background: #fff;
|
||||||
|
box-shadow: 0 4px 14px rgba(15, 23, 42, .12);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 修改人:Ld 修改时间:2026-07-30 11:27:07; 中等宽度下提前切换单列,避免 769px 以上仍被双列卡片撑宽 */
|
||||||
|
@media (max-width: 1100px) {
|
||||||
|
.query-panel {
|
||||||
|
grid-template-columns: 1fr 1fr;
|
||||||
|
}
|
||||||
|
|
||||||
|
.query-button {
|
||||||
|
grid-column: 1 / -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.detail-list {
|
||||||
|
grid-template-columns: 1fr;
|
||||||
|
}
|
||||||
|
|
||||||
|
.bottom-submit {
|
||||||
|
left: 20px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-width: 768px) {
|
||||||
|
.purchase-inbound-mobile {
|
||||||
|
width: 100vw;
|
||||||
|
margin: 0;
|
||||||
|
padding: 8px 8px 76px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.inbound-shell >>> .el-card__body {
|
||||||
|
padding: 10px !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.query-panel,
|
||||||
|
.summary-grid,
|
||||||
|
.detail-list,
|
||||||
|
.material-meta {
|
||||||
|
grid-template-columns: 1fr;
|
||||||
|
}
|
||||||
|
|
||||||
|
.summary-grid {
|
||||||
|
grid-template-columns: repeat(2, 1fr);
|
||||||
|
}
|
||||||
|
|
||||||
|
.page-header {
|
||||||
|
align-items: flex-start;
|
||||||
|
gap: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.page-header > div {
|
||||||
|
min-width: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.material-main,
|
||||||
|
.card-actions {
|
||||||
|
align-items: stretch;
|
||||||
|
flex-direction: column;
|
||||||
|
}
|
||||||
|
|
||||||
|
.arrival-input >>> .el-input-number {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.quality-switch {
|
||||||
|
min-width: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.bottom-submit {
|
||||||
|
right: 8px;
|
||||||
|
bottom: 8px;
|
||||||
|
left: 8px;
|
||||||
|
width: auto;
|
||||||
|
max-width: calc(100vw - 16px);
|
||||||
|
padding: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.bottom-submit .el-button {
|
||||||
|
flex: 1;
|
||||||
|
min-height: 40px;
|
||||||
|
margin-left: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 修改人:Ld 修改时间:2026-07-30 11:27:07; 小屏手机全部控件按视口宽度铺满 */
|
||||||
|
@media (max-width: 420px) {
|
||||||
|
.summary-grid,
|
||||||
|
.quantity-row {
|
||||||
|
grid-template-columns: 1fr;
|
||||||
|
}
|
||||||
|
|
||||||
|
.page-title {
|
||||||
|
font-size: 18px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.material-card {
|
||||||
|
padding: 10px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<style>
|
||||||
|
/* 修改人:Ld 修改时间:2026-07-30 13:41:07; 参考车间派工移动端组件,仅在本页面覆盖全局 main-container 固定最小宽度。 */
|
||||||
|
body.purchase-inbound-mobile-page #app .main-container,
|
||||||
|
body.purchase-inbound-mobile-page #app .app-main {
|
||||||
|
max-width: 100% !important;
|
||||||
|
min-width: 0 !important;
|
||||||
|
overflow-x: hidden !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
body.purchase-inbound-mobile-page #app .app-main {
|
||||||
|
width: 100% !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
body.purchase-inbound-mobile-page #app .mobile .main-container {
|
||||||
|
width: 100vw !important;
|
||||||
|
max-width: 100vw !important;
|
||||||
|
min-width: 0 !important;
|
||||||
|
margin-left: 0 !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
body.purchase-inbound-mobile-page {
|
||||||
|
overflow-x: hidden;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
263
src/views/SalesManagement/CommissionRateSetting/index.vue
Normal file
@@ -0,0 +1,263 @@
|
|||||||
|
<template>
|
||||||
|
<div class="app-container">
|
||||||
|
<el-card style="height: 850px">
|
||||||
|
<div v-if="hasPermission">
|
||||||
|
<div style="margin-top: 7px; margin-bottom: 7px">
|
||||||
|
<!-- 修改人:Ld 修改时间:2026-07-27 12:00:00; 提成比例设置仅指定人员可维护。 -->
|
||||||
|
<el-select
|
||||||
|
v-model="commissionType"
|
||||||
|
size="small"
|
||||||
|
style="width: 210px"
|
||||||
|
clearable
|
||||||
|
filterable
|
||||||
|
placeholder="提成类型"
|
||||||
|
@change="searchTable">
|
||||||
|
<el-option v-for="item in commissionTypeOptions" :key="item.value" :label="item.label" :value="item.value" />
|
||||||
|
</el-select>
|
||||||
|
<el-button
|
||||||
|
icon="el-icon-search"
|
||||||
|
type="primary"
|
||||||
|
plain
|
||||||
|
size="small"
|
||||||
|
style="margin-left: 10px"
|
||||||
|
@click="searchTable">查询</el-button>
|
||||||
|
<el-button
|
||||||
|
icon="el-icon-circle-plus-outline"
|
||||||
|
type="success"
|
||||||
|
plain
|
||||||
|
size="small"
|
||||||
|
style="margin-left: 10px"
|
||||||
|
@click="addRate">新增</el-button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<el-table
|
||||||
|
v-loading="loading"
|
||||||
|
:data="tableData"
|
||||||
|
border
|
||||||
|
stripe
|
||||||
|
size="small"
|
||||||
|
style="width: 900px; margin-top: 20px"
|
||||||
|
height="740px">
|
||||||
|
<el-table-column width="60px" label="序号" type="index" align="center" />
|
||||||
|
<el-table-column width="180px" label="提成类型" align="center" prop="提成类型" show-overflow-tooltip />
|
||||||
|
<el-table-column width="110px" label="提成比例" align="right">
|
||||||
|
<template slot-scope="scope">{{ formatPercent(scope.row.提成比例) }}</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column width="90px" label="是否启用" align="center">
|
||||||
|
<template slot-scope="scope">
|
||||||
|
<el-tag :type="Number(scope.row.是否启用) === 1 ? 'success' : 'info'" size="mini">
|
||||||
|
{{ Number(scope.row.是否启用) === 1 ? '启用' : '停用' }}
|
||||||
|
</el-tag>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column width="220px" label="备注" align="center" prop="备注" show-overflow-tooltip />
|
||||||
|
<el-table-column width="150px" label="操作日期" align="center" prop="操作日期" />
|
||||||
|
<el-table-column width="90px" label="操作" align="center" fixed="right">
|
||||||
|
<template slot-scope="scope">
|
||||||
|
<el-tooltip :open-delay="1000" effect="dark" content="编辑" placement="top">
|
||||||
|
<el-button size="mini" type="text" class="el-icon-edit-outline" @click="editRate(scope.row)" />
|
||||||
|
</el-tooltip>
|
||||||
|
<el-tooltip :open-delay="1000" effect="dark" content="停用" placement="top">
|
||||||
|
<el-button size="mini" type="text" style="margin-left: 15px" class="el-icon-delete" @click="deleteRate(scope.row)" />
|
||||||
|
</el-tooltip>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
</el-table>
|
||||||
|
|
||||||
|
<el-dialog v-el-drag-dialog :title="title" :visible.sync="dialogFormVisible" center width="520px">
|
||||||
|
<el-form ref="form" :model="form" :rules="rules" label-position="left" label-width="100px">
|
||||||
|
<el-form-item label="提成类型:" prop="提成类型">
|
||||||
|
<el-select
|
||||||
|
v-model="form.提成类型"
|
||||||
|
size="small"
|
||||||
|
style="width: 300px"
|
||||||
|
filterable
|
||||||
|
allow-create
|
||||||
|
default-first-option
|
||||||
|
placeholder="请选择提成类型">
|
||||||
|
<el-option v-for="item in commissionTypeOptions" :key="item.value" :label="item.label" :value="item.value" />
|
||||||
|
</el-select>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="提成比例:" prop="提成比例">
|
||||||
|
<el-input-number v-model="form.提成比例" :min="0" :precision="4" :step="0.1" size="small" style="width: 180px" />
|
||||||
|
<span style="margin-left: 8px">%</span>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="是否启用:" prop="是否启用">
|
||||||
|
<el-switch v-model="form.是否启用" :active-value="1" :inactive-value="0" active-text="启用" inactive-text="停用" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="备注:" prop="备注">
|
||||||
|
<el-input v-model="form.备注" type="textarea" :rows="3" style="width: 300px" placeholder="请输入备注" />
|
||||||
|
</el-form-item>
|
||||||
|
</el-form>
|
||||||
|
<div slot="footer" class="dialog-footer">
|
||||||
|
<el-button size="small" @click="dialogFormVisible = false">取消</el-button>
|
||||||
|
<el-button type="primary" size="small" @click="submit('form')">确定</el-button>
|
||||||
|
</div>
|
||||||
|
</el-dialog>
|
||||||
|
</div>
|
||||||
|
<el-alert
|
||||||
|
v-else
|
||||||
|
title="无权限查看提成比例设置"
|
||||||
|
type="warning"
|
||||||
|
show-icon
|
||||||
|
:closable="false" />
|
||||||
|
</el-card>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import { mapGetters } from 'vuex'
|
||||||
|
|
||||||
|
export default {
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
loading: false,
|
||||||
|
commissionType: '',
|
||||||
|
tableData: [],
|
||||||
|
dialogFormVisible: false,
|
||||||
|
title: '新增提成比例',
|
||||||
|
form: {
|
||||||
|
提成比例ID: '',
|
||||||
|
提成类型: '',
|
||||||
|
提成比例: 0,
|
||||||
|
是否启用: 1,
|
||||||
|
备注: ''
|
||||||
|
},
|
||||||
|
// 修改人:Ld 修改时间:2026-07-27 12:00:00; 初始化合同提成类别。
|
||||||
|
commissionTypeOptions: [
|
||||||
|
{ label: '首单提成(专机)', value: '首单提成(专机)' },
|
||||||
|
{ label: '首单提成(模块)', value: '首单提成(模块)' },
|
||||||
|
{ label: '转介绍提成(专机)', value: '转介绍提成(专机)' },
|
||||||
|
{ label: '转介绍提成(模块)', value: '转介绍提成(模块)' },
|
||||||
|
{ label: '复购提成', value: '复购提成' }
|
||||||
|
],
|
||||||
|
rules: {
|
||||||
|
提成类型: [{ required: true, message: '请选择提成类型', trigger: 'change' }],
|
||||||
|
提成比例: [{ required: true, message: '请输入提成比例', trigger: 'blur' }]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
computed: {
|
||||||
|
...mapGetters(['id', 'userId']),
|
||||||
|
hasPermission() {
|
||||||
|
// 修改人:Ld 修改时间:2026-07-27 14:35:00; 提成比例设置改为按人员编号5和273授权。
|
||||||
|
const value = String(this.id || '').trim()
|
||||||
|
return value === '5' || value === '273'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
mounted() {
|
||||||
|
if (this.hasPermission) {
|
||||||
|
this.searchTable()
|
||||||
|
} else {
|
||||||
|
this.$message.warning('无权限查看提成比例设置')
|
||||||
|
}
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
buildQueryParam() {
|
||||||
|
var param = []
|
||||||
|
param[0] = ['提成类型_check', this.commissionType ? 1 : 0]
|
||||||
|
param[1] = ['提成类型', this.commissionType]
|
||||||
|
param[2] = ['人员编号', this.id]
|
||||||
|
return param
|
||||||
|
},
|
||||||
|
searchTable() {
|
||||||
|
if (!this.hasPermission) {
|
||||||
|
this.$message.warning('无权限查看提成比例设置')
|
||||||
|
return
|
||||||
|
}
|
||||||
|
this.loading = true
|
||||||
|
var Data = this.CreateData('11', '销售管理_提成比例设置_查询数据', this.buildQueryParam())
|
||||||
|
this.ExecDatabase(Data).then(response => {
|
||||||
|
if (response.data && response.data[0] && Number(response.data[0].result) === 0) {
|
||||||
|
this.$message.warning(response.data[0].msg || '无权限查看提成比例设置')
|
||||||
|
this.tableData = []
|
||||||
|
} else {
|
||||||
|
this.tableData = response.data || []
|
||||||
|
}
|
||||||
|
this.loading = false
|
||||||
|
}).catch(() => {
|
||||||
|
this.loading = false
|
||||||
|
this.$message.error('提成比例查询失败')
|
||||||
|
})
|
||||||
|
},
|
||||||
|
addRate() {
|
||||||
|
this.title = '新增提成比例'
|
||||||
|
this.form = {
|
||||||
|
提成比例ID: '',
|
||||||
|
提成类型: '',
|
||||||
|
提成比例: 0,
|
||||||
|
是否启用: 1,
|
||||||
|
备注: ''
|
||||||
|
}
|
||||||
|
this.dialogFormVisible = true
|
||||||
|
},
|
||||||
|
editRate(row) {
|
||||||
|
this.title = '编辑提成比例'
|
||||||
|
this.form = {
|
||||||
|
提成比例ID: row.提成比例ID,
|
||||||
|
提成类型: row.提成类型,
|
||||||
|
提成比例: Number(row.提成比例 || 0),
|
||||||
|
是否启用: Number(row.是否启用),
|
||||||
|
备注: row.备注
|
||||||
|
}
|
||||||
|
this.dialogFormVisible = true
|
||||||
|
},
|
||||||
|
submit(formName) {
|
||||||
|
this.$refs[formName].validate(valid => {
|
||||||
|
if (!valid) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
var param = []
|
||||||
|
param[0] = ['提成比例ID', this.form.提成比例ID]
|
||||||
|
param[1] = ['提成类型', this.form.提成类型]
|
||||||
|
param[2] = ['提成比例', this.form.提成比例]
|
||||||
|
param[3] = ['是否启用', this.form.是否启用]
|
||||||
|
param[4] = ['备注', this.form.备注]
|
||||||
|
param[5] = ['操作者', this.id]
|
||||||
|
param[6] = ['人员编号', this.id]
|
||||||
|
var Data = this.CreateData('12', '销售管理_提成比例设置_保存数据', param)
|
||||||
|
this.ExecDatabase(Data).then(response => {
|
||||||
|
if (response.data[0].result === '1' || Number(response.data[0].result) === 1) {
|
||||||
|
this.$message.success(response.data[0].msg || '保存成功')
|
||||||
|
this.dialogFormVisible = false
|
||||||
|
this.searchTable()
|
||||||
|
} else {
|
||||||
|
this.$message.warning(response.data[0].msg || '保存失败')
|
||||||
|
}
|
||||||
|
})
|
||||||
|
})
|
||||||
|
},
|
||||||
|
deleteRate(row) {
|
||||||
|
this.$confirm('是否停用该提成比例?', '提示', {
|
||||||
|
confirmButtonText: '确定',
|
||||||
|
cancelButtonText: '取消',
|
||||||
|
type: 'warning'
|
||||||
|
}).then(() => {
|
||||||
|
var param = []
|
||||||
|
param[0] = ['提成比例ID', row.提成比例ID]
|
||||||
|
param[1] = ['操作者', this.id]
|
||||||
|
param[2] = ['人员编号', this.id]
|
||||||
|
var Data = this.CreateData('12', '销售管理_提成比例设置_删除数据', param)
|
||||||
|
this.ExecDatabase(Data).then(response => {
|
||||||
|
if (response.data[0].result === '1' || Number(response.data[0].result) === 1) {
|
||||||
|
this.$message.success(response.data[0].msg || '停用成功')
|
||||||
|
this.searchTable()
|
||||||
|
} else {
|
||||||
|
this.$message.warning(response.data[0].msg || '停用失败')
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}).catch(() => {})
|
||||||
|
},
|
||||||
|
formatPercent(value) {
|
||||||
|
const num = Number(value || 0)
|
||||||
|
return num.toFixed(4) + '%'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style scoped>
|
||||||
|
.app-container {
|
||||||
|
padding: 20px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
@@ -188,6 +188,12 @@
|
|||||||
{{ scope.row.合同备注 }}
|
{{ scope.row.合同备注 }}
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
|
<!-- 修改人:Ld 修改时间:2026-07-27 10:00:00; 合同查询提成类型列 -->
|
||||||
|
<el-table-column v-if="Number(token) === 11 || Number(token) === 2 || Number(token) === 3 || Number(token) === 9" align="center" label="提成类型" show-overflow-tooltip>
|
||||||
|
<template slot-scope="scope">
|
||||||
|
{{ scope.row.提成类型 }}
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
<el-table-column :width="setColumnWidth('日期')" align="center" label="签订日期">
|
<el-table-column :width="setColumnWidth('日期')" align="center" label="签订日期">
|
||||||
<template slot-scope="scope">
|
<template slot-scope="scope">
|
||||||
{{ scope.row.签订日期 }}
|
{{ scope.row.签订日期 }}
|
||||||
@@ -1162,6 +1168,22 @@
|
|||||||
<el-form-item label="税率" prop="税率">
|
<el-form-item label="税率" prop="税率">
|
||||||
<el-input v-model="form.税率" clearable size="small" style="width:200px;"/>
|
<el-input v-model="form.税率" clearable size="small" style="width:200px;"/>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
|
<!-- 修改人:Ld 修改时间:2026-07-31 08:43:08; 编辑合同信息最后一行增加提成类型修改 -->
|
||||||
|
<el-form-item label="提成类型" prop="提成类型">
|
||||||
|
<el-select
|
||||||
|
v-model="form.提成类型"
|
||||||
|
clearable
|
||||||
|
filterable
|
||||||
|
placeholder="请选择提成类型"
|
||||||
|
size="small"
|
||||||
|
style="width: 200px;margin: 10px 0 10px 2px">
|
||||||
|
<el-option
|
||||||
|
v-for="item in commissionTypeOptions"
|
||||||
|
:key="item.value"
|
||||||
|
:label="item.label"
|
||||||
|
:value="item.value"/>
|
||||||
|
</el-select>
|
||||||
|
</el-form-item>
|
||||||
</el-form>
|
</el-form>
|
||||||
<div slot="footer" class="dialog-footer">
|
<div slot="footer" class="dialog-footer">
|
||||||
<el-button size="small" @click="callOffCustomers('form')">取消</el-button>
|
<el-button size="small" @click="callOffCustomers('form')">取消</el-button>
|
||||||
@@ -1223,15 +1245,25 @@ export default {
|
|||||||
买方名称: '',
|
买方名称: '',
|
||||||
付款方式: '',
|
付款方式: '',
|
||||||
税率: '',
|
税率: '',
|
||||||
收货人: ''
|
收货人: '',
|
||||||
|
提成类型: '' // 修改人:Ld 修改时间:2026-07-31 08:43:08; 编辑合同信息提成类型
|
||||||
},
|
},
|
||||||
rules: {
|
rules: {
|
||||||
交货期限: [{ required: true, message: '请输入交货期限', trigger: 'blur' }],
|
交货期限: [{ required: true, message: '请输入交货期限', trigger: 'blur' }],
|
||||||
收货人: [{ required: true, message: '请输入收货人', trigger: 'blur' }],
|
收货人: [{ required: true, message: '请输入收货人', trigger: 'blur' }],
|
||||||
税率: [{ required: true, message: '请输入税率', trigger: 'blur' }],
|
税率: [{ required: true, message: '请输入税率', trigger: 'blur' }],
|
||||||
买方名称: [{ required: true, message: '请选择买方名称', trigger: 'change' }],
|
买方名称: [{ required: true, message: '请选择买方名称', trigger: 'change' }],
|
||||||
付款方式: [{ required: true, message: '请选择付款方式', trigger: 'change' }]
|
付款方式: [{ required: true, message: '请选择付款方式', trigger: 'change' }],
|
||||||
|
提成类型: [{ required: true, message: '请选择提成类型', trigger: 'change' }]
|
||||||
},
|
},
|
||||||
|
// 修改人:Ld 修改时间:2026-07-31 08:43:08; 编辑合同信息提成类型下拉选项
|
||||||
|
commissionTypeOptions: [
|
||||||
|
{ label: '首单提成(专机)', value: '首单提成(专机)' },
|
||||||
|
{ label: '首单提成(模块)', value: '首单提成(模块)' },
|
||||||
|
{ label: '转介绍提成(专机)', value: '转介绍提成(专机)' },
|
||||||
|
{ label: '转介绍提成(模块)', value: '转介绍提成(模块)' },
|
||||||
|
{ label: '复购提成', value: '复购提成' }
|
||||||
|
],
|
||||||
dialogVisibleQQ: false,
|
dialogVisibleQQ: false,
|
||||||
editCustomerNameContractNo: '',
|
editCustomerNameContractNo: '',
|
||||||
modifyCustomerNameValue: '',
|
modifyCustomerNameValue: '',
|
||||||
@@ -1597,7 +1629,7 @@ export default {
|
|||||||
})
|
})
|
||||||
},
|
},
|
||||||
submitModifyCustomerNameValue(formName) {
|
submitModifyCustomerNameValue(formName) {
|
||||||
if (this.form.买方名称 === '' || this.form.交货期限 === '' || this.form.付款方式 === '' || this.form.税率 === '' || this.form.收货人 === '') {
|
if (this.form.买方名称 === '' || this.form.交货期限 === '' || this.form.付款方式 === '' || this.form.税率 === '' || this.form.收货人 === '' || this.form.提成类型 === '') {
|
||||||
this.$message.error('信息不全!禁止修改!!')
|
this.$message.error('信息不全!禁止修改!!')
|
||||||
} else {
|
} else {
|
||||||
var param = []
|
var param = []
|
||||||
@@ -1607,6 +1639,8 @@ export default {
|
|||||||
param[3] = ['交货期限', this.form.交货期限]
|
param[3] = ['交货期限', this.form.交货期限]
|
||||||
param[4] = ['付款方式流水号', this.form.付款方式]
|
param[4] = ['付款方式流水号', this.form.付款方式]
|
||||||
param[5] = ['税率', this.form.税率]
|
param[5] = ['税率', this.form.税率]
|
||||||
|
// 修改人:Ld 修改时间:2026-07-31 08:43:08; 编辑合同信息保存提成类型
|
||||||
|
param[6] = ['提成类型', this.form.提成类型]
|
||||||
var Data = this.CreateData('12', 'PDM_项目名称_修改客户', param)
|
var Data = this.CreateData('12', 'PDM_项目名称_修改客户', param)
|
||||||
this.ExecDatabase(Data).then(response => {
|
this.ExecDatabase(Data).then(response => {
|
||||||
if (response.data[0].result === '1') {
|
if (response.data[0].result === '1') {
|
||||||
@@ -1629,6 +1663,7 @@ export default {
|
|||||||
this.form.收货人 = ''
|
this.form.收货人 = ''
|
||||||
this.form.付款方式 = ''
|
this.form.付款方式 = ''
|
||||||
this.form.税率 = ''
|
this.form.税率 = ''
|
||||||
|
this.form.提成类型 = ''
|
||||||
this.$refs[formName].resetFields()
|
this.$refs[formName].resetFields()
|
||||||
},
|
},
|
||||||
editCustomerName(row) {
|
editCustomerName(row) {
|
||||||
@@ -1643,6 +1678,8 @@ export default {
|
|||||||
this.form.付款方式 = Number(row.付款方式流水号)
|
this.form.付款方式 = Number(row.付款方式流水号)
|
||||||
this.form.税率 = row.税率小数
|
this.form.税率 = row.税率小数
|
||||||
this.form.收货人 = row.收货人员
|
this.form.收货人 = row.收货人员
|
||||||
|
// 修改人:Ld 修改时间:2026-07-31 08:43:08; 编辑合同信息回填提成类型
|
||||||
|
this.form.提成类型 = row.提成类型 ? row.提成类型 : ''
|
||||||
this.dialogFormVisibleqq = true
|
this.dialogFormVisibleqq = true
|
||||||
},
|
},
|
||||||
companyInformationSearch() {
|
companyInformationSearch() {
|
||||||
|
|||||||
@@ -180,6 +180,12 @@
|
|||||||
{{ scope.row.合同备注 }}
|
{{ scope.row.合同备注 }}
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
|
<!-- 修改人:Ld 修改时间:2026-07-27 10:00:00; 合同查询提成类型列 -->
|
||||||
|
<el-table-column v-if="Number(token) === 11 || Number(token) === 2 || Number(token) === 3 || Number(token) === 8" align="center" label="提成类型" show-overflow-tooltip>
|
||||||
|
<template slot-scope="scope">
|
||||||
|
{{ scope.row.提成类型 }}
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
<el-table-column :width="setColumnWidth('日期')" label="签订日期" align="center">
|
<el-table-column :width="setColumnWidth('日期')" label="签订日期" align="center">
|
||||||
<template slot-scope="scope">
|
<template slot-scope="scope">
|
||||||
{{ scope.row.签订日期 }}
|
{{ scope.row.签订日期 }}
|
||||||
@@ -2711,4 +2717,3 @@ a {
|
|||||||
color: #999;
|
color: #999;
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
|
|||||||
@@ -85,9 +85,13 @@
|
|||||||
{{ scope.row.发货备注 }}
|
{{ scope.row.发货备注 }}
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column width="117px" label="操作" align="center">
|
<el-table-column width="145px" label="操作" align="center">
|
||||||
<template slot-scope="scope">
|
<template slot-scope="scope">
|
||||||
<el-button type="text" icon="el-icon-top" size="mini" @click="uploadPicture(scope.row)">照片</el-button>
|
<el-button type="text" icon="el-icon-top" size="mini" @click="uploadPicture(scope.row)">照片</el-button>
|
||||||
|
<!-- 修改人:Ld 修改时间:2026-08-03 13:30:22; 发货查询列表增加发货单打印入口。 -->
|
||||||
|
<el-tooltip :open-delay="500" effect="dark" content="打印发货单" placement="top">
|
||||||
|
<el-button type="text" icon="el-icon-printer" size="mini" @click="shipmentDocPrintQuery(scope.row)"/>
|
||||||
|
</el-tooltip>
|
||||||
<el-button v-show="Number(token)===8 || Number(token)===2" :disabled="scope.row.发货状态==='已发货'" size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)"/>
|
<el-button v-show="Number(token)===8 || Number(token)===2" :disabled="scope.row.发货状态==='已发货'" size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)"/>
|
||||||
<el-button type="text" icon="el-icon-edit" size="mini" @click="handleEdit(scope.row)"/>
|
<el-button type="text" icon="el-icon-edit" size="mini" @click="handleEdit(scope.row)"/>
|
||||||
<el-button size="mini" type="text" icon="el-icon-picture-outline" @click="handlePicture(scope.row)"/>
|
<el-button size="mini" type="text" icon="el-icon-picture-outline" @click="handlePicture(scope.row)"/>
|
||||||
@@ -151,6 +155,79 @@
|
|||||||
</el-table>
|
</el-table>
|
||||||
</el-col>
|
</el-col>
|
||||||
</el-card>
|
</el-card>
|
||||||
|
<!-- 修改人:Ld 修改时间:2026-08-03 13:30:22; 复用产品发货组件销售出库单模板作为发货查询打印内容。 -->
|
||||||
|
<el-card v-show="false" style="height: 850px">
|
||||||
|
<div style="width:900px;margin-left: 350px">
|
||||||
|
<el-card>
|
||||||
|
<div id="WGBLD" style="width: 880px;margin: 0 auto">
|
||||||
|
<div style="height: 65px;width: 660px;margin: 0 auto 10px">
|
||||||
|
<img src="@/assets/img/CompanyIcon.png" style="float: left; width: 160px;height: 60px;">
|
||||||
|
<img
|
||||||
|
src="@/assets/img/CompanyQRCode.jpg"
|
||||||
|
style="float: right; margin-right: 20px;width: 70px;height: 70px;">
|
||||||
|
<span
|
||||||
|
style="font-size: 19px">浙 江 景 耀 数 控 科 技 有 限 公 司<br><span
|
||||||
|
style="font-size: 12px;">ZHEJIANG JING YAO NUMERICAL CONTROL TECHNOLOGY CO. LTD</span></span>
|
||||||
|
</div>
|
||||||
|
<div style="text-align: center;margin-bottom: 10px">
|
||||||
|
<span style="font-size: 14px">销售出库单</span>
|
||||||
|
</div>
|
||||||
|
<div style="margin-bottom: 10px">
|
||||||
|
<el-col :span="9">
|
||||||
|
<span style="float: left; margin-left: 20px;margin-top: 5px;font-size: 11px">收货单位:{{
|
||||||
|
customer
|
||||||
|
}}</span>
|
||||||
|
</el-col>
|
||||||
|
<el-col :span="7">
|
||||||
|
<span style="font-size: 11px;margin-left: 70px;">销售方式:现销</span>
|
||||||
|
</el-col>
|
||||||
|
<el-col :span="8">
|
||||||
|
<span style="float: right; font-size: 11px;margin-top: 5px;">编号:{{ number }}</span>
|
||||||
|
</el-col>
|
||||||
|
</div>
|
||||||
|
<div style="margin-bottom: 10px">
|
||||||
|
<span style="float: left;margin-left: 20px;font-size: 11px;">摘要:{{ remarks }}</span>
|
||||||
|
<span style="float: right;margin-right: 37px;font-size: 11px">日期:{{ date }}</span>
|
||||||
|
</div>
|
||||||
|
<table align="center" border="1 solid black" cellspacing="0px" style="font-size: 11px" width="100%">
|
||||||
|
<tr id="tablehead12" style="height: 35px">
|
||||||
|
<td colspan="1" style="text-align: center;width: 5%">序号</td>
|
||||||
|
<td colspan="4" style="text-align: center;width: 20%">产品名称</td>
|
||||||
|
<td colspan="5" style="text-align: center;width: 25%">辅助规格</td>
|
||||||
|
<td colspan="1" style="text-align: center;width: 5%">单位</td>
|
||||||
|
<td colspan="1" style="text-align: center;width: 5%">数量</td>
|
||||||
|
<td colspan="4" style="text-align: center;width: 20%">备注</td>
|
||||||
|
</tr>
|
||||||
|
<tr v-for="(list, index) in returns" :key="index" style="height: 35px">
|
||||||
|
<td colspan="1" style="text-align: center;width: 5%">{{ list.序号 }}</td>
|
||||||
|
<td colspan="4" style="text-align: center;width: 20%">{{ list.产品名称 }}</td>
|
||||||
|
<td colspan="5" style="text-align: center;width: 25%">{{ list.辅助规格 }}</td>
|
||||||
|
<td colspan="1" style="text-align: center;width: 5%">{{ list.单位 }}</td>
|
||||||
|
<td colspan="1" style="text-align: center;width: 5%">{{ list.数量 }}</td>
|
||||||
|
<td colspan="4" style="text-align: center;width: 20%">{{ list.备注 }}</td>
|
||||||
|
</tr>
|
||||||
|
<tr style="height: 35px">
|
||||||
|
<td colspan="1" style="text-align: center;width: 5%;font-size: 11px">合计</td>
|
||||||
|
<td colspan="19" style="text-align: center;width: 95%">
|
||||||
|
<div>
|
||||||
|
<span style="float: right;margin-right: 29.5%;font-size: 11px">{{ totalCount }}</span>
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
<div style="margin-top: 10px;font-size: 11px">
|
||||||
|
注:以上货品请核对数量,如有质量问题,请在收货后3天内通知本公司,逾期恕不负责。
|
||||||
|
</div>
|
||||||
|
<div style="margin-top: 15px;font-size: 11px"><span style="font-size: 11px">审核:</span><span
|
||||||
|
style="margin-left: 80px;font-size: 11px">业务员:</span><span
|
||||||
|
style="margin-left: 80px;font-size: 11px">发货:</span><span
|
||||||
|
style="margin-left: 80px;font-size: 11px">保管:</span><span
|
||||||
|
style="margin-left: 80px;font-size: 11px">制单:</span><span
|
||||||
|
style="margin-left: 80px;font-size: 11px">收货:</span></div>
|
||||||
|
</div>
|
||||||
|
</el-card>
|
||||||
|
</div>
|
||||||
|
</el-card>
|
||||||
<el-dialog v-el-drag-dialog :visible.sync="dialogFormVisible" title="图片" center style="" width="600px">
|
<el-dialog v-el-drag-dialog :visible.sync="dialogFormVisible" title="图片" center style="" width="600px">
|
||||||
<el-image v-for="url in urls" :key="url" :src="url" :preview-src-list="urls" lazy style="width: 500px; height: 500px"/>
|
<el-image v-for="url in urls" :key="url" :src="url" :preview-src-list="urls" lazy style="width: 500px; height: 500px"/>
|
||||||
</el-dialog>
|
</el-dialog>
|
||||||
@@ -198,10 +275,21 @@
|
|||||||
import { mapGetters } from 'vuex'
|
import { mapGetters } from 'vuex'
|
||||||
import { url, MESUploadFileNew, MESDownloadFileNew, MESUploadFileNew_BasePath } from '@/utils/request'
|
import { url, MESUploadFileNew, MESDownloadFileNew, MESUploadFileNew_BasePath } from '@/utils/request'
|
||||||
import axios from 'axios'
|
import axios from 'axios'
|
||||||
|
// 修改人:Ld 修改时间:2026-08-03 13:30:22; 打印时复用产品发货组件的DOM打印方式。
|
||||||
|
import $ from 'jquery'
|
||||||
export default {
|
export default {
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
Data: {},
|
Data: {},
|
||||||
|
// 修改人:Ld 修改时间:2026-08-03 13:30:22; 发货单打印模板绑定数据。
|
||||||
|
totalAmount: '',
|
||||||
|
totalCount: '',
|
||||||
|
totalAmountText: '',
|
||||||
|
customer: '',
|
||||||
|
number: '',
|
||||||
|
remarks: '',
|
||||||
|
date: '',
|
||||||
|
returns: [],
|
||||||
limit: 1000,
|
limit: 1000,
|
||||||
upload: url,
|
upload: url,
|
||||||
uploadSaving: false,
|
uploadSaving: false,
|
||||||
@@ -263,6 +351,62 @@ export default {
|
|||||||
this.searchTable()
|
this.searchTable()
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
|
exportTable() {
|
||||||
|
// 修改人:Ld 修改时间:2026-08-03 13:30:22; 仅将隐藏的发货单模板插入页面执行打印。
|
||||||
|
const htmlNode = $('#WGBLD').html()
|
||||||
|
const body = $('body')
|
||||||
|
body.children().hide()
|
||||||
|
const printNode = $(htmlNode)
|
||||||
|
body.append(printNode)
|
||||||
|
window.print()
|
||||||
|
body.children().not('script').show()
|
||||||
|
body.children().not('#app').hide()
|
||||||
|
printNode.remove()
|
||||||
|
},
|
||||||
|
shipmentDocPrintQuery(row) {
|
||||||
|
// 修改人:Ld 修改时间:2026-08-03 13:30:22; 按当前发货查询行获取打印明细并填充销售出库单模板。
|
||||||
|
this.returns = []
|
||||||
|
this.totalAmount = ''
|
||||||
|
this.totalAmountText = ''
|
||||||
|
this.totalCount = 0
|
||||||
|
this.customer = row.客户名称 || row.买方名称 || ''
|
||||||
|
this.number = row.订单号 || row.发货单号 || ''
|
||||||
|
this.remarks = row.发货备注 || ''
|
||||||
|
this.date = row.发货日期 || ''
|
||||||
|
var param = []
|
||||||
|
param[0] = ['发货单流水号', row.发货单流水号]
|
||||||
|
var Data = this.CreateData('11', '产品发货_发货单明细_打印发货单_查询数据', param)
|
||||||
|
this.ExecDatabase(Data).then(response => {
|
||||||
|
if (!response.data || response.data.length === 0) {
|
||||||
|
this.$message.warning('未查询到打印明细')
|
||||||
|
return
|
||||||
|
}
|
||||||
|
this.totalAmountText = response.data[0].总金额文本
|
||||||
|
this.totalAmount = response.data[0].总金额
|
||||||
|
this.customer = this.customer || response.data[0].买方名称 || ''
|
||||||
|
this.number = response.data[0].订单号 || this.number
|
||||||
|
for (let i = 0; i < response.data.length; i++) {
|
||||||
|
var currentRow = this.tableData1.find(item => item.发货单明细流水号 === response.data[i].发货单明细流水号)
|
||||||
|
var printNum = currentRow && currentRow.查询实际发量 !== '' && currentRow.查询实际发量 !== null && currentRow.查询实际发量 !== undefined ? currentRow.查询实际发量 : response.data[i].实际发量
|
||||||
|
this.returns.push({
|
||||||
|
序号: i + 1,
|
||||||
|
产品名称: response.data[i].产品名称,
|
||||||
|
单位: response.data[i].单位,
|
||||||
|
销售单价: response.data[i].单价,
|
||||||
|
辅助规格: response.data[i].产品详情,
|
||||||
|
数量: printNum,
|
||||||
|
备注: response.data[i].备注
|
||||||
|
})
|
||||||
|
this.totalCount += Number(printNum)
|
||||||
|
}
|
||||||
|
// 修改人:Ld 修改时间:2026-08-03 13:55:07; 等待隐藏打印模板完成明细渲染后再触发打印,避免打印空内容。
|
||||||
|
this.$nextTick(() => {
|
||||||
|
setTimeout(() => {
|
||||||
|
this.exportTable()
|
||||||
|
}, 100)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
},
|
||||||
review(row) {
|
review(row) {
|
||||||
this.$confirm('是否通知审核?', '提示', {
|
this.$confirm('是否通知审核?', '提示', {
|
||||||
confirmButtonText: '确定',
|
confirmButtonText: '确定',
|
||||||
|
|||||||
@@ -152,6 +152,26 @@
|
|||||||
</el-tooltip>
|
</el-tooltip>
|
||||||
</el-col>
|
</el-col>
|
||||||
</el-row>
|
</el-row>
|
||||||
|
<el-row style="width: 1192px;margin-left: 160px">
|
||||||
|
<el-col :span="24">
|
||||||
|
<!-- 修改人:Ld 修改时间:2026-07-28 09:30:00; 老专机合同头部增加提成类型选择 -->
|
||||||
|
<span> 提成类型:</span>
|
||||||
|
<el-select
|
||||||
|
v-model="commissionType"
|
||||||
|
clearable
|
||||||
|
filterable
|
||||||
|
placeholder="请选择提成类型"
|
||||||
|
size="small"
|
||||||
|
style="width:200px;margin: 10px 0 10px 3px"
|
||||||
|
@change="editContract">
|
||||||
|
<el-option
|
||||||
|
v-for="item in commissionTypeOptions"
|
||||||
|
:key="item.value"
|
||||||
|
:label="item.label"
|
||||||
|
:value="item.value"/>
|
||||||
|
</el-select>
|
||||||
|
</el-col>
|
||||||
|
</el-row>
|
||||||
<div style="margin-left: 160px">
|
<div style="margin-left: 160px">
|
||||||
<el-table
|
<el-table
|
||||||
v-loading="loading"
|
v-loading="loading"
|
||||||
@@ -1038,6 +1058,14 @@ export default {
|
|||||||
},
|
},
|
||||||
people: [],
|
people: [],
|
||||||
province: [],
|
province: [],
|
||||||
|
// 修改人:Ld 修改时间:2026-07-28 09:30:00; 老专机合同提成类型下拉选项
|
||||||
|
commissionTypeOptions: [
|
||||||
|
{ label: '复购提成', value: '复购提成' },
|
||||||
|
{ label: '首单提成(专机)', value: '首单提成(专机)' },
|
||||||
|
{ label: '首单提成(模块)', value: '首单提成(模块)' },
|
||||||
|
{ label: '转介绍提成(专机)', value: '转介绍提成(专机)' },
|
||||||
|
{ label: '转介绍提成(模块)', value: '转介绍提成(模块)' }
|
||||||
|
],
|
||||||
rules: {
|
rules: {
|
||||||
省份: [{ required: true, message: '请选择省份' }],
|
省份: [{ required: true, message: '请选择省份' }],
|
||||||
客户名称: [{ required: true, message: '请输入客户名称' }],
|
客户名称: [{ required: true, message: '请输入客户名称' }],
|
||||||
@@ -1068,6 +1096,7 @@ export default {
|
|||||||
paymentMethodValue: '', // 付款方式值
|
paymentMethodValue: '', // 付款方式值
|
||||||
customerRequirements: '', // 客户要求
|
customerRequirements: '', // 客户要求
|
||||||
contractRemarks: '', // 合同备注
|
contractRemarks: '', // 合同备注
|
||||||
|
commissionType: '', // 修改人:Ld 修改时间:2026-07-28 09:30:00; 提成类型
|
||||||
consignee: '',
|
consignee: '',
|
||||||
productName: '',
|
productName: '',
|
||||||
MachineToolNumber: '',
|
MachineToolNumber: '',
|
||||||
@@ -1438,6 +1467,7 @@ export default {
|
|||||||
this.deliveryDate = ''
|
this.deliveryDate = ''
|
||||||
this.customerRequirements = ''
|
this.customerRequirements = ''
|
||||||
this.contractRemarks = ''
|
this.contractRemarks = ''
|
||||||
|
this.commissionType = ''
|
||||||
this.MachineToolNumber = ''
|
this.MachineToolNumber = ''
|
||||||
var param1 = []
|
var param1 = []
|
||||||
var Data1 = this.CreateData('11', 'PDM_项目名称_专机_查询数据', param1)
|
var Data1 = this.CreateData('11', 'PDM_项目名称_专机_查询数据', param1)
|
||||||
@@ -1742,6 +1772,8 @@ export default {
|
|||||||
this.contractRemarks = response.data[0].合同备注
|
this.contractRemarks = response.data[0].合同备注
|
||||||
this.MachineToolNumber = response.data[0].机床流水号
|
this.MachineToolNumber = response.data[0].机床流水号
|
||||||
this.contractMumber = response.data[0].合同编号
|
this.contractMumber = response.data[0].合同编号
|
||||||
|
// 修改人:Ld 修改时间:2026-07-28 09:30:00; 选择老专机合同时回填提成类型
|
||||||
|
this.commissionType = response.data[0].提成类型 ? response.data[0].提成类型 : ''
|
||||||
this.searchMachine()
|
this.searchMachine()
|
||||||
this.searchProduct()
|
this.searchProduct()
|
||||||
})
|
})
|
||||||
@@ -1753,6 +1785,7 @@ export default {
|
|||||||
this.deliveryDate = ''
|
this.deliveryDate = ''
|
||||||
this.customerRequirements = ''
|
this.customerRequirements = ''
|
||||||
this.contractRemarks = ''
|
this.contractRemarks = ''
|
||||||
|
this.commissionType = ''
|
||||||
this.MachineToolNumber = ''
|
this.MachineToolNumber = ''
|
||||||
this.contractMumber = ''
|
this.contractMumber = ''
|
||||||
this.consignee = ''
|
this.consignee = ''
|
||||||
@@ -1818,6 +1851,7 @@ export default {
|
|||||||
this.deliveryDate = ''
|
this.deliveryDate = ''
|
||||||
this.customerRequirements = ''
|
this.customerRequirements = ''
|
||||||
this.contractRemarks = ''
|
this.contractRemarks = ''
|
||||||
|
this.commissionType = ''
|
||||||
this.MachineToolNumber = ''
|
this.MachineToolNumber = ''
|
||||||
var param1 = []
|
var param1 = []
|
||||||
var Data1 = this.CreateData('11', 'PDM_项目名称_专机_查询数据', param1)
|
var Data1 = this.CreateData('11', 'PDM_项目名称_专机_查询数据', param1)
|
||||||
@@ -1861,8 +1895,10 @@ export default {
|
|||||||
param[5] = ['交货期限', this.deliveryDate]
|
param[5] = ['交货期限', this.deliveryDate]
|
||||||
param[6] = ['客户要求', this.customerRequirements]
|
param[6] = ['客户要求', this.customerRequirements]
|
||||||
param[7] = ['合同备注', this.contractRemarks]
|
param[7] = ['合同备注', this.contractRemarks]
|
||||||
param[8] = ['操作者', this.id]
|
// 修改人:Ld 修改时间:2026-07-28 09:30:00; 老专机合同编辑保存提成类型
|
||||||
param[9] = ['收货人', this.consignee]
|
param[8] = ['提成类型', this.commissionType]
|
||||||
|
param[9] = ['操作者', this.id]
|
||||||
|
param[10] = ['收货人', this.consignee]
|
||||||
var Data = this.CreateData('12', 'PDM_项目名称_编辑数据', param)
|
var Data = this.CreateData('12', 'PDM_项目名称_编辑数据', param)
|
||||||
this.ExecDatabase(Data).then(response => {
|
this.ExecDatabase(Data).then(response => {
|
||||||
if (response.data[0].result === '0') {
|
if (response.data[0].result === '0') {
|
||||||
@@ -1883,8 +1919,10 @@ export default {
|
|||||||
param[5] = ['交货期限', this.deliveryDate]
|
param[5] = ['交货期限', this.deliveryDate]
|
||||||
param[6] = ['客户要求', this.customerRequirements]
|
param[6] = ['客户要求', this.customerRequirements]
|
||||||
param[7] = ['合同备注', this.contractRemarks]
|
param[7] = ['合同备注', this.contractRemarks]
|
||||||
param[8] = ['操作者', this.id]
|
// 修改人:Ld 修改时间:2026-07-28 09:30:00; 老专机合同编辑保存提成类型
|
||||||
param[9] = ['收货人', this.consignee]
|
param[8] = ['提成类型', this.commissionType]
|
||||||
|
param[9] = ['操作者', this.id]
|
||||||
|
param[10] = ['收货人', this.consignee]
|
||||||
console.log(this.consignee, 456)
|
console.log(this.consignee, 456)
|
||||||
var Data = this.CreateData('12', 'PDM_项目名称_编辑数据', param)
|
var Data = this.CreateData('12', 'PDM_项目名称_编辑数据', param)
|
||||||
this.ExecDatabase(Data).then(response => {
|
this.ExecDatabase(Data).then(response => {
|
||||||
@@ -2362,6 +2400,11 @@ export default {
|
|||||||
},
|
},
|
||||||
submitContract() {
|
submitContract() {
|
||||||
if (this.contractNoValue) {
|
if (this.contractNoValue) {
|
||||||
|
// 修改人:Ld 修改时间:2026-07-28 09:30:00; 老专机合同提交前必须选择提成类型
|
||||||
|
if (!this.commissionType) {
|
||||||
|
this.$message.warning('请选择提成类型')
|
||||||
|
return
|
||||||
|
}
|
||||||
if (this.customerNameValue && this.paymentMethodValue && this.taxRate && this.tableData.length !== 0 && this.tableData1.length !== 0 && this.deliveryDate && this.signingDate) {
|
if (this.customerNameValue && this.paymentMethodValue && this.taxRate && this.tableData.length !== 0 && this.tableData1.length !== 0 && this.deliveryDate && this.signingDate) {
|
||||||
for (let i = 0; i < this.tableData1.length; i++) {
|
for (let i = 0; i < this.tableData1.length; i++) {
|
||||||
if (this.tableData1[i].产品名称 === null || this.tableData1[i].产品名称 === '') {
|
if (this.tableData1[i].产品名称 === null || this.tableData1[i].产品名称 === '') {
|
||||||
@@ -2417,6 +2460,7 @@ export default {
|
|||||||
this.deliveryDate = ''
|
this.deliveryDate = ''
|
||||||
this.customerRequirements = ''
|
this.customerRequirements = ''
|
||||||
this.contractRemarks = ''
|
this.contractRemarks = ''
|
||||||
|
this.commissionType = ''
|
||||||
this.MachineToolNumber = ''
|
this.MachineToolNumber = ''
|
||||||
this.taxRate = ''
|
this.taxRate = ''
|
||||||
this.consignee = ''
|
this.consignee = ''
|
||||||
|
|||||||
@@ -132,6 +132,26 @@
|
|||||||
<el-input v-model="consignee" readonly size="small" style="width:200px;margin: 10px 0 10px 3px"/>
|
<el-input v-model="consignee" readonly size="small" style="width:200px;margin: 10px 0 10px 3px"/>
|
||||||
</el-col>
|
</el-col>
|
||||||
<el-col :span="6">
|
<el-col :span="6">
|
||||||
|
<!-- 修改人:Ld 修改时间:2026-07-27 10:00:00; 合同头部提成类型 -->
|
||||||
|
<span> 提成类型:</span>
|
||||||
|
<el-select
|
||||||
|
v-model="commissionType"
|
||||||
|
clearable
|
||||||
|
filterable
|
||||||
|
placeholder="请选择提成类型"
|
||||||
|
size="small"
|
||||||
|
style="width:200px;margin: 10px 0 10px 3px"
|
||||||
|
@change="editContract">
|
||||||
|
<el-option
|
||||||
|
v-for="item in commissionTypeOptions"
|
||||||
|
:key="item.value"
|
||||||
|
:label="item.label"
|
||||||
|
:value="item.value"/>
|
||||||
|
</el-select>
|
||||||
|
</el-col>
|
||||||
|
</el-row>
|
||||||
|
<el-row style="width: 1192px;margin-left: 160px">
|
||||||
|
<el-col :span="24">
|
||||||
<span> 合同备注:</span>
|
<span> 合同备注:</span>
|
||||||
<el-tooltip :open-delay="500" :disabled="contractRemarks ? false : true" effect="dark" placement="top">
|
<el-tooltip :open-delay="500" :disabled="contractRemarks ? false : true" effect="dark" placement="top">
|
||||||
<div slot="content">{{ contractRemarks }}</div>
|
<div slot="content">{{ contractRemarks }}</div>
|
||||||
@@ -1012,6 +1032,14 @@ export default {
|
|||||||
},
|
},
|
||||||
people: [],
|
people: [],
|
||||||
province: [],
|
province: [],
|
||||||
|
// 修改人:Ld 修改时间:2026-07-27 10:00:00; 合同提成类型下拉选项
|
||||||
|
commissionTypeOptions: [
|
||||||
|
{ label: '首单提成(专机)', value: '首单提成(专机)' },
|
||||||
|
{ label: '首单提成(模块)', value: '首单提成(模块)' },
|
||||||
|
{ label: '转介绍提成(专机)', value: '转介绍提成(专机)' },
|
||||||
|
{ label: '转介绍提成(模块)', value: '转介绍提成(模块)' },
|
||||||
|
{ label: '复购提成', value: '复购提成' }
|
||||||
|
],
|
||||||
rules: {
|
rules: {
|
||||||
省份: [{ required: true, message: '请选择省份' }],
|
省份: [{ required: true, message: '请选择省份' }],
|
||||||
客户名称: [{ required: true, message: '请输入客户名称' }],
|
客户名称: [{ required: true, message: '请输入客户名称' }],
|
||||||
@@ -1042,6 +1070,7 @@ export default {
|
|||||||
paymentMethodValue: '', // 付款方式值
|
paymentMethodValue: '', // 付款方式值
|
||||||
customerRequirements: '', // 客户要求
|
customerRequirements: '', // 客户要求
|
||||||
contractRemarks: '', // 合同备注
|
contractRemarks: '', // 合同备注
|
||||||
|
commissionType: '', // 提成类型
|
||||||
consignee: '',
|
consignee: '',
|
||||||
productName: '',
|
productName: '',
|
||||||
MachineToolNumber: '',
|
MachineToolNumber: '',
|
||||||
@@ -1412,6 +1441,7 @@ export default {
|
|||||||
this.deliveryDate = ''
|
this.deliveryDate = ''
|
||||||
this.customerRequirements = ''
|
this.customerRequirements = ''
|
||||||
this.contractRemarks = ''
|
this.contractRemarks = ''
|
||||||
|
this.commissionType = ''
|
||||||
this.MachineToolNumber = ''
|
this.MachineToolNumber = ''
|
||||||
var param1 = []
|
var param1 = []
|
||||||
var Data1 = this.CreateData('11', 'PDM_项目名称_新专机_查询数据', param1)
|
var Data1 = this.CreateData('11', 'PDM_项目名称_新专机_查询数据', param1)
|
||||||
@@ -1700,6 +1730,7 @@ export default {
|
|||||||
this.customerRequirements = response.data[0].客户要求
|
this.customerRequirements = response.data[0].客户要求
|
||||||
this.contractRemarks = response.data[0].合同备注
|
this.contractRemarks = response.data[0].合同备注
|
||||||
this.MachineToolNumber = response.data[0].机床流水号
|
this.MachineToolNumber = response.data[0].机床流水号
|
||||||
|
this.commissionType = response.data[0].提成类型 ? response.data[0].提成类型 : ''
|
||||||
this.contractMumber = response.data[0].合同编号
|
this.contractMumber = response.data[0].合同编号
|
||||||
this.searchMachine()
|
this.searchMachine()
|
||||||
this.searchProduct()
|
this.searchProduct()
|
||||||
@@ -1777,6 +1808,7 @@ export default {
|
|||||||
this.deliveryDate = ''
|
this.deliveryDate = ''
|
||||||
this.customerRequirements = ''
|
this.customerRequirements = ''
|
||||||
this.contractRemarks = ''
|
this.contractRemarks = ''
|
||||||
|
this.commissionType = ''
|
||||||
this.MachineToolNumber = ''
|
this.MachineToolNumber = ''
|
||||||
var param1 = []
|
var param1 = []
|
||||||
var Data1 = this.CreateData('11', 'PDM_项目名称_新专机_查询数据', param1)
|
var Data1 = this.CreateData('11', 'PDM_项目名称_新专机_查询数据', param1)
|
||||||
@@ -1820,8 +1852,9 @@ export default {
|
|||||||
param[5] = ['交货期限', this.deliveryDate]
|
param[5] = ['交货期限', this.deliveryDate]
|
||||||
param[6] = ['客户要求', this.customerRequirements]
|
param[6] = ['客户要求', this.customerRequirements]
|
||||||
param[7] = ['合同备注', this.contractRemarks]
|
param[7] = ['合同备注', this.contractRemarks]
|
||||||
param[8] = ['操作者', this.id]
|
param[8] = ['提成类型', this.commissionType]
|
||||||
param[9] = ['收货人', this.consignee]
|
param[9] = ['操作者', this.id]
|
||||||
|
param[10] = ['收货人', this.consignee]
|
||||||
var Data = this.CreateData('12', 'PDM_项目名称_编辑数据', param)
|
var Data = this.CreateData('12', 'PDM_项目名称_编辑数据', param)
|
||||||
this.ExecDatabase(Data).then(response => {
|
this.ExecDatabase(Data).then(response => {
|
||||||
if (response.data[0].result === '0') {
|
if (response.data[0].result === '0') {
|
||||||
@@ -1842,8 +1875,9 @@ export default {
|
|||||||
param[5] = ['交货期限', this.deliveryDate]
|
param[5] = ['交货期限', this.deliveryDate]
|
||||||
param[6] = ['客户要求', this.customerRequirements]
|
param[6] = ['客户要求', this.customerRequirements]
|
||||||
param[7] = ['合同备注', this.contractRemarks]
|
param[7] = ['合同备注', this.contractRemarks]
|
||||||
param[8] = ['操作者', this.id]
|
param[8] = ['提成类型', this.commissionType]
|
||||||
param[9] = ['收货人', this.consignee]
|
param[9] = ['操作者', this.id]
|
||||||
|
param[10] = ['收货人', this.consignee]
|
||||||
console.log(this.consignee, 456)
|
console.log(this.consignee, 456)
|
||||||
var Data = this.CreateData('12', 'PDM_项目名称_编辑数据', param)
|
var Data = this.CreateData('12', 'PDM_项目名称_编辑数据', param)
|
||||||
this.ExecDatabase(Data).then(response => {
|
this.ExecDatabase(Data).then(response => {
|
||||||
@@ -2316,6 +2350,11 @@ export default {
|
|||||||
},
|
},
|
||||||
submitContract() {
|
submitContract() {
|
||||||
if (this.contractNoValue) {
|
if (this.contractNoValue) {
|
||||||
|
// 修改人:Ld 修改时间:2026-07-27 10:00:00; 提交前必须选择提成类型
|
||||||
|
if (!this.commissionType) {
|
||||||
|
this.$message.warning('请选择提成类型')
|
||||||
|
return
|
||||||
|
}
|
||||||
if (this.customerNameValue && this.paymentMethodValue && this.taxRate && this.tableData.length !== 0 && this.tableData1.length !== 0 && this.deliveryDate && this.signingDate) {
|
if (this.customerNameValue && this.paymentMethodValue && this.taxRate && this.tableData.length !== 0 && this.tableData1.length !== 0 && this.deliveryDate && this.signingDate) {
|
||||||
for (let i = 0; i < this.tableData1.length; i++) {
|
for (let i = 0; i < this.tableData1.length; i++) {
|
||||||
if (this.tableData1[i].产品名称 === null || this.tableData1[i].产品名称 === '') {
|
if (this.tableData1[i].产品名称 === null || this.tableData1[i].产品名称 === '') {
|
||||||
@@ -2371,6 +2410,7 @@ export default {
|
|||||||
this.deliveryDate = ''
|
this.deliveryDate = ''
|
||||||
this.customerRequirements = ''
|
this.customerRequirements = ''
|
||||||
this.contractRemarks = ''
|
this.contractRemarks = ''
|
||||||
|
this.commissionType = ''
|
||||||
this.MachineToolNumber = ''
|
this.MachineToolNumber = ''
|
||||||
this.taxRate = ''
|
this.taxRate = ''
|
||||||
this.consignee = ''
|
this.consignee = ''
|
||||||
|
|||||||
@@ -96,7 +96,7 @@
|
|||||||
border
|
border
|
||||||
stripe
|
stripe
|
||||||
size="small"
|
size="small"
|
||||||
style="width: 1651px"
|
style="width: 1791px"
|
||||||
height="280px"
|
height="280px"
|
||||||
@cell-dblclick="handleEdit"
|
@cell-dblclick="handleEdit"
|
||||||
@row-click="searchTable1">
|
@row-click="searchTable1">
|
||||||
@@ -138,6 +138,12 @@
|
|||||||
{{ scope.row.订单编号 }}
|
{{ scope.row.订单编号 }}
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
|
<!-- 修改人:Ld 修改时间:2026-08-03 17:02:31; 显示订单挂靠的销售合同编号,便于识别补货订单来源。 -->
|
||||||
|
<el-table-column :width="setColumnWidth('合同编号')" label="合同编号" align="center" show-overflow-tooltip>
|
||||||
|
<template slot-scope="scope">
|
||||||
|
{{ scope.row.合同编号 }}
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
<el-table-column width="60px" label="收货人" align="center">
|
<el-table-column width="60px" label="收货人" align="center">
|
||||||
<template slot-scope="scope">
|
<template slot-scope="scope">
|
||||||
{{ scope.row.收货人 }}
|
{{ scope.row.收货人 }}
|
||||||
@@ -3427,4 +3433,3 @@ a {
|
|||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -152,6 +152,26 @@
|
|||||||
</el-tooltip>
|
</el-tooltip>
|
||||||
</el-col>
|
</el-col>
|
||||||
</el-row>
|
</el-row>
|
||||||
|
<el-row style="width: 1192px;margin-left: 170px">
|
||||||
|
<el-col :span="24">
|
||||||
|
<!-- 修改人:Ld 修改时间:2026-07-27 10:00:00; 合同头部提成类型 -->
|
||||||
|
<span> 提成类型:</span>
|
||||||
|
<el-select
|
||||||
|
v-model="commissionType"
|
||||||
|
clearable
|
||||||
|
filterable
|
||||||
|
placeholder="请选择提成类型"
|
||||||
|
size="small"
|
||||||
|
style="width:200px;margin: 10px 0 10px 3px"
|
||||||
|
@change="editContract">
|
||||||
|
<el-option
|
||||||
|
v-for="item in commissionTypeOptions"
|
||||||
|
:key="item.value"
|
||||||
|
:label="item.label"
|
||||||
|
:value="item.value"/>
|
||||||
|
</el-select>
|
||||||
|
</el-col>
|
||||||
|
</el-row>
|
||||||
<div style="margin-left: 170px">
|
<div style="margin-left: 170px">
|
||||||
<el-table
|
<el-table
|
||||||
v-loading="loading"
|
v-loading="loading"
|
||||||
@@ -1167,6 +1187,15 @@ export default {
|
|||||||
},
|
},
|
||||||
people: [],
|
people: [],
|
||||||
province: [],
|
province: [],
|
||||||
|
// 修改人:Ld 修改时间:2026-07-27 10:00:00; 合同提成类型下拉选项
|
||||||
|
commissionTypeOptions: [
|
||||||
|
{ label: '复购提成', value: '复购提成' },
|
||||||
|
{ label: '首单提成(专机)', value: '首单提成(专机)' },
|
||||||
|
{ label: '首单提成(模块)', value: '首单提成(模块)' },
|
||||||
|
{ label: '转介绍提成(专机)', value: '转介绍提成(专机)' },
|
||||||
|
{ label: '转介绍提成(模块)', value: '转介绍提成(模块)' }
|
||||||
|
|
||||||
|
],
|
||||||
rules: {
|
rules: {
|
||||||
省份: [{ required: true, message: '请选择省份' }],
|
省份: [{ required: true, message: '请选择省份' }],
|
||||||
客户名称: [{ required: true, message: '请输入客户名称' }],
|
客户名称: [{ required: true, message: '请输入客户名称' }],
|
||||||
@@ -1199,6 +1228,7 @@ export default {
|
|||||||
paymentMethodValue: '', // 付款方式值
|
paymentMethodValue: '', // 付款方式值
|
||||||
customerRequirements: '', // 客户要求
|
customerRequirements: '', // 客户要求
|
||||||
contractRemarks: '', // 合同备注
|
contractRemarks: '', // 合同备注
|
||||||
|
commissionType: '', // 提成类型
|
||||||
MachineToolNumber: '',
|
MachineToolNumber: '',
|
||||||
multipleSelection: [],
|
multipleSelection: [],
|
||||||
multipleSelection_variable: [],
|
multipleSelection_variable: [],
|
||||||
@@ -1951,6 +1981,7 @@ export default {
|
|||||||
this.deliveryDate = ''
|
this.deliveryDate = ''
|
||||||
this.customerRequirements = ''
|
this.customerRequirements = ''
|
||||||
this.contractRemarks = ''
|
this.contractRemarks = ''
|
||||||
|
this.commissionType = ''
|
||||||
this.MachineToolNumber = ''
|
this.MachineToolNumber = ''
|
||||||
var param1 = []
|
var param1 = []
|
||||||
var Data1 = this.CreateData('11', 'PDM_项目名称_查询数据', param1)
|
var Data1 = this.CreateData('11', 'PDM_项目名称_查询数据', param1)
|
||||||
@@ -2127,6 +2158,7 @@ export default {
|
|||||||
this.customerRequirements = response.data[0].客户要求
|
this.customerRequirements = response.data[0].客户要求
|
||||||
this.contractRemarks = response.data[0].合同备注
|
this.contractRemarks = response.data[0].合同备注
|
||||||
this.MachineToolNumber = response.data[0].机床流水号
|
this.MachineToolNumber = response.data[0].机床流水号
|
||||||
|
this.commissionType = response.data[0].提成类型 ? response.data[0].提成类型 : ''
|
||||||
this.searchProduct()
|
this.searchProduct()
|
||||||
})
|
})
|
||||||
} else {
|
} else {
|
||||||
@@ -2199,6 +2231,7 @@ export default {
|
|||||||
this.deliveryDate = ''
|
this.deliveryDate = ''
|
||||||
this.customerRequirements = ''
|
this.customerRequirements = ''
|
||||||
this.contractRemarks = ''
|
this.contractRemarks = ''
|
||||||
|
this.commissionType = ''
|
||||||
this.MachineToolNumber = ''
|
this.MachineToolNumber = ''
|
||||||
var param1 = []
|
var param1 = []
|
||||||
var Data1 = this.CreateData('11', 'PDM_项目名称_查询数据', param1)
|
var Data1 = this.CreateData('11', 'PDM_项目名称_查询数据', param1)
|
||||||
@@ -2242,8 +2275,9 @@ export default {
|
|||||||
param[5] = ['交货期限', this.deliveryDate]
|
param[5] = ['交货期限', this.deliveryDate]
|
||||||
param[6] = ['客户要求', this.customerRequirements]
|
param[6] = ['客户要求', this.customerRequirements]
|
||||||
param[7] = ['合同备注', this.contractRemarks]
|
param[7] = ['合同备注', this.contractRemarks]
|
||||||
param[8] = ['操作者', this.id]
|
param[8] = ['提成类型', this.commissionType]
|
||||||
param[9] = ['收货人', this.consignee]
|
param[9] = ['操作者', this.id]
|
||||||
|
param[10] = ['收货人', this.consignee]
|
||||||
var Data = this.CreateData('12', 'PDM_项目名称_编辑数据', param)
|
var Data = this.CreateData('12', 'PDM_项目名称_编辑数据', param)
|
||||||
this.ExecDatabase(Data).then(response => {
|
this.ExecDatabase(Data).then(response => {
|
||||||
if (response.data[0].result === '0') {
|
if (response.data[0].result === '0') {
|
||||||
@@ -2264,8 +2298,9 @@ export default {
|
|||||||
param[5] = ['交货期限', this.deliveryDate]
|
param[5] = ['交货期限', this.deliveryDate]
|
||||||
param[6] = ['客户要求', this.customerRequirements]
|
param[6] = ['客户要求', this.customerRequirements]
|
||||||
param[7] = ['合同备注', this.contractRemarks]
|
param[7] = ['合同备注', this.contractRemarks]
|
||||||
param[8] = ['操作者', this.id]
|
param[8] = ['提成类型', this.commissionType]
|
||||||
param[9] = ['收货人', this.consignee]
|
param[9] = ['操作者', this.id]
|
||||||
|
param[10] = ['收货人', this.consignee]
|
||||||
console.log(this.consignee, 456)
|
console.log(this.consignee, 456)
|
||||||
var Data = this.CreateData('12', 'PDM_项目名称_编辑数据', param)
|
var Data = this.CreateData('12', 'PDM_项目名称_编辑数据', param)
|
||||||
this.ExecDatabase(Data).then(response => {
|
this.ExecDatabase(Data).then(response => {
|
||||||
@@ -2460,6 +2495,11 @@ export default {
|
|||||||
},
|
},
|
||||||
submitContract() {
|
submitContract() {
|
||||||
if (this.contractNoValue) {
|
if (this.contractNoValue) {
|
||||||
|
// 修改人:Ld 修改时间:2026-07-27 10:00:00; 提交前必须选择提成类型
|
||||||
|
if (!this.commissionType) {
|
||||||
|
this.$message.warning('请选择提成类型')
|
||||||
|
return
|
||||||
|
}
|
||||||
if (this.customerNameValue && this.paymentMethodValue && this.taxRate && this.tableData.length !== 0 && this.deliveryDate && this.signingDate) {
|
if (this.customerNameValue && this.paymentMethodValue && this.taxRate && this.tableData.length !== 0 && this.deliveryDate && this.signingDate) {
|
||||||
for (let i = 0; i < this.tableData.length; i++) {
|
for (let i = 0; i < this.tableData.length; i++) {
|
||||||
if (this.tableData[i].产品名称 === null || this.tableData[i].产品名称 === '') {
|
if (this.tableData[i].产品名称 === null || this.tableData[i].产品名称 === '') {
|
||||||
@@ -2495,6 +2535,7 @@ export default {
|
|||||||
this.deliveryDate = ''
|
this.deliveryDate = ''
|
||||||
this.customerRequirements = ''
|
this.customerRequirements = ''
|
||||||
this.contractRemarks = ''
|
this.contractRemarks = ''
|
||||||
|
this.commissionType = ''
|
||||||
this.MachineToolNumber = ''
|
this.MachineToolNumber = ''
|
||||||
this.taxRate = ''
|
this.taxRate = ''
|
||||||
this.consignee = ''
|
this.consignee = ''
|
||||||
|
|||||||
239
src/views/SalesManagement/SalesPerformance/index.vue
Normal file
@@ -0,0 +1,239 @@
|
|||||||
|
<template>
|
||||||
|
<div class="app-container">
|
||||||
|
<el-card style="height: 850px">
|
||||||
|
<div style="margin-top: 7px; margin-bottom: 7px">
|
||||||
|
<!-- 修改人:Ld 修改时间:2026-07-27 12:00:00; 销售绩效按汇款月份查询。 -->
|
||||||
|
<el-date-picker
|
||||||
|
v-model="performanceMonth"
|
||||||
|
type="month"
|
||||||
|
value-format="yyyy-MM"
|
||||||
|
size="small"
|
||||||
|
style="width: 160px"
|
||||||
|
clearable
|
||||||
|
placeholder="绩效月份"
|
||||||
|
@change="searchTable" />
|
||||||
|
<el-input
|
||||||
|
v-model="salesman"
|
||||||
|
style="width: 160px; margin-left: 10px"
|
||||||
|
size="small"
|
||||||
|
clearable
|
||||||
|
placeholder="销售员"
|
||||||
|
@keyup.enter.native="searchTable" />
|
||||||
|
<el-select
|
||||||
|
v-model="commissionType"
|
||||||
|
size="small"
|
||||||
|
style="width: 190px; margin-left: 10px"
|
||||||
|
clearable
|
||||||
|
filterable
|
||||||
|
placeholder="提成类型"
|
||||||
|
@change="searchTable">
|
||||||
|
<el-option v-for="item in commissionTypeOptions" :key="item.value" :label="item.label" :value="item.value" />
|
||||||
|
</el-select>
|
||||||
|
<el-input
|
||||||
|
v-model="contractNo"
|
||||||
|
style="width: 180px; margin-left: 10px"
|
||||||
|
size="small"
|
||||||
|
clearable
|
||||||
|
placeholder="合同编号"
|
||||||
|
@keyup.enter.native="searchTable" />
|
||||||
|
<el-button
|
||||||
|
icon="el-icon-search"
|
||||||
|
type="primary"
|
||||||
|
plain
|
||||||
|
size="small"
|
||||||
|
style="margin-left: 10px"
|
||||||
|
@click="searchTable">查询</el-button>
|
||||||
|
<el-button
|
||||||
|
icon="el-icon-download"
|
||||||
|
type="success"
|
||||||
|
plain
|
||||||
|
size="small"
|
||||||
|
style="margin-left: 10px"
|
||||||
|
@click="exportExcel">导出</el-button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<el-table
|
||||||
|
v-loading="loading"
|
||||||
|
:data="pageTableData"
|
||||||
|
border
|
||||||
|
stripe
|
||||||
|
size="small"
|
||||||
|
style="width: 100%; margin-top: 20px"
|
||||||
|
height="740px"
|
||||||
|
@expand-change="handleExpandChange">
|
||||||
|
<!-- 修改人:Ld 修改时间:2026-07-28 13:45:00; 销售绩效展开查看回款明细 -->
|
||||||
|
<el-table-column type="expand" width="45px">
|
||||||
|
<template slot-scope="scope">
|
||||||
|
<div style="padding: 8px 25px">
|
||||||
|
<el-table
|
||||||
|
v-loading="scope.row.detailLoading"
|
||||||
|
:data="scope.row.paymentDetails || []"
|
||||||
|
border
|
||||||
|
stripe
|
||||||
|
size="mini"
|
||||||
|
style="width: 620px">
|
||||||
|
<el-table-column width="180px" label="回款时间" align="center" prop="回款时间" />
|
||||||
|
<el-table-column width="130px" label="回款金额" align="right">
|
||||||
|
<template slot-scope="detailScope">{{ formatMoney(detailScope.row.回款金额) }}</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="备注" align="center" prop="备注" show-overflow-tooltip />
|
||||||
|
</el-table>
|
||||||
|
<div v-if="!scope.row.detailLoading && (!scope.row.paymentDetails || scope.row.paymentDetails.length === 0)" style="line-height: 32px;color: #909399">
|
||||||
|
暂无回款明细
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column width="60px" label="序号" type="index" align="center" />
|
||||||
|
<el-table-column width="100px" label="绩效月份" align="center" prop="绩效月份" />
|
||||||
|
<el-table-column width="100px" label="销售员" align="center" prop="销售员" show-overflow-tooltip />
|
||||||
|
<el-table-column width="160px" label="合同编号" align="center" prop="合同编号" show-overflow-tooltip />
|
||||||
|
<el-table-column width="220px" label="客户名称" align="center" prop="客户名称" show-overflow-tooltip />
|
||||||
|
<el-table-column width="120px" label="合同金额" align="right">
|
||||||
|
<template slot-scope="scope">{{ formatMoney(scope.row.合同金额) }}</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column width="120px" label="累计回款金额" align="right">
|
||||||
|
<template slot-scope="scope">{{ formatMoney(scope.row.累计回款金额) }}</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column width="120px" label="本月回款金额" align="right">
|
||||||
|
<template slot-scope="scope">{{ formatMoney(scope.row.本月回款金额) }}</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column width="100px" label="回款比例" align="right">
|
||||||
|
<template slot-scope="scope">{{ formatPercent(scope.row.回款比例) }}</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column width="170px" label="提成类型" align="center" prop="提成类型" show-overflow-tooltip />
|
||||||
|
<el-table-column width="100px" label="提成比例" align="right">
|
||||||
|
<template slot-scope="scope">{{ formatPercent(scope.row.提成比例) }}</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column width="130px" label="本月绩效金额" align="right">
|
||||||
|
<template slot-scope="scope">{{ formatMoney(scope.row.本月绩效金额) }}</template>
|
||||||
|
</el-table-column>
|
||||||
|
</el-table>
|
||||||
|
|
||||||
|
<div class="block" style="margin-top: 10px">
|
||||||
|
<el-pagination
|
||||||
|
:current-page="pageCurrent"
|
||||||
|
:page-sizes="[10, 20, 30, 40, 100]"
|
||||||
|
:page-size="pageSize"
|
||||||
|
:total="tableData.length"
|
||||||
|
layout="total, sizes, prev, pager, next, jumper"
|
||||||
|
@size-change="handleSizeChanges"
|
||||||
|
@current-change="handleCurrentChanges" />
|
||||||
|
</div>
|
||||||
|
</el-card>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
export default {
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
loading: false,
|
||||||
|
performanceMonth: '',
|
||||||
|
salesman: '',
|
||||||
|
commissionType: '',
|
||||||
|
contractNo: '',
|
||||||
|
pageCurrent: 1,
|
||||||
|
pageSize: 100,
|
||||||
|
tableData: [],
|
||||||
|
// 修改人:Ld 修改时间:2026-07-27 12:00:00; 提成类型查询条件与合同录入保持一致。
|
||||||
|
commissionTypeOptions: [
|
||||||
|
{ label: '首单提成(专机)', value: '首单提成(专机)' },
|
||||||
|
{ label: '首单提成(模块)', value: '首单提成(模块)' },
|
||||||
|
{ label: '转介绍提成(专机)', value: '转介绍提成(专机)' },
|
||||||
|
{ label: '转介绍提成(模块)', value: '转介绍提成(模块)' },
|
||||||
|
{ label: '复购提成', value: '复购提成' }
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
computed: {
|
||||||
|
pageTableData() {
|
||||||
|
const start = (this.pageCurrent - 1) * this.pageSize
|
||||||
|
return this.tableData.slice(start, start + this.pageSize)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
mounted() {
|
||||||
|
const date = new Date()
|
||||||
|
this.performanceMonth = date.getFullYear() + '-' + this.padMonth(date.getMonth() + 1)
|
||||||
|
this.searchTable()
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
padMonth(value) {
|
||||||
|
return value < 10 ? '0' + value : String(value)
|
||||||
|
},
|
||||||
|
buildParam() {
|
||||||
|
var param = []
|
||||||
|
param[0] = ['绩效月份', this.performanceMonth]
|
||||||
|
param[1] = ['销售员_check', this.salesman ? 1 : 0]
|
||||||
|
param[2] = ['销售员', this.salesman]
|
||||||
|
param[3] = ['提成类型_check', this.commissionType ? 1 : 0]
|
||||||
|
param[4] = ['提成类型', this.commissionType]
|
||||||
|
param[5] = ['合同编号_check', this.contractNo ? 1 : 0]
|
||||||
|
param[6] = ['合同编号', this.contractNo]
|
||||||
|
return param
|
||||||
|
},
|
||||||
|
searchTable() {
|
||||||
|
this.loading = true
|
||||||
|
this.pageCurrent = 1
|
||||||
|
var Data = this.CreateData('11', '销售管理_销售绩效_查询数据', this.buildParam())
|
||||||
|
this.ExecDatabase(Data).then(response => {
|
||||||
|
this.tableData = response.data || []
|
||||||
|
this.loading = false
|
||||||
|
}).catch(() => {
|
||||||
|
this.loading = false
|
||||||
|
this.$message.error('销售绩效查询失败')
|
||||||
|
})
|
||||||
|
},
|
||||||
|
handleExpandChange(row, expandedRows) {
|
||||||
|
const isExpanded = expandedRows.some(item => item.项目流水号 === row.项目流水号)
|
||||||
|
if (!isExpanded || row.paymentDetails) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
this.searchPaymentDetails(row)
|
||||||
|
},
|
||||||
|
searchPaymentDetails(row) {
|
||||||
|
// 修改人:Ld 修改时间:2026-07-28 13:45:00; 展开绩效行时按合同查询回款明细
|
||||||
|
this.$set(row, 'detailLoading', true)
|
||||||
|
var param = []
|
||||||
|
param[0] = ['项目流水号', row.项目流水号]
|
||||||
|
var Data = this.CreateData('11', '销售管理_销售绩效_回款明细_查询数据', param)
|
||||||
|
this.ExecDatabase(Data).then(response => {
|
||||||
|
this.$set(row, 'paymentDetails', response.data || [])
|
||||||
|
this.$set(row, 'detailLoading', false)
|
||||||
|
}).catch(() => {
|
||||||
|
this.$set(row, 'detailLoading', false)
|
||||||
|
this.$message.error('回款明细查询失败')
|
||||||
|
})
|
||||||
|
},
|
||||||
|
exportExcel() {
|
||||||
|
if (this.tableData.length === 0) {
|
||||||
|
this.$message.warning('暂无数据')
|
||||||
|
return
|
||||||
|
}
|
||||||
|
var Data = this.CreateData('2001', '报表_销售管理_销售绩效_查询数据', this.buildParam())
|
||||||
|
this.exportExcel_NPOI(Data)
|
||||||
|
},
|
||||||
|
handleSizeChanges(val) {
|
||||||
|
this.pageSize = val
|
||||||
|
this.pageCurrent = 1
|
||||||
|
},
|
||||||
|
handleCurrentChanges(val) {
|
||||||
|
this.pageCurrent = val
|
||||||
|
},
|
||||||
|
formatMoney(value) {
|
||||||
|
const num = Number(value || 0)
|
||||||
|
return num.toFixed(2)
|
||||||
|
},
|
||||||
|
formatPercent(value) {
|
||||||
|
const num = Number(value || 0)
|
||||||
|
return num.toFixed(2) + '%'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style scoped>
|
||||||
|
.app-container {
|
||||||
|
padding: 20px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
@@ -23,6 +23,8 @@
|
|||||||
<el-input v-model="queryForm.零件名称" clearable size="small" style="width: 150px" placeholder="零件名称" @keyup.enter.native="pageCurrent = 1;searchTable()" />
|
<el-input v-model="queryForm.零件名称" clearable size="small" style="width: 150px" placeholder="零件名称" @keyup.enter.native="pageCurrent = 1;searchTable()" />
|
||||||
<el-input v-model="queryForm.图号" clearable size="small" style="width: 150px" placeholder="图号" @keyup.enter.native="pageCurrent = 1;searchTable()" />
|
<el-input v-model="queryForm.图号" clearable size="small" style="width: 150px" placeholder="图号" @keyup.enter.native="pageCurrent = 1;searchTable()" />
|
||||||
<el-button icon="el-icon-search" type="primary" plain size="small" style="margin-left: 10px" @click="pageCurrent = 1;searchTable()">查询</el-button>
|
<el-button icon="el-icon-search" type="primary" plain size="small" style="margin-left: 10px" @click="pageCurrent = 1;searchTable()">查询</el-button>
|
||||||
|
<!-- 修改人:Ld 修改时间:2026-08-03 14:24:48; 工序工价按当前查询条件导出测试库新增的导出过程数据 -->
|
||||||
|
<el-button type="success" plain icon="el-icon-download" size="small" @click="exportExcel()">导出</el-button>
|
||||||
<el-button :disabled="!queryForm.工艺计划流水号 || tableData.length === 0" icon="el-icon-collection" type="success" plain size="small" @click="handleSaveSource()">保存</el-button>
|
<el-button :disabled="!queryForm.工艺计划流水号 || tableData.length === 0" icon="el-icon-collection" type="success" plain size="small" @click="handleSaveSource()">保存</el-button>
|
||||||
<el-button :disabled="!queryForm.工艺计划流水号" icon="el-icon-document-copy" type="warning" plain size="small" @click="openCopyDialog()">拷贝</el-button>
|
<el-button :disabled="!queryForm.工艺计划流水号" icon="el-icon-document-copy" type="warning" plain size="small" @click="openCopyDialog()">拷贝</el-button>
|
||||||
<el-tag v-if="savedSourceInfo" size="small" type="success" style="margin-left: 6px" closable @close="savedSourceInfo = null">已保存: {{ savedSourceInfo.零件名称 }}</el-tag>
|
<el-tag v-if="savedSourceInfo" size="small" type="success" style="margin-left: 6px" closable @close="savedSourceInfo = null">已保存: {{ savedSourceInfo.零件名称 }}</el-tag>
|
||||||
@@ -92,7 +94,7 @@
|
|||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column label="总时间s" align="center" width="90">
|
<el-table-column label="总时间s" align="center" width="90">
|
||||||
<template slot-scope="scope">
|
<template slot-scope="scope">
|
||||||
{{ scope.row.总时间s }}
|
{{ getTotalTime(scope.row) }}
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column label="单装数量(件)" align="center" width="110">
|
<el-table-column label="单装数量(件)" align="center" width="110">
|
||||||
@@ -165,7 +167,8 @@
|
|||||||
<!-- 修改人:Ld 修改时间:2026-07-02 15:33:23 -->
|
<!-- 修改人:Ld 修改时间:2026-07-02 15:33:23 -->
|
||||||
<!-- 工价设置弹窗 -->
|
<!-- 工价设置弹窗 -->
|
||||||
<el-dialog v-el-drag-dialog :visible.sync="dialogFormVisible" :title="dialogTitle" center width="960px">
|
<el-dialog v-el-drag-dialog :visible.sync="dialogFormVisible" :title="dialogTitle" center width="960px">
|
||||||
<el-form ref="form" :model="form" :rules="rules" label-position="left" label-width="100px">
|
<!-- 修改人:Ld 修改时间:2026-08-04 09:39:18; 工价公式字段名称较长,放大标签宽度避免遮挡输入框 -->
|
||||||
|
<el-form ref="form" :model="form" :rules="rules" label-position="left" label-width="130px">
|
||||||
<el-row :gutter="16">
|
<el-row :gutter="16">
|
||||||
<el-col :span="12">
|
<el-col :span="12">
|
||||||
<el-form-item label="工艺名称" prop="工艺名称">
|
<el-form-item label="工艺名称" prop="工艺名称">
|
||||||
@@ -190,22 +193,22 @@
|
|||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
</el-row>
|
</el-row>
|
||||||
<!-- 修改人:Ld 修改时间:2026-07-03 08:02:29 -->
|
<!-- 修改人:Ld 修改时间:2026-08-04 09:39:18; 设置弹窗补齐截图公式字段,计算字段随输入自动联动 -->
|
||||||
<!-- 按现场确认的 9 个工价字段维护 -->
|
|
||||||
<el-row :gutter="16">
|
<el-row :gutter="16">
|
||||||
<el-col :span="8">
|
<el-col :span="8">
|
||||||
<el-form-item label="机动时间s" prop="机动时间s">
|
<el-form-item label="机动时间(秒)" prop="机动时间s">
|
||||||
<el-input-number v-model="form.机动时间s" :min="0" :precision="2" :step="1" controls-position="right" style="width: 100%;" />
|
<el-input-number v-model="form.机动时间s" :min="0" :precision="2" :step="1" controls-position="right" style="width: 100%;" @change="refreshTotalTime()" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
<el-col :span="8">
|
<el-col :span="8">
|
||||||
<el-form-item label="辅助时间s" prop="辅助时间s">
|
<el-form-item label="辅助时间(秒)" prop="辅助时间s">
|
||||||
<el-input-number v-model="form.辅助时间s" :min="0" :precision="2" :step="1" controls-position="right" style="width: 100%;" />
|
<el-input-number v-model="form.辅助时间s" :min="0" :precision="2" :step="1" controls-position="right" style="width: 100%;" @change="refreshTotalTime()" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
<el-col :span="8">
|
<el-col :span="8">
|
||||||
<el-form-item label="总时间s" prop="总时间s">
|
<el-form-item label="总时间(秒)" prop="总时间s">
|
||||||
<el-input-number v-model="form.总时间s" :min="0" :precision="2" :step="1" controls-position="right" style="width: 100%;" />
|
<!-- 修改人:Ld 修改时间:2026-08-03 14:40:10; 总时间由机动时间和辅助时间自动相加,不允许手工改写 -->
|
||||||
|
<el-input-number v-model="form.总时间s" :min="0" :precision="2" :step="1" controls-position="right" disabled style="width: 100%;" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
</el-row>
|
</el-row>
|
||||||
@@ -216,36 +219,52 @@
|
|||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
<el-col :span="8">
|
<el-col :span="8">
|
||||||
<el-form-item label="操作台数" prop="操作台数">
|
<el-form-item label="操作台数(台/人)" prop="操作台数">
|
||||||
<el-input-number v-model="form.操作台数" :min="0" :precision="2" :step="1" controls-position="right" style="width: 100%;" />
|
<el-input-number v-model="form.操作台数" :min="0" :precision="2" :step="1" controls-position="right" style="width: 100%;" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
<el-col :span="8">
|
<el-col :span="8">
|
||||||
<el-form-item label="日产能(件)" prop="日产能(件)">
|
<el-form-item label="工作时间(时)" prop="工作时间(时)">
|
||||||
<el-input-number v-model="form['日产能(件)']" :min="0" :precision="2" :step="1" controls-position="right" style="width: 100%;" />
|
<el-input-number v-model="form['工作时间(时)']" :min="0" :precision="2" :step="0.5" controls-position="right" style="width: 100%;" @change="refreshPriceFormula()" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
</el-row>
|
</el-row>
|
||||||
<el-row :gutter="16">
|
<el-row :gutter="16">
|
||||||
<el-col :span="12">
|
<el-col :span="8">
|
||||||
<el-form-item label="最终单价" prop="最终单价(元/件)">
|
<el-form-item label="宽放时间(时)" prop="宽放时间(时)">
|
||||||
<!-- 修改人:Ld 修改时间:2026-07-06 09:23:45; 最终单价输入框仅保留两位小数显示 -->
|
<el-input-number v-model="form['宽放时间(时)']" :min="0" :precision="2" :step="0.5" controls-position="right" style="width: 100%;" />
|
||||||
<el-input-number v-model="form['最终单价(元/件)']" :min="0" :precision="2" :step="0.1" controls-position="right" style="width: 100%;" />
|
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
<el-col :span="12">
|
<el-col :span="8">
|
||||||
|
<el-form-item label="日工资(元)" prop="日工资(元)">
|
||||||
|
<el-input-number v-model="form['日工资(元)']" :min="0" :precision="2" :step="1" controls-position="right" style="width: 100%;" @change="refreshPriceFormula()" />
|
||||||
|
</el-form-item>
|
||||||
|
</el-col>
|
||||||
|
<el-col :span="8">
|
||||||
|
<el-form-item label="标准产能(件/天)" prop="标准产能(件/天)">
|
||||||
|
<el-input-number v-model="form['标准产能(件/天)']" :min="0" :precision="2" :step="1" controls-position="right" disabled style="width: 100%;" />
|
||||||
|
</el-form-item>
|
||||||
|
</el-col>
|
||||||
|
</el-row>
|
||||||
|
<el-row :gutter="16">
|
||||||
|
<el-col :span="8">
|
||||||
|
<el-form-item label="工价定额" prop="工价定额">
|
||||||
|
<el-input-number v-model="form.工价定额" :min="0" :precision="2" :step="0.1" controls-position="right" disabled style="width: 100%;" />
|
||||||
|
</el-form-item>
|
||||||
|
</el-col>
|
||||||
|
<el-col :span="8">
|
||||||
<el-form-item label="生效日期" prop="生效日期">
|
<el-form-item label="生效日期" prop="生效日期">
|
||||||
<el-date-picker v-model="form.生效日期" type="date" value-format="yyyy-MM-dd" format="yyyy-MM-dd" clearable size="small" placeholder="选择生效日期" style="width: 100%;" />
|
<el-date-picker v-model="form.生效日期" type="date" value-format="yyyy-MM-dd" format="yyyy-MM-dd" clearable size="small" placeholder="选择生效日期" style="width: 100%;" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
</el-row>
|
<el-col :span="8">
|
||||||
<el-row :gutter="16">
|
|
||||||
<el-col :span="12">
|
|
||||||
<el-form-item label="变更次数" prop="变更次数">
|
<el-form-item label="变更次数" prop="变更次数">
|
||||||
<el-input-number v-model="form.变更次数" :min="0" :precision="0" :step="1" controls-position="right" style="width: 100%;" />
|
<el-input-number v-model="form.变更次数" :min="0" :precision="0" :step="1" controls-position="right" style="width: 100%;" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
<el-col :span="12">
|
</el-row>
|
||||||
|
<el-row :gutter="16">
|
||||||
|
<el-col :span="24">
|
||||||
<el-form-item label="启用状态" prop="是否启用">
|
<el-form-item label="启用状态" prop="是否启用">
|
||||||
<el-select v-model="form.是否启用" clearable filterable size="small" style="width: 100%;" placeholder="请选择启用状态">
|
<el-select v-model="form.是否启用" clearable filterable size="small" style="width: 100%;" placeholder="请选择启用状态">
|
||||||
<el-option v-for="item in statusOptions" :key="item.value" :label="item.label" :value="item.value" />
|
<el-option v-for="item in statusOptions" :key="item.value" :label="item.label" :value="item.value" />
|
||||||
@@ -428,6 +447,11 @@ export default {
|
|||||||
总时间s: 0,
|
总时间s: 0,
|
||||||
'单装数量(件)': 0,
|
'单装数量(件)': 0,
|
||||||
操作台数: 0,
|
操作台数: 0,
|
||||||
|
'工作时间(时)': 0,
|
||||||
|
'宽放时间(时)': 0,
|
||||||
|
'日工资(元)': 0,
|
||||||
|
'标准产能(件/天)': 0,
|
||||||
|
工价定额: 0,
|
||||||
'日产能(件)': 0,
|
'日产能(件)': 0,
|
||||||
'最终单价(元/件)': 0,
|
'最终单价(元/件)': 0,
|
||||||
生效日期: '',
|
生效日期: '',
|
||||||
@@ -462,6 +486,34 @@ export default {
|
|||||||
this.searchTable()
|
this.searchTable()
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
|
// 修改人:Ld 修改时间:2026-08-03 14:40:10; 总时间统一按机动时间加辅助时间计算
|
||||||
|
getTotalTime(row) {
|
||||||
|
var total = Number(row.机动时间s || 0) + Number(row.辅助时间s || 0)
|
||||||
|
return Number(total.toFixed(2))
|
||||||
|
},
|
||||||
|
// 修改人:Ld 修改时间:2026-08-03 14:40:10; 编辑弹窗中保持总时间自动等于机动时间加辅助时间
|
||||||
|
refreshTotalTime() {
|
||||||
|
if (!this.form) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
this.form.总时间s = this.getTotalTime(this.form)
|
||||||
|
this.refreshPriceFormula()
|
||||||
|
},
|
||||||
|
// 修改人:Ld 修改时间:2026-08-04 09:39:18; 按截图公式计算标准产能和工价定额,并同步旧字段兼容后端编辑过程
|
||||||
|
refreshPriceFormula() {
|
||||||
|
if (!this.form) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
var totalTime = Number(this.form.总时间s || 0)
|
||||||
|
var workTime = Number(this.form['工作时间(时)'] || 0)
|
||||||
|
var dayWage = Number(this.form['日工资(元)'] || 0)
|
||||||
|
var capacity = totalTime === 0 ? 0 : workTime * 3600 / totalTime
|
||||||
|
var priceQuota = capacity === 0 ? 0 : dayWage / capacity
|
||||||
|
this.form['标准产能(件/天)'] = Number(capacity.toFixed(4))
|
||||||
|
this.form.工价定额 = Number(priceQuota.toFixed(4))
|
||||||
|
this.form['日产能(件)'] = this.form['标准产能(件/天)']
|
||||||
|
this.form['最终单价(元/件)'] = this.form.工价定额
|
||||||
|
},
|
||||||
// 修改人:Ld 修改时间:2026-07-17 16:30:55; 统一处理工时统计跳转参数,避免再次跳转时保留上一次查询条件
|
// 修改人:Ld 修改时间:2026-07-17 16:30:55; 统一处理工时统计跳转参数,避免再次跳转时保留上一次查询条件
|
||||||
applyJumpQuery(query) {
|
applyJumpQuery(query) {
|
||||||
if (!query || (!query.订单号 && !query.零件名称 && !query.图号 && !query.工序名称)) {
|
if (!query || (!query.订单号 && !query.零件名称 && !query.图号 && !query.工序名称)) {
|
||||||
@@ -593,10 +645,8 @@ export default {
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
// 修改人:Ld 修改时间:2026-07-06 08:36:02
|
// 修改人:Ld 修改时间:2026-08-03 14:24:48; 查询和导出共用参数,保持筛选口径一致
|
||||||
// 查询列表
|
buildQueryParam() {
|
||||||
searchTable() {
|
|
||||||
this.loading = true
|
|
||||||
var param = []
|
var param = []
|
||||||
param[0] = ['订单流水号', this.queryForm.订单流水号]
|
param[0] = ['订单流水号', this.queryForm.订单流水号]
|
||||||
param[1] = ['订单流水号_check', this.queryForm.订单流水号 ? 1 : 0]
|
param[1] = ['订单流水号_check', this.queryForm.订单流水号 ? 1 : 0]
|
||||||
@@ -615,6 +665,13 @@ export default {
|
|||||||
// 修改人:Ld 修改时间:2026-07-17 08:44:08; 工时统计跳转后按图号精确查询,避免同名零件匹配过宽
|
// 修改人:Ld 修改时间:2026-07-17 08:44:08; 工时统计跳转后按图号精确查询,避免同名零件匹配过宽
|
||||||
param[14] = ['图号', this.queryForm.图号]
|
param[14] = ['图号', this.queryForm.图号]
|
||||||
param[15] = ['图号_check', this.queryForm.图号 ? 1 : 0]
|
param[15] = ['图号_check', this.queryForm.图号 ? 1 : 0]
|
||||||
|
return param
|
||||||
|
},
|
||||||
|
// 修改人:Ld 修改时间:2026-07-06 08:36:02
|
||||||
|
// 查询列表
|
||||||
|
searchTable() {
|
||||||
|
this.loading = true
|
||||||
|
var param = this.buildQueryParam()
|
||||||
var Data = this.CreateData('11', '车间生产管理工艺_工序工价_查询数据', param, this.pageSize, this.pageCurrent)
|
var Data = this.CreateData('11', '车间生产管理工艺_工序工价_查询数据', param, this.pageSize, this.pageCurrent)
|
||||||
this.ExecDatabase(Data).then(response => {
|
this.ExecDatabase(Data).then(response => {
|
||||||
this.tableData = response.data && response.data.rows ? response.data.rows : response.data
|
this.tableData = response.data && response.data.rows ? response.data.rows : response.data
|
||||||
@@ -624,6 +681,11 @@ export default {
|
|||||||
this.loading = false
|
this.loading = false
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
|
// 修改人:Ld 修改时间:2026-08-03 14:24:48; 调用测试库工序工价导出过程,导出当前查询条件下的全部数据
|
||||||
|
exportExcel() {
|
||||||
|
var Data = this.CreateData('2001', '车间生产管理工艺_工序工价_导出表格_查询', this.buildQueryParam())
|
||||||
|
this.exportExcel_NPOI(Data)
|
||||||
|
},
|
||||||
// 修改人:Ld 修改时间:2026-07-08; 保存当前零件的工价信息,供拷贝时直接使用
|
// 修改人:Ld 修改时间:2026-07-08; 保存当前零件的工价信息,供拷贝时直接使用
|
||||||
handleSaveSource() {
|
handleSaveSource() {
|
||||||
if (!this.queryForm.工艺计划流水号 || !this.tableData || this.tableData.length === 0) {
|
if (!this.queryForm.工艺计划流水号 || !this.tableData || this.tableData.length === 0) {
|
||||||
@@ -762,17 +824,23 @@ export default {
|
|||||||
图号: row.图号,
|
图号: row.图号,
|
||||||
机动时间s: Number(row.机动时间s || 0),
|
机动时间s: Number(row.机动时间s || 0),
|
||||||
辅助时间s: Number(row.辅助时间s || 0),
|
辅助时间s: Number(row.辅助时间s || 0),
|
||||||
总时间s: Number(row.总时间s || 0),
|
总时间s: this.getTotalTime(row),
|
||||||
'单装数量(件)': Number(row['单装数量(件)'] || 0),
|
'单装数量(件)': Number(row['单装数量(件)'] || 0),
|
||||||
操作台数: Number(row.操作台数 || 0),
|
操作台数: Number(row.操作台数 || 0),
|
||||||
'日产能(件)': Number(row['日产能(件)'] || 0),
|
'工作时间(时)': Number(row['工作时间(时)'] || 0),
|
||||||
'最终单价(元/件)': Number(row['最终单价(元/件)'] || 0),
|
'宽放时间(时)': Number(row['宽放时间(时)'] || 0),
|
||||||
|
'日工资(元)': Number(row['日工资(元)'] || 0),
|
||||||
|
'标准产能(件/天)': Number(row['标准产能(件/天)'] || row['日产能(件)'] || 0),
|
||||||
|
工价定额: Number(row.工价定额 || row['最终单价(元/件)'] || 0),
|
||||||
|
'日产能(件)': Number(row['标准产能(件/天)'] || row['日产能(件)'] || 0),
|
||||||
|
'最终单价(元/件)': Number(row.工价定额 || row['最终单价(元/件)'] || 0),
|
||||||
生效日期: row.生效日期,
|
生效日期: row.生效日期,
|
||||||
变更次数: Number(row.变更次数 || 0),
|
变更次数: Number(row.变更次数 || 0),
|
||||||
是否启用: row.是否启用 === '' || row.是否启用 === null || typeof row.是否启用 === 'undefined' ? 1 : Number(row.是否启用),
|
是否启用: row.是否启用 === '' || row.是否启用 === null || typeof row.是否启用 === 'undefined' ? 1 : Number(row.是否启用),
|
||||||
备注: row.备注,
|
备注: row.备注,
|
||||||
工序流水号: row.工序流水号
|
工序流水号: row.工序流水号
|
||||||
}
|
}
|
||||||
|
this.refreshPriceFormula()
|
||||||
},
|
},
|
||||||
// 修改人:Ld 修改时间:2026-07-02 15:33:23
|
// 修改人:Ld 修改时间:2026-07-02 15:33:23
|
||||||
// 提交新增或编辑
|
// 提交新增或编辑
|
||||||
@@ -781,6 +849,8 @@ export default {
|
|||||||
if (!valid) {
|
if (!valid) {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
this.refreshTotalTime()
|
||||||
|
this.refreshPriceFormula()
|
||||||
var param = []
|
var param = []
|
||||||
param[0] = ['工价流水号', this.form.工价流水号]
|
param[0] = ['工价流水号', this.form.工价流水号]
|
||||||
param[1] = ['工艺名称', this.form.工艺名称]
|
param[1] = ['工艺名称', this.form.工艺名称]
|
||||||
@@ -789,7 +859,7 @@ export default {
|
|||||||
param[4] = ['图号', this.form.图号]
|
param[4] = ['图号', this.form.图号]
|
||||||
param[5] = ['机动时间s', this.form.机动时间s]
|
param[5] = ['机动时间s', this.form.机动时间s]
|
||||||
param[6] = ['辅助时间s', this.form.辅助时间s]
|
param[6] = ['辅助时间s', this.form.辅助时间s]
|
||||||
param[7] = ['总时间s', this.form.总时间s]
|
param[7] = ['总时间s', this.getTotalTime(this.form)]
|
||||||
// 修改人:Ld 修改时间:2026-07-03 08:02:29
|
// 修改人:Ld 修改时间:2026-07-03 08:02:29
|
||||||
// 带括号字段提交给存储过程时使用安全参数名,查询返回仍保持原字段名
|
// 带括号字段提交给存储过程时使用安全参数名,查询返回仍保持原字段名
|
||||||
param[8] = ['单装数量件', this.form['单装数量(件)']]
|
param[8] = ['单装数量件', this.form['单装数量(件)']]
|
||||||
@@ -831,6 +901,11 @@ export default {
|
|||||||
总时间s: 0,
|
总时间s: 0,
|
||||||
'单装数量(件)': 0,
|
'单装数量(件)': 0,
|
||||||
操作台数: 0,
|
操作台数: 0,
|
||||||
|
'工作时间(时)': 0,
|
||||||
|
'宽放时间(时)': 0,
|
||||||
|
'日工资(元)': 0,
|
||||||
|
'标准产能(件/天)': 0,
|
||||||
|
工价定额: 0,
|
||||||
'日产能(件)': 0,
|
'日产能(件)': 0,
|
||||||
'最终单价(元/件)': 0,
|
'最终单价(元/件)': 0,
|
||||||
生效日期: '',
|
生效日期: '',
|
||||||
|
|||||||
@@ -412,8 +412,18 @@ export default {
|
|||||||
this.$message.error('完成数量必须为大于等于 0 的整数')
|
this.$message.error('完成数量必须为大于等于 0 的整数')
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
var finishQuantity = Number(this.editForm.完成数量)
|
||||||
|
var originalQuantity = Number(this.editRow.完成数量 || 0)
|
||||||
|
var currentFinishedQuantity = Number(this.editRow.已完成数 || 0)
|
||||||
|
var productionQuantity = Number(this.editRow.投产数量 || 0)
|
||||||
|
var finalFinishedQuantity = currentFinishedQuantity - originalQuantity + finishQuantity
|
||||||
|
// 修改完成数量后的累计结果不能超过投产数量;修改人:Ld 修改时间:2026-07-23 16:22:46;
|
||||||
|
if (productionQuantity > 0 && finalFinishedQuantity > productionQuantity) {
|
||||||
|
this.$message.error('修改后的已完成数不能超过投产数量')
|
||||||
|
return
|
||||||
|
}
|
||||||
this.submitAudit(this.editRow, '已审核', '修改完成数量和加工完成时间后通过', {
|
this.submitAudit(this.editRow, '已审核', '修改完成数量和加工完成时间后通过', {
|
||||||
finishQuantity: Number(this.editForm.完成数量),
|
finishQuantity: finishQuantity,
|
||||||
priceType: this.editForm.计价方式,
|
priceType: this.editForm.计价方式,
|
||||||
startTime: this.editForm.加工开始时间,
|
startTime: this.editForm.加工开始时间,
|
||||||
finishTime: this.editForm.加工完成时间
|
finishTime: this.editForm.加工完成时间
|
||||||
|
|||||||
@@ -22,8 +22,10 @@
|
|||||||
<span v-if="monthCompletionRate !== ''" style="margin-left: 20px; font-size: 14px; color: #606266">
|
<span v-if="monthCompletionRate !== ''" style="margin-left: 20px; font-size: 14px; color: #606266">
|
||||||
本月完成率:<el-tag :type="monthCompletionRateTag" size="medium" effect="dark">{{ monthCompletionRate }}</el-tag>
|
本月完成率:<el-tag :type="monthCompletionRateTag" size="medium" effect="dark">{{ monthCompletionRate }}</el-tag>
|
||||||
</span>
|
</span>
|
||||||
|
<!-- 修改人:Ld 修改时间:2026-08-05 09:38:16; 按上传生产计划表模板新增导出入口。 -->
|
||||||
|
<el-button icon="el-icon-download" type="success" plain size="small" style="margin-left: 10px" @click="exportProductionPlan()">导出</el-button>
|
||||||
</div>
|
</div>
|
||||||
<el-table :data="filteredTableData" height="750px" style="width: 2200px" size="mini" highlight-current-row border>
|
<el-table :data="filteredTableData" height="750px" style="width: 2340px" size="mini" highlight-current-row border>
|
||||||
<el-table-column width="50px" align="center" label="序号" show-overflow-tooltip fixed>
|
<el-table-column width="50px" align="center" label="序号" show-overflow-tooltip fixed>
|
||||||
<template slot-scope="scope">
|
<template slot-scope="scope">
|
||||||
{{ scope.$index + 1 }}
|
{{ scope.$index + 1 }}
|
||||||
@@ -36,6 +38,12 @@
|
|||||||
</el-tag>
|
</el-tag>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
|
<!-- 修改人:Ld 修改时间:2026-08-04 14:57:36; 订单编号左侧增加合同编号列,优先显示方案一真实关联合同号。 -->
|
||||||
|
<el-table-column width="140px" align="center" label="合同编号" show-overflow-tooltip fixed>
|
||||||
|
<template slot-scope="scope">
|
||||||
|
{{ getProductionPlanContractNo(scope.row) }}
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
<el-table-column width="140px" align="center" label="订单编号" show-overflow-tooltip fixed>
|
<el-table-column width="140px" align="center" label="订单编号" show-overflow-tooltip fixed>
|
||||||
<template slot-scope="scope">
|
<template slot-scope="scope">
|
||||||
{{ scope.row.MK订单编号 || scope.row.订单号 }}
|
{{ scope.row.MK订单编号 || scope.row.订单号 }}
|
||||||
@@ -43,7 +51,7 @@
|
|||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column width="90px" align="center" label="收货人" show-overflow-tooltip fixed>
|
<el-table-column width="90px" align="center" label="收货人" show-overflow-tooltip fixed>
|
||||||
<template slot-scope="scope">
|
<template slot-scope="scope">
|
||||||
{{ scope.row.收货人 || '仓库'}}
|
{{ scope.row.收货人 || '仓库' }}
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column width="90px" align="center" label="投产日期" show-overflow-tooltip>
|
<el-table-column width="90px" align="center" label="投产日期" show-overflow-tooltip>
|
||||||
@@ -88,68 +96,74 @@
|
|||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column width="100px" align="center" label="当前状态" show-overflow-tooltip>
|
<el-table-column width="100px" align="center" label="当前状态" show-overflow-tooltip>
|
||||||
<template slot-scope="scope">
|
<template slot-scope="scope">
|
||||||
{{ scope.row.设备 }}
|
<!-- 修改人:Ld 修改时间:2026-08-04 09:07:29; 机床名称可点击查看该机床后续已派工任务。 -->
|
||||||
|
<el-button v-if="scope.row.设备" class="machine-task-link" type="text" size="mini" @click.stop="openMachineTaskDialog(scope.row)">
|
||||||
|
{{ scope.row.设备 }}
|
||||||
|
</el-button>
|
||||||
|
<span v-else/>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column width="60px" align="center" label="OP010" show-overflow-tooltip>
|
<el-table-column width="60px" align="center" label="OP010" show-overflow-tooltip>
|
||||||
<template slot-scope="scope">
|
<template slot-scope="scope">
|
||||||
{{ scope.row.OP010 }}
|
<!-- 修改人:Ld 修改时间:2026-08-04 08:56:51; 已完成OP工序单元格标绿,页面布局不变。 -->
|
||||||
|
<span :class="getProcessCellClass(scope.row, 'OP010')">{{ scope.row.OP010 }}</span>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column width="60px" align="center" label="OP020" show-overflow-tooltip>
|
<el-table-column width="60px" align="center" label="OP020" show-overflow-tooltip>
|
||||||
<template slot-scope="scope">
|
<template slot-scope="scope">
|
||||||
{{ scope.row.OP020 }}
|
<span :class="getProcessCellClass(scope.row, 'OP020')">{{ scope.row.OP020 }}</span>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column width="60px" align="center" label="OP030" show-overflow-tooltip>
|
<el-table-column width="60px" align="center" label="OP030" show-overflow-tooltip>
|
||||||
<template slot-scope="scope">
|
<template slot-scope="scope">
|
||||||
{{ scope.row.OP030 }}
|
<span :class="getProcessCellClass(scope.row, 'OP030')">{{ scope.row.OP030 }}</span>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column width="60px" align="center" label="OP040" show-overflow-tooltip>
|
<el-table-column width="60px" align="center" label="OP040" show-overflow-tooltip>
|
||||||
<template slot-scope="scope">
|
<template slot-scope="scope">
|
||||||
{{ scope.row.OP040 }}
|
<span :class="getProcessCellClass(scope.row, 'OP040')">{{ scope.row.OP040 }}</span>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column width="60px" align="center" label="OP050" show-overflow-tooltip>
|
<el-table-column width="60px" align="center" label="OP050" show-overflow-tooltip>
|
||||||
<template slot-scope="scope">
|
<template slot-scope="scope">
|
||||||
{{ scope.row.OP050 }}
|
<span :class="getProcessCellClass(scope.row, 'OP050')">{{ scope.row.OP050 }}</span>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column width="60px" align="center" label="OP060" show-overflow-tooltip>
|
<el-table-column width="60px" align="center" label="OP060" show-overflow-tooltip>
|
||||||
<template slot-scope="scope">
|
<template slot-scope="scope">
|
||||||
{{ scope.row.OP060 }}
|
<span :class="getProcessCellClass(scope.row, 'OP060')">{{ scope.row.OP060 }}</span>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column width="60px" align="center" label="OP070" show-overflow-tooltip>
|
<el-table-column width="60px" align="center" label="OP070" show-overflow-tooltip>
|
||||||
<template slot-scope="scope">
|
<template slot-scope="scope">
|
||||||
{{ scope.row.OP070 }}
|
<span :class="getProcessCellClass(scope.row, 'OP070')">{{ scope.row.OP070 }}</span>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column width="60px" align="center" label="OP080" show-overflow-tooltip>
|
<el-table-column width="60px" align="center" label="OP080" show-overflow-tooltip>
|
||||||
<template slot-scope="scope">
|
<template slot-scope="scope">
|
||||||
{{ scope.row.OP080 }}
|
<span :class="getProcessCellClass(scope.row, 'OP080')">{{ scope.row.OP080 }}</span>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column width="60px" align="center" label="OP090" show-overflow-tooltip>
|
<el-table-column width="60px" align="center" label="OP090" show-overflow-tooltip>
|
||||||
<template slot-scope="scope">
|
<template slot-scope="scope">
|
||||||
{{ scope.row.OP090 }}
|
<span :class="getProcessCellClass(scope.row, 'OP090')">{{ scope.row.OP090 }}</span>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column width="60px" align="center" label="OP100" show-overflow-tooltip>
|
<el-table-column width="60px" align="center" label="OP100" show-overflow-tooltip>
|
||||||
<template slot-scope="scope">
|
<template slot-scope="scope">
|
||||||
{{ scope.row.OP100 }}
|
<span :class="getProcessCellClass(scope.row, 'OP100')">{{ scope.row.OP100 }}</span>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column width="60px" align="center" label="OP110" show-overflow-tooltip>
|
<el-table-column width="60px" align="center" label="OP110" show-overflow-tooltip>
|
||||||
<template slot-scope="scope">
|
<template slot-scope="scope">
|
||||||
{{ scope.row.OP110 }}
|
<span :class="getProcessCellClass(scope.row, 'OP110')">{{ scope.row.OP110 }}</span>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
</el-table>
|
</el-table>
|
||||||
</el-card>
|
</el-card>
|
||||||
|
|
||||||
<el-dialog title="生产计划可视化看板" :visible.sync="dashboardVisible" width="1200px" top="30px" :close-on-click-modal="false" @close="closeDashboard">
|
<!-- 修改人:Ld 修改时间:2026-08-04 08:56:51; 调整弹窗属性顺序以通过单文件校验。 -->
|
||||||
|
<el-dialog :visible.sync="dashboardVisible" :close-on-click-modal="false" title="生产计划可视化看板" width="1200px" top="30px" @close="closeDashboard">
|
||||||
<el-row :gutter="10" style="margin-bottom: 15px">
|
<el-row :gutter="10" style="margin-bottom: 15px">
|
||||||
<el-col :span="6">
|
<el-col :span="6">
|
||||||
<el-card shadow="hover" style="text-align: center; padding: 10px 0; cursor: pointer" @click.native="cardViewMode = cardViewMode === 'status' ? 'orderType' : 'status'">
|
<el-card shadow="hover" style="text-align: center; padding: 10px 0; cursor: pointer" @click.native="cardViewMode = cardViewMode === 'status' ? 'orderType' : 'status'">
|
||||||
@@ -214,12 +228,90 @@
|
|||||||
</el-col>
|
</el-col>
|
||||||
</el-row>
|
</el-row>
|
||||||
</el-dialog>
|
</el-dialog>
|
||||||
|
|
||||||
|
<!-- 修改人:Ld 修改时间:2026-08-04 09:16:54; 弹窗改为APS排产格式,并按照操作者分组展示。 -->
|
||||||
|
<el-dialog :visible.sync="machineTaskVisible" :close-on-click-modal="false" :title="machineTaskTitle" width="1200px" top="50px">
|
||||||
|
<div v-loading="machineTaskLoading" class="machine-aps">
|
||||||
|
<div class="machine-aps-toolbar">
|
||||||
|
<span class="machine-aps-toolbar-label">时间筛选</span>
|
||||||
|
<el-date-picker
|
||||||
|
v-model="machineTaskDateRange"
|
||||||
|
:default-time="['00:00:00', '23:59:59']"
|
||||||
|
end-placeholder="结束日期"
|
||||||
|
range-separator="至"
|
||||||
|
size="small"
|
||||||
|
start-placeholder="开始日期"
|
||||||
|
style="width: 310px"
|
||||||
|
type="daterange"
|
||||||
|
value-format="yyyy-MM-dd"
|
||||||
|
@change="changeMachineTaskDateRange"/>
|
||||||
|
<el-button size="small" plain icon="el-icon-refresh-left" style="margin-left: 10px" @click="resetMachineTaskDateRange">重置</el-button>
|
||||||
|
<span class="machine-aps-toolbar-tip">按任务派工与完工时间区间筛选</span>
|
||||||
|
</div>
|
||||||
|
<div v-if="machineTaskDisplayData.length === 0 && !machineTaskLoading" class="machine-aps-empty">暂无后续已派工任务</div>
|
||||||
|
<div v-else class="machine-aps-scroll">
|
||||||
|
<div :style="{ width: machineApsInnerWidth + 'px' }" class="machine-aps-inner">
|
||||||
|
<div class="machine-aps-header">
|
||||||
|
<div class="machine-aps-person-header">操作者</div>
|
||||||
|
<div class="machine-aps-time-header">
|
||||||
|
<div
|
||||||
|
v-for="day in machineApsDays"
|
||||||
|
:key="day.key"
|
||||||
|
:style="{ width: machineApsDayWidth + 'px' }"
|
||||||
|
class="machine-aps-day">
|
||||||
|
{{ day.label }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
v-for="person in machineApsGroups"
|
||||||
|
:key="person.name"
|
||||||
|
:style="{ height: person.height + 'px' }"
|
||||||
|
class="machine-aps-row">
|
||||||
|
<div class="machine-aps-person">
|
||||||
|
<div class="machine-aps-person-name">{{ person.name }}</div>
|
||||||
|
<div class="machine-aps-person-count">任务数:{{ person.tasks.length }}</div>
|
||||||
|
</div>
|
||||||
|
<div :style="{ width: machineApsTimelineWidth + 'px' }" class="machine-aps-lane">
|
||||||
|
<div
|
||||||
|
v-for="day in machineApsDays"
|
||||||
|
:key="person.name + '_' + day.key"
|
||||||
|
:style="{ left: day.left + 'px' }"
|
||||||
|
class="machine-aps-grid-line"/>
|
||||||
|
<el-tooltip
|
||||||
|
v-for="task in person.tasks"
|
||||||
|
:key="task._apsKey"
|
||||||
|
effect="dark"
|
||||||
|
placement="top">
|
||||||
|
<div slot="content">
|
||||||
|
<div>{{ task.订单号 }}</div>
|
||||||
|
<div>{{ task.零件名称 }} / {{ task.零件图号 }}</div>
|
||||||
|
<div>{{ task.工序顺序 }}-{{ task.工序 }} {{ task.数量 }}/{{ task.完成数 }}</div>
|
||||||
|
<div>{{ formatApsDateText(task.分配时间) }} 至 {{ formatApsDateText(task.精工期限) }}</div>
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
:class="task._apsColorClass"
|
||||||
|
:style="{ left: task._apsLeft + 'px', width: task._apsWidth + 'px', top: task._apsTop + 'px' }"
|
||||||
|
class="machine-aps-task">
|
||||||
|
<div class="machine-aps-order">{{ task.订单号 }}</div>
|
||||||
|
<div class="machine-aps-part">{{ task.零件名称 }} / {{ task.工序 }}</div>
|
||||||
|
<div class="machine-aps-count">{{ task.完成数 }} / {{ task.数量 }}</div>
|
||||||
|
<div class="machine-aps-date">{{ formatApsDateText(task.精工期限) }}</div>
|
||||||
|
</div>
|
||||||
|
</el-tooltip>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</el-dialog>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import { mapGetters } from 'vuex'
|
import { mapGetters } from 'vuex'
|
||||||
import { getNowShotTime } from '@/utils/tool'
|
import XLSX from 'xlsx-style'
|
||||||
|
import FileSaver from 'file-saver'
|
||||||
export default {
|
export default {
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
@@ -243,7 +335,17 @@ export default {
|
|||||||
completionBarChart: null,
|
completionBarChart: null,
|
||||||
processStackChart: null,
|
processStackChart: null,
|
||||||
pieViewMode: 'status',
|
pieViewMode: 'status',
|
||||||
cardViewMode: 'status'
|
cardViewMode: 'status',
|
||||||
|
// 修改人:Ld 修改时间:2026-08-04 09:07:29; 当前机床后续已派工任务弹窗数据。
|
||||||
|
machineTaskVisible: false,
|
||||||
|
machineTaskLoading: false,
|
||||||
|
machineTaskTitle: '机床后续已派工任务',
|
||||||
|
machineTaskData: [],
|
||||||
|
machineTaskDateRange: [],
|
||||||
|
// 修改人:Ld 修改时间:2026-08-04 09:16:54; APS排产弹窗的固定轴尺寸,保持展示稳定。
|
||||||
|
machineApsDayWidth: 88,
|
||||||
|
machineApsPersonWidth: 118,
|
||||||
|
machineApsMaxDays: 60
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
@@ -314,6 +416,115 @@ export default {
|
|||||||
salesProducing: salesProducing, restockProducing: restockProducing,
|
salesProducing: salesProducing, restockProducing: restockProducing,
|
||||||
salesCompleted: salesCompleted, restockCompleted: restockCompleted
|
salesCompleted: salesCompleted, restockCompleted: restockCompleted
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
// 修改人:Ld 修改时间:2026-08-04 09:16:54; 根据已派工任务日期生成APS时间轴。
|
||||||
|
machineApsStartDate() {
|
||||||
|
var dates = []
|
||||||
|
this.machineTaskDisplayData.forEach(row => {
|
||||||
|
var startDate = this.parseApsDate(row.分配时间)
|
||||||
|
var endDate = this.parseApsDate(row.精工期限)
|
||||||
|
if (startDate) dates.push(startDate)
|
||||||
|
if (endDate) dates.push(endDate)
|
||||||
|
})
|
||||||
|
if (dates.length === 0) return this.clearApsDate(new Date())
|
||||||
|
dates.sort(function(a, b) {
|
||||||
|
return a.getTime() - b.getTime()
|
||||||
|
})
|
||||||
|
return this.clearApsDate(dates[0])
|
||||||
|
},
|
||||||
|
machineApsEndDate() {
|
||||||
|
var startDate = this.machineApsStartDate
|
||||||
|
var dates = []
|
||||||
|
this.machineTaskDisplayData.forEach(row => {
|
||||||
|
var start = this.parseApsDate(row.分配时间)
|
||||||
|
var end = this.parseApsDate(row.精工期限)
|
||||||
|
if (start) dates.push(start)
|
||||||
|
if (end) dates.push(end)
|
||||||
|
})
|
||||||
|
if (dates.length === 0) return this.addApsDays(startDate, 6)
|
||||||
|
dates.sort(function(a, b) {
|
||||||
|
return b.getTime() - a.getTime()
|
||||||
|
})
|
||||||
|
var endDate = this.clearApsDate(dates[0])
|
||||||
|
var diffDays = this.getApsDayDiff(startDate, endDate)
|
||||||
|
if (diffDays > this.machineApsMaxDays - 1) {
|
||||||
|
return this.addApsDays(startDate, this.machineApsMaxDays - 1)
|
||||||
|
}
|
||||||
|
return endDate
|
||||||
|
},
|
||||||
|
machineApsDays() {
|
||||||
|
var days = []
|
||||||
|
var totalDays = this.getApsDayDiff(this.machineApsStartDate, this.machineApsEndDate) + 1
|
||||||
|
if (totalDays < 7) totalDays = 7
|
||||||
|
for (let i = 0; i < totalDays; i++) {
|
||||||
|
var date = this.addApsDays(this.machineApsStartDate, i)
|
||||||
|
days.push({
|
||||||
|
key: this.formatApsDateKey(date),
|
||||||
|
label: this.formatApsDateKey(date),
|
||||||
|
left: i * this.machineApsDayWidth
|
||||||
|
})
|
||||||
|
}
|
||||||
|
return days
|
||||||
|
},
|
||||||
|
machineApsTimelineWidth() {
|
||||||
|
return this.machineApsDays.length * this.machineApsDayWidth
|
||||||
|
},
|
||||||
|
machineApsInnerWidth() {
|
||||||
|
return this.machineApsPersonWidth + this.machineApsTimelineWidth
|
||||||
|
},
|
||||||
|
machineApsGroups() {
|
||||||
|
var colorClasses = ['aps-task-blue', 'aps-task-green', 'aps-task-yellow', 'aps-task-purple', 'aps-task-cyan', 'aps-task-pink']
|
||||||
|
var grouped = {}
|
||||||
|
this.machineTaskDisplayData.forEach((row, index) => {
|
||||||
|
var personName = row.姓名 || '未指定'
|
||||||
|
if (!grouped[personName]) grouped[personName] = []
|
||||||
|
var startDate = this.parseApsDate(row.分配时间) || this.parseApsDate(row.精工期限) || this.addApsDays(this.machineApsStartDate, index)
|
||||||
|
var endDate = this.parseApsDate(row.精工期限) || startDate
|
||||||
|
if (endDate.getTime() < startDate.getTime()) endDate = startDate
|
||||||
|
var leftDays = this.getApsDayDiff(this.machineApsStartDate, this.clearApsDate(startDate))
|
||||||
|
var durationDays = this.getApsDayDiff(this.clearApsDate(startDate), this.clearApsDate(endDate)) + 1
|
||||||
|
if (leftDays < 0) leftDays = 0
|
||||||
|
if (leftDays > this.machineApsDays.length - 1) leftDays = this.machineApsDays.length - 1
|
||||||
|
if (leftDays + durationDays > this.machineApsDays.length) durationDays = this.machineApsDays.length - leftDays
|
||||||
|
if (durationDays < 1) durationDays = 1
|
||||||
|
grouped[personName].push(Object.assign({}, row, {
|
||||||
|
_apsKey: personName + '_' + index + '_' + row.工艺任务流水号,
|
||||||
|
_apsLeft: leftDays * this.machineApsDayWidth + 4,
|
||||||
|
_apsWidth: durationDays * this.machineApsDayWidth - 8,
|
||||||
|
_apsTop: 8 + grouped[personName].length * 58,
|
||||||
|
_apsColorClass: colorClasses[index % colorClasses.length]
|
||||||
|
}))
|
||||||
|
})
|
||||||
|
return Object.keys(grouped).map(name => {
|
||||||
|
return {
|
||||||
|
name: name,
|
||||||
|
tasks: grouped[name],
|
||||||
|
height: Math.max(76, grouped[name].length * 58 + 16)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
// 修改人:Ld 修改时间:2026-08-04 14:30:24; 弹窗时间筛选后的任务集合,按派工时间与完工期限区间过滤。
|
||||||
|
machineTaskDisplayData() {
|
||||||
|
if (!this.machineTaskDateRange || this.machineTaskDateRange.length !== 2) {
|
||||||
|
return this.machineTaskData
|
||||||
|
}
|
||||||
|
var startDate = this.parseApsDate(this.machineTaskDateRange[0])
|
||||||
|
var endDate = this.parseApsDate(this.machineTaskDateRange[1])
|
||||||
|
if (!startDate || !endDate) {
|
||||||
|
return this.machineTaskData
|
||||||
|
}
|
||||||
|
if (endDate.getTime() < startDate.getTime()) {
|
||||||
|
var tempDate = startDate
|
||||||
|
startDate = endDate
|
||||||
|
endDate = tempDate
|
||||||
|
}
|
||||||
|
return this.machineTaskData.filter(row => {
|
||||||
|
var rowStart = this.parseApsDate(row.分配时间) || this.parseApsDate(row.精工期限)
|
||||||
|
var rowEnd = this.parseApsDate(row.精工期限) || rowStart
|
||||||
|
if (!rowStart) return false
|
||||||
|
if (!rowEnd) rowEnd = rowStart
|
||||||
|
return rowStart.getTime() <= endDate.getTime() && rowEnd.getTime() >= startDate.getTime()
|
||||||
|
})
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
created() {
|
created() {
|
||||||
@@ -376,6 +587,7 @@ export default {
|
|||||||
return {
|
return {
|
||||||
订单号: item.订单号,
|
订单号: item.订单号,
|
||||||
MK订单编号: item.MK订单编号,
|
MK订单编号: item.MK订单编号,
|
||||||
|
关联合同编号: item.关联合同编号,
|
||||||
收货人: item.MK订单收货人,
|
收货人: item.MK订单收货人,
|
||||||
产品名称: item.产品名称,
|
产品名称: item.产品名称,
|
||||||
零件名称: item.零件名称,
|
零件名称: item.零件名称,
|
||||||
@@ -385,12 +597,16 @@ export default {
|
|||||||
剩余数: item.剩余数,
|
剩余数: item.剩余数,
|
||||||
状态: item.状态,
|
状态: item.状态,
|
||||||
完成率: '',
|
完成率: '',
|
||||||
|
总工序: 0,
|
||||||
|
实际工序: 0,
|
||||||
投产时间: item.投产时间,
|
投产时间: item.投产时间,
|
||||||
精工期限: item.精工期限,
|
精工期限: item.精工期限,
|
||||||
设备: item.设备,
|
设备: item.设备,
|
||||||
材料: item.材料,
|
材料: item.材料,
|
||||||
_totalProcesses: 0,
|
_totalProcesses: 0,
|
||||||
_completedProcesses: 0,
|
_completedProcesses: 0,
|
||||||
|
// 修改人:Ld 修改时间:2026-08-04 08:56:51; 记录每个OP工序是否完成,用于单元格标绿。
|
||||||
|
_completedOpMap: {},
|
||||||
...this.initializeProcessFields()
|
...this.initializeProcessFields()
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -418,8 +634,119 @@ export default {
|
|||||||
if (opIndex !== null) {
|
if (opIndex !== null) {
|
||||||
const opKey = this.processConfig.processNamePattern.replace('{index}', opIndex)
|
const opKey = this.processConfig.processNamePattern.replace('{index}', opIndex)
|
||||||
group[opKey] = item.工序
|
group[opKey] = item.工序
|
||||||
|
// 修改人:Ld 修改时间:2026-08-04 08:56:51; 按现有完成率口径判定单道OP是否完成。
|
||||||
|
group._completedOpMap[opKey] = remainingCount <= 0
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
// 修改人:Ld 修改时间:2026-08-04 08:56:51; 返回OP单元格样式,未完成保持原样。
|
||||||
|
getProcessCellClass(row, opKey) {
|
||||||
|
if (!row || !row[opKey]) return ''
|
||||||
|
if (row._completedOpMap && row._completedOpMap[opKey]) {
|
||||||
|
return 'op-process-completed'
|
||||||
|
}
|
||||||
|
return ''
|
||||||
|
},
|
||||||
|
// 修改人:Ld 修改时间:2026-08-04 14:57:36; 合同编号优先取方案一真实关联合同号,没有时保留原提取关联值。
|
||||||
|
getProductionPlanContractNo(row) {
|
||||||
|
if (!row) return ''
|
||||||
|
return row.关联合同编号 || row.合同编号 || row.MK订单编号 || row.订单号 || ''
|
||||||
|
},
|
||||||
|
// 修改人:Ld 修改时间:2026-08-04 09:07:29; 复用工况分页查询,按当前机床查看后续未完成的已派工任务。
|
||||||
|
openMachineTaskDialog(row) {
|
||||||
|
if (!row || !row.设备) {
|
||||||
|
this.$message.warning('当前行暂无机床信息')
|
||||||
|
return
|
||||||
|
}
|
||||||
|
var machineName = row.设备
|
||||||
|
var machineQueryValue = this.getMachineTaskQueryValue(machineName)
|
||||||
|
var param = []
|
||||||
|
param[0] = ['人员编号', '']
|
||||||
|
param[1] = ['人员编号_check', 0]
|
||||||
|
param[2] = ['设备流水号', machineQueryValue]
|
||||||
|
param[3] = ['设备流水号_check', 1]
|
||||||
|
param[4] = ['零件名称_check', 0]
|
||||||
|
param[5] = ['零件名称', '']
|
||||||
|
param[6] = ['排序名称', 0]
|
||||||
|
param[7] = ['排序方式', '']
|
||||||
|
param[8] = ['开始时间', '']
|
||||||
|
param[9] = ['结束时间', '']
|
||||||
|
param[10] = ['时间_check', 0]
|
||||||
|
param[11] = ['PageCurrent', 1]
|
||||||
|
param[12] = ['PageSize', 100]
|
||||||
|
param[13] = ['PageCount', '1111', 'int', '1']
|
||||||
|
param[14] = ['ItemCount', '1111', 'int', '1']
|
||||||
|
this.machineTaskTitle = machineName + ' 后续已派工任务'
|
||||||
|
this.machineTaskData = []
|
||||||
|
this.machineTaskVisible = true
|
||||||
|
this.machineTaskLoading = true
|
||||||
|
this.machineTaskDateRange = []
|
||||||
|
var Data = this.CreateData('11', '精工车间_工况_分页查询', param)
|
||||||
|
this.ExecDatabase(Data).then(response => {
|
||||||
|
if (response.data && response.data.result) {
|
||||||
|
this.machineTaskData = response.data.result
|
||||||
|
} else {
|
||||||
|
this.machineTaskData = []
|
||||||
|
}
|
||||||
|
}).finally(() => {
|
||||||
|
this.machineTaskLoading = false
|
||||||
|
})
|
||||||
|
},
|
||||||
|
// 修改人:Ld 修改时间:2026-08-04 09:07:29; 生产计划设备为“机床号:名称”,工况设备为“名称_机床号”,查询时优先取机床号。
|
||||||
|
getMachineTaskQueryValue(machineName) {
|
||||||
|
if (!machineName) return ''
|
||||||
|
var value = String(machineName)
|
||||||
|
if (value.indexOf(':') > -1) {
|
||||||
|
return value.split(':')[0]
|
||||||
|
}
|
||||||
|
if (value.indexOf(':') > -1) {
|
||||||
|
return value.split(':')[0]
|
||||||
|
}
|
||||||
|
return value
|
||||||
|
},
|
||||||
|
// 修改人:Ld 修改时间:2026-08-04 14:30:24; 切换弹窗时间范围后刷新APS排产展示。
|
||||||
|
changeMachineTaskDateRange() {
|
||||||
|
this.$forceUpdate()
|
||||||
|
},
|
||||||
|
resetMachineTaskDateRange() {
|
||||||
|
this.machineTaskDateRange = []
|
||||||
|
this.$forceUpdate()
|
||||||
|
},
|
||||||
|
// 修改人:Ld 修改时间:2026-08-04 09:16:54; APS排产视图日期解析,兼容后端日期字符串。
|
||||||
|
parseApsDate(value) {
|
||||||
|
if (!value) return null
|
||||||
|
var text = String(value).replace(/\//g, '-')
|
||||||
|
if (text.length > 10) text = text.substring(0, 10)
|
||||||
|
var parts = text.split('-')
|
||||||
|
if (parts.length < 3) return null
|
||||||
|
var year = parseInt(parts[0], 10)
|
||||||
|
var month = parseInt(parts[1], 10)
|
||||||
|
var day = parseInt(parts[2], 10)
|
||||||
|
if (isNaN(year) || isNaN(month) || isNaN(day)) return null
|
||||||
|
return new Date(year, month - 1, day)
|
||||||
|
},
|
||||||
|
clearApsDate(date) {
|
||||||
|
if (!date) return null
|
||||||
|
return new Date(date.getFullYear(), date.getMonth(), date.getDate())
|
||||||
|
},
|
||||||
|
addApsDays(date, days) {
|
||||||
|
var result = this.clearApsDate(date)
|
||||||
|
result.setDate(result.getDate() + days)
|
||||||
|
return result
|
||||||
|
},
|
||||||
|
getApsDayDiff(startDate, endDate) {
|
||||||
|
if (!startDate || !endDate) return 0
|
||||||
|
var oneDay = 24 * 60 * 60 * 1000
|
||||||
|
return Math.round((this.clearApsDate(endDate).getTime() - this.clearApsDate(startDate).getTime()) / oneDay)
|
||||||
|
},
|
||||||
|
formatApsDateKey(date) {
|
||||||
|
if (!date) return ''
|
||||||
|
return date.getFullYear() + '-' + (date.getMonth() + 1) + '-' + date.getDate()
|
||||||
|
},
|
||||||
|
formatApsDateText(value) {
|
||||||
|
var date = this.parseApsDate(value)
|
||||||
|
if (!date) return ''
|
||||||
|
return this.formatApsDateKey(date)
|
||||||
|
},
|
||||||
// 计算订单状态
|
// 计算订单状态
|
||||||
calculateOrderStatus(group) {
|
calculateOrderStatus(group) {
|
||||||
var rate = 0
|
var rate = 0
|
||||||
@@ -427,6 +754,8 @@ export default {
|
|||||||
rate = Math.round(group._completedProcesses / group._totalProcesses * 100)
|
rate = Math.round(group._completedProcesses / group._totalProcesses * 100)
|
||||||
}
|
}
|
||||||
group.完成率 = rate + '%'
|
group.完成率 = rate + '%'
|
||||||
|
group.总工序 = group._totalProcesses
|
||||||
|
group.实际工序 = group._completedProcesses
|
||||||
if (rate === this.processConfig.statusRules.completed) {
|
if (rate === this.processConfig.statusRules.completed) {
|
||||||
group.状态 = '已完成'
|
group.状态 = '已完成'
|
||||||
} else if (rate === this.processConfig.statusRules.dispatching) {
|
} else if (rate === this.processConfig.statusRules.dispatching) {
|
||||||
@@ -461,6 +790,186 @@ export default {
|
|||||||
})
|
})
|
||||||
return groupedData
|
return groupedData
|
||||||
},
|
},
|
||||||
|
// 修改人:Ld 修改时间:2026-08-05 09:38:16; 生产计划按上传模板样式导出,数据沿用页面筛选和分组显示规则。
|
||||||
|
exportProductionPlan() {
|
||||||
|
if (!this.filteredTableData || this.filteredTableData.length === 0) {
|
||||||
|
this.$message.warning('暂无数据可导出')
|
||||||
|
return
|
||||||
|
}
|
||||||
|
var headers = this.getProductionPlanExportHeaders()
|
||||||
|
var data = []
|
||||||
|
data.push([this.getProductionPlanExportTitle()])
|
||||||
|
data.push(headers)
|
||||||
|
this.filteredTableData.forEach((row, index) => {
|
||||||
|
data.push(this.buildProductionPlanExportRow(row, index))
|
||||||
|
})
|
||||||
|
var ws = XLSX.utils.aoa_to_sheet(data)
|
||||||
|
var range = XLSX.utils.decode_range(ws['!ref'])
|
||||||
|
ws['!merges'] = [{ s: { r: 0, c: 0 }, e: { r: 0, c: headers.length - 1 }}]
|
||||||
|
ws['!cols'] = this.getProductionPlanExportCols()
|
||||||
|
ws['!rows'] = this.getProductionPlanExportRows(this.filteredTableData.length)
|
||||||
|
ws['!freeze'] = { xSplit: 0, ySplit: 2 }
|
||||||
|
for (let rowIndex = range.s.r; rowIndex <= range.e.r; rowIndex++) {
|
||||||
|
for (let colIndex = range.s.c; colIndex <= range.e.c; colIndex++) {
|
||||||
|
var cellAddress = XLSX.utils.encode_cell({ r: rowIndex, c: colIndex })
|
||||||
|
if (!ws[cellAddress]) ws[cellAddress] = { t: 's', v: '' }
|
||||||
|
ws[cellAddress].s = this.getProductionPlanExportCellStyle(rowIndex, colIndex, ws[cellAddress].v)
|
||||||
|
if (rowIndex >= 2 && colIndex >= 16) {
|
||||||
|
var exportRow = this.filteredTableData[rowIndex - 2]
|
||||||
|
var opKey = headers[colIndex]
|
||||||
|
if (exportRow && exportRow._completedOpMap && exportRow._completedOpMap[opKey]) {
|
||||||
|
ws[cellAddress].s = this.getProductionPlanCompletedOpExportStyle()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ws['!autofilter'] = { ref: XLSX.utils.encode_range({ s: { r: 1, c: 0 }, e: { r: Math.max(1, range.e.r), c: headers.length - 1 }}) }
|
||||||
|
var wb = XLSX.utils.book_new()
|
||||||
|
XLSX.utils.book_append_sheet(wb, ws, this.getProductionPlanExportSheetName())
|
||||||
|
var wbout = XLSX.write(wb, { bookType: 'xlsx', bookSST: false, type: 'array' })
|
||||||
|
FileSaver.saveAs(new Blob([wbout], { type: 'application/octet-stream' }), this.getProductionPlanExportFileName())
|
||||||
|
this.$message.success('导出成功')
|
||||||
|
},
|
||||||
|
getProductionPlanExportHeaders() {
|
||||||
|
return ['序号', '状态', '合同编号', '订单编号', '收货人', '投产日期', '订单交货日期', '数量', '总工序', '实际 工序', '产品名称', '零件名称', '零件图号', '材料', '完成率', '当前状态或设备', 'OP010', 'OP020', 'OP030', 'OP040', 'OP050', 'OP060', 'OP070', 'OP080', 'OP090', 'OP100', 'OP110']
|
||||||
|
},
|
||||||
|
buildProductionPlanExportRow(row, index) {
|
||||||
|
var opKeys = ['OP010', 'OP020', 'OP030', 'OP040', 'OP050', 'OP060', 'OP070', 'OP080', 'OP090', 'OP100', 'OP110']
|
||||||
|
var exportRow = [
|
||||||
|
index + 1,
|
||||||
|
row.状态 || '',
|
||||||
|
this.getProductionPlanContractNo(row),
|
||||||
|
row.MK订单编号 || row.订单号 || '',
|
||||||
|
row.收货人 || '仓库',
|
||||||
|
this.formatProductionPlanExportDate(row.投产时间),
|
||||||
|
this.formatProductionPlanExportDate(row.精工期限),
|
||||||
|
row.计划数 || '',
|
||||||
|
row.总工序 || 0,
|
||||||
|
row.实际工序 || 0,
|
||||||
|
row.产品名称 || '',
|
||||||
|
row.零件名称 || '',
|
||||||
|
row.零件图号 || '',
|
||||||
|
row.材料 || '',
|
||||||
|
this.getProductionPlanProgressText(row),
|
||||||
|
row.设备 || ''
|
||||||
|
]
|
||||||
|
opKeys.forEach(key => {
|
||||||
|
exportRow.push(row[key] || '')
|
||||||
|
})
|
||||||
|
return exportRow
|
||||||
|
},
|
||||||
|
getProductionPlanProgressText(row) {
|
||||||
|
var total = Number(row.总工序) || 0
|
||||||
|
var actual = Number(row.实际工序) || 0
|
||||||
|
if (total <= 0) return row.完成率 || '0%'
|
||||||
|
var percent = Math.round(actual / total * 100)
|
||||||
|
var barCount = Math.round(percent / 4)
|
||||||
|
var barText = ''
|
||||||
|
for (let i = 0; i < barCount; i++) {
|
||||||
|
barText += '▊'
|
||||||
|
}
|
||||||
|
return barText + percent + '%'
|
||||||
|
},
|
||||||
|
formatProductionPlanExportDate(value) {
|
||||||
|
if (!value) return ''
|
||||||
|
var text = String(value)
|
||||||
|
if (text.indexOf('-') > -1) {
|
||||||
|
var parts = text.substring(0, 10).split('-')
|
||||||
|
if (parts.length >= 3) {
|
||||||
|
return Number(parts[1]) + '.' + parts[2]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return text
|
||||||
|
},
|
||||||
|
getProductionPlanExportTitle() {
|
||||||
|
var month = this.monthValue || ''
|
||||||
|
if (month.indexOf('-') > -1) {
|
||||||
|
month = month.split('-')[1]
|
||||||
|
}
|
||||||
|
return ' ' + (month || '') + '月份生产计划表'
|
||||||
|
},
|
||||||
|
getProductionPlanExportSheetName() {
|
||||||
|
var month = this.monthValue || ''
|
||||||
|
if (month.indexOf('-') > -1) {
|
||||||
|
month = month.split('-')[1]
|
||||||
|
}
|
||||||
|
return (month || '生产') + '月生产计划表'
|
||||||
|
},
|
||||||
|
getProductionPlanExportFileName() {
|
||||||
|
var month = this.monthValue || ''
|
||||||
|
if (month.indexOf('-') > -1) {
|
||||||
|
month = month.split('-')[1]
|
||||||
|
}
|
||||||
|
return (month || '') + '月生产计划表.xlsx'
|
||||||
|
},
|
||||||
|
getProductionPlanExportCols() {
|
||||||
|
return [
|
||||||
|
{ wch: 7.5 }, { wch: 9 }, { wch: 18 }, { wch: 19.5 }, { wch: 10 },
|
||||||
|
{ wch: 9 }, { wch: 13 }, { wch: 6 }, { wch: 7 }, { wch: 10 },
|
||||||
|
{ wch: 16 }, { wch: 20 }, { wch: 22 }, { wch: 10 }, { wch: 31 },
|
||||||
|
{ wch: 13 }, { wch: 13 }, { wch: 13 }, { wch: 13 }, { wch: 13 },
|
||||||
|
{ wch: 13 }, { wch: 13 }, { wch: 13 }, { wch: 13 }, { wch: 13 },
|
||||||
|
{ wch: 13 }, { wch: 13 }
|
||||||
|
]
|
||||||
|
},
|
||||||
|
getProductionPlanExportRows(rowCount) {
|
||||||
|
var rows = [{ hpt: 42 }, { hpt: 25 }]
|
||||||
|
for (let i = 0; i < rowCount; i++) {
|
||||||
|
rows.push({ hpt: 25 })
|
||||||
|
}
|
||||||
|
return rows
|
||||||
|
},
|
||||||
|
getProductionPlanExportCellStyle(rowIndex, colIndex, value) {
|
||||||
|
var baseStyle = {
|
||||||
|
font: { name: '微软雅黑', sz: rowIndex === 0 ? 18 : 10, bold: false, color: { rgb: '000000' }},
|
||||||
|
alignment: { horizontal: 'center', vertical: 'center', wrapText: true },
|
||||||
|
border: rowIndex === 0 ? {} : {
|
||||||
|
top: { style: 'thin', color: { rgb: '000000' }},
|
||||||
|
bottom: { style: 'thin', color: { rgb: '000000' }},
|
||||||
|
left: { style: 'thin', color: { rgb: '000000' }},
|
||||||
|
right: { style: 'thin', color: { rgb: '000000' }}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (rowIndex === 0) {
|
||||||
|
return baseStyle
|
||||||
|
}
|
||||||
|
if (rowIndex === 1) {
|
||||||
|
baseStyle.font.bold = false
|
||||||
|
baseStyle.fill = { fgColor: { rgb: 'FFFFFF' }}
|
||||||
|
return baseStyle
|
||||||
|
}
|
||||||
|
if (colIndex === 11 || colIndex === 12) {
|
||||||
|
baseStyle.alignment.horizontal = 'left'
|
||||||
|
}
|
||||||
|
if (colIndex === 14) {
|
||||||
|
baseStyle.font.bold = true
|
||||||
|
baseStyle.font.color = { rgb: '00B050' }
|
||||||
|
baseStyle.alignment.horizontal = 'left'
|
||||||
|
}
|
||||||
|
if (colIndex === 1) {
|
||||||
|
if (value === '已完成') {
|
||||||
|
baseStyle.font.color = { rgb: '909399' }
|
||||||
|
} else if (value === '生产中') {
|
||||||
|
baseStyle.font.color = { rgb: '67C23A' }
|
||||||
|
} else {
|
||||||
|
baseStyle.font.color = { rgb: '409EFF' }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return baseStyle
|
||||||
|
},
|
||||||
|
getProductionPlanCompletedOpExportStyle() {
|
||||||
|
return {
|
||||||
|
font: { name: '微软雅黑', sz: 10, bold: false, color: { rgb: 'FFFFFF' }},
|
||||||
|
fill: { fgColor: { rgb: '67C23A' }},
|
||||||
|
alignment: { horizontal: 'center', vertical: 'center', wrapText: true },
|
||||||
|
border: {
|
||||||
|
top: { style: 'thin', color: { rgb: '000000' }},
|
||||||
|
bottom: { style: 'thin', color: { rgb: '000000' }},
|
||||||
|
left: { style: 'thin', color: { rgb: '000000' }},
|
||||||
|
right: { style: 'thin', color: { rgb: '000000' }}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
openDashboard() {
|
openDashboard() {
|
||||||
if (this.tableData2.length === 0) {
|
if (this.tableData2.length === 0) {
|
||||||
this.$message.warning('暂无数据,请先查询')
|
this.$message.warning('暂无数据,请先查询')
|
||||||
@@ -757,4 +1266,201 @@ export default {
|
|||||||
:deep(.el-table__fixed) {
|
:deep(.el-table__fixed) {
|
||||||
height: calc(100% - 18px) !important;
|
height: calc(100% - 18px) !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* 修改人:Ld 修改时间:2026-08-04 08:56:51; 已完成OP工序绿色标识,不改变原表格布局。 */
|
||||||
|
.op-process-completed {
|
||||||
|
display: inline-block;
|
||||||
|
width: 100%;
|
||||||
|
min-height: 20px;
|
||||||
|
line-height: 20px;
|
||||||
|
color: #fff;
|
||||||
|
background-color: #67C23A;
|
||||||
|
border-radius: 2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 修改人:Ld 修改时间:2026-08-04 09:07:29; 保持当前状态列宽不变,仅增加机床可点击提示。 */
|
||||||
|
.machine-task-link {
|
||||||
|
width: 100%;
|
||||||
|
padding: 0;
|
||||||
|
font-size: 12px;
|
||||||
|
line-height: 20px;
|
||||||
|
white-space: normal;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 修改人:Ld 修改时间:2026-08-04 09:16:54; APS排产弹窗样式,按人名分组并保留现有系统的简洁表格风格。 */
|
||||||
|
.machine-aps {
|
||||||
|
min-height: 460px;
|
||||||
|
border: 1px solid #DCDFE6;
|
||||||
|
background: #fff;
|
||||||
|
}
|
||||||
|
|
||||||
|
.machine-aps-toolbar {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 8px;
|
||||||
|
padding: 10px 12px;
|
||||||
|
border-bottom: 1px solid #DCDFE6;
|
||||||
|
background: #FAFBFC;
|
||||||
|
}
|
||||||
|
|
||||||
|
.machine-aps-toolbar-label {
|
||||||
|
color: #303133;
|
||||||
|
font-size: 12px;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
.machine-aps-toolbar-tip {
|
||||||
|
margin-left: 4px;
|
||||||
|
color: #909399;
|
||||||
|
font-size: 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.machine-aps-empty {
|
||||||
|
height: 460px;
|
||||||
|
line-height: 460px;
|
||||||
|
text-align: center;
|
||||||
|
color: #909399;
|
||||||
|
font-size: 13px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.machine-aps-scroll {
|
||||||
|
width: 100%;
|
||||||
|
height: 520px;
|
||||||
|
overflow: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.machine-aps-inner {
|
||||||
|
min-width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.machine-aps-header {
|
||||||
|
position: sticky;
|
||||||
|
top: 0;
|
||||||
|
z-index: 5;
|
||||||
|
display: flex;
|
||||||
|
height: 46px;
|
||||||
|
color: #303133;
|
||||||
|
background: #F5F7FA;
|
||||||
|
border-bottom: 1px solid #DCDFE6;
|
||||||
|
}
|
||||||
|
|
||||||
|
.machine-aps-person-header {
|
||||||
|
flex: 0 0 118px;
|
||||||
|
width: 118px;
|
||||||
|
line-height: 46px;
|
||||||
|
text-align: center;
|
||||||
|
font-weight: bold;
|
||||||
|
border-right: 1px solid #DCDFE6;
|
||||||
|
}
|
||||||
|
|
||||||
|
.machine-aps-time-header {
|
||||||
|
display: flex;
|
||||||
|
}
|
||||||
|
|
||||||
|
.machine-aps-day {
|
||||||
|
height: 46px;
|
||||||
|
line-height: 46px;
|
||||||
|
text-align: center;
|
||||||
|
font-size: 12px;
|
||||||
|
border-right: 1px solid #DCDFE6;
|
||||||
|
box-sizing: border-box;
|
||||||
|
}
|
||||||
|
|
||||||
|
.machine-aps-row {
|
||||||
|
display: flex;
|
||||||
|
min-height: 76px;
|
||||||
|
border-bottom: 1px solid #DCDFE6;
|
||||||
|
}
|
||||||
|
|
||||||
|
.machine-aps-person {
|
||||||
|
flex: 0 0 118px;
|
||||||
|
width: 118px;
|
||||||
|
padding: 12px 6px;
|
||||||
|
color: #303133;
|
||||||
|
background: #EEF3FF;
|
||||||
|
border-right: 1px solid #DCDFE6;
|
||||||
|
box-sizing: border-box;
|
||||||
|
}
|
||||||
|
|
||||||
|
.machine-aps-person-name {
|
||||||
|
overflow: hidden;
|
||||||
|
font-size: 13px;
|
||||||
|
font-weight: bold;
|
||||||
|
line-height: 20px;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
white-space: nowrap;
|
||||||
|
}
|
||||||
|
|
||||||
|
.machine-aps-person-count {
|
||||||
|
margin-top: 4px;
|
||||||
|
color: #606266;
|
||||||
|
font-size: 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.machine-aps-lane {
|
||||||
|
position: relative;
|
||||||
|
min-height: 76px;
|
||||||
|
background: repeating-linear-gradient(
|
||||||
|
90deg,
|
||||||
|
#ffffff 0,
|
||||||
|
#ffffff 21px,
|
||||||
|
#F7FAFC 21px,
|
||||||
|
#F7FAFC 22px
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
.machine-aps-grid-line {
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
bottom: 0;
|
||||||
|
width: 1px;
|
||||||
|
background: #D7E3EA;
|
||||||
|
}
|
||||||
|
|
||||||
|
.machine-aps-task {
|
||||||
|
position: absolute;
|
||||||
|
height: 48px;
|
||||||
|
padding: 3px 6px;
|
||||||
|
overflow: hidden;
|
||||||
|
color: #1F2D3D;
|
||||||
|
border: 1px solid #606266;
|
||||||
|
border-radius: 2px;
|
||||||
|
box-sizing: border-box;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
.machine-aps-order,
|
||||||
|
.machine-aps-part,
|
||||||
|
.machine-aps-count,
|
||||||
|
.machine-aps-date {
|
||||||
|
overflow: hidden;
|
||||||
|
font-size: 11px;
|
||||||
|
line-height: 12px;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
white-space: nowrap;
|
||||||
|
}
|
||||||
|
|
||||||
|
.aps-task-blue {
|
||||||
|
background: #C7D4FF;
|
||||||
|
}
|
||||||
|
|
||||||
|
.aps-task-green {
|
||||||
|
background: #B7E8B5;
|
||||||
|
}
|
||||||
|
|
||||||
|
.aps-task-yellow {
|
||||||
|
background: #FFF7B0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.aps-task-purple {
|
||||||
|
background: #D8C7F0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.aps-task-cyan {
|
||||||
|
background: #C8DDE4;
|
||||||
|
}
|
||||||
|
|
||||||
|
.aps-task-pink {
|
||||||
|
background: #F7B6BB;
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
@@ -55,7 +55,7 @@
|
|||||||
<!-- 修改人:Ld 修改时间:2026-07-06 09:12:38; 员工汇总显示按工序工价计算的总价 -->
|
<!-- 修改人:Ld 修改时间:2026-07-06 09:12:38; 员工汇总显示按工序工价计算的总价 -->
|
||||||
<el-table-column width="90px" label="总价" align="center" show-overflow-tooltip prop="总价">
|
<el-table-column width="90px" label="总价" align="center" show-overflow-tooltip prop="总价">
|
||||||
<template slot-scope="scope">
|
<template slot-scope="scope">
|
||||||
{{ scope.row.总价 }}
|
{{ formatTotalPrice(scope.row.总价) }}
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
</el-table>
|
</el-table>
|
||||||
@@ -133,7 +133,7 @@
|
|||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column v-if="Number(token) === 2" width="90px" label="总价" align="center" show-overflow-tooltip prop="总价">
|
<el-table-column v-if="Number(token) === 2" width="90px" label="总价" align="center" show-overflow-tooltip prop="总价">
|
||||||
<template slot-scope="scope">
|
<template slot-scope="scope">
|
||||||
{{ scope.row.总价 }}
|
{{ formatTotalPrice(scope.row.总价) }}
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column :width="setColumnWidth('加工工时M')" label="加工工时M" align="center" show-overflow-tooltip prop="加工时长">
|
<el-table-column :width="setColumnWidth('加工工时M')" label="加工工时M" align="center" show-overflow-tooltip prop="加工时长">
|
||||||
@@ -234,7 +234,7 @@
|
|||||||
<!-- 修改人:Ld 修改时间:2026-07-06 09:12:38; 设备汇总显示按工序工价计算的总价 -->
|
<!-- 修改人:Ld 修改时间:2026-07-06 09:12:38; 设备汇总显示按工序工价计算的总价 -->
|
||||||
<el-table-column width="90px" label="总价" align="center" show-overflow-tooltip prop="总价">
|
<el-table-column width="90px" label="总价" align="center" show-overflow-tooltip prop="总价">
|
||||||
<template slot-scope="scope">
|
<template slot-scope="scope">
|
||||||
{{ scope.row.总价 }}
|
{{ formatTotalPrice(scope.row.总价) }}
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
</el-table>
|
</el-table>
|
||||||
@@ -310,11 +310,11 @@
|
|||||||
<span v-else>{{ scope.row.单价 }}</span>
|
<span v-else>{{ scope.row.单价 }}</span>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column v-if="Number(token) === 2" width="90px" label="总价" align="center" show-overflow-tooltip prop="总价">
|
<el-table-column v-if="Number(token) === 2" width="90px" label="总价" align="center" show-overflow-tooltip prop="总价">
|
||||||
<template slot-scope="scope">
|
<template slot-scope="scope">
|
||||||
{{ scope.row.总价 }}
|
{{ formatTotalPrice(scope.row.总价) }}
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column :width="setColumnWidth('加工工时M')" label="加工工时M" align="center" show-overflow-tooltip prop="加工时长">
|
<el-table-column :width="setColumnWidth('加工工时M')" label="加工工时M" align="center" show-overflow-tooltip prop="加工时长">
|
||||||
<template slot-scope="scope">
|
<template slot-scope="scope">
|
||||||
{{ scope.row.加工时长 }}
|
{{ scope.row.加工时长 }}
|
||||||
@@ -446,6 +446,13 @@ export default {
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
|
// 修改人:Ld 修改时间:2026-08-04 16:30:55; 总价统一保留一位小数,零值也显示为 0.0
|
||||||
|
formatTotalPrice(value) {
|
||||||
|
if (value === '' || value === null || typeof value === 'undefined') {
|
||||||
|
return ''
|
||||||
|
}
|
||||||
|
return Number(value).toFixed(1)
|
||||||
|
},
|
||||||
// 修改人:Ld 修改时间:2026-07-09; 操作者筛选后刷新表格布局
|
// 修改人:Ld 修改时间:2026-07-09; 操作者筛选后刷新表格布局
|
||||||
filterOperator() {
|
filterOperator() {
|
||||||
this.$nextTick(function() {
|
this.$nextTick(function() {
|
||||||
|
|||||||
@@ -38,6 +38,16 @@
|
|||||||
style="margin-left:10px"
|
style="margin-left:10px"
|
||||||
@click="pageCurrent=1;searchTable()">查询
|
@click="pageCurrent=1;searchTable()">查询
|
||||||
</el-button>
|
</el-button>
|
||||||
|
<el-button
|
||||||
|
v-if="Number(token)===2"
|
||||||
|
type="info"
|
||||||
|
plain
|
||||||
|
icon="el-icon-view"
|
||||||
|
size="small"
|
||||||
|
style="margin-left:10px"
|
||||||
|
@click="switchDisabledMaterial">
|
||||||
|
{{ showDisabledMaterial ? '查看启用物料' : '查看禁用物料' }}
|
||||||
|
</el-button>
|
||||||
<el-button v-if="Number(token)===2" type="distribution" icon="el-icon-plus" size="small" style="margin-left:10px" @click="materialPlus">
|
<el-button v-if="Number(token)===2" type="distribution" icon="el-icon-plus" size="small" style="margin-left:10px" @click="materialPlus">
|
||||||
物料
|
物料
|
||||||
</el-button>
|
</el-button>
|
||||||
@@ -176,6 +186,14 @@
|
|||||||
{{ scope.row.曾用物料编码 }}
|
{{ scope.row.曾用物料编码 }}
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
|
<!-- 修改人:Ld 修改时间:2026-08-03 07:55:23; 禁用物料查询时显示当前启用状态 -->
|
||||||
|
<el-table-column width="90px" label="启用状态" align="center" prop="是否禁用">
|
||||||
|
<template slot-scope="scope">
|
||||||
|
<el-tag :type="Number(scope.row.是否禁用) === 1 ? 'info' : 'success'" size="mini">
|
||||||
|
{{ Number(scope.row.是否禁用) === 1 ? '禁用' : '启用' }}
|
||||||
|
</el-tag>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
<el-table-column :width="setColumnWidth('日期时间')" label="最近修改" align="center" show-overflow-tooltip>
|
<el-table-column :width="setColumnWidth('日期时间')" label="最近修改" align="center" show-overflow-tooltip>
|
||||||
<template slot-scope="scope">
|
<template slot-scope="scope">
|
||||||
{{ scope.row.修改日期 }}
|
{{ scope.row.修改日期 }}
|
||||||
@@ -201,7 +219,7 @@
|
|||||||
{{ scope.row.Expr1 }}
|
{{ scope.row.Expr1 }}
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column label="操作" align="center" fixed="right" width="200px">
|
<el-table-column label="操作" align="center" fixed="right" width="230px">
|
||||||
<template slot-scope="scope">
|
<template slot-scope="scope">
|
||||||
<el-button
|
<el-button
|
||||||
type="text"
|
type="text"
|
||||||
@@ -209,8 +227,17 @@
|
|||||||
size="mini"
|
size="mini"
|
||||||
style="margin-right: 10px"
|
style="margin-right: 10px"
|
||||||
@click="handleEdit(scope.row)"/>
|
@click="handleEdit(scope.row)"/>
|
||||||
|
<!-- 修改人:Ld 修改时间:2026-08-03 08:15:00; 禁用物料列表提供启用操作 -->
|
||||||
<el-button
|
<el-button
|
||||||
:disabled="Number(token ) !== 2"
|
v-if="showDisabledMaterial"
|
||||||
|
:disabled="Number(token ) !== 2"
|
||||||
|
type="text"
|
||||||
|
icon="el-icon-refresh-left"
|
||||||
|
size="mini"
|
||||||
|
style="margin-right: 10px;color:#67c23a"
|
||||||
|
@click="handleEnable(scope.row)"/>
|
||||||
|
<el-button
|
||||||
|
:disabled="Number(token ) !== 2"
|
||||||
type="text"
|
type="text"
|
||||||
icon="el-icon-delete"
|
icon="el-icon-delete"
|
||||||
size="mini"
|
size="mini"
|
||||||
@@ -763,6 +790,7 @@ export default {
|
|||||||
], // 类型数组
|
], // 类型数组
|
||||||
loading: false, // 数据加载
|
loading: false, // 数据加载
|
||||||
loading3: false,
|
loading3: false,
|
||||||
|
showDisabledMaterial: false, // 修改人:Ld 修改时间:2026-08-03 07:55:23; 控制查询启用或禁用物料
|
||||||
total: 0, // 分页总数
|
total: 0, // 分页总数
|
||||||
total1: 0, // 分页总数
|
total1: 0, // 分页总数
|
||||||
total3: 0, // 分页总数
|
total3: 0, // 分页总数
|
||||||
@@ -887,6 +915,8 @@ export default {
|
|||||||
param[14] = ['ItemCount', '1111', 'int', '1']
|
param[14] = ['ItemCount', '1111', 'int', '1']
|
||||||
param[15] = ['物料编码_check', materialCodeValue_check] // 备注:修改人:Ld 修改时间:2026-06-29 14:18:00
|
param[15] = ['物料编码_check', materialCodeValue_check] // 备注:修改人:Ld 修改时间:2026-06-29 14:18:00
|
||||||
param[16] = ['物料编码', this.materialCodeValue] // 备注:修改人:Ld 修改时间:2026-06-29 14:18:00
|
param[16] = ['物料编码', this.materialCodeValue] // 备注:修改人:Ld 修改时间:2026-06-29 14:18:00
|
||||||
|
param[17] = ['是否禁用_check', 1] // 修改人:Ld 修改时间:2026-08-03 07:55:23; 导出跟随当前启用/禁用查询口径
|
||||||
|
param[18] = ['是否禁用', this.showDisabledMaterial ? 1 : 0] // 修改人:Ld 修改时间:2026-08-03 07:55:23; 查看禁用物料时导出禁用数据
|
||||||
var Data = this.CreateData('2001', '物料管理_查询数据_分页', param)
|
var Data = this.CreateData('2001', '物料管理_查询数据_分页', param)
|
||||||
this.exportExcel_NPOI(Data)
|
this.exportExcel_NPOI(Data)
|
||||||
} else {
|
} else {
|
||||||
@@ -1329,20 +1359,22 @@ export default {
|
|||||||
})
|
})
|
||||||
},
|
},
|
||||||
handleDelete(row) {
|
handleDelete(row) {
|
||||||
this.$confirm('是否删除?', '提示', {
|
var isDisabledMaterial = Number(row.是否禁用) === 1
|
||||||
|
var message = isDisabledMaterial ? '该物料已禁用,此操作将永久删除该物料,是否继续?' : '是否删除?'
|
||||||
|
this.$confirm(message, '提示', {
|
||||||
confirmButtonText: '确定',
|
confirmButtonText: '确定',
|
||||||
cancelButtonText: '取消',
|
cancelButtonText: '取消',
|
||||||
type: 'warning'
|
type: 'warning'
|
||||||
}).then(() => {
|
}).then(() => {
|
||||||
var param = []
|
var param = []
|
||||||
param[0] = ['物料流水号', row.物料流水号]
|
param[0] = ['物料流水号', row.物料流水号]
|
||||||
var Data = this.CreateData('12', '物料管理_删除', param)
|
var Data = this.CreateData('12', isDisabledMaterial ? '物料管理_物理删除' : '物料管理_删除', param) // 修改人:Ld 修改时间:2026-08-03 08:35:00; 已禁用物料确认后执行物理删除
|
||||||
this.ExecDatabase(Data).then(response => {
|
this.ExecDatabase(Data).then(response => {
|
||||||
if (response.data[0].result === '1') {
|
if (response.data[0].result === '1') {
|
||||||
this.$message.success('删除成功')
|
this.$message.success('删除成功')
|
||||||
this.searchTable()
|
this.searchTable()
|
||||||
} else {
|
} else {
|
||||||
this.$message.error('删除失败')
|
this.$message.error(response.data[0].msg || '删除失败')
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}).catch(() => {
|
}).catch(() => {
|
||||||
@@ -1352,6 +1384,31 @@ export default {
|
|||||||
})
|
})
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
|
handleEnable(row) {
|
||||||
|
this.$confirm('是否启用该物料?', '提示', {
|
||||||
|
confirmButtonText: '确定',
|
||||||
|
cancelButtonText: '取消',
|
||||||
|
type: 'warning'
|
||||||
|
}).then(() => {
|
||||||
|
var param = []
|
||||||
|
param[0] = ['物料流水号', row.物料流水号]
|
||||||
|
param[1] = ['操作者', this.id] // 修改人:Ld 修改时间:2026-08-03 08:15:00; 记录禁用物料启用操作人
|
||||||
|
var Data = this.CreateData('12', '物料管理_启用', param)
|
||||||
|
this.ExecDatabase(Data).then(response => {
|
||||||
|
if (response.data[0].result === '1') {
|
||||||
|
this.$message.success('启用成功')
|
||||||
|
this.searchTable()
|
||||||
|
} else {
|
||||||
|
this.$message.error(response.data[0].msg || '启用失败')
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}).catch(() => {
|
||||||
|
this.$message({
|
||||||
|
type: 'info',
|
||||||
|
message: '已取消启用'
|
||||||
|
})
|
||||||
|
})
|
||||||
|
},
|
||||||
// searchTableCS() {
|
// searchTableCS() {
|
||||||
// let materialToolValue_check, materialNameValue_check, materialTypeValue_check, dateRange_check
|
// let materialToolValue_check, materialNameValue_check, materialTypeValue_check, dateRange_check
|
||||||
// this.materialToolValue ? materialToolValue_check = 1 : materialToolValue_check = 0
|
// this.materialToolValue ? materialToolValue_check = 1 : materialToolValue_check = 0
|
||||||
@@ -1377,6 +1434,11 @@ export default {
|
|||||||
// this.total = response.data
|
// this.total = response.data
|
||||||
// })
|
// })
|
||||||
// },
|
// },
|
||||||
|
switchDisabledMaterial() {
|
||||||
|
this.showDisabledMaterial = !this.showDisabledMaterial // 修改人:Ld 修改时间:2026-08-03 07:55:23; 点击按钮切换禁用物料查询口径
|
||||||
|
this.pageCurrent = 1
|
||||||
|
this.searchTable()
|
||||||
|
},
|
||||||
searchTable() {
|
searchTable() {
|
||||||
this.tableData = []
|
this.tableData = []
|
||||||
let materialToolValue_check, materialCodeValue_check, materialNameValue_check, materialTypeValue_check, dateRange_check, checked_check
|
let materialToolValue_check, materialCodeValue_check, materialNameValue_check, materialTypeValue_check, dateRange_check, checked_check
|
||||||
@@ -1410,6 +1472,8 @@ export default {
|
|||||||
param[14] = ['ItemCount', '1111', 'int', '1']
|
param[14] = ['ItemCount', '1111', 'int', '1']
|
||||||
param[15] = ['物料编码_check', materialCodeValue_check]
|
param[15] = ['物料编码_check', materialCodeValue_check]
|
||||||
param[16] = ['物料编码', this.materialCodeValue]
|
param[16] = ['物料编码', this.materialCodeValue]
|
||||||
|
param[17] = ['是否禁用_check', 1] // 修改人:Ld 修改时间:2026-08-03 07:55:23; 查询启用/禁用物料
|
||||||
|
param[18] = ['是否禁用', this.showDisabledMaterial ? 1 : 0] // 修改人:Ld 修改时间:2026-08-03 07:55:23; 查看禁用物料按钮传入禁用状态
|
||||||
var Data = this.CreateData('11', '物料管理_查询数据_分页', param)
|
var Data = this.CreateData('11', '物料管理_查询数据_分页', param)
|
||||||
this.ExecDatabase(Data).then(response => {
|
this.ExecDatabase(Data).then(response => {
|
||||||
this.tableData = response.data.result
|
this.tableData = response.data.result
|
||||||
|
|||||||
@@ -9,6 +9,8 @@
|
|||||||
<el-input v-model="LocationName" style="width: 100px " size="small" clearable placeholder="库位"/>
|
<el-input v-model="LocationName" style="width: 100px " size="small" clearable placeholder="库位"/>
|
||||||
<el-button style="margin-left: 7px;width: 80px" type="primary" plain size="small" @click="pageCurrent=1;searchTable()">查询</el-button>
|
<el-button style="margin-left: 7px;width: 80px" type="primary" plain size="small" @click="pageCurrent=1;searchTable()">查询</el-button>
|
||||||
<el-button type="primary" plain icon="el-icon-upload2" size="small" style="margin-left: 7px" @click="handleExcel()">导入查询</el-button>
|
<el-button type="primary" plain icon="el-icon-upload2" size="small" style="margin-left: 7px" @click="handleExcel()">导入查询</el-button>
|
||||||
|
<!-- 修改人:Ld 修改时间:2026-07-23 09:02:58; 新增库存盘点导入预校验与批量提交入口。 -->
|
||||||
|
<el-button type="warning" plain icon="el-icon-upload" size="small" style="margin-left: 7px" @click="openInventoryImportDialog()">导入盘点</el-button>
|
||||||
<el-button v-if="Number(token) === 2" type="success" plain icon="el-icon-download" size="small" style="margin-left: 7px" @click="exportExcel()">导出</el-button>
|
<el-button v-if="Number(token) === 2" type="success" plain icon="el-icon-download" size="small" style="margin-left: 7px" @click="exportExcel()">导出</el-button>
|
||||||
<el-button type="distribution" size="small" @click="addMaterial()">增加物料存货</el-button>
|
<el-button type="distribution" size="small" @click="addMaterial()">增加物料存货</el-button>
|
||||||
<el-button type="primary" icon="el-icon-printer" style="margin-left: 20px" plain size="small" @click="Pronters()">批量打印</el-button>
|
<el-button type="primary" icon="el-icon-printer" style="margin-left: 20px" plain size="small" @click="Pronters()">批量打印</el-button>
|
||||||
@@ -181,6 +183,48 @@
|
|||||||
<el-button type="primary" size="small" icon="el-icon-search" @click="importExcelSearch">查询</el-button>
|
<el-button type="primary" size="small" icon="el-icon-search" @click="importExcelSearch">查询</el-button>
|
||||||
</div>
|
</div>
|
||||||
</el-dialog>
|
</el-dialog>
|
||||||
|
<!-- 修改人:Ld 修改时间:2026-07-23 09:02:58; 导入盘点变化信息展示和确认提交弹窗。 -->
|
||||||
|
<el-dialog
|
||||||
|
v-el-drag-dialog
|
||||||
|
:visible.sync="dialogFormVisibleInventoryImport"
|
||||||
|
title="导入盘点"
|
||||||
|
center
|
||||||
|
width="1280px">
|
||||||
|
<upload-excel-component @on-selected-file="selectedInventoryImport"/>
|
||||||
|
<div style="margin: 10px 0 0 45px">
|
||||||
|
<span v-show="inventoryImportWorksheet.length > 1" style="cursor: pointer;width: 50px;" @click="removeAllInventoryImport"><i class="el-icon-close"/></span>
|
||||||
|
<el-upload :on-remove="handleRemoveInventoryImport" :file-list="inventoryImportItemFile" style="width: 260px" action=""/>
|
||||||
|
</div>
|
||||||
|
<div style="margin: 12px 0">
|
||||||
|
<el-button type="primary" size="small" icon="el-icon-search" @click="previewInventoryImport">预校验</el-button>
|
||||||
|
<el-button
|
||||||
|
:loading="inventoryImportSubmitting"
|
||||||
|
:disabled="inventoryImportData.length === 0"
|
||||||
|
type="success"
|
||||||
|
size="small"
|
||||||
|
icon="el-icon-check"
|
||||||
|
@click="submitInventoryImport">提交盘点</el-button>
|
||||||
|
<span style="margin-left: 12px;font-size: 13px;color: #606266">{{ inventoryImportSummary }}</span>
|
||||||
|
</div>
|
||||||
|
<el-table :data="inventoryImportData" border stripe size="mini" height="450px">
|
||||||
|
<el-table-column prop="导入序号" label="行号" width="60px" align="center"/>
|
||||||
|
<el-table-column prop="物料编码" label="物料编号" width="130px" align="center" show-overflow-tooltip/>
|
||||||
|
<el-table-column prop="物料名称" label="物料名称" width="160px" align="center" show-overflow-tooltip/>
|
||||||
|
<el-table-column prop="图号或型号" label="图号型号" width="150px" align="center" show-overflow-tooltip/>
|
||||||
|
<el-table-column prop="原货位名称" label="原库位" width="100px" align="center" show-overflow-tooltip/>
|
||||||
|
<el-table-column prop="调整后库位" label="调整后库位" width="120px" align="center" show-overflow-tooltip/>
|
||||||
|
<el-table-column prop="原库存" label="原库存" width="90px" align="center"/>
|
||||||
|
<el-table-column prop="导入库存" label="导入库存" width="90px" align="center"/>
|
||||||
|
<el-table-column prop="盘点库存" label="盘点库存" width="90px" align="center"/>
|
||||||
|
<el-table-column prop="库存变化" label="库存变化" width="90px" align="center"/>
|
||||||
|
<el-table-column prop="库位变化" label="库位变化" width="80px" align="center"/>
|
||||||
|
<el-table-column prop="处理结果" label="处理结果" width="100px" align="center"/>
|
||||||
|
<el-table-column prop="错误原因" label="错误原因" align="center" show-overflow-tooltip/>
|
||||||
|
</el-table>
|
||||||
|
<div slot="footer" class="dialog-footer">
|
||||||
|
<el-button size="small" @click="dialogFormVisibleInventoryImport=false">关闭</el-button>
|
||||||
|
</div>
|
||||||
|
</el-dialog>
|
||||||
<el-dialog v-el-drag-dialog :visible.sync="transferDialogVisible" title="库存调拨" center width="520px">
|
<el-dialog v-el-drag-dialog :visible.sync="transferDialogVisible" title="库存调拨" center width="520px">
|
||||||
<el-form label-position="left" label-width="100px" style="margin: auto">
|
<el-form label-position="left" label-width="100px" style="margin: auto">
|
||||||
<el-row>
|
<el-row>
|
||||||
@@ -329,6 +373,13 @@ export default {
|
|||||||
multipleSelection: [],
|
multipleSelection: [],
|
||||||
itemFile: [],
|
itemFile: [],
|
||||||
worksheet: [],
|
worksheet: [],
|
||||||
|
// 修改人:Ld 修改时间:2026-07-23 09:02:58; 导入盘点独立缓存,避免影响原导入查询功能。
|
||||||
|
dialogFormVisibleInventoryImport: false,
|
||||||
|
inventoryImportItemFile: [],
|
||||||
|
inventoryImportWorksheet: [],
|
||||||
|
inventoryImportData: [],
|
||||||
|
inventoryImportDetailChunks: [],
|
||||||
|
inventoryImportSubmitting: false,
|
||||||
rules: {
|
rules: {
|
||||||
入库数: [{ required: true, message: '请输入入库数' }],
|
入库数: [{ required: true, message: '请输入入库数' }],
|
||||||
产品名称: [{ required: true, message: '请选择产品名称' }]
|
产品名称: [{ required: true, message: '请选择产品名称' }]
|
||||||
@@ -351,7 +402,33 @@ export default {
|
|||||||
...mapGetters([
|
...mapGetters([
|
||||||
'id',
|
'id',
|
||||||
'token'
|
'token'
|
||||||
])
|
]),
|
||||||
|
inventoryImportSummary() {
|
||||||
|
var total = this.inventoryImportData.length
|
||||||
|
var success = 0
|
||||||
|
var fail = 0
|
||||||
|
var needCreate = 0
|
||||||
|
var stockChange = 0
|
||||||
|
var locationChange = 0
|
||||||
|
for (let i = 0; i < this.inventoryImportData.length; i++) {
|
||||||
|
var row = this.inventoryImportData[i]
|
||||||
|
if (row.处理结果 === '可修改' || row.处理结果 === '修改成功' || row.处理结果 === '成功' || row.处理结果 === '需新建库位') {
|
||||||
|
success++
|
||||||
|
} else if (row.处理结果) {
|
||||||
|
fail++
|
||||||
|
}
|
||||||
|
if (row.处理结果 === '需新建库位') {
|
||||||
|
needCreate++
|
||||||
|
}
|
||||||
|
if (row.库存变化 === '是') {
|
||||||
|
stockChange++
|
||||||
|
}
|
||||||
|
if (row.库位变化 === '是') {
|
||||||
|
locationChange++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return '总行数:' + total + ' 成功:' + success + ' 失败:' + fail + ' 需新建库位:' + needCreate + ' 库存变化:' + stockChange + ' 库位变化:' + locationChange
|
||||||
|
}
|
||||||
},
|
},
|
||||||
updated() {
|
updated() {
|
||||||
this.$nextTick(() => {
|
this.$nextTick(() => {
|
||||||
@@ -501,6 +578,254 @@ export default {
|
|||||||
handleExcel() {
|
handleExcel() {
|
||||||
this.dialogFormVisibleExcel = true
|
this.dialogFormVisibleExcel = true
|
||||||
},
|
},
|
||||||
|
// 修改人:Ld 修改时间:2026-07-23 09:02:58; 打开导入盘点弹窗并保留上次预览结果供复核。
|
||||||
|
openInventoryImportDialog() {
|
||||||
|
this.dialogFormVisibleInventoryImport = true
|
||||||
|
},
|
||||||
|
selectedInventoryImport(data) {
|
||||||
|
this.inventoryImportWorksheet = data.worksheet
|
||||||
|
this.inventoryImportItemFile = data.itemFile
|
||||||
|
this.inventoryImportData = []
|
||||||
|
this.inventoryImportDetailChunks = []
|
||||||
|
},
|
||||||
|
handleRemoveInventoryImport(file) {
|
||||||
|
for (let i = 0; i < this.inventoryImportItemFile.length; i++) {
|
||||||
|
if (this.inventoryImportItemFile[i].name === file.name) {
|
||||||
|
this.inventoryImportWorksheet.splice(i, 1)
|
||||||
|
this.inventoryImportItemFile.splice(i, 1)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.inventoryImportData = []
|
||||||
|
this.inventoryImportDetailChunks = []
|
||||||
|
},
|
||||||
|
removeAllInventoryImport() {
|
||||||
|
this.inventoryImportWorksheet = []
|
||||||
|
this.inventoryImportItemFile = []
|
||||||
|
this.inventoryImportData = []
|
||||||
|
this.inventoryImportDetailChunks = []
|
||||||
|
},
|
||||||
|
getInventoryImportColumns(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,
|
||||||
|
codeCol: '',
|
||||||
|
nameCol: '',
|
||||||
|
drawingCol: '',
|
||||||
|
locationCol: '',
|
||||||
|
stockCol: '',
|
||||||
|
checkStockCol: '',
|
||||||
|
remarkCol: ''
|
||||||
|
}
|
||||||
|
for (let row = 1; row <= 10; row++) {
|
||||||
|
var temp = {
|
||||||
|
headerRow: row,
|
||||||
|
codeCol: '',
|
||||||
|
nameCol: '',
|
||||||
|
drawingCol: '',
|
||||||
|
locationCol: '',
|
||||||
|
stockCol: '',
|
||||||
|
checkStockCol: '',
|
||||||
|
remarkCol: ''
|
||||||
|
}
|
||||||
|
for (let i = 0; i < cols.length; i++) {
|
||||||
|
var title = this.getExcelCellValue(sheet, cols[i], row).replace(/\s/g, '')
|
||||||
|
if (title === '物料编号' || title === '物料编码') {
|
||||||
|
temp.codeCol = cols[i]
|
||||||
|
}
|
||||||
|
if (title === '物料名称' || title === '名称' || title === '零件名称') {
|
||||||
|
temp.nameCol = cols[i]
|
||||||
|
}
|
||||||
|
if (title === '图号型号' || title === '图号' || title === '图号或型号' || title === '图号/型号' || title === '规格型号') {
|
||||||
|
temp.drawingCol = cols[i]
|
||||||
|
}
|
||||||
|
if (title === '调整后库位' || title === '库位') {
|
||||||
|
temp.locationCol = cols[i]
|
||||||
|
}
|
||||||
|
if (title === '库存' || title === '库存数') {
|
||||||
|
temp.stockCol = cols[i]
|
||||||
|
}
|
||||||
|
if (title === '盘点库存') {
|
||||||
|
temp.checkStockCol = cols[i]
|
||||||
|
}
|
||||||
|
if (title === '备注') {
|
||||||
|
temp.remarkCol = cols[i]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ((temp.codeCol || temp.nameCol || temp.drawingCol) && temp.locationCol && temp.stockCol) {
|
||||||
|
return temp
|
||||||
|
}
|
||||||
|
if (temp.codeCol || temp.nameCol || temp.drawingCol || temp.locationCol || temp.stockCol) {
|
||||||
|
result = temp
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
},
|
||||||
|
getInventoryImportNumber(value) {
|
||||||
|
var number = Number(String(value || '').replace(/,/g, ''))
|
||||||
|
if (isNaN(number)) {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
return number
|
||||||
|
},
|
||||||
|
getInventoryImportDetail() {
|
||||||
|
var detail = []
|
||||||
|
for (let j = 0; j < this.inventoryImportWorksheet.length; j++) {
|
||||||
|
var sheet = this.inventoryImportWorksheet[j]
|
||||||
|
var columns = this.getInventoryImportColumns(sheet)
|
||||||
|
var emptyCount = 0
|
||||||
|
for (let row = columns.headerRow + 1; row <= 6000; row++) {
|
||||||
|
var materialCode = columns.codeCol ? this.getExcelCellValue(sheet, columns.codeCol, row) : ''
|
||||||
|
var materialName = columns.nameCol ? this.getExcelCellValue(sheet, columns.nameCol, row) : ''
|
||||||
|
var drawing = columns.drawingCol ? this.getExcelCellValue(sheet, columns.drawingCol, row) : ''
|
||||||
|
var location = columns.locationCol ? this.getExcelCellValue(sheet, columns.locationCol, row) : ''
|
||||||
|
var stockText = columns.stockCol ? this.getExcelCellValue(sheet, columns.stockCol, row) : ''
|
||||||
|
var checkStockText = columns.checkStockCol ? this.getExcelCellValue(sheet, columns.checkStockCol, row) : ''
|
||||||
|
var remark = columns.remarkCol ? this.getExcelCellValue(sheet, columns.remarkCol, row) : ''
|
||||||
|
if (!materialCode && !materialName && !drawing && !location && !stockText) {
|
||||||
|
emptyCount++
|
||||||
|
if (emptyCount >= 30) {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
emptyCount = 0
|
||||||
|
detail.push({
|
||||||
|
导入序号: row,
|
||||||
|
物料编码: materialCode,
|
||||||
|
物料名称: materialName,
|
||||||
|
图号或型号: drawing,
|
||||||
|
调整后库位: location,
|
||||||
|
库存: this.getInventoryImportNumber(stockText),
|
||||||
|
盘点库存: this.getInventoryImportNumber(checkStockText),
|
||||||
|
备注: remark
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return detail
|
||||||
|
},
|
||||||
|
getInventoryImportBestDetail(detail) {
|
||||||
|
var detailMap = {}
|
||||||
|
var result = []
|
||||||
|
for (let i = 0; i < detail.length; i++) {
|
||||||
|
var row = detail[i]
|
||||||
|
var code = String(row.物料编码 || '').trim()
|
||||||
|
var name = String(row.物料名称 || '').trim()
|
||||||
|
var drawing = String(row.图号或型号 || '').trim()
|
||||||
|
var key = code ? 'code:' + code : 'name:' + name + '^' + drawing
|
||||||
|
if (!detailMap[key]) {
|
||||||
|
detailMap[key] = row
|
||||||
|
result.push(row)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if (Number(row.库存 || 0) > Number(detailMap[key].库存 || 0)) {
|
||||||
|
var index = result.indexOf(detailMap[key])
|
||||||
|
detailMap[key] = row
|
||||||
|
if (index >= 0) {
|
||||||
|
result.splice(index, 1, row)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
},
|
||||||
|
buildInventoryImportDetailChunks(detail) {
|
||||||
|
var chunks = []
|
||||||
|
var rows = []
|
||||||
|
for (let i = 0; i < detail.length; i++) {
|
||||||
|
rows.push(this.formatInventoryImportRow(detail[i]))
|
||||||
|
if (rows.length >= 500) {
|
||||||
|
chunks.push(rows.join('||'))
|
||||||
|
rows = []
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (rows.length > 0) {
|
||||||
|
chunks.push(rows.join('||'))
|
||||||
|
}
|
||||||
|
return chunks
|
||||||
|
},
|
||||||
|
formatInventoryImportRow(row) {
|
||||||
|
var values = [
|
||||||
|
row.导入序号,
|
||||||
|
row.物料编码,
|
||||||
|
row.物料名称,
|
||||||
|
row.图号或型号,
|
||||||
|
row.调整后库位,
|
||||||
|
row.库存,
|
||||||
|
row.盘点库存,
|
||||||
|
row.备注
|
||||||
|
]
|
||||||
|
for (let i = 0; i < values.length; i++) {
|
||||||
|
values[i] = String(values[i] === undefined || values[i] === null ? '' : values[i]).replace(/\|\|/g, ' ').replace(/\^/g, ' ')
|
||||||
|
}
|
||||||
|
return values.join('^')
|
||||||
|
},
|
||||||
|
requestInventoryImportPreview(index, result) {
|
||||||
|
if (index >= this.inventoryImportDetailChunks.length) {
|
||||||
|
this.inventoryImportData = result
|
||||||
|
this.$message.success('导入盘点预校验完成')
|
||||||
|
return
|
||||||
|
}
|
||||||
|
var param = []
|
||||||
|
param[0] = ['导入明细', this.inventoryImportDetailChunks[index]]
|
||||||
|
var Data = this.CreateData('11', '仓储管理_库存盘点_导入盘点_预校验', param)
|
||||||
|
this.ExecDatabase(Data).then(response => {
|
||||||
|
var rows = response.data.rows || response.data || []
|
||||||
|
result = result.concat(rows)
|
||||||
|
this.requestInventoryImportPreview(index + 1, result)
|
||||||
|
}).catch(() => {
|
||||||
|
this.$message.error('导入盘点预校验失败')
|
||||||
|
})
|
||||||
|
},
|
||||||
|
previewInventoryImport() {
|
||||||
|
var detail = this.getInventoryImportDetail()
|
||||||
|
detail = this.getInventoryImportBestDetail(detail)
|
||||||
|
if (detail.length === 0) {
|
||||||
|
this.$message.warning('请导入包含物料编号、调整后库位和库存的表格')
|
||||||
|
return
|
||||||
|
}
|
||||||
|
this.inventoryImportData = []
|
||||||
|
this.inventoryImportDetailChunks = this.buildInventoryImportDetailChunks(detail)
|
||||||
|
this.requestInventoryImportPreview(0, [])
|
||||||
|
},
|
||||||
|
requestInventoryImportSubmit(index, result) {
|
||||||
|
if (index >= this.inventoryImportDetailChunks.length) {
|
||||||
|
this.inventoryImportData = result
|
||||||
|
this.inventoryImportSubmitting = false
|
||||||
|
this.getLocateName()
|
||||||
|
this.searchTable()
|
||||||
|
this.$message.success('导入盘点提交完成')
|
||||||
|
return
|
||||||
|
}
|
||||||
|
var param = []
|
||||||
|
param[0] = ['导入明细', this.inventoryImportDetailChunks[index]]
|
||||||
|
param[1] = ['操作者', this.id]
|
||||||
|
var Data = this.CreateData('12', '仓储管理_库存盘点_导入盘点_批量提交', param)
|
||||||
|
this.ExecDatabase(Data).then(response => {
|
||||||
|
var rows = response.data.rows || response.data || []
|
||||||
|
result = result.concat(rows)
|
||||||
|
this.requestInventoryImportSubmit(index + 1, result)
|
||||||
|
}).catch(() => {
|
||||||
|
this.inventoryImportSubmitting = false
|
||||||
|
this.$message.error('导入盘点提交失败')
|
||||||
|
})
|
||||||
|
},
|
||||||
|
submitInventoryImport() {
|
||||||
|
if (this.inventoryImportDetailChunks.length === 0) {
|
||||||
|
this.$message.warning('请先预校验导入盘点数据')
|
||||||
|
return
|
||||||
|
}
|
||||||
|
this.$confirm('确认按预校验数据修改库存和库位吗?', '提示', {
|
||||||
|
confirmButtonText: '确定',
|
||||||
|
cancelButtonText: '取消',
|
||||||
|
type: 'warning'
|
||||||
|
}).then(() => {
|
||||||
|
this.inventoryImportSubmitting = true
|
||||||
|
this.requestInventoryImportSubmit(0, [])
|
||||||
|
}).catch(() => {
|
||||||
|
})
|
||||||
|
},
|
||||||
selected(data) {
|
selected(data) {
|
||||||
this.worksheet = data.worksheet
|
this.worksheet = data.worksheet
|
||||||
this.itemFile = data.itemFile
|
this.itemFile = data.itemFile
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="app-container">
|
<div class="app-container">
|
||||||
<el-card style="height: 850px ;display:flex">
|
<el-card style="height: 850px ;display:flex">
|
||||||
<el-col style="width: 930px">
|
<el-col style="width: 930px">
|
||||||
@@ -7,6 +7,8 @@
|
|||||||
<el-input v-model="specificationsValue" style="width:200px" placeholder="名称/规格/型号" size="small" clearable @keyup.enter.native="pageCurrent=1;updateCheck()"/>
|
<el-input v-model="specificationsValue" style="width:200px" placeholder="名称/规格/型号" size="small" clearable @keyup.enter.native="pageCurrent=1;updateCheck()"/>
|
||||||
<!-- <el-button :disabled="disabled1" icon="el-icon-edit" type="primary" style="margin-left: 10px" plain size="small" @click="setUpInventory()">最低库存</el-button> -->
|
<!-- <el-button :disabled="disabled1" icon="el-icon-edit" type="primary" style="margin-left: 10px" plain size="small" @click="setUpInventory()">最低库存</el-button> -->
|
||||||
<el-button :disabled="disabled" type="distribution" icon="el-icon-check" size="small" @click="openOrder()">提交补货</el-button>
|
<el-button :disabled="disabled" type="distribution" icon="el-icon-check" size="small" @click="openOrder()">提交补货</el-button>
|
||||||
|
<!-- 修改人:Ld 修改时间:2026-08-03 16:35:25; 新增关联合同补货入口,原提交补货按钮不变。 -->
|
||||||
|
<el-button :disabled="disabled" type="warning" plain icon="el-icon-connection" size="small" @click="openLinkedOrder()">关联合同补货</el-button>
|
||||||
<el-checkbox v-model="checked" style="margin-left: 40px" @change="updateCheck">自制补货</el-checkbox>
|
<el-checkbox v-model="checked" style="margin-left: 40px" @change="updateCheck">自制补货</el-checkbox>
|
||||||
<el-badge :value="numberReturnedItems" class="item">
|
<el-badge :value="numberReturnedItems" class="item">
|
||||||
<el-button type="text" size="small" style="margin-left: 70px" @click="viewReturnedContracts()">打回通知</el-button>
|
<el-button type="text" size="small" style="margin-left: 70px" @click="viewReturnedContracts()">打回通知</el-button>
|
||||||
@@ -68,7 +70,8 @@
|
|||||||
width="400"
|
width="400"
|
||||||
trigger="click"
|
trigger="click"
|
||||||
@show="getDemandDetail(scope.row)">
|
@show="getDemandDetail(scope.row)">
|
||||||
<el-table :data="demandDetailData" border stripe size="mini" max-height="300" v-loading="demandDetailLoading">
|
<!-- 修改人:Ld 修改时间:2026-08-03 16:44:10; 调整属性顺序以通过单文件模板校验。 -->
|
||||||
|
<el-table v-loading="demandDetailLoading" :data="demandDetailData" border stripe size="mini" max-height="300">
|
||||||
<el-table-column prop="订单编号" label="订单号" align="center" show-overflow-tooltip/>
|
<el-table-column prop="订单编号" label="订单号" align="center" show-overflow-tooltip/>
|
||||||
<el-table-column prop="最终需求量" label="需求量" align="center"/>
|
<el-table-column prop="最终需求量" label="需求量" align="center"/>
|
||||||
<el-table-column prop="简称" label="客户" align="center"/>
|
<el-table-column prop="简称" label="客户" align="center"/>
|
||||||
@@ -207,6 +210,84 @@
|
|||||||
<el-button type="primary" @click="submitOrder()">确 定</el-button>
|
<el-button type="primary" @click="submitOrder()">确 定</el-button>
|
||||||
</div>
|
</div>
|
||||||
</el-dialog>
|
</el-dialog>
|
||||||
|
<!-- 修改人:Ld 修改时间:2026-08-03 16:35:25; 新增合同缺件/仓库备货补货来源弹窗。 -->
|
||||||
|
<el-dialog v-el-drag-dialog :visible.sync="dialogFormVisibleLink" title="关联合同补货" center width="760px">
|
||||||
|
<el-form label-position="right" label-width="95px" size="small">
|
||||||
|
<el-form-item label="补货来源">
|
||||||
|
<el-radio-group v-model="linkForm.来源类型" @change="changeLinkSource">
|
||||||
|
<el-radio-button label="合同缺件">合同零件不足</el-radio-button>
|
||||||
|
<el-radio-button label="仓库备货">仓库备货</el-radio-button>
|
||||||
|
</el-radio-group>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item v-if="linkForm.来源类型 === '合同缺件'" label="合同查询">
|
||||||
|
<el-input v-model="linkForm.关键字" clearable placeholder="合同编号 / 客户 / 订单编号" style="width: 360px" @keyup.enter.native="searchLinkContract"/>
|
||||||
|
<el-button type="primary" plain icon="el-icon-search" style="margin-left: 8px" @click="searchLinkContract">查询</el-button>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item v-if="linkForm.来源类型 === '合同缺件'" label="查询结果">
|
||||||
|
<el-table
|
||||||
|
v-loading="linkContractLoading"
|
||||||
|
:data="linkContractList"
|
||||||
|
border
|
||||||
|
highlight-current-row
|
||||||
|
size="mini"
|
||||||
|
max-height="220"
|
||||||
|
style="width: 620px"
|
||||||
|
@row-click="selectLinkContract">
|
||||||
|
<el-table-column width="130px" label="合同编号" align="center" show-overflow-tooltip>
|
||||||
|
<template slot-scope="scope">
|
||||||
|
{{ scope.row.合同编号 }}
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column width="150px" label="客户" align="center" show-overflow-tooltip>
|
||||||
|
<template slot-scope="scope">
|
||||||
|
{{ scope.row.客户名称 || scope.row.客户简称 }}
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column width="150px" label="订单编号" align="center" show-overflow-tooltip>
|
||||||
|
<template slot-scope="scope">
|
||||||
|
{{ scope.row.订单编号 }}
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="交货日期" align="center">
|
||||||
|
<template slot-scope="scope">
|
||||||
|
{{ scope.row.交货日期 }}
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
</el-table>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item v-if="linkForm.来源类型 === '合同缺件'" label="已选择">
|
||||||
|
<el-tag v-if="linkForm.项目流水号" type="success">
|
||||||
|
{{ linkForm.合同编号 }} / {{ linkForm.客户名称 }} / {{ linkForm.订单编号 || '未选订单' }}
|
||||||
|
</el-tag>
|
||||||
|
<span v-else style="color: #909399">请选择要关联的销售合同或订单</span>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item v-if="linkForm.来源类型 === '仓库备货'" label="备货合同">
|
||||||
|
<!-- 修改人:Ld 修改时间:2026-08-04 08:29:13; 仓库备货改为提交时自动生成CKBH前缀合同。 -->
|
||||||
|
<el-tag type="warning">自动生成CKBH合同</el-tag>
|
||||||
|
<span style="margin-left: 10px;color: #909399">提交后生成独立仓库备货合同,收货人为仓库、单价为0</span>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="补货期限">
|
||||||
|
<el-date-picker
|
||||||
|
v-model="linkForm.补货期限"
|
||||||
|
value-format="yyyy-MM-dd"
|
||||||
|
format="yyyy-MM-dd"
|
||||||
|
placeholder="选择日期"
|
||||||
|
style="width: 220px"/>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="订单备注">
|
||||||
|
<el-input
|
||||||
|
:rows="3"
|
||||||
|
v-model="linkForm.订单备注"
|
||||||
|
type="textarea"
|
||||||
|
placeholder="请输入补货原因或备货说明"
|
||||||
|
style="width: 520px"/>
|
||||||
|
</el-form-item>
|
||||||
|
</el-form>
|
||||||
|
<div slot="footer" class="dialog-footer">
|
||||||
|
<el-button size="small" @click="dialogFormVisibleLink=false">取 消</el-button>
|
||||||
|
<el-button type="primary" size="small" @click="submitLinkedOrder">确 定</el-button>
|
||||||
|
</div>
|
||||||
|
</el-dialog>
|
||||||
<el-dialog v-el-drag-dialog :visible.sync="dialogFormVisible2" title="上传图片" center style="height: 800px" width="30%">
|
<el-dialog v-el-drag-dialog :visible.sync="dialogFormVisible2" title="上传图片" center style="height: 800px" width="30%">
|
||||||
<el-upload
|
<el-upload
|
||||||
id="invoiceScan"
|
id="invoiceScan"
|
||||||
@@ -319,6 +400,21 @@ export default {
|
|||||||
pageSize: 20, // 分页每页显示条数
|
pageSize: 20, // 分页每页显示条数
|
||||||
orderName: '', // 排序列名
|
orderName: '', // 排序列名
|
||||||
order: '', // 排序方式
|
order: '', // 排序方式
|
||||||
|
// 修改人:Ld 修改时间:2026-08-03 16:35:25; 关联合同补货弹窗数据,独立于原补货提交。
|
||||||
|
dialogFormVisibleLink: false,
|
||||||
|
linkContractLoading: false,
|
||||||
|
linkContractList: [],
|
||||||
|
linkForm: {
|
||||||
|
来源类型: '合同缺件',
|
||||||
|
关键字: '',
|
||||||
|
项目流水号: '',
|
||||||
|
订单流水号: '',
|
||||||
|
合同编号: '',
|
||||||
|
客户名称: '',
|
||||||
|
订单编号: '',
|
||||||
|
补货期限: '',
|
||||||
|
订单备注: ''
|
||||||
|
},
|
||||||
demandDetailData: [],
|
demandDetailData: [],
|
||||||
demandDetailLoading: false
|
demandDetailLoading: false
|
||||||
}
|
}
|
||||||
@@ -456,6 +552,67 @@ export default {
|
|||||||
this.finishTime = ''
|
this.finishTime = ''
|
||||||
this.dialogFormVisible1 = true
|
this.dialogFormVisible1 = true
|
||||||
},
|
},
|
||||||
|
// 修改人:Ld 修改时间:2026-08-03 16:35:25; 打开关联合同补货弹窗,不影响原 openOrder。
|
||||||
|
openLinkedOrder() {
|
||||||
|
this.resetLinkForm()
|
||||||
|
this.dialogFormVisibleLink = true
|
||||||
|
},
|
||||||
|
// 修改人:Ld 修改时间:2026-08-03 16:35:25; 重置关联合同补货表单。
|
||||||
|
resetLinkForm() {
|
||||||
|
this.linkContractList = []
|
||||||
|
this.linkContractLoading = false
|
||||||
|
this.linkForm = {
|
||||||
|
来源类型: '合同缺件',
|
||||||
|
关键字: '',
|
||||||
|
项目流水号: '',
|
||||||
|
订单流水号: '',
|
||||||
|
合同编号: '',
|
||||||
|
客户名称: '',
|
||||||
|
订单编号: '',
|
||||||
|
补货期限: '',
|
||||||
|
订单备注: ''
|
||||||
|
}
|
||||||
|
},
|
||||||
|
// 修改人:Ld 修改时间:2026-08-03 16:35:25; 切换补货来源时清理已选择合同。
|
||||||
|
changeLinkSource() {
|
||||||
|
this.linkContractList = []
|
||||||
|
this.linkForm.关键字 = ''
|
||||||
|
this.linkForm.项目流水号 = ''
|
||||||
|
this.linkForm.订单流水号 = ''
|
||||||
|
this.linkForm.合同编号 = ''
|
||||||
|
this.linkForm.客户名称 = ''
|
||||||
|
this.linkForm.订单编号 = ''
|
||||||
|
},
|
||||||
|
// 修改人:Ld 修改时间:2026-08-03 16:35:25; 查询可关联销售合同/订单。
|
||||||
|
searchLinkContract() {
|
||||||
|
this.linkContractLoading = true
|
||||||
|
var param = []
|
||||||
|
// 修改人:Ld 修改时间:2026-08-03 17:01:30; 后端通用入口按过程参数解析,查询过程入参全部传递,避免返回 result=0。
|
||||||
|
param[0] = ['关键字', this.linkForm.关键字]
|
||||||
|
param[1] = ['合同编号', '']
|
||||||
|
param[2] = ['客户', '']
|
||||||
|
param[3] = ['订单编号', '']
|
||||||
|
var Data = this.CreateData('11', '仓储管理_补货关联合同_查询数据', param)
|
||||||
|
this.ExecDatabase(Data).then(response => {
|
||||||
|
if (response.data[0] && response.data[0].result === '0') {
|
||||||
|
this.linkContractList = []
|
||||||
|
this.$message.error('合同查询失败,请确认当前为测试环境')
|
||||||
|
} else {
|
||||||
|
this.linkContractList = response.data
|
||||||
|
}
|
||||||
|
this.linkContractLoading = false
|
||||||
|
}).catch(() => {
|
||||||
|
this.linkContractLoading = false
|
||||||
|
})
|
||||||
|
},
|
||||||
|
// 修改人:Ld 修改时间:2026-08-03 16:35:25; 选择补货要挂靠的销售合同/订单。
|
||||||
|
selectLinkContract(row) {
|
||||||
|
this.linkForm.项目流水号 = row.项目流水号
|
||||||
|
this.linkForm.订单流水号 = row.订单流水号 || ''
|
||||||
|
this.linkForm.合同编号 = row.合同编号 || ''
|
||||||
|
this.linkForm.客户名称 = row.客户名称 || row.客户简称 || ''
|
||||||
|
this.linkForm.订单编号 = row.订单编号 || ''
|
||||||
|
},
|
||||||
handlePicture(row) {
|
handlePicture(row) {
|
||||||
this.dialogFormVisible2 = true
|
this.dialogFormVisible2 = true
|
||||||
this.replenishmentOrderId = row.补货单明细中间表流水号
|
this.replenishmentOrderId = row.补货单明细中间表流水号
|
||||||
@@ -498,6 +655,41 @@ export default {
|
|||||||
this.$message.warning('请选择补货期限')
|
this.$message.warning('请选择补货期限')
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
// 修改人:Ld 修改时间:2026-08-03 16:35:25; 提交带合同/仓库备货来源的补货单,原 submitOrder 不变。
|
||||||
|
submitLinkedOrder() {
|
||||||
|
if (this.linkForm.来源类型 === '合同缺件' && !this.linkForm.项目流水号) {
|
||||||
|
this.$message.warning('请选择关联销售合同')
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if (!this.linkForm.补货期限) {
|
||||||
|
this.$message.warning('请选择补货期限')
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if (this.linkForm.来源类型 === '仓库备货' && !this.linkForm.订单备注) {
|
||||||
|
this.$message.warning('请填写仓库备货说明')
|
||||||
|
return
|
||||||
|
}
|
||||||
|
let check
|
||||||
|
this.checked ? check = 0 : check = 1
|
||||||
|
var param = []
|
||||||
|
param[0] = ['是否外购', check]
|
||||||
|
param[1] = ['操作者', this.id]
|
||||||
|
param[2] = ['补货期限', this.linkForm.补货期限]
|
||||||
|
param[3] = ['订单备注', this.linkForm.订单备注]
|
||||||
|
param[4] = ['来源类型', this.linkForm.来源类型]
|
||||||
|
param[5] = ['项目流水号', this.linkForm.项目流水号 || 0]
|
||||||
|
param[6] = ['订单流水号', this.linkForm.订单流水号 || 0]
|
||||||
|
var Data = this.CreateData('12', '报缺补货_提交_关联合同', param)
|
||||||
|
this.ExecDatabase(Data).then(response => {
|
||||||
|
if (response.data[0].result === '1') {
|
||||||
|
this.$message.success('提交成功')
|
||||||
|
this.dialogFormVisibleLink = false
|
||||||
|
this.updateCheck()
|
||||||
|
} else {
|
||||||
|
this.$message.error(response.data[0].message || '提交失败')
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
selectIn(row) {
|
selectIn(row) {
|
||||||
if (row.补货数 !== 0 && row.补货数 !== undefined) {
|
if (row.补货数 !== 0 && row.补货数 !== undefined) {
|
||||||
let check
|
let check
|
||||||
|
|||||||
1296
src/views/WarehouseManagement/WarehouseRoomManagement/index.vue
Normal file
@@ -139,7 +139,7 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- 立库可视化区域 -->
|
<!-- 立库可视化区域 -->
|
||||||
<div v-loading="loading" style="height: 600px; overflow: auto; border: 1px solid #e4e7ed; border-radius: 4px; padding: 15px; background: #f5f7fa">
|
<div v-loading="loading" style="height: 600px; overflow:hidden; border: 1px solid #e4e7ed; border-radius: 4px; padding: 15px; background: #f5f7fa">
|
||||||
<!-- 数据为空提示 -->
|
<!-- 数据为空提示 -->
|
||||||
<div v-if="warehouseData.length === 0" style="text-align: center; padding: 100px; color: #909399">
|
<div v-if="warehouseData.length === 0" style="text-align: center; padding: 100px; color: #909399">
|
||||||
<!-- <el-empty description="暂无立库数据">
|
<!-- <el-empty description="暂无立库数据">
|
||||||
@@ -155,7 +155,7 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- 立库表格 -->
|
<!-- 立库表格 -->
|
||||||
<div style="overflow-x: auto; margin-bottom: 30px">
|
<div style=" margin-bottom: 30px">
|
||||||
<table class="warehouse-table">
|
<table class="warehouse-table">
|
||||||
<!-- 列标题 -->
|
<!-- 列标题 -->
|
||||||
<thead>
|
<thead>
|
||||||
|
|||||||
@@ -642,11 +642,11 @@ export default {
|
|||||||
if (this.multipleSelection.length !== 1) {
|
if (this.multipleSelection.length !== 1) {
|
||||||
for (let i = 0; i < this.multipleSelection.length; i++) {
|
for (let i = 0; i < this.multipleSelection.length; i++) {
|
||||||
if (i === 0) {
|
if (i === 0) {
|
||||||
time = this.multipleSelection[i].入库日期
|
// time = this.multipleSelection[i].入库日期
|
||||||
number = this.multipleSelection[i].供应商
|
number = this.multipleSelection[i].供应商
|
||||||
caigou = this.multipleSelection[i].采购合同编号
|
caigou = this.multipleSelection[i].采购合同编号
|
||||||
} else {
|
} else {
|
||||||
if (time !== this.multipleSelection[i].入库日期 || number !== this.multipleSelection[i].供应商 || caigou !== this.multipleSelection[i].采购合同编号) {
|
if ( number !== this.multipleSelection[i].供应商 || caigou !== this.multipleSelection[i].采购合同编号) {
|
||||||
return 1
|
return 1
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,35 @@
|
|||||||
<template>
|
<template>
|
||||||
<el-card style="min-height:calc(100vh - 84px);background: rgb(236,243,250);background-size:100% 100%">
|
<el-card style="min-height:calc(100vh - 84px);background: rgb(236,243,250);background-size:100% 100%">
|
||||||
<div class="dashboard-container">
|
<!-- 修改人:Ld 修改时间:2026-07-30 13:45:14; 移动端首页只展示已适配移动端的功能入口,侧边栏保持原逻辑不变。 -->
|
||||||
|
<div v-if="isMobileDashboard" class="mobile-dashboard-container">
|
||||||
|
<div class="mobile-user-card">
|
||||||
|
<svg-icon icon-class="username" class="mobile-user-icon"/>
|
||||||
|
<div>
|
||||||
|
<div class="mobile-user-name">{{ name }}</div>
|
||||||
|
<div class="mobile-user-subtitle">移动端功能</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="mobile-module-grid">
|
||||||
|
<router-link
|
||||||
|
v-for="item in mobileModules"
|
||||||
|
:key="item.id"
|
||||||
|
:to="item.path"
|
||||||
|
class="mobile-module-card">
|
||||||
|
<div class="mobile-module-icon">
|
||||||
|
<svg-icon :icon-class="item.icon || 'doc'"/>
|
||||||
|
</div>
|
||||||
|
<div class="mobile-module-content">
|
||||||
|
<strong>{{ item.title }}</strong>
|
||||||
|
<span>{{ item.desc }}</span>
|
||||||
|
</div>
|
||||||
|
<i class="el-icon-arrow-right"/>
|
||||||
|
</router-link>
|
||||||
|
</div>
|
||||||
|
<div v-if="mobileModules.length === 0" class="mobile-empty">
|
||||||
|
当前角色暂无已适配移动端的功能
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div v-else class="dashboard-container">
|
||||||
<div class="sudoku_row" >
|
<div class="sudoku_row" >
|
||||||
<svg-icon icon-class="人员" style="width: 35px;height: 35px"/>
|
<svg-icon icon-class="人员" style="width: 35px;height: 35px"/>
|
||||||
<div class="dashboard-text" style="color:black">/{{ name }}</div>
|
<div class="dashboard-text" style="color:black">/{{ name }}</div>
|
||||||
@@ -51,8 +80,27 @@ export default {
|
|||||||
computed: {
|
computed: {
|
||||||
...mapGetters([
|
...mapGetters([
|
||||||
'name',
|
'name',
|
||||||
'token'
|
'token',
|
||||||
])
|
'device'
|
||||||
|
]),
|
||||||
|
// 修改人:Ld 修改时间:2026-07-30 13:45:14; 根据 Layout 的设备判断切换移动端首页内容。
|
||||||
|
isMobileDashboard() {
|
||||||
|
return this.device === 'mobile'
|
||||||
|
},
|
||||||
|
// 修改人:Ld 修改时间:2026-07-30 13:45:14; 仅展示当前角色菜单中已经做了移动端页面的入口。
|
||||||
|
mobileModules() {
|
||||||
|
var mobileModuleDesc = {
|
||||||
|
'SeikoWorkshop/WorkshopAssignmentMobile': '车间现场派工、取消派工和工序查看',
|
||||||
|
'PurchasingManagement/PurchaseInboundCreateMobile': '采购合同到货录入和入库单提交'
|
||||||
|
}
|
||||||
|
return this.sons.filter(function(item) {
|
||||||
|
return mobileModuleDesc[item.path] || item.title.indexOf('移动端') > -1 || item.path.indexOf('Mobile') > -1
|
||||||
|
}).map(function(item) {
|
||||||
|
return Object.assign({}, item, {
|
||||||
|
desc: mobileModuleDesc[item.path] || '移动端自适应页面'
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
},
|
},
|
||||||
mounted() {
|
mounted() {
|
||||||
this.getFileList()
|
this.getFileList()
|
||||||
@@ -232,6 +280,111 @@ export default {
|
|||||||
line-height: 46px;
|
line-height: 46px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* 修改人:Ld 修改时间:2026-07-30 13:45:14; 首页移动端功能入口样式,避免沿用桌面宫格宽度。 */
|
||||||
|
.mobile-dashboard-container {
|
||||||
|
min-height: calc(100vh - 84px);
|
||||||
|
padding: 12px;
|
||||||
|
background: #f4f7fb;
|
||||||
|
}
|
||||||
|
|
||||||
|
.mobile-user-card {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 10px;
|
||||||
|
padding: 12px;
|
||||||
|
border: 1px solid #d8e1ec;
|
||||||
|
border-radius: 8px;
|
||||||
|
background: #fff;
|
||||||
|
}
|
||||||
|
|
||||||
|
.mobile-user-icon {
|
||||||
|
width: 32px;
|
||||||
|
height: 32px;
|
||||||
|
color: #409eff;
|
||||||
|
}
|
||||||
|
|
||||||
|
.mobile-user-name {
|
||||||
|
color: #1f2d3d;
|
||||||
|
font-size: 18px;
|
||||||
|
font-weight: 700;
|
||||||
|
}
|
||||||
|
|
||||||
|
.mobile-user-subtitle {
|
||||||
|
margin-top: 4px;
|
||||||
|
color: #8492a6;
|
||||||
|
font-size: 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.mobile-module-grid {
|
||||||
|
display: grid;
|
||||||
|
gap: 10px;
|
||||||
|
margin-top: 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.mobile-module-card {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 10px;
|
||||||
|
min-width: 0;
|
||||||
|
padding: 12px;
|
||||||
|
border: 1px solid #d8e1ec;
|
||||||
|
border-radius: 8px;
|
||||||
|
background: #fff;
|
||||||
|
color: inherit;
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.mobile-module-icon {
|
||||||
|
display: flex;
|
||||||
|
flex: 0 0 40px;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
width: 40px;
|
||||||
|
height: 40px;
|
||||||
|
border-radius: 8px;
|
||||||
|
background: #ecf5ff;
|
||||||
|
color: #409eff;
|
||||||
|
}
|
||||||
|
|
||||||
|
.mobile-module-icon .svg-icon {
|
||||||
|
width: 24px;
|
||||||
|
height: 24px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.mobile-module-content {
|
||||||
|
min-width: 0;
|
||||||
|
flex: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.mobile-module-content strong {
|
||||||
|
display: block;
|
||||||
|
overflow: hidden;
|
||||||
|
color: #1f2d3d;
|
||||||
|
font-size: 15px;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
white-space: nowrap;
|
||||||
|
}
|
||||||
|
|
||||||
|
.mobile-module-content span {
|
||||||
|
display: block;
|
||||||
|
margin-top: 5px;
|
||||||
|
overflow: hidden;
|
||||||
|
color: #8492a6;
|
||||||
|
font-size: 12px;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
white-space: nowrap;
|
||||||
|
}
|
||||||
|
|
||||||
|
.mobile-empty {
|
||||||
|
margin-top: 12px;
|
||||||
|
padding: 24px 12px;
|
||||||
|
border: 1px dashed #c0c4cc;
|
||||||
|
border-radius: 8px;
|
||||||
|
background: #fff;
|
||||||
|
color: #909399;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
<style>
|
<style>
|
||||||
.el-badge__content {
|
.el-badge__content {
|
||||||
|
|||||||
@@ -3,7 +3,8 @@ export const name_config = `OP8888`
|
|||||||
export const name1_config = `OP1000`
|
export const name1_config = `OP1000`
|
||||||
export const name3_config = `OP2000`
|
export const name3_config = `OP2000`
|
||||||
export const name4_config = `OP9999`
|
export const name4_config = `OP9999`
|
||||||
//
|
|
||||||
|
// 修改人:Ld 修改时间:2026-08-03 16:53:10; 方案一当前仅部署测试库,前端接口切换到测试环境以匹配新增存储过程。
|
||||||
var url = `http://192.168.1.27:8030` // 测试环境 接口端口号 http://192.168.1.27:8031 测试环境管理系统 用户名称:0001 密码:654321
|
var url = `http://192.168.1.27:8030` // 测试环境 接口端口号 http://192.168.1.27:8031 测试环境管理系统 用户名称:0001 密码:654321
|
||||||
// var url = `http://192.168.1.27:8010` // 正式环境 接口端口号 http://192.168.1.27:8001 正式环境管理系统 用户名称:0000 密码:0000
|
// var url = `http://192.168.1.27:8010` // 正式环境 接口端口号 http://192.168.1.27:8001 正式环境管理系统 用户名称:0000 密码:0000
|
||||||
var url1 = `http://192.168.1.27:10006` // 立库数据库的接口端口号
|
var url1 = `http://192.168.1.27:10006` // 立库数据库的接口端口号
|
||||||
@@ -42,4 +43,4 @@ export const MESDeleteFileNew_config = url + `/submit/MESDeleteFile.ashx`
|
|||||||
export const MESUploadFileNew_BasePath_config = `D:\\\\ImageSave`
|
export const MESUploadFileNew_BasePath_config = `D:\\\\ImageSave`
|
||||||
|
|
||||||
export const request_config = url + `/submit/MESCommonBase.ashx`
|
export const request_config = url + `/submit/MESCommonBase.ashx`
|
||||||
export const request_config1 = url1 + `/submit/MESCommonBase.ashx`
|
export const request_config1 = url1 + `/submit/MESCommonBase.ashx`
|
||||||
|
|||||||