main
parent
1ca5655dc5
commit
4b7177e652
|
|
@ -1 +1 @@
|
||||||
Subproject commit 9e149a1adf71362858d58c353c834528b0445bbb
|
Subproject commit 1ca5655dc531f979299d328a149583a0aae6963c
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
.DS_Store
|
.DS_Store
|
||||||
|
|
||||||
.idea/
|
.idea/
|
||||||
|
.claude/
|
||||||
backend/.idea/
|
backend/.idea/
|
||||||
|
|
||||||
frontend/dist/
|
frontend/dist/
|
||||||
|
|
|
||||||
|
|
@ -72,7 +72,7 @@ unisbase:
|
||||||
access-token-safety-seconds: 120
|
access-token-safety-seconds: 120
|
||||||
oms:
|
oms:
|
||||||
enabled: ${OMS_ENABLED:true}
|
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: ${OMS_API_KEY:c7f858d0-30b8-4b7f-9ea1-0ccf5ceb1c54}
|
||||||
api-key-header: ${OMS_API_KEY_HEADER:apiKey}
|
api-key-header: ${OMS_API_KEY_HEADER:apiKey}
|
||||||
user-info-path: ${OMS_USER_INFO_PATH:/api/v1/user/info}
|
user-info-path: ${OMS_USER_INFO_PATH:/api/v1/user/info}
|
||||||
|
|
|
||||||
|
|
@ -513,6 +513,7 @@ const channelExportColumns: Array<ExportColumn<ChannelExpansionItem, ChannelExpo
|
||||||
{ key: "province", label: "省份", value: (item) => normalizeExportText(item.province) },
|
{ key: "province", label: "省份", value: (item) => normalizeExportText(item.province) },
|
||||||
{ key: "officeAddress", label: "办公地址", kind: "longText", value: (item) => normalizeExportText(item.officeAddress) },
|
{ key: "officeAddress", label: "办公地址", kind: "longText", value: (item) => normalizeExportText(item.officeAddress) },
|
||||||
{ key: "channelIndustry", label: "聚焦行业", value: (item) => normalizeExportText(item.channelIndustry) },
|
{ 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: "channelAttribute", label: "渠道属性", value: (item) => normalizeExportText(item.channelAttribute) },
|
||||||
{ key: "internalAttribute", label: "新华三内部属性", value: (item) => normalizeExportText(item.internalAttribute) },
|
{ key: "internalAttribute", label: "新华三内部属性", value: (item) => normalizeExportText(item.internalAttribute) },
|
||||||
{ key: "intent", label: "合作意向", value: (item) => normalizeExportText(item.intent) },
|
{ 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: "followUps", label: "跟进记录", kind: "followup", value: (item) => formatExportFollowUps(item.followUps) },
|
||||||
{ key: "channelCode", label: "编码", value: (item) => normalizeExportText(item.channelCode) },
|
{ key: "channelCode", label: "编码", value: (item) => normalizeExportText(item.channelCode) },
|
||||||
{ key: "city", label: "市", value: (item) => normalizeExportText(item.city) },
|
{ 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: "relatedProjectAmount", label: "跟进项目金额", value: (item) => normalizeExportText(formatRelatedProjectAmount(item.relatedProjects)) },
|
||||||
{ key: "notes", label: "备注说明", kind: "longText", value: (item) => normalizeExportText(item.notes) },
|
{ key: "notes", label: "备注说明", kind: "longText", value: (item) => normalizeExportText(item.notes) },
|
||||||
{ key: "owner", label: "创建人", value: (item) => normalizeExportText(item.owner) },
|
{ key: "owner", label: "创建人", value: (item) => normalizeExportText(item.owner) },
|
||||||
|
|
@ -537,6 +537,7 @@ const defaultChannelExportFields: ChannelExportFieldKey[] = [
|
||||||
"province",
|
"province",
|
||||||
"officeAddress",
|
"officeAddress",
|
||||||
"channelIndustry",
|
"channelIndustry",
|
||||||
|
"certificationLevel",
|
||||||
"channelAttribute",
|
"channelAttribute",
|
||||||
"internalAttribute",
|
"internalAttribute",
|
||||||
"intent",
|
"intent",
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@
|
||||||
<link rel="icon" type="image/svg+xml" href="/logo.svg" />
|
<link rel="icon" type="image/svg+xml" href="/logo.svg" />
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||||
<title>UnisBase - 智能会议系统</title>
|
<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">
|
<link rel="stylesheet" crossorigin href="/assets/index-CaWPk49l.css">
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
|
|
|
||||||
|
|
@ -641,6 +641,20 @@ export default function DashboardAnalyticsSettingsPage() {
|
||||||
message.success(t("dashboardAnalytics.saveSuccess"));
|
message.success(t("dashboardAnalytics.saveSuccess"));
|
||||||
}, [buildPayload, config.cards, isTenantUnselected, message, persistConfig, t]);
|
}, [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) {
|
if (!canView) {
|
||||||
return (
|
return (
|
||||||
<div className="app-page app-page--contained dashboard-analytics-page">
|
<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
|
<Card
|
||||||
className="dashboard-analytics-card"
|
className="dashboard-analytics-card"
|
||||||
loading={loading}
|
loading={loading}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue