v4.0.11HQ后端优化(快链、账单日等)
CI / verify (pull_request) Has been cancelled

This commit is contained in:
2026-09-02 15:45:12 +08:00
parent 1000b489a0
commit 6880b5daf4
31 changed files with 1014 additions and 402 deletions
+73 -29
View File
@@ -29,6 +29,7 @@ import {
import { request } from '../lib/api';
import { fmtTime } from '../lib/constants';
import { downloadBase64File } from '../lib/exportExcel';
import { exportColumnsBody } from '../lib/export-columns';
import { useAdminList } from '../lib/useAdminList';
import OssUpload from '../components/OssUpload';
import { useAdminListColumns } from '../lib/useAdminListColumns';
@@ -62,6 +63,8 @@ export default function DevPlanTasksPage() {
const [dispatchOpen, setDispatchOpen] = useState(false);
const [batchEditOpen, setBatchEditOpen] = useState(false);
const [batchSaving, setBatchSaving] = useState(false);
const [creatingVersion, setCreatingVersion] = useState(false);
const [newVersionNo, setNewVersionNo] = useState('');
const [versions, setVersions] = useState<DevPlanVersionDto[]>([]);
const [supportTickets, setSupportTickets] = useState<SupportTicketDto[]>([]);
const [editing, setEditing] = useState<DevPlanTaskDto | null>(null);
@@ -172,9 +175,34 @@ export default function DevPlanTasksPage() {
function openBatchEdit() {
batchForm.setFieldsValue({ status: undefined, versionId: undefined });
setNewVersionNo('');
setBatchEditOpen(true);
}
async function createVersionInBatch() {
const versionNo = newVersionNo.trim();
if (!versionNo) {
message.warning('请输入版本号');
return;
}
setCreatingVersion(true);
try {
const created = await request<DevPlanVersionDto>('/admin/dev-plan/versions', {
method: 'POST',
body: JSON.stringify({ versionNo }),
});
const res = await request<{ items: DevPlanVersionDto[] }>('/admin/dev-plan/versions?pageSize=100');
setVersions(res.items ?? []);
batchForm.setFieldsValue({ versionId: created.id });
setNewVersionNo('');
message.success(`已创建版本 ${versionNo}`);
} catch (e) {
message.error(e instanceof Error ? e.message : '创建失败');
} finally {
setCreatingVersion(false);
}
}
async function submitBatchEdit() {
const values = await batchForm.validateFields();
if (!values.status && !values.versionId) {
@@ -224,34 +252,6 @@ export default function DevPlanTasksPage() {
}
}
async function exportTasks(scope: 'filter' | 'selected') {
setExporting(true);
try {
const result = await request<{
filename: string;
mimeType: string;
contentBase64: string;
count: number;
}>('/admin/dev-plan/tasks/export', {
method: 'POST',
body: JSON.stringify({
scope,
format: exportFormat,
ids: scope === 'selected' ? selectedRowKeys : undefined,
status: filters.status || undefined,
type: filters.type || undefined,
keyword: filters.keyword || undefined,
}),
});
downloadBase64File(result.contentBase64, result.filename, result.mimeType);
message.success(`已导出 ${result.count} 条任务`);
} catch (e) {
message.error(e instanceof Error ? e.message : '导出失败');
} finally {
setExporting(false);
}
}
const baseColumns: ColumnsType<DevPlanTaskDto> = [
{
title: '任务号',
@@ -285,6 +285,7 @@ export default function DevPlanTasksPage() {
},
{
title: '附件',
key: 'attachmentUrls',
width: 100,
render: (_, row) =>
row.attachmentUrls?.length ? (
@@ -314,6 +315,7 @@ export default function DevPlanTasksPage() {
},
{
title: '关联版本',
key: 'versions',
dataIndex: 'versions',
width: 140,
render: (_, row) =>
@@ -347,7 +349,36 @@ export default function DevPlanTasksPage() {
},
];
const { columns, settingsButton, settingsModal } = useAdminListColumns('dev-plan-tasks', baseColumns, { page, pageSize });
const { columns, settingsButton, settingsModal, exportColumnKeys } = useAdminListColumns('dev-plan-tasks', baseColumns, { page, pageSize });
async function exportTasks(scope: 'filter' | 'selected') {
setExporting(true);
try {
const result = await request<{
filename: string;
mimeType: string;
contentBase64: string;
count: number;
}>('/admin/dev-plan/tasks/export', {
method: 'POST',
body: JSON.stringify({
scope,
format: exportFormat,
ids: scope === 'selected' ? selectedRowKeys : undefined,
status: filters.status || undefined,
type: filters.type || undefined,
keyword: filters.keyword || undefined,
...exportColumnsBody(exportColumnKeys),
}),
});
downloadBase64File(result.contentBase64, result.filename, result.mimeType);
message.success(`已导出 ${result.count} 条任务`);
} catch (e) {
message.error(e instanceof Error ? e.message : '导出失败');
} finally {
setExporting(false);
}
}
return (
<div>
@@ -541,6 +572,19 @@ export default function DevPlanTasksPage() {
options={versions.map((v) => ({ value: v.id, label: v.versionNo }))}
/>
</Form.Item>
<Form.Item label="创建新版本">
<Space.Compact style={{ width: '100%' }}>
<Input
placeholder="版本号,如 v4.0.11"
value={newVersionNo}
onChange={(e) => setNewVersionNo(e.target.value)}
onPressEnter={() => void createVersionInBatch()}
/>
<Button loading={creatingVersion} onClick={() => void createVersionInBatch()}>
</Button>
</Space.Compact>
</Form.Item>
</Form>
</Modal>
</div>