xieqy пре 1 година
родитељ
комит
d4429104bc
33 измењених фајлова са 1973 додато и 285 уклоњено
  1. 184 197
      package-lock.json
  2. 1 1
      package.json
  3. BIN
      src/assets/font/Alimama_ShuHeiTi_Bold.ttf
  4. 7 0
      src/assets/font/font.css
  5. 26 2
      src/views/OnlineImport/widgets/PipeOnlineImport/widget.vue
  6. 8 2
      src/views/currentSystem/authorityManagement/projectManage/index.vue
  7. 25 0
      src/views/groupPage/apis.ts
  8. 141 0
      src/views/groupPage/components/BarChart/ComContractBarChart.vue
  9. 8 6
      src/views/groupPage/components/BarChart/ComRankingBarChart.vue
  10. 186 0
      src/views/groupPage/components/BarChart/ComSettlementChart.vue
  11. 205 0
      src/views/groupPage/components/BarChart/ComSplitBarChart.vue
  12. 4 2
      src/views/groupPage/components/BatteryChart/ComBatteryChart.vue
  13. 24 20
      src/views/groupPage/components/LineChart/ComLineChart.vue
  14. 102 0
      src/views/groupPage/components/OthersChart/ComLiquidFillChart.vue
  15. 116 0
      src/views/groupPage/components/PieChart/ComExpenseTypeChart.vue
  16. 1 2
      src/views/groupPage/districtPageModules/customTools/layerControl.vue
  17. 1 1
      src/views/groupPage/districtPageModules/index.vue
  18. 25 8
      src/views/groupPage/districtPageModules/projectPanoramic/ProjectProgressNew.vue
  19. 4 1
      src/views/groupPage/districtPageModules/statisticalAnalysis/index.vue
  20. 106 0
      src/views/groupPage/districtPageModules/statisticalAnalysis/investModule/ContractSettlement.vue
  21. 344 0
      src/views/groupPage/districtPageModules/statisticalAnalysis/investModule/ContractStatistics.vue
  22. 242 0
      src/views/groupPage/districtPageModules/statisticalAnalysis/investModule/MonthlyStatistics.vue
  23. 40 0
      src/views/groupPage/districtPageModules/statisticalAnalysis/investModule/index.vue
  24. 11 4
      src/views/groupPage/districtPageModules/statisticalAnalysis/securityModule/InspectionsNum.vue
  25. 124 30
      src/views/groupPage/districtPageModules/statisticalAnalysis/securityModule/RiskAndSecurityNew.vue
  26. 5 4
      src/views/groupPage/districtPageModules/statisticalAnalysis/securityModule/StatisticalRisk.vue
  27. 33 5
      src/views/groupPage/groupPageModules/ContractInfo.vue
  28. BIN
      src/views/groupPage/images/模块图标/统计分析/合同.png
  29. BIN
      src/views/groupPage/images/模块图标/统计分析/投资结算.png
  30. BIN
      src/views/groupPage/images/模块图标/统计分析/指向.png
  31. BIN
      src/views/groupPage/images/模块图标/统计分析/本月图标.png
  32. BIN
      src/views/groupPage/images/模块图标/统计分析/累计图标.png
  33. BIN
      src/views/groupPage/images/模块图标/统计分析/结算.png

+ 184 - 197
package-lock.json

@@ -4242,6 +4242,16 @@
           "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
           "dev": true
         },
+        "ansi-styles": {
+          "version": "4.3.0",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "color-convert": "^2.0.1"
+          }
+        },
         "cache-loader": {
           "version": "4.1.0",
           "resolved": "https://registry.npmmirror.com/cache-loader/-/cache-loader-4.1.0.tgz",
@@ -4256,6 +4266,44 @@
             "schema-utils": "^2.0.0"
           }
         },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+          "dev": true,
+          "optional": true
+        },
+        "cosmiconfig": {
+          "version": "6.0.0",
+          "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz",
+          "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "@types/parse-json": "^4.0.0",
+            "import-fresh": "^3.1.0",
+            "parse-json": "^5.0.0",
+            "path-type": "^4.0.0",
+            "yaml": "^1.7.2"
+          }
+        },
+        "deepmerge": {
+          "version": "4.3.1",
+          "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz",
+          "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==",
+          "dev": true,
+          "optional": true
+        },
         "find-cache-dir": {
           "version": "3.3.2",
           "resolved": "https://registry.npmmirror.com/find-cache-dir/-/find-cache-dir-3.3.2.tgz",
@@ -4277,6 +4325,101 @@
             "path-exists": "^4.0.0"
           }
         },
+        "fork-ts-checker-webpack-plugin-v5": {
+          "version": "npm:fork-ts-checker-webpack-plugin@5.2.1",
+          "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-5.2.1.tgz",
+          "integrity": "sha512-SVi+ZAQOGbtAsUWrZvGzz38ga2YqjWvca1pXQFUArIVXqli0lLoDQ8uS0wg0kSpcwpZmaW5jVCZXQebkyUQSsw==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "@babel/code-frame": "^7.8.3",
+            "@types/json-schema": "^7.0.5",
+            "chalk": "^4.1.0",
+            "cosmiconfig": "^6.0.0",
+            "deepmerge": "^4.2.2",
+            "fs-extra": "^9.0.0",
+            "memfs": "^3.1.2",
+            "minimatch": "^3.0.4",
+            "schema-utils": "2.7.0",
+            "semver": "^7.3.2",
+            "tapable": "^1.0.0"
+          },
+          "dependencies": {
+            "chalk": {
+              "version": "4.1.2",
+              "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+              "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+              "dev": true,
+              "optional": true,
+              "requires": {
+                "ansi-styles": "^4.1.0",
+                "supports-color": "^7.1.0"
+              }
+            },
+            "lru-cache": {
+              "version": "6.0.0",
+              "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+              "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+              "dev": true,
+              "optional": true,
+              "requires": {
+                "yallist": "^4.0.0"
+              }
+            },
+            "semver": {
+              "version": "7.5.0",
+              "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.0.tgz",
+              "integrity": "sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA==",
+              "dev": true,
+              "optional": true,
+              "requires": {
+                "lru-cache": "^6.0.0"
+              }
+            }
+          }
+        },
+        "fs-extra": {
+          "version": "9.1.0",
+          "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz",
+          "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "at-least-node": "^1.0.0",
+            "graceful-fs": "^4.2.0",
+            "jsonfile": "^6.0.1",
+            "universalify": "^2.0.0"
+          }
+        },
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true,
+          "optional": true
+        },
+        "import-fresh": {
+          "version": "3.3.0",
+          "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
+          "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "parent-module": "^1.0.0",
+            "resolve-from": "^4.0.0"
+          }
+        },
+        "jsonfile": {
+          "version": "6.1.0",
+          "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
+          "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "graceful-fs": "^4.1.6",
+            "universalify": "^2.0.0"
+          }
+        },
         "locate-path": {
           "version": "5.0.0",
           "resolved": "https://registry.npmmirror.com/locate-path/-/locate-path-5.0.0.tgz",
@@ -4337,6 +4480,13 @@
           "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
           "dev": true
         },
+        "path-type": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
+          "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
+          "dev": true,
+          "optional": true
+        },
         "pkg-dir": {
           "version": "4.2.0",
           "resolved": "https://registry.npmmirror.com/pkg-dir/-/pkg-dir-4.2.0.tgz",
@@ -4358,6 +4508,13 @@
             "type-fest": "^0.6.0"
           }
         },
+        "resolve-from": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
+          "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
+          "dev": true,
+          "optional": true
+        },
         "semver": {
           "version": "6.3.0",
           "resolved": "https://registry.npmmirror.com/semver/-/semver-6.3.0.tgz",
@@ -4372,6 +4529,30 @@
           "requires": {
             "ansi-regex": "^5.0.1"
           }
+        },
+        "supports-color": {
+          "version": "7.2.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        },
+        "universalify": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz",
+          "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==",
+          "dev": true,
+          "optional": true
+        },
+        "yallist": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+          "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+          "dev": true,
+          "optional": true
         }
       }
     },
@@ -9286,9 +9467,9 @@
       }
     },
     "echarts-liquidfill": {
-      "version": "2.0.6",
-      "resolved": "https://registry.npmjs.org/echarts-liquidfill/-/echarts-liquidfill-2.0.6.tgz",
-      "integrity": "sha512-p+AH0O9/BtwXMQQyhjJbMZo+GwRAgWG/DCyK5r27PQzpS0UWrgXu57MyEFc0A8Ub3sRuqEu08BuxwHICBkSWSQ=="
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/echarts-liquidfill/-/echarts-liquidfill-3.1.0.tgz",
+      "integrity": "sha512-5Dlqs/jTsdTUAsd+K5LPLLTgrbbNORUSBQyk8PSy1Mg2zgHDWm83FmvA4s0ooNepCJojFYRITTQ4GU1UUSKYLw=="
     },
     "echarts-wordcloud": {
       "version": "2.0.0",
@@ -11007,200 +11188,6 @@
         "worker-rpc": "^0.1.0"
       }
     },
-    "fork-ts-checker-webpack-plugin-v5": {
-      "version": "npm:fork-ts-checker-webpack-plugin@5.2.1",
-      "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-5.2.1.tgz",
-      "integrity": "sha512-SVi+ZAQOGbtAsUWrZvGzz38ga2YqjWvca1pXQFUArIVXqli0lLoDQ8uS0wg0kSpcwpZmaW5jVCZXQebkyUQSsw==",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "@babel/code-frame": "^7.8.3",
-        "@types/json-schema": "^7.0.5",
-        "chalk": "^4.1.0",
-        "cosmiconfig": "^6.0.0",
-        "deepmerge": "^4.2.2",
-        "fs-extra": "^9.0.0",
-        "memfs": "^3.1.2",
-        "minimatch": "^3.0.4",
-        "schema-utils": "2.7.0",
-        "semver": "^7.3.2",
-        "tapable": "^1.0.0"
-      },
-      "dependencies": {
-        "ansi-styles": {
-          "version": "4.3.0",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "color-convert": "^2.0.1"
-          }
-        },
-        "chalk": {
-          "version": "4.1.2",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
-          "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "ansi-styles": "^4.1.0",
-            "supports-color": "^7.1.0"
-          }
-        },
-        "color-convert": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "color-name": "~1.1.4"
-          }
-        },
-        "color-name": {
-          "version": "1.1.4",
-          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-          "dev": true,
-          "optional": true
-        },
-        "cosmiconfig": {
-          "version": "6.0.0",
-          "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz",
-          "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "@types/parse-json": "^4.0.0",
-            "import-fresh": "^3.1.0",
-            "parse-json": "^5.0.0",
-            "path-type": "^4.0.0",
-            "yaml": "^1.7.2"
-          }
-        },
-        "deepmerge": {
-          "version": "4.3.0",
-          "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.0.tgz",
-          "integrity": "sha512-z2wJZXrmeHdvYJp/Ux55wIjqo81G5Bp4c+oELTW+7ar6SogWHajt5a9gO3s3IDaGSAXjDk0vlQKN3rms8ab3og==",
-          "dev": true,
-          "optional": true
-        },
-        "fs-extra": {
-          "version": "9.1.0",
-          "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz",
-          "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "at-least-node": "^1.0.0",
-            "graceful-fs": "^4.2.0",
-            "jsonfile": "^6.0.1",
-            "universalify": "^2.0.0"
-          }
-        },
-        "has-flag": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
-          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
-          "dev": true,
-          "optional": true
-        },
-        "import-fresh": {
-          "version": "3.3.0",
-          "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
-          "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "parent-module": "^1.0.0",
-            "resolve-from": "^4.0.0"
-          }
-        },
-        "jsonfile": {
-          "version": "6.1.0",
-          "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
-          "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "graceful-fs": "^4.1.6",
-            "universalify": "^2.0.0"
-          }
-        },
-        "lru-cache": {
-          "version": "6.0.0",
-          "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
-          "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "yallist": "^4.0.0"
-          }
-        },
-        "parse-json": {
-          "version": "5.2.0",
-          "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
-          "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "@babel/code-frame": "^7.0.0",
-            "error-ex": "^1.3.1",
-            "json-parse-even-better-errors": "^2.3.0",
-            "lines-and-columns": "^1.1.6"
-          }
-        },
-        "path-type": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
-          "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
-          "dev": true,
-          "optional": true
-        },
-        "resolve-from": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
-          "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
-          "dev": true,
-          "optional": true
-        },
-        "semver": {
-          "version": "7.3.8",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
-          "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "lru-cache": "^6.0.0"
-          }
-        },
-        "supports-color": {
-          "version": "7.2.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "has-flag": "^4.0.0"
-          }
-        },
-        "universalify": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz",
-          "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==",
-          "dev": true,
-          "optional": true
-        },
-        "yallist": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
-          "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
-          "dev": true,
-          "optional": true
-        }
-      }
-    },
     "form-data": {
       "version": "2.3.3",
       "resolved": "https://registry.npm.taobao.org/form-data/download/form-data-2.3.3.tgz",

+ 1 - 1
package.json

@@ -22,7 +22,7 @@
     "crypto-js": "^4.1.1",
     "echarts": "^5.2.0",
     "echarts-gl": "^2.0.8",
-    "echarts-liquidfill": "^2.0.6",
+    "echarts-liquidfill": "^3.1.0",
     "echarts-wordcloud": "^2.0.0",
     "element-ui": "^2.15.7",
     "gm-crypto": "^0.1.8",

BIN
src/assets/font/Alimama_ShuHeiTi_Bold.ttf


+ 7 - 0
src/assets/font/font.css

@@ -39,4 +39,11 @@
   font-weight: normal;
   font-style: normal;
   font-family: AgencyFB-Bold;
+}
+
+@font-face {
+  src: url('Alimama_ShuHeiTi_Bold.ttf');
+  font-weight: normal;
+  font-style: normal;
+  font-family: Alimama ShuHeiTi;
 }

+ 26 - 2
src/views/OnlineImport/widgets/PipeOnlineImport/widget.vue

@@ -814,6 +814,11 @@ export default class PipeOnlineImprt extends Vue {
       this.$message.warning('请选择导入层级')
       return
     }
+    const workSpace = this.$store.state.project.project.workSpace
+    if (!workSpace || workSpace === '') {
+      this.$message.warning('未绑定工作空间,请检查')
+      return
+    }
     const loading = this.$loading({
       text: '后台处理中',
       lock: true,
@@ -828,6 +833,7 @@ export default class PipeOnlineImprt extends Vue {
     formdata.append('id', '' + this.impForm.id)
     formdata.append('wkid', wkid)
     formdata.append('dataUser', dataUser)
+    formdata.append('workSpace', workSpace)
     request({
       url: '/tofly-lzd-data/data/import/' + this.impForm.id,
       method: 'POST',
@@ -874,8 +880,13 @@ export default class PipeOnlineImprt extends Vue {
       this.$message.warning('未绑定空间数据库,请检查')
       return
     }
+    const workSpace = this.$store.state.project.project.workSpace
+    if (!workSpace || workSpace === '') {
+      this.$message.warning('未绑定工作空间,请检查')
+      return
+    }
     request({
-      url: '/tofly-lzd-data/data/createNetwork?importType=1&dataUser=' + dataUser,
+      url: '/tofly-lzd-data/data/createNetwork?importType=1&dataUser=' + dataUser + '&workSpace=' + workSpace,
       method: 'POST',
       timeout: 600000
     })
@@ -1015,6 +1026,11 @@ export default class PipeOnlineImprt extends Vue {
       this.$message.warning('未绑定空间数据库,请检查')
       return
     }
+    const workSpace = this.$store.state.project.project.workSpace
+    if (!workSpace || workSpace === '') {
+      this.$message.warning('未绑定工作空间,请检查')
+      return
+    }
     const id = row.id
     this.$confirm('是否删除该节点')
       .then(() => {
@@ -1025,7 +1041,15 @@ export default class PipeOnlineImprt extends Vue {
           background: 'rgba(0, 0, 0, 0.7)'
         })
         request({
-          url: '/tofly-lzd-data/data/deleteData/' + id + '?importType=1&id=' + id + '&dataUser=' + dataUser,
+          url:
+            '/tofly-lzd-data/data/deleteData/' +
+            id +
+            '?importType=1&id=' +
+            id +
+            '&dataUser=' +
+            dataUser +
+            '&workSpace=' +
+            workSpace,
           method: 'POST'
         })
           .then((result) => {

+ 8 - 2
src/views/currentSystem/authorityManagement/projectManage/index.vue

@@ -169,6 +169,9 @@
             </el-option>
           </el-select>
         </el-form-item>
+        <el-form-item label="工作空间" :label-width="formLabelWidth">
+          <el-input v-model="form2.workSpace" autocomplete="off" placeholder="请输入工作空间" clearable></el-input>
+        </el-form-item>
       </el-form>
       <div slot="footer" class="dialog-footer">
         <el-button @click="dialogFormVisible2 = false">取 消</el-button>
@@ -295,7 +298,8 @@ export default {
         height: '',
         dataUser: '',
         wkid: '',
-        pbsModel: null
+        pbsModel: null,
+        workSpace: ''
       },
       selectPrjId: null,
       pbsmodels: [],
@@ -492,6 +496,7 @@ export default {
           this.form2.dataUser = project.dataUser
           this.form2.wkid = project.wkid
           this.form2.pbsModel = project.pbsModel
+          this.form2.workSpace = project.workSpace
         }
       } else {
         this.$message('请勾选一个项目!')
@@ -516,7 +521,8 @@ export default {
         dataUser: this.form2.dataUser,
         wkid: this.form2.wkid,
         pbsModel: this.form2.pbsModel,
-        hasTransfer: true
+        hasTransfer: true,
+        workSpace: this.form2.workSpace
       }
       putPrjList_api(data)
         .then((res) => {

+ 25 - 0
src/views/groupPage/apis.ts

@@ -249,6 +249,31 @@ export function getDangerCheckCountData(params) {
         params
     })
 }
+/********************************************投资统计模块接口*********************************************/
+//结算数据获取
+export function getCostData(params) {
+    return request({
+        url: '/tofly-sxgk/epcjstzgldetail/getCostData',
+        method: 'get',
+        params
+    })
+}
+//建设管理投资详情接口
+export function getEpcjstzgldetailList(params) {
+    return request({
+        url: '/tofly-sxgk/epcjstzgldetail/list',
+        method: 'get',
+        params
+    })
+}
+//建设管理投资详情月度数据接口
+export function getEpcjsyddetailList(params) {
+    return request({
+        url: '/tofly-sxgk/epcjsyddetail/list',
+        method: 'get',
+        params
+    })
+}
 /********************************************智慧预警模块接口*********************************************/
 //预警信息管理(列表查询)
 export function getWarnInfoList(params) {

+ 141 - 0
src/views/groupPage/components/BarChart/ComContractBarChart.vue

@@ -0,0 +1,141 @@
+<template>
+  <div class="chart" ref="chart"></div>
+</template>
+
+<script>
+import * as echarts from 'echarts'
+import { fontSize } from '../../util'
+export default {
+  name: 'ComContractBarChart', //合同结算柱状图
+  props: {
+    chartData: {}
+  },
+  data() {
+    return { myChart: null }
+  },
+  watch: {
+    chartData: {
+      handler(n, o) {
+        this.initialChart()
+      }
+    }
+  },
+  mounted() {
+    //图表大小自适应
+    window.addEventListener('resize', this.onResize)
+  },
+  methods: {
+    destroyChart() {
+      if (this.myChart != null) {
+        this.myChart.dispose()
+        this.myChart = null
+      }
+    },
+    onResize() {
+      this.initialChart()
+    },
+    initialChart() {
+      this.destroyChart()
+      const { xData, seriesData } = this.chartData || {}
+      let option = {
+        grid: {
+          top: '30%',
+          right: '3%',
+          left: '5%',
+          bottom: '15%'
+          //   containLabel: true
+        },
+        tooltip: {
+          confine: true,
+          trigger: 'axis',
+          axisPointer: {
+            lineStyle: {
+              type: 'solid',
+              color: 'rgba(255, 255, 255, 0.3)'
+            }
+          },
+          textStyle: {
+            color: '#fff'
+          },
+          borderWidth: 0,
+          backgroundColor: 'rgba(50,50,50,0.7)'
+        },
+        xAxis: {
+          type: 'category',
+          axisTick: { show: false },
+          axisLine: { show: false },
+          axisLabel: {
+            fontSize: 14,
+            fontFamily: 'Source Han Sans CN',
+            fontWeight: 300,
+            color: '#FFFFFF'
+          },
+          data: xData
+        },
+        yAxis: {
+          type: 'value',
+          name: '万元',
+          nameGap: fontSize(35),
+          nameTextStyle: {
+            align: 'right',
+            fontSize: fontSize(14),
+            fontFamily: 'Source Han Sans CN',
+            fontWeight: 300,
+            color: '#FFFFFF'
+          },
+          splitLine: {
+            lineStyle: {
+              color: 'rgba(255, 255, 255, 0.2)'
+            }
+          },
+          axisLabel: {
+            fontSize: fontSize(14),
+            fontFamily: 'Source Han Sans CN',
+            fontWeight: 300,
+            color: '#FFFFFF'
+          }
+        },
+        series: [
+          {
+            data: seriesData,
+            type: 'bar',
+            barWidth: 10,
+            itemStyle: {
+              borderRadius: 5,
+              color: new echarts.graphic.LinearGradient(0, 1, 0, 0, [
+                {
+                  offset: 0,
+                  color: '#0A85F7'
+                },
+                {
+                  offset: 1,
+                  color: '#05C7DA'
+                }
+              ])
+            }
+          }
+        ]
+      }
+      this.creatChart(option, this.$refs.chart)
+    },
+    creatChart(option, ref) {
+      this.myChart = echarts.init(ref) //this.$refs.chart
+      this.myChart.resize()
+      this.myChart.setOption(option, {
+        notMerge: true
+      })
+    }
+  },
+  beforeDestroy() {
+    window.removeEventListener('resize', this.onResize)
+    this.destroyChart()
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.chart {
+  width: 100%;
+  height: 100%;
+}
+</style>

+ 8 - 6
src/views/groupPage/components/BarChart/ComRankingBarChart.vue

@@ -20,8 +20,8 @@ export default {
           this.initialChart()
         })
       },
-      deep: true,
-      immediate: true
+      deep: true
+      // immediate: true
     }
   },
   mounted() {
@@ -51,11 +51,13 @@ export default {
     initialChart() {
       this.destroyChart()
       let seriesData = [],
-        dataArr = [18203, 23489, 29034, 104970, 131744]
-      dataArr.sort((a, b) => b - a)
+        yData = [],
+        dataArr = this.chartData
+      // dataArr.sort((a, b) => b - a)
       dataArr.forEach((item, index) => {
+        yData.unshift(item.type)
         seriesData.unshift({
-          value: item,
+          value: item.num,
           itemStyle: {
             color: {
               type: 'linear',
@@ -109,7 +111,7 @@ export default {
             width: fontSize(100),
             overflow: 'truncate'
           },
-          data: ['xxx隐患', 'xxx隐患', 'xxx隐患', 'xxx隐患', 'xxx隐患']
+          data: yData
         },
         series: [
           {

+ 186 - 0
src/views/groupPage/components/BarChart/ComSettlementChart.vue

@@ -0,0 +1,186 @@
+<template>
+  <div class="chart" ref="chart"></div>
+</template>
+
+<script>
+import * as echarts from 'echarts'
+import { fontSize } from '../../util'
+export default {
+  name: 'ComSettlementChart', //结算柱状图
+  props: {
+    chartData: {}
+  },
+  data() {
+    return { myChart: null, timeout: null }
+  },
+  watch: {
+    chartData: {
+      handler(n, o) {
+        this.initialChart()
+      }
+    }
+  },
+  mounted() {
+    //图表大小自适应
+    window.addEventListener('resize', this.onResize)
+  },
+  methods: {
+    destroyChart() {
+      if (this.myChart != null) {
+        this.myChart.dispose()
+        this.myChart = null
+      }
+    },
+    onResize() {
+      //   if (this.myChart) {
+      //     this.myChart.resize()
+      //   }
+      this.initialChart()
+    },
+    initialChart() {
+      this.destroyChart()
+      const { legendData, totalSta, annualSta } = this.chartData || {}
+      let option = {
+        tooltip: {
+          confine: true,
+          trigger: 'axis',
+          axisPointer: {
+            lineStyle: {
+              type: 'solid',
+              color: 'rgba(255, 255, 255, 0.3)'
+            }
+          },
+          textStyle: {
+            color: '#fff'
+          },
+          borderWidth: 0,
+          backgroundColor: 'rgba(50,50,50,0.7)'
+        },
+        legend: {
+          top: '2%',
+          itemWidth: 8,
+          itemHeight: 8,
+          textStyle: {
+            fontSize: fontSize(14),
+            fontFamily: 'Source Han Sans CN',
+            fontWeight: 400,
+            color: '#FFFFFF'
+          }
+        },
+        grid: {
+          top: '10%',
+          left: '3%',
+          right: '25%',
+          bottom: '3%',
+          containLabel: true
+        },
+        xAxis: {
+          type: 'value',
+          splitLine: { show: false },
+          axisLabel: { show: false },
+          boundaryGap: [0, 0.01]
+        },
+        yAxis: {
+          type: 'category',
+          axisLine: { show: false },
+          axisTick: { show: false },
+          axisLabel: {
+            inside: true,
+            verticalAlign: 'bottom',
+            lineHeight: fontSize(45),
+            margin: 0,
+            //
+            fontSize: fontSize(14),
+            fontFamily: 'Source Han Sans CN',
+            fontWeight: 500,
+            color: '#FFFFFF'
+          },
+          data: legendData
+        },
+        series: [
+          {
+            name: '累计结算',
+            type: 'bar',
+            barWidth: 8,
+            barGap: '80%',
+            label: {
+              show: true,
+              position: [fontSize(280), 0],
+              fontSize: fontSize(14),
+              fontFamily: 'Source Han Sans CN',
+              fontWeight: 500,
+              color: ' #FEFFFF',
+              formatter: (param) => {
+                return param.value + '万元'
+              }
+            },
+            itemStyle: {
+              borderRadius: 4,
+              color: new echarts.graphic.LinearGradient(0, 0, 1, 0, [
+                {
+                  offset: 0,
+                  color: '#D6791F'
+                },
+                {
+                  offset: 1,
+                  color: '#FFA44B'
+                }
+              ])
+            },
+            data: totalSta
+          },
+          {
+            name: '年度结算',
+            type: 'bar',
+            barWidth: 8,
+            label: {
+              show: true,
+              position: [fontSize(280), 0],
+              fontSize: fontSize(14),
+              fontFamily: 'Source Han Sans CN',
+              fontWeight: 500,
+              color: ' #FEFFFF',
+              formatter: (param) => {
+                return param.value + '万元'
+              }
+            },
+            itemStyle: {
+              borderRadius: 4,
+              color: new echarts.graphic.LinearGradient(0, 0, 1, 0, [
+                {
+                  offset: 0,
+                  color: '#0A89FF'
+                },
+                {
+                  offset: 1,
+                  color: '#05CFE1'
+                }
+              ])
+            },
+            data: annualSta
+          }
+        ]
+      }
+      this.creatChart(option, this.$refs.chart)
+    },
+    creatChart(option, ref) {
+      this.myChart = echarts.init(ref) //this.$refs.chart
+      this.myChart.resize()
+      this.myChart.setOption(option, {
+        notMerge: true
+      })
+    }
+  },
+  beforeDestroy() {
+    window.removeEventListener('resize', this.onResize)
+    this.destroyChart()
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.chart {
+  width: 100%;
+  height: 100%;
+}
+</style>

+ 205 - 0
src/views/groupPage/components/BarChart/ComSplitBarChart.vue

@@ -0,0 +1,205 @@
+<template>
+  <div class="chart" ref="chart"></div>
+</template>
+
+<script>
+import * as echarts from 'echarts'
+import { fontSize } from '../../util'
+export default {
+  name: 'ComSplitBarChart', //合同结算柱状图
+  props: {
+    chartData: {}
+  },
+  data() {
+    return { myChart: null }
+  },
+  watch: {
+    chartData: {
+      handler(n, o) {
+        this.initialChart()
+      }
+    }
+  },
+  mounted() {
+    //图表大小自适应
+    window.addEventListener('resize', this.onResize)
+  },
+  methods: {
+    destroyChart() {
+      if (this.myChart != null) {
+        this.myChart.dispose()
+        this.myChart = null
+      }
+    },
+    onResize() {
+      this.initialChart()
+    },
+    getBarColor(index) {
+      const colors = [
+        { index: 0, color0: '#CB2222', color1: '#FF4747' },
+        { index: 1, color0: '#D7742C', color1: '#F6A75B' },
+        { index: 2, color0: '#BEA23F', color1: '#E1D35B' }
+      ]
+      return colors.find((i) => i.index == index) || { index: 3, color0: '#0A89FF', color1: '#05CFE1' }
+    },
+    initialChart() {
+      this.destroyChart()
+      let list = this.chartData
+      let barData = []
+      list.forEach((item, index) => {
+        barData.push({
+          ...item,
+          itemStyle: {
+            color: {
+              type: 'linear',
+              x: 0,
+              y: 0,
+              x2: 1,
+              y2: 0,
+              colorStops: [
+                {
+                  offset: 0,
+                  color: this.getBarColor(index).color0 // 0% 处的颜色
+                },
+                {
+                  offset: 1,
+                  color: this.getBarColor(index).color1 // 100% 处的颜色
+                }
+              ]
+            }
+          }
+        })
+      })
+      let yName = list.map((item) => item.name)
+      let xData = list.map((item) => item.value)
+      let barWidth = 10
+      let option = {
+        backgroundColor: 'transparent',
+        xAxis: {
+          splitLine: {
+            show: false
+          },
+          axisLabel: {
+            show: false
+          },
+          axisTick: {
+            show: false
+          },
+          axisLine: {
+            show: false
+          }
+        },
+        grid: {
+          containLabel: true,
+          left: 0,
+          top: '5%',
+          right: '35%',
+          bottom: 0
+        },
+        yAxis: [
+          {
+            inverse: true,
+            axisLine: {
+              show: false
+            },
+            axisTick: {
+              show: false
+            },
+            axisLabel: {
+              inside: true,
+              verticalAlign: 'bottom',
+              lineHeight: fontSize(37),
+              margin: 0,
+              //
+              fontSize: fontSize(14),
+              fontFamily: 'Source Han Sans CN',
+              fontWeight: 500,
+              color: '#FFFFFF'
+            },
+            data: yName
+          }
+        ],
+        series: [
+          {
+            //内
+            type: 'bar',
+            barWidth,
+            legendHoverLink: false,
+            symbolRepeat: true,
+            silent: true,
+            data: barData,
+            z: 1,
+            animationEasing: 'elasticOut'
+          },
+          {
+            // 背景
+            type: 'pictorialBar',
+            animationDuration: 0,
+            symbolRepeat: 'fixed',
+            symbolMargin: '20%',
+            symbol: 'roundRect',
+            symbolSize: [6, barWidth],
+            itemStyle: {
+              color: 'transparent'
+            },
+            label: {
+              show: true,
+              position: 'right',
+              offset: [0, 2],
+              distance: 30,
+              textStyle: {
+                fontSize: 14,
+                fontFamily: 'Source Han Sans CN',
+                fontWeight: 500,
+                color: '#FEFFFF'
+              },
+              formatter: function (a, b) {
+                return `${a.value}万元`
+              }
+            },
+            data: xData,
+            z: 0,
+            animationEasing: 'elasticOut'
+          },
+          {
+            //分隔
+            type: 'pictorialBar',
+            itemStyle: {
+              color: '#000'
+            },
+            symbolRepeat: 'fixed',
+            symbolMargin: 4,
+            symbol: 'roundRect',
+            symbolClip: true,
+            symbolSize: [2, barWidth],
+            symbolPosition: 'start',
+            symbolOffset: [0, 0],
+            data: list,
+            z: 2,
+            animationEasing: 'elasticOut'
+          }
+        ]
+      }
+      this.creatChart(option, this.$refs.chart)
+    },
+    creatChart(option, ref) {
+      this.myChart = echarts.init(ref) //this.$refs.chart
+      this.myChart.resize()
+      this.myChart.setOption(option, {
+        notMerge: true
+      })
+    }
+  },
+  beforeDestroy() {
+    window.removeEventListener('resize', this.onResize)
+    this.destroyChart()
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.chart {
+  width: 100%;
+  height: 100%;
+}
+</style>

+ 4 - 2
src/views/groupPage/components/BatteryChart/ComBatteryChart.vue

@@ -45,7 +45,8 @@ export default {
       let option = {
         backgroundColor: 'transparent',
         title: {
-          show: true,
+          // show: true,
+          show: false,
           text: `累计利润:${profits}亿`,
           textStyle: {
             fontSize: this.$listeners.fontSize(14),
@@ -63,7 +64,8 @@ export default {
         xAxis: [{ show: false }, { show: false }],
         yAxis: [
           {
-            data: ['累计支出', '累计收入'],
+            // data: ['累计支出', '累计收入'],
+            data: ['累计对上结算', '累计对下结算'],
             inverse: true,
             show: false
           }

+ 24 - 20
src/views/groupPage/components/LineChart/ComLineChart.vue

@@ -117,9 +117,11 @@ export default {
           itemHeight: 10,
           textStyle: { color: '#82BAE2', fontSize: this.$listeners.fontSize(14) },
           data: [
-            { name: '收入', itemStyle: { color: 'black', borderColor: '#0092f6' } },
-            { name: '支出', itemStyle: { color: 'black', borderColor: '#CBB54C' } },
-            { name: '利润', itemStyle: { color: '#04BD88' } }
+            // { name: '收入', itemStyle: { color: 'black', borderColor: '#0092f6' } },
+            // { name: '支出', itemStyle: { color: 'black', borderColor: '#CBB54C' } },
+            // { name: '利润', itemStyle: { color: '#04BD88' } }
+            { name: '累计对上结算', itemStyle: { color: 'black', borderColor: '#0092f6' } },
+            { name: '累计对下结算', itemStyle: { color: 'black', borderColor: '#CBB54C' } }
           ]
         },
         xAxis: [
@@ -169,7 +171,8 @@ export default {
         ],
         series: [
           {
-            name: '收入',
+            name: '累计对上结算',
+            //  name: '收入',
             type: 'line',
             showAllSymbol: true,
             symbol: 'circle',
@@ -186,7 +189,8 @@ export default {
             data: incomeData
           },
           {
-            name: '支出',
+            name: '累计对下结算',
+            //  name: '支出',
             type: 'line',
             symbol: 'circle',
             symbolSize: 6,
@@ -200,22 +204,22 @@ export default {
               width: 2
             },
             data: spendingData
-          },
-          {
-            name: '利润',
-            type: 'bar',
-            barWidth: 14,
-            itemStyle: {
-              color: function (params) {
-                if (params.data >= 0) {
-                  return '#05AD7E'
-                } else {
-                  return '#E53031'
-                }
-              }
-            },
-            data: profitsData
           }
+          // {
+          //   name: '利润',
+          //   type: 'bar',
+          //   barWidth: 14,
+          //   itemStyle: {
+          //     color: function (params) {
+          //       if (params.data >= 0) {
+          //         return '#05AD7E'
+          //       } else {
+          //         return '#E53031'
+          //       }
+          //     }
+          //   },
+          //   data: profitsData
+          // }
         ]
       }
       this.creatChart(option, this.$refs.chart)

+ 102 - 0
src/views/groupPage/components/OthersChart/ComLiquidFillChart.vue

@@ -0,0 +1,102 @@
+<template>
+  <div class="LiquidFillChart" ref="chart"></div>
+</template>
+
+<script lang='ts'>
+import * as echarts from 'echarts'
+import 'echarts-liquidfill'
+import { Vue, Component, Prop, Watch } from 'vue-property-decorator'
+@Component({ name: 'LiquidFillChart', components: {} })
+export default class LiquidFillChart extends Vue {
+  @Prop({ type: Number, default: () => ({}) }) percent
+  @Watch('percent', { immediate: true })
+  onChangeMethod() {
+    this.$nextTick(() => {
+      this.initialChart()
+    })
+  }
+  myChart = null
+  destroyChart() {
+    if (this.myChart != null) {
+      this.myChart.dispose()
+      this.myChart = null
+    }
+  }
+  initialChart() {
+    this.destroyChart()
+    var value = this.percent
+    let option = {
+      backgroundColor: 'transparent',
+      series: [
+        {
+          type: 'liquidFill',
+          radius: '100%',
+          center: ['50%', '50%'],
+          color: [
+            {
+              type: 'linear',
+              x: 0,
+              y: 0,
+              x2: 0,
+              y2: 1,
+              colorStops: [
+                {
+                  offset: 0,
+                  color: '#446bf5'
+                },
+                {
+                  offset: 1,
+                  color: '#2ca3e2'
+                }
+              ],
+              globalCoord: false
+            }
+          ],
+          data: [value, value], // data个数代表波浪数
+          backgroundStyle: {
+            borderWidth: 1,
+            color: 'RGBA(51, 66, 127, 0.7)'
+          },
+          label: {
+            textStyle: {
+              fontSize: 18,
+              fontFamily: 'Alimama ShuHeiTi',
+              fontWeight: ' bold',
+              fontStyle: 'italic',
+              color: '#FFFFFF'
+            }
+          },
+          outline: {
+            // show: false
+            borderDistance: 0,
+            itemStyle: {
+              borderWidth: 2,
+              borderColor: '#112165'
+            }
+          }
+        }
+      ]
+    }
+
+    this.creatChart(option, this.$refs.chart)
+  }
+  creatChart(option, ref) {
+    this.myChart = echarts.init(ref) //this.$refs.chart
+    this.myChart.resize()
+    this.myChart.setOption(option, {
+      notMerge: true
+    })
+    //图表大小自适应
+    window.addEventListener('resize', () => {
+      this.myChart.resize()
+    })
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.LiquidFillChart {
+  height: 100%;
+  width: 100%;
+}
+</style>

+ 116 - 0
src/views/groupPage/components/PieChart/ComExpenseTypeChart.vue

@@ -0,0 +1,116 @@
+<template>
+  <div class="chart" ref="chart"></div>
+</template>
+
+<script>
+import * as echarts from 'echarts'
+export default {
+  name: 'ComProgressPieChart', //进度饼图
+  props: {
+    chartData: {}
+  },
+  data() {
+    return { myChart: null }
+  },
+  watch: {
+    chartData(val) {
+      this.$nextTick(() => {
+        this.initialChart()
+      })
+    }
+  },
+  mounted() {
+    //图表大小自适应
+    window.addEventListener('resize', this.onResize)
+  },
+  methods: {
+    destroyChart() {
+      if (this.myChart != null) {
+        this.myChart.dispose()
+        this.myChart = null
+      }
+    },
+    onResize() {
+      if (this.myChart) {
+        // this.myChart.resize()
+        this.initialChart()
+      }
+    },
+    initialChart() {
+      this.destroyChart()
+      let data = this.chartData
+      let pieData = []
+      data.forEach((item) => {
+        pieData.push({
+          ...item,
+          labelLine: {
+            show: true,
+            length: 30,
+            length2: 70
+          }
+        })
+      })
+      let option = {
+        series: [
+          {
+            type: 'pie',
+            radius: ['28%', '40%'],
+            center: ['50%', '50%'],
+            avoidLabelOverlap: true,
+            label: {
+              show: true,
+              formatter: '{a|{b}}\n{num|{c}万元}',
+              color: '#fff',
+              lineHeight: 20,
+              overflow: 'none',
+              padding: [0, -40],
+              rich: {
+                a: { color: '#99D0FE', align: 'left', fontSize: 14, fontFamily: 'Source Han Sans CN', fontWeight: 500 },
+                num: {
+                  color: ' #FEFFFF',
+                  align: 'left',
+                  fontSize: 14,
+                  fontWeight: 500,
+                  fontFamily: 'Source Han Sans CN'
+                }
+              }
+            },
+            data: pieData
+          }
+          //   {
+          //     type: 'pie',
+          //     radius: ['36%', '43%'],
+          //     center: ['50%', '50%'],
+          //     silent: true,
+          //     data: [
+          //       {
+          //         name: '',
+          //         value: 1
+          //       }
+          //     ]
+          //   }
+        ]
+      }
+      this.creatChart(option, this.$refs.chart)
+    },
+    creatChart(option, ref) {
+      this.myChart = echarts.init(ref) //this.$refs.chart
+      this.myChart.resize()
+      this.myChart.setOption(option, {
+        notMerge: true
+      })
+    }
+  },
+  beforeDestroy() {
+    window.removeEventListener('resize', this.onResize)
+    this.destroyChart()
+  }
+}
+</script>
+
+<style lang='scss' scoped>
+.chart {
+  height: 100%;
+  width: 100%;
+}
+</style>

+ 1 - 2
src/views/groupPage/districtPageModules/customTools/layerControl.vue

@@ -2,8 +2,7 @@
   <div class="widget-layerControl">
     <el-tabs v-model="activeName" @tab-click="tabClick">
       <el-tab-pane label="BIM模型" name="bimlayer">
-        <el-tree ref="baseTree" :data="BIMLayers" node-key="id" :props="defaultProps" @node-click="LocateToBIM">
-        </el-tree>
+        <el-tree ref="baseTree" :data="BIMLayers" :props="defaultProps" @node-click="LocateToBIM"> </el-tree>
       </el-tab-pane>
       <el-tab-pane label="基础图层" name="baselayer">
         <el-tree

+ 1 - 1
src/views/groupPage/districtPageModules/index.vue

@@ -94,7 +94,7 @@ export default class districtPageModules extends Vue {
   }
   @Watch('currentStatisticalActive')
   onChangeThisSta(val) {
-    if (val == 'security') this.setBottom('1.677083rem')
+    if (val == 'security' || val == 'invest') this.setBottom('1.677083rem')
     else this.setBottom('0.052083rem')
   }
   //关闭数据面板时,工具栏位置改变

+ 25 - 8
src/views/groupPage/districtPageModules/projectPanoramic/ProjectProgressNew.vue

@@ -31,7 +31,7 @@
           </div>
           <div class="content">
             <div class="chart-container">
-              <ComRightAngelPercentChart :value="0" />
+              <ComRightAngelPercentChart :value="investPercent" />
             </div>
             <div class="dataInfo">
               <div class="data-item" v-for="(item, index) of settleList" :key="item.name">
@@ -120,8 +120,8 @@
 
 <script lang="ts">
 import url from '../../images/base64/3dBaseBack'
-import { getRequestResult, getEpcBuilding, getWeekCountData } from '../../apis'
-import { setNullAndUndefinedEmpty, fontSize as fs } from '../../util'
+import { getRequestResult, getEpcBuilding, getWeekCountData, getEpcjstzgldetailList } from '../../apis'
+import { setNullAndUndefinedEmpty, fontSize as fs, roundFun } from '../../util'
 import { Vue, Component, Prop, Watch } from 'vue-property-decorator'
 import ComOneBatteryChart from '../../components/BatteryChart/ComOneBatteryChart.vue'
 import ComProgressChart from '../../components/BarChart/ComProgressChart.vue'
@@ -173,6 +173,7 @@ export default class ProjectProgress extends Vue {
   totalDevice: number = 0
   staffingList: Array<any> = []
   devicesList: Array<any> = []
+  investPercent: number = 0 //投资结算百分比
   get fontSize() {
     return fs
   }
@@ -189,7 +190,7 @@ export default class ProjectProgress extends Vue {
     this.staffingList = []
     this.devicesList = []
   }
-  @Watch('dataInfo')
+  @Watch('dataInfo', { immediate: true })
   onChangMehod() {
     this.getPageData()
   }
@@ -217,10 +218,26 @@ export default class ProjectProgress extends Vue {
       { name: '本年完成产值', value: +year_finish, unit: '万元' },
       { name: '年度产值计划', value: +year_plan, unit: '万元' }
     ]
-    this.settleList = [
-      { name: '本年投资计划', value: 0, unit: '万元' },
-      { name: '本年结算金额', value: 0, unit: '万元' }
-    ]
+    //获取投资以及结算信息
+    const res = await getEpcjstzgldetailList({ projectParentCode: this.projectCode })
+    if (res.code == 1 && res.result && res.result.length != 0) {
+      let investInfo = res.result[0],
+        amount = 0
+      const { invest_year_money } = investInfo
+      Object.keys(investInfo).forEach((key) => {
+        if (key.includes('_year') && key != 'invest_year_money') {
+          amount += +investInfo[key]
+        }
+      })
+      let investPlan = roundFun(invest_year_money, 2),
+        settleMoney = roundFun(amount, 2)
+      this.settleList = [
+        { name: '本年投资计划', value: investPlan, unit: '亿元' },
+        { name: '本年结算金额', value: settleMoney, unit: '万元' }
+      ]
+      this.investPercent = roundFun(settleMoney / 1000 / investPlan, 2)
+    }
+
     let staff = [],
       devices = []
     for (const key in wcd) {

+ 4 - 1
src/views/groupPage/districtPageModules/statisticalAnalysis/index.vue

@@ -8,6 +8,8 @@
     <QulityModule v-if="currentActive == 'quality'" />
     <!--安全模块-->
     <SecurityModule v-if="currentActive == 'security'" />
+    <!--投资模块-->
+    <InvestModule v-if="currentActive == 'invest'" />
   </div>
 </template>
 
@@ -17,11 +19,12 @@ import ThemeSwitch from './ThemeSwitch.vue'
 import ProgressModule from './progressModule/index.vue'
 import QulityModule from './qualityModule/index.vue'
 import SecurityModule from './securityModule/index.vue'
+import InvestModule from './investModule/index.vue'
 import { getStaticticalInfo } from '@/views/groupPage/apis'
 //统计分析模块
 @Component({
   name: 'statisticalAnalysis',
-  components: { ThemeSwitch, ProgressModule, QulityModule, SecurityModule }
+  components: { ThemeSwitch, ProgressModule, QulityModule, SecurityModule, InvestModule }
 })
 export default class statisticalAnalysis extends Vue {
   get currentActive() {

+ 106 - 0
src/views/groupPage/districtPageModules/statisticalAnalysis/investModule/ContractSettlement.vue

@@ -0,0 +1,106 @@
+<template>
+  <transition
+    appear
+    name="animate__animated animate__move"
+    enter-active-class="animate__fadeInUp"
+    leave-active-class="animate__fadeOutDown"
+  >
+    <div class="widget-ContractSettlement">
+      <div class="head">
+        <div class="title">
+          <div class="icon"></div>
+          <span class="site-info">合同结算</span>
+        </div>
+      </div>
+      <div class="content-info">
+        <ComContractBarChart :chartData="chartData" />
+      </div>
+    </div>
+  </transition>
+</template>
+
+<script lang="ts">
+import { Vue, Component, Prop, Watch } from 'vue-property-decorator'
+import { getRequestResult, getSafetyPatrolCountData } from '../../../apis'
+import ComContractBarChart from '@/views/groupPage/components/BarChart/ComContractBarChart.vue'
+import { getEpcjsyddetailList } from '../../../apis'
+import { roundFun } from '@/views/groupPage/util'
+//合同结算
+@Component({ name: 'ContractSettlement', components: { ComContractBarChart } })
+export default class ContractSettlement extends Vue {
+  chartData = null
+  get projectCode() {
+    return this.$store.state.bigScreen.currentProjectCode
+  }
+  mounted() {
+    this.getData()
+  }
+  async getData() {
+    const res = await getEpcjsyddetailList({ dataOwner: this.projectCode })
+    if (res.code == 1 && res.result && res.result.length != 0) {
+      let xData = [],
+        seriesData = []
+      res.result.forEach((item) => {
+        const { yearMonth, cost_month_count } = item
+        xData.unshift(yearMonth)
+        seriesData.unshift(roundFun(cost_month_count, 2))
+      })
+      this.chartData = { xData, seriesData }
+    }
+  }
+}
+</script>
+
+<style lang='scss' scoped>
+.animate__fadeInUp,
+.animate__fadeOutDown {
+  animation-duration: 3s; //动画持续时间
+  animation-delay: 0s; //动画延迟时间
+}
+.widget-ContractSettlement {
+  background-color: #000;
+  bottom: 0.052083rem /* 10/192 */;
+  left: 50%;
+  margin-left: -2.645833rem /* 508/192 */;
+  height: 1.572917rem /* 302/192 */;
+  width: 5.291667rem /* 1016/192 */;
+  position: absolute;
+  font-family: Source Han Sans CN;
+  .head {
+    height: 0.166667rem /* 32/192 */;
+    width: 100%;
+    background: linear-gradient(-90deg, rgba(43, 167, 255, 0.2) 0%, rgba(43, 167, 255, 0.08) 100%);
+    font-family: Source Han Sans CN-HEAVY;
+    .title {
+      width: 100%;
+      height: 100%;
+      display: flex;
+      font-weight: 400;
+      align-items: center;
+      .icon {
+        height: 0.166667rem /* 32/192 */;
+        width: 0.34375rem /* 66/192 */;
+        background: url('~@/views/groupPage/images/模块图标/统计分析/结算.png') no-repeat center center;
+        background-size: 100% 100%;
+      }
+      span {
+        flex: 1;
+        font-weight: bold;
+        font-size: 0.083333rem /* 16/192 */;
+        color: #ffffff;
+        padding: 0.041667rem /* 8/192 */;
+        background: linear-gradient(0deg, #9bd2fa 0%, #ffffff 100%);
+        background-clip: text;
+        -webkit-text-fill-color: transparent;
+      }
+    }
+  }
+  .content-info {
+    width: 100%;
+    height: calc(100% - 0.166667rem);
+    display: inline-block;
+    background: linear-gradient(0deg, rgba(14, 167, 255, 0.238) 0%, rgba(14, 167, 255, 0) 100%);
+    font-family: Source Han Sans CN;
+  }
+}
+</style>

+ 344 - 0
src/views/groupPage/districtPageModules/statisticalAnalysis/investModule/ContractStatistics.vue

@@ -0,0 +1,344 @@
+<template>
+  <transition
+    appear
+    name="animate__animated animate__move"
+    enter-active-class="animate__slideInLeft"
+    leave-active-class="animate__slideOutLeft"
+  >
+    <div class="widget-ContractStatistics">
+      <div class="head">
+        <div class="title">
+          <div class="icon"></div>
+          <span class="site-info">合同结算统计</span>
+        </div>
+      </div>
+      <div class="content-info">
+        <!--  -->
+        <div class="accumulated-content">
+          <div class="icon-content">
+            <img :src="require('@/views/groupPage/images/模块图标/统计分析/累计图标.png')" />
+          </div>
+          <div class="amount-content">
+            <span>{{ totalSettleAmount }}万元</span>
+            <span>累计结算金额</span>
+          </div>
+        </div>
+        <!--  -->
+        <div class="investment-content">
+          <div class="ic-top">
+            <span>年度投资计划:</span>
+            <span>{{ investYearMoney }}亿元</span>
+          </div>
+          <div class="ic-splitLine"></div>
+          <div class="ic-bottom">
+            <div class="icb-left">
+              <span>{{ settleYearMoney }}万元</span>
+              <span>年度累积结算</span>
+            </div>
+            <div class="icb-arrow"></div>
+            <div class="icb-right">
+              <ComLiquidFillChart :percent="percent" />
+            </div>
+          </div>
+        </div>
+        <!--  -->
+        <div class="transitstatus-content">
+          <span>在途结算金额:</span>
+          <span>{{ transitstatusMoney }}万元</span>
+        </div>
+        <!--  -->
+        <div class="chart-content">
+          <ComSettlementChart :chartData="chartData" />
+        </div>
+      </div>
+    </div>
+  </transition>
+</template>
+
+<script lang="ts">
+import { Vue, Component, Prop, Watch } from 'vue-property-decorator'
+import ComLiquidFillChart from '../../../components/OthersChart/ComLiquidFillChart.vue'
+import ComSettlementChart from '../../../components/BarChart/ComSettlementChart.vue'
+import { getRequestResult, getDangerCheckCountData } from '../../../apis'
+import { roundFun } from '@/views/groupPage/util'
+const legendNameList = [
+  { key: 'lx_cost', name: '建设期利息' },
+  { key: 'one_cost', name: '一类费用' },
+  { key: 'two_cost', name: '二类费用' },
+  { key: 'rest_cost', name: '存量' },
+  { key: 'yunwei_cost', name: '运维' },
+  { key: 'unique_cost', name: '专项费用' },
+  { key: 'ready_cost', name: '预备费用' }
+]
+//合同结算统计
+@Component({
+  name: 'ContractStatistics',
+  components: { ComLiquidFillChart, ComSettlementChart }
+})
+export default class ContractStatistics extends Vue {
+  @Prop({ type: Array, default: () => {} }) dataInfo!: any
+  totalSettleAmount = 0 //累计结算金额
+  investYearMoney = 0 //年度投资计划
+  settleYearMoney = 0 //年度累计结算
+  transitstatusMoney = 0 //在途结算金额
+  percent = 0 //累计结算百分比
+  chartData = null
+  @Watch('dataInfo')
+  onChangMehod() {
+    this.getData()
+  }
+  getData() {
+    const investInfo = this.dataInfo[0]
+    const { invest_year_money, on_load_cost } = investInfo || {}
+    this.investYearMoney = roundFun(invest_year_money, 2)
+    this.transitstatusMoney = roundFun(on_load_cost, 2)
+    let amount = 0,
+      totalAmount = 0,
+      amountArr = [],
+      totalAmountArr = []
+    this.chartData = null
+    Object.keys(investInfo).forEach((key) => {
+      if (key.includes('_year') && key != 'invest_year_money') {
+        amount += +investInfo[key]
+        amountArr.push({ type: key.substring(0, key.lastIndexOf('_')), value: roundFun(investInfo[key], 2) })
+      }
+      if (key.includes('_all')) {
+        totalAmount += +investInfo[key]
+        totalAmountArr.push({ type: key.substring(0, key.lastIndexOf('_')), value: roundFun(investInfo[key], 2) })
+      }
+    })
+    this.settleYearMoney = roundFun(amount, 2)
+    this.totalSettleAmount = roundFun(totalAmount, 2)
+    this.percent = roundFun(this.settleYearMoney / 1000 / this.investYearMoney, 2)
+    //
+    let legendData = [],
+      totalSta = [],
+      annualSta = []
+    amountArr.forEach((item) => {
+      legendData.push(this.getLegnedName(item.type))
+      annualSta.push(item.value)
+      totalSta.push(totalAmountArr.find((i) => i.type == item.type).value || 0)
+    })
+    this.chartData = {
+      legendData,
+      totalSta,
+      annualSta
+    }
+  }
+  getLegnedName(key) {
+    return legendNameList.find((i) => i.key == key).name || '暂无名称'
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.animate__slideInLeft,
+.animate__slideOutLeft {
+  animation-duration: 3s; //动画持续时间
+  animation-delay: 0s; //动画延迟时间
+}
+.widget-ContractStatistics {
+  z-index: 2;
+  //position
+  top: 0.505208rem /* 97/192 */;
+  margin-left: $size20 /* 20/192 */;
+  position: absolute;
+  //size
+  height: calc(100% - 0.557292rem /* 107/192 */);
+  width: 2.083333rem /* 400/192 */;
+  .head {
+    height: 0.166667rem /* 32/192 */;
+    width: 100%;
+    background: linear-gradient(-90deg, rgba(43, 167, 255, 0.2) 0%, rgba(43, 167, 255, 0.08) 100%);
+    font-family: Source Han Sans CN-HEAVY;
+    .title {
+      width: 100%;
+      height: 100%;
+      display: flex;
+      font-weight: 400;
+      align-items: center;
+      .icon {
+        height: 0.166667rem /* 32/192 */;
+        width: 0.34375rem /* 66/192 */;
+        background: url('~@/views/groupPage/images/模块图标/统计分析/合同.png') no-repeat center center;
+        background-size: 100% 100%;
+      }
+      span {
+        flex: 1;
+        font-weight: bold;
+        font-size: 0.083333rem /* 16/192 */;
+        color: #ffffff;
+        padding: 0.041667rem /* 8/192 */;
+        background: linear-gradient(0deg, #9bd2fa 0%, #ffffff 100%);
+        background-clip: text;
+        -webkit-text-fill-color: transparent;
+      }
+    }
+  }
+  .content-info {
+    width: 100%;
+    height: calc(100% - 0.166667rem);
+    display: inline-block;
+    font-family: Source Han Sans CN;
+    background: linear-gradient(0deg, rgba(14, 167, 255, 0.16) 0%, rgba(14, 167, 255, 0.02) 100%);
+    padding: 0.052083rem /* 10/192 */;
+    @mixin center() {
+      display: flex;
+      justify-content: center;
+      align-items: center;
+    }
+    .accumulated-content {
+      width: 100%;
+      height: 0.59375rem /* 114/192 */;
+      background: rgba(6, 34, 57, 0.9);
+      display: flex;
+      .icon-content {
+        height: 100%;
+        width: 50%;
+        @include center();
+        img {
+          height: 0.427083rem /* 82/192 */;
+          width: 0.338542rem /* 65/192 */;
+        }
+      }
+      .amount-content {
+        height: 100%;
+        width: 50%;
+        @include center();
+        flex-flow: column;
+        margin-left: -0.15625rem /* 30/192 */;
+        & > span:first-child {
+          font-size: 0.125rem /* 24/192 */;
+          font-family: Alimama ShuHeiTi;
+          font-weight: bold;
+          font-style: italic;
+          color: #ffffff;
+          background: linear-gradient(0deg, #1483ff 0%, #ebd674 100%);
+          background-clip: text;
+          -webkit-text-fill-color: transparent;
+          margin-bottom: 0.067708rem /* 13/192 */;
+          white-space: nowrap;
+          overflow: hidden;
+          text-overflow: ellipsis;
+        }
+        span {
+          display: inline-block;
+          width: 100%;
+          font-size: 0.09375rem /* 18/192 */;
+          font-family: Source Han Sans CN;
+          font-weight: 400;
+          color: #ffffff;
+        }
+      }
+    }
+    .investment-content {
+      margin-top: 0.052083rem /* 10/192 */;
+      width: 100%;
+      height: 0.697917rem /* 134/192 */;
+      background: rgba(6, 34, 57, 0.9);
+      display: flex;
+      flex-flow: column;
+      padding: 0.078125rem /* 15/192 */;
+      .ic-top {
+        @include center();
+        width: 100%;
+        position: relative;
+        justify-content: space-evenly;
+        span {
+          font-size: 0.09375rem /* 18/192 */;
+          font-family: Source Han Sans CN;
+          font-weight: 400;
+          color: #ffffff;
+        }
+        & > span:last-child {
+          font-size: 0.125rem /* 24/192 */;
+          font-family: Alimama ShuHeiTi;
+          font-weight: bold;
+          font-style: italic;
+          color: #ffffff;
+          background: linear-gradient(0deg, #146cff 0%, #01eaff 100%);
+          background-clip: text;
+          -webkit-text-fill-color: transparent;
+        }
+      }
+      .ic-splitLine {
+        margin: 0.078125rem /* 15/192 */ 0;
+        width: 100%;
+        height: 0.005208rem /* 1/192 */;
+        background-image: radial-gradient(rgba(1, 231, 255, 0.9), rgba(1, 231, 255, 0.1), rgba(1, 231, 255, 0));
+      }
+      .ic-bottom {
+        height: calc(100% - 0.286458rem /* 55/192 */);
+        width: 100%;
+        @include center();
+        .icb-left {
+          display: flex;
+          flex-flow: column;
+          height: 100%;
+          justify-content: space-between;
+          & > span:first-child {
+            font-size: 0.125rem /* 24/192 */;
+            font-family: Alimama ShuHeiTi;
+            font-weight: bold;
+            font-style: italic;
+            color: #ffffff;
+            background: linear-gradient(0deg, #1483ff 0%, #01f0ff 100%);
+            background-clip: text;
+            -webkit-text-fill-color: transparent;
+          }
+          span {
+            font-size: 0.09375rem /* 18/192 */;
+            font-family: Source Han Sans CN;
+            font-weight: 400;
+            color: #ffffff;
+          }
+        }
+        .icb-arrow {
+          height: 0.072917rem /* 14/192 */;
+          width: 0.234375rem /* 45/192 */;
+          background: url('~@/views/groupPage/images/模块图标/统计分析/指向.png') no-repeat center center;
+          background-size: 100% 100%;
+          margin: 0 0.104167rem /* 20/192 */;
+        }
+        .icb-right {
+          width: 0.302083rem /* 58/192 */;
+          height: 100%;
+        }
+      }
+    }
+    .transitstatus-content {
+      margin-top: 0.052083rem /* 10/192 */;
+      width: 100%;
+      height: 0.333333rem /* 64/192 */;
+      background: rgba(6, 34, 57, 0.9);
+      padding: 0.07813rem;
+      @include center();
+      justify-content: space-evenly;
+      & > span:first-child {
+        font-size: 0.09375rem /* 18/192 */;
+        font-family: Source Han Sans CN;
+        font-weight: 400;
+        color: #ffffff;
+      }
+      & > span:last-child {
+        height: 22px;
+        display: inline-block;
+        font-size: 24px;
+        font-family: Alimama ShuHeiTi;
+        font-weight: bold;
+        font-style: italic;
+        color: #ffffff;
+
+        background: linear-gradient(0deg, #146cff 0%, #01eaff 100%);
+        background-clip: text;
+        -webkit-text-fill-color: transparent;
+      }
+    }
+    .chart-content {
+      margin-top: 0.052083rem /* 10/192 */;
+      height: calc(100% - 1.78125rem /* 342/192 */);
+      width: 100%;
+    }
+  }
+}
+</style>

+ 242 - 0
src/views/groupPage/districtPageModules/statisticalAnalysis/investModule/MonthlyStatistics.vue

@@ -0,0 +1,242 @@
+<template>
+  <transition
+    appear
+    name="animate__animated animate__move"
+    enter-active-class="animate__slideInRight"
+    leave-active-class="animate__slideOutRight"
+  >
+    <div class="widget-MonthlyStatistics">
+      <div class="head">
+        <div class="title">
+          <div class="icon"></div>
+          <span class="site-info">月度投资结算统计</span>
+          <!-- <div class="dateRange">{{ beginTime }}~{{ endTime }}</div> -->
+          <div class="dateRange">{{ currentTime }}</div>
+        </div>
+      </div>
+      <div class="content-info">
+        <!--  -->
+        <div class="totalSettlement-content">
+          <div class="icon-content">
+            <img :src="require('@/views/groupPage/images/模块图标/统计分析/本月图标.png')" />
+          </div>
+          <div class="amount-content">
+            <span>{{ totalMoney }}万元</span>
+            <span>本月结算合计</span>
+          </div>
+        </div>
+        <!--  -->
+        <div class="barchart-content">
+          <ComSplitBarChart :chartData="chartData" />
+        </div>
+        <!--  -->
+        <div class="piechart-content">
+          <div class="title">
+            <div class="icon"></div>
+            <span class="item-name">各类型费用饼图统计</span>
+          </div>
+          <div class="pc-chartContent">
+            <ComExpenseTypeChart :chartData="chartData" />
+          </div>
+        </div>
+      </div>
+    </div>
+  </transition>
+</template>
+
+<script lang="ts">
+import moment from 'moment'
+import { Vue, Component, Prop, Watch } from 'vue-property-decorator'
+import { getImgFiles, getEpcQbsDetailPage } from '../../../apis'
+import request from '@/utils/request'
+import ComSplitBarChart from '@/views/groupPage/components/BarChart/ComSplitBarChart.vue'
+import ComExpenseTypeChart from '@/views/groupPage/components/PieChart/ComExpenseTypeChart.vue'
+const legendNameList = [
+  { key: 'lx_cost', name: '建设期利息' },
+  { key: 'one_cost', name: '一类费用' },
+  { key: 'two_cost', name: '二类费用' },
+  { key: 'rest_cost', name: '存量' },
+  { key: 'yunwei_cost', name: '运维' },
+  { key: 'unique_cost', name: '专项费用' },
+  { key: 'ready_cost', name: '预备费用' }
+]
+//月度投资结算统计
+@Component({
+  name: 'MonthlyStatistics',
+  components: { ComSplitBarChart, ComExpenseTypeChart }
+})
+export default class MonthlyStatistics extends Vue {
+  @Prop({ type: Array, default: () => {} }) dataInfo!: any
+  beginTime = moment(new Date().setDate(new Date().getDate() - 6)).format('YYYY.MM.DD')
+  endTime = moment(new Date()).format('YYYY.MM.DD')
+  currentTime = moment(new Date()).format('YYYY年MM月')
+
+  chartData = null
+  totalMoney = 0
+  get projectCode() {
+    return this.$store.state.bigScreen.currentProjectCode
+  }
+  @Watch('dataInfo')
+  onChangMehod() {
+    this.getData()
+  }
+  getData() {
+    const investInfo = this.dataInfo[0]
+    let infoData = [],
+      amount = 0
+    Object.keys(investInfo).forEach((key) => {
+      if (key.includes('_month')) {
+        infoData.push({
+          name: (legendNameList.find((i) => i.key == key.substring(0, key.lastIndexOf('_'))) || {}).name,
+          value: investInfo[key]
+        })
+        amount += +investInfo[key]
+      }
+    })
+    this.totalMoney = amount
+    this.chartData = infoData
+  }
+}
+</script>
+
+<style lang='scss' scoped>
+.animate__slideInRight,
+.animate__slideOutRight {
+  animation-duration: 3s; //动画持续时间
+  animation-delay: 0s; //动画延迟时间
+}
+.widget-MonthlyStatistics {
+  z-index: 2;
+  //position
+  bottom: $size10 /* 10/192 */;
+  margin-right: $size20 /* 20/192 */;
+  right: 0;
+  position: absolute;
+  //size
+  height: calc(100% - 0.557292rem /* 107/192 */);
+  width: 2.083333rem /* 400/192 */;
+  .head {
+    height: 0.166667rem /* 32/192 */;
+    width: 100%;
+    background: linear-gradient(-90deg, rgba(43, 167, 255, 0.2) 0%, rgba(43, 167, 255, 0.08) 100%);
+    font-family: Source Han Sans CN-HEAVY;
+    .title {
+      width: 100%;
+      height: 100%;
+      display: flex;
+      font-weight: 400;
+      align-items: center;
+      .icon {
+        height: 0.166667rem /* 32/192 */;
+        width: 0.34375rem /* 66/192 */;
+        background: url('~@/views/groupPage/images/模块图标/统计分析/投资结算.png') no-repeat center center;
+        background-size: 100% 100%;
+      }
+      span {
+        flex: 1;
+        font-weight: bold;
+        font-size: 0.083333rem /* 16/192 */;
+        color: #ffffff;
+        padding: 0.041667rem /* 8/192 */;
+        background: linear-gradient(0deg, #9bd2fa 0%, #ffffff 100%);
+        background-clip: text;
+        -webkit-text-fill-color: transparent;
+      }
+      .dateRange {
+        height: 0.0625rem /* 12/192 */;
+        font-size: 0.072917rem /* 14/192 */;
+        font-family: Source Han Sans CN;
+        font-weight: 400;
+        color: #ffffff;
+        margin-right: 0.052083rem; /* 10/192 */
+      }
+    }
+  }
+  .content-info {
+    width: 100%;
+    height: calc(100% - 0.166667rem);
+    font-family: Source Han Sans CN;
+    background: linear-gradient(0deg, rgba(14, 167, 255, 0.16) 0%, rgba(14, 167, 255, 0.02) 100%);
+    padding: 0.052083rem /* 10/192 */;
+    @mixin center() {
+      display: flex;
+      justify-content: center;
+      align-items: center;
+    }
+    .title {
+      width: 100%;
+      display: flex;
+      align-items: center;
+      .icon {
+        height: 0.072917rem /* 14/192 */;
+        width: 0.078125rem /* 15/192 */;
+        margin-right: 0.046875rem /* 9/192 */;
+        background: url('~@/views/groupPage/images/三角.png') no-repeat center center;
+        background-size: 100% 100%;
+      }
+      .item-name {
+        font-family: Source Han Sans CN;
+        color: #0ea7ff;
+        font-size: 0.072917rem /* 14/192 */;
+        font-weight: 500;
+      }
+    }
+    .totalSettlement-content {
+      width: 100%;
+      height: 0.59375rem /* 114/192 */;
+      background: rgba(6, 34, 57, 0.9);
+      display: flex;
+      .icon-content {
+        height: 100%;
+        width: 50%;
+        @include center();
+        img {
+          height: 0.427083rem /* 82/192 */;
+          width: 0.338542rem /* 65/192 */;
+        }
+      }
+      .amount-content {
+        height: 100%;
+        width: 50%;
+        @include center();
+        flex-flow: column;
+        margin-left: -0.15625rem /* 30/192 */;
+        & > span:first-child {
+          font-size: 0.125rem /* 24/192 */;
+          font-family: Alimama ShuHeiTi;
+          font-weight: bold;
+          font-style: italic;
+          color: #ffffff;
+          background: linear-gradient(0deg, #1483ff 0%, #ebd674 100%);
+          background-clip: text;
+          -webkit-text-fill-color: transparent;
+          margin-bottom: 0.067708rem /* 13/192 */;
+        }
+        span {
+          display: inline-block;
+          width: 100%;
+          font-size: 0.09375rem /* 18/192 */;
+          font-family: Source Han Sans CN;
+          font-weight: 400;
+          color: #ffffff;
+        }
+      }
+    }
+    .barchart-content {
+      margin-top: 0.104167rem /* 20/192 */;
+      width: 100%;
+      height: calc(100% - 2.416667rem /* 464/192 */);
+      overflow: auto;
+    }
+    .piechart-content {
+      margin-top: 0.052083rem /* 10/192 */;
+      width: 100%;
+      height: 1.666667rem /* 320/192 */;
+      .pc-chartContent {
+        width: 100%;
+        height: calc(100% - 0.072917rem /* 14/192 */);
+      }
+    }
+  }
+}
+</style>

+ 40 - 0
src/views/groupPage/districtPageModules/statisticalAnalysis/investModule/index.vue

@@ -0,0 +1,40 @@
+<template>
+  <div class="widget-investModule">
+    <!-- 合同结算统计 -->
+    <ContractStatistics :dataInfo="dataInfo" />
+    <!-- 月度投资结算统计 -->
+    <MonthlyStatistics :dataInfo="dataInfo" />
+    <!-- 合同结算 -->
+    <ContractSettlement />
+  </div>
+</template>
+
+<script lang="ts">
+import { Vue, Component, Prop } from 'vue-property-decorator'
+import ContractSettlement from './ContractSettlement.vue'
+import ContractStatistics from './ContractStatistics.vue'
+import MonthlyStatistics from './MonthlyStatistics.vue'
+import { getEpcjstzgldetailList } from '../../../apis'
+//统计分析-投资模块
+@Component({
+  name: 'investModule',
+  components: { ContractStatistics, MonthlyStatistics, ContractSettlement }
+})
+export default class investModule extends Vue {
+  dataInfo = null
+  get projectCode() {
+    return this.$store.state.bigScreen.currentProjectCode
+  }
+  mounted() {
+    this.getData()
+  }
+  async getData() {
+    const res = await getEpcjstzgldetailList({ projectParentCode: this.projectCode })
+    if (res.code == 1 && res.result && res.result.length != 0) {
+      this.dataInfo = res.result
+    }
+  }
+}
+</script>
+
+<style></style>

+ 11 - 4
src/views/groupPage/districtPageModules/statisticalAnalysis/securityModule/InspectionsNum.vue

@@ -2,9 +2,11 @@
   <transition
     appear
     name="animate__animated animate__move"
-    enter-active-class="animate__zoomIn"
-    leave-active-class="animate__zoomOut"
+    enter-active-class="animate__fadeInUp"
+    leave-active-class="animate__fadeOutDown"
   >
+    <!--     enter-active-class="animate__zoomIn"
+    leave-active-class="animate__zoomOut" -->
     <div class="widget-InspectionsNum">
       <div class="head">
         <div class="title">
@@ -80,8 +82,13 @@ export default class InspectionsNum extends Vue {
 </script>
 
 <style lang='scss' scoped>
-.animate__zoomIn,
-.animate__zoomOut {
+// .animate__zoomIn,
+// .animate__zoomOut {
+//   animation-duration: 3s; //动画持续时间
+//   animation-delay: 0s; //动画延迟时间
+// }
+.animate__fadeInUp,
+.animate__fadeOutDown {
   animation-duration: 3s; //动画持续时间
   animation-delay: 0s; //动画延迟时间
 }

+ 124 - 30
src/views/groupPage/districtPageModules/statisticalAnalysis/securityModule/RiskAndSecurityNew.vue

@@ -32,29 +32,45 @@
         </div>
         <div class="rectificationStatistic">
           <div class="title">
-            <div class="icon"></div>
-            <span class="item-name">近7天隐患创建情况</span>
+            <div style="display: flex; align-items: center">
+              <div class="icon"></div>
+              <span class="item-name">近7天隐患创建情况</span>
+            </div>
+            <div class="dateRange">{{ beginTime }}~{{ endTime }}</div>
           </div>
           <div class="rsChart">
             <RiskTypeChart :chartData="chartData" />
           </div>
         </div>
         <!---->
-        <div class="riskContent">
-          <div class="risk-item" v-for="(item, index) in [0, 1, 2, 3]" :key="index">
+        <div class="riskContent" ref="scrollContent">
+          <div class="risk-item" v-for="(item, index) in riskInfoList" :key="index">
             <div class="risk-title">
               <div class="type-name">
-                <span :style="{ border: '1px solid #ff2828', color: '#ff2828' }">重大</span>
-                <span>安全防护</span>
+                <span
+                  :style="{
+                    border: `1px solid ${getColor(item.risk_level.substring(0, 2)).color}`,
+                    color: `${getColor(item.risk_level.substring(0, 2)).color}`
+                  }"
+                  >{{ item.risk_level.substring(0, 2) }}</span
+                >
+                <span>{{ item.type_name }}</span>
               </div>
               <div class="time-status">
-                <span>2023/4/22 16:32:19</span>
-                <span>待整改</span>
+                <span>{{ item.create_time }}</span>
+                <span
+                  :style="{
+                    background: `linear-gradient(90deg, ${getStatusColor(item.risk_status).color0}, ${
+                      getStatusColor(item.risk_status).color1
+                    })`
+                  }"
+                  >{{ item.risk_status }}</span
+                >
               </div>
             </div>
             <div class="risk-content">
-              <span>珠海路WZH1a</span>
-              <span>未按标准佩戴安全帽未按标准佩戴安全帽未按标准佩戴安全帽 未按标准佩戴安全帽</span>
+              <span>{{ item.coordinate }}</span>
+              <span>{{ item.description }}</span>
             </div>
           </div>
         </div>
@@ -88,6 +104,9 @@ export default class RiskAndSecurityNew extends Vue {
     { level: '高风险作业', lastMonth: 22, past6Months: 50 }
   ]
   rcList = []
+  hasScroll = false
+  timerId = null
+  riskInfoList = []
   get projectCode() {
     return this.$store.state.bigScreen.currentProjectCode
   }
@@ -123,20 +142,94 @@ export default class RiskAndSecurityNew extends Vue {
     this.rcList = res.find((e) => e.indexCode == projectCode + '-' + 151).indexValue.split('/')
 
     const interfaceResult = await getDangerCheckSevenDayData({ code: this.projectCode })
-    console.log('近7天隐患上报和隐患整改数量统计', interfaceResult)
+    const { hiddenEcharts, hiddenDangerChecks } = interfaceResult.result || {}
+    let { xaxis, seriesDatas } = hiddenEcharts || {}
+    xaxis.sort((a, b) => {
+      return a.localeCompare(b)
+    })
+    seriesDatas = seriesDatas.map((item) => {
+      return { ...item, seriesData: item.seriesData.reverse() }
+    })
     this.chartData = {
-      xData: ['05/01', '05/02', '05/03', '05/04', '05/05', '05/06', '05/07'],
-      levelOne: [11, 12, 31, 42, 54, 62, 77],
-      levelTwo: [41, 22, 37, 45, 33, 38, 17],
-      levelThree: [31, 52, 23, 34, 65, 46, 87]
+      xData: xaxis,
+      levelOne: (seriesDatas.find((i) => i.name.includes('轻微')) || {}).seriesData,
+      levelTwo: (seriesDatas.find((i) => i.name.includes('重要')) || {}).seriesData,
+      levelThree: (seriesDatas.find((i) => i.name.includes('重大')) || {}).seriesData
+    }
+    this.riskInfoList = hiddenDangerChecks
+    if (this.riskInfoList.length != 0) {
+      this.tableScroll()
     }
     //
-    const WeekCountData = await getWeekCountData({ code: this.projectCode })
-    if (!WeekCountData.result) return
-    const { safety_content, start_date, end_date } = WeekCountData.result || {}
-    this.weeklySafetyReport = safety_content
-    // this.beginTime = start_date.split(' ')[0]
-    // this.endTime = end_date.split(' ')[0]
+  }
+  tableScroll() {
+    const that = this
+    const area = this.$refs.scrollContent as any
+    // 拿到元素后,对元素进行定时增加距离顶部距离,实现滚动效果(此配置为每100毫秒移动1像素)
+    area.scrollTop = 0
+    function scrollUp() {
+      if (area.scrollTop >= area.scrollHeight - area.offsetHeight) {
+        area.scrollTop = 0
+      } else {
+        const ratio = parseFloat((1 / window.devicePixelRatio).toFixed(2)) + 0.01 // + 0.01 为了保证 ratio >= 1
+        area.scrollTop = area.scrollTop + ratio
+      }
+    }
+    if (!this.hasScroll) {
+      this.hasScroll = true
+      let time = 50
+      this.setAnimationFrame(scrollUp, time)
+      area.onmouseover = function () {
+        cancelAnimationFrame(that.timerId)
+      }
+      area.onmouseout = function () {
+        that.setAnimationFrame(scrollUp, time)
+      }
+    }
+  }
+  //使用requestAnimationFrame重写setInterval,进行性能优化
+  setAnimationFrame(render, time) {
+    //当前执行时间
+    var nowTime = 0
+    //记录每次动画执行结束的时间
+    var lastTime = Date.now()
+    //我们自己定义的动画时间差值
+    var diffTime = time
+    //当前requestAnimationFrame的id
+    //此处使用对象,对象存储在地址空间,函数内部更新了对象的值,函数外部也可以接收到
+    var that = this
+    function animloop() {
+      //记录当前时间
+      nowTime = Date.now()
+      if (nowTime - lastTime > diffTime) {
+        lastTime = nowTime
+        render()
+      }
+      //timerid为数字
+      that.timerId = requestAnimationFrame(animloop)
+    }
+    animloop()
+  }
+  getColor(type) {
+    const typeList = [
+      { type: '重大', color: '#FF2828' },
+      { type: '重要', color: '#E6C14D' },
+      { type: '轻微', color: '#13E3F0' }
+    ]
+    return typeList.find((i) => i.type == type) || { color: '#13E3F0' }
+  }
+  getStatusColor(status) {
+    const typeList = [
+      { status: '待整改', color0: '#dc8310', color1: '#d99032' },
+      { status: '已关闭', color0: '#03A25D ', color1: '#21CB7D ' },
+      { status: '待闭合', color0: '#761BDD', color1: '#9C42E8' }
+    ]
+    return typeList.find((i) => i.status == status) || { color0: '#dc8310', color1: '#d99032' }
+  }
+  beforeDestroy() {
+    if (this.timerId) {
+      cancelAnimationFrame(this.timerId)
+    }
   }
 }
 </script>
@@ -184,15 +277,15 @@ export default class RiskAndSecurityNew extends Vue {
         background-clip: text;
         -webkit-text-fill-color: transparent;
       }
-      .dateRange {
-        height: 0.0625rem /* 12/192 */;
-        font-size: 0.072917rem /* 14/192 */;
-        font-family: Source Han Sans CN;
-        font-weight: 400;
-        color: #ffffff;
-      }
     }
   }
+  .dateRange {
+    height: 0.0625rem /* 12/192 */;
+    font-size: 0.072917rem /* 14/192 */;
+    font-family: Source Han Sans CN;
+    font-weight: 400;
+    color: #ffffff;
+  }
   .content-info {
     width: 100%;
     height: calc(100% - 0.166667rem);
@@ -203,6 +296,7 @@ export default class RiskAndSecurityNew extends Vue {
       width: 100%;
       display: flex;
       align-items: center;
+      justify-content: space-between;
       .icon {
         height: 0.072917rem /* 14/192 */;
         width: 0.078125rem /* 15/192 */;
@@ -277,7 +371,7 @@ export default class RiskAndSecurityNew extends Vue {
       width: 100%;
       height: calc(100% - 2.385417rem /* 458/192 */);
       padding: 0.052083rem /* 10/192 */;
-      overflow: auto;
+      overflow: hidden;
       .risk-item {
         width: 100%;
         height: 0.520833rem /* 100/192 */;
@@ -320,7 +414,7 @@ export default class RiskAndSecurityNew extends Vue {
               display: inline-block;
               width: 0.260417rem /* 50/192 */;
               height: 0.104167rem /* 20/192 */;
-              background: linear-gradient(90deg, #dc8310, #d99032);
+              // background: linear-gradient(90deg, #dc8310, #d99032);
               border-radius: 0.010417rem /* 2/192 */;
               font-size: 0.072917rem /* 14/192 */;
               font-family: Source Han Sans CN;

+ 5 - 4
src/views/groupPage/districtPageModules/statisticalAnalysis/securityModule/StatisticalRisk.vue

@@ -50,7 +50,7 @@
             <span class="item-name">隐患类型排行榜</span>
           </div>
           <div class="content">
-            <ComRankingBarChart />
+            <ComRankingBarChart :chartData="rankingBarChartData" />
           </div>
         </div>
       </div>
@@ -79,6 +79,7 @@ export default class StatisticalRisk extends Vue {
     { title: '整改中', num: 3 },
     { title: '已整改', num: 3 }
   ]
+  rankingBarChartData = null
   get projectCode() {
     return this.$store.state.bigScreen.currentProjectCode
   }
@@ -123,9 +124,8 @@ export default class StatisticalRisk extends Vue {
     // })
     const DangerCheckCountData = await getDangerCheckCountData({ code: this.projectCode })
     if (!DangerCheckCountData.result) return
-    console.log(DangerCheckCountData)
-    const { yhsbNum, yhzgNum } = DangerCheckCountData.result || {}
-    const { seriesDatas, xaxis } = DangerCheckCountData.result.hiddenEcharts || {}
+    const { yhsbNum, yhzgNum, hiddenEcharts, hidenRicks } = DangerCheckCountData.result || {}
+    const { seriesDatas, xaxis } = hiddenEcharts || {}
     this.riskPercent = roundFun(yhzgNum / yhsbNum, 2) * 100
     this.staList = [
       { name: '隐患整改', value: yhzgNum + '个' },
@@ -141,6 +141,7 @@ export default class StatisticalRisk extends Vue {
       report: reportArr,
       complete: completeArr
     }
+    this.rankingBarChartData = hidenRicks.slice(0, 5) //默认取前五条
   }
   getMonth(item) {
     let month = item.split('-')[1]

+ 33 - 5
src/views/groupPage/groupPageModules/ContractInfo.vue

@@ -22,10 +22,14 @@
           </div>
           <div class="content">
             <div class="chart-container">
-              <div class="chart-title">完成占比:{{ complishPercent }}%</div>
+              <!-- <div class="chart-title">完成占比:{{ complishPercent }}%</div> -->
+              <div class="chart-title">本年产值完成占比:{{ complishPercent }}%</div>
               <ComThreeDimensionsChart v-on="{ fontSize }" :chartData="staList" />
               <!-- 底座背景 -->
               <div class="bg" :style="{ 'background-image': `url('${url}')` }"></div>
+              <div class="invest-title">
+                <span>累计结算{{ allCost }}亿元</span><span>本年度累计结算{{ yearCost }}亿元</span>
+              </div>
             </div>
             <div class="dataInfo">
               <div
@@ -70,7 +74,7 @@
 
 <script>
 import url from '@/views/groupPage/images/base64/3dBaseBack'
-import { getRequestResult, getEpcMonthCountData } from '@/views/groupPage/apis'
+import { getRequestResult, getEpcMonthCountData, getCostData } from '@/views/groupPage/apis'
 import { setNullAndUndefinedEmpty, fontSize as fs, subtraction } from '@/views/groupPage/util'
 import ComThreeDimensionsChart from '@/views/groupPage/components/OthersChart/ComThreeDimensionsChart.vue'
 import ComBatteryChart from '@/views/groupPage/components/BatteryChart/ComBatteryChart.vue'
@@ -109,7 +113,9 @@ export default {
         income: new Array(6).fill(0),
         spending: new Array(6).fill(0),
         profits: new Array(6).fill(0)
-      }
+      },
+      allCost: 0,
+      yearCost: 0
     }
   },
   watch: {
@@ -270,6 +276,10 @@ export default {
 
     //new
     async setData() {
+      const settleRes = await getCostData({ commanyName: this.code })
+      const { allCost, yearCost } = settleRes.result
+      this.allCost = allCost
+      this.yearCost = yearCost
       const { jgTzjh, jgLjcz, jgWczb, jgZhtje, jgNum, epcZtz, epcLjlr, epcLjsr, epcLjzc } = this.dataInfo || {}
       //建管项目
       this.$nextTick(() => {
@@ -299,7 +309,7 @@ export default {
       seriesDatas.forEach((item) => {
         if (item.name == '收入') this.latestData.income = item.seriesData
         if (item.name == '支出') this.latestData.spending = item.seriesData
-        if (item.name == '利润') this.latestData.profits = item.seriesData
+        // if (item.name == '利润') this.latestData.profits = item.seriesData
       })
     },
     getMonth(item) {
@@ -440,7 +450,9 @@ export default {
           position: relative;
           .chart-title {
             position: absolute;
-            left: 0.234375rem /* 45/192 */;
+            text-align: center;
+            // left: 0.234375rem /* 45/192 */;
+            left: 0.104167rem /* 20/192 */;
             font-size: 0.083333rem /* 16/192 */;
             font-family: Source Han Sans CN;
             font-weight: bold;
@@ -463,6 +475,22 @@ export default {
             // background-image: url('~@/views/groupPage/images/底座样式.png');
             background-size: 100% 100%;
           }
+          .invest-title {
+            position: absolute;
+            bottom: 0;
+            font-size: 0.083333rem /* 16/192 */;
+            font-family: Source Han Sans CN;
+            font-weight: bold;
+            color: #ffffff;
+            display: flex;
+            flex-flow: column;
+            justify-content: center;
+            align-items: center;
+            left: 0.15625rem; /* 30/192 */
+            span {
+              white-space: nowrap;
+            }
+          }
         }
         .dataInfo {
           width: 50%;

BIN
src/views/groupPage/images/模块图标/统计分析/合同.png


BIN
src/views/groupPage/images/模块图标/统计分析/投资结算.png


BIN
src/views/groupPage/images/模块图标/统计分析/指向.png


BIN
src/views/groupPage/images/模块图标/统计分析/本月图标.png


BIN
src/views/groupPage/images/模块图标/统计分析/累计图标.png


BIN
src/views/groupPage/images/模块图标/统计分析/结算.png