diff --git a/db-migration-original/material-apply-8090北京/material.db b/db-migration-original/material-apply-8090北京/material.db new file mode 100644 index 00000000..c9cf4b4e Binary files /dev/null and b/db-migration-original/material-apply-8090北京/material.db differ diff --git a/db-migration-original/material-apply-8090北京/material.db-shm b/db-migration-original/material-apply-8090北京/material.db-shm new file mode 100644 index 00000000..c883ef4b Binary files /dev/null and b/db-migration-original/material-apply-8090北京/material.db-shm differ diff --git a/db-migration-original/material-apply-8090北京/material.db-wal b/db-migration-original/material-apply-8090北京/material.db-wal new file mode 100644 index 00000000..f93de1e7 Binary files /dev/null and b/db-migration-original/material-apply-8090北京/material.db-wal differ diff --git a/db-migration-original/material-apply武汉/material.db b/db-migration-original/material-apply武汉/material.db new file mode 100644 index 00000000..c1308b72 Binary files /dev/null and b/db-migration-original/material-apply武汉/material.db differ diff --git a/db-migration-original/material-apply武汉/material.db-shm b/db-migration-original/material-apply武汉/material.db-shm new file mode 100644 index 00000000..a05b847b Binary files /dev/null and b/db-migration-original/material-apply武汉/material.db-shm differ diff --git a/db-migration-original/material-apply武汉/material.db-wal b/db-migration-original/material-apply武汉/material.db-wal new file mode 100644 index 00000000..a7ec73f5 Binary files /dev/null and b/db-migration-original/material-apply武汉/material.db-wal differ diff --git a/db-migration-original/material-apply武汉/material.db.bak-20260911-071133 b/db-migration-original/material-apply武汉/material.db.bak-20260911-071133 new file mode 100644 index 00000000..2a75e6e3 Binary files /dev/null and b/db-migration-original/material-apply武汉/material.db.bak-20260911-071133 differ diff --git a/db-migration-original/material-apply武汉/material.db.before-pass2-20260911-170128 b/db-migration-original/material-apply武汉/material.db.before-pass2-20260911-170128 new file mode 100644 index 00000000..d49c245a Binary files /dev/null and b/db-migration-original/material-apply武汉/material.db.before-pass2-20260911-170128 differ diff --git a/db-migration-original/material-apply武汉/material.db.before-renumber-20260911-165522 b/db-migration-original/material-apply武汉/material.db.before-renumber-20260911-165522 new file mode 100644 index 00000000..a2d38979 Binary files /dev/null and b/db-migration-original/material-apply武汉/material.db.before-renumber-20260911-165522 differ diff --git a/docs/api.md b/docs/api.md index 5913efdf..26195931 100644 --- a/docs/api.md +++ b/docs/api.md @@ -182,6 +182,8 @@ "material_image": "/uploads/bolt.png", "spec": "M8x30", "manufacturer_model": "GB/T 70.1", + "source": "外购", + "remark": "常用标准件", "supplier_id": 21, "manufacturer_id": 22, "supplier_name": "示例供应商", @@ -203,7 +205,7 @@ } ``` -`material_image`、`spec`、`manufacturer_model`、`supplier_id`、`manufacturer_id`、`category_id`、`base_unit_id`、`unit` 为空时**不会出现在响应里**(后端 `omitempty`),前端取值时需要做空值兜底。`manufacturer_model` 是制造商为产品指定的型号或订货识别型号;`spec` 表示物料规格,`manufacturer_id` 表示制造商伙伴关联。`supplier_name` 和 `manufacturer_name` 是伙伴显示名称。 +`material_image`、`spec`、`manufacturer_model`、`source`、`remark`、`supplier_id`、`manufacturer_id`、`category_id`、`base_unit_id`、`unit` 为空时**不会出现在响应里**(后端 `omitempty`),前端取值时需要做空值兜底。`source` 可为空,非空时仅为「外购」或「外协」;`remark` 可为空且最多 200 字。`manufacturer_model` 是制造商为产品指定的型号或订货识别型号;`spec` 表示物料规格,`manufacturer_id` 表示制造商伙伴关联。`supplier_name` 和 `manufacturer_name` 是伙伴显示名称。 **状态码:** @@ -244,6 +246,8 @@ "name": "内六角螺栓", "spec": "M8x30", "manufacturer_model": "GB/T 70.1", + "source": "外购", + "remark": "常用标准件", "category_id": 12, "base_unit_id": 3, "unit": "个", @@ -260,6 +264,8 @@ | category_id | integer | 是 | 小类分类 ID,必须大于 0 且真实存在 | | spec | string | 否 | 规格 | | manufacturer_model| string | 否 | 制造商为产品指定的型号或订货识别型号 | +| source | string | 否 | 来源,可留空;非空时填写「外购」或「外协」 | +| remark | string | 否 | 备注,可留空,最多 200 字 | | base_unit_id | integer | 否 | 基本计量单位 ID | | unit | string | 否 | 单位编码(冗余展示字段) | | material_image | string | 否 | 图片地址 | @@ -322,6 +328,8 @@ | name | string | 否 | 物料名称 | | spec | string | 否 | 规格 | | manufacturer_model| string | 否 | 制造商为产品指定的型号或订货识别型号 | +| source | string | 否 | 来源,可留空;传空字符串清空;非空时填写「外购」或「外协」 | +| remark | string | 否 | 备注,可留空;传空字符串清空;最多 200 字 | | base_unit_id | integer | 否 | 基本计量单位 ID | | unit | string | 否 | 单位编码 | | material_image | string | 否 | 图片地址 | @@ -421,13 +429,13 @@ | 工作表 | 内容 | |--------|------| | 填写说明 | 字段规则、填写与上传步骤、容量限制、整批校验、重复检测规则和参考示例 | -| 物料数据 | 第 1 行是冻结表头,从第 2 行填写;七列采用文本格式,数据页不放示例物料 | +| 物料数据 | 第 1 行是冻结表头,从第 2 行填写;九列采用文本格式,数据页不放示例物料 | -`物料数据` 的表头是 7 列:`物料名称`、`规格`、`单位`、`供应商`、`制造商`、`大类`、`小类`。解析时**按列名定位,不按列位置**: +`物料数据` 的表头是 9 列:`物料名称`、`规格`、`单位`、`供应商`、`制造商`、`来源`、`备注`、`大类`、`小类`。解析时**按列名定位,不按列位置**: - 列顺序可以随意调整;表头允许带首尾空格和末尾的 `*` 必填标记;不认识的列忽略; - 必填列 `物料名称`、`大类`、`小类` 缺任何一列,判为模板不合法并返回「模板格式不正确,请重新下载最新模板」; -- 选填列 `规格`、`单位`、`供应商`、`制造商` 可以整列删掉,取值按空处理。 +- 选填列 `规格`、`单位`、`供应商`、`制造商`、`来源`、`备注` 可以整列删掉,取值按空处理;来源只能为「外购」或「外协」,备注最多 200 字。 分类**按名称**填写;名称之外也接受**编码**和界面上的「编码 名称」写法(界面一律显示成 `A 机械结构类`,用户整段照抄进模板是常事)。后端按「大类 + 小类」在本公司内组合匹配(小类名在一个公司内会重名,例如多个大类下都有「其他」,所以必须两级组合)。名称、编码、「编码 名称」三种写法同名或同码时以**名称**优先。单位按名称匹配,同时兼容按编码匹配(如 `kg` 与 `千克`)。 @@ -1274,6 +1282,12 @@ --- +## 操作日志 + +`GET /logs` 与 `GET /logs/materials/:materialId` 的物料日志对象包含 `operator`(操作人名称)和 `operator_id`(操作人用户 ID)。新产生的登录用户操作会从同一条 `users` 记录写入 ID 和 username,确保两者匹配;旧日志和系统生成日志的 `operator_id` 可为 `null`。前端可用用户 ID 区分同名操作人。 + +--- + ## 状态码汇总 | 状态码 | 说明 | diff --git a/docs/数据库表结构与关系说明.md b/docs/数据库表结构与关系说明.md index 7fcaa50a..2563dcce 100644 --- a/docs/数据库表结构与关系说明.md +++ b/docs/数据库表结构与关系说明.md @@ -1,6 +1,6 @@ # 物料管理系统数据库表说明 -更新时间:2026-10-12。本文前半部分保留已有库的结构说明;第 11 节说明公司隔离升级后的运行结构。表数量随升级增加审计、迁移版本及对账表,以目标库 `information_schema` 查询为准。 +更新时间:2026-10-14。本文前半部分保留已有库的结构说明;第 11 节说明公司隔离升级后的运行结构。表数量随升级增加审计、迁移版本及对账表,以目标库 `information_schema` 查询为准。 本文按照“表、保存什么、主要字段”介绍每张表的作用,后面单独列出表之间的关系。公司隔离发布使用 `scripts/init.sql`(空库)或 `scripts/upgrades/2026-10-08-company-master-data-isolation.sql`(已有库),不以旧库快照代替升级后的结构。 @@ -24,7 +24,7 @@ | 表 | 保存什么 | 主要字段 | | --------------------------- | ------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `materials` | 物料基础资料,用于识别和描述物料;库存余额另存。 | 物料ID(`id`)、所属组织(`organization_id`)、物料编码(`material_code`)、名称(`name`)、图片(`material_image`)、规格(`spec`)、厂家型号(`manufacturer_model`)、默认供应商关联ID(`supplier_id`)、制造商关联ID(`manufacturer_id`)、分类ID(`category_id`)、基本单位ID(`base_unit_id`)、单位文本(`unit`)、状态(`status`)、资料版本(`version`)、`created_at`、`updated_at` | +| `materials` | 物料基础资料,用于识别和描述物料;库存余额另存。 | 物料ID(`id`)、所属组织(`organization_id`)、物料编码(`material_code`)、名称(`name`)、图片(`material_image`)、规格(`spec`)、厂家型号(`manufacturer_model`)、来源(`source`)、备注(`remark`)、默认供应商关联ID(`supplier_id`)、制造商关联ID(`manufacturer_id`)、分类ID(`category_id`)、基本单位ID(`base_unit_id`)、单位文本(`unit`)、状态(`status`)、资料版本(`version`)、`created_at`、`updated_at` | | `material_categories` | 物料大类、子类及分类定义,形成分类树。 | 分类ID(`id`)、所属组织(`organization_id`)、编码(`code`)、名称(`name`)、分类说明(`description`)、父分类ID(`parent_id`)、状态(`status`) | | `units` | 个、瓶、包、升等计量单位字典及数量精度。 | 单位ID(`id`)、所属组织(`organization_id`)、单位编码(`code`)、单位名称(`name`)、小数位数(`precision_scale`)、状态(`status`) | | `code_rules` | 按组织和物料分类配置的编码生成规则。 | 规则ID(`id`)、所属组织(`organization_id`)、分类ID(`category_id`)、编码前缀(`prefix`)、流水号长度(`sequence_length`)、下一个流水号(`next_sequence`)、状态(`status`) | @@ -80,7 +80,7 @@ | 表 | 保存什么 | 主要字段 | | --------------- | -------------------- | ---------------------------------------------------------------------------------------------------------------------------------------- | -| `material_logs` | 物料资料新增、修改等操作及修改前后快照。 | 日志ID(`id`)、操作类型(`operation_type`)、物料ID(`material_id`)、旧值快照(`old_value`)、新值快照(`new_value`)、操作人(`operator`)、说明(`description`)、`created_at` | +| `material_logs` | 物料资料新增、修改等操作及修改前后快照。 | 日志ID(`id`)、操作类型(`operation_type`)、物料ID(`material_id`)、操作人用户ID(`operator_id`,可空)、旧值快照(`old_value`)、新值快照(`new_value`)、操作人名称(`operator`)、说明(`description`)、`created_at` | | `stock_logs` | 库存增减数量、方向和来源单据。 | 流水ID(`id`)、物料ID(`material_id`)、方向(`type`)、数量(`quantity`)、来源类型(`related_order_type`)、来源记录ID(`related_order_id`)、`created_at` | `material_logs` 描述资料变化,`stock_logs` 描述数量变化。库存流水的 `type` 为 `in` 或 `out`;来源类型包含 `inbound`、`outbound`、`application`,分别指向入库单、出库单、申请主键。 @@ -253,3 +253,11 @@ 组织关联表增加唯一键 `(organization_id,id)`;物料通过 `(organization_id,supplier_id)` 和 `(organization_id,manufacturer_id)` 复合外键保证引用属于同一组织,删除或修改被引用的关联键会被拒绝。角色匹配需要由业务接口校验,外键本身不验证 `is_supplier` / `is_manufacturer`。 现有 `material_suppliers` 继续保存多个供应商的价格与供货条件;物料的 `supplier_id` 只表示默认选择。已有库使用 `scripts/upgrades/2026-10-12-material-partner-roles.sql` 升级,空库使用 `scripts/init.sql`。 + +## 13. 物料来源与备注(2026-10-14) + +`materials.source` 为可空来源字段,允许值为「外购」或「外协」;`materials.remark` 为可空备注,最多 200 字。旧记录升级后两列均保持 `NULL`,新建和批量导入也允许留空。已有库使用 `scripts/upgrades/2026-10-14-material-source-remark.sql` 升级,空库使用 `scripts/init.sql`。 + +## 14. 物料日志操作人用户 ID(2026-10-14) + +`material_logs.operator_id` 保存当前登录用户 ID,允许为空以兼容旧日志和系统生成日志;`operator` 名称继续保存并用于展示。该列不设置用户外键,保留用户被删除后的历史标识。已有库使用 `scripts/upgrades/2026-10-14-material-log-operator-id.sql` 升级,空库使用 `scripts/init.sql`。 diff --git a/frontend/src/views/Logs.vue b/frontend/src/views/Logs.vue index 40ff4bba..4a655c36 100644 --- a/frontend/src/views/Logs.vue +++ b/frontend/src/views/Logs.vue @@ -53,7 +53,11 @@ - + + +