getTable(); try { $this->query("SELECT type FROM {$table} LIMIT 1"); self::$typeColumnExists = true; self::$migrated = true; } catch (\Throwable $e) { // 列不存在 → 尝试自动迁移 try { $this->execute("ALTER TABLE {$table} ADD COLUMN `type` VARCHAR(50) NOT NULL DEFAULT '' COMMENT '类型(成品/半成品/配件)' AFTER `id`"); $this->execute("UPDATE {$table} SET `type` = `product_type` WHERE `type` = ''"); self::$typeColumnExists = true; } catch (\Throwable $migErr) { error_log('[ProductModel] Auto-migration failed: ' . $migErr->getMessage()); self::$typeColumnExists = false; } self::$migrated = true; } return self::$typeColumnExists; } // 获取所有产品型号 public function getAll() { $this->ensureTypeColumn(); return $this->order(['id ASC'])->fetchAll(); } // 添加产品型号 public function addModel($data) { if (!$this->ensureTypeColumn()) { unset($data['type']); // type 列不存在,移除该字段 } return $this->add($data); } // 更新产品型号 public function updateModel($id, $data) { if (!$this->ensureTypeColumn()) { unset($data['type']); } return $this->where(['id = :id'], [':id' => $id])->update($data); } // 删除产品型号 public function deleteModel($id) { return $this->delete($id); } // 根据型号代码查找 public function findByCode($model_code) { return $this->where(['model_code = :code'], [':code' => $model_code])->fetch(); } // 根据类型+产品类型和型号代码联合查找(用于检测同类型下是否重复) public function findByTypeAndCode($type, $product_type, $model_code) { if ($this->ensureTypeColumn()) { return $this->where( ['type = :t', 'product_type = :pt', 'model_code = :mc'], [':t' => $type, ':pt' => $product_type, ':mc' => $model_code] )->fetch(); } // Fallback: type 列不存在,仅在 product_type 和 model_code 上查重 return $this->where( ['product_type = :pt', 'model_code = :mc'], [':pt' => $product_type, ':mc' => $model_code] )->fetch(); } // 根据类型获取该类型下的所有型号(用于前端联动) public function getByType($type) { if (!$this->ensureTypeColumn()) { return []; } return $this->where(['type = :t'], [':t' => $type]) ->order(['model_code ASC']) ->fetchAll(); } // 获取类型列表(去重) public function getTypes() { if (!$this->ensureTypeColumn()) { return []; } $sql = 'SELECT DISTINCT type FROM ' . $this->getTable() . ' WHERE type != \'\' ORDER BY type'; return $this->query($sql); } /** * 获取所有产品类型(product_type 去重列表,用于下拉筛选) * 注意:这是 product_type 字段(自由文本),不是 type(成品/半成品/配件) */ public function getProductTypes() { $table = $this->getTable(); return $this->query( "SELECT DISTINCT product_type FROM {$table} WHERE product_type != '' ORDER BY product_type" ); } /** * 根据类型获取产品型号 * 优先通过 type 字段查询(大分类:成品/半成品/配件), * 如果 type 查不到则通过 product_type 字段查询(子分类:PCBA/电池/外壳等) * 若 type 列不可用,回退到 product_type 字段查询 */ public function getByProductType($productType) { if ($this->ensureTypeColumn()) { // 先尝试 type 字段 $result = $this->getByType($productType); if (!empty($result)) { return $result; } // type 查不到,回退到 product_type 字段 return $this->where(['product_type = :pt'], [':pt' => $productType]) ->order(['model_code ASC']) ->fetchAll(); } // Fallback: type 列不存在,使用 product_type 字段 return $this->where(['product_type = :pt'], [':pt' => $productType]) ->order(['model_code ASC']) ->fetchAll(); } }