kangwenjing 2026-05-12 14:24:29 +08:00
parent 1ca5655dc5
commit 4b7177e652
6 changed files with 71 additions and 4 deletions

@ -1 +1 @@
Subproject commit 9e149a1adf71362858d58c353c834528b0445bbb
Subproject commit 1ca5655dc531f979299d328a149583a0aae6963c

1
.gitignore vendored
View File

@ -1,6 +1,7 @@
.DS_Store
.idea/
.claude/
backend/.idea/
frontend/dist/

View File

@ -72,7 +72,7 @@ unisbase:
access-token-safety-seconds: 120
oms:
enabled: ${OMS_ENABLED:true}
base-url: ${OMS_BASE_URL:https://oms.unisspace.com}
base-url: ${OMS_BASE_URL:http://192.168.124.202:28081}
api-key: ${OMS_API_KEY:c7f858d0-30b8-4b7f-9ea1-0ccf5ceb1c54}
api-key-header: ${OMS_API_KEY_HEADER:apiKey}
user-info-path: ${OMS_USER_INFO_PATH:/api/v1/user/info}

View File

@ -513,6 +513,7 @@ const channelExportColumns: Array<ExportColumn<ChannelExpansionItem, ChannelExpo
{ key: "province", label: "省份", value: (item) => normalizeExportText(item.province) },
{ key: "officeAddress", label: "办公地址", kind: "longText", value: (item) => normalizeExportText(item.officeAddress) },
{ key: "channelIndustry", label: "聚焦行业", value: (item) => normalizeExportText(item.channelIndustry) },
{ key: "certificationLevel", label: "汇智内部认证级别", value: (item) => normalizeExportText(item.certificationLevel) },
{ key: "channelAttribute", label: "渠道属性", value: (item) => normalizeExportText(item.channelAttribute) },
{ key: "internalAttribute", label: "新华三内部属性", value: (item) => normalizeExportText(item.internalAttribute) },
{ key: "intent", label: "合作意向", value: (item) => normalizeExportText(item.intent) },
@ -525,7 +526,6 @@ const channelExportColumns: Array<ExportColumn<ChannelExpansionItem, ChannelExpo
{ key: "followUps", label: "跟进记录", kind: "followup", value: (item) => formatExportFollowUps(item.followUps) },
{ key: "channelCode", label: "编码", value: (item) => normalizeExportText(item.channelCode) },
{ key: "city", label: "市", value: (item) => normalizeExportText(item.city) },
{ key: "certificationLevel", label: "汇智内部认证级别", value: (item) => normalizeExportText(item.certificationLevel) },
{ key: "relatedProjectAmount", label: "跟进项目金额", value: (item) => normalizeExportText(formatRelatedProjectAmount(item.relatedProjects)) },
{ key: "notes", label: "备注说明", kind: "longText", value: (item) => normalizeExportText(item.notes) },
{ key: "owner", label: "创建人", value: (item) => normalizeExportText(item.owner) },
@ -537,6 +537,7 @@ const defaultChannelExportFields: ChannelExportFieldKey[] = [
"province",
"officeAddress",
"channelIndustry",
"certificationLevel",
"channelAttribute",
"internalAttribute",
"intent",

View File

@ -5,7 +5,7 @@
<link rel="icon" type="image/svg+xml" href="/logo.svg" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>UnisBase - 智能会议系统</title>
<script type="module" crossorigin src="/assets/index-DdTU1GmP.js"></script>
<script type="module" crossorigin src="/assets/index-DM2jW1WT.js"></script>
<link rel="stylesheet" crossorigin href="/assets/index-CaWPk49l.css">
</head>
<body>

View File

@ -641,6 +641,20 @@ export default function DashboardAnalyticsSettingsPage() {
message.success(t("dashboardAnalytics.saveSuccess"));
}, [buildPayload, config.cards, isTenantUnselected, message, persistConfig, t]);
const savePanelConfig = useCallback(async () => {
if (isTenantUnselected) {
message.warning(t("dashboardAnalytics.tenantRequired"));
return;
}
const success = await persistConfig(buildPayload(config.cards || []));
if (!success) {
return;
}
message.success(t("dashboardAnalytics.saveSuccess"));
}, [buildPayload, config.cards, isTenantUnselected, message, persistConfig, t]);
if (!canView) {
return (
<div className="app-page app-page--contained dashboard-analytics-page">
@ -668,6 +682,57 @@ export default function DashboardAnalyticsSettingsPage() {
})}
/>
<Card
className="dashboard-analytics-card"
loading={loading}
title={t("dashboardAnalytics.panelTitle")}
extra={(
<Button
type="primary"
onClick={() => void savePanelConfig()}
loading={saving}
disabled={!canUpdate}
>
{t("common.save")}
</Button>
)}
>
<Form layout="vertical">
<Form.Item label={t("dashboardAnalytics.enabled")}>
<Switch
checked={Boolean(config.enabled)}
onChange={(checked) => setConfig((current) => ({ ...current, enabled: checked }))}
disabled={!canUpdate}
/>
</Form.Item>
<Form.Item label={t("dashboardAnalytics.panelName")}>
<Input
value={config.title || ""}
onChange={(event) => setConfig((current) => ({ ...current, title: event.target.value }))}
disabled={!canUpdate}
placeholder="经营分析"
/>
</Form.Item>
<Form.Item label={t("dashboardAnalytics.panelSubtitle")}>
<Input
value={config.subtitle || ""}
onChange={(event) => setConfig((current) => ({ ...current, subtitle: event.target.value }))}
disabled={!canUpdate}
placeholder={t("dashboardAnalytics.basicPlaceholder")}
/>
</Form.Item>
<Form.Item label={t("dashboardAnalytics.emptyStateText")}>
<Input.TextArea
value={config.emptyStateText || ""}
onChange={(event) => setConfig((current) => ({ ...current, emptyStateText: event.target.value }))}
disabled={!canUpdate}
rows={3}
placeholder="暂无可展示的经营分析卡片"
/>
</Form.Item>
</Form>
</Card>
<Card
className="dashboard-analytics-card"
loading={loading}