1000) throw new \InvalidArgumentException('每次导入1至1000条需求'); $valid = []; $errors = []; $seen = []; foreach (array_values($rows) as $i => $r) { if (!is_array($r)) { $errors[] = ['row' => $i + 2, 'message' => '行数据格式错误']; continue; } $data = array_intersect_key($r, array_flip(self::KEYS)); foreach ($data as $key => $v) $data[$key] = is_scalar($v) ? trim((string) $v) : ''; $data['type'] = ['供应'=>1,'需求'=>2,'投融资'=>3][$data['type'] ?? '需求'] ?? ($data['type'] ?? 2); $data['tag'] = implode(',', array_unique(array_filter(array_map('trim', preg_split('/[、,,]+/u', $data['tag'] ?? '')), 'strlen'))); if (empty($data['expire_time'])) $data['expire_time'] = null; $v = Validator::make($data, ['type'=>'required|integer|in:1,2,3','wechat'=>'nullable|string|max:100','email'=>'nullable|email|max:255','title'=>'required|string|max:100','content'=>'required|string|max:10000', 'tag'=>'nullable|string|max:255','publisher_name'=>'required|string|max:100', 'publisher_company'=>'required|string|max:255', 'publisher_mobile'=>['required','regex:/^1\d{10}$/'],'expire_time'=>'nullable|date_format:Y-m-d']); if ($v->fails()) { $errors[] = ['row' => $i + 2, 'message' => implode(';', $v->errors()->all())]; continue; } $key = hash('sha256', $data['publisher_mobile'] . '|' . $data['title'] . '|' . $data['content']); if (isset($seen[$key]) || SupplyDemand::withTrashed()->where('import_key', $key)->exists()) { $errors[] = ['row' => $i + 2, 'message' => '重复需求,请核实后移除该行']; continue; } $seen[$key] = true; $data['import_key'] = $key; if ($data['expire_time']) $data['expire_time'] .= ' 23:59:59'; $valid[] = $data; } return ['rows' => $valid, 'errors' => $errors, 'total' => count($rows)]; } }