From b1ce70777fb52ba986b6a8cf1b00cce93c2e84be Mon Sep 17 00:00:00 2001
From: riku <risaku@163.com>
Date: 星期五, 14 十一月 2025 17:46:47 +0800
Subject: [PATCH] 1. 修改巡查单据的下载功能(待完成)

---
 src/utils/doc.js                          |  127 ++++
 package-lock.json                         |  908 +++++++++++++++++++++++++++++++++++
 src/api/fysp/domainApi.js                 |   30 +
 package.json                              |    2 
 src/views/fysp/config/DomainCatalog.vue   |  235 +++++++++
 src/constants/menu.js                     |    5 
 src/views/fysp/scene/SceneInspectFile.vue |  173 ++++--
 src/router/index.js                       |    7 
 8 files changed, 1,401 insertions(+), 86 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index b3f4309..be9e772 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -28,8 +28,10 @@
         "jszip-utils": "^0.1.0",
         "md5": "^2.3.0",
         "open-docxtemplater-image-module": "^1.0.3",
+        "pdfmake": "^0.2.20",
         "pinia": "^2.0.26",
         "pizzip": "^3.1.7",
+        "print-js": "^1.6.0",
         "vue": "^3.2.45",
         "vue-demi": "^0.14.6",
         "vue-i18n": "^9.8.0",
@@ -1955,6 +1957,52 @@
         "@floating-ui/core": "^1.0.4"
       }
     },
+    "node_modules/@foliojs-fork/fontkit": {
+      "version": "1.9.2",
+      "resolved": "https://registry.npmmirror.com/@foliojs-fork/fontkit/-/fontkit-1.9.2.tgz",
+      "integrity": "sha512-IfB5EiIb+GZk+77TRB86AHroVaqfq8JRFlUbz0WEwsInyCG0epX2tCPOy+UfaWPju30DeVoUAXfzWXmhn753KA==",
+      "dependencies": {
+        "@foliojs-fork/restructure": "^2.0.2",
+        "brotli": "^1.2.0",
+        "clone": "^1.0.4",
+        "deep-equal": "^1.0.0",
+        "dfa": "^1.2.0",
+        "tiny-inflate": "^1.0.2",
+        "unicode-properties": "^1.2.2",
+        "unicode-trie": "^2.0.0"
+      }
+    },
+    "node_modules/@foliojs-fork/linebreak": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmmirror.com/@foliojs-fork/linebreak/-/linebreak-1.1.2.tgz",
+      "integrity": "sha512-ZPohpxxbuKNE0l/5iBJnOAfUaMACwvUIKCvqtWGKIMv1lPYoNjYXRfhi9FeeV9McBkBLxsMFWTVVhHJA8cyzvg==",
+      "dependencies": {
+        "base64-js": "1.3.1",
+        "unicode-trie": "^2.0.0"
+      }
+    },
+    "node_modules/@foliojs-fork/linebreak/node_modules/base64-js": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npmmirror.com/base64-js/-/base64-js-1.3.1.tgz",
+      "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g=="
+    },
+    "node_modules/@foliojs-fork/pdfkit": {
+      "version": "0.15.3",
+      "resolved": "https://registry.npmmirror.com/@foliojs-fork/pdfkit/-/pdfkit-0.15.3.tgz",
+      "integrity": "sha512-Obc0Wmy3bm7BINFVvPhcl2rnSSK61DQrlHU8aXnAqDk9LCjWdUOPwhgD8Ywz5VtuFjRxmVOM/kQ/XLIBjDvltw==",
+      "dependencies": {
+        "@foliojs-fork/fontkit": "^1.9.2",
+        "@foliojs-fork/linebreak": "^1.1.1",
+        "crypto-js": "^4.2.0",
+        "jpeg-exif": "^1.1.4",
+        "png-js": "^1.0.0"
+      }
+    },
+    "node_modules/@foliojs-fork/restructure": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmmirror.com/@foliojs-fork/restructure/-/restructure-2.0.2.tgz",
+      "integrity": "sha512-59SgoZ3EXbkfSX7b63tsou/SDGzwUEK6MuB5sKqgVK1/XE0fxmpsOb9DQI8LXW3KfGnAjImCGhhEb7uPPAUVNA=="
+    },
     "node_modules/@hapi/hoek": {
       "version": "9.3.0",
       "dev": true,
@@ -3312,6 +3360,14 @@
         "node": ">=8"
       }
     },
+    "node_modules/brotli": {
+      "version": "1.3.3",
+      "resolved": "https://registry.npmmirror.com/brotli/-/brotli-1.3.3.tgz",
+      "integrity": "sha512-oTKjJdShmDuGW94SyyaoQvAjf30dZaHnjJ8uAF+u2/vGJkJbJPJAT1gDiOJP5v1Zb6f9KEyW/1HpuaWIXtGHPg==",
+      "dependencies": {
+        "base64-js": "^1.1.2"
+      }
+    },
     "node_modules/browserslist": {
       "version": "4.21.4",
       "dev": true,
@@ -3396,6 +3452,50 @@
       "license": "MIT",
       "engines": {
         "node": ">=6"
+      }
+    },
+    "node_modules/call-bind": {
+      "version": "1.0.8",
+      "resolved": "https://registry.npmmirror.com/call-bind/-/call-bind-1.0.8.tgz",
+      "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==",
+      "dependencies": {
+        "call-bind-apply-helpers": "^1.0.0",
+        "es-define-property": "^1.0.0",
+        "get-intrinsic": "^1.2.4",
+        "set-function-length": "^1.2.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/call-bind-apply-helpers": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmmirror.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
+      "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
+      "dependencies": {
+        "es-errors": "^1.3.0",
+        "function-bind": "^1.1.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/call-bound": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmmirror.com/call-bound/-/call-bound-1.0.4.tgz",
+      "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==",
+      "dependencies": {
+        "call-bind-apply-helpers": "^1.0.2",
+        "get-intrinsic": "^1.3.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
       }
     },
     "node_modules/callsites": {
@@ -3618,6 +3718,14 @@
         "url": "https://github.com/sponsors/sindresorhus"
       }
     },
+    "node_modules/clone": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmmirror.com/clone/-/clone-1.0.4.tgz",
+      "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==",
+      "engines": {
+        "node": ">=0.8"
+      }
+    },
     "node_modules/codepage": {
       "version": "1.15.0",
       "resolved": "https://registry.npmmirror.com/codepage/-/codepage-1.15.0.tgz",
@@ -3766,6 +3874,11 @@
       "engines": {
         "node": "*"
       }
+    },
+    "node_modules/crypto-js": {
+      "version": "4.2.0",
+      "resolved": "https://registry.npmmirror.com/crypto-js/-/crypto-js-4.2.0.tgz",
+      "integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q=="
     },
     "node_modules/cssesc": {
       "version": "3.0.0",
@@ -3920,10 +4033,61 @@
         "node": ">=6"
       }
     },
+    "node_modules/deep-equal": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmmirror.com/deep-equal/-/deep-equal-1.1.2.tgz",
+      "integrity": "sha512-5tdhKF6DbU7iIzrIOa1AOUt39ZRm13cmL1cGEh//aqR8x9+tNfbywRf0n5FD/18OKMdo7DNEtrX2t22ZAkI+eg==",
+      "dependencies": {
+        "is-arguments": "^1.1.1",
+        "is-date-object": "^1.0.5",
+        "is-regex": "^1.1.4",
+        "object-is": "^1.1.5",
+        "object-keys": "^1.1.1",
+        "regexp.prototype.flags": "^1.5.1"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
     "node_modules/deep-is": {
       "version": "0.1.4",
       "dev": true,
       "license": "MIT"
+    },
+    "node_modules/define-data-property": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmmirror.com/define-data-property/-/define-data-property-1.1.4.tgz",
+      "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==",
+      "dependencies": {
+        "es-define-property": "^1.0.0",
+        "es-errors": "^1.3.0",
+        "gopd": "^1.0.1"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/define-properties": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmmirror.com/define-properties/-/define-properties-1.2.1.tgz",
+      "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==",
+      "dependencies": {
+        "define-data-property": "^1.0.1",
+        "has-property-descriptors": "^1.0.0",
+        "object-keys": "^1.1.1"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
     },
     "node_modules/delayed-stream": {
       "version": "1.0.0",
@@ -3931,6 +4095,11 @@
       "engines": {
         "node": ">=0.4.0"
       }
+    },
+    "node_modules/dfa": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmmirror.com/dfa/-/dfa-1.2.0.tgz",
+      "integrity": "sha512-ED3jP8saaweFTjeGX8HQPjeC1YYyZs98jGNZx6IiBvxW7JG5v492kamAQB3m2wop07CvU/RQmzcKr6bgcC5D/Q=="
     },
     "node_modules/dir-glob": {
       "version": "3.0.1",
@@ -4000,6 +4169,19 @@
       },
       "engines": {
         "node": ">=12"
+      }
+    },
+    "node_modules/dunder-proto": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmmirror.com/dunder-proto/-/dunder-proto-1.0.1.tgz",
+      "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
+      "dependencies": {
+        "call-bind-apply-helpers": "^1.0.1",
+        "es-errors": "^1.3.0",
+        "gopd": "^1.2.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
       }
     },
     "node_modules/duplexer": {
@@ -4164,11 +4346,38 @@
         "errno": "cli.js"
       }
     },
+    "node_modules/es-define-property": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmmirror.com/es-define-property/-/es-define-property-1.0.1.tgz",
+      "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/es-errors": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmmirror.com/es-errors/-/es-errors-1.3.0.tgz",
+      "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
     "node_modules/es-module-lexer": {
       "version": "0.9.3",
       "dev": true,
       "license": "MIT",
       "peer": true
+    },
+    "node_modules/es-object-atoms": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmmirror.com/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
+      "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
+      "dependencies": {
+        "es-errors": "^1.3.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
     },
     "node_modules/esbuild": {
       "version": "0.15.18",
@@ -4934,9 +5143,20 @@
       }
     },
     "node_modules/function-bind": {
-      "version": "1.1.1",
-      "dev": true,
-      "license": "MIT"
+      "version": "1.1.2",
+      "resolved": "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.2.tgz",
+      "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/functions-have-names": {
+      "version": "1.2.3",
+      "resolved": "https://registry.npmmirror.com/functions-have-names/-/functions-have-names-1.2.3.tgz",
+      "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==",
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
     },
     "node_modules/gensync": {
       "version": "1.0.0-beta.2",
@@ -4952,6 +5172,41 @@
       "license": "MIT",
       "engines": {
         "node": "*"
+      }
+    },
+    "node_modules/get-intrinsic": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmmirror.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
+      "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
+      "dependencies": {
+        "call-bind-apply-helpers": "^1.0.2",
+        "es-define-property": "^1.0.1",
+        "es-errors": "^1.3.0",
+        "es-object-atoms": "^1.1.1",
+        "function-bind": "^1.1.2",
+        "get-proto": "^1.0.1",
+        "gopd": "^1.2.0",
+        "has-symbols": "^1.1.0",
+        "hasown": "^2.0.2",
+        "math-intrinsics": "^1.1.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/get-proto": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmmirror.com/get-proto/-/get-proto-1.0.1.tgz",
+      "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
+      "dependencies": {
+        "dunder-proto": "^1.0.1",
+        "es-object-atoms": "^1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
       }
     },
     "node_modules/get-stream": {
@@ -5073,6 +5328,17 @@
         "node": ">=8"
       }
     },
+    "node_modules/gopd": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmmirror.com/gopd/-/gopd-1.2.0.tgz",
+      "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
     "node_modules/graceful-fs": {
       "version": "4.2.10",
       "license": "ISC"
@@ -5105,6 +5371,53 @@
       "license": "MIT",
       "engines": {
         "node": ">=8"
+      }
+    },
+    "node_modules/has-property-descriptors": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmmirror.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz",
+      "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==",
+      "dependencies": {
+        "es-define-property": "^1.0.0"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/has-symbols": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmmirror.com/has-symbols/-/has-symbols-1.1.0.tgz",
+      "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/has-tostringtag": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmmirror.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
+      "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
+      "dependencies": {
+        "has-symbols": "^1.0.3"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/hasown": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmmirror.com/hasown/-/hasown-2.0.2.tgz",
+      "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
+      "dependencies": {
+        "function-bind": "^1.1.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
       }
     },
     "node_modules/html-encoding-sniffer": {
@@ -5166,7 +5479,6 @@
     },
     "node_modules/iconv-lite": {
       "version": "0.6.3",
-      "dev": true,
       "license": "MIT",
       "dependencies": {
         "safer-buffer": ">= 2.1.2 < 3.0.0"
@@ -5274,6 +5586,21 @@
         "node": ">=10"
       }
     },
+    "node_modules/is-arguments": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmmirror.com/is-arguments/-/is-arguments-1.2.0.tgz",
+      "integrity": "sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==",
+      "dependencies": {
+        "call-bound": "^1.0.2",
+        "has-tostringtag": "^1.0.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
     "node_modules/is-binary-path": {
       "version": "2.1.0",
       "dev": true,
@@ -5307,6 +5634,21 @@
       "license": "MIT",
       "dependencies": {
         "has": "^1.0.3"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/is-date-object": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmmirror.com/is-date-object/-/is-date-object-1.1.0.tgz",
+      "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==",
+      "dependencies": {
+        "call-bound": "^1.0.2",
+        "has-tostringtag": "^1.0.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
       },
       "funding": {
         "url": "https://github.com/sponsors/ljharb"
@@ -5374,6 +5716,23 @@
       "version": "1.0.1",
       "dev": true,
       "license": "MIT"
+    },
+    "node_modules/is-regex": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmmirror.com/is-regex/-/is-regex-1.2.1.tgz",
+      "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==",
+      "dependencies": {
+        "call-bound": "^1.0.2",
+        "gopd": "^1.2.0",
+        "has-tostringtag": "^1.0.2",
+        "hasown": "^2.0.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
     },
     "node_modules/is-stream": {
       "version": "2.0.1",
@@ -5447,6 +5806,11 @@
         "@sideway/formula": "^3.0.0",
         "@sideway/pinpoint": "^2.0.0"
       }
+    },
+    "node_modules/jpeg-exif": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmmirror.com/jpeg-exif/-/jpeg-exif-1.1.4.tgz",
+      "integrity": "sha512-a+bKEcCjtuW5WTdgeXFzswSrdqi0jk4XlEtZlx5A94wCoBpFjfFTbo/Tra5SpNCl/YFZPvcV1dJc+TAYeg6ROQ=="
     },
     "node_modules/js-base64": {
       "version": "3.7.5",
@@ -6077,6 +6441,14 @@
       "version": "0.1.0",
       "dev": true
     },
+    "node_modules/math-intrinsics": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmmirror.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
+      "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
     "node_modules/md5": {
       "version": "2.3.0",
       "resolved": "https://registry.npmmirror.com/md5/-/md5-2.3.0.tgz",
@@ -6284,6 +6656,29 @@
       "dev": true,
       "license": "MIT"
     },
+    "node_modules/object-is": {
+      "version": "1.1.6",
+      "resolved": "https://registry.npmmirror.com/object-is/-/object-is-1.1.6.tgz",
+      "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==",
+      "dependencies": {
+        "call-bind": "^1.0.7",
+        "define-properties": "^1.2.1"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/object-keys": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmmirror.com/object-keys/-/object-keys-1.1.1.tgz",
+      "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
     "node_modules/once": {
       "version": "1.4.0",
       "license": "ISC",
@@ -6467,6 +6862,20 @@
         "through": "~2.3"
       }
     },
+    "node_modules/pdfmake": {
+      "version": "0.2.20",
+      "resolved": "https://registry.npmmirror.com/pdfmake/-/pdfmake-0.2.20.tgz",
+      "integrity": "sha512-bGbxbGFP5p8PWNT3Phsu1ZcRLnRfF6jmnuKTkgmt6i5PZzSdX6JaB+NeTz9q+aocfW8SE9GUjL3o/5GroBqGcQ==",
+      "dependencies": {
+        "@foliojs-fork/linebreak": "^1.1.2",
+        "@foliojs-fork/pdfkit": "^0.15.3",
+        "iconv-lite": "^0.6.3",
+        "xmldoc": "^2.0.1"
+      },
+      "engines": {
+        "node": ">=18"
+      }
+    },
     "node_modules/pend": {
       "version": "1.2.0",
       "dev": true,
@@ -6537,6 +6946,11 @@
       "resolved": "https://registry.npmmirror.com/pako/-/pako-2.1.0.tgz",
       "integrity": "sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug=="
     },
+    "node_modules/png-js": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmmirror.com/png-js/-/png-js-1.0.0.tgz",
+      "integrity": "sha512-k+YsbhpA9e+EFfKjTCH3VW6aoKlyNYI6NYdTfDL4CIvFnvsuO84ttonmZE7rc+v23SLTH8XX+5w/Ak9v0xGY4g=="
+    },
     "node_modules/postcss": {
       "version": "8.4.20",
       "funding": [
@@ -6606,6 +7020,11 @@
       "funding": {
         "url": "https://github.com/sponsors/sindresorhus"
       }
+    },
+    "node_modules/print-js": {
+      "version": "1.6.0",
+      "resolved": "https://registry.npmmirror.com/print-js/-/print-js-1.6.0.tgz",
+      "integrity": "sha512-BfnOIzSKbqGRtO4o0rnj/K3681BSd2QUrsIZy/+WdCIugjIswjmx3lDEZpXB2ruGf9d4b3YNINri81+J0FsBWg=="
     },
     "node_modules/process-nextick-args": {
       "version": "2.0.1",
@@ -6778,6 +7197,25 @@
       "license": "MIT",
       "dependencies": {
         "@babel/runtime": "^7.8.4"
+      }
+    },
+    "node_modules/regexp.prototype.flags": {
+      "version": "1.5.4",
+      "resolved": "https://registry.npmmirror.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz",
+      "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==",
+      "dependencies": {
+        "call-bind": "^1.0.8",
+        "define-properties": "^1.2.1",
+        "es-errors": "^1.3.0",
+        "get-proto": "^1.0.1",
+        "gopd": "^1.2.0",
+        "set-function-name": "^2.0.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
       }
     },
     "node_modules/regexpp": {
@@ -6970,7 +7408,6 @@
     },
     "node_modules/safer-buffer": {
       "version": "2.1.2",
-      "dev": true,
       "license": "MIT"
     },
     "node_modules/sass": {
@@ -6991,9 +7428,7 @@
     },
     "node_modules/sax": {
       "version": "1.2.4",
-      "dev": true,
-      "license": "ISC",
-      "optional": true
+      "license": "ISC"
     },
     "node_modules/saxes": {
       "version": "6.0.0",
@@ -7045,6 +7480,36 @@
       "peer": true,
       "dependencies": {
         "randombytes": "^2.1.0"
+      }
+    },
+    "node_modules/set-function-length": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmmirror.com/set-function-length/-/set-function-length-1.2.2.tgz",
+      "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==",
+      "dependencies": {
+        "define-data-property": "^1.1.4",
+        "es-errors": "^1.3.0",
+        "function-bind": "^1.1.2",
+        "get-intrinsic": "^1.2.4",
+        "gopd": "^1.0.1",
+        "has-property-descriptors": "^1.0.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/set-function-name": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmmirror.com/set-function-name/-/set-function-name-2.0.2.tgz",
+      "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==",
+      "dependencies": {
+        "define-data-property": "^1.1.4",
+        "es-errors": "^1.3.0",
+        "functions-have-names": "^1.2.3",
+        "has-property-descriptors": "^1.0.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
       }
     },
     "node_modules/setimmediate": {
@@ -7437,6 +7902,11 @@
       "dev": true,
       "license": "MIT"
     },
+    "node_modules/tiny-inflate": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmmirror.com/tiny-inflate/-/tiny-inflate-1.0.3.tgz",
+      "integrity": "sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw=="
+    },
     "node_modules/tinybench": {
       "version": "2.3.1",
       "dev": true,
@@ -7613,6 +8083,15 @@
         "node": ">=4"
       }
     },
+    "node_modules/unicode-properties": {
+      "version": "1.4.1",
+      "resolved": "https://registry.npmmirror.com/unicode-properties/-/unicode-properties-1.4.1.tgz",
+      "integrity": "sha512-CLjCCLQ6UuMxWnbIylkisbRj31qxHPAurvena/0iwSVbQ2G1VY5/HjV0IRabOEbDHlzZlRdCrD4NhB0JtU40Pg==",
+      "dependencies": {
+        "base64-js": "^1.3.0",
+        "unicode-trie": "^2.0.0"
+      }
+    },
     "node_modules/unicode-property-aliases-ecmascript": {
       "version": "2.1.0",
       "dev": true,
@@ -7620,6 +8099,20 @@
       "engines": {
         "node": ">=4"
       }
+    },
+    "node_modules/unicode-trie": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmmirror.com/unicode-trie/-/unicode-trie-2.0.0.tgz",
+      "integrity": "sha512-x7bc76x0bm4prf1VLg79uhAzKw8DVboClSN5VxJuQ+LKDOVEW9CdH+VY7SP+vX7xCYQqzzgQpFqz15zeLvAtZQ==",
+      "dependencies": {
+        "pako": "^0.2.5",
+        "tiny-inflate": "^1.0.0"
+      }
+    },
+    "node_modules/unicode-trie/node_modules/pako": {
+      "version": "0.2.9",
+      "resolved": "https://registry.npmmirror.com/pako/-/pako-0.2.9.tgz",
+      "integrity": "sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA=="
     },
     "node_modules/universalify": {
       "version": "2.0.0",
@@ -8437,6 +8930,17 @@
     "node_modules/xmlchars": {
       "version": "2.2.0",
       "license": "MIT"
+    },
+    "node_modules/xmldoc": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmmirror.com/xmldoc/-/xmldoc-2.0.2.tgz",
+      "integrity": "sha512-UiRwoSStEXS3R+YE8OqYv3jebza8cBBAI2y8g3B15XFkn3SbEOyyLnmPHjLBPZANrPJKEzxxB7A3XwcLikQVlQ==",
+      "dependencies": {
+        "sax": "^1.2.4"
+      },
+      "engines": {
+        "node": ">=12.0.0"
+      }
     },
     "node_modules/xmldom": {
       "version": "0.1.31",
@@ -9707,6 +10211,54 @@
         "@floating-ui/core": "^1.0.4"
       }
     },
+    "@foliojs-fork/fontkit": {
+      "version": "1.9.2",
+      "resolved": "https://registry.npmmirror.com/@foliojs-fork/fontkit/-/fontkit-1.9.2.tgz",
+      "integrity": "sha512-IfB5EiIb+GZk+77TRB86AHroVaqfq8JRFlUbz0WEwsInyCG0epX2tCPOy+UfaWPju30DeVoUAXfzWXmhn753KA==",
+      "requires": {
+        "@foliojs-fork/restructure": "^2.0.2",
+        "brotli": "^1.2.0",
+        "clone": "^1.0.4",
+        "deep-equal": "^1.0.0",
+        "dfa": "^1.2.0",
+        "tiny-inflate": "^1.0.2",
+        "unicode-properties": "^1.2.2",
+        "unicode-trie": "^2.0.0"
+      }
+    },
+    "@foliojs-fork/linebreak": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmmirror.com/@foliojs-fork/linebreak/-/linebreak-1.1.2.tgz",
+      "integrity": "sha512-ZPohpxxbuKNE0l/5iBJnOAfUaMACwvUIKCvqtWGKIMv1lPYoNjYXRfhi9FeeV9McBkBLxsMFWTVVhHJA8cyzvg==",
+      "requires": {
+        "base64-js": "1.3.1",
+        "unicode-trie": "^2.0.0"
+      },
+      "dependencies": {
+        "base64-js": {
+          "version": "1.3.1",
+          "resolved": "https://registry.npmmirror.com/base64-js/-/base64-js-1.3.1.tgz",
+          "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g=="
+        }
+      }
+    },
+    "@foliojs-fork/pdfkit": {
+      "version": "0.15.3",
+      "resolved": "https://registry.npmmirror.com/@foliojs-fork/pdfkit/-/pdfkit-0.15.3.tgz",
+      "integrity": "sha512-Obc0Wmy3bm7BINFVvPhcl2rnSSK61DQrlHU8aXnAqDk9LCjWdUOPwhgD8Ywz5VtuFjRxmVOM/kQ/XLIBjDvltw==",
+      "requires": {
+        "@foliojs-fork/fontkit": "^1.9.2",
+        "@foliojs-fork/linebreak": "^1.1.1",
+        "crypto-js": "^4.2.0",
+        "jpeg-exif": "^1.1.4",
+        "png-js": "^1.0.0"
+      }
+    },
+    "@foliojs-fork/restructure": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmmirror.com/@foliojs-fork/restructure/-/restructure-2.0.2.tgz",
+      "integrity": "sha512-59SgoZ3EXbkfSX7b63tsou/SDGzwUEK6MuB5sKqgVK1/XE0fxmpsOb9DQI8LXW3KfGnAjImCGhhEb7uPPAUVNA=="
+    },
     "@hapi/hoek": {
       "version": "9.3.0",
       "dev": true
@@ -10662,6 +11214,14 @@
         "fill-range": "^7.0.1"
       }
     },
+    "brotli": {
+      "version": "1.3.3",
+      "resolved": "https://registry.npmmirror.com/brotli/-/brotli-1.3.3.tgz",
+      "integrity": "sha512-oTKjJdShmDuGW94SyyaoQvAjf30dZaHnjJ8uAF+u2/vGJkJbJPJAT1gDiOJP5v1Zb6f9KEyW/1HpuaWIXtGHPg==",
+      "requires": {
+        "base64-js": "^1.1.2"
+      }
+    },
     "browserslist": {
       "version": "4.21.4",
       "dev": true,
@@ -10700,6 +11260,35 @@
     "cachedir": {
       "version": "2.3.0",
       "dev": true
+    },
+    "call-bind": {
+      "version": "1.0.8",
+      "resolved": "https://registry.npmmirror.com/call-bind/-/call-bind-1.0.8.tgz",
+      "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==",
+      "requires": {
+        "call-bind-apply-helpers": "^1.0.0",
+        "es-define-property": "^1.0.0",
+        "get-intrinsic": "^1.2.4",
+        "set-function-length": "^1.2.2"
+      }
+    },
+    "call-bind-apply-helpers": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmmirror.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
+      "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
+      "requires": {
+        "es-errors": "^1.3.0",
+        "function-bind": "^1.1.2"
+      }
+    },
+    "call-bound": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmmirror.com/call-bound/-/call-bound-1.0.4.tgz",
+      "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==",
+      "requires": {
+        "call-bind-apply-helpers": "^1.0.2",
+        "get-intrinsic": "^1.3.0"
+      }
     },
     "callsites": {
       "version": "3.1.0",
@@ -10832,6 +11421,11 @@
         "string-width": "^4.2.0"
       }
     },
+    "clone": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmmirror.com/clone/-/clone-1.0.4.tgz",
+      "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg=="
+    },
     "codepage": {
       "version": "1.15.0",
       "resolved": "https://registry.npmmirror.com/codepage/-/codepage-1.15.0.tgz",
@@ -10928,6 +11522,11 @@
       "version": "0.0.2",
       "resolved": "https://registry.npmmirror.com/crypt/-/crypt-0.0.2.tgz",
       "integrity": "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow=="
+    },
+    "crypto-js": {
+      "version": "4.2.0",
+      "resolved": "https://registry.npmmirror.com/crypto-js/-/crypto-js-4.2.0.tgz",
+      "integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q=="
     },
     "cssesc": {
       "version": "3.0.0",
@@ -11040,12 +11639,50 @@
         "type-detect": "^4.0.0"
       }
     },
+    "deep-equal": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmmirror.com/deep-equal/-/deep-equal-1.1.2.tgz",
+      "integrity": "sha512-5tdhKF6DbU7iIzrIOa1AOUt39ZRm13cmL1cGEh//aqR8x9+tNfbywRf0n5FD/18OKMdo7DNEtrX2t22ZAkI+eg==",
+      "requires": {
+        "is-arguments": "^1.1.1",
+        "is-date-object": "^1.0.5",
+        "is-regex": "^1.1.4",
+        "object-is": "^1.1.5",
+        "object-keys": "^1.1.1",
+        "regexp.prototype.flags": "^1.5.1"
+      }
+    },
     "deep-is": {
       "version": "0.1.4",
       "dev": true
     },
+    "define-data-property": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmmirror.com/define-data-property/-/define-data-property-1.1.4.tgz",
+      "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==",
+      "requires": {
+        "es-define-property": "^1.0.0",
+        "es-errors": "^1.3.0",
+        "gopd": "^1.0.1"
+      }
+    },
+    "define-properties": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmmirror.com/define-properties/-/define-properties-1.2.1.tgz",
+      "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==",
+      "requires": {
+        "define-data-property": "^1.0.1",
+        "has-property-descriptors": "^1.0.0",
+        "object-keys": "^1.1.1"
+      }
+    },
     "delayed-stream": {
       "version": "1.0.0"
+    },
+    "dfa": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmmirror.com/dfa/-/dfa-1.2.0.tgz",
+      "integrity": "sha512-ED3jP8saaweFTjeGX8HQPjeC1YYyZs98jGNZx6IiBvxW7JG5v492kamAQB3m2wop07CvU/RQmzcKr6bgcC5D/Q=="
     },
     "dir-glob": {
       "version": "3.0.1",
@@ -11100,6 +11737,16 @@
       "dev": true,
       "requires": {
         "webidl-conversions": "^7.0.0"
+      }
+    },
+    "dunder-proto": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmmirror.com/dunder-proto/-/dunder-proto-1.0.1.tgz",
+      "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
+      "requires": {
+        "call-bind-apply-helpers": "^1.0.1",
+        "es-errors": "^1.3.0",
+        "gopd": "^1.2.0"
       }
     },
     "duplexer": {
@@ -11238,10 +11885,28 @@
         "prr": "~1.0.1"
       }
     },
+    "es-define-property": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmmirror.com/es-define-property/-/es-define-property-1.0.1.tgz",
+      "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g=="
+    },
+    "es-errors": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmmirror.com/es-errors/-/es-errors-1.3.0.tgz",
+      "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw=="
+    },
     "es-module-lexer": {
       "version": "0.9.3",
       "dev": true,
       "peer": true
+    },
+    "es-object-atoms": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmmirror.com/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
+      "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
+      "requires": {
+        "es-errors": "^1.3.0"
+      }
     },
     "esbuild": {
       "version": "0.15.18",
@@ -11743,8 +12408,14 @@
       }
     },
     "function-bind": {
-      "version": "1.1.1",
-      "dev": true
+      "version": "1.1.2",
+      "resolved": "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.2.tgz",
+      "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="
+    },
+    "functions-have-names": {
+      "version": "1.2.3",
+      "resolved": "https://registry.npmmirror.com/functions-have-names/-/functions-have-names-1.2.3.tgz",
+      "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ=="
     },
     "gensync": {
       "version": "1.0.0-beta.2",
@@ -11753,6 +12424,32 @@
     "get-func-name": {
       "version": "2.0.0",
       "dev": true
+    },
+    "get-intrinsic": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmmirror.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
+      "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
+      "requires": {
+        "call-bind-apply-helpers": "^1.0.2",
+        "es-define-property": "^1.0.1",
+        "es-errors": "^1.3.0",
+        "es-object-atoms": "^1.1.1",
+        "function-bind": "^1.1.2",
+        "get-proto": "^1.0.1",
+        "gopd": "^1.2.0",
+        "has-symbols": "^1.1.0",
+        "hasown": "^2.0.2",
+        "math-intrinsics": "^1.1.0"
+      }
+    },
+    "get-proto": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmmirror.com/get-proto/-/get-proto-1.0.1.tgz",
+      "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
+      "requires": {
+        "dunder-proto": "^1.0.1",
+        "es-object-atoms": "^1.0.0"
+      }
     },
     "get-stream": {
       "version": "5.2.0",
@@ -11834,6 +12531,11 @@
         }
       }
     },
+    "gopd": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmmirror.com/gopd/-/gopd-1.2.0.tgz",
+      "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg=="
+    },
     "graceful-fs": {
       "version": "4.2.10"
     },
@@ -11857,6 +12559,35 @@
     "has-flag": {
       "version": "4.0.0",
       "dev": true
+    },
+    "has-property-descriptors": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmmirror.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz",
+      "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==",
+      "requires": {
+        "es-define-property": "^1.0.0"
+      }
+    },
+    "has-symbols": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmmirror.com/has-symbols/-/has-symbols-1.1.0.tgz",
+      "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ=="
+    },
+    "has-tostringtag": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmmirror.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
+      "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
+      "requires": {
+        "has-symbols": "^1.0.3"
+      }
+    },
+    "hasown": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmmirror.com/hasown/-/hasown-2.0.2.tgz",
+      "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
+      "requires": {
+        "function-bind": "^1.1.2"
+      }
     },
     "html-encoding-sniffer": {
       "version": "3.0.0",
@@ -11897,7 +12628,6 @@
     },
     "iconv-lite": {
       "version": "0.6.3",
-      "dev": true,
       "requires": {
         "safer-buffer": ">= 2.1.2 < 3.0.0"
       }
@@ -11953,6 +12683,15 @@
       "version": "2.0.0",
       "dev": true
     },
+    "is-arguments": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmmirror.com/is-arguments/-/is-arguments-1.2.0.tgz",
+      "integrity": "sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==",
+      "requires": {
+        "call-bound": "^1.0.2",
+        "has-tostringtag": "^1.0.2"
+      }
+    },
     "is-binary-path": {
       "version": "2.1.0",
       "dev": true,
@@ -11977,6 +12716,15 @@
       "dev": true,
       "requires": {
         "has": "^1.0.3"
+      }
+    },
+    "is-date-object": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmmirror.com/is-date-object/-/is-date-object-1.1.0.tgz",
+      "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==",
+      "requires": {
+        "call-bound": "^1.0.2",
+        "has-tostringtag": "^1.0.2"
       }
     },
     "is-extglob": {
@@ -12013,6 +12761,17 @@
     "is-potential-custom-element-name": {
       "version": "1.0.1",
       "dev": true
+    },
+    "is-regex": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmmirror.com/is-regex/-/is-regex-1.2.1.tgz",
+      "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==",
+      "requires": {
+        "call-bound": "^1.0.2",
+        "gopd": "^1.2.0",
+        "has-tostringtag": "^1.0.2",
+        "hasown": "^2.0.2"
+      }
     },
     "is-stream": {
       "version": "2.0.1",
@@ -12063,6 +12822,11 @@
         "@sideway/formula": "^3.0.0",
         "@sideway/pinpoint": "^2.0.0"
       }
+    },
+    "jpeg-exif": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmmirror.com/jpeg-exif/-/jpeg-exif-1.1.4.tgz",
+      "integrity": "sha512-a+bKEcCjtuW5WTdgeXFzswSrdqi0jk4XlEtZlx5A94wCoBpFjfFTbo/Tra5SpNCl/YFZPvcV1dJc+TAYeg6ROQ=="
     },
     "js-base64": {
       "version": "3.7.5",
@@ -12523,6 +13287,11 @@
       "version": "0.1.0",
       "dev": true
     },
+    "math-intrinsics": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmmirror.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
+      "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g=="
+    },
     "md5": {
       "version": "2.3.0",
       "resolved": "https://registry.npmmirror.com/md5/-/md5-2.3.0.tgz",
@@ -12655,6 +13424,20 @@
       "version": "2.2.2",
       "dev": true
     },
+    "object-is": {
+      "version": "1.1.6",
+      "resolved": "https://registry.npmmirror.com/object-is/-/object-is-1.1.6.tgz",
+      "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==",
+      "requires": {
+        "call-bind": "^1.0.7",
+        "define-properties": "^1.2.1"
+      }
+    },
+    "object-keys": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmmirror.com/object-keys/-/object-keys-1.1.1.tgz",
+      "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA=="
+    },
     "once": {
       "version": "1.4.0",
       "requires": {
@@ -12768,6 +13551,17 @@
         "through": "~2.3"
       }
     },
+    "pdfmake": {
+      "version": "0.2.20",
+      "resolved": "https://registry.npmmirror.com/pdfmake/-/pdfmake-0.2.20.tgz",
+      "integrity": "sha512-bGbxbGFP5p8PWNT3Phsu1ZcRLnRfF6jmnuKTkgmt6i5PZzSdX6JaB+NeTz9q+aocfW8SE9GUjL3o/5GroBqGcQ==",
+      "requires": {
+        "@foliojs-fork/linebreak": "^1.1.2",
+        "@foliojs-fork/pdfkit": "^0.15.3",
+        "iconv-lite": "^0.6.3",
+        "xmldoc": "^2.0.1"
+      }
+    },
     "pend": {
       "version": "1.2.0",
       "dev": true
@@ -12809,6 +13603,11 @@
         }
       }
     },
+    "png-js": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmmirror.com/png-js/-/png-js-1.0.0.tgz",
+      "integrity": "sha512-k+YsbhpA9e+EFfKjTCH3VW6aoKlyNYI6NYdTfDL4CIvFnvsuO84ttonmZE7rc+v23SLTH8XX+5w/Ak9v0xGY4g=="
+    },
     "postcss": {
       "version": "8.4.20",
       "requires": {
@@ -12842,6 +13641,11 @@
     "pretty-bytes": {
       "version": "5.6.0",
       "dev": true
+    },
+    "print-js": {
+      "version": "1.6.0",
+      "resolved": "https://registry.npmmirror.com/print-js/-/print-js-1.6.0.tgz",
+      "integrity": "sha512-BfnOIzSKbqGRtO4o0rnj/K3681BSd2QUrsIZy/+WdCIugjIswjmx3lDEZpXB2ruGf9d4b3YNINri81+J0FsBWg=="
     },
     "process-nextick-args": {
       "version": "2.0.1",
@@ -12965,6 +13769,19 @@
         "@babel/runtime": "^7.8.4"
       }
     },
+    "regexp.prototype.flags": {
+      "version": "1.5.4",
+      "resolved": "https://registry.npmmirror.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz",
+      "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==",
+      "requires": {
+        "call-bind": "^1.0.8",
+        "define-properties": "^1.2.1",
+        "es-errors": "^1.3.0",
+        "get-proto": "^1.0.1",
+        "gopd": "^1.2.0",
+        "set-function-name": "^2.0.2"
+      }
+    },
     "regexpp": {
       "version": "3.2.0",
       "dev": true
@@ -13069,8 +13886,7 @@
       "version": "5.2.1"
     },
     "safer-buffer": {
-      "version": "2.1.2",
-      "dev": true
+      "version": "2.1.2"
     },
     "sass": {
       "version": "1.56.2",
@@ -13082,9 +13898,7 @@
       }
     },
     "sax": {
-      "version": "1.2.4",
-      "dev": true,
-      "optional": true
+      "version": "1.2.4"
     },
     "saxes": {
       "version": "6.0.0",
@@ -13116,6 +13930,30 @@
       "peer": true,
       "requires": {
         "randombytes": "^2.1.0"
+      }
+    },
+    "set-function-length": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmmirror.com/set-function-length/-/set-function-length-1.2.2.tgz",
+      "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==",
+      "requires": {
+        "define-data-property": "^1.1.4",
+        "es-errors": "^1.3.0",
+        "function-bind": "^1.1.2",
+        "get-intrinsic": "^1.2.4",
+        "gopd": "^1.0.1",
+        "has-property-descriptors": "^1.0.2"
+      }
+    },
+    "set-function-name": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmmirror.com/set-function-name/-/set-function-name-2.0.2.tgz",
+      "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==",
+      "requires": {
+        "define-data-property": "^1.1.4",
+        "es-errors": "^1.3.0",
+        "functions-have-names": "^1.2.3",
+        "has-property-descriptors": "^1.0.2"
       }
     },
     "setimmediate": {
@@ -13362,6 +14200,11 @@
       "version": "2.3.8",
       "dev": true
     },
+    "tiny-inflate": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmmirror.com/tiny-inflate/-/tiny-inflate-1.0.3.tgz",
+      "integrity": "sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw=="
+    },
     "tinybench": {
       "version": "2.3.1",
       "dev": true
@@ -13464,9 +14307,34 @@
       "version": "2.1.0",
       "dev": true
     },
+    "unicode-properties": {
+      "version": "1.4.1",
+      "resolved": "https://registry.npmmirror.com/unicode-properties/-/unicode-properties-1.4.1.tgz",
+      "integrity": "sha512-CLjCCLQ6UuMxWnbIylkisbRj31qxHPAurvena/0iwSVbQ2G1VY5/HjV0IRabOEbDHlzZlRdCrD4NhB0JtU40Pg==",
+      "requires": {
+        "base64-js": "^1.3.0",
+        "unicode-trie": "^2.0.0"
+      }
+    },
     "unicode-property-aliases-ecmascript": {
       "version": "2.1.0",
       "dev": true
+    },
+    "unicode-trie": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmmirror.com/unicode-trie/-/unicode-trie-2.0.0.tgz",
+      "integrity": "sha512-x7bc76x0bm4prf1VLg79uhAzKw8DVboClSN5VxJuQ+LKDOVEW9CdH+VY7SP+vX7xCYQqzzgQpFqz15zeLvAtZQ==",
+      "requires": {
+        "pako": "^0.2.5",
+        "tiny-inflate": "^1.0.0"
+      },
+      "dependencies": {
+        "pako": {
+          "version": "0.2.9",
+          "resolved": "https://registry.npmmirror.com/pako/-/pako-0.2.9.tgz",
+          "integrity": "sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA=="
+        }
+      }
     },
     "universalify": {
       "version": "2.0.0",
@@ -13956,6 +14824,14 @@
     "xmlchars": {
       "version": "2.2.0"
     },
+    "xmldoc": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmmirror.com/xmldoc/-/xmldoc-2.0.2.tgz",
+      "integrity": "sha512-UiRwoSStEXS3R+YE8OqYv3jebza8cBBAI2y8g3B15XFkn3SbEOyyLnmPHjLBPZANrPJKEzxxB7A3XwcLikQVlQ==",
+      "requires": {
+        "sax": "^1.2.4"
+      }
+    },
     "xmldom": {
       "version": "0.1.31",
       "resolved": "https://registry.npmmirror.com/xmldom/-/xmldom-0.1.31.tgz",
diff --git a/package.json b/package.json
index c219580..98ad790 100644
--- a/package.json
+++ b/package.json
@@ -33,8 +33,10 @@
     "jszip-utils": "^0.1.0",
     "md5": "^2.3.0",
     "open-docxtemplater-image-module": "^1.0.3",
+    "pdfmake": "^0.2.20",
     "pinia": "^2.0.26",
     "pizzip": "^3.1.7",
+    "print-js": "^1.6.0",
     "vue": "^3.2.45",
     "vue-demi": "^0.14.6",
     "vue-i18n": "^9.8.0",
diff --git a/src/api/fysp/domainApi.js b/src/api/fysp/domainApi.js
index 02985b1..856c053 100644
--- a/src/api/fysp/domainApi.js
+++ b/src/api/fysp/domainApi.js
@@ -1,6 +1,20 @@
 import { $fysp } from '../index';
 
 export default {
+  // 鑾峰彇鍏ㄩ儴鍊煎煙鐩綍
+  fetchDomainCatalog() {
+    return $fysp.get(`domaincatalog`).then((res) => res.data);
+  },
+  // 鏂板鍊煎煙鐩綍
+  putDomainCatalog(catalog) {
+    return $fysp.put(`domaincatalog`, catalog).then((res) => res.data);
+  },
+  // 鏇存柊鍊煎煙鐩綍
+  updateDomainCatalog(catalog) {
+    return $fysp.post(`domaincatalog`, catalog).then((res) => res.data);
+  },
+
+
   // 鑾峰彇宸℃煡浠诲姟绫诲瀷
   fetchTaskType() {
     return $fysp.get(`domainitem/taskType`).then((res) => res.data);
@@ -21,5 +35,19 @@
     return $fysp
       .get(`domainitem/mediaFileType`, { params: { sceneType } })
       .then((res) => res.data);
-  }
+  },
+
+  // 鑾峰彇鎸囧畾鍊煎煙鐩綍涓嬬殑鎵�鏈夊�煎煙椤�
+  fetchItemByCatalogId(catalogId) {
+    return $fysp.get(`domainitem/catalogId`, { params: { catalogId } }).then((res) => res.data);
+  },
+
+  // 鏂板鍊煎煙椤�
+  putDomainItem(item) {
+    return $fysp.put(`domainitem`, item).then((res) => res.data);
+  },
+  // 鏇存柊鍊煎煙椤�
+  updateDomainItem(item) {
+    return $fysp.post(`domainitem`, item).then((res) => res.data);
+  },
 };
diff --git a/src/constants/menu.js b/src/constants/menu.js
index b2d9a36..64ea2ac 100644
--- a/src/constants/menu.js
+++ b/src/constants/menu.js
@@ -161,6 +161,11 @@
       //   icon: 'List',
       //   name: '璇勪及瑙勫垯'
       // }
+      {
+        path: '/fysp/config/domainCatalog',
+        icon: 'List',
+        name: '鍊煎煙鐩綍'
+      }
     ]
   },
   {
diff --git a/src/router/index.js b/src/router/index.js
index 1fed002..920fc00 100644
--- a/src/router/index.js
+++ b/src/router/index.js
@@ -296,6 +296,13 @@
                 path: 'evalutationRule',
                 component: () =>
                   import('@/views/fysp/config/EvalutationRule.vue')
+              },
+              {
+                //鍊煎煙琛ㄧ鐞�
+                name: 'domaincatalog',
+                path: 'domaincatalog',
+                component: () =>
+                  import('@/views/fysp/config/DomainCatalog.vue')
               }
             ]
           },
diff --git a/src/utils/doc.js b/src/utils/doc.js
index a757cfc..35f3b88 100644
--- a/src/utils/doc.js
+++ b/src/utils/doc.js
@@ -4,6 +4,9 @@
 import ImageModule from 'docxtemplater-image-module-free';
 import Pizzip from 'pizzip';
 import FileSaver from 'file-saver';
+import { renderAsync } from 'docx-preview';
+import printJS from 'print-js';
+import pdfMake from 'pdfmake';
 
 /**
  * 绛夋瘮渚嬬缉鏀惧浘鐗�
@@ -146,7 +149,7 @@
   };
 }
 
-export const exportDocx = (tempDocpath, data, zipName, imageSize) => {
+function prepareDocxtemplater(tempDocpath, data, imageSize) {
   return new Promise((resolve, reject) => {
     JSZipUtils.getBinaryContent(tempDocpath, (error, content) => {
       if (error) {
@@ -164,20 +167,116 @@
       }
       doc.compile();
       doc.resolveData(data).then(() => {
-        try {
-          doc.render();
-        } catch (error) {
-          console.log(error);
-          throw error;
-        }
-        const out = doc.getZip().generate({
-          type: 'blob',
-          mimeType:
-            'application/vnd.openxmlformats-officedocumnet.wordprocessingml.document'
-        });
-        FileSaver.saveAs(out, zipName);
-        resolve();
+        resolve(doc);
       });
     });
   });
+}
+
+/**
+ * 鍑嗗docx鏂囨。锛岃繑鍥瀊lob瀵硅薄
+ * @param {*} tempDocpath 妯℃澘docx鏂囦欢璺緞
+ * @param {*} data 鏁版嵁瀵硅薄
+ * @param {*} zipName 鍘嬬缉鍖呭悕绉�
+ * @param {*} imageSize 鍥剧墖澶у皬閰嶇疆瀵硅薄
+ * @returns
+ */
+function prepareDocxBlob(tempDocpath, data, imageSize) {
+  return prepareDocxtemplater(tempDocpath, data, imageSize).then((doc) => {
+    try {
+      doc.render();
+    } catch (error) {
+      console.log(error);
+      throw error;
+    }
+    const out = doc.getZip().generate({
+      type: 'blob',
+      mimeType:
+        'application/vnd.openxmlformats-officedocumnet.wordprocessingml.document'
+    });
+    return out;
+  });
+}
+
+function prepareDocxStr(tempDocpath, data, imageSize) {
+  return prepareDocxtemplater(tempDocpath, data, imageSize).then((doc) => {
+    try {
+      return doc.render();
+    } catch (error) {
+      console.log(error);
+      throw error;
+    }
+  });
+}
+
+function preparePdf(tempDocpath, data, imageSize) {
+  return prepareDocxStr(tempDocpath, data, imageSize).then( (res) => {
+    // 灏� Word 鏂囨。杞崲涓� PDF 鏍煎紡骞朵繚瀛樺埌鏂囦欢
+    console.log(pdfMake);
+    
+    // const printer = new pdfMake.PdfPrinter();
+    const docDefinition = {
+      content: [
+        {
+          text: res.toString('utf8')
+        }
+      ]
+    };
+    const pdfDoc = pdfMake.createPdf(docDefinition);
+    // const pdfBuffer = await pdfDoc.getBuffer();
+    // return new Blob([pdfBuffer], { type: 'application/pdf' });
+    return pdfDoc;
+  });
+}
+
+function exportDocx(tempDocpath, data, zipName, imageSize) {
+  return prepareDocxBlob(tempDocpath, data, zipName, imageSize).then((blob) => {
+    FileSaver.saveAs(blob, zipName);
+  });
+}
+
+function previewDocx(blob, ref) {
+  return renderAsync(blob, ref);
+}
+
+function downloadDocx(blob, zipName) {
+  FileSaver.saveAs(blob, zipName);
+}
+
+function print(
+  ref,
+  title,
+  style,
+  type,
+  jsonData,
+  borderHeadStyle,
+  gridStyle,
+  css
+) {
+  printJS({
+    printable: ref,
+    header: title || null,
+    type: type || 'html',
+    headerStyle:
+      'font-size:6px;font-weight:600;text-align:center;padding:15px 0 10px 0;', //鏍囬璁剧疆
+    properties: jsonData || [], //json鏁版嵁鍏�
+    gridHeaderStyle:
+      borderHeadStyle ||
+      'font-size:6px;font-weight:400;height:40px;line-height:40px;border: 1px solid #ccc;padding:3px 5px 3px 5px;text-align:center;', //json鏍煎紡琛ㄥご鏍峰紡
+    gridStyle:
+      gridStyle ||
+      'font-size:1px;font-weight:200;border: 1px solid #ccc;padding:3px 5px 3px 5px;text-align:center;', //json鍚勫紡琛ㄥ摜澶
+    scanStyles: false, //涓嶉�傜敤榛樿鏍峰紡
+    repeatTableHeader: false, //鎵撳嵃json琛ㄥご鍙樉绀哄湪绗竴椤�
+    style: style || '@page{size:auto;margin: 0cm 1cm 0cm 1cm;}', //鍘婚櫎椤电湁椤佃剼
+    css: css || null //css url
+  });
+}
+export {
+  exportDocx,
+  prepareDocxBlob,
+  preparePdf,
+  previewDocx,
+  downloadDocx,
+  print
 };
diff --git a/src/views/fysp/config/DomainCatalog.vue b/src/views/fysp/config/DomainCatalog.vue
new file mode 100644
index 0000000..3c9151e
--- /dev/null
+++ b/src/views/fysp/config/DomainCatalog.vue
@@ -0,0 +1,235 @@
+<template>
+  <BaseContentLayout>
+    <template #header> </template>
+    <template #aside>
+      <SideList
+        :items="domainCatalog"
+        :loading="sideLoading"
+        @item-click="chooseCatalog"
+      ></SideList>
+    </template>
+    <template #main>
+      <!-- <FormCol> -->
+      <el-table
+        :data="domainItems"
+        v-loading="loading"
+        :height="contentHeight + 'px'"
+        table-layout="fixed"
+        :show-overflow-tooltip="true"
+        size="small"
+        style="z-index: 20"
+        border
+      >
+        <el-table-column fixed="left" prop="index" label="缂栧彿" width="50">
+          <template #default="{ row }">
+            <el-input
+              v-if="row._isAdd || row._isEdit"
+              size="small"
+              v-model="row.index"
+            />
+            <span v-else>{{ row.index }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column
+          prop="catelogname"
+          label="绫诲埆"
+          :show-overflow-tooltip="true"
+          width="180"
+        >
+        </el-table-column>
+        <el-table-column
+          prop="text"
+          label="鍊煎煙椤�"
+          :show-overflow-tooltip="true"
+          min-width="200"
+        >
+          <template #default="{ row }">
+            <el-input
+              v-if="row._isAdd || row._isEdit"
+              size="small"
+              v-model="row.text"
+            />
+            <span v-else>{{ row.text }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column
+          prop="value"
+          label="鍊煎煙鍊�"
+          :formatter="timeFormat"
+          width="90"
+        >
+          <template #default="{ row }">
+            <el-input
+              v-if="row._isAdd || row._isEdit"
+              size="small"
+              v-model="row.value"
+            />
+            <span v-else>{{ row.value }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column prop="remark" label="鐗堟湰" width="80" />
+        <el-table-column
+          prop="guid"
+          label="ID"
+          :show-overflow-tooltip="true"
+          width="150"
+        >
+        </el-table-column>
+        <el-table-column fixed="right" label="鎿嶄綔" width="160">
+          <template #default="scope">
+            <el-button
+              v-if="scope.row._isAdd"
+              type="primary"
+              size="small"
+              icon="Select"
+              @click="savePut(scope)"
+              >鏂板</el-button
+            >
+            <el-button
+              v-else-if="scope.row._isEdit"
+              type="success"
+              size="small"
+              icon="Select"
+              @click="saveUpdate(scope)"
+              >淇敼</el-button
+            >
+            <el-button-group v-else>
+              <el-button
+                type="default"
+                size="small"
+                icon="Edit"
+                @click="itemEdit(scope)"
+              ></el-button>
+              <el-button
+                :loading="scope.row.loadingDelete"
+                type="danger"
+                size="small"
+                icon="Delete"
+                @click="itemDelete(scope)"
+              ></el-button>
+            </el-button-group>
+            <el-button
+              v-if="scope.row._isEdit || scope.row._isAdd"
+              type="default"
+              size="small"
+              icon="CloseBold"
+              @click="cancelEdit(scope)"
+              >鍙栨秷</el-button
+            >
+          </template>
+        </el-table-column>
+      </el-table>
+      <el-row justify="center" style="margin-top: -2px">
+        <el-button type="default" icon="Plus" @click="itemAdd"
+          >鏂板鍊煎煙椤�</el-button
+        >
+      </el-row>
+      <!-- </FormCol> -->
+    </template>
+  </BaseContentLayout>
+</template>
+<script setup>
+import { onMounted, ref } from 'vue';
+import domainApi from '@/api/fysp/domainApi';
+import { ElMessage } from 'element-plus';
+
+const loading = ref(false);
+const domainCatalog = ref([]);
+const selectedCatalog = ref(null);
+const domainItems = ref([]);
+
+// 閫夋嫨鍊煎煙鐩綍
+const chooseCatalog = (catalog) => {
+  selectedCatalog.value = catalog.data;
+  loading.value = true;
+  domainApi
+    .fetchItemByCatalogId(catalog.data.guid)
+    .then((res) => {
+      domainItems.value = res.data;
+    })
+    .finally(() => {
+      loading.value = false;
+    });
+};
+
+// 娣诲姞鍊煎煙椤�
+const itemAdd = () => {
+  const lastOne = domainItems.value[domainItems.value.length - 1];
+  domainItems.value.push({
+    index: lastOne ? lastOne.index + 1 : 0,
+    catelogname: selectedCatalog.value.name,
+    dcguid: selectedCatalog.value.guid,
+    text: '',
+    value: '',
+    remark: '0',
+    _isAdd: true
+  });
+};
+
+function itemEdit(scope) {
+  scope.row._isEdit = true;
+  console.log(scope);
+}
+
+function itemDelete(scope) {
+  scope.row.loadingDelete = true;
+  setTimeout(() => {
+    domainItems.value.splice(scope.$index, 1);
+    scope.row.loadingDelete = false;
+  }, 1000);
+}
+
+function savePut(scope) {
+  if (_validate(scope.row)) {
+    scope.row._isAdd = false;
+    domainApi.putDomainItem(scope.row).then((res) => {
+      scope.row.guid = res.guid;
+      ElMessage.success('鏂板鎴愬姛');
+    });
+  } else {
+    ElMessage.error('璇峰~鍐欏畬鏁翠俊鎭�');
+  }
+}
+
+function saveUpdate(scope) {
+  if (_validate(scope.row)) {
+    scope.row._isEdit = false;
+    domainApi.updateDomainItem(scope.row).then((res) => {
+      ElMessage.success('淇敼鎴愬姛');
+    });
+  } else {
+    ElMessage.error('璇峰~鍐欏畬鏁翠俊鎭�');
+  }
+}
+
+// 鍙栨秷缂栬緫
+function cancelEdit(scope) {
+  scope.row._isAdd = false;
+  scope.row._isEdit = false;
+  domainItems.value.splice(scope.$index, 1);
+}
+
+
+
+function _validate(row) {
+  return (
+    row.index !== undefined &&
+    row.index !== '' &&
+    row.text !== undefined &&
+    row.text !== '' &&
+    row.value !== undefined &&
+    row.value !== ''
+  );
+}
+
+onMounted(() => {
+  domainApi.fetchDomainCatalog().then((res) => {
+    domainCatalog.value = res.map((item) => ({
+      title: item.name,
+      categoly: '绯荤粺閰嶇疆椤�',
+      data: item
+    }));
+    chooseCatalog(domainCatalog.value[0]);
+  });
+});
+</script>
diff --git a/src/views/fysp/scene/SceneInspectFile.vue b/src/views/fysp/scene/SceneInspectFile.vue
index 2f0e860..ddeaeb4 100644
--- a/src/views/fysp/scene/SceneInspectFile.vue
+++ b/src/views/fysp/scene/SceneInspectFile.vue
@@ -28,21 +28,26 @@
                 '鍦板潃锛�' + item.scense.location
               }}</el-text>
             </div>
-            <el-space class="m-t-4">
-              <el-tag>
-                {{
-                  item.scense.cityname +
-                  item.scense.districtname +
-                  item.scense.townname
-                }}
-                <!-- {{ item.scense.districtname }}
-                {{ item.scense.townname }} -->
-              </el-tag>
-              <el-tag>{{ item.scense.type }}</el-tag>
-
-              <!-- {{ item.scense.contacts }}
-              {{ item.scense.contactst }} -->
-            </el-space>
+            <el-row justify="space-between">
+              <el-space class="m-t-4">
+                <el-tag>
+                  {{
+                    item.scense.cityname +
+                    item.scense.districtname +
+                    item.scense.townname
+                  }}
+                </el-tag>
+                <el-tag>{{ item.scense.type }}</el-tag>
+              </el-space>
+              <el-button
+                type="default"
+                size="small"
+                class="m-t-4"
+                @click="handlePreview(item)"
+              >
+                棰勮
+              </el-button>
+            </el-row>
           </el-checkbox>
         </el-space>
       </el-checkbox-group>
@@ -53,11 +58,28 @@
         <el-button type="primary" :loading="docLoading" @click="handelDownload">
           涓嬭浇
         </el-button>
-        <!-- <el-button type="default" :loading="docLoading" @click="handelPrint">
+        <el-button type="default" :loading="docLoading" @click="handelPrint">
           鎵撳嵃
-        </el-button> -->
+        </el-button>
       </div>
     </template>
+  </el-dialog>
+  <el-dialog v-model="previewVisible" :show-close="false" fullscreen>
+    <template #header="{ close, titleId, titleClass }">
+      <el-row justify="end">
+        <el-button type="danger" @click="close" icon="CircleCloseFilled">
+          鍏抽棴
+        </el-button>
+        <el-button
+          type="primary"
+          @click="handelPrint(refWord)"
+          icon="PrintFilled"
+        >
+          鎵撳嵃
+        </el-button>
+      </el-row>
+    </template>
+    <div ref="refWord"></div>
   </el-dialog>
 </template>
 <script setup>
@@ -65,23 +87,36 @@
  * 鍦烘櫙宸℃煡鍗曟嵁鑷姩涓嬭浇
  */
 import { ref, watch } from 'vue';
-import { exportDocx } from '@/utils/doc';
+import {
+  exportDocx,
+  prepareDocxBlob,
+  preparePdf,
+  previewDocx,
+  downloadDocx,
+  print
+} from '@/utils/doc';
 import sceneApi from '@/api/fysp/sceneApi';
 
 const props = defineProps({
   // 瀵硅瘽妗嗗紑鍏�
   modelValue: Boolean,
   // 鍦烘櫙鍩虹淇℃伅鏁扮粍
-  value: Array
+  value: Array,
+  previewElement: String
 });
 
 const emits = defineEmits(['update:modelValue']);
+
+const refWord = ref(null);
 
 const loading = ref(false);
 const scrollbarRef = ref();
 const sceneInfoList = ref([]);
 const checkList = ref([]);
 const docLoading = ref(false);
+
+// 棰勮瀵硅瘽妗嗗紑鍏�
+const previewVisible = ref(false);
 
 watch(
   () => [props.modelValue, props.value],
@@ -139,10 +174,12 @@
 }
 
 // 鏍煎紡鍖栧満鏅俊鎭紝鐢熸垚鍙傛暟缁撴瀯
-function parseParam() {
-  const selected = sceneInfoList.value.filter((v, i) => {
-    return checkList.value.indexOf(i) != -1;
-  });
+function parseParam(item) {
+  const selected = item
+    ? [item]
+    : sceneInfoList.value.filter((v, i) => {
+        return checkList.value.indexOf(i) != -1;
+      });
   const param = selected.map((v) => {
     switch (v.scense.typeid) {
       // 宸ュ湴
@@ -187,22 +224,12 @@
     }
   });
 
-  // param.forEach((p) => {
-  //   for (const key in p.params) {
-  //     let value = p.params[key];
-  //     if (value == undefined) {
-  //       // 鑻ュ睘鎬х己澶憋紝鍒欐敼涓�20涓┖鏍肩锛屽搴攚ord涓�10涓腑鏂囧瓧绗︾殑闀垮害
-  //       p.params[key] = '                    ';
-  //     }
-  //   }
-  // });
-
   return param;
 }
 
 // 鏍规嵁鍦烘櫙绫诲瀷锛岀敓鎴愬搴旂殑word鏂囨。
-function generateDoc(param) {
-  param.forEach((p) => {
+function generateDoc(param, callback) {
+  param.map((p) => {
     let template, _param;
     switch (p.type) {
       // 宸ュ湴
@@ -218,39 +245,72 @@
       default:
         break;
     }
-
-    exportDocx(template, _param, `${_param.name}宸℃煡鍗曟嵁.docx`).finally(
-      () => (docLoading.value = false)
-    );
+    prepareDocxBlob(template, _param).then((blob) => {
+      callback(blob, `${_param.name}宸℃煡鍗曟嵁.docx`);
+    });
   });
 }
 
-// 涓嬭浇word鏂囨。
-function download(file) {}
+function generatePdf(param, callback) {
+  param.map((p) => {
+    let template, _param;
+    switch (p.type) {
+      // 宸ュ湴
+      case 1:
+        template = '/宸ュ湴宸℃煡鍗曟嵁妯℃澘.docx';
+        _param = p.params;
+        break;
+      // 椁愰ギ
+      case 5:
+        template = '/椁愰ギ宸℃煡鍗曟嵁妯℃澘.docx';
+        _param = p.params;
+        break;
+      default:
+        break;
+    }
+    preparePdf(template, _param).then((blob) => {
+      callback(blob, `${_param.name}宸℃煡鍗曟嵁.pdf`);
+    });
+  });
+}
 
-// 鎵撳嵃word鏂囨。
-function print(file) {}
-
-function filePrepare() {
+function filePrepare(callback) {
   const param = parseParam();
   if (param) {
-    return generateDoc(param);
+    return generateDoc(param, callback);
   }
 }
 
-// 鐐瑰嚮涓嬭浇鎸夐挳鎿嶄綔
+// 鐐瑰嚮涓嬭浇鎸夐挳鎿嶄綔, 涓嬭浇word鏂囨。
 function handelDownload() {
-  const file = filePrepare();
-  if (file) {
-    download(file);
-  }
+  filePrepare((blob, name) => {
+    downloadDocx(blob, name);
+  });
 }
 
 // 鐐瑰嚮鎵撳嵃鎸夐挳鎿嶄綔
-function handelPrint() {
-  const file = filePrepare();
-  if (file) {
-    print(file);
+function handelPrint(ref) {
+  if (ref) {
+    print(ref);
+  }
+  // const file = filePrepare();
+  // if (file) {
+  //   previewDocx(file.blob, refWord.value);
+  // }
+}
+
+function handlePreview(item) {
+  const param = parseParam(item);
+  if (param) {
+    generatePdf(param, (blob, name) => {
+      blob.getBuffer((buffer) => {
+        previewDocx(buffer, refWord.value);
+      });
+      previewVisible.value = true;
+      // setTimeout(() => {
+      //   previewDocx(blob, refWord.value);
+      // }, 200);
+    });
   }
 }
 
@@ -271,4 +331,7 @@
 :deep(.el-checkbox) {
   height: auto;
 }
+:deep(.el-checkbox__label) {
+  width: 100%;
+}
 </style>

--
Gitblit v1.9.3