Commit Graph

34 Commits

Author SHA1 Message Date
文睿 张
18df4f48e4 修复 21 个测试与代码脱节导致的既有失败
go test ./... 从 21 个失败回到 0。根因都是测试没跟上代码改动,其中两处
被「自动补位」的补丁 hack 掩盖住了:

- handler 的 materialRow 在「列数 20、值 18」时自动插两个 nil,掩盖了
  materials 新增 supplier_id/manufacturer_id 后的列错位。它碰巧补对位置,
  而 order 测试的 activeMaterialRows 没走这个 helper,直接 panic。
  已删掉补丁、把测试数据补齐到 20 列。
- 导入测试的 buildTestWorkbookWithHeaders 按 7 列给数据补位,而表头这时
  已经扩到 9 列(多了供应商、制造商),把「大类/小类」静默塞进了
  「来源/备注」。已按 materialImportHeaders 的实际列序修正补位。

其余为非补丁式的期望过时:materials 的 INSERT 参数补到 15 个、物料列表
查询结果集补到 20 列、导入模板表头断言改为按 materialImportHeaders 取末列
而不是写死下标。

顺带清掉已废弃的升级路径残留:upgrades/ 目录在 85525c97 已删除,增量升级
不再使用,因此删除 scripts/sync-company-integrity.ps1(把 checks SQL 嵌入
upgrade SQL 的生成器)与它的测试,application.go 里指向 upgrades 的错误
文案改为只提 init.sql。
2026-10-14 16:27:18 +08:00
文睿 张
3cc783b5ff 物料数据迁移,并让每个公司自带默认单位与仓库
数据迁移(北京 / 武汉两个 SQLite 物料库 → wmms)
- 北京进默认组织、武汉单独建组织:两套分类编码完全相同但含义不同(北京 A01=标准件,
  武汉 A01=机加工件),共存会撞 material_categories 的组织内编码唯一约束
- 199 条物料、37 个企业、45 条变更日志,以及各分类的 code_rules.next_sequence
  (对齐到已导入的最大序号 +1,否则用户新增物料会撞上已有编码)
- 迁移段并入 scripts/init.sql 末尾,空库初始化即得完整数据

公司默认数据
- 新建公司时种入 32 个物料单位 + 默认仓库 + 主库位,与建公司同事务,
  种一半失败会整体回滚(否则留下一个没单位、又占着公司编码的组织)
- 单位在后端按公司隔离(MaterialRepo.IsActiveUnit 要求物料引用的单位属于本公司),
  此前新建的公司连单位下拉都是空的,物料的 base_unit_id 也无处可指
- init.sql 的单位段补齐「块」「Pcs」,与代码里的清单保持逐条一致

默认组织更名:默认公司组织 → 北京
2026-10-14 16:05:36 +08:00
文睿 张
85525c97a0 合并物料功能与初始化 SQL 2026-10-14 11:39:12 +08:00
文睿 张
1474b4d066 功能:完善物料导入与合作伙伴管理 2026-10-13 15:20:29 +08:00
文睿 张
bc1352b918 docs: 标注导入记录表只写不读,留作后续入口 2026-10-12 11:56:51 +08:00
文睿 张
0ddda5363e fix(material-import): 完善批量导入异常提示,仅保存成功历史,补齐审计日志名称、编码、详情及物料快照。上传解析前限制请求大小,逐行读取提前拦截超限数据,保留空行和真实行号规则。补充回归测试,同步计划、接口说明及八条人工用例。 2026-10-12 11:37:37 +08:00
文睿 张
0e3b1735a5 feat: 物料导入记录仓储 2026-10-10 15:20:18 +08:00
文睿 张
f3146af838 feat: 物料批量入库的编码分配与事务插入 2026-10-10 15:13:18 +08:00
文睿 张
ef4e68b1bd docs: document company isolation rollout and acceptance 2026-10-09 15:54:20 +08:00
文睿 张
a1bc0539dc feat: 按公司隔离物料申请与审批出库 2026-10-09 12:37:08 +08:00
文睿 张
b0cab477db feat: 按公司隔离入出库单据流程 2026-10-09 12:21:53 +08:00
文睿 张
e3cfe88d4e feat: 按公司隔离库存余额与流水 2026-10-09 11:10:13 +08:00
文睿 张
970ba5ccf7 feat: 组织列表为每家公司补充仓库摘要
组织初始化接口 GET /api/auth/organizations 现在为每项授权公司附带
warehouse 摘要({id, name, status, location: {id, name, status} | null} | null),
结构与切换接口一致,供普通用户在公司切换器直接展示,无需放开管理员仓库配置接口。

- model:新增 WarehouseSummary/LocationSummary/OrganizationSummary,
  OrganizationAccess 每项改为内嵌公司资料再加 warehouse 摘要。
- repository:新增 WarehouseRepository.Summary 复用切换接口的解析规则;
  ListAccessible 逐公司补齐摘要,仓库或库位配置不唯一时报错而非随意取第一条,
  无仓库、无库位或已停用如实返回,不回退旧公司数据。
- service:Switch 复用 List 已解析的摘要,响应格式保持不变。
- 测试:新增服务层 sqlmock 用例与仓储层 MySQL 集成用例,
  覆盖启用唯一仓库加启用库位、无仓库、仓库停用三类。
2026-10-09 10:43:35 +08:00
文睿 张
838889ce9f feat: 按公司隔离物料主数据 2026-10-09 10:38:02 +08:00
文睿 张
8043fa198b feat: 配置用户公司授权与默认公司 2026-10-09 09:47:27 +08:00
文睿 张
7e56d462b3 feat: 新增组织授权与审计数据底座 2026-10-08 17:04:09 +08:00
文睿 张
6ac9f2cb3c 新增伙伴业务分类,优化物料编辑并整理数据库脚本 2026-10-08 11:54:51 +08:00
文睿 张
d62d6777d1 bugs修复 2026-09-23 14:20:42 +08:00
文睿 张
5d508cd2bb fix: 给不存在的仓库建库位时误报创建成功
CreateLocation 的 INSERT...SELECT 匹配不到仓库时影响 0 行,MySQL 不报错:
err 为 nil、LastInsertId() 返回 0。此前只看 err,接口回 201
"Location created successfully" 且 data.id 为 0,而库里一行都没写进去——
刷新后库位消失,重试还是"成功"。

改为以 RowsAffected 为准(INSERT 的 RowsAffected 就是实际插入行数,不受
clientFoundRows 影响),影响 0 行返回 ErrWarehouseNotFound,接口回 400
"仓库不存在,可能已被删除或不属于当前组织"。与既有的 execExpectingRow、
role_permissions 插入保持同一套路。

实测(docker,重建后端镜像后):
  不存在的仓库 999  ->  HTTP 400,warehouse_locations 1 行 -> 1 行
  真实仓库 1        ->  HTTP 201 id=3,1 行 -> 2 行,库中确有此行

新增 warehouse_test.go 覆盖两个分支,变异验证:去掉 affected==0 判断后
"影响 0 行"用例失败(返回 <nil>,正是线上症状)。
2026-09-22 18:21:31 +08:00
文睿 张
aa017a32b4 fix: 已停用角色导致用户无法保存编辑 2026-09-22 16:41:19 +08:00
文睿 张
696e90893b fix: 主数据编辑的两类静默失败
UPDATE 漏列:
- code_rules 的 SET 补上 category_id。此前改分类提示"保存成功"但不落库,
  是唯一用户可达的活缺陷(同页的分类下拉没有 disabled,且规则只能改不能删,
  没有"删了重建"这条退路)
- code_rules 有 uk_code_rules_org_category,补列后改到已占用的分类会撞唯一键,
  新建与更新统一翻成中文的 ErrDuplicateCodeRule
- 分类/单位/仓库/库位/伙伴的编码定为不可变:分类编码是编码规则前缀的来源
  (init.sql 的种子数据直接取 material_categories.code),伙伴编码是对外业务
  编号,改掉会让历史数据脱节且查不回来。service 的 Update* 不再要求编码非空
  ——原先是"必须传、传了却被丢弃";新建侧的必填校验保留
- 顺带补齐两处同款漏网:organization.go 的 code 与 partner.go 的 partner_code
  (前者 service 本就不校验编码,自洽,无需改)

记录不存在时的静默成功:
- DSN 开启 clientFoundRows,让 RowsAffected 返回"匹配"行数而非"实际改变"行数。
  否则"编辑时一个字段都没改"和"记录不存在"都返回 0,无法区分,直接加检查会把
  正常保存误判成记录不存在(真 MySQL 8.0 实测)
- 新增 repository.execExpectingRow,7 个 Update* 影响 0 行时返回 ErrRecordNotFound;
  伙伴走事务内的 SELECT ... FOR UPDATE,只需翻译 sql.ErrNoRows
- 既有 4 处 RowsAffected 用法逐处核对过,均不受该 flag 影响

测试:补 6 个 Update* 的存在性检查、编码必填约束的两端、唯一键翻译、DSN 拼接;
全部做过变异验证(抽掉实现后对应测试确实变红)。
2026-09-21 17:26:53 +08:00
文睿 张
837cc5787b 前端问题优化 2026-09-21 16:53:44 +08:00
文睿 张
71d1829c29 fix: 库存列表分类筛选失效,后端补上 category 参数
前端 stores/stock.js 一直在发 category,但 handler 只读 search,service 与
repository 的方法签名里也没有这个参数,整条链路把它静默丢弃,于是选完分类
点「查询」没有任何反应。前端本来就传对了,无需改动。

repository 侧按大类 code 过滤(material_categories 里 parent_id 为空的那层,
即 SQL 里的 pc.code),与列表「大类类型」列同口径,前端下拉的 value 正是大类
code。注意 GetAllStock 的 COUNT 查询原本没有 JOIN 分类表,加 pc.code 前必须
补上与主查询一致的 LEFT JOIN,否则分页总数会和实际行数对不上、末尾多出空白
页;两张表都按主键关联,实测计数不变。小类码不会误命中(category=A01 返回 0)。

顺带修掉同一功能里的耦合缺陷:updateWarningStock 刷新列表时不传筛选参数,
筛选一旦生效,保存预警就会把列表刷回全量、而下拉框仍显示选中的分类。store
新增 stockFilters 记住当前条件,刷新时沿用。

stock_test.go 里 COUNT 的正则随 SQL 变形同步放宽,新增
TestStockRepoGetAllStockAppliesCategoryToBothQueries 覆盖两条 SQL 的成对条件
与参数顺序;前端补 4 条用例(store 沿用/清空筛选、组件查询与翻页传递分类)。
2026-09-21 16:19:18 +08:00
文睿 张
ea63cd9931 修改一致性问题 2026-09-21 14:13:30 +08:00
文睿 张
d463fbf71a 修改前端报错文案 2026-09-20 16:59:38 +08:00
文睿 张
a7c7936e0b feat: 实现物料编码按分类规则自动生成、手工修改及并发安全的流水号管理 2026-09-20 16:48:06 +08:00
文睿 张
936a8d3b61 完善库存流水 2026-09-20 14:29:41 +08:00
文睿 张
332ac1ff7a 完善出库和入库逻辑 2026-09-20 11:18:00 +08:00
文睿 张
d9da2ed672 库存,入库,出库相关问题修改 2026-09-20 10:31:28 +08:00
文睿 张
6fe9d0da40 物料分类重构、物料恢复、入库预警阈值与库存明细接口 2026-09-18 17:20:45 +08:00
文睿 张
bf48c5a60f chore: remove generated caches and temporary files 2026-09-17 15:17:23 +08:00
文睿 张
1cc3584f1a restore lost frontend and backend changes 2026-09-16 23:30:25 +08:00
文睿 张
a103549854 拆分主数据和仓库数据 2026-09-16 16:29:04 +08:00
文睿 张
31aae223c2 Initial commit 2026-09-15 16:08:18 +08:00