Bläddra i källkod

瓶贴二维码

zengfanwei 1 månad sedan
förälder
incheckning
25f90eda84

+ 246 - 42
package-lock.json

@@ -41,6 +41,8 @@
         "nprogress": "0.2.0",
         "pinia": "2.1.7",
         "qrcanvas": "3.1.2",
+        "qrcode": "^1.5.4",
+        "qrcode.vue": "^3.6.0",
         "qs": "^6.13.0",
         "sortablejs": "1.15.2",
         "vue": "^3.5.6",
@@ -4377,7 +4379,6 @@
       "version": "5.0.1",
       "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz",
       "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
-      "dev": true,
       "engines": {
         "node": ">=8"
       }
@@ -4386,7 +4387,6 @@
       "version": "4.3.0",
       "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz",
       "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-      "dev": true,
       "dependencies": {
         "color-convert": "^2.0.1"
       },
@@ -4923,6 +4923,14 @@
         "tslib": "^2.0.3"
       }
     },
+    "node_modules/camelcase": {
+      "version": "5.3.1",
+      "resolved": "https://registry.npmmirror.com/camelcase/-/camelcase-5.3.1.tgz",
+      "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
+      "engines": {
+        "node": ">=6"
+      }
+    },
     "node_modules/caniuse-api": {
       "version": "3.0.0",
       "resolved": "https://registry.npmmirror.com/caniuse-api/-/caniuse-api-3.0.0.tgz",
@@ -5310,7 +5318,6 @@
       "version": "2.0.1",
       "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz",
       "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-      "dev": true,
       "dependencies": {
         "color-name": "~1.1.4"
       },
@@ -5321,8 +5328,7 @@
     "node_modules/color-name": {
       "version": "1.1.4",
       "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz",
-      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-      "dev": true
+      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
     },
     "node_modules/colord": {
       "version": "2.9.3",
@@ -6341,6 +6347,14 @@
         }
       }
     },
+    "node_modules/decamelize": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmmirror.com/decamelize/-/decamelize-1.2.0.tgz",
+      "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
     "node_modules/default-gateway": {
       "version": "6.0.3",
       "resolved": "https://registry.npmmirror.com/default-gateway/-/default-gateway-6.0.3.tgz",
@@ -6527,6 +6541,11 @@
       "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==",
       "dev": true
     },
+    "node_modules/dijkstrajs": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmmirror.com/dijkstrajs/-/dijkstrajs-1.0.3.tgz",
+      "integrity": "sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA=="
+    },
     "node_modules/dir-glob": {
       "version": "3.0.1",
       "resolved": "https://registry.npmmirror.com/dir-glob/-/dir-glob-3.0.1.tgz",
@@ -6850,8 +6869,7 @@
     "node_modules/emoji-regex": {
       "version": "8.0.0",
       "resolved": "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz",
-      "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
-      "dev": true
+      "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="
     },
     "node_modules/emojis-list": {
       "version": "3.0.0",
@@ -7462,7 +7480,6 @@
       "version": "4.1.0",
       "resolved": "https://registry.npmmirror.com/find-up/-/find-up-4.1.0.tgz",
       "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
-      "dev": true,
       "dependencies": {
         "locate-path": "^5.0.0",
         "path-exists": "^4.0.0"
@@ -7629,7 +7646,6 @@
       "version": "2.0.5",
       "resolved": "https://registry.npmmirror.com/get-caller-file/-/get-caller-file-2.0.5.tgz",
       "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
-      "dev": true,
       "engines": {
         "node": "6.* || 8.* || >= 10.*"
       }
@@ -8226,7 +8242,6 @@
       "version": "3.0.0",
       "resolved": "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
       "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
-      "dev": true,
       "engines": {
         "node": ">=8"
       }
@@ -8740,7 +8755,6 @@
       "version": "5.0.0",
       "resolved": "https://registry.npmmirror.com/locate-path/-/locate-path-5.0.0.tgz",
       "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
-      "dev": true,
       "dependencies": {
         "p-locate": "^4.1.0"
       },
@@ -9702,7 +9716,6 @@
       "version": "2.3.0",
       "resolved": "https://registry.npmmirror.com/p-limit/-/p-limit-2.3.0.tgz",
       "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
-      "dev": true,
       "dependencies": {
         "p-try": "^2.0.0"
       },
@@ -9714,7 +9727,6 @@
       "version": "4.1.0",
       "resolved": "https://registry.npmmirror.com/p-locate/-/p-locate-4.1.0.tgz",
       "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
-      "dev": true,
       "dependencies": {
         "p-limit": "^2.2.0"
       },
@@ -9739,7 +9751,6 @@
       "version": "2.2.0",
       "resolved": "https://registry.npmmirror.com/p-try/-/p-try-2.2.0.tgz",
       "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
-      "dev": true,
       "engines": {
         "node": ">=6"
       }
@@ -9835,7 +9846,6 @@
       "version": "4.0.0",
       "resolved": "https://registry.npmmirror.com/path-exists/-/path-exists-4.0.0.tgz",
       "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
-      "dev": true,
       "engines": {
         "node": ">=8"
       }
@@ -9952,6 +9962,14 @@
         "pathe": "^1.1.2"
       }
     },
+    "node_modules/pngjs": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmmirror.com/pngjs/-/pngjs-5.0.0.tgz",
+      "integrity": "sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==",
+      "engines": {
+        "node": ">=10.13.0"
+      }
+    },
     "node_modules/portfinder": {
       "version": "1.0.32",
       "resolved": "https://registry.npmmirror.com/portfinder/-/portfinder-1.0.32.tgz",
@@ -10715,11 +10733,96 @@
         "qrcode-generator": "^1.4.4"
       }
     },
+    "node_modules/qrcode": {
+      "version": "1.5.4",
+      "resolved": "https://registry.npmmirror.com/qrcode/-/qrcode-1.5.4.tgz",
+      "integrity": "sha512-1ca71Zgiu6ORjHqFBDpnSMTR2ReToX4l1Au1VFLyVeBTFavzQnv5JxMFr3ukHVKpSrSA2MCk0lNJSykjUfz7Zg==",
+      "dependencies": {
+        "dijkstrajs": "^1.0.1",
+        "pngjs": "^5.0.0",
+        "yargs": "^15.3.1"
+      },
+      "bin": {
+        "qrcode": "bin/qrcode"
+      },
+      "engines": {
+        "node": ">=10.13.0"
+      }
+    },
     "node_modules/qrcode-generator": {
       "version": "1.4.4",
       "resolved": "https://registry.npmmirror.com/qrcode-generator/-/qrcode-generator-1.4.4.tgz",
       "integrity": "sha512-HM7yY8O2ilqhmULxGMpcHSF1EhJJ9yBj8gvDEuZ6M+KGJ0YY2hKpnXvRD+hZPLrDVck3ExIGhmPtSdcjC+guuw=="
     },
+    "node_modules/qrcode.vue": {
+      "version": "3.6.0",
+      "resolved": "https://registry.npmmirror.com/qrcode.vue/-/qrcode.vue-3.6.0.tgz",
+      "integrity": "sha512-vQcl2fyHYHMjDO1GguCldJxepq2izQjBkDEEu9NENgfVKP6mv/e2SU62WbqYHGwTgWXLhxZ1NCD1dAZKHQq1fg==",
+      "peerDependencies": {
+        "vue": "^3.0.0"
+      }
+    },
+    "node_modules/qrcode/node_modules/cliui": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmmirror.com/cliui/-/cliui-6.0.0.tgz",
+      "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==",
+      "dependencies": {
+        "string-width": "^4.2.0",
+        "strip-ansi": "^6.0.0",
+        "wrap-ansi": "^6.2.0"
+      }
+    },
+    "node_modules/qrcode/node_modules/wrap-ansi": {
+      "version": "6.2.0",
+      "resolved": "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
+      "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
+      "dependencies": {
+        "ansi-styles": "^4.0.0",
+        "string-width": "^4.1.0",
+        "strip-ansi": "^6.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/qrcode/node_modules/y18n": {
+      "version": "4.0.3",
+      "resolved": "https://registry.npmmirror.com/y18n/-/y18n-4.0.3.tgz",
+      "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ=="
+    },
+    "node_modules/qrcode/node_modules/yargs": {
+      "version": "15.4.1",
+      "resolved": "https://registry.npmmirror.com/yargs/-/yargs-15.4.1.tgz",
+      "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==",
+      "dependencies": {
+        "cliui": "^6.0.0",
+        "decamelize": "^1.2.0",
+        "find-up": "^4.1.0",
+        "get-caller-file": "^2.0.1",
+        "require-directory": "^2.1.1",
+        "require-main-filename": "^2.0.0",
+        "set-blocking": "^2.0.0",
+        "string-width": "^4.2.0",
+        "which-module": "^2.0.0",
+        "y18n": "^4.0.0",
+        "yargs-parser": "^18.1.2"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/qrcode/node_modules/yargs-parser": {
+      "version": "18.1.3",
+      "resolved": "https://registry.npmmirror.com/yargs-parser/-/yargs-parser-18.1.3.tgz",
+      "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==",
+      "dependencies": {
+        "camelcase": "^5.0.0",
+        "decamelize": "^1.2.0"
+      },
+      "engines": {
+        "node": ">=6"
+      }
+    },
     "node_modules/qs": {
       "version": "6.14.0",
       "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz",
@@ -10978,7 +11081,6 @@
       "version": "2.1.1",
       "resolved": "https://registry.npmmirror.com/require-directory/-/require-directory-2.1.1.tgz",
       "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
-      "dev": true,
       "engines": {
         "node": ">=0.10.0"
       }
@@ -10992,6 +11094,11 @@
         "node": ">=0.10.0"
       }
     },
+    "node_modules/require-main-filename": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmmirror.com/require-main-filename/-/require-main-filename-2.0.0.tgz",
+      "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg=="
+    },
     "node_modules/requires-port": {
       "version": "1.0.0",
       "resolved": "https://registry.npmmirror.com/requires-port/-/requires-port-1.0.0.tgz",
@@ -11413,6 +11520,11 @@
         "node": ">= 0.8"
       }
     },
+    "node_modules/set-blocking": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmmirror.com/set-blocking/-/set-blocking-2.0.0.tgz",
+      "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw=="
+    },
     "node_modules/setimmediate": {
       "version": "1.0.5",
       "resolved": "https://registry.npmmirror.com/setimmediate/-/setimmediate-1.0.5.tgz",
@@ -11740,7 +11852,6 @@
       "version": "4.2.3",
       "resolved": "https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz",
       "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
-      "dev": true,
       "dependencies": {
         "emoji-regex": "^8.0.0",
         "is-fullwidth-code-point": "^3.0.0",
@@ -11754,7 +11865,6 @@
       "version": "6.0.1",
       "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz",
       "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
-      "dev": true,
       "dependencies": {
         "ansi-regex": "^5.0.1"
       },
@@ -14082,6 +14192,11 @@
         "which": "bin/which"
       }
     },
+    "node_modules/which-module": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmmirror.com/which-module/-/which-module-2.0.1.tgz",
+      "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ=="
+    },
     "node_modules/wildcard": {
       "version": "2.0.1",
       "resolved": "https://registry.npmmirror.com/wildcard/-/wildcard-2.0.1.tgz",
@@ -17449,14 +17564,12 @@
     "ansi-regex": {
       "version": "5.0.1",
       "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz",
-      "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
-      "dev": true
+      "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="
     },
     "ansi-styles": {
       "version": "4.3.0",
       "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz",
       "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-      "dev": true,
       "requires": {
         "color-convert": "^2.0.1"
       }
@@ -17871,6 +17984,11 @@
         "tslib": "^2.0.3"
       }
     },
+    "camelcase": {
+      "version": "5.3.1",
+      "resolved": "https://registry.npmmirror.com/camelcase/-/camelcase-5.3.1.tgz",
+      "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg=="
+    },
     "caniuse-api": {
       "version": "3.0.0",
       "resolved": "https://registry.npmmirror.com/caniuse-api/-/caniuse-api-3.0.0.tgz",
@@ -18170,7 +18288,6 @@
       "version": "2.0.1",
       "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz",
       "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-      "dev": true,
       "requires": {
         "color-name": "~1.1.4"
       }
@@ -18178,8 +18295,7 @@
     "color-name": {
       "version": "1.1.4",
       "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz",
-      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-      "dev": true
+      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
     },
     "colord": {
       "version": "2.9.3",
@@ -18949,6 +19065,11 @@
         "ms": "^2.1.3"
       }
     },
+    "decamelize": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmmirror.com/decamelize/-/decamelize-1.2.0.tgz",
+      "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA=="
+    },
     "default-gateway": {
       "version": "6.0.3",
       "resolved": "https://registry.npmmirror.com/default-gateway/-/default-gateway-6.0.3.tgz",
@@ -19089,6 +19210,11 @@
       "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==",
       "dev": true
     },
+    "dijkstrajs": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmmirror.com/dijkstrajs/-/dijkstrajs-1.0.3.tgz",
+      "integrity": "sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA=="
+    },
     "dir-glob": {
       "version": "3.0.1",
       "resolved": "https://registry.npmmirror.com/dir-glob/-/dir-glob-3.0.1.tgz",
@@ -19355,8 +19481,7 @@
     "emoji-regex": {
       "version": "8.0.0",
       "resolved": "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz",
-      "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
-      "dev": true
+      "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="
     },
     "emojis-list": {
       "version": "3.0.0",
@@ -19844,7 +19969,6 @@
       "version": "4.1.0",
       "resolved": "https://registry.npmmirror.com/find-up/-/find-up-4.1.0.tgz",
       "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
-      "dev": true,
       "requires": {
         "locate-path": "^5.0.0",
         "path-exists": "^4.0.0"
@@ -19959,8 +20083,7 @@
     "get-caller-file": {
       "version": "2.0.5",
       "resolved": "https://registry.npmmirror.com/get-caller-file/-/get-caller-file-2.0.5.tgz",
-      "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
-      "dev": true
+      "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="
     },
     "get-intrinsic": {
       "version": "1.3.0",
@@ -20418,8 +20541,7 @@
     "is-fullwidth-code-point": {
       "version": "3.0.0",
       "resolved": "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
-      "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
-      "dev": true
+      "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="
     },
     "is-glob": {
       "version": "4.0.3",
@@ -20844,7 +20966,6 @@
       "version": "5.0.0",
       "resolved": "https://registry.npmmirror.com/locate-path/-/locate-path-5.0.0.tgz",
       "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
-      "dev": true,
       "requires": {
         "p-locate": "^4.1.0"
       }
@@ -21622,7 +21743,6 @@
       "version": "2.3.0",
       "resolved": "https://registry.npmmirror.com/p-limit/-/p-limit-2.3.0.tgz",
       "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
-      "dev": true,
       "requires": {
         "p-try": "^2.0.0"
       }
@@ -21631,7 +21751,6 @@
       "version": "4.1.0",
       "resolved": "https://registry.npmmirror.com/p-locate/-/p-locate-4.1.0.tgz",
       "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
-      "dev": true,
       "requires": {
         "p-limit": "^2.2.0"
       }
@@ -21649,8 +21768,7 @@
     "p-try": {
       "version": "2.2.0",
       "resolved": "https://registry.npmmirror.com/p-try/-/p-try-2.2.0.tgz",
-      "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
-      "dev": true
+      "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ=="
     },
     "pako": {
       "version": "1.0.11",
@@ -21735,8 +21853,7 @@
     "path-exists": {
       "version": "4.0.0",
       "resolved": "https://registry.npmmirror.com/path-exists/-/path-exists-4.0.0.tgz",
-      "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
-      "dev": true
+      "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="
     },
     "path-is-absolute": {
       "version": "1.0.1",
@@ -21811,6 +21928,11 @@
         "pathe": "^1.1.2"
       }
     },
+    "pngjs": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmmirror.com/pngjs/-/pngjs-5.0.0.tgz",
+      "integrity": "sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw=="
+    },
     "portfinder": {
       "version": "1.0.32",
       "resolved": "https://registry.npmmirror.com/portfinder/-/portfinder-1.0.32.tgz",
@@ -22324,11 +22446,81 @@
         "qrcode-generator": "^1.4.4"
       }
     },
+    "qrcode": {
+      "version": "1.5.4",
+      "resolved": "https://registry.npmmirror.com/qrcode/-/qrcode-1.5.4.tgz",
+      "integrity": "sha512-1ca71Zgiu6ORjHqFBDpnSMTR2ReToX4l1Au1VFLyVeBTFavzQnv5JxMFr3ukHVKpSrSA2MCk0lNJSykjUfz7Zg==",
+      "requires": {
+        "dijkstrajs": "^1.0.1",
+        "pngjs": "^5.0.0",
+        "yargs": "^15.3.1"
+      },
+      "dependencies": {
+        "cliui": {
+          "version": "6.0.0",
+          "resolved": "https://registry.npmmirror.com/cliui/-/cliui-6.0.0.tgz",
+          "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==",
+          "requires": {
+            "string-width": "^4.2.0",
+            "strip-ansi": "^6.0.0",
+            "wrap-ansi": "^6.2.0"
+          }
+        },
+        "wrap-ansi": {
+          "version": "6.2.0",
+          "resolved": "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
+          "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
+          "requires": {
+            "ansi-styles": "^4.0.0",
+            "string-width": "^4.1.0",
+            "strip-ansi": "^6.0.0"
+          }
+        },
+        "y18n": {
+          "version": "4.0.3",
+          "resolved": "https://registry.npmmirror.com/y18n/-/y18n-4.0.3.tgz",
+          "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ=="
+        },
+        "yargs": {
+          "version": "15.4.1",
+          "resolved": "https://registry.npmmirror.com/yargs/-/yargs-15.4.1.tgz",
+          "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==",
+          "requires": {
+            "cliui": "^6.0.0",
+            "decamelize": "^1.2.0",
+            "find-up": "^4.1.0",
+            "get-caller-file": "^2.0.1",
+            "require-directory": "^2.1.1",
+            "require-main-filename": "^2.0.0",
+            "set-blocking": "^2.0.0",
+            "string-width": "^4.2.0",
+            "which-module": "^2.0.0",
+            "y18n": "^4.0.0",
+            "yargs-parser": "^18.1.2"
+          }
+        },
+        "yargs-parser": {
+          "version": "18.1.3",
+          "resolved": "https://registry.npmmirror.com/yargs-parser/-/yargs-parser-18.1.3.tgz",
+          "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==",
+          "requires": {
+            "camelcase": "^5.0.0",
+            "decamelize": "^1.2.0"
+          }
+        }
+      }
+    },
     "qrcode-generator": {
       "version": "1.4.4",
       "resolved": "https://registry.npmmirror.com/qrcode-generator/-/qrcode-generator-1.4.4.tgz",
       "integrity": "sha512-HM7yY8O2ilqhmULxGMpcHSF1EhJJ9yBj8gvDEuZ6M+KGJ0YY2hKpnXvRD+hZPLrDVck3ExIGhmPtSdcjC+guuw=="
     },
+    "qrcode.vue": {
+      "version": "3.6.0",
+      "resolved": "https://registry.npmmirror.com/qrcode.vue/-/qrcode.vue-3.6.0.tgz",
+      "integrity": "sha512-vQcl2fyHYHMjDO1GguCldJxepq2izQjBkDEEu9NENgfVKP6mv/e2SU62WbqYHGwTgWXLhxZ1NCD1dAZKHQq1fg==",
+      "requires": {}
+    },
     "qs": {
       "version": "6.14.0",
       "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz",
@@ -22535,8 +22727,7 @@
     "require-directory": {
       "version": "2.1.1",
       "resolved": "https://registry.npmmirror.com/require-directory/-/require-directory-2.1.1.tgz",
-      "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
-      "dev": true
+      "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q=="
     },
     "require-from-string": {
       "version": "2.0.2",
@@ -22544,6 +22735,11 @@
       "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
       "dev": true
     },
+    "require-main-filename": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmmirror.com/require-main-filename/-/require-main-filename-2.0.0.tgz",
+      "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg=="
+    },
     "requires-port": {
       "version": "1.0.0",
       "resolved": "https://registry.npmmirror.com/requires-port/-/requires-port-1.0.0.tgz",
@@ -22876,6 +23072,11 @@
         }
       }
     },
+    "set-blocking": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmmirror.com/set-blocking/-/set-blocking-2.0.0.tgz",
+      "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw=="
+    },
     "setimmediate": {
       "version": "1.0.5",
       "resolved": "https://registry.npmmirror.com/setimmediate/-/setimmediate-1.0.5.tgz",
@@ -23136,7 +23337,6 @@
       "version": "4.2.3",
       "resolved": "https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz",
       "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
-      "dev": true,
       "requires": {
         "emoji-regex": "^8.0.0",
         "is-fullwidth-code-point": "^3.0.0",
@@ -23147,7 +23347,6 @@
       "version": "6.0.1",
       "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz",
       "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
-      "dev": true,
       "requires": {
         "ansi-regex": "^5.0.1"
       }
@@ -24785,6 +24984,11 @@
         "isexe": "^2.0.0"
       }
     },
+    "which-module": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmmirror.com/which-module/-/which-module-2.0.1.tgz",
+      "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ=="
+    },
     "wildcard": {
       "version": "2.0.1",
       "resolved": "https://registry.npmmirror.com/wildcard/-/wildcard-2.0.1.tgz",

+ 2 - 0
package.json

@@ -40,6 +40,8 @@
     "nprogress": "0.2.0",
     "pinia": "2.1.7",
     "qrcanvas": "3.1.2",
+    "qrcode": "^1.5.4",
+    "qrcode.vue": "^3.6.0",
     "qs": "^6.13.0",
     "sortablejs": "1.15.2",
     "vue": "^3.5.6",

+ 137 - 51
src/components/inpatient/nurse-module/BottleCard.vue

@@ -1,67 +1,95 @@
 <template>
-  <div style="width: 230px;padding: 4px;border: 1px solid black;border-radius: 4px">
-    <table style="width: 100%;border-spacing: 0; border-collapse: collapse;table-layout: fixed">
+  <div
+    style="
+      width: 230px;
+      padding: 4px;
+      border: 1px solid black;
+      border-radius: 4px;
+    "
+  >
+    <table
+      style="
+        width: 100%;
+        border-spacing: 0;
+        border-collapse: collapse;
+        table-layout: fixed;
+      "
+    >
       <thead>
-        <tr style="font-size: 20px;">
-          <th colspan="4" style="text-align: left;font-weight: bold">
+        <tr style="font-size: 14px">
+          <th colspan="2" style="text-align: left; font-weight: bold">
             {{ patInfo.patName }}
           </th>
-          <th colspan="2" style="text-align: left">
+          <th>
             {{ bottleGroup }}
           </th>
-          <th colspan="2" style="text-align: right">
-            {{ patInfo.bedNo }}
+          <th colspan="2">{{ patInfo.bedNo }}</th>
+          <th colspan="3" rowspan="3" style="padding-left: 0px">
+            <!-- <qrcode-vue
+              ref="qrcode"
+              :value="qrContent"
+              :size="80"
+              :margin="0"
+              errorCorrectionLevel="L"
+              color-dark="#000"
+              color-light="#fff"
+              style="display: none"
+              @ready="onQrReady"
+            />
+            <img
+              ref="qrImage"
+              :src="qrImageSrc"
+              v-if="qrImageSrc"
+              style="border: 1px solid #eee"
+            /> -->
+            <img :src="qrImageSrc" v-if="qrImageSrc" />
           </th>
         </tr>
-        <tr  style="font-size: 14px;font-weight: bold;">
-          <th colspan="5" style="text-align: left">
+        <tr style="font-size: 14px; font-weight: bold">
+          <th colspan="7" style="text-align: left">
             <!-- {{ patInfo.patName }} -->
             {{ patInfo.patGender }}
             {{ patInfo.ageLabel }}
-            {{ patInfo.wardName }}
+            <!-- {{ patInfo.wardName }} -->
           </th>
-          <th colspan="3" style="text-align: right">
+
+          <!-- <th colspan="3" style="text-align: right">
             {{ simpleYzDate }}
-          </th>
+          </th> -->
         </tr>
-        <!-- <tr>
-          <th colspan="3" style="text-align: left">
-            {{ patInfo.wardName }}
-          </th>
-          <th colspan="3">
-            {{ bottleGroup }}
-          </th>
-          <th colspan="2" style="text-align: right">
-            {{ simpleYzDate }}
+        <tr>
+          <th colspan="7" style="text-align: left">
+            {{ formatOccTime(drugs[0].occTime) }}
           </th>
-        </tr> -->
+        </tr>
       </thead>
       <tbody>
         <tr>
-          <td colspan="5">药品名称 / 规格</td>
+          <td colspan="6">药品名称 / 规格</td>
           <!-- <td style="width: 36px;text-align: center;">规格</td> -->
-          <td style="width: 36px;text-align: center;">频率</td>
-          <td style="width: 36px;text-align: center;">用法</td>
-          <td style="width: 36px;text-align: center;">数量</td>
+          <!-- <td style="width: 36px; text-align: center">频率</td> -->
+          <td style="width: 36px; text-align: center">用法</td>
+          <td style="width: 36px; text-align: center">数量</td>
         </tr>
         <tr v-for="item in drugs">
-          <td colspan="5" style="width: 100%;height: 100%;position: relative">
-            <div style="margin-bottom: 10px;">
+          <td colspan="6" style="width: 100%; height: 100%; position: relative">
+            <div style="margin-bottom: 10px">
               {{ item.drugName }}
               <!-- <br/>
               <br/> -->
             </div>
-            <div style="width: 100%;text-align: center;font-weight: bold;">{{ item.specification }}</div>
+            <div style="width: 100%; text-align: center; font-weight: bold">
+              {{ item.specification }}
+            </div>
           </td>
           <!-- <td>
             <div style="width: 20px;font-weight: bolder;padding: 0 1px;word-wrap: break-word;">
               {{ item.specification }}
             </div>
           </td> -->
-          <td style="text-align: right">
+          <!-- <td style="text-align: right">
             <div>{{ item.frequCode }}</div>
-            <!-- <div>{{ item.startHour }}</div> -->
-          </td>
+          </td> -->
           <td style="text-align: center">
             {{ item.instruction }}
             <!-- {{ drugs[0].instruction }} -->
@@ -71,16 +99,19 @@
           </td>
         </tr>
         <tr>
-          <td colspan="2" style="text-align: center;">配药时间</td>
-          <td colspan="2" style="width: 36px;text-align: center;">加药</td>
-          <td colspan="2" style="width: 36px;text-align: center;">摆药</td>
-          <td colspan="2" style="width: 36px;text-align: center;">审核</td>
+          <td colspan="2" style="text-align: center">配药时间</td>
+          <td colspan="2" style="width: 36px; text-align: center">加药</td>
+          <td colspan="2" style="width: 36px; text-align: center">摆药</td>
+          <td colspan="2" style="width: 36px; text-align: center">审核</td>
         </tr>
         <tr>
-          <td colspan="2" style="text-align: center;"></td>
-          <td colspan="2" style="width: 36px;height:30px ;text-align: center;"></td>
-          <td colspan="2" style="width: 36px;text-align: center;"></td>
-          <td colspan="2" style="width: 36px;text-align: center;"></td>
+          <td colspan="2" style="text-align: center"></td>
+          <td
+            colspan="2"
+            style="width: 36px; height: 30px; text-align: center"
+          ></td>
+          <td colspan="2" style="width: 36px; text-align: center"></td>
+          <td colspan="2" style="width: 36px; text-align: center"></td>
         </tr>
       </tbody>
     </table>
@@ -88,32 +119,87 @@
 </template>
 
 <script setup>
+import QRCode from "qrcode";
+onMounted(() => {
+  loadQrImage();
+});
+import QrcodeVue from "qrcode.vue";
 const props = defineProps({
   drugs: {
     type: Array,
-    required: true
+    required: true,
   },
   patInfo: {
     type: Object,
-    required: true
+    required: true,
   },
   yzDate: {
     type: String,
-    required: true
+    required: true,
   },
   bottleGroup: {
     type: String,
-    required: true
+    required: true,
+  },
+  qrContent: {
+    type: String,
+    required: true,
+  },
+});
+
+const qrImageSrc = ref("");
+
+const loadQrImage = async () => {
+  try {
+    const { qrContent } = props; // 从 props 中解构出 qrContent(普通值,非 ref)
+    qrImageSrc.value = await QRCode.toDataURL(qrContent, {
+      // 直接使用 qrContent,不要加 .value
+      width: 85,
+      margin: 1,
+      color: {
+        dark: "#000000",
+        light: "#ffffff",
+      },
+    });
+  } catch (err) {
+    console.error("生成二维码失败:", err);
   }
-})
+};
+const onQrReady = () => {
+  const canvas = this.$refs.qrcode.$el.querySelector("canvas");
+  console.log(canvas);
+  if (canvas) {
+    // 转为 base64 图片(PNG格式,支持透明背景)
+    qrImageSrc.value = canvas.toDataURL("image/png");
+  }
+};
 
 const simpleYzDate = computed(() => {
-  console.log('yzDate',props.yzDate)
-  if(props.yzDate instanceof Date) return ""
-  let arr = props.yzDate.split('-')
-  return arr[1] + '/' + arr[2]
-})
+  // console.log('yzDate',props.yzDate)
+  if (props.yzDate instanceof Date) return "";
+  let arr = props.yzDate.split("-");
+  return arr[1] + "/" + arr[2];
+});
+
+const formatOccTime = timeStr => {
+  const timestamp = new Date(timeStr).getTime();
+  if (!timestamp || isNaN(timestamp)) {
+    return "";
+  }
+
+  const date = new Date(timestamp);
+
+  // 获取年、月、日、时、分、秒(注意月份从0开始,需+1)
+  const year = date.getFullYear();
+  const month = String(date.getMonth() + 1).padStart(2, "0"); // 补零(如 9 → "09")
+  const day = String(date.getDate()).padStart(2, "0");
+  const hours = String(date.getHours()).padStart(2, "0");
+  const minutes = String(date.getMinutes()).padStart(2, "0");
+  const seconds = String(date.getSeconds()).padStart(2, "0");
 
+  // 拼接为 yyyyMMddHHmmss 格式
+  return `${year}${month}${day}${hours}${minutes}${seconds}`;
+};
 </script>
 
 <style scoped>
@@ -122,4 +208,4 @@ td {
   font-size: 12px;
   padding: 2px;
 }
-</style>
+</style>

+ 402 - 196
src/views/hospitalization/nurse-module/PrintInfusionCard.vue

@@ -5,20 +5,40 @@
         <div class="search-item-area">
           <div class="search-item">
             <div class="ml12">病区:</div>
-            <el-select v-model="queryParams.wardCode" style="width:88px" @change="handleWardChange">
-              <el-option v-for="item in userWards" :value="item.value" :label="item.label"></el-option>
+            <el-select
+              v-model="queryParams.wardCode"
+              style="width: 88px"
+              @change="handleWardChange"
+            >
+              <el-option
+                v-for="item in userWards"
+                :value="item.value"
+                :label="item.label"
+              ></el-option>
             </el-select>
           </div>
           <div class="search-item">
             <div class="ml12">执行日期:</div>
-            <el-date-picker v-model="queryParams.executeDate" :clearable="false" style="width: 102px"
-              @change="datePickChange"></el-date-picker>
+            <el-date-picker
+              v-model="queryParams.executeDate"
+              :clearable="false"
+              style="width: 102px"
+              @change="datePickChange"
+            ></el-date-picker>
           </div>
           <div class="search-item">
             <div class="ml12">床位范围:</div>
-            <el-select v-model="queryParams.bedNoStart" style="width: 70px" value-key="bedNo"
-              @change="handleStartBedChange">
-              <el-option v-for="item in patientBedList" :key="item.bedNo" :value="item">
+            <el-select
+              v-model="queryParams.bedNoStart"
+              style="width: 70px"
+              value-key="bedNo"
+              @change="handleStartBedChange"
+            >
+              <el-option
+                v-for="item in patientBedList"
+                :key="item.bedNo"
+                :value="item"
+              >
                 {{ item.bedNoLabel }}
                 <el-divider direction="vertical"></el-divider>
                 <span class="green-text">{{ item.patNo }}</span>
@@ -27,20 +47,39 @@
               </el-option>
             </el-select>
             <span style="margin: 0 4px; font-size: 11px">至</span>
-            <el-select v-model="queryParams.bedNoEnd" style="width: 70px" value-key="bedNo"
-              @change="handleEndBedChange">
-              <el-option v-for="item in patientBedList" :key="item.bedNo" :value="item"
-                :disabled="item.sortNo < queryParams.sortNoStart">
+            <el-select
+              v-model="queryParams.bedNoEnd"
+              style="width: 70px"
+              value-key="bedNo"
+              @change="handleEndBedChange"
+            >
+              <el-option
+                v-for="item in patientBedList"
+                :key="item.bedNo"
+                :value="item"
+                :disabled="item.sortNo < queryParams.sortNoStart"
+              >
                 {{ item.bedNoLabel }}
                 <el-divider direction="vertical"></el-divider>
-                <span :class="item.sortNo < queryParams.sortNoStart ? 'is-disabled' : 'green-text'">{{ item.patNo
-                }}</span>
+                <span
+                  :class="
+                    item.sortNo < queryParams.sortNoStart
+                      ? 'is-disabled'
+                      : 'green-text'
+                  "
+                  >{{ item.patNo }}</span
+                >
                 <el-divider direction="vertical"></el-divider>
-                <span :class="item.sortNo < queryParams.sortNoStart ? 'is-disabled' : 'blue-text'">{{ item.patName
-                }}</span>
+                <span
+                  :class="
+                    item.sortNo < queryParams.sortNoStart
+                      ? 'is-disabled'
+                      : 'blue-text'
+                  "
+                  >{{ item.patName }}</span
+                >
               </el-option>
             </el-select>
-
           </div>
           <div class="search-item">
             <div class="ml12">频率:</div>
@@ -60,7 +99,11 @@
           </div>
           <div class="search-item">
             <div class="ml12">类型:</div>
-            <el-select v-model="queryParams.cardType" @change="handleTypeChange" style="width: 76px">
+            <el-select
+              v-model="queryParams.cardType"
+              @change="handleTypeChange"
+              style="width: 76px"
+            >
               <el-option value="INFUSION_CARD" label="巡回单"></el-option>
               <el-option value="BOTTLE_CARD" label="瓶贴"></el-option>
             </el-select>
@@ -78,42 +121,80 @@
               <el-option :value="10" label="雾化"></el-option>
               <el-option :value="11" label="皮试"></el-option>
               <el-option :value="12" label="鼻饲"></el-option>
-
             </el-select>
           </div>
         </div>
         <el-divider direction="vertical"></el-divider>
         <div class="search-btn">
-          <el-button type="primary" icon="Search" @click="executeQuery">检索</el-button>
-          <el-button type="primary" icon="Printer" @click="execPrint">打印</el-button>
+          <el-button type="primary" icon="Search" @click="executeQuery"
+            >检索</el-button
+          >
+          <el-button type="primary" icon="Printer" @click="execPrint"
+            >打印</el-button
+          >
         </div>
       </div>
     </template>
     <template #main>
       <div style="display: flex; flex-wrap: wrap" id="infusion_list">
         <div v-if="queryParams.cardType === 'INFUSION_CARD'">
-          <div v-for="(item, index) in patientInfusionInfos" :id="item.patInfo.patNo">
-            <div class="crad-area"
-              style="width: 90%; margin: 8px 12px; padding: 4px; border: 1px solid red ;display: flex;justify-content: center; align-items: center;">
-              <infusion-card :drug-groups="item.drugGroups" :pat-info="item.patInfo" :yz-date="queryParams.executeDate"
-                :print-date="printDate">
+          <div
+            v-for="(item, index) in patientInfusionInfos"
+            :id="item.patInfo.patNo"
+          >
+            <div
+              class="crad-area"
+              style="
+                width: 90%;
+                margin: 8px 12px;
+                padding: 4px;
+                border: 1px solid red;
+                display: flex;
+                justify-content: center;
+                align-items: center;
+              "
+            >
+              <infusion-card
+                :drug-groups="item.drugGroups"
+                :pat-info="item.patInfo"
+                :yz-date="queryParams.executeDate"
+                :print-date="printDate"
+              >
               </infusion-card>
             </div>
           </div>
         </div>
         <div v-else id="print-test">
-          <div v-for="(item, index) in patientInfusionInfos" :id="item.patInfo.patNo + '-' + index"
-            style="width: 230px;display: inline-block;margin-right: 20px">
-            <bottle-card :drugs="item.bottleCardDrugs" :pat-info="item.patInfo" :yz-date="queryParams.executeDate"
-              :bottle-group="item.bottleGroup" style="margin-bottom: 10px;">
+          <div
+            v-for="(item, index) in patientInfusionInfos"
+            :id="item.patInfo.patNo + '-' + index"
+            style="width: 230px; display: inline-block; margin-right: 20px"
+          >
+            <bottle-card
+              :drugs="item.bottleCardDrugs"
+              :pat-info="item.patInfo"
+              :yz-date="queryParams.executeDate"
+              :bottle-group="item.bottleGroup"
+              :qr-content="item.qrContent"
+              style="margin-bottom: 10px"
+            >
             </bottle-card>
           </div>
         </div>
         <div class="print-hiden-area" style="margin: 0px 12px">
-          <div v-for="(item, index) in printPatientBottleInfos" :id="item.patInfo.patNo + '-' + index + '_print'"
-            style="width: 230px;display: inline-block;margin-right: 20px">
-            <bottle-card :drugs="item.bottleCardDrugs" :pat-info="item.patInfo" :yz-date="queryParams.executeDate"
-              :bottle-group="item.bottleGroup" style="margin-bottom: 10px;">
+          <div
+            v-for="(item, index) in printPatientBottleInfos"
+            :id="item.patInfo.patNo + '-' + index + '_print'"
+            style="width: 230px; display: inline-block; margin-right: 20px"
+          >
+            <bottle-card
+              :drugs="item.bottleCardDrugs"
+              :pat-info="item.patInfo"
+              :yz-date="queryParams.executeDate"
+              :bottle-group="item.bottleGroup"
+              :qr-content="item.qrContent"
+              style="margin-bottom: 10px"
+            >
             </bottle-card>
           </div>
         </div>
@@ -128,8 +209,8 @@ import { formatDate, getDatetime, getDate } from "@/utils/date";
 import {
   getPatientBeds,
   queryInfusionCardOrBottleCard,
-  updatePrintStatus
-} from '@/api/inpatient/nurse-module/print-infusion-card'
+  updatePrintStatus,
+} from "@/api/inpatient/nurse-module/print-infusion-card";
 import InfusionCard from "@/components/inpatient/nurse-module/InfusionCard.vue";
 import { ElMessage } from "element-plus";
 import { getLodop, initLodop } from "@/utils/c-lodop";
@@ -137,27 +218,27 @@ import BottleCard from "@/components/inpatient/nurse-module/BottleCard.vue";
 import { getWardsApi } from "@/api/login";
 import { query } from "@/api/zfsf/pos-transaction";
 
-const userWards = ref([])
+const userWards = ref([]);
 
-const patientBedList = ref([])
-const printDate = ref(null)
+const patientBedList = ref([]);
+const printDate = ref(null);
 
-const handleWardChange = (wardCode) => {
+const handleWardChange = wardCode => {
   getPatientBeds(wardCode).then(res => {
-    patientBedList.value = res
+    patientBedList.value = res;
     if (res.length > 0) {
-      queryParams.bedNoStart = res[0].bedNoLabel
-      queryParams.sortNoStart = res[0].sortNo
-      queryParams.bedNoEnd = res[res.length - 1].bedNoLabel
-      queryParams.sortNoEnd = res[res.length - 1].sortNo
+      queryParams.bedNoStart = res[0].bedNoLabel;
+      queryParams.sortNoStart = res[0].sortNo;
+      queryParams.bedNoEnd = res[res.length - 1].bedNoLabel;
+      queryParams.sortNoEnd = res[res.length - 1].sortNo;
     } else {
-      queryParams.bedNoStart = null
-      queryParams.sortNoStart = null
-      queryParams.bedNoEnd = null
-      queryParams.sortNoEnd = null
+      queryParams.bedNoStart = null;
+      queryParams.sortNoStart = null;
+      queryParams.bedNoEnd = null;
+      queryParams.sortNoEnd = null;
     }
-  })
-}
+  });
+};
 
 const queryParams = reactive({
   executeDate: getDate(),
@@ -166,169 +247,274 @@ const queryParams = reactive({
   bedNoEnd: null,
   sortNoStart: null,
   sortNoEnd: null,
-  frequency: 'ALWAYS',
-  printRange: 'UNPRINTED',
-  cardType: 'INFUSION_CARD',
+  frequency: "ALWAYS",
+  printRange: "UNPRINTED",
+  cardType: "INFUSION_CARD",
   // bedNos: [] ,
   patNos: [],
-  drugSupplyType: 2
-})
+  drugSupplyType: 2,
+});
 
-const patientInfusionInfos = ref([])
-const printPatientBottleInfos = ref([])
+const patientInfusionInfos = ref([]);
+const printPatientBottleInfos = ref([]);
 
-const handleStartBedChange = (bed) => {
-  queryParams.bedNoStart = bed.bedNoLabel
-  queryParams.sortNoStart = bed.sortNo
-}
+const handleStartBedChange = bed => {
+  queryParams.bedNoStart = bed.bedNoLabel;
+  queryParams.sortNoStart = bed.sortNo;
+};
 
-const handleEndBedChange = (bed) => {
-  queryParams.bedNoEnd = bed.bedNoLabel
-  queryParams.sortNoEnd = bed.sortNo
-}
+const handleEndBedChange = bed => {
+  queryParams.bedNoEnd = bed.bedNoLabel;
+  queryParams.sortNoEnd = bed.sortNo;
+};
 
-const handleTypeChange = (val) => {
+const handleTypeChange = val => {
   // console.log("val",val)
-  patientInfusionInfos.value = []
+  patientInfusionInfos.value = [];
   // queryParams.drugSupplyType = val == "INFUSION_CARD" ? "" : 2
   // console.log("queryParams",queryParams)
-}
+};
 
 const datePickChange = () => {
-  patientInfusionInfos.value = []
-  queryParams.executeDate = formatDate(queryParams.executeDate)
-  console.log("patientInfusionInfos", patientInfusionInfos.value)
-}
+  patientInfusionInfos.value = [];
+  queryParams.executeDate = formatDate(queryParams.executeDate);
+  console.log("patientInfusionInfos", patientInfusionInfos.value);
+};
 
 const executeQuery = () => {
-  patientInfusionInfos.value = []
-  queryParams.executeDate = formatDate(queryParams.executeDate)
+  patientInfusionInfos.value = [];
+  queryParams.executeDate = formatDate(queryParams.executeDate);
   // queryParams.bedNos = []
-  queryParams.patNos = []
+  queryParams.patNos = [];
   // console.log("patientBedList", patientBedList)
   patientBedList.value.forEach(bed => {
-    if (bed.sortNo >= queryParams.sortNoStart && bed.sortNo <= queryParams.sortNoEnd) {
+    if (
+      bed.sortNo >= queryParams.sortNoStart &&
+      bed.sortNo <= queryParams.sortNoEnd
+    ) {
       // console.log("bed", bed)
       // queryParams.bedNos.push(bed.bedNo)
-      queryParams.patNos.push(bed.patNo)
+      queryParams.patNos.push(bed.patNo);
     }
-  })
-  queryInfusionCardOrBottleCard(queryParams).then(res => {
-    nextTick(() => {
-      patientInfusionInfos.value = res
-      if (queryParams.cardType !== 'INFUSION_CARD' && patientInfusionInfos.value.length > 0) {
-        //瓶贴分配药品组号
-        patientInfusionInfos.value.forEach(item => {
-          let group = patientInfusionInfos.value.filter(citem => citem.patInfo.patNo === item.patInfo.patNo)
-          group.forEach((v, vindex) => {
-            let target = patientInfusionInfos.value.find(citem => citem.bottleCardDrugs[0].actOrderNo === v.bottleCardDrugs[0].actOrderNo)
-            target.bottleGroup = vindex + 1 + "/" + group.length
-            // console.log("target",target)
-          })
-          // console.log("group",group)
-          // console.log("index")
-        })
-        // console.log("patientInfusionInfo  s",patientInfusionInfos.value)
-      }
-      // for (let i = 0; i < 2; i++) {
-      //  patientInfusionInfos.value = [...patientInfusionInfos.value, ...res]
-      // }
-      // printPatientBottleInfos.value = res
-      printDate.value = getDatetime()
+  });
+  queryInfusionCardOrBottleCard(queryParams)
+    .then(res => {
+      nextTick(() => {
+        patientInfusionInfos.value = res;
+        if (
+          queryParams.cardType !== "INFUSION_CARD" &&
+          patientInfusionInfos.value.length > 0
+        ) {
+          //瓶贴分配药品组号
+          patientInfusionInfos.value.forEach(item => {
+            let group = patientInfusionInfos.value.filter(
+              citem => citem.patInfo.patNo === item.patInfo.patNo
+            );
+            let groupByActOrderNo = {};
+            group.forEach(item => {
+              if (!groupByActOrderNo[item.bottleCardDrugs[0].actOrderNo]) {
+                groupByActOrderNo[item.bottleCardDrugs[0].actOrderNo] = [];
+                groupByActOrderNo[item.bottleCardDrugs[0].actOrderNo].push(
+                  item
+                );
+              } else {
+                groupByActOrderNo[item.bottleCardDrugs[0].actOrderNo].push(
+                  item
+                );
+              }
+            });
+            // console.log("groupByActOrderNo", groupByActOrderNo);
+            // console.log("group", group);
+            let groupByActOrderNoKeys = Object.keys(groupByActOrderNo);
+            groupByActOrderNoKeys.forEach((key, index) => {
+              groupByActOrderNo[key].forEach(item => {
+                // console.log("item", item);
+                // console.log("index", index);
+                item.bottleGroup =
+                  index + 1 + "/" + groupByActOrderNoKeys.length;
+                let target = patientInfusionInfos.value.find(
+                  citem =>
+                    citem.bottleCardDrugs[0].actOrderNo ===
+                      item.bottleCardDrugs[0].actOrderNo &&
+                    citem.bottleCardDrugs[0].occTime ===
+                      item.bottleCardDrugs[0].occTime
+                );
+                target.bottleGroup = item.bottleGroup;
+              });
+            });
+
+            // group.forEach((v, vindex) => {
+            //   let target = patientInfusionInfos.value.find(
+            //     citem =>
+            //       citem.bottleCardDrugs[0].actOrderNo ===
+            //         v.bottleCardDrugs[0].actOrderNo &&
+            //       citem.bottleCardDrugs[0].occTime ===
+            //         v.bottleCardDrugs[0].occTime
+            //   );
+            //   target.bottleGroup = vindex + 1 + "/" + group.length;
+            //   // console.log("target",target)
+            // });
+            let drugsStr = "";
+            item.bottleCardDrugs.forEach((drug, dindex) => {
+              drugsStr += `${drug.orderCode}^${drug.drugOcc}${dindex === item.bottleCardDrugs.length - 1 ? "" : "_"}`;
+            });
+            let qrContent = `
+            ${item.patInfo.patNo}|${item.bottleCardDrugs[0].actOrderNo}|${formatOccTime(item.bottleCardDrugs[0].occTime)}|${drugsStr}`;
+            // {
+            //   inpatientNo: item.patInfo.patNo,
+            //   actOrderNo: item.bottleCardDrugs[0].actOrderNo,
+            //   occTime: formatOccTime(item.bottleCardDrugs[0].occTime),
+            //   drugs: [],
+            // };
+            item.qrContent = qrContent;
+            // item.qrContent = JSON.stringify(qrContent).replace(/\s/g, "");
+            // console.log("qrContent", item.qrContent);
+            // console.log("group",group)
+            // console.log("index")
+          });
+        }
+        // for (let i = 0; i < 2; i++) {
+        //  patientInfusionInfos.value = [...patientInfusionInfos.value, ...res]
+        // }
+        // printPatientBottleInfos.value = res
+        printDate.value = getDatetime();
+      });
     })
-  }).catch(() => {
-    patientInfusionInfos.value = []
-  })
-}
+    .catch(() => {
+      patientInfusionInfos.value = [];
+    });
+};
+
+const formatOccTime = timeStr => {
+  const timestamp = new Date(timeStr).getTime();
+  if (!timestamp || isNaN(timestamp)) {
+    return "";
+  }
+
+  const date = new Date(timestamp);
+
+  // 获取年、月、日、时、分、秒(注意月份从0开始,需+1)
+  const year = date.getFullYear();
+  const month = String(date.getMonth() + 1).padStart(2, "0"); // 补零(如 9 → "09")
+  const day = String(date.getDate()).padStart(2, "0");
+  const hours = String(date.getHours()).padStart(2, "0");
+  const minutes = String(date.getMinutes()).padStart(2, "0");
+  const seconds = String(date.getSeconds()).padStart(2, "0");
+
+  // 拼接为 yyyyMMddHHmmss 格式
+  return `${year}${month}${day}${hours}${minutes}${seconds}`;
+};
+
+const handleQrCodeContent = () => {};
 
 const frequencyOptions = [
   {
     //每天两次
-    arr: ['Bid', 'Q12H', 'Q12H/单日', 'Q12H/双日', 'bod'
-    ],
-    add: 1
+    arr: ["Bid", "Q12H", "Q12H/单日", "Q12H/双日", "bod"],
+    add: 1,
   },
   {
     //每天三次
-    arr: ['Tid', 'Tod', 'Q8h'],
-    add: 2
+    arr: ["Tid", "Tod", "Q8h"],
+    add: 2,
   },
   {
     //每天四次
-    arr: ['Qid', 'Q6h'],
-    add: 3
+    arr: ["Qid", "Q6h"],
+    add: 3,
   },
-]
+];
 
 const handlePrintByFrequency = () => {
-  let result = [...printPatientBottleInfos.value]
+  let result = [...printPatientBottleInfos.value];
   printPatientBottleInfos.value.forEach(item => {
-    let frequency = item.bottleCardDrugs[0].frequCode
+    let frequency = item.bottleCardDrugs[0].frequCode;
     let add = 0;
     for (let i = 0; i < frequencyOptions.length; i++) {
       if (frequencyOptions[i].arr.includes(frequency)) {
-        add = frequencyOptions[i].add
+        add = frequencyOptions[i].add;
         break;
       }
     }
     if (add > 0) {
-      let index = result.findIndex(citem => citem.bottleCardDrugs[0].actOrderNo === item.bottleCardDrugs[0].actOrderNo);
+      let index = result.findIndex(
+        citem =>
+          citem.bottleCardDrugs[0].actOrderNo ===
+          item.bottleCardDrugs[0].actOrderNo
+      );
       for (let i = 0; i < add; i++) {
-        let target = { ...item }
-        target.patInfo.patNo = target.patInfo.patNo + '_' + i
+        let target = { ...item };
+        target.patInfo.patNo = target.patInfo.patNo + "_" + i;
         result.splice(index, 0, target);
       }
     }
-  })
-  return result
-}
+  });
+  return result;
+};
 
 const execPrint = () => {
-  const type = queryParams.cardType === 'INFUSION_CARD' ? '巡回单' : '瓶贴卡'
+  const type = queryParams.cardType === "INFUSION_CARD" ? "巡回单" : "瓶贴卡";
   if (patientInfusionInfos.value.length === 0) {
     ElMessage({
       message: `请先检索${type}。`,
-      type: 'warning',
+      type: "warning",
       duration: 2500,
-      showClose: true
-    })
-    return
+      showClose: true,
+    });
+    return;
   }
   let LODOP = getLodop();
-  if (queryParams.cardType == 'INFUSION_CARD') {
-    let prntContent = document.getElementById("infusion_list").innerHTML
+  if (queryParams.cardType == "INFUSION_CARD") {
+    let prntContent = document.getElementById("infusion_list").innerHTML;
     // console.log("prntContent",prntContent)
-    let printHTML = ""
+    let printHTML = "";
     const printStyle = `<style>td{border: 1px solid black;
-    font-size: 12px;padding: 2px;}</style>`
+    font-size: 12px;padding: 2px;}</style>`;
     if (patientInfusionInfos.value.length == 1) {
-      let id = queryParams.cardType === 'INFUSION_CARD'
-        ? patientInfusionInfos.value[0].patInfo.patNo : patientInfusionInfos.value[0].patInfo.patNo + '-' + i
-      printHTML = document.getElementById(id).innerHTML
-      LODOP.PRINT_INIT('infusionCard')
-      LODOP.SET_PRINT_PAGESIZE(1, '210mm', '297mm', '')
-      LODOP.ADD_PRINT_HTML('0mm', '0mm', '210mm', '297mm', printStyle + '<body style:"display: flex;justify-content: center;align-items: center;">' + printHTML + '</body>')
-      LODOP.SET_PRINT_STYLE('ItemType', 3)
+      let id =
+        queryParams.cardType === "INFUSION_CARD"
+          ? patientInfusionInfos.value[0].patInfo.patNo
+          : patientInfusionInfos.value[0].patInfo.patNo + "-" + i;
+      printHTML = document.getElementById(id).innerHTML;
+      LODOP.PRINT_INIT("infusionCard");
+      LODOP.SET_PRINT_PAGESIZE(1, "210mm", "297mm", "");
+      LODOP.ADD_PRINT_HTML(
+        "0mm",
+        "0mm",
+        "210mm",
+        "297mm",
+        printStyle +
+          '<body style:"display: flex;justify-content: center;align-items: center;">' +
+          printHTML +
+          "</body>"
+      );
+      LODOP.SET_PRINT_STYLE("ItemType", 3);
       LODOP.PREVIEW();
     } else {
-      LODOP.PRINT_INIT('infusionCard')
-      LODOP.SET_PRINT_PAGESIZE(1, '210mm', '297mm', '')
-      let PAGE_MAX_HEIGHT = 970 //页面最大阈值
-      let pageHeightNow = 0
-      let currentPageHTML = '';
+      LODOP.PRINT_INIT("infusionCard");
+      LODOP.SET_PRINT_PAGESIZE(1, "210mm", "297mm", "");
+      let PAGE_MAX_HEIGHT = 970; //页面最大阈值
+      let pageHeightNow = 0;
+      let currentPageHTML = "";
       for (let i = 0; i < patientInfusionInfos.value.length; i++) {
-        let info = patientInfusionInfos.value[i]
-        let printTarget = document.getElementById(info.patInfo.patNo)
-        console.log('printTarget', printTarget)
+        let info = patientInfusionInfos.value[i];
+        let printTarget = document.getElementById(info.patInfo.patNo);
+        console.log("printTarget", printTarget);
         if (pageHeightNow + printTarget.offsetHeight > PAGE_MAX_HEIGHT) {
-          LODOP.ADD_PRINT_HTML('0mm', '0mm', '210mm', '297mm', printStyle + currentPageHTML);
+          LODOP.ADD_PRINT_HTML(
+            "0mm",
+            "0mm",
+            "210mm",
+            "297mm",
+            printStyle + currentPageHTML
+          );
           LODOP.NewPage(); // 开启新页
           // 新页初始化:当前行作为新页的第一行
           currentPageHTML = printTarget.innerHTML;
           pageHeightNow = printTarget.offsetHeight;
         } else {
-          pageHeightNow += printTarget.offsetHeight
-          currentPageHTML += printTarget.innerHTML
+          pageHeightNow += printTarget.offsetHeight;
+          currentPageHTML += printTarget.innerHTML;
         }
         // let info = patientInfusionInfos.value[i]
         // let id = queryParams.cardType === 'INFUSION_CARD'
@@ -352,13 +538,19 @@ const execPrint = () => {
         //   printHTML += document.getElementById(id).innerHTML
         // }
       }
-      LODOP.ADD_PRINT_HTML('0mm', '0mm', '210mm', '297mm', printStyle + currentPageHTML);
-      LODOP.PREVIEW()
+      LODOP.ADD_PRINT_HTML(
+        "0mm",
+        "0mm",
+        "210mm",
+        "297mm",
+        printStyle + currentPageHTML
+      );
+      LODOP.PREVIEW();
     }
-    updatePrintState()
+    updatePrintState();
   } else {
-    printPatientBottleInfos.value = [...patientInfusionInfos.value]
-    printPatientBottleInfos.value = handlePrintByFrequency()
+    printPatientBottleInfos.value = [...patientInfusionInfos.value];
+    // printPatientBottleInfos.value = handlePrintByFrequency();
     // console.log("patientInfusionInfos",patientInfusionInfos.value)
     // console.log("printPatientBottleInfos",printPatientBottleInfos.value)
     nextTick(() => {
@@ -367,7 +559,7 @@ const execPrint = () => {
       //       /* 一行3个,预留间距 */
 
       //       const printStyle = `<style>
-      //   .card-container { display: inline;  } 
+      //   .card-container { display: inline;  }
       //   td { border: 1px solid black; font-size: 12px; padding: 2px; }
       // </style>`;
       //       const PAGE_MAX_HEIGHT = 1100; // 页面最大高度阈值(px)
@@ -445,18 +637,18 @@ const execPrint = () => {
 
       //       LODOP.PREVIEW();
 
-      LODOP.PRINT_INIT('infusionCard');
-      LODOP.SET_PRINT_PAGESIZE(1, '210mm', '297mm', '');
+      LODOP.PRINT_INIT("infusionCard");
+      LODOP.SET_PRINT_PAGESIZE(1, "210mm", "297mm", "");
       /* 一行3个,使用float布局确保兼容性 */
 
       const printStyle = `<style>
   .card-row { overflow: hidden; margin-bottom: 10px; } /* 清除浮动并添加行间距 */
-  .card-container { 
-    float: left; 
-    width: 31.5%; 
-    box-sizing: border-box; 
+  .card-container {
+    float: left;
+    width: 31.5%;
+    box-sizing: border-box;
     padding: 0 5px; /* 预留间距 */
-  } 
+  }
   td { border: 1px solid black; font-size: 12px; padding: 2px; }
   /* 最后一个元素清除右侧内边距 */
   .card-container:nth-child(3n) { padding-right: 0; }
@@ -467,12 +659,14 @@ const execPrint = () => {
       const PAGE_MAX_HEIGHT = 1020; // 页面最大高度阈值(px)
       let currentPageHTML = printStyle; // 当前页内容
       let currentPageTotalHeight = 0; // 当前页累计高度(px)
-      let currentRowHTML = ''; // 当前行的HTML内容
+      let currentRowHTML = ""; // 当前行的HTML内容
       let currentRowElements = []; // 当前行的元素
       let currentRowMaxHeight = 0; // 当前行最高元素高度(px)
 
       printPatientBottleInfos.value.forEach((item, index) => {
-        const printTarget = document.getElementById(`${item.patInfo.patNo}-${index}_print`);
+        const printTarget = document.getElementById(
+          `${item.patInfo.patNo}-${index}`
+        );
         if (!printTarget) return;
 
         // 获取当前元素高度(px)
@@ -489,12 +683,19 @@ const execPrint = () => {
           const rowWithClearfix = `<div class="card-row">${currentRowHTML}</div>`;
 
           // 计算当前行加入后,页面的总高度
-          const totalHeightAfterAdd = currentPageTotalHeight + currentRowMaxHeight;
+          const totalHeightAfterAdd =
+            currentPageTotalHeight + currentRowMaxHeight;
 
           // 3. 判断是否需要分页
           if (totalHeightAfterAdd > PAGE_MAX_HEIGHT) {
             // 先打印当前页已有的内容
-            LODOP.ADD_PRINT_HTML('0mm', '0mm', '210mm', '297mm', currentPageHTML);
+            LODOP.ADD_PRINT_HTML(
+              "0mm",
+              "0mm",
+              "210mm",
+              "297mm",
+              currentPageHTML
+            );
             LODOP.NewPage(); // 开启新页
 
             // 新页初始化:当前行作为新页的第一行
@@ -509,7 +710,7 @@ const execPrint = () => {
           // 5. 重置行状态,准备下一行
           currentRowElements = [];
           currentRowMaxHeight = 0;
-          currentRowHTML = '';
+          currentRowHTML = "";
         }
       });
 
@@ -519,11 +720,12 @@ const execPrint = () => {
         const rowWithClearfix = `<div class="card-row">${currentRowHTML}</div>`;
 
         // 计算剩余行加入后的总高度
-        const totalHeightAfterAdd = currentPageTotalHeight + currentRowMaxHeight;
+        const totalHeightAfterAdd =
+          currentPageTotalHeight + currentRowMaxHeight;
 
         // 如果超出页面高度,单独分页
         if (totalHeightAfterAdd > PAGE_MAX_HEIGHT) {
-          LODOP.ADD_PRINT_HTML('0mm', '0mm', '210mm', '297mm', currentPageHTML);
+          LODOP.ADD_PRINT_HTML("0mm", "0mm", "210mm", "297mm", currentPageHTML);
           LODOP.NewPage();
           currentPageHTML = printStyle + rowWithClearfix;
           currentPageTotalHeight = currentRowMaxHeight;
@@ -535,11 +737,11 @@ const execPrint = () => {
 
       // 7. 添加最后一页内容
       if (currentPageHTML) {
-        LODOP.ADD_PRINT_HTML('0mm', '0mm', '210mm', '297mm', currentPageHTML);
+        LODOP.ADD_PRINT_HTML("0mm", "0mm", "210mm", "297mm", currentPageHTML);
       }
 
       LODOP.PREVIEW();
-      printPatientBottleInfos.value = []
+      printPatientBottleInfos.value = [];
       // LODOP.PRINT_INIT('infusionCard')
       // LODOP.SET_PRINT_PAGESIZE(1, '210mm', '297mm', '')
       // let printHTML = "";
@@ -605,51 +807,55 @@ const execPrint = () => {
       // // LODOP.ADD_PRINT_HTML('0mm', '0mm', '210mm', '297mm', printFinal)
       // // LODOP.SET_PRINT_STYLE('ItemType', 3)
       // LODOP.PREVIEW();
-      updatePrintState()
+      updatePrintState();
     });
   }
-}
+};
 
 function updatePrintState() {
   const params = {
     cardType: queryParams.cardType,
-    orderNos: []
-  }
+    orderNos: [],
+  };
 
   patientInfusionInfos.value.forEach(info => {
-    if (params.cardType === 'INFUSION_CARD') {
+    if (params.cardType === "INFUSION_CARD") {
       info.drugGroups.forEach(group => {
-        params.orderNos.push(group.mainDrug.actOrderNo)
-      })
+        params.orderNos.push(group.mainDrug.actOrderNo);
+      });
     } else {
       info.bottleCardDrugs.forEach(group => {
-        params.orderNos.push(group.actOrderNo)
-      })
+        params.orderNos.push(group.actOrderNo);
+      });
     }
-  })
+  });
 
   nextTick(() => {
     updatePrintStatus(params).then(res => {
-      console.log(res)
-    })
-  })
-
+      console.log(res);
+    });
+  });
 }
 
 function getStyleText(selector) {
   var sheets = document.styleSheets;
-  var styleText = '';
+  var styleText = "";
   for (var i = 0; i < sheets.length; i++) {
     try {
       var rules = sheets[i].cssRules || sheets[i].rules;
       if (rules) {
         for (var j = 0; j < rules.length; j++) {
-          if (rules[j].selectorText && rules[j].selectorText.includes(selector)) {
-            styleText += rules[j].cssText + '\n';
+          if (
+            rules[j].selectorText &&
+            rules[j].selectorText.includes(selector)
+          ) {
+            styleText += rules[j].cssText + "\n";
           }
         }
       }
-    } catch (e) { /* 可能跨域安全错误 */ }
+    } catch (e) {
+      /* 可能跨域安全错误 */
+    }
   }
   return styleText;
 }
@@ -662,15 +868,15 @@ function getStyleText(selector) {
 // -- 已打印:print_comment like '%J%'
 // -- 未打印:isnull(print_comment,'') not like '%J%'
 onMounted(() => {
-  initLodop()
+  initLodop();
   getWardsApi().then(res => {
-    userWards.value = res
+    userWards.value = res;
     if (!queryParams.wardCode) {
-      queryParams.wardCode = userWards.value[0].value
+      queryParams.wardCode = userWards.value[0].value;
     }
-    handleWardChange(queryParams.wardCode)
-  })
-})
+    handleWardChange(queryParams.wardCode);
+  });
+});
 </script>
 
 <style scoped>
@@ -717,7 +923,7 @@ onMounted(() => {
 }
 
 .blue-text {
-  color: #1146f3
+  color: #1146f3;
 }
 
 .is-disabled {
@@ -764,4 +970,4 @@ onMounted(() => {
     flex-wrap: wrap;
   }
 }
-</style>
+</style>