文睿 张
7b926ff60a
feat: 物料导入与模板下载接口
...
- 新增 response.ErrorWithData:校验失败要把逐行明细一起带回,不能只给一句话
- 新增 GET /api/material-import/template 与 POST /api/material-import
- 路由挂在独立前缀 /material-import:materials 组已有 GET /:id,gin 的路由树
不允许同一段既有静态前缀又有通配参数
- 权限沿用物料新增的口径:登录 + 公司头校验,不额外要求 super_admin
- 模板随代码生成不落盘,下载到的永远与当前校验规则一致
2026-10-10 15:46:57 +08:00
文睿 张
f34803e1a2
docs: 修正物料导入计划中 Task 5/6 的测试片段笔误
...
- Task 5:expectImportLog 的行数参数显式转 int64。database/sql 会把实参归一成
driver.Value(int→int64),sqlmock 按类型比对,传 Go int 必然匹配不上
- Task 5:expectImportLog 补 fileName 参数,模板非法那条用例传的文件名与其它用例不同
- Task 5:事务内 SQL 的期望顺序改为「推进 code_rules → 分批 INSERT」,
与已提交的 ImportTx 实现(material.go:480 在 :485 之前)一致
- Task 6:测试片段补上缺失的 strings import
按修正后的片段替换 internal/service/material_import_test.go 实跑,5 个用例全通过。
2026-10-10 15:42:06 +08:00
文睿 张
e853846070
feat: 物料导入校验与事务入库编排
...
- 新增 MaterialImportService.Import:解析 → 逐行校验 → 事务入库 → 写导入记录
- 校验覆盖名称/规格长度、大类小类归属、单位名称或编码匹配、小类编码规则存在性
- 同一小类的规则只查一次,避免批量行数放大成逐行往返
- 校验失败整批不入库并返回逐行明细;入库失败整体回滚
- 导入记录成功失败都写,失败原因只存前 5 行行号摘要,明细不落库
2026-10-10 15:33:13 +08:00
文睿 张
0e3b1735a5
feat: 物料导入记录仓储
2026-10-10 15:20:18 +08:00
文睿 张
f3146af838
feat: 物料批量入库的编码分配与事务插入
2026-10-10 15:13:18 +08:00
文睿 张
4960a88497
feat: 物料导入模板生成与 xlsx 解析
2026-10-10 14:57:56 +08:00
文睿 张
84e7f4d7d0
feat: 新增物料导入记录表与模型
2026-10-10 14:56:42 +08:00
文睿 张
616a4a3b1d
feat: 物料增加初始单位,补充物料批量上传计划
...
- 物料默认单位由 pcs 改为「个」,新建/编辑表单与后端 Create 保持一致
- 单位下拉增加未选择时的默认提示
- init.sql 补充 30 个常用计量单位种子数据
- init.sql 新增 material_import_logs 表,为批量导入提供落库
- 新增物料批量导入实施计划文档,相关测试期望值同步更新
2026-10-10 14:15:49 +08:00
文睿 张
8dd0427adb
feat: support customer and supplier role selection for partners
2026-10-10 10:47:12 +08:00
文睿 张
1c316d0105
回归测试用例
2026-10-09 18:18:58 +08:00
文睿 张
b24bb25553
Merge remote-tracking branch 'origin/feature/company-isolation' into feature/company-isolation
2026-10-09 16:38:54 +08:00
文睿 张
2a6a3c6bba
docs: 补充后端结构说明并更新公司隔离进度
...
- 新增《项目后端结构说明》,梳理仓库布局、internal 分层与请求链路
- 《数据库表结构与关系说明》新增第 11 节,记录公司隔离发布后的表、约束与升级阻断规则
- 公司隔离计划补充精简版测试策略,并勾选 Task 2、Task 8 完成项与验收记录
2026-10-09 15:55:52 +08:00
文睿 张
ef4e68b1bd
docs: document company isolation rollout and acceptance
2026-10-09 15:54:20 +08:00
文睿 张
dff5420a31
fix: 物料图片上传纳入保存互斥
2026-10-09 14:34:43 +08:00
文睿 张
89368ba3f8
fix: 补齐详情加载的上下文校验与保存互斥
...
- 入出库详情加载提交前校验公司 ID 与上下文版本,旧公司响应静默丢弃
- 新增 runWithSaving 包裹器,仓库、伙伴、基础配置等直接调接口的页面纳入保存互斥
- 切换守卫卸载时仅撤销自己注册的那一份
2026-10-09 14:25:46 +08:00
文睿 张
3674076377
chore: 忽略编辑器本地历史目录
2026-10-09 14:19:54 +08:00
文睿 张
fafbadef0c
chore: 将后端启动文件注释翻译为中文
2026-10-09 14:19:18 +08:00
文睿 张
1a4b48cf9a
fix: 切换公司时重置组织级页面状态
...
- 组织级 store 统一提供 resetForOrganization,清空缓存、查询参数、分页与 loading
- 加载方法提交状态前校验捕获的公司 ID 与上下文版本,旧公司延迟响应不再覆盖新公司
- 页面重挂载清理局部状态(物料选择、单据 ID、申请详情、审批弹窗)
- 新增切换守卫,脏表单时取消切换不清空数据、保存期间禁止切换
- 接上库存事件消费与写请求的保存互斥标记
- 仓库配置页在已有仓库/库位时隐藏新增入口,仅保留编辑与启停
2026-10-09 14:19:17 +08:00
文睿 张
f6a4fc6cb6
fix: 取票失败静默处理,不再弹出连接相关报错
2026-10-09 13:56:48 +08:00
文睿 张
d580efebe5
fix: 接线公司实时连接生命周期并钉住角色撤销语义
...
- organization store 接线 companySocket:切换后为当前公司重连,登出/空状态只关闭不重连
- companySocket 延迟解析 WebSocket 并静默吞掉取票/建连失败,不阻断公司切换
- authApi 新增 createWebSocketTicket(组织级请求)
- 补 store 三例接线测试:切换触发重连、登出触发关闭、空公司不连接
- 补 Go 用例钉住复核边界:纯业务角色撤销、公司授权仍在时不断流
2026-10-09 13:50:08 +08:00
文睿 张
5021b039c9
feat: 按公司隔离 WebSocket 订阅与事件投递
...
- 新增 POST /api/auth/websocket-ticket:需 JWT 与公司头,签发 30 秒有效的一次性随机票据
- /ws 握手消费票据并以数据库当前状态复核身份与公司授权,JWT 不进 URL
- Hub 注册/注销/投递选人统一由事件循环串行管理,消除 RLock 内 delete 的并发缺陷
- 事件携带 organization_id,仅投递同公司订阅者,投递前复核失败即关闭连接
- 统一广播签名为 (organizationID, action, orderID, data)
- 新增前端 companySocket 模块:按当前公司取票建连、切换/登出关旧连重连、消息校验组织与上下文版本
2026-10-09 13:39:45 +08:00
文睿 张
a1bc0539dc
feat: 按公司隔离物料申请与审批出库
2026-10-09 12:37:08 +08:00
文睿 张
b0cab477db
feat: 按公司隔离入出库单据流程
2026-10-09 12:21:53 +08:00
文睿 张
ee18a2e56f
fix: 修正普通审批 scope、出库更新加锁顺序与预警物料归属校验
2026-10-09 11:19:39 +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
文睿 张
ffcf7748fb
fix: 补全公司切换的保存互斥与旧读请求中止
...
- 保存请求执行期间禁止切换:organization store 新增 saving/busy 与
beginSaving/endSaving,切换守卫与切换器禁用条件均由 switching 改为 busy
- 切换提交时 abort 旧读请求:commitOrganizationId 内调用 abortReadRequests,
不再只在 resetOrganizationContext 里取消
- validateCandidate 仅将 403 视为候选失效,网络异常/500 等向上抛出;
initialize 置 loadError,App 据此区分“加载失败”与“请先选择公司”并支持重试
- 补竞态与中止测试;需要写请求时旧响应仍被版本丢弃的用例改用 POST 覆盖
2026-10-09 10:34:19 +08:00
文睿 张
6cc3cd5dda
feat: 新增公司切换与请求上下文
...
- 新增 company 请求上下文工具、organization store 与公司切换器
- axios 拦截器为组织级请求写入 X-Organization-ID 并校验上下文版本
- 切换公司用 AbortController 取消旧读请求,丢弃旧响应且不弹提示
- 路由与页面加公司初始化屏障,组织级页面按公司 ID + 版本挂载
2026-10-09 10:19:19 +08:00
文睿 张
8f4460b84a
feat: 强制校验可信公司上下文
2026-10-09 09:56:21 +08:00
文睿 张
5691e03f00
feat: 配置用户公司授权与默认公司
2026-10-09 09:47:27 +08:00
文睿 张
8043fa198b
feat: 配置用户公司授权与默认公司
2026-10-09 09:47:27 +08:00
文睿 张
ab6c2d6012
feat: add organization access and audit foundation
2026-10-08 17:04:09 +08:00
文睿 张
7e56d462b3
feat: 新增组织授权与审计数据底座
2026-10-08 17:04:09 +08:00
文睿 张
cf9301d3c1
Merge remote-tracking branch 'origin/master'
...
合并远程master分支更新
2026-10-08 12:00:37 +08:00
文睿 张
6ac9f2cb3c
新增伙伴业务分类,优化物料编辑并整理数据库脚本
2026-10-08 11:54:51 +08:00
copper-xw
6a16edfa24
fix: 修正试用脚本就绪探测并支持端口可配置
...
MySQL 就绪探测改为走 TCP(127.0.0.1:3306),避免初始化阶段只监听 socket
的临时服务器让探测提前通过,导致后端连入时遇到 unexpected EOF。
后端监听端口改为读取 APP_PORT(默认 8082),与脚本探测的空闲端口一致,
并在启动时和最终提示中打印完整访问地址;npm 默认使用 npmmirror 镜像,
同时将根目录编译产物 /server 加入忽略。
2026-09-30 17:39:03 +08:00
copper-xw
ca26f625f5
chore: 取消追踪误提交的前端依赖并新增试用脚本
...
frontend/node_modules 是在 Windows 上安装后误提交进仓库的依赖,平台相关的
原生包在 Linux 不可用,且每次重装依赖都会产生大量变更。现将其从版本库移除
(本地文件保留),并补充 .dev-run/ 忽略规则;同时新增 dev-verify.sh,
用于本机编译前后端、以一次性 MySQL 容器隔离试用,关闭即清理。
2026-09-30 15:37:48 +08:00
文睿 张
b1c86593f0
docs: limit first BOM view to one unit
2026-09-23 15:02:15 +08:00
文睿 张
c9f0a69f8e
停用显示修复
2026-09-23 14:53:27 +08:00
文睿 张
048b62766b
停用显示修复
2026-09-23 14:52:54 +08:00
文睿 张
7f06b2ee58
bugs修复
2026-09-23 14:46:51 +08:00
文睿 张
d62d6777d1
bugs修复
2026-09-23 14:20:42 +08:00
文睿 张
e1401532f1
docs: show BOM history in a dedicated dialog
2026-09-23 13:41:23 +08:00
文睿 张
0336181832
docs: plan BOM usage-position details
2026-09-23 12:05:39 +08:00
文睿 张
6933cd82cc
docs: defer automatic BOM position remarks
2026-09-23 12:00:12 +08:00
文睿 张
0c7da9d394
docs: refine BOM version and audit design
2026-09-23 10:31:40 +08:00
文睿 张
b75696f44a
docs: add initial BOM management design
2026-09-22 18:25:38 +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