[ ['name'=>'product_type','label'=>'类型','type'=>'select','source'=>'type_list','required'=>true,'enabled'=>true,'placeholder'=>'请选择类型','col_width'=>2,'is_scan'=>false,'show_in_table'=>true,'table_label'=>'类型'], ['name'=>'product_model','label'=>'产品型号','type'=>'select','source'=>'product_models','required'=>true,'enabled'=>true,'placeholder'=>'请选择产品型号','col_width'=>2,'is_scan'=>false,'show_in_table'=>false,'table_label'=>'产品型号'], ['name'=>'serial_no','label'=>'产品序列号','type'=>'text','required'=>true,'enabled'=>true,'placeholder'=>'扫描/输入后按回车','col_width'=>3,'is_scan'=>true,'show_in_table'=>true,'table_label'=>'产品序列号'], ], 'pcb_test' => [ ['name'=>'product_type','label'=>'产品类型','type'=>'hidden','required'=>true,'enabled'=>true,'placeholder'=>'PCBA','col_width'=>0,'is_scan'=>false,'show_in_table'=>true,'table_label'=>'产品类型','fixed_value'=>'PCBA'], ['name'=>'product_model','label'=>'产品型号','type'=>'select','source'=>'product_models','required'=>true,'enabled'=>true,'placeholder'=>'请选择产品型号','col_width'=>2,'is_scan'=>false,'show_in_table'=>true,'table_label'=>'产品型号'], ['name'=>'static_power','label'=>'静态功耗','type'=>'number','required'=>false,'enabled'=>true,'placeholder'=>'0.0000','col_width'=>2,'is_scan'=>false,'show_in_table'=>true,'table_label'=>'静态功耗'], ['name'=>'input_output','label'=>'输入输出','type'=>'text','required'=>false,'enabled'=>true,'placeholder'=>'正常/异常','col_width'=>2,'is_scan'=>false,'show_in_table'=>true,'table_label'=>'输入输出'], ['name'=>'test_status','label'=>'测试状态','type'=>'select','source'=>'test_status_options','required'=>false,'enabled'=>true,'placeholder'=>'请选择','col_width'=>2,'is_scan'=>false,'show_in_table'=>true,'table_label'=>'测试状态'], ['name'=>'serial_no','label'=>'PCBA序列号','type'=>'text','required'=>true,'enabled'=>true,'placeholder'=>'扫描 PCBA 序列号后按回车','col_width'=>6,'is_scan'=>true,'show_in_table'=>true,'table_label'=>'PCBA序列号'], ], 'battery' => [ ['name'=>'product_type','label'=>'类型','type'=>'hidden','required'=>true,'enabled'=>true,'placeholder'=>'电池','col_width'=>0,'is_scan'=>false,'show_in_table'=>true,'table_label'=>'类型','fixed_value'=>'电池'], ['name'=>'product_model','label'=>'产品型号','type'=>'select','source'=>'product_models','required'=>true,'enabled'=>true,'placeholder'=>'请选择产品型号','col_width'=>3,'is_scan'=>false,'show_in_table'=>true,'table_label'=>'产品型号'], ['name'=>'voltage_platform','label'=>'电压平台','type'=>'text','required'=>false,'enabled'=>true,'placeholder'=>'如:3.7V','col_width'=>2,'is_scan'=>false,'show_in_table'=>true,'table_label'=>'电压平台'], ['name'=>'no_load_voltage','label'=>'空载电压','type'=>'number','required'=>false,'enabled'=>true,'placeholder'=>'0.0000','col_width'=>2,'is_scan'=>false,'show_in_table'=>true,'table_label'=>'空载电压'], ['name'=>'internal_resistance','label'=>'电池内阻','type'=>'number','required'=>false,'enabled'=>true,'placeholder'=>'0.0000','col_width'=>2,'is_scan'=>false,'show_in_table'=>true,'table_label'=>'电池内阻'], ['name'=>'serial_no','label'=>'产品序列号','type'=>'text','required'=>true,'enabled'=>true,'placeholder'=>'扫描/输入后按回车','col_width'=>4,'is_scan'=>true,'show_in_table'=>true,'table_label'=>'产品序列号'], ], 'assembly' => [ ['name'=>'product_model','label'=>'产品型号','type'=>'select','source'=>'product_models','required'=>true,'enabled'=>true,'placeholder'=>'请选择产品型号','col_width'=>2,'is_scan'=>false,'show_in_table'=>true,'table_label'=>'产品型号'], ['name'=>'shell_color','label'=>'外壳颜色','type'=>'select','source'=>'shell_color_options','required'=>false,'enabled'=>true,'placeholder'=>'请选择外壳颜色','col_width'=>2,'is_scan'=>false,'show_in_table'=>true,'table_label'=>'外壳颜色'], ['name'=>'finished_serial','label'=>'成品序列号','type'=>'text','required'=>true,'enabled'=>true,'placeholder'=>'扫描成品序列号','col_width'=>3,'is_scan'=>true,'show_in_table'=>true,'table_label'=>'成品序列号'], ['name'=>'battery_serial','label'=>'电池序列号','type'=>'text','required'=>true,'enabled'=>true,'placeholder'=>'扫描电池序列号','col_width'=>3,'is_scan'=>true,'show_in_table'=>true,'table_label'=>'电池序列号'], ['name'=>'pcb_serial','label'=>'PCB序列号','type'=>'text','required'=>true,'enabled'=>true,'placeholder'=>'扫描PCB序列号','col_width'=>2,'is_scan'=>true,'show_in_table'=>true,'table_label'=>'PCB序列号'], ], 'finished_test' => [ ['name'=>'product_model','label'=>'产品型号','type'=>'select','source'=>'product_models','required'=>false,'enabled'=>true,'placeholder'=>'请选择产品型号','col_width'=>2,'is_scan'=>false,'show_in_table'=>true,'table_label'=>'产品型号'], ['name'=>'test_item','label'=>'测试项目','type'=>'text','required'=>true,'enabled'=>true,'placeholder'=>'如:功能测试','col_width'=>2,'is_scan'=>false,'show_in_table'=>true,'table_label'=>'测试项目'], ['name'=>'test_result','label'=>'测试结果','type'=>'select','source'=>'test_result_options','required'=>false,'enabled'=>true,'placeholder'=>'请选择','col_width'=>2,'is_scan'=>false,'show_in_table'=>true,'table_label'=>'测试结果'], ['name'=>'test_steps','label'=>'测试步骤','type'=>'text','required'=>false,'enabled'=>true,'placeholder'=>'步骤描述','col_width'=>2,'is_scan'=>false,'show_in_table'=>true,'table_label'=>'测试步骤'], ['name'=>'finished_serial','label'=>'成品序列号','type'=>'text','required'=>true,'enabled'=>true,'placeholder'=>'扫描序列号后按回车','col_width'=>4,'is_scan'=>true,'show_in_table'=>true,'table_label'=>'成品序列号'], ], 'warehouse' => [ ['name'=>'product_model','label'=>'产品型号','type'=>'select','source'=>'product_models','required'=>false,'enabled'=>true,'placeholder'=>'请选择产品型号','col_width'=>3,'is_scan'=>false,'show_in_table'=>true,'table_label'=>'产品型号'], ['name'=>'finished_serial','label'=>'成品序列号','type'=>'text','required'=>true,'enabled'=>true,'placeholder'=>'扫描成品序列号后按回车','col_width'=>4,'is_scan'=>true,'show_in_table'=>true,'table_label'=>'成品序列号'], ['name'=>'box_serial','label'=>'箱序列号','type'=>'text','required'=>false,'enabled'=>true,'placeholder'=>'箱序列号','col_width'=>3,'is_scan'=>false,'show_in_table'=>true,'table_label'=>'箱序列号'], ], 'delivery' => [ ['name'=>'customer_name','label'=>'客户名称','type'=>'select','source'=>'customers','required'=>true,'enabled'=>true,'placeholder'=>'请选择客户','col_width'=>3,'is_scan'=>false,'show_in_table'=>true,'table_label'=>'客户名称'], ['name'=>'finished_serial','label'=>'成品/箱序列号','type'=>'text','required'=>true,'enabled'=>true,'placeholder'=>'扫描序列号后按回车(自动识别型号)','col_width'=>4,'is_scan'=>true,'show_in_table'=>true,'table_label'=>'序列号'], ['name'=>'product_model','label'=>'产品型号','type'=>'hidden','required'=>false,'enabled'=>true,'placeholder'=>'','col_width'=>0,'is_scan'=>false,'show_in_table'=>true,'table_label'=>'产品型号'], ], 'semi_finished' => [ ['name'=>'product_type','label'=>'类型','type'=>'hidden','required'=>true,'enabled'=>true,'placeholder'=>'半成品','col_width'=>0,'is_scan'=>false,'show_in_table'=>true,'table_label'=>'类型','fixed_value'=>'半成品'], ['name'=>'product_model','label'=>'产品型号','type'=>'select','source'=>'product_models','required'=>true,'enabled'=>true,'placeholder'=>'请选择产品型号','col_width'=>3,'is_scan'=>false,'show_in_table'=>true,'table_label'=>'产品型号'], ['name'=>'serial_no','label'=>'产品序列号','type'=>'text','required'=>true,'enabled'=>true,'placeholder'=>'扫描/输入后按回车','col_width'=>4,'is_scan'=>true,'show_in_table'=>true,'table_label'=>'产品序列号'], ], 'aging' => [ ['name'=>'product_type','label'=>'类型','type'=>'hidden','required'=>true,'enabled'=>true,'placeholder'=>'半成品','col_width'=>0,'is_scan'=>false,'show_in_table'=>true,'table_label'=>'类型','fixed_value'=>'半成品'], ['name'=>'product_model','label'=>'产品型号','type'=>'select','source'=>'product_models','required'=>true,'enabled'=>true,'placeholder'=>'请选择产品型号','col_width'=>3,'is_scan'=>false,'show_in_table'=>true,'table_label'=>'产品型号'], ['name'=>'serial_no','label'=>'产品序列号','type'=>'text','required'=>true,'enabled'=>true,'placeholder'=>'扫描/输入后按回车','col_width'=>4,'is_scan'=>true,'show_in_table'=>true,'table_label'=>'产品序列号'], ['name'=>'aging_duration','label'=>'老化时长(h)','type'=>'number','required'=>false,'enabled'=>true,'placeholder'=>'如:24','col_width'=>2,'is_scan'=>false,'show_in_table'=>true,'table_label'=>'老化时长'], ['name'=>'aging_temp','label'=>'老化温度(℃)','type'=>'number','required'=>false,'enabled'=>true,'placeholder'=>'如:85','col_width'=>2,'is_scan'=>false,'show_in_table'=>true,'table_label'=>'老化温度'], ['name'=>'aging_result','label'=>'老化结果','type'=>'select','source'=>'test_result_options','required'=>false,'enabled'=>true,'placeholder'=>'请选择','col_width'=>2,'is_scan'=>false,'show_in_table'=>true,'table_label'=>'老化结果'], ], ]; $fields = isset($configs[$stationType]) ? $configs[$stationType] : []; // ★ 关键修复:附加默认 _meta 信息 // 当 workstation.fields_config 为空时,FrontController::getStationFieldConfig() // 会 fallback 到 getDefaultFieldsConfig(),但之前没有附加 _meta, // 导致 model_type_filter、type_filter 等元信息丢失。 $meta = getDefaultMetaConfig($stationType); if (!empty($meta)) { $fields['_meta'] = $meta; } return $fields; } /** * 获取各工位类型的默认元信息配置 * 当数据库 fields_config 为空时作为兜底 */ function getDefaultMetaConfig($stationType) { $metas = [ 'inbound' => [ 'model_type_filter' => '半成品', 'type_filter' => 'inbound', ], 'pcb_test' => [ 'model_type_filter' => 'PCBA', ], 'battery' => [ 'model_type_filter' => '电池', ], 'assembly' => [ 'model_type_filter' => '成品', 'extra_data_sources' => ['shellColors' => true], ], 'finished_test' => [ 'model_type_filter' => '成品', ], 'warehouse' => [ 'model_type_filter' => '成品', ], 'delivery' => [], 'semi_finished' => [ 'model_type_filter' => '半成品', ], 'aging' => [ 'model_type_filter' => '半成品', ], ]; return $metas[$stationType] ?? []; } /** * 解析工位字段配置 * 返回数组,如果为空则使用默认配置 * * JSON 格式支持两种结构: * 1. 纯字段数组:[{name,label,...}, ...] (旧格式,兼容) * 2. 元信息 + 字段:{"_meta":{...}, "fields":[{...}, ...]} (新格式) * * _meta 支持的字段: * - model_type_filter: string 产品型号筛选类型(如 "成品"、"PCBA"、"电池") * - type_filter: string 类型列表筛选方式(如 "inbound"、"enabled") * - extra_data_sources: object 额外数据源配置 */ function parseFieldsConfig($stationType, $fieldsConfigJson = '') { if (!empty($fieldsConfigJson)) { $config = json_decode($fieldsConfigJson, true); if (is_array($config) && !empty($config)) { // 新格式:{"_meta":{...}, "fields":[...]} if (isset($config['_meta']) || isset($config['fields'])) { $result = $config['fields'] ?? []; $meta = $config['_meta'] ?? []; // 用默认元信息补全缺失的 key(如 model_type_filter) $defaultMeta = getDefaultMetaConfig($stationType); if (!empty($defaultMeta)) { foreach ($defaultMeta as $k => $v) { if (!array_key_exists($k, $meta)) { $meta[$k] = $v; } } } $result['_meta'] = $meta; return $result; } // 旧格式:纯字段数组 — 附加默认元信息 $meta = getDefaultMetaConfig($stationType); if (!empty($meta)) { $config['_meta'] = $meta; } return $config; } } // 回退到默认配置,附加默认元信息 $defaultFields = getDefaultFieldsConfig($stationType); $meta = getDefaultMetaConfig($stationType); if (!empty($meta)) { $defaultFields['_meta'] = $meta; } return $defaultFields; } /** * 渲染前端表单输入字段 (根据配置动态生成) * $fieldConfigs: 解析后的字段配置数组 * $dataSources: ['types' => [], 'models' => [], 'customers' => []] * $isReadonly: 操作人显示名称 */ function renderStationFields($fieldConfigs, $dataSources = [], $operatorName = '', $excludeFields = []) { $html = ''; $enabledFields = array_filter($fieldConfigs, function($f) { return !empty($f['enabled']); }); // 排除指定字段 if (!empty($excludeFields)) { $enabledFields = array_filter($enabledFields, function($f) use ($excludeFields) { return !in_array($f['name'], $excludeFields); }); } // 分组:扫描字段和其他字段 $scanFields = array_filter($enabledFields, function($f) { return !empty($f['is_scan']); }); $normalFields = array_filter($enabledFields, function($f) { return empty($f['is_scan']); }); // 输出所有非扫描字段 + 操作人(CSS Grid 自适应布局) $html .= '
为扫描字段(is_scan=true)指定对应的产品类型,提交时将自动验证序列号前缀是否正确。
选择「动态匹配」则根据提交时选择的 product_type 自动匹配前缀。
| 扫描字段 | 对应产品类型 | 预期前缀 |
|---|
| 启用 | 字段名 | 显示标签 | 类型 | 数据源 | 必填 | 唯一 | 占位提示 | 列宽 | 扫码 | 表中 | 表头标签 | 操作 |
|---|