A2 收口统一审批中心入口与状态
这个提交包含在:
@@ -282,6 +282,7 @@ function isoOrNull(value) {
|
||||
}
|
||||
|
||||
function mapTaskSummary(task, allowedActions = []) {
|
||||
const businessSummary = buildTaskBusinessSummary(task);
|
||||
const workflowInstance = task.workflow_instance
|
||||
? {
|
||||
entity_type: task.workflow_instance.entity_type,
|
||||
@@ -318,9 +319,89 @@ function mapTaskSummary(task, allowedActions = []) {
|
||||
currentStatus: workflowInstance.current_status,
|
||||
}
|
||||
: null,
|
||||
businessSummary,
|
||||
};
|
||||
}
|
||||
|
||||
function fallbackBusinessTitle(entityType) {
|
||||
if (entityType === "reimbursement") return "报销单";
|
||||
if (entityType === "leave") return "请假申请";
|
||||
if (entityType === "purchase_request") return "采购申请";
|
||||
if (entityType === "travel_request") return "差旅申请";
|
||||
return "业务单据";
|
||||
}
|
||||
|
||||
function buildTaskBusinessSummary(task) {
|
||||
const workflowInstance = task.workflow_instance;
|
||||
if (!workflowInstance) {
|
||||
return null;
|
||||
}
|
||||
|
||||
const fallback = {
|
||||
reference: workflowInstance.entity_id,
|
||||
title: fallbackBusinessTitle(workflowInstance.entity_type),
|
||||
applicantName: null,
|
||||
amount: null,
|
||||
duration: null,
|
||||
businessStatus: workflowInstance.current_status ?? null,
|
||||
};
|
||||
|
||||
if (workflowInstance.entity_type === "reimbursement" && workflowInstance.reimbursement_form) {
|
||||
const form = workflowInstance.reimbursement_form;
|
||||
return {
|
||||
...fallback,
|
||||
reference: form.form_number ?? workflowInstance.entity_id,
|
||||
title: form.description ? `报销:${form.description}` : "报销单",
|
||||
applicantName: form.submitter?.name ?? form.owner?.name ?? null,
|
||||
amount: toMoneyString(form.total_amount),
|
||||
businessStatus: form.status ?? fallback.businessStatus,
|
||||
};
|
||||
}
|
||||
|
||||
if (workflowInstance.entity_type === "leave" && workflowInstance.leave_request) {
|
||||
const leaveRequest = workflowInstance.leave_request;
|
||||
return {
|
||||
...fallback,
|
||||
title: leaveRequest.leave_type?.name
|
||||
? `请假:${leaveRequest.leave_type.name}`
|
||||
: "请假申请",
|
||||
applicantName: leaveRequest.owner?.name ?? null,
|
||||
duration:
|
||||
leaveRequest.requested_days == null
|
||||
? null
|
||||
: `${Number(leaveRequest.requested_days)}天`,
|
||||
businessStatus: leaveRequest.status ?? fallback.businessStatus,
|
||||
};
|
||||
}
|
||||
|
||||
if (workflowInstance.entity_type === "purchase_request" && workflowInstance.purchase_request) {
|
||||
const purchaseRequest = workflowInstance.purchase_request;
|
||||
const amount = toMoneyString(purchaseRequest.total_amount);
|
||||
return {
|
||||
...fallback,
|
||||
reference: purchaseRequest.request_no ?? workflowInstance.entity_id,
|
||||
title: purchaseRequest.title || "采购申请",
|
||||
applicantName: purchaseRequest.applicant?.name ?? null,
|
||||
amount: amount ? `${amount} ${purchaseRequest.currency_code}` : null,
|
||||
businessStatus: purchaseRequest.status ?? fallback.businessStatus,
|
||||
};
|
||||
}
|
||||
|
||||
if (workflowInstance.entity_type === "travel_request" && workflowInstance.travel_request) {
|
||||
const travelRequest = workflowInstance.travel_request;
|
||||
return {
|
||||
...fallback,
|
||||
reference: travelRequest.request_no ?? workflowInstance.entity_id,
|
||||
title: travelRequest.purpose ? `差旅:${travelRequest.purpose}` : "差旅申请",
|
||||
applicantName: travelRequest.applicant?.name ?? null,
|
||||
amount: toMoneyString(travelRequest.estimated_amount),
|
||||
businessStatus: travelRequest.status ?? fallback.businessStatus,
|
||||
};
|
||||
}
|
||||
|
||||
return fallback;
|
||||
}
|
||||
|
||||
async function buildTaskVisibilityFilters(tx, request) {
|
||||
const roleFilters = request.employee.roleCodes.length
|
||||
? [{ assignee_role: { in: request.employee.roleCodes } }]
|
||||
@@ -1380,6 +1461,67 @@ async function workflowRoutes(fastify) {
|
||||
entity_type: true,
|
||||
entity_id: true,
|
||||
current_status: true,
|
||||
reimbursement_form: {
|
||||
select: {
|
||||
form_number: true,
|
||||
status: true,
|
||||
total_amount: true,
|
||||
description: true,
|
||||
owner: {
|
||||
select: {
|
||||
name: true,
|
||||
},
|
||||
},
|
||||
submitter: {
|
||||
select: {
|
||||
name: true,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
leave_request: {
|
||||
select: {
|
||||
status: true,
|
||||
requested_days: true,
|
||||
leave_type: {
|
||||
select: {
|
||||
name: true,
|
||||
},
|
||||
},
|
||||
owner: {
|
||||
select: {
|
||||
name: true,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
purchase_request: {
|
||||
select: {
|
||||
request_no: true,
|
||||
status: true,
|
||||
title: true,
|
||||
total_amount: true,
|
||||
currency_code: true,
|
||||
applicant: {
|
||||
select: {
|
||||
name: true,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
travel_request: {
|
||||
select: {
|
||||
request_no: true,
|
||||
status: true,
|
||||
purpose: true,
|
||||
estimated_amount: true,
|
||||
applicant: {
|
||||
select: {
|
||||
name: true,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
|
||||
在新工单中引用
屏蔽一个用户