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 目录检查与模型文件存在性告警
This commit is contained in:
yueli
2026-07-13 17:30:52 +08:00
parent 4f5965db02
commit 760f78e016
10 changed files with 112 additions and 24 deletions

View File

@ -43,6 +43,7 @@ def get_current_user_permissions():
'material_list:availableCount',
'material_list:files',
'material_list:isEnabled',
'material_list:referencePrice',
'material_list:operation'
]
perm_dict = AuthService.get_user_permissions(user_role, company_name=user_company)
@ -72,6 +73,7 @@ def filter_item_by_permissions(item_dict, user_permissions):
'availableCount': 'material_list:availableCount',
'generalManual': 'material_list:files',
'generalImage': 'material_list:files',
'referencePrice': 'material_list:referencePrice',
'isEnabled': 'material_list:isEnabled'
}
for field, perm_code in field_to_perm.items():
@ -252,6 +254,7 @@ def create():
'availableCount': 'material_list:availableCount',
'generalManual': 'material_list:files',
'generalImage': 'material_list:files',
'referencePrice': 'material_list:referencePrice',
'isEnabled': 'material_list:isEnabled'
}
# 过滤用户没有权限的字段
@ -311,6 +314,7 @@ def update(id):
'availableCount': 'material_list:availableCount',
'generalManual': 'material_list:files',
'generalImage': 'material_list:files',
'referencePrice': 'material_list:referencePrice',
'isEnabled': 'material_list:isEnabled'
}
# 过滤用户没有权限的字段

View File

@ -39,6 +39,9 @@ class MaterialBase(db.Model):
# 强制质检标记(采购入库时必须上传检测报告)
is_inspection_required = db.Column(db.Boolean, default=False, comment='是否强制要求质检')
# 参考价格
reference_price = db.Column(db.Numeric(10, 2), nullable=True, comment='参考价格')
# CLIP 视觉向量(用于以图搜图)
img_embedding = db.Column(Vector(512), nullable=True)
@ -96,6 +99,8 @@ class MaterialBase(db.Model):
'isEnabled': bool(self.is_enabled),
# 强制质检标记
'isInspectionRequired': bool(self.is_inspection_required),
# 参考价格
'referencePrice': float(self.reference_price) if self.reference_price is not None else None,
}

View File

@ -259,6 +259,7 @@ class MaterialBaseService:
'type': 'material_type',
'spec': 'spec_model',
'unit': 'unit',
'referencePrice': 'reference_price',
'inventoryCount': 'total_inv',
'availableCount': 'total_avail'
}
@ -273,6 +274,7 @@ class MaterialBaseService:
'type': 'material_list:type',
'spec': 'material_list:spec',
'unit': 'material_list:unit',
'referencePrice': 'material_list:referencePrice',
'inventoryCount': 'material_list:inventoryCount',
'availableCount': 'material_list:availableCount'
}
@ -390,6 +392,7 @@ class MaterialBaseService:
'type': MaterialBase.material_type,
'spec': MaterialBase.spec_model,
'unit': MaterialBase.unit,
'referencePrice': MaterialBase.reference_price,
'inventoryCount': inner_sub.c.total_inv,
'availableCount': inner_sub.c.total_avail
}
@ -556,6 +559,7 @@ class MaterialBaseService:
product_image=json.dumps(data.get('generalImage', [])),
product_image_remark=data.get('productImageRemark', ''),
manual_link_remark=data.get('manualLinkRemark', ''),
reference_price=data.get('referencePrice'),
is_enabled=is_enabled_val
)
db.session.add(new_material)
@ -625,6 +629,9 @@ class MaterialBaseService:
)
# 【核心修改】:兼容前端传来的布尔值
if 'referencePrice' in data:
material.reference_price = data['referencePrice']
if 'isEnabled' in data:
raw_enabled = data['isEnabled']
material.is_enabled = str(raw_enabled).lower() in ['1', 'true', 'yes', 't']