$config) { $typeList[] = [ 'key' => $key, 'name' => $config['name'], 'description' => $config['description'] ?? '', 'require_param' => $config['require_param'] ?? false, 'fields' => $config['fields'] ?? [], ]; } return response()->json([ 'success' => true, 'data' => [ 'types' => $typeList ] ]); } /** * 查询互斥配置列表 */ public function list(Request $request) { $data = $request->validate([ 'source_item_id' => 'required|integer|min:1' ]); $sourceItemId = $data['source_item_id']; $exclusions = DB::table('exam_item_exclusion as eie') ->where('eie.source_item_id', $sourceItemId) ->where('eie.deleted', 0) ->leftJoin('exam_item as ei', function ($join) { $join->on('eie.target_id', '=', 'ei.id') ->where('eie.target_type', 'ITEM'); }) ->leftJoin('exam_group as eg', function ($join) { $join->on('eie.target_id', '=', 'eg.id') ->where('eie.target_type', 'GROUP'); }) ->select( 'eie.id', 'eie.source_item_id', 'eie.target_type', 'eie.target_id', DB::raw('IF(eie.target_type = "ITEM", ei.name, eg.name) as target_name'), 'eie.exclusion_type', 'eie.exclusion_value', 'eie.remark', 'eie.status' ) ->orderBy('eie.id') ->get(); return response()->json([ 'success' => true, 'data' => [ 'list' => $exclusions ] ]); } /** * 新增互斥配置 */ public function add(Request $request) { $data = $request->validate([ 'source_item_id' => 'required|integer|min:1', 'target_type' => 'required|in:ITEM,GROUP', 'target_id' => 'required|integer|min:1', 'exclusion_type' => 'required|string|max:50', 'exclusion_value' => 'nullable|string', 'remark' => 'nullable|string|max:255', 'status' => 'nullable|integer|in:0,1' ]); // 验证互斥类型是否存在 $types = config('exclusion.types'); if (!isset($types[$data['exclusion_type']])) { return response()->json([ 'success' => false, 'message' => '无效的互斥类型' ]); } $typeConfig = $types[$data['exclusion_type']]; // 如果需要参数,验证参数值 if ($typeConfig['require_param'] ?? false) { $exclusionValue = $data['exclusion_value'] ?? null; // 验证是否为有效的 JSON if ($exclusionValue) { json_decode($exclusionValue); if (json_last_error() !== JSON_ERROR_NONE) { return response()->json([ 'success' => false, 'message' => '参数值必须是有效的 JSON 格式' ]); } } // 验证各个字段 $fields = $typeConfig['fields'] ?? []; foreach ($fields as $field) { $validationRule = $field['validation'] ?? 'nullable'; $fieldValue = null; if ($exclusionValue) { $decoded = json_decode($exclusionValue, true); $fieldValue = $decoded[$field['key']] ?? null; } $validator = Validator::make([ $field['key'] => $fieldValue ], [ $field['key'] => $validationRule ]); if ($validator->fails()) { return response()->json([ 'success' => false, 'message' => "字段【{$field['label']}】验证失败: " . $validator->errors()->first() ]); } } } // 检查是否已存在相同的互斥配置 $exists = DB::table('exam_item_exclusion') ->where('source_item_id', $data['source_item_id']) ->where('target_type', $data['target_type']) ->where('target_id', $data['target_id']) ->where('deleted', 0) ->exists(); if ($exists) { return response()->json([ 'success' => false, 'message' => '该互斥配置已存在' ]); } // 验证目标是否存在 if ($data['target_type'] === 'ITEM') { $exists = DB::table('exam_item') ->where('id', $data['target_id']) ->where('deleted', 0) ->exists(); } else { $exists = DB::table('exam_group') ->where('id', $data['target_id']) ->exists(); } if (!$exists) { return response()->json([ 'success' => false, 'message' => '互斥目标不存在' ]); } // 插入数据 DB::table('exam_item_exclusion')->insert([ 'source_item_id' => $data['source_item_id'], 'target_type' => $data['target_type'], 'target_id' => $data['target_id'], 'exclusion_type' => $data['exclusion_type'], 'exclusion_value' => $data['exclusion_value'] ?? null, 'remark' => $data['remark'] ?? null, 'status' => $data['status'] ?? 1, 'deleted' => 0, 'created_at' => now(), 'updated_at' => now() ]); return response()->json([ 'success' => true, 'message' => '新增成功' ]); } /** * 更新互斥配置 */ public function update(Request $request) { $data = $request->validate([ 'id' => 'required|integer|min:1', 'target_type' => 'nullable|in:ITEM,GROUP', 'target_id' => 'nullable|integer|min:1', 'exclusion_type' => 'nullable|string|max:50', 'exclusion_value' => 'nullable|string', 'remark' => 'nullable|string|max:255', 'status' => 'nullable|integer|in:0,1' ]); $id = $data['id']; // 检查记录是否存在 $exclusion = DB::table('exam_item_exclusion') ->where('id', $id) ->where('deleted', 0) ->first(); if (!$exclusion) { return response()->json([ 'success' => false, 'message' => '互斥配置不存在' ]); } // 如果更新了互斥类型,验证类型是否有效 if (isset($data['exclusion_type'])) { $types = config('exclusion.types'); if (!isset($types[$data['exclusion_type']])) { return response()->json([ 'success' => false, 'message' => '无效的互斥类型' ]); } $typeConfig = $types[$data['exclusion_type']]; // 如果需要参数,验证参数值 if ($typeConfig['require_param'] ?? false) { $exclusionValue = isset($data['exclusion_value']) ? $data['exclusion_value'] : $exclusion->exclusion_value; // 验证是否为有效的 JSON if ($exclusionValue) { json_decode($exclusionValue); if (json_last_error() !== JSON_ERROR_NONE) { return response()->json([ 'success' => false, 'message' => '参数值必须是有效的 JSON 格式' ]); } } // 验证各个字段 $fields = $typeConfig['fields'] ?? []; foreach ($fields as $field) { $validationRule = $field['validation'] ?? 'nullable'; $fieldValue = null; if ($exclusionValue) { $decoded = json_decode($exclusionValue, true); $fieldValue = $decoded[$field['key']] ?? null; } $validator = Validator::make([ $field['key'] => $fieldValue ], [ $field['key'] => $validationRule ]); if ($validator->fails()) { return response()->json([ 'success' => false, 'message' => "字段【{$field['label']}】验证失败: " . $validator->errors()->first() ]); } } } } $id = $data['id']; // 检查记录是否存在 $exclusion = DB::table('exam_item_exclusion') ->where('id', $id) ->where('deleted', 0) ->first(); if (!$exclusion) { return response()->json([ 'success' => false, 'message' => '互斥配置不存在' ]); } // 构建更新数据 $updateData = [ 'updated_at' => now() ]; if (isset($data['target_type'])) { $updateData['target_type'] = $data['target_type']; } if (isset($data['target_id'])) { $updateData['target_id'] = $data['target_id']; } if (isset($data['exclusion_type'])) { $updateData['exclusion_type'] = $data['exclusion_type']; } if (array_key_exists('exclusion_value', $data)) { $updateData['exclusion_value'] = $data['exclusion_value']; } if (array_key_exists('remark', $data)) { $updateData['remark'] = $data['remark']; } if (isset($data['status'])) { $updateData['status'] = $data['status']; } DB::table('exam_item_exclusion') ->where('id', $id) ->update($updateData); return response()->json([ 'success' => true, 'message' => '更新成功' ]); } /** * 删除互斥配置 */ public function delete(Request $request) { $data = $request->validate([ 'id' => 'required|integer|min:1' ]); $id = $data['id']; // 检查记录是否存在 $exclusion = DB::table('exam_item_exclusion') ->where('id', $id) ->where('deleted', 0) ->first(); if (!$exclusion) { return response()->json([ 'success' => false, 'message' => '互斥配置不存在' ]); } // 逻辑删除 DB::table('exam_item_exclusion') ->where('id', $id) ->update([ 'deleted' => 1, 'updated_at' => now() ]); return response()->json([ 'success' => true, 'message' => '删除成功' ]); } }