fix:添加表格中新增的字段

This commit is contained in:
shijing 2026-03-19 10:00:36 +08:00
parent a6456966b6
commit eb85d3a78a
7 changed files with 111 additions and 9 deletions

View File

@ -245,8 +245,6 @@ class Command(BaseCommand):
material_subcategory = _single_line(get(row, "材料子类"))
if not material_category:
material_category = "-"
if not material_subcategory:
material_subcategory = "-"
application_scene = _parse_application_scene(get(row, "应用场景"))
replace_type = REPLACE_TYPE_MAP.get(_cell(get(row, "替代材料")))
@ -256,9 +254,14 @@ class Command(BaseCommand):
"name": name[:255],
"major_category": major_category,
"material_category": material_category,
"material_subcategory": material_subcategory,
"material_subcategory": material_subcategory or None,
"stage": _parse_choice(get(row, "阶段"), STAGE_VALUES),
"importance_level": _parse_choice(get(row, "重要等级"), IMPORTANCE_LEVEL_VALUES),
"landing_project": _single_line(get(row, "落地项目")) or None,
"contact_person": _single_line(get(row, "对接人")) or None,
"contact_phone": _single_line(get(row, "对接人联系方式")) or None,
"handler": _single_line(get(row, "经办人")) or None,
"remark": _single_line(get(row, "备注")) or None,
"spec": _single_line(get(row, "规格型号")) or None,
"standard": _single_line(get(row, "符合标准")) or None,
"application_scene": application_scene or None,

View File

@ -0,0 +1,38 @@
# Generated by Django 4.2.7 on 2026-03-19 01:19
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('material', '0004_alter_material_options_and_more'),
]
operations = [
migrations.AddField(
model_name='material',
name='contact_person',
field=models.CharField(blank=True, max_length=255, null=True, verbose_name='对接人'),
),
migrations.AddField(
model_name='material',
name='contact_phone',
field=models.CharField(blank=True, max_length=255, null=True, verbose_name='对接人联系方式'),
),
migrations.AddField(
model_name='material',
name='handler',
field=models.CharField(blank=True, max_length=255, null=True, verbose_name='经办人'),
),
migrations.AddField(
model_name='material',
name='landing_project',
field=models.CharField(blank=True, max_length=255, null=True, verbose_name='落地项目'),
),
migrations.AddField(
model_name='material',
name='remark',
field=models.CharField(blank=True, max_length=255, null=True, verbose_name='备注'),
),
]

View File

@ -0,0 +1,18 @@
# Generated by Django 4.2.7 on 2026-03-19 01:37
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('material', '0005_alter_material_options_and_more'),
]
operations = [
migrations.AlterField(
model_name='material',
name='material_subcategory',
field=models.CharField(blank=True, max_length=255, null=True, verbose_name='材料子分类'),
),
]

View File

@ -59,9 +59,14 @@ class Material(models.Model):
name = models.CharField(max_length=255, verbose_name='材料名称')
major_category = models.CharField(max_length=20, choices=MAJOR_CATEGORY_CHOICES, verbose_name='专业类别')
material_category = models.CharField(max_length=255, verbose_name='材料分类')
material_subcategory = models.CharField(max_length=255, verbose_name='材料子分类')
material_subcategory = models.CharField(max_length=255, blank=True, null=True, verbose_name='材料子分类')
stage = models.CharField(max_length=20, choices=STAGE_CHOICES, blank=True, null=True, verbose_name='阶段')
importance_level = models.CharField(max_length=20, choices=IMPORTANCE_LEVEL_CHOICES, blank=True, null=True, verbose_name='重要等级')
landing_project = models.CharField(max_length=255, blank=True, null=True, verbose_name='落地项目')
contact_person = models.CharField(max_length=255, blank=True, null=True, verbose_name='对接人')
contact_phone = models.CharField(max_length=255, blank=True, null=True, verbose_name='对接人联系方式')
handler = models.CharField(max_length=255, blank=True, null=True, verbose_name='经办人')
remark = models.CharField(max_length=255, blank=True, null=True, verbose_name='备注')
spec = models.CharField(max_length=255, blank=True, null=True, verbose_name='规格型号')
standard = models.CharField(max_length=255, blank=True, null=True, verbose_name='符合标准')
application_scene = models.JSONField(default=list, blank=True, null=True, verbose_name='应用场景')

View File

@ -44,7 +44,8 @@ class MaterialSerializer(serializers.ModelSerializer):
model = Material
fields = ['id', 'name', 'major_category', 'major_category_display',
'material_category', 'material_subcategory', 'stage', 'stage_display',
'importance_level', 'importance_level_display', 'spec', 'standard',
'importance_level', 'importance_level_display', 'landing_project',
'contact_person', 'contact_phone', 'handler', 'remark', 'spec', 'standard',
'application_scene', 'application_scene_display', 'application_desc',
'replace_type', 'replace_type_display', 'advantage', 'advantage_display',
'advantage_desc', 'cost_compare', 'cost_desc', 'cases', 'brochure',
@ -91,7 +92,8 @@ class MaterialListSerializer(serializers.ModelSerializer):
model = Material
fields = ['id', 'name', 'major_category', 'major_category_display',
'material_category', 'material_subcategory', 'stage', 'stage_display',
'importance_level', 'importance_level_display', 'factory',
'importance_level', 'importance_level_display', 'landing_project',
'contact_person', 'contact_phone', 'handler', 'remark', 'factory',
'factory_name', 'brand', 'status', 'status_display']

View File

@ -12,6 +12,11 @@
<el-descriptions-item label="材料子类">{{ displayText(material.material_subcategory) }}</el-descriptions-item>
<el-descriptions-item label="阶段">{{ displayText(material.stage_display) }}</el-descriptions-item>
<el-descriptions-item label="重要等级">{{ displayText(material.importance_level_display) }}</el-descriptions-item>
<el-descriptions-item label="落地项目">{{ displayText(material.landing_project) }}</el-descriptions-item>
<el-descriptions-item label="对接人">{{ displayText(material.contact_person) }}</el-descriptions-item>
<el-descriptions-item label="对接人联系方式">{{ displayText(material.contact_phone) }}</el-descriptions-item>
<el-descriptions-item label="经办人">{{ displayText(material.handler) }}</el-descriptions-item>
<el-descriptions-item label="备注">{{ displayText(material.remark) }}</el-descriptions-item>
<el-descriptions-item label="规格型号">{{ displayText(material.spec) }}</el-descriptions-item>
<el-descriptions-item label="符合标准">{{ displayText(material.standard) }}</el-descriptions-item>
<el-descriptions-item label="应用场景">{{ displayList(material.application_scene_display) }}</el-descriptions-item>

View File

@ -20,6 +20,11 @@
<el-table-column prop="material_subcategory" label="材料子类" />
<el-table-column prop="stage_display" label="阶段" />
<el-table-column prop="importance_level_display" label="重要等级" />
<el-table-column prop="landing_project" label="落地项目" />
<el-table-column prop="contact_person" label="对接人" />
<el-table-column prop="contact_phone" label="对接人联系方式" />
<el-table-column prop="handler" label="经办人" />
<el-table-column prop="remark" label="备注" />
<el-table-column prop="brand" label="所属工厂" />
<el-table-column prop="status_display" label="状态" width="120" />
<el-table-column label="操作" width="320">
@ -63,8 +68,8 @@
<el-option v-for="item in categoryOptions" :key="item.value" :label="item.name" :value="item.value" />
</el-select>
</el-form-item>
<el-form-item label="材料子类" required>
<el-select v-model="form.material_subcategory" filterable>
<el-form-item label="材料子类">
<el-select v-model="form.material_subcategory" filterable clearable>
<el-option v-for="item in subcategoryOptions" :key="item.value" :label="item.name" :value="item.value" />
</el-select>
</el-form-item>
@ -78,6 +83,21 @@
<el-option v-for="item in importanceLevelOptions" :key="item[0]" :label="item[1]" :value="item[0]" />
</el-select>
</el-form-item>
<el-form-item label="落地项目">
<el-input v-model="form.landing_project" />
</el-form-item>
<el-form-item label="对接人">
<el-input v-model="form.contact_person" />
</el-form-item>
<el-form-item label="对接人联系方式">
<el-input v-model="form.contact_phone" />
</el-form-item>
<el-form-item label="经办人">
<el-input v-model="form.handler" />
</el-form-item>
<el-form-item label="备注">
<el-input v-model="form.remark" />
</el-form-item>
<el-form-item label="规格型号">
<el-input v-model="form.spec" />
</el-form-item>
@ -214,6 +234,11 @@ const form = reactive({
material_subcategory: '',
stage: '',
importance_level: '',
landing_project: '',
contact_person: '',
contact_phone: '',
handler: '',
remark: '',
spec: '',
standard: '',
application_scene: [],
@ -311,6 +336,11 @@ const resetForm = () => {
material_subcategory: '',
stage: '',
importance_level: '',
landing_project: '',
contact_person: '',
contact_phone: '',
handler: '',
remark: '',
spec: '',
standard: '',
application_scene: [],
@ -397,10 +427,11 @@ const onSave = async () => {
await updateMaterial(currentId.value, payload)
} else {
await createMaterial(payload)
pagination.page = 1
}
ElMessage.success('保存成功')
dialogVisible.value = false
loadMaterials()
await loadMaterials()
} catch (error) {
ElMessage.error(error.response?.data?.detail || '保存失败')
}