where('factory_id', $factoryId)->where('code', $code)->find(); $data = [ 'code' => $code, 'name' => $name, 'spec' => self::str($payload, ['spec'], 100), 'unit' => self::str($payload, ['unit'], 20) ?: '件', 'remark' => self::str($payload, ['remark'], 255), 'status' => 'normal', 'creator_user_id' => $userId, ]; if ($row) { unset($data['creator_user_id']); $row->allowField(true)->save($data); } else { $row = new Product(); $row->allowField(true)->save($data); } ProcessWriter::save($row->id, $processes, 'product'); return $row; } /** * @param array $payload * @param int $userId * @return Workorder * @throws Exception */ public static function saveWorkorder(array $payload, $userId = 0) { $factoryId = FactoryContext::requireId(); $no = self::str($payload, ['no', 'workorder_no', 'code'], 64); if ($no === '') { $no = 'WO' . date('ymdHis') . substr((string)mt_rand(100, 999), 0, 3); } $productId = (int)($payload['product_id'] ?? 0); $productCode = self::str($payload, ['product_code'], 64); if ($productId <= 0 && $productCode !== '') { $product = (new Product())->where('factory_id', $factoryId)->where('code', $productCode)->find(); if (!$product) { $product = self::saveProduct([ 'code' => $productCode, 'name' => self::str($payload, ['product_name', 'name'], 100) ?: $productCode, 'spec' => self::str($payload, ['spec'], 100), 'unit' => self::str($payload, ['unit'], 20), 'processes' => [], ], $userId); } $productId = (int)$product->id; } $processes = self::normalizeProcesses($payload); if (!$processes && $productId > 0) { $product = Product::with('processes')->find($productId); $processes = $product ? $product['processes'] : []; } $productName = self::str($payload, ['product_name', 'name'], 100); if ($productName === '' && $productId > 0) { $linked = isset($product) ? $product : Product::get($productId); $productName = $linked ? (string)$linked['name'] : ''; } if ($productName === '') { throw new Exception('请选择产品或填写名称'); } $spec = self::str($payload, ['spec'], 100); if ($spec === '' && $productId > 0) { $linked = isset($product) ? $product : Product::get($productId); $spec = $linked ? (string)$linked['spec'] : ''; } $row = (new Workorder())->where('factory_id', $factoryId)->where('no', $no)->find(); $data = [ 'no' => $no, 'product_id' => $productId, 'product_name' => $productName, 'spec' => $spec, 'batch_no' => self::str($payload, ['batch_no', 'batch'], 64), 'customer' => self::str($payload, ['customer'], 100), 'plan_date' => self::date($payload, ['plan_date', 'date']), 'remark' => self::str($payload, ['remark'], 255), 'status' => self::str($payload, ['status'], 20) ?: 'draft', 'creator_user_id' => $userId, ]; if ($row) { unset($data['creator_user_id']); $row->allowField(true)->save($data); } else { $row = new Workorder(); $row->allowField(true)->save($data); } ProcessWriter::save($row->id, $processes, 'workorder'); return $row; } /** * @param array $payload * @return array */ public static function normalizeProcesses($payload) { $rows = []; if (isset($payload['processes']) && is_array($payload['processes'])) { $rows = $payload['processes']; } elseif (isset($payload['process_list']) && is_array($payload['process_list'])) { $rows = $payload['process_list']; } $out = []; $seq = 1; foreach ($rows as $row) { if (!is_array($row)) { continue; } $name = self::str($row, ['name', 'process_name', 'title'], 100); $code = self::str($row, ['code', 'process_code', 'no'], 64); if ($name === '' && $code === '') { continue; } $out[] = [ 'seq' => isset($row['seq']) && $row['seq'] !== '' ? (int)$row['seq'] : $seq, 'code' => $code, 'name' => $name !== '' ? $name : $code, 'workstation' => self::str($row, ['workstation', 'station'], 64), 'standard_time' => self::str($row, ['standard_time', 'time'], 32), 'qc_points' => self::str($row, ['qc_points', 'qc'], 255), 'remark' => self::str($row, ['remark'], 255), ]; $seq++; } return $out; } protected static function str(array $data, array $keys, $max = 255) { foreach ($keys as $key) { if (!isset($data[$key])) { continue; } $v = trim((string)$data[$key]); if ($v !== '') { return mb_substr($v, 0, $max); } } return ''; } protected static function num(array $data, array $keys) { foreach ($keys as $key) { if (!isset($data[$key]) || $data[$key] === '') { continue; } return (float)$data[$key]; } return 0; } protected static function date(array $data, array $keys) { $v = self::str($data, $keys, 32); if ($v === '') { return null; } $ts = strtotime($v); return $ts ? date('Y-m-d', $ts) : null; } }