Просмотр исходного кода

task-3335 性能验证导出附件功能开发

shenqilong 1 год назад
Родитель
Сommit
71090eb6cd

+ 216 - 85
package-lock.json

@@ -2259,6 +2259,12 @@
       "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==",
       "dev": true
     },
+    "@types/raf": {
+      "version": "3.4.3",
+      "resolved": "https://registry.npmmirror.com/@types/raf/-/raf-3.4.3.tgz",
+      "integrity": "sha512-c4YAvMedbPZ5tEyxzQdMoOhhJ4RD3rngZIdwC2/qDN3d7JpEhB6fiBRKVY1lg5B7Wk+uPBjn5f39j1/2MY1oOw==",
+      "optional": true
+    },
     "@types/range-parser": {
       "version": "1.2.4",
       "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz",
@@ -2741,87 +2747,6 @@
         "webpack-chain": "^6.4.0",
         "webpack-dev-server": "^3.11.0",
         "webpack-merge": "^4.2.2"
-      },
-      "dependencies": {
-        "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,
-          "optional": true,
-          "requires": {
-            "color-convert": "^2.0.1"
-          }
-        },
-        "chalk": {
-          "version": "4.1.2",
-          "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz",
-          "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "ansi-styles": "^4.1.0",
-            "supports-color": "^7.1.0"
-          }
-        },
-        "color-convert": {
-          "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,
-          "optional": true,
-          "requires": {
-            "color-name": "~1.1.4"
-          }
-        },
-        "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,
-          "optional": true
-        },
-        "has-flag": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz",
-          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
-          "dev": true,
-          "optional": true
-        },
-        "loader-utils": {
-          "version": "2.0.4",
-          "resolved": "https://registry.npmmirror.com/loader-utils/-/loader-utils-2.0.4.tgz",
-          "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "big.js": "^5.2.2",
-            "emojis-list": "^3.0.0",
-            "json5": "^2.1.2"
-          }
-        },
-        "supports-color": {
-          "version": "7.2.0",
-          "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz",
-          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "has-flag": "^4.0.0"
-          }
-        },
-        "vue-loader-v16": {
-          "version": "npm:vue-loader@16.8.3",
-          "resolved": "https://registry.npmmirror.com/vue-loader/-/vue-loader-16.8.3.tgz",
-          "integrity": "sha512-7vKN45IxsKxe5GcVCbc2qFU5aWzyiLrYJyUuMz4BQLKctCj/fmCa0w6fGiiQ2cLFetNcek1ppGJQDCup0c1hpA==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "chalk": "^4.1.0",
-            "hash-sum": "^2.0.0",
-            "loader-utils": "^2.0.0"
-          }
-        }
       }
     },
     "@vue/cli-shared-utils": {
@@ -3599,8 +3524,7 @@
     "atob": {
       "version": "2.1.2",
       "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz",
-      "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==",
-      "dev": true
+      "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg=="
     },
     "autoprefixer": {
       "version": "9.8.8",
@@ -3980,6 +3904,11 @@
         }
       }
     },
+    "base64-arraybuffer": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmmirror.com/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz",
+      "integrity": "sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ=="
+    },
     "base64-js": {
       "version": "1.5.1",
       "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
@@ -4438,6 +4367,11 @@
         "node-int64": "^0.4.0"
       }
     },
+    "btoa": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmmirror.com/btoa/-/btoa-1.2.1.tgz",
+      "integrity": "sha512-SB4/MIGlsiVkMcHmT+pSmIPoNDoHg+7cMzmt3Uxt628MTz2487DKSqK/fuhFBrkuqrYv5UCEnACpF4dTFNKc/g=="
+    },
     "buffer": {
       "version": "4.9.2",
       "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz",
@@ -4661,6 +4595,22 @@
       "integrity": "sha512-cVjiJHWGcNlJi8TZVKNMnvMid3Z3TTdDHmLDzlOdIiZq138Exvo0G+G0wTdVYolxKb4AYwC+38pxodiInVtJSA==",
       "dev": true
     },
+    "canvg": {
+      "version": "3.0.10",
+      "resolved": "https://registry.npmmirror.com/canvg/-/canvg-3.0.10.tgz",
+      "integrity": "sha512-qwR2FRNO9NlzTeKIPIKpnTY6fqwuYSequ8Ru8c0YkYU7U0oW+hLUvWadLvAu1Rl72OMNiFhoLu4f8eUjQ7l/+Q==",
+      "optional": true,
+      "requires": {
+        "@babel/runtime": "^7.12.5",
+        "@types/raf": "^3.4.0",
+        "core-js": "^3.8.3",
+        "raf": "^3.4.1",
+        "regenerator-runtime": "^0.13.7",
+        "rgbcolor": "^1.0.1",
+        "stackblur-canvas": "^2.0.0",
+        "svg-pathdata": "^6.0.3"
+      }
+    },
     "capture-exit": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz",
@@ -5862,6 +5812,14 @@
         "timsort": "^0.3.0"
       }
     },
+    "css-line-break": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmmirror.com/css-line-break/-/css-line-break-2.1.0.tgz",
+      "integrity": "sha512-FHcKFCZcAha3LwfVBhCQbW2nCNbkZXn7KVUJcsT5/P8YmfsVja0FMPJr0B903j/E69HUphKiV9iQArX8SDYA4w==",
+      "requires": {
+        "utrie": "^1.0.2"
+      }
+    },
     "css-loader": {
       "version": "3.6.0",
       "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-3.6.0.tgz",
@@ -6582,6 +6540,12 @@
       "resolved": "https://registry.npmjs.org/domify/-/domify-1.4.1.tgz",
       "integrity": "sha512-x18nuiDHMCZGXr4KJSRMf/TWYtiaRo6RX8KN9fEbW54mvbQ6pieUuerC2ahBg+kEp1wycFj8MPUI0WkIOw5E9w=="
     },
+    "dompurify": {
+      "version": "2.5.8",
+      "resolved": "https://registry.npmmirror.com/dompurify/-/dompurify-2.5.8.tgz",
+      "integrity": "sha512-o1vSNgrmYMQObbSSvF/1brBYEQPHhV1+gsmrusO7/GXtp1T9rCS8cXFqVxK/9crT1jA6Ccv+5MTSjBNqr7Sovw==",
+      "optional": true
+    },
     "domready": {
       "version": "1.0.8",
       "resolved": "https://registry.npmjs.org/domready/-/domready-1.0.8.tgz",
@@ -8911,6 +8875,15 @@
         }
       }
     },
+    "html2canvas": {
+      "version": "1.4.1",
+      "resolved": "https://registry.npmmirror.com/html2canvas/-/html2canvas-1.4.1.tgz",
+      "integrity": "sha512-fPU6BHNpsyIhr8yyMpTLLxAbkaK8ArIBcmZIRiBLiDhjeqvXolaEmDGmELFuX9I4xDcaKKcJl+TKZLqruBbmWA==",
+      "requires": {
+        "css-line-break": "^2.1.0",
+        "text-segmentation": "^1.0.3"
+      }
+    },
     "htmlparser2": {
       "version": "6.1.0",
       "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz",
@@ -10871,6 +10844,41 @@
         "graceful-fs": "^4.1.6"
       }
     },
+    "jspdf": {
+      "version": "2.5.2",
+      "resolved": "https://registry.npmmirror.com/jspdf/-/jspdf-2.5.2.tgz",
+      "integrity": "sha512-myeX9c+p7znDWPk0eTrujCzNjT+CXdXyk7YmJq5nD5V7uLLKmSXnlQ/Jn/kuo3X09Op70Apm0rQSnFWyGK8uEQ==",
+      "requires": {
+        "@babel/runtime": "^7.23.2",
+        "atob": "^2.1.2",
+        "btoa": "^1.2.1",
+        "canvg": "^3.0.6",
+        "core-js": "^3.6.0",
+        "dompurify": "^2.5.4",
+        "fflate": "^0.8.1",
+        "html2canvas": "^1.0.0-rc.5"
+      },
+      "dependencies": {
+        "@babel/runtime": {
+          "version": "7.26.9",
+          "resolved": "https://registry.npmmirror.com/@babel/runtime/-/runtime-7.26.9.tgz",
+          "integrity": "sha512-aA63XwOkcl4xxQa3HjPMqOP6LiK0ZDv3mUPYEFXkpHbaFjtGggE1A61FjFzJnB+p7/oy2gA8E+rcBNl/zC1tMg==",
+          "requires": {
+            "regenerator-runtime": "^0.14.0"
+          }
+        },
+        "fflate": {
+          "version": "0.8.2",
+          "resolved": "https://registry.npmmirror.com/fflate/-/fflate-0.8.2.tgz",
+          "integrity": "sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A=="
+        },
+        "regenerator-runtime": {
+          "version": "0.14.1",
+          "resolved": "https://registry.npmmirror.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz",
+          "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw=="
+        }
+      }
+    },
     "jsprim": {
       "version": "1.4.2",
       "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz",
@@ -12826,8 +12834,7 @@
     "performance-now": {
       "version": "2.1.0",
       "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
-      "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=",
-      "dev": true
+      "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns="
     },
     "picocolors": {
       "version": "0.2.1",
@@ -13997,6 +14004,15 @@
         "fast-diff": "1.1.2"
       }
     },
+    "raf": {
+      "version": "3.4.1",
+      "resolved": "https://registry.npmmirror.com/raf/-/raf-3.4.1.tgz",
+      "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==",
+      "optional": true,
+      "requires": {
+        "performance-now": "^2.1.0"
+      }
+    },
     "randombytes": {
       "version": "2.1.0",
       "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
@@ -14472,6 +14488,12 @@
       "integrity": "sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=",
       "dev": true
     },
+    "rgbcolor": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmmirror.com/rgbcolor/-/rgbcolor-1.0.1.tgz",
+      "integrity": "sha512-9aZLIrhRaD97sgVhtJOW6ckOEh6/GnvQtdVNfdZ6s67+3/XwLS9lBcQYzEEhYVeUowN7pRzMLsyGhK2i/xvWbw==",
+      "optional": true
+    },
     "rimraf": {
       "version": "3.0.2",
       "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
@@ -15450,6 +15472,12 @@
         }
       }
     },
+    "stackblur-canvas": {
+      "version": "2.7.0",
+      "resolved": "https://registry.npmmirror.com/stackblur-canvas/-/stackblur-canvas-2.7.0.tgz",
+      "integrity": "sha512-yf7OENo23AGJhBriGx0QivY5JP6Y1HbrrDI6WLt6C5auYZXlQrheoY8hD4ibekFKz1HOfE48Ww8kMWMnJD/zcQ==",
+      "optional": true
+    },
     "stackframe": {
       "version": "1.2.0",
       "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.2.0.tgz",
@@ -15931,6 +15959,12 @@
         }
       }
     },
+    "svg-pathdata": {
+      "version": "6.0.3",
+      "resolved": "https://registry.npmmirror.com/svg-pathdata/-/svg-pathdata-6.0.3.tgz",
+      "integrity": "sha512-qsjeeq5YjBZ5eMdFuUa4ZosMLxgr5RZ+F+Y1OrDhuOCEInRMA3x74XdBtggJcj9kOeInz0WE+LgCPDkZFlBYJw==",
+      "optional": true
+    },
     "svg-sprite-loader": {
       "version": "5.2.1",
       "resolved": "https://registry.npmjs.org/svg-sprite-loader/-/svg-sprite-loader-5.2.1.tgz",
@@ -16320,6 +16354,14 @@
       "integrity": "sha1-i/dddJt8BXnJOZIAUcaepXLr3cE=",
       "dev": true
     },
+    "text-segmentation": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmmirror.com/text-segmentation/-/text-segmentation-1.0.3.tgz",
+      "integrity": "sha512-iOiPUo/BGnZ6+54OsWxZidGCsdU8YbE4PSpdPinp7DeMtUJNJBoJ/ouUSTJjHkh1KntHaltHl/gDs2FC4i5+Nw==",
+      "requires": {
+        "utrie": "^1.0.2"
+      }
+    },
     "text-table": {
       "version": "0.2.0",
       "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
@@ -17029,6 +17071,14 @@
       "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=",
       "dev": true
     },
+    "utrie": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmmirror.com/utrie/-/utrie-1.0.2.tgz",
+      "integrity": "sha512-1MLa5ouZiOmQzUbjbu9VmjLzn1QLXBhwpUa7kdLUQK+KQ5KA9I1vk5U4YHe/X2Ch7PYnJfWuWT+VbuxbGwljhw==",
+      "requires": {
+        "base64-arraybuffer": "^1.0.2"
+      }
+    },
     "uuid": {
       "version": "3.4.0",
       "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
@@ -17568,6 +17618,87 @@
         }
       }
     },
+    "vue-loader-v16": {
+      "version": "npm:vue-loader@16.8.3",
+      "resolved": "https://registry.npmmirror.com/vue-loader/-/vue-loader-16.8.3.tgz",
+      "integrity": "sha512-7vKN45IxsKxe5GcVCbc2qFU5aWzyiLrYJyUuMz4BQLKctCj/fmCa0w6fGiiQ2cLFetNcek1ppGJQDCup0c1hpA==",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "chalk": "^4.1.0",
+        "hash-sum": "^2.0.0",
+        "loader-utils": "^2.0.0"
+      },
+      "dependencies": {
+        "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,
+          "optional": true,
+          "requires": {
+            "color-convert": "^2.0.1"
+          }
+        },
+        "chalk": {
+          "version": "4.1.2",
+          "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz",
+          "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "ansi-styles": "^4.1.0",
+            "supports-color": "^7.1.0"
+          }
+        },
+        "color-convert": {
+          "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,
+          "optional": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "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,
+          "optional": true
+        },
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true,
+          "optional": true
+        },
+        "loader-utils": {
+          "version": "2.0.4",
+          "resolved": "https://registry.npmmirror.com/loader-utils/-/loader-utils-2.0.4.tgz",
+          "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "big.js": "^5.2.2",
+            "emojis-list": "^3.0.0",
+            "json5": "^2.1.2"
+          }
+        },
+        "supports-color": {
+          "version": "7.2.0",
+          "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz",
+          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        }
+      }
+    },
     "vue-router": {
       "version": "3.5.3",
       "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-3.5.3.tgz",

+ 1 - 0
package.json

@@ -66,6 +66,7 @@
     "js-cookie": "^2.2.1",
     "js-md5": "^0.7.3",
     "js-pinyin": "^0.1.9",
+    "jspdf": "^2.5.2",
     "less": "^3.12.2",
     "less-loader": "^7.0.1",
     "lodash": "^4.17.20",

+ 7 - 1
src/views/business/performance/components/conclusion.vue

@@ -9,7 +9,9 @@
                 <el-row :gutter="20" class="form-row">
                     <el-col :span="24">
                         <el-form-item label="结论" prop="shiYanJieLun" :show-message="false">
-                            <ibps-ueditor v-model="expResult" :config="ueditorConfig" :readonly="true" />
+                            <div v-if="pdf=='pdf'" v-html="expResult" />
+                            <ibps-ueditor v-else v-model="expResult" :config="ueditorConfig" :readonly="readonly" />
+
                         </el-form-item>
                     </el-col>
                 </el-row>
@@ -51,6 +53,10 @@ export default {
         readonly: {
             type: Boolean,
             default: false
+        },
+        pdf: {
+            type: String,
+            default: ''
         }
     },
     data () {

+ 5 - 1
src/views/business/performance/components/experimental-data.vue

@@ -28,7 +28,7 @@
                         stripe
                         highlight-current-row
                         style="width: 100%"
-                        max-height="250px"
+                        :max-height="pdf=='pdf'?'100%':'250px'"
                     >
                         <el-table-column
                             v-for="(h, hIndex) in expData.dataDTO.header"
@@ -90,6 +90,10 @@ export default {
         readonly: {
             type: Boolean,
             default: false
+        },
+        pdf: {
+            type: String,
+            default: ''
         }
     },
     data () {

+ 5 - 1
src/views/business/performance/components/reagent-info.vue

@@ -28,7 +28,7 @@
                     stripe
                     highlight-current-row
                     style="width: 100%"
-                    max-height="250px"
+                    :max-height="pdf=='pdf'?'100%':'250px'"
                     class="reagent-table"
                     @selection-change="handleSelectionChange"
                 >
@@ -83,6 +83,10 @@ export default {
         readonly: {
             type: Boolean,
             default: false
+        },
+        pdf: {
+            type: String,
+            default: ''
         }
     },
     data () {

+ 170 - 1
src/views/business/performance/experimental.vue

@@ -81,6 +81,65 @@
                 </template>
             </div>
         </div>
+        <el-dialog fullscreen :show-close="false" :modal="false" :visible.sync="dialogFormVisible">
+            <el-form id="pdfDom">
+                <div style="text-align: center;font-size: 20px;font-weight: bold;margin-bottom: 20px;">{{ configData.methodName }}</div>
+                <experimental-desc
+                    :step="configData.step"
+                    :criterion="configData.criterion"
+                    :formulas="configData.formulas"
+                    :references="configData.references"
+                    :readonly="true"
+                />
+                <basic-info :info="form" :readonly="true" />
+                <reagent-info :info="form.reagentPoList" :readonly="true" :pdf="pdf" />
+                <param-info
+                    v-if="$utils.isNotEmpty(configData.params)"
+                    :form-id="formId"
+                    :info="form.shiYanCanShu"
+                    :config-data="configData.params"
+                    :readonly="true"
+                    @updateParams="handleUpdateParams"
+                />
+
+                <experimental-data
+                    :exp="form.jiSuanJieGuo"
+                    :form-id="formId"
+                    :readonly="true"
+                    :pdf="pdf"
+                    @export="handleExport"
+                    @import="handleImport"
+                />
+                <precision
+                    v-if="$utils.isNotEmpty(form.jiSuanJieGuo)"
+                    :info="form.jiSuanJieGuo"
+                    :readonly="true"
+                    :pdf="pdf"
+                    @recalculate="handleRecalculate"
+                />
+                <conclusion
+                    :result="form.shiYanJieLun"
+                    :files="form.fuJian"
+                    :readonly="true"
+                    :pdf="pdf"
+                    @updateData="handleUpdateData"
+                />
+
+            </el-form>
+            <div slot="title" class="config-dialog-header">
+                <div class="title">{{ configData.methodName }}</div>
+                <div class="operate">
+                    <template>
+                        <el-button style="width: 80px;" type="success" @click="getpdf()">
+                            导出
+                        </el-button>
+                        <el-button style="width: 80px;" type="danger" @click="dialogFormVisible = false">
+                            取消
+                        </el-button>
+                    </template>
+                </div>
+            </div>
+        </el-dialog>
     </el-dialog>
 </template>
 
@@ -88,6 +147,8 @@
 import { formRules } from './constants/index'
 import ActionUtils from '@/utils/action'
 import { getExperimental, saveExperimental, getConfigDetail, recalculate, exportTemplate, importTemplate } from '@/api/business/pv'
+import html2Canvas from 'html2canvas'
+import JsPDF from 'jspdf'
 export default {
     components: {
         ExperimentalDesc: () => import('./components/experimental-desc'),
@@ -116,6 +177,8 @@ export default {
         const { userId } = this.$store.getters || {}
         return {
             dialogVisible: this.visible,
+            dialogFormVisible: false,
+            pdf: 'pdf',
             formLabelWidth: '110px',
             configData: {},
             formId: this.params.recordId,
@@ -146,6 +209,7 @@ export default {
             loading: false,
             loadCompleted: false,
             toolbars: [
+                { key: 'pdf', icon: 'ibps-icon-cube', label: '导出为PDF', type: 'primary' },
                 // { key: 'test', icon: 'ibps-icon-gg', label: '测试', type: 'warning', hidden: this.readonly },
                 { key: 'save', icon: 'ibps-icon-save', label: '保存', type: 'success', hidden: this.readonly },
                 // { key: 'submit', icon: 'ibps-icon-send', label: '提交', type: 'primary', hidden: this.readonly },
@@ -172,6 +236,43 @@ export default {
         this.loadData()
     },
     methods: {
+        getpdf () {
+            const newDiv = document.querySelector('#pdfDom')
+            const title = this.params.methodKey
+            html2Canvas(newDiv, {
+                allowTaint: false,
+                taintTest: false,
+                logging: false,
+                useCORS: true,
+                dpi: window.devicePixelRatio * 4, // 将分辨率提高到特定的DPI 提高四倍
+                scale: 4 // 按比例增加分辨率
+            }
+            ).then(function (canvas) {
+                const contentWidth = canvas.width
+                const contentHeight = canvas.height
+                const pageHeight = contentWidth / 592.28 * 841.89
+                var leftHeight = contentHeight
+                var position = 0
+                const imgWidth = 595.28
+                const imgHeight = 592.28 / contentWidth * contentHeight
+                const pageData = canvas.toDataURL('image/jpeg', 1.0)
+                const PDF = new JsPDF('', 'pt', 'a4')
+                if (leftHeight < pageHeight) {
+                    PDF.addImage(pageData, 'JPEG', 0, 0, imgWidth, imgHeight)
+                } else {
+                    while (leftHeight > 0) {
+                        PDF.addImage(pageData, 'JPEG', 0, position, imgWidth, imgHeight)
+                        leftHeight -= pageHeight
+                        position -= 841.89
+                        if (leftHeight > 0) {
+                            PDF.addPage()
+                        }
+                    }
+                }
+                PDF.save(title + '.pdf')
+            }
+            )
+        },
         // 获取数据
         loadData () {
             this.loading = true
@@ -186,6 +287,7 @@ export default {
                 data.jiSuanJieGuo = data.jiSuanJieGuo ? JSON.parse(data.jiSuanJieGuo) : {}
                 this.form = Object.assign(this.form, data)
                 this.loadCompleted = true
+                console.log(data.jiSuanJieGuo)
             }).catch(() => {
                 this.loading = false
             })
@@ -219,6 +321,9 @@ export default {
                 case 'test':
                     this.handleTest()
                     break
+                case 'pdf':
+                    this.dialogFormVisible = true
+                    break
                 default:
                     break
             }
@@ -374,7 +479,7 @@ export default {
                             dangerouslyUseHTMLString: true,
                             customClass: 'errorTips',
                             type: 'error'
-                        }).then(() => {}).catch(() => {})
+                        }).then(() => { }).catch(() => { })
                     })
                 }
                 reader.readAsBinaryString(file)
@@ -452,6 +557,70 @@ export default {
                 padding: 15px 20px 16px;
             }
         }
+
+    #pdfDom {
+        padding: 60px 100px;
+        box-sizing: border-box;
+
+        .info-container {
+            margin-bottom: 20px !important
+        }
+
+        ::v-deep {
+            .info-item {
+                .title {
+                    height: 20px;
+                    line-height: 20px;
+                    font-size: 16px;
+                    font-weight: bold;
+                    margin-bottom: 10px;
+
+                    .ibps-icon-star {
+                        color: #FB9600;
+                        margin-right: 5px;
+                    }
+                }
+
+                .el-form-item {
+                    margin-bottom: 0 !important;
+
+                    &__label {
+                        font-size: 14px !important;
+                        color: #606266;
+                    }
+
+                    &__content {
+
+                        .el-input,
+                        .el-select,
+                        .el-input-number {
+                            width: 100%;
+                        }
+
+                        .el-textarea .el-input__count {
+                            padding: 0 5px;
+                            line-height: initial;
+                        }
+
+                        .el-radio,
+                        .el-checkbox {
+                            margin-right: 10px;
+                        }
+                    }
+                }
+
+                .el-table th.el-table__cell>.cell,
+                .el-table td.el-table__cell {
+                    color: #606266;
+                    font-size: 14px !important;
+                }
+
+                .el-button--mini {
+                    padding: 5px 12px;
+                }
+            }
+        }
+    }
         .config-dialog-header {
             display: flex;
             justify-content: space-between;

+ 6 - 2
src/views/business/performance/report/precision.vue

@@ -32,7 +32,7 @@
                                 stripe
                                 highlight-current-row
                                 style="width: 100%"
-                                max-height="250px"
+                                :max-height="pdf=='pdf'?'100%':'250px'"
                                 :show-header="!table.hideHeader"
                                 :span-method="getSpanMethod(table)"
                             >
@@ -99,6 +99,10 @@ export default {
         readonly: {
             type: Boolean,
             default: false
+        },
+        pdf: {
+            type: String,
+            default: ''
         }
     },
     data () {
@@ -148,7 +152,7 @@ export default {
             })).sort((a, b) => a.title.localeCompare(b.title)) : []
             const chartData = chartDataDTO ? Object.keys(chartDataDTO).map(k => ({
                 title: k,
-                id: chartDataDTO[k].name,
+                id: chartDataDTO[k].name + this.pdf,
                 data: chartDataDTO[k].data,
                 note: chartDataDTO[k].note,
                 option: chartDataDTO[k].option