Browse Source

完成ppt页面基本渲染

jwyu 2 years ago
parent
commit
4104934e3c

+ 0 - 915
package-lock.json

@@ -1,915 +0,0 @@
-{
-  "name": "hongze_crm_moblie",
-  "version": "0.0.0",
-  "lockfileVersion": 1,
-  "requires": true,
-  "dependencies": {
-    "@antfu/utils": {
-      "version": "0.7.2",
-      "resolved": "https://registry.npmmirror.com/@antfu/utils/-/utils-0.7.2.tgz",
-      "integrity": "sha512-vy9fM3pIxZmX07dL+VX1aZe7ynZ+YyB0jY+jE6r3hOK6GNY2t6W8rzpFC4tgpbXUYABkFQwgJq2XYXlxbXAI0g==",
-      "dev": true
-    },
-    "@babel/parser": {
-      "version": "7.21.3",
-      "resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.21.3.tgz",
-      "integrity": "sha512-lobG0d7aOfQRXh8AyklEAgZGvA4FShxo6xQbUrrT/cNBPUdIDojlokwJsQyCC/eKia7ifqM0yP+2DRZ4WKw2RQ=="
-    },
-    "@esbuild/android-arm": {
-      "version": "0.17.14",
-      "resolved": "https://registry.npmmirror.com/@esbuild/android-arm/-/android-arm-0.17.14.tgz",
-      "integrity": "sha512-0CnlwnjDU8cks0yJLXfkaU/uoLyRf9VZJs4p1PskBr2AlAHeEsFEwJEo0of/Z3g+ilw5mpyDwThlxzNEIxOE4g==",
-      "dev": true,
-      "optional": true
-    },
-    "@esbuild/android-arm64": {
-      "version": "0.17.14",
-      "resolved": "https://registry.npmmirror.com/@esbuild/android-arm64/-/android-arm64-0.17.14.tgz",
-      "integrity": "sha512-eLOpPO1RvtsP71afiFTvS7tVFShJBCT0txiv/xjFBo5a7R7Gjw7X0IgIaFoLKhqXYAXhahoXm7qAmRXhY4guJg==",
-      "dev": true,
-      "optional": true
-    },
-    "@esbuild/android-x64": {
-      "version": "0.17.14",
-      "resolved": "https://registry.npmmirror.com/@esbuild/android-x64/-/android-x64-0.17.14.tgz",
-      "integrity": "sha512-nrfQYWBfLGfSGLvRVlt6xi63B5IbfHm3tZCdu/82zuFPQ7zez4XjmRtF/wIRYbJQ/DsZrxJdEvYFE67avYXyng==",
-      "dev": true,
-      "optional": true
-    },
-    "@esbuild/darwin-arm64": {
-      "version": "0.17.14",
-      "resolved": "https://registry.npmmirror.com/@esbuild/darwin-arm64/-/darwin-arm64-0.17.14.tgz",
-      "integrity": "sha512-eoSjEuDsU1ROwgBH/c+fZzuSyJUVXQTOIN9xuLs9dE/9HbV/A5IqdXHU1p2OfIMwBwOYJ9SFVGGldxeRCUJFyw==",
-      "dev": true,
-      "optional": true
-    },
-    "@esbuild/darwin-x64": {
-      "version": "0.17.14",
-      "resolved": "https://registry.npmmirror.com/@esbuild/darwin-x64/-/darwin-x64-0.17.14.tgz",
-      "integrity": "sha512-zN0U8RWfrDttdFNkHqFYZtOH8hdi22z0pFm0aIJPsNC4QQZv7je8DWCX5iA4Zx6tRhS0CCc0XC2m7wKsbWEo5g==",
-      "dev": true,
-      "optional": true
-    },
-    "@esbuild/freebsd-arm64": {
-      "version": "0.17.14",
-      "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.14.tgz",
-      "integrity": "sha512-z0VcD4ibeZWVQCW1O7szaLxGsx54gcCnajEJMdYoYjLiq4g1jrP2lMq6pk71dbS5+7op/L2Aod+erw+EUr28/A==",
-      "dev": true,
-      "optional": true
-    },
-    "@esbuild/freebsd-x64": {
-      "version": "0.17.14",
-      "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-x64/-/freebsd-x64-0.17.14.tgz",
-      "integrity": "sha512-hd9mPcxfTgJlolrPlcXkQk9BMwNBvNBsVaUe5eNUqXut6weDQH8whcNaKNF2RO8NbpT6GY8rHOK2A9y++s+ehw==",
-      "dev": true,
-      "optional": true
-    },
-    "@esbuild/linux-arm": {
-      "version": "0.17.14",
-      "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm/-/linux-arm-0.17.14.tgz",
-      "integrity": "sha512-BNTl+wSJ1omsH8s3TkQmIIIQHwvwJrU9u1ggb9XU2KTVM4TmthRIVyxSp2qxROJHhZuW/r8fht46/QE8hU8Qvg==",
-      "dev": true,
-      "optional": true
-    },
-    "@esbuild/linux-arm64": {
-      "version": "0.17.14",
-      "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm64/-/linux-arm64-0.17.14.tgz",
-      "integrity": "sha512-FhAMNYOq3Iblcj9i+K0l1Fp/MHt+zBeRu/Qkf0LtrcFu3T45jcwB6A1iMsemQ42vR3GBhjNZJZTaCe3VFPbn9g==",
-      "dev": true,
-      "optional": true
-    },
-    "@esbuild/linux-ia32": {
-      "version": "0.17.14",
-      "resolved": "https://registry.npmmirror.com/@esbuild/linux-ia32/-/linux-ia32-0.17.14.tgz",
-      "integrity": "sha512-91OK/lQ5y2v7AsmnFT+0EyxdPTNhov3y2CWMdizyMfxSxRqHazXdzgBKtlmkU2KYIc+9ZK3Vwp2KyXogEATYxQ==",
-      "dev": true,
-      "optional": true
-    },
-    "@esbuild/linux-loong64": {
-      "version": "0.17.14",
-      "resolved": "https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.17.14.tgz",
-      "integrity": "sha512-vp15H+5NR6hubNgMluqqKza85HcGJgq7t6rMH7O3Y6ApiOWPkvW2AJfNojUQimfTp6OUrACUXfR4hmpcENXoMQ==",
-      "dev": true,
-      "optional": true
-    },
-    "@esbuild/linux-mips64el": {
-      "version": "0.17.14",
-      "resolved": "https://registry.npmmirror.com/@esbuild/linux-mips64el/-/linux-mips64el-0.17.14.tgz",
-      "integrity": "sha512-90TOdFV7N+fgi6c2+GO9ochEkmm9kBAKnuD5e08GQMgMINOdOFHuYLPQ91RYVrnWwQ5683sJKuLi9l4SsbJ7Hg==",
-      "dev": true,
-      "optional": true
-    },
-    "@esbuild/linux-ppc64": {
-      "version": "0.17.14",
-      "resolved": "https://registry.npmmirror.com/@esbuild/linux-ppc64/-/linux-ppc64-0.17.14.tgz",
-      "integrity": "sha512-NnBGeoqKkTugpBOBZZoktQQ1Yqb7aHKmHxsw43NddPB2YWLAlpb7THZIzsRsTr0Xw3nqiPxbA1H31ZMOG+VVPQ==",
-      "dev": true,
-      "optional": true
-    },
-    "@esbuild/linux-riscv64": {
-      "version": "0.17.14",
-      "resolved": "https://registry.npmmirror.com/@esbuild/linux-riscv64/-/linux-riscv64-0.17.14.tgz",
-      "integrity": "sha512-0qdlKScLXA8MGVy21JUKvMzCYWovctuP8KKqhtE5A6IVPq4onxXhSuhwDd2g5sRCzNDlDjitc5sX31BzDoL5Fw==",
-      "dev": true,
-      "optional": true
-    },
-    "@esbuild/linux-s390x": {
-      "version": "0.17.14",
-      "resolved": "https://registry.npmmirror.com/@esbuild/linux-s390x/-/linux-s390x-0.17.14.tgz",
-      "integrity": "sha512-Hdm2Jo1yaaOro4v3+6/zJk6ygCqIZuSDJHdHaf8nVH/tfOuoEX5Riv03Ka15LmQBYJObUTNS1UdyoMk0WUn9Ww==",
-      "dev": true,
-      "optional": true
-    },
-    "@esbuild/linux-x64": {
-      "version": "0.17.14",
-      "resolved": "https://registry.npmmirror.com/@esbuild/linux-x64/-/linux-x64-0.17.14.tgz",
-      "integrity": "sha512-8KHF17OstlK4DuzeF/KmSgzrTWQrkWj5boluiiq7kvJCiQVzUrmSkaBvcLB2UgHpKENO2i6BthPkmUhNDaJsVw==",
-      "dev": true,
-      "optional": true
-    },
-    "@esbuild/netbsd-x64": {
-      "version": "0.17.14",
-      "resolved": "https://registry.npmmirror.com/@esbuild/netbsd-x64/-/netbsd-x64-0.17.14.tgz",
-      "integrity": "sha512-nVwpqvb3yyXztxIT2+VsxJhB5GCgzPdk1n0HHSnchRAcxqKO6ghXwHhJnr0j/B+5FSyEqSxF4q03rbA2fKXtUQ==",
-      "dev": true,
-      "optional": true
-    },
-    "@esbuild/openbsd-x64": {
-      "version": "0.17.14",
-      "resolved": "https://registry.npmmirror.com/@esbuild/openbsd-x64/-/openbsd-x64-0.17.14.tgz",
-      "integrity": "sha512-1RZ7uQQ9zcy/GSAJL1xPdN7NDdOOtNEGiJalg/MOzeakZeTrgH/DoCkbq7TaPDiPhWqnDF+4bnydxRqQD7il6g==",
-      "dev": true,
-      "optional": true
-    },
-    "@esbuild/sunos-x64": {
-      "version": "0.17.14",
-      "resolved": "https://registry.npmmirror.com/@esbuild/sunos-x64/-/sunos-x64-0.17.14.tgz",
-      "integrity": "sha512-nqMjDsFwv7vp7msrwWRysnM38Sd44PKmW8EzV01YzDBTcTWUpczQg6mGao9VLicXSgW/iookNK6AxeogNVNDZA==",
-      "dev": true,
-      "optional": true
-    },
-    "@esbuild/win32-arm64": {
-      "version": "0.17.14",
-      "resolved": "https://registry.npmmirror.com/@esbuild/win32-arm64/-/win32-arm64-0.17.14.tgz",
-      "integrity": "sha512-xrD0mccTKRBBIotrITV7WVQAwNJ5+1va6L0H9zN92v2yEdjfAN7864cUaZwJS7JPEs53bDTzKFbfqVlG2HhyKQ==",
-      "dev": true,
-      "optional": true
-    },
-    "@esbuild/win32-ia32": {
-      "version": "0.17.14",
-      "resolved": "https://registry.npmmirror.com/@esbuild/win32-ia32/-/win32-ia32-0.17.14.tgz",
-      "integrity": "sha512-nXpkz9bbJrLLyUTYtRotSS3t5b+FOuljg8LgLdINWFs3FfqZMtbnBCZFUmBzQPyxqU87F8Av+3Nco/M3hEcu1w==",
-      "dev": true,
-      "optional": true
-    },
-    "@esbuild/win32-x64": {
-      "version": "0.17.14",
-      "resolved": "https://registry.npmmirror.com/@esbuild/win32-x64/-/win32-x64-0.17.14.tgz",
-      "integrity": "sha512-gPQmsi2DKTaEgG14hc3CHXHp62k8g6qr0Pas+I4lUxRMugGSATh/Bi8Dgusoz9IQ0IfdrvLpco6kujEIBoaogA==",
-      "dev": true,
-      "optional": true
-    },
-    "@jridgewell/sourcemap-codec": {
-      "version": "1.4.14",
-      "resolved": "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz",
-      "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==",
-      "dev": true
-    },
-    "@nodelib/fs.scandir": {
-      "version": "2.1.5",
-      "resolved": "https://registry.npmmirror.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
-      "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
-      "dev": true,
-      "requires": {
-        "@nodelib/fs.stat": "2.0.5",
-        "run-parallel": "^1.1.9"
-      }
-    },
-    "@nodelib/fs.stat": {
-      "version": "2.0.5",
-      "resolved": "https://registry.npmmirror.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
-      "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
-      "dev": true
-    },
-    "@nodelib/fs.walk": {
-      "version": "1.2.8",
-      "resolved": "https://registry.npmmirror.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
-      "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
-      "dev": true,
-      "requires": {
-        "@nodelib/fs.scandir": "2.1.5",
-        "fastq": "^1.6.0"
-      }
-    },
-    "@rollup/pluginutils": {
-      "version": "5.0.2",
-      "resolved": "https://registry.npmmirror.com/@rollup/pluginutils/-/pluginutils-5.0.2.tgz",
-      "integrity": "sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==",
-      "dev": true,
-      "requires": {
-        "@types/estree": "^1.0.0",
-        "estree-walker": "^2.0.2",
-        "picomatch": "^2.3.1"
-      }
-    },
-    "@types/estree": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmmirror.com/@types/estree/-/estree-1.0.0.tgz",
-      "integrity": "sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==",
-      "dev": true
-    },
-    "@vant/popperjs": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmmirror.com/@vant/popperjs/-/popperjs-1.3.0.tgz",
-      "integrity": "sha512-hB+czUG+aHtjhaEmCJDuXOep0YTZjdlRR+4MSmIFnkCQIxJaXLQdSsR90XWvAI2yvKUI7TCGqR8pQg2RtvkMHw=="
-    },
-    "@vant/use": {
-      "version": "1.5.1",
-      "resolved": "https://registry.npmmirror.com/@vant/use/-/use-1.5.1.tgz",
-      "integrity": "sha512-Zxd7lDz/LliVYEQi3PR9a8CQa/kGCVzF0u9hqDMaTlgXlbG0wHMFPllrcG0ThR6bfs8xrYVuSFM9pJn6HSoUGQ=="
-    },
-    "@vitejs/plugin-vue": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmmirror.com/@vitejs/plugin-vue/-/plugin-vue-4.1.0.tgz",
-      "integrity": "sha512-++9JOAFdcXI3lyer9UKUV4rfoQ3T1RN8yDqoCLar86s0xQct5yblxAE+yWgRnU5/0FOlVCpTZpYSBV/bGWrSrQ==",
-      "dev": true
-    },
-    "@vue/compiler-core": {
-      "version": "3.2.47",
-      "resolved": "https://registry.npmmirror.com/@vue/compiler-core/-/compiler-core-3.2.47.tgz",
-      "integrity": "sha512-p4D7FDnQb7+YJmO2iPEv0SQNeNzcbHdGByJDsT4lynf63AFkOTFN07HsiRSvjGo0QrxR/o3d0hUyNCUnBU2Tig==",
-      "requires": {
-        "@babel/parser": "^7.16.4",
-        "@vue/shared": "3.2.47",
-        "estree-walker": "^2.0.2",
-        "source-map": "^0.6.1"
-      }
-    },
-    "@vue/compiler-dom": {
-      "version": "3.2.47",
-      "resolved": "https://registry.npmmirror.com/@vue/compiler-dom/-/compiler-dom-3.2.47.tgz",
-      "integrity": "sha512-dBBnEHEPoftUiS03a4ggEig74J2YBZ2UIeyfpcRM2tavgMWo4bsEfgCGsu+uJIL/vax9S+JztH8NmQerUo7shQ==",
-      "requires": {
-        "@vue/compiler-core": "3.2.47",
-        "@vue/shared": "3.2.47"
-      }
-    },
-    "@vue/compiler-sfc": {
-      "version": "3.2.47",
-      "resolved": "https://registry.npmmirror.com/@vue/compiler-sfc/-/compiler-sfc-3.2.47.tgz",
-      "integrity": "sha512-rog05W+2IFfxjMcFw10tM9+f7i/+FFpZJJ5XHX72NP9eC2uRD+42M3pYcQqDXVYoj74kHMSEdQ/WmCjt8JFksQ==",
-      "requires": {
-        "@babel/parser": "^7.16.4",
-        "@vue/compiler-core": "3.2.47",
-        "@vue/compiler-dom": "3.2.47",
-        "@vue/compiler-ssr": "3.2.47",
-        "@vue/reactivity-transform": "3.2.47",
-        "@vue/shared": "3.2.47",
-        "estree-walker": "^2.0.2",
-        "magic-string": "^0.25.7",
-        "postcss": "^8.1.10",
-        "source-map": "^0.6.1"
-      }
-    },
-    "@vue/compiler-ssr": {
-      "version": "3.2.47",
-      "resolved": "https://registry.npmmirror.com/@vue/compiler-ssr/-/compiler-ssr-3.2.47.tgz",
-      "integrity": "sha512-wVXC+gszhulcMD8wpxMsqSOpvDZ6xKXSVWkf50Guf/S+28hTAXPDYRTbLQ3EDkOP5Xz/+SY37YiwDquKbJOgZw==",
-      "requires": {
-        "@vue/compiler-dom": "3.2.47",
-        "@vue/shared": "3.2.47"
-      }
-    },
-    "@vue/devtools-api": {
-      "version": "6.5.0",
-      "resolved": "https://registry.npmmirror.com/@vue/devtools-api/-/devtools-api-6.5.0.tgz",
-      "integrity": "sha512-o9KfBeaBmCKl10usN4crU53fYtC1r7jJwdGKjPT24t348rHxgfpZ0xL3Xm/gLUYnc0oTp8LAmrxOeLyu6tbk2Q=="
-    },
-    "@vue/reactivity": {
-      "version": "3.2.47",
-      "resolved": "https://registry.npmmirror.com/@vue/reactivity/-/reactivity-3.2.47.tgz",
-      "integrity": "sha512-7khqQ/75oyyg+N/e+iwV6lpy1f5wq759NdlS1fpAhFXa8VeAIKGgk2E/C4VF59lx5b+Ezs5fpp/5WsRYXQiKxQ==",
-      "requires": {
-        "@vue/shared": "3.2.47"
-      }
-    },
-    "@vue/reactivity-transform": {
-      "version": "3.2.47",
-      "resolved": "https://registry.npmmirror.com/@vue/reactivity-transform/-/reactivity-transform-3.2.47.tgz",
-      "integrity": "sha512-m8lGXw8rdnPVVIdIFhf0LeQ/ixyHkH5plYuS83yop5n7ggVJU+z5v0zecwEnX7fa7HNLBhh2qngJJkxpwEEmYA==",
-      "requires": {
-        "@babel/parser": "^7.16.4",
-        "@vue/compiler-core": "3.2.47",
-        "@vue/shared": "3.2.47",
-        "estree-walker": "^2.0.2",
-        "magic-string": "^0.25.7"
-      }
-    },
-    "@vue/runtime-core": {
-      "version": "3.2.47",
-      "resolved": "https://registry.npmmirror.com/@vue/runtime-core/-/runtime-core-3.2.47.tgz",
-      "integrity": "sha512-RZxbLQIRB/K0ev0K9FXhNbBzT32H9iRtYbaXb0ZIz2usLms/D55dJR2t6cIEUn6vyhS3ALNvNthI+Q95C+NOpA==",
-      "requires": {
-        "@vue/reactivity": "3.2.47",
-        "@vue/shared": "3.2.47"
-      }
-    },
-    "@vue/runtime-dom": {
-      "version": "3.2.47",
-      "resolved": "https://registry.npmmirror.com/@vue/runtime-dom/-/runtime-dom-3.2.47.tgz",
-      "integrity": "sha512-ArXrFTjS6TsDei4qwNvgrdmHtD930KgSKGhS5M+j8QxXrDJYLqYw4RRcDy1bz1m1wMmb6j+zGLifdVHtkXA7gA==",
-      "requires": {
-        "@vue/runtime-core": "3.2.47",
-        "@vue/shared": "3.2.47",
-        "csstype": "^2.6.8"
-      }
-    },
-    "@vue/server-renderer": {
-      "version": "3.2.47",
-      "resolved": "https://registry.npmmirror.com/@vue/server-renderer/-/server-renderer-3.2.47.tgz",
-      "integrity": "sha512-dN9gc1i8EvmP9RCzvneONXsKfBRgqFeFZLurmHOveL7oH6HiFXJw5OGu294n1nHc/HMgTy6LulU/tv5/A7f/LA==",
-      "requires": {
-        "@vue/compiler-ssr": "3.2.47",
-        "@vue/shared": "3.2.47"
-      }
-    },
-    "@vue/shared": {
-      "version": "3.2.47",
-      "resolved": "https://registry.npmmirror.com/@vue/shared/-/shared-3.2.47.tgz",
-      "integrity": "sha512-BHGyyGN3Q97EZx0taMQ+OLNuZcW3d37ZEVmEAyeoA9ERdGvm9Irc/0Fua8SNyOtV1w6BS4q25wbMzJujO9HIfQ=="
-    },
-    "acorn": {
-      "version": "8.8.2",
-      "resolved": "https://registry.npmmirror.com/acorn/-/acorn-8.8.2.tgz",
-      "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==",
-      "dev": true
-    },
-    "anymatch": {
-      "version": "3.1.3",
-      "resolved": "https://registry.npmmirror.com/anymatch/-/anymatch-3.1.3.tgz",
-      "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
-      "dev": true,
-      "requires": {
-        "normalize-path": "^3.0.0",
-        "picomatch": "^2.0.4"
-      }
-    },
-    "asynckit": {
-      "version": "0.4.0",
-      "resolved": "https://registry.npmmirror.com/asynckit/-/asynckit-0.4.0.tgz",
-      "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
-    },
-    "axios": {
-      "version": "1.3.4",
-      "resolved": "https://registry.npmmirror.com/axios/-/axios-1.3.4.tgz",
-      "integrity": "sha512-toYm+Bsyl6VC5wSkfkbbNB6ROv7KY93PEBBL6xyDczaIHasAiv4wPqQ/c4RjoQzipxRD2W5g21cOqQulZ7rHwQ==",
-      "requires": {
-        "follow-redirects": "^1.15.0",
-        "form-data": "^4.0.0",
-        "proxy-from-env": "^1.1.0"
-      }
-    },
-    "balanced-match": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz",
-      "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
-      "dev": true
-    },
-    "binary-extensions": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmmirror.com/binary-extensions/-/binary-extensions-2.2.0.tgz",
-      "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
-      "dev": true
-    },
-    "brace-expansion": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-2.0.1.tgz",
-      "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
-      "dev": true,
-      "requires": {
-        "balanced-match": "^1.0.0"
-      }
-    },
-    "braces": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmmirror.com/braces/-/braces-3.0.2.tgz",
-      "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
-      "dev": true,
-      "requires": {
-        "fill-range": "^7.0.1"
-      }
-    },
-    "chokidar": {
-      "version": "3.5.3",
-      "resolved": "https://registry.npmmirror.com/chokidar/-/chokidar-3.5.3.tgz",
-      "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
-      "dev": true,
-      "requires": {
-        "anymatch": "~3.1.2",
-        "braces": "~3.0.2",
-        "fsevents": "~2.3.2",
-        "glob-parent": "~5.1.2",
-        "is-binary-path": "~2.1.0",
-        "is-glob": "~4.0.1",
-        "normalize-path": "~3.0.0",
-        "readdirp": "~3.6.0"
-      }
-    },
-    "combined-stream": {
-      "version": "1.0.8",
-      "resolved": "https://registry.npmmirror.com/combined-stream/-/combined-stream-1.0.8.tgz",
-      "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
-      "requires": {
-        "delayed-stream": "~1.0.0"
-      }
-    },
-    "csstype": {
-      "version": "2.6.21",
-      "resolved": "https://registry.npmmirror.com/csstype/-/csstype-2.6.21.tgz",
-      "integrity": "sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w=="
-    },
-    "debug": {
-      "version": "4.3.4",
-      "resolved": "https://registry.npmmirror.com/debug/-/debug-4.3.4.tgz",
-      "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
-      "dev": true,
-      "requires": {
-        "ms": "2.1.2"
-      }
-    },
-    "delayed-stream": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmmirror.com/delayed-stream/-/delayed-stream-1.0.0.tgz",
-      "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ=="
-    },
-    "esbuild": {
-      "version": "0.17.14",
-      "resolved": "https://registry.npmmirror.com/esbuild/-/esbuild-0.17.14.tgz",
-      "integrity": "sha512-vOO5XhmVj/1XQR9NQ1UPq6qvMYL7QFJU57J5fKBKBKxp17uDt5PgxFDb4A2nEiXhr1qQs4x0F5+66hVVw4ruNw==",
-      "dev": true,
-      "requires": {
-        "@esbuild/android-arm": "0.17.14",
-        "@esbuild/android-arm64": "0.17.14",
-        "@esbuild/android-x64": "0.17.14",
-        "@esbuild/darwin-arm64": "0.17.14",
-        "@esbuild/darwin-x64": "0.17.14",
-        "@esbuild/freebsd-arm64": "0.17.14",
-        "@esbuild/freebsd-x64": "0.17.14",
-        "@esbuild/linux-arm": "0.17.14",
-        "@esbuild/linux-arm64": "0.17.14",
-        "@esbuild/linux-ia32": "0.17.14",
-        "@esbuild/linux-loong64": "0.17.14",
-        "@esbuild/linux-mips64el": "0.17.14",
-        "@esbuild/linux-ppc64": "0.17.14",
-        "@esbuild/linux-riscv64": "0.17.14",
-        "@esbuild/linux-s390x": "0.17.14",
-        "@esbuild/linux-x64": "0.17.14",
-        "@esbuild/netbsd-x64": "0.17.14",
-        "@esbuild/openbsd-x64": "0.17.14",
-        "@esbuild/sunos-x64": "0.17.14",
-        "@esbuild/win32-arm64": "0.17.14",
-        "@esbuild/win32-ia32": "0.17.14",
-        "@esbuild/win32-x64": "0.17.14"
-      }
-    },
-    "estree-walker": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmmirror.com/estree-walker/-/estree-walker-2.0.2.tgz",
-      "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="
-    },
-    "fast-glob": {
-      "version": "3.2.12",
-      "resolved": "https://registry.npmmirror.com/fast-glob/-/fast-glob-3.2.12.tgz",
-      "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==",
-      "dev": true,
-      "requires": {
-        "@nodelib/fs.stat": "^2.0.2",
-        "@nodelib/fs.walk": "^1.2.3",
-        "glob-parent": "^5.1.2",
-        "merge2": "^1.3.0",
-        "micromatch": "^4.0.4"
-      }
-    },
-    "fastq": {
-      "version": "1.15.0",
-      "resolved": "https://registry.npmmirror.com/fastq/-/fastq-1.15.0.tgz",
-      "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==",
-      "dev": true,
-      "requires": {
-        "reusify": "^1.0.4"
-      }
-    },
-    "fill-range": {
-      "version": "7.0.1",
-      "resolved": "https://registry.npmmirror.com/fill-range/-/fill-range-7.0.1.tgz",
-      "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
-      "dev": true,
-      "requires": {
-        "to-regex-range": "^5.0.1"
-      }
-    },
-    "follow-redirects": {
-      "version": "1.15.2",
-      "resolved": "https://registry.npmmirror.com/follow-redirects/-/follow-redirects-1.15.2.tgz",
-      "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA=="
-    },
-    "form-data": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmmirror.com/form-data/-/form-data-4.0.0.tgz",
-      "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
-      "requires": {
-        "asynckit": "^0.4.0",
-        "combined-stream": "^1.0.8",
-        "mime-types": "^2.1.12"
-      }
-    },
-    "fsevents": {
-      "version": "2.3.2",
-      "resolved": "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.2.tgz",
-      "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
-      "dev": true,
-      "optional": true
-    },
-    "function-bind": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.1.tgz",
-      "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
-      "dev": true
-    },
-    "glob-parent": {
-      "version": "5.1.2",
-      "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz",
-      "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
-      "dev": true,
-      "requires": {
-        "is-glob": "^4.0.1"
-      }
-    },
-    "has": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmmirror.com/has/-/has-1.0.3.tgz",
-      "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
-      "dev": true,
-      "requires": {
-        "function-bind": "^1.1.1"
-      }
-    },
-    "highcharts": {
-      "version": "10.3.3",
-      "resolved": "https://registry.npmmirror.com/highcharts/-/highcharts-10.3.3.tgz",
-      "integrity": "sha512-r7wgUPQI9tr3jFDn3XT36qsNwEIZYcfgz4mkKEA6E4nn5p86y+u1EZjazIG4TRkl5/gmGRtkBUiZW81g029RIw=="
-    },
-    "immutable": {
-      "version": "4.3.0",
-      "resolved": "https://registry.npmmirror.com/immutable/-/immutable-4.3.0.tgz",
-      "integrity": "sha512-0AOCmOip+xgJwEVTQj1EfiDDOkPmuyllDuTuEX+DDXUgapLAsBIfkg3sxCYyCEA8mQqZrrxPUGjcOQ2JS3WLkg==",
-      "dev": true
-    },
-    "is-binary-path": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmmirror.com/is-binary-path/-/is-binary-path-2.1.0.tgz",
-      "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
-      "dev": true,
-      "requires": {
-        "binary-extensions": "^2.0.0"
-      }
-    },
-    "is-core-module": {
-      "version": "2.11.0",
-      "resolved": "https://registry.npmmirror.com/is-core-module/-/is-core-module-2.11.0.tgz",
-      "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==",
-      "dev": true,
-      "requires": {
-        "has": "^1.0.3"
-      }
-    },
-    "is-extglob": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmmirror.com/is-extglob/-/is-extglob-2.1.1.tgz",
-      "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
-      "dev": true
-    },
-    "is-glob": {
-      "version": "4.0.3",
-      "resolved": "https://registry.npmmirror.com/is-glob/-/is-glob-4.0.3.tgz",
-      "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
-      "dev": true,
-      "requires": {
-        "is-extglob": "^2.1.1"
-      }
-    },
-    "is-number": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmmirror.com/is-number/-/is-number-7.0.0.tgz",
-      "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
-      "dev": true
-    },
-    "js-base64": {
-      "version": "3.7.5",
-      "resolved": "https://registry.npmmirror.com/js-base64/-/js-base64-3.7.5.tgz",
-      "integrity": "sha512-3MEt5DTINKqfScXKfJFrRbxkrnk2AxPWGBL/ycjz4dK8iqiSJ06UxD8jh8xuh6p10TX4t2+7FsBYVxxQbMg+qA=="
-    },
-    "js-md5": {
-      "version": "0.7.3",
-      "resolved": "https://registry.npmmirror.com/js-md5/-/js-md5-0.7.3.tgz",
-      "integrity": "sha512-ZC41vPSTLKGwIRjqDh8DfXoCrdQIyBgspJVPXHBGu4nZlAEvG3nf+jO9avM9RmLiGakg7vz974ms99nEV0tmTQ=="
-    },
-    "local-pkg": {
-      "version": "0.4.3",
-      "resolved": "https://registry.npmmirror.com/local-pkg/-/local-pkg-0.4.3.tgz",
-      "integrity": "sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==",
-      "dev": true
-    },
-    "magic-string": {
-      "version": "0.25.9",
-      "resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.25.9.tgz",
-      "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==",
-      "requires": {
-        "sourcemap-codec": "^1.4.8"
-      }
-    },
-    "merge2": {
-      "version": "1.4.1",
-      "resolved": "https://registry.npmmirror.com/merge2/-/merge2-1.4.1.tgz",
-      "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
-      "dev": true
-    },
-    "micromatch": {
-      "version": "4.0.5",
-      "resolved": "https://registry.npmmirror.com/micromatch/-/micromatch-4.0.5.tgz",
-      "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
-      "dev": true,
-      "requires": {
-        "braces": "^3.0.2",
-        "picomatch": "^2.3.1"
-      }
-    },
-    "mime-db": {
-      "version": "1.52.0",
-      "resolved": "https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz",
-      "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="
-    },
-    "mime-types": {
-      "version": "2.1.35",
-      "resolved": "https://registry.npmmirror.com/mime-types/-/mime-types-2.1.35.tgz",
-      "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
-      "requires": {
-        "mime-db": "1.52.0"
-      }
-    },
-    "minimatch": {
-      "version": "7.4.3",
-      "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-7.4.3.tgz",
-      "integrity": "sha512-5UB4yYusDtkRPbRiy1cqZ1IpGNcJCGlEMG17RKzPddpyiPKoCdwohbED8g4QXT0ewCt8LTkQXuljsUfQ3FKM4A==",
-      "dev": true,
-      "requires": {
-        "brace-expansion": "^2.0.1"
-      }
-    },
-    "moment": {
-      "version": "2.29.4",
-      "resolved": "https://registry.npmmirror.com/moment/-/moment-2.29.4.tgz",
-      "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w=="
-    },
-    "ms": {
-      "version": "2.1.2",
-      "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz",
-      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
-      "dev": true
-    },
-    "nanoid": {
-      "version": "3.3.6",
-      "resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.6.tgz",
-      "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA=="
-    },
-    "normalize-path": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmmirror.com/normalize-path/-/normalize-path-3.0.0.tgz",
-      "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
-      "dev": true
-    },
-    "normalize.css": {
-      "version": "8.0.1",
-      "resolved": "https://registry.npmmirror.com/normalize.css/-/normalize.css-8.0.1.tgz",
-      "integrity": "sha512-qizSNPO93t1YUuUhP22btGOo3chcvDFqFaj2TRybP0DMxkHOCTYwp3n34fel4a31ORXy4m1Xq0Gyqpb5m33qIg=="
-    },
-    "path-parse": {
-      "version": "1.0.7",
-      "resolved": "https://registry.npmmirror.com/path-parse/-/path-parse-1.0.7.tgz",
-      "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
-      "dev": true
-    },
-    "picocolors": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.0.0.tgz",
-      "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ=="
-    },
-    "picomatch": {
-      "version": "2.3.1",
-      "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.1.tgz",
-      "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
-      "dev": true
-    },
-    "postcss": {
-      "version": "8.4.21",
-      "resolved": "https://registry.npmmirror.com/postcss/-/postcss-8.4.21.tgz",
-      "integrity": "sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==",
-      "requires": {
-        "nanoid": "^3.3.4",
-        "picocolors": "^1.0.0",
-        "source-map-js": "^1.0.2"
-      }
-    },
-    "proxy-from-env": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmmirror.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
-      "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="
-    },
-    "queue-microtask": {
-      "version": "1.2.3",
-      "resolved": "https://registry.npmmirror.com/queue-microtask/-/queue-microtask-1.2.3.tgz",
-      "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
-      "dev": true
-    },
-    "readdirp": {
-      "version": "3.6.0",
-      "resolved": "https://registry.npmmirror.com/readdirp/-/readdirp-3.6.0.tgz",
-      "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
-      "dev": true,
-      "requires": {
-        "picomatch": "^2.2.1"
-      }
-    },
-    "resolve": {
-      "version": "1.22.1",
-      "resolved": "https://registry.npmmirror.com/resolve/-/resolve-1.22.1.tgz",
-      "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==",
-      "dev": true,
-      "requires": {
-        "is-core-module": "^2.9.0",
-        "path-parse": "^1.0.7",
-        "supports-preserve-symlinks-flag": "^1.0.0"
-      }
-    },
-    "reusify": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmmirror.com/reusify/-/reusify-1.0.4.tgz",
-      "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
-      "dev": true
-    },
-    "rollup": {
-      "version": "3.20.2",
-      "resolved": "https://registry.npmmirror.com/rollup/-/rollup-3.20.2.tgz",
-      "integrity": "sha512-3zwkBQl7Ai7MFYQE0y1MeQ15+9jsi7XxfrqwTb/9EK8D9C9+//EBR4M+CuA1KODRaNbFez/lWxA5vhEGZp4MUg==",
-      "dev": true,
-      "requires": {
-        "fsevents": "~2.3.2"
-      }
-    },
-    "run-parallel": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmmirror.com/run-parallel/-/run-parallel-1.2.0.tgz",
-      "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
-      "dev": true,
-      "requires": {
-        "queue-microtask": "^1.2.2"
-      }
-    },
-    "sass": {
-      "version": "1.60.0",
-      "resolved": "https://registry.npmmirror.com/sass/-/sass-1.60.0.tgz",
-      "integrity": "sha512-updbwW6fNb5gGm8qMXzVO7V4sWf7LMXnMly/JEyfbfERbVH46Fn6q02BX7/eHTdKpE7d+oTkMMQpFWNUMfFbgQ==",
-      "dev": true,
-      "requires": {
-        "chokidar": ">=3.0.0 <4.0.0",
-        "immutable": "^4.0.0",
-        "source-map-js": ">=0.6.2 <2.0.0"
-      }
-    },
-    "source-map": {
-      "version": "0.6.1",
-      "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz",
-      "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
-    },
-    "source-map-js": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.0.2.tgz",
-      "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw=="
-    },
-    "sourcemap-codec": {
-      "version": "1.4.8",
-      "resolved": "https://registry.npmmirror.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz",
-      "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA=="
-    },
-    "supports-preserve-symlinks-flag": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmmirror.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
-      "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
-      "dev": true
-    },
-    "to-regex-range": {
-      "version": "5.0.1",
-      "resolved": "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-5.0.1.tgz",
-      "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
-      "dev": true,
-      "requires": {
-        "is-number": "^7.0.0"
-      }
-    },
-    "unplugin": {
-      "version": "1.3.1",
-      "resolved": "https://registry.npmmirror.com/unplugin/-/unplugin-1.3.1.tgz",
-      "integrity": "sha512-h4uUTIvFBQRxUKS2Wjys6ivoeofGhxzTe2sRWlooyjHXVttcVfV/JiavNd3d4+jty0SVV0dxGw9AkY9MwiaCEw==",
-      "dev": true,
-      "requires": {
-        "acorn": "^8.8.2",
-        "chokidar": "^3.5.3",
-        "webpack-sources": "^3.2.3",
-        "webpack-virtual-modules": "^0.5.0"
-      }
-    },
-    "unplugin-vue-components": {
-      "version": "0.24.1",
-      "resolved": "https://registry.npmmirror.com/unplugin-vue-components/-/unplugin-vue-components-0.24.1.tgz",
-      "integrity": "sha512-T3A8HkZoIE1Cja95xNqolwza0yD5IVlgZZ1PVAGvVCx8xthmjsv38xWRCtHtwl+rvZyL9uif42SRkDGw9aCfMA==",
-      "dev": true,
-      "requires": {
-        "@antfu/utils": "^0.7.2",
-        "@rollup/pluginutils": "^5.0.2",
-        "chokidar": "^3.5.3",
-        "debug": "^4.3.4",
-        "fast-glob": "^3.2.12",
-        "local-pkg": "^0.4.3",
-        "magic-string": "^0.30.0",
-        "minimatch": "^7.4.2",
-        "resolve": "^1.22.1",
-        "unplugin": "^1.1.0"
-      },
-      "dependencies": {
-        "magic-string": {
-          "version": "0.30.0",
-          "resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.30.0.tgz",
-          "integrity": "sha512-LA+31JYDJLs82r2ScLrlz1GjSgu66ZV518eyWT+S8VhyQn/JL0u9MeBOvQMGYiPk1DBiSN9DDMOcXvigJZaViQ==",
-          "dev": true,
-          "requires": {
-            "@jridgewell/sourcemap-codec": "^1.4.13"
-          }
-        }
-      }
-    },
-    "vant": {
-      "version": "4.1.2",
-      "resolved": "https://registry.npmmirror.com/vant/-/vant-4.1.2.tgz",
-      "integrity": "sha512-iRUYBR5zDbs7O0UTxauyW/0XbJoE0g/eHipn0y3QxXeazdmNiaV0kGbBKRJ8vE/7p74zila/O5LzDiYbPDDN7Q==",
-      "requires": {
-        "@vant/popperjs": "^1.3.0",
-        "@vant/use": "^1.5.1"
-      }
-    },
-    "vite": {
-      "version": "4.2.1",
-      "resolved": "https://registry.npmmirror.com/vite/-/vite-4.2.1.tgz",
-      "integrity": "sha512-7MKhqdy0ISo4wnvwtqZkjke6XN4taqQ2TBaTccLIpOKv7Vp2h4Y+NpmWCnGDeSvvn45KxvWgGyb0MkHvY1vgbg==",
-      "dev": true,
-      "requires": {
-        "esbuild": "^0.17.5",
-        "fsevents": "~2.3.2",
-        "postcss": "^8.4.21",
-        "resolve": "^1.22.1",
-        "rollup": "^3.18.0"
-      }
-    },
-    "vue": {
-      "version": "3.2.47",
-      "resolved": "https://registry.npmmirror.com/vue/-/vue-3.2.47.tgz",
-      "integrity": "sha512-60188y/9Dc9WVrAZeUVSDxRQOZ+z+y5nO2ts9jWXSTkMvayiWxCWOWtBQoYjLeccfXkiiPZWAHcV+WTPhkqJHQ==",
-      "requires": {
-        "@vue/compiler-dom": "3.2.47",
-        "@vue/compiler-sfc": "3.2.47",
-        "@vue/runtime-dom": "3.2.47",
-        "@vue/server-renderer": "3.2.47",
-        "@vue/shared": "3.2.47"
-      }
-    },
-    "vue-router": {
-      "version": "4.1.6",
-      "resolved": "https://registry.npmmirror.com/vue-router/-/vue-router-4.1.6.tgz",
-      "integrity": "sha512-DYWYwsG6xNPmLq/FmZn8Ip+qrhFEzA14EI12MsMgVxvHFDYvlr4NXpVF5hrRH1wVcDP8fGi5F4rxuJSl8/r+EQ==",
-      "requires": {
-        "@vue/devtools-api": "^6.4.5"
-      }
-    },
-    "webpack-sources": {
-      "version": "3.2.3",
-      "resolved": "https://registry.npmmirror.com/webpack-sources/-/webpack-sources-3.2.3.tgz",
-      "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==",
-      "dev": true
-    },
-    "webpack-virtual-modules": {
-      "version": "0.5.0",
-      "resolved": "https://registry.npmmirror.com/webpack-virtual-modules/-/webpack-virtual-modules-0.5.0.tgz",
-      "integrity": "sha512-kyDivFZ7ZM0BVOUteVbDFhlRt7Ah/CSPwJdi8hBpkK7QLumUqdLtVfm/PX/hkcnrvr0i77fO5+TjZ94Pe+C9iw==",
-      "dev": true
-    }
-  }
-}

+ 4 - 3
src/components/chart/utils/render.js

@@ -5,6 +5,7 @@ import {chartDefaultOpts,scatterXAxis,basicYAxis,basicXAxis} from './config'
 import Highcharts from 'highcharts/highstock';
 import HighchartszhCN  from './highcahrts-zh_CN.js'
 import moment from 'moment'
+import _ from 'lodash';
 HighchartszhCN(Highcharts)
 
 /**
@@ -890,7 +891,7 @@ function initBarData(data){
     axisLimitData.leftMin=Number(ChartInfo.LeftMin)
     axisLimitData.leftMax=Number(ChartInfo.LeftMax)
 
-    setBarChart();
+    return setBarChart();
 }
 
 
@@ -983,7 +984,7 @@ const setCommodityChart = (leftMin,leftMax) => {
         },
         shared: true
     }
-    
+    console.log(seriesData);
     return {
         title: {
             text:''
@@ -1020,7 +1021,7 @@ function initCommodityData(data){
     commodityChartData.value = YDataList;
     commodityXData.value = XDataList;
 
-    setCommodityChart(ChartInfo.LeftMin,ChartInfo.LeftMax);
+    return setCommodityChart(ChartInfo.LeftMin,ChartInfo.LeftMax);
 }
 
 

+ 152 - 0
src/hooks/chart/config.js

@@ -0,0 +1,152 @@
+
+//图模块公共配置
+
+// 图默认配置
+export const chartDefaultOpts={
+    //图表配置
+	chart: {
+		spacingTop: 30,
+		backgroundColor: "rgba(0,0,0,0)",
+	},
+	title: {
+		enabled: false
+	},
+	exporting: {
+		enabled: false,
+	},
+	//默认颜色配置
+	colors:['#00f','#f00','#999','#000','#7cb5ec', '#90ed7d', '#f7a35c', '#8085e9', 
+	'#f15c80', '#e4d354', '#2b908f', '#f45b5b', '#91e8e1'],
+	//版权信息
+	credits: {enabled:false},
+	//数据列通用配置
+	plotOptions: {
+		series: {
+			turboThreshold: 0, //不限制数据点个数 
+			boostThreshold:0,
+			animation: {
+				duration: 1000
+			}
+		},
+		areaspline: {
+			lineWidth: 1,
+			stacking: 'normal',
+			marker: {
+					enabled: false,
+			},
+			// fillOpacity: 0.5,
+		},
+		column:{
+			pointPadding: 0.05,
+			stacking: 'normal',
+		},
+		scatter: {
+			turboThreshold: 0,
+			marker: {
+					symbol: 'circle',
+					radius: 5,
+					states: {
+							hover: {
+									enabled: true,
+							}
+					}
+			},
+			states: {
+				hover: {
+					marker: {
+						enabled: true
+					}
+				}
+			}
+		}
+	},
+	//范围选择器
+	rangeSelector: {
+		enabled: false,
+		selected: 2,
+	},
+	//悬浮提示框
+	tooltip: {
+		split: false,
+		shared: true,
+		dateTimeLabelFormats: {
+			// 时间格式化字符
+			day: '%Y/%m/%d',
+			week: "%Y/%m",
+			month: '%Y/%m',
+			year: '%Y/%m',
+		},
+		xDateFormat:'%Y/%m/%d',
+		className:'chart-tooltips-box'
+		// formatter:function(e){
+		// 	return `<p>${this.x}</p><p>aaa</p>`
+		// 	// return e
+		// }
+		// outside: true,
+		// valueDecimals: 4,
+	},
+	//图例
+	legend: {
+		enabled: true,
+		verticalAlign: 'top',
+		margin:3,
+		// layout: 'vertical'
+	},
+	//滚动条
+	scrollbar: {
+		enabled: false,
+	},
+	//导航器
+	navigator: {
+		enabled: false,
+	},
+	//范围选择器
+	rangeSelector: {
+		enabled: false,
+	},
+}
+
+// 散点x轴
+export const scatterXAxis = {
+    tickPosition: 'inside',
+    lineColor: '#bfbfbf',
+    tickColor: '#bfbfbf',
+    tickLength:5,
+    ordinal: false,
+    type: 'linear',
+}
+
+// 基础y轴配置
+export const basicYAxis = {
+    tickWidth: 1,
+    tickLength: 5,
+    lineWidth: 1,
+    lineColor: '#bfbfbf',
+    tickColor: '#bfbfbf',
+    // offset: 0,
+    visible: true,
+    gridLineWidth: 0,
+    tickPosition: 'inside',
+    endOnTick: false,
+    startOnTick: false,
+    showLastLabel: true,
+    tickPixelInterval: 50,
+}
+
+//基础x轴配置
+export const basicXAxis={
+    tickPosition: 'inside',
+    lineColor: '#bfbfbf',
+    tickColor: '#bfbfbf',
+    tickLength:5,
+    type: 'datetime',
+    ordinal: false,
+    dateTimeLabelFormats: {
+        day: '%y/%m',
+        week: '%y/%m',
+        month: '%y/%m',
+        year: '%y/%m',
+    },
+    xDateFormat:'%Y-%m-%d'
+}
+

+ 240 - 0
src/hooks/chart/highcahrts-zh_CN.js

@@ -0,0 +1,240 @@
+/**
+ * Highcharts-zh_CN ES6 版本 plugins v1.2.1 (2020-07-29)
+ *
+ * (c) 2020 Jianshu Technology Co.,LTD (https://jianshukeji.com)
+ *
+ * Author : john@jianshukeji.com, Blue Monkey
+ *
+ * License: Creative Commons Attribution (CC)
+ */
+
+export default (H) => {
+  let protocol = window.location.protocol;
+
+  if (!/^http(s)?:&/.test(protocol)) {
+    protocol = 'http:';
+  }
+
+  let defaultOptionsZhCn = {
+    lang: {
+      // Highcharts
+      contextButtonTitle: '图表导出菜单',
+      decimalPoint: '.',
+      downloadJPEG: '下载 JPEG 图片',
+      downloadPDF: '下载 PDF 文件',
+      downloadPNG: '下载 PNG 文件',
+      downloadSVG: '下载 SVG 文件',
+      downloadXLS: '下载 XLS 文件',
+      drillUpText: '◁ 返回 {series.name}',
+      exitFullscreen: '退出全屏',
+      exportData: {
+        categoryDatetimeHeader: '时间',
+        categoryHeader: '类别',
+      },
+      openInCloud: '在 Highcharts Cloud 中打开',
+      invalidDate: '无效的时间',
+      loading: '加载中...',
+      months: [
+        '一月',
+        '二月',
+        '三月',
+        '四月',
+        '五月',
+        '六月',
+        '七月',
+        '八月',
+        '九月',
+        '十月',
+        '十一月',
+        '十二月',
+      ],
+      navigation: {
+        popup: {
+          addButton: '新增',
+          arrowLine: '直线',
+          arrowRay: '射线',
+          arrowSegment: '线段',
+          background: '背景',
+          backgroundColor: '背景颜色',
+          backgroundColors: '背景颜色',
+          borderColor: '边框颜色',
+          borderRadius: '圆角',
+          borderWidth: '边框大小',
+          circle: '圆',
+          color: '颜色',
+          connector: '连接',
+          crooked3: 'Crooked 3 line',
+          crooked5: 'Crooked 5 line',
+          crosshairX: '竖直准星线',
+          crosshairY: '水平准星线',
+          editButton: '编辑',
+          elliott3: 'Elliott 3 line',
+          elliott5: 'Elliott 5 line',
+          fibonacci: '斐波纳契',
+          fill: '填充颜色',
+          flags: '标志',
+          fontSize: '字体大小',
+          format: '文本',
+          height: '高度',
+          horizontalLine: '水平线',
+          infinityLine: '无限线',
+          innerBackground: '内背景',
+          label: '文字标签',
+          labelOptions: '文字标签配置',
+          labels: '文字标签',
+          line: '线',
+          lines: '线条',
+          measure: 'Measure',
+          measureX: 'Measure X',
+          measureXY: 'Measure XY',
+          measureY: 'Measure Y',
+          name: '名字',
+          outerBackground: '外背景',
+          padding: '内间距',
+          parallelChannel: '并行通道',
+          pitchfork: '杈子',
+          ray: '射线',
+          rectangle: '矩形',
+          removeButton: '删除',
+          saveButton: '保存',
+          segment: '段落',
+          series: '数据列',
+          shapeOptions: '图形配置',
+          shapes: '图形',
+          simpleShapes: '简单图形',
+          stroke: '线条颜色',
+          strokeWidth: '线条粗细',
+          style: '样式',
+          title: '标题',
+          tunnel: '通道',
+          typeOptions: '详情',
+          verticalArrow: '竖直箭头',
+          verticalCounter: '竖直计数器',
+          verticalLabel: '竖直标签',
+          verticalLine: '竖直线',
+          volume: '成交量',
+        },
+      },
+      noData: '暂无数据',
+      numericSymbols: null,
+      printChart: '打印图表',
+      resetZoom: '重置缩放比例',
+      resetZoomTitle: '重置为原始大小',
+      shortMonths: [
+        '一月',
+        '二月',
+        '三月',
+        '四月',
+        '五月',
+        '六月',
+        '七月',
+        '八月',
+        '九月',
+        '十月',
+        '十一月',
+        '十二月',
+      ],
+      thousandsSep: ',',
+      viewData: '查看数据表格',
+      viewFullscreen: '全屏查看',
+      weekdays: [
+        '星期天',
+        '星期一',
+        '星期二',
+        '星期三',
+        '星期四',
+        '星期五',
+        '星期六',
+      ],
+      viewData: '查看数据表格',
+      // Highstock
+      rangeSelectorFrom: '开始时间',
+      rangeSelectorTo: '结束时间',
+      rangeSelectorZoom: '范围',
+
+      // Highmaps
+      zoomIn: '缩小',
+      zoomOut: '放大',
+    },
+
+    global: {
+      // 不使用 UTC时间
+      useUTC: false,
+      timezoneOffset: -8 * 60,
+      canvasToolsURL:
+        protocol + '//cdn.hcharts.cn/highcharts/modules/canvas-tools.js',
+      VMLRadialGradientURL:
+        protocol + +'//cdn.hcharts.cn/highcharts/gfx/vml-radial-gradient.png',
+    },
+
+    exporting: {
+      url: protocol + '//export.highcharts.com.cn',
+    },
+
+    credits: {
+      text: 'Highcharts.com.cn',
+      href: 'https://www.highcharts.com.cn',
+    },
+
+    /**
+     * Highstock
+     */
+
+    rangeSelector: {
+      inputDateFormat: '%Y-%m-%d',
+      buttons: [
+        {
+          type: 'month',
+          count: 1,
+          text: '月',
+        },
+        {
+          type: 'month',
+          count: 3,
+          text: '季度',
+        },
+        {
+          type: 'month',
+          count: 6,
+          text: '半年',
+        },
+        {
+          type: 'ytd',
+          text: 'YTD',
+        },
+        {
+          type: 'year',
+          count: 1,
+          text: '年',
+        },
+        {
+          type: 'all',
+          text: '所有',
+        },
+      ],
+    },
+
+    plotOptions: {
+      series: {
+        dataGrouping: {
+          dateTimeLabelFormats: {
+            /* millisecond: [
+              '%Y-%m-%d %H:%M:%S.%L',
+              '%Y-%m-%d %H:%M:%S.%L',
+              ' ~ %H:%M:%S.%L',
+            ],
+            second: ['%Y-%m-%d %H:%M:%S', '%Y-%m-%d %H:%M:%S', ' ~ %H:%M:%S'],
+            minute: ['%Y-%m-%d %H:%M', '%Y-%m-%d %H:%M', ' ~ %H:%M'],
+            hour: ['%Y-%m-%d %H:%M', '%Y-%m-%d %H:%M', ' ~ %H:%M'], */
+            day: ['%Y/%m/%d', '%Y/%m/%d', ' ~ %Y/%m/%d'],
+            week: ['%Y/%m/%d', '%Y/%m/%d', ' ~ %Y/%m/%d'],
+            month: ['%Y/%m', '%Y/%m', ' ~ %Y/%m'],
+            year: ['%Y', '%Y', ' ~ %Y'],
+          },
+        },
+      },
+    },
+  };
+
+  H.setOptions(defaultOptionsZhCn);
+};

+ 1275 - 0
src/hooks/chart/render.js

@@ -0,0 +1,1275 @@
+// 图渲染逻辑模块
+
+import {onMounted,ref} from 'vue'
+import {chartDefaultOpts,scatterXAxis,basicYAxis,basicXAxis} from './config'
+import Highcharts from 'highcharts/highstock';
+import HighchartszhCN  from './highcahrts-zh_CN.js'
+import moment from 'moment'
+import _ from 'lodash';
+HighchartszhCN(Highcharts)
+
+/**
+ * 渲染图方法
+ * @param data 图详情数据
+ * @param renderId 图表在dom中的id
+ */
+export function chartRender(data,renderId){
+    let obj={...chartDefaultOpts}
+    let chartOpt={}
+    if([1,3,4,5,6].includes(data.ChartInfo.ChartType)){
+        const chartSetMap = {
+            1: setSplineOpt,
+            3: setStackOrCombinChart,
+            4: setStackOrCombinChart,
+            5: setScatterOptions,
+            6: setStackOrCombinChart
+        };
+        chartOpt=chartSetMap[data.ChartInfo.ChartType](data)
+    }else if(data.ChartInfo.ChartType ===2 ) {
+        chartOpt=setSeasonOpt(data.EdbInfoList[0])
+    }else if(data.ChartInfo.ChartType ===7){//奇怪柱形图依赖数据
+        chartOpt=initBarData(data);
+    }else if(data.ChartInfo.ChartType ===8){//商品价格曲线
+        chartOpt=initCommodityData(data);
+    }else if(data.ChartInfo.ChartType ===9){//相关性图
+        chartOpt=initRelevanceChart(data);
+    }else if(data.ChartInfo.ChartType ===10){//截面散点图
+        chartOpt=setSectionScatterChart(data);
+    }
+    obj={...obj,...chartOpt}
+
+    console.log(obj);
+
+    //stock不支持线形图只支持时间图 某些用chart
+    let is_linear = chartOpt.series 
+    ? chartOpt.series.every(_ => _.type === 'scatter') || chartOpt.series.some(_ => _.chartType === 'linear')
+    : false ;
+    is_linear ?Highcharts.chart(renderId,obj) : Highcharts.stockChart(renderId,obj);
+}
+
+
+/* 预测配置 分区 */
+function getPredictParams ({LatestDate,PredictChartColor}) {
+    return {
+    zoneAxis: 'x',
+    zones: [{
+        value: new Date(LatestDate).getTime()+1
+    }, {
+        dashStyle: 'ShortDot',
+        color: PredictChartColor
+    }]
+    }
+}
+
+/* 季节图预测数据 年份=分割点年份做分割 年份>分割点年份全为预测 */
+function getSeasonPredictParams (timestamp){
+    return timestamp
+    ? {
+        zoneAxis: 'x',
+        zones: [{
+            value: new Date(timestamp).getTime()+1
+        }, {
+            dashStyle: 'ShortDot',
+        }]
+        }
+    : {}
+}
+
+// 查询范围为1年内 x轴显示为月/日 否则默认年/月
+function xTimeDiffer(minTime,maxTime){
+    //年限差
+    let year_differ=moment(maxTime).diff(moment(minTime),'years',true)
+    console.log('年限差',year_differ)
+    if (year_differ<=1) {
+        console.log('true');
+        return true;
+    } else {
+        console.log('false');
+        return false;
+    }
+}
+
+/* 拼接数据列动态name */
+function setDyncmicSerieName (item,dynamic_arr) {
+    const { IsAxis,IsOrder,EdbInfoType,LeadValue,LeadUnit }  = item;
+    // IsAxis左轴1 右轴0 2右2轴 
+      //IsOrder正序false 逆序true 
+      //EdbInfoType是否是领先指标
+    const axisLabelMap = {
+        0: '右轴',
+        2: '右2轴'
+    }
+    const orderLabelMap = {
+        1: '逆序'
+    }
+    const edbInfoMap = {
+        0: '领先'
+    }
+
+    let axis_tag = axisLabelMap[IsAxis] || '';
+      //逆序拼接
+    let order_tag = orderLabelMap[Number(IsOrder)] ? `${axis_tag ? ',': ''}${orderLabelMap[Number(IsOrder)]}` : ''
+      //领先拼接
+    let edb_tag = edbInfoMap[EdbInfoType] ? `${(axis_tag||order_tag) ? ',' : '' }${edbInfoMap[EdbInfoType]}${LeadValue}${LeadUnit}` : '';
+
+    let dynamic_tag = (axis_tag || order_tag || edb_tag) ? `(${axis_tag}${order_tag}${edb_tag})` : '';
+
+    let temName = dynamic_arr.length > 1
+                ? `${item.EdbName}(${item.SourceName})${dynamic_tag}`
+                : `${item.EdbName}${dynamic_tag}`
+    if(temName.length>20){
+        let temArr=[]
+        for(let i=0;i<temName.length/20;i++){
+            temArr.push(temName.slice(i*20,i*20+20))
+        }
+        // console.log(temArr);
+        temName=temArr.join('<br>')
+    }
+
+    return temName
+}
+
+
+//曲线图
+function setSplineOpt(e){
+    const data=e.EdbInfoList
+    let series=[]
+    let yAxis=[]
+    let xAxis = {}
+
+    let temYLeftArr=[]
+    let temYRightArr=[]
+    let temYRightTwoArr = []
+    let temYLeftIndex=data.findIndex((item) => item.IsAxis===1)
+    let temYRightIndex=data.findIndex((item) => !item.IsAxis)
+    let temYRightTwoIndex = data.findIndex((item) => item.IsAxis===2)
+
+    let minAndMaxTimeTemArr=[]//存放所有指标的最大最小时间
+
+    //有右二轴时排个序 按照左 右 右2的顺序
+    let newData = data.some(_ =>_.IsAxis===2) ? changeEdbOrder(data) : data;
+
+    newData.forEach((item,index)=>{
+
+         //轴位置值相同的下标
+        let sameSideIndex = newData.findIndex(i => i.IsAxis === item.IsAxis);
+
+        let dynamic_title = item.EdbName;
+        let dynamic_arr = newData.filter(
+          (item) => dynamic_title === item.EdbName
+        );
+        //处理数据列name
+        let temName= setDyncmicSerieName(item,dynamic_arr)  
+
+        //预测指标配置
+        let predict_params = item.EdbInfoCategoryType === 1 ? getPredictParams(item) : {};
+
+        let seriesItemObj={
+            data:[],
+            dataGrouping:{
+                enabled:false
+            },
+            type: 'spline',
+            yAxis:index,
+            name:temName,
+            color: item.ChartColor,
+            lineWidth: Number(item.ChartWidth),
+            visible:true,
+            LatestDate:item.LatestDate,
+            LatestValue:item.LatestValue,
+            ...predict_params
+        }
+        item.DataList = item.DataList || [];
+        for (let i of item.DataList) {
+          seriesItemObj.data.push([i.DataTimestamp, i.Value]);
+        }
+        series.push(seriesItemObj)
+        
+
+        // 设置y轴
+        if(item.IsAxis){
+            temYLeftArr.push(item)
+        }else{
+            temYRightArr.push(item)
+        }
+
+        let yItem={
+            ...basicYAxis,
+            IsAxis:item.IsAxis,
+            labels: {
+                formatter: function (ctx) {
+                    return sameSideIndex !== index ? '' : ctx.value;
+                },
+                align: 'center',
+                x: [0,2].includes(item.IsAxis) ? 5 : -5,
+                y:5,
+            },
+            tickWidth: sameSideIndex !== index ? 0 : 1,
+            title: {
+                text:  sameSideIndex !== index ? '' : `${item.Unit}`,
+                align: 'high',
+                rotation: 0,
+                y: -15,
+                x: (item.IsAxis===0 && temYRightTwoIndex>-1) ? -newData[temYRightTwoIndex].Unit.length*12 : 0,
+                textAlign: item.IsAxis===1 ? 'left' : 'right',
+                reserveSpace: false
+            },
+            opposite: [0,2].includes(item.IsAxis),
+            reversed: item.IsOrder,
+            min: item.MinData,
+            max: item.MaxData,
+            visible: sameSideIndex === index,
+            chartEdbInfo:item//指标数据用于在保存时读取指标数据
+        }
+        yAxis.push(yItem)
+        
+        if(item.DataList.length>0){
+            minAndMaxTimeTemArr.push(item.DataList[0].DataTimestamp)
+            minAndMaxTimeTemArr.push(item.DataList[item.DataList.length-1].DataTimestamp)
+        }
+        
+    })
+    
+    
+    // 设置x轴
+    // 找出所有指标的最大和最小时间 分成6段
+    let minTime=Math.min.apply(null,minAndMaxTimeTemArr)
+    let maxTime=Math.max.apply(null,minAndMaxTimeTemArr)
+
+
+    const bool_time = xTimeDiffer(minTime,maxTime)
+    if(bool_time){
+        xAxis={
+            ...basicXAxis,
+            labels: {
+              formatter: (ctx)=> {
+                return Highcharts.dateFormat('%m/%d', ctx.value)
+              }
+            }
+        }
+    }
+    // console.log(((maxTime-minTime)/6)/(24*3600*1000),':天');
+    // let maxYear=new Date(maxTime).getFullYear()
+    // let minYear=new Date(minTime).getFullYear()
+
+    xAxis={
+        ...basicXAxis,
+        tickInterval:((maxTime-minTime)/6)/(24*3600*1000)>30?(maxTime-minTime)/6:24*3600*1000*30,
+    }
+    
+
+    yAxis.forEach(item=>{
+        if(item.IsAxis===1){//左轴
+
+            // item.min=getAxisMaxOrMin(temYLeftArr,'min')
+            // item.max=getAxisMaxOrMin(temYLeftArr,'max')
+            item.min=data[temYLeftIndex].MinData
+            item.max=data[temYLeftIndex].MaxData
+        }else if (item.IsAxis===2){ // 右2轴
+            item.min=data[temYRightTwoIndex].MinData
+            item.max=data[temYRightTwoIndex].MaxData
+        }else{
+
+            // item.min=getAxisMaxOrMin(temYRightArr,'min')
+            // item.max=getAxisMaxOrMin(temYRightArr,'max')
+            item.min=data[temYRightIndex].MinData
+            item.max=data[temYRightIndex].MaxData
+        }
+    })
+
+    return {
+        series,
+        xAxis:[xAxis],
+        yAxis,
+        rangeSelector:{ enabled: false}
+    }
+}
+
+
+//季节图
+function setSeasonOpt(e){
+    let chartData={}
+    const data=e.EdbInfoList[0]
+
+    const colorsArr=['#4B0082','#7FFFAA','#FF4500','#808000','#EEE8AA','#849EC1','#8A4294','#578B5A','#FDA8C7','#53B3FF','#999999','#000000','#FFDF0C','#FF0000','#0033FF']
+    let series=[],yAxis=[]
+    //农历默认选中一年数据并隐藏按钮  公历显示全部数据
+    let rangeSelector={}
+
+    // 公历
+    if(calendarType.value==='公历'){
+        data.DataList.forEach((item,index)=>{
+             //预测指标配置
+            let predict_params =  data.EdbInfoCategoryType === 1 ? getSeasonPredictParams(item.CuttingDataTimestamp) : {};
+
+            let seriesItem={
+                data:[],
+                dataGrouping:{
+                    enabled:false
+                },
+                type:data.ChartStyle,
+                yAxis:index,
+                name:item.Year,
+                color:colorsArr.slice(-data.DataList.length)[index],                
+                visible:true,
+                ...predict_params
+            }
+            item.DataList=item.DataList||[]
+            for(let i of item.DataList){
+                seriesItem.data.push([i.DataTimestamp, i.Value])
+            }
+            series.push(seriesItem)
+
+            let yAxisItem={
+                IsAxis:data.IsAxis,
+                labels: {
+                    // formatter: function (ctx) {
+                    //     return ctx.value;
+                    // },
+                    align: 'center',
+                    y:5
+                },
+                title: {
+                    text:  `${data.Unit}`,
+                    align: 'high',
+                    rotation: 0,
+                    y: -15,
+                    offset: -(10 * data.Unit.length),
+                },
+                max: Number(data.MaxData),
+                min: Number(data.MinData),
+                lineWidth: 1,
+                lineColor: '#bfbfbf',
+                tickColor: '#bfbfbf',
+                offset: 0,
+                opposite: false,
+                reversed: false,
+                visible: true,
+                gridLineWidth: 0,
+                tickWidth: 1,
+                tickLength:5,
+                tickPosition: 'inside',
+                endOnTick: false,
+                startOnTick: false,
+                showLastLabel: true, //显示最后刻度值
+                tickPixelInterval: 50,
+                // chartEdbInfo:item//指标数据
+            }
+            yAxis.push(yAxisItem)
+        })
+
+        rangeSelector={ enabled: false}
+    }
+
+    // 农历
+    if(calendarType.value==='农历'){
+        let filterArr=data.DataList.List&&data.DataList.List.slice(1,data.DataList.List.length)||[]
+        console.log('aaa',filterArr);
+        filterArr.forEach((item,index)=>{
+             //预测指标配置
+            let predict_params =  data.EdbInfoCategoryType === 1 ? getSeasonPredictParams(item.CuttingDataTimestamp) : {};
+
+            let seriesItem={
+                data:[],
+                dataGrouping:{
+                    enabled:false
+                },
+                type:data.ChartStyle,
+                yAxis:index,
+                name:item.Year,
+                color:colorsArr.slice(-filterArr.length)[index],         
+                visible:true,
+                ...predict_params
+            }
+            let temarr=item.Items||[]
+            for(let i of temarr){
+                seriesItem.data.push([i.DataTimestamp, i.Value])
+            }
+            series.push(seriesItem)
+
+            let yAxisItem={
+                IsAxis:data.IsAxis,
+                labels: {
+                    formatter: function (ctx) {
+                        return ctx.value;
+                    },
+                    align: 'center',
+                    y:5
+                },
+                title: {
+                    text:  `${data.Unit}`,
+                    align: 'high',
+                    rotation: 0,
+                    y: -15,
+                    offset: -(10 * data.Unit.length),
+                },
+                max: Number(data.MaxData),
+                min: Number(data.MinData),
+                lineWidth: 1,
+                lineColor: '#bfbfbf',
+                tickColor: '#bfbfbf',
+                offset: 0,
+                opposite: false,
+                reversed: false,
+                visible: true,
+                gridLineWidth: 0,
+                tickWidth: 1,
+                tickLength:5,
+                tickPosition: 'inside',
+                endOnTick: false,
+                startOnTick: false,
+                showLastLabel: true, //显示最后刻度值
+                tickPixelInterval: 50,
+                // chartEdbInfo:item//指标数据用于在保存时读取指标数据
+            }
+            yAxis.push(yAxisItem)
+        })
+
+        rangeSelector={ 
+            enabled: true,
+            selected: 0,
+            inputStyle: {
+                display: 'none',
+            },
+            labelStyle: {
+                display: 'none',
+            },
+            buttonTheme: {
+                style: {
+                    display: 'none',
+                },
+            },
+            buttons: [
+                {
+                  type: 'month',
+                  count: 12,
+                  text: '12月',
+                },
+                {
+                  type: 'month',
+                  count: 15,
+                  text: '15月',
+                },
+                {
+                  type: 'all',
+                  text: '全部',
+                }
+            ]
+        }
+    }
+
+    chartData.chart={ spacing: [30, 8, 2, 8]}
+    chartData.series=series
+    chartData.yAxis=yAxis
+    chartData.rangeSelector=rangeSelector
+
+    // 季节图x轴显示月/日
+    let xAxis={
+        tickPosition: 'inside',
+		lineColor: '#bfbfbf',
+    	tickColor: '#bfbfbf',
+		tickLength:5,
+		type: 'datetime',
+		ordinal: false,
+		dateTimeLabelFormats: {
+			day: '%y/%m',
+			week: '%y/%m',
+			month: '%y/%m',
+			year: '%y/%m',
+		},
+        labels: {
+            formatter: (ctx)=> {
+                return Highcharts.dateFormat('%m/%d', ctx.value)
+            }
+        }
+    }
+
+    xAxis={
+        ...xAxis,
+        tickInterval:24*3600*1000*60,//季节图
+    }
+    
+
+    chartData.xAxis=[xAxis]
+
+    // 季节图提示框显示 月/日
+    chartData.tooltip={
+        split: false,
+        shared: true,
+        dateTimeLabelFormats: {
+          // 时间格式化字符
+          day: '%m/%d',
+          week: '%m/%d',
+          month: '%m/%d',
+          year: '%m/%d',
+        },
+        xDateFormat: '%m/%d',
+    }
+
+    return chartData
+}
+
+
+//堆叠图/组合图设置
+//本来和曲线图逻辑基本一致兼容下即可 为了以后便于维护和阅读还是拆开写吧
+function setStackOrCombinChart(e){
+    const data=e.EdbInfoList
+    //图表类型
+    const chartTypeMap = {
+        3: 'areaspline',
+        4: 'column',
+        6: ''
+    };
+    let chartStyle = chartTypeMap[e.ChartInfo.ChartType];
+
+    let series=[]
+    let yAxis=[]
+    let xAxis = {}
+
+    let temYLeftArr=[]
+    let temYRightArr=[]
+    let temYRightTwoArr = []
+    let temYLeftIndex,temYRightIndex,temYRightTwoIndex;
+
+    let minAndMaxTimeTemArr=[]//存放所有指标的最大最小时间
+
+    //有右二轴时排个序 按照左 右 右2的顺序
+    let newData = data.some(_ =>_.IsAxis===2) ? changeEdbOrder(data) : data;
+
+    newData.forEach((item,index)=>{
+
+        //轴位置值相同的下标
+        let sameSideIndex = newData.findIndex(i => i.IsAxis === item.IsAxis);
+
+        //堆叠图的yAxis必须一致 数据列所对应的y轴
+        let serie_yIndex = index;
+        if([3,4].includes(e.ChartInfo.ChartType)) {
+            // 类型为堆叠图时公用第一个指标y轴 
+            serie_yIndex =  0;
+        } else if(e.ChartInfo.ChartType ===6 && ['areaspline','column'].includes(item.ChartStyle)) {
+            // 组合图找第一个堆叠柱状或面积的作为公用
+            serie_yIndex = newData.findIndex(i => i.ChartStyle === item.ChartStyle);
+        }
+        //数据对应的y轴是公用轴则配置也共享
+        item.IsAxis = serie_yIndex === index ? item.IsAxis : newData[serie_yIndex].IsAxis;
+        item.IsOrder = serie_yIndex === index ? item.IsOrder : newData[serie_yIndex].IsOrder;
+
+        temYLeftIndex = [3,4].includes(e.ChartInfo.ChartType) 
+            ? (newData[serie_yIndex].IsAxis ? serie_yIndex : -1)
+            : data.findIndex((item) => item.IsAxis===1);
+        temYRightIndex = [3,4].includes(e.ChartInfo.ChartType) 
+            ? (newData[serie_yIndex].IsAxis ? -1 : serie_yIndex)
+            : data.findIndex((item) => !item.IsAxis);
+        temYRightTwoIndex = [3,4].includes(e.ChartInfo.ChartType) 
+            ? -1
+            : data.findIndex((item) => item.IsAxis===2);
+
+        let dynamic_title = item.EdbName;
+        let dynamic_arr = newData.filter(
+          (item) => dynamic_title === item.EdbName
+        );
+        //处理数据列name
+        let temName= setDyncmicSerieName(item,dynamic_arr)  
+
+        //预测指标配置
+        let predict_params = item.EdbInfoCategoryType === 1 ? getPredictParams(item) : {};
+
+        let seriesItemObj={
+            data:[],
+            dataGrouping:{
+                enabled:false
+            },
+            type: chartStyle || item.ChartStyle,
+            yAxis:serie_yIndex,
+            name:temName,
+            color: item.ChartColor,
+            lineWidth: (e.ChartInfo.ChartType === 6 && item.ChartStyle === 'spline') ? Number(item.ChartWidth) : 0,
+            fillColor: (e.ChartInfo.ChartType === 3 || (e.ChartInfo.ChartType === 6 && item.ChartStyle === 'areaspline')) ? item.ChartColor : undefined,
+            visible:true,
+            LatestDate:item.LatestDate,
+            LatestValue:item.LatestValue,
+            ...predict_params
+        }
+        item.DataList = item.DataList || [];
+        for (let i of item.DataList) {
+          seriesItemObj.data.push([i.DataTimestamp, i.Value]);
+        }
+        series.push(seriesItemObj)
+        
+
+        // 设置y轴
+        if(item.IsAxis){
+            temYLeftArr.push(item)
+        }else{
+            temYRightArr.push(item)
+        }
+
+        let yItem={
+            ...basicYAxis,
+            IsAxis:item.IsAxis,
+            labels: {
+                formatter: function (ctx) {
+                    return sameSideIndex !== index ? '' : ctx.value;
+                },
+                align: 'center',
+                x: [0,2].includes(item.IsAxis) ? 5 : -5,
+                y:5,
+            },
+            title: {
+                text:  sameSideIndex !== index ? '' : `${item.Unit}`,
+                align: 'high',
+                rotation: 0,
+                y: -15,
+                x: (item.IsAxis===0 && temYRightTwoIndex>-1) ? -newData[temYRightTwoIndex].Unit.length*12 : 0,
+                textAlign: item.IsAxis===1 ? 'left' : 'right',
+                reserveSpace: false
+            },
+            opposite: [0,2].includes(item.IsAxis),
+            reversed: item.IsOrder,
+            min: item.MinData,
+            max: item.MaxData,
+            tickWidth: sameSideIndex !== index ? 0 : 1,
+            visible: serie_yIndex === index && sameSideIndex ===index,
+            chartEdbInfo:item//指标数据用于在保存时读取指标数据
+        }
+        yAxis.push(yItem)
+        
+        if(item.DataList.length>0){
+            minAndMaxTimeTemArr.push(item.DataList[0].DataTimestamp)
+            minAndMaxTimeTemArr.push(item.DataList[item.DataList.length-1].DataTimestamp)
+        }
+        
+    })
+    
+    
+    // 设置x轴
+    // 找出所有指标的最大和最小时间 分成6段
+    let minTime=Math.min.apply(null,minAndMaxTimeTemArr)
+    let maxTime=Math.max.apply(null,minAndMaxTimeTemArr)
+
+
+    const bool_time = xTimeDiffer(minTime,maxTime)
+    if(bool_time){
+        xAxis={
+            ...basicXAxis,
+            labels: {
+              formatter: (ctx)=> {
+                return Highcharts.dateFormat('%m/%d', ctx.value)
+              }
+            }
+        }
+    }
+
+    xAxis={
+        ...basicXAxis,
+        tickInterval:((maxTime-minTime)/6)/(24*3600*1000)>30?(maxTime-minTime)/6:24*3600*1000*30,
+    }
+    
+
+    yAxis.forEach(item=>{
+        if(item.IsAxis === 1){//左轴
+            item.min=data[temYLeftIndex].MinData
+            item.max=data[temYLeftIndex].MaxData
+        }else if (item.IsAxis===2){ // 右2轴
+            item.min=data[temYRightTwoIndex].MinData
+            item.max=data[temYRightTwoIndex].MaxData
+        }else{
+            item.min=data[temYRightIndex].MinData
+            item.max=data[temYRightIndex].MaxData
+        }
+    })
+
+    return {
+        series,
+        xAxis:[xAxis],
+        yAxis,
+        rangeSelector:{ enabled: false}
+    }
+}
+
+
+/* 散点图 第一个指标值为x轴 第二个指标为y轴*/
+function setScatterOptions(data){
+    const dataList=data.EdbInfoList
+    const { ChartInfo } = data;
+
+    // 取2个指标中日期相同的数据
+    const real_data = [];
+    let tmpData_date = {};//用来取点对应的日期
+    let data1 =  _.cloneDeep(dataList)[0].DataList || [];
+    let data2 =  _.cloneDeep(dataList)[1].DataList || [];
+    data1.forEach((_item) => {
+        data2.forEach((_item2) => {
+            if(_item.DataTimestamp === _item2.DataTimestamp) {
+                //日期
+                let itemIndex =_item.Value + "_" +_item2.Value
+                if(tmpData_date[itemIndex]) {
+                    tmpData_date[itemIndex].push( moment(_item.DataTimestamp).format('YYYY/MM/DD'))
+                } else {
+                    tmpData_date[itemIndex] = [moment(_item.DataTimestamp).format('YYYY/MM/DD')]
+                }
+            
+                //值
+                real_data.push({
+                    x: _item.Value,
+                    y: _item2.Value
+                })
+            }
+        })
+    })
+    real_data.sort((x,y) => x-y);
+
+    //悬浮窗 拼接日期 原始指标名称
+    let tooltip = {
+        formatter: function() {
+            return `<strong>${ tmpData_date[this.x+'_'+this.y].length > 4 ? tmpData_date[this.x+'_'+this.y].slice(0,4).join()+'...' : tmpData_date[this.x+'_'+this.y].join() }</strong><br>
+            ${dataList[0].EdbName}: <span style="font-weight: 600">	${this.x}</span><br>
+            ${dataList[1].EdbName}: <span style="font-weight: 600">	${this.y}</span>
+            `
+        }
+    }
+
+    const { IsOrder,ChartColor } = dataList[0];
+    //y轴
+    let yAxis = {
+        title: {
+            text:  `${dataList[1].Unit}`,
+            align: 'high',
+            rotation: 0,
+            y: -15,
+            offset: -(10 * dataList[1].Unit.length),
+        },
+        labels: {
+            formatter: function (ctx) {
+            return ctx.value;
+            },
+            align: 'center',
+        },
+        opposite: false,
+        reversed: IsOrder,
+        min: Number(dataList[0].MinData),
+        max: Number(dataList[0].MaxData),
+        tickWidth: 1,
+        tickLength: 5,
+        lineWidth: 1,
+        lineColor: '#bfbfbf',
+        tickColor: '#bfbfbf',
+        offset: 0,
+        visible: true,
+        gridLineWidth: 0,
+        tickPosition: 'inside',
+        endOnTick: false,
+        startOnTick: false,
+        showLastLabel: true,
+        tickPixelInterval: 50
+    }
+
+    //数据列
+    let series = {
+        data: [],
+        type: 'scatter',
+        name: `${ChartInfo.ChartName}${IsOrder ? '(逆序)' : ''}`,
+        color: ChartColor,
+        visible:true,
+        lineWidth: 0
+    }
+    real_data.forEach(_ => {
+        series.data.push([_.x,_.y])
+    })
+    
+    return {
+        title: {
+            text:''
+        },
+        series: [ series ],
+        yAxis,
+        xAxis: {
+            ...scatterXAxis,
+            title: {
+                text:  `${dataList[0].Unit}`,
+                align: 'high',
+                rotation: 0,
+                x: 0,
+                offset: 20,
+            },
+        },
+        tooltip
+    }
+}
+
+
+/* 奇怪柱形图 */
+const barDateList = ref([]);//柱形图的绘图数据
+const barXData = ref([]);//柱形图的x轴
+const barEdbData = ref([]);//柱形图的表格数据 只用于取值
+let axisLimitData={}
+/* 奇怪柱状图 和其他逻辑无公用点 依赖数据为单独的数据
+    x轴为指标名称的柱形图 以日期作为series
+*/
+function setBarChart (){
+    let seriesData = [];
+    const data = _.cloneDeep(barDateList.value);
+
+    //x轴
+    let xAxis = {
+        ...scatterXAxis,
+        categories: barXData.value,
+        tickWidth: 1,
+        title: {
+            text:  ``,
+            align: 'high',
+            rotation: 0,
+            x: 0,
+            offset: 20,
+        },
+    }
+
+    const { leftMin,leftMax } = axisLimitData;
+    console.log(leftMin,leftMax)
+    //y轴
+    let yAxis = {
+        ...basicYAxis,
+        title: {
+            text:  ``,
+            align: 'high',
+            rotation: 0,
+            y: -15,
+            offset: 0,
+        },
+        labels: {
+            formatter: function (ctx) {
+            let val = ctx.value;
+            return val;
+            },
+            align: 'center',
+        },
+        min: Number(leftMin),
+        max: Number(leftMax),
+        opposite: false,
+        tickWidth: 1,
+    }
+
+    //数据列
+    data.forEach(item => {
+        let serie_item = {
+            data: item.Value,
+            type: 'column',
+            yAxis: 0,
+            name: item.Name || item.Date,
+            color: item.Color,
+            chartType: 'linear',              
+            visible:true,
+        };
+        seriesData.push(serie_item)
+    })
+    
+    return {
+        title: {
+            text:''
+        },
+        plotOptions: {
+            column:{
+            stacking: null,
+            },
+        },
+        series: seriesData,
+        yAxis: [ yAxis ],
+        xAxis
+    }
+}
+/* 获取图表详情后赋值柱状图数据 */
+function initBarData(data){
+    const { XEdbIdValue,YDataList,EdbInfoList,ChartInfo } = data;
+
+    let xData = XEdbIdValue.map(_ => EdbInfoList.find(edb => edb.EdbInfoId===_).EdbAliasName)
+    console.log(xData)
+
+    barDateList.value = YDataList;
+    barXData.value = xData;
+    barEdbData.value = EdbInfoList;
+
+    axisLimitData.leftMin=Number(ChartInfo.LeftMin)
+    axisLimitData.leftMax=Number(ChartInfo.LeftMax)
+
+    return setBarChart();
+}
+
+
+/* 商品价格曲线设置 绘图逻辑同奇怪柱形图*/
+const commodityChartData = ref([]);//商品价格图的绘图数据
+const commodityXData = ref([]);//商品价格图的x轴
+const commodityEdbList = ref([]);//商品价格图的表格数据 只用于取值
+/* 商品价格曲线设置 绘图逻辑同奇怪柱形图*/
+const setCommodityChart = (leftMin,leftMax) => {
+    
+    let seriesData = [];
+    const data = _.cloneDeep(commodityChartData.value);
+
+    //x轴
+    let xAxis = {
+        ...scatterXAxis,
+        categories: commodityXData.value.map(_ => _.Name),
+        tickWidth: 1,
+        title: {
+            text:  ``,
+            align: 'high',
+            rotation: 0,
+            x: 0,
+            offset: 20,
+        },
+    }
+
+    //y轴
+    let yAxis = {
+        ...basicYAxis,
+        title: {
+            text: commodityEdbList.value[0].Unit,
+            align: 'high',
+            rotation: 0,
+            y: -15,
+            offset: 0,
+        },
+        labels: {
+            formatter: function (ctx) {
+            let val = ctx.value;
+            return val;
+            },
+            align: 'center',
+        },
+        min: Number(leftMin),
+        max: Number(leftMax),
+        opposite: false,
+        tickWidth: 1,
+    }
+
+    //数据列
+    data.forEach(item => {
+        //处理首或/尾全是无效数据的以null填充
+        let filterData = filterInvalidData(item)
+
+        let serie_item = {
+            data: filterData,
+            type: 'spline',
+            yAxis: 0,
+            name: item.Name,
+            color: item.Color,
+            chartType: 'linear',
+            lineWidth: 3,
+            visible: true,
+            marker: {
+                enabled: false
+            }
+        };
+        seriesData.push(serie_item)
+    })
+
+    //tooltip
+    let tooltip = {
+        formatter: function() {
+            const ctx = this;
+            let str = '';
+            ctx.points.forEach(item => {
+              let obj_item = data.find(_ => _.Name === item.series.name);
+              let index = commodityXData.value.findIndex(_ => _.Name === ctx.x);
+
+              str+=`<b>${ commodityEdbList.value.find(_ => _.EdbInfoId === obj_item.XEdbInfoIdList[index]).EdbName }</b>`
+
+              if(!obj_item.NoDataEdbList.includes(obj_item.XEdbInfoIdList[index])) {
+                str += `<br><span style="color:${item.color}">\u25CF</span>${obj_item.Date}: ${item.y}<br>`
+              }else {
+                str += `<br><span style="color:${item.color}">\u25CF</span>${obj_item.Date}: 无<br>`
+              }
+            })
+            return str
+        },
+        shared: true
+    }
+    console.log(seriesData);
+    return {
+        title: {
+            text:''
+        },
+        series: seriesData,
+        yAxis: [ yAxis ],
+        xAxis,
+        tooltip
+    }
+};
+/* 处理无效数据为null */
+function filterInvalidData(item){
+    let validateArr = item.XEdbInfoIdList.filter(_ =>!item.NoDataEdbList.includes(_));
+
+    let first_index = item.XEdbInfoIdList.findIndex(_ => _ === validateArr[0]);
+    let last_index = item.XEdbInfoIdList.findIndex(_ => _ === validateArr[validateArr.length-1]);
+    console.log('first_index',first_index)
+    console.log('last_index',last_index)
+
+    let arr = item.Value.map((item,index) => {
+    if(index < first_index || index > last_index) {
+        return null
+    }else {
+        return item
+    }
+    })
+
+    return arr;
+}
+function initCommodityData(data){
+    const { XDataList,YDataList,EdbInfoList,ChartInfo } = data;
+
+    commodityEdbList.value = EdbInfoList;
+    commodityChartData.value = YDataList;
+    commodityXData.value = XDataList;
+
+    return setCommodityChart(ChartInfo.LeftMin,ChartInfo.LeftMax);
+}
+
+
+//相关性图表
+function initRelevanceChart(data){
+    // 处理X轴
+    let xAxis={
+        categories: data.XEdbIdValue,
+        tickWidth: 1,
+        title: {
+          text:  `期数(${data.CorrelationChartInfo.LeadUnit})`,
+          align: 'high',
+          rotation: 0,
+          x: 0,
+          y:10,
+          offset: 20,
+        },
+        tickInterval: 1,
+        offset:0,
+        tickmarkPlacement:'on'
+    }
+
+    // 处理Y轴
+    let yAxis={
+        ...basicYAxis,
+        title: {
+          text: '相关性系数',
+          textCh: '相关性系数',
+          textEn: 'Correlation coefficient',
+          align: 'high',
+          rotation: 0,
+          y: -15,
+          offset: 0,
+        },
+        labels: {
+          formatter: function (ctx) {
+            let val = ctx.value;
+            return val;
+          },
+          align: 'center',
+        },
+        min: -1,
+        max: 1,
+        opposite: false,
+        tickWidth: 1,
+        tickInterval:0.2,
+    }
+
+    //处理series
+    let seriesData=[]
+    data.YDataList.forEach(item=>{
+        let serie_item = {
+          data: item.Value,
+          type: 'spline',
+          yAxis: 0,
+          name: data.ChartInfo.ChartName,
+          nameCh: data.ChartInfo.ChartName,
+          nameEn: data.ChartInfo.ChartName,
+          color: '#00f',
+          chartType: 'linear',
+          lineWidth: 3,
+          visible:true,
+          marker: {
+            enabled: false
+          }
+        };
+        seriesData.push(serie_item)
+    })
+
+    let tooltip = {
+        formatter: function() {
+          let str = `<p>相关性系数:${this.y.toFixed(4)}</p><br><p>领先${this.x}期</p>`
+          return str
+        },
+        formatterCh: function() {
+          let str = `<p>相关性系数:${this.y.toFixed(4)}</p><br><p>领先${this.x}期</p>`
+          return str
+        },
+        formatterEn: function() {
+          let str = `<p>Correlation coefficient:${this.y.toFixed(4)}</p><br><p>lead${this.x}stage</p>`
+          return str
+        }
+    }
+    
+    // nextTick(()=>{
+    //     const hEl=document.getElementById('chart'+data.ChartInfo.UniqueCode)
+    //     console.log(hEl.offsetHeight);
+    //     xAxis.offset=-(hEl.offsetHeight-74)/2
+    //     chartData.value = {
+    //         isRelevanceChart:true,
+    //         title: {
+    //             text:''
+    //         },
+    //         series: seriesData,
+    //         yAxis: [yAxis] ,
+    //         xAxis:xAxis,
+    //         tooltip
+    //     }
+    // })
+
+    return {
+        isRelevanceChart:true,
+        title: {
+            text:''
+        },
+        series: seriesData,
+        yAxis: [yAxis] ,
+        xAxis:xAxis,
+        tooltip
+    }
+}
+
+
+/* 截面散点图设置 sectionScatterData */
+function setSectionScatterChart({DataResp}) {
+    const { DataList,XName,XNameEn,XUnitName,XUnitNameEn,YName,YNameEn,YUnitName,YUnitNameEn } = DataResp;
+    const leftMin=Number(DataResp.YMinValue)
+    const leftMax=Number(DataResp.YMaxValue)
+    const xMin=Number(DataResp.XMinValue)
+    const xMax=Number(DataResp.XMaxValue)
+
+    //y轴
+    let yAxis = {
+        ...basicYAxis,
+        title: {
+            text: YName,
+            align: 'middle',
+        },
+        opposite: false,
+        reversed: false,
+        min: Number(leftMin),
+        max: Number(leftMax),
+        tickWidth: 1,
+    }
+
+    //x轴
+    let xAxis = {
+        ...scatterXAxis,
+        title: {
+            text: XName,
+            align: 'middle',
+        },
+        min: Number(xMin),
+        max: Number(xMax),
+    }
+
+    //数据列
+    let series = [];
+    DataList.forEach(item => {
+        //数据列
+        let series_item = {
+            data: [],
+            type: 'scatter',
+            name: item.Name,
+            color: item.Color,
+            lineWidth: 0,
+            chartType: 'linear',
+            zIndex:1,
+            visible: true
+        }
+        item.EdbInfoList.forEach(_ => {
+            series_item.data.push({
+            x: _.XValue,
+            y: _.YValue,
+            dataLabels: {
+                enabled: _.IsShow,
+                allowOverlap: true,
+                align: 'left',
+                format: _.Name,
+                formatCh: _.Name,
+                formatEn: _.NameEn
+            }
+            })
+        })
+        series.push(series_item);
+
+    //趋势线
+    if(item.ShowTrendLine)  {
+        
+        let trend_data = item.TrendLimitData.map((_,_index) => (
+            _index === item.TrendLimitData.length-1 ? {
+                x: _.X,
+                y: _.Y,
+                dataLabels: {
+                enabled: item.ShowRSquare || item.ShowFitEquation,
+                align: 'left',
+                color: '#666',
+                x: 20,
+                y: 30,
+                zIndex: 9,
+                allowOverlap: true,
+                formatter: function(){
+                    let tag = '';
+                    item.ShowRSquare && item.ShowFitEquation
+                    ? tag =`<span>${item.TrendLine}</span><br><span>R²=${item.RSquare}</span>`
+                    : item.ShowRSquare && !item.ShowFitEquation
+                    ? tag =`<span>R²=${item.RSquare}</span>`
+                    : item.ShowFitEquation && !item.ShowRSquare
+                    ? tag =`<span>${item.TrendLine}</span>`
+                    : ''
+                    return tag
+                }
+                }
+            } : {
+                x: _.X,
+                y: _.Y,
+            }
+        ))
+
+        let trend_item = {
+            data: trend_data,
+            type: 'spline',
+            linkedTo: ':previous',
+            color: item.Color,
+            lineWidth: 1,
+            chartType: 'linear',
+            enableMouseTracking: false,
+            dashStyle:'Dash',
+            zIndex: 2,
+            visible: true,
+            marker: {
+                enabled: false
+            }
+        }
+        series.push(trend_item)
+    }
+    })
+
+    let tooltip = {
+        formatter: function() {
+            let series_obj = DataList.find(_ => _.Name === this.series.name);
+            let ponit_obj = series_obj.EdbInfoList.find(_ => _.XValue ===this.x && _.YValue===this.y);
+
+            let str=`<b>${ ponit_obj.Name }</b>`;
+            str += `<br><span style="color:${this.color}">\u25CF</span>${ponit_obj.XName}: ${this.x} ${ponit_obj.XDate}<br>`;
+            str += `<span style="color:${this.color}">\u25CF</span>${ponit_obj.YName}: ${this.y} (${ponit_obj.YDate})`;
+
+            return str
+        }
+    }
+    
+    return {
+        title: {
+            text:''
+        },
+        series,
+        yAxis: [yAxis],
+        xAxis,
+        tooltip
+    }
+}

+ 38 - 5
src/views/ppt/components/ChartWrap.vue

@@ -1,5 +1,7 @@
 <script setup>
-import ChartEl from '@/components/chart/Index.vue'
+import {computed,onMounted,ref} from 'vue'
+import {apiChartInfoByCode} from '@/api/chart.js'
+import {chartRender} from '@/hooks/chart/render'
 
 const props=defineProps({
     itemData:{
@@ -8,14 +10,37 @@ const props=defineProps({
     }
 })
 
+const renderId=computed(()=>{
+    if(props.itemData?.chartId){
+        return 'chart'+props.itemData.chartId+'_'+props.itemData.pptPageIndex+'_'+props.itemData.position
+    }
+})
+
+// 获取图表详情
+let chartIsDelete=ref(false)//图表是否被删除
+async function getChartInfo(){
+    const res=await apiChartInfoByCode({UniqueCode:props.itemData.chartId})
+    if(res.Ret===200){
+        if(!res.Data.ChartInfo){
+            chartIsDelete.value=true
+            return
+        }
+        chartRender(res.Data,renderId.value)
+    }
+}
+
+
+onMounted(()=>{
+    getChartInfo()
+})
+
 </script>
 
 <template>
     <div class="ppt-chart-box">
-        <ChartEl 
-            :code="itemData.chartId" 
-            :renderId="'chart'+itemData.chartId+'_'+itemData.pptPageIndex+'_'+itemData.position"
-        />
+        <div class="chart-box" :id="renderId">
+            <img v-if="chartIsDelete" class="empty-img" src="https://hzstatic.hzinsights.com/static/ppt_default.png" alt="">
+        </div>
     </div>
 </template>
 
@@ -23,5 +48,13 @@ const props=defineProps({
 .ppt-chart-box{
     width: 100%;
     height: 100%;
+    .chart-box{
+        width: 100%;
+        height: 100%;
+        .empty-img{
+            width: 100%;
+            height: 100%;
+        }
+    }
 }
 </style>

+ 27 - 8
src/views/ppt/hooks/createPPTContent.js

@@ -3,9 +3,16 @@ import {formatPPTDate} from '../utils/index'
 import {bgList} from '../utils/config'
 import {ref,markRaw} from 'vue'
 import Cover from '../template/Cover.vue'
+import Footer from '../template/Footer.vue'
 import FormatOne from '../template/FormatOne.vue'
 import FormatTwo from '../template/FormatTwo.vue'
 import FormatThree from '../template/FormatThree.vue'
+import FormatFour from '../template/FormatFour.vue'
+import FormatFive from '../template/FormatFive.vue'
+import FormatSix from '../template/FormatSix.vue'
+import FormatSeven from '../template/FormatSeven.vue'
+import FormatEight from '../template/FormatEight.vue'
+import FormatNine from '../template/FormatNine.vue'
 import ChartWrap from '../components/ChartWrap.vue'
 import RichText from '../components/RichText.vue'
 
@@ -43,8 +50,20 @@ export function createPPTContent(params){
     }
     arr.push(coverPageData)
 
+    // ppt内容页数据
     const conArr=JSON.parse(Content)
-    arr=[...arr,...conArr,{name:'back',modelId:-1,id:-1}]
+    arr.push(...conArr)
+
+    //ppt尾页数据
+    const lastPageData={
+        name:'back',
+        modelId:-1,
+        id:-1,
+        //英文地址:https://hzstatic.hzinsights.com/static/ppt_m/ppt_last__img_en.png
+        bgImg:'https://hzstatic.hzinsights.com/static/ppt_m/ppt_last_img.png',
+    }
+    arr.push(lastPageData)
+    
     return arr
 }
 
@@ -59,13 +78,13 @@ export function getTemplate(modelId){
         [1,markRaw(FormatOne)],
         [2,markRaw(FormatTwo)],
         [3,markRaw(FormatThree)],
-        [4,'FormatFour'],
-        [5,'FormatFive'],
-        [6,'FormatSix'],
-        [7,'FormatSeven'],
-        [8,'FormatEight'],
-        [9,'FormatNine'],
-        [-1,'Footer'],
+        [4,markRaw(FormatFour)],
+        [5,markRaw(FormatFive)],
+        [6,markRaw(FormatSix)],
+        [7,markRaw(FormatSeven)],
+        [8,markRaw(FormatEight)],
+        [9,markRaw(FormatNine)],
+        [-1,markRaw(Footer)],
     ])
     return modelMap.get(modelId)
 }

+ 6 - 0
src/views/ppt/style/common.scss

@@ -9,6 +9,7 @@ $pptItemH:700px;
     background-repeat: no-repeat;
     margin-top: 10px;
     position: relative;
+    overflow: hidden;
     .ppt-title-box{
         width: 68%;
         height: 7%;
@@ -27,5 +28,10 @@ $pptItemH:700px;
         top: 14%;
         width: 100%;
         height: 86%;
+        .container{
+            width: 90%;
+            height: 90%;
+            margin: auto;
+        }
     }
 }

+ 3 - 4
src/views/ppt/template/Cover.vue

@@ -9,7 +9,7 @@ const props=defineProps({
 </script>
 
 <template>
-    <div class="cover">
+    <div class="ppt-item-box ppt-cover-page">
         <img :src="pageData.imgLocalUrl.image_url" class="pptbg"  style="width:100%"/>
         <div style="width:62%; font-size:16px; text-align:center; line-height:1.6; color:#fff; position:absolute; right:20px; top:50%;zIndex:20;">
             <p style="height:5px; border-top:1px solid #fff;marginBottom:21px;"></p>
@@ -30,9 +30,8 @@ const props=defineProps({
 </template>
 
 <style lang="scss" scoped>
-.cover{
-    width: 1000px;
-    height: 700px;
+@import '../style/common.scss';
+.ppt-cover-page{
     position: relative;
     overflow: hidden;
 }

+ 28 - 0
src/views/ppt/template/Footer.vue

@@ -0,0 +1,28 @@
+<script setup>
+
+const props=defineProps({
+    pageData:{
+        type:Object,
+        default:{}
+    }
+})
+</script>
+
+<template>
+    <div class="ppt-item-box ppt-last-page">
+        <img :src="pageData.bgImg" alt="">
+    </div>
+</template>
+
+<style lang="scss" scoped>
+@import '../style/common.scss';
+.ppt-last-page{
+    overflow: hidden;
+    img{
+        width: 100%;
+        height: 100%;
+        object-fit: cover;
+        display: block;
+    }
+}
+</style>

+ 24 - 1
src/views/ppt/template/FormatEight.vue

@@ -14,7 +14,20 @@ const props=defineProps({
 	<div class="ppt-item-box">
 		<div class="ppt-title-box">{{pageData.title}}</div>
 		<div class="ppt-content-box">
-			
+			<div class="container">
+				<div class="top-box">
+					<component 
+						:is="getPPTContentType(1,pageData.elements)"
+						:itemData="getPPTContentItemData(1,pageData)"
+					/>
+				</div>
+				<div class="bot-box">
+					<component 
+						:is="getPPTContentType(2,pageData.elements)"
+						:itemData="getPPTContentItemData(2,pageData)"
+					/>
+				</div>
+			</div>
 		</div>
 	</div>
 </template>
@@ -23,4 +36,14 @@ const props=defineProps({
 
 <style scoped lang="scss">
 @import '../style/common.scss';
+.ppt-content-box{
+	.top-box{
+		width: 100%;
+		height: 70%;
+	}
+	.bot-box{
+		width: 100%;
+		height: 30%;
+	}
+}
 </style>

+ 37 - 1
src/views/ppt/template/FormatFive.vue

@@ -14,7 +14,32 @@ const props=defineProps({
 	<div class="ppt-item-box">
 		<div class="ppt-title-box">{{pageData.title}}</div>
 		<div class="ppt-content-box">
-			
+			<div class="container">
+				<div class="item-half-box">
+					<component 
+						:is="getPPTContentType(1,pageData.elements)"
+						:itemData="getPPTContentItemData(1,pageData)"
+					/>
+				</div>
+				<div class="item-half-box">
+					<component 
+						:is="getPPTContentType(2,pageData.elements)"
+						:itemData="getPPTContentItemData(2,pageData)"
+					/>
+				</div>
+				<div class="item-half-box">
+					<component 
+						:is="getPPTContentType(3,pageData.elements)"
+						:itemData="getPPTContentItemData(3,pageData)"
+					/>
+				</div>
+				<div class="item-half-box">
+					<component 
+						:is="getPPTContentType(4,pageData.elements)"
+						:itemData="getPPTContentItemData(4,pageData)"
+					/>
+				</div>
+			</div>
 		</div>
 	</div>
 </template>
@@ -23,4 +48,15 @@ const props=defineProps({
 
 <style scoped lang="scss">
 @import '../style/common.scss';
+.ppt-content-box{
+	.container{
+		display: flex;
+		flex-wrap: wrap;
+		.item-half-box{
+			width: 50%;
+			height: 50%;
+		}
+	}
+	
+}
 </style>

+ 36 - 1
src/views/ppt/template/FormatFour.vue

@@ -14,7 +14,32 @@ const props=defineProps({
 	<div class="ppt-item-box">
 		<div class="ppt-title-box">{{pageData.title}}</div>
 		<div class="ppt-content-box">
-			
+			<div class="container">
+				<div class="item-half-box">
+					<component 
+						:is="getPPTContentType(1,pageData.elements)"
+						:itemData="getPPTContentItemData(1,pageData)"
+					/>
+				</div>
+				<div class="item-half-box">
+					<component 
+						:is="getPPTContentType(2,pageData.elements)"
+						:itemData="getPPTContentItemData(2,pageData)"
+					/>
+				</div>
+				<div class="item-half-box">
+					<component 
+						:is="getPPTContentType(3,pageData.elements)"
+						:itemData="getPPTContentItemData(3,pageData)"
+					/>
+				</div>
+				<div class="item-half-box">
+					<component 
+						:is="getPPTContentType(4,pageData.elements)"
+						:itemData="getPPTContentItemData(4,pageData)"
+					/>
+				</div>
+			</div>
 		</div>
 	</div>
 </template>
@@ -23,4 +48,14 @@ const props=defineProps({
 
 <style scoped lang="scss">
 @import '../style/common.scss';
+.ppt-content-box{
+	.container{
+		display: flex;
+		flex-wrap: wrap;
+		.item-half-box{
+			width: 50%;
+			height: 50%;
+		}
+	}
+}
 </style>

+ 37 - 1
src/views/ppt/template/FormatNine.vue

@@ -14,7 +14,28 @@ const props=defineProps({
 	<div class="ppt-item-box">
 		<div class="ppt-title-box">{{pageData.title}}</div>
 		<div class="ppt-content-box">
-			
+			<div class="container">
+				<div class="top-box">
+					<div class="top-half-box">
+						<component 
+							:is="getPPTContentType(1,pageData.elements)"
+							:itemData="getPPTContentItemData(1,pageData)"
+						/>
+					</div>
+					<div class="top-half-box">
+						<component 
+							:is="getPPTContentType(2,pageData.elements)"
+							:itemData="getPPTContentItemData(2,pageData)"
+						/>
+					</div>
+				</div>
+				<div class="bot-box">
+					<component 
+						:is="getPPTContentType(3,pageData.elements)"
+						:itemData="getPPTContentItemData(3,pageData)"
+					/>
+				</div>
+			</div>
 		</div>
 	</div>
 </template>
@@ -23,4 +44,19 @@ const props=defineProps({
 
 <style scoped lang="scss">
 @import '../style/common.scss';
+.ppt-content-box{
+	.top-box{
+		width: 100%;
+		height: 70%;
+		display: flex;
+		.top-half-box{
+			width: 50%;
+			height: 100%;
+		}
+	}
+	.bot-box{
+		width: 100%;
+		height: 30%;
+	}
+}
 </style>

+ 6 - 4
src/views/ppt/template/FormatOne.vue

@@ -15,10 +15,12 @@ const props=defineProps({
 	<div class="ppt-item-box">
 		<div class="ppt-title-box">{{pageData.title}}</div>
 		<div class="ppt-content-box">
-            <component 
-				:is="getPPTContentType(1,pageData.elements)"
-				:itemData="getPPTContentItemData(1,pageData)"
-			></component>
+			<div class="container">
+				<component 
+					:is="getPPTContentType(1,pageData.elements)"
+					:itemData="getPPTContentItemData(1,pageData)"
+				/>
+			</div>
         </div>
 	</div>
 </template>

+ 23 - 1
src/views/ppt/template/FormatSeven.vue

@@ -14,7 +14,20 @@ const props=defineProps({
 	<div class="ppt-item-box">
 		<div class="ppt-title-box">{{pageData.title}}</div>
 		<div class="ppt-content-box">
-			
+			<div class="container">
+				<div class="half-box">
+					<component 
+						:is="getPPTContentType(1,pageData.elements)"
+						:itemData="getPPTContentItemData(1,pageData)"
+					/>
+				</div>
+				<div class="half-box">
+					<component 
+						:is="getPPTContentType(2,pageData.elements)"
+						:itemData="getPPTContentItemData(2,pageData)"
+					/>
+				</div>
+			</div>
 		</div>
 	</div>
 </template>
@@ -23,4 +36,13 @@ const props=defineProps({
 
 <style scoped lang="scss">
 @import '../style/common.scss';
+.ppt-content-box{
+	.container{
+		display: flex;
+		.half-box{
+			width: 50%;
+			height: 100%;
+		}
+	}
+}
 </style>

+ 6 - 1
src/views/ppt/template/FormatSix.vue

@@ -14,7 +14,12 @@ const props=defineProps({
 	<div class="ppt-item-box">
 		<div class="ppt-title-box">{{pageData.title}}</div>
 		<div class="ppt-content-box">
-			
+			<div class="container">
+				<component 
+					:is="getPPTContentType(1,pageData.elements)"
+					:itemData="getPPTContentItemData(1,pageData)"
+				/>
+			</div>
 		</div>
 	</div>
 </template>

+ 29 - 24
src/views/ppt/template/FormatThree.vue

@@ -14,26 +14,28 @@ const props=defineProps({
 	<div class="ppt-item-box">
 		<div class="ppt-title-box">{{pageData.title}}</div>
 		<div class="ppt-content-box">
-			<div class="left-box">
-				<div class="left-half-box">
-					<component 
-						:is="getPPTContentType(1,pageData.elements)"
-						:itemData="getPPTContentItemData(1,pageData)"
-					/>
+			<div class="container">
+				<div class="left-box">
+					<div class="left-half-box">
+						<component 
+							:is="getPPTContentType(1,pageData.elements)"
+							:itemData="getPPTContentItemData(1,pageData)"
+						/>
+					</div>
+					<div class="left-half-box">
+						<component 
+							:is="getPPTContentType(2,pageData.elements)"
+							:itemData="getPPTContentItemData(2,pageData)"
+						/>
+					</div>
 				</div>
-				<div class="left-half-box">
+				<div class="right-box">
 					<component 
-						:is="getPPTContentType(2,pageData.elements)"
-						:itemData="getPPTContentItemData(2,pageData)"
+						:is="getPPTContentType(3,pageData.elements)"
+						:itemData="getPPTContentItemData(3,pageData)"
 					/>
 				</div>
 			</div>
-			<div class="right-box">
-				<component 
-					:is="getPPTContentType(3,pageData.elements)"
-					:itemData="getPPTContentItemData(3,pageData)"
-				/>
-			</div>
 		</div>
 	</div>
 </template>
@@ -43,16 +45,19 @@ const props=defineProps({
 <style scoped lang="scss">
 @import '../style/common.scss';
 .ppt-content-box{
-	display: flex;
-	.left-box{
-		width: 50%;
-		.left-half-box{
-			width: 100%;
-			height: 50%;
+	.container{
+		display: flex;
+		.left-box{
+			width: 50%;
+			.left-half-box{
+				width: 100%;
+				height: 50%;
+			}
+		}
+		.right-box{
+			width: 50%;
 		}
 	}
-	.right-box{
-		width: 50%;
-	}
+	
 }
 </style>

+ 26 - 21
src/views/ppt/template/FormatTwo.vue

@@ -15,17 +15,19 @@ const props=defineProps({
 	<div class="ppt-item-box">
 		<div class="ppt-title-box">{{pageData.title}}</div>
 		<div class="ppt-content-box">
-			<div class="left-box">
-				<component 
-					:is="getPPTContentType(1,pageData.elements)"
-					:itemData="getPPTContentItemData(1,pageData)"
-				/>
-			</div>
-			<div class="right-box">
-				<component 
-					:is="getPPTContentType(2,pageData.elements)"
-					:itemData="getPPTContentItemData(2,pageData)"
-				/>
+			<div class="container">
+				<div class="left-box">
+					<component 
+						:is="getPPTContentType(1,pageData.elements)"
+						:itemData="getPPTContentItemData(1,pageData)"
+					/>
+				</div>
+				<div class="right-box">
+					<component 
+						:is="getPPTContentType(2,pageData.elements)"
+						:itemData="getPPTContentItemData(2,pageData)"
+					/>
+				</div>
 			</div>
 		</div>
 	</div>
@@ -34,16 +36,19 @@ const props=defineProps({
 <style lang="scss" scoped>
 @import '../style/common.scss';
 .ppt-content-box{
-	display: flex;
-	.left-box{
-		width: 60%;
-		height: 100%;
-		flex-shrink: 0;
-	}
-	.right-box{
-		flex: 1;
-		flex-shrink: 0;
-		height: 100%;
+	.container{
+		display: flex;
+		.left-box{
+			width: 60%;
+			height: 100%;
+			flex-shrink: 0;
+		}
+		.right-box{
+			flex: 1;
+			flex-shrink: 0;
+			height: 100%;
+		}
 	}
+	
 }
 </style>