fix: formate code and test money
All checks were successful
构建并部署前端到测试环境 / build-and-deploy (push) Successful in 5m8s

This commit is contained in:
luo
2026-08-18 10:54:01 +08:00
parent 857d565f33
commit 93f67967c5
32 changed files with 183 additions and 112 deletions

View File

@@ -2,8 +2,7 @@
### Requirement: 旧资产操作审计日志入口 ### Requirement: 旧资产操作审计日志入口
**Reason**: 旧资产操作审计日志交互已由当前审计调查能力替代,页面不再提供重复入口。 **Reason**: 旧资产操作审计日志交互已由当前审计调查能力替代,页面不再提供重复入口。 **Migration**: 需要审计调查的用户通过当前审计中心和资源审计时间线访问记录。
**Migration**: 需要审计调查的用户通过当前审计中心和资源审计时间线访问记录。
#### Scenario: 查看 IoT 卡、设备或资产信息 #### Scenario: 查看 IoT 卡、设备或资产信息

View File

@@ -32,11 +32,11 @@
- Decision: 业务列表创建导出任务按钮继续使用来源业务权限,默认建议如下。 - Decision: 业务列表创建导出任务按钮继续使用来源业务权限,默认建议如下。
- Rationale: 创建导出任务属于来源业务列表能力,不应因为拥有某个导出任务管理页面权限就获得业务列表导出入口。 - Rationale: 创建导出任务属于来源业务列表能力,不应因为拥有某个导出任务管理页面权限就获得业务列表导出入口。
| 入口 | 创建导出任务权限 | scene | | 入口 | 创建导出任务权限 | scene |
| --- | --- | --- | | ---------- | ----------------- | ---------- |
| 设备管理 | `devices:export` | `device` | | 设备管理 | `devices:export` | `device` |
| IOT 卡管理 | `iot_card:export` | `iot_card` | | IOT 卡管理 | `iot_card:export` | `iot_card` |
| 订单列表 | `orders:export` | `order` | | 订单列表 | `orders:export` | `order` |
- Decision: 详情页可继续复用同一组件,但必须根据任务场景或来源页面使用对应场景的详情、下载、取消权限。 - Decision: 详情页可继续复用同一组件,但必须根据任务场景或来源页面使用对应场景的详情、下载、取消权限。
- Rationale: 详情页面本身也包含下载和取消按钮,若继续使用通用权限会绕过三个列表页面的按钮隔离要求。 - Rationale: 详情页面本身也包含下载和取消按钮,若继续使用通用权限会绕过三个列表页面的按钮隔离要求。

View File

@@ -27,7 +27,7 @@ test('agent recharge rejection posts the rejection reason to the order rejection
code: 0, code: 0,
data: { data: {
methods: ['wechat', 'alipay'], methods: ['wechat', 'alipay'],
min_amount: 10000, min_amount: 10,
max_amount: 100000000 max_amount: 100000000
} }
}) })

View File

@@ -279,8 +279,8 @@
} }
.package-config-field-label { .package-config-field-label {
color: var(--el-text-color-secondary);
font-size: 13px; font-size: 13px;
color: var(--el-text-color-secondary);
white-space: nowrap; white-space: nowrap;
} }

View File

@@ -57,8 +57,8 @@
import { Close, Document, UploadFilled } from '@element-plus/icons-vue' import { Close, Document, UploadFilled } from '@element-plus/icons-vue'
import type { UploadFile, UploadInstance, UploadRawFile } from 'element-plus' import type { UploadFile, UploadInstance, UploadRawFile } from 'element-plus'
import { StorageService } from '@/api/modules' import { StorageService } from '@/api/modules'
import type { RefundAttachment } from '@/types/api/refund' import type { RefundAttachment } from '@/types/api/refund'
import type { FilePurpose } from '@/api/modules/storage' import type { FilePurpose } from '@/api/modules/storage'
interface Props { interface Props {
modelValue?: string[] | string modelValue?: string[] | string
@@ -202,7 +202,10 @@
if (props.singleColumnCsv) { if (props.singleColumnCsv) {
const content = await file.text() const content = await file.text()
const rows = content.replace(/^\uFEFF/, '').split(/\r?\n/).filter(Boolean) const rows = content
.replace(/^\uFEFF/, '')
.split(/\r?\n/)
.filter(Boolean)
if (props.maxCsvRows > 0 && Math.max(rows.length - 1, 0) > props.maxCsvRows) { if (props.maxCsvRows > 0 && Math.max(rows.length - 1, 0) > props.maxCsvRows) {
ElMessage.warning(`CSV 数据行不能超过 ${props.maxCsvRows}`) ElMessage.warning(`CSV 数据行不能超过 ${props.maxCsvRows}`)
removeUploadFile(uploadFile) removeUploadFile(uploadFile)
@@ -250,7 +253,7 @@
const uploadUrlRes = await StorageService.getUploadUrl({ const uploadUrlRes = await StorageService.getUploadUrl({
file_name: file.name, file_name: file.name,
content_type: contentType, content_type: contentType,
purpose: props.purpose purpose: props.purpose
}) })
if (uploadUrlRes.code !== 0) { if (uploadUrlRes.code !== 0) {

View File

@@ -928,8 +928,8 @@
.integration-hero__result { .integration-hero__result {
display: grid; display: grid;
justify-items: end;
gap: 5px; gap: 5px;
justify-items: end;
text-align: right; text-align: right;
} }
@@ -1008,8 +1008,8 @@
} }
.integration-hero { .integration-hero {
align-items: flex-start;
flex-direction: column; flex-direction: column;
align-items: flex-start;
} }
.integration-hero__result { .integration-hero__result {

View File

@@ -65,10 +65,7 @@
</div> </div>
</div> </div>
<!-- 通知 --> <!-- 通知 -->
<div <div class="btn-box notice-btn" @click.stop="showNotice = !showNotice">
class="btn-box notice-btn"
@click.stop="showNotice = !showNotice"
>
<div class="btn notice-button"> <div class="btn notice-button">
<i class="iconfont-sys">&#xe6c2;</i> <i class="iconfont-sys">&#xe6c2;</i>
<span v-if="unreadCount > 0" class="notice-count">{{ formattedUnreadCount }}</span> <span v-if="unreadCount > 0" class="notice-count">{{ formattedUnreadCount }}</span>

View File

@@ -8,8 +8,8 @@ export {}
declare global { declare global {
const EffectScope: typeof import('vue')['EffectScope'] const EffectScope: typeof import('vue')['EffectScope']
const ElButton: (typeof import('element-plus/es'))['ElButton'] const ElButton: (typeof import('element-plus/es'))['ElButton']
const ElMessage: typeof import('element-plus/es')['ElMessage'] const ElMessage: (typeof import('element-plus/es'))['ElMessage']
const ElMessageBox: typeof import('element-plus/es')['ElMessageBox'] const ElMessageBox: (typeof import('element-plus/es'))['ElMessageBox']
const acceptHMRUpdate: typeof import('pinia')['acceptHMRUpdate'] const acceptHMRUpdate: typeof import('pinia')['acceptHMRUpdate']
const asyncComputed: typeof import('@vueuse/core')['asyncComputed'] const asyncComputed: typeof import('@vueuse/core')['asyncComputed']
const autoResetRef: typeof import('@vueuse/core')['autoResetRef'] const autoResetRef: typeof import('@vueuse/core')['autoResetRef']

View File

@@ -1,6 +1,13 @@
import axios from 'axios' import axios from 'axios'
export type ApiErrorKind = 'auth' | 'forbidden' | 'validation' | 'conflict' | 'timeout' | 'server' | 'unknown' export type ApiErrorKind =
| 'auth'
| 'forbidden'
| 'validation'
| 'conflict'
| 'timeout'
| 'server'
| 'unknown'
export interface NormalizedApiError { export interface NormalizedApiError {
kind: ApiErrorKind kind: ApiErrorKind
@@ -20,12 +27,59 @@ export const normalizeApiError = (error: unknown): NormalizedApiError => {
const timeout = axios.isAxiosError(error) && error.code === 'ECONNABORTED' const timeout = axios.isAxiosError(error) && error.code === 'ECONNABORTED'
if (timeout) { if (timeout) {
return { kind: 'timeout', status, code, message: '请求超时,结果可能未知,请刷新确认', unknownResult: true } return {
kind: 'timeout',
status,
code,
message: '请求超时,结果可能未知,请刷新确认',
unknownResult: true
}
}
if (status === 401 || code === 401)
return {
kind: 'auth',
status,
code,
message: '登录状态已失效,请重新登录',
unknownResult: false
}
if (status === 403)
return {
kind: 'forbidden',
status,
code,
message: '没有执行此操作的权限',
unknownResult: false
}
if (status === 400)
return {
kind: 'validation',
status,
code,
message: backendMessage || '请求参数或业务条件不符合要求',
unknownResult: false
}
if (status === 409)
return {
kind: 'conflict',
status,
code,
message: backendMessage || '数据已发生变化,请刷新后重试',
unknownResult: false
}
if (status && status >= 500)
return {
kind: 'server',
status,
code,
message: '服务器处理失败,请稍后重试',
unknownResult: false
}
return {
kind: 'unknown',
status,
code,
message: backendMessage || '操作失败,请稍后重试',
unknownResult: false
} }
if (status === 401 || code === 401) return { kind: 'auth', status, code, message: '登录状态已失效,请重新登录', unknownResult: false }
if (status === 403) return { kind: 'forbidden', status, code, message: '没有执行此操作的权限', unknownResult: false }
if (status === 400) return { kind: 'validation', status, code, message: backendMessage || '请求参数或业务条件不符合要求', unknownResult: false }
if (status === 409) return { kind: 'conflict', status, code, message: backendMessage || '数据已发生变化,请刷新后重试', unknownResult: false }
if (status && status >= 500) return { kind: 'server', status, code, message: '服务器处理失败,请稍后重试', unknownResult: false }
return { kind: 'unknown', status, code, message: backendMessage || '操作失败,请稍后重试', unknownResult: false }
} }

View File

@@ -17,7 +17,9 @@ export const getApprovalStatusText = (summary: ApprovalSummary): string => {
summary.approval_provider === 'wecom' || summary.approval_provider === 'wecom' ||
summary.approval_instance_id summary.approval_instance_id
) { ) {
return summary.approval_status_name || approvalStatusNames[Number(summary.approval_status)] || '-' return (
summary.approval_status_name || approvalStatusNames[Number(summary.approval_status)] || '-'
)
} }
return '-' return '-'
} }
@@ -27,7 +29,8 @@ export const getCurrentApproverSummaryText = (summary: ApprovalSummary): string
summary.approval_source !== 'wecom' && summary.approval_source !== 'wecom' &&
summary.approval_provider !== 'wecom' && summary.approval_provider !== 'wecom' &&
!summary.approval_instance_id !summary.approval_instance_id
) return '-' )
return '-'
return summary.current_approver_summary || '-' return summary.current_approver_summary || '-'
} }

View File

@@ -25,7 +25,10 @@ export const getPaymentMerchantId = (
} }
export const getPaymentNotifyUrl = ( export const getPaymentNotifyUrl = (
config: Pick<PaymentSettings, 'provider_type' | 'wx_notify_url' | 'fy_notify_url' | 'ali_notify_url'> config: Pick<
PaymentSettings,
'provider_type' | 'wx_notify_url' | 'fy_notify_url' | 'ali_notify_url'
>
): string => { ): string => {
if (config.provider_type === 'wechat' || config.provider_type === 'wechat_v2') { if (config.provider_type === 'wechat' || config.provider_type === 'wechat_v2') {
return config.wx_notify_url || '-' return config.wx_notify_url || '-'

View File

@@ -1,3 +1,4 @@
<!--suppress ALL -->
<template> <template>
<ArtTableFullScreen> <ArtTableFullScreen>
<div class="account-page" id="table-full-screen"> <div class="account-page" id="table-full-screen">

View File

@@ -18,6 +18,7 @@
@refresh="handleRefresh" @refresh="handleRefresh"
> >
<template #left> <template #left>
<!--suppress VueUnrecognizedDirective -->
<ElButton @click="showDialog('add')" v-permission="'enterprise_customer:add'" <ElButton @click="showDialog('add')" v-permission="'enterprise_customer:add'"
>新增企业客户</ElButton >新增企业客户</ElButton
> >
@@ -807,7 +808,7 @@
dialogVisible.value = false dialogVisible.value = false
formEl.resetFields() formEl.resetFields()
getTableData() await getTableData()
} catch (error) { } catch (error) {
console.error(error) console.error(error)
} finally { } finally {

View File

@@ -515,6 +515,7 @@
</ElButton> </ElButton>
<!--<ElButton type="danger" v-permission="'iot_info:handler_stop'" @click="handleManualDeactivate"> 手动停用 </ElButton>--> <!--<ElButton type="danger" v-permission="'iot_info:handler_stop'" @click="handleManualDeactivate"> 手动停用 </ElButton>-->
<!-- 手动停用暂时不开放 --> <!-- 手动停用暂时不开放 -->
<!--suppress VueUnrecognizedDirective -->
<ElButton <ElButton
v-if="canShowRealnamePolicy" v-if="canShowRealnamePolicy"
v-permission="'asset:card_realname_policy'" v-permission="'asset:card_realname_policy'"

View File

@@ -84,7 +84,7 @@
<div v-else v-loading="loading" class="wallet-table-wrapper"> <div v-else v-loading="loading" class="wallet-table-wrapper">
<ElTable v-if="hasTransactions" :data="transactionList" class="wallet-table" border> <ElTable v-if="hasTransactions" :data="transactionList" class="wallet-table" border>
<ElTableColumn prop="reference_no" label="业务编号" show-overflow-tooltip> <ElTableColumn prop="reference_no" label="业务编号" show-overflow-tooltip>
<template #default="scope"> <template #default="scope">
<span v-if="scope.row.reference_no" class="reference-no-link"> <span v-if="scope.row.reference_no" class="reference-no-link">
{{ scope.row.reference_no }} {{ scope.row.reference_no }}
@@ -444,7 +444,6 @@
} }
.wallet-table { .wallet-table {
:deep(.el-table__header) { :deep(.el-table__header) {
th { th {
font-weight: 600; font-weight: 600;

View File

@@ -1828,9 +1828,9 @@
.exchange-field-error { .exchange-field-error {
width: 100%; width: 100%;
margin-top: 4px; margin-top: 4px;
color: var(--el-color-danger);
font-size: 12px; font-size: 12px;
line-height: 1.2; line-height: 1.2;
color: var(--el-color-danger);
} }
} }
</style> </style>

View File

@@ -310,8 +310,8 @@
max-width: 100%; max-width: 100%;
overflow: hidden; overflow: hidden;
text-overflow: ellipsis; text-overflow: ellipsis;
vertical-align: bottom;
white-space: nowrap; white-space: nowrap;
vertical-align: bottom;
} }
.task-error { .task-error {

View File

@@ -623,9 +623,9 @@
.bulk-purchase-page { .bulk-purchase-page {
.task-list-header { .task-list-header {
display: flex; display: flex;
gap: 12px;
align-items: center; align-items: center;
justify-content: space-between; justify-content: space-between;
gap: 12px;
} }
.task-list-toolbar { .task-list-toolbar {
@@ -670,10 +670,10 @@
margin-top: 16px; margin-top: 16px;
} }
@media (max-width: 768px) { @media (width <= 768px) {
.task-list-header { .task-list-header {
align-items: flex-start;
flex-direction: column; flex-direction: column;
align-items: flex-start;
} }
.task-list-toolbar { .task-list-toolbar {

View File

@@ -546,16 +546,16 @@
.device-batch-allocation-page { .device-batch-allocation-page {
.task-list-header { .task-list-header {
display: flex; display: flex;
gap: 16px;
align-items: center; align-items: center;
justify-content: space-between; justify-content: space-between;
gap: 16px;
} }
.task-list-toolbar { .task-list-toolbar {
display: flex; display: flex;
flex-wrap: wrap; flex-wrap: wrap;
justify-content: flex-end;
gap: 10px; gap: 10px;
justify-content: flex-end;
} }
.pagination-wrapper { .pagination-wrapper {
@@ -566,14 +566,14 @@
.drawer-footer { .drawer-footer {
display: flex; display: flex;
justify-content: flex-end;
gap: 12px; gap: 12px;
justify-content: flex-end;
} }
@media (max-width: 900px) { @media (width <= 900px) {
.task-list-header { .task-list-header {
align-items: flex-start;
flex-direction: column; flex-direction: column;
align-items: flex-start;
} }
.task-list-toolbar { .task-list-toolbar {

View File

@@ -620,8 +620,8 @@
.device-task-page { .device-task-page {
.task-polling-error { .task-polling-error {
display: flex; display: flex;
align-items: center;
gap: 12px; gap: 12px;
align-items: center;
margin-bottom: 12px; margin-bottom: 12px;
} }

View File

@@ -452,7 +452,7 @@
<style scoped> <style scoped>
.drawer-footer { .drawer-footer {
display: flex; display: flex;
justify-content: flex-end;
gap: 12px; gap: 12px;
justify-content: flex-end;
} }
</style> </style>

View File

@@ -355,8 +355,8 @@
.task-detail-page { .task-detail-page {
.detail-header { .detail-header {
display: flex; display: flex;
align-items: center;
gap: 16px; gap: 16px;
align-items: center;
padding-bottom: 16px; padding-bottom: 16px;
.detail-title { .detail-title {

View File

@@ -329,8 +329,8 @@
.resource-snapshot-diff { .resource-snapshot-diff {
display: grid; display: grid;
grid-column: 1 / -1;
grid-template-columns: repeat(2, minmax(0, 1fr)); grid-template-columns: repeat(2, minmax(0, 1fr));
grid-column: 1 / -1;
gap: 16px; gap: 16px;
} }

View File

@@ -979,15 +979,15 @@
<style scoped lang="scss"> <style scoped lang="scss">
.commission-summary { .commission-summary {
display: inline-flex; display: inline-flex;
align-items: center;
flex-wrap: wrap; flex-wrap: wrap;
gap: 8px 14px; gap: 8px 14px;
align-items: center;
margin-left: 12px; margin-left: 12px;
.commission-summary-item { .commission-summary-item {
display: inline-flex; display: inline-flex;
align-items: center;
gap: 4px; gap: 4px;
align-items: center;
padding: 5px 10px; padding: 5px 10px;
white-space: nowrap; white-space: nowrap;
background: var(--el-color-primary-light-9); background: var(--el-color-primary-light-9);

View File

@@ -46,7 +46,6 @@
<!-- <TransactionList />--> <!-- <TransactionList />-->
<!-- </el-col>--> <!-- </el-col>-->
<!--</el-row>--> <!--</el-row>-->
</div> </div>
</template> </template>

View File

@@ -385,9 +385,11 @@
const qrContent = ref('') const qrContent = ref('')
const onlineRequestId = ref<string | null>(null) const onlineRequestId = ref<string | null>(null)
const paymentStatusTimer = ref<ReturnType<typeof setInterval> | null>(null) const paymentStatusTimer = ref<ReturnType<typeof setInterval> | null>(null)
const ONLINE_MIN_RECHARGE_AMOUNT_FEN = 10
const ONLINE_MAX_RECHARGE_AMOUNT_FEN = 100000000
const paymentMethodsBounds = reactive({ const paymentMethodsBounds = reactive({
min_amount: 10000, min_amount: ONLINE_MIN_RECHARGE_AMOUNT_FEN,
max_amount: 100000000 max_amount: ONLINE_MAX_RECHARGE_AMOUNT_FEN
}) })
const paymentVoucherFileKeys = ref<string[]>([]) const paymentVoucherFileKeys = ref<string[]>([])
@@ -1013,8 +1015,9 @@
const res = await AgentRechargeService.getPaymentMethods() const res = await AgentRechargeService.getPaymentMethods()
if (res.code === 0) { if (res.code === 0) {
onlinePaymentMethods.value = Array.isArray(res.data?.methods) ? res.data.methods : [] onlinePaymentMethods.value = Array.isArray(res.data?.methods) ? res.data.methods : []
paymentMethodsBounds.min_amount = Number(res.data?.min_amount) || 10000 paymentMethodsBounds.min_amount = ONLINE_MIN_RECHARGE_AMOUNT_FEN
paymentMethodsBounds.max_amount = Number(res.data?.max_amount) || 100000000 paymentMethodsBounds.max_amount =
Number(res.data?.max_amount) || ONLINE_MAX_RECHARGE_AMOUNT_FEN
createForm.amount = minimumAmountYuan.value createForm.amount = minimumAmountYuan.value
} else { } else {
ElMessage.warning(res.msg || '当前暂无可用在线支付方式') ElMessage.warning(res.msg || '当前暂无可用在线支付方式')
@@ -1366,16 +1369,16 @@
.online-recharge-empty-hint { .online-recharge-empty-hint {
margin-top: 8px; margin-top: 8px;
color: var(--el-color-danger);
font-size: 12px; font-size: 12px;
line-height: 1.5; line-height: 1.5;
color: var(--el-color-danger);
} }
.online-recharge-qr-dialog { .online-recharge-qr-dialog {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
align-items: center;
gap: 16px; gap: 16px;
align-items: center;
&__code-surface { &__code-surface {
display: flex; display: flex;
@@ -1391,11 +1394,11 @@
&__summary { &__summary {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
align-items: center;
gap: 8px; gap: 8px;
align-items: center;
width: 100%; width: 100%;
color: var(--el-text-color-regular);
font-size: 14px; font-size: 14px;
color: var(--el-text-color-regular);
text-align: center; text-align: center;
} }
@@ -1404,8 +1407,8 @@
} }
&__loading { &__loading {
color: var(--el-color-primary);
font-size: 12px; font-size: 12px;
color: var(--el-color-primary);
} }
} }
</style> </style>

View File

@@ -2011,20 +2011,20 @@
} }
.package-name { .package-name {
grid-column: 1 / 3;
grid-row: 1; grid-row: 1;
grid-column: 1 / 3;
min-width: 0; min-width: 0;
padding-bottom: 8px; padding-bottom: 8px;
border-bottom: 1px solid var(--el-border-color-lighter);
font-size: 14px; font-size: 14px;
color: var(--el-text-color-regular); color: var(--el-text-color-regular);
border-bottom: 1px solid var(--el-border-color-lighter);
} }
.cost-price-input-wrapper { .cost-price-input-wrapper {
grid-column: 1;
grid-row: 2;
display: flex; display: flex;
flex-direction: column; flex-direction: column;
grid-row: 2;
grid-column: 1;
gap: 6px; gap: 6px;
align-items: flex-start; align-items: flex-start;
width: 100%; width: 100%;
@@ -2041,20 +2041,20 @@
.min-cost-hint { .min-cost-hint {
font-size: 12px; font-size: 12px;
color: var(--el-text-color-secondary);
line-height: 1.4; line-height: 1.4;
color: var(--el-text-color-secondary);
} }
} }
.expiry-base-input-wrapper { .expiry-base-input-wrapper {
grid-column: 2;
grid-row: 2;
display: flex; display: flex;
flex-direction: column; flex-direction: column;
grid-row: 2;
grid-column: 2;
gap: 8px; gap: 8px;
min-width: 0;
width: 100%;
align-self: start; align-self: start;
width: 100%;
min-width: 0;
.expiry-base-label { .expiry-base-label {
font-size: 13px; font-size: 13px;
@@ -2069,10 +2069,9 @@
} }
:deep(.el-button) { :deep(.el-button) {
grid-column: 3;
grid-row: 1; grid-row: 1;
align-self: start; grid-column: 3;
justify-self: end; place-self: start end;
width: 56px; width: 56px;
padding-right: 8px; padding-right: 8px;
padding-left: 8px; padding-left: 8px;
@@ -2090,18 +2089,18 @@
grid-template-columns: 1fr; grid-template-columns: 1fr;
.expiry-base-input-wrapper { .expiry-base-input-wrapper {
grid-column: 1 / -1;
grid-row: 3; grid-row: 3;
grid-column: 1 / -1;
} }
.cost-price-input-wrapper { .cost-price-input-wrapper {
grid-column: 1 / -1;
grid-row: 2; grid-row: 2;
grid-column: 1 / -1;
} }
:deep(.el-button) { :deep(.el-button) {
grid-column: 3;
grid-row: 1; grid-row: 1;
grid-column: 3;
justify-self: start; justify-self: start;
} }
} }

View File

@@ -207,8 +207,8 @@
<style scoped lang="scss"> <style scoped lang="scss">
.dialog-description { .dialog-description {
margin-bottom: 20px; margin-bottom: 20px;
color: var(--el-text-color-secondary);
font-size: 13px; font-size: 13px;
color: var(--el-text-color-secondary);
} }
.application-form { .application-form {
@@ -221,7 +221,7 @@
.dialog-footer { .dialog-footer {
display: flex; display: flex;
justify-content: flex-end;
gap: 12px; gap: 12px;
justify-content: flex-end;
} }
</style> </style>

View File

@@ -267,8 +267,8 @@
:deep(> .el-card__body) { :deep(> .el-card__body) {
box-sizing: border-box; box-sizing: border-box;
min-height: 0; min-height: 0;
overflow-y: auto;
padding-bottom: 24px; padding-bottom: 24px;
overflow-y: auto;
} }
} }
@@ -303,10 +303,10 @@
:deep(.el-card__body) { :deep(.el-card__body) {
display: flex; display: flex;
height: auto;
flex-direction: column; flex-direction: column;
justify-content: space-between;
gap: 10px; gap: 10px;
justify-content: space-between;
height: auto;
overflow: visible; overflow: visible;
} }
} }
@@ -318,41 +318,41 @@
} }
.member-card__header { .member-card__header {
justify-content: space-between;
gap: 12px; gap: 12px;
justify-content: space-between;
} }
.member-card__identity { .member-card__identity {
display: flex; display: flex;
min-width: 0;
flex: 1; flex: 1;
align-items: center;
gap: 10px; gap: 10px;
align-items: center;
min-width: 0;
} }
.member-card__avatar { .member-card__avatar {
flex-shrink: 0; flex-shrink: 0;
font-weight: 600;
color: var(--el-color-primary); color: var(--el-color-primary);
background: var(--el-color-primary-light-9); background: var(--el-color-primary-light-9);
font-weight: 600;
} }
.member-card__name { .member-card__name {
min-width: 0;
flex: 1; flex: 1;
min-width: 0;
overflow: hidden; overflow: hidden;
color: var(--el-text-color-primary);
font-size: 16px; font-size: 16px;
font-weight: 600; font-weight: 600;
color: var(--el-text-color-primary);
text-overflow: ellipsis; text-overflow: ellipsis;
white-space: nowrap; white-space: nowrap;
} }
.member-card__info { .member-card__info {
justify-content: space-between;
gap: 16px; gap: 16px;
color: var(--el-text-color-regular); justify-content: space-between;
font-size: 13px; font-size: 13px;
color: var(--el-text-color-regular);
span:last-child { span:last-child {
min-width: 0; min-width: 0;
@@ -381,19 +381,19 @@
margin-top: 20px; margin-top: 20px;
} }
@media (max-width: 1400px) { @media (width <= 1400px) {
.member-grid { .member-grid {
grid-template-columns: repeat(3, minmax(0, 1fr)); grid-template-columns: repeat(3, minmax(0, 1fr));
} }
} }
@media (max-width: 1024px) { @media (width <= 1024px) {
.member-grid { .member-grid {
grid-template-columns: repeat(2, minmax(0, 1fr)); grid-template-columns: repeat(2, minmax(0, 1fr));
} }
} }
@media (max-width: 640px) { @media (width <= 640px) {
.member-grid { .member-grid {
grid-template-columns: 1fr; grid-template-columns: 1fr;
} }

View File

@@ -502,9 +502,9 @@
.dialog-section { .dialog-section {
padding: 18px 20px; padding: 18px 20px;
background: var(--el-fill-color-blank);
border: 1px solid var(--el-border-color-lighter); border: 1px solid var(--el-border-color-lighter);
border-radius: 8px; border-radius: 8px;
background: var(--el-fill-color-blank);
} }
.dialog-section + .dialog-section { .dialog-section + .dialog-section {
@@ -513,22 +513,22 @@
.dialog-section__header { .dialog-section__header {
display: flex; display: flex;
gap: 16px;
align-items: flex-start; align-items: flex-start;
justify-content: space-between; justify-content: space-between;
gap: 16px;
margin-bottom: 16px; margin-bottom: 16px;
} }
.dialog-section__title { .dialog-section__title {
color: var(--el-text-color-primary);
font-size: 15px; font-size: 15px;
font-weight: 600; font-weight: 600;
color: var(--el-text-color-primary);
} }
.dialog-section__description { .dialog-section__description {
margin-top: 4px; margin-top: 4px;
color: var(--el-text-color-secondary);
font-size: 12px; font-size: 12px;
color: var(--el-text-color-secondary);
} }
.mapping-tip { .mapping-tip {
@@ -540,8 +540,8 @@
.template-name { .template-name {
margin-top: 6px; margin-top: 6px;
overflow: hidden; overflow: hidden;
color: var(--el-text-color-secondary);
font-size: 12px; font-size: 12px;
color: var(--el-text-color-secondary);
text-overflow: ellipsis; text-overflow: ellipsis;
white-space: nowrap; white-space: nowrap;
} }
@@ -556,19 +556,19 @@
.mapping-list { .mapping-list {
display: flex; display: flex;
max-height: 420px;
flex-direction: column; flex-direction: column;
gap: 12px; gap: 12px;
overflow-y: auto; max-height: 420px;
padding: 0 4px 4px; padding: 0 4px 4px;
overflow-y: auto;
} }
.mapping-row { .mapping-row {
padding: 14px; padding: 14px;
border: 1px solid var(--el-border-color-lighter);
border-radius: 6px;
margin-top: 6px; margin-top: 6px;
background: var(--el-fill-color-blank); background: var(--el-fill-color-blank);
border: 1px solid var(--el-border-color-lighter);
border-radius: 6px;
} }
.mapping-row__grid { .mapping-row__grid {
@@ -579,31 +579,31 @@
.mapping-field { .mapping-field {
display: flex; display: flex;
min-width: 0;
flex-direction: column; flex-direction: column;
gap: 6px; gap: 6px;
min-width: 0;
} }
.mapping-field__label { .mapping-field__label {
color: var(--el-text-color-secondary);
font-size: 12px; font-size: 12px;
color: var(--el-text-color-secondary);
} }
.dialog-footer { .dialog-footer {
display: flex; display: flex;
justify-content: flex-end;
gap: 12px; gap: 12px;
justify-content: flex-end;
} }
@media (max-width: 768px) { @media (width <= 768px) {
.dialog-section { .dialog-section {
padding: 14px; padding: 14px;
} }
.dialog-section__header { .dialog-section__header {
align-items: stretch;
flex-direction: column; flex-direction: column;
gap: 8px; gap: 8px;
align-items: stretch;
} }
.mapping-tip { .mapping-tip {
@@ -617,13 +617,13 @@
} }
} }
@media (max-width: 1200px) { @media (width <= 1200px) {
.mapping-row__grid { .mapping-row__grid {
grid-template-columns: repeat(2, minmax(0, 1fr)); grid-template-columns: repeat(2, minmax(0, 1fr));
} }
} }
@media (max-width: 768px) { @media (width <= 768px) {
:deep(.wecom-scene-dialog) { :deep(.wecom-scene-dialog) {
width: calc(100vw - 32px) !important; width: calc(100vw - 32px) !important;
} }

View File

@@ -16,20 +16,30 @@
<ElDescriptionsItem label="店铺名称">{{ shop.shop_name || '-' }}</ElDescriptionsItem> <ElDescriptionsItem label="店铺名称">{{ shop.shop_name || '-' }}</ElDescriptionsItem>
<ElDescriptionsItem label="店铺编号">{{ shop.shop_code || '-' }}</ElDescriptionsItem> <ElDescriptionsItem label="店铺编号">{{ shop.shop_code || '-' }}</ElDescriptionsItem>
<ElDescriptionsItem label="店铺层级">{{ shop.level }}</ElDescriptionsItem> <ElDescriptionsItem label="店铺层级">{{ shop.level }}</ElDescriptionsItem>
<ElDescriptionsItem label="上级店铺">{{ shop.parent_shop_name || '-' }}</ElDescriptionsItem> <ElDescriptionsItem label="上级店铺">{{
shop.parent_shop_name || '-'
}}</ElDescriptionsItem>
<ElDescriptionsItem label="联系人">{{ shop.contact_name || '-' }}</ElDescriptionsItem> <ElDescriptionsItem label="联系人">{{ shop.contact_name || '-' }}</ElDescriptionsItem>
<ElDescriptionsItem label="联系电话">{{ shop.contact_phone || '-' }}</ElDescriptionsItem> <ElDescriptionsItem label="联系电话">{{ shop.contact_phone || '-' }}</ElDescriptionsItem>
<ElDescriptionsItem label="平台业务员"> <ElDescriptionsItem label="平台业务员">
{{ formatBusinessOwner(shop) }} {{ formatBusinessOwner(shop) }}
</ElDescriptionsItem> </ElDescriptionsItem>
<ElDescriptionsItem label="业务员通知状态"> <ElDescriptionsItem label="业务员通知状态">
{{ shop.business_owner_account_id ? (shop.business_owner_available ? '可用' : '已停用') : '-' }} {{
shop.business_owner_account_id
? shop.business_owner_available
? '可用'
: '已停用'
: '-'
}}
</ElDescriptionsItem> </ElDescriptionsItem>
<ElDescriptionsItem label="省份">{{ shop.province || '-' }}</ElDescriptionsItem> <ElDescriptionsItem label="省份">{{ shop.province || '-' }}</ElDescriptionsItem>
<ElDescriptionsItem label="城市">{{ shop.city || '-' }}</ElDescriptionsItem> <ElDescriptionsItem label="城市">{{ shop.city || '-' }}</ElDescriptionsItem>
<ElDescriptionsItem label="区县">{{ shop.district || '-' }}</ElDescriptionsItem> <ElDescriptionsItem label="区县">{{ shop.district || '-' }}</ElDescriptionsItem>
<ElDescriptionsItem label="详细地址">{{ shop.address || '-' }}</ElDescriptionsItem> <ElDescriptionsItem label="详细地址">{{ shop.address || '-' }}</ElDescriptionsItem>
<ElDescriptionsItem label="状态">{{ shop.status_name || shop.status }}</ElDescriptionsItem> <ElDescriptionsItem label="状态">{{
shop.status_name || shop.status
}}</ElDescriptionsItem>
<ElDescriptionsItem label="创建时间">{{ shop.created_at || '-' }}</ElDescriptionsItem> <ElDescriptionsItem label="创建时间">{{ shop.created_at || '-' }}</ElDescriptionsItem>
<ElDescriptionsItem label="更新时间">{{ shop.updated_at || '-' }}</ElDescriptionsItem> <ElDescriptionsItem label="更新时间">{{ shop.updated_at || '-' }}</ElDescriptionsItem>
</ElDescriptions> </ElDescriptions>

View File

@@ -88,7 +88,6 @@
/> />
</ElFormItem> </ElFormItem>
<ElFormItem label="默认信用额度"> <ElFormItem label="默认信用额度">
<div class="credit-form-unit">单位</div>
<ElInputNumber <ElInputNumber
v-model="form.credit_limit_yuan" v-model="form.credit_limit_yuan"
:disabled="!form.credit_enabled" :disabled="!form.credit_enabled"
@@ -101,7 +100,7 @@
:formatter="formatCreditInput" :formatter="formatCreditInput"
:parser="parseCreditInput" :parser="parseCreditInput"
/> />
<div class="credit-form-tip">修改后不会影响已有店铺</div> <div class="credit-form-tip">单位修改后不会影响已有店铺</div>
</ElFormItem> </ElFormItem>
</template> </template>
</ElForm> </ElForm>