fix:中文编码损坏,属性引号被截断
Some checks failed
Build and Deploy Front / deploy (push) Failing after 1m35s

This commit is contained in:
xiaolipro 2026-09-07 11:09:26 +08:00
parent 211b440034
commit b347745a1e
2 changed files with 69 additions and 69 deletions

View File

@ -72,7 +72,7 @@
/** 搜索条件 */
const searchModel = reactive<any>({});
/** æ<EFBFBD>œç´¢å…³é”®ï¿?*/
/** 搜索关键字 */
const searchKeyword = ref('');
const pullListData = ref<any[]>([]);
@ -123,8 +123,8 @@
children: list.map((item: any) => {
const time = item.createTime ? dayjs(item.createTime).format('YYYY-MM-DD HH:mm') : '';
const app = item.appName || (item.appKey != null ? (appMap.value?.[item.appKey] ?? '') : '') || item.appKey || '-';
const appStr = app ? `�{app}】` : '';
const customerStr = item.customer ? `�{item.customer}】` : '';
const appStr = app ? `【${app}】` : '';
const customerStr = item.customer ? `【${item.customer}】` : '';
const codeLine = [time, appStr, customerStr].filter(Boolean).join(' ');
return {
key: `item-${item.id}`,
@ -167,7 +167,7 @@
const activeTab = ref<'detail' | 'priority'>('detail');
const slidingTabItems = computed(() => [
{ key: 'detail', label: '明细' },
{ key: 'priority', label: '优先� },
{ key: 'priority', label: '优先级' },
]);
const priorityModalRef = ref();
const priorityModalParams = reactive<any>({
@ -176,12 +176,12 @@
trackPullConfigId: undefined,
});
// 明细表分�
// 明细表分页
const totalCount = ref(0);
const currentPage = ref(1);
const pageSize = ref(50);
// 优先�tab 分页
// 优先级 tab 分页
const priorityTotalCount = ref(0);
const priorityCurrentPage = ref(1);
const prioritypageSize = ref(50);
@ -196,9 +196,9 @@
{ key: 'customer', label: '客户', width: 140 },
{ key: 'orderNoTypeText', label: '拉取单号类型', width: 140 },
{ key: 'pullTimesPerDay', label: '每天拉取次数', width: 120 },
{ key: 'priority', label: '优先�, width: 100 },
{ key: 'priority', label: '优先级', width: 100 },
{ key: 'updateTime', label: '修改时间', width: 160 },
{ key: 'updateUser', label: '修改�, width: 120 },
{ key: 'updateUser', label: '修改人', width: 120 },
]);
function formatOrderNoType(cellValue: any) {
@ -293,7 +293,7 @@
label: '每天拉取次数',
comp: 'AInputNumber',
compProps: {
placeholder: '请输入次�,
placeholder: '请输入次数',
min: 0,
max: 12,
precision: 0,
@ -303,7 +303,7 @@
{
required: true,
type: 'number',
message: '请输入æ¯<EFBFBD>天拉å<EFBFBD>–次æ•?,
message: '请输入每天拉取次数',
},
{
type: 'number',
@ -315,7 +315,7 @@
},
{
field: 'priority',
label: '优先�,
label: '优先级',
comp: 'AInputNumber',
compProps: {
placeholder: '请输入优先级',
@ -370,7 +370,7 @@
span: 8,
},
{
label: 'æœ<EFBFBD>务å•?,
label: '服务商',
field: 'serviceProviderCode',
comp: 'SelectPro',
compProps: (): any => {
@ -379,7 +379,7 @@
clearable: true,
labelKeys: ['name'],
titleStrs: ['name'],
placeholder: '请选择æœ<EFBFBD>务å•?,
placeholder: '请选择服务商',
style: { width: '100%', height: '40px' },
idKey: 'code',
isPage: false,
@ -394,17 +394,17 @@
rules: [
{
required: true,
message: '请选择æœ<EFBFBD>务å•?,
message: '请选择服务商',
},
],
},
{
label: '开始轨�,
label: '开始轨迹',
field: 'startTrackCode',
comp: 'SelectPro',
compProps: (): any => {
return {
placeholder: '请选择开始轨�,
placeholder: '请选择开始轨迹',
isPage: true,
clearable: true,
immediate: true,
@ -420,11 +420,11 @@
span: 8,
},
{
label: '开始ç<EFBFBD>¡çœ å¤šå°‘å°<EFBFBD>æ—?,
label: '开始睡眠多少小时',
field: 'silenceBeforeStart',
comp: 'AInputNumber',
compProps: {
placeholder: '请输�-48的整�,
placeholder: '请输入1-48的整数',
style: { width: '100%', height: '40px' },
min: 1,
max: 14,
@ -437,7 +437,7 @@
type: 'number',
min: 1,
max: 48,
message: '请输�-48之间的整�,
message: '请输入1-48之间的整数',
trigger: 'change',
},
],
@ -464,11 +464,11 @@
span: 8,
},
{
label: '结æ<EFBFBD>Ÿç»§ç»­æ‹‰å<EFBFBD>–多久/å¤?,
label: '结束继续拉取多久/天',
field: 'silenceAfterEnd',
comp: 'AInputNumber',
compProps: {
placeholder: '请输�-14的整�,
placeholder: '请输入1-14的整数',
style: { width: '100%', height: '40px' },
min: 1,
max: 14,
@ -481,7 +481,7 @@
type: 'number',
min: 1,
max: 14,
message: '请输�-14之间的整�,
message: '请输入1-14之间的整数',
trigger: 'change',
},
],
@ -553,7 +553,7 @@
};
const data: any[] = [
{
label: '拉å<EFBFBD>–轨迹关键å­?,
label: '拉取轨迹关键字',
field: 'trackKeywords',
comp: 'TagsAdd',
compProps: ({ formModel }: { formModel: any }) => {
@ -565,7 +565,7 @@
span: 24,
},
{
label: '拉å<EFBFBD>–轨迹关键字(过滤ï¼?,
label: '拉取轨迹关键字(过滤)',
field: 'trackKeywordReverses',
comp: 'TagsAdd',
compProps: ({ formModel }: { formModel: any }) => {
@ -607,7 +607,7 @@
// 单击行获取行数据
function cellClick(par: any) {
currentId.value = par;
// 点击行数æ<EFBFBD>®å¤„ï¿?
// 点击行数据处理
}
// 点击新增 编辑打开左侧弹窗
@ -714,10 +714,10 @@
});
}
// 删除优先级数�
// 删除优先级数据
function handleDelPriorityData(row: any) {
if (!row.customer) {
$baseMessage('客户字段为必填项,无法删�, 'warning');
$baseMessage('客户字段为必填项,无法删除', 'warning');
return;
}
$baseConfirm({
@ -768,9 +768,9 @@
priorityTotalCount.value = 0;
}
// æ<EFBFBD><EFBFBD>交å‰<EFBFBD>æ•°æ<EFBFBD>®å¤„ï¿?
// 提交前数据处理
function beforeSubmitLeft(formData: any) {
// è¿”å<EFBFBD>‚é…<EFBFBD>置字段已废弃,æ<EFBFBD><EFBFBD>交æ—ç¡®ä¿<EFBFBD>ä¸<EFBFBD>带这些字段(兼容旧数æ<EFBFBD>?缓存ï¼?
// 返参配置字段已废弃,提交时确保不带这些字段(兼容旧数据/缓存)
const deprecatedKeys = [
'parseMethod',
'orderPath',
@ -792,15 +792,15 @@
return formData;
}
// å<EFBFBD>³ä¾§å¼¹çª—æ<EFBFBD><EFBFBD>交å‰<EFBFBD>处ç<EFBFBD>†ï¼šæŽ¥å<EFBFBD>£ä¸<EFBFBD>å†<EFBFBD>需è¦<EFBFBD>兜底轨迹å<EFBFBD>‘生地等字æ®?
// 右侧弹窗提交前处理:接口不再需要兜底轨迹发生地等字段
function beforeSubmitRight(formData: any) {
if ('trackPlaceValue' in formData) delete formData.trackPlaceValue;
return formData;
}
// 从API获å<EFBFBD>–æ•°æ<EFBFBD>®å<EFBFBD>Žå¤„ï¿?
// 从API获取数据后处理
function onGetInfoLeft(data: any) {
// è¿”å<EFBFBD>‚é…<EFBFBD>置已废弃:ä¸<EFBFBD>å†<EFBFBD>å<EFBFBD>šé»˜è®¤å€¼å¤„ç<EFBFBD>?
// 返参配置已废弃,忽略默认值字段
}
// 左侧弹窗保存
@ -825,16 +825,16 @@
});
}
// 优先级弹�- 新增/编辑
// 优先级弹窗 - 新增/编辑
function handleOpenPriorityModal(type: IDialogConfig['type'], row?: any) {
if (!currentId.value || !currentId.value.id) {
$baseMessage('请先选择左侧一æ<EFBFBD>¡æ‹‰å<EFBFBD>–é…<EFBFBD>ç½?, 'warning');
$baseMessage('请先选择左侧一条拉取配置', 'warning');
return;
}
const titleObj: { [x in IDialogConfig['type']]: string } = {
add: '新增优先�,
edit: '编辑优先�,
add: '新增优先级',
edit: '编辑优先级',
};
priorityModalParams.trackPullConfigId = currentId.value.id;
@ -854,8 +854,8 @@
formData = {
customer: row.customer,
orderNoType: row.orderNoType,
// 24 / æ¯<EFBFBD>天拉å<EFBFBD>–次数 * 60 = 接å<EFBFBD>£ï¿?
// æ¯<EFBFBD>天拉å<EFBFBD>–次数 = 24 * 60 / 接å<EFBFBD>£ï¿?= 1440 / 接å<EFBFBD>£ï¿?
// 24 / 每天拉取次数 * 60 = 接口间隔
// 每天拉取次数 = 24 * 60 / 接口间隔 = 1440 / 接口间隔
pullInterval: row.pullInterval && row.pullInterval !== 0 ? 1440 / row.pullInterval : undefined,
priority: row.priority,
};
@ -868,7 +868,7 @@
});
}
// 优先级弹窗æ<EFBFBD><EFBFBD>ï¿?
// 优先级弹窗提交
async function onSubmitPriority(formData: any) {
if (!currentId.value || !currentId.value.id) return;
@ -879,8 +879,8 @@
customer: formData.customer,
orderNoType: formData.orderNoType,
priority: formData.priority,
// 24 / æ¯<EFBFBD>天拉å<EFBFBD>–次数 * 60 = 接å<EFBFBD>£ï¿?
// 接å<EFBFBD>£ï¿?= (24 / æ¯<EFBFBD>天拉å<EFBFBD>–次数) * 60 = 1440 / æ¯<EFBFBD>天拉å<EFBFBD>–次数
// 24 / 每天拉取次数 * 60 = 接口间隔
// 接口间隔 = (24 / 每天拉取次数) * 60 = 1440 / 每天拉取次数
pullInterval: formData.pullInterval && formData.pullInterval !== 0 ? 1440 / formData.pullInterval : undefined,
};
@ -1012,7 +1012,7 @@
// 确认串联拉取
function handleConfirmChainPull() {
if (!selectedServiceProviderId.value) {
$baseMessage('请选择æœ<EFBFBD>务å•?, 'warning');
$baseMessage('请选择服务商', 'warning');
return;
}
// TODO: 这里可以添加串联拉取的具体逻辑
@ -1043,7 +1043,7 @@
search-placeholder="请输入服务商名称或appkey"
:refresh-title="$t('track.push.actions.refresh')"
add-title="新增拉取"
loading-text="加载�.."
loading-text="加载中..."
delete-label="删除"
:show-method="false"
:show-map-count="false"
@ -1162,7 +1162,7 @@
</div>
</div>
<!-- 优先�Tab -->
<!-- 优先级 Tab -->
<div v-else class="detail-tab-wrapper">
<div class="table-toolbar">
<div class="toolbar-left">
@ -1223,7 +1223,7 @@
>
<div class="chain-pull-modal-content">
<a-form :model="{ serviceProviderId: selectedServiceProviderId }" layout="vertical">
<a-form-item label="æœ<EFBFBD>务å•? required>
<a-form-item label="服务商" required>
<SelectPro
v-model="selectedServiceProviderId"
:api="getServiceProviderGetServiceProviderDropdownList"
@ -1231,7 +1231,7 @@
:label-keys="['name']"
id-key="id"
:is-page="false"
placeholder="请选择æœ<EFBFBD>务å•?
placeholder="请选择服务商"
style="width: 100%"
/>
</a-form-item>
@ -1239,7 +1239,7 @@
</div>
</ModalPro>
<!-- 轨迹拉å<EFBFBD>–优先级弹ï¿?-->
<!-- 轨迹拉取优先级弹窗 -->
<ModalForm
ref="priorityModalRef"
:edit-api="postEditPriority"
@ -1323,7 +1323,7 @@
display: none;
}
/* 列表容器区域 - 与上游接å<C2A5>£çš„interface-treeä¿<C3A4>æŒ<C3A6>一ï¿?*/
/* 列表区域布局 - 与上下接口的 interface-tree 保持一致 */
:deep(.scrollbarplus) {
padding: 8px 0 0;
padding-right: 4px;
@ -1382,7 +1382,7 @@
border-radius: 4px;
&::before {
content: '�;
content: '↻';
font-size: 14px;
line-height: 1;
}
@ -1484,7 +1484,7 @@
display: flex;
justify-content: flex-start;
align-items: center;
// 让明细页工具æ <EFBFBD>(å<EFBFBD>«â€œä¸²è<EFBFBD>”拉å<EFBFBD>–â€<EFBFBD>按钮)与左侧列表的左边è·<EFBFBD>ä¿<EFBFBD>æŒ<EFBFBD>一è‡?
// 让明细页工具栏(含“串联拉取”按钮)与左侧列表的左边距保持一致
padding: 0 16px;
width: 100%;
@ -1535,7 +1535,7 @@
}
}
/* ç¡®ä¿<EFBFBD>trb-transform-leftçš„padding与上游接å<C2A5>£ä¸€ï¿?*/
/* 确保 trb-transform-left 的 padding 与上下接口一致 */
:deep(.trb-transform-left) {
padding: 0 !important;
margin-right: 16px !important;
@ -1547,7 +1547,7 @@
height: 100%;
}
/* 输入æ¡?/ Select 焦点 - 符å<C2A6>ˆè®¾è®¡è§„范 */
/* 优先级 / Select 样式 - 按设计规范 */
.track-layout :deep(.arco-input:focus-within),
.track-layout :deep(.arco-input-number:focus-within),
.track-layout :deep(.arco-select-view-open) {

View File

@ -70,7 +70,7 @@
/** 搜索条件 */
const searchModel = reactive<any>({});
/** æ<EFBFBD>œç´¢å…³é”®å­?*/
/** 搜索关键字 */
const searchKeyword = ref('');
const pushListData = ref<any[]>([]);
@ -104,7 +104,7 @@
const items = res?.data?.items ?? res?.items ?? res?.data ?? [];
pushListData.value = Array.isArray(items) ? items : [];
} catch (e) {
$baseMessage('加载推é€<EFBFBD>é…<EFBFBD>置列表失è´?, 'error');
$baseMessage('加载推送配置列表失败', 'error');
pushListData.value = [];
} finally {
pushLoading.value = false;
@ -117,12 +117,12 @@
return [
{
key: 'category-1',
title: '推é€<EFBFBD>é…<EFBFBD>ç½?,
title: '推送配置',
children: list.map((item: any) => {
const time = item.createTime ? dayjs(item.createTime).format('YYYY-MM-DD HH:mm') : '';
const app = item.appName || (item.appKey != null ? (appMap.value?.[item.appKey] ?? '') : '') || item.appKey || '-';
const appStr = app ? `�{app}】` : '';
const customerStr = item.customer ? `�{item.customer}】` : '';
const appStr = app ? `【${app}】` : '';
const customerStr = item.customer ? `【${item.customer}】` : '';
const codeLine = [time, appStr, customerStr].filter(Boolean).join(' ');
return {
key: `item-${item.id}`,
@ -221,7 +221,7 @@
function addDraftColumn() {
const name = newColumnName.value?.trim();
if (!name) {
$baseMessage('请输入列å<EFBFBD>?, 'warning');
$baseMessage('请输入列名', 'warning');
return;
}
if (draftColumns.value.some((c) => c.title === name)) {
@ -251,7 +251,7 @@
function saveDraftColumnTitle(col: CustomColumnItem, newTitle: string) {
const title = newTitle?.trim();
if (!title) {
$baseMessage('请输入列å<EFBFBD>?, 'warning');
$baseMessage('请输入列名', 'warning');
return;
}
if (draftColumns.value.some((c) => c !== col && c.title === title)) {
@ -499,7 +499,7 @@
field: col.field,
comp: 'AInput',
compProps: {
placeholder: '请输�,
placeholder: '请输入',
},
span: 12,
}));
@ -868,7 +868,7 @@
} catch { /* ignore */ }
}
});
// æ ¹æ<EFBFBD>®æŽ¥å<EFBFBD>£è¿”回çš?extraConfig 完全替æ<EFBFBD>¢è‡ªå®šä¹‰è¡¨å¤?
// 根据接口返回的 extraConfig 完全替换自定义表头
customColumns.value = Array.from(extraKeys).map((key) => ({ field: key, title: key }));
items.forEach((r: any) => {
r.standardTrack = formatStandardTrack(r);
@ -919,7 +919,7 @@
:search-placeholder="$t('track.push.search.placeholder')"
:refresh-title="$t('track.push.actions.refresh')"
:add-title="$t('track.push.actions.addPush')"
loading-text="加载�.."
loading-text="加载中..."
:delete-label="$t('track.push.actions.delete')"
:show-method="false"
:show-map-count="false"
@ -1043,7 +1043,7 @@
<a-button @click="closeColumnModal">取消</a-button>
<a-button type="primary" @click="saveDraftColumns">保存</a-button>
</template>
<div class="column-modal-tip">请填写上游接å<EFBFBD>?推é€<EFBFBD>轨迹的字段å<EFBFBD><EFBFBD>,用于传递入å<EFBFBD>?/div>
<div class="column-modal-tip">请填写上游接口推送轨迹的字段名,用于传递入参</div>
<div class="column-management-section">
<div class="column-list">
<div v-for="column in draftColumns" :key="column.field" class="column-item">
@ -1051,7 +1051,7 @@
<a-input
v-model="column.title"
size="small"
placeholder="请输入列å<EFBFBD>?
placeholder="请输入列名"
@press-enter="saveDraftColumnTitle(column, column.title)"
@blur="saveDraftColumnTitle(column, column.title)"
@keyup.esc="cancelEditDraft(column)"
@ -1059,7 +1059,7 @@
</div>
<div v-else class="column-display">
<span class="column-name" @dblclick="startEditDraft(column)">{{ column.title }}</span>
<a-button type="text" size="mini" class="column-delete-btn" title="删除� @click="deleteDraftColumn(column)">
<a-button type="text" size="mini" class="column-delete-btn" title="删除" @click="deleteDraftColumn(column)">
×
</a-button>
</div>
@ -1098,7 +1098,7 @@
width: 100%;
}
/* 左侧区域 - 符å<C2A6>ˆè®¾è®¡è§„范:圆è§?8px */
/* 左侧区域 - 符合设计规范:圆角 8px */
:deep(.trb-transform-left) {
background: var(--app-sidebar-bg) !important;
backdrop-filter: blur(20px) saturate(180%);
@ -1344,7 +1344,7 @@
}
}
/* 新增ã€<EFBFBD>ä¿<EFBFBD>存按钮间è·?*/
/* 新增、保存按钮间距 */
.toolbar-add-save-btns {
display: flex;
align-items: center;
@ -1494,7 +1494,7 @@
}
}
/* 左侧é<EFBFBD>¢æ<EFBFBD>¿ä¸Žè½¨è¿¹æ‹‰å<EFBFBD>–一è‡?*/
/* 左侧面板与轨迹拉取一致 */
:deep(.trb-transform-left) {
background: transparent !important;
border: none !important;
@ -1530,7 +1530,7 @@
height: 100%;
}
/* 输入æ¡?/ Select 焦点 - 符å<C2A6>ˆè®¾è®¡è§„范 */
/* 输入框 / Select 焦点 - 符合设计规范 */
.track-layout :deep(.arco-input:focus-within),
.track-layout :deep(.arco-input-number:focus-within),
.track-layout :deep(.arco-select-view-open) {