+
客户计费规则正在初始化
@@ -380,7 +382,7 @@ onBeforeUnmount(stopInitializationPolling)
按箱规尺寸计算
设为默认规则
-
编辑规则
+
编辑规则
计算方式:长、宽、高各加 2X = 外径尺寸(X 为单边加宽,按实测尺寸匹配箱规)体积公式:外径长 × 外径宽 × 外径高 ÷ 1,000,000 = CBM低于最低档使用最低档,超出当前档自动匹配下一档,超出最大档使用最大档
@@ -408,7 +410,7 @@ onBeforeUnmount(stopInitializationPolling)
-
+
计算公式:按长、宽、高匹配箱规;长、宽、高各加 2X(X 为单边加宽),体积(CBM) = 外径长 × 外径宽 × 外径高 ÷ 1,000,000
@@ -417,8 +419,8 @@ onBeforeUnmount(stopInitializationPolling)
| {{ row.boxTypeName }} | | | | | |
- 保存规则
- 箱规按权重系数计算
长、宽、高任一项超出当前挡位时进入下一挡;命中规格的一个系数统一应用于长、宽、高。
| 箱规类型 | 内径长(cm) | 内径宽(cm) | 内径高(cm) | 权重系数 | 重量(kg) | 备注 |
|---|
| {{ BOX_NAMES[row.boxType] }} | | | | | | |
|---|
保存系数规则
+ 保存规则
+ 箱规按权重系数计算
长、宽、高任一项超出当前挡位时进入下一挡;命中规格的一个系数统一应用于长、宽、高。
| 箱规类型 | 内径长(cm) | 内径宽(cm) | 内径高(cm) | 权重系数 | 重量(kg) | 备注 |
|---|
| {{ BOX_NAMES[row.boxType] }} | | | | | | |
|---|
保存系数规则
取消
diff --git a/src/modules/customers/customerDensity.css b/src/modules/customers/customerDensity.css
new file mode 100644
index 00000000..a7644db5
--- /dev/null
+++ b/src/modules/customers/customerDensity.css
@@ -0,0 +1,113 @@
+/* Customer menu workspaces and their explicitly opted-in overlays. */
+/* Only remove decoration from text actions; retain icon-only paging/settings controls. */
+.customer-density.admin-density .el-button :is(.lucide-search, .lucide-rotate-ccw, .lucide-copy),
+.customer-density-dialog.admin-density-dialog .el-button .lucide-copy { display: none; }
+.customer-density.admin-density .customers-table-actions .el-button--primary { background: var(--el-color-primary); box-shadow: none; border: 1px solid var(--el-color-primary); }
+.customer-density.admin-density .customer-action-button {
+ --action-color: #52525b;
+ --action-border: #dfe3ee;
+ height: 28px; min-height: 28px; padding: 4px 10px; margin: 0;
+ border: 1px solid var(--action-border); border-radius: 6px;
+ color: var(--action-color); background: #fff; font-size: 13px; font-weight: 600; box-shadow: none;
+}
+.customer-density.admin-density .customer-list-table .customer-action-review { --action-color: #c76500; --action-border: #fed7aa; }
+.customer-density.admin-density .customer-list-table .customer-action-reset-password { --action-color: #7c3aed; --action-border: #ddd6fe; }
+.customer-density.admin-density .customer-list-table .customer-action-impersonate { --action-color: #1677cf; --action-border: #bfdbfe; }
+.customer-density.admin-density .customer-list-table .customer-action-status.is-enable { --action-color: #15803d; --action-border: #bbf7d0; }
+.customer-density.admin-density .customer-list-table .customer-action-status.is-disable,
+.customer-density.admin-density .customer-list-table .customer-action-delete { --action-color: #dc2626; --action-border: #fecaca; }
+.customer-density.admin-density .customer-action-button:hover:not(:disabled) { color: var(--action-color); border-color: var(--action-color); background: #f8fafc; box-shadow: none; filter: none; }
+.customer-density.admin-density .customer-action-button:disabled { color: #a1a1aa; border-color: #e5e7eb; background: #fff; }
+.customer-density.admin-density .customer-action-button:focus-visible { outline: 2px solid var(--action-color); outline-offset: 2px; }
+.customer-density.admin-density .table-actions { gap: 6px; }
+.customer-density.admin-density .customer-list-table .table-actions > .el-button,
+.customer-density.admin-density .customer-list-table .table-actions > .el-dropdown { margin-left: 0; }
+.customer-density.admin-density .customer-list-table .el-table__body tr:hover > td { background: #f3f7fb; }
+
+.customer-density.admin-density.customer-detail-page .detail-page-layout { gap: 12px; }
+.customer-density.admin-density.customer-detail-page .detail-header { padding: 8px 12px; background: #fff; border: 1px solid var(--cc-border); }
+.customer-density.admin-density .detail-page-toolbar h1 { font-size: 16px; line-height: 24px; }
+.customer-density.admin-density .detail-page-toolbar p { margin-top: 2px; font-size: 12px; }
+.customer-density.admin-density .detail-tabs { border-radius: 0; box-shadow: none; border-bottom: 1px solid var(--cc-border); background: #fff; }
+.customer-density.admin-density .detail-tabs button { height: 38px; padding: 0 16px; gap: 6px; font-size: 13px; border-bottom-width: 2px; transition: color .15s, background .15s; }
+.customer-density.admin-density .detail-tab-icon { width: 18px; font: 17px/1 "Segoe UI Emoji", "Apple Color Emoji", "Noto Color Emoji", sans-serif; }
+.customer-density.admin-density .tab-panel { padding-top: 0; min-height: 0; background: #fff; border: 1px solid var(--cc-border); border-top: 0; }
+.customer-density.admin-density .basic-layout { grid-template-columns: 1fr; gap: 0; }
+.customer-density.admin-density .detail-panel { padding: 12px; border: 0; border-bottom: 1px solid var(--cc-border); border-radius: 0; background: #fff; box-shadow: none; }
+.customer-density.admin-density .detail-panel:last-child { border-bottom: 0; }
+.customer-density.admin-density .module-panel { min-height: 0; }
+.customer-density.admin-density .panel-title { align-items: center; gap: 12px; margin-bottom: 8px; padding-bottom: 8px; }
+.customer-density.admin-density .panel-title h2 { font-size: 14px; }
+.customer-density.admin-density .panel-title p { margin-top: 3px; font-size: 12px; }
+.customer-density.admin-density .info-grid { grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 0; border-top: 1px solid var(--cc-border); border-left: 1px solid var(--cc-border); }
+.customer-density.admin-density .info-grid--three { grid-template-columns: repeat(3, minmax(0, 1fr)); }
+.customer-density.admin-density .info-grid > div { display: grid; grid-template-columns: 112px minmax(0, 1fr); min-height: 36px; padding: 0; border-radius: 0; border-right: 1px solid var(--cc-border); border-bottom: 1px solid var(--cc-border); background: #fff; }
+.customer-density.admin-density .info-grid dt { display: flex; align-items: center; margin: 0; padding: 6px 8px; background: #f8fafc; font-size: 12px; }
+.customer-density.admin-density .info-grid dd { align-self: center; margin: 0; padding: 6px 8px; font-size: 13px; font-weight: 400; overflow-wrap: anywhere; }
+.customer-density.admin-density .qualification-list { gap: 0; border: 1px solid var(--cc-border); }
+.customer-density.admin-density .qualification-list button { grid-template-columns: minmax(0, 1fr) 100px 120px 48px; gap: 12px; min-height: 40px; padding: 6px 10px; border: 0; border-bottom: 1px solid var(--cc-border); border-radius: 0; }
+.customer-density.admin-density .qualification-list button:last-child { border-bottom: 0; }
+.customer-density.admin-density .qualification-list strong { font-size: 13px; }
+.customer-density.admin-density .qualification-list small { overflow-wrap: anywhere; font-size: 12px; }
+.customer-density.admin-density .file-date { font-size: 12px; }
+.customer-density.admin-density .file-preview-label { color: var(--cc-primary); font-size: 13px; }
+.customer-density.admin-density .section-empty,.customer-density.admin-density .module-empty { min-height: 64px; padding: 12px; gap: 4px; }
+.customer-density.admin-density .section-empty > svg,.customer-density.admin-density .module-empty > svg { display: none; }
+.customer-density.admin-density .section-empty span { font-size: 12px; }
+.customer-density.admin-density .user-table-wrap { border: 1px solid var(--cc-border); border-radius: 0; }
+.customer-density.admin-density .user-table-wrap table { font-size: 13px; }
+.customer-density.admin-density .user-table-wrap th,.customer-density.admin-density .user-table-wrap td { height: 36px; padding: 6px 10px; }
+.customer-density.admin-density .user-identity > span { display: none; }
+.customer-density.admin-density .user-identity small,.customer-density.admin-density .member-contact small { font-size: 12px; }
+
+.customer-density-dialog.admin-density-dialog.el-dialog .el-dialog__body { background: #fff; }
+.customer-density-dialog.admin-density-dialog .form-section { padding: 10px 0; }
+.customer-density-dialog.admin-density-dialog .form-section__heading { margin-bottom: 8px; }
+.customer-density-dialog.admin-density-dialog .form-grid { gap: 0 16px; }
+.customer-density-dialog.admin-density-dialog .field-hint { font-size: 12px; }
+.customer-density-dialog.admin-density-dialog .qualification-row > * { min-height: 44px; padding: 6px 10px; }
+.customer-density-dialog.admin-density-dialog .qualification-header > * { min-height: 36px; }
+.customer-density-dialog.admin-density-dialog .file-picker { min-height: 32px; }
+.customer-density-dialog.admin-density-dialog .qualification-file-name { max-width: none; overflow-wrap: anywhere; white-space: normal; }
+.customer-density-dialog.admin-density-dialog .qualification-preview-action { font-size: 12px; }
+.customer-density-dialog.admin-density-dialog .review-dialog-content { gap: 12px; }
+.customer-density-dialog.admin-density-dialog .review-dialog-header { padding: 8px 10px; border-radius: 0; background: #fff; }
+.customer-density-dialog.admin-density-dialog .review-dialog-title strong { white-space: normal; overflow-wrap: anywhere; }
+.customer-density-dialog.admin-density-dialog .review-dialog-icon { display: none; }
+.customer-density-dialog.admin-density-dialog .review-dialog-grid { gap: 12px; }
+.customer-density-dialog.admin-density-dialog .review-dialog-section,.customer-density-dialog.admin-density-dialog .review-decision-card { padding: 10px; border-radius: 0; box-shadow: none; }
+.customer-density-dialog.admin-density-dialog .review-section-heading { margin-bottom: 8px; }
+.customer-density-dialog.admin-density-dialog .review-section-heading span { font-size: 12px; }
+.customer-density-dialog.admin-density-dialog .review-info-grid { grid-template-columns: 1fr; gap: 0; border-top: 1px solid var(--cc-border); }
+.customer-density-dialog.admin-density-dialog .review-info-grid > div { display: grid; grid-template-columns: 96px minmax(0,1fr); padding: 0; border-radius: 0; border-bottom: 1px solid var(--cc-border); background: #fff; }
+.customer-density-dialog.admin-density-dialog .review-info-grid dt { margin: 0; padding: 6px 8px; font-size: 12px; background: #f8fafc; }
+.customer-density-dialog.admin-density-dialog .review-info-grid dd { align-self: center; padding: 6px 8px; white-space: normal; overflow-wrap: anywhere; font-weight: 400; }
+.customer-density-dialog.admin-density-dialog .review-document-table { border-radius: 0; }
+.customer-density-dialog.admin-density-dialog .review-document-header { font-size: 12px; }
+.customer-density-dialog.admin-density-dialog .review-document-name { white-space: normal; }
+.customer-density-dialog.admin-density-dialog .decision-summary { margin-bottom: 12px; padding: 8px 10px; border-radius: 0; }
+.customer-density-dialog.admin-density-dialog .approval-credentials { margin-top: 12px; border-radius: 0; }
+.customer-density-dialog.admin-density-dialog .approval-credentials > div { padding: 8px 10px; }
+
+.customer-density.admin-density .rule-heading,.customer-density.admin-density .rule-card-heading,.customer-density.admin-density .panel-heading { min-height: 0; padding: 8px 0; gap: 12px; }
+.customer-density.admin-density .rule-heading h2,.customer-density.admin-density .rule-card-heading h2,.customer-density.admin-density .panel-heading h2 { font-size: 14px; }
+.customer-density.admin-density .rule-heading p,.customer-density.admin-density .panel-heading p { margin-top: 3px; font-size: 12px; }
+.customer-density.admin-density .formula-band { min-height: 36px; padding: 6px 10px; gap: 6px 24px; }
+.customer-density.admin-density .rule-state,.customer-density.admin-density .rule-error,.customer-density.admin-density .loading-state,.customer-density.admin-density .fee-loading,.customer-density.admin-density .fee-empty { min-height: 64px; padding: 12px; }
+.customer-density.admin-density .rule-state > svg { display: none; }
+.customer-density.admin-density .charge-rule-card { margin-top: 12px; }
+.customer-density.admin-density .overseas-fee-panel { margin-top: 12px; }
+.customer-density.admin-density .fee-groups { gap: 12px; padding: 8px 0; }
+.customer-density.admin-density .fee-groups h3,.customer-density-dialog.admin-density-dialog .edit-groups h3,.customer-density-dialog.admin-density-dialog .groups h3 { font-size: 14px; }
+.customer-density.admin-density .fee-groups th,.customer-density.admin-density .fee-groups td { padding: 6px 10px; }
+.customer-density-dialog.admin-density-dialog .editor-content { gap: 12px; }
+.customer-density-dialog.admin-density-dialog .editor-formula { padding: 6px 0; }
+.customer-density-dialog.admin-density-dialog .editor-table th,.customer-density-dialog.admin-density-dialog .editor-table td,
+.customer-density-dialog.admin-density-dialog .charge-rule-editor th,.customer-density-dialog.admin-density-dialog .charge-rule-editor td,
+.customer-density-dialog.admin-density-dialog .edit-groups th,.customer-density-dialog.admin-density-dialog .edit-groups td { padding: 4px 8px; }
+.customer-density-dialog.admin-density-dialog .dialog-actions { justify-content: flex-end; }
+.customer-density-dialog.admin-density-dialog .dialog-actions .el-button { min-height: 32px; min-width: 64px; font-size: 13px; }
+.customer-density-dialog.admin-density-dialog .edit-groups,.customer-density-dialog.admin-density-dialog .groups { gap: 12px; padding: 0; }
+
+@media (max-width: 960px) { .customer-density.admin-density .info-grid { grid-template-columns: repeat(2,minmax(0,1fr)); } }
+@media (max-width: 720px) { .customer-density.admin-density .info-grid { grid-template-columns: 1fr; }.customer-density.admin-density .qualification-list button { grid-template-columns: minmax(0,1fr) auto; }.customer-density.admin-density .qualification-list .file-date { white-space: normal; } }
diff --git a/src/modules/customers/overseasStorageFee.test.ts b/src/modules/customers/overseasStorageFee.test.ts
index 0cae8f3d..a28387a1 100644
--- a/src/modules/customers/overseasStorageFee.test.ts
+++ b/src/modules/customers/overseasStorageFee.test.ts
@@ -26,11 +26,11 @@ describe('customer overseas storage fee api', () => {
it('keeps overseas fee business actions as semantic buttons at narrow widths', () => {
expect(overseasListSource).toContain('border stripe')
- expect(overseasListSource).toContain('size="small" plain type="primary"')
+ expect(overseasListSource).toContain('class="customer-action-button" size="small" plain')
expect(overseasListSource).toContain('size="small" plain type="danger"')
expect(overseasListSource).toContain('
')
- expect(overseasListSource).toContain('')
- expect(overseasListSource).toContain('')
+ expect(overseasListSource).not.toContain(' {
expect(document.body.textContent).toContain('公司联系电话')
expect(document.body.textContent).toContain('登录手机号')
expect(document.body.textContent).toContain('修改会影响登录')
+ expect(document.querySelector('.contact-panel .info-grid--three')).not.toBeNull()
expect(listPlatformTenantMembers).toHaveBeenCalledWith(tenant.id)
expect(document.body.textContent).toContain('已替换')
diff --git a/src/modules/customers/pages/CustomerDetailView.vue b/src/modules/customers/pages/CustomerDetailView.vue
index 8fdbde1c..f7af8b09 100644
--- a/src/modules/customers/pages/CustomerDetailView.vue
+++ b/src/modules/customers/pages/CustomerDetailView.vue
@@ -1,11 +1,9 @@
-
+
@@ -1060,16 +1054,16 @@ onMounted(() => { void loadCustomers() })
{{ reviewLoadError.message }}
重新加载待审核客户
-
+ 导出Excel新增客户
-
详情
-
编辑
-
审核
-
{{ customerActionLabel(row as PlatformTenantResource, action) }}
+
详情
+
编辑
+
审核
+
{{ customerActionLabel(row as PlatformTenantResource, action) }}
-
- {{ customerActionLabel(row as PlatformTenantResource, action) }}
+
+ {{ customerActionLabel(row as PlatformTenantResource, action) }}
@@ -1081,9 +1075,9 @@ onMounted(() => { void loadCustomers() })
-
+
-