From 233d47483de2ffd1fe897afda83068ceb50042fe Mon Sep 17 00:00:00 2001 From: cysamurai Date: Wed, 16 Sep 2026 17:06:07 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8D=87=E7=BA=A7=E5=AF=BC=E7=A8=8EPAD?= =?UTF-8?q?=E8=87=B31.2.1=EF=BC=9A=E9=A2=84=E6=A3=80=E5=8F=96=E5=8F=B7?= =?UTF-8?q?=E4=BD=93=E6=A3=80=E3=80=81=E5=B7=A5=E4=BD=9C=E5=8F=B0=E6=94=B9?= =?UTF-8?q?=E7=89=88=E4=B8=8E=E4=BC=9A=E8=AF=9D=E7=BB=AD=E6=9C=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Cursor --- tax-guidance/App.vue | 44 +- tax-guidance/api/company.js | 61 + tax-guidance/api/print.js | 7 +- tax-guidance/api/smz.js | 53 + tax-guidance/api/ticket.js | 5 +- .../QueueTicketDetail/QueueTicketDetail.vue | 8 +- .../TakeTicketPopup/TakeTicketPopup.vue | 494 +-- .../TaxHealthReport/TaxHealthReport.vue | 4 +- tax-guidance/components/TopDivBar.vue | 2 +- tax-guidance/components/header.vue | 31 +- .../ZIYUN_PAD(HES)接口清单与CURL验证.md | 0 tax-guidance/docs/company-api-test.zip | Bin 0 -> 29759 bytes tax-guidance/docs/company-api-test/index.html | 2722 +++++++++++++++++ tax-guidance/docs/company-api-test/proxy.js | 121 + .../docs/company-api-test/test_page.js | 103 + .../docs/company-api-test/verify_aes.js | 159 + .../docs/company-api-test/verify_md5.js | 67 + .../{ => docs}/pad-gateway-api-params(2).md | 0 tax-guidance/{ => docs}/产品介绍.md | 0 .../docs/实名制采集保存-Java改写说明.md | 263 ++ .../智能导税PAD-功能需求说明书(优化稿).md | 226 ++ .../{ => docs}/测试用例-紫云智能导税.xlsx | Bin ...检取号-一键体检与智能提醒-数据需求分析.md | 259 ++ .../预检取号-一键体检与智能提醒-预览.html | 365 +++ tax-guidance/manifest.json | 4 +- tax-guidance/pages.json | 17 + tax-guidance/pages/index/index.vue | 677 ++-- tax-guidance/pages/login/login.vue | 184 +- tax-guidance/pages/mod/appLog.vue | 136 + tax-guidance/pages/mod/duty-todos.vue | 271 ++ tax-guidance/pages/mod/guidance.vue | 4 +- tax-guidance/pages/mod/hallInfo.vue | 102 +- tax-guidance/pages/mod/hallManagment.vue | 6 +- tax-guidance/pages/mod/manager.vue | 6 +- tax-guidance/pages/mod/multiInOne.vue | 4 +- tax-guidance/pages/mod/pushMessage.vue | 136 +- tax-guidance/pages/mod/sign-priority.vue | 198 +- tax-guidance/pages/queue/business-select.vue | 6 +- tax-guidance/pages/queue/index.vue | 1472 ++++++--- tax-guidance/pages/table/appointment.vue | 8 +- tax-guidance/pages/table/dailyEntry.vue | 8 +- tax-guidance/pages/table/ticket.vue | 470 ++- tax-guidance/scripts/generate-testcases.mjs | 162 - tax-guidance/utils/aesEcb.js | 119 + tax-guidance/utils/appLog.js | 148 + tax-guidance/utils/appVersion.js | 10 + tax-guidance/utils/dutyTodos.js | 31 + tax-guidance/utils/healthCheck.js | 143 + tax-guidance/utils/printTemplate.js | 1 - tax-guidance/utils/request.js | 706 ++++- 50 files changed, 8633 insertions(+), 1390 deletions(-) create mode 100644 tax-guidance/api/company.js create mode 100644 tax-guidance/api/smz.js rename tax-guidance/{ => docs}/ZIYUN_PAD(HES)接口清单与CURL验证.md (100%) create mode 100644 tax-guidance/docs/company-api-test.zip create mode 100644 tax-guidance/docs/company-api-test/index.html create mode 100644 tax-guidance/docs/company-api-test/proxy.js create mode 100644 tax-guidance/docs/company-api-test/test_page.js create mode 100644 tax-guidance/docs/company-api-test/verify_aes.js create mode 100644 tax-guidance/docs/company-api-test/verify_md5.js rename tax-guidance/{ => docs}/pad-gateway-api-params(2).md (100%) rename tax-guidance/{ => docs}/产品介绍.md (100%) create mode 100644 tax-guidance/docs/实名制采集保存-Java改写说明.md create mode 100644 tax-guidance/docs/智能导税PAD-功能需求说明书(优化稿).md rename tax-guidance/{ => docs}/测试用例-紫云智能导税.xlsx (100%) create mode 100644 tax-guidance/docs/预检取号-一键体检与智能提醒-数据需求分析.md create mode 100644 tax-guidance/docs/预检取号-一键体检与智能提醒-预览.html create mode 100644 tax-guidance/pages/mod/appLog.vue create mode 100644 tax-guidance/pages/mod/duty-todos.vue delete mode 100644 tax-guidance/scripts/generate-testcases.mjs create mode 100644 tax-guidance/utils/aesEcb.js create mode 100644 tax-guidance/utils/appLog.js create mode 100644 tax-guidance/utils/appVersion.js create mode 100644 tax-guidance/utils/dutyTodos.js create mode 100644 tax-guidance/utils/healthCheck.js diff --git a/tax-guidance/App.vue b/tax-guidance/App.vue index a814140..7de6f6c 100644 --- a/tax-guidance/App.vue +++ b/tax-guidance/App.vue @@ -1,26 +1,60 @@ \ No newline at end of file + diff --git a/tax-guidance/api/company.js b/tax-guidance/api/company.js new file mode 100644 index 0000000..75fe620 --- /dev/null +++ b/tax-guidance/api/company.js @@ -0,0 +1,61 @@ +const COMPANY_BASE = 'https://api-dsb.dingtax.cn/dsb/tax-appoint/api/dx/third' + +const isCompanyOk = (body) => { + if (!body || typeof body !== 'object') return false + if (body.respCode !== undefined && Number(body.respCode) !== 0) return false + const code = body.code + if (code === undefined || code === null || code === '') return true + return code === 0 || code === '0' || code === 200 || code === '200' +} + +const companyPost = (path, payload) => { + const token = uni.getStorageSync('token') || '' + const header = { + 'Content-Type': 'application/json', + } + if (token) { + header.token = token + header.Authorization = `Bearer ${token}` + } + return new Promise((resolve, reject) => { + uni.request({ + url: `${COMPANY_BASE}${path}`, + method: 'POST', + data: payload, + header, + timeout: 20000, + success: (res) => { + let body = res.data + if (typeof body === 'string') { + try { + body = JSON.parse(body) + } catch (error) { + reject(error) + return + } + } + if (Number(res.statusCode) !== 200 || !isCompanyOk(body)) { + reject(body || res) + return + } + resolve(body) + }, + fail: (err) => reject(err), + }) + }) +} + +export const searchCompanyPage = (params = {}) => { + return companyPost('/company/info/page', { + zjhm: params.zjhm, + pageNum: params.pageNum || 1, + pageSize: params.pageSize || 50, + }) +} + +export const getCompanyRisk = (params = {}) => { + return companyPost('/company/risk/info', { + zjhm: params.zjhm, + djxh: params.djxh, + }) +} diff --git a/tax-guidance/api/print.js b/tax-guidance/api/print.js index d8cf5ad..e3ed8b8 100644 --- a/tax-guidance/api/print.js +++ b/tax-guidance/api/print.js @@ -20,13 +20,12 @@ export const printTicket = (params = {}) => { }) } -// 保存打印小票模板(POST + body,签名参数与其他 POST 接口一致) +// 保存打印小票模板 export const savePrintTemplate = (params = {}) => { - const body = JSON.parse(JSON.stringify(params)) return request({ tag: 'pad.print', path: '/template', - method: 'POST', - body + method: 'PUT', + body: params }) } diff --git a/tax-guidance/api/smz.js b/tax-guidance/api/smz.js new file mode 100644 index 0000000..d664f97 --- /dev/null +++ b/tax-guidance/api/smz.js @@ -0,0 +1,53 @@ +import request from '@/utils/request.js' +import { appLog, flushLogs } from '@/utils/appLog.js' + +const maskPhoneForLog = (phone) => { + const text = String(phone || '').trim() + if (!text) return '' + if (text.length < 7) return `${text.slice(0, 1)}***` + return `${text.slice(0, 3)}****${text.slice(-4)}` +} + +// 实名制采集保存(pad.ticket -> POST /save-cjxx) +export const saveSmzcjxx = (params = {}) => { + const body = { + rxsfzBdxh: params.rxsfzBdxh, + sjhm: params.sjhm, + } + if (params.dzyx) body.dzyx = params.dzyx + if (params.lxdh) body.lxdh = params.lxdh + + appLog( + 'info', + '[smz] saveSmzcjxx 请求', + `rxsfzBdxh=${body.rxsfzBdxh || ''}`, + `sjhm=${maskPhoneForLog(body.sjhm)}`, + `hasDzyx=${Boolean(body.dzyx)}`, + `hasLxdh=${Boolean(body.lxdh)}` + ) + flushLogs() + + return request({ + tag: 'pad.ticket', + path: '/save-cjxx', + method: 'POST', + body + }) + .then((result) => { + appLog( + 'info', + '[smz] saveSmzcjxx 返回', + `success=${result?.success}`, + `code=${result?.code}`, + `mess=${result?.mess || result?.msg || ''}`, + result + ) + flushLogs() + return result + }) + .catch((error) => { + appLog('error', '[smz] saveSmzcjxx 请求失败', error) + flushLogs() + throw error + }) +} diff --git a/tax-guidance/api/ticket.js b/tax-guidance/api/ticket.js index 051c6f7..d8ecd3a 100644 --- a/tax-guidance/api/ticket.js +++ b/tax-guidance/api/ticket.js @@ -11,12 +11,13 @@ export const takeTicket = (params = {}) => { } // 实名核验记录查询 -export const searchTicketVerify = (params = {}) => { +export const searchTicketVerify = (params = {}, requestOptions = {}) => { return request({ tag: 'pad.ticket', path: '/verify/search', method: 'POST', - body: params + body: params, + ...requestOptions }) } diff --git a/tax-guidance/components/QueueTicketDetail/QueueTicketDetail.vue b/tax-guidance/components/QueueTicketDetail/QueueTicketDetail.vue index deb0ff4..8ca87e1 100644 --- a/tax-guidance/components/QueueTicketDetail/QueueTicketDetail.vue +++ b/tax-guidance/components/QueueTicketDetail/QueueTicketDetail.vue @@ -220,7 +220,7 @@ const handleClose = () => { background: white; border-radius: 20rpx; width: 100%; - max-height: 75vh; + max-height: calc(75 * var(--pad-vh)); display: flex; flex-direction: column; box-shadow: 0 20rpx 60rpx rgba(0, 0, 0, 0.25); @@ -271,7 +271,7 @@ const handleClose = () => { .ticket-modal-body { flex: 1; padding: 0 24rpx 24rpx; - max-height: calc(75vh - 120rpx); + max-height: calc(75 * var(--pad-vh) - 120rpx); } /* 信息卡片 */ @@ -514,11 +514,11 @@ const handleClose = () => { } .ticket-modal-content { - max-height: 80vh; + max-height: calc(80 * var(--pad-vh)); } .ticket-modal-body { - max-height: calc(80vh - 120rpx); + max-height: calc(80 * var(--pad-vh) - 120rpx); } .info-row { diff --git a/tax-guidance/components/TakeTicketPopup/TakeTicketPopup.vue b/tax-guidance/components/TakeTicketPopup/TakeTicketPopup.vue index f93bd67..922b874 100644 --- a/tax-guidance/components/TakeTicketPopup/TakeTicketPopup.vue +++ b/tax-guidance/components/TakeTicketPopup/TakeTicketPopup.vue @@ -1,49 +1,81 @@