fix(purchase): 商家地址链接放宽为 text,修超长链接保存失败

现象
----
采购管理新建采购申请时粘贴电商商品链接报错。实测该链接 **516 字符**,而
purchase_request.supplier_link 是 varchar(500) —— 超出 16 个字符,
PostgreSQL 直接拒绝(value too long for type character varying(500))。

★ 为什么用 text 而不是把 500 调大
  电商外链(淘宝/1688)普遍带很长的跟踪参数,长度没有稳定上界:本例已 516,
  再叠加一轮营销参数就可能破千。任何有限的 varchar(N) 都只是把报错往后推,
  而且**截断是静默的** —— 用户只会觉得「链接打不开」。
  同 material_base.purchase_link 的处理(那边一开始就用 text)。

附带确认(全部扫描,无需改动)
  从数据库层面扫了所有「有长度上限、且列名像 link/url/photo/image/
  signature/path」的列:
    · purchase_request.supplier_link(500)  ← 本次唯一真正有问题的
    · sys_menu.path(200)、sys_warehouse_location.full_path(500)  内部生成数据
    · stock_adjustment.linked_sku(100)/linked_outbound_no(50)     SKU 与单号
  用户粘贴外链的列仅此一处。

迁移用 DO 块先判断当前类型,可重复执行;含核对段与回滚段。
验证:把那条 516 字符的真实链接写入再读回,长度一致、内容未截断。
This commit is contained in:
yueli
2026-09-18 09:34:44 +08:00
parent 1eaa203eba
commit ccdd6e7306
2 changed files with 74 additions and 1 deletions

View File

@ -17,7 +17,12 @@ class PurchaseRequest(db.Model):
spec_model = db.Column(db.String(255), comment='规格型号')
quantity = db.Column(db.Numeric(19, 4), nullable=False, comment='采购数量')
purchase_date = db.Column(db.Date, nullable=False, comment='采购时间')
supplier_link = db.Column(db.String(500), comment='商家地址链接')
# ★ 用 Text 而非 String(N):电商外链常带很长的跟踪参数,长度没有稳定上界
# (实测一条淘宝链接已 516 字符,超过原先的 varchar(500) 直接报错)。
# 任何有限的 varchar(N) 都只是把报错往后推,且**截断是静默的** ——
# 用户只会觉得「链接打不开」。同 material_base.purchase_link 的处理。
# DDL 见 db_migrations/phase10_purchase_supplier_link_text.sql
supplier_link = db.Column(db.Text, comment='商家地址链接')
remark = db.Column(db.Text, comment='备注信息')
images = db.Column(db.Text, comment='图片列表JSON')
unit_price = db.Column(db.Numeric(19, 4), default=0, comment='不含税单价')