Merge branch 'Wren' into shiy-login

This commit is contained in:
2025-07-24 09:46:41 +08:00
6 changed files with 236 additions and 151 deletions
+10 -11
View File
@@ -26,15 +26,14 @@ function extractApiData<T>(responseData: unknown): T | null {
export interface SubmitOpinionRequest {
reviewPointResultId: string | number;
documentId: string | number;
auditPoint: string;
foundIssue: string;
evaluationPointId: number; // 必须是数字ID
auditOpinion: string;
deductionScore: number;
}
/**
* 提出意见的响应接口
*/
*/
export interface SubmitOpinionResponse {
success: boolean;
message: string;
@@ -117,20 +116,20 @@ export async function findIsProposer(taskId: string | number, userId: number | u
*/
export async function submitCrossCheckingOpinion(
opinionData: SubmitOpinionRequest,
jwtToken?: string
jwtToken?: string,
userInfo?: { user_id: number }
): Promise<ApiResponse<SubmitOpinionResponse>> {
try {
// 获取JWT token
const token = await safeGetJWT(jwtToken);
const requestData = {
proposer_user_id: 1,
evaluation_result_id: opinionData.reviewPointResultId,
// document_id: opinionData.documentId,
// audit_point: opinionData.auditPoint,
// found_issue: opinionData.foundIssue,
proposed_score: opinionData.deductionScore,
reason: opinionData.auditOpinion
document_id: opinionData.documentId,
evaluation_point_id: Number(opinionData.evaluationPointId), // 强制转数字
proposed_score: opinionData.deductionScore,
reason: opinionData.auditOpinion,
proposer_id: userInfo?.user_id || 1,
evaluation_result_id: opinionData.reviewPointResultId
};
const response = await fetch(`${API_BASE_URL}/admin/cross_review/proposals`, {
+49 -49
View File
@@ -65,8 +65,14 @@ export interface CrossCheckingUploadedFile {
/**
* 将文件转换为二进制数据
*/
export async function uploadFileToBinary(file: File): Promise<ArrayBuffer> {
export async function uploadFileToBinary(file: File | Blob): Promise<ArrayBuffer> {
return new Promise((resolve, reject) => {
// 只保留简单类型检查和调试
if (!(file instanceof File) && !(file instanceof Blob)) {
reject(new Error(`参数必须是File或Blob对象,当前类型: ${typeof file}`));
return;
}
const reader = new FileReader();
reader.onload = () => {
if (reader.result instanceof ArrayBuffer) {
@@ -206,75 +212,69 @@ export async function uploadCrossCheckingDocument(
}
/**
* 批量上传交叉评查文件
* 批量上传并自动分配交叉评查任务(新接口适配)
* @param files 文件列表
* @param typeId 文档类型ID
* @param priority 优先级
* @param documentNumber 文档编号
* @param remark 备注信息
* @param remark 备注
* @param isTestDocument 是否为测试文档
* @returns 上传结果列表
* @param assignUserIds 需要分配的用户ID数组
* @param taskName 任务名称
* @param docType 文档类型(如 XZCF、XZXK
* @param token JWT Token
*/
export async function batchUploadCrossCheckingFiles(
export async function batchUploadAndAssignCrossCheckingFiles(
files: CrossCheckingUploadedFile[],
typeId: number,
priority: string = 'normal',
documentNumber: string = '',
remark: string = '',
isTestDocument: boolean = false
isTestDocument: boolean = false,
assignUserIds: number[],
taskName: string,
docType: string,
token: string | null = null
): Promise<{
successes: Array<{file: CrossCheckingUploadedFile; result: CrossCheckingFileUploadResponse}>;
successes: Array<{file: CrossCheckingUploadedFile; result: Record<string, unknown>}>;
failures: Array<{file: CrossCheckingUploadedFile; error: string}>;
}> {
const successes: Array<{file: CrossCheckingUploadedFile; result: CrossCheckingFileUploadResponse}> = [];
const successes: Array<{file: CrossCheckingUploadedFile; result: Record<string, unknown>}> = [];
const failures: Array<{file: CrossCheckingUploadedFile; error: string}> = [];
console.log('【交叉评查批量上传】开始批量上传文件,文件数量:', files.length);
const uploadEndpoint = '/cross_review/documents/upload_and_assign';
const uploadUrl = UPLOAD_URL + uploadEndpoint;
for (const fileInfo of files) {
try {
console.log('【交叉评查批量上传】上传文件:', fileInfo.name);
// 转换文件为二进制格式
const binaryData = await uploadFileToBinary(fileInfo.file);
// 上传文件
const result = await uploadCrossCheckingDocument(
binaryData,
fileInfo.file.name,
fileInfo.file.type,
typeId,
priority,
documentNumber,
remark,
isTestDocument,
null, // 交叉评查文件通常没有关联的文档ID
false
);
if (result.error) {
console.error('【交叉评查批量上传】文件上传失败:', fileInfo.name, result.error);
failures.push({
file: fileInfo,
error: result.error
});
} else if (result.data) {
console.log('【交叉评查批量上传】文件上传成功:', fileInfo.name);
successes.push({
file: fileInfo,
result: result.data
});
const formData = new FormData();
formData.append('file', fileInfo.file, fileInfo.name);
const uploadInfo = {
type_id: typeof typeId === 'string' ? parseInt(typeId, 10) : typeId,
evaluation_level: priority,
document_number: documentNumber || null,
remark: remark || null,
is_test_document: isTestDocument,
task_name: taskName,
doc_type: typeof docType === 'string' ? docType.toUpperCase() : docType
};
formData.append('upload_info', JSON.stringify(uploadInfo));
formData.append('assign_user_ids', JSON.stringify(assignUserIds));
const headers: HeadersInit = {};
if (token) headers['Authorization'] = `Bearer ${token}`;
const response = await fetch(uploadUrl, {
method: 'POST',
headers,
body: formData
});
const result = await response.json();
if (result && result.success) {
successes.push({ file: fileInfo, result });
} else {
failures.push({ file: fileInfo, error: result.error || '未知错误' });
}
} catch (error) {
console.error('【交叉评查批量上传】处理文件时发生错误:', fileInfo.name, error);
failures.push({
file: fileInfo,
error: error instanceof Error ? error.message : '上传失败'
});
failures.push({ file: fileInfo, error: error instanceof Error ? error.message : '上传失败' });
}
}
console.log('【交叉评查批量上传】批量上传完成,成功:', successes.length, '失败:', failures.length);
return { successes, failures };
}
+12 -22
View File
@@ -172,29 +172,19 @@ export function convertToTreeData(organizations: OrganizationNode[]): Array<{
}>;
}> {
return organizations.map(org => {
const children: Array<{
label: string;
value: string;
isUser?: boolean;
userInfo?: UserInfo;
}> = [];
// 递归处理子组织
const subOrganizations = org.children && org.children.length > 0 ? convertToTreeData(org.children) : [];
// 添加该组织下的用户
if (org.users && org.users.length > 0) {
children.push(...org.users.map(user => ({
label: user.nick_name,
value: `user_${user.id}`,
isUser: true,
userInfo: user
})));
}
// 递归处理子组织,保持原有的层级结构
if (org.children && org.children.length > 0) {
const subOrganizations = convertToTreeData(org.children);
children.push(...subOrganizations);
}
const userChildren = (org.users && org.users.length > 0)
? org.users.map(user => ({
label: user.nick_name,
value: `user_${user.id}`,
isUser: true,
userInfo: user
}))
: [];
// 合并子组织和用户
const children = [...subOrganizations, ...userChildren];
return {
label: org.ou_name,
value: org.ou_id,