diff --git a/.workbuddy/memory/2026-07-27.md b/.workbuddy/memory/2026-07-27.md new file mode 100644 index 0000000..ac773f2 --- /dev/null +++ b/.workbuddy/memory/2026-07-27.md @@ -0,0 +1,46 @@ +# 2026-07-27 工作日志 + +## 开发环境启动与登录排查 + +- 终止了遗留的 2888 端口 dev server 进程,清理端口占用。 +- 将 `.env.development` 的 `VITE_APP_API` 从 `http://172.16.203.228:8000/api` 改为 `/api`,让前端请求走 Vite 代理。 +- 将 `vite.config.mjs` 的 `/api` 代理 target 从 `http://localhost` 改为 `http://172.16.203.228:8000`,并去掉 `rewrite`(后端接口本身就在 `/api` 前缀下,不能去掉)。 +- 修复后发现登录无响应的根因:后端 CORS 返回 `Access-Control-Allow-Origin: *`,与 axios `withCredentials: true` 冲突,浏览器拦截所有跨域请求;走 Vite 代理后同源,CORS 问题消失。 +- 启动 dev server 于 `http://localhost:2888`。 +- 使用 agent-browser(系统 Chrome)打开登录页,填入账号 `admin` / 密码 `admin`,成功触发行为验证码弹窗。 +- 行为验证码(滑块/拼图)需人工在浏览器窗口完成。 + +## 货物类型导入模板模拟数据 + +- 模板:`/Users/gxwebsoft/Downloads/货物类型导入模板.xlsx`,单 Sheet「货物类型导入模板」,表头 6 列:类型(必填)、上级货物类型、上级货物类型编码、货物类型(必填)、货物类型编码(必填)、备注。一级类型上级字段留空。 +- 在 `/Users/gxwebsoft/Downloads/货物类型导入模板_模拟数据.xlsx` 生成 5 条模拟数据(2 条一级 + 3 条二级,演示层级)。原模板保持不变。 + +## 货物类型模块(/base/cargo-type)按需求完善 + +- 需求:新增默认二级;类型/上级/编码在编辑查看禁编辑;一级隐藏上级字段、二级显示;同上级名称唯一 + 编码全局唯一交后端;提交失败展示后端提示。 +- 抽出 `src/option/base/cargo-type.js`,导出工厂 `getCargoTypeOption(ctx)`,依赖组件的校验/change 通过 `ctx` 闭包访问(`ctx.form`、`ctx.handleTypeLevelChange` 等),避免 Option API 写死 this。 +- `cargo-type.vue` 改动:import 该 option;新增默认 `typeLevel:2`;`beforeOpen` 设置 `dialogType`(add/edit/view);上级下拉框 `:disabled="dialogType!=='add' || typeLevel!==2"`;列配置加 `editDisabled:true`(类型/编码/上级编码)控制编辑禁用;view 模式 Avue 自动禁用其余字段。 +- 提交失败处理:axios 拦截器已对非 200 弹 `ElMessage`(后端 msg),故 rowSave/rowUpdate 的 error 仅 `loading()`,不再 console/重复 toast。 +- 导入失败明细下载已合规:`src/utils/import-excel.js` 的 `handleImportExcel` 已实现 content-type 区分 JSON/Excel、失败下载 `货物类型导入失败明细时间.xlsx`、错误提示;businessName='货物类型'。 +- 注意:导入/下载模板由后端 `/blade-system/cargo-type/import-cargo-type`、`/export-template` 控制,前端模板列名由后端决定,需后端保证与需求卡字段一致。 + +## 货物类型批量导入失败排查(19:12) + +- 失败明细 `货物类型导入失败明细2026-07-27 19_12_24.xlsx`:5 条全部「请选择货物类型级别」。 +- 根因(数据问题,非前端代码):模拟数据「类型」列误填为业务分类 `普通货物/冷链货物`,但需求卡 REQ-CARGO-007/008 规定「类型」是**货物类型级别**,仅允许填 `一级货物类型`/`二级货物类型`;且编码误用字母(`GOODS-ELEC-001`),违反 REQ-CARGO-006「一级 2 位数字、二级 4 位数字」。 +- 已重造 `货物类型导入模板_模拟数据.xlsx`:类型改为一级/二级;编码改为纯数字(01/02 一级,0101/0102/0201 二级继承父级前 2 位)。 +- 风险:二级行依赖一级行已存在,若后端按 DB 校验而非按文件顺序处理,二级行可能报「请选择上级货物类型」,建议先导入 2 条一级、再导入 3 条二级。 + +## 货物类型导入失败复查(23:27) + +- 第二版失败明细 `货物类型导入失败明细2026-07-27 19_17_21.xlsx`:类型已正确,但一级报「货物类型编码格式不正确」、二级报「请选择上级货物类型」。 +- 根因:编码列被存成**数字(int)**,前导零丢失('01'→1、'0101'→101),一级编码非 2 位、二级非 4 位;一级失败未入库 → 二级找不到上级。 +- 修复:写入时强制 C/E 列 `number_format='@'`(文本)保留前导零;编码 '01'/'02'、'0101'/'0102'/'0201'。 +- 为消除级联风险,拆成两个文件:货物类型导入_一级.xlsx(2条)、货物类型导入_二级.xlsx(3条),先导入一级再导入二级确保成功。 + +## 货物类型导入第三次复查(23:30) + +- 第三版失败明细:一级导入也失败,报「该货物类型编码已存在」(01/02 已被占用)。根因:01/02 极可能是用户此前测试新增功能时手动建的,导入撞车;失败导入不写库,说明编码 pre-exist。 +- 同期发现 2888 dev server 进程退出(lsof 无监听),导致 Vite 代理对 localhost:2888 全返回 502(含根路径)。已重启 `pnpm dev`(端口 2888,proxy target 172.16.203.228:8000),代理恢复 200。后端直连一直正常。 +- 改用新编码重造:一级 11/12(电子产品/生鲜食品),二级 1101/1102(父11)、1201(父12),文本格式保留前导零。三份文件(一级/二级/合并)已更新。 +- 结论:导入功能本身 OK,问题一直是造数(类型值、编码格式、编码冲突)+ dev server 偶发退出。建议导入前确认 dev server 在跑。 diff --git a/package.json b/package.json index 4d4f4f2..0123244 100644 --- a/package.json +++ b/package.json @@ -9,21 +9,22 @@ "serve": "vite preview --host" }, "dependencies": { - "element-plus": "^2.14.2", "@element-plus/icons-vue": "^2.3.1", "@open-file-viewer/core": "^0.1.27", "@open-file-viewer/vue": "^0.1.27", - "@smallwei/avue": "~3.9.2", - "avue-plugin-ueditor": "^1.0.4", "@saber/nf-design-base-elp": "^1.3.0", "@saber/nf-form-design-elp": "^1.6.1", "@saber/nf-form-elp": "^1.6.3", + "@smallwei/avue": "~3.9.2", "animate.css": "^4.1.1", + "avue-plugin-ueditor": "^1.0.4", "axios": "^1.13.5", "codemirror": "^5.65.21", "crypto-js": "^4.1.1", "dayjs": "^1.10.6", "disable-devtool": "^0.3.8", + "element-plus": "^2.14.2", + "exceljs": "^4.4.0", "highlight.js": "^11.9.0", "js-base64": "^3.7.4", "js-cookie": "^3.0.0", @@ -40,8 +41,8 @@ "devDependencies": { "@vitejs/plugin-vue": "^5.2.4", "@vue/compiler-sfc": "^3.4.27", - "sass": "^1.85.1", "prettier": "^2.8.7", + "sass": "^1.85.1", "terser": "^5.31.1", "unplugin-auto-import": "^0.11.2", "vite": "^5.4.19", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 886ef6b..61aeeab 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -53,6 +53,9 @@ importers: element-plus: specifier: ^2.14.2 version: 2.14.2(vue@3.5.34) + exceljs: + specifier: ^4.4.0 + version: 4.4.0 highlight.js: specifier: ^11.9.0 version: 11.11.1 @@ -305,6 +308,12 @@ packages: cpu: [x64] os: [win32] + '@fast-csv/format@4.3.5': + resolution: {integrity: sha512-8iRn6QF3I8Ak78lNAa+Gdl5MJJBM5vRHivFtMRUWINdevNo00K7OXxS2PshawLKTejVwieIlPmK5YlLu6w4u8A==} + + '@fast-csv/parse@4.3.6': + resolution: {integrity: sha512-uRsLYksqpbDmWaSmzvJcuApSEe38+6NQZBUsuAyMZKqHxH0g1wcJgsKUvN3WC8tewaqFjBMMGrkHmC+T7k8LvA==} + '@floating-ui/core@1.7.5': resolution: {integrity: sha512-1Ih4WTWyw0+lKyFMcBHGbb5U5FtuHJuujoyyr5zTaWS5EYMeT6Jb2AuDeftsCsEuchO+mM2ij5+q9crhydzLhQ==} @@ -735,6 +744,9 @@ packages: '@types/lodash@4.17.24': resolution: {integrity: sha512-gIW7lQLZbue7lRSWEFql49QJJWThrTFFeIMJdp3eH4tKoxm1OvEPg02rm4wCCSHS0cL3/Fizimb35b7k8atwsQ==} + '@types/node@14.18.63': + resolution: {integrity: sha512-fAtCfv4jJg+ExtXhvCkCqUKZ+4ok/JQk01qDKhL5BDDoS3AxKXhV5/MAVUZyQnSEd2GT92fkgZl0pz0Q0AzcIQ==} + '@types/trusted-types@2.0.7': resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} @@ -1000,12 +1012,27 @@ packages: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} + archiver-utils@2.1.0: + resolution: {integrity: sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==} + engines: {node: '>= 6'} + + archiver-utils@3.0.4: + resolution: {integrity: sha512-KVgf4XQVrTjhyWmx6cte4RxonPLR9onExufI1jhvw/MQ4BB6IsZD5gT8Lq+u/+pRkWna/6JoHpiQioaqFP5Rzw==} + engines: {node: '>= 10'} + + archiver@5.3.2: + resolution: {integrity: sha512-+25nxyyznAXF7Nef3y0EbBeqmGZgeN/BxHX29Rs39djAfaFalmQ89SE6CWyDCHzGL0yt/ycBtNOmGTW0FyGWNw==} + engines: {node: '>= 10'} + argparse@1.0.10: resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} async-validator@4.2.5: resolution: {integrity: sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==} + async@3.2.6: + resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} + asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} @@ -1021,9 +1048,22 @@ packages: axios@1.16.0: resolution: {integrity: sha512-6hp5CwvTPlN2A31g5dxnwAX0orzM7pmCRDLnZSX772mv8WDqICwFjowHuPs04Mc8deIld1+ejhtaMn5vp6b+1w==} + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + big-integer@1.6.52: + resolution: {integrity: sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==} + engines: {node: '>=0.6'} + + binary@0.3.0: + resolution: {integrity: sha512-D4H1y5KYwpJgK8wk1Cue5LLPgmwHKYSChkbspQg5JtVuR5ulGckxfR62H3AE9UDkdMC8yyXlqYihuz3Aqg2XZg==} + + bl@4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + bluebird@3.4.7: resolution: {integrity: sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA==} @@ -1033,13 +1073,33 @@ packages: bpmn-moddle@8.1.0: resolution: {integrity: sha512-yI5OAFfYVJwViKTsTsonVfCBPtB3MlefADUORwNIxxBOMp21vnoxuxsdgUWlPH/dvAEZh/+mr8UtqOBNu8NC5Q==} + brace-expansion@1.1.16: + resolution: {integrity: sha512-IDw48K2/2kRkg9LdJxurvq3lV3aBgq0REY89duEqFRthjlPdXHKMj7EnQOXVckxzgisinf3nHfrcE2FufFLXMw==} + + brace-expansion@2.1.2: + resolution: {integrity: sha512-w5JZcKgdhDOgOwm8H+KgbosopHMuGcl6qbulwjtz3SM7I7P3yW1eAjzMPLrIE+NQ9vjgANKHWeMHnrT0OXW1oA==} + braces@3.0.3: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} + buffer-crc32@0.2.13: + resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} + buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + buffer-indexof-polyfill@1.0.2: + resolution: {integrity: sha512-I7wzHwA3t1/lwXQh+A5PbNvJxgfo5r3xulgpYDB5zckTu/Z9oUK9biouBKQUjEqzaz3HnAT6TYoovmE+GqSf7A==} + engines: {node: '>=0.10'} + + buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + + buffers@0.1.1: + resolution: {integrity: sha512-9q/rDEGSb/Qsvv2qvzIzdluL5k7AaJOTrw23z9reQthrbF7is4CtlT0DXyO1oei2DCp4uojjzQ7igaSHp1kAEQ==} + engines: {node: '>=0.2.0'} + but-unzip@0.1.10: resolution: {integrity: sha512-hLfQ9WlUimmv/okzsRl6AYG3Ew5HNWhWgUslSR93FsDdeL0MAoQvmC/BJfs35lqEAO5t/QD7Y4vCFcPJtijt3A==} @@ -1051,6 +1111,9 @@ packages: resolution: {integrity: sha512-KfdUZsSOw19/ObEWasvBP/Ac4reZvAGauZhs6S/gqNhXhI7cKwvlH7ulj+dOEYnca4bm4SGo8C1bTAQvnTjgQA==} engines: {node: '>=0.8'} + chainsaw@0.1.0: + resolution: {integrity: sha512-75kWfWt6MEKNC8xYXIdRpDehRYY/tNSgwKaJq+dbbDcxORuVrrQ+SEHoWsniVn9XPYfP4gmdWIeDk/4YNp1rNQ==} + chalk@4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} @@ -1094,12 +1157,19 @@ packages: component-event@0.2.1: resolution: {integrity: sha512-wGA++isMqiDq1jPYeyv2as/Bt/u+3iLW0rEa+8NQ82jAv3TgqMiCM+B2SaBdn2DfLilLjjq736YcezihRYhfxw==} + compress-commons@4.1.2: + resolution: {integrity: sha512-D3uMHtGc/fcO1Gt1/L7i1e33VOvD4A9hfQLP+6ewd+BvG/gQ84Yh4oftEhAdjSMgBgwGL+jsppT7JYNpo6MHHg==} + engines: {node: '>= 10'} + compute-scroll-into-view@1.0.20: resolution: {integrity: sha512-UCB0ioiyj8CRjtrvaceBLqqhZCVP+1B8+NWQhmdsm0VXOJtobBCf1dBQmebCCo34qZmUwZfIH2MZLqNHazrfjg==} compute-scroll-into-view@3.1.1: resolution: {integrity: sha512-VRhuHOLoKYOy4UbilLbUzbYg93XLjv2PncJC50EuTWPA3gaja1UjBsUP/D/9/juV3vQFr6XBEzn9KCAHdUvOHw==} + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + concat-stream@2.0.0: resolution: {integrity: sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==} engines: {'0': node >= 6.0} @@ -1121,6 +1191,10 @@ packages: engines: {node: '>=0.8'} hasBin: true + crc32-stream@4.0.3: + resolution: {integrity: sha512-NT7w2JVU7DFroFdYkeq8cywxrgjPHWkdX1wjpRQXPX5Asews3tA+Ght6lddQO5Mkumffp3X7GEqku3epj2toIw==} + engines: {node: '>= 10'} + crypto-js@4.2.0: resolution: {integrity: sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==} @@ -1193,6 +1267,9 @@ packages: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} + duplexer2@0.1.4: + resolution: {integrity: sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==} + echarts@6.1.0: resolution: {integrity: sha512-q0yaFPggC9FUdsWH4blavRWFmxdrIodbkoKNAjJudAI6CA9gNPxHtV2RcZNEepZVlk4yvBYkOkbk6HIVpIyHZA==} @@ -1201,6 +1278,9 @@ packages: peerDependencies: vue: ^3.3.7 + end-of-stream@1.4.5: + resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} + entities@7.0.1: resolution: {integrity: sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==} engines: {node: '>=0.12'} @@ -1251,9 +1331,17 @@ packages: event-emitter@0.3.5: resolution: {integrity: sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==} + exceljs@4.4.0: + resolution: {integrity: sha512-XctvKaEMaj1Ii9oDOqbW/6e1gXknSY4g/aLCDicOXqBE4M0nRWkUu0PTp++UPNzoFY12BNHMfs/VadKIS6llvg==} + engines: {node: '>=8.3.0'} + ext@1.7.0: resolution: {integrity: sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==} + fast-csv@4.3.6: + resolution: {integrity: sha512-2RNSpuwwsJGP0frGsOmTb9oUF+VkFSM4SyLTDgwf2ciHWTarN0lQTC+F2f/t5J9QjW+c65VFIAAu85GsvMIusw==} + engines: {node: '>=10.0.0'} + fast-glob@3.3.3: resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} engines: {node: '>=8.6.0'} @@ -1282,15 +1370,26 @@ packages: resolution: {integrity: sha512-w/XBfkibaTl3YDqASwfDUqkna4Z2p9cFSr1aHDt0WoMTECnRfBOv2WArlZILlqgWlmdIlALXGpM2AOhEk5W3IA==} engines: {node: '>=0.8'} + fs-constants@1.0.0: + resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} + fs-extra@10.1.0: resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} engines: {node: '>=12'} + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] + fstream@1.0.12: + resolution: {integrity: sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==} + engines: {node: '>=0.6'} + deprecated: This package is no longer supported. + function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} @@ -1306,6 +1405,10 @@ packages: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Glob versions prior to v9 are no longer supported + good-listener@1.2.2: resolution: {integrity: sha512-goW1b+d9q/HIwbVYZzZ6SsTr4IgE+WA44A0GmPIQstuOrgsFcT7VEJ48nmr9GaRtNu0XTKacFLGnBPAM6Afouw==} @@ -1371,6 +1474,9 @@ packages: ids@1.0.5: resolution: {integrity: sha512-XQ0yom/4KWTL29sLG+tyuycy7UmeaM/79GRtSJq6IG9cJGIPeBz5kwDCguie3TwxaMNIc3WtPi0cTa1XYHicpw==} + ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + immediate@3.0.6: resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==} @@ -1380,6 +1486,10 @@ packages: immutable@5.1.5: resolution: {integrity: sha512-t7xcm2siw+hlUM68I+UEOK+z84RzmN59as9DZ7P1l0994DKUWV7UXBMQZVxaoMSRQ+PBZbHCOoBt7a2wxOMt+A==} + inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + inherits-browser@0.1.0: resolution: {integrity: sha512-CJHHvW3jQ6q7lzsXPpapLdMx5hDpSF3FSh45pwsj6bKxJJ8Nl8v43i5yXnr3BdfOimGHKyniewQtnAIp3vyJJw==} @@ -1430,12 +1540,19 @@ packages: jszip@3.10.1: resolution: {integrity: sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==} + lazystream@1.0.1: + resolution: {integrity: sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==} + engines: {node: '>= 0.6.3'} + leaflet@1.9.4: resolution: {integrity: sha512-nxS1ynzJOmOlHp+iL3FyWqK89GtNL8U8rvlMOsQdTTssxZwCXh8N2NB3GDQOL+YR3XnWyZAxwQixURb+FA74PA==} lie@3.3.0: resolution: {integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==} + listenercount@1.0.1: + resolution: {integrity: sha512-3mk/Zag0+IJxeDrxSgaDPy4zZ3w05PRZeJNnlWhzFz5OkX49J4krc+A8X2d2M69vGMBEX0uyl8M+W+8gH+kBqQ==} + local-pkg@0.4.3: resolution: {integrity: sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==} engines: {node: '>=14'} @@ -1459,19 +1576,55 @@ packages: lodash.debounce@4.0.8: resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} + lodash.defaults@4.2.0: + resolution: {integrity: sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==} + + lodash.difference@4.5.0: + resolution: {integrity: sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA==} + + lodash.escaperegexp@4.1.2: + resolution: {integrity: sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==} + + lodash.flatten@4.4.0: + resolution: {integrity: sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==} + lodash.foreach@4.5.0: resolution: {integrity: sha512-aEXTF4d+m05rVOAUG3z4vZZ4xVexLKZGF0lIxuHZ1Hplpk/3B6Z1+/ICICYRLm7c41Z2xiejbkCkJoTlypoXhQ==} + lodash.groupby@4.6.0: + resolution: {integrity: sha512-5dcWxm23+VAoz+awKmBaiBvzox8+RqMgFhi7UvX9DHZr2HdxHXM/Wrf8cfKpsW37RNrvtPn6hSwNqurSILbmJw==} + + lodash.isboolean@3.0.3: + resolution: {integrity: sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==} + lodash.isequal@4.5.0: resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} deprecated: This package is deprecated. Use require('node:util').isDeepStrictEqual instead. + lodash.isfunction@3.0.9: + resolution: {integrity: sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==} + + lodash.isnil@4.0.0: + resolution: {integrity: sha512-up2Mzq3545mwVnMhTDMdfoG1OurpA/s5t88JmQX809eH3C8491iu2sfKhTfhQtKY78oPNhiaHJUpT/dUDAAtng==} + + lodash.isplainobject@4.0.6: + resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} + + lodash.isundefined@3.0.1: + resolution: {integrity: sha512-MXB1is3s899/cD8jheYYE2V9qTHwKvt+npCwpD+1Sxm3Q3cECXCiYHjeHWXNwr6Q0SOBPrYUDxendrO6goVTEA==} + lodash.throttle@4.1.1: resolution: {integrity: sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==} lodash.toarray@4.4.0: resolution: {integrity: sha512-QyffEA3i5dma5q2490+SgCvDN0pXLmRGSyAANuVi0HQ01Pkfr9fuoKQW8wm1wGBnJITs/mS7wQvS6VshUEBFCw==} + lodash.union@4.6.0: + resolution: {integrity: sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==} + + lodash.uniq@4.5.0: + resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} + lodash@4.18.1: resolution: {integrity: sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==} @@ -1537,9 +1690,20 @@ packages: min-dom@4.2.1: resolution: {integrity: sha512-TMoL8SEEIhUWYgkj7XMSgxmwSyGI+4fP2KFFGnN3FbHfbGHVdsLYSz8LoIsgPhz4dWRmLvxWWSMgzZMJW5sZuA==} + minimatch@3.1.5: + resolution: {integrity: sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==} + + minimatch@5.1.9: + resolution: {integrity: sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==} + engines: {node: '>=10'} + minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + mkdirp@0.5.6: + resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} + hasBin: true + mlly@1.8.2: resolution: {integrity: sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA==} @@ -1571,6 +1735,10 @@ packages: node-addon-api@7.1.1: resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==} + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + normalize-wheel-es@1.2.0: resolution: {integrity: sha512-Wj7+EJQ8mSuXr2iWfnujrimU35R2W4FAErEyTmJoJ7ucwTn2hOUSsRehMb5RSYkxXGTM7Y9QpvPmp++w5ftoJw==} @@ -1580,6 +1748,9 @@ packages: object-refs@0.3.0: resolution: {integrity: sha512-eP0ywuoWOaDoiake/6kTJlPJhs+k0qNm4nYRzXLNHj6vh+5M3i9R1epJTdxIPGlhWc4fNRQ7a6XJNCX+/L4FOQ==} + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + option@0.2.4: resolution: {integrity: sha512-pkEqbDyl8ou5cpq+VsnQbe/WlEy5qS7xPzMS1U55OCG9KPvwFD46zDbxQIj3egJSFc3D+XhYOPUzz49zQAVy7A==} @@ -1673,6 +1844,9 @@ packages: resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} engines: {node: '>= 6'} + readdir-glob@1.1.3: + resolution: {integrity: sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==} + readdirp@4.1.2: resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} engines: {node: '>= 14.18.0'} @@ -1681,6 +1855,11 @@ packages: resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + rimraf@2.7.1: + resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==} + deprecated: Rimraf versions prior to v4 are no longer supported + hasBin: true + rollup@4.60.3: resolution: {integrity: sha512-pAQK9HalE84QSm4Po3EmWIZPd3FnjkShVkiMlz1iligWYkWQ7wHYd1PF/T7QZ5TVSD6uSTon5gBVMSM4JfBV+A==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} @@ -1706,6 +1885,10 @@ packages: saxen@8.1.2: resolution: {integrity: sha512-xUOiiFbc3Ow7p8KMxwsGICPx46ZQvy3+qfNVhrkwfz3Vvq45eGt98Ft5IQaA1R/7Tb5B5MKh9fUR9x3c3nDTxw==} + saxes@5.0.1: + resolution: {integrity: sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==} + engines: {node: '>=10'} + scroll-into-view-if-needed@2.2.31: resolution: {integrity: sha512-dGCXy99wZQivjmjIqihaBQNjryrz5rueJY7eHfTdyWEiR4ttYpsajb14rn9s5d4DY4EcY6+4+U/maARBXJedkA==} @@ -1798,6 +1981,10 @@ packages: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} + tar-stream@2.2.0: + resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} + engines: {node: '>=6'} + terser@5.46.2: resolution: {integrity: sha512-uxfo9fPcSgLDYob/w1FuL0c99MWiJDnv+5qXSQc5+Ki5NjVNsYi66INnMFBjf6uFz6OnX12piJQPF4IpjJTNTw==} engines: {node: '>=10'} @@ -1815,6 +2002,10 @@ packages: tiny-warning@1.0.3: resolution: {integrity: sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==} + tmp@0.2.7: + resolution: {integrity: sha512-e0votIpp4Uo2AJYSzVHV6xCcawuiez3DzqDAbrTc3YxBkplN6e+dM13ZeIcZnDg/QpSuU2zfZ3rzwY8ukEnaXw==} + engines: {node: '>=14.14'} + to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} @@ -1823,6 +2014,9 @@ packages: resolution: {integrity: sha512-605uxS6bcYxGXw9qi62XyrV6Q3xwbndjachmNxu8HWTtVPxZfEJN9fd/SZS1Q54Sn2y0TMyMxFj/cJINqGHrKw==} hasBin: true + traverse@0.3.9: + resolution: {integrity: sha512-iawgk0hLP3SxGKDfnDJf8wTz4p2qImnyihM5Hh/sGvQ3K37dPi/w8sRhdNIxYA1TwFwc5mDhIJq+O0RsvXBKdQ==} + tslib@2.3.0: resolution: {integrity: sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==} @@ -1858,12 +2052,19 @@ packages: resolution: {integrity: sha512-4/u/j4FrCKdi17jaxuJA0jClGxB1AvU2hw/IuayPc4ay1XGaJs/rbb4v5WKwAjNifjmXK9PIFyuPiaK8azyR9w==} engines: {node: '>=14.0.0'} + unzipper@0.10.14: + resolution: {integrity: sha512-ti4wZj+0bQTiX2KmKWuwj7lhV+2n//uXEotUmGuQqrbVZSEGFMbI68+c6JCQ8aAmUWYvtHEz2A8K6wXvueR/6g==} + utif@3.1.0: resolution: {integrity: sha512-WEo4D/xOvFW53K5f5QTaTbbiORcm2/pCL9P6qmJnup+17eYfKaEhDeX9PeQkuyEoIxlbGklDuGl8xwuXYMrrXQ==} util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + uuid@8.3.2: + resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} + hasBin: true + vite-plugin-compression@0.5.1: resolution: {integrity: sha512-5QJKBDc+gNYVqL/skgFAP81Yuzo9R+EAf19d+EtsMF/i8kFUpNi3J/H01QD3Oo8zBQn+NzoCIFkpPLynoOzaJg==} peerDependencies: @@ -1959,6 +2160,9 @@ packages: resolution: {integrity: sha512-OELeY0Q61OXpdUfTp+oweA/vtLVg5VDOXh+3he3PNzLGG/y0oylSOC1xRVj0+l4vQ3tj/bB1HVHv1ocXkQceFA==} engines: {node: '>=0.8'} + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + xlsx@0.18.5: resolution: {integrity: sha512-dmg3LCjBPHZnQp5/F/+nnTa+miPJxUXB6vtk42YjBBKayDNagxGEeIdWApkYPOf3Z3pm3k62Knjzp7lMeTEtFQ==} engines: {node: '>=0.8'} @@ -1968,10 +2172,17 @@ packages: resolution: {integrity: sha512-OyzrcFLL/nb6fMGHbiRDuPup9ljBycsdCypwuyg5AAHvyWzGfChJpCXMG88AGTIMFhGZ9RccFN1e6lhg3hkwKg==} engines: {node: '>=4.0'} + xmlchars@2.2.0: + resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} + xz-decompress@0.2.3: resolution: {integrity: sha512-O8v6HG8T0PrKBcpyWA13GkSYWFvncwzuzcLx5A7++l3HsE3atmoetXjIxrZ/JV/nbvSZ7WS4+3XvREZuVn+rEA==} engines: {node: '>=16'} + zip-stream@4.1.1: + resolution: {integrity: sha512-9qv4rlDiopXg4E69k+vMHjNN63YFMe9sZMrdlvKnCjlCRWeCBswPPMPUfx+ipsAWq1LXHe70RcbaHdJJpS6hyQ==} + engines: {node: '>= 10'} + zrender@6.1.0: resolution: {integrity: sha512-oEGMDB6pOP2S6OwRR4PdVv610zrjnA3Bh+JnSG12fYJlBKjtNAoEb5fSUoCOOINlH96I2fU38/A2UpRKs67xYQ==} @@ -2083,6 +2294,25 @@ snapshots: '@esbuild/win32-x64@0.21.5': optional: true + '@fast-csv/format@4.3.5': + dependencies: + '@types/node': 14.18.63 + lodash.escaperegexp: 4.1.2 + lodash.isboolean: 3.0.3 + lodash.isequal: 4.5.0 + lodash.isfunction: 3.0.9 + lodash.isnil: 4.0.0 + + '@fast-csv/parse@4.3.6': + dependencies: + '@types/node': 14.18.63 + lodash.escaperegexp: 4.1.2 + lodash.groupby: 4.6.0 + lodash.isfunction: 3.0.9 + lodash.isnil: 4.0.0 + lodash.isundefined: 3.0.1 + lodash.uniq: 4.5.0 + '@floating-ui/core@1.7.5': dependencies: '@floating-ui/utils': 0.2.11 @@ -2432,6 +2662,8 @@ snapshots: '@types/lodash@4.17.24': {} + '@types/node@14.18.63': {} + '@types/trusted-types@2.0.7': optional: true @@ -2766,12 +2998,50 @@ snapshots: dependencies: color-convert: 2.0.1 + archiver-utils@2.1.0: + dependencies: + glob: 7.2.3 + graceful-fs: 4.2.11 + lazystream: 1.0.1 + lodash.defaults: 4.2.0 + lodash.difference: 4.5.0 + lodash.flatten: 4.4.0 + lodash.isplainobject: 4.0.6 + lodash.union: 4.6.0 + normalize-path: 3.0.0 + readable-stream: 2.3.8 + + archiver-utils@3.0.4: + dependencies: + glob: 7.2.3 + graceful-fs: 4.2.11 + lazystream: 1.0.1 + lodash.defaults: 4.2.0 + lodash.difference: 4.5.0 + lodash.flatten: 4.4.0 + lodash.isplainobject: 4.0.6 + lodash.union: 4.6.0 + normalize-path: 3.0.0 + readable-stream: 3.6.2 + + archiver@5.3.2: + dependencies: + archiver-utils: 2.1.0 + async: 3.2.6 + buffer-crc32: 0.2.13 + readable-stream: 3.6.2 + readdir-glob: 1.1.3 + tar-stream: 2.2.0 + zip-stream: 4.1.1 + argparse@1.0.10: dependencies: sprintf-js: 1.0.3 async-validator@4.2.5: {} + async@3.2.6: {} + asynckit@0.4.0: {} avue-plugin-ueditor@1.0.4(axios@1.16.0)(vue@3.5.34): @@ -2795,8 +3065,23 @@ snapshots: transitivePeerDependencies: - debug + balanced-match@1.0.2: {} + base64-js@1.5.1: {} + big-integer@1.6.52: {} + + binary@0.3.0: + dependencies: + buffers: 0.1.1 + chainsaw: 0.1.0 + + bl@4.1.0: + dependencies: + buffer: 5.7.1 + inherits: 2.0.4 + readable-stream: 3.6.2 + bluebird@3.4.7: {} bpmn-js@11.5.0: @@ -2817,12 +3102,32 @@ snapshots: moddle: 6.2.3 moddle-xml: 10.1.0 + brace-expansion@1.1.16: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + brace-expansion@2.1.2: + dependencies: + balanced-match: 1.0.2 + braces@3.0.3: dependencies: fill-range: 7.1.1 + buffer-crc32@0.2.13: {} + buffer-from@1.1.2: {} + buffer-indexof-polyfill@1.0.2: {} + + buffer@5.7.1: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + + buffers@0.1.1: {} + but-unzip@0.1.10: {} call-bind-apply-helpers@1.0.2: @@ -2835,6 +3140,10 @@ snapshots: adler-32: 1.3.1 crc-32: 1.2.2 + chainsaw@0.1.0: + dependencies: + traverse: 0.3.9 + chalk@4.1.2: dependencies: ansi-styles: 4.3.0 @@ -2872,10 +3181,19 @@ snapshots: component-event@0.2.1: {} + compress-commons@4.1.2: + dependencies: + buffer-crc32: 0.2.13 + crc32-stream: 4.0.3 + normalize-path: 3.0.0 + readable-stream: 3.6.2 + compute-scroll-into-view@1.0.20: {} compute-scroll-into-view@3.1.1: {} + concat-map@0.0.1: {} + concat-stream@2.0.0: dependencies: buffer-from: 1.1.2 @@ -2893,6 +3211,11 @@ snapshots: crc-32@1.2.2: {} + crc32-stream@4.0.3: + dependencies: + crc-32: 1.2.2 + readable-stream: 3.6.2 + crypto-js@4.2.0: {} csstype@3.2.3: {} @@ -2968,6 +3291,10 @@ snapshots: es-errors: 1.3.0 gopd: 1.2.0 + duplexer2@0.1.4: + dependencies: + readable-stream: 2.3.8 + echarts@6.1.0: dependencies: tslib: 2.3.0 @@ -2992,6 +3319,10 @@ snapshots: vue: 3.5.34 vue-component-type-helpers: 3.3.6 + end-of-stream@1.4.5: + dependencies: + once: 1.4.0 + entities@7.0.1: {} es-define-property@1.0.1: {} @@ -3069,10 +3400,27 @@ snapshots: d: 1.0.2 es5-ext: 0.10.64 + exceljs@4.4.0: + dependencies: + archiver: 5.3.2 + dayjs: 1.11.20 + fast-csv: 4.3.6 + jszip: 3.10.1 + readable-stream: 3.6.2 + saxes: 5.0.1 + tmp: 0.2.7 + unzipper: 0.10.14 + uuid: 8.3.2 + ext@1.7.0: dependencies: type: 2.7.3 + fast-csv@4.3.6: + dependencies: + '@fast-csv/format': 4.3.5 + '@fast-csv/parse': 4.3.6 + fast-glob@3.3.3: dependencies: '@nodelib/fs.stat': 2.0.5 @@ -3101,15 +3449,26 @@ snapshots: frac@1.1.2: {} + fs-constants@1.0.0: {} + fs-extra@10.1.0: dependencies: graceful-fs: 4.2.11 jsonfile: 6.2.1 universalify: 2.0.1 + fs.realpath@1.0.0: {} + fsevents@2.3.3: optional: true + fstream@1.0.12: + dependencies: + graceful-fs: 4.2.11 + inherits: 2.0.4 + mkdirp: 0.5.6 + rimraf: 2.7.1 + function-bind@1.1.2: {} get-intrinsic@1.3.0: @@ -3134,6 +3493,15 @@ snapshots: dependencies: is-glob: 4.0.3 + glob@7.2.3: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.5 + once: 1.4.0 + path-is-absolute: 1.0.1 + good-listener@1.2.2: dependencies: delegate: 3.2.0 @@ -3184,12 +3552,19 @@ snapshots: ids@1.0.5: {} + ieee754@1.2.1: {} + immediate@3.0.6: {} immer@9.0.21: {} immutable@5.1.5: {} + inflight@1.0.6: + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + inherits-browser@0.1.0: {} inherits@2.0.4: {} @@ -3231,12 +3606,18 @@ snapshots: readable-stream: 2.3.8 setimmediate: 1.0.5 + lazystream@1.0.1: + dependencies: + readable-stream: 2.3.8 + leaflet@1.9.4: {} lie@3.3.0: dependencies: immediate: 3.0.6 + listenercount@1.0.1: {} + local-pkg@0.4.3: {} lodash-es@4.18.1: {} @@ -3253,14 +3634,38 @@ snapshots: lodash.debounce@4.0.8: {} + lodash.defaults@4.2.0: {} + + lodash.difference@4.5.0: {} + + lodash.escaperegexp@4.1.2: {} + + lodash.flatten@4.4.0: {} + lodash.foreach@4.5.0: {} + lodash.groupby@4.6.0: {} + + lodash.isboolean@3.0.3: {} + lodash.isequal@4.5.0: {} + lodash.isfunction@3.0.9: {} + + lodash.isnil@4.0.0: {} + + lodash.isplainobject@4.0.6: {} + + lodash.isundefined@3.0.1: {} + lodash.throttle@4.1.1: {} lodash.toarray@4.4.0: {} + lodash.union@4.6.0: {} + + lodash.uniq@4.5.0: {} + lodash@4.18.1: {} lop@0.4.2: @@ -3331,8 +3736,20 @@ snapshots: domify: 1.4.2 min-dash: 4.2.3 + minimatch@3.1.5: + dependencies: + brace-expansion: 1.1.16 + + minimatch@5.1.9: + dependencies: + brace-expansion: 2.1.2 + minimist@1.2.8: {} + mkdirp@0.5.6: + dependencies: + minimist: 1.2.8 + mlly@1.8.2: dependencies: acorn: 8.16.0 @@ -3363,12 +3780,18 @@ snapshots: node-addon-api@7.1.1: optional: true + normalize-path@3.0.0: {} + normalize-wheel-es@1.2.0: {} nprogress@0.2.0: {} object-refs@0.3.0: {} + once@1.4.0: + dependencies: + wrappy: 1.0.2 + option@0.2.4: {} pako@1.0.11: {} @@ -3446,10 +3869,18 @@ snapshots: string_decoder: 1.3.0 util-deprecate: 1.0.2 + readdir-glob@1.1.3: + dependencies: + minimatch: 5.1.9 + readdirp@4.1.2: {} reusify@1.1.0: {} + rimraf@2.7.1: + dependencies: + glob: 7.2.3 + rollup@4.60.3: dependencies: '@types/estree': 1.0.8 @@ -3501,6 +3932,10 @@ snapshots: saxen@8.1.2: {} + saxes@5.0.1: + dependencies: + xmlchars: 2.2.0 + scroll-into-view-if-needed@2.2.31: dependencies: compute-scroll-into-view: 1.0.20 @@ -3591,6 +4026,14 @@ snapshots: dependencies: has-flag: 4.0.0 + tar-stream@2.2.0: + dependencies: + bl: 4.1.0 + end-of-stream: 1.4.5 + fs-constants: 1.0.0 + inherits: 2.0.4 + readable-stream: 3.6.2 + terser@5.46.2: dependencies: '@jridgewell/source-map': 0.3.11 @@ -3606,6 +4049,8 @@ snapshots: tiny-warning@1.0.3: {} + tmp@0.2.7: {} + to-regex-range@5.0.1: dependencies: is-number: 7.0.0 @@ -3614,6 +4059,8 @@ snapshots: dependencies: commander: 2.20.3 + traverse@0.3.9: {} + tslib@2.3.0: {} type@2.7.3: {} @@ -3660,12 +4107,27 @@ snapshots: acorn: 8.16.0 webpack-virtual-modules: 0.6.2 + unzipper@0.10.14: + dependencies: + big-integer: 1.6.52 + binary: 0.3.0 + bluebird: 3.4.7 + buffer-indexof-polyfill: 1.0.2 + duplexer2: 0.1.4 + fstream: 1.0.12 + graceful-fs: 4.2.11 + listenercount: 1.0.1 + readable-stream: 2.3.8 + setimmediate: 1.0.5 + utif@3.1.0: dependencies: pako: 1.0.11 util-deprecate@1.0.2: {} + uuid@8.3.2: {} + vite-plugin-compression@0.5.1(vite@5.4.21(sass@1.99.0)(terser@5.46.2)): dependencies: chalk: 4.1.2 @@ -3739,6 +4201,8 @@ snapshots: word@0.3.0: {} + wrappy@1.0.2: {} + xlsx@0.18.5: dependencies: adler-32: 1.3.1 @@ -3751,8 +4215,16 @@ snapshots: xmlbuilder@10.1.1: {} + xmlchars@2.2.0: {} + xz-decompress@0.2.3: {} + zip-stream@4.1.1: + dependencies: + archiver-utils: 3.0.4 + compress-commons: 4.1.2 + readable-stream: 3.6.2 + zrender@6.1.0: dependencies: tslib: 2.3.0 diff --git a/src/option/base/cargo-type.js b/src/option/base/cargo-type.js new file mode 100644 index 0000000..2ceca56 --- /dev/null +++ b/src/option/base/cargo-type.js @@ -0,0 +1,180 @@ +const typeLevelDic = [ + { label: '一级货物类型', value: 1 }, + { label: '二级货物类型', value: 2 }, +]; + +const validateCargoName = (rule, value, callback) => { + const v = String(value || '').trim(); + if (!v) { + callback(new Error('请输入货物类型名称')); + } else if (v.length > 50) { + callback(new Error('货物类型名称不能超过50字符')); + } else { + callback(); + } +}; + +const validateRemark = (rule, value, callback) => { + if (String(value || '').length > 200) { + callback(new Error('备注不能超过200字')); + } else { + callback(); + } +}; + +export const getCargoTypeOption = ctx => ({ + height: 'auto', + calcHeight: 32, + dialogWidth: 760, + labelPosition: 'right', + labelWidth: 'auto', + tip: false, + searchBtnText: '查询', + emptyBtnText: '重置', + saveBtnText: '提交', + updateBtnText: '提交', + searchShow: true, + searchMenuSpan: 24, + searchIcon: true, + searchIndex: 8, + searchMenuPosition: 'right', + border: true, + index: true, + indexLabel: '序号', + indexWidth: 70, + viewBtn: false, + delBtn: false, + editBtn: false, + selection: true, + dialogClickModal: false, + menuWidth: 220, + column: [ + { + label: '类型', + prop: 'typeLevel', + type: 'radio', + dataType: 'number', + dicData: typeLevelDic, + search: true, + value: 2, + span: 24, + minWidth: 120, + editDisabled: true, + rules: [{ required: true, message: '请选择货物类型级别', trigger: 'change' }], + change: ({ value }) => ctx.handleTypeLevelChange(value), + }, + { + label: '上级货物类型', + prop: 'parentId', + formslot: true, + hide: true, + display: false, + span: 24, + rules: [{ required: true, message: '请选择上级货物类型', trigger: 'change' }], + }, + { + label: '上级货物类型', + prop: 'parentCargoName', + slot: true, + addDisplay: false, + editDisplay: false, + display: false, + minWidth: 160, + }, + { + label: '上级货物类型编码', + prop: 'parentCargoCode', + slot: true, + readonly: true, + editDisabled: true, + addDisplay: false, + editDisplay: false, + display: false, + minWidth: 160, + rules: [{ required: true, message: '请选择上级货物类型', trigger: 'change' }], + }, + { + label: '货物类型', + prop: 'cargoName', + minWidth: 150, + maxlength: 50, + showWordLimit: true, + rules: [{ validator: validateCargoName, trigger: 'blur' }], + }, + { + label: '货物类型编码', + prop: 'cargoCode', + minWidth: 140, + search: true, + maxlength: 4, + editDisabled: true, + rules: [ + { + validator: (rule, value, callback) => { + const form = ctx.form || {}; + const code = String(value || '').trim(); + const pattern = form.typeLevel === 1 ? /^\d{2}$/ : /^\d{4}$/; + if (!code) { + callback(new Error('请输入货物类型编码')); + } else if (!pattern.test(code)) { + callback(new Error('货物类型编码格式不正确')); + } else if ( + form.typeLevel === 2 && + form.parentCargoCode && + !code.startsWith(form.parentCargoCode) + ) { + callback(new Error('二级编码前2位必须与上级货物类型编码一致')); + } else { + callback(); + } + }, + trigger: 'blur', + }, + ], + change: ({ value }) => ctx.handleCargoCodeChange(value), + }, + { + label: '创建人', + prop: 'createUserName', + slot: true, + addDisplay: false, + editDisplay: false, + display: false, + minWidth: 120, + }, + { + label: '备注', + prop: 'remark', + type: 'textarea', + minRows: 4, + span: 24, + minWidth: 180, + maxlength: 200, + showWordLimit: true, + overHidden: true, + rules: [{ validator: validateRemark, trigger: 'blur' }], + }, + { + label: '更新时间', + prop: 'updateTime', + type: 'datetime', + format: 'YYYY-MM-DD HH:mm:ss', + valueFormat: 'YYYY-MM-DD HH:mm:ss', + addDisplay: false, + editDisplay: false, + display: false, + minWidth: 160, + }, + { + label: '创建时间', + prop: 'createTime', + type: 'datetime', + format: 'YYYY-MM-DD HH:mm:ss', + valueFormat: 'YYYY-MM-DD HH:mm:ss', + addDisplay: false, + editDisplay: false, + display: false, + minWidth: 160, + }, + ], +}); diff --git a/src/utils/import-excel.js b/src/utils/import-excel.js index 01c2e98..4cbed0a 100644 --- a/src/utils/import-excel.js +++ b/src/utils/import-excel.js @@ -15,14 +15,45 @@ const parseBlobJson = async blob => { return text ? JSON.parse(text) : {}; }; -export const openImportDialog = (vm, businessName, onSuccess) => { +/** + * 加工后端返回的导入失败明细 Excel。 + * 若传入 failDetailDecorator(函数),则动态加载 exceljs 读取 blob 流, + * 交由 decorator 完成标红 / 改写原因列等加工,再导出新的 blob; + * 否则原样返回 blob(保持旧行为,不影响未使用 decorator 的模块)。 + * @param {Blob} blob 后端返回的失败明细 Excel 流 + * @param {String} businessName 业务名称(如「货物类型」) + * @param {Function} [failDetailDecorator] async (workbook, { businessName }) => void + * @returns {Promise} + */ +const decorateFailExcel = async (blob, businessName, failDetailDecorator) => { + if (typeof failDetailDecorator !== 'function') return blob; + const ExcelJS = await import('exceljs'); + const buf = await blob.arrayBuffer(); + const workbook = new ExcelJS.Workbook(); + await workbook.xlsx.load(buf); + await failDetailDecorator(workbook, { businessName }); + const out = await workbook.xlsx.writeBuffer(); + return new Blob([out], { type: 'application/vnd.ms-excel' }); +}; + +/** + * 打开导入弹窗 + * @param {Object} vm 组件实例 + * @param {String} businessName 业务名称,用于失败明细文件命名 + * @param {Function} [onSuccess] 导入成功回调 + * @param {Object} [options] 扩展项 + * @param {Function} [options.failDetailDecorator] 失败明细加工函数,用于对后端返回的失败 Excel 标红/改写原因 + */ +export const openImportDialog = (vm, businessName, onSuccess, options = {}) => { + const { failDetailDecorator } = options; const column = vm.findColumn(vm.excelOption.column, 'excelFile'); column.httpRequest = (option, uploadColumn) => - handleImportExcel(vm, option, uploadColumn, businessName, onSuccess); + handleImportExcel(vm, option, uploadColumn, businessName, onSuccess, { failDetailDecorator }); vm.excelBox = true; }; -export const handleImportExcel = async (vm, option, column, businessName, onSuccess) => { +export const handleImportExcel = async (vm, option, column, businessName, onSuccess, options = {}) => { + const { failDetailDecorator } = options; const file = option.file; const fileName = file && file.name ? file.name.toLowerCase() : ''; if (!excelPattern.test(fileName)) { @@ -37,8 +68,9 @@ export const handleImportExcel = async (vm, option, column, businessName, onSucc try { const res = await importBlob(column.action, file); if (isExcelResponse(res)) { + const decorated = await decorateFailExcel(res.data, businessName, failDetailDecorator); downloadXls( - res.data, + decorated, `${businessName}导入失败明细${vm.$dayjs().format('YYYY-MM-DD HH:mm:ss')}.xlsx` ); vm.$message.warning('部分数据导入失败,已下载失败明细'); diff --git a/src/views/base/cargo-type.vue b/src/views/base/cargo-type.vue index 154c5f5..2678d8d 100644 --- a/src/views/base/cargo-type.vue +++ b/src/views/base/cargo-type.vue @@ -73,7 +73,7 @@ clearable :remote-method="loadParentOptions" :loading="parentLoading" - :disabled="form.typeLevel !== 2" + :disabled="dialogType !== 'add' || form.typeLevel !== 2" placeholder="请输入名称或编码搜索" style="width: 100%" @change="handleParentChange" @@ -146,6 +146,7 @@ import { remove, submit, } from '@/api/base/cargo-type'; +import { getCargoTypeOption } from '@/option/base/cargo-type'; import { exportBlob } from '@/api/common'; import { mapGetters } from 'vuex'; import { downloadXls } from '@/utils/util'; @@ -154,45 +155,62 @@ import { getToken } from '@/utils/auth'; import NProgress from 'nprogress'; import 'nprogress/nprogress.css'; -const typeLevelDic = [ - { label: '一级货物类型', value: 1 }, - { label: '二级货物类型', value: 2 }, +// 导入失败明细中,每个错误文本对应的「标红列」与「规则说明」 +const FAIL_RED_FILL = { type: 'pattern', pattern: 'solid', fgColor: { argb: 'FFFFC7CE' } }; +const CARGO_TYPE_FAIL_RULES = [ + { match: '请选择货物类型级别', col: '类型', rule: '仅允许:一级货物类型/二级货物类型' }, + { match: '货物类型编码格式不正确', col: '货物类型编码', rule: '一级2位数字,二级4位数字' }, + { match: '该货物类型编码已存在', col: '货物类型编码', rule: '请更换唯一编码' }, + { match: '请选择上级货物类型', col: '上级货物类型', rule: '二级货物类型必须选择上级' }, + { + match: '二级编码前2位必须与上级货物类型编码一致', + col: '货物类型编码', + rule: '二级编码前2位必须与上级货物类型编码一致', + }, + { match: '货物类型名称不能超过50字符', col: '货物类型', rule: '货物类型名称不能超过50字符' }, + { match: '备注不能超过200字', col: '备注', rule: '备注不能超过200字' }, ]; +/** + * 加工后端返回的导入失败明细 Excel: + * - 依据「错误文本 -> 字段列」映射,给违规的那一栏标红 + * - 将「导入失败原因」列改写为(第N行:错误,规则)格式 + * 未匹配到的未知错误,标红原因列本身并原样提示 + */ +export const decorateCargoTypeFailDetail = async workbook => { + const ws = workbook.worksheets[0]; + if (!ws) return; + const headerRow = ws.getRow(1); + const colMap = {}; + headerRow.eachCell((cell, colNumber) => { + const name = String(cell.value == null ? '' : cell.value).trim(); + if (name) colMap[name] = colNumber; + }); + const reasonCol = colMap['导入失败原因']; + if (!reasonCol) return; + ws.eachRow((row, rowNumber) => { + if (rowNumber === 1) return; // 跳过表头 + const reasonCell = row.getCell(reasonCol); + const raw = String(reasonCell.value == null ? '' : reasonCell.value).trim(); + if (!raw) return; + const parts = raw.split(/[;;\n\r]+/).map(s => s.trim()).filter(Boolean); + if (parts.length === 0) return; + const decorated = parts.map(part => { + const rule = CARGO_TYPE_FAIL_RULES.find(r => part.includes(r.match)); + if (rule) { + const targetCol = colMap[rule.col]; + if (targetCol) row.getCell(targetCol).fill = FAIL_RED_FILL; + return `第${rowNumber}行:${part},${rule.rule}`; + } + reasonCell.fill = FAIL_RED_FILL; + return `第${rowNumber}行:${part}`; + }); + reasonCell.value = decorated.join(';'); + }); +}; + export default { data() { - const validateCargoName = (rule, value, callback) => { - const cargoName = String(value || '').trim(); - if (!cargoName) { - callback(new Error('请输入货物类型名称')); - } else if (cargoName.length > 50) { - callback(new Error('货物类型名称不能超过50字符')); - } else { - callback(); - } - }; - const validateCargoCode = (rule, value, callback) => { - const cargoCode = String(value || '').trim(); - const pattern = this.form.typeLevel === 1 ? /^\d{2}$/ : /^\d{4}$/; - if (!pattern.test(cargoCode)) { - callback(new Error('货物类型编码格式不正确')); - } else if ( - this.form.typeLevel === 2 && - this.form.parentCargoCode && - !cargoCode.startsWith(this.form.parentCargoCode) - ) { - callback(new Error('二级编码前2位必须与上级货物类型编码一致')); - } else { - callback(); - } - }; - const validateRemark = (rule, value, callback) => { - if (String(value || '').length > 200) { - callback(new Error('备注不能超过200字')); - } else { - callback(); - } - }; return { form: {}, query: {}, @@ -202,6 +220,7 @@ export default { excelForm: {}, parentOptions: [], parentLoading: false, + dialogType: 'add', page: { pageSize: 10, pageSizes: [10, 20, 50, 100], @@ -209,137 +228,7 @@ export default { total: 0, }, selectionList: [], - option: { - height: 'auto', - calcHeight: 32, - dialogWidth: 760, - labelPosition: 'right', - labelWidth: 'auto', - tip: false, - searchBtnText: '查询', - emptyBtnText: '重置', - saveBtnText: '提交', - updateBtnText: '提交', - searchShow: true, - searchMenuSpan: 24, - searchIcon: true, - searchIndex: 8, - searchMenuPosition: 'right', - border: true, - index: true, - indexLabel: '序号', - indexWidth: 70, - viewBtn: false, - delBtn: false, - editBtn: false, - selection: true, - dialogClickModal: false, - menuWidth: 220, - column: [ - { - label: '类型', - prop: 'typeLevel', - type: 'radio', - dataType: 'number', - dicData: typeLevelDic, - search: true, - value: 1, - span: 24, - minWidth: 120, - rules: [{ required: true, message: '请选择货物类型级别', trigger: 'change' }], - change: ({ value }) => this.handleTypeLevelChange(value), - }, - { - label: '上级货物类型', - prop: 'parentId', - formslot: true, - hide: true, - display: false, - span: 24, - rules: [{ required: true, message: '请选择上级货物类型', trigger: 'change' }], - }, - { - label: '上级货物类型', - prop: 'parentCargoName', - slot: true, - addDisplay: false, - editDisplay: false, - display: false, - minWidth: 160, - }, - { - label: '上级货物类型编码', - prop: 'parentCargoCode', - slot: true, - readonly: true, - addDisplay: false, - editDisplay: false, - display: false, - minWidth: 160, - rules: [{ required: true, message: '请选择上级货物类型', trigger: 'change' }], - }, - { - label: '货物类型', - prop: 'cargoName', - minWidth: 150, - maxlength: 50, - showWordLimit: true, - rules: [{ validator: validateCargoName, trigger: 'blur' }], - }, - { - label: '货物类型编码', - prop: 'cargoCode', - minWidth: 140, - search: true, - maxlength: 4, - rules: [{ validator: validateCargoCode, trigger: 'blur' }], - change: ({ value }) => this.handleCargoCodeChange(value), - }, - { - label: '创建人', - prop: 'createUserName', - slot: true, - addDisplay: false, - editDisplay: false, - display: false, - minWidth: 120, - }, - { - label: '备注', - prop: 'remark', - type: 'textarea', - minRows: 4, - span: 24, - minWidth: 180, - maxlength: 200, - showWordLimit: true, - overHidden: true, - rules: [{ validator: validateRemark, trigger: 'blur' }], - }, - { - label: '更新时间', - prop: 'updateTime', - type: 'datetime', - format: 'YYYY-MM-DD HH:mm:ss', - valueFormat: 'YYYY-MM-DD HH:mm:ss', - addDisplay: false, - editDisplay: false, - display: false, - minWidth: 160, - }, - { - label: '创建时间', - prop: 'createTime', - type: 'datetime', - format: 'YYYY-MM-DD HH:mm:ss', - valueFormat: 'YYYY-MM-DD HH:mm:ss', - addDisplay: false, - editDisplay: false, - display: false, - minWidth: 160, - }, - ], - }, + option: getCargoTypeOption(this), excelOption: { submitBtn: false, emptyBtn: false, @@ -506,7 +395,6 @@ export default { done(); }, error => { - window.console.log(error); loading(); } ); @@ -524,7 +412,6 @@ export default { done(); }, error => { - window.console.log(error); loading(); } ); @@ -565,6 +452,7 @@ export default { this.onLoad(this.page, this.query); }, beforeOpen(done, type) { + this.dialogType = type || 'add'; if (['edit', 'view'].includes(type)) { getDetail(this.form.id).then(res => { this.form = res.data.data || {}; @@ -575,7 +463,7 @@ export default { return; } this.form = { - typeLevel: 1, + typeLevel: 2, cargoName: '', cargoCode: '', parentId: undefined, @@ -627,7 +515,9 @@ export default { }); }, handleImport() { - openImportDialog(this, '货物类型'); + openImportDialog(this, '货物类型', undefined, { + failDetailDecorator: decorateCargoTypeFailDetail, + }); }, buildExportParams() { const params = { ...this.query }; diff --git a/vite.config.mjs b/vite.config.mjs index 3cbb3d4..fbebcf8 100644 --- a/vite.config.mjs +++ b/vite.config.mjs @@ -54,10 +54,8 @@ export default ({ port: 2888, proxy: { '/api': { - target: 'http://localhost', - //target: 'https://saber3.bladex.cn/api', + target: 'http://172.16.203.228:8000', changeOrigin: true, - rewrite: path => path.replace(/^\/api/, ''), }, }, },