Merge branch 'Wren' into shiy-login
This commit is contained in:
@@ -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`, {
|
||||
|
||||
@@ -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 };
|
||||
}
|
||||
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user