项目管理弹窗增加项目编号输入;后端保存改为接收客户端编号并校验租户内唯一,不再自动生成。 Co-authored-by: Cursor <cursoragent@cursor.com>
70 lines
2.0 KiB
TypeScript
70 lines
2.0 KiB
TypeScript
import type { BizType, ProjectRecord } from '@/api/project-management'
|
|
|
|
/** Drill-down uses the last successful statistics query, never unsaved filter edits. */
|
|
export function buildDrillFilters(
|
|
applied: ProjectRecord,
|
|
row: ProjectRecord,
|
|
bizType: BizType
|
|
): ProjectRecord {
|
|
const { groupBy, ...filters } = applied
|
|
const result = { ...filters, bizType, unassigned: row.id === 'unassigned' } as ProjectRecord
|
|
if (!result.unassigned && row.id !== 'total') {
|
|
result[groupBy === 'team' ? 'teamId' : 'projectId'] = row.id
|
|
}
|
|
return result
|
|
}
|
|
|
|
export function assignmentSnapshot(records: ProjectRecord[]) {
|
|
return records.map(({ bizType, id, projectId }) => ({
|
|
bizType,
|
|
id,
|
|
projectId: projectId ?? null
|
|
}))
|
|
}
|
|
|
|
/** Write bodies intentionally exclude response-only labels and timestamps. */
|
|
export function managementPayload(kind: 'teams' | 'projects', form: ProjectRecord): ProjectRecord {
|
|
const fields =
|
|
kind === 'teams'
|
|
? ['teamName', 'leaderUserId', 'enabled', 'remark']
|
|
: [
|
|
'projectName',
|
|
'projectNo',
|
|
'teamId',
|
|
'leaderUserId',
|
|
'bizTypes',
|
|
'startDate',
|
|
'endDate',
|
|
'status',
|
|
'remark'
|
|
]
|
|
const data = Object.fromEntries(
|
|
fields.filter((key) => form[key] !== undefined).map((key) => [key, form[key]])
|
|
)
|
|
if (kind === 'teams') {
|
|
for (const [key, field] of [
|
|
['members', 'userId'],
|
|
['regions', 'regionId'],
|
|
['hospitals', 'hospitalId']
|
|
]) {
|
|
data[key] = (form[key] || []).map((row: ProjectRecord) => ({
|
|
...(row.id ? { id: row.id } : {}),
|
|
[field]: row[field]
|
|
}))
|
|
}
|
|
}
|
|
return data
|
|
}
|
|
|
|
export function projectOptionsParams(bizType: BizType, filter = false) {
|
|
return filter ? { bizType, usage: 'filter' as const } : { bizType }
|
|
}
|
|
|
|
/** List cells join child display names; empty entries are dropped. */
|
|
export function joinChildNames(items?: ProjectRecord[]) {
|
|
return (items || [])
|
|
.map((item) => item?.name)
|
|
.filter(Boolean)
|
|
.join('、')
|
|
}
|