diff --git a/IDE官网/assets/img/favicon.png b/IDE官网/assets/img/favicon.png new file mode 100644 index 0000000..3f851af Binary files /dev/null and b/IDE官网/assets/img/favicon.png differ diff --git a/IDE官网/assets/js/ai-advisor.js b/IDE官网/assets/js/ai-advisor.js index b51bb86..6788fca 100644 --- a/IDE官网/assets/js/ai-advisor.js +++ b/IDE官网/assets/js/ai-advisor.js @@ -10,7 +10,7 @@ const PHONE = '18123959245'; const EMAIL = 'bd01@1st56.com'; const WECHAT = 'ydgjzzh'; - const ICP = '粤ICP备19018720号'; + const ICP = '粤ICP备2025463970号-2'; const ADDRESS_ZH = '深圳宝安区福永怀德翠岗5区36栋'; const ADDRESS_EN = 'Bldg 36, Cuigang 5, Fuyong, Bao’an, Shenzhen'; diff --git a/IDE官网/assets/js/main.js b/IDE官网/assets/js/main.js index 32d8f39..db67105 100644 --- a/IDE官网/assets/js/main.js +++ b/IDE官网/assets/js/main.js @@ -115,8 +115,8 @@ document.addEventListener('DOMContentLoaded', () => { const languageStorageKey = 'ide-language'; const pageTitleMap = { - 'IDE|Faster & Simpler': 'IDE|更快 · 更简单', - 'IDE|Immediate Delivery Express — Cross-Border Logistics': 'IDE|Immediate Delivery Express — 跨境物流', + 'IDE | Global Digital One-Stop Cross-Border Logistics': 'IDE | 全球数字化一站式跨境物流服务商', + 'IDE|Immediate Delivery Express — Cross-Border Logistics': 'IDE | 全球数字化一站式跨境物流服务商', 'Faster & Simpler': '更快 · 更简单', '|Faster & Simpler': '更快 · 更简单', 'IDE - About': 'IDE - 关于我们', diff --git a/IDE官网/index.html b/IDE官网/index.html index fdc5cf5..5d80eb9 100644 --- a/IDE官网/index.html +++ b/IDE官网/index.html @@ -5,12 +5,12 @@ - IDE|Immediate Delivery Express — 跨境物流 + IDE | 全球数字化一站式跨境物流服务商 - - + + diff --git a/generate-menu-excel.js b/generate-menu-excel.js index ecbca4d..1e97c56 100644 --- a/generate-menu-excel.js +++ b/generate-menu-excel.js @@ -370,6 +370,17 @@ const menuData = [ hideInMenu: false, parentRoute: '/order', }, + { + level: 2, + name: '9610订单', + permissionCode: 'Order.Customs9610', + route: '/order/customs9610Order', + component: 'views/order/customs9610Order/index', + icon: null, + order: 5, + hideInMenu: false, + parentRoute: '/order', + }, // 一级菜单 - 渠道 { diff --git a/nginx-default.conf b/nginx-default.conf index 36b250b..7814ccf 100644 --- a/nginx-default.conf +++ b/nginx-default.conf @@ -73,6 +73,20 @@ server { access_log off; } + location = /favicon.ico { + try_files /favicon.png =404; + expires 7d; + add_header Cache-Control "public"; + access_log off; + } + + location = /favicon.png { + try_files /favicon.png =404; + expires 7d; + add_header Cache-Control "public"; + access_log off; + } + # ============ 客户 / 管理端登录入口 ============ location = /login { try_files /index.html =200; @@ -166,6 +180,9 @@ server { location ^~ /order/pickupOrder { try_files /index.html =200; } + location ^~ /order/customs9610Order { + try_files /index.html =200; + } location ^~ /order/batchJobs { try_files /index.html =200; } diff --git a/nginx-docker.conf b/nginx-docker.conf index 5ea76fb..075a684 100644 --- a/nginx-docker.conf +++ b/nginx-docker.conf @@ -39,6 +39,20 @@ server { access_log off; } + location = /favicon.ico { + try_files /favicon.png =404; + expires 7d; + add_header Cache-Control "public"; + access_log off; + } + + location = /favicon.png { + try_files /favicon.png =404; + expires 7d; + add_header Cache-Control "public"; + access_log off; + } + location = /login { try_files /index.html =200; } @@ -85,6 +99,7 @@ server { location ^~ /order/fulfillOrders { try_files /index.html =200; } location ^~ /order/waybillManage { try_files /index.html =200; } location ^~ /order/pickupOrder { try_files /index.html =200; } + location ^~ /order/customs9610Order { try_files /index.html =200; } location ^~ /order/batchJobs { try_files /index.html =200; } location ^~ /order/templateMapping { try_files /index.html =200; } location ^~ /order/platformStore { try_files /index.html =200; } diff --git a/package.json b/package.json index 0a9dcae..2026724 100644 --- a/package.json +++ b/package.json @@ -43,6 +43,7 @@ "@codemirror/state": "^6.5.4", "@codemirror/theme-one-dark": "^6.1.3", "@codemirror/view": "^6.39.17", + "@fontsource/zcool-qingke-huangyou": "^5.3.0", "@handsontable/vue3": "^16.2.0", "@types/lodash-es": "^4.17.12", "@vueuse/core": "^9.3.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 52db08d..cb50e42 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -32,6 +32,9 @@ importers: '@codemirror/view': specifier: ^6.39.17 version: 6.39.17 + '@fontsource/zcool-qingke-huangyou': + specifier: ^5.3.0 + version: 5.3.0 '@handsontable/vue3': specifier: ^16.2.0 version: 16.2.0(handsontable@16.2.0)(vue@3.5.18(typescript@4.9.5)) @@ -922,6 +925,9 @@ packages: '@floating-ui/utils@0.2.10': resolution: {integrity: sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==} + '@fontsource/zcool-qingke-huangyou@5.3.0': + resolution: {integrity: sha512-6/ld8x/knq1NjDQxLSyg9pDnBPOmtWDb30ZTFk+n8OxfkBoUvPAxh3aV/6+UFGmA5CekJfcgpUwd2/x/weLvSQ==} + '@handsontable/pikaday@1.0.0': resolution: {integrity: sha512-1VN6N38t5/DcjJ7y7XUYrDx1LuzvvzlrFdBdMG90Qo1xc8+LXHqbWbsTEm5Ec5gXTEbDEO53vUT35R+2COmOyg==} @@ -7893,6 +7899,8 @@ snapshots: '@floating-ui/utils@0.2.10': {} + '@fontsource/zcool-qingke-huangyou@5.3.0': {} + '@handsontable/pikaday@1.0.0': {} '@handsontable/vue3@16.2.0(handsontable@16.2.0)(vue@3.5.18(typescript@4.9.5))': diff --git a/scripts/postbuild-cleanup-dist.js b/scripts/postbuild-cleanup-dist.js index de2f8d0..bbff6fc 100644 --- a/scripts/postbuild-cleanup-dist.js +++ b/scripts/postbuild-cleanup-dist.js @@ -74,6 +74,12 @@ function copyOfficialSite() { fs.copyFileSync(src9610, path.join(dist, '9610.html')); } + const faviconSrc = path.join(siteDir, 'assets', 'img', 'logo1.png'); + if (fs.existsSync(faviconSrc)) { + fs.copyFileSync(faviconSrc, path.join(siteDir, 'assets', 'img', 'favicon.png')); + fs.copyFileSync(faviconSrc, path.join(dist, 'favicon.png')); + } + console.log('[postbuild] copied official site to dist/site (assets under /site/assets)'); } diff --git a/src/api/order/customs9610.ts b/src/api/order/customs9610.ts new file mode 100644 index 0000000..ead6e52 --- /dev/null +++ b/src/api/order/customs9610.ts @@ -0,0 +1,37 @@ +import { axiosInstance } from '@/api/rbac' +import { assertBusinessOk, omsUrl, parseListPayload, unwrapData } from '@/api/oms/common' + +function postOk(path: string, body: Record) { + return axiosInstance.post(omsUrl(path), body).then((res) => { + assertBusinessOk(res.data) + return unwrapData(res.data) + }) +} + +function getData(path: string, params?: Record) { + return axiosInstance.get(omsUrl(path), { params }).then((res) => unwrapData(res.data)) +} + +export const getCustoms9610List = (body: Record) => + axiosInstance.post(omsUrl('/order/customs-9610/list'), body).then((res) => parseListPayload(res.data)) + +export const getCustoms9610StatusCounts = (params?: { customerId?: number }) => + getData('/order/customs-9610/status-counts', params as Record | undefined) + +export const getCustoms9610Detail = (id: number | string) => + getData('/order/customs-9610/detail', { id }) + +export const updateCustoms9610 = (body: Record) => + postOk('/order/customs-9610/update', body) + +export const declareCustoms9610 = (id: number | string) => + postOk('/order/customs-9610/declare', { id }) + +export const declareCustoms9610Batch = (ids: Array) => + postOk('/order/customs-9610/declare-batch', { ids }) + +export const fetchCustoms9610ManifestBatch = (ids: Array) => + postOk('/order/customs-9610/fetch-manifest-batch', { ids }) + +export const fetchCustoms9610DeclarationFormBatch = (ids: Array) => + postOk('/order/customs-9610/fetch-declaration-form-batch', { ids }) diff --git a/src/api/order/pickupOrder.ts b/src/api/order/pickupOrder.ts index 6272f01..ca84ef9 100644 --- a/src/api/order/pickupOrder.ts +++ b/src/api/order/pickupOrder.ts @@ -30,6 +30,9 @@ export const createPickupOrderV2 = (body: PickupOrderCreateBody) => export const getPickupOrderList = (body: Record) => axiosInstance.post(omsUrl('/order/pickup-order/list'), body).then((res) => parseListPayload(res.data)) +export const getPickupOrderStatusCounts = (params?: { customerId?: number }) => + getData('/order/pickup-order/status-counts', params as Record | undefined) + export const getPickupOrderDetail = (id: number | string) => getData('/order/pickup-order/detail', { id }) diff --git a/src/components/RbacSplit/RbacDetailShell.vue b/src/components/RbacSplit/RbacDetailShell.vue index 9cf33dc..0757566 100644 --- a/src/components/RbacSplit/RbacDetailShell.vue +++ b/src/components/RbacSplit/RbacDetailShell.vue @@ -12,33 +12,38 @@ @@ -1011,21 +1760,36 @@ onMounted(async () => { } } -.page-hint { - display: flex; +.status-tab-title { + display: inline-flex; align-items: center; - gap: 6px; - color: var(--color-text-3); - font-size: 13px; - line-height: 1.5; + gap: 4px; + + .tab-count { + font-style: normal; + font-size: 12px; + color: var(--color-text-3); + font-weight: 400; + } +} + +.page-hint { + display: inline-flex; + align-items: center; + justify-content: center; + width: 28px; + height: 28px; + border-radius: 4px; + color: var(--app-primary-color); + cursor: help; flex-shrink: 0; - max-width: 360px; - text-align: right; :deep(svg) { - color: var(--app-primary-color); - font-size: 14px; - flex-shrink: 0; + font-size: 16px; + } + + &:hover { + background: var(--color-fill-2); } } @@ -1061,10 +1825,15 @@ onMounted(async () => { justify-content: space-between; gap: 16px; margin-bottom: 16px; - padding-bottom: 12px; + padding-bottom: 14px; border-bottom: 1px solid var(--color-border-2); } +.pk-detail-header__main { + min-width: 0; + flex: 1; +} + .pk-detail-title { display: flex; align-items: center; @@ -1078,9 +1847,19 @@ onMounted(async () => { color: var(--color-text-1); } +.pk-detail-sub { + margin-top: 6px; + font-size: 12px; + color: var(--color-text-3); + line-height: 1.4; +} + .pk-detail-amount { text-align: right; flex-shrink: 0; + padding: 8px 12px; + border-radius: 4px; + background: color-mix(in srgb, var(--app-primary-color) 8%, #fff); span { display: block; @@ -1089,28 +1868,85 @@ onMounted(async () => { } b { - font-size: 18px; + font-size: 20px; font-weight: 600; color: var(--app-primary-color); + line-height: 1.3; + } +} + +.pk-detail-section { + margin-bottom: 16px; + + &:last-child { + margin-bottom: 0; + } +} + +.pk-detail-section__title { + display: flex; + align-items: center; + gap: 8px; + margin-bottom: 10px; + font-size: 14px; + font-weight: 500; + color: var(--color-text-1); + + em { + font-style: normal; + min-width: 18px; + height: 18px; + padding: 0 6px; + border-radius: 9px; + background: var(--color-fill-2); + color: var(--color-text-3); + font-size: 12px; + line-height: 18px; + text-align: center; + } +} + +.pk-copy-btn { + margin-left: auto; + height: 24px; + color: var(--app-primary-color); +} + +.pk-link { + color: var(--app-primary-color); + text-decoration: none; + + &:hover { + text-decoration: underline; } } .pk-detail-grid { display: grid; grid-template-columns: 1fr 1fr; - gap: 10px 16px; - margin-bottom: 16px; + gap: 12px 16px; + padding: 12px; + border-radius: 4px; + background: var(--color-fill-1); +} + +.pk-detail-field { + min-width: 0; span { display: block; + margin-bottom: 4px; font-size: 12px; color: var(--color-text-3); } b { + display: block; font-size: 14px; - font-weight: 600; + font-weight: 500; color: var(--color-text-1); + line-height: 1.4; + word-break: break-all; } } @@ -1118,19 +1954,109 @@ onMounted(async () => { grid-column: 1 / -1; } -.pk-detail-actions { - display: flex; - flex-wrap: wrap; - gap: 8px; - margin-bottom: 16px; - padding: 12px; - background: var(--color-fill-2); - border-radius: 4px; +.pk-timeline { + padding: 4px 0 4px 4px; } -.pk-detail-orders-title { - font-weight: 600; +.pk-timeline__item { + display: flex; + gap: 12px; + position: relative; + padding-bottom: 14px; + + &:last-child { + padding-bottom: 0; + + .pk-timeline__dot::after { + display: none; + } + } +} + +.pk-timeline__dot { + position: relative; + flex-shrink: 0; + width: 10px; + height: 10px; + margin-top: 4px; + border-radius: 50%; + background: var(--app-primary-color); + + &::after { + content: ''; + position: absolute; + left: 4px; + top: 12px; + width: 2px; + bottom: -14px; + background: var(--color-border-2); + } +} + +.pk-timeline__body { + min-width: 0; +} + +.pk-timeline__label { + font-size: 13px; + color: var(--color-text-1); + font-weight: 500; +} + +.pk-timeline__time { + margin-top: 2px; + font-size: 12px; + color: var(--color-text-3); +} + +.pk-detail-footer { + display: flex; + align-items: center; + justify-content: space-between; + gap: 12px; + width: 100%; +} + +.pk-detail-footer__left, +.pk-detail-footer__right { + display: flex; + flex-wrap: wrap; + align-items: center; + gap: 8px; +} + +.pk-detail-footer__right { + margin-left: auto; + justify-content: flex-end; +} + +.pk-rebind-modal { + padding-top: 4px; +} + +.pk-rebind-section__title { margin-bottom: 8px; + font-size: 14px; + font-weight: 500; + color: var(--color-text-1); +} + +.pk-rebind-hint { + margin: 0 0 10px; + font-size: 12px; + color: var(--color-text-3); + line-height: 1.5; +} + +.pk-rebind-remove { + width: 100%; + max-height: 140px; + overflow: auto; + padding: 4px 0; +} + +.pk-rebind-divider { + margin: 16px 0; } .pk-rebind-empty { diff --git a/src/views/system/dataPerm/audit/index.vue b/src/views/system/dataPerm/audit/index.vue index c051056..7681171 100644 --- a/src/views/system/dataPerm/audit/index.vue +++ b/src/views/system/dataPerm/audit/index.vue @@ -79,10 +79,12 @@