# 供应商新增工商与合作信息字段 — 设计文档 **日期**:2026-04-24 **范围**:在 `Factory`(供应商)模型上新增 3 个业务字段,并在前端列表、表单、详情页同步展示/编辑。 ## 目标 满足供应商资料登记的新业务要求: 1. 工商注册信息 — 本期仅记录**统一社会信用代码**(其余工商字段本期不做) 2. **交互能力** — 包含最大月供量、常规库存量、生产周期、运输方式、应急供货响应时间等信息(本期先用单个大文本框承载) 3. **合作模式** — 厂家直供 / 授权代理商 二选一 ## 新增字段 | 字段 | DB 类型 | DB 约束 | 表单必填 | 校验规则 | |---|---|---|---|---| | `unified_social_credit_code` 统一社会信用代码 | `CharField(max_length=18)` | `null=True, blank=True` | ✅ 必填 | 正则 `^[0-9A-Z]{18}$` — 长度 18,仅数字 + 大写字母 | | `interaction_capability` 交互能力 | `TextField` | `null=True, blank=True` | 选填 | 无;前端 textarea 的 placeholder 提示:"最大月供量 / 常规库存量 / 生产周期 / 运输方式 / 应急供货响应时间" | | `cooperation_mode` 合作模式 | `CharField(max_length=20, choices=COOPERATION_MODE_CHOICES)` | `null=True, blank=True` | ✅ 必填 | choices: `direct='厂家直供'`, `authorized='授权代理商'` | ### 存量数据策略 三个字段在数据库层均允许为空(`null=True, blank=True`),用以兼容已有的供应商记录。前端表单和后端 serializer 在新增/编辑时强制校验"必填"字段。 对用户行为的影响: - 历史供应商记录在列表/详情页展示为 `-` - 用户第一次编辑历史供应商时,两个"必填"字段必须补齐才能保存,否则前/后端都会拦截 ### 校验位置 | 校验点 | 统一社会信用代码 | 合作模式 | 交互能力 | |---|---|---|---| | 前端 `el-form rules` | 必填 + 正则 | 必填(在 choices 内) | 无 | | 后端 `serializer.validate_*` | 必填 + 正则 | 必填(在 choices 内) | 无 | 后端 `null=True, blank=True` 的字段在序列化器层面仍然通过 `required=True` 覆盖为必填。 ## 改动清单 ### 后端 `backend/apps/factory/` - **`models.py`**: - 在 `Factory` 模型上新增 3 个字段 - 新增常量 `COOPERATION_MODE_CHOICES = [('direct', '厂家直供'), ('authorized', '授权代理商')]` - **`migrations/0005_add_business_info.py`**:新增 3 字段的 Django migration - **`serializers.py`**: - `FactorySerializer.Meta.fields` 追加 3 个字段 - `FactorySerializer` 新增 `cooperation_mode_display` 只读字段(`source='get_cooperation_mode_display'`) - `FactorySerializer` 新增 `validate_unified_social_credit_code` 方法做正则校验 + 必填 - `FactorySerializer` 对 `unified_social_credit_code` 和 `cooperation_mode` 显式 `required=True, allow_null=False, allow_blank=False` 覆盖模型的 null/blank - `FactoryListSerializer.Meta.fields` 追加 `cooperation_mode` 和 `cooperation_mode_display` ### 前端 `frontend/src/views/` - **`FactoryManage.vue`**: - 列表在"经销商"列之后新增「合作模式」列(`min-width: 120`,显示 `cooperation_mode_display`) - dialog 表单新增 3 个表单项: - 统一社会信用代码 — ``,含 form rules(必填 + 正则) - 合作模式 — ``(厂家直供 / 授权代理商),含 form rules(必填) - 交互能力 — ``,提示语 placeholder,3~6 行高度 - `form` reactive 对象新增 3 个字段;`resetForm()` 同步新增 - `onSubmit` 前走 `formRef.validate()`;新增 form rules 定义 - **`FactoryDetail.vue`**: - `` 新增 3 行:统一社会信用代码、合作模式(使用 `cooperation_mode_display`)、交互能力 - 交互能力内容可能较长,需保持换行(`white-space: pre-wrap`) ## 非目标(YAGNI) - 工商注册信息中的注册资本/注册地址/法人代表/营业期限/实缴资本/认缴资本等字段本期不做 - 资质证书(生产许可证、安全生产许可证、绿色建材认证、ISO 三体系等)本期不做 - 交互能力本期不拆分为结构化子字段(如独立的月供量/库存量/生产周期字段)。后续如有按字段检索/对比的需求再演进 - 统一社会信用代码本期不做末位校验码算法验证 - 文件上传、附件管理本期不涉及 ## 验收 - [ ] 新建供应商:填完所有必填字段(含新增的 2 个必填)能成功保存;任一必填字段留空或格式错时,前/后端都拦截 - [ ] 编辑历史供应商(历史字段为空):必须补齐两个必填字段后才能保存 - [ ] 列表页展示「合作模式」列,值为中文标签("厂家直供"/"授权代理商"),历史数据显示 `-` - [ ] 详情页展示三个新字段;历史数据显示 `-` - [ ] 统一社会信用代码校验:长度非 18 或含小写字母/非字母数字字符被拦截