|
|
0c822938f0
|
fix: 系统管理菜单开放给SUPERVISOR, 补全审计日志路由
|
2026-07-15 09:22:58 +08:00 |
|
|
|
8cf94c6c4d
|
V3.56
|
2026-07-15 09:18:26 +08:00 |
|
|
|
31903bdb39
|
feat: 基础信息弹窗新增"发起采购申请"按钮, 跳转采购管理自动预填物料+默认审批人
- material/list.vue: 弹窗头部新增"发起采购申请"按钮, 携带物料信息跳转/purchase
- purchase/index.vue: onMounted读取URL参数自动弹窗并预填物料
- purchase/index.vue: fetchDefaultApprover取当前用户上一次采购申请的审批人作为默认值
- 商家链接placeholder去掉"选填"字样
|
2026-07-14 17:13:31 +08:00 |
|
|
|
68fd93b457
|
fix: BOM跳转恢复 + 采购单导入优化 + 基础信息表单禁用守卫
- BOM: 移除父件/子件跳转按钮的 isReadOnlyMode 限制, 任何模式均可跳转
- BOM: 补全缺失的5个权限码(sys_element + sys_role_permission)
- 采购单导入: supplier_link→detail_link, 新增采购人/邮箱自动填充
- 采购单导入: 实时搜索(300ms防抖)+模糊匹配, 保留搜索按钮
- 采购单导入: 移除原始/详情链接的历史 autocomplete
- 基础信息: el-form 增加 formDisabled, 无 material_list:operation 时全局禁用
- /approved-unstocked API 增加 permission_required(inbound_buy)
- PurchaseRequest.to_dict() 增加 requester_email
|
2026-07-14 17:02:07 +08:00 |
|
|
|
538b6cb818
|
feat: 采购单导入自动填充采购人/邮箱/详情链接 + 实时搜索
- PurchaseRequest.to_dict() 新增 requester_email
- 导入时自动填入: 采购人(requester_name) + 邮箱(requester_email) + 详情链接(supplier_link)
- 移除原始链接/详情链接的历史 autocomplete, 改为纯输入框+权限守卫
- 采购单导入搜索改为实时输入搜索(300ms防抖), 保留搜索按钮
|
2026-07-14 16:29:19 +08:00 |
|
|
|
8f468a0a39
|
fix: 修复全局字段权限导致数据显示为空的问题
根因: /permissions/role/<role_code> 接口要求 system_permission,
非管理员角色无法获取自身权限 → 权限数组为空 → 前后端字段全被过滤
修复:
- permission.py: 查自己角色不再需要 system_permission, 解除权限死锁
- 5个 inbound API: 恢复完整 field_to_perm 映射, 每个字段均可独立权限管控
- 补齐遗漏字段(qty_inbound/qty_stock/qty_available/request_id/request_no)
- buy.vue: 入库表单价格字段加入 hasFormFieldPermission 守卫
|
2026-07-14 16:09:41 +08:00 |
|
|
|
593484aba3
|
chore: 移除不必要的迁移脚本文件
|
2026-07-14 15:28:27 +08:00 |
|
|
|
a11b7972c3
|
feat: 打通采购申请与入库的按单入库链路
后端变更:
- PurchaseRequest 新增 base_id 硬关联 MaterialBase,StockBuy 新增 request_id 关联采购单
- handle_inbound 支持 request_id 入参,入库后自动反写采购单状态为已完成
- 新增 get_approved_requests 接口,返回已审批未入库采购单列表(含物料信息+历史数据回退匹配)
- create_purchase_request 新增 name+spec_model 自动匹配 MaterialBase
- 新增 SQL 和 Alembic 数据库迁移脚本
前端变更:
- 入库表单新增"从采购单导入"弹窗,支持搜索/选中已审批采购单并一键填充物料和商务信息
- 单价/总价交叉推算,缺项自动补全
- 选中行蓝色高亮+点击整行选中,行级交互优化
|
2026-07-14 15:25:00 +08:00 |
|
|
|
88b754120b
|
V3.56
|
2026-07-14 08:48:19 +08:00 |
|
|
|
928f494124
|
fix: 统一所有页面名称列点击编辑功能及样式
- material/list.vue: 名称列增加 clickable-text,有编辑权限可点击编辑
- material/buyOdoo.vue: 同上
- stock/inbound/semi.vue: 补上遗漏的 .clickable-text CSS 样式
|
2026-07-14 08:46:19 +08:00 |
|
|
|
a928b0527b
|
V3.55
|
2026-07-13 17:33:28 +08:00 |
|
|
|
a2f9a3e754
|
V3.54
|
2026-07-13 17:33:16 +08:00 |
|
|
|
760f78e016
|
feat: 添加参考价格列 + 修复公司筛选跨域问题 + CLIP模型持久化
## 新增功能
- material_base 表新增 reference_price 列(NUMERIC(10,2))
- 基础信息 list.vue / buyOdoo.vue 页面增加「参考价格」列展示和编辑
- 新增 material_list:referencePrice 权限元素,支持按角色控制可见性
## Bug 修复
- 入库三页面(buy/product/semi)公司筛选:非超管用户 company=ALL 不再传给旧版后端
- 基础信息两页面(list/buyOdoo):buyOdoo 增加 v-if=isSuperAdmin 与 list.vue 行为统一
- company=ALL 默认值在各页面 getList/fetchData 中自动过滤,兼容旧版后端
## 运维优化
- docker-compose.prod.yml 增加 models_prod 卷挂载,CLIP模型持久化免重复上传
- deploy_code.sh 增加 models_prod 目录检查与模型文件存在性告警
|
2026-07-13 17:30:52 +08:00 |
|
|
|
4f5965db02
|
feat: JWT多租户数据权限隔离 & 主管系统管理权限 & 含税单价补齐
## 多租户公司数据隔离
- 新增 get_current_company_filter() 工具函数 (decorators.py)
SUPER_ADMIN: 可传company_name参数过滤或传ALL看全量
其他角色: 强制隔离到JWT中的company_name
- 重构 base_service.py / buy_service.py: 用集中式函数替换内联公司过滤
- SysRolePermission 表新增 company_name 字段,支持同角色不同公司权限
- get_user_permissions() 新增 company_name 参数,查公司定制+全局模板权限
- permission.py API 新增 @permission_required 拦截 + 公司过滤
- 19个API/service文件传递 company_name 到权限查询
## 主管系统管理权限
- delete_user() 允许SUPERVISOR删除同公司用户 (原仅SUPER_ADMIN)
- get_all_users() 新增 company_name 参数过滤
- 用户列表/权限分配 API 应用 get_current_company_filter()
- 前端 UserCreate.vue: 超管可见公司下拉框,主管隐藏部门字段
## 前端多租户适配
- material/list.vue / buy.vue: 公司下拉框仅超管可见,默认ALL
- UserCreate.vue: 新增搜索栏公司筛选,部门字段按角色显隐
- auth.ts: getUserList() 支持 params 参数
## Bug修复: 含税单价字段补齐
- buy.vue: 表格列/高级筛选/排序/权限映射新增 post_tax_unit_price
- buy_service.py: allowed_fields/sort_field_map 新增 post_tax_unit_price
|
2026-07-13 15:12:22 +08:00 |
|
|
|
4ce42309db
|
V3.53对基础信息数据库进行修改,添加了两列备注内容,同时拆解展示图和备注的json存储方式
|
2026-07-10 10:54:10 +08:00 |
|
|
|
ffafa635bb
|
feat: 将产品图/说明书备注字段从JSON数组中分离为独立数据库列
- 数据库新增 product_image_remark 和 manual_link_remark 两个TEXT列
- 备注文字不再与上传文件URL混存在 generalImage/generalManual JSON数组中
- 前端输入框改为textarea,绑定独立的备注字段
- 修复 handlePasteLink 忽略field参数的bug
- 新增 isInternalFile 辅助函数,用于区分上传文件与纯文本
- 同步修改 list.vue 和 buyOdoo.vue 两个页面
|
2026-07-10 10:52:23 +08:00 |
|
|
|
4fb5a96c4c
|
V3.52修改BOM另存为问题
|
2026-06-26 16:09:52 +08:00 |
|
|
|
6a895347d0
|
V3.51
|
2026-06-25 15:44:31 +08:00 |
|
|
|
c1092407ad
|
V3.50
|
2026-06-25 15:21:43 +08:00 |
|
|
|
8ba1ff37f0
|
V3.49
|
2026-06-16 14:54:03 +08:00 |
|
|
|
1450e6c1de
|
fix(借还记录列表): 按 borrow_no 单号维度分页 + 修 SQLAlchemy Row 适配错误
- 分页基准从明细行改为单号:21 项单号不再被拆到 3 页
- 步骤 1a 构造 GROUP BY borrow_no 的 subquery(sort_key + status 聚合)
- 步骤 2 主查询 SELECT order_subq.c.borrow_no 一列,避免触发 PG GROUP BY 严格模式 (f405)
- 步骤 3 用 page_borrow_nos 拉明细,保留前端 groupMap 期望的 items 形态
- pagination.items 用 isinstance + hasattr(_mapping) 兜底提取纯字符串(修 psycopg2 can't adapt type 'Row')
- service 加 try-except,路由层识别 500 透传 traceback
- status 过滤改为单号聚合(borrowed=至少一条未还,returned=全部归还)
|
2026-06-16 14:53:42 +08:00 |
|
|
|
b9c25ff4c5
|
V3.47
|
2026-06-16 13:57:23 +08:00 |
|
|
|
b79b0f99af
|
fix(借库扫码出库): 撤销 joinedload 修复 PG "FOR UPDATE cannot be applied to nullable side of outer join"
- 83b3db6 引入的 joinedload(ModelClass.base) 触发 LEFT OUTER JOIN,
而 with_for_update() 会被 SQLAlchemy 透传到 join 的 nullable 侧,
PG 直接抛 FeatureNotSupported,且连表加锁有死锁风险
- 退回最安全的单表 FOR UPDATE 模式,接受 N+1 lazy 加载的代价
- 在 防线3 上方加防回归注释,明确禁止未来再加 joinedload
- process_return 中的另两处 joinedload 不带 FOR UPDATE,不受 PG 限制,保留
|
2026-06-16 13:56:11 +08:00 |
|
|
|
83b3db693a
|
fix(借库扫码出库): 校验 key 从 (source_table, sku) 改为 (name, spec_model) + N+1 修复
- 借库申请按 (name, spec_model) 发起,审批明细无 sku 字段;
旧代码用 sku 做 key 会导致所有条目坍塌到同一桶,校验形同虚设
- 改为在扫码循环内即时累加、即时拦截:
防线4 锁定 stock 行后从 material_base 取真实 (name, spec_model),
与审批单按 strip 后的 (name, spec_model) 聚合比对
- 新增 joinedload(ModelClass.base) 一次 JOIN 加载 base,
避免循环内 stock.base 触发 N+1
- 修正 dispatch_borrow docstring 中"sku 用于超额交叉校验"的错误描述
|
2026-06-16 13:50:49 +08:00 |
|
|
|
bfeb397c4a
|
fix(借库扫码出库): items 字段名 stock_id → id 修复 400 + dispatch_borrow docstring 补全 sku 字段说明
|
2026-06-16 13:38:51 +08:00 |
|
|
|
dcef91c3b1
|
V3.47
|
2026-06-12 15:05:06 +08:00 |
|
|
|
5c0c1632c3
|
fix(审批邮件): items_json序列化Bug修复 + 邮件方法出库/借库物理隔离
|
2026-06-12 15:04:57 +08:00 |
|
|
|
6f5652b90e
|
fix(借库菜单): 调整路由顺序 + 统一菜单命名
|
2026-06-12 14:21:03 +08:00 |
|
|
|
7ef22a3830
|
feat(借库审批流): 完整前后端实现
|
2026-06-12 14:08:19 +08:00 |
|
|
|
941bd20fbd
|
fix(借库审批): borrow_service pytz时区修复 + transactions except块traceback增强
|
2026-06-12 14:06:17 +08:00 |
|
|
|
7ee6b0e02f
|
借库申请页面:恢复按 BOM 套餐添加功能
|
2026-06-12 13:19:01 +08:00 |
|
|
|
9e83c31f39
|
V3.46
|
2026-06-12 11:10:58 +08:00 |
|
|
|
6ad00884ba
|
借库列表:主子表聚合 + 展开行内嵌明细
|
2026-06-12 11:07:23 +08:00 |
|
|
|
9a5e3ee6b0
|
TransService.get_records: 追加 material_name 字段 + SKU 兜底查询解决数据孤岛问题
|
2026-06-12 11:06:34 +08:00 |
|
|
|
67bc5b6c5d
|
V3.45
|
2026-06-11 17:36:34 +08:00 |
|
|
|
6cf5a25d77
|
V3.44
|
2026-06-10 12:16:00 +08:00 |
|
|
|
6686747e57
|
BomManage: saveDraftData 简化为全局唯一草稿静默覆盖模式
|
2026-06-10 12:11:53 +08:00 |
|
|
|
74bc751624
|
V3.43
|
2026-06-10 11:36:06 +08:00 |
|
|
|
c7b84ff3c6
|
fix: BOM草稿模块缺陷修复(事务回滚 + 外键约束 + 前端状态清理)
|
2026-06-10 11:30:07 +08:00 |
|
|
|
0e6d294052
|
V3.42
|
2026-06-05 16:28:43 +08:00 |
|
|
|
93b9846fc6
|
feat: 以图搜图集成拍照功能,支持直接调起摄像头搜图
|
2026-06-05 15:47:50 +08:00 |
|
|
|
1def8c7747
|
fix: 修复物料管理菜单空白,修正子菜单显示名称
|
2026-06-05 15:41:05 +08:00 |
|
|
|
907c083107
|
feat: 新增 Odoo 风格物料管理视图及相关路由,优化成品入库逻辑
|
2026-06-05 15:35:43 +08:00 |
|
|
|
afe0f25415
|
物料类别隔离校验:buy 改黑名单 + semi/product 改精确路径匹配,消除子串包含Bug
|
2026-06-05 13:01:39 +08:00 |
|
|
|
ffc482bd9e
|
BomManage: 增删改刷新保留折叠状态,搜索时才重置 activeCategories
|
2026-06-05 11:31:37 +08:00 |
|
|
|
7087769a33
|
BomManage: 首屏懒渲染优化 — el-table 加 v-if 按需挂载,v-loading 替换为骨架屏
|
2026-06-05 11:24:40 +08:00 |
|
|
|
3d30cbc5c2
|
BomManage: autocomplete 添加 validate-event=false,rules 校验字段从 parent_id 改为 parentNameInput
|
2026-06-05 11:05:41 +08:00 |
|
|
|
355a21e94c
|
物料搜索:el-select 重构为 el-autocomplete Regression 修复(value-key 缺失 + parentNameInput 未声明 + onChildClear 不完整)
|
2026-06-05 11:02:35 +08:00 |
|
|
|
ff5418afa3
|
入库模块:物料搜索点击无感修复 + 类别校验白名单准入制
前端(buy/semi/product/service.vue,4 文件):
修复物料搜索"点击已聚焦 input 时内容被清空"交互 bug。
el-select 在 filterable+remote 模式下点击已聚焦的 input 时,el-select 内部
会 emit query='' 触发 remote-method,绕过 handleMaterialDropdownVisible
入口保护,直接清空 searchKeyword 和 materialOptions,导致用户被迫重写。
新增两层防御实现"编辑无感":
1) handleMaterialDropdownVisible 入口拦截:已选过物料(form.base_id 有值)
时下拉打开直接 return,不请求默认列表
2) handleSearchMaterial 内部拦截:拦截 el-select 内部 emit 的空 query,
仅在 form.base_id 有值 + safeQuery 为空 + 列表非空时 return
后端(buy/semi/product_service.py,3 文件):
入库类别校验从黑名单改为白名单准入制,彻底杜绝"成品进半成品库"
等非法组合(d94b52b 黑名单方案"成品不能进采购库"已挡不住这种组合)。
- buy_service.py: 黑名单(禁半成品/成品进采购)→ 白名单(必须含"原材料")
- semi_service.py: 统一错误信息格式为"只有【半成品】才允许半成品入库!"
- product_service.py: 统一错误信息格式为"只有【成品】才允许成品入库!"
- 三处空 category 统一显示为"未分类"
配合前端已修复的 catch 块(e.response.data.msg 精准提取),后端新错误
信息可原样弹窗给用户。
|
2026-06-04 17:57:17 +08:00 |
|
|
|
d94b52bf73
|
入库模块:物料类别隔离硬性校验(写拦截,读放宽)
|
2026-06-04 17:19:43 +08:00 |
|