diff --git a/.workbuddy/memory/2026-10-14.md b/.workbuddy/memory/2026-10-14.md index 2cde316..61827c9 100644 --- a/.workbuddy/memory/2026-10-14.md +++ b/.workbuddy/memory/2026-10-14.md @@ -124,3 +124,19 @@ 另:自定义组件接模板字符串时,切出的模板里 `row.content` 要替换成 `content`(插槽作用域不存在于独立组件里),否则报 `Cannot read properties of undefined (reading 'content')`。 - 校验:编译三个 .vue 的 template + scss 全过;临时验证页 `__route-change-verify.html` 与 8899 端口静态服务已删除/停止。 - 未处理(等用户确认):备注列的 `show-overflow-tooltip` 保持原样(属全站约定),用户若要求连备注一起去掉再单独改。 + +## 16:45 付款申请表单「结算单号」字段交互歧义修复(方案 A) +- 现象(用户截图圈出):`/payment/payment-application/form` 结算单号是 `el-select multiple`,placeholder 写「请输入」但**打不进去字**,必须先猜到要点右边「选择」才有效。 +- 根因(双重的): + 1. 该 `el-select` 的 `:model-value` 绑只读 computed `referenceSettlementNos`(= 已选单号本身),**options 就是它自己** → 点开下拉、点选项,值不变;代码里 `handleSettlementSelectVisible` 甚至主动 blur 掉下拉。真正改值的只有右侧「选择」按钮。 + 2. placeholder 写「请输入」但控件不可输入(未开 `filterable`),且 `.el-tag__close{display:none}` 藏了删除叉 → 视觉上更像输入框。全站规矩是「请输入/请选择」二选一,这里是选择语义。 +- 落地(只改 `views/payment/payment-application-form.vue`,全站 `openReference`/`referenceSettlementNos` 无第二处引用): + - 模板:`el-select` → `el-input readonly` + 外层 `el-tooltip`,`:model-value="referenceDisplayText"`,`placeholder="请输入"`,`:disabled="readonly"`,**`@click="!readonly && openReference()"` 让整框可点开弹窗**;右侧「选择」按钮保留。 + - 新增 computed:`referenceSettlementCount`、`referenceDisplayText`(单张显示单号;**多张只显示 `已选 N 张结算单`**,完整单号靠 tooltip,明细看下方「结算信息」表)。 + - 删除 `handleSettlementSelectVisible` 方法与 `settlementNoSelectRef`;样式 `.payment-form-page__settlement-select{,:deep(...)}` → `.payment-form-page__settlement-input`(+ `cursor:pointer` / disabled 时 `not-allowed`)。 +- ⚠️ 踩坑:第一版把「共 N 张」做成 `el-input` 的 `#suffix` 插槽 → span=6 的窄列里后缀挤占宽度,单号被截成 `JS202610`,比不改还差。**窄列(≤span6)不要在输入框内塞后缀/前缀,把信息编进 `:model-value` 文本本身**。 +- 验证(项目根临时 html + `vue/dist/vue.esm-bundler.js`,用完即删): + - ⚠️ 临时页必须 import `vue/dist/vue.esm-bundler.js`,默认 `vue` 是 runtime-only,字符串 template 报 “runtime compilation is not supported”。 + - 4 态实测:空值 placeholder 正确 / 单张显单号 / 多张显「已选 3 张结算单」且不截断 / 查看态 disabled 且按钮隐藏;输入框宽 132px、行高 32px。 + - 点击探针验证:可编辑态点 `.el-input` 命中 1 次(el-tooltip 不拦截 click),查看态命中 0 次 ✓。 + diff --git a/.workbuddy/memory/2026-10-15.md b/.workbuddy/memory/2026-10-15.md new file mode 100644 index 0000000..fcab706 --- /dev/null +++ b/.workbuddy/memory/2026-10-15.md @@ -0,0 +1,7 @@ +# 2026-10-15 + +## 10:46 付款申请表单「结算单号」修复丢失 → 重放并提交 +- 现象:用户反馈昨天改好的「结算单号」(只读输入框 + 整框可点开选择弹窗)今天又变回旧的 `el-select` 写法。 +- 根因:昨天的改动**一直没有 commit**,是纯工作区改动;用户 pull(HEAD 到 9919fb9,两个 settlement 样式提交包含该文件旧版)后被覆盖。教训同 2026-09-18「漏提交新文件」一役:**本仓库改动必须尽快显式 commit**,`git status` 干净 ≠ 改动还在。 +- 处理:按昨天方案 A 原样重放 4 处修改(模板 el-select→el-input readonly+tooltip+整框可点、新增 `referenceSettlementCount`/`referenceDisplayText` computed、删 `handleSettlementSelectVisible`、样式类改名 `__settlement-input` + cursor 规则),curl 自检 vue/style 均 200。 +- **这次只提交该单文件**:`git commit -m ":bug: ..." -- src/views/payment/payment-application-form.vue` → `db03ced`(`.workbuddy/memory` 不入库,留在工作区)。尚未 push,等用户确认。 diff --git a/.workbuddy/memory/2026-10-20.md b/.workbuddy/memory/2026-10-20.md new file mode 100644 index 0000000..cd8d847 --- /dev/null +++ b/.workbuddy/memory/2026-10-20.md @@ -0,0 +1,31 @@ +# 2026-10-20 + +## settlement-import 列表页工具栏对齐 receipt-settlement + +- `src/views/settlement/settlement-import.vue`: + - 左侧只保留「新增」(`type="primary"`),删掉原来的 `plain` 文字「刷新」按钮(刷新统一收进右侧图标组,与 receipt-settlement / settlement-adjustment 一致)。 + - 右侧接入 ``(`./components/settlement-table-tools.vue`,即 `table-header-tools` 包装):刷新 / 列设置 / 搜索显隐 / 表格尺寸 4 键,`@refresh="refreshTable"`。 + - 表格列改为配置化,新增 `src/option/settlement/settlementImportTable.js`(`settlementImportTableColumns`),页面加 `tableColumns / visibleColumnKeys / tableSize / columnSettingOptions / visibleTableColumns`,`el-table` 加 `:size="tableSize"`。 + - 列渲染标志:`link / status / enum / billType / count`(注意**不能用 `type` 作 key**,`type` 是 el-table-column 真实 prop,会把列变成 selection/index 列)。 + - 新增 `displayValue()`;`settlementBillTypeLabel('')` 返回 `-`。 + - 序号列改 `fixed="left"`;数据列与操作列统一 `align: 'center'`,操作链接 `justify-content: center`。 +- 校验方式(无 dev server 时):项目根目录临时 `sfc-check.mjs` 用 `vue/compiler-sfc` 的 `parse + compileTemplate + compileScript`;SCSS 用 `sass.compileString`。用完即删。 + +## 追加:用户要求「列显隐 + 显示方式」→ 两个页面改 avue-crud + +用户反馈上面那版不对:右侧工具按钮必须是 **avue-crud 原生**的 4 键,第 2 键是「列显隐」抽屉(不是「列设置」勾选弹窗),第 4 键是「显示方式」(表格↔卡片),不是表格尺寸循环。确认后范围:`settlement-import` + `formal-settlement`(receipt/payment 共用)都改 avue-crud。 + +- 关键结论:**「列显隐 + 显示方式」只有 avue-crud 原生才有**,avue 的 `dialog-column` 依赖 `inject: ['crud']`,脱离 avue-crud 拿不出来;`table-header-tools` 只是仿制件,做不到。所以目标页只能整页改 avue-crud。 +- avue 右侧按钮源码:`node_modules/@smallwei/avue/lib/packages/element-plus/crud/menu/header-menu3.js`(refreshBtn/columnBtn/searchBtn/gridBtn,`gridBtn` → `handleGridShow()` 切 `gridShow` 表格↔卡片);图标默认配置在同目录 `config.js`。 +- 新增 `src/option/settlement/settlementImport.js`(`settlementImportOption`)、`src/option/settlement/formalSettlement.js`(`formalSettlementOption`,表格列复用 `formalSettlementTable.js` 的 `formalSettlementTableColumns` + `COLUMN_EXTRA` 增量配置,避免两处维护)。 +- `settlement-import.vue` 整页改 avue-crud(删除手写的搜索区/表格/分页);`formal-settlement-table-panel.vue` 由 el-table 改成包一层 ``,父页面保留数据加载与全部业务动作。 +- ⚠️ **avue 的搜索自定义控件要用 `column.renderSearch`(`h()` 渲染),不能用 `searchslot`** —— avue 3.9.2 根本不读 `searchslot`(全库无此字段),而 `searchslot: true` 还会被 `header-search2.js` 的 `searchXxx → xxx` 映射成 `slot: true`。真正的搜索插槽是 avue-crud 上 `${prop}-search`(`crud.searchSlot`,见 `index2.js` `getSlotList(["-search"])`),但其作用域**没有 `row`**(只有 value/column/label/size/readonly/disabled/dic),`mileage-record.vue` 用 `{ row }` 是错的。已用于批次号下拉(filterable + allowCreate)。 +- avue `formatter` 签名确认:`detail.js` → `column.formatter(row, row[column.prop], result, column)`。 +- `on-load` 由 `table-page2.js` 在 created / 翻页 / 改页容量时触发,参数是内部 `defaultPage`(已 `Object.assign` 合并外部 page)。 +- 分页透传写法(父持 page、子包 avue-crud):子组件用 computed `crudPage{get/set}`,setter 里 `Object.assign(this.page, value)` 原地回写,避免 prop 直接赋值告警。 +- ⚠️ `src/option/settlement/formalSettlementTable.js` **不能删** —— `formal-settlement-editor.vue` 还从它导入 `candidateColumns/candidateDetailColumns/detailColumns/sourceColumns/summaryColumns`(我一度删掉,Vite 转换报错后从 HEAD 恢复)。 +- 校验方式升级:沙箱里 curl 不通 dev server(502),改用 `vite.createServer({ middlewareMode:true })` + `server.transformRequest(path)` 就地转换,能同时暴露依赖解析失败(如上面误删文件)。脚本用完即删。 + +## 遗留未改(仍用 table-header-tools 仿制件) + +pre-settlement、settlement-adjustment、receivable-payable-detail、transport-reconciliation-table-panel、business/{master-order,loading-manage,voucher-manage}、payment/* 手写页。若用户要全站一致,需逐页改 avue-crud。 diff --git a/.workbuddy/memory/MEMORY.md b/.workbuddy/memory/MEMORY.md index ef1ee3f..647e2d9 100644 --- a/.workbuddy/memory/MEMORY.md +++ b/.workbuddy/memory/MEMORY.md @@ -66,9 +66,21 @@ ## 表单 / 自检 / 导出 - placeholder 只写 `请输入`/`请选择`;例外:`请输入或选择车辆`、日期区间 `起`/`止`、示例值。校验 message 须带字段名。 - `business-crud-page.vue`:option 经 `cloneOption` 克隆,独立表单页走 `PageAvueForm`。 -- 自检:`curl "localhost:2889/src/xxx.vue"` 与 `"...?vue&type=style&index=0&scoped=true&lang.scss"`(200 / 500)。`vite build` 在 `facelogin.vue` 被沙箱中断,不能作唯一校验。dev `VITE_APP_API=/api` 代理 `172.16.203.228:8000`。 +- 自检:`curl "localhost:2888/src/xxx.vue"` 与 `"...?vue&type=style&index=0&scoped=true&lang.scss"`(200 / 500)。`vite build` 在 `facelogin.vue` 被沙箱中断,不能作唯一校验。dev `VITE_APP_API=/api` 代理 `172.16.203.228:8000`。 - 导出:前端 `exportColumns` 后端未用,以 `XxxExportExcel.java` 为准;BladeX `BeanUtil` 类型不兼容静默跳过(`Date` → `LocalDateTime` 丢值,用 `DateUtil.fromDate`)。 +## avue-crud 才是「右侧 4 键」的唯一来源(2026-10-20 定论) +用户要的右侧工具栏是 **avue-crud 原生**:刷新 / **列显隐**(el-drawer,含 隐藏/冻结/过滤/排序 + 行拖拽)/ 搜索显隐 / **显示方式**(表格↔卡片)。 +- 源码:`node_modules/@smallwei/avue/lib/packages/element-plus/crud/menu/header-menu3.js`(refreshBtn/columnBtn/searchBtn/gridBtn),`gridBtn` → `handleGridShow()` 切 `gridShow`;图标默认在同目录 `config.js`。「列显隐」文案来自 avue 语言包 `crud.showTitle`(项目 `src/lang/zh.js` 已覆盖)。 +- **列显隐抽屉依赖 `inject: ['crud']`,脱离 avue-crud 拿不出来**;`components/table-header-tools` 的「列设置勾选弹窗 + 表格尺寸循环」是仿制件,**做不到这两点**。所以「要和 avue 一致」= 整页改用 avue-crud,没有中间方案。 +- ⚠️ 搜索自定义控件用 `column.renderSearch = scope => h(...)`(`scope.row` 可用,同 `mixins/organization-search.js`)。**不要用 `searchslot`**:avue 3.9.2 全库无此字段,且 `header-search2.js` 的 `searchXxx → xxx` 映射会把 `searchslot` 变成 `slot: true`。 +- avue-crud 上的 `${prop}-search` 插槽确实存在(`index2.js` 的 `getSlotList(["-search"])`),但**作用域没有 `row`**(只有 value/column/label/size/readonly/disabled/dic)——`mileage-record.vue` 里 `{ row }` 是错的写法,别照抄。 +- `formatter` 签名:`detail.js` → `column.formatter(row, row[column.prop], result, column)`。 +- `on-load` 由 `table-page2.js` 在 created / 翻页 / 改页容量时触发,参数是内部 `defaultPage`(已合并外部 page)。分页若由父组件持有、子组件包一层 avue-crud,用 computed `crudPage{get/set}` + setter 里 `Object.assign(this.page, value)` 原地回写。 +- 已改:settlement-import.vue、formal-settlement.vue + components/formal-settlement-table-panel.vue(receipt/payment 共用)。未改:pre-settlement、settlement-adjustment、receivable-payable-detail、transport-reconciliation-table-panel、business 与 payment 的手写页。 +- ⚠️ `src/option/settlement/formalSettlementTable.js` 别删:`formal-settlement-editor.vue` 还依赖它的 candidate/detail/source/summary 列。 +- 沙箱里 curl 打不通本地 dev server(一律 502)。改用 `vite.createServer({middlewareMode:true})` + `server.transformRequest(path)` 就地转换校验,还能暴露依赖解析失败。 + ## Element Plus 图标两种用法的机制差异(易误判) `main.js` 里 `for (...ElementPlusIconsVue) app.component(key, component)` 全局注册了全部图标,因此模板里可以写标签形式 ``(靠全局注册解析)。 但 `:icon="OfficeBuilding"` 是**表达式**,编译成 `_ctx.OfficeBuilding`,只会从 data / props / computed / setup 返回值里取 —— **组件对象必须放进 `data()`**;放进 `components: {}` 注册里模板取不到,会静默渲染不出图标(不报错,只是空白)。 diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 864311c..697277b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -4,40 +4,43 @@ settings: autoInstallPeers: true excludeLinksFromLockfile: false +patchedDependencies: + '@smallwei/avue': 5ba15ad41b2c301250bf24adf39da2ed526b8375143da2c5a495361b29e862db + importers: .: dependencies: '@element-plus/icons-vue': specifier: ^2.3.1 - version: 2.3.2(vue@3.5.34) + version: 2.3.2(vue@3.5.34(typescript@7.0.2)) '@open-file-viewer/core': specifier: ^0.1.27 version: 0.1.27(pdfjs-dist@6.1.200) '@open-file-viewer/vue': specifier: ^0.1.27 - version: 0.1.27(@open-file-viewer/core@0.1.27(pdfjs-dist@6.1.200))(vue@3.5.34) + version: 0.1.27(@open-file-viewer/core@0.1.27(pdfjs-dist@6.1.200))(vue@3.5.34(typescript@7.0.2)) '@saber/nf-design-base-elp': specifier: ^1.3.0 version: 1.3.0 '@saber/nf-form-design-elp': specifier: ^1.6.1 - version: 1.6.1(vue@3.5.34) + version: 1.6.1(vue@3.5.34(typescript@7.0.2)) '@saber/nf-form-elp': specifier: ^1.6.3 version: 1.7.0 '@smallwei/avue': specifier: ~3.9.2 - version: 3.9.2(@element-plus/icons-vue@2.3.2(vue@3.5.34))(element-plus@2.14.2(vue@3.5.34))(vue@3.5.34) + version: 3.9.2(patch_hash=5ba15ad41b2c301250bf24adf39da2ed526b8375143da2c5a495361b29e862db)(@element-plus/icons-vue@2.3.2(vue@3.5.34(typescript@7.0.2)))(debug@4.4.3(supports-color@7.2.0))(element-plus@2.14.2(vue@3.5.34(typescript@7.0.2)))(vue@3.5.34(typescript@7.0.2)) animate.css: specifier: ^4.1.1 version: 4.1.1 avue-plugin-ueditor: specifier: ^1.0.4 - version: 1.0.4(axios@1.16.0)(vue@3.5.34) + version: 1.0.4(axios@1.16.0(debug@4.4.3(supports-color@7.2.0)))(vue@3.5.34(typescript@7.0.2)) axios: specifier: ^1.13.5 - version: 1.16.0 + version: 1.16.0(debug@4.4.3(supports-color@7.2.0)) codemirror: specifier: ^5.65.21 version: 5.65.21 @@ -55,7 +58,7 @@ importers: version: 6.1.0 element-plus: specifier: ^2.14.2 - version: 2.14.2(vue@3.5.34) + version: 2.14.2(vue@3.5.34(typescript@7.0.2)) exceljs: specifier: ^4.4.0 version: 4.4.0 @@ -82,29 +85,29 @@ importers: version: 0.4.0 vue: specifier: ^3.5.13 - version: 3.5.34 + version: 3.5.34(typescript@7.0.2) vue-i18n: specifier: ^11.4.2 - version: 11.4.2(vue@3.5.34) + version: 11.4.2(vue@3.5.34(typescript@7.0.2)) vue-pdf-embed: specifier: ^2.1.6 - version: 2.1.6(vue@3.5.34) + version: 2.1.6(vue@3.5.34(typescript@7.0.2)) vue-router: specifier: ^4.3.2 - version: 4.6.4(vue@3.5.34) + version: 4.6.4(vue@3.5.34(typescript@7.0.2)) vue3-clipboard: specifier: ^1.0.0 - version: 1.0.0(vue@3.5.34) + version: 1.0.0(vue@3.5.34(typescript@7.0.2)) vuex: specifier: ^4.1.0 - version: 4.1.0(vue@3.5.34) + version: 4.1.0(vue@3.5.34(typescript@7.0.2)) xlsx: specifier: 0.18.5 version: 0.18.5 devDependencies: '@vitejs/plugin-vue': specifier: ^5.2.4 - version: 5.2.4(vite@5.4.21(sass@1.99.0)(terser@5.46.2))(vue@3.5.34) + version: 5.2.4(vite@5.4.21(sass@1.99.0)(terser@5.46.2))(vue@3.5.34(typescript@7.0.2)) '@vue/compiler-sfc': specifier: ^3.4.27 version: 3.5.34 @@ -117,18 +120,24 @@ importers: terser: specifier: ^5.31.1 version: 5.46.2 + typescript: + specifier: ^7.0.2 + version: 7.0.2 unplugin-auto-import: specifier: ^0.11.2 - version: 0.11.5(@vueuse/core@14.3.0(vue@3.5.34))(rollup@4.60.3) + version: 0.11.5(@vueuse/core@14.3.0(vue@3.5.34(typescript@7.0.2)))(rollup@4.60.3) vite: specifier: ^5.4.19 version: 5.4.21(sass@1.99.0)(terser@5.46.2) vite-plugin-compression: specifier: ^0.5.1 - version: 0.5.1(vite@5.4.21(sass@1.99.0)(terser@5.46.2)) + version: 0.5.1(supports-color@7.2.0)(vite@5.4.21(sass@1.99.0)(terser@5.46.2)) vite-plugin-vue-setup-extend: specifier: ^0.4.0 version: 0.4.0(vite@5.4.21(sass@1.99.0)(terser@5.46.2)) + vue-tsc: + specifier: ^3.3.11 + version: 3.3.13(typescript@7.0.2) packages: @@ -404,30 +413,35 @@ packages: engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [glibc] '@napi-rs/canvas-linux-arm64-musl@1.0.2': resolution: {integrity: sha512-qwROoDIC9upfvDoRLuPn2aNg9CGW1x0Ygr4k2Or+8paA9d0qBLwk87U+g8KQpoOviKoPoiwl97kvBYuYD7qZoA==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [musl] '@napi-rs/canvas-linux-riscv64-gnu@1.0.2': resolution: {integrity: sha512-fXRjnPihdnbO6qy1QQOgxAonb68A0TCEG7rj1x7v7rxNElsE8EVIKIEUTvyDtU+sthYSbX+8e7g3oZiLGnOmxw==} engines: {node: '>= 10'} cpu: [riscv64] os: [linux] + libc: [glibc] '@napi-rs/canvas-linux-x64-gnu@1.0.2': resolution: {integrity: sha512-nPR97DXhbWIAy7yazF3jc06kEPMqYMLmPzFOVNlwKPfIoSChnI+x7dc0hTLaihz3jxrjL6j4BbA7earxfx4X3g==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [glibc] '@napi-rs/canvas-linux-x64-musl@1.0.2': resolution: {integrity: sha512-l7zZY5+jL5qnBZtDz7CoBtY6p7EkHu422g/0zWwrOrzIwWyWxZFRfZZORY1UG7YApymPLx+UbOkN206xXn/c1Q==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [musl] '@napi-rs/canvas-win32-arm64-msvc@1.0.2': resolution: {integrity: sha512-yE0koHCFF4PIbMc2o2SEALhnipz7WBISh5glLvQiomtIoCcW0np3H4Lw93ceJAfJttTTeIIWFbwH84F7EVzjMQ==} @@ -503,36 +517,42 @@ packages: engines: {node: '>= 10.0.0'} cpu: [arm] os: [linux] + libc: [glibc] '@parcel/watcher-linux-arm-musl@2.5.6': resolution: {integrity: sha512-Ve3gUCG57nuUUSyjBq/MAM0CzArtuIOxsBdQ+ftz6ho8n7s1i9E1Nmk/xmP323r2YL0SONs1EuwqBp2u1k5fxg==} engines: {node: '>= 10.0.0'} cpu: [arm] os: [linux] + libc: [musl] '@parcel/watcher-linux-arm64-glibc@2.5.6': resolution: {integrity: sha512-f2g/DT3NhGPdBmMWYoxixqYr3v/UXcmLOYy16Bx0TM20Tchduwr4EaCbmxh1321TABqPGDpS8D/ggOTaljijOA==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [linux] + libc: [glibc] '@parcel/watcher-linux-arm64-musl@2.5.6': resolution: {integrity: sha512-qb6naMDGlbCwdhLj6hgoVKJl2odL34z2sqkC7Z6kzir8b5W65WYDpLB6R06KabvZdgoHI/zxke4b3zR0wAbDTA==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [linux] + libc: [musl] '@parcel/watcher-linux-x64-glibc@2.5.6': resolution: {integrity: sha512-kbT5wvNQlx7NaGjzPFu8nVIW1rWqV780O7ZtkjuWaPUgpv2NMFpjYERVi0UYj1msZNyCzGlaCWEtzc+exjMGbQ==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [linux] + libc: [glibc] '@parcel/watcher-linux-x64-musl@2.5.6': resolution: {integrity: sha512-1JRFeC+h7RdXwldHzTsmdtYR/Ku8SylLgTU/reMuqdVD7CtLwf0VR1FqeprZ0eHQkO0vqsbvFLXUmYm/uNKJBg==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [linux] + libc: [musl] '@parcel/watcher-win32-arm64@2.5.6': resolution: {integrity: sha512-3ukyebjc6eGlw9yRt678DxVF7rjXatWiHvTXqphZLvo7aC5NdEgFufVwjFfY51ijYEWpXbqF5jtrK275z52D4Q==} @@ -599,66 +619,79 @@ packages: resolution: {integrity: sha512-DV6fJoxEYWJOvaZIsok7KrYl0tPvga5OZ2yvKHNNYyk/2roMLqQAbGhr78EQ5YhHpnhLKJD3S1WFusAkmUuV5g==} cpu: [arm] os: [linux] + libc: [glibc] '@rollup/rollup-linux-arm-musleabihf@4.60.3': resolution: {integrity: sha512-mQKoJAzvuOs6F+TZybQO4GOTSMUu7v0WdxEk24krQ/uUxXoPTtHjuaUuPmFhtBcM4K0ons8nrE3JyhTuCFtT/w==} cpu: [arm] os: [linux] + libc: [musl] '@rollup/rollup-linux-arm64-gnu@4.60.3': resolution: {integrity: sha512-Whjj2qoiJ6+OOJMGptTYazaJvjOJm+iKHpXQM1P3LzGjt7Ff++Tp7nH4N8J/BUA7R9IHfDyx4DJIflifwnbmIA==} cpu: [arm64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-arm64-musl@4.60.3': resolution: {integrity: sha512-4YTNHKqGng5+yiZt3mg77nmyuCfmNfX4fPmyUapBcIk+BdwSwmCWGXOUxhXbBEkFHtoN5boLj/5NON+u5QC9tg==} cpu: [arm64] os: [linux] + libc: [musl] '@rollup/rollup-linux-loong64-gnu@4.60.3': resolution: {integrity: sha512-SU3kNlhkpI4UqlUc2VXPGK9o886ZsSeGfMAX2ba2b8DKmMXq4AL7KUrkSWVbb7koVqx41Yczx6dx5PNargIrEA==} cpu: [loong64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-loong64-musl@4.60.3': resolution: {integrity: sha512-6lDLl5h4TXpB1mTf2rQWnAk/LcXrx9vBfu/DT5TIPhvMhRWaZ5MxkIc8u4lJAmBo6klTe1ywXIUHFjylW505sg==} cpu: [loong64] os: [linux] + libc: [musl] '@rollup/rollup-linux-ppc64-gnu@4.60.3': resolution: {integrity: sha512-BMo8bOw8evlup/8G+cj5xWtPyp93xPdyoSN16Zy90Q2QZ0ZYRhCt6ZJSwbrRzG9HApFabjwj2p25TUPDWrhzqQ==} cpu: [ppc64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-ppc64-musl@4.60.3': resolution: {integrity: sha512-E0L8X1dZN1/Rph+5VPF6Xj2G7JJvMACVXtamTJIDrVI44Y3K+G8gQaMEAavbqCGTa16InptiVrX6eM6pmJ+7qA==} cpu: [ppc64] os: [linux] + libc: [musl] '@rollup/rollup-linux-riscv64-gnu@4.60.3': resolution: {integrity: sha512-oZJ/WHaVfHUiRAtmTAeo3DcevNsVvH8mbvodjZy7D5QKvCefO371SiKRpxoDcCxB3PTRTLayWBkvmDQKTcX/sw==} cpu: [riscv64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-riscv64-musl@4.60.3': resolution: {integrity: sha512-Dhbyh7j9FybM3YaTgaHmVALwA8AkUwTPccyCQ79TG9AJUsMQqgN1DDEZNr4+QUfwiWvLDumW5vdwzoeUF+TNxQ==} cpu: [riscv64] os: [linux] + libc: [musl] '@rollup/rollup-linux-s390x-gnu@4.60.3': resolution: {integrity: sha512-cJd1X5XhHHlltkaypz1UcWLA8AcoIi1aWhsvaWDskD1oz2eKCypnqvTQ8ykMNI0RSmm7NkTdSqSSD7zM0xa6Ig==} cpu: [s390x] os: [linux] + libc: [glibc] '@rollup/rollup-linux-x64-gnu@4.60.3': resolution: {integrity: sha512-DAZDBHQfG2oQuhY7mc6I3/qB4LU2fQCjRvxbDwd/Jdvb9fypP4IJ4qmtu6lNjes6B531AI8cg1aKC2di97bUxA==} cpu: [x64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-x64-musl@4.60.3': resolution: {integrity: sha512-cRxsE8c13mZOh3vP+wLDxpQBRrOHDIGOWyDL93Sy0Ga8y515fBcC2pjUfFwUe5T7tqvTvWbCpg1URM/AXdWIXA==} cpu: [x64] os: [linux] + libc: [musl] '@rollup/rollup-openbsd-x64@4.60.3': resolution: {integrity: sha512-QaWcIgRxqEdQdhJqW4DJctsH6HCmo5vHxY0krHSX4jMtOqfzC+dqDGuHM87bu4H8JBeibWx7jFz+h6/4C8wA5Q==} @@ -738,6 +771,126 @@ packages: '@types/web-bluetooth@0.0.21': resolution: {integrity: sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA==} + '@typescript/typescript-aix-ppc64@7.0.2': + resolution: {integrity: sha512-MTKKkWB7p/0E9xi1d1tHtZ5PiLkGEMIq88pK2CubZjOsLtYTLqhgIgi6zepFa+9GHZ6h05NMCkQxGKiPXMxXtQ==} + engines: {node: '>=16.20.0'} + cpu: [ppc64] + os: [aix] + + '@typescript/typescript-darwin-arm64@7.0.2': + resolution: {integrity: sha512-gowzar9MwS/aRWp6f3a4KUqzRjAZjOsmGNCM6LcTgXum+dBfgsBVMN+AgvOCCbguXyick6LJhpBszxMebJ8syA==} + engines: {node: '>=16.20.0'} + cpu: [arm64] + os: [darwin] + + '@typescript/typescript-darwin-x64@7.0.2': + resolution: {integrity: sha512-SZ9xZInqApNlNGc9s0W1VSsktYSOe9cFqNOIqmN1Gs8SmkjKZYFt017G4VwPxASInODuAdbTW7sXiFUf893RgA==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [darwin] + + '@typescript/typescript-freebsd-arm64@7.0.2': + resolution: {integrity: sha512-W5NH4y/J0plIIS5b2xvTEkU7JFxyqdMAOgf+Ilhl0vHQXKO5dZoxd+C/jEtq56c4F3wk71RB4BMRQ2XdI+bwYQ==} + engines: {node: '>=16.20.0'} + cpu: [arm64] + os: [freebsd] + + '@typescript/typescript-freebsd-x64@7.0.2': + resolution: {integrity: sha512-UMGDx5sTpzNw3WiPebH7l90IWfJggEd+egHt/q6p7/Cm3zqoV7VxkGXt+3DxPIw8CcmvAB0j3sVVfbhX+M4Tpw==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [freebsd] + + '@typescript/typescript-linux-arm64@7.0.2': + resolution: {integrity: sha512-Qh4eU4/y3yDjnfjjyPYihMj5/ODIlmt+Bzu17OI+fiSRDW57QmU5SiN63exPRNJPKUzcc1INa1NXdrJ+MqHjUQ==} + engines: {node: '>=16.20.0'} + cpu: [arm64] + os: [linux] + + '@typescript/typescript-linux-arm@7.0.2': + resolution: {integrity: sha512-gffT3xPz9sR7j/YJExkyPntrI0P2EP9XbOyWzth2/Gs0RstK+90RBcO0ncXoXy/beYll1SXw846Nf2zdnEz0QQ==} + engines: {node: '>=16.20.0'} + cpu: [arm] + os: [linux] + + '@typescript/typescript-linux-loong64@7.0.2': + resolution: {integrity: sha512-uEHck9i8hoAzXPiYRib1O7miOnz23SxIeVl6F4LXox+qov1K35jHcEW6VHKvZI+pyvl7fZEP4MCU5LYvIq1GuQ==} + engines: {node: '>=16.20.0'} + cpu: [loong64] + os: [linux] + + '@typescript/typescript-linux-mips64el@7.0.2': + resolution: {integrity: sha512-R4KvAMnE43W5Qeqb0Ly56O3mWMWIAgsMyz36DCaycd5nbg/9kzm0liw3JocfRqyJY0KPmzFjbswozXyW0DnIYA==} + engines: {node: '>=16.20.0'} + cpu: [mips64el] + os: [linux] + + '@typescript/typescript-linux-ppc64@7.0.2': + resolution: {integrity: sha512-DORx5b3sd/4S7eayxm4FQv+A7CrkUIGRaHiwI8oiHTAI1fAPWhF4J0vAlkC8biAlHSVVwxMQ3tjZ2/DVbnQiiA==} + engines: {node: '>=16.20.0'} + cpu: [ppc64] + os: [linux] + + '@typescript/typescript-linux-riscv64@7.0.2': + resolution: {integrity: sha512-wf0jqEDOjrPRnKwYRyyJDRo11KMbvMFrU+q4zqKyChODBzvlkbhNQfKvLxQCcwTpdDaXSHZTVuh0JoCrKCUMHQ==} + engines: {node: '>=16.20.0'} + cpu: [riscv64] + os: [linux] + + '@typescript/typescript-linux-s390x@7.0.2': + resolution: {integrity: sha512-IkwJc3L7yhytWd/ewjyxNDfOmswCm9GWMJT/ue/dU4aZNbwZeYAetq42VyLmsmSjvoX7z74X6ZaYCtzAr0EuGw==} + engines: {node: '>=16.20.0'} + cpu: [s390x] + os: [linux] + + '@typescript/typescript-linux-x64@7.0.2': + resolution: {integrity: sha512-EYdf2cNg7rgCWJnxCdJ+F3V39O8ihb37eHAu1LK8oAFizgTQbPOK7zHHXbPt8rX24COqODXeI3sIf0fCXG7H/A==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [linux] + + '@typescript/typescript-netbsd-arm64@7.0.2': + resolution: {integrity: sha512-+polYF4MF04aPpO5FTkHran9yUQDSXqy5GiSDKpsll5jy3l3+g9QLhpf39T+ePtefhXLOGrLl0QIjkQP6VnelA==} + engines: {node: '>=16.20.0'} + cpu: [arm64] + os: [netbsd] + + '@typescript/typescript-netbsd-x64@7.0.2': + resolution: {integrity: sha512-8YIT0EHM/3dq10ZOVF/A7pc/YSMtbcecct4rWtexrnSCHOPcpC2KTLXfTCR6vDpnSiY12heNb1GiN/wu+T/FyA==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [netbsd] + + '@typescript/typescript-openbsd-arm64@7.0.2': + resolution: {integrity: sha512-APT8+ClYnuYm1u9+kgGXoMj2VzWzcymwh2gNSQVySHfkRDGOTVkoWLjCmOQSaO+PoqQ57B0flRp9SA+7GnnkzQ==} + engines: {node: '>=16.20.0'} + cpu: [arm64] + os: [openbsd] + + '@typescript/typescript-openbsd-x64@7.0.2': + resolution: {integrity: sha512-yX7s+Q0Dln0Dt9tEzZsAjXXR/+ytBM7AlglaqyeMPxQszJ1JhlJdZ6jLA+IzldHtflX81em7lDao1xXu+aRRkg==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [openbsd] + + '@typescript/typescript-sunos-x64@7.0.2': + resolution: {integrity: sha512-dLJDGaLZ1D4HPQn62u1n8mBDkJREwMsAkCdkwd4Ieqw+x3TUyTsqY0YiBCtE6H6OzzgGk3iuZ3vFWRS+E8/d1g==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [sunos] + + '@typescript/typescript-win32-arm64@7.0.2': + resolution: {integrity: sha512-Gyl1Vy6OsWesLzmq+EP0Fb7b4Nid5232AvcA2SFcdYreldpNtYFFofPjnt62y9hQy7VTaZp65ICJjuAQRaVcIQ==} + engines: {node: '>=16.20.0'} + cpu: [arm64] + os: [win32] + + '@typescript/typescript-win32-x64@7.0.2': + resolution: {integrity: sha512-0BQ3HkAHHlKLSp1qRvf3SUhGpGsDuhB/jgFw75guyqbxJqEaS0Cw/VFO8i2nHglJUzQCRtMMR/IBAKE3ETMC4g==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [win32] + '@uppy/companion-client@2.2.2': resolution: {integrity: sha512-5mTp2iq97/mYSisMaBtFRry6PTgZA6SIL7LePteOV5x0/DxKfrZW3DEiQERJmYpHzy7k8johpm2gHnEKto56Og==} @@ -762,6 +915,20 @@ packages: vite: ^5.0.0 || ^6.0.0 vue: ^3.2.25 + '@volar/language-core@2.4.28': + resolution: {integrity: sha512-w4qhIJ8ZSitgLAkVay6AbcnC7gP3glYM3fYwKV3srj8m494E3xtrCv6E+bWviiK/8hs6e6t1ij1s2Endql7vzQ==} + + '@volar/source-map@2.4.28': + resolution: {integrity: sha512-yX2BDBqJkRXfKw8my8VarTyjv48QwxdJtvRgUpNE5erCsgEUdI2DsLbpa+rOQVAJYshY99szEcRDmyHbF10ggQ==} + + '@volar/typescript@2.4.28': + resolution: {integrity: sha512-Ja6yvWrbis2QtN4ClAKreeUZPVYMARDYZl9LMEv1iQ1QdepB6wn0jTRxA9MftYmYa4DQ4k/DaSZpFPUfxl8giw==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + '@vue/compiler-core@3.5.34': resolution: {integrity: sha512-s9cLyK5mLcvZ4Agva5QgRsQyLKvts9WbU9DB6NqiZkkGEdwmcEiylj5Jbwkp680drF/NNCV8OlAJSe+yMLxaJw==} @@ -777,6 +944,9 @@ packages: '@vue/devtools-api@6.6.4': resolution: {integrity: sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==} + '@vue/language-core@3.3.13': + resolution: {integrity: sha512-axA0Xemn5LuUKuKWob0/kVq7xQ2mJJM6VqA9Exvt35nM9yRC31goWVve/G/Zb2ZCLsXC8FHYjjfXlnshknSCew==} + '@vue/reactivity@3.5.34': resolution: {integrity: sha512-y9XDjCEuBp+98k+UL5dbYkh57AHU4o6cxZedOPXw3bmrZZYLQsVHguGurq7hVrPCSrQtrnz1f9dssyFr+dMXfQ==} @@ -990,6 +1160,9 @@ packages: ag-psd@30.2.0: resolution: {integrity: sha512-tSAWfNzLl5brFqKEer7egxASZ1a0LwHnReM/D5VVpvrgdwdsa8OVfCQpysK7tGaOuE2tPEqp3mAuH7aIvPhcig==} + alien-signals@3.2.1: + resolution: {integrity: sha512-I8FjmltrfnDFoZedi5CG8DghVYNhzb/Ijluz7tCSJH0xpd0484Kowhbb1XDYOxfJpU1p5wnM2X54dA+IfGyD1g==} + animate.css@4.1.1: resolution: {integrity: sha512-+mRmCTv6SbCmtYJCN4faJMNFVNN5EuCTTprDTAo7YzIGji2KADmakjVA3+8mVDkZ2Bf09vayB35lSQIex2+QaQ==} @@ -1701,6 +1874,9 @@ packages: ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + muggle-string@0.4.1: + resolution: {integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==} + namespace-emitter@2.0.1: resolution: {integrity: sha512-N/sMKHniSDJBjfrkbS/tpkPj4RAbvW3mr8UAzvlMHyun93XEm83IAvhWtJVHo+RHn/oO8Job5YN4b+wRjSVp5g==} @@ -1751,6 +1927,9 @@ packages: parsedbf@2.0.0: resolution: {integrity: sha512-WNjKn/cwgGBkXqQLif+2VMEahcRHkBRU0/RfBWZ7Vj7snRNNW63yW1mVuuHRDyXTRxuGCzAHHBcr/Fn+U/bXjQ==} + path-browserify@1.0.1: + resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} + path-intersection@2.2.1: resolution: {integrity: sha512-9u8xvMcSfuOiStv9bPdnRJQhGQXLKurew94n4GPQCdH1nj9QKC9ObbNoIpiRq8skiOBxKkt277PgOoFgAt3/rA==} @@ -2015,6 +2194,11 @@ packages: typedarray@0.0.6: resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} + typescript@7.0.2: + resolution: {integrity: sha512-8FYau96o3NKOhbjKi/qNvG/W5jhzxkbdm5sj9AbZ/5T5sWqn3hJgLfGx27sRKZWTvyzCP8dLRBTf5tBTSRVUNA==} + engines: {node: '>=16.20.0'} + hasBin: true + ufo@1.6.4: resolution: {integrity: sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA==} @@ -2095,6 +2279,9 @@ packages: terser: optional: true + vscode-uri@3.2.0: + resolution: {integrity: sha512-m2gXo3bn0G1kT9InzMf07fTbqMbGtyckj3bH5ktLO+1Ssv+yiATZ4dhwaQv9UZWxJh6E9IFGnQyjgWVDWVBDrg==} + vue-component-type-helpers@3.3.6: resolution: {integrity: sha512-FkljacAwJ9BUoSUdpFe3VDy0sGigNlTH9+2zcXUWmZOjN8swiCkl3t48wOJun0OsUd2cEIda1l04tsxMiKIIrQ==} @@ -2114,6 +2301,12 @@ packages: peerDependencies: vue: ^3.5.0 + vue-tsc@3.3.13: + resolution: {integrity: sha512-jE4/bXdOMSHVxEGgQCqNllJy+9N3Gx6tfSAsg0yhFK/MAN6eXqISihupnDEKSCt12VVnjN2gI3AqLYcqoh5x/A==} + hasBin: true + peerDependencies: + typescript: '>=5.0.0' + vue3-clipboard@1.0.0: resolution: {integrity: sha512-GUqKh1oO79xDpq0z+cCv/NDVTpcJGNDzeNgT3PmTdTp/WJh3gcTrDqIYKycKhzMFOtIFJ7hO/+usgyWtT+fNhA==} peerDependencies: @@ -2215,9 +2408,9 @@ snapshots: '@ctrl/tinycolor@4.2.0': {} - '@element-plus/icons-vue@2.3.2(vue@3.5.34)': + '@element-plus/icons-vue@2.3.2(vue@3.5.34(typescript@7.0.2))': dependencies: - vue: 3.5.34 + vue: 3.5.34(typescript@7.0.2) '@esbuild/aix-ppc64@0.21.5': optional: true @@ -2458,10 +2651,10 @@ snapshots: transitivePeerDependencies: - geotiff - '@open-file-viewer/vue@0.1.27(@open-file-viewer/core@0.1.27(pdfjs-dist@6.1.200))(vue@3.5.34)': + '@open-file-viewer/vue@0.1.27(@open-file-viewer/core@0.1.27(pdfjs-dist@6.1.200))(vue@3.5.34(typescript@7.0.2))': dependencies: '@open-file-viewer/core': 0.1.27(pdfjs-dist@6.1.200) - vue: 3.5.34 + vue: 3.5.34(typescript@7.0.2) '@parcel/watcher-android-arm64@2.5.6': optional: true @@ -2613,9 +2806,9 @@ snapshots: codemirror: 5.65.21 randomcolor: 0.6.2 - '@saber/nf-form-design-elp@1.6.1(vue@3.5.34)': + '@saber/nf-form-design-elp@1.6.1(vue@3.5.34(typescript@7.0.2))': dependencies: - vuedraggable: 4.1.0(vue@3.5.34) + vuedraggable: 4.1.0(vue@3.5.34(typescript@7.0.2)) transitivePeerDependencies: - vue @@ -2627,16 +2820,16 @@ snapshots: countup.js: 2.10.0 signature_pad: 5.1.3 - '@smallwei/avue@3.9.2(@element-plus/icons-vue@2.3.2(vue@3.5.34))(element-plus@2.14.2(vue@3.5.34))(vue@3.5.34)': + '@smallwei/avue@3.9.2(patch_hash=5ba15ad41b2c301250bf24adf39da2ed526b8375143da2c5a495361b29e862db)(@element-plus/icons-vue@2.3.2(vue@3.5.34(typescript@7.0.2)))(debug@4.4.3(supports-color@7.2.0))(element-plus@2.14.2(vue@3.5.34(typescript@7.0.2)))(vue@3.5.34(typescript@7.0.2))': dependencies: - '@element-plus/icons-vue': 2.3.2(vue@3.5.34) - axios: 0.21.4 + '@element-plus/icons-vue': 2.3.2(vue@3.5.34(typescript@7.0.2)) + axios: 0.21.4(debug@4.4.3(supports-color@7.2.0)) countup.js: 1.9.3 dayjs: 1.11.20 - element-plus: 2.14.2(vue@3.5.34) + element-plus: 2.14.2(vue@3.5.34(typescript@7.0.2)) lodash: 4.18.1 lodash-es: 4.18.1 - vue: 3.5.34 + vue: 3.5.34(typescript@7.0.2) transitivePeerDependencies: - debug @@ -2663,6 +2856,66 @@ snapshots: '@types/web-bluetooth@0.0.21': {} + '@typescript/typescript-aix-ppc64@7.0.2': + optional: true + + '@typescript/typescript-darwin-arm64@7.0.2': + optional: true + + '@typescript/typescript-darwin-x64@7.0.2': + optional: true + + '@typescript/typescript-freebsd-arm64@7.0.2': + optional: true + + '@typescript/typescript-freebsd-x64@7.0.2': + optional: true + + '@typescript/typescript-linux-arm64@7.0.2': + optional: true + + '@typescript/typescript-linux-arm@7.0.2': + optional: true + + '@typescript/typescript-linux-loong64@7.0.2': + optional: true + + '@typescript/typescript-linux-mips64el@7.0.2': + optional: true + + '@typescript/typescript-linux-ppc64@7.0.2': + optional: true + + '@typescript/typescript-linux-riscv64@7.0.2': + optional: true + + '@typescript/typescript-linux-s390x@7.0.2': + optional: true + + '@typescript/typescript-linux-x64@7.0.2': + optional: true + + '@typescript/typescript-netbsd-arm64@7.0.2': + optional: true + + '@typescript/typescript-netbsd-x64@7.0.2': + optional: true + + '@typescript/typescript-openbsd-arm64@7.0.2': + optional: true + + '@typescript/typescript-openbsd-x64@7.0.2': + optional: true + + '@typescript/typescript-sunos-x64@7.0.2': + optional: true + + '@typescript/typescript-win32-arm64@7.0.2': + optional: true + + '@typescript/typescript-win32-x64@7.0.2': + optional: true + '@uppy/companion-client@2.2.2': dependencies: '@uppy/utils': 4.1.3 @@ -2692,10 +2945,24 @@ snapshots: '@uppy/utils': 4.1.3 nanoid: 3.3.12 - '@vitejs/plugin-vue@5.2.4(vite@5.4.21(sass@1.99.0)(terser@5.46.2))(vue@3.5.34)': + '@vitejs/plugin-vue@5.2.4(vite@5.4.21(sass@1.99.0)(terser@5.46.2))(vue@3.5.34(typescript@7.0.2))': dependencies: vite: 5.4.21(sass@1.99.0)(terser@5.46.2) - vue: 3.5.34 + vue: 3.5.34(typescript@7.0.2) + + '@volar/language-core@2.4.28': + dependencies: + '@volar/source-map': 2.4.28 + + '@volar/source-map@2.4.28': {} + + '@volar/typescript@2.4.28(typescript@7.0.2)': + dependencies: + '@volar/language-core': 2.4.28 + path-browserify: 1.0.1 + vscode-uri: 3.2.0 + optionalDependencies: + typescript: 7.0.2 '@vue/compiler-core@3.5.34': dependencies: @@ -2729,6 +2996,16 @@ snapshots: '@vue/devtools-api@6.6.4': {} + '@vue/language-core@3.3.13': + dependencies: + '@volar/language-core': 2.4.28 + '@vue/compiler-dom': 3.5.34 + '@vue/shared': 3.5.34 + alien-signals: 3.2.1 + muggle-string: 0.4.1 + path-browserify: 1.0.1 + picomatch: 4.0.4 + '@vue/reactivity@3.5.34': dependencies: '@vue/shared': 3.5.34 @@ -2745,46 +3022,46 @@ snapshots: '@vue/shared': 3.5.34 csstype: 3.2.3 - '@vue/server-renderer@3.5.34(vue@3.5.34)': + '@vue/server-renderer@3.5.34(vue@3.5.34(typescript@7.0.2))': dependencies: '@vue/compiler-ssr': 3.5.34 '@vue/shared': 3.5.34 - vue: 3.5.34 + vue: 3.5.34(typescript@7.0.2) '@vue/shared@3.5.34': {} - '@vueuse/core@14.3.0(vue@3.5.34)': + '@vueuse/core@14.3.0(vue@3.5.34(typescript@7.0.2))': dependencies: '@types/web-bluetooth': 0.0.21 '@vueuse/metadata': 14.3.0 - '@vueuse/shared': 14.3.0(vue@3.5.34) - vue: 3.5.34 + '@vueuse/shared': 14.3.0(vue@3.5.34(typescript@7.0.2)) + vue: 3.5.34(typescript@7.0.2) '@vueuse/metadata@14.3.0': {} - '@vueuse/shared@14.3.0(vue@3.5.34)': + '@vueuse/shared@14.3.0(vue@3.5.34(typescript@7.0.2))': dependencies: - vue: 3.5.34 + vue: 3.5.34(typescript@7.0.2) - '@wangeditor-next/basic-modules@2.0.0(@wangeditor-next/core@1.8.0(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@4.0.6)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@5.1.11)(slate@0.123.0)(snabbdom@3.6.3))(dom7@3.0.0)(lodash.throttle@4.1.1)(nanoid@3.3.12)(slate@0.72.8)(snabbdom@3.6.3)': + '@wangeditor-next/basic-modules@2.0.0(@wangeditor-next/core@1.8.0(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@5.1.11)(slate@0.123.0)(snabbdom@3.6.3))(dom7@3.0.0)(lodash.throttle@4.1.1)(nanoid@5.1.11)(slate@0.123.0)(snabbdom@3.6.3)': dependencies: - '@wangeditor-next/core': 1.8.0(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.12)(slate@0.72.8)(snabbdom@3.6.3) + '@wangeditor-next/core': 1.8.0(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@5.1.11)(slate@0.123.0)(snabbdom@3.6.3) dom7: 3.0.0 is-url: 1.2.4 lodash.throttle: 4.1.1 - nanoid: 3.3.12 - slate: 0.72.8 + nanoid: 5.1.11 + slate: 0.123.0 snabbdom: 3.6.3 - '@wangeditor-next/code-highlight@2.0.0(@wangeditor-next/core@1.8.0(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@4.0.6)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@5.1.11)(slate@0.123.0)(snabbdom@3.6.3))(dom7@4.0.6)(slate@0.123.0)(snabbdom@3.6.3)': + '@wangeditor-next/code-highlight@2.0.0(@wangeditor-next/core@1.8.0(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@5.1.11)(slate@0.123.0)(snabbdom@3.6.3))(dom7@4.0.6)(slate@0.123.0)(snabbdom@3.6.3)': dependencies: - '@wangeditor-next/core': 1.8.0(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.12)(slate@0.72.8)(snabbdom@3.6.3) + '@wangeditor-next/core': 1.8.0(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@5.1.11)(slate@0.123.0)(snabbdom@3.6.3) dom7: 4.0.6 prismjs: 1.30.0 slate: 0.123.0 snabbdom: 3.6.3 - '@wangeditor-next/core@1.8.0(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.12)(slate@0.72.8)(snabbdom@3.6.3)': + '@wangeditor-next/core@1.8.0(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@5.1.11)(slate@0.123.0)(snabbdom@3.6.3)': dependencies: '@types/event-emitter': 0.3.5 '@uppy/core': 2.3.4 @@ -2800,9 +3077,9 @@ snapshots: lodash.foreach: 4.5.0 lodash.throttle: 4.1.1 lodash.toarray: 4.4.0 - nanoid: 3.3.12 + nanoid: 5.1.11 scroll-into-view-if-needed: 3.1.0 - slate: 0.72.8 + slate: 0.123.0 slate-history: 0.115.0(slate@0.123.0) snabbdom: 3.6.3 @@ -2810,13 +3087,13 @@ snapshots: dependencies: '@uppy/core': 2.3.4 '@uppy/xhr-upload': 2.1.3(@uppy/core@2.3.4) - '@wangeditor-next/basic-modules': 2.0.0(@wangeditor-next/core@1.8.0(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@4.0.6)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@5.1.11)(slate@0.123.0)(snabbdom@3.6.3))(dom7@3.0.0)(lodash.throttle@4.1.1)(nanoid@3.3.12)(slate@0.72.8)(snabbdom@3.6.3) - '@wangeditor-next/code-highlight': 2.0.0(@wangeditor-next/core@1.8.0(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@4.0.6)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@5.1.11)(slate@0.123.0)(snabbdom@3.6.3))(dom7@4.0.6)(slate@0.123.0)(snabbdom@3.6.3) - '@wangeditor-next/core': 1.8.0(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.12)(slate@0.72.8)(snabbdom@3.6.3) - '@wangeditor-next/list-module': 2.0.0(@wangeditor-next/core@1.8.0(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@4.0.6)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@5.1.11)(slate@0.123.0)(snabbdom@3.6.3))(dom7@4.0.6)(slate@0.123.0)(snabbdom@3.6.3) - '@wangeditor-next/table-module': 2.0.0(@wangeditor-next/core@1.8.0(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@4.0.6)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@5.1.11)(slate@0.123.0)(snabbdom@3.6.3))(dom7@4.0.6)(lodash.debounce@4.0.8)(lodash.throttle@4.1.1)(nanoid@5.1.11)(slate@0.123.0)(snabbdom@3.6.3) - '@wangeditor-next/upload-image-module': 2.0.0(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(@wangeditor-next/basic-modules@2.0.0(@wangeditor-next/core@1.8.0(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@4.0.6)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@5.1.11)(slate@0.123.0)(snabbdom@3.6.3))(dom7@4.0.6)(lodash.throttle@4.1.1)(nanoid@5.1.11)(slate@0.123.0)(snabbdom@3.6.3))(@wangeditor-next/core@1.8.0(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@4.0.6)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@5.1.11)(slate@0.123.0)(snabbdom@3.6.3))(dom7@4.0.6)(lodash.foreach@4.5.0)(slate@0.123.0)(snabbdom@3.6.3) - '@wangeditor-next/video-module': 2.0.0(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(@wangeditor-next/core@1.8.0(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@4.0.6)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@5.1.11)(slate@0.123.0)(snabbdom@3.6.3))(dom7@4.0.6)(nanoid@5.1.11)(slate@0.123.0)(snabbdom@3.6.3) + '@wangeditor-next/basic-modules': 2.0.0(@wangeditor-next/core@1.8.0(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@5.1.11)(slate@0.123.0)(snabbdom@3.6.3))(dom7@3.0.0)(lodash.throttle@4.1.1)(nanoid@5.1.11)(slate@0.123.0)(snabbdom@3.6.3) + '@wangeditor-next/code-highlight': 2.0.0(@wangeditor-next/core@1.8.0(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@5.1.11)(slate@0.123.0)(snabbdom@3.6.3))(dom7@4.0.6)(slate@0.123.0)(snabbdom@3.6.3) + '@wangeditor-next/core': 1.8.0(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@5.1.11)(slate@0.123.0)(snabbdom@3.6.3) + '@wangeditor-next/list-module': 2.0.0(@wangeditor-next/core@1.8.0(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@5.1.11)(slate@0.123.0)(snabbdom@3.6.3))(dom7@4.0.6)(slate@0.123.0)(snabbdom@3.6.3) + '@wangeditor-next/table-module': 2.0.0(@wangeditor-next/core@1.8.0(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@5.1.11)(slate@0.123.0)(snabbdom@3.6.3))(dom7@4.0.6)(lodash.debounce@4.0.8)(lodash.throttle@4.1.1)(nanoid@5.1.11)(slate@0.123.0)(snabbdom@3.6.3) + '@wangeditor-next/upload-image-module': 2.0.0(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(@wangeditor-next/basic-modules@2.0.0(@wangeditor-next/core@1.8.0(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@5.1.11)(slate@0.123.0)(snabbdom@3.6.3))(dom7@3.0.0)(lodash.throttle@4.1.1)(nanoid@5.1.11)(slate@0.123.0)(snabbdom@3.6.3))(@wangeditor-next/core@1.8.0(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@5.1.11)(slate@0.123.0)(snabbdom@3.6.3))(dom7@4.0.6)(lodash.foreach@4.5.0)(slate@0.123.0)(snabbdom@3.6.3) + '@wangeditor-next/video-module': 2.0.0(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(@wangeditor-next/core@1.8.0(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@5.1.11)(slate@0.123.0)(snabbdom@3.6.3))(dom7@4.0.6)(nanoid@5.1.11)(slate@0.123.0)(snabbdom@3.6.3) dom7: 4.0.6 is-hotkey: 0.2.0 lodash.camelcase: 4.3.0 @@ -2829,16 +3106,16 @@ snapshots: slate: 0.123.0 snabbdom: 3.6.3 - '@wangeditor-next/list-module@2.0.0(@wangeditor-next/core@1.8.0(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@4.0.6)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@5.1.11)(slate@0.123.0)(snabbdom@3.6.3))(dom7@4.0.6)(slate@0.123.0)(snabbdom@3.6.3)': + '@wangeditor-next/list-module@2.0.0(@wangeditor-next/core@1.8.0(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@5.1.11)(slate@0.123.0)(snabbdom@3.6.3))(dom7@4.0.6)(slate@0.123.0)(snabbdom@3.6.3)': dependencies: - '@wangeditor-next/core': 1.8.0(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.12)(slate@0.72.8)(snabbdom@3.6.3) + '@wangeditor-next/core': 1.8.0(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@5.1.11)(slate@0.123.0)(snabbdom@3.6.3) dom7: 4.0.6 slate: 0.123.0 snabbdom: 3.6.3 - '@wangeditor-next/table-module@2.0.0(@wangeditor-next/core@1.8.0(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@4.0.6)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@5.1.11)(slate@0.123.0)(snabbdom@3.6.3))(dom7@4.0.6)(lodash.debounce@4.0.8)(lodash.throttle@4.1.1)(nanoid@5.1.11)(slate@0.123.0)(snabbdom@3.6.3)': + '@wangeditor-next/table-module@2.0.0(@wangeditor-next/core@1.8.0(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@5.1.11)(slate@0.123.0)(snabbdom@3.6.3))(dom7@4.0.6)(lodash.debounce@4.0.8)(lodash.throttle@4.1.1)(nanoid@5.1.11)(slate@0.123.0)(snabbdom@3.6.3)': dependencies: - '@wangeditor-next/core': 1.8.0(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.12)(slate@0.72.8)(snabbdom@3.6.3) + '@wangeditor-next/core': 1.8.0(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@5.1.11)(slate@0.123.0)(snabbdom@3.6.3) dom7: 4.0.6 lodash.debounce: 4.0.8 lodash.throttle: 4.1.1 @@ -2846,22 +3123,22 @@ snapshots: slate: 0.123.0 snabbdom: 3.6.3 - '@wangeditor-next/upload-image-module@2.0.0(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(@wangeditor-next/basic-modules@2.0.0(@wangeditor-next/core@1.8.0(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@4.0.6)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@5.1.11)(slate@0.123.0)(snabbdom@3.6.3))(dom7@4.0.6)(lodash.throttle@4.1.1)(nanoid@5.1.11)(slate@0.123.0)(snabbdom@3.6.3))(@wangeditor-next/core@1.8.0(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@4.0.6)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@5.1.11)(slate@0.123.0)(snabbdom@3.6.3))(dom7@4.0.6)(lodash.foreach@4.5.0)(slate@0.123.0)(snabbdom@3.6.3)': + '@wangeditor-next/upload-image-module@2.0.0(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(@wangeditor-next/basic-modules@2.0.0(@wangeditor-next/core@1.8.0(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@5.1.11)(slate@0.123.0)(snabbdom@3.6.3))(dom7@3.0.0)(lodash.throttle@4.1.1)(nanoid@5.1.11)(slate@0.123.0)(snabbdom@3.6.3))(@wangeditor-next/core@1.8.0(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@5.1.11)(slate@0.123.0)(snabbdom@3.6.3))(dom7@4.0.6)(lodash.foreach@4.5.0)(slate@0.123.0)(snabbdom@3.6.3)': dependencies: '@uppy/core': 2.3.4 '@uppy/xhr-upload': 2.1.3(@uppy/core@2.3.4) - '@wangeditor-next/basic-modules': 2.0.0(@wangeditor-next/core@1.8.0(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@4.0.6)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@5.1.11)(slate@0.123.0)(snabbdom@3.6.3))(dom7@3.0.0)(lodash.throttle@4.1.1)(nanoid@3.3.12)(slate@0.72.8)(snabbdom@3.6.3) - '@wangeditor-next/core': 1.8.0(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.12)(slate@0.72.8)(snabbdom@3.6.3) + '@wangeditor-next/basic-modules': 2.0.0(@wangeditor-next/core@1.8.0(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@5.1.11)(slate@0.123.0)(snabbdom@3.6.3))(dom7@3.0.0)(lodash.throttle@4.1.1)(nanoid@5.1.11)(slate@0.123.0)(snabbdom@3.6.3) + '@wangeditor-next/core': 1.8.0(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@5.1.11)(slate@0.123.0)(snabbdom@3.6.3) dom7: 4.0.6 lodash.foreach: 4.5.0 slate: 0.123.0 snabbdom: 3.6.3 - '@wangeditor-next/video-module@2.0.0(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(@wangeditor-next/core@1.8.0(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@4.0.6)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@5.1.11)(slate@0.123.0)(snabbdom@3.6.3))(dom7@4.0.6)(nanoid@5.1.11)(slate@0.123.0)(snabbdom@3.6.3)': + '@wangeditor-next/video-module@2.0.0(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(@wangeditor-next/core@1.8.0(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@5.1.11)(slate@0.123.0)(snabbdom@3.6.3))(dom7@4.0.6)(nanoid@5.1.11)(slate@0.123.0)(snabbdom@3.6.3)': dependencies: '@uppy/core': 2.3.4 '@uppy/xhr-upload': 2.1.3(@uppy/core@2.3.4) - '@wangeditor-next/core': 1.8.0(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.12)(slate@0.72.8)(snabbdom@3.6.3) + '@wangeditor-next/core': 1.8.0(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@5.1.11)(slate@0.123.0)(snabbdom@3.6.3) dom7: 4.0.6 nanoid: 5.1.11 slate: 0.123.0 @@ -2908,10 +3185,10 @@ snapshots: slate-history: 0.66.0(slate@0.72.8) snabbdom: 3.6.3 - '@wangeditor/editor-for-vue@5.1.12(@wangeditor/editor@5.1.23)(vue@3.5.34)': + '@wangeditor/editor-for-vue@5.1.12(@wangeditor/editor@5.1.23)(vue@3.5.34(typescript@7.0.2))': dependencies: '@wangeditor/editor': 5.1.23 - vue: 3.5.34 + vue: 3.5.34(typescript@7.0.2) '@wangeditor/editor@5.1.23': dependencies: @@ -2986,6 +3263,8 @@ snapshots: base64-js: 1.5.1 pako: 2.1.0 + alien-signals@3.2.1: {} + animate.css@4.1.1: {} ansi-styles@4.3.0: @@ -3038,22 +3317,22 @@ snapshots: asynckit@0.4.0: {} - avue-plugin-ueditor@1.0.4(axios@1.16.0)(vue@3.5.34): + avue-plugin-ueditor@1.0.4(axios@1.16.0(debug@4.4.3(supports-color@7.2.0)))(vue@3.5.34(typescript@7.0.2)): dependencies: '@wangeditor/editor': 5.1.23 - '@wangeditor/editor-for-vue': 5.1.12(@wangeditor/editor@5.1.23)(vue@3.5.34) - axios: 1.16.0 - vue: 3.5.34 + '@wangeditor/editor-for-vue': 5.1.12(@wangeditor/editor@5.1.23)(vue@3.5.34(typescript@7.0.2)) + axios: 1.16.0(debug@4.4.3(supports-color@7.2.0)) + vue: 3.5.34(typescript@7.0.2) - axios@0.21.4: + axios@0.21.4(debug@4.4.3(supports-color@7.2.0)): dependencies: - follow-redirects: 1.16.0 + follow-redirects: 1.16.0(debug@4.4.3(supports-color@7.2.0)) transitivePeerDependencies: - debug - axios@1.16.0: + axios@1.16.0(debug@4.4.3(supports-color@7.2.0)): dependencies: - follow-redirects: 1.16.0 + follow-redirects: 1.16.0(debug@4.4.3(supports-color@7.2.0)) form-data: 4.0.5 proxy-from-env: 2.1.0 transitivePeerDependencies: @@ -3221,9 +3500,11 @@ snapshots: dayjs@1.11.20: {} - debug@4.4.3: + debug@4.4.3(supports-color@7.2.0): dependencies: ms: 2.1.3 + optionalDependencies: + supports-color: 7.2.0 delayed-stream@1.0.0: {} @@ -3294,15 +3575,15 @@ snapshots: tslib: 2.3.0 zrender: 6.1.0 - element-plus@2.14.2(vue@3.5.34): + element-plus@2.14.2(vue@3.5.34(typescript@7.0.2)): dependencies: '@ctrl/tinycolor': 4.2.0 - '@element-plus/icons-vue': 2.3.2(vue@3.5.34) + '@element-plus/icons-vue': 2.3.2(vue@3.5.34(typescript@7.0.2)) '@floating-ui/dom': 1.7.6 '@popperjs/core': '@sxzz/popperjs-es@2.11.8' '@types/lodash': 4.17.24 '@types/lodash-es': 4.17.12 - '@vueuse/core': 14.3.0(vue@3.5.34) + '@vueuse/core': 14.3.0(vue@3.5.34(typescript@7.0.2)) async-validator: 4.2.5 dayjs: 1.11.20 lodash: 4.18.1 @@ -3310,7 +3591,7 @@ snapshots: lodash-unified: 1.0.3(@types/lodash-es@4.17.12)(lodash-es@4.18.1)(lodash@4.18.1) memoize-one: 6.0.0 normalize-wheel-es: 1.2.0 - vue: 3.5.34 + vue: 3.5.34(typescript@7.0.2) vue-component-type-helpers: 3.3.6 end-of-stream@1.4.5: @@ -3431,7 +3712,9 @@ snapshots: dependencies: to-regex-range: 5.0.1 - follow-redirects@1.16.0: {} + follow-redirects@1.16.0(debug@4.4.3(supports-color@7.2.0)): + optionalDependencies: + debug: 4.4.3(supports-color@7.2.0) form-data@4.0.5: dependencies: @@ -3763,6 +4046,8 @@ snapshots: ms@2.1.3: {} + muggle-string@0.4.1: {} + namespace-emitter@2.0.1: {} nanoid@3.3.12: {} @@ -3796,6 +4081,8 @@ snapshots: parsedbf@2.0.0: {} + path-browserify@1.0.1: {} + path-intersection@2.2.1: {} path-is-absolute@1.0.1: {} @@ -4065,6 +4352,29 @@ snapshots: typedarray@0.0.6: {} + typescript@7.0.2: + optionalDependencies: + '@typescript/typescript-aix-ppc64': 7.0.2 + '@typescript/typescript-darwin-arm64': 7.0.2 + '@typescript/typescript-darwin-x64': 7.0.2 + '@typescript/typescript-freebsd-arm64': 7.0.2 + '@typescript/typescript-freebsd-x64': 7.0.2 + '@typescript/typescript-linux-arm': 7.0.2 + '@typescript/typescript-linux-arm64': 7.0.2 + '@typescript/typescript-linux-loong64': 7.0.2 + '@typescript/typescript-linux-mips64el': 7.0.2 + '@typescript/typescript-linux-ppc64': 7.0.2 + '@typescript/typescript-linux-riscv64': 7.0.2 + '@typescript/typescript-linux-s390x': 7.0.2 + '@typescript/typescript-linux-x64': 7.0.2 + '@typescript/typescript-netbsd-arm64': 7.0.2 + '@typescript/typescript-netbsd-x64': 7.0.2 + '@typescript/typescript-openbsd-arm64': 7.0.2 + '@typescript/typescript-openbsd-x64': 7.0.2 + '@typescript/typescript-sunos-x64': 7.0.2 + '@typescript/typescript-win32-arm64': 7.0.2 + '@typescript/typescript-win32-x64': 7.0.2 + ufo@1.6.4: {} underscore@1.13.8: {} @@ -4087,7 +4397,7 @@ snapshots: universalify@2.0.1: {} - unplugin-auto-import@0.11.5(@vueuse/core@14.3.0(vue@3.5.34))(rollup@4.60.3): + unplugin-auto-import@0.11.5(@vueuse/core@14.3.0(vue@3.5.34(typescript@7.0.2)))(rollup@4.60.3): dependencies: '@antfu/utils': 0.7.10 '@rollup/pluginutils': 5.3.0(rollup@4.60.3) @@ -4096,7 +4406,7 @@ snapshots: unimport: 1.3.0(rollup@4.60.3) unplugin: 1.16.1 optionalDependencies: - '@vueuse/core': 14.3.0(vue@3.5.34) + '@vueuse/core': 14.3.0(vue@3.5.34(typescript@7.0.2)) transitivePeerDependencies: - rollup @@ -4126,10 +4436,10 @@ snapshots: uuid@8.3.2: {} - vite-plugin-compression@0.5.1(vite@5.4.21(sass@1.99.0)(terser@5.46.2)): + vite-plugin-compression@0.5.1(supports-color@7.2.0)(vite@5.4.21(sass@1.99.0)(terser@5.46.2)): dependencies: chalk: 4.1.2 - debug: 4.4.3 + debug: 4.4.3(supports-color@7.2.0) fs-extra: 10.1.0 vite: 5.4.21(sass@1.99.0)(terser@5.46.2) transitivePeerDependencies: @@ -4151,48 +4461,58 @@ snapshots: sass: 1.99.0 terser: 5.46.2 + vscode-uri@3.2.0: {} + vue-component-type-helpers@3.3.6: {} - vue-i18n@11.4.2(vue@3.5.34): + vue-i18n@11.4.2(vue@3.5.34(typescript@7.0.2)): dependencies: '@intlify/core-base': 11.4.2 '@intlify/devtools-types': 11.4.2 '@intlify/shared': 11.4.2 '@vue/devtools-api': 6.6.4 - vue: 3.5.34 + vue: 3.5.34(typescript@7.0.2) - vue-pdf-embed@2.1.6(vue@3.5.34): + vue-pdf-embed@2.1.6(vue@3.5.34(typescript@7.0.2)): dependencies: pdfjs-dist: 6.2.108 - vue: 3.5.34 + vue: 3.5.34(typescript@7.0.2) - vue-router@4.6.4(vue@3.5.34): + vue-router@4.6.4(vue@3.5.34(typescript@7.0.2)): dependencies: '@vue/devtools-api': 6.6.4 - vue: 3.5.34 + vue: 3.5.34(typescript@7.0.2) - vue3-clipboard@1.0.0(vue@3.5.34): + vue-tsc@3.3.13(typescript@7.0.2): + dependencies: + '@volar/typescript': 2.4.28(typescript@7.0.2) + '@vue/language-core': 3.3.13 + typescript: 7.0.2 + + vue3-clipboard@1.0.0(vue@3.5.34(typescript@7.0.2)): dependencies: clipboard: 2.0.11 - vue: 3.5.34 + vue: 3.5.34(typescript@7.0.2) - vue@3.5.34: + vue@3.5.34(typescript@7.0.2): dependencies: '@vue/compiler-dom': 3.5.34 '@vue/compiler-sfc': 3.5.34 '@vue/runtime-dom': 3.5.34 - '@vue/server-renderer': 3.5.34(vue@3.5.34) + '@vue/server-renderer': 3.5.34(vue@3.5.34(typescript@7.0.2)) '@vue/shared': 3.5.34 + optionalDependencies: + typescript: 7.0.2 - vuedraggable@4.1.0(vue@3.5.34): + vuedraggable@4.1.0(vue@3.5.34(typescript@7.0.2)): dependencies: sortablejs: 1.14.0 - vue: 3.5.34 + vue: 3.5.34(typescript@7.0.2) - vuex@4.1.0(vue@3.5.34): + vuex@4.1.0(vue@3.5.34(typescript@7.0.2)): dependencies: '@vue/devtools-api': 6.6.4 - vue: 3.5.34 + vue: 3.5.34(typescript@7.0.2) webpack-virtual-modules@0.6.2: {} diff --git a/src/api/payment/billLedger.js b/src/api/payment/billLedger.js index d268f2b..cace3bb 100644 --- a/src/api/payment/billLedger.js +++ b/src/api/payment/billLedger.js @@ -6,17 +6,17 @@ export const getList = (current, size, params) => request({ url: `${baseUrl}/list`, method: 'get', params: { current, size, ...params } }); export const getDetail = id => request({ url: `${baseUrl}/detail`, method: 'get', params: { id } }); export const getExpiryCounts = () => request({ url: `${baseUrl}/expiry-counts`, method: 'get' }); -export const getAvailableOptions = (keyword, deptId, selectedId) => +export const getAvailableOptions = (keyword, deptId, selectedId, payerName, payeeName) => request({ url: `${baseUrl}/available-options`, method: 'get', - params: { keyword, deptId, selectedId }, + params: { keyword, deptId, selectedId, payerName, payeeName }, }); -export const getAvailablePage = (current, size, keyword, deptId, selectedId) => +export const getAvailablePage = (current, size, keyword, deptId, selectedId, payerName, payeeName) => request({ url: `${baseUrl}/available-page`, method: 'get', - params: { current, size, keyword, deptId, selectedId }, + params: { current, size, keyword, deptId, selectedId, payerName, payeeName }, }); export const submit = data => request({ url: `${baseUrl}/submit`, method: 'post', data }); export const remove = id => request({ url: `${baseUrl}/remove`, method: 'post', params: { id } }); diff --git a/src/api/payment/paymentApplication.js b/src/api/payment/paymentApplication.js index 3e4c802..59c9aa1 100644 --- a/src/api/payment/paymentApplication.js +++ b/src/api/payment/paymentApplication.js @@ -10,6 +10,13 @@ export const getReferenceAmount = (paymentType, referenceId, excludeId) => method: 'get', params: { paymentType, referenceId, excludeId: excludeId || undefined }, }); +/** 按合同查询可选项目预付核销列表(审批通过且仍有可核销余额) */ +export const getProjectAdvanceWriteOffOptions = params => + request({ + url: `${baseUrl}/project-advance-write-off-options`, + method: 'get', + params, + }); export const save = data => request({ url: `${baseUrl}/save`, method: 'post', data }); export const remove = id => request({ url: `${baseUrl}/remove`, method: 'post', params: { id } }); export const submit = data => request({ url: `${baseUrl}/submit`, method: 'post', data }); diff --git a/src/api/settlement/formalSettlement.js b/src/api/settlement/formalSettlement.js index 92830f8..ea4cb14 100644 --- a/src/api/settlement/formalSettlement.js +++ b/src/api/settlement/formalSettlement.js @@ -31,8 +31,15 @@ export const approve = data => request({ url: `${baseUrl}/approve`, method: 'pos export const returnBill = data => request({ url: `${baseUrl}/return`, method: 'post', data }); export const voidBill = data => request({ url: `${baseUrl}/void`, method: 'post', data }); // 同步金蝶涉及多次金蝶远程接口调用(A102-4 预检 + A102-2 保存),可达 20s+,覆盖全局 10s 超时 -export const syncKingdee = id => - request({ url: `${baseUrl}/sync-kingdee`, method: 'post', timeout: 30000, params: { id } }); +// config.meta.suppressErrorMessage=true 时由页面弹框汇总结果,避免拦截器重复 toast +export const syncKingdee = (id, config = {}) => + request({ + url: `${baseUrl}/sync-kingdee`, + method: 'post', + timeout: 30000, + params: { id }, + ...config, + }); export const getDetailFees = detailId => request({ url: `${baseUrl}/detail-fees`, method: 'get', params: { detailId } }); export const getReceiptClaims = formalSettlementId => diff --git a/src/api/settlement/preSettlement.js b/src/api/settlement/preSettlement.js index bb61417..e35f2a6 100644 --- a/src/api/settlement/preSettlement.js +++ b/src/api/settlement/preSettlement.js @@ -24,6 +24,8 @@ export const getContractList = (current, size, params) => export const getFeeOptions = () => request({ url: `${baseUrl}/fee-options`, method: 'get' }); +export const getNextNo = () => request({ url: `${baseUrl}/next-no`, method: 'get' }); + export const getCandidateDetails = (current, size, params) => request({ url: `${baseUrl}/candidate-details`, diff --git a/src/api/settlement/settlementAdjustment.js b/src/api/settlement/settlementAdjustment.js index d809bf6..4c7b460 100644 --- a/src/api/settlement/settlementAdjustment.js +++ b/src/api/settlement/settlementAdjustment.js @@ -17,6 +17,10 @@ export const approve = id => request({ url: `${baseUrl}/approve`, method: 'post' export const returnBill = (id, reason) => request({ url: `${baseUrl}/return`, method: 'post', data: { id, reason } }); export const repush = id => request({ url: `${baseUrl}/repush`, method: 'post', params: { id } }); +export const syncKingdee = id => + request({ url: `${baseUrl}/sync-kingdee`, method: 'post', timeout: 30000, params: { id } }); +export const kingdeeWriteOffPrecheck = formalSettlementId => + request({ url: `${baseUrl}/kingdee-writeoff-precheck`, method: 'get', params: { formalSettlementId } }); export const approvalStatusOptions = [ { label: '草稿', value: 'draft' }, diff --git a/src/api/settlement/settlementImport.js b/src/api/settlement/settlementImport.js new file mode 100644 index 0000000..e59c23f --- /dev/null +++ b/src/api/settlement/settlementImport.js @@ -0,0 +1,65 @@ +import request from '@/axios'; + +const baseUrl = '/blade-transport/settlement-import'; + +export const getOptions = () => request({ url: `${baseUrl}/options`, method: 'get' }); + +export const getNextCode = () => request({ url: `${baseUrl}/next-code`, method: 'get' }); + +export const getList = (current, size, params) => + request({ + url: `${baseUrl}/list`, + method: 'get', + params: { current, size, ...params }, + }); + +export const getDetail = id => + request({ url: `${baseUrl}/detail`, method: 'get', params: { id } }); + +export const exportTemplate = () => + request({ + url: `${baseUrl}/export-template`, + method: 'get', + responseType: 'blob', + }); + +export const parseFile = file => { + const data = new FormData(); + data.append('file', file); + return request({ + url: `${baseUrl}/parse`, + method: 'post', + data, + timeout: 120000, + }); +}; + +export const validate = data => + request({ url: `${baseUrl}/validate`, method: 'post', data, timeout: 120000 }); + +export const exportFailures = data => + request({ + url: `${baseUrl}/export-failures`, + method: 'post', + data, + responseType: 'blob', + timeout: 120000, + }); + +export const saveDraft = data => + request({ url: `${baseUrl}/draft`, method: 'post', data, timeout: 120000 }); + +export const confirm = data => + request({ url: `${baseUrl}/confirm`, method: 'post', data, timeout: 120000 }); + +export const voidBatch = data => request({ url: `${baseUrl}/void`, method: 'post', data }); + +export const removeDraft = id => + request({ url: `${baseUrl}/remove`, method: 'post', params: { id } }); + +export const getHistoryWaybills = params => + request({ + url: `${baseUrl}/history-waybills`, + method: 'get', + params, + }); diff --git a/src/api/system/dept.js b/src/api/system/dept.js index 5a489e0..c7f22de 100644 --- a/src/api/system/dept.js +++ b/src/api/system/dept.js @@ -77,7 +77,8 @@ export const syncOaDepartment = ( size = 20, signal, incremental = false, - modifiedSince + modifiedSince, + companyOaId ) => { return request({ url: '/blade-system/dept/sync-oa-department', @@ -87,6 +88,7 @@ export const syncOaDepartment = ( size, incremental: !!incremental, modifiedSince: modifiedSince || undefined, + companyOaId: companyOaId || undefined, }, timeout: 60000, signal, diff --git a/src/axios.js b/src/axios.js index 1d23232..a3de4a3 100644 --- a/src/axios.js +++ b/src/axios.js @@ -74,12 +74,15 @@ const redirectToLogin = () => { * 统一弹出错误提示并返回带标记的 Error。 * `_notified` 标记用于让业务层(批量导入等)识别「拦截器已经提示过」, * 避免同一条错误被弹两次。 + * meta.suppressErrorMessage=true 时由业务层自行弹框汇总,拦截器不再 toast。 */ -const notifiedError = message => { - ElMessage({ - message: message, - type: 'error', - }); +const notifiedError = (message, config) => { + if (config?.meta?.suppressErrorMessage !== true) { + ElMessage({ + message: message, + type: 'error', + }); + } const error = new Error(message); error._notified = true; return error; @@ -260,12 +263,12 @@ axios.interceptors.response.use( // OAuth2 业务错误码提示 if (status > 2000 && !validatenull(res.data.error_description)) { - return Promise.reject(notifiedError(message)); + return Promise.reject(notifiedError(message, config)); } // 其余非 200 响应统一提示 if (status !== 200) { - return Promise.reject(notifiedError(message)); + return Promise.reject(notifiedError(message, config)); } return res; }, @@ -273,7 +276,11 @@ axios.interceptors.response.use( NProgress.done(); // 网络级失败(HTTP 状态 >500、网关错误、超时、断网等 validateStatus 放行之外的响应) // 原为静默 reject,接口报错页面无任何感知;统一补错误提示,取消请求与刷新令牌请求除外 - if (!axios.isCancel(error) && !isRefreshTokenRequest(error?.config)) { + if ( + !axios.isCancel(error) && + !isRefreshTokenRequest(error?.config) && + error?.config?.meta?.suppressErrorMessage !== true + ) { ElMessage({ message: error?.response?.data?.msg || '请求失败,请稍后重试', type: 'error', diff --git a/src/option/business/contract-manage.js b/src/option/business/contract-manage.js index 4bcfdf2..9efc345 100644 --- a/src/option/business/contract-manage.js +++ b/src/option/business/contract-manage.js @@ -254,8 +254,8 @@ export const option = createCrudOption([ searchOrder: 6, searchPlaceholder: '请输入', order: 185, - disabled: true, - placeholder: '不填写,则系统自动生成', + maxlength: 100, + placeholder: '不填写则按部门规则自动生成', minWidth: 200, }, { diff --git a/src/option/business/project-apply.js b/src/option/business/project-apply.js index b438ffd..08c0eef 100644 --- a/src/option/business/project-apply.js +++ b/src/option/business/project-apply.js @@ -99,7 +99,8 @@ export const config = { action: 'startChange', label: '变更', statusProp: 'approvalStatus', - status: ['approved'], + // 立项通过、变更通过后均可再次发起变更 + status: ['approved', 'change_approved'], permission: 'project_apply_change', }, ], diff --git a/src/option/payment/paymentApplication.js b/src/option/payment/paymentApplication.js index 9f3b688..65494a3 100644 --- a/src/option/payment/paymentApplication.js +++ b/src/option/payment/paymentApplication.js @@ -52,7 +52,8 @@ export const paymentApplicationOption = ({ searchShow: true, searchIcon: true, searchLabelWidth: 88, - searchMenuSpan: 24, + // 查询/重置紧跟首行 4 个条件(4×5 + 菜单 4 = 24),不再独占下一整行 + searchMenuSpan: 4, searchIndex: 4, searchMenuPosition: 'right', border: true, @@ -78,6 +79,7 @@ export const paymentApplicationOption = ({ prop: 'paymentNo', slot: true, search: true, + searchSpan: 5, searchOrder: 9, searchPlaceholder: '请输入', minWidth: 150, @@ -88,6 +90,7 @@ export const paymentApplicationOption = ({ type: 'daterange', searchType: 'daterange', search: true, + searchSpan: 5, searchOrder: 8, hide: true, showColumn: false, @@ -95,18 +98,24 @@ export const paymentApplicationOption = ({ editDisplay: false, viewDisplay: false, }, - searchOnlyColumn({ - label: '客户名称', - prop: 'payeeNameSearch', - searchOrder: 7, - searchProp: 'payeeName', - }), - searchOnlyColumn({ - label: '项目名称', - prop: 'projectNameSearch', - searchOrder: 6, - searchProp: 'projectName', - }), + { + ...searchOnlyColumn({ + label: '客户名称', + prop: 'payeeNameSearch', + searchOrder: 7, + searchProp: 'payeeName', + }), + searchSpan: 5, + }, + { + ...searchOnlyColumn({ + label: '项目名称', + prop: 'projectNameSearch', + searchOrder: 6, + searchProp: 'projectName', + }), + searchSpan: 5, + }, searchOnlyColumn({ label: '关联结算单', prop: 'settlementNo', diff --git a/src/option/settlement/formalSettlement.js b/src/option/settlement/formalSettlement.js new file mode 100644 index 0000000..e9523be --- /dev/null +++ b/src/option/settlement/formalSettlement.js @@ -0,0 +1,173 @@ +/** + * 正式结算单列表(avue-crud)配置 + * ------------------------------------------------------------------ + * 列表页与其它模块统一使用 avue-crud,头部 4 个按钮(刷新 / 列显隐 / 搜索显隐 / + * 显示方式)由 avue-crud 自带,不做二次封装。 + * + * 表格列复用 formalSettlementTable.js 的 formalSettlementTableColumns(与弹窗内 + * 明细表共用同一份列定义),此处只补充 avue 需要的展示/搜索属性,避免两处维护。 + * + * ⚠️ searchOrder 为降序排序,值越大越靠前。 + * ⚠️ 仅用于搜索的列必须 hide + showColumn: false,否则会混进「列显隐」抽屉。 + * ⚠️ column 数组顺序 = 表格列顺序,搜索专用列统一放在数组最前面。 + */ + +import { + approvalStatusOptions, + invoiceStatusOptions, + kingdeeSyncStatusOptions, + paymentStatusOptions, +} from './formalSettlementSearch'; +import { formalSettlementTableColumns } from './formalSettlementTable'; + +const textFormatter = (row, value) => + value === null || value === undefined || value === '' ? '-' : value; + +/** 金额统一展示:两位小数 + 币种 */ +const moneyFormatter = (row, value) => + `${Number(value || 0).toFixed(2)} ${row?.currency || 'RMB'}`; + +const pickLabel = (options, value) => + options.find(item => item.value === value)?.label || value || '-'; + +const searchOnlyColumn = ({ label, prop, searchOrder, type = 'input', dicData }) => { + const column = { + label, + prop, + search: true, + searchOrder, + searchSpan: 5, + hide: true, + showColumn: false, + addDisplay: false, + editDisplay: false, + viewDisplay: false, + }; + if (type === 'select') { + column.type = 'select'; + column.searchPlaceholder = '请选择'; + column.dicData = dicData || []; + } else if (type === 'daterange') { + column.type = 'daterange'; + column.searchType = 'daterange'; + column.searchPlaceholder = '请选择'; + } else { + column.searchPlaceholder = '请输入'; + } + return column; +}; + +/** 表格列的 avue 增量配置:搜索项、插槽、覆盖宽度等 */ +const COLUMN_EXTRA = { + formalSettlementNo: { + slot: true, + search: true, + searchSpan: 5, + searchOrder: 12, + searchPlaceholder: '请输入', + }, + payerName: { search: true, searchSpan: 5, searchOrder: 7, searchPlaceholder: '请输入' }, + payeeName: { search: true, searchSpan: 5, searchOrder: 6, searchPlaceholder: '请输入' }, + projectName: { search: true, searchSpan: 5, searchOrder: 11, searchPlaceholder: '请输入' }, + deptName: { search: true, searchslot: true, searchSpan: 5, searchOrder: 10 }, + contractNo: { search: true, searchSpan: 5, searchOrder: 9, searchPlaceholder: '请输入' }, + invoiceStatusName: { slot: true }, + paymentStatusName: { slot: true }, + approvalStatusName: { slot: true }, + adjustFlag: { + formatter: row => row.adjustStatusName || (row.originFormalSettlementNo ? '调整后单' : '-'), + }, + kingdeeSyncStatus: { + slot: true, + search: true, + type: 'select', + dicData: kingdeeSyncStatusOptions, + searchSpan: 5, + searchOrder: 2, + searchPlaceholder: '请选择', + }, + kingdeeLockStatus: { slot: true }, + createTime: { width: 180 }, +}; + +const buildTableColumns = () => + formalSettlementTableColumns.map(column => { + const extra = { ...(COLUMN_EXTRA[column.prop] || {}) }; + if (column.money) { + extra.formatter = moneyFormatter; + extra.align = 'right'; + } + // link / status 标记的列统一走单元格插槽 + if (column.link || column.status) extra.slot = true; + if (!extra.formatter) extra.formatter = textFormatter; + return { ...column, ...extra }; + }); + +export const formalSettlementOption = () => ({ + height: 'auto', + calcHeight: 32, + tip: false, + searchBtnText: '查询', + emptyBtnText: '重置', + searchShow: true, + searchIcon: true, + searchLabelWidth: 88, + // 查询/重置紧跟首行 4 个条件(4×5 + 菜单 4 = 24),不再独占下一整行 + searchMenuSpan: 4, + searchIndex: 4, + searchMenuPosition: 'right', + border: true, + index: true, + indexLabel: '序号', + indexWidth: 64, + indexFixed: 'left', + selection: true, + selectionWidth: 52, + selectionFixed: 'left', + addBtn: false, + viewBtn: false, + delBtn: false, + editBtn: false, + menuWidth: 320, + menuFixed: 'right', + column: [ + // ---------- 仅搜索列 ---------- + searchOnlyColumn({ + label: '预付结算单号', + prop: 'preSettlementNo', + searchOrder: 8, + }), + searchOnlyColumn({ + label: '发票状态', + prop: 'invoiceStatus', + searchOrder: 5, + type: 'select', + dicData: invoiceStatusOptions, + }), + searchOnlyColumn({ + label: '收付款状态', + prop: 'paymentStatus', + searchOrder: 4, + type: 'select', + dicData: paymentStatusOptions, + }), + searchOnlyColumn({ + label: '审核状态', + prop: 'approvalStatus', + searchOrder: 3, + type: 'select', + dicData: approvalStatusOptions, + }), + searchOnlyColumn({ + label: '生成日期', + prop: 'createDateRange', + searchOrder: 1, + type: 'daterange', + }), + // ---------- 表格列(部分兼搜索项) ---------- + ...buildTableColumns(), + ], +}); + +export const kingdeeSyncName = value => pickLabel(kingdeeSyncStatusOptions, value); +export const paymentStatusName = value => pickLabel(paymentStatusOptions, value); diff --git a/src/option/settlement/formalSettlementForm.js b/src/option/settlement/formalSettlementForm.js index 4b51186..5afba6b 100644 --- a/src/option/settlement/formalSettlementForm.js +++ b/src/option/settlement/formalSettlementForm.js @@ -8,6 +8,8 @@ export const formalSettlementFormFields = [ { label: '收款方', prop: 'payeeName', readonly: true }, { label: '结算类型', prop: 'settlementTypeName', readonly: true }, { label: '结算金额', prop: 'settlementAmount', readonly: true, money: true }, + { label: '业务模式', prop: 'businessModel', type: 'select', optionsKey: 'businessModelOptions' }, + { label: '运输方式', prop: 'transportType', type: 'select', optionsKey: 'transportTypeOptions' }, { label: '汇率日期', prop: 'exchangeRateDate', type: 'date', required: true }, { label: '结算汇率', prop: 'exchangeRate', type: 'number', required: true }, { label: '本位币合计', prop: 'localSettlementAmount', readonly: true, money: true }, @@ -25,6 +27,8 @@ export const createFormalSettlementForm = () => ({ settlementType: '', sourcePreSettlementIds: [], sourceDetailIds: [], + businessModel: '', + transportType: '', exchangeRateDate: '', exchangeRate: 1, createUserName: '', diff --git a/src/option/settlement/formalSettlementSearch.js b/src/option/settlement/formalSettlementSearch.js index abe3520..cd4d811 100644 --- a/src/option/settlement/formalSettlementSearch.js +++ b/src/option/settlement/formalSettlementSearch.js @@ -36,7 +36,7 @@ export const kingdeeSyncStatusOptions = [ export const formalSettlementSearchFields = [ { label: '结算单号', prop: 'formalSettlementNo', type: 'input' }, - { label: '预结算单号', prop: 'preSettlementNo', type: 'input' }, + { label: '预付结算单号', prop: 'preSettlementNo', type: 'input' }, { label: '项目', prop: 'projectName', type: 'input' }, { label: '所属组织', prop: 'deptName', type: 'cascader' }, { label: '合同编号', prop: 'contractNo', type: 'input' }, diff --git a/src/option/settlement/formalSettlementTable.js b/src/option/settlement/formalSettlementTable.js index 83e9f1f..93393b9 100644 --- a/src/option/settlement/formalSettlementTable.js +++ b/src/option/settlement/formalSettlementTable.js @@ -8,6 +8,8 @@ export const formalSettlementTableColumns = [ { label: '合同编号', prop: 'contractNo', minWidth: 150 }, { label: '合同名称', prop: 'contractName', minWidth: 170 }, { label: '原币结算金额', prop: 'settlementAmount', minWidth: 145, money: true }, + { label: '业务模式', prop: 'businessModelName', minWidth: 120 }, + { label: '运输方式', prop: 'transportTypeName', minWidth: 120 }, { label: '本位币结算金额', prop: 'localSettlementAmount', minWidth: 155, money: true }, { label: '结算汇率', prop: 'exchangeRate', minWidth: 110 }, { label: '申请付款金额(含预付)', prop: 'appliedPaymentAmount', minWidth: 185, money: true }, @@ -19,6 +21,8 @@ export const formalSettlementTableColumns = [ { label: '审核状态', prop: 'approvalStatusName', minWidth: 110, status: true }, { label: '当前节点', prop: 'currentNode', minWidth: 130 }, { label: '当前处理人', prop: 'currentProcessor', minWidth: 130 }, + { label: '调整标识', prop: 'adjustFlag', minWidth: 110 }, + { label: '来源原单号', prop: 'originFormalSettlementNo', minWidth: 170 }, { label: '金蝶单据号', prop: 'kingdeeBillNo', minWidth: 150 }, { label: '金蝶单据状态', prop: 'kingdeeSyncStatus', minWidth: 135 }, { label: '金蝶锁状态', prop: 'kingdeeLockStatus', minWidth: 150 }, @@ -28,15 +32,15 @@ export const formalSettlementTableColumns = [ ]; export const sourceColumns = [ - { label: '预结算单号', prop: 'preSettlementNo', minWidth: 160 }, + { label: '预付结算单号', prop: 'preSettlementNo', minWidth: 160 }, { label: '结算金额', prop: 'settlementAmount', minWidth: 130, money: true }, { label: '申请预付金额', prop: 'advanceAppliedAmount', minWidth: 140, money: true }, { label: '已付款金额', prop: 'advancePaidAmount', minWidth: 130, money: true }, ]; export const detailColumns = [ - { label: '单据号', prop: 'documentNo', minWidth: 180 }, - { label: '运单号', prop: 'waybillNo', minWidth: 160 }, + { label: '单据号', prop: 'documentNo', minWidth: 180, link: true }, + { label: '运单号', prop: 'waybillNo', minWidth: 160, link: true }, { label: '车号', prop: 'vehicleNo', minWidth: 130 }, { label: '发货地址', prop: 'departureAddress', minWidth: 180 }, { label: '到货地址', prop: 'arrivalAddress', minWidth: 180 }, @@ -48,11 +52,11 @@ export const detailColumns = [ { label: '运输总量', prop: 'transportQuantity', minWidth: 120 }, { label: '里程(KM)', prop: 'mileage', minWidth: 120 }, { label: '批次号', prop: 'batchNo', minWidth: 120 }, + { label: '计费方式', prop: 'billingType', minWidth: 130 }, { label: '运输单价', prop: 'unitPrice', minWidth: 120, money: true }, { label: '运费', prop: 'freightAmount', minWidth: 120, money: true }, { label: '调整金额', prop: 'adjustAmount', minWidth: 120, money: true }, { label: '结算金额(含税)', prop: 'settlementAmountTax', minWidth: 155, money: true }, - { label: '结算金额(不含税)', prop: 'settlementAmountNoTax', minWidth: 170, money: true }, { label: '备注', prop: 'remark', minWidth: 180 }, ]; @@ -66,7 +70,7 @@ export const summaryColumns = [ ]; export const candidateColumns = [ - { label: '预结算单号', prop: 'preSettlementNo', minWidth: 170 }, + { label: '预付结算单号', prop: 'preSettlementNo', minWidth: 170 }, { label: '项目名称', prop: 'projectName', minWidth: 140 }, { label: '所属组织', prop: 'deptName', minWidth: 140 }, { label: '合同编号', prop: 'contractNo', minWidth: 150 }, @@ -86,7 +90,7 @@ export const candidateDetailColumns = [ { label: '合同编号', prop: 'contractNo', minWidth: 150 }, { label: '合同名称', prop: 'contractName', minWidth: 170 }, { label: '来源', prop: 'sourceType', minWidth: 110 }, - { label: '预结算单号', prop: 'preSettlementNo', minWidth: 160 }, + { label: '预付结算单号', prop: 'preSettlementNo', minWidth: 160 }, { label: '正式结算单号', prop: 'formalSettlementNo', minWidth: 160 }, { label: '运单号', prop: 'waybillNo', minWidth: 150 }, { label: '车号', prop: 'vehicleNo', minWidth: 130 }, @@ -94,6 +98,7 @@ export const candidateDetailColumns = [ { label: '货物名称', prop: 'cargoName', minWidth: 140 }, { label: '货物类型', prop: 'cargoType', minWidth: 130 }, { label: '批次号', prop: 'batchNo', minWidth: 120 }, + { label: '计费方式', prop: 'billingType', minWidth: 130 }, { label: '应收应付合计', prop: 'totalAmount', minWidth: 140, money: true }, { label: '状态', prop: 'settlementStatusName', minWidth: 110 }, ]; diff --git a/src/option/settlement/preSettlementForm.js b/src/option/settlement/preSettlementForm.js index cace25d..64754ba 100644 --- a/src/option/settlement/preSettlementForm.js +++ b/src/option/settlement/preSettlementForm.js @@ -4,7 +4,7 @@ export const settlementTypeOptions = [ ]; export const preSettlementFormFields = [ - { label: '预结算单号', prop: 'preSettlementNo', readonly: true }, + { label: '预付结算单号', prop: 'preSettlementNo', readonly: true }, { label: '合同名称', prop: 'contractId', type: 'contract', required: true }, { label: '合同编号', prop: 'contractNo', readonly: true }, { label: '项目名称', prop: 'projectName', readonly: true }, @@ -12,6 +12,8 @@ export const preSettlementFormFields = [ { label: '付款方', prop: 'payerName', readonly: true }, { label: '结算类型', prop: 'settlementType', readonly: true }, { label: '结算金额', prop: 'settlementAmount', readonly: true, money: true }, + { label: '业务模式', prop: 'businessModel', type: 'select', optionsKey: 'businessModelOptions' }, + { label: '运输方式', prop: 'transportType', type: 'select', optionsKey: 'transportTypeOptions' }, { label: '汇率日期', prop: 'exchangeRateDate', type: 'date' }, { label: '结算汇率', prop: 'exchangeRate', type: 'number', class: 'exchange-rate-input' }, { label: '本位币合计', prop: 'localSettlementAmount', readonly: true, money: true }, @@ -64,6 +66,8 @@ export const emptyPreSettlementForm = () => ({ settlementType: 'payable', currency: 'RMB', settlementAmount: 0, + businessModel: '', + transportType: '', localCurrency: 'RMB', localSettlementAmount: 0, exchangeRateDate: '', diff --git a/src/option/settlement/preSettlementSearch.js b/src/option/settlement/preSettlementSearch.js index 1165ae9..c270345 100644 --- a/src/option/settlement/preSettlementSearch.js +++ b/src/option/settlement/preSettlementSearch.js @@ -7,7 +7,7 @@ export const approvalStatusOptions = [ ]; export const preSettlementSearchFields = [ - { label: '预结算单号', prop: 'preSettlementNo', type: 'input' }, + { label: '预付结算单号', prop: 'preSettlementNo', type: 'input' }, { label: '预付单号', prop: 'advanceNo', type: 'input' }, { label: '项目名称', prop: 'projectName', type: 'input' }, { label: '所属组织', prop: 'deptName', type: 'cascader' }, diff --git a/src/option/settlement/preSettlementTable.js b/src/option/settlement/preSettlementTable.js index b383b92..b253079 100644 --- a/src/option/settlement/preSettlementTable.js +++ b/src/option/settlement/preSettlementTable.js @@ -1,5 +1,5 @@ export const preSettlementTableColumns = [ - { label: '预结算单号', prop: 'preSettlementNo', minWidth: 150, link: true, fixed: 'left' }, + { label: '预付结算单号', prop: 'preSettlementNo', minWidth: 150, link: true, fixed: 'left' }, { label: '来源', prop: 'sourceType', minWidth: 100 }, { label: '付款方', prop: 'payerName', minWidth: 160 }, { label: '收款方', prop: 'payeeName', minWidth: 160 }, @@ -8,6 +8,8 @@ export const preSettlementTableColumns = [ { label: '合同编号', prop: 'contractNo', minWidth: 140 }, { label: '合同名称', prop: 'contractName', minWidth: 160 }, { label: '原币结算金额', prop: 'settlementAmount', minWidth: 140, money: true, precision: 2 }, + { label: '业务模式', prop: 'businessModelName', minWidth: 120 }, + { label: '运输方式', prop: 'transportTypeName', minWidth: 120 }, { label: '本位币结算金额', prop: 'localSettlementAmount', minWidth: 150, money: true, precision: 2 }, { label: '结算汇率', prop: 'exchangeRate', minWidth: 110, precision: 2 }, { @@ -40,7 +42,7 @@ export const settlementSummaryColumns = [ export const settlementDetailColumns = [ { label: '单据号', prop: 'documentNo', minWidth: 180, link: true }, - { label: '运单号', prop: 'waybillNo', minWidth: 160 }, + { label: '运单号', prop: 'waybillNo', minWidth: 160, link: true }, { label: '车号', prop: 'vehicleNo', minWidth: 130 }, { label: '发货地址', prop: 'departureAddress', minWidth: 180 }, { label: '到货地址', prop: 'arrivalAddress', minWidth: 180 }, @@ -52,6 +54,7 @@ export const settlementDetailColumns = [ { label: '运输总量', prop: 'transportQuantityText', minWidth: 120 }, { label: '里程(KM)', prop: 'mileage', minWidth: 120 }, { label: '批次号', prop: 'batchNo', minWidth: 130 }, + { label: '计费方式', prop: 'billingType', minWidth: 130 }, { label: '运输单价', prop: 'unitPrice', minWidth: 120, money: true }, { label: '运费', prop: 'freightAmount', minWidth: 120, money: true }, { label: '原金额', prop: 'originalAmount', minWidth: 120, money: true }, @@ -94,5 +97,6 @@ export const candidateDetailColumns = [ { label: '货物名称', prop: 'cargoName', minWidth: 140 }, { label: '货物类型', prop: 'cargoType', minWidth: 130 }, { label: '批次号', prop: 'batchNo', minWidth: 120 }, + { label: '计费方式', prop: 'billingType', minWidth: 130 }, { label: '结算金额', prop: 'totalAmount', minWidth: 130, money: true }, ]; diff --git a/src/option/settlement/receivable-payable-detail.js b/src/option/settlement/receivable-payable-detail.js index 29123d0..bdf976d 100644 --- a/src/option/settlement/receivable-payable-detail.js +++ b/src/option/settlement/receivable-payable-detail.js @@ -20,7 +20,7 @@ export const searchFields = [ { label: '货物名称', prop: 'cargoName', type: 'input' }, { label: '合同编号', prop: 'contractNo', type: 'input' }, { label: '合同名称', prop: 'contractName', type: 'input' }, - { label: '预结算单号', prop: 'preSettlementNo', type: 'input' }, + { label: '预付结算单号', prop: 'preSettlementNo', type: 'input' }, { label: '正式结算单号', prop: 'formalSettlementNo', type: 'input' }, { label: '批次号', prop: 'batchNo', type: 'input' }, { label: '车号', prop: 'vehicleNo', type: 'input' }, @@ -35,7 +35,7 @@ export const tableColumns = [ { label: '合同编号', prop: 'contractNo', minWidth: 140 }, { label: '合同名称', prop: 'contractName', minWidth: 140 }, { label: '来源', prop: 'sourceType', minWidth: 110 }, - { label: '预结算单号', prop: 'preSettlementNo', minWidth: 140, link: true }, + { label: '预付结算单号', prop: 'preSettlementNo', minWidth: 140, link: true }, { label: '正式结算单号', prop: 'formalSettlementNo', minWidth: 140, link: true }, { label: '运单号', prop: 'waybillNo', minWidth: 140, link: true }, { label: '车号', prop: 'vehicleNo', minWidth: 120 }, diff --git a/src/option/settlement/settlementAdjustmentTable.js b/src/option/settlement/settlementAdjustmentTable.js index aaaa9fc..4919a1a 100644 --- a/src/option/settlement/settlementAdjustmentTable.js +++ b/src/option/settlement/settlementAdjustmentTable.js @@ -1,6 +1,6 @@ export const settlementAdjustmentTableColumns = [ { label: '单据号', prop: 'adjustmentNo', minWidth: 160, link: true, fixed: 'left' }, - { label: '结算单号', prop: 'formalSettlementNo', minWidth: 160 }, + { label: '结算单号', prop: 'formalSettlementNo', minWidth: 160, link: true }, { label: '结算单类型', prop: 'settlementTypeName', minWidth: 110 }, { label: '项目名称', prop: 'projectName', minWidth: 140 }, { label: '所属组织', prop: 'deptName', minWidth: 140 }, @@ -9,6 +9,8 @@ export const settlementAdjustmentTableColumns = [ { label: '合同名称', prop: 'contractName', minWidth: 170 }, { label: '调整金额', prop: 'adjustmentAmount', minWidth: 130, money: true }, { label: '审核状态', prop: 'approvalStatusName', minWidth: 110, status: true }, + { label: '金蝶单据状态', prop: 'kingdeeSyncStatus', minWidth: 130, kingdee: true }, + { label: '金蝶单据号', prop: 'kingdeeBillNo', minWidth: 150 }, { label: '当前节点', prop: 'currentNode', minWidth: 120 }, { label: '当前处理人', prop: 'currentProcessor', minWidth: 130 }, { label: '创建人', prop: 'createUserName', minWidth: 110 }, diff --git a/src/option/settlement/settlementImport.js b/src/option/settlement/settlementImport.js new file mode 100644 index 0000000..49f4dce --- /dev/null +++ b/src/option/settlement/settlementImport.js @@ -0,0 +1,157 @@ +/** + * 导入结算单列表(avue-crud)配置 + * ------------------------------------------------------------------ + * 列表页与其它模块统一使用 avue-crud,头部 4 个按钮(刷新 / 列显隐 / 搜索显隐 / + * 显示方式)由 avue-crud 自带,不做二次封装。 + * + * ⚠️ searchOrder 为降序排序,值越大越靠前。 + * ⚠️ 仅用于搜索的列必须 hide + showColumn: false,否则会混进「列显隐」抽屉。 + */ + +const IMPORT_STATUS_OPTIONS = [ + { label: '草稿', value: 'draft' }, + { label: '已完成', value: 'completed' }, + { label: '已作废', value: 'voided' }, +]; + +const SETTLEMENT_TYPE_OPTIONS = [ + { label: '应收', value: 'receivable' }, + { label: '应付', value: 'payable' }, +]; + +const textFormatter = (row, value) => + value === null || value === undefined || value === '' ? '-' : value; + +const pickLabel = (options, value) => + options.find(item => item.value === value)?.label || value || '-'; + +const settlementTypeLabel = value => pickLabel(SETTLEMENT_TYPE_OPTIONS, value); + +const billTypeLabel = value => (value === 'pre' ? '预结算单' : value ? '正式结算单' : '-'); + +export const importStatusLabel = value => pickLabel(IMPORT_STATUS_OPTIONS, value); + +export const settlementImportOption = () => ({ + height: 'auto', + calcHeight: 32, + tip: false, + searchBtnText: '查询', + emptyBtnText: '重置', + searchShow: true, + searchIcon: true, + searchLabelWidth: 88, + // 查询/重置紧跟首行 4 个条件(4×5 + 菜单 4 = 24),不再独占下一整行 + searchMenuSpan: 4, + searchIndex: 4, + searchMenuPosition: 'right', + border: true, + index: true, + indexLabel: '序号', + indexWidth: 64, + indexFixed: 'left', + selection: false, + addBtn: false, + viewBtn: false, + delBtn: false, + editBtn: false, + menuWidth: 220, + menuFixed: 'right', + column: [ + // ---------- 搜索项(前 4 项默认展示,其余折叠;searchOrder 越大越靠前) ---------- + { + label: '状态', + prop: 'importStatus', + type: 'select', + search: true, + searchSpan: 5, + searchOrder: 6, + searchPlaceholder: '请选择', + dicData: IMPORT_STATUS_OPTIONS, + hide: true, + showColumn: false, + addDisplay: false, + editDisplay: false, + viewDisplay: false, + }, + { + label: '导入类型', + prop: 'settlementType', + type: 'select', + search: true, + searchSpan: 5, + searchOrder: 5, + searchPlaceholder: '请选择', + dicData: SETTLEMENT_TYPE_OPTIONS, + hide: true, + showColumn: false, + addDisplay: false, + editDisplay: false, + viewDisplay: false, + }, + // ---------- 表格列 ---------- + { + label: '导入批次号', + prop: 'batchNo', + slot: true, + search: true, + searchSpan: 5, + searchOrder: 7, + searchPlaceholder: '请选择', + minWidth: 160, + }, + { label: '状态', prop: 'importStatusName', slot: true, width: 100, align: 'center' }, + { + label: '导入类型', + prop: 'settlementTypeName', + minWidth: 100, + align: 'center', + formatter: (row, value) => value || settlementTypeLabel(row.settlementType), + }, + { + label: '结算单', + prop: 'settlementBillTypeName', + minWidth: 110, + align: 'center', + formatter: (row, value) => value || billTypeLabel(row.settlementBillType), + }, + { + label: '项目', + prop: 'projectName', + search: true, + searchSpan: 5, + searchOrder: 4, + searchPlaceholder: '请输入', + minWidth: 140, + formatter: textFormatter, + }, + { + label: '客户', + prop: 'customerName', + search: true, + searchSpan: 5, + searchOrder: 3, + searchPlaceholder: '请输入', + minWidth: 140, + formatter: textFormatter, + }, + { + label: '承运商', + prop: 'carrierName', + search: true, + searchSpan: 5, + searchOrder: 2, + searchPlaceholder: '请输入', + minWidth: 140, + formatter: textFormatter, + }, + { + label: '明细行数', + prop: 'detailCount', + width: 100, + align: 'center', + formatter: row => row.detailCount ?? row.waybillCount ?? 0, + }, + { label: '创建时间', prop: 'createTime', width: 180, align: 'center', formatter: textFormatter }, + { label: '创建人', prop: 'createUserName', minWidth: 110, formatter: textFormatter }, + ], +}); diff --git a/src/option/settlement/transportReconciliationSearch.js b/src/option/settlement/transportReconciliationSearch.js index 0f1ca83..9852557 100644 --- a/src/option/settlement/transportReconciliationSearch.js +++ b/src/option/settlement/transportReconciliationSearch.js @@ -13,7 +13,7 @@ export const reconciliationStatusOptions = [ export const transportReconciliationSearchFields = [ { prop: 'reconciliationNo', label: '对账单号', type: 'input' }, - { prop: 'preSettlementNos', label: '预结算单号', type: 'input' }, + { prop: 'preSettlementNos', label: '预付结算单号', type: 'input' }, { prop: 'projectName', label: '项目', type: 'input' }, { prop: 'deptName', label: '所属组织', type: 'cascader' }, { prop: 'contractNo', label: '合同编号', type: 'input' }, diff --git a/src/option/system/user.js b/src/option/system/user.js index 93e3152..cd0a0ee 100644 --- a/src/option/system/user.js +++ b/src/option/system/user.js @@ -72,6 +72,7 @@ export const userOption = safe => { }, { label: '岗位', prop: 'postName', overHidden: true, display: false }, { label: '性别', prop: 'sexName', width: 80, display: false }, + { label: 'OA登录名', prop: 'oaLoginId', minWidth: 140, overHidden: true, display: false }, { label: 'OA人员id', prop: 'oaPersonId', minWidth: 120, overHidden: true, display: false }, { label: '备注', prop: 'remark', minWidth: 160, overHidden: true, display: false }, { diff --git a/src/router/page/index.js b/src/router/page/index.js index e2a8ab1..11c3a57 100644 --- a/src/router/page/index.js +++ b/src/router/page/index.js @@ -108,7 +108,7 @@ export default [ }, { path: '/settlement/pre-settlement/public-view', - name: '查看预结算信息', + name: '查看预付结算单信息', component: () => import('@/views/settlement/pre-settlement-public-view.vue'), meta: { keepAlive: false, @@ -119,7 +119,7 @@ export default [ }, { path: '/settlement/formal-settlement/public-view', - name: '查看正式结算信息', + name: '查看结算单信息', component: () => import('@/views/settlement/formal-settlement-public-view.vue'), meta: { keepAlive: false, diff --git a/src/router/views/index.js b/src/router/views/index.js index 11d72aa..6d11ebd 100644 --- a/src/router/views/index.js +++ b/src/router/views/index.js @@ -95,7 +95,7 @@ export default [ children: [ { path: '', - name: '新增编辑预结算', + name: '新增编辑预付结算单', meta: { keepAlive: false, activeMenu: '/settlement/pre-settlement', @@ -110,15 +110,31 @@ export default [ children: [ { path: '', - name: '新增编辑正式结算', + name: '新增编辑结算单', meta: { keepAlive: false, - activeMenu: '/settlement/formal-settlement', + // 付款/收款结算单共用表单页,具体高亮菜单由页面按 settlementType 回写 + activeMenu: '/settlement/payment-settlement', }, component: loadView(() => import('@/views/settlement/formal-settlement-form.vue')), }, ], }, + { + path: '/settlement/settlement-import/form', + component: Layout, + children: [ + { + path: '', + name: '新增导入结算单', + meta: { + keepAlive: false, + activeMenu: '/settlement/settlement-import', + }, + component: loadView(() => import('@/views/settlement/settlement-import-form.vue')), + }, + ], + }, { path: '/settlement/transport-reconciliation/form', component: Layout, diff --git a/src/utils/import-excel.js b/src/utils/import-excel.js index 4d69c81..b6a9093 100644 --- a/src/utils/import-excel.js +++ b/src/utils/import-excel.js @@ -7,7 +7,7 @@ import 'nprogress/nprogress.css'; const excelPattern = /\.(xls|xlsx)$/; /** 是否为浏览器 Blob(含跨 realm 的 Blob-like) */ -const isBlobLike = value => +export const isBlobLike = value => value != null && typeof value === 'object' && typeof value.size === 'number' && @@ -15,14 +15,14 @@ const isBlobLike = value => (typeof value.text === 'function' || typeof value.arrayBuffer === 'function'); /** axios 拦截器已把 JSON Blob 解析成的业务对象 */ -const isBusinessJson = value => +export const isBusinessJson = value => value != null && typeof value === 'object' && !isBlobLike(value) && !(value instanceof ArrayBuffer) && ('code' in value || 'success' in value || 'msg' in value); -const isExcelResponse = res => { +export const isExcelResponse = res => { // 已是业务 JSON(导入成功/失败提示)时,绝不能当失败明细 Excel 处理 if (isBusinessJson(res?.data)) { return false; @@ -54,7 +54,7 @@ const isExcelResponse = res => { * 提前解析成普通对象;此处需同时兼容 Blob / 字符串 / 已解析对象,避免再调 * `blob.text()` 时出现「blob.text is not a function」。 */ -const parseBlobJson = async data => { +export const parseBlobJson = async data => { if (data == null) { return {}; } diff --git a/src/utils/mk-approval.js b/src/utils/mk-approval.js index 60ee800..9e224b2 100644 --- a/src/utils/mk-approval.js +++ b/src/utils/mk-approval.js @@ -23,7 +23,7 @@ export const MK_BIZ = { }, 'pre-settlement': { dictName: '提交预结算审核流', - subjectPrefix: '预结算审批', + subjectPrefix: '预付结算审批', rejected: ['returned'], approved: ['approved'], }, @@ -61,9 +61,18 @@ export const MK_BIZ = { const MK_SWITCH_NAME = '开启MK'; -async function loadMkTemplateList() { +/** 进程内缓存,避免每次提交都打字典;登录后同一会话开关一般不变 */ +let mkEnabledCache = null; +let mkEnabledPromise = null; +let mkTemplateListCache = null; + +async function loadMkTemplateList(force = false) { + if (!force && mkTemplateListCache) { + return mkTemplateListCache; + } const res = await getDictionary({ code: 'mk_template' }); - return res?.data?.data || []; + mkTemplateListCache = res?.data?.data || []; + return mkTemplateListCache; } /** 业务字典 mk_template:名称「开启MK」且键值为 1 时才请求 MK */ @@ -72,10 +81,37 @@ export function isMkEnabled(list = []) { return String(matched?.dictKey ?? '').trim() === '1'; } -/** 加载业务字典并判断是否开启 MK */ -export async function loadMkEnabled() { - const list = await loadMkTemplateList(); - return isMkEnabled(list); +/** 清除 MK 开关缓存(字典变更后可调用) */ +export function clearMkEnabledCache() { + mkEnabledCache = null; + mkEnabledPromise = null; + mkTemplateListCache = null; +} + +/** + * 加载业务字典并判断是否开启 MK + * @param {boolean} [force=false] 是否强制刷新缓存 + */ +export async function loadMkEnabled(force = false) { + if (!force && mkEnabledCache !== null) { + return mkEnabledCache; + } + if (!force && mkEnabledPromise) { + return mkEnabledPromise; + } + mkEnabledPromise = loadMkTemplateList(force) + .then(list => { + mkEnabledCache = isMkEnabled(list); + return mkEnabledCache; + }) + .catch(error => { + mkEnabledCache = false; + throw error; + }) + .finally(() => { + mkEnabledPromise = null; + }); + return mkEnabledPromise; } export async function resolveMkTemplateCode(dictName, list) { @@ -99,19 +135,22 @@ export function isMkApprovedStatus(bizType, approvalStatus) { } /** - * 提交 MK 审核流 + * 提交 MK 审核流。未开启 MK 时直接跳过,不请求流程实例相关接口。 * @param {Object} options * @param {string} options.bizType 业务类型 - * @param {string|number} options.bizId 业务主键(后端据此生成/复用 formInstanceId) + * @param {string|number} options.bizId 业务主键 * @param {string} [options.subjectName] 标题后缀 - * @param {string} [options.approvalStatus] 提交前的审批状态(须在业务 submit 改状态前取值;通过态强制新建实例) + * @param {string} [options.approvalStatus] 提交前的审批状态 + * @param {boolean} [options.mkEnabled] 调用方已知开关时传入,false 时立即跳过 + * @returns {Promise} true=已发起/复用 MK 流程,false=未开启或已跳过 */ export async function submitMkApprovalFlow({ bizType, bizId, subjectName = '', approvalStatus = '', -}) { + mkEnabled, +} = {}) { const conf = MK_BIZ[bizType]; if (!conf) { return Promise.reject(new Error(`不支持的MK业务类型:${bizType}`)); @@ -119,17 +158,29 @@ export async function submitMkApprovalFlow({ if (bizId == null || bizId === '') { return Promise.reject(new Error('业务id不能为空')); } + + // 调用方显式关闭,或字典未开启:不请求 hasMkProcessInstance / processSubmit 等 MK 接口 + if (mkEnabled === false) { + return false; + } + const enabled = mkEnabled === true ? true : await loadMkEnabled(); + if (!enabled) { + return false; + } + const list = await loadMkTemplateList(); if (!isMkEnabled(list)) { - return; + mkEnabledCache = false; + return false; } + const bizIdText = String(bizId); const forceNewFormInstance = isMkApprovedStatus(bizType, approvalStatus); // 审核通过后再提交必须新建流程;其余场景已有有效实例则跳过 if (!forceNewFormInstance) { const existsRes = await hasMkProcessInstance({ bizId: bizIdText }); if (existsRes?.data?.data) { - return; + return true; } } if ((conf.rejected || []).includes(approvalStatus)) { @@ -139,11 +190,12 @@ export async function submitMkApprovalFlow({ const subject = subjectName ? `${conf.subjectPrefix}:${subjectName}` : `${conf.subjectPrefix}:${bizIdText}`; - return processSubmit({ + await processSubmit({ templateCode, bizId: bizIdText, subject, bizType, forceNewFormInstance, }); + return true; } diff --git a/src/utils/search-range.js b/src/utils/search-range.js index e5723cd..34865bb 100644 --- a/src/utils/search-range.js +++ b/src/utils/search-range.js @@ -1,3 +1,35 @@ +/** + * 合并列表搜索条件:新条件覆盖旧条件,本次显式清空的字段从查询中移除。 + */ +export const applyIncomingSearch = (current = {}, incoming = {}) => { + const merged = { ...current, ...incoming }; + Object.keys(incoming || {}).forEach(key => { + const value = incoming[key]; + if ( + value === '' || + value === null || + value === undefined || + (Array.isArray(value) && value.length === 0) + ) { + delete merged[key]; + } + }); + return merged; +}; + +/** + * 启停状态下拉「全部」在数字类型下会被转成 0/-1,不能当作查询条件。 + * 状态 0 表示草稿等有效值的页面不要调用。 + */ +export const omitInvalidListStatus = (params = {}) => { + const values = { ...params }; + const status = values.status; + if (status === 0 || status === '0' || status === -1 || status === '-1') { + delete values.status; + } + return values; +}; + export const normalizeSearchRangeParams = (params = {}, rangeMap = {}) => { const values = { ...params }; diff --git a/src/utils/settlement-adjust-rule.js b/src/utils/settlement-adjust-rule.js new file mode 100644 index 0000000..7d58540 --- /dev/null +++ b/src/utils/settlement-adjust-rule.js @@ -0,0 +1,47 @@ +export function isFreightFeeName(name) { + const text = String(name || ''); + return text.includes('运费') || text.includes('运输费'); +} + +function parseBillingRules(row = {}) { + const rule = row.billingRule || {}; + const nested = Array.isArray(rule.rules) ? rule.rules : []; + if (nested.length) return nested; + const raw = row.billingRulesJson ?? row.billingRules; + if (Array.isArray(raw)) return raw.filter(item => item && typeof item === 'object'); + if (typeof raw === 'string' && raw.trim()) { + try { + const parsed = JSON.parse(raw); + return Array.isArray(parsed) ? parsed.filter(item => item && typeof item === 'object') : []; + } catch (error) { + return []; + } + } + return []; +} + +/** 运输单价对应的运费计费类型。 */ +export function freightBillingType(row = {}) { + const rule = row.billingRule || {}; + const rules = parseBillingRules(row); + const freightRule = rules.find( + item => isFreightFeeName(item?.feeItem) || isFreightFeeName(item?.feeType) + ); + return freightRule?.billingType || row.billingType || rule.billingType || ''; +} + +export function isTierUnitPrice(row) { + return freightBillingType(row) === '阶梯单价'; +} + +export function isIntervalBilling(row) { + const type = freightBillingType(row); + return type === '区间单价' || (type.includes('区间') && type.includes('一口价')); +} + +/** 阶梯单价、区间单价、区间一口价的运输单价不开放手工调整。 */ +export function isUnitPriceAdjustable(row) { + const type = freightBillingType(row); + if (!type) return true; + return !isTierUnitPrice(row) && !isIntervalBilling(row); +} diff --git a/src/utils/settlement-change-record.js b/src/utils/settlement-change-record.js new file mode 100644 index 0000000..b59b1dc --- /dev/null +++ b/src/utils/settlement-change-record.js @@ -0,0 +1,6 @@ +/** 审批通过、驳回等审批流转类变更内容,不在结算单变更记录中展示。 */ +export function isApprovalSettlementChange(content) { + const text = String(content || '').trim(); + if (!text) return false; + return text.includes('审批通过') || text.includes('审批驳回') || text === '已驳回'; +} diff --git a/src/utils/settlement-detail-link.js b/src/utils/settlement-detail-link.js new file mode 100644 index 0000000..d218711 --- /dev/null +++ b/src/utils/settlement-detail-link.js @@ -0,0 +1,51 @@ +import { getList as getReceivablePayableDetailList } from '@/api/settlement/receivable-payable-detail'; +import { getList as getWaybillList } from '@/api/business/waybill-manage'; + +// 结算明细的「单据号」是应收应付明细单据号(应收 YS…/应付 YF…),按结算类型落到对应菜单页 +const SETTLEMENT_DETAIL_PATHS = { + receivable: '/settlement/receivable-detail', + payable: '/settlement/payable-detail', +}; + +const unwrapPage = response => { + const body = response?.data || response || {}; + return body?.data || body; +}; + +const firstRecordId = data => (Array.isArray(data) ? data : data?.records || [])[0]?.id || ''; + +export const settlementDetailPath = settlementType => + SETTLEMENT_DETAIL_PATHS[settlementType] || SETTLEMENT_DETAIL_PATHS.payable; + +/** + * 结算明细行「单据号」对应的应收应付明细ID:已落库的明细自带 sourceDetailId,未落库的行按单据号回查。 + */ +export const resolveReceivablePayableDetailId = async (row = {}, settlementType) => { + if (row.sourceDetailId) return row.sourceDetailId; + if (!row.documentNo) return ''; + try { + const data = unwrapPage( + await getReceivablePayableDetailList(1, 1, { + documentNo: row.documentNo, + settlementType, + }) + ); + return firstRecordId(data); + } catch (error) { + return ''; + } +}; + +/** + * 结算明细行「运单号」对应的运单ID:总单来源的明细没有 waybillId(运单号列存的是总单号),按运单号回查。 + */ +export const resolveWaybillId = async (row = {}) => { + if (row.waybillId) return row.waybillId; + if (!row.waybillNo) return ''; + try { + const data = unwrapPage(await getWaybillList(1, 1, { waybillNo: row.waybillNo })); + return firstRecordId(data); + } catch (error) { + return ''; + } +}; diff --git a/src/utils/settlement-menu.js b/src/utils/settlement-menu.js new file mode 100644 index 0000000..86413c0 --- /dev/null +++ b/src/utils/settlement-menu.js @@ -0,0 +1,39 @@ +/** 结算菜单拆分后的展示名与权限前缀 */ + +export const SETTLEMENT_TYPE_PAYABLE = 'payable'; +export const SETTLEMENT_TYPE_RECEIVABLE = 'receivable'; + +export function settlementBillLabel(settlementType) { + return settlementType === SETTLEMENT_TYPE_RECEIVABLE ? '收款结算单' : '付款结算单'; +} + +export function settlementPermissionPrefix(settlementType) { + return settlementType === SETTLEMENT_TYPE_RECEIVABLE + ? 'receipt_settlement' + : 'payment_settlement'; +} + +export function settlementListPath(settlementType) { + return settlementType === SETTLEMENT_TYPE_RECEIVABLE + ? '/settlement/receipt-settlement' + : '/settlement/payment-settlement'; +} + +/** + * 权限判断:优先新菜单码,兼容旧 formal_settlement_*。 + * @param {Object} ctx 组件实例(需含 permission、isAdmin、validData) + * @param {string} settlementType payable|receivable + * @param {string} action add|edit|view... + */ +export function hasSettlementPermission(ctx, settlementType, action) { + if (ctx?.isAdmin) return true; + const prefix = settlementPermissionPrefix(settlementType); + const codes = [`${prefix}_${action}`, `formal_settlement_${action}`]; + return codes.some(code => { + const value = ctx?.permission?.[code]; + if (typeof ctx?.validData === 'function') { + return ctx.validData(value, false); + } + return value === true; + }); +} diff --git a/src/utils/settlementStatus.js b/src/utils/settlementStatus.js new file mode 100644 index 0000000..4fdf2ec --- /dev/null +++ b/src/utils/settlementStatus.js @@ -0,0 +1,23 @@ +/** + * 结算单预付记录单据状态名(预结算编辑器与正式结算编辑器共用,避免两页状态名不一致) + */ +export function settlementStatusName(status, displayValue) { + const labels = { + reviewing: '审批中', + approved: '审批通过', + paid: '已付款', + returned: '已驳回', + voided: '已作废', + draft: '草稿', + }; + const name = labels[status]; + if (name) return name; + return typeof displayValue === 'function' ? displayValue(status) : status || '-'; +} + +/** + * 统一预付付款记录类型名 + */ +export function settlementRecordTypeName(recordType) { + return { progress_advance: '进度预付', project_advance: '项目预付核销' }[recordType] || ''; +} diff --git a/src/views/base/airport-master.vue b/src/views/base/airport-master.vue index 3c94260..9969378 100644 --- a/src/views/base/airport-master.vue +++ b/src/views/base/airport-master.vue @@ -150,6 +150,7 @@ import { mapGetters } from 'vuex'; import { downloadXls } from '@/utils/util'; import { openImportDialog } from '@/utils/import-excel'; import { formatUpdateUserName } from '@/utils/audit'; +import { omitInvalidListStatus } from '@/utils/search-range'; import { getToken, isAdministrator } from '@/utils/auth'; import { getCoordinateValidationMessage, normalizeCoordinateInput } from '@/utils/coordinate'; import AddressMapPicker from '@/components/address-map-picker/main.vue'; @@ -1182,7 +1183,7 @@ export default { }, onLoad(page, params = {}) { this.loading = true; - getList(page.currentPage, page.pageSize, { ...params, ...this.query }) + getList(page.currentPage, page.pageSize, omitInvalidListStatus({ ...params, ...this.query })) .then(res => { const data = res.data.data; this.page.total = data.total; diff --git a/src/views/base/currency.vue b/src/views/base/currency.vue index 0ad39fe..903fae0 100644 --- a/src/views/base/currency.vue +++ b/src/views/base/currency.vue @@ -104,6 +104,7 @@ import { mapGetters } from 'vuex'; import { downloadXls } from '@/utils/util'; import { openImportDialog } from '@/utils/import-excel'; import { formatUpdateUserName } from '@/utils/audit'; +import { omitInvalidListStatus } from '@/utils/search-range'; import { getToken } from '@/utils/auth'; import NProgress from 'nprogress'; import 'nprogress/nprogress.css'; @@ -507,7 +508,7 @@ export default { this.onLoad(this.page, this.query); }, buildQuery(params = {}) { - const values = { ...params, ...this.query }; + const values = omitInvalidListStatus({ ...params, ...this.query }); const rangeMap = { effectiveDateRange: ['effectiveDateStart', 'effectiveDateEnd'], expiryDateRange: ['expiryDateStart', 'expiryDateEnd'], diff --git a/src/views/base/customer-type.vue b/src/views/base/customer-type.vue index fb68968..6653a85 100644 --- a/src/views/base/customer-type.vue +++ b/src/views/base/customer-type.vue @@ -63,6 +63,7 @@ diff --git a/src/views/business/contract-manage.vue b/src/views/business/contract-manage.vue index 4ce63ba..de25000 100644 --- a/src/views/business/contract-manage.vue +++ b/src/views/business/contract-manage.vue @@ -413,17 +413,15 @@ /> - + @@ -687,7 +685,12 @@ 账单导入生成 - 添加 + 添加 @@ -1313,7 +1316,23 @@ export default { { label: '已到期', value: 'expired', statKey: 'expired' }, ], form: defaultForm(), + contractNoManual: false, formRules: { + contractNo: [ + { + validator: (rule, value, callback) => { + const contractNo = String(value || '').trim(); + if (this.formMode === 'edit' && !contractNo) { + return callback(new Error('请输入合同编号')); + } + if (contractNo.length > 100) { + return callback(new Error('合同编号不能超过100个字符')); + } + callback(); + }, + trigger: 'blur', + }, + ], contractName: [{ required: true, message: '请输入合同名称', trigger: 'blur' }], contractCategory: [{ required: true, message: '请选择合同类别', trigger: 'change' }], signType: [{ required: true, message: '请选择签约类型', trigger: 'change' }], @@ -1936,6 +1955,7 @@ export default { this.api.getDetail(id).then(res => this.applyDetail(res.data?.data || {})); }, resetFormState() { + this.contractNoManual = false; this.form = { ...defaultForm(), handlerUserName: @@ -2011,7 +2031,20 @@ export default { this.$router.$avueRouter?.closeTag?.(); this.$router.push(contractManageListRoute); }, + validateContractNo() { + const contractNo = String(this.form.contractNo || '').trim(); + if (this.formMode === 'edit' && !contractNo) { + this.$message.warning('请输入合同编号'); + return false; + } + if (contractNo.length > 100) { + this.$message.warning('合同编号不能超过100个字符'); + return false; + } + return true; + }, validateBase(action) { + if (!this.validateContractNo()) return false; if (action === 'temporary') { const required = [ ['signType', '签约类型'], @@ -2097,6 +2130,7 @@ export default { const projectName = projectId ? normalizeProjectValue(this.form.projectName) : ''; return { ...this.form, + contractNo: String(this.form.contractNo || '').trim(), projectId, projectName, copyCount: normalizeOptionalInteger(this.form.copyCount), @@ -2145,7 +2179,9 @@ export default { bizType: 'contract-manage', bizId: id, subjectName: saved.contractName || submit.contractName || '', - approvalStatus: previousApprovalStatus || saved.approvalStatus || submit.approvalStatus || '', + approvalStatus: + previousApprovalStatus || saved.approvalStatus || submit.approvalStatus || '', + mkEnabled: this.mkEnabled, }) ); } @@ -2184,6 +2220,7 @@ export default { bizId: payload.id || this.form.id, subjectName: payload.contractName || this.form.contractName || '', approvalStatus: this.form.approvalStatus || 'change_rejected', + mkEnabled: this.mkEnabled, }).then(() => { this.$message.success('已重新提交变更审批'); this.closeForm(); @@ -2507,11 +2544,14 @@ export default { this.refreshPreviewContractNo(); } }, + handleContractNoInput(value) { + this.contractNoManual = String(value || '').trim() !== ''; + }, refreshPreviewContractNo() { if (this.formMode !== 'add') return; const organizationId = this.form.organizationId; if (!organizationId) { - this.form.contractNo = ''; + if (!this.contractNoManual) this.form.contractNo = ''; return; } const requestId = (this.contractNoPreviewRequestId = @@ -2519,11 +2559,11 @@ export default { api .nextContractNo(organizationId) .then(res => { - if (requestId !== this.contractNoPreviewRequestId) return; + if (requestId !== this.contractNoPreviewRequestId || this.contractNoManual) return; this.form.contractNo = res.data?.data || ''; }) .catch(() => { - if (requestId !== this.contractNoPreviewRequestId) return; + if (requestId !== this.contractNoPreviewRequestId || this.contractNoManual) return; this.form.contractNo = ''; }); }, @@ -2956,6 +2996,7 @@ export default { }, getContractChangeFieldLabel(field) { const labels = { + contractNo: '合同编号', contractName: '合同名称', partyB: '乙方', startDate: '开始日期', @@ -3202,6 +3243,7 @@ export default { bizId: row.id, subjectName: row.contractName || '', approvalStatus: row.approvalStatus || '', + mkEnabled: this.mkEnabled, }) ) : request(); @@ -3578,7 +3620,7 @@ export default { :deep(.el-form-item) { align-items: center; - margin-bottom: 24px; + //margin-bottom: 24px; } :deep(.el-form-item__label) { diff --git a/src/views/business/master-order.vue b/src/views/business/master-order.vue index 225ed98..7be51d6 100644 --- a/src/views/business/master-order.vue +++ b/src/views/business/master-order.vue @@ -79,7 +79,7 @@

{{ timeRange(row) }}

{{ goodsSummary(row) }}

创建人:{{ row.createUserName || '-' }}

-

创建时间:{{ row.createTime || '-' }}

+

创建时间:{{ formatDate(row.createTime) }}

@@ -155,6 +155,7 @@ diff --git a/src/views/settlement/components/pre-settlement-editor.vue b/src/views/settlement/components/pre-settlement-editor.vue index 7a63786..84317bb 100644 --- a/src/views/settlement/components/pre-settlement-editor.vue +++ b/src/views/settlement/components/pre-settlement-editor.vue @@ -16,11 +16,11 @@ class="pre-settlement-editor__form" > - + @@ -50,9 +50,26 @@ :min="0" :precision="2" :controls="false" - :disabled="!editable || form.currency === 'RMB'" + :disabled="!editable" @change="recalculateLocalAmount" /> + + + + + {{ formSelectLabel(field, form[field.prop]) }} + {{ settlementTypeName }} - + {{ form.preSettlementNo || (!form.id ? '系统自动生成' : '-') }} @@ -243,60 +264,68 @@ :index="detailIndexMethod" /> + - - - @@ -421,6 +450,16 @@
+ + @@ -453,7 +492,7 @@ - + {{ displayValue(row[column.prop]) }} + + + @@ -747,20 +791,6 @@ - - -