Ver código fonte

Merge branch 'product' of http://1.116.113.26:8088/zhuliu/xiaoshi_system into product

zhuhao 1 ano atrás
pai
commit
7d5164c609
61 arquivos alterados com 4384 adições e 820 exclusões
  1. 265 192
      public/科技与重大立项专利导航A7.svg
  2. 36 0
      src/api/newApi/product.js
  3. 16 0
      src/assets/css/main.scss
  4. 21 22
      src/router/index.js
  5. 5 1
      src/store/modules/dictMessage.js
  6. 1 1
      src/utils/common.js
  7. 46 2
      src/utils/model/RichText/index.vue
  8. 9 1
      src/utils/model/index.js
  9. 3 0
      src/utils/model/retrieval/search.vue
  10. 175 49
      src/utils/model/route.vue
  11. 9 8
      src/utils/model/svg/customSvg.vue
  12. 63 9
      src/utils/model/svg/mixins.js
  13. 312 0
      src/utils/model/tabs/index.vue
  14. 54 0
      src/utils/model/tabs/tabsItem.vue
  15. 5 5
      src/utils/window.js
  16. 1 0
      src/views/components/dialog/fields.vue
  17. 757 0
      src/views/components/setting/mixins.js
  18. 446 0
      src/views/components/setting/style.vue
  19. 5 5
      src/views/event/components/index.vue
  20. 25 15
      src/views/event/components/view/card.vue
  21. 4 2
      src/views/event/components/view/table.vue
  22. 3 3
      src/views/home/components/echarts/index.vue
  23. 4 2
      src/views/home/components/showDialog.js
  24. 11 7
      src/views/home/index.vue
  25. 3 3
      src/views/layout/components/UserBar.vue
  26. 180 2
      src/views/layout/components/guide.js
  27. 6 0
      src/views/layout/mixins/index.js
  28. 1 0
      src/views/login/index.vue
  29. 96 0
      src/views/patentMining/components/view/card.vue
  30. 2 1
      src/views/patentMining/components/view/commonTable.vue
  31. 64 12
      src/views/patentMining/components/viewIndex.vue
  32. 0 151
      src/views/patentMining/index.vue
  33. 170 0
      src/views/product/components/details/components/basicMessage.vue
  34. 140 0
      src/views/product/components/details/components/index.vue
  35. 50 0
      src/views/product/components/details/components/marketAndTrend.vue
  36. 0 0
      src/views/product/components/details/components/mixins/index.js
  37. 46 0
      src/views/product/components/details/index.vue
  38. 118 0
      src/views/product/components/dialog/addEditMarket.vue
  39. 0 1
      src/views/product/components/dialog/addEditProduct.vue
  40. 4 4
      src/views/product/components/dialog/classifyNode.vue
  41. 9 144
      src/views/product/components/dialog/marketing.vue
  42. 300 0
      src/views/product/components/echarts/components/MultipleLine/index.vue
  43. 7 0
      src/views/product/components/echarts/components/echarts.js
  44. 227 0
      src/views/product/components/echarts/components/echarts.vue
  45. 32 0
      src/views/product/components/echarts/index.vue
  46. 2 4
      src/views/product/components/framework/index.vue
  47. 28 15
      src/views/product/components/framework/viewIndex.vue
  48. 42 10
      src/views/product/components/index.vue
  49. 207 0
      src/views/product/components/market/index.vue
  50. 32 0
      src/views/product/components/mixins/index.js
  51. 5 10
      src/views/product/components/view/categoryTable.vue
  52. 8 12
      src/views/product/components/view/productTable.vue
  53. 15 31
      src/views/project/components/view/card.vue
  54. 1 1
      src/views/project/components/view/table.vue
  55. 46 22
      src/views/project/index.vue
  56. 81 21
      src/views/report/components/index.vue
  57. 26 12
      src/views/report/components/view/card.vue
  58. 1 1
      src/views/report/components/view/table.vue
  59. 5 8
      src/views/visual/components/drawer/titleDrawer.vue
  60. 1 1
      src/views/visual/components/sceneSVG.vue
  61. 153 30
      src/views/visual/title/index.vue

+ 265 - 192
public/科技与重大立项专利导航A7.svg

@@ -1,214 +1,287 @@
-  <svg id="SvgjsSvg1006" viewBox="0 0 1350.671875 364.34375" width="100%" height="100%" xmlns="http://www.w3.org/2000/svg" version="1.1"
-        xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:svgjs="http://svgjs.com/svgjs">
-        <defs id="SvgjsDefs1007">
-          <pattern patternUnits="userSpaceOnUse" id="pattern_mark_0" width="300" height="300"><text x="150" y="100"
-              fill="rgba(229,229,229,0.8)" font-size="18" transform="rotate(-45, 150, 150)"
-              style="dominant-baseline: middle; text-anchor: middle;"></text></pattern>
-          <pattern patternUnits="userSpaceOnUse" id="pattern_mark_1" width="300" height="300"><text x="150" y="200"
-              fill="rgba(229,229,229,0.8)" font-size="18" transform="rotate(-45, 150, 150)"
-              style="dominant-baseline: middle; text-anchor: middle;"></text></pattern>
-          <marker id="SvgjsMarker1045" markerWidth="13" markerHeight="9" refX="9.5" refY="4.5" viewBox="0 0 13 9"
-            orient="auto" markerUnits="userSpaceOnUse" stroke-dasharray="0,0">
-            <path id="SvgjsPath1046" d="M0,0 L13,4.5 L0,9 L0,0" fill="#3084e5" stroke="#3084e5" stroke-width="1"></path>
-          </marker>
-          <marker id="SvgjsMarker1075" markerWidth="13" markerHeight="9" refX="9.5" refY="4.5" viewBox="0 0 13 9"
-            orient="auto" markerUnits="userSpaceOnUse" stroke-dasharray="0,0">
-            <path id="SvgjsPath1076" d="M0,0 L13,4.5 L0,9 L0,0" fill="#3084e5" stroke="#3084e5" stroke-width="1"></path>
-          </marker>
-          <marker id="SvgjsMarker1085" markerWidth="13" markerHeight="9" refX="9.5" refY="4.5" viewBox="0 0 13 9"
-            orient="auto" markerUnits="userSpaceOnUse" stroke-dasharray="0,0">
-            <path id="SvgjsPath1086" d="M0,0 L13,4.5 L0,9 L0,0" fill="#3084e5" stroke="#3084e5" stroke-width="1"></path>
-          </marker>
-        </defs>
-        <rect id="svgbackgroundid" width="1350.671875" height="364.34375" fill="transparent"></rect>
-        <rect id="SvgjsRect1009" width="1350.671875" height="364.34375" fill="url(#pattern_mark_0)"></rect>
-        <rect id="SvgjsRect1010" width="1350.671875" height="364.34375" fill="url(#pattern_mark_1)"></rect>
-      <!-- 科技与重大立项专利导航块 -->
-      <g id="SvgjsG1011" transform="translate(425.00520833333326,25.010401407877623)" onmouseenter="vm.svgOnMouseenter(event,{type:'titleA7',width:'510'})" onmouseleave="vm.svgOnMouseleave(event,{type:'titleA7',width:'510'})">
-        <path id="SvgjsPath1012" d="M 0 4Q 0 0 4 0L 530 0Q 534 0 534 4L 534 96Q 534 100 530 100L 4 100Q 0 100 0 96Z"
-          stroke="#11acaf'" stroke-width="1.5" fill-opacity="1" fill="#11acaf"></path>
-        <g id="SvgjsG1013"><text id="SvgjsText1014" font-family="微软雅黑" text-anchor="middle" font-size="26px"
-            width="514px" fill="#ffffff" font-weight="700" align="middle" lineHeight="125%" anchor="middle" 
-            family="微软雅黑" size="26px" weight="700" font-style="" opacity="1" y="27.25" transform="rotate(0)">
-            <tspan id="SvgjsTspan1015" dy="32" x="267">
-              <tspan id="SvgjsTspan1016" style="text-decoration:;">科技与重大立项专利导航</tspan>
-            </tspan>
-          </text></g>
-      </g>
-      <!-- 科技与重大立项专利导航事件数量 -->
-      <g id="SvgjsG1017" transform="translate(904.671875,58.010416666666686)" onClick="vm.svgOnClick(event,{type:'question',width:'510',scene:'科技与重大立项专利导航'})">
-        <path id="SvgjsPath1018"
-          d="M 0 20.833333333333332C 0 -6.944444444444444 42.8333333333336 -6.944444444444444 42.8333333333336 20.833333333333332C 42.8333333333336 48.61111111111111 0 48.61111111111111 0 20.833333333333332Z"
-          stroke="rgba(255,255,255,1)" stroke-width="1.5" fill-opacity="1" fill="#ffffff"></path>
-        <g id="SvgjsG1019"><text id="SvgjsText1020" font-family="微软雅黑" text-anchor="middle" font-size="18px"
-            width="23px" fill="#11acaf" font-weight="700" align="middle" lineHeight="125%" anchor="middle" family="微软雅黑"
-            size="18px" weight="700" font-style="" opacity="1" y="5.083333333333332" transform="rotate(0)">
-            <tspan id="SvgjsTspan1021" dy="22" x="21.5">
-              <tspan id="SvgjsTspan1022" style="text-decoration:;">{{ 科技与重大立项专利导航, 1 }}</tspan>
-            </tspan>
-          </text></g>
+<svg id="SvgjsSvg1006" width="100%" height="100%"
+  viewBox='0 0 1684.4375 323.09375'
+  xmlns="http://www.w3.org/2000/svg" version="1.1"
+  xmlns:xlink="http://www.w3.org/1999/xlink"
+  xmlns:svgjs="http://svgjs.com/svgjs">
+  <defs id="SvgjsDefs1007">
+    <pattern patternUnits="userSpaceOnUse" id="pattern_mark_0" width="300" height="300">
+      <text x="150" y="100" fill="rgba(229,229,229,0.8)" font-size="18" transform="rotate(-45, 150, 150)" style="dominant-baseline: middle; text-anchor: middle;"></text>
+    </pattern>
+    <pattern patternUnits="userSpaceOnUse" id="pattern_mark_1" width="300" height="300">
+      <text x="150" y="200" fill="rgba(229,229,229,0.8)" font-size="18" transform="rotate(-45, 150, 150)" style="dominant-baseline: middle; text-anchor: middle;"></text>
+    </pattern>
+    <pattern id="SvgjsPattern1061" x="0" y="0" width="40" height="40" patternUnits="userSpaceOnUse">
+      <image id="SvgjsImage1062" xlink:href="https://cdn.processon.com/64e60c2a7e3221474c6613b5-65545e7997925964fce130b3.svg?e=1700031625&amp;token=trhI0BY8QfVrIGn9nENop6JAc6l5nZuxhjQ62UfM:TAl7ewjEeA6DQpDdKNlWHFvVFdk=" width="40" height="40" preserveAspectRatio="none" crossOrigin="anonymous" x="0" y="0"></image>
+    </pattern>
+    <marker id="SvgjsMarker1081" markerWidth="13" markerHeight="9" refX="9.5" refY="4.5" viewBox="0 0 13 9" orient="auto" markerUnits="userSpaceOnUse" stroke-dasharray="0,0">
+      <path id="SvgjsPath1082" d="M0,0 L13,4.5 L0,9 L0,0" fill="#316292" stroke="#316292" stroke-width="1"></path>
+    </marker>
+    <marker id="SvgjsMarker1085" markerWidth="13" markerHeight="9" refX="9.5" refY="4.5" viewBox="0 0 13 9" orient="auto" markerUnits="userSpaceOnUse" stroke-dasharray="0,0">
+      <path id="SvgjsPath1086" d="M0,0 L13,4.5 L0,9 L0,0" fill="#316292" stroke="#316292" stroke-width="1"></path>
+    </marker>
+    <marker id="SvgjsMarker1089" markerWidth="13" markerHeight="9" refX="9.5" refY="4.5" viewBox="0 0 13 9" orient="auto" markerUnits="userSpaceOnUse" stroke-dasharray="0,0">
+      <path id="SvgjsPath1090" d="M0,0 L13,4.5 L0,9 L0,0" fill="#316292" stroke="#316292" stroke-width="1"></path>
+    </marker>
+    <pattern id="SvgjsPattern1106" x="0" y="0" width="40" height="40" patternUnits="userSpaceOnUse">
+      <image id="SvgjsImage1107" xlink:href="https://cdn.processon.com/64e60c2a7e3221474c6613b5-65545e7997925964fce130b3.svg?e=1700031625&amp;token=trhI0BY8QfVrIGn9nENop6JAc6l5nZuxhjQ62UfM:TAl7ewjEeA6DQpDdKNlWHFvVFdk=" width="40" height="40" preserveAspectRatio="none" crossOrigin="anonymous" x="0" y="0"></image>
+    </pattern>
+  </defs>
+  <rect id="svgbackgroundid" width="1684.4375" height="323.09375" fill="transparent"></rect>
+  <rect id="SvgjsRect1009" width="1684.4375" height="323.09375" fill="url(#pattern_mark_0)"></rect>
+  <rect id="SvgjsRect1010" width="1684.4375" height="323.09375" fill="url(#pattern_mark_1)"></rect>
+  <!-- 科技与重大立项专利导航块 -->
+  <g id="SvgjsG1011" transform="translate(645.0104166666713,25.010443369547517)" onmouseenter="vm.svgOnMouseenter(event,{type:'titleA7',width:'510'})" onmouseleave="vm.svgOnMouseleave(event,{type:'titleA7',width:'510'})" onClick="vm.handleClick2('科技与重大立项专利导航')">
+    <path id="SvgjsPath1012" d="M 0 4Q 0 0 4 0L 476 0Q 480 0 480 4L 480 65.99998474121105Q 480 69.99998474121105 476 69.99998474121105L 4 69.99998474121105Q 0 69.99998474121105 0 65.99998474121105Z" stroke="rgba(231,79,76,1)" stroke-width="2" fill="none"></path>
+    <g id="SvgjsG1013">
+      <text id="SvgjsText1014" font-family="思源黑体" text-anchor="middle" font-size="26px" width="370px" fill="#e74f4c" font-weight="700" align="middle" lineHeight="125%" anchor="middle" family="思源黑体" size="26px" weight="700" font-style="" opacity="1" y="15.166651407877609" transform="rotate(0)">
+        <tspan id="SvgjsTspan1015" dy="32.5" x="195">
+          <tspan id="SvgjsTspan1016" style="">科技与重大立项专利导航</tspan>
+        </tspan>
+      </text>
+    </g>
+
+     <!-- 线 -->
+    <g id="SvgjsG1027" transform="translate(364.635,15.50)" >
+      <path id="SvgjsPath1028" d="M 11 0L 11 40" stroke="#e74f4c" stroke-width="2" fill="none"></path>
+      <path id="SvgjsPath1029" d="M 0 0L 21 0L 21 40L 0 40Z" stroke="none" fill="none"></path>
+    </g>
+    <!-- 栏位 -->
+    <g id="SvgjsG1030" transform="translate(385.84,22.50)" >
+      <path id="SvgjsPath1031" d="M 0 0L 55.66666666666663 0L 55.66666666666663 40L 0 40Z" stroke="none" fill="none"></path>
+      <g id="SvgjsG1032">
+        <text id="SvgjsText1033" font-family="思源黑体" text-anchor="start" font-size="13px" width="56px" fill="#e74f4c" font-weight="700" align="middle" lineHeight="125%" anchor="start" family="思源黑体" size="13px" weight="700" font-style="" opacity="1" y="0.875" transform="rotate(0)">
+          <tspan id="SvgjsTspan1034" dy="16.25" x="0">
+            <tspan id="SvgjsTspan1035" style="">事件:</tspan>
+          </tspan>
+        </text>
       </g>
       </g>
-      <!-- 产业/行业调查 -->
-      <g id="SvgjsG1023" transform="translate(492.00520833333326,259.34375)" onmouseenter="vm.svgOnMouseenter(event,{type:'9',width:'375'})" onmouseleave="vm.svgOnMouseleave(event,{type:'9',width:'375'})" onClick="vm.handleClick('产业/行业调查')">
-        <path id="SvgjsPath1024" d="M 0 4Q 0 0 4 0L 396 0Q 400 0 400 4L 400 76Q 400 80 396 80L 4 80Q 0 80 0 76Z"
-          stroke="{{产业/行业调查,#d45a6a}}" stroke-width="1.5" fill-opacity="1" fill="{{产业/行业调查,#d45a6a}}"></path>
-        <g id="SvgjsG1025"><text id="SvgjsText1026" font-family="微软雅黑" text-anchor="middle" font-size="24px"
-            width="380px" fill="#ffffff" font-weight="700" align="middle" lineHeight="125%" anchor="middle"
-            family="微软雅黑" size="24px" weight="700" font-style="" opacity="1" y="19" transform="rotate(0)">
-            <tspan id="SvgjsTspan1027" dy="30" x="200">
-              <tspan id="SvgjsTspan1028" style="text-decoration:;">产业/行业调查</tspan>
-            </tspan>
-          </text></g>
+    </g>
+    <!-- 数量 -->
+    <g id="SvgjsG1038" transform="translate(425.96,22.50)">
+      <path id="SvgjsPath1039" d="M 0 0L 45.49999999999966 0L 45.49999999999966 40L 0 40Z" stroke="none" fill="none"></path>
+      <g id="SvgjsG1040">
+        <text id="SvgjsText1041" font-family="思源黑体" text-anchor="end" font-size="13px" width="46px" fill="#e74f4c" font-weight="700" align="middle" lineHeight="125%" anchor="end" family="思源黑体" size="13px" weight="700" font-style="" opacity="1" y="0.875" transform="rotate(0)">
+          <tspan id="SvgjsTspan1042" dy="16.25" x="46">
+            <tspan id="SvgjsTspan1043" style="">{{ 科技与重大立项专利导航, 1 }}</tspan>
+          </tspan>
+        </text>
       </g>
       </g>
-      <g id="SvgjsG1029" transform="translate(500.6718750000002,275.1770833333335)">
-        <path id="SvgjsPath1030" d="M 0 22.5C 0 -7.5 45 -7.5 45 22.5C 45 52.5 0 52.5 0 22.5Z"
-          stroke="rgba(255,255,255,1)" stroke-width="1.5" fill-opacity="1" fill="#ffffff"></path>
-        <g id="SvgjsG1031"><text id="SvgjsText1032" font-family="微软雅黑" text-anchor="middle" font-size="13px"
-            width="25px" fill="#323232" font-weight="400" align="middle" lineHeight="125%" anchor="middle" family="微软雅黑"
-            size="13px" weight="400" font-style="" opacity="1" y="11.875" transform="rotate(0)"></text></g>
+    </g>
+  </g>
+  <!-- 政策与市场环境分析块 -->
+  <g id="SvgjsG1017" transform="translate(25.01041666667129,228.09375)" onmouseenter="vm.svgOnMouseenter(event,{type:'10',width:'375'})" onmouseleave="vm.svgOnMouseleave(event,{type:'10',width:'375'})" onClick="vm.handleClick('政策与市场环境分析')">
+    <path id="SvgjsPath1018" d="M 0 4Q 0 0 4 0L 426 0Q 430 0 430 4L 430 65.99998474121105Q 430 69.99998474121105 426 69.99998474121105L 4 69.99998474121105Q 0 69.99998474121105 0 65.99998474121105Z" stroke="rgba(49,98,146,1)" stroke-width="2" fill-opacity="1" fill="#ffffff"></path>
+    <g id="SvgjsG1019">
+      <text id="SvgjsText1020" font-family="思源黑体" text-anchor="middle" font-size="24px" width="410px" fill="#767676" font-weight="700" align="middle" lineHeight="125%" anchor="middle" family="思源黑体" size="24px" weight="700" font-style="" opacity="1" y="13.999992370605526" transform="rotate(0)"></text>
+    </g>
+    <g id="SvgjsG1021" transform="translate(63.16,17)" >
+      <path id="SvgjsPath1022" d="M 0 0L 252.00000000000023 0L 252.00000000000023 40L 0 40Z" stroke="none" fill="none"></path>
+      <g id="SvgjsG1023">
+        <text id="SvgjsText1024" font-family="思源黑体" text-anchor="middle" font-size="22px" width="253px" fill="#316292" font-weight="700" align="middle" lineHeight="125%" anchor="middle" family="思源黑体" size="22px" weight="700" font-style="" opacity="1" y="0.25" transform="rotate(0)">
+          <tspan id="SvgjsTspan1025" dy="27.5" x="126.5">
+            <tspan id="SvgjsTspan1026" style="">政策与市场环境分析</tspan>
+          </tspan>
+        </text>
       </g>
       </g>
-      <g id="SvgjsG1033" transform="translate(509.33854166666663,283.51041666666686)">
-        <path id="SvgjsPath1034"
-          d="M 17.566666666666674 10.76666666666666L 14.166666666666671 0L 10.766666666666671 10.76666666666666L 0 10.76666666666666L 8.500000000000002 17.566666666666656L 5.100000000000001 28.333333333333314L 14.166666666666671 21.53333333333332L 23.23333333333334 28.333333333333314L 19.83333333333334 17.566666666666656L 28.333333333333343 10.76666666666666Z"
-          stroke="rgba(212,90,106,1)" stroke-width="1.5" fill-opacity="1" fill="#d45a6a"></path>
-        <g id="SvgjsG1035"><text id="SvgjsText1036" font-family="微软雅黑" text-anchor="middle" font-size="13px"
-            width="20px" fill="#323232" font-weight="400" align="middle" lineHeight="125%" anchor="middle" family="微软雅黑"
-            size="13px" weight="400" font-style="" opacity="1" y="4.24999999999999" transform="rotate(0)"></text></g>
+    </g>
+
+      <!-- 线 -->
+    <g id="SvgjsG1027" transform="translate(314.635,15.50)" >
+      <path id="SvgjsPath1028" d="M 11 0L 11 40" stroke="rgba(49,98,146,1)" stroke-width="2" fill="none"></path>
+      <path id="SvgjsPath1029" d="M 0 0L 21 0L 21 40L 0 40Z" stroke="none" fill="none"></path>
+    </g>
+    <!-- 栏位 -->
+    <g id="SvgjsG1030" transform="translate(335.84,17.50)" >
+      <path id="SvgjsPath1031" d="M 0 0L 55.66666666666663 0L 55.66666666666663 40L 0 40Z" stroke="none" fill="none"></path>
+      <g id="SvgjsG1032">
+        <text id="SvgjsText1033" font-family="思源黑体" text-anchor="start" font-size="13px" width="56px" fill="#316292" font-weight="700" align="middle" lineHeight="125%" anchor="start" family="思源黑体" size="13px" weight="700" font-style="" opacity="1" y="0.875" transform="rotate(0)">
+          <tspan id="SvgjsTspan1034" dy="16.25" x="0">
+            <tspan id="SvgjsTspan1035" style="">数据库:</tspan>
+          </tspan>
+          <tspan id="SvgjsTspan1036" dy="16.25" x="0">
+            <tspan id="SvgjsTspan1037" style="">报告:</tspan>
+          </tspan>
+        </text>
       </g>
       </g>
-      <!-- 产业/行业调查专利数据库数量 -->
-      <g id="SvgjsG1037" transform="translate(835.6718749999998,278.51041666666674)">
-        <path id="SvgjsPath1038"
-          d="M 0 20.833333333333332C 0 -6.944444444444444 42.8333333333336 -6.944444444444444 42.8333333333336 20.833333333333332C 42.8333333333336 48.61111111111111 0 48.61111111111111 0 20.833333333333332Z"
-          stroke="rgba(255,255,255,1)" stroke-width="1.5" fill-opacity="1" fill="#ffffff"></path>
-        <g id="SvgjsG1039"><text id="SvgjsText1040" font-family="微软雅黑" text-anchor="middle" font-size="18px"
-            width="23px" fill="#11acaf" font-weight="700" align="middle" lineHeight="125%" anchor="middle" family="微软雅黑"
-            size="18px" weight="700" font-style="" opacity="1" y="5.083333333333332" transform="rotate(0)">
-            <tspan id="SvgjsTspan1041" dy="22" x="21.5">
-              <tspan id="SvgjsTspan1042" style="text-decoration:;">{{ 产业/行业调查, 2 }}</tspan>
-            </tspan>  
-          </text></g>
+    </g>
+    <!-- 数量 -->
+    <g id="SvgjsG1038" transform="translate(376.96,17.50)">
+      <path id="SvgjsPath1039" d="M 0 0L 45.49999999999966 0L 45.49999999999966 40L 0 40Z" stroke="none" fill="none"></path>
+      <g id="SvgjsG1040">
+        <text id="SvgjsText1041" font-family="思源黑体" text-anchor="end" font-size="13px" width="46px" fill="#316292" font-weight="700" align="middle" lineHeight="125%" anchor="end" family="思源黑体" size="13px" weight="700" font-style="" opacity="1" y="0.875" transform="rotate(0)">
+          <tspan id="SvgjsTspan1042" dy="16.25" x="46">
+            <tspan id="SvgjsTspan1043" style="">{{ 政策与市场环境分析, 2 }}</tspan>
+          </tspan>
+          <tspan id="SvgjsTspan1044" dy="16.25" x="42">
+            <tspan id="SvgjsTspan1045" style="">{{ 政策与市场环境分析, 3 }}</tspan>
+          </tspan>
+        </text>
       </g>
       </g>
-      <g id="SvgjsG1043">
-        <path id="SvgjsPath1044"
-          d="M691.671875 169.34375L1130.1163194444455 169.34375L1130.1163194444455 256.9104166666666" stroke="#3084e5"
-          stroke-width="1.5" fill="none" marker-end="url(#SvgjsMarker1045)"></path>
+    </g>
+  </g>
+  
+
+    <!-- 产业/行业调查块 -->
+  <g id="SvgjsG1046" transform="translate(625.0104166666713,228.09375)"  onmouseenter="vm.svgOnMouseenter(event,{type:'9',width:'375'})" onmouseleave="vm.svgOnMouseleave(event,{type:'9',width:'375'})" onClick="vm.handleClick('产业/行业调查')">
+    <path id="SvgjsPath1047" d="M 0 4Q 0 0 4 0L 426 0Q 430 0 430 4L 430 65.99998474121105Q 430 69.99998474121105 426 69.99998474121105L 4 69.99998474121105Q 0 69.99998474121105 0 65.99998474121105Z" stroke="rgba(49,98,146,1)" stroke-width="2" fill-opacity="1" fill="#ffffff"></path>
+    <g id="SvgjsG1048">
+      <text id="SvgjsText1049" font-family="思源黑体" text-anchor="middle" font-size="24px" width="410px" fill="#767676" font-weight="700" align="middle" lineHeight="125%" anchor="middle" family="思源黑体" size="24px" weight="700" font-style="" opacity="1" y="13.999992370605526" transform="rotate(0)"></text>
+    </g>
+    <g id="SvgjsG1050" transform="translate(63.16,17)">
+      <path id="SvgjsPath1051" d="M 0 0L 252.00000000000023 0L 252.00000000000023 40L 0 40Z" stroke="none" fill="none"></path>
+      <g id="SvgjsG1052">
+        <text id="SvgjsText1053" font-family="思源黑体" text-anchor="middle" font-size="22px" width="253px" fill="#316292" font-weight="700" align="middle" lineHeight="125%" anchor="middle" family="思源黑体" size="22px" weight="700" font-style="" opacity="1" y="0.25" transform="rotate(0)">
+          <tspan id="SvgjsTspan1054" dy="27.5" x="126.5">
+            <tspan id="SvgjsTspan1055" style="">产业/行业调查</tspan>
+          </tspan>
+        </text>
       </g>
       </g>
-      <!-- 产业/行业专利调查块 -->
-      <g id="SvgjsG1047" transform="translate(925.671875,259.34375000000006)" onClick="vm.handleClick('产业/行业专利调查')">
-        <path id="SvgjsPath1048" d="M 0 4Q 0 0 4 0L 396 0Q 400 0 400 4L 400 76Q 400 80 396 80L 4 80Q 0 80 0 76Z"
-          stroke="{{产业/行业专利调查,#d45a6a}}" stroke-width="1.5" fill-opacity="1" fill="{{产业/行业专利调查,#d45a6a}}"></path>
-        <g id="SvgjsG1049"><text id="SvgjsText1050" font-family="微软雅黑" text-anchor="middle" font-size="24px"
-            width="380px" fill="#ffffff" font-weight="700" align="middle" lineHeight="125%" anchor="middle"
-            family="微软雅黑" size="24px" weight="700" font-style="" opacity="1" y="19" transform="rotate(0)">
-            <tspan id="SvgjsTspan1051" dy="30" x="200">
-              <tspan id="SvgjsTspan1052" style="text-decoration:;">产业/行业专利调查</tspan>
-            </tspan>
-          </text></g>
+    </g>
+
+    <!-- 线 -->
+      <g id="SvgjsG1056" transform="translate(314.63,17)">
+        <path id="SvgjsPath1057" d="M 11 0L 11 40" stroke="rgba(49,98,146,1)" stroke-width="2" fill="none"></path>
+        <path id="SvgjsPath1058" d="M 0 0L 21 0L 21 40L 0 40Z" stroke="none" fill="none"></path>
       </g>
       </g>
-      <g id="SvgjsG1053" transform="translate(939.1718750000001,276.84375)">
-        <path id="SvgjsPath1054" d="M 0 22.5C 0 -7.5 45 -7.5 45 22.5C 45 52.5 0 52.5 0 22.5Z"
-          stroke="rgba(255,255,255,1)" stroke-width="1.5" fill-opacity="1" fill="#ffffff"></path>
-        <g id="SvgjsG1055"><text id="SvgjsText1056" font-family="微软雅黑" text-anchor="middle" font-size="13px"
-            width="25px" fill="#323232" font-weight="400" align="middle" lineHeight="125%" anchor="middle" family="微软雅黑"
-            size="13px" weight="400" font-style="" opacity="1" y="11.875" transform="rotate(0)"></text></g>
+      <!-- //图标 -->
+      <g id="SvgjsG1059" transform="translate(10.66,17)">
+        <path id="SvgjsPath1060" d="M 0 0L 40 0L 40 40L 0 40Z" stroke="none" fill="url(#SvgjsPattern1061)"></path>
       </g>
       </g>
-      <!-- 产业/行业专利调查专利数据库数量 -->
-      <g id="SvgjsG1057" transform="translate(1271.5052083333342,278.5104166666667)">
-        <path id="SvgjsPath1058"
-          d="M 0 20.833333333333332C 0 -6.944444444444444 42.8333333333336 -6.944444444444444 42.8333333333336 20.833333333333332C 42.8333333333336 48.61111111111111 0 48.61111111111111 0 20.833333333333332Z"
-          stroke="rgba(255,255,255,1)" stroke-width="1.5" fill-opacity="1" fill="#ffffff"></path>
-        <g id="SvgjsG1059"><text id="SvgjsText1060" font-family="微软雅黑" text-anchor="middle" font-size="18px"
-            width="23px" fill="#11acaf" font-weight="700" align="middle" lineHeight="125%" anchor="middle" family="微软雅黑"
-            size="18px" weight="700" font-style="" opacity="1" y="5.083333333333332" transform="rotate(0)">
-            <tspan id="SvgjsTspan1061" dy="22" x="21.5">
-              <tspan id="SvgjsTspan1062" style="text-decoration:;">{{产业/行业专利调查, 2 }}</tspan>
+      <!-- 产业/行业调查数量 -->
+      <g id="SvgjsG1063" transform="translate(335.84,18.50)">
+        <path id="SvgjsPath1064" d="M 0 0L 55.66666666666663 0L 55.66666666666663 40L 0 40Z" stroke="none" fill="none"></path>
+        <g id="SvgjsG1065">
+          <text id="SvgjsText1066" font-family="思源黑体" text-anchor="start" font-size="13px" width="56px" fill="#316292" font-weight="700" align="middle" lineHeight="125%" anchor="start" family="思源黑体" size="13px" weight="700" font-style="" opacity="1" y="0.875" transform="rotate(0)">
+            <tspan id="SvgjsTspan1067" dy="16.25" x="0">
+              <tspan id="SvgjsTspan1068" style="">数据库:</tspan>
             </tspan>
             </tspan>
-          </text></g>
-      </g>
-      <g id="SvgjsG1063" transform="translate(947.5052083333335,283.51041666666674)">
-        <path id="SvgjsPath1064"
-          d="M 17.566666666666674 10.76666666666666L 14.166666666666671 0L 10.766666666666671 10.76666666666666L 0 10.76666666666666L 8.500000000000002 17.566666666666656L 5.100000000000001 28.333333333333314L 14.166666666666671 21.53333333333332L 23.23333333333334 28.333333333333314L 19.83333333333334 17.566666666666656L 28.333333333333343 10.76666666666666Z"
-          stroke="rgba(212,90,106,1)" stroke-width="1.5" fill-opacity="1" fill="#d45a6a"></path>
-        <g id="SvgjsG1065"><text id="SvgjsText1066" font-family="微软雅黑" text-anchor="middle" font-size="13px"
-            width="20px" fill="#323232" font-weight="400" align="middle" lineHeight="125%" anchor="middle" family="微软雅黑"
-            size="13px" weight="400" font-style="" opacity="1" y="4.24999999999999" transform="rotate(0)"></text></g>
-      </g>
-      <!-- 政策与市场环境分析 -->
-      <g id="SvgjsG1067" transform="translate(25.005208333333314,259.34375)" onmouseenter="vm.svgOnMouseenter(event,{type:'10',width:'375'})" onmouseleave="vm.svgOnMouseleave(event,{type:'10',width:'375'})" onClick="vm.handleClick('政策与市场环境分析')">
-        <path id="SvgjsPath1068" d="M 0 4Q 0 0 4 0L 396 0Q 400 0 400 4L 400 76Q 400 80 396 80L 4 80Q 0 80 0 76Z"
-          stroke="{{ 政策与市场环境分析, #3084e5 }}" stroke-width="1.5" fill-opacity="1" fill="{{ 政策与市场环境分析, #3084e5 }}"></path>
-        <g id="SvgjsG1069"><text id="SvgjsText1070" font-family="微软雅黑" text-anchor="middle" font-size="24px"
-            width="380px" fill="#ffffff" font-weight="700" align="middle" lineHeight="125%" anchor="middle"
-            family="微软雅黑" size="24px" weight="700" font-style="" opacity="1" y="19" transform="rotate(0)">
-            <tspan id="SvgjsTspan1071" dy="30" x="200">
-              <tspan id="SvgjsTspan1072" style="text-decoration:;">政策与市场环境分析</tspan>
+            <tspan id="SvgjsTspan1069" dy="16.25" x="0">
+              <tspan id="SvgjsTspan1070" style="">报告:</tspan>
             </tspan>
             </tspan>
-          </text></g>
-      </g>
-      <g id="SvgjsG1073">
-        <path id="SvgjsPath1074"
-          d="M692.0052083333333 125.76040140787762L692.0052083333333 192.3437423706055L692.0052083333333 192.3437423706055L692.0052083333333 256.9770833333334"
-          stroke="#3084e5" stroke-width="1.5" fill="none" marker-end="url(#SvgjsMarker1075)"></path>
+          </text>
+        </g>
       </g>
       </g>
-      <!-- 政策与市场环境分析专利数据库数量 -->
-      <g id="SvgjsG1077" transform="translate(367.3385416666662,278.51041666666674)">
-        <path id="SvgjsPath1078"
-          d="M 0 20.833333333333332C 0 -6.944444444444444 42.8333333333336 -6.944444444444444 42.8333333333336 20.833333333333332C 42.8333333333336 48.61111111111111 0 48.61111111111111 0 20.833333333333332Z"
-          stroke="rgba(255,255,255,1)" stroke-width="1.5" fill-opacity="1" fill="#ffffff"></path>
-        <g id="SvgjsG1079"><text id="SvgjsText1080" font-family="微软雅黑" text-anchor="middle" font-size="18px"
-            width="23px" fill="#11acaf" font-weight="700" align="middle" lineHeight="125%" anchor="middle" family="微软雅黑"
-            size="18px" weight="700" font-style="" opacity="1" y="5.083333333333332" transform="rotate(0)">
-            <tspan id="SvgjsTspan1081" dy="22" x="21.5">
-              <tspan id="SvgjsTspan1082" style="text-decoration:;">{{ 政策与市场环境分析, 2 }}</tspan>
+      <!-- 数量 -->
+      <g id="SvgjsG1071" transform="translate(376.96,18.50)">
+        <path id="SvgjsPath1072" d="M 0 0L 45.49999999999966 0L 45.49999999999966 40L 0 40Z" stroke="none" fill="none"></path>
+        <g id="SvgjsG1073">
+          <text id="SvgjsText1074" font-family="思源黑体" text-anchor="end" font-size="13px" width="46px" fill="#316292" font-weight="700" align="middle" lineHeight="125%" anchor="end" family="思源黑体" size="13px" weight="700" font-style="" opacity="1" y="0.875" transform="rotate(0)">
+            <tspan id="SvgjsTspan1075" dy="16.25" x="46">
+              <tspan id="SvgjsTspan1076" style="">{{ 产业/行业调查, 2 }}</tspan>
+            </tspan>
+            <tspan id="SvgjsTspan1077" dy="16.25" x="42">
+              <tspan id="SvgjsTspan1078" style="">{{ 产业/行业调查, 3 }}</tspan>
             </tspan>
             </tspan>
-          </text></g>
+          </text>
+        </g>
       </g>
       </g>
-      <g id="SvgjsG1083">
-        <path id="SvgjsPath1084"
-          d="M690.671875 169.34375L225.00520833333331 169.67708333333343L225.00520833333331 256.64375" stroke="#3084e5"
-          stroke-width="1.5" fill="none" marker-end="url(#SvgjsMarker1085)"></path>
+
+  </g>
+
+  <g id="SvgjsG1079">
+    <path id="SvgjsPath1080" d="M840.0104166666713 101.84374618530273L840.0104166666713 164.46874809265137L240.0104166666713 164.46874809265137L240.0104166666713 225.14375" stroke="#316292" stroke-width="1.5" fill="none" marker-end="url(#SvgjsMarker1081)"></path>
+  </g>
+  <g id="SvgjsG1083">
+    <path id="SvgjsPath1084" d="M839.40625 164.59375L839.40625 196.34375L839.40625 196.34375L839.40625 225.14375" stroke="#316292" stroke-width="1.5" fill="none" marker-end="url(#SvgjsMarker1085)"></path>
+  </g>
+  <g id="SvgjsG1087">
+    <path id="SvgjsPath1088" d="M840.40625 164.59375L1440.0104166666713 164.59375L1440.0104166666713 225.14375" stroke="#316292" stroke-width="1.5" fill="none" marker-end="url(#SvgjsMarker1089)"></path>
+  </g>
+
+<!-- 产业/行业专利调查块 -->
+  <g id="SvgjsG1091" transform="translate(1225.0104166666713,228.09375)" onClick="vm.handleClick('产业/行业专利调查',true)">
+    <path id="SvgjsPath1092" d="M 0 4Q 0 0 4 0L 426 0Q 430 0 430 4L 430 65.99998474121105Q 430 69.99998474121105 426 69.99998474121105L 4 69.99998474121105Q 0 69.99998474121105 0 65.99998474121105Z" stroke="rgba(49,98,146,1)" stroke-width="2" fill-opacity="1" fill="#ffffff"></path>
+    <g id="SvgjsG1093">
+      <text id="SvgjsText1094" font-family="思源黑体" text-anchor="middle" font-size="24px" width="410px" fill="#767676" font-weight="700" align="middle" lineHeight="125%" anchor="middle" family="思源黑体" size="24px" weight="700" font-style="" opacity="1" y="13.999992370605526" transform="rotate(0)"></text>
+    </g>
+    <g id="SvgjsG1095" transform="translate(63.16,17)" >
+      <path id="SvgjsPath1096" d="M 0 0L 252.00000000000023 0L 252.00000000000023 40L 0 40Z" stroke="none" fill="none"></path>
+      <g id="SvgjsG1097">
+        <text id="SvgjsText1098" font-family="思源黑体" text-anchor="middle" font-size="22px" width="253px" fill="#316292" font-weight="700" align="middle" lineHeight="125%" anchor="middle" family="思源黑体" size="22px" weight="700" font-style="" opacity="1" y="0.25" transform="rotate(0)">
+          <tspan id="SvgjsTspan1099" dy="27.5" x="126.5">
+            <tspan id="SvgjsTspan1100" style="">产业/行业专利调查</tspan>
+          </tspan>
+        </text>
       </g>
       </g>
-      <g id="SvgjsG1087" transform="translate(201.671875,170.34375)">
-        <path id="SvgjsPath1088" d="M 0 0L 100 0L 100 40L 0 40Z" stroke="none" fill="none"></path>
-        <g id="SvgjsG1089"><text id="SvgjsText1090" font-family="微软雅黑" text-anchor="middle" font-size="13px"
-            width="100px" fill="#323232" font-weight="400" align="middle" lineHeight="125%" anchor="middle"
-            family="微软雅黑" size="13px" weight="400" font-style="" opacity="1" y="9.375" transform="rotate(0)"></text></g>
+    </g>
+      <!-- 线 -->
+      <g id="SvgjsG1101" transform="translate(314.63,17)">
+        <path id="SvgjsPath1102" d="M 11 0L 11 40" stroke="rgba(49,98,146,1)" stroke-width="2" fill="none"></path>
+        <path id="SvgjsPath1103" d="M 0 0L 21 0L 21 40L 0 40Z" stroke="none" fill="none"></path>
       </g>
       </g>
-      <g id="SvgjsG1091" transform="translate(698.5052083333334,183.84375)">
-        <path id="SvgjsPath1092" d="M 0 0L 180 0L 180 40L 0 40Z" stroke="none" fill="none"></path>
-        <g id="SvgjsG1093"><text id="SvgjsText1094" font-family="微软雅黑" text-anchor="middle" font-size="13px"
-            width="180px" fill="#323232" font-weight="400" align="middle" lineHeight="125%" anchor="middle"
-            family="微软雅黑" size="13px" weight="400" font-style="" opacity="1" y="0.875" transform="rotate(0)">
-            <tspan id="SvgjsTspan1095" dy="16" x="90">
-              <tspan id="SvgjsTspan1096" style="text-decoration:;fill: rgb(51, 35, 62);">了解立项技术的产业发展现</tspan>
+      <!-- 图标 -->
+      <g id="SvgjsG1104" transform="translate(10.66,17)">
+        <path id="SvgjsPath1105" d="M 0 0L 40 0L 40 40L 0 40Z" stroke="none" fill="url(#SvgjsPattern1106)"></path>
+      </g>
+      <!-- 栏位-->
+      <g id="SvgjsG1126" transform="translate(335.84,12.12)">
+        <path id="SvgjsPath1127" d="M 0 0L 55.66666666666663 0L 55.66666666666663 49.74990081787348L 0 49.74990081787348Z" stroke="none" fill="none"></path>
+        <g id="SvgjsG1128">
+          <text id="SvgjsText1129" font-family="思源黑体" text-anchor="start" font-size="13px" width="56px" fill="#316292" font-weight="700" align="middle" lineHeight="125%" anchor="start" family="思源黑体" size="13px" weight="700" font-style="" opacity="1" y="-2.2500495910632594" transform="rotate(0)">
+            <tspan id="SvgjsTspan1130" dy="16.25" x="0">
+              <tspan id="SvgjsTspan1131" style="">数据库:</tspan>
+            </tspan>
+            <tspan id="SvgjsTspan1132" dy="16.25" x="0">
+              <tspan id="SvgjsTspan1133" style="">报告:</tspan>
             </tspan>
             </tspan>
-            <tspan id="SvgjsTspan1097" dy="16" x="90">
-              <tspan id="SvgjsTspan1098" style="text-decoration:;fill: rgb(51, 35, 62);">状,企业合作情况</tspan>
+            <tspan id="SvgjsTspan1134" dy="16.25" x="0">
+              <tspan id="SvgjsTspan1135" style="">挖掘:</tspan>
             </tspan>
             </tspan>
-          </text></g>
+          </text>
+        </g>
       </g>
       </g>
-      <g id="SvgjsG1099" transform="translate(230.2552083333328,183.84375)">
-        <path id="SvgjsPath1100" d="M 0 0L 179.91666666666703 0L 179.91666666666703 40L 0 40Z" stroke="none"
-          fill="none"></path>
-        <g id="SvgjsG1101"><text id="SvgjsText1102" font-family="微软雅黑" text-anchor="middle" font-size="13px"
-            width="180px" fill="#323232" font-weight="400" align="middle" lineHeight="125%" anchor="middle"
-            family="微软雅黑" size="13px" weight="400" font-style="" opacity="1" y="0.875" transform="rotate(0)">
-            <tspan id="SvgjsTspan1103" dy="16" x="90">
-              <tspan id="SvgjsTspan1104" style="text-decoration:;nullfill: rgb(51, 35, 62);">了解目标国家/地区对立项技术</tspan>
+      <!-- 数量 -->
+      <g id="SvgjsG1136" transform="translate(376.96,10.44)">
+        <path id="SvgjsPath1137" d="M 0 0L 45.49999999999966 0L 45.49999999999966 53.125L 0 53.125Z" stroke="none" fill="none"></path>
+        <g id="SvgjsG1138">
+          <text id="SvgjsText1139" font-family="思源黑体" text-anchor="end" font-size="13px" width="46px" fill="#316292" font-weight="700" align="middle" lineHeight="125%" anchor="end" family="思源黑体" size="13px" weight="700" font-style="" opacity="1" y="-0.5625" transform="rotate(0)">
+            <tspan id="SvgjsTspan1140" dy="16.25" x="46">
+              <tspan id="SvgjsTspan1141" style="">{{产业/行业专利调查, 2 }}</tspan>
             </tspan>
             </tspan>
-            <tspan id="SvgjsTspan1105" dy="16" x="90">
-              <tspan id="SvgjsTspan1106" style="text-decoration:;nullfill: rgb(51, 35, 62);">相关产业发展态度及市场环境</tspan>
+            <tspan id="SvgjsTspan1142" dy="16.25" x="46">
+              <tspan id="SvgjsTspan1143" style="">{{产业/行业专利调查, 3 }}</tspan>
             </tspan>
             </tspan>
-          </text></g>
-      </g>
-      <g id="SvgjsG1107" transform="translate(1134.3385416666679,183.84375)">
-        <path id="SvgjsPath1108" d="M 0 0L 180 0L 180 40L 0 40Z" stroke="none" fill="none"></path>
-        <g id="SvgjsG1109"><text id="SvgjsText1110" font-family="微软雅黑" text-anchor="middle" font-size="13px"
-            width="180px" fill="#323232" font-weight="400" align="middle" lineHeight="125%" anchor="middle"
-            family="微软雅黑" size="13px" weight="400" font-style="" opacity="1" y="9.375" transform="rotate(0)">
-            <tspan id="SvgjsTspan1111" dy="16" x="90">
-              <tspan id="SvgjsTspan1112" style="text-decoration:;fill: rgb(51, 35, 62);">了解立项技术的现有专利情况</tspan>
+            <tspan id="SvgjsTspan1144" dy="16.25" x="42">
+              <tspan id="SvgjsTspan1145" style="">{{产业/行业专利调查, 4 }}</tspan>
             </tspan>
             </tspan>
-          </text></g>
+          </text>
+        </g>
       </g>
       </g>
-    </svg>
+  </g>
+  
+  
+
+  <g id="SvgjsG1108" transform="translate(248.40625,177.59375)">
+    <path id="SvgjsPath1109" d="M 0 0L 409 0L 409 29L 0 29Z" stroke="none" fill="none"></path>
+    <g id="SvgjsG1110">
+      <text id="SvgjsText1111" font-family="思源黑体" text-anchor="middle" font-size="15px" width="409px" fill="#323232" font-weight="700" align="middle" lineHeight="125%" anchor="middle" family="思源黑体" size="15px" weight="700" font-style="" opacity="1" y="2.125" transform="rotate(0)">
+        <tspan id="SvgjsTspan1112" dy="18.75" x="204.5">
+          <tspan id="SvgjsTspan1113" style="">了解目标国家/地区对立项技术相关产业发展态度及市场环境</tspan>
+        </tspan>
+      </text>
+    </g>
+  </g>
+  <g id="SvgjsG1114" transform="translate(846.40625,174.65625)">
+    <path id="SvgjsPath1115" d="M 0 0L 304 0L 304 34.875L 0 34.875Z" stroke="none" fill="none"></path>
+    <g id="SvgjsG1116">
+      <text id="SvgjsText1117" font-family="思源黑体" text-anchor="middle" font-size="15px" width="304px" fill="#323232" font-weight="700" align="middle" lineHeight="125%" anchor="middle" family="思源黑体" size="15px" weight="700" font-style="" opacity="1" y="5.0625" transform="rotate(0)">
+        <tspan id="SvgjsTspan1118" dy="18.75" x="152">
+          <tspan id="SvgjsTspan1119" style="">了解立项技术的产业发展现状,企业合作情况</tspan>
+        </tspan>
+      </text>
+    </g>
+  </g>
+  <g id="SvgjsG1120" transform="translate(1452.4479166666567,172.09375)">
+    <path id="SvgjsPath1121" d="M 0 0L 206.95833333334326 0L 206.95833333334326 40L 0 40Z" stroke="none" fill="none"></path>
+    <g id="SvgjsG1122">
+      <text id="SvgjsText1123" font-family="思源黑体" text-anchor="middle" font-size="15px" width="207px" fill="#323232" font-weight="700" align="middle" lineHeight="125%" anchor="middle" family="思源黑体" size="15px" weight="700" font-style="" opacity="1" y="7.625" transform="rotate(0)">
+        <tspan id="SvgjsTspan1124" dy="18.75" x="103.5">
+          <tspan id="SvgjsTspan1125" style="">了解立项技术的现有专利情况</tspan>
+        </tspan>
+      </text>
+    </g>
+  </g>
+
+
+  
+</svg>

+ 36 - 0
src/api/newApi/product.js

@@ -51,6 +51,42 @@ export default {
     return axios.post("/xiaoshi/product/deleteProduct", data);
     return axios.post("/xiaoshi/product/deleteProduct", data);
   },
   },
  
  
+  /**
+   * 新增产品营销数据
+   */
+  addProductMarketData(data) {
+    return axios.post("/xiaoshi/productMarketData/addProductMarketData", data);
+  },
+  /**
+   * 修改产品营销数据
+   */
+  updateProductMarketDat(data) {
+    return axios.post("/xiaoshi/productMarketData/updateProductMarketData", data);
+  },
+  /**
+   * 查询产品营销数据
+   */
+  queryProductMarketData(data) {
+    return axios.post("/xiaoshi/productMarketData/queryProductMarketData", data);
+  },
+  /**
+   * 删除产品营销数据
+   */
+  deleteProductMarketData(data) {
+    return axios.post("/xiaoshi/productMarketData/deleteProductMarketData", data);
+  },
+  /**
+   * 分组查询产品营销数据(趋势图)
+   */
+  groupProductMarketData(data) {
+    return axios.post("/xiaoshi/productMarketData/groupProductMarketData", data);
+  },
+  /**
+   * 获取公司和地区
+   */
+  getAllCompanyAndArea(data) {
+    return axios.post("/xiaoshi/productMarketData/getAllCompanyAndArea", data);
+  },
   
   
   
   
 };
 };

+ 16 - 0
src/assets/css/main.scss

@@ -102,4 +102,20 @@
   //   border-right: 1px solid rgba(124,124,124) !important;
   //   border-right: 1px solid rgba(124,124,124) !important;
   //   border-left: 1px solid rgba(124,124,124) !important;
   //   border-left: 1px solid rgba(124,124,124) !important;
   // }
   // }
+
+  //不换行  
+  .noWrap{
+    overflow: hidden;
+    white-space: nowrap;
+    text-overflow:ellipsis;
+  }
+  .btn{
+    margin: 0;
+    i{
+      color: var(--color2);
+      font-size: 16px;
+      margin-right:16px
+    }
+  }
+  
   
   

+ 21 - 22
src/router/index.js

@@ -140,6 +140,7 @@ const routes = [
         children:[
         children:[
           {
           {
             path:'/',
             path:'/',
+            name:'/',
             meta: {
             meta: {
               title: '产品',
               title: '产品',
               sign:'product',
               sign:'product',
@@ -147,20 +148,16 @@ const routes = [
             },
             },
             component: () => import('@/views/product/index.vue'),
             component: () => import('@/views/product/index.vue'),
           },
           },
-      //     {
-      //       path: "/productDetails",
-      //       meta: {
-      //        title: '产品详情',
-      //       },
-      //       component: () => import('@/views/product/components/productDetails'),
-      //     },
-      //     {
-      //       path: "/categoryDetails",
-      //       meta: {
-      //        title: '产品类别详情',
-      //       },
-      //       component: () => import('@/views/product/components/categoryDetails'),
-      //     },
+          {
+            path: "/productDetails",
+            name:'productDetails',
+            meta: {
+              title: '详情',
+              sign:'productDetails',
+              belong:'Product'
+            },
+            component: () => import('@/views/product/components/details'),
+          },
       //     {
       //     {
       //       path: "/mindIndex",
       //       path: "/mindIndex",
       //       meta: {
       //       meta: {
@@ -169,14 +166,16 @@ const routes = [
       //      },
       //      },
       //      component: () => import('@/views/product/components/jsMind'),
       //      component: () => import('@/views/product/components/jsMind'),
       //    },
       //    },
-      //    {
-      //       path: "/chartIndex",
-      //       meta: {
-      //         title: '趋势图',
-      //         button: [],
-      //       },
-      //       component: () => import('@/views/product/components/echarts'),
-      //     },
+         {
+            path: "/chartIndex",
+            name:'chartIndex',
+            meta: {
+              title: '趋势图',
+              sign: 'chartIndex',
+              belong:'Product'
+            },
+            component: () => import('@/views/product/components/echarts'),
+          },
           {
           {
             path: "/frameworkIndex",
             path: "/frameworkIndex",
             meta: {
             meta: {

+ 5 - 1
src/store/modules/dictMessage.js

@@ -3,7 +3,8 @@ export default {
     //公用字典
     //公用字典
     dictMessage:[],
     dictMessage:[],
     //应用场景
     //应用场景
-    scenario:[]
+    scenario:[],
+    matter:[]
   },
   },
 
 
   mutations: {
   mutations: {
@@ -13,6 +14,9 @@ export default {
     SET_Scenario(state,scenario){
     SET_Scenario(state,scenario){
       state.scenario=scenario
       state.scenario=scenario
     },
     },
+    SET_Matter(state,matter){
+      state.matter=matter
+    },
   },
   },
 
 
   actions: {
   actions: {

+ 1 - 1
src/utils/common.js

@@ -101,7 +101,7 @@ export default {
    */
    */
   getColumnData(row,field,prop,data){
   getColumnData(row,field,prop,data){
     if(field.type == 'Array'){
     if(field.type == 'Array'){
-      if(row[field.value]){
+      if(row[field.value] && row[field.value].length>0){
         if(prop){
         if(prop){
          return row[field.value].map(item=>{
          return row[field.value].map(item=>{
             return item[prop]
             return item[prop]

+ 46 - 2
src/utils/model/RichText/index.vue

@@ -1,6 +1,6 @@
 <template>
 <template>
   <div>
   <div>
-    <div class="edit-box div_MAX_Height" contenteditable="true" :placeholder="placeholder" v-html="content" :key="keys" :id="keys"
+    <div class="edit-box div_MAX_Height" ref="myEditBox" contenteditable="true" :placeholder="placeholder" v-html="content" :key="keys" :id="keys"
         @blur="saveValue($event)" @click="getFocus($event)" v-on:paste="handlePaste($event)">
         @blur="saveValue($event)" @click="getFocus($event)" v-on:paste="handlePaste($event)">
     </div>
     </div>
   </div>
   </div>
@@ -69,6 +69,19 @@ export default {
           this.setCursor(event,text2,1)
           this.setCursor(event,text2,1)
           break;
           break;
         }
         }
+        // if(items[i].type.indexOf("text/html") !== -1){
+        //   var string = (event.originalEvent || event).clipboardData.getData('text/html')
+
+				// const srcRegex = /<img\s+(?:[^>]*?\s+)?src\s*=\s*(["'])((?:[^\1"]|\\\1|.)*?)\1/g
+				// const result = [...string.matchAll(srcRegex)]
+				// var src = result.map(v => v[2])[0]
+        // console.log(src)
+        // var reader  = new FileReader()
+        // var srcBase64 = reader.readAsDataURL(src)
+        // // var srcBase64 =await this.urlToBase64(src)
+        //   console.log(srcBase64)
+        //   continue;
+        // }
         if (items[i].type.indexOf("image") !== -1) {
         if (items[i].type.indexOf("image") !== -1) {
           var e = event || window.event
           var e = event || window.event
           e.preventDefault();
           e.preventDefault();
@@ -130,8 +143,37 @@ export default {
       // console.log(window.getSelection().getRangeAt(0))
       // console.log(window.getSelection().getRangeAt(0))
      
      
     },
     },
+    /**
+ * 根据图片的url转换对应的base64值
+ * @param { String } imageUrl 如:http://xxxx/xxx.png
+ * @returns base64取值
+ */
+async urlToBase64(imageUrl) {
+    return new Promise((resolve, reject) => {
+      let canvas = document.createElement('canvas')
+      const ctx = canvas.getContext('2d')
+      let img = new Image()
+      img.crossOrigin = 'Anonymous' // 解决Canvas.toDataURL 图片跨域问题
+      img.src = imageUrl
+      img.onload = function() {
+        canvas.height = img.height
+        canvas.width = img.width
+        ctx.fillStyle = '#fff' // canvas背景填充颜色默认为黑色
+        // ctx.fillRect(0,0,img.width,img.height)
+        ctx.drawImage(img, 0, 0,img.width,img.height) // 参数可自定义
+        const dataURL = canvas.toDataURL('image/jpeg', 1) // 获取Base64编码
+        resolve(dataURL)
+        canvas = null // 清除canvas元素
+        img = null // 清除img元素
+      }
+      img.onerror = function() {
+        reject(new Error('Could not load image at ' + imageUrl))
+      }
+    })
+},
     //设置光标位置
     //设置光标位置
     setCursor(event,str,type){
     setCursor(event,str,type){
+      console.log(event)
           var content = event.target.innerHTML
           var content = event.target.innerHTML
           // previousSibling
           // previousSibling
           var indexText = this.getColumn(event.target,window.getSelection())
           var indexText = this.getColumn(event.target,window.getSelection())
@@ -139,7 +181,9 @@ export default {
           var childNodes = event.target.childNodes
           var childNodes = event.target.childNodes
           if(!content){
           if(!content){
             if(event.target.nodeName == 'BR'){
             if(event.target.nodeName == 'BR'){
-              event.target.parentNode.innerHTML = str
+              const span = document.createElement('span');
+              span.innerHTML = str;
+              event.target.parentNode.insertBefore(span,event.target)
               var selectedRange = document.createRange();
               var selectedRange = document.createRange();
               selectedRange.setStart(event.target,index2);
               selectedRange.setStart(event.target,index2);
               return false
               return false

+ 9 - 1
src/utils/model/index.js

@@ -19,6 +19,10 @@ import myCascader from './Cascader/index'
 import myNodeCopy from './nodeCopy/index'
 import myNodeCopy from './nodeCopy/index'
 import myTooltip from './tooltip/index'
 import myTooltip from './tooltip/index'
 
 
+//tab
+import myTabs from './tabs/index'
+import myTabsItem from './tabs/tabsItem'
+
 var models = {
 var models = {
   myCustomSvg,
   myCustomSvg,
   myTree,
   myTree,
@@ -38,7 +42,11 @@ var models = {
   myUpload,
   myUpload,
   myCascader,
   myCascader,
   myNodeCopy,
   myNodeCopy,
-  myTooltip
+  myTooltip,
+
+  //tab
+  myTabs,
+  myTabsItem
 }
 }
 export default {
 export default {
   install(Vue) {
   install(Vue) {

+ 3 - 0
src/utils/model/retrieval/search.vue

@@ -126,6 +126,9 @@ export default {
             var field = this.SearchFields.find(item => {
             var field = this.SearchFields.find(item => {
               return item.value == key
               return item.value == key
             })
             })
+            if(!field){
+              return false
+            }
             if (typeof this.searchValue[key] == 'object') {
             if (typeof this.searchValue[key] == 'object') {
               this.searchOptions.push(
               this.searchOptions.push(
                 {
                 {

+ 175 - 49
src/utils/model/route.vue

@@ -1,57 +1,183 @@
 <template>
 <template>
-  <div>
-    <Cascader :options="[
-        {
-          label:'事件1',
-          value:'1'
-        },
-        {
-          label:'事件2',
-          value:'2'
-        },
-      ]">
-      <i slot="reference" class="el-icon-circle-plus-outline" style="font-size:20px;"></i>
-    </Cascader>
-    <myUpload :multiple="true" :fileList="[{name:'场景可视化.jpg'}]" accept=".png,.jpg"></myUpload>
-    <my-date value=""></my-date>
-    <myTooltop effect="dark" content="123" placement="top-start">
-      <div class="tooltip">你哈d </div>
-    </myTooltop>
-    <myTooltop effect="dark" content="123" placement="top-start">
-      <div class="tooltip">fdgfdfdfdgdddfddz fvfbvzd 宾馆饭店不放单放单 </div>
-    </myTooltop>
-  </div>
+  <svg
+    id="SvgjsSvg1006"
+    width="348"
+    height="155"
+    xmlns="http://www.w3.org/2000/svg"
+    version="1.1"
+    xmlns:xlink="http://www.w3.org/1999/xlink"
+    xmlns:svgjs="http://svgjs.com/svgjs"
+  >
+    <defs id="SvgjsDefs1007">
+      <pattern
+        patternUnits="userSpaceOnUse"
+        id="pattern_mark_0"
+        width="300"
+        height="300"
+      >
+        <text
+          x="150"
+          y="100"
+          fill="rgba(229,229,229,0.8)"
+          font-size="18"
+          transform="rotate(-45, 150, 150)"
+          style="dominant-baseline: middle; text-anchor: middle"
+        ></text>
+      </pattern>
+      <pattern
+        patternUnits="userSpaceOnUse"
+        id="pattern_mark_1"
+        width="300"
+        height="300"
+      >
+        <text
+          x="150"
+          y="200"
+          fill="rgba(229,229,229,0.8)"
+          font-size="18"
+          transform="rotate(-45, 150, 150)"
+          style="dominant-baseline: middle; text-anchor: middle"
+        ></text>
+      </pattern>
+    </defs>
+    <rect
+      id="svgbackgroundid"
+      width="348"
+      height="155"
+      fill="transparent"
+    ></rect>
+    <rect
+      id="SvgjsRect1009"
+      width="348"
+      height="155"
+      fill="url(#pattern_mark_0)"
+    ></rect>
+    <rect
+      id="SvgjsRect1010"
+      width="348"
+      height="155"
+      fill="url(#pattern_mark_1)"
+    ></rect>
+    <g id="SvgjsG1011" transform="translate(25,25)">
+      <path
+        id="SvgjsPath1012"
+        d="M 0 0L 298 0L 298 105L 0 105Z"
+        stroke="rgba(255,255,255,1)"
+        stroke-width="1.5"
+        fill-opacity="1"
+        fill="#ffffff"
+      ></path>
+      <g id="SvgjsG1013">
+        <text
+          id="SvgjsText1014"
+          font-family="微软雅黑"
+          text-anchor="middle"
+          font-size="13px"
+          width="278px"
+          fill="#323232"
+          font-weight="400"
+          align="middle"
+          lineHeight="125%"
+          anchor="middle"
+          family="微软雅黑"
+          size="13px"
+          weight="400"
+          font-style=""
+          opacity="1"
+          y="41.875"
+          transform="rotate(0)"
+        ></text>
+      </g>
+    </g>
+    <g id="SvgjsG1015" transform="translate(25,25)">
+      <path
+        id="SvgjsPath1016"
+        d="M 0 0L 100 0L 100 105L 0 105Z"
+        stroke="none"
+        fill="none"
+      ></path>
+      <g id="SvgjsG1017" >
+        <rect  width="100px" height="100px"
+          fill="white"></rect>
+        <text
+          id="SvgjsText1018"
+          font-family="微软雅黑"
+          text-anchor="start"
+          dominant-baseline="middle"
+          font-size="13px"
+          width="100px"
+          height="100px"
+          fill="#323232"
+          font-weight="400"
+          align="middle"
+          lineHeight="200%"
+          anchor="start"
+          family="微软雅黑"
+          size="13px"
+          weight="400"
+          font-style=""
+          opacity="1"
+          y="6"
+          transform="rotate(0)"
+          
+        >
+         数据库
+        </text>
+      </g>
+    </g>
+    <g id="SvgjsG1025" transform="translate(137,25)">
+      <path
+        id="SvgjsPath1026"
+        d="M 0 0L 186 0L 186 105L 0 105Z"
+        stroke="none"
+        fill="none"
+      ></path>
+      <g id="SvgjsG1027">
+        <text
+          id="SvgjsText1028"
+          font-family="微软雅黑"
+          text-anchor="end"
+          font-size="13px"
+          width="186px"
+          fill="#323232"
+          font-weight="400"
+          align="middle"
+          lineHeight="200%"
+          anchor="end"
+          family="微软雅黑"
+          size="13px"
+          weight="400"
+          font-style=""
+          opacity="1"
+          y="6"
+          transform="rotate(0)"
+        >
+          <tspan id="SvgjsTspan1029" dy="26" x="186">
+            <tspan id="SvgjsTspan1030" style="">10</tspan>
+          </tspan>
+       
+          <tspan id="SvgjsTspan1033" dy="26" x="186">
+            <tspan id="SvgjsTspan1034" style="">30</tspan>
+          </tspan>
+        </text>
+      </g>
+    </g>
+  </svg>
 </template>
 </template>
+
 <script>
 <script>
-import Cascader from './Cascader/index.vue'
-import myDate from './date/index.vue'
-import myTooltop from './tooltip/index.vue'
 export default {
 export default {
-  components:{
-    Cascader,
-    myDate,
-    myTooltop
-  },
+  components: {},
+  props: {},
   data() {
   data() {
-    return {
-      time:'2023',
-
-    };
-  },
-  watch:{
-    time(val){
-      console.log(val)
-    }
+    return {};
   },
   },
-  methods: {
-  }
+  watch: {},
+  computed: {},
+  created() {},
+  mounted() {},
+  methods: {},
 };
 };
 </script>
 </script>
-<style lang="scss">
-  .tooltip{
-    width: 100px;
-    overflow: hidden;
-    white-space: nowrap;
-    text-overflow:ellipsis;
-  }
-</style>
+<style lang="scss" scoped>
+</style>

+ 9 - 8
src/utils/model/svg/customSvg.vue

@@ -86,9 +86,9 @@ export default {
       // 展示svg文件
       // 展示svg文件
       await fetch(show.value).then(res => res.text()).then(data => {
       await fetch(show.value).then(res => res.text()).then(data => {
         this.fileContent = data
         this.fileContent = data
-        // if (Object.keys(this.total).length > 0 && Object.keys(this.QuestionTotal).length > 0) {
+        if (Object.keys(this.total).length > 0 && Object.keys(this.QuestionTotal).length > 0) {
           this.getHtml()
           this.getHtml()
-        // }
+        }
       })
       })
     },
     },
     //获取svg内容
     //获取svg内容
@@ -102,16 +102,17 @@ export default {
             var arr = item.match(reg1)[0].split(/\,|\,/)
             var arr = item.match(reg1)[0].split(/\,|\,/)
             if (arr[1].trim() == 1) {
             if (arr[1].trim() == 1) {
               var value = this.getQuestionTotal(arr[0].trim())
               var value = this.getQuestionTotal(arr[0].trim())
-            } else if (arr[1].trim() == 2) {
-              var value = this.getTotal(arr[0].trim())
-            } else {
-              var num = this.getTotal(arr[0].trim())
-              var value = num>0?arr[1].trim():'#63769b69'
+            } else if(arr[1].trim() == 'color'){
+              var value = this.getColor(arr[0].trim(),arr[1].trim())
+            }else if(arr[1].trim() == 'icon'){
+              var value = this.getIcon(arr[0].trim(),arr[1].trim())
+            }
+            else{
+              var value = this.getTotal(arr[0].trim(),arr[1].trim())
             }
             }
             data = data.replace(item, value);
             data = data.replace(item, value);
           })
           })
         }
         }
-        
         this.html = data;
         this.html = data;
     },
     },
     //查看单个事件流程图
     //查看单个事件流程图

+ 63 - 9
src/utils/model/svg/mixins.js

@@ -2,7 +2,9 @@
 import Question from './question.vue'
 import Question from './question.vue'
 export default {
 export default {
   props: {
   props: {
-    total: Object,
+    total: {
+      type:[Array,Object]
+    },
     QuestionTotal:Array,
     QuestionTotal:Array,
     questionName:String
     questionName:String
   },
   },
@@ -15,21 +17,73 @@ export default {
     return {}
     return {}
   },
   },
   methods: {
   methods: {
-    handleClick(type) {
-      this.$emit('on-click', type)
+    handleClick(type,val) {
+      this.$emit('on-click', {type,isPatentMining:val})
     },
     },
-    getTotal(type) {
-      const total = this.total[type]
-      if (total) {
-        return total
+    getTotal(title,type) {
+      var total = this.total.find(item=>{
+        return item.name == title
+      })
+      var types = {
+        '2':'projectCount',
+        '3':'reportCount',
+        '4':'patentMiningCount'
+      }
+      if(total){
+        return total.total[types[type]]
+      }else{
+        return 0
+      }
+    },
+    getColor(title){
+      var total = this.total.find(item=>{
+        return item.name == title
+      })
+      if(total){
+        var count = total.total
+        let sign = false
+        for(let key in count){
+          if(count[key]>0){
+            sign = true
+          }
+        }
+        if(sign){
+          return '#316292'
+        }else{
+          return '#767676'
+        }
+      }else{
+        return '#767676'
+      }
+    },
+    getIcon(title){
+      var total = this.total.find(item=>{
+        return item.name == title
+      })
+      if(total){
+        var count = total.total
+        let sign = false
+        for(let key in count){
+          if(count[key]>0){
+            sign = true
+          }
+        }
+        if(sign){
+          return 'url(#SvgjsPattern1061)'
+        }else{
+          return 'url(#SvgjsPattern1100)'
+        }
+      }else{
+        return 'url(#SvgjsPattern1100)'
       }
       }
-      return 0
     },
     },
     getQuestionTotal(type) {
     getQuestionTotal(type) {
       if(this.QuestionTotal.length>0){
       if(this.QuestionTotal.length>0){
-        const total = this.QuestionTotal.find(item=>{return item.applicationScenarioName == type}).eventNumber
+        const total = this.QuestionTotal.find(item=>{return item.name == type}).count
         if (total) {
         if (total) {
           return total
           return total
+        }else{
+          return 0
         }
         }
       }
       }
       
       

+ 312 - 0
src/utils/model/tabs/index.vue

@@ -0,0 +1,312 @@
+<template>
+    <div class="tabs" :class="{'tabs-border': showBorder}">
+      <div :class="'tabs-' + getTabsType() + '-bar'">
+        <div v-for="(item,index) in navList" :class="tabCls(item)" @click="handleChange(index)" :style="getTabFontStyle()">
+          {{ item.label }}
+          <span v-if="ifShowClose(item)" class="close icon" @click.stop="closeTab(index)" />
+        </div>
+      </div>
+      <div class="tabs-content">
+        <slot />
+      </div>
+    </div>
+</template>
+  
+  <script>
+  export default {
+    props: {
+      value: {
+        type: [String, Number]
+      },
+      border: {
+        type: Boolean,
+        default: false
+      },
+      tabsType: {
+        type: String,
+        default: 'tab'
+      },
+      fontSize: {
+        type: [String, Number],
+        default: 16
+      },
+      fontColor: {
+        type: String,
+        default: '#000000'
+      }
+    },
+    data() {
+      return {
+        defType: ['tab', 'card', 'card2', 'brief'],
+        currentValue: this.value,
+        showBorder: this.border,
+        navList: []
+      }
+    },
+    watch: {
+      value: function(val) {
+        this.currentValue = val
+      },
+      currentValue: function() {
+        this.updateStatus()
+      }
+    },
+    methods: {
+      tabCls: function(item) {
+        var active = ''
+        var tabsType = this.getTabsType()
+        var tabsBaseClass = 'tabs-' + tabsType
+  
+        if (item.name === this.currentValue) {
+          active = 'tabs-' + tabsType + '-active'
+        }
+  
+        return [
+          tabsBaseClass,
+          active
+        ]
+      },
+      getTabs() {
+        // 通过遍历子组件,得到所有的pane组件
+        return this.$children.filter(function(item) {
+          return item.$options.name === 'Pane' || item.$options.name === 'pane'
+        })
+      },
+      updateNav() {
+        this.navList = []
+        var _this = this
+        this.getTabs().forEach(function(pane, index) {
+          _this.navList.push({
+            label: pane.label,
+            name: pane.name || index,
+            closable: pane.closable
+          })
+          if (!pane.name) {
+            pane.name = index
+          }
+          if (index == 0) {
+            if (!_this.currentValue) {
+              _this.currentValue = pane.name || index
+            }
+          }
+        })
+        this.updateStatus()
+      },
+      updateStatus() {
+        var _this = this
+        // 显示当前选中的tab对应的pane组件
+        _this.getTabs().forEach(function(tab) {
+          tab.show = tab.name === _this.currentValue
+          // return
+        })
+      },
+      handleChange: function(index) {
+        var nav = this.navList[index]
+        var name = nav.name
+        // 更新当前选择的tab
+        this.currentValue = name
+        // 更新value
+        this.$emit('input', name)
+      },
+      ifShowClose(item) {
+        // 是否显示关闭标签按钮
+        return item.closable
+      },
+      // 点击关闭按钮触发的事件
+      closeTab(index) {
+        // console.log(this.navList[index].name, this.currentValue);
+        // 如果关闭的是当前选择的tab,则将currentValue转到前一个tab
+        if (this.navList[index].name == this.currentValue) {
+          let toIndex = index - 1
+          toIndex = toIndex >= 0 ? toIndex : this.navList.length + toIndex
+          console.log(toIndex)
+          this.currentValue = this.navList[toIndex].name
+        }
+        // 关闭当前标签页
+        this.navList.splice(index, 1)
+      },
+      // 根据组件属性tabsType 设置tabs头部样式
+      getTabsType() {
+        if (this.$data.defType.indexOf(this.tabsType) === -1) {
+          return 'tab'
+        }
+        return this.tabsType
+      },
+      // 根据组件属性fontSize 设置tab 字体大小和颜色
+      getTabFontStyle() {
+        if (!/^#[0-9a-fA-F]{6}$/.test(this.fontColor)) {
+          this.fontColor = '#000000'
+        }
+        if (!/^[1-3][0-9]$/.test(this.fontSize) || this.fontSize < 12) {
+          this.fontSize = 16
+        }
+        return 'font-size: ' + this.fontSize + 'px; color: ' + this.fontColor
+      }
+    }
+  }
+  </script>
+<style lang="scss" scoped>
+  [v-cloak] {
+    display: none;
+}
+.tabs {
+    margin: 3px;
+    font-size: 14px;
+    color: #657180;
+}
+.tabs-border {
+    border-width: 1px;
+    border-radius: 2px;
+    border-style: solid;
+    border-color: #e6e6e6;
+    box-shadow: 0 2px 5px 0 rgb(0 0 0 / 10%)
+}
+.tabs-tab-bar:after {
+    content: '';
+    width: 100%;
+    height: 1px;
+    display: block;
+    margin-top: -1px;
+    background: #d7dde4;
+}
+.tabs-tab {
+    cursor: pointer;
+    padding: 6px 16px;
+    margin-right: 6px;
+    background: #fff;
+    position: relative;
+    display: inline-block;
+    border: 1px solid #d7dde4;
+}
+.tabs-tab-active {
+    color: #3399ff;
+    border-top: 1px solid #3399ff;
+    border-bottom: 1px solid #fff;
+}
+.tabs-tab-active:before {
+    content: '';
+    top: 0;
+    left: 0;
+    right: 0;
+    height: 1px;
+    display: block;
+    position: absolute;
+    background: #3399ff;
+}
+/*brief 风格的tabs 样式 start*/
+.tabs-brief-bar:after {
+    content: '';
+    width: 100%;
+    height: 1px;
+    display: block;
+    margin-top: -1px;
+    background: #d7dde4;
+}
+.tabs-brief {
+    cursor: pointer;
+    padding: 8px 16px;
+    background: #fff;
+    position: relative;
+    display: inline-block;
+}
+.tabs-brief-active {
+    border-top: none;
+    font-weight: 800;
+    color: #3399ff !important;
+    border-bottom: 1px solid #d7dde4;
+}
+.tabs-brief-active:after {
+    content: '';
+    left: 0;
+    right: 0;
+    height: 2px;
+    bottom: -3px;
+    display: block;
+    position: absolute;
+    background: #3399ff;
+}
+/*brief 风格的tabs 样式 end*/
+
+/*card 风格的tabs 样式 start*/
+.tabs-card-bar {
+    background: #F1F1F1;
+}
+.tabs-card {
+    cursor: pointer;
+    padding: 8px 16px;
+    position: relative;
+    display: inline-block;
+}
+.tabs-card-active {
+    font-weight: 800;
+    color: #3399ff !important;
+}
+/*card 风格的tabs 样式 end*/
+
+/*card2 风格的tabs 样式 start*/
+.tabs-card2-bar {
+    background: #F1F1F1;
+}
+.tabs-card2 {
+    cursor: pointer;
+    padding: 8px 16px;
+    position: relative;
+    display: inline-block;
+}
+.tabs-card2-active {
+    font-weight: 800;
+    background: #ffffff;
+}
+/*card 风格的tabs 样式 end*/
+
+.tabs-content {
+    min-height: 100px;
+    padding: 6px;
+}
+.pane {
+    height: 0;
+    width: 100%;
+    visibility: hidden;
+    transition: all .5s ease-in;
+    transform: translateX(-100%);
+}
+.pane-active {
+    visibility: visible;
+    transform: translateX(0);
+}
+
+/* 关闭按钮样式 start*/
+.close.icon {
+    width: 11px;
+    height: 11px;
+    color: #000;
+    margin-left: 5px;
+    border-radius: 50%;
+    position: relative;
+    display: inline-block;
+}
+.close.icon:hover {
+    background: #eee;
+}
+.close.icon:before {
+    content: '';
+    top: 5px;
+    width: 11px;
+    height: 1px;
+    position: absolute;
+    background-color: currentColor;
+    -webkit-transform: rotate(-45deg);
+    transform: rotate(-45deg);
+}
+.close.icon:after {
+    content: '';
+    top: 5px;
+    width: 11px;
+    height: 1px;
+    position: absolute;
+    background-color: currentColor;
+    -webkit-transform: rotate(45deg);
+    transform: rotate(45deg);
+}
+/* 关闭按钮样式 end*/
+  </style>

+ 54 - 0
src/utils/model/tabs/tabsItem.vue

@@ -0,0 +1,54 @@
+<template>
+    <div :class="getCls()">
+        
+      <slot />
+    </div>
+</template>
+  
+  <script>
+  export default {
+    props: {
+      name: {
+        type: String
+      },
+      label: {
+        type: String,
+        default: ''
+      },
+      closable: {
+        type: Boolean,
+        default: false
+      }
+    },
+    data: function() {
+      return {
+        show: true
+      }
+    },
+    watch: {
+      label() {
+        this.updateNav()
+      }
+    },
+    mounted() {
+      this.updateNav()
+    },
+    methods: {
+      updateNav() {
+        this.$parent.updateNav()
+      },
+      // 决定pane是否显示
+      getCls() {
+        return [
+          'pane',
+          {
+            'pane-active': this.show
+          }
+        ]
+      }
+    }
+  }
+  </script>
+  
+  <style scoped>
+  </style>

+ 5 - 5
src/utils/window.js

@@ -1,12 +1,12 @@
 exports.install = function (Vue) {
 exports.install = function (Vue) {
 
 
-  Vue.prototype.handleClick = function (val) {
+  Vue.prototype.handleClick = function (title,type) {
     const component = findComponentDownward(this, 'myCustomSvg')
     const component = findComponentDownward(this, 'myCustomSvg')
-    component.handleClick(val)
+    component.handleClick(title,type)
   }
   }
-  Vue.prototype.getQuestionTotal = function (val) {
-    const component = findComponentDownward(this, 'myCustomSvg')
-    component.getQuestionTotal(val)
+  Vue.prototype.handleClick2 = function (title) {
+    const component = findComponentDownward(this, 'flowPath')
+    component.openEventDrawer(title)
   }
   }
   Vue.prototype.svgOnMouseenter = function (e, val) {
   Vue.prototype.svgOnMouseenter = function (e, val) {
     const component = findComponentDownward(this, 'myPopover')
     const component = findComponentDownward(this, 'myPopover')

+ 1 - 0
src/views/components/dialog/fields.vue

@@ -7,6 +7,7 @@
       width="300px"
       width="300px"
       :before-close="handleClose"
       :before-close="handleClose"
       :close-on-click-modal="false"
       :close-on-click-modal="false"
+      :append-to-body="true"
     >
     >
       <div>
       <div>
         <el-checkbox
         <el-checkbox

+ 757 - 0
src/views/components/setting/mixins.js

@@ -0,0 +1,757 @@
+export const settingData = {
+    props: {
+      form: Object
+    },
+   
+  }
+
+export const settingMethod = {
+    data() {
+        return {
+            form:{
+                setting: {
+                  backgroundColor:'rgb(255 255 255)',
+                  text:{
+                    text:'',
+                    show: true,
+                    link:'',
+                    target: 'blank',
+                    subtext: '',
+                    sublink:'',
+                    subtarget: 'blank',
+                    left: 'center',
+                    bottom: 0,
+                    backgroundColor: 'rgba(0,0,0,0)',
+                    borderColor: "#ccc",
+                    borderWidth: 0,
+                    padding: 5,
+                    itemGap: 10,
+                    textStyle:{
+                      fontSize: 14,
+                      fontWeight: false,
+                      color: '#464646',
+                    },
+                    subtextStyle:{
+                      fontSize: 14,
+                      fontWeight: false,
+                      color: '#464646',
+                    }
+                  },
+                  yMin:0,
+                  splitNumber:'',
+                  yMax:'',
+                  type: 2,
+                  showType: 0,
+                  tableType: 0,
+                  theme: "customed",
+                  titleSize: 14,
+                  dataSize: 14,
+                  axisSize: 14,
+                  dataLabel: false,
+                  dataLabel2: false,
+                  dataLabel3: false,
+                  title1Dir: 0,
+                  title1: "",
+                  title2: "",
+                  dataPosition: "top",
+                  fontFamily: "sans-serif",
+                  fontFamily2: "sans-serif",
+                  fontFamily3: "sans-serif",
+                  fontFamily4: "sans-serif",
+                  fontWeight: false,
+                  fontWeight2: false,
+                  nameLocation: "end",
+                  nameLocation2: "end",
+                  width: "100",
+                  height: "500",
+                  widthUnit: "%",
+                  heightUnit: "px",
+                  splitLine: false,
+                  splitLine2: true,
+                  legend: true,
+                  gridTop: "10",
+                  gridLeft: "10",
+                  gridBottom: "10",
+                  gridRight: "10",
+                  labelColor: "#000000",
+                  legendColor: "#000000",
+                  legendLocation: "top",
+                  legendFontSize: "13",
+                  fontSize: "13",
+                  fontSize2: "13",
+                  fontColor: "#000000",
+                  fontColor2: "#000000",
+                  show: true,
+                  show2: true,
+                  interval: true,
+                  interval2: true,
+                  rotate: "0",
+                  rotate2: "0",
+                  paddingTop: 0,
+                  paddingBottom: 0,
+                  paddingRight: 0,
+                  paddingLeft: 0,
+                  paddingTop2: 0,
+                  paddingLeft2: 0,
+                  paddingBottom2: 0,
+                  paddingRight2: 0,
+                  type2: "scroll",
+                  barWidth: "",
+                  scatterSize: "0",
+                  config: {
+                    color: [],
+                    line: {
+                      name: "",
+                      first: "",
+                      second: "",
+                      operator: 0,
+                      enable: false
+                    },
+                    table: []
+                  }
+                },
+                schema: {
+                  x: {
+                    num: 10
+                  },
+                  y: {
+                    num: 10
+                  },
+                },
+                source: {
+                  x: [],
+                  y: []
+                },
+              },
+            selected:{},
+        }
+    },
+    watch:{
+        form(val){
+            // console.log(val)
+        }
+    },
+    methods: {
+        handleAdd() {
+            let table = []
+            for (let i = 0; i < 10; i++) {
+              table.push({
+                min: 0,
+                max: 0,
+                color: null
+              })
+            }
+            this.form = {
+              setting: {
+                type: 2,
+                showType: 0,
+                tableType: 0,
+                theme: "customed",
+                titleSize: 14,
+                dataSize: 14,
+                axisSize: 14,
+                dataLabel: false,
+                dataLabel2: false,
+                dataLabel3: false,
+                title1Dir: 0,
+                title1: "",
+                title2: "",
+                dataPosition: "top",
+                fontFamily: "sans-serif",
+                fontFamily2: "sans-serif",
+                fontFamily3: "sans-serif",
+                fontFamily4: "sans-serif",
+                fontWeight: false,
+                fontWeight2: false,
+                nameLocation: "end",
+                nameLocation2: "end",
+                width: "100",
+                height: "650",
+                widthUnit: "%",
+                heightUnit: "px",
+                splitLine: false,
+                splitLine2: false,
+                legend: true,
+                gridTop: "0",
+                gridLeft: "0",
+                gridBottom: "0",
+                gridRight: "0",
+                labelColor: "#000000",
+                legendColor: "#000000",
+                legendLocation: "top",
+                legendFontSize: "13",
+                fontSize: "13",
+                fontSize2: "13",
+                fontColor: "#000000",
+                fontColor2: "#000000",
+                show: true,
+                show2: true,
+                interval: true,
+                interval2: true,
+                rotate: "0",
+                rotate2: "0",
+                paddingTop: 0,
+                paddingBottom: 0,
+                paddingRight: 0,
+                paddingLeft: 0,
+                paddingTop2: 0,
+                paddingLeft2: 0,
+                paddingBottom2: 0,
+                paddingRight2: 0,
+                type2: "scroll",
+                barWidth: "",
+                scatterSize: "0",
+                config: {
+                  color: [],
+                  line: {
+                    name: "",
+                    first: "",
+                    second: "",
+                    operator: 0,
+                    enable: false
+                  },
+                  table: table
+                }
+              },
+              schema: {
+                x: {
+                  num: 10
+                },
+                y: {
+                  num: 10
+                },
+              },
+              source: {
+                x: [],
+                y: []
+              },
+            }
+            // this.$store.commit('SET_CHART_FORM', form)
+            // this.drawer = true
+          },
+    },
+}
+export const chartOption = {
+    // mixins: [customPage],
+    props: {
+      width: String,
+      height: String
+    },
+    data() {
+      return {}
+    },
+    methods: {
+      async handleScreenshot(id, name) {
+        const canvas = await html2canvas(document.getElementById(id))
+        const base64 = canvas.toDataURL('image/jpg')
+        downLoadBase64(base64, name + '.png')
+      },
+      getDataLabel() {
+        return {
+          show: this.form.setting.dataLabel,
+          fontSize: this.form.setting.dataSize,
+          position: this.form.setting.dataPosition,
+          fontFamily: this.form.setting.fontFamily2,
+          color: this.form.setting.labelColor,
+          formatter: (val) => {
+            switch (val.seriesType) {
+              case 'sunburst':
+                return val.name
+              case 'heatmap':
+                return val.value[2]
+              case 'tree':
+                return val.data.name
+              case 'scatter':
+                return !val.data[2] ? '' : val.data[2]
+              case 'treemap':
+                return `${val.name} (${val.value})`
+              case 'map':
+                return val.value ? `${val.name} \n ${val.value}` : ''
+              default:
+                if (val.value) {
+                  return val.value
+                } else {
+                  return ''
+                }
+            }
+          }
+        }
+      },
+      getAxisName(dimension) {
+        return this.form.setting[dimension]
+      },
+      getAxisData(dimension) {
+        return this.selected[dimension]
+      },
+      getColor(name) {
+        const color = this.form.setting.config.color.find(item => item.name === name);
+        return color ? color.color : undefined
+      },
+      getDataCount(x, y, b = true) {
+        if (b) {
+          if (this.form.schema.x.type === 6) {
+            const xn = getTreeDataList(this.form.source.x, []).find(item => item.name === x)
+            if (xn) {
+              x = xn.id
+            }
+          }
+          if (this.form.schema.y.type === 6) {
+            const yn = getTreeDataList(this.form.source.y, []).find(item => item.name === y)
+            if (yn) {
+              y = yn.id
+            }
+          }
+        }
+        if (x && y) {
+          if (this.count[x]) {
+            return this.count[x][y] || 0
+          } else {
+            return 0
+          }
+        }
+        if (x && !y) {
+          return this.count[x] || 0
+        }
+        if (!x && !y) {
+          return random(0, 100)
+        }
+      },
+      getSeriesData() {
+        let data = [], count = this.count
+        let source = this.selected.x
+        switch (this.$options.name) {
+          case 'CLine':
+          case 'CArea':
+          case 'CBar':
+          case 'CColumn':
+            source.map(s => {
+              const color = this.form.setting.config.color.find(item => item.name === s);
+              data.push({
+                value: this.getDataCount(s),
+                itemStyle: {
+                  color: color ? color.color : undefined
+                }
+              })
+            })
+            break
+          case 'CDoughnut':
+          case 'CPie':
+            source.map(s => {
+              const color = this.form.setting.config.color.find(item => item.name === s);
+              data.push({
+                value: this.getDataCount(s),
+                name: s,
+                label: {
+                  show: this.form.setting.dataLabel,
+                  fontSize: this.form.setting.dataSize,
+                  fontFamily: this.form.setting.fontFamily2,
+                  color: this.form.setting.labelColor,
+                  position: this.form.setting.dataPosition,
+                  formatter: ({ value, name, percent }) => {
+                    let text = ""
+                    if (this.form.setting.dataLabel) {
+                      text += name
+                    }
+                    if (this.form.setting.dataLabel2) {
+                      text += `-${value}件`
+                    }
+                    if (this.form.setting.dataLabel3) {
+                      text += `/${percent}%`
+                    }
+                    return text
+                  }
+                },
+                itemStyle: {
+                  color: color ? color.color : undefined
+                }
+              })
+            })
+            break
+        }
+        return data
+      },
+      getAxisLabel(type, axis) {
+        return  {
+          interval: axis === 'x' ? (this.form.setting.interval ? 0 : undefined) : (this.form.setting.interval2 ? 0 : undefined),
+          rotate: axis === 'x' ? this.form.setting.rotate : this.form.setting.rotate2,
+          color: axis === 'x' ? this.form.setting.fontColor : this.form.setting.fontColor2,
+          show: axis === 'x' ? this.form.setting.show : this.form.setting.show2,
+          fontSize: axis === 'x' ? this.form.setting.fontSize : this.form.setting.fontSize2,
+          fontFamily: axis === 'x' ? this.form.setting.fontFamily : this.form.setting.fontFamily2,
+          fontWeight: (axis === 'x' ? this.form.setting.fontWeight : this.form.setting.fontWeight2) ? 'bold' : 'normal'
+        }
+      },
+      getNameTextStyle(axis) {
+        return {
+          padding: axis === 'x' ? [this.form.setting.paddingTop, this.form.setting.paddingLeft, this.form.setting.paddingBottom, this.form.setting.paddingRight] : [this.form.setting.paddingTop2, this.form.setting.paddingLeft2, this.form.setting.paddingBottom2, this.form.setting.paddingRight2],
+          color: axis === 'x' ? this.form.setting.fontColor : this.form.setting.fontColor2,
+          fontSize: axis === 'x' ? this.form.setting.fontSize : this.form.setting.fontSize2,
+          fontFamily: axis === 'x' ? this.form.setting.fontFamily : this.form.setting.fontFamily2,
+          fontWeight: (axis === 'x' ? this.form.setting.fontWeight : this.form.setting.fontWeight2) ? 'bold' : 'normal'
+        }
+      },
+      dateTimeSort() {
+        let temp = JSON.parse(JSON.stringify(this.selected.x))
+        let data = []
+        let t, y, m
+        temp.map(item => {
+          switch (this.form.schema.x.expand) {
+            case 9:
+            case 12:
+              data.push({
+                name: item,
+                time: new Date(item).getTime()
+              })
+              break
+            case 10:
+              t = item.split('-')
+              y = t[0]
+              m = (parseInt(t[1].replaceAll('Q', '')) - 1) * 3 + 1
+              data.push({
+                name: item,
+                time: new Date(y + '-' + m).getTime()
+              })
+              break
+            case 11:
+              t = item.split('-')
+              y = t[0]
+              m = parseInt(t[1].replaceAll('H', '')) * 6
+              data.push({
+                name: item,
+                time: new Date(y + '-' + m).getTime()
+              })
+              break
+            case 13:
+            case 14:
+            case 15:
+              t = item.split('-')
+              y = t[0]
+              data.push({
+                name: item,
+                time: new Date(y + '-01').getTime()
+              })
+              break
+          }
+        })
+        this.selected.x = data.sort((a, b) => a.time - b.time).map(item => item.name)
+      },
+      get1AxisOption(type, areaStyle) {
+        if (this.form.schema.x.ptype === 2) {
+          this.dateTimeSort()
+        }
+        let xAxis = {
+          name: this.getAxisName('title1'),
+          nameTextStyle: this.getNameTextStyle('x'),
+          type: 'category',
+          data: this.getAxisData('x'),
+          nameLocation: this.form.setting.nameLocation,
+          splitLine: {
+            show: this.form.setting.splitLine
+          },
+          axisLabel: this.getAxisLabel('category', 'x')
+        }
+        let yAxis = {
+          name: this.getAxisName('title2'),
+          nameTextStyle: this.getNameTextStyle('y'),
+          type: 'value',
+          nameLocation: this.form.setting.nameLocation2,
+          splitLine: {
+            show: this.form.setting.splitLine2
+          },
+          axisLabel: this.getAxisLabel('value', 'y')
+        }
+        let series = [{
+          data: this.getSeriesData(),
+          type: type,
+          areaStyle: areaStyle,
+          itemStyle: {
+            color: this.form.setting.config.color[0].color
+          },
+          barWidth: this.form.setting.barWidth,
+          label: this.getDataLabel()
+        }]
+        let grid = {
+          top: this.form.setting.gridTop + '%',
+          left: this.form.setting.gridLeft + '%',
+          right: this.form.setting.gridRight + '%',
+          bottom: this.form.setting.gridBottom + '%',
+          containLabel: true,
+        }
+        return {
+          xAxis,
+          yAxis,
+          series,
+          grid
+        }
+      },
+      get2AxisOption(type, stack) {
+        if (this.form.schema.x.ptype === 2) {
+          this.dateTimeSort()
+        }
+        const enable = this.form.setting.config.line.enable
+        const operator = this.form.setting.config.line.operator
+        let backgroundColor = this.form.setting.backgroundColor
+        // let series = this.selected.data
+        let series = this.selected.y.map(y => {
+            return {
+              name: y,
+              type: type,
+              stack: stack,
+              itemStyle: {
+                color: this.getColor(y)
+              },
+              barWidth: this.form.setting.barWidth,
+              data: this.selected.data.find(item => item.name == y).data,
+              label: this.getDataLabel(),
+              connectNulls:true,
+            }
+          })
+        let xAxis = {
+          name: this.form.setting.title1,
+          nameTextStyle: this.getNameTextStyle('x'),
+          type: 'category',
+          nameLocation: this.form.setting.nameLocation,
+          data: this.selected.x,
+          splitLine: {
+            show: this.form.setting.splitLine
+          },
+          axisLabel: this.getAxisLabel('category', 'x')
+        }
+        let yAxis = {
+          min:this.form.setting.yMin,
+          splitNumber:this.form.setting.splitNumber,
+          // max:this.form.setting.yMax,
+          name: this.form.setting.title2,
+          nameTextStyle: this.getNameTextStyle('y'),
+          type: 'value',
+          nameLocation: this.form.setting.nameLocation2,
+          splitLine: {
+            show: this.form.setting.splitLine2
+          },
+          axisLabel: this.getAxisLabel('value', 'y')
+        }
+        let legend =this.selected.y.length>1? [...this.selected.y]:[]
+        let toolbox = {
+          show: true,
+          right:'50px',
+          feature:{
+            saveAsImage: {
+              show:true,
+              excludeComponents :['toolbox'],
+              pixelRatio: 2
+            },
+            magicType: {
+              show: true,
+              type: [ 'bar', 'stack']
+            },
+            dataZoom:{
+              show:true
+            },
+            dataView:{
+              show: true,
+              lang: ['数据视图', '关闭', '导出Excel'],
+              optionToContent: function(opt){
+                  //axisData是你想定义的表格第一列的数据,我这里设置为柱形图的x轴数据
+                  var axisData = opt.xAxis[0].data;
+                  //tAxis[0]为你想定义的表格第一行的数据
+                  var txisData = [];
+                  if(opt.series.length>1){
+                    txisData.push('产品名称')
+                  }
+                  txisData.push(opt.xAxis[0].name)
+                  txisData.push(opt.yAxis[0].name)
+                  var series = opt.series;
+                  //表头
+                  var tdHeads = '';
+                  var tdBodys = '';
+                  var nameData = txisData;
+                  for (var i = 0; i < nameData.length ; i++) {
+                      tdHeads += '<td style="padding: 0 10px;width:100px">' + nameData[i] + '</ td >';
+                  }
+                  var table = '<table id="Mytable" border="1" class="table table-bordered table-striped table-hover" style="width:100%;text-align:center" ><tbody><tr>' + tdHeads + ' </tr>';
+                
+                  for(var i = 0; i<series.length;i++){
+                    for(var j =0;j<axisData.length;j++){
+                      if(series.length>1){
+                        if(j==0){
+                          tdBodys += '<td rowspan="'+ axisData.length +'" colspan="1">' + series[i].name + '</td>';
+                        }
+                      }
+                      tdBodys += '<td>' + axisData[j] + '</td>';
+                      var temp = series[i].data[j]
+                      if (temp != null && temp != undefined) {
+                          tdBodys += '<td>' + temp + '</td>';
+                      } else {
+                          tdBodys += '<td>'+ " " +'</td>';
+                      }
+                      table += '<tr style="mso-number-format:'+'\@'+';">' + tdBodys + '</tr>';
+                      tdBodys = '';
+                    }
+                   
+                  }
+                  table += '</tbody></table>';
+                  return table;
+              },
+              contentToOption: function (HTMLDomElement, opt) {
+                    // Worksheet名
+                    const worksheet = 'Sheet1'
+                    const url = 'data:application/vnd.ms-excel;base64,'
+
+                    // 下载的表格模板数据
+                    const template = `<html xmlns:o="urn:schemas-microsoft-com:office:office"
+                      xmlns:x="urn:schemas-microsoft-com:office:excel"
+                      xmlns="http://www.w3.org/TR/REC-html40">
+                      <head><!--[if gte mso 9]><xml><x:ExcelWorkbook><x:ExcelWorksheets><x:ExcelWorksheet>
+                      <x:Name>${worksheet}</x:Name>
+                      <x:WorksheetOptions><x:DisplayGridlines/></x:WorksheetOptions></x:ExcelWorksheet>
+                      </x:ExcelWorksheets></x:ExcelWorkbook></xml><![endif]-->
+                      ${HTMLDomElement.innerHTML}`
+                    // 下载模板
+                    let link = document.createElement('a')
+                    link.setAttribute('href', url + window.btoa(unescape(encodeURIComponent(template))))
+                    link.setAttribute('download', opt.title[0].text+'.xls')
+                    link.click()
+              },
+
+            }
+          }
+        }
+        // if (enable && ([5, 6].indexOf(this.form.setting.type) !== -1)) {
+        //   let name = this.form.setting.config.line.name
+        //   series.push({
+        //     name: name,
+        //     type: 'line',
+        //     yAxisIndex: 1,
+        //     data: getLineDataArr(this.form, this.selected, this.count),
+        //     itemStyle: {
+        //       color: this.form.setting.config.line.color
+        //     },
+        //     label: {
+        //       ...this.getDataLabel(),
+        //       formatter({ value }) {
+        //         return operator === 1 ? `${Math.round(parseFloat(value) * 100)} %` : value
+        //       }
+        //     }
+        //   })
+        //   yAxis.push({
+        //     type: 'value',
+        //     name: name,
+        //   })
+        //   legend.push(name)
+        // }
+        let grid = {
+          top: this.form.setting.gridTop + '%',
+          left: this.form.setting.gridLeft + '%',
+          right: this.form.setting.gridRight + '%',
+          bottom: this.form.setting.gridBottom + '%',
+          containLabel: true
+        }
+        let title = JSON.parse(JSON.stringify(this.form.setting.text))
+        title.textStyle.fontWeight = this.form.setting.text.textStyle.fontWeight?'bold':'normal'
+        title.subtextStyle.fontWeight = this.form.setting.text.subtextStyle.fontWeight?'bold':'normal'
+        return {
+          backgroundColor,
+          title,
+          legend: {
+            show: this.form.setting.legend,
+            data: legend,
+            textStyle: {
+              fontFamily: this.form.setting.fontFamily3,
+              color: this.form.setting.legendColor,
+              fontSize: this.form.setting.legendFontSize
+            },
+            ...this.getLegendLocation(),
+            type: this.form.setting.type2,
+          },
+          grid,
+          xAxis,
+          yAxis,
+          series,
+          toolbox
+        }
+      },
+      getLegendLocation() {
+        let x = ''
+        let y = ''
+        switch (this.form.setting.legendLocation) {
+          case 'top':
+            x = 'center'
+            y = 'top'
+            break
+          case 'left':
+            x = 'left'
+            y = 'center'
+            break
+          case 'bottom':
+            x = 'center'
+            y = 'bottom'
+            break
+          case 'right':
+            x = 'right'
+            y = 'center'
+            break
+        }
+        return {
+          x: x,
+          y: y,
+          orient: ['top', 'bottom'].indexOf(this.form.setting.legendLocation) !== -1 ? 'horizontal' : "vertical",
+        }
+      },
+      dispose(id){
+        const chartDom = document.getElementById(id);
+        const myChart = this.$echarts.init(chartDom);
+        myChart.dispose();
+      },
+      initChart(id, chartOption) {
+        // console.log(id,chartOption)
+        const chartDom = document.getElementById(id);
+        const myChart = this.$echarts.init(chartDom);
+        myChart.clear();
+        myChart.setOption(chartOption)
+        // this.$store.commit('SET_MY_CHART', myChart)
+        return myChart
+      },
+    }
+  }
+  
+  export const chartOptionMixins = {
+    data() {
+        return {
+            // form:{},
+            selected:{}
+        }
+    },
+    mixins: [chartOption],
+    mounted() {
+    //   this.$nextTick(() => {
+    //     this.initChart(this.id, this.getOption())
+    //   })
+    },
+    methods:{
+        setColor(){
+            const defaultColor = [
+                '#5470c6',
+                '#91cc75',
+                '#fac858',
+                '#ee6666',
+                '#73c0de',
+                '#3ba272',
+                '#fc8452',
+                '#9a60b4',
+                '#ea7ccc',
+              ]
+              let index = 0
+              if (this.selected.y.length>0) {
+                this.form.setting.config.color = this.selected.y.map(item => {
+                  if (index >= defaultColor.length) {
+                    index = 0
+                  }
+                  return {
+                    name: item,
+                    color: defaultColor[index++]
+                  }
+                })
+              }
+        }
+    }
+  }

+ 446 - 0
src/views/components/setting/style.vue

@@ -0,0 +1,446 @@
+<template>
+    <div class="custom-analyse-tabs-style">
+      <el-collapse v-model="activeNames">
+        <el-collapse-item title="框架" name="8" v-if="!getShow([30])">
+          <div class="content">
+            <div style="display:flex">
+              <span class="label" style="width:50px">宽度</span>
+              <el-input placeholder="请输入宽度" v-model="form.setting.width" size="small" style="width: calc(100% - 170px);padding-left: 10px;"></el-input>
+              <el-select size="small" v-model="form.setting.widthUnit" placeholder="请选择" style="width: calc(100% - 190px);margin-left: 10px;">
+                <el-option label="百分比" value="%"></el-option>
+                <el-option label="像素" value="px"></el-option>
+              </el-select>
+            </div>
+            <div style="margin-top: 10px;display:flex">
+              <span class="label" style="width:50px">高度</span>
+              <el-input placeholder="请输入高度" v-model="form.setting.height" size="small" style="width: calc(100% - 170px);padding-left: 10px;"></el-input>
+              <el-select size="small" v-model="form.setting.heightUnit" placeholder="请选择" style="width: calc(100% - 190px);margin-left: 10px;">
+                <el-option label="百分比" value="%" disabled></el-option>
+                <el-option label="像素" value="px"></el-option>
+              </el-select>
+            </div>
+            <div style="margin-top: 10px;display:flex">
+              <span>背景色</span><el-color-picker size="small" v-model="form.setting.backgroundColor" style="margin-left: 10px; float:right;"></el-color-picker>
+            </div>
+          </div>
+        </el-collapse-item>
+        <el-collapse-item title="气泡图" name="9" v-if="getShow([])">
+          <div class="content">
+            <span class="label">气泡比例</span>
+            <el-input placeholder="请输入气泡比例" v-model="form.setting.scatterSize" size="small" style="width: calc(100% - 160px);padding-left: 10px;"></el-input>
+          </div>
+        </el-collapse-item>
+        <el-collapse-item title="柱形图" name="7" v-if="getShow([4, 7, 5, 6, 8, 9])">
+          <div class="content">
+            <span class="label">宽度</span>
+            <el-input placeholder="请输入宽度" v-model="form.setting.barWidth" size="small" style="width: calc(100% - 190px);padding-left: 10px;"></el-input>
+          </div>
+        </el-collapse-item>
+        <el-collapse-item title="标签" name="1" v-if="!getShow([30, 19])">
+          <div class="content">
+            <div>
+              <el-checkbox v-model="form.setting.dataLabel">显示标签</el-checkbox>
+              <template v-if="!getShow([13, 12, 20, 18, 21, 23])">
+                <span style="margin-left: 42px;" class="label">位置</span>
+                <el-select size="small" v-model="form.setting.dataPosition" placeholder="请选择" style="width: calc(100% - 160px);margin-left: 10px;">
+                  <el-option v-for="item in positionList" :label="item.label" :value="item.value"></el-option>
+                </el-select>
+              </template>
+            </div>
+            <div style="margin-top: 10px;">
+              <el-select size="small" v-model="form.setting.fontFamily2" placeholder="请选择" style="width: calc(100% - 160px)">
+                <el-option v-for="item in $constants.fontFamily" :label="item.label" :value="item.value"></el-option>
+              </el-select>
+              <el-input size="small" v-model.number="form.setting.dataSize" type="number" placeholder="请输入" style="width: 105px;margin-left: 10px;"></el-input>
+              <el-color-picker size="small" v-model="form.setting.labelColor" style="margin-left: 10px; float:right;"></el-color-picker>
+            </div>
+            <div style="margin-top: 10px;" v-if="getShow([10, 11])">
+              <el-checkbox v-model="form.setting.dataLabel2">显示数值</el-checkbox>
+              <el-checkbox v-model="form.setting.dataLabel3">显示百分比</el-checkbox>
+            </div>
+          </div>
+        </el-collapse-item>
+        <el-collapse-item title="名称" name="10" v-if="!getShow([30, 19])">
+          <div class="content">
+            <el-checkbox v-model="form.setting.text.show">显示名称</el-checkbox>
+              <div style="display:flex;margin-top: 10px;">
+                <span class="label" style="width:80px">主标题名称</span><el-input size="small" v-model="form.setting.text.text" placeholder="请输入" style="margin-left: 10px;"></el-input>
+              </div>
+              <div style="display:flex;margin-top: 10px;">
+                <span class="label" style="width:80px">主标题链接</span><el-input size="small" v-model="form.setting.text.link" placeholder="请输入" style="margin-left: 10px;"></el-input>
+              </div>
+              <div style="margin-top: 10px;">
+              <el-select size="small" v-model="form.setting.text.textStyle.fontFamily" placeholder="请选择" style="width: calc(100% - 160px)">
+                <el-option v-for="item in $constants.fontFamily" :label="item.label" :value="item.value"></el-option>
+              </el-select>
+              <el-input size="small" v-model.number="form.setting.text.textStyle.fontSize" type="number" placeholder="请输入" style="width: 105px;margin-left: 10px;"></el-input>
+              <el-color-picker size="small" v-model="form.setting.text.textStyle.color" style="margin-left: 10px; float:right;"></el-color-picker>
+            </div>
+            <div style="margin-top: 10px;">
+              <el-checkbox v-model="form.setting.text.textStyle.fontWeight">字体加粗</el-checkbox>
+            </div>
+              <div style="margin-top: 10px;" class="title-padding">
+                <span class="label">位置</span>
+                <span class="label" style="margin: 0 5px;">垂直</span>
+                <el-input v-model.number="form.setting.text.bottom" size="small" placeholder="" style="width: 100px;"></el-input>
+                <span class="label" style="margin: 0 5px;">水平</span>
+                <el-input v-model.number="form.setting.text.left" size="small" placeholder="" style="width: 100px;"></el-input>
+            </div>
+            <div style="display:flex;margin-top: 10px;">
+                <span class="label" style="width:80px">副标题名称</span><el-input size="small" v-model="form.setting.text.subtext" placeholder="请输入" style="margin-left: 10px;"></el-input>
+              </div>
+              <div style="display:flex;margin-top: 10px;">
+                <span class="label" style="width:80px">副标题链接</span><el-input size="small" v-model="form.setting.text.sublink" placeholder="请输入" style="margin-left: 10px;"></el-input>
+              </div>
+              <div style="margin-top: 10px;">
+              <el-select size="small" v-model="form.setting.text.subtextStyle.fontFamily" placeholder="请选择" style="width: calc(100% - 160px)">
+                <el-option v-for="item in $constants.fontFamily" :label="item.label" :value="item.value"></el-option>
+              </el-select>
+              <el-input size="small" v-model.number="form.setting.text.subtextStyle.fontSize" type="number" placeholder="请输入" style="width: 105px;margin-left: 10px;"></el-input>
+              <el-color-picker size="small" v-model="form.setting.text.subtextStyle.color" style="margin-left: 10px; float:right;"></el-color-picker>
+            </div>
+            <div style="margin-top: 10px;">
+              <el-checkbox v-model="form.setting.text.subtextStyle.fontWeight">字体加粗</el-checkbox>
+            </div>
+          </div>
+        </el-collapse-item>
+        <el-collapse-item title="颜色" name="2"  v-if="!getShow([20, 18, 21, 23]) && form.setting.config.color &&form.setting.config.color.length>0">
+          <div class="content">
+            <el-container>
+              <el-main style="max-height: 300px;" class="color-config">
+                <template v-if="!getShow([15, 30])">
+                  <div v-for="item in form.setting.config.color" class="color-config-content">
+                    <el-color-picker size="small" v-model="item.color"></el-color-picker>
+                    <span class="name">{{ item.name }}</span>
+                  </div>
+                  <div v-if="form.setting.config.line.enable" class="color-config-content">
+                    <el-color-picker size="small" v-model="form.setting.config.line.color"></el-color-picker>
+                    <span class="name">{{ form.setting.config.line.name }}</span>
+                  </div>
+                </template>
+                <template v-else>
+                  <div v-for="(item, index) in form.setting.config.table">
+                    <el-color-picker size="small" v-model="item.color"></el-color-picker>
+                    <div style="float: right; padding-right: 20px;">
+                      <el-input v-model="item.min" style="width: 80px;" size="small"></el-input>
+                      <span class="o-code">≤</span><span>数值</span><span class="o-code">≤</span>
+                      <el-input v-model="item.max" style="width: 80px;" size="small"></el-input>
+                    </div>
+                  </div>
+                </template>
+              </el-main>
+            </el-container>
+          </div>
+        </el-collapse-item>
+        <el-collapse-item title="图例" name="3" v-if="getShow([5, 6, 8, 9, 10, 11])">
+          <div class="content">
+            <div>
+              <el-checkbox v-model="form.setting.legend">显示图例</el-checkbox>
+              <span class="label" style="margin-left: 42px;">位置</span>
+              <el-select size="small" v-model="form.setting.legendLocation" style="width: calc(100% - 160px);margin-left: 10px;">
+                <el-option value="top" label="上"></el-option>
+                <el-option value="left" label="左"></el-option>
+                <el-option value="bottom" label="下"></el-option>
+                <el-option value="right" label="右"></el-option>
+              </el-select>
+            </div>
+            <div style="margin-top: 10px;">
+              <el-select size="small" v-model="form.setting.fontFamily3" placeholder="请选择" style="width: calc(100% - 160px)">
+                <el-option v-for="item in $constants.fontFamily" :label="item.label" :value="item.value"></el-option>
+              </el-select>
+              <el-input size="small" v-model.number="form.setting.legendFontSize" type="number" placeholder="请输入" style="width: 105px;margin-left: 10px;"></el-input>
+              <el-color-picker size="small" v-model="form.setting.legendColor" style="margin-left: 10px; float:right;"></el-color-picker>
+            </div>
+            <div style="margin-top: 10px;">
+              <el-select size="small" v-model="form.setting.type2" style="width: calc(100% - 160px)">
+                <el-option value="scroll" label="滚动图例"></el-option>
+                <el-option value="plain" label="普通图例"></el-option>
+              </el-select>
+            </div>
+          </div>
+        </el-collapse-item>
+        <el-collapse-item title="距离" name="4" v-if="!getShow([30, 22, 17, 19, 12, 20, 18, 21, 23, 13])">
+          <div class="content">
+            <div>
+              <span class="label">顶部</span>
+              <el-input size="small" v-model="form.setting.gridTop" style="width: 240px;margin-left: 10px;"></el-input>
+              <span style="margin-left: 10px;">%</span>
+            </div>
+            <div style="margin-top: 10px;">
+              <span class="label">底部</span>
+              <el-input size="small" v-model="form.setting.gridBottom" style="width: 240px;margin-left: 10px;"></el-input>
+              <span style="margin-left: 10px;">%</span>
+            </div>
+            <div style="margin-top: 10px;">
+              <span class="label">左侧</span>
+              <el-input size="small" v-model="form.setting.gridLeft" style="width: 240px;margin-left: 10px;"></el-input>
+              <span style="margin-left: 10px;">%</span>
+            </div>
+            <div style="margin-top: 10px;">
+              <span class="label">右侧</span>
+              <el-input size="small" v-model="form.setting.gridRight" style="width: 240px;margin-left: 10px;"></el-input>
+              <span style="margin-left: 10px;">%</span>
+            </div>
+          </div>
+        </el-collapse-item>
+        <el-collapse-item title="X轴" name="5" v-if="getShow([1, 3, 4, 7, 5, 6, 8, 9, 2, 15, 14])">
+          <div class="content">
+            <div>
+              <el-checkbox v-model="form.setting.show">显示坐标轴</el-checkbox>
+              <el-checkbox v-model="form.setting.splitLine" v-if="!getShow([14])">显示背景线</el-checkbox>
+            </div>
+            <div style="margin-top: 10px;">
+              <el-select size="small" v-model="form.setting.fontFamily" placeholder="请选择" style="width: calc(100% - 160px)">
+                <el-option v-for="item in $constants.fontFamily" :label="item.label" :value="item.value"></el-option>
+              </el-select>
+              <el-input size="small" v-model.number="form.setting.fontSize" type="number" placeholder="请输入" style="width: 105px;margin-left: 10px;"></el-input>
+              <el-color-picker size="small" v-model="form.setting.fontColor" style="margin-left: 10px; float:right;"></el-color-picker>
+            </div>
+            <div style="margin-top: 10px;">
+              <el-checkbox v-model="form.setting.fontWeight">字体加粗</el-checkbox>
+              <span class="label" style="margin-left: 15px;">标题位置</span>
+              <el-select size="small" v-model="form.setting.nameLocation" style="width: calc(100% - 160px);margin-left: 10px;">
+                <el-option value="start" label="左"></el-option>
+                <el-option value="middle" label="中"></el-option>
+                <el-option value="end" label="右"></el-option>
+              </el-select>
+            </div>
+            <div style="margin-top: 10px;">
+              <span class="label">标题</span>
+              <el-input size="small" v-model="form.setting.title1" placeholder="请输入" style="width: calc(100% - 37px);margin-left: 10px;"></el-input>
+            </div>
+            <div style="margin-top: 10px;" class="title-padding">
+              <span class="label">位移</span>
+              <span class="label" style="margin: 0 5px;">上</span>
+              <el-input v-model.number="form.setting.paddingTop" size="small" placeholder="" style="width: 45px;"></el-input>
+              <span class="label" style="margin: 0 5px;">左</span>
+              <el-input v-model.number="form.setting.paddingLeft" size="small" placeholder="" style="width: 45px;"></el-input>
+              <span class="label" style="margin: 0 5px;">下</span>
+              <el-input v-model.number="form.setting.paddingBottom" size="small" placeholder="" style="width: 45px;"></el-input>
+              <span class="label" style="margin: 0 5px;">右</span>
+              <el-input v-model.number="form.setting.paddingRight" size="small" placeholder="" style="width: 45px;"></el-input>
+            </div>
+            <div style="margin-top: 10px;">
+              <el-checkbox v-model="form.setting.interval">完整显示</el-checkbox>
+              <span class="label" style="margin-left: 15px;">倾斜角度</span>
+              <el-input size="small" v-model="form.setting.rotate" placeholder="请输入" style="width: calc(100% - 160px);margin-left: 10px;"></el-input>
+            </div>
+          </div>
+        </el-collapse-item>
+        <el-collapse-item title="Y轴" name="6" v-if="getShow([1, 3, 4, 7, 5, 6, 8, 9, 2, 15, 14])">
+          <div class="content">
+            <div style="display:flex">
+              <el-checkbox v-model="form.setting.show2">显示坐标轴</el-checkbox>
+              <el-checkbox v-model="form.setting.splitLine2" v-if="!getShow([14])">显示背景线</el-checkbox>
+            </div>
+            <div style="display:flex;margin-top:10px">
+              <div style="display:flex"><span style="width:100px">最小值:</span><el-input size="small" v-model="form.setting.yMin"></el-input></div>
+              <div style="display:flex;align-item:center;margin-left:10px"><span style="width:100px">值间隔:</span><el-input size="small" v-model="form.setting.splitNumber"></el-input></div>
+            </div>
+            <div style="margin-top: 10px;">
+              <el-select size="small" v-model="form.setting.fontFamily2" placeholder="请选择" style="width: calc(100% - 160px)">
+                <el-option v-for="item in $constants.fontFamily" :label="item.label" :value="item.value"></el-option>
+              </el-select>
+              <el-input size="small" v-model.number="form.setting.fontSize2" type="number" placeholder="请输入" style="width: 105px;margin-left: 10px;"></el-input>
+              <el-color-picker size="small" v-model="form.setting.fontColor2" style="margin-left: 10px; float:right;"></el-color-picker>
+            </div>
+            <div style="margin-top: 10px;">
+              <el-checkbox v-model="form.setting.fontWeight2">字体加粗</el-checkbox>
+              <span class="label" style="margin-left: 15px;">标题位置</span>
+              <el-select size="small" v-model="form.setting.nameLocation2" style="width: calc(100% - 160px);margin-left: 10px;">
+                <el-option value="end" label="上"></el-option>
+                <el-option value="middle" label="中"></el-option>
+                <el-option value="start" label="下"></el-option>
+              </el-select>
+            </div>
+            <div style="margin-top: 10px;">
+              <span class="label">标题</span>
+              <el-input size="small" v-model="form.setting.title2" placeholder="请输入" style="width: calc(100% - 37px);margin-left: 10px;"></el-input>
+            </div>
+            <div style="margin-top: 10px;" class="title-padding">
+              <span class="label">位移</span>
+              <span class="label" style="margin: 0 5px;">上</span>
+              <el-input v-model.number="form.setting.paddingTop2" size="small" placeholder="" style="width: 45px;"></el-input>
+              <span class="label" style="margin: 0 5px;">左</span>
+              <el-input v-model.number="form.setting.paddingLeft2" size="small" placeholder="" style="width: 45px;"></el-input>
+              <span class="label" style="margin: 0 5px;">下</span>
+              <el-input v-model.number="form.setting.paddingBottom2" size="small" placeholder="" style="width: 45px;"></el-input>
+              <span class="label" style="margin: 0 5px;">右</span>
+              <el-input v-model.number="form.setting.paddingRight2" size="small" placeholder="" style="width: 45px;"></el-input>
+            </div>
+            <div style="margin-top: 10px;">
+              <el-checkbox v-model="form.setting.interval2">完整显示</el-checkbox>
+              <span class="label" style="margin-left: 15px;">倾斜角度</span>
+              <el-input size="small" v-model="form.setting.rotate2" placeholder="请输入" style="width: calc(100% - 160px);margin-left: 10px;"></el-input>
+            </div>
+          </div>
+        </el-collapse-item>
+        <el-collapse-item title="坐标" name="6" v-if="getShow([17, 22])">
+          <div class="content">
+            <div>
+              <el-checkbox v-model="form.setting.show">显示</el-checkbox>
+              <el-checkbox v-model="form.setting.fontWeight">字体加粗</el-checkbox>
+            </div>
+            <div style="margin-top: 10px;">
+              <el-select size="small" v-model="form.setting.fontFamily" placeholder="请选择" style="width: calc(100% - 160px)">
+                <el-option v-for="item in $constants.fontFamily" :label="item.label" :value="item.value"></el-option>
+              </el-select>
+              <el-input size="small" v-model.number="form.setting.fontSize" type="number" placeholder="请输入" style="width: 105px;margin-left: 10px;"></el-input>
+              <el-color-picker size="small" v-model="form.setting.fontColor" style="margin-left: 10px; float:right;"></el-color-picker>
+            </div>
+          </div>
+        </el-collapse-item>
+      </el-collapse>
+    </div>
+</template>
+  
+<script>
+  import {settingData} from "./mixins";
+  import { detectionChartType } from "@/utils/chart";
+  
+  export default {
+    mixins: [settingData],
+    components: {
+     
+    },
+    data() {
+      return {
+        activeNames: ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9','10'],
+        chartIcon: [],
+        positionList: [],
+      }
+    },
+    mounted() {
+      this.chartIcon = JSON.parse(JSON.stringify(this.$constants.chartType))
+      this.chartIcon.map(item => {
+        let { op, cg } = detectionChartType(item, this.form)
+        if (op && cg) {
+          cg = false
+        //   this.$store.dispatch('resetSettingColor')
+        }
+        if (op) {
+          this.$set(item, 'disable', true)
+          this.$set(item, 'active', false)
+        }
+        if (cg) {
+          this.$set(item, 'disable', false)
+          this.$set(item, 'active', true)
+        }
+      })
+    //   this.getPositionList()
+    },
+    methods: {
+      getShow(arr) {
+        return arr.indexOf(this.form.setting.type) !== -1
+      },
+      getPositionList() {
+        if ([10, 11].indexOf(this.form.setting.type) !== -1) {
+          this.positionList = [
+            { label: '外侧', value: 'outside' },
+            { label: '内部', value: 'inside' },
+            { label: '中心', value: 'center' },
+          ]
+        } else {
+          this.positionList = [
+            { label: '上', value: 'top' },
+            { label: '左', value: 'left' },
+            { label: '右', value: 'right' },
+            { label: '下', value: 'bottom' },
+            { label: '内', value: '' },
+          ]
+        }
+      },
+      handleClick(item) {
+        if (item.disable) {
+          return false
+        }
+        const chartType = this.$constants.chartType.find(c => c.value === this.form.setting.type)
+        if (item.value === 21 || this.form.setting.type === 21) {
+          this.$store.commit('SET_RELOAD_DATA', true)
+        }
+        if (item.value === 22 && chartType.type === 1) {
+          this.$store.commit('SET_RELOAD_DATA', true)
+        }
+        if (!chartType) {
+          this.$store.commit('SET_RELOAD_DATA', true)
+        }
+        if ((this.form.schema.x.type === 6 || this.form.schema.y.type === 6) && chartType) {
+          if (chartType.value === 30 && item.value !== 30) {
+            this.$store.commit('SET_RELOAD_DATA', true)
+          }
+          if (chartType.value !== 30 && item.value === 30) {
+            this.$store.commit('SET_RELOAD_DATA', true)
+          }
+          if (chartType.value === 20 && item.value !== 20) {
+            this.$store.commit('SET_RELOAD_DATA', true)
+          }
+          if (chartType.value !== 20 && item.value === 20) {
+            this.$store.commit('SET_RELOAD_DATA', true)
+          }
+        }
+        this.form.setting.type = item.value
+        this.chartIcon.map(c => {
+          if (c.value === item.value) {
+            this.$set(c, 'active', true)
+          } else {
+            this.$set(c, 'active', false)
+          }
+        })
+        // this.$store.dispatch('getItemSettingColor', [])
+        this.form.setting.dataPosition = ''
+        this.getPositionList()
+      },
+    }
+  }
+  </script>
+  
+  <style lang="scss">
+  .custom-analyse-tabs-style {
+    .el-collapse {
+      border-top: transparent !important;
+    }
+    .el-collapse-item__header {
+      font-weight: bold !important;
+      padding: 0 20px !important;
+      border-bottom: 1px solid #EBEEF5 !important;
+    }
+    .el-form-item {
+      padding: 0 15px;
+      margin-bottom: 0 !important;
+    }
+    .el-collapse {
+      border-top: 0 !important;
+    }
+    .color-config {
+      padding: 0 !important;
+      .o-code {
+        margin: 0 5px;
+        display: inline-block;
+      }
+      .color-config-content {
+        line-height: 50px;
+        position: relative;
+        .name {
+          margin-left: 10px;
+          font-size: 14px;
+          top: -10px;
+          position: absolute;
+        }
+      }
+    }
+    .title-padding {
+      .el-input__inner {
+        padding: 0 10px !important;
+      }
+    }
+    .el-collapse-item__content {
+      padding-bottom: 0 !important;
+    }
+    .content {
+      padding: 20px;
+    }
+    .label {
+      color: #6b6868;
+    }
+  }
+  </style>

+ 5 - 5
src/views/event/components/index.vue

@@ -2,25 +2,25 @@
   <div class="height_100">
   <div class="height_100">
     <el-container v-if="showView">
     <el-container v-if="showView">
       <el-header>
       <el-header>
-        <div>
+        <div id="step1">
           <mySearch style="width: 500px" :SearchFields="searchFiled" @search="search" :searchValue="searchOption">
           <mySearch style="width: 500px" :SearchFields="searchFiled" @search="search" :searchValue="searchOption">
           </mySearch>
           </mySearch>
         </div>
         </div>
         <div style="display: flex">
         <div style="display: flex">
-          <div v-if="[2].indexOf(isOperate) == -1">
+          <div v-if="[2].indexOf(isOperate) == -1" id="step2">
             <span>分组查询:</span>
             <span>分组查询:</span>
             <el-select v-model="groupingValue" size="small" @change="changeGrouping" clearable style="width: 120px">
             <el-select v-model="groupingValue" size="small" @change="changeGrouping" clearable style="width: 120px">
               <el-option v-for="item in groupingOption" :key="item.value" :label="item.name" :value="item.value">
               <el-option v-for="item in groupingOption" :key="item.value" :label="item.name" :value="item.value">
               </el-option>
               </el-option>
             </el-select>
             </el-select>
           </div>
           </div>
-          <el-button-group style=" display: flex; justify-content: flex-start; margin-left: 10px;" v-if="[2].indexOf(isOperate) == -1">
+          <el-button-group id="step3" style=" display: flex; justify-content: flex-start; margin-left: 10px;" v-if="[2].indexOf(isOperate) == -1">
             <el-button size="small" :type="viewSelectedBtn === 'visual' ? 'primary' : ''" @click="onChange2('visual')">可视化</el-button>
             <el-button size="small" :type="viewSelectedBtn === 'visual' ? 'primary' : ''" @click="onChange2('visual')">可视化</el-button>
             <el-button :type="viewSelectedBtn === 'Table' ? 'primary' : ''" @click="onChange2('Table')" size="small">列表</el-button>
             <el-button :type="viewSelectedBtn === 'Table' ? 'primary' : ''" @click="onChange2('Table')" size="small">列表</el-button>
             <el-button :type="viewSelectedBtn === 'Card' ? 'primary' : ''" @click="onChange2('Card')" size="small">卡片</el-button>
             <el-button :type="viewSelectedBtn === 'Card' ? 'primary' : ''" @click="onChange2('Card')" size="small">卡片</el-button>
           </el-button-group>
           </el-button-group>
           <!-- <el-button type="primary" size="small" style="margin: 0 10px;" @click="handleCommand('1')">添加事件</el-button> -->
           <!-- <el-button type="primary" size="small" style="margin: 0 10px;" @click="handleCommand('1')">添加事件</el-button> -->
-          <el-dropdown trigger="click" split-button type="primary" size="small" @command="handleCommand($event)">
+          <el-dropdown id="step4" trigger="click" split-button type="primary" size="small" @command="handleCommand($event)">
             <span @click="handleCommand('1')">添加事件</span>
             <span @click="handleCommand('1')">添加事件</span>
             <el-dropdown-menu slot="dropdown" class="text-align_center">
             <el-dropdown-menu slot="dropdown" class="text-align_center">
               <el-dropdown-item command="3">显示栏位管理</el-dropdown-item>
               <el-dropdown-item command="3">显示栏位管理</el-dropdown-item>
@@ -95,7 +95,7 @@ export default {
       searchFiled: [],
       searchFiled: [],
       //检索条件
       //检索条件
       searchOption: {
       searchOption: {
-        scenarioId:this.scenarioId,
+        scenarioNames:this.scenarioId,
         name:this.eventName
         name:this.eventName
       },
       },
       //分组的值
       //分组的值

+ 25 - 15
src/views/event/components/view/card.vue

@@ -1,7 +1,7 @@
 <template>
 <template>
   <div class="eventCard">
   <div class="eventCard">
     <el-row :gutter="12">
     <el-row :gutter="12">
-      <el-col :span="6" v-for="(item, itemIndex) in tableData" :key="itemIndex" style="height:420px">
+      <el-col :span="6" v-for="(item, itemIndex) in tableData" :key="itemIndex" style="padding-bottom:10px">
         <myCard shadow="always">
         <myCard shadow="always">
           <div slot="head">
           <div slot="head">
             <div style="font-size:18px">
             <div style="font-size:18px">
@@ -32,24 +32,34 @@
             </div>
             </div>
           </div>
           </div>
           <div>
           <div>
-            <el-form label-position="left" label-width="110px">
+            <el-form label-position="left" label-width="140px">
               <el-form-item label="报告数量:"> {{ item.reportProjectNum || 0  }} </el-form-item>
               <el-form-item label="报告数量:"> {{ item.reportProjectNum || 0  }} </el-form-item>
               <el-form-item label="专利数据库数量:">{{ item.patentProjectNum || 0 }}</el-form-item>
               <el-form-item label="专利数据库数量:">{{ item.patentProjectNum || 0 }}</el-form-item>
               <el-form-item label="应用场景:">
               <el-form-item label="应用场景:">
-                <el-tooltip class="item" effect="light" placement="top" :content="item.scenarioName">
-                  <div>{{ item.scenarioName }}</div>
-                  <!-- <div slot="content"><span v-for="name in item.scenarioNames">{{ name }}&nbsp;&nbsp;</span></div>
-                  <span v-if="item.scenarioNames">{{ item.scenarioNames[0] }}
-                    <span v-if="item.scenarioNames.length > 1">
-                      <span><img src="@/assets/img/更多.png" style="width:18px;vertical-align:bottom" /></span>
-                    </span>
-                  </span> -->
-                </el-tooltip>
+                <myTooltip :content="$commonJS.getColumnData(item, {type:'Array',value:'scenarioNames'})">
+                  <div class="noWrap" v-html="$commonJS.getColumnData(item, {type:'Array',value:'scenarioNames'})"></div>
+                </myTooltip>
+              </el-form-item>
+              <el-form-item label="发生时间:">
+                <myTooltip :content="item.eventDate" >
+                  <div v-html="$commonJS.getColumnData(item, {type:'String',value:'eventDate'})" class="noWrap"></div>
+                </myTooltip>
+              </el-form-item>
+              <el-form-item label="描述:">
+                <myTooltip :content="item.description" >
+                  <div v-html="$commonJS.getColumnData(item, {type:'String',value:'description'})" class="noWrap"></div>
+                </myTooltip>
+              </el-form-item>
+              <el-form-item label="创建人:">
+                <myTooltip :content="item.createName" >
+                  <div v-html="$commonJS.getColumnData(item, {type:'String',value:'createName'})" class="noWrap"></div>
+                </myTooltip>
+              </el-form-item>
+              <el-form-item label="创建时间:">
+                <myTooltip :content="item.createTime" >
+                  <div v-html="$commonJS.getColumnData(item, {type:'String',value:'createTime'})" class="noWrap"></div>
+                </myTooltip>
               </el-form-item>
               </el-form-item>
-              <el-form-item label="时间:">{{ item.eventDate || '--' }}</el-form-item>
-              <el-form-item label="描述:">{{ item.description || '--'}}</el-form-item>
-              <el-form-item label="创建人:">{{ item.createName || '--'}}</el-form-item>
-              <el-form-item label="创建时间:">{{ item.createTime || '--'}}</el-form-item>
             </el-form>
             </el-form>
           </div>
           </div>
           <div slot="foot">
           <div slot="foot">

+ 4 - 2
src/views/event/components/view/table.vue

@@ -13,7 +13,9 @@
         sortable="custom">
         sortable="custom">
         <template slot-scope="scope">
         <template slot-scope="scope">
           <div v-if="['name', 'reportProjectNum', 'patentProjectNum'].includes(item.value)">
           <div v-if="['name', 'reportProjectNum', 'patentProjectNum'].includes(item.value)">
-            <el-link @click="handleItem(scope.row, item.value)" v-html="$commonJS.getColumnData(scope.row, item)"></el-link>
+            <el-link @click="handleItem(scope.row, item.value)" >
+              <span v-html="$commonJS.getColumnData(scope.row, item)"></span>
+            </el-link>
           </div>
           </div>
           <div v-else v-html="$commonJS.getColumnData(scope.row, item)"></div>
           <div v-else v-html="$commonJS.getColumnData(scope.row, item)"></div>
         </template>
         </template>
@@ -204,6 +206,7 @@ export default {
 
 
     getList() {
     getList() {
       if (!this.row) return;
       if (!this.row) return;
+      if (this.disabled) return;
       if (this.params.current * this.params.size >= this.params.total) {
       if (this.params.current * this.params.size >= this.params.total) {
         this.isMore = true
         this.isMore = true
         this.disabled = true
         this.disabled = true
@@ -212,7 +215,6 @@ export default {
           this.isFlag = false
           this.isFlag = false
         }, 1000)
         }, 1000)
       }
       }
-      if (this.disabled) return;
       this.params.current += 1
       this.params.current += 1
       let params = {
       let params = {
         ...this.params,
         ...this.params,

+ 3 - 3
src/views/home/components/echarts/index.vue

@@ -1,13 +1,13 @@
 <template> 
 <template> 
   <div class="home_echarts" v-if="show">
   <div class="home_echarts" v-if="show">
-    <div class="left">
+    <div class="left" id='step3'>
       <report-echart></report-echart>
       <report-echart></report-echart>
     </div>
     </div>
     <div class="right">
     <div class="right">
-        <div class="top">
+        <div class="top" id='step4'>
           <task-echart></task-echart>
           <task-echart></task-echart>
         </div>
         </div>
-        <div class="bottom">
+        <div class="bottom" id='step5'>
           <event-echart></event-echart>
           <event-echart></event-echart>
         </div>
         </div>
     </div>
     </div>

+ 4 - 2
src/views/home/components/showDialog.js

@@ -7,8 +7,10 @@ let DrawerConstructor = Vue.extend(showDialog);
 let instance;
 let instance;
  
  
 /**
 /**
- * Scenario:[],eventId:'',eventName:''
- * @param {*} value 
+ * 打开查看事件流程详情
+ * @param {Object} value 
+ * @example
+ * {Scenario:[],eventId:'',eventName:''}
  * @returns 
  * @returns 
  */
  */
 const Drawer = function(value) {
 const Drawer = function(value) {

+ 11 - 7
src/views/home/index.vue

@@ -110,13 +110,17 @@ export default {
     
     
     // 点击搜索
     // 点击搜索
     search(){
     search(){
-      this.$eventVisual(
-        {
-          Scenario:["专利培育布局"],
-          eventId:'69',
-          eventName:'事件21'
-        }
-      )
+      if(!this.queryParams.select){
+        this.$message.error('请选择需要检索的信息')
+        return false
+      }
+      localStorage.searchContent = this.queryParams.content
+      this.$router.push({
+        name:this.queryParams.select,
+      })
+      setTimeout(function () {
+        localStorage.searchContent = ''
+      }, 1000);
     },
     },
     
     
     //获取提示信息
     //获取提示信息

+ 3 - 3
src/views/layout/components/UserBar.vue

@@ -20,7 +20,7 @@
       </div>
       </div>
       <template slot="dropdown">
       <template slot="dropdown">
         <el-dropdown-menu>
         <el-dropdown-menu>
-          <el-dropdown-item>
+          <!-- <el-dropdown-item>
             <el-dropdown @command="handleCommand" trigger="hover" placement="right-start" style="width:100%">
             <el-dropdown @command="handleCommand" trigger="hover" placement="right-start" style="width:100%">
               <span class="el-dropdown-link" >  语言 </span>
               <span class="el-dropdown-link" >  语言 </span>
               <el-dropdown-menu  class="children_item">
               <el-dropdown-menu  class="children_item">
@@ -28,10 +28,10 @@
                 <el-dropdown-item command="en"> 英文 </el-dropdown-item>
                 <el-dropdown-item command="en"> 英文 </el-dropdown-item>
               </el-dropdown-menu>
               </el-dropdown-menu>
             </el-dropdown>
             </el-dropdown>
-          </el-dropdown-item>
+          </el-dropdown-item> -->
           <el-dropdown-item>
           <el-dropdown-item>
             <el-dropdown @command="handleCommand1" trigger="hover" placement="right-start">
             <el-dropdown @command="handleCommand1" trigger="hover" placement="right-start">
-              <span class="el-dropdown-link">  主题 </span>
+              <p class="el-dropdown-link" style="width:100%">  主题 </p>
               <el-dropdown-menu  class="children_item">
               <el-dropdown-menu  class="children_item">
                 <el-dropdown-item command="#6768ab"> 深紫色 </el-dropdown-item>
                 <el-dropdown-item command="#6768ab"> 深紫色 </el-dropdown-item>
                 <el-dropdown-item command="#316192"> 深蓝色 </el-dropdown-item>
                 <el-dropdown-item command="#316192"> 深蓝色 </el-dropdown-item>

+ 180 - 2
src/views/layout/components/guide.js

@@ -55,12 +55,190 @@ const steps = {
         {
         {
             element: "#step3", // 需要引导展示的iD
             element: "#step3", // 需要引导展示的iD
             popover: {
             popover: {
-                title: "列表展示", //展示模块标题
-                description: "展示一些重要信息。", // 展示模块类容
+                title: "报告统计", //展示模块标题
+                description: "统计各种类型报告的数量。", // 展示模块类容
                 side: "right" // 模块的位置 可以定位 看自己了
                 side: "right" // 模块的位置 可以定位 看自己了
             } 
             } 
         },
         },
+        {
+            element: "#step4", // 需要引导展示的iD
+            popover: {
+                title: "任务统计", //展示模块标题
+                description: "统计自己完成与未完成的任务数量。", // 展示模块类容
+                side: "right" // 模块的位置 可以定位 看自己了
+            } 
+        },
+        {
+            element: "#step5", // 需要引导展示的iD
+            popover: {
+                title: "事件统计", //展示模块标题
+                description: "统计八大应用场景下事件的数量。", // 展示模块类容
+                side: "right" // 模块的位置 可以定位 看自己了
+            } 
+        },
+    ],
+    //场景可视化
+    'visual':[],
+    //专利数据库首页
+    'project':[
+        {
+            element: "#step1", 
+            popover: {
+                title: "检索专利数据库",
+                description: "选择需要检索的字段,填入检索信息后点击搜索按钮",
+                side: "right" 
+            }  
+        },
+        {
+            element: "#step2", 
+            popover: {
+                title: "分组",
+                description: "选择需要分组的字段进行分组查看",
+                side: "right" 
+            }  
+        },
+        {
+            element: "#step3", 
+            popover: {
+                title: "视图",
+                description: "有两种查看专利数据库类别的视图方式可以查看",
+                side: "right" 
+            }  
+        },
+        {
+            element: "#step4", 
+            popover: {
+                title: "操作按钮",
+                description: "",
+                side: "right" 
+            }  
+        },
+    ],
+    //产品首页
+    'product':[
+        {
+            element: "#step1", 
+            popover: {
+                title: "检索",
+                description: "选择需要检索的字段,填入检索信息后点击搜索按钮",
+                side: "right" 
+            }  
+        },
+        {
+            element: "#step2", 
+            popover: {
+                title: "新增类别",
+                description: "点击按钮会弹出弹窗添加需要添加的产品类别",
+                side: "right" 
+            }  
+        },
+    ],
+    //事件首页
+    'event':[
+        {
+            element: "#step1", 
+            popover: {
+                title: "检索",
+                description: "选择需要检索的字段,填入检索信息后点击搜索按钮",
+                side: "right" 
+            }  
+        },
+        {
+            element: "#step2", 
+            popover: {
+                title: "分组",
+                description: "选择需要分组的字段进行分组查看",
+                side: "right" 
+            }  
+        },
+        {
+            element: "#step3", 
+            popover: {
+                title: "视图",
+                description: "有三种查看事件的视图方式可以查看",
+                side: "right" 
+            }  
+        },
+        {
+            element: "#step4", 
+            popover: {
+                title: "操作按钮",
+                description: "",
+                side: "right" 
+            }  
+        },
     ],
     ],
+    //报告首页
+    'report':[
+        {
+            element: "#step1", 
+            popover: {
+                title: "检索",
+                description: "选择需要检索的字段,填入检索信息后点击搜索按钮",
+                side: "right" 
+            }  
+        },
+        {
+            element: "#step2", 
+            popover: {
+                title: "分组",
+                description: "选择需要分组的字段进行分组查看",
+                side: "right" 
+            }  
+        },
+        {
+            element: "#step3", 
+            popover: {
+                title: "视图",
+                description: "有三种查看报告的视图方式可以查看",
+                side: "right" 
+            }  
+        },
+        {
+            element: "#step4", 
+            popover: {
+                title: "操作按钮",
+                description: "",
+                side: "right" 
+            }  
+        },
+    ],
+    //专利挖掘首页
+    'patentMining':[
+        {
+            element: "#step1", 
+            popover: {
+                title: "检索",
+                description: "选择需要检索的字段,填入检索信息后点击搜索按钮",
+                side: "right" 
+            }  
+        },
+        {
+            element: "#step2", 
+            popover: {
+                title: "分组",
+                description: "选择需要分组的字段进行分组查看",
+                side: "right" 
+            }  
+        },
+        {
+            element: "#step3", 
+            popover: {
+                title: "视图",
+                description: "有三种查看专利挖掘项目的视图方式可以查看",
+                side: "right" 
+            }  
+        },
+        {
+            element: "#step4", 
+            popover: {
+                title: "操作按钮",
+                description: "",
+                side: "right" 
+            }  
+        },
+    ],
+    
 }
 }
 /**
 /**
  * driver.js v1.3.0 新手指引工具
  * driver.js v1.3.0 新手指引工具

+ 6 - 0
src/views/layout/mixins/index.js

@@ -49,6 +49,12 @@ export const commonData={
       this.$api.getScenario().then(response => {
       this.$api.getScenario().then(response => {
         this.$store.commit("SET_Scenario",response.data.data)
         this.$store.commit("SET_Scenario",response.data.data)
       })
       })
+    },
+    //获取调查类型
+    getMatter(){
+      this.$api.getMatter([]).then(response => {
+        this.$store.commit("SET_Matter",response.data.data)
+      })
     }
     }
   }
   }
 }
 }

+ 1 - 0
src/views/login/index.vue

@@ -247,6 +247,7 @@ export default {
             this.DictMessage()
             this.DictMessage()
             this.getUserInfo()
             this.getUserInfo()
             this.getScenario()
             this.getScenario()
+            this.getMatter()
       }).catch(error => {
       }).catch(error => {
         this.getCode()
         this.getCode()
         this.btnLoading = false
         this.btnLoading = false

+ 96 - 0
src/views/patentMining/components/view/card.vue

@@ -0,0 +1,96 @@
+<template>
+    <div>
+      <el-row :gutter="12">
+        <el-col :span="6" v-for="(item, itemIndex) in tableData" :key="itemIndex" style="padding-bottom:10px">
+          <myCard shadow="always">
+            <div slot="head">
+              <div style="font-size:18px">
+                <!-- <span># {{ (itemIndex + 1) + ((queryParams.current - 1) * queryParams.size)}}</span> -->
+                <span>{{ item.name }}</span>
+              </div>
+            </div>
+            <div>
+              <el-form label-position="left" label-width="140px">
+                
+                <el-form-item label="研发项目名称:"> 
+                    <myTooltip :content="item.rdName" >
+                        <div v-html="$commonJS.getColumnData(item, {type:'String',value:'rdName'})" class="noWrap"></div>
+                    </myTooltip>
+                </el-form-item>
+                <el-form-item label="技术方向:">
+                    <myTooltip :content="item.technicalDirection" >
+                        <div v-html="$commonJS.getColumnData(item, {type:'String',value:'technicalDirection'})" class="noWrap"></div>
+                    </myTooltip>
+                </el-form-item>
+                <el-form-item label="技术关键词:">
+                  <myTooltip :content="$commonJS.getColumnData(item, {type:'String',value:'technicalKeyword'})">
+                    <div class="noWrap" v-html="$commonJS.getColumnData(item, {type:'String',value:'technicalKeyword'})"></div>
+                  </myTooltip>
+                </el-form-item>
+                <el-form-item label="委托方:">
+                  <myTooltip :content="item.entrustName" >
+                    <div v-html="$commonJS.getColumnData(item, {type:'String',value:'entrustName'})" class="noWrap"></div>
+                  </myTooltip>
+                </el-form-item>
+                <el-form-item label="相关事件:">
+                  <myTooltip :content="item.eventNames" >
+                    <div v-html="$commonJS.getColumnData(item, {type:'Array',value:'eventNames'})" class="noWrap"></div>
+                  </myTooltip>
+                </el-form-item>
+                <el-form-item label="负责人:">
+                  <myTooltip :content="item.headName" >
+                    <div v-html="$commonJS.getColumnData(item, {type:'String',value:'headName'})" class="noWrap"></div>
+                  </myTooltip>
+                </el-form-item>
+                <el-form-item label="状态:">
+                  <myTooltip :content="item.stateName" >
+                    <div v-html="$commonJS.getColumnData(item, {type:'String',value:'stateName'})" class="noWrap"></div>
+                  </myTooltip>
+                </el-form-item>
+                <el-form-item label="创建人:">
+                  <myTooltip :content="item.createName" >
+                    <div v-html="$commonJS.getColumnData(item, {type:'String',value:'createName'})" class="noWrap"></div>
+                  </myTooltip>
+                </el-form-item>
+                <el-form-item label="创建时间:">
+                  <myTooltip :content="item.createTime" >
+                    <div v-html="$commonJS.getColumnData(item, {type:'String',value:'createTime'})" class="noWrap"></div>
+                  </myTooltip>
+                </el-form-item>
+              </el-form>
+            </div>
+            <div slot="foot">
+              <div class="btn">
+                <i class="el-icon-edit" @click="handleCommand('e', item)"></i>
+                <i class="el-icon-delete" @click="handleCommand('1', item)"></i>
+              </div>
+            </div>
+          </myCard>
+        </el-col>
+      </el-row>
+    </div>
+</template>
+    
+<script>
+  import mixins from '../mixins';
+  export default {
+    components: {},
+    props: {},
+    mixins: [mixins],
+    data() {
+      return {
+      };
+    },
+    watch: {},
+    computed: {},
+    created() { },
+    mounted() { },
+    methods: {},
+  };
+  </script>
+  <style lang="scss">
+
+  </style>
+  <style lang="scss" scoped>
+
+  </style>

+ 2 - 1
src/views/patentMining/components/view/commonTable.vue

@@ -154,6 +154,7 @@ export default {
 
 
     getList() {
     getList() {
       if (!this.row) return;
       if (!this.row) return;
+      if (this.disabled) return;
       if (this.params.current * this.params.size >= this.params.total) {
       if (this.params.current * this.params.size >= this.params.total) {
         this.isMore = true
         this.isMore = true
         this.disabled = true
         this.disabled = true
@@ -162,7 +163,7 @@ export default {
           this.isFlag = false
           this.isFlag = false
         }, 1000)
         }, 1000)
       }
       }
-      if (this.disabled) return;
+      
       this.params.current += 1
       this.params.current += 1
       let params = {
       let params = {
         ...this.params,
         ...this.params,

+ 64 - 12
src/views/patentMining/components/viewIndex.vue

@@ -1,13 +1,13 @@
 <template>
 <template>
   <div class="patentMiningIndex">
   <div class="patentMiningIndex">
-    <el-container>
+    <el-container v-if="showView">
       <el-header>
       <el-header>
-        <div>
+        <div id="step1">
           <mySearch style="width:500px" :SearchFields="searchFiled" @search="search" :searchValue="searchOption"
           <mySearch style="width:500px" :SearchFields="searchFiled" @search="search" :searchValue="searchOption"
             :disabled="!$permission('/workspace/project/check')"></mySearch>
             :disabled="!$permission('/workspace/project/check')"></mySearch>
         </div>
         </div>
         <div style="display:flex;margin-right:10px">
         <div style="display:flex;margin-right:10px">
-          <div>
+          <div id="step2">
             <span>分组查询:</span>
             <span>分组查询:</span>
             <el-select v-model="group" :disabled="!$permission('/workspace/project/check')" clearable size="small"
             <el-select v-model="group" :disabled="!$permission('/workspace/project/check')" clearable size="small"
               @change="onChange" style="width:200px">
               @change="onChange" style="width:200px">
@@ -15,13 +15,13 @@
               </el-option>
               </el-option>
             </el-select>
             </el-select>
           </div>
           </div>
-          <el-button-group class="margin-left_10" v-if="[2].indexOf(isOperate) == -1">
+          <el-button-group id="step3" class="margin-left_10" v-if="[2].indexOf(isOperate) == -1">
             <el-button :type="viewTypeBtn === 'commonTable' ? 'primary' : ''" @click="onChange2('commonTable')"
             <el-button :type="viewTypeBtn === 'commonTable' ? 'primary' : ''" @click="onChange2('commonTable')"
               size="small">列表</el-button>
               size="small">列表</el-button>
             <el-button :type="viewTypeBtn === 'commonCard' ? 'primary' : ''" @click="onChange2('commonCard')"
             <el-button :type="viewTypeBtn === 'commonCard' ? 'primary' : ''" @click="onChange2('commonCard')"
               size="small">卡片</el-button>
               size="small">卡片</el-button>
           </el-button-group>
           </el-button-group>
-          <el-dropdown trigger="click" split-button type="primary" size="small" @command="handleCommand($event)">
+          <el-dropdown id="step4" trigger="click" split-button type="primary" size="small" @command="handleCommand($event)">
             <span @click="handleAdd">创建项目</span>
             <span @click="handleAdd">创建项目</span>
             <el-dropdown-menu slot="dropdown" class="text-align_center">
             <el-dropdown-menu slot="dropdown" class="text-align_center">
               <el-dropdown-item command="0">显示栏位管理</el-dropdown-item>
               <el-dropdown-item command="0">显示栏位管理</el-dropdown-item>
@@ -50,6 +50,7 @@
   
   
 <script>
 <script>
 import commonTable from './view/commonTable.vue';
 import commonTable from './view/commonTable.vue';
+import commonCard from './view/card.vue';
 import addAndEditProject from './dialog/addAndEditProject.vue';
 import addAndEditProject from './dialog/addAndEditProject.vue';
 import fields from '@/views/components/dialog/fields.vue';
 import fields from '@/views/components/dialog/fields.vue';
 import mergeTable from '../components/view/MergeTable.vue'
 import mergeTable from '../components/view/MergeTable.vue'
@@ -59,9 +60,12 @@ export default {
     addAndEditProject,
     addAndEditProject,
     fields,
     fields,
     mergeTable,
     mergeTable,
+    commonCard
   },
   },
   props: {
   props: {
-    isOperate: ''
+    isOperate: '',
+    matterId:{},
+    scenarioId:{}
   },
   },
   data() {
   data() {
     return {
     return {
@@ -102,7 +106,11 @@ export default {
         },
         },
       ],
       ],
       //检索条件
       //检索条件
-      searchOption: {},
+      searchOption: {
+        scenarioNames:this.scenarioId,
+        matterNames:this.matterId,
+        name:localStorage.searchContent
+      },
       // table栏位信息
       // table栏位信息
       columnList: [],
       columnList: [],
       //显示视图
       //显示视图
@@ -112,7 +120,35 @@ export default {
     };
     };
   },
   },
   watch: {},
   watch: {},
-  computed: {},
+  computed: {
+    scene(){
+      var a = this.$store.state.dictMessage.scenario.map(item=>{
+        return {
+          label:item.name,
+          value:item.id
+        }
+      })
+      var obj = this.searchFiled.find(item=>{return item.label == '应用场景'})
+      if(obj){
+        obj.options = a
+      }
+      return this.$store.state.dictMessage.scenario
+    },
+    matter() {
+      var a = this.$store.state.dictMessage.matter.map(item => {
+        return {
+          label: item.name,
+          value: item.id
+        }
+      })
+      var obj = this.searchFiled.find(item => { return item.label == '调查类型' })
+      if (obj) {
+        obj.options = a
+      }
+      return this.$store.state.dictMessage.matter || []
+    }
+
+  },
   created() { },
   created() { },
   async mounted() {
   async mounted() {
     // 获取table栏位
     // 获取table栏位
@@ -152,12 +188,28 @@ export default {
             value: 'value',
             value: 'value',
             type: 'type',
             type: 'type',
           })
           })
+           //为应用场景添加选项
+           var obj = this.searchFiled.find(item=>{return item.label == '应用场景'})
+          if(obj){
+            obj.options = this.scene.map(item=>{
+              return {
+                label:item.name,
+                value:item.id
+              }
+            })
+          }
+          var obj = this.searchFiled.find(item=>{return item.label == '调查类型'})
+          if(obj){
+            obj.options = this.matter.map(item=>{
+              return {
+                label:item.name,
+                value:item.id
+              }
+            })
+          }
         }
         }
       })
       })
-      this.showView = false
-      this.$nextTick(() => {
-        this.showView = true
-      })
+      this.showViews()
     },
     },
     // 新增、编辑成功信息
     // 新增、编辑成功信息
     isSuccess(val) {
     isSuccess(val) {

+ 0 - 151
src/views/patentMining/index.vue

@@ -21,154 +21,3 @@ export default {
 </script>
 </script>
 
 
 <style lang="scss" scoped></style>
 <style lang="scss" scoped></style>
-
-
-
-
-<!-- <template>
-  <div>
-    <el-container>
-      <el-header>
-        <div>
-          <mySearch style="width:500px" :SearchFields="searchFiled" @search="search" :searchValue="searchOption"
-            :disabled="!$permission('/workspace/project/check')"></mySearch>
-        </div>
-        <div style="display:flex;margin-right:10px">
-          <el-button-group class="margin-left_10" v-if="[2].indexOf(isOperate) == -1">
-            <el-button :type="viewType === 'commonTable' ? 'primary' : ''" @click="onChange2('commonTable')"
-              size="small">列表</el-button>
-            <el-button :type="viewType === 'commonCard' ? 'primary' : ''" @click="onChange2('commonCard')"
-              size="small">卡片</el-button>
-          </el-button-group>
-          <el-dropdown trigger="click" split-button type="primary" size="small">
-            <span @click="handleAdd">创建项目</span>
-            <el-dropdown-menu slot="dropdown" class="text-align_center">
-            </el-dropdown-menu>
-          </el-dropdown>
-        </div>
-      </el-header>
-      <el-main>
-        <component :is="viewType" v-bind="$attrs" v-on="$listeners" :isOperate="isOperate" :tableData="dataList"
-          :group="group" :queryParams="queryParams" @option="handleOption" @sort="handleSort"></component>
-      </el-main>
-      <el-footer class="pagination">
-        <div>
-          <el-pagination background layout="total, prev, pager, next, jumper" :current-page.sync="queryParams.current"
-            :page-size.sync="queryParams.size" @current-change="handleCurrentChange" :total="total">
-          </el-pagination>
-        </div>
-      </el-footer>
-    </el-container>
-    <addAndEditProject ref="addAndEditProject"></addAndEditProject>
-
-  </div>
-</template>
-  
-<script>
-import commonTable from './components/view/commonTable.vue';
-import addAndEditProject from './components/dialog/addAndEditProject.vue';
-export default {
-  components: {
-    commonTable,
-    addAndEditProject
-  },
-  props: {
-    isOperate: ''
-  },
-  data() {
-    return {
-      //当前组件名称
-      viewType: 'commonTable',
-      //专利挖掘项目数据集合
-      dataList: [
-        {
-          name: 'xxx有限公司',
-          type: '本公司专利数据库',
-          status: '进行中',
-          createPerson: '朱豪',
-          id: 1,
-        }
-      ],
-      //分页
-      queryParams: {
-        size: 10,
-        current: 0,
-      },
-      //分组
-      group: '',
-      //排序
-      sort: [
-        {
-          "orderBy": "createTime",
-          "orderType": 1
-        }
-      ],
-      //总数
-      total: 0,
-      //检索字段
-      searchFiled: [
-        {
-          label: '项目名称',
-          value: 'name',
-          type: 1,
-          placeholder: '请输入项目名称'
-        },
-        {
-          label: '创建人',
-          value: 'createPerson',
-          type: 1,
-          placeholder: '请输入创建人名称'
-        },
-      ],
-      //检索条件
-      searchOption: {}
-    };
-  },
-  watch: {},
-  computed: {},
-  created() { },
-  mounted() { },
-  methods: {
-    //获取检索组件传过来的数据
-    search(val) {
-
-    },
-    //排序
-    handleSort(sort) {
-      this.sort = { ...sort }
-      this.getList()
-    },
-    //操作列
-    handleOption({ option, row }) {
-      switch (option) {
-        case '0'://设置定时任务
-          this.$refs.addAndEditDB.open(row, true)
-          break;
-        case '1'://删除
-          break;
-        case 'e'://编辑
-          this.$refs.addAndEditProject.open(row)
-          break;
-      }
-    },
-    //分页
-    handleCurrentChange(val) {
-      this.queryParams.current = val;
-      this.getList();
-    },
-    //获取专利挖掘项目数据列表
-    getList() {
-
-    },
-    //添加其他企业专利数据库
-    handleAdd() {
-      this.$refs.addAndEditProject.open({})
-    },
-    //切换视图
-    onChange2(val) {
-      this.viewType = val
-    },
-  },
-};
-</script>
-<style lang="scss" scoped></style> -->

+ 170 - 0
src/views/product/components/details/components/basicMessage.vue

@@ -0,0 +1,170 @@
+<template>
+  <div v-loading="loading">
+    <el-form v-if="type == '1'" :model="row" label-width="110px" style="margin:0 auto;width:50%">
+        <el-form-item label="类别名称" prop="name">
+          <myTooltip :content="row.name" >
+            <div class="noWrap" v-html="$commonJS.getColumnData(row, {type:'String',value:'name'})"></div>
+          </myTooltip>
+        </el-form-item>
+        <el-form-item label="参考许可费率" prop="licenseRate">
+          <myTooltip :content="row.licenseRate+''" >
+            <div class="noWrap" v-html="$commonJS.getColumnData(row, {type:'String',value:'licenseRate'})"></div>
+          </myTooltip>
+        </el-form-item>
+        <el-form-item label="管理人" prop="adminPersons">
+          <myTooltip :content="$commonJS.getColumnData(row, {type:'Array',value:'adminPersons'},'name')" >
+            <div class="noWrap" v-html="$commonJS.getColumnData(row, {type:'Array',value:'adminPersons'},'name')"></div>
+          </myTooltip>
+        </el-form-item>
+        <el-form-item label="谁可以看" prop="persons">
+          <myTooltip :content="$commonJS.getColumnData(row, {type:'Array',value:'persons'},'name')">
+            <div class="noWrap" v-html="$commonJS.getColumnData(row, {type:'Array',value:'persons'},'name')"></div>
+          </myTooltip>
+        </el-form-item>
+        <el-form-item label="图片">
+          <span v-if="row.systemFileList && row.systemFileList.length>0" class="avatar">
+            <el-image ref="image" style="width:148px;height:148px;" :src="$commonJS.checkViewer(row.systemFileList[0].guid)" :preview-src-list="[$commonJS.checkViewer(row.systemFileList[0].guid)]"></el-image>
+          </span>
+        </el-form-item>
+        <el-form-item label="创建人" prop="createName">
+          <myTooltip :content="row.createName">
+            <div class="noWrap" v-html="$commonJS.getColumnData(row, {type:'String',value:'createName'})"></div>
+          </myTooltip>
+        </el-form-item>
+        <el-form-item label="创建时间" prop="createTime">
+          <myTooltip :content="row.createTime">
+            <div class="noWrap" v-html="$commonJS.getColumnData(row, {type:'String',value:'createTime'})"></div>
+          </myTooltip>
+        </el-form-item>
+        <el-form-item label="描述" prop="description">
+          <myTooltip :content="row.description">
+            <div class="noWrap" v-html="$commonJS.getColumnData(row, {type:'String',value:'description'})"></div>
+          </myTooltip>
+        </el-form-item>
+    </el-form>
+
+    <el-form v-else :model="row" label-width="110px" style="margin:0 auto;width:50%">
+        <!-- <el-form-item label="所属产品类别" prop="name">
+          <myTooltip :content="row.name" >
+            <div class="noWrap" v-html="$commonJS.getColumnData(row, {type:'String',value:'name'})"></div>
+          </myTooltip>
+        </el-form-item> -->
+        <el-form-item label="产品名称" prop="name">
+          <myTooltip :content="row.name" >
+            <div class="noWrap" v-html="$commonJS.getColumnData(row, {type:'String',value:'name'})"></div>
+          </myTooltip>
+        </el-form-item>
+        <el-form-item label="上市时间" prop="marketTime">
+          <myTooltip :content="row.marketTime" >
+            <div class="noWrap" v-html="$commonJS.getColumnData(row, {type:'String',value:'marketTime'})"></div>
+          </myTooltip>
+        </el-form-item>
+        <el-form-item label="所属公司" prop="companyName">
+          <myTooltip :content="row.companyName" >
+            <div class="noWrap" v-html="$commonJS.getColumnData(row, {type:'String',value:'companyName'})"></div>
+          </myTooltip>
+        </el-form-item>
+        <el-form-item label="参考许可费率" prop="licenseRate">
+          <myTooltip :content="row.licenseRate+''" >
+            <div class="noWrap" v-html="$commonJS.getColumnData(row, {type:'String',value:'licenseRate'})"></div>
+          </myTooltip>
+        </el-form-item>
+        <el-form-item label="管理人" prop="adminPersons">
+          <myTooltip :content="$commonJS.getColumnData(row, {type:'Array',value:'adminPersons'},'name')" >
+            <div class="noWrap" v-html="$commonJS.getColumnData(row, {type:'Array',value:'adminPersons'},'name')"></div>
+          </myTooltip>
+        </el-form-item>
+        <el-form-item label="谁可以看" prop="persons">
+          <myTooltip :content="$commonJS.getColumnData(row, {type:'Array',value:'persons'},'name')">
+            <div class="noWrap" v-html="$commonJS.getColumnData(row, {type:'Array',value:'persons'},'name')"></div>
+          </myTooltip>
+        </el-form-item>
+        <el-form-item label="图片">
+          <span v-if="row.systemFileList && row.systemFileList.length>0" class="avatar">
+            <el-image ref="image" style="width:148px;height:148px;" :src="$commonJS.checkViewer(row.systemFileList[0].guid)" :preview-src-list="[$commonJS.checkViewer(row.systemFileList[0].guid)]"></el-image>
+          </span>
+        </el-form-item>
+        <el-form-item label="创建人" prop="createName">
+          <myTooltip :content="row.createName">
+            <div class="noWrap" v-html="$commonJS.getColumnData(row, {type:'String',value:'createName'})"></div>
+          </myTooltip>
+        </el-form-item>
+        <el-form-item label="创建时间" prop="createTime">
+          <myTooltip :content="row.createTime">
+            <div class="noWrap" v-html="$commonJS.getColumnData(row, {type:'String',value:'createTime'})"></div>
+          </myTooltip>
+        </el-form-item>
+        <el-form-item label="描述" prop="description">
+          <myTooltip :content="row.description">
+            <div class="noWrap" v-html="$commonJS.getColumnData(row, {type:'String',value:'description'})"></div>
+          </myTooltip>
+        </el-form-item>
+    </el-form>
+  </div>
+</template>
+
+<script>
+export default {
+  components: {},
+  props: {
+    type:{},
+    id:{}
+  },
+  data() {
+    return {
+      row:{},
+      params:{
+        current:1,
+        size:10,
+        orderDTOList: null,
+      },
+      loading:false
+    };
+  },
+  watch: {},
+  computed: {},
+  created() {},
+  mounted() {
+    if(Object.keys(this.row).length>0){
+      return false
+    }
+    if(this.type == '1'){
+      this.getProductCategory()
+    }else{
+      this.getProduct()
+    }
+  },
+  methods: {
+    //获取产品类别信息
+    getProductCategory(){
+      this.params.searchQuery = `category_id=${this.id}`
+      this.loading = true
+      this.$api.queryProductCategory(this.params).then(response=>{
+        if(response.code == 200){
+          this.row = response.data.data[0]
+          this.loading = false
+        }
+      }).catch(error=>{
+        this.row = {}
+        this.loading = false
+      })
+    },
+    //获取产品信息
+    getProduct(){
+      this.params.searchQuery = `product_id=${this.id}`
+      this.loading = true
+      this.$api.queryProduct(this.params).then(response=>{
+        if(response.code == 200){
+          this.row = response.data.data[0]
+          this.loading = false
+        }
+      }).catch(error=>{
+        this.row = {}
+        this.loading = false
+      })
+    },
+  },
+};
+</script>
+<style lang="scss" scoped>
+</style>

+ 140 - 0
src/views/product/components/details/components/index.vue

@@ -0,0 +1,140 @@
+<template>
+    <div style="height:100%">
+      <el-container>
+        <el-header class="basic_header">
+            <el-tabs v-model="activeName" type="card" @tab-click="handleClick" style="width:100%">
+              <el-tab-pane v-for="item in menu" :key='item.path' :label="item.label" :name="item.path"></el-tab-pane>
+            </el-tabs>
+            <!-- <my-tabs v-model="activeName" tabs-type="card" :font-size="16" :border="true">
+                <my-tabs-item v-for="item in menu" :key='item.path' :label="item.label" :name="item.path">
+                </my-tabs-item>
+            </my-tabs> -->
+            
+        </el-header>
+        <el-main>
+            <component :is='activeName' :type="type" :id="id" :name="name" :licenseRate="licenseRate" :categoryId="categoryId"></component>
+        </el-main>
+      </el-container>
+    </div>
+</template>
+  
+<script>
+import basicMessage from './basicMessage.vue';
+// import market from '../../market/index.vue'
+import chart from '../../echarts/components/echarts.vue'
+import marketAndTrend from './marketAndTrend.vue';
+import framework from '../../framework/viewIndex.vue'
+  export default {
+    components: {
+        basicMessage,
+        chart,
+        marketAndTrend,
+        framework
+    },
+    props: {
+        type:{
+
+        },
+        id:{
+
+        },
+        name:{
+
+        },
+        licenseRate:{
+
+        },
+        categoryId:{
+
+        }
+    },
+    data() {
+      return {
+        menu:[],
+        activeName:'basicMessage',
+      };
+    },
+    watch: {},
+    computed: {},
+    created() {},
+    mounted() {
+        this.getMenu()
+    },
+    methods: {
+        getMenu(){
+            if(this.type == '1'){
+                this.menu = [
+                    {
+                        label:'基本信息',
+                        value:'1',
+                        path:'basicMessage'
+                    },
+                    {
+                        label:'趋势图',
+                        value:'2',
+                        path:'chart'
+                    },
+                    {
+                        label:'分类架构',
+                        value:'3',
+                        path:'framework'
+                    },
+                    {
+                        label:'专利布局可视化',
+                        value:'3',
+                        path:'jsMind'
+                    },
+
+                ]
+            }else{
+                this.menu = [
+                    {
+                        label:'基本信息',
+                        value:'1',
+                        path:'basicMessage'
+                    },
+                    {
+                        label:'营销数据',
+                        value:'2',
+                        path:'marketAndTrend'
+                    },
+                    {
+                        label:'商品化专利',
+                        value:'3',
+                        path:'RelatedPatents'
+                    },
+                    {
+                        label:'产品架构',
+                        value:'4',
+                        path:'framework'
+                    },
+                    {
+                        label:'专利布局可视化',
+                        value:'5',
+                        path:'jsMind'
+                    }, 
+                ]
+            }
+        },
+        handleClick(tab){
+    
+        }
+    },
+  };
+  </script>
+  <style lang="scss" scoped>
+  .basic_header{
+    padding: 0 !important;
+    width: 100%;
+    align-items: end;
+    border-bottom:0 ;
+  }
+  </style>
+  <style lang="scss">
+    .basic_header{
+        .el-tabs__header{
+            margin: 0;
+        }
+    }
+  </style>
+  

+ 50 - 0
src/views/product/components/details/components/marketAndTrend.vue

@@ -0,0 +1,50 @@
+<template>
+    <div class="echart">
+      <div class="item">
+          <MarketingData :id="id" :type="type" :name="name"></MarketingData>
+      </div>
+      <div>
+          <chart :id="id" :type="type" :name="name"></chart>
+      </div>
+    </div>
+</template>
+  
+  <script>
+  export default {
+    components: {
+      MarketingData:()=> import('../../market/index.vue'),
+      chart:() => import('../../echarts/components/echarts.vue'),
+    },
+    props: {
+        type:{
+
+        },
+        id:{
+
+        },
+        name:{
+
+        },
+    },
+    data() {
+      return {
+      };
+    },
+    watch: {},
+    computed: {},
+    created() {},
+    mounted() {},
+    methods: {},
+  };
+  </script>
+  <style lang="scss" scoped>
+  .echart{
+      display: flex;
+      height: 100%;
+      .item{
+          padding:10px;
+          height: 100%;
+          border-right: 1px solid gray;
+      }
+  }
+  </style>

+ 0 - 0
src/views/product/components/details/components/mixins/index.js


+ 46 - 0
src/views/product/components/details/index.vue

@@ -0,0 +1,46 @@
+<template>
+  <div>
+    <product-Details :type="type" :id="id" :name="name" :licenseRate="licenseRate" :categoryId="categoryId"></product-Details>
+  </div>
+</template>
+
+<script>
+import productDetails from './components/index.vue'
+export default {
+  components: {
+    productDetails
+  },
+  props: {},
+  data() {
+    return {
+    };
+  },
+  watch: {},
+  computed: {
+    //类型2是产品,1是产品类别
+    type(){
+        return this.$route.query.type
+    },
+    //产品或者产品类别id
+    id(){
+        return this.$route.query.id
+    },
+    //产品或者产品类别名称
+    name(){
+        return this.$route.query.name
+    },
+    //产品或者产品类别许可费率
+    licenseRate(){
+        return this.$route.query.licenseRate
+    },
+    categoryId(){
+      return this.$route.query.categoryId
+    }
+  },
+  created() {},
+  mounted() {},
+  methods: {},
+};
+</script>
+<style lang="scss" scoped>
+</style>

+ 118 - 0
src/views/product/components/dialog/addEditMarket.vue

@@ -0,0 +1,118 @@
+<template>
+  <div>
+    <el-dialog :title="title" :visible.sync="dialogVisible" :before-close="handleClose" width="600px" :close-on-click-modal="false" :append-to-body="true">
+        <el-form :model="form" :rules="rules" ref="ruleForm" label-width="120px" label-position="left" class="demo-ruleForm">
+            <el-form-item label="时间" prop="saleTime">
+                <el-date-picker style="width: 100%" v-model="form.saleTime" type="month" value-format="yyyy-MM" placeholder="选择日期时间"></el-date-picker>
+            </el-form-item>
+            <el-form-item label="地区" prop="saleArea">
+                <el-input v-model="form.saleArea" placeholder="请输入地区"></el-input>
+            </el-form-item>
+            <el-form-item label="销售量/件" prop="saleCount">
+                <el-input v-model="form.saleCount" placeholder="请输入销售量"></el-input>
+            </el-form-item>
+            <el-form-item label="销售额/万元" prop="saleMoney">
+                <el-input v-model="form.saleMoney" placeholder="请输入销售额"></el-input>
+            </el-form-item>
+            <el-form-item label="许可参考值" prop="licenseRate">
+                <span>{{ form.licenseRate }}</span>
+            </el-form-item>
+            <el-form-item label="自定义许可费" prop="customLicenseRate">
+                <el-input v-model="form.customLicenseRate" placeholder="请输入自定义许可费率(许可费率介于0-1之间)"></el-input>
+            </el-form-item>
+        </el-form>
+        <div slot="footer" class="dialog-footer">
+            <el-button @click="handleClose">取消</el-button>
+            <el-button type="primary" :loading="btnLoading" @click="submit">确定</el-button>
+        </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+export default {
+  components: {},
+  props: {},
+  data() {
+    const licenseRateRule = (rule , value ,callback)=>{
+      if(value){
+         if (!isNaN(value)) {
+          if (value>=0 && value<=1) {
+            callback()
+          } else {
+            callback(new Error('输入错误,参考许可费率介于0-1之间'))
+          }
+        } else {
+          callback(new Error('输入错误,参考许可费率介于0-1之间'))
+        }
+      }else{
+        callback()
+      }
+    }
+    return {
+        //标题
+        title:'',
+        //弹窗显示
+        dialogVisible:false,
+        //表单数据
+        form:{},
+        //规则
+        rules:{
+            customLicenseRate:[{ required: false, validator:licenseRateRule, trigger: 'blur' },],
+        },
+        //按钮加载
+        btnLoading:false,
+    };
+  },
+  watch: {},
+  computed: {},
+  created() {},
+  mounted() {},
+  methods: {
+    open(form){
+        this.form = JSON.parse(JSON.stringify(form))
+        if(this.form.id){
+            this.title = '编辑营销数据'
+        }else{
+            this.title = '新增营销数据'
+        }
+        this.dialogVisible = true
+    },
+    //关闭弹窗
+    handleClose(){
+        this.dialogVisible = false
+    },
+    //提交数据
+    submit(){
+        this.$refs.ruleForm.validate(valid => {
+            if (valid) {
+                this.btnLoading = true
+                if(this.form.id){
+                    this.$api.updateProductMarketDat(this.form).then(response=>{
+                        if(response.code == 200){
+                            this.$emit('submit','修改成功!')
+                            this.btnLoading = false
+                            this.handleClose()
+                        }
+                    }).catch(error=>{
+                        this.btnLoading = false
+                    })
+                }else{
+                    this.$api.addProductMarketData(this.form).then(response=>{
+                        if(response.code == 200){
+                            this.$emit('submit','新增成功!')
+                            this.btnLoading = false
+                            this.handleClose()
+                        }
+                    }).catch(error=>{
+                        this.btnLoading = false
+                    })
+                }
+            }
+        })
+    }
+  },
+};
+</script>
+<style lang="scss" scoped>
+</style>

+ 0 - 1
src/views/product/components/dialog/addEditProduct.vue

@@ -196,7 +196,6 @@ export default {
       this.dialogVisible = true;
       this.dialogVisible = true;
     },
     },
     // 弹窗确定
     // 弹窗确定
-    // 弹窗确定
     submit() {
     submit() {
       this.$refs.ruleForm.validate(valid => {
       this.$refs.ruleForm.validate(valid => {
         if (valid) {
         if (valid) {

+ 4 - 4
src/views/product/components/dialog/classifyNode.vue

@@ -4,7 +4,7 @@
     <el-dialog :title="title" :visible.sync="dialogVisible" :before-close="handleClose" width="600px"
     <el-dialog :title="title" :visible.sync="dialogVisible" :before-close="handleClose" width="600px"
       :close-on-click-modal="false">
       :close-on-click-modal="false">
       <el-form :model="form" :rules="rules" ref="ruleForm" label-width="120px" class="demo-ruleForm">
       <el-form :model="form" :rules="rules" ref="ruleForm" label-width="120px" class="demo-ruleForm">
-        <el-form-item :label="row.typesOf==1?'所属类别名称':'所属产品名称'" prop="productName">
+        <el-form-item :label="row.type==1?'所属类别名称':'所属产品名称'" prop="productName">
           <el-input v-model="form.productName" disabled placeholder="请输入所属产品名称"></el-input>
           <el-input v-model="form.productName" disabled placeholder="请输入所属产品名称"></el-input>
         </el-form-item>
         </el-form-item>
         <el-form-item label="所属架构">
         <el-form-item label="所属架构">
@@ -81,10 +81,10 @@ export default {
       if (data) {
       if (data) {
           this.options=this.treeDataPath
           this.options=this.treeDataPath
           this.form = JSON.parse(JSON.stringify(data))
           this.form = JSON.parse(JSON.stringify(data))
-          this.title = row.typesOf==1?'编辑类别架构': '编辑产品架构'
+          this.title = row.type==1?'编辑类别架构': '编辑产品架构'
           this.$set(this.form, 'parent_id', this.form.parentId)
           this.$set(this.form, 'parent_id', this.form.parentId)
       } else {
       } else {
-        this.title = row.typesOf==1?'新增类别架构':'新增产品架构'
+        this.title = row.type==1?'新增类别架构':'新增产品架构'
         if (newData && newData.pathName) {
         if (newData && newData.pathName) {
           this.$set(this.form, 'parent_id', newData.id)
           this.$set(this.form, 'parent_id', newData.id)
           this.options=this.treeDataPath
           this.options=this.treeDataPath
@@ -94,7 +94,7 @@ export default {
         }
         }
       }
       }
       
       
-      this.form.type=row.typesOf//类型:1产品类别,2产品,3技术分类,4自定义树
+      this.form.type=row.type//类型:1产品类别,2产品,3技术分类,4自定义树
       this.form.productName = row.name
       this.form.productName = row.name
       this.form.typeId=row.id
       this.form.typeId=row.id
       this.dialogVisible = true
       this.dialogVisible = true

+ 9 - 144
src/views/product/components/dialog/marketing.vue

@@ -2,174 +2,39 @@
   <!-- 营销数据 -->
   <!-- 营销数据 -->
   <div class="marketing">
   <div class="marketing">
     <el-dialog :title="title" :visible.sync="dialogVisible" :before-close="handleClose" width="1000px" :close-on-click-modal="false">
     <el-dialog :title="title" :visible.sync="dialogVisible" :before-close="handleClose" width="1000px" :close-on-click-modal="false">
-      <el-table :data="tableData" header-row-class-name="custom-table-header">
-        <el-table-column label="#" width="60" type="index" align="center">
-          <template slot-scope="scope">
-            <span>{{ (scope.$index + 1) + ((queryParams.current - 1) * queryParams.size) }}</span>
-          </template>
-        </el-table-column>
-
-        <el-table-column label="时间" prop="saleTime" align="center">
-          <template slot-scope="scope">
-            <div>
-              <span v-if="!scope.row.isShow">{{ scope.row.saleTime }}</span>
-              <el-date-picker style="width: 100%" v-else v-model="scope.row.saleTime" type="month" value-format="yyyy-MM"
-                placeholder="选择日期时间">
-              </el-date-picker>
-            </div>
-          </template>
-        </el-table-column>
-        <el-table-column label="地区" prop="saleArea" align="center">
-          <template slot-scope="scope">
-            <div>
-              <span v-if="!scope.row.isShow">{{ scope.row.saleArea }}</span>
-              <el-input v-else v-model="scope.row.saleArea"></el-input>
-            </div>
-          </template>
-        </el-table-column>
-        <el-table-column label="销售量/件" prop="saleCount" align="center">
-          <template slot-scope="scope">
-            <div>
-              <span v-if="!scope.row.isShow">{{ scope.row.saleCount }}</span>
-              <el-input v-else v-model="scope.row.saleCount"></el-input>
-            </div>
-          </template>
-        </el-table-column>
-        <el-table-column label="销售额/万元" prop="saleMoney" align="center">
-          <template slot-scope="scope">
-            <div>
-              <span v-if="!scope.row.isShow">{{ scope.row.saleMoney }}</span>
-              <el-input v-else v-model="scope.row.saleMoney"></el-input>
-            </div>
-          </template>
-        </el-table-column>
-        <el-table-column label="许可参考值" prop="reference" align="center">
-          <template slot-scope="scope">
-            <div>
-              <span>{{ scope.row.licenseRate == 0 || scope.row.licenseRate ? (Number(scope.row.saleMoney) *
-                Number(scope.row.licenseRate)).toFixed(2) : '' }}</span>
-
-            </div>
-          </template>
-        </el-table-column>
-        <el-table-column label="自定义许可费" prop="customLicenseFee" align="center">
-          <template slot-scope="scope">
-            <div>
-              <span v-if="!scope.row.isShow">{{
-                scope.row.customLicenseRate == 0 || scope.row.customLicenseRate ? (Number(scope.row.saleMoney) *
-                  Number(scope.row.customLicenseRate)).toFixed(2) : '' }}</span>
-              <el-input v-else v-model="scope.row.customLicenseRates" placeholder="请输入自定义许可费率(许可费率介于0-1之间)"
-                @blur="changeEditId(scope.row)" @change="inpBlur" autofocus=true></el-input>
-            </div>
-          </template>
-        </el-table-column>
-
-
-        <el-table-column label="操作" align="center" width="100px">
-          <template slot-scope="scope">
-            <el-button type="text" @click="handleEdit(scope.row)">{{ scope.row.isShow ? '保存' : '编辑' }}</el-button>
-            <el-button type="text" @click="handleDelete(scope.row)" style="color: red;">删除</el-button>
-          </template>
-        </el-table-column>
-      </el-table>
-      <div style="text-align: center;margin-top: 10px;">
-        <el-pagination background layout="total, prev, pager, next, jumper" :current-page.sync="queryParams.current"
-          :page-size.sync="queryParams.size" @current-change="handleCurrentChange" :total="total">
-        </el-pagination>
-      </div>
+      <productMarket :id="productData.id" :licenseRate="productData.licenseRate"></productMarket>
     </el-dialog>
     </el-dialog>
   </div>
   </div>
 </template>
 </template>
 
 
 <script>
 <script>
-
+import productMarket from '../market/index.vue'
 export default {
 export default {
+  components:{
+    productMarket
+  },
   data() {
   data() {
     return {
     return {
       // 营销数据弹窗的title
       // 营销数据弹窗的title
       title: '营销数据',
       title: '营销数据',
       // 控制营销数据弹窗的显示与消失
       // 控制营销数据弹窗的显示与消失
       dialogVisible: false,
       dialogVisible: false,
-      // 查询营销数据的字段
-      queryParams: {
-        current: 1,
-        size: 10,
-      },
-      // 营销数据的数量
-      total: 0,
-      // 营销数据的数据
-      tableData: [
-        {
-          "id": 84,
-          "productId": 43,
-          "saleTime": "2023-06",
-          "saleArea": "苏村",
-          "saleCount": 12,
-          "saleMoney": 100,
-          "customLicenseRate": 0.5
-        }
-      ],
+      //产品数据
+      productData:{}
     }
     }
   },
   },
   mounted() {
   mounted() {
 
 
   },
   },
   methods: {
   methods: {
-    //失去焦点
-    changeEditId(row) {
-      this.inpBlur(row)
-      // if (this.editId) {
-        this.$set(this, 'editId', null)
-      // }
-      this.update(row)
-    },
-    // 许可费率事件//优化
-    inpBlur(row) {
-      var val = row.customLicenseRates
-      if (val) {
-        if (!isNaN(val)) {
-          if (val >= 0 && val <= 1) {
-            row.customLicenseRate = val
-          } else {
-            if (val > 1) {
-              row.customLicenseRate = 1
-              row.customLicenseRates = 1
-            }
-            if (val < 0) {
-              row.customLicenseRate = 0
-              row.customLicenseRates = 0
-            }
-          }
-        } else {
-          row.customLicenseRates = row.customLicenseRate ? row.customLicenseRate : ''
-        }
-      }
 
 
-    },
-    // 更新当前营销数据
-    update(row){},
     // 打开弹窗
     // 打开弹窗
     open(row) {
     open(row) {
-      if (row && row.licenseRate) {
-        this.tableData[0].licenseRate = row.licenseRate
-      }
+      this.productData = row
+      this.title = `营销数据(${row.name})`
       this.dialogVisible = true
       this.dialogVisible = true
     },
     },
-    // 分页
-    handleCurrentChange(val) {
 
 
-    },
-    // 删除
-    handleDelete(row) { },
-    // 编辑/保存
-    handleEdit(row) {
-      if (row.isShow) {//保存
-        this.update(row)
-        this.$set(row, 'isShow', false)
-      } else {//编辑
-        this.$set(row, 'isShow', true)
-      }
-    },
     // 弹窗取消
     // 弹窗取消
     handleClose() {
     handleClose() {
       this.dialogVisible = false
       this.dialogVisible = false

+ 300 - 0
src/views/product/components/echarts/components/MultipleLine/index.vue

@@ -0,0 +1,300 @@
+<template>
+  <div style="margin-top:20px" >
+    <div style="display:flex;justify-content: flex-end;cursor: pointer;margin-bottom: -27px;margin-right:8px" :style="{ width: widths }">
+      <div class="set2">
+        <div>
+          <i class="el-icon-refresh" style="font-size:18px;" @click="review"></i>
+        </div>
+        <p class="text">还原</p>
+      </div>
+      <div class="set">
+        <div>
+          <i class="el-icon-setting" style="font-size: 18px;" @click="set"></i>
+        </div>
+        <p class="text">设置图表格式</p>
+      </div>
+      
+    </div>
+    <div :id="domId" :style="{ width: widths , height:heights }" ></div>
+    <el-drawer
+            title="图表配置"
+            :visible.sync="drawer"
+            direction="rtl"
+            :before-close="handleClose"
+            size="500px">
+            <div style="width:500px">
+               <Style :form="form"></Style> 
+            </div>
+            
+        </el-drawer>
+  </div>
+  
+</template>
+
+<script>
+import {chartOptionMixins,settingMethod} from '@/views/components/setting/mixins'
+import Style from '@/views/components/setting/style.vue'
+var that = this
+export default {
+  name: "CMultipleLine",
+  components:{
+        Style
+    },
+  mixins:[chartOptionMixins,settingMethod],
+  props: {
+    width: {
+      type: String,
+      default: '100%'
+    },
+    height: {
+      type: String,
+      default: '500px'
+    },
+    domId:{
+      default: 'multipleLine'
+    },
+   NewForm:{
+   }
+  },
+  data() {
+    return {
+      widths:'100%',
+      heights:'500px',
+      drawer:false,
+      changeColor:true,
+      id:this.domId,
+      relation:{},
+      name:'',
+      // domId: 'multipleLine',
+      chartData:[]
+    }
+  },
+  computed:{
+    formSetting(){
+      return this.form.setting
+    },
+  },
+  watch:{
+    formSetting(val){
+      this.dispose(this.id)
+      this.heights = val.height + val.heightUnit
+      this.widths = val.width + val.widthUnit
+      var a = this.getOption2()
+      this.$nextTick(() => {
+        this.initChart(this.id, a)
+      })
+   }
+  },
+  mounted() {
+    
+  },
+  
+  methods: {
+    handleClose(){
+      this.form = JSON.parse(JSON.stringify(this.form))
+      this.drawer = false
+    },
+    set(){
+      this.drawer = true
+      // this.$emit('form',this.form)
+    },
+    open(chartData,name,relation,timeUnit){
+      console.log(chartData,name,relation,timeUnit)
+      this.chartData = chartData
+      this.relation = relation
+      this.name = name
+      var a = this.getOption(name,relation,timeUnit)
+      this.$nextTick(() => {
+        this.initChart(this.id, a)
+      })
+    },
+  review(){
+      this.dispose(this.id)
+      var a = this.getOption2()
+      this.$nextTick(() => {
+          this.initChart(this.id, a)
+        })
+    },
+  getOption2(){
+    this.changeColor = false
+    let {backgroundColor,title,legend, xAxis, yAxis, series, grid,toolbox } = this.get2AxisOption('line', '')
+      // console.log(legend, xAxis, yAxis, series, grid)
+      return {
+        backgroundColor,
+        title,
+        tooltip: {
+          trigger: 'axis'
+        },
+        legend,
+        grid: grid,
+        xAxis: xAxis,
+        yAxis: yAxis,
+        series: series,
+        toolbox:toolbox
+      }
+  },
+    getOption(name,relation,timeUnit) {
+      this.form.setting.text.text = name
+      this.form.setting.title1 = relation.xStr
+      this.form.setting.title2 = relation.yStr+'/万元'
+      // var chartDom1 = document.getElementById(this.domId) 
+      // var myChart1 = this.$echarts.init(chartDom1)
+      var timeList = []
+      var productNameList = []
+      var data = []
+      data.push(
+        {
+          name:'',
+          type:'line',
+          connectNulls:true,
+          data:[]
+        }
+      )
+      productNameList=['']
+      timeList = this.chartData.map(item=>{
+        return item[relation.x]
+      })
+      data[0].data = this.chartData.map(item=>{
+        return item[relation.y]
+      })
+
+
+      // this.chartData.forEach(item => {
+      //   productNameList.push(item.productName)
+      //   data.push({
+      //     name:item.productName,
+      //     type:'line',
+      //     connectNulls:true,
+      //     saleVOS:item.saleVOS,
+      //     data:[]
+      //   })
+      //   item.saleVOS.forEach(item1=>{
+      //     var index = timeList.findIndex(i=>{
+      //       return item1[relation.x] == i
+      //     })
+      //     if(index == -1){
+      //       timeList.push(item1[relation.x])
+      //     }
+      //   })
+      // });
+      // timeList = timeList.sort((a,b)=>{
+      //     if(timeUnit == 0){
+      //       return Date.parse(a.replace(/-/g, "/")) - Date.parse(b.replace(/-/g, "/"))
+      //     }else if(timeUnit==1){
+      //       return  Date.parse(a.match(/(\d{1,3})+(?:\.\d+)?/g).join('/'))-Date.parse(b.match(/(\d{1,3})+(?:\.\d+)?/g).join('/'))
+      //     }else{
+      //       return Date.parse(a.substring(0,a.length-1))-Date.parse(b.substring(0,b.length-1))
+      //     }
+      //   }),
+      // data.forEach(item=>{
+      //   if(item.saleVOS && item.saleVOS.length>0){
+      //     item.saleVOS.forEach(item2=>{
+      //       var index = timeList.findIndex(i=>{
+      //         return item2[relation.x] == i
+      //       })
+      //       item.data[index] = item2[relation.y]
+      //     })
+      //   }
+        
+      // });
+      
+      this.selected = {
+        x:timeList,
+        y:productNameList,
+        data:data
+      }
+      if(this.changeColor){
+        this.setColor()
+      }
+      
+      console.log(this.selected)
+      let {backgroundColor, title, legend, xAxis, yAxis, series, grid,toolbox } = this.get2AxisOption('line', '')
+      // console.log(legend, xAxis, yAxis, series, grid)
+      return {
+        backgroundColor,
+        title,
+        tooltip: {
+          trigger: 'axis'
+        },
+        legend,
+        grid: grid,
+        xAxis: xAxis,
+        yAxis: yAxis,
+        series: series,
+        toolbox:toolbox,
+       
+      }
+   
+      
+      // var option = {
+      //   title: {
+      //     text: name,
+      //     bottom:0,
+      //     left:'center'
+      //   },
+      //   tooltip: {
+      //     trigger: 'axis'
+      //   },
+      //   legend: {
+      //     data: productNameList.length>1?productNameList:[],
+      //   },
+      //   grid: {
+      //     left: '3%',
+      //     right: '4%',
+      //     bottom: '40',
+      //     containLabel: true
+      //   },
+      //   toolbox: {
+      //     feature: {
+      //       saveAsImage: {}
+      //     }
+      //   },
+      //   xAxis: {
+      //     type: 'category',
+      //     data: timeList,
+      //     name: '时间',
+      //     nameLocation: "end"
+      //   },
+      //   yAxis: {
+      //     type: 'value',
+      //     name: '销售额/万元',
+      //     nameLocation: "end"
+      //   },
+      //   series: data
+      // };
+      // myChart1.clear();
+      // myChart1.setOption(option);
+    }
+  }
+}
+</script>
+<style lang="scss" scoped>
+  .text{
+    display: none;
+    font-size: 12px;
+    color: #4099c6;
+    position: absolute;
+    top: 10px;
+    left: -30px;
+    z-index: 999;
+    width: 200px;
+  }
+  .set{
+    position: relative;
+    // margin-bottom:-200%;
+    z-index: 999;
+    // padding: 10px 0;
+  }
+  .set2{
+    margin-right:6px;
+    position: relative;
+    z-index: 999;
+  }
+  .set2:hover .text{
+    left:0;
+    display: block;
+  }
+  .set:hover .text{
+    display: block;
+  }
+</style>

+ 7 - 0
src/views/product/components/echarts/components/echarts.js

@@ -0,0 +1,7 @@
+import MultipleLine from "./MultipleLine";
+
+export const commonMethods = {
+    components:{
+        MultipleLine
+    }
+}

+ 227 - 0
src/views/product/components/echarts/components/echarts.vue

@@ -0,0 +1,227 @@
+<template>
+    <div style="height:100%;padding:20px">
+        <div>
+            <div style="display:flex;justify-content: space-between;">
+                <el-form :inline="true">
+                <el-form-item label="时间">
+                    <el-select v-model="queryParams.timeUnit" @change="changeEcharts()"  placeholder="请选择时间">
+                        <el-option
+                            v-for="item in timeList"
+                            :key="item.value"
+                            :label="item.label"
+                            :value="item.value">
+                        </el-option>
+                    </el-select>
+                </el-form-item>
+                <el-form-item label="地区">
+                    <el-select v-model="queryParams.area" @change="changeEcharts()" clearable  placeholder="请选择地区">
+                        <el-option
+                            v-for="item in areaList"
+                            :key="item"
+                            :label="item"
+                            :value="item">
+                        </el-option>
+                    </el-select>
+                </el-form-item>
+                <el-form-item label="公司" v-if="type == 1">
+                    <el-select v-model="queryParams.companyName" @change="changeEcharts()" clearable  placeholder="请选择公司">
+                        <el-option
+                            v-for="item in companyList"
+                            :key="item"
+                            :label="item"
+                            :value="item">
+                        </el-option>
+                    </el-select>
+                </el-form-item>
+                <el-form-item label="趋势图">
+                    <el-select v-model="queryParams.relation" @change="changeRelation()"  placeholder="请选择公司">
+                        <el-option
+                            v-for="item in relationList"
+                            :key="item.value"
+                            :label="item.label.xStr+'与'+item.label.yStr"
+                            :value="item.value">
+                        </el-option>
+                    </el-select>
+                </el-form-item>
+            </el-form>
+            <!-- <div>
+                <el-button type="primary" @click="setting">配置</el-button>
+            </div> -->
+            </div>
+
+            
+        </div>
+        <div>
+            <component v-if="type == 1" :is="component" :ref="components" :domId="components" :NewForm="form"  @form="getForm"></component>
+            <component :is='component' :ref="component"  :NewForm="form" @form="getForm"></component>  
+        </div>  
+        <el-drawer
+            title="图表配置"
+            :visible.sync="drawer"
+            direction="rtl"
+            :before-close="handleClose"
+            size="500px">
+            <div style="width:500px">
+               <Style :form="form"></Style> 
+            </div>
+            
+        </el-drawer>
+    </div>
+</template>
+<script>
+import { commonMethods } from './echarts'
+import Style from '@/views/components/setting/style.vue'
+export default {
+    mixins:[commonMethods],
+    props:['id','type','name'],
+    components:{
+        Style
+    },
+    data() {
+        return {
+            form:{},
+            drawer:false,
+            height:'400px',
+            ChartData:[],
+            component:'MultipleLine',
+            components:'MultipleLineAll',
+            queryParams:{
+                timeUnit:0,
+                relation:1
+            },
+            relationList:[
+                {
+                    label:{
+                        x:'marketDate',
+                        xStr:'时间',
+                        y:'saleMoneyTotal',
+                        yStr:'销售额'
+                    },
+                    value:1
+                },
+                {
+                    label:{
+                        x:'marketDate',
+                        xStr:'时间',
+                        y:'customLicenseMoney',
+                        yStr:'自定义许可费'
+                    },
+                    value:2
+                },
+            ],
+            timeList:[
+                {
+                    value:0,
+                    groupValue:'groupMonthTime',
+                    label:'月'
+                },
+                {
+                    value:1,
+                    groupValue:'groupSeasonTime',
+                    label:'季度'
+                },
+                {
+                    value:2,
+                    groupValue:'groupYearTime',
+                    label:'年'
+                },
+            ],
+            areaList:[],
+            companyList:[],
+        }
+    },
+    watch:{
+        id(val){
+            this.init()
+        },
+        type(val){},
+        name(){}
+    },
+    mounted() {
+        // this.handleAdd()
+        this.init()
+    },
+    methods: {
+        getForm(val){
+            this.form = val
+            this.drawer = true
+        },
+        handleClose(){
+            this.form = JSON.parse(JSON.stringify(this.form))
+            this.drawer = false
+        },
+        setting(){
+            this.drawer = true
+        },
+        changeRelation(){
+            var relation = this.relationList.find(i=>{
+                return i.value == this.queryParams.relation
+            })
+            var name = this.name + (this.type==1?'产品类别':'产品') + '趋势图'
+           if(this.type==1){
+                this.$refs[this.components].open(this.chartData.filter(item=>{
+                    return !item.productId
+                }),'趋势总图',relation.label,this.queryParams.timeUnit)
+                this.$refs[this.component].open(this.chartData.filter(item=>{
+                    return item.productId!=0
+                }),name,relation.label,this.queryParams.timeUnit)
+            }else{
+                this.$refs[this.component].open(this.chartData,name,relation.label,this.queryParams.timeUnit)
+            }
+        },
+        async changeEcharts(){
+           var chartData =await this.getData()
+           this.chartData = chartData?chartData:[]
+          this.changeRelation()
+            
+           
+        },
+       async init(){
+            const [chartData,companyAndArea] = await Promise.allSettled([this.getData(),this.getAllCompanyAndArea()])
+            this.chartData = chartData.status =='fulfilled'?chartData.value:[]
+            this.areaList= companyAndArea.status =='fulfilled'?companyAndArea.value.saleAreas:[]
+            this.companyList= companyAndArea.status =='fulfilled'?companyAndArea.value.companyNames:[]
+            this.changeRelation()
+            
+            
+        },
+       async getData(){
+           var params= {
+                saleArea:this.queryParams.area,
+                companyName:this.queryParams.companyName,
+           }
+           if(this.type == 1){
+                params.categoryId = this.id
+           }else{
+                params.productId = this.id
+           }
+           var queryParams = {
+                size:99999,
+                current:1,
+                searchQuery:this.$commonJS.objectToString(params),
+                groupBy:this.timeList.find(item=>{
+                    return item.value == this.queryParams.timeUnit
+                }).groupValue,
+                orderDTOList:[
+                    {
+                        "orderBy": "saleTime", 
+                        "orderType": 0 
+                    }
+                ]
+           }
+           return await this.$api.groupProductMarketData(queryParams).then( async response=>await response.data.data.values)
+        },
+        //获取所有公司和地区
+        getAllCompanyAndArea(){
+            var params = {}
+            if(this.type == 1){
+                params.categoryId = this.id
+            }else{
+                params.productId = this.id
+            }
+            return this.$api.getAllCompanyAndArea(params).then(response=> response.data)
+        },
+
+    },
+}
+</script>

+ 32 - 0
src/views/product/components/echarts/index.vue

@@ -0,0 +1,32 @@
+<template>
+    <div>
+        <chart :id="id" :type="type" :name="name"></chart>
+    </div>
+</template>
+<script>
+import chart from './components/echarts.vue'
+export default{
+    components:{
+        chart
+    },
+    data() {
+        return {
+            
+        }
+    },
+    computed:{
+        //产品或者产品类别id
+        id(){
+            return this.$route.query.id
+        },
+        //趋势图类型2是产品,1是产品类别
+        type(){
+            return this.$route.query.type
+        },
+        //产品或者产品类别名称
+        name(){
+            return this.$route.query.name
+        }
+    }
+}
+</script>

+ 2 - 4
src/views/product/components/framework/index.vue

@@ -1,7 +1,7 @@
 <template>
 <template>
   <!-- 架构 -->
   <!-- 架构 -->
   <div>
   <div>
-    <viewIndex style="height: 100%;" :row="row" :typesOf="typesOf"></viewIndex>
+    <viewIndex style="height: 100%;" :name="row.name" :id="row.id" :categoryId="row.categoryId" :type="row.type"></viewIndex>
   </div>
   </div>
 </template>
 </template>
 
 
@@ -17,12 +17,10 @@ export default {
     }
     }
   },
   },
   computed: {
   computed: {
+    //type判断是分类架构1还是产品架构2
     row() {
     row() {
       return JSON.parse(this.$route.query.row)
       return JSON.parse(this.$route.query.row)
     },
     },
-    typesOf() {//判断是分类架构1还是产品架构2
-      return this.$route.query.typesOf
-    },
   },
   },
   mounted() {
   mounted() {
     
     

+ 28 - 15
src/views/product/components/framework/viewIndex.vue

@@ -1,11 +1,11 @@
 <template>
 <template>
   <!-- 架构主页面 -->
   <!-- 架构主页面 -->
-  <div class="framework">
+  <div class="framework height_100">
     <el-container>
     <el-container>
       <el-header>
       <el-header>
         <div style="display: flex;justify-content: space-between;align-items:center;width:100%;padding:0 10px;">
         <div style="display: flex;justify-content: space-between;align-items:center;width:100%;padding:0 10px;">
           <div>
           <div>
-            <p>{{ typesOf==1?'产品类别名称:':'产品名称:' }}{{ row.name }}</p>
+            <p>{{ row.type==1?'产品类别名称:':'产品名称:' }}{{ row.name }}</p>
           </div>
           </div>
           <div>
           <div>
             <el-button type="primary" size="small" @click="handleImport">导 入</el-button>
             <el-button type="primary" size="small" @click="handleImport">导 入</el-button>
@@ -17,7 +17,7 @@
           <div style="display:flex;margin-bottom:10px;">
           <div style="display:flex;margin-bottom:10px;">
             <el-input v-model="productName" size="small" placeholder="请输入名称" style="margin-right:10px;"></el-input>
             <el-input v-model="productName" size="small" placeholder="请输入名称" style="margin-right:10px;"></el-input>
             <el-button type="primary" size="small" @click="handleQuery">查询</el-button>
             <el-button type="primary" size="small" @click="handleQuery">查询</el-button>
-            <el-button v-if="typesOf=='1'" type="primary" size="small" @click="handleAppend">新增分类节点</el-button>
+            <el-button v-if="row.type=='1'" type="primary" size="small" @click="handleAppend">新增分类节点</el-button>
             <el-dropdown v-else split-button type="primary" size="small" @click="handleAppend">
             <el-dropdown v-else split-button type="primary" size="small" @click="handleAppend">
               <span>新增分类节点</span>
               <span>新增分类节点</span>
               <el-dropdown-menu slot="dropdown">
               <el-dropdown-menu slot="dropdown">
@@ -69,7 +69,7 @@
               @on-sort="handleSort">
               @on-sort="handleSort">
             </component>
             </component>
           </el-main>
           </el-main>
-          <el-footer>
+          <el-footer class="pagination">
             <el-pagination background layout="total, prev, pager, next, jumper" :current-page.sync="queryParams.current"
             <el-pagination background layout="total, prev, pager, next, jumper" :current-page.sync="queryParams.current"
               :page-size.sync="queryParams.size" @current-change="handleCurrentChange" :total="total">
               :page-size.sync="queryParams.size" @current-change="handleCurrentChange" :total="total">
             </el-pagination>
             </el-pagination>
@@ -80,7 +80,7 @@
 
 
     <classifyNode ref="classifyNode" :treeDataPath="treeDataPath" @isSuccess="handleSuccess"></classifyNode>
     <classifyNode ref="classifyNode" :treeDataPath="treeDataPath" @isSuccess="handleSuccess"></classifyNode>
     <myImageViewer v-if="showImg" :on-close="closeViewer" :src="imgSrc"></myImageViewer>
     <myImageViewer v-if="showImg" :on-close="closeViewer" :src="imgSrc"></myImageViewer>
-    <myNodeCopy v-if="typesOf=='2'" ref="nodeCopy" :treeData="categoryTreeData" source="1" :checkStrictly="true" @checkId="handleChecked"></myNodeCopy>
+    <myNodeCopy v-if="row.type=='2'" ref="nodeCopy" :treeData="categoryTreeData" source="1" :checkStrictly="true" @checkId="handleChecked"></myNodeCopy>
     
     
   </div>
   </div>
 </template> 
 </template> 
@@ -90,8 +90,12 @@ import frameworkTable from './view/table.vue'
 import classifyNode from '../dialog/classifyNode.vue';
 import classifyNode from '../dialog/classifyNode.vue';
 export default {
 export default {
   props: {
   props: {
-    row: Object,
-    typesOf: String,//1是产品类别分类架构,2是产品架构
+    name:{
+      type:String
+    },//产品名称或者是产品类别名称
+    id:{},//产品id或者是产品类别id
+    categoryId:{},//产品类别Id
+    type:{}//类型1是产品类别,2是产品
   },
   },
   components: {
   components: {
     frameworkTable,
     frameworkTable,
@@ -141,8 +145,17 @@ export default {
       nodeId:null,
       nodeId:null,
     }
     }
   },
   },
+  computed:{
+    row(){
+      return {
+        name:this.name,
+        categoryId:this.categoryId,
+        id:this.id,
+        type:this.type
+      }
+    }
+  },
   mounted() {
   mounted() {
-    this.row.typesOf = this.typesOf
     // 请求数据(左侧tree)
     // 请求数据(左侧tree)
     this.getList()
     this.getList()
     // 请求列表的数据(右侧table)
     // 请求列表的数据(右侧table)
@@ -150,7 +163,7 @@ export default {
     // 请求架构路径
     // 请求架构路径
     this.getPath()
     this.getPath()
     // 请求类别的分类架构,用于复制类别架构至产品
     // 请求类别的分类架构,用于复制类别架构至产品
-    if (this.typesOf == '2') {
+    if (this.row.type == '2') {
       this.getCategory()
       this.getCategory()
     }
     }
     
     
@@ -304,7 +317,7 @@ export default {
         fromType: 1,//类型:1产品类别,2产品,3技术分类,4自定义树
         fromType: 1,//类型:1产品类别,2产品,3技术分类,4自定义树
         fromTypeId:this.row.categoryId,//类别id
         fromTypeId:this.row.categoryId,//类别id
         toType: 2,//类型:1产品类别,2产品,3技术分类,4自定义树
         toType: 2,//类型:1产品类别,2产品,3技术分类,4自定义树
-        toTypeId: this.row.id,//产品或类别id
+        toTypeId: this.row.id,//产品id
         toNodeId: this.nodeId,//放到哪一个节点下面
         toNodeId: this.nodeId,//放到哪一个节点下面
         ifCopyChild:val.check,//是否有子节点  
         ifCopyChild:val.check,//是否有子节点  
       }
       }
@@ -336,7 +349,7 @@ export default {
     async getList() {
     async getList() {
       let params = {
       let params = {
         name: this.productName,//事件名称
         name: this.productName,//事件名称
-        type: this.typesOf,//类型:1产品类别,2产品,3技术分类,4自定义树
+        type: this.row.type,//类型:1产品类别,2产品,3技术分类,4自定义树
         typeId: this.row.id,//产品或类别id
         typeId: this.row.id,//产品或类别id
       }
       }
       await this.$api.queryTreeNodeTree(params).then(res => {
       await this.$api.queryTreeNodeTree(params).then(res => {
@@ -353,10 +366,10 @@ export default {
       let arr1 = ['name', 'type', 'typeId', 'parentId']
       let arr1 = ['name', 'type', 'typeId', 'parentId']
       arr1.forEach(item => {
       arr1.forEach(item => {
         let label = ''
         let label = ''
-        if (item == 'name') {//事件名称
+        if (item == 'name') {//产品名称
           label = this.productName
           label = this.productName
         } else if (item == 'type') {
         } else if (item == 'type') {
-          label = this.typesOf
+          label = this.row.type
         } else if (item == 'typeId') {
         } else if (item == 'typeId') {
           label = this.row.id
           label = this.row.id
         } else {
         } else {
@@ -399,7 +412,7 @@ export default {
         ...this.searchOption,//检索条件
         ...this.searchOption,//检索条件
         orderDTOList: this.sort,//排序
         orderDTOList: this.sort,//排序
         // name: this.productName,//事件名称
         // name: this.productName,//事件名称
-        // type: this.typesOf,//类型:1产品类别,2产品,3技术分类,4自定义树
+        // type: this.row.type,//类型:1产品类别,2产品,3技术分类,4自定义树
         // typeId: this.row.id,//产品或类别id
         // typeId: this.row.id,//产品或类别id
       }
       }
       this.$api.queryTable(params).then(res => {
       this.$api.queryTable(params).then(res => {
@@ -416,7 +429,7 @@ export default {
     // 请求架构路径
     // 请求架构路径
     getPath() {
     getPath() {
       let params = {
       let params = {
-        type: this.typesOf,//区分产品架构、自定义树等
+        type: this.row.type,//区分产品架构、自定义树等
         typeId: this.row.id,//产品或类别id
         typeId: this.row.id,//产品或类别id
       }
       }
       this.$api.queryTreePath(params).then(res => {
       this.$api.queryTreePath(params).then(res => {

+ 42 - 10
src/views/product/components/index.vue

@@ -2,7 +2,7 @@
   <div class="height_100">
   <div class="height_100">
     <el-container>
     <el-container>
       <el-header>
       <el-header>
-        <div>
+        <div id="step1">
           <mySearch style="width: 500px" :SearchFields="searchFiled" @search="search" :searchValue="searchOption">
           <mySearch style="width: 500px" :SearchFields="searchFiled" @search="search" :searchValue="searchOption">
           </mySearch>
           </mySearch>
         </div>
         </div>
@@ -14,7 +14,7 @@
               </el-option>
               </el-option>
             </el-select>
             </el-select>
           </div> -->
           </div> -->
-          <div style="margin:0 10px;">
+          <div style="margin:0 10px;" id="step2">
             <el-button type="primary" size="small" @click="handleCommand('0')">新增类别</el-button>
             <el-button type="primary" size="small" @click="handleCommand('0')">新增类别</el-button>
             <!-- <el-dropdown trigger="click" split-button type="primary" size="small" >
             <!-- <el-dropdown trigger="click" split-button type="primary" size="small" >
               <span @click="handleCommand('0')">新增类别</span>
               <span @click="handleCommand('0')">新增类别</span>
@@ -34,7 +34,7 @@
         </div>
         </div>
       </el-header>
       </el-header>
       <el-main>
       <el-main>
-        <div style="height: 100%;">
+        <div style="height: 100%;" v-loading="loading">
           <component :is="componentType" v-bind="$attrs" :tableData="tableData" :queryParams="queryParams" :searchOption="searchOption" :handleMessage="handleMessage"  @options="handleOption" @on-sort="handleSort" @optionsSon="handleOption2" @chooseItem="chooseItem"></component>
           <component :is="componentType" v-bind="$attrs" :tableData="tableData" :queryParams="queryParams" :searchOption="searchOption" :handleMessage="handleMessage"  @options="handleOption" @on-sort="handleSort" @optionsSon="handleOption2" @chooseItem="chooseItem"></component>
         </div>
         </div>
       </el-main>
       </el-main>
@@ -49,6 +49,7 @@
     <addEditCategory ref="addEditCategory" @getMessage="getMessage"></addEditCategory>
     <addEditCategory ref="addEditCategory" @getMessage="getMessage"></addEditCategory>
     <addEditProduct ref="addEditProduct" @getMessage="getMessage2"></addEditProduct>
     <addEditProduct ref="addEditProduct" @getMessage="getMessage2"></addEditProduct>
     <marketing ref="marketing"></marketing>
     <marketing ref="marketing"></marketing>
+    
     <myImageViewer v-if="showImg" :on-close="closeViewer" :src="imgSrc"></myImageViewer>
     <myImageViewer v-if="showImg" :on-close="closeViewer" :src="imgSrc"></myImageViewer>
   </div>
   </div>
 </template>
 </template>
@@ -95,7 +96,7 @@ export default {
       //检索条件
       //检索条件
       searchOption: {
       searchOption: {
         questionName: this.eventName,
         questionName: this.eventName,
-        applicationScenario: this.applicationScenario
+        product_name:localStorage.searchContent
       },
       },
       //分组的值
       //分组的值
       groupingValue: 'noGrouping',
       groupingValue: 'noGrouping',
@@ -122,6 +123,8 @@ export default {
       total: 0,
       total: 0,
       // 产品类别数据
       // 产品类别数据
       tableData:[],
       tableData:[],
+      //加载
+      loading:false,
       //展示图片
       //展示图片
       showImg:false,
       showImg:false,
       //图片地址
       //图片地址
@@ -182,6 +185,7 @@ export default {
           this.$refs.addEditCategory.open(row)
           this.$refs.addEditCategory.open(row)
           break;
           break;
         case '1'://趋势图
         case '1'://趋势图
+          this.showTrend(row,1)
           break;
           break;
         case '2'://预览图片
         case '2'://预览图片
           this.checkImage(row)
           this.checkImage(row)
@@ -211,7 +215,7 @@ export default {
           this.$refs.addEditProduct.open(row)
           this.$refs.addEditProduct.open(row)
           break;
           break;
         case '1'://预览图片
         case '1'://预览图片
-          
+          this.checkImage(row)
           break;
           break;
         case '2'://产品架构
         case '2'://产品架构
           this.toFramework(row,2)
           this.toFramework(row,2)
@@ -219,10 +223,10 @@ export default {
         case '3'://产品的营销数据
         case '3'://产品的营销数据
           this.$refs.marketing.open(row)
           this.$refs.marketing.open(row)
           break;
           break;
-        case '4'://产品的营销数据
-
+        case '4'://产品的营销数据趋势图
+          this.showTrend(row,2)
           break;
           break;
-        case '5'://产品的营销数据
+        case '5'://专利布局可视化
 
 
           break;
           break;
         case '6'://商品化专利
         case '6'://商品化专利
@@ -233,6 +237,23 @@ export default {
           break;
           break;
       }
       }
     },
     },
+    /**
+     * 营销数据趋势图
+     * @param {Object} row 
+     * @param {Number} val 
+     */
+     showTrend(row, val) {//val为数据类型,1为产品类别,2为产品
+      const router = this.$router.resolve({
+        path: '/chartIndex',
+        query: {
+          id: row.id,
+          type: val,
+          name: row.name
+        }
+      })
+      window.open(router.href, '_blank');
+    },
+
      // 进入商品化专利
      // 进入商品化专利
      toCommodity(row) {
      toCommodity(row) {
       let router = this.$router.resolve({
       let router = this.$router.resolve({
@@ -246,11 +267,16 @@ export default {
 
 
      // 进入产品类别分类架构(与产品架构一致)
      // 进入产品类别分类架构(与产品架构一致)
     toFramework(row,val) {
     toFramework(row,val) {
+      var form = {
+        name:row.name,
+        id:row.id,
+        categoryId:row.categoryId,
+        type:val,
+      }
       let router = this.$router.resolve({
       let router = this.$router.resolve({
         path: '/frameworkIndex',
         path: '/frameworkIndex',
         query: {
         query: {
-          row: JSON.stringify(row),
-          typesOf:val,
+          row: JSON.stringify(form),
         }
         }
       })
       })
       window.open(router.href, '_blank')
       window.open(router.href, '_blank')
@@ -325,11 +351,17 @@ export default {
         searchQuery:str,//检索条件
         searchQuery:str,//检索条件
         orderDTOList: this.sort,//排序
         orderDTOList: this.sort,//排序
       }
       }
+      this.loading = true
       this.$api.queryProductCategory(params).then(response=>{
       this.$api.queryProductCategory(params).then(response=>{
         if(response.code == 200){
         if(response.code == 200){
           this.tableData = response.data.data
           this.tableData = response.data.data
           this.total = response.data.total
           this.total = response.data.total
+          this.loading = false
         }
         }
+      }).catch(error=>{
+        this.loading = false
+        this.tableData = []
+        this.total = 0
       })
       })
     },
     },
     //排序
     //排序

+ 207 - 0
src/views/product/components/market/index.vue

@@ -0,0 +1,207 @@
+<template>
+  <div>
+    <el-container>
+      <el-header>
+        <div style="width:100%;display:flex;justify-content:flex-end">
+            <el-button type="primary" size="small" @click="addMarket">新增</el-button>
+        </div>
+      </el-header>
+      <el-main>
+        <el-table :data="tableData" header-row-class-name="custom-table-header" :loading="loading">
+          <el-table-column label="#" width="60" type="index" align="center">
+            <template slot-scope="scope">
+              <span>{{ scope.$index + 1 + (queryParams.current - 1) * queryParams.size }}</span>
+            </template>
+          </el-table-column>
+          <el-table-column label="时间" prop="saleTime" align="center">
+            <template slot-scope="scope">
+              <div>
+                <span>{{ scope.row.saleTime }}</span>
+              </div>
+            </template>
+          </el-table-column>
+          <el-table-column label="地区" prop="saleArea" align="center">
+            <template slot-scope="scope">
+              <div>
+                <span>{{ scope.row.saleArea }}</span>
+              </div>
+            </template>
+          </el-table-column>
+          <el-table-column label="销售量/件" prop="saleCount" align="center">
+            <template slot-scope="scope">
+              <div>
+                <span>{{ scope.row.saleCount }}</span>
+              </div>
+            </template>
+          </el-table-column>
+          <el-table-column label="销售额/万元" prop="saleMoney" align="center">
+            <template slot-scope="scope">
+              <div>
+                <span>{{ scope.row.saleMoney }}</span>
+              </div>
+            </template>
+          </el-table-column>
+          <el-table-column label="许可参考值" prop="reference" align="center">
+            <template slot-scope="scope">
+              <div>
+                <span>{{ licenseRate == 0 || licenseRate
+                    ? (
+                        Number(scope.row.saleMoney) *
+                        Number(licenseRate)
+                      ).toFixed(2)
+                    : ""
+                }}</span>
+              </div>
+            </template>
+          </el-table-column>
+          <el-table-column
+            label="自定义许可费"
+            prop="customLicenseFee"
+            align="center"
+          >
+            <template slot-scope="scope">
+              <div>
+                <span>{{
+                  scope.row.customLicenseRate == 0 ||
+                  scope.row.customLicenseRate
+                    ? (
+                        Number(scope.row.saleMoney) *
+                        Number(scope.row.customLicenseRate)
+                      ).toFixed(2)
+                    : ""
+                }}</span>
+              </div>
+            </template>
+          </el-table-column>
+
+          <el-table-column label="操作" align="center" width="100px">
+            <template slot-scope="scope">
+              <el-button type="text" @click="handleEdit(scope.row)">编辑</el-button>
+              <el-button type="text" @click="handleDelete(scope.row)" style="color: red">删除</el-button>
+            </template>
+          </el-table-column>
+        </el-table>
+      </el-main>
+      <el-footer class="pagination">
+        <el-pagination background layout="total, prev, pager, next, jumper" :current-page.sync="queryParams.current"
+          :page-size.sync="queryParams.size" @current-change="handleCurrentChange" :total="total">
+        </el-pagination>
+      </el-footer>
+    </el-container>
+
+    <addEditMarket ref="addEditMarket" @submit="getSubmitMessage"></addEditMarket>
+  </div>
+</template>
+
+<script>
+import addEditMarket from '../dialog/addEditMarket.vue';
+export default {
+  components: {
+    addEditMarket
+  },
+  props: {
+    id:{},
+    licenseRate:{}
+  },
+  data() {
+    return {
+        //分页信息
+        queryParams:{
+            current:1,
+            size:10
+        },
+        //总数
+        total:0,
+        //排序
+        sort:[
+            {
+                "orderBy": "createTime",
+                "orderType": 1
+            }
+        ],
+        //数据
+        tableData:[],
+        //加载
+        loading:false
+    };
+  },
+  watch: {
+    id(){
+      this.getList()
+    }
+  },
+  computed: {},
+  created() {},
+  mounted() {
+    this.getList()
+  },
+  methods: {
+    getList(){
+        var params = {
+            ...this.queryParams,
+            searchQuery:`productId=${this.id}`,
+            orderDTOList: this.sort
+        }
+        this.loading = true
+        this.$api.queryProductMarketData(params).then(response=>{
+            if(response.code == 200){
+                this.tableData = response.data.data
+                this.total = response.data.total
+                this.loading = false
+            }
+        }).catch(error=>{
+            this.tableData = []
+            this.total = 0
+            this.loading = false
+        })
+    },
+    //分页
+    handleCurrentChange(val){
+        this.queryParams.current = val
+        this.getList()
+    },
+    //新增
+    addMarket(){
+        var form = {
+            productId:this.id,
+            licenseRate:this.licenseRate
+        }
+        this.$refs.addEditMarket.open(form)
+    },
+    //编辑
+    handleEdit(row){
+      var form = {
+        ...row,
+        licenseRate:this.licenseRate
+      }
+      this.$refs.addEditMarket.open(form)
+    },
+    //获取新增编辑的信息
+    getSubmitMessage(val){
+        this.getList()
+    },
+    //删除
+    handleDelete(row){
+        this.deletes([row.id])
+    },
+    deletes(ids){
+        this.$confirm('此操作将删除该产品类别, 是否继续?', '提示', {
+            confirmButtonText: '确定',
+            cancelButtonText: '取消',
+            type: 'warning'
+        }).then(() => {
+            this.$api.deleteProductMarketData(ids).then(response=>{
+                if(response.code == 200){
+                    this.$message.success('删除成功!')
+                    this.getList()
+                }
+            }).catch(error=>{
+                this.$message.success('删除失败!')
+            })
+        })
+    }
+  },
+};
+</script>
+<style lang="scss" scoped>
+</style>

+ 32 - 0
src/views/product/components/mixins/index.js

@@ -0,0 +1,32 @@
+export default {
+    methods: {
+        /**
+         * 
+         * @param {object} row 为当前数据
+         * @param {String} type '2'为产品,'1'为产品类别
+         * @returns 
+         */
+        handleItem(row,type){
+            if(this.isChoose){
+                //type'2'为产品,'3'为产品类别
+                if(type == 1){
+                    type = 3
+                }
+                this.$emit('chooseItem',{row:row,type:type})
+                return false
+            }
+            this.$router.push(
+                {
+                  path: '/productDetails',
+                  query: {
+                    type:type,
+                    id:row.id,
+                    name:row.name,
+                    licenseRate:row.licenseRate,
+                    categoryId:row.categoryId
+                  }
+                }
+            )
+        },
+    },
+}

+ 5 - 10
src/views/product/components/view/categoryTable.vue

@@ -13,7 +13,9 @@
       <el-table-column v-for="item in column" :render-header=" $commonJS.renderHeaderMethods" :key="item.value" :prop="item.value" :label="item.name" align="center" sortable="custom">
       <el-table-column v-for="item in column" :render-header=" $commonJS.renderHeaderMethods" :key="item.value" :prop="item.value" :label="item.name" align="center" sortable="custom">
         <template slot-scope="scope">
         <template slot-scope="scope">
           <div v-if="['name'].includes(item.value)">
           <div v-if="['name'].includes(item.value)">
-            <el-link @click="handleItem(scope.row, item.value)" :type="isChoose?'primary':'default'" v-html="$commonJS.getColumnData(scope.row, item)"></el-link>
+            <el-link @click="handleItem(scope.row, '1')" type="primary">
+              <span  v-html="$commonJS.getColumnData(scope.row, item)"></span>
+            </el-link>
           </div>
           </div>
           <div v-else v-html="$commonJS.getColumnData(scope.row, item)">
           <div v-else v-html="$commonJS.getColumnData(scope.row, item)">
           </div>
           </div>
@@ -48,10 +50,11 @@
 </template>
 </template>
 
 
 <script>
 <script>
+import mixins from '../mixins'
 import { getTableHeight } from '@/views/components/mixins'
 import { getTableHeight } from '@/views/components/mixins'
 import productTable from './productTable.vue'
 import productTable from './productTable.vue'
 export default {
 export default {
-  mixins:[getTableHeight],
+  mixins:[getTableHeight,mixins],
   components: {
   components: {
     productTable,
     productTable,
   },
   },
@@ -113,15 +116,7 @@ export default {
   mounted() {
   mounted() {
   },
   },
   methods: {
   methods: {
-    //查看详情
-    handleItem(row){
-      if(this.isChoose){
-        this.$emit('chooseItem',{row:row,type:'3'})
-        return false
-      }
 
 
-    },
-   
     // 展开行打开或者关闭事件
     // 展开行打开或者关闭事件
     handleExpand(row, rowList) {
     handleExpand(row, rowList) {
       var index = this.expends.findIndex(item=>{
       var index = this.expends.findIndex(item=>{

+ 8 - 12
src/views/product/components/view/productTable.vue

@@ -17,7 +17,9 @@
       <el-table-column v-for="item in column" :render-header=" $commonJS.renderHeaderMethods" :key="item.value" :prop="item.value" :label="item.name" align="center" sortable="custom">
       <el-table-column v-for="item in column" :render-header=" $commonJS.renderHeaderMethods" :key="item.value" :prop="item.value" :label="item.name" align="center" sortable="custom">
         <template slot-scope="scope">
         <template slot-scope="scope">
           <div v-if="['name'].includes(item.value)">
           <div v-if="['name'].includes(item.value)">
-            <el-link @click="handleItem(scope.row, item.value)" :type="isChoose?'primary':'default'" v-html="$commonJS.getColumnData(scope.row, item)"></el-link>
+            <el-link @click="handleItem(scope.row, '2')" type="primary">
+              <span  v-html="$commonJS.getColumnData(scope.row, item)"></span>
+            </el-link>
           </div>
           </div>
           <div v-else v-html="$commonJS.getColumnData(scope.row, item)">
           <div v-else v-html="$commonJS.getColumnData(scope.row, item)">
           </div>
           </div>
@@ -48,10 +50,11 @@
 </template>
 </template>
 
 
 <script>
 <script>
+import mixins from '../mixins'
 import { getTableHeight } from '@/views/components/mixins'
 import { getTableHeight } from '@/views/components/mixins'
 import product from '../mixins/product'
 import product from '../mixins/product'
 export default {
 export default {
-  mixins:[getTableHeight,product],
+  mixins:[getTableHeight,product,mixins],
   props: {
   props: {
     tableData: {
     tableData: {
       type: Array,
       type: Array,
@@ -154,14 +157,7 @@ export default {
     }
     }
   },
   },
   methods: {
   methods: {
-    //查看详情
-    handleItem(row){
-      if(this.isChoose){
-        this.$emit('chooseItem',{row:row,type:'2'})
-        return false
-      }
 
 
-    },
     //更新数据
     //更新数据
     updateData(){
     updateData(){
       if(this.action.type == 1){
       if(this.action.type == 1){
@@ -175,7 +171,7 @@ export default {
           var str = this.$commonJS.objectToString(this.searchOption) 
           var str = this.$commonJS.objectToString(this.searchOption) 
           let params = {
           let params = {
             ...this.queryParams,
             ...this.queryParams,
-            searchQuery:str?' AND ':'' + `category_id=${this.row.id}`,//检索条件
+            searchQuery:(str?(str+' AND '):'') + `category_id=${this.row.id}`,//检索条件
             orderDTOList: this.sort,//排序
             orderDTOList: this.sort,//排序
           }
           }
         this.getList2(params,1)
         this.getList2(params,1)
@@ -238,6 +234,7 @@ export default {
     //获取数据
     //获取数据
     getList() {
     getList() {
       if (!this.row) return;
       if (!this.row) return;
+      if (this.disabled) return;
       if (this.queryParams.current * this.queryParams.size >= this.queryParams.total) {
       if (this.queryParams.current * this.queryParams.size >= this.queryParams.total) {
         this.isMore = true
         this.isMore = true
         this.disabled = true
         this.disabled = true
@@ -246,12 +243,11 @@ export default {
           this.isFlag = false
           this.isFlag = false
         }, 1000)
         }, 1000)
       }
       }
-      if (this.disabled) return;
       this.queryParams.current += 1
       this.queryParams.current += 1
       var str = this.$commonJS.objectToString(this.searchOption) 
       var str = this.$commonJS.objectToString(this.searchOption) 
       let params = {
       let params = {
         ...this.queryParams,
         ...this.queryParams,
-        searchQuery:str?' AND ':'' + `category_id=${this.row.id}`,//检索条件
+        searchQuery:(str?(str+' AND '):'') + `category_id=${this.row.id}`,//检索条件
         orderDTOList: this.sort,//排序
         orderDTOList: this.sort,//排序
       }
       }
       this.isMore = false;
       this.isMore = false;

+ 15 - 31
src/views/project/components/view/card.vue

@@ -1,7 +1,7 @@
 <template>
 <template>
     <div class="height_100">
     <div class="height_100">
       <el-row :gutter="24">
       <el-row :gutter="24">
-        <el-col :span="6" v-for="(item, index) in tableData" class="c">
+        <el-col :span="6" v-for="(item, index) in tableData" style="padding-bottom:10px">
           <myCard shadow="never">
           <myCard shadow="never">
             <div slot="head" class="clearfix">
             <div slot="head" class="clearfix">
               <span># {{ (index + 1) + ((queryParams.current - 1) * queryParams.size) }}</span>
               <span># {{ (index + 1) + ((queryParams.current - 1) * queryParams.size) }}</span>
@@ -10,10 +10,6 @@
                   <i class="el-icon-more el-icon--right"></i>
                   <i class="el-icon-more el-icon--right"></i>
                 </span>
                 </span>
                 <el-dropdown-menu slot="dropdown" class="text-align_center">
                 <el-dropdown-menu slot="dropdown" class="text-align_center">
-                  <el-dropdown-item command="e" >
-                    <span v-if="$permission('/workspace/project/modify') && ($r(item.id,[2])||userinfo.id == item.createBy)">编辑</span>
-                    <span v-else>查看</span>
-                  </el-dropdown-item>
                   <el-dropdown-item command="0" :disabled="!($permission('/workspace/project/patent_import')&& $r(item.id,[1,2]))">
                   <el-dropdown-item command="0" :disabled="!($permission('/workspace/project/patent_import')&& $r(item.id,[1,2]))">
                     <el-dropdown @command="handleCommand($event, item)" placement="right-start">
                     <el-dropdown @command="handleCommand($event, item)" placement="right-start">
                       <span class="el-dropdown-link"> 专利导入 </span>
                       <span class="el-dropdown-link"> 专利导入 </span>
@@ -30,7 +26,7 @@
                 <el-dropdown-item command="7" v-if="$permission('/workspace/event')">事 件</el-dropdown-item>
                 <el-dropdown-item command="7" v-if="$permission('/workspace/event')">事 件</el-dropdown-item>
                 <el-dropdown-item command="8" :disabled="!$permission('/workspace/project/other_accessories')">其它附件</el-dropdown-item>
                 <el-dropdown-item command="8" :disabled="!$permission('/workspace/project/other_accessories')">其它附件</el-dropdown-item>
                 <el-dropdown-item command="9" :disabled="!($permission('/workspace/project/project_share')&&$r(item.id,[2]))">项目分享</el-dropdown-item>
                 <el-dropdown-item command="9" :disabled="!($permission('/workspace/project/project_share')&&$r(item.id,[2]))">项目分享</el-dropdown-item>
-                <el-dropdown-item command="10" divided class="color-red" :disabled="!($permission('/workspace/project/modify') && ($r(item.id,[2])||userinfo.id == item.createBy))">删除</el-dropdown-item>
+                
                 </el-dropdown-menu>
                 </el-dropdown-menu>
               </el-dropdown>
               </el-dropdown>
             </div>
             </div>
@@ -38,32 +34,31 @@
               <el-form-item label="名称">
               <el-form-item label="名称">
                 <div>
                 <div>
                   <el-link :disabled="!$permission('/workspace/folder')" :class="$permission('/workspace/folder')?'':'jinzhi'" type="primary" @click.native="handleClick(item)" :title="item.name">
                   <el-link :disabled="!$permission('/workspace/folder')" :class="$permission('/workspace/folder')?'':'jinzhi'" type="primary" @click.native="handleClick(item)" :title="item.name">
-                    <span v-if="item.innerFile">{{ item.innerFile }} - </span>
+                    <span v-if="item.volumeNumber">{{ item.volumeNumber }} - </span>
                     <span>{{ item.name }}</span>
                     <span>{{ item.name }}</span>
                   </el-link>
                   </el-link>
                 </div>
                 </div>
               </el-form-item>
               </el-form-item>
               <el-form-item label="委托方">
               <el-form-item label="委托方">
-                <div :title="item.clientName">{{ item.clientName }}</div>
+                <myTooltip :content="item.entrustName" >
+                  <div v-html="$commonJS.getColumnData(item, {type:'String',value:'entrustName'})" class="noWrap"></div>
+                </myTooltip>
               </el-form-item>
               </el-form-item>
               <el-form-item label="应用场景">
               <el-form-item label="应用场景">
-                <div :title="item.scenarioName">
-                  <span v-for="name in item.scenarioName">{{ name }} <br> </span>
-                </div>
+                <myTooltip :content="$commonJS.getColumnData(item, {type:'Array',value:'scenarioNames'})">
+                  <div class="noWrap" v-html="$commonJS.getColumnData(item, {type:'Array',value:'scenarioNames'})"></div>
+                </myTooltip>
               </el-form-item>
               </el-form-item>
               <el-form-item label="调查类型">
               <el-form-item label="调查类型">
-                <div :title="item.typeName">
-                  <span v-for="name in item.typeName">{{ name }} <br> </span>
-                </div>
-              </el-form-item>
-              <el-form-item label="技术主题" style="border-bottom: 0">
-                <div  :title="item.technicalTheme">{{ item.technicalTheme }}</div>
+                <myTooltip :content="$commonJS.getColumnData(item, {type:'Array',value:'matterNames'})">
+                  <div class="noWrap" v-html="$commonJS.getColumnData(item, {type:'Array',value:'matterNames'})"></div>
+                </myTooltip>
               </el-form-item>
               </el-form-item>
             </el-form>
             </el-form>
             <div slot="foot">
             <div slot="foot">
               <div class="btn">
               <div class="btn">
-                <i class="el-icon-edit" @click="handleEdit(item)"></i>
-                <i class="el-icon-delete" @click="handleCommand('3', item)"></i>
+                <i class="el-icon-edit" @click="handleCommand('e', item)"></i>
+                <i class="el-icon-delete" @click="handleCommand('10', item)"></i>
               </div>
               </div>
             </div>
             </div>
           </myCard>
           </myCard>
@@ -94,17 +89,6 @@
   </script>
   </script>
   
   
   <style lang="scss">
   <style lang="scss">
-     .jinzhi{
-      cursor: not-allowed;
-      pointer-events:none;
-    }
-    .btn{
-      margin: 0;
-      i{
-        color: var(--color2);
-        font-size: 16px;
-        margin-right:16px
-      }
-    }
+   
   </style>
   </style>
   
   

+ 1 - 1
src/views/project/components/view/table.vue

@@ -169,6 +169,7 @@ export default {
 
 
     getList() {
     getList() {
       if (!this.row) return;
       if (!this.row) return;
+      if (this.disabled) return;
       if (this.params.current * this.params.size >= this.params.total) {
       if (this.params.current * this.params.size >= this.params.total) {
         this.isMore = true
         this.isMore = true
         this.disabled = true
         this.disabled = true
@@ -177,7 +178,6 @@ export default {
           this.isFlag = false
           this.isFlag = false
         }, 1000)
         }, 1000)
       }
       }
-      if (this.disabled) return;
       this.params.current += 1
       this.params.current += 1
       let params = {
       let params = {
         ...this.params,
         ...this.params,

+ 46 - 22
src/views/project/index.vue

@@ -11,14 +11,14 @@
         </el-collapse>
         </el-collapse>
       </div>
       </div>
       <div class="height_100">
       <div class="height_100">
-        <el-container>
+        <el-container v-if="showView">
           <el-header>
           <el-header>
-            <div>
+            <div id="step1">
               <mySearch style="width:500px" :SearchFields="searchFiled" @search="search" :searchValue="searchOption"
               <mySearch style="width:500px" :SearchFields="searchFiled" @search="search" :searchValue="searchOption"
                 :disabled="!$permission('/workspace/project/check')"></mySearch>
                 :disabled="!$permission('/workspace/project/check')"></mySearch>
             </div>
             </div>
             <div style="display:flex;margin-right:10px" v-if="[2].indexOf(isOperate) == -1">
             <div style="display:flex;margin-right:10px" v-if="[2].indexOf(isOperate) == -1">
-              <div>
+              <div id="step2">
                 <span>分组查询:</span>
                 <span>分组查询:</span>
                 <el-select v-model="group" :disabled="!$permission('/workspace/project/check')" clearable size="small"
                 <el-select v-model="group" :disabled="!$permission('/workspace/project/check')" clearable size="small"
                   @change="onChange" style="width:200px">
                   @change="onChange" style="width:200px">
@@ -26,14 +26,14 @@
                   </el-option>
                   </el-option>
                 </el-select>
                 </el-select>
               </div>
               </div>
-              <el-button-group class="margin-left_10">
+              <el-button-group class="margin-left_10" id="step3">
                 <el-button :type="queryShowType === '0' ? 'primary' : ''" @click="onChange2('0')"
                 <el-button :type="queryShowType === '0' ? 'primary' : ''" @click="onChange2('0')"
                   size="small">列表</el-button>
                   size="small">列表</el-button>
                 <el-button :type="queryShowType === '1' ? 'primary' : ''" @click="onChange2('1')"
                 <el-button :type="queryShowType === '1' ? 'primary' : ''" @click="onChange2('1')"
                   size="small">卡片</el-button>
                   size="small">卡片</el-button>
               </el-button-group>
               </el-button-group>
-              <el-dropdown trigger="click" split-button type="primary" size="small">
-                <span @click="handleAdd" v-disabled="!$permission('/workspace/project/add')">新增专利数据库</span>
+              <el-dropdown id="step4" trigger="click" split-button type="primary" size="small">
+                <span @click="handleAdd" v-disabled="false">新增专利数据库</span>
                 <el-dropdown-menu slot="dropdown" class="text-align_center">
                 <el-dropdown-menu slot="dropdown" class="text-align_center">
                   <el-dropdown-item @click.native="handleExport">导出列表</el-dropdown-item>
                   <el-dropdown-item @click.native="handleExport">导出列表</el-dropdown-item>
                   <el-dropdown-item @click.native="handleImport"
                   <el-dropdown-item @click.native="handleImport"
@@ -100,14 +100,20 @@ export default {
 
 
   },
   },
   props: {
   props: {
-    isOperate: ''
+    isOperate: '',
+    matterId:{},
+    scenarioId:{}
   },
   },
   data() {
   data() {
     return {
     return {
       //检索字段
       //检索字段
       searchFiled: [],
       searchFiled: [],
       //检索条件
       //检索条件
-      searchOption: {},
+      searchOption: {
+        scenarioNames:this.scenarioId,
+        matterNames:this.matterId,
+        name:localStorage.searchContent
+      },
       //专利数据库数据总数
       //专利数据库数据总数
       total: 0,
       total: 0,
       //分页信息
       //分页信息
@@ -157,13 +163,26 @@ export default {
         obj.options = a
         obj.options = a
       }
       }
       return this.$store.state.dictMessage.scenario || []
       return this.$store.state.dictMessage.scenario || []
+    },
+    matter() {
+      var a = this.$store.state.dictMessage.matter.map(item => {
+        return {
+          label: item.name,
+          value: item.id
+        }
+      })
+      var obj = this.searchFiled.find(item => { return item.label == '调查类型' })
+      if (obj) {
+        obj.options = a
+      }
+      return this.$store.state.dictMessage.matter || []
     }
     }
   },
   },
   created() { },
   created() { },
   async mounted() {
   async mounted() {
     this.fieldList = await this.$commonJS.getCustomField('patentProject')
     this.fieldList = await this.$commonJS.getCustomField('patentProject')
     //获取检索字段和分组字段
     //获取检索字段和分组字段
-    this.getColumn()
+    await this.getColumn()
     //获取应用场景统计
     //获取应用场景统计
     // if ([2].indexOf(this.isOperate) == -1) {
     // if ([2].indexOf(this.isOperate) == -1) {
     //   this.getScenarioAndTypeTotal();
     //   this.getScenarioAndTypeTotal();
@@ -188,7 +207,7 @@ export default {
     //获取检索字段和分组字段
     //获取检索字段和分组字段
     async getColumn() {
     async getColumn() {
       let params = ['patentProject']
       let params = ['patentProject']
-      await this.$api.getParamsCommon(params).then(res => {
+      await this.$api.getParamsCommon(params).then(async res => {
         if (res.code == 200) {
         if (res.code == 200) {
           // 分组字段
           // 分组字段
           let conditionDTOList = JSON.parse(JSON.stringify(res.data[0].conditionDTOList))
           let conditionDTOList = JSON.parse(JSON.stringify(res.data[0].conditionDTOList))
@@ -202,23 +221,28 @@ export default {
             value: 'value',
             value: 'value',
             type: 'type',
             type: 'type',
           })
           })
+          //为应用场景添加选项
+          var obj = this.searchFiled.find(item=>{return item.label == '应用场景'})
+          if(obj){
+            obj.options = this.commonData.map(item=>{
+              return {
+                label:item.name,
+                value:item.id
+              }
+            })
+          }
           var obj = this.searchFiled.find(item=>{return item.label == '调查类型'})
           var obj = this.searchFiled.find(item=>{return item.label == '调查类型'})
-          if (obj) {
-            this.$api.getMatter([]).then(response => {
-              obj.options = response.data.data.map(item=>{
-                return {
-                  label:item.name,
-                  value:item.id
-                }
-              })
+          if(obj){
+            obj.options = this.matter.map(item=>{
+              return {
+                label:item.name,
+                value:item.id
+              }
             })
             })
           }
           }
         }
         }
       })
       })
-      this.showView = false
-      this.$nextTick(() => {
-        this.showView = true
-      })
+      this.showViews()
     },
     },
     //获取应用场景统计
     //获取应用场景统计
     getScenarioAndTypeTotal() {
     getScenarioAndTypeTotal() {

+ 81 - 21
src/views/report/components/index.vue

@@ -1,37 +1,40 @@
 <template>
 <template>
   <div class="height_100">
   <div class="height_100">
-    <el-container>
+    <el-container v-if="showView">
       <el-header>
       <el-header>
-        <div>
+        <div id="step1">
           <mySearch style="width:500px" :SearchFields="searchFiled" @search="search" :searchValue="searchOption">
           <mySearch style="width:500px" :SearchFields="searchFiled" @search="search" :searchValue="searchOption">
           </mySearch>
           </mySearch>
         </div>
         </div>
         <div style="display:flex;">
         <div style="display:flex;">
-          <div v-if="[2].indexOf(isOperate) == -1" class="margin-right_10">
+          <div id="step2" v-if="[2].indexOf(isOperate) == -1" class="margin-right_10">
             <span>分组查询:</span>
             <span>分组查询:</span>
             <el-select v-model="groupingValue" size="small" @change="changeGrouping" clearable style="width: 120px">
             <el-select v-model="groupingValue" size="small" @change="changeGrouping" clearable style="width: 120px">
               <el-option v-for="item in groupingOption" :key="item.value" :label="item.name" :value="item.value">
               <el-option v-for="item in groupingOption" :key="item.value" :label="item.name" :value="item.value">
               </el-option>
               </el-option>
             </el-select>
             </el-select>
           </div>
           </div>
-          <el-button-group style="display:flex;justify-content:flex-start" v-if="[2].indexOf(isOperate) == -1">
+          <el-button-group id="step3" style="display:flex;justify-content:flex-start" v-if="[2].indexOf(isOperate) == -1">
             <el-button v-for="item in viewTypes" :key="item.component" size="small"
             <el-button v-for="item in viewTypes" :key="item.component" size="small"
               :type="viewType == item.component ? 'primary' : ''" @click="onChange(item.component)">{{ item.name
               :type="viewType == item.component ? 'primary' : ''" @click="onChange(item.component)">{{ item.name
               }}</el-button>
               }}</el-button>
           </el-button-group>
           </el-button-group>
-          <el-dropdown size="small" style="margin-right:20px" v-if="$permission('/pcs/report/add')">
-            <el-button type="primary" size="small">
-              创建报告<i class="el-icon-arrow-down el-icon--right"></i>
-            </el-button>
-            <el-dropdown-menu slot="dropdown" style="margin-top:0px" v-if="dictMessage.REPORT_TYPE">
-              <!-- 遍历按钮 -->
-              <el-dropdown-item
-                v-for="item in dictMessage.REPORT_TYPE.filter(item => !['6'].includes(item.dictChildValue))"
-                :key="item.dictChildLabel" @click.native="handleAnalyse(item.dictChildValue)"
-                v-if="$permission('/pcs/report/add/' + item.permission)">{{ item.dictChildLabel }}</el-dropdown-item>
-            </el-dropdown-menu>
-          </el-dropdown>
-          <el-button type="primary" size="small" @click="showField">显示栏位管理</el-button>
+          <div id="step4" class="margin-left_10">
+            <el-dropdown size="small"  v-if="$permission('/pcs/report/add')">
+              <el-button type="primary" size="small">
+                创建报告<i class="el-icon-arrow-down el-icon--right"></i>
+              </el-button>
+              <el-dropdown-menu slot="dropdown" style="margin-top:0px" v-if="dictMessage.REPORT_TYPE">
+                <!-- 遍历按钮 -->
+                <el-dropdown-item
+                  v-for="item in dictMessage.REPORT_TYPE.filter(item => !['6'].includes(item.dictChildValue))"
+                  :key="item.dictChildLabel" @click.native="handleAnalyse(item.dictChildValue)"
+                  v-if="$permission('/pcs/report/add/' + item.permission)">{{ item.dictChildLabel }}</el-dropdown-item>
+              </el-dropdown-menu>
+            </el-dropdown>
+            <el-button type="primary" class="margin-left_10" size="small" @click="showField">显示栏位管理</el-button>
+          </div>
+          
         </div>
         </div>
       </el-header>
       </el-header>
       <el-main id="patent-list-container" class="main" v-loading="loading">
       <el-main id="patent-list-container" class="main" v-loading="loading">
@@ -69,7 +72,9 @@ export default {
     fields,
     fields,
   },
   },
   props: {
   props: {
-    isOperate: ''
+    isOperate: '',
+    matterId:{},
+    scenarioId:{}
   },
   },
   data() {
   data() {
     return {
     return {
@@ -95,7 +100,9 @@ export default {
 
 
       //检索条件
       //检索条件
       searchOption: {
       searchOption: {
-        name: localStorage.searchContent
+        name: localStorage.searchContent,
+        scenarioNames:this.scenarioId,
+        matterNames:this.matterId
       },
       },
       //分组的值
       //分组的值
       groupingValue: '',
       groupingValue: '',
@@ -127,6 +134,7 @@ export default {
       columnList: [],
       columnList: [],
       // 子组件新增、编辑报告成功发送的字符串
       // 子组件新增、编辑报告成功发送的字符串
       handleMessage: '',
       handleMessage: '',
+      showView:false,
     };
     };
   },
   },
   watch: {},
   watch: {},
@@ -178,6 +186,32 @@ export default {
       }
       }
       return []
       return []
 
 
+    },
+    scene(){
+      var a = this.$store.state.dictMessage.scenario.map(item=>{
+        return {
+          label:item.name,
+          value:item.id
+        }
+      })
+      var obj = this.searchFiled.find(item=>{return item.label == '应用场景'})
+      if(obj){
+        obj.options = a
+      }
+      return this.$store.state.dictMessage.scenario
+    },
+    matter() {
+      var a = this.$store.state.dictMessage.matter.map(item => {
+        return {
+          label: item.name,
+          value: item.id
+        }
+      })
+      var obj = this.searchFiled.find(item => { return item.label == '调查类型' })
+      if (obj) {
+        obj.options = a
+      }
+      return this.$store.state.dictMessage.matter || []
     }
     }
   },
   },
   created() { },
   created() { },
@@ -188,8 +222,16 @@ export default {
     await this.getColumn()
     await this.getColumn()
     //获取报告清单
     //获取报告清单
     this.getList()
     this.getList()
+    this.showViews()
   },
   },
   methods: {
   methods: {
+    //显示视图?
+    showViews() {
+      this.showView = false
+      this.$nextTick(() => {
+        this.showView = true
+      })
+    },
     // 显示栏位管理组件返回数据
     // 显示栏位管理组件返回数据
     getFieldList(val) {
     getFieldList(val) {
       this.columnList = val
       this.columnList = val
@@ -221,11 +263,29 @@ export default {
             let obj = this.searchFiled.find(item2 => {
             let obj = this.searchFiled.find(item2 => {
               return item2.label == item
               return item2.label == item
             })
             })
-            console.log(obj);
             if (obj) {
             if (obj) {
               this.handleSearchArray(obj)
               this.handleSearchArray(obj)
             }
             }
           })
           })
+           //为应用场景添加选项
+           var obj = this.searchFiled.find(item=>{return item.label == '应用场景'})
+          if(obj){
+            obj.options = this.scene.map(item=>{
+              return {
+                label:item.name,
+                value:item.id
+              }
+            })
+          }
+          var obj = this.searchFiled.find(item=>{return item.label == '调查类型'})
+          if(obj){
+            obj.options = this.matter.map(item=>{
+              return {
+                label:item.name,
+                value:item.id
+              }
+            })
+          }
         }
         }
       })
       })
       this.showView = false
       this.showView = false
@@ -301,7 +361,7 @@ export default {
         }
         }
       }).catch(error => {
       }).catch(error => {
         this.dataList = []
         this.dataList = []
-        this.data.total = 0
+        this.total = 0
         this.loading = false
         this.loading = false
         this.$message.error(error.message)
         this.$message.error(error.message)
       })
       })

+ 26 - 12
src/views/report/components/view/card.vue

@@ -1,7 +1,7 @@
 <template>
 <template>
   <div class="eventCard">
   <div class="eventCard">
     <el-row :gutter="12">
     <el-row :gutter="12">
-      <el-col :span="6" v-for="(item, itemIndex) in tableData" :key="itemIndex" style="height:420px">
+      <el-col :span="6" v-for="(item, itemIndex) in tableData" :key="itemIndex" style="padding-bottom:10px">
         <myCard shadow="always">
         <myCard shadow="always">
           <div slot="head">
           <div slot="head">
             <div style="font-size:18px">
             <div style="font-size:18px">
@@ -31,18 +31,32 @@
             </div>
             </div>
           </div>
           </div>
           <div>
           <div>
-            <el-form label-position="left" label-width="110px">
-              <el-form-item label="报告数量:"> {{ item.reportProjectNum || 0  }} </el-form-item>
-              <el-form-item label="专利数据库数量:">{{ item.patentProjectNum || 0 }}</el-form-item>
-              <el-form-item label="应用场景:">
-                <el-tooltip class="item" effect="light" placement="top" :content="item.scenarioName">
-                  <div>{{ item.scenarioName }}</div>
-                </el-tooltip>
+            <el-form label-position="left" label-width="130px">
+              <el-form-item label="标的专利/产品:">
+                <myTooltip :content="item.signPatentNo" >
+                  <div v-html="$commonJS.getColumnData(item, {type:'String',value:'signPatentNo'})" class="noWrap"></div>
+                </myTooltip>
+              </el-form-item>
+              <el-form-item label="相关事件:">
+                <myTooltip :content="$commonJS.getColumnData(item, {type:'Array',value:'eventNames'})">
+                  <div class="noWrap" v-html="$commonJS.getColumnData(item, {type:'Array',value:'eventNames'})"></div>
+                </myTooltip>
+              </el-form-item>
+              <el-form-item label="委托方:">
+                <myTooltip :content="item.entrustName" >
+                  <div v-html="$commonJS.getColumnData(item, {type:'String',value:'entrustName'})" class="noWrap"></div>
+                </myTooltip>
+              </el-form-item>
+              <el-form-item label="报告类型:">
+                <myTooltip :content="item.reportTypeName" >
+                  <div v-html="$commonJS.getColumnData(item, {type:'String',value:'reportTypeName'})" class="noWrap"></div>
+                </myTooltip>
+              </el-form-item>
+              <el-form-item label="报告状态:">
+                <myTooltip :content="item.statusName" >
+                  <div v-html="$commonJS.getColumnData(item, {type:'String',value:'statusName'})" class="noWrap"></div>
+                </myTooltip>
               </el-form-item>
               </el-form-item>
-              <el-form-item label="时间:">{{ item.eventDate || '--' }}</el-form-item>
-              <el-form-item label="描述:">{{ item.description || '--'}}</el-form-item>
-              <el-form-item label="创建人:">{{ item.createName || '--'}}</el-form-item>
-              <el-form-item label="创建时间:">{{ item.createTime || '--'}}</el-form-item>
             </el-form>
             </el-form>
           </div>
           </div>
           <div slot="foot">
           <div slot="foot">

+ 1 - 1
src/views/report/components/view/table.vue

@@ -187,6 +187,7 @@ export default {
 
 
     getList() {
     getList() {
       if (!this.row) return;
       if (!this.row) return;
+      if (this.disabled) return;
       if (this.params.current * this.params.size >= this.params.total) {
       if (this.params.current * this.params.size >= this.params.total) {
         this.isMore = true
         this.isMore = true
         this.disabled = true
         this.disabled = true
@@ -195,7 +196,6 @@ export default {
           this.isFlag = false
           this.isFlag = false
         }, 1000)
         }, 1000)
       }
       }
-      if (this.disabled) return;
       this.params.current += 1
       this.params.current += 1
       let params = {
       let params = {
         ...this.params,
         ...this.params,

+ 5 - 8
src/views/visual/components/drawer/titleDrawer.vue

@@ -5,7 +5,7 @@
               <el-tabs v-model="components">
               <el-tabs v-model="components">
                   <el-tab-pane v-for="item in menu" :key="item.components"  :label="item.name" :name="item.components"></el-tab-pane>
                   <el-tab-pane v-for="item in menu" :key="item.components"  :label="item.name" :name="item.components"></el-tab-pane>
               </el-tabs>
               </el-tabs>
-              <component :is='components' style="height:calc(100% - 50px);" :isOperate='2'></component>
+              <component :is='components' style="height:calc(100% - 50px);" :isOperate='2' :scenarioId="[params.scenarioId]" :matterId="[params.matterId]"></component>
           </div>
           </div>
           
           
       </el-drawer>
       </el-drawer>
@@ -38,6 +38,7 @@
           ],
           ],
           drawer:false,
           drawer:false,
           components:'Project',
           components:'Project',
+          params:{}
       };
       };
     },
     },
     watch: {},
     watch: {},
@@ -45,13 +46,9 @@
     created() {},
     created() {},
     mounted() {},
     mounted() {},
     methods: {
     methods: {
-      open(scenarioName, typeName, question){
-          this.params = {
-              scenarioName:scenarioName, 
-              typeName:typeName, 
-              question:question
-          }
-          if(typeName && typeName.indexOf('专利挖掘')!=-1){
+      open(data){
+          this.params = data
+          if(this.params.isPatentMining){
             this.menu.push(
             this.menu.push(
               {
               {
                   name:'专利挖掘',
                   name:'专利挖掘',

+ 1 - 1
src/views/visual/components/sceneSVG.vue

@@ -72,7 +72,7 @@ export default {
               "orderType": 1
               "orderType": 1
             }
             }
           ],
           ],
-          "groupBy": "scenarioId"
+          "groupBy": "scenarioNames"
         }
         }
       await this.$api.groupEvent(params).then(res => {
       await this.$api.groupEvent(params).then(res => {
         if (res.code == 200) {
         if (res.code == 200) {

+ 153 - 30
src/views/visual/title/index.vue

@@ -4,16 +4,20 @@
        <myCustomSvg  class="myCustomSvg" :title="title" :total="total" :QuestionTotal="QuestionTotal" @on-click="handleClick"></myCustomSvg>
        <myCustomSvg  class="myCustomSvg" :title="title" :total="total" :QuestionTotal="QuestionTotal" @on-click="handleClick"></myCustomSvg>
       <tips class="c-tips" />
       <tips class="c-tips" />
       <titleDrawer ref="titleDrawer" @close="close" />
       <titleDrawer ref="titleDrawer" @close="close" />
+      <eventDrawer ref="eventDrawer" @close="closeDrawer"></eventDrawer>
     </div>
     </div>
 </template>
 </template>
   
   
   <script>
   <script>
   import Tips from '../components/Tips'
   import Tips from '../components/Tips'
   import titleDrawer from "../components/drawer/titleDrawer.vue";
   import titleDrawer from "../components/drawer/titleDrawer.vue";
+  import eventDrawer from "../components/drawer/eventDrawer.vue";
   export default {
   export default {
+    name:'flowPath',
     components: {
     components: {
       Tips,
       Tips,
       titleDrawer,
       titleDrawer,
+      eventDrawer
     },
     },
     data() {
     data() {
       return {
       return {
@@ -23,53 +27,172 @@
         total: {},
         total: {},
         //当前的应用场景
         //当前的应用场景
         title: this.$route.params.title,
         title: this.$route.params.title,
+        queryParams:{
+            "size": 999,
+            "current": 1,
+            "searchQuery": "",
+            "orderDTOList": [
+                {
+                    "orderBy": "createTime",
+                    "orderType": 1
+                }
+            ],
+            "groupBy": "matterNames"
+        },
+        scenarioId:''
       }
       }
+      
+    },
+    computed:{
+      scenario(){
+        return this.$store.state.dictMessage.scenario || []
+      }
+      
     },
     },
     async mounted() {
     async mounted() {
+      if(this.scenario.length>0){
+        var scenario = this.scenario.find(item=>{
+          return item.name == this.title
+        })
+        if(scenario){
+          this.scenarioId = scenario.id
+          this.queryParams.searchQuery = `scenarioNames=[${scenario.id}]`
+        }else{
+          return false
+        }
+      }
+      
       //获取事件数量
       //获取事件数量
-      // await this.getEventNumber()
-      // //获取应用场景对应项目数量
-      // await this.getProjectTypeTotal()
+      await this.getEventNumber()
+      //获取应用场景对应项目数量
+      await this.init()
     },
     },
     methods: {
     methods: {
+      openEventDrawer(title){
+        this.$refs.eventDrawer.open(title, [this.scenarioId])
+      },
+      closeDrawer(){
+        this.getEventNumber()
+      },
       //点击节点
       //点击节点
-      handleClick(type) {
+      handleClick({type,isPatentMining}) {
         var question = {
         var question = {
           questionId: this.questionId,
           questionId: this.questionId,
           questionName: this.questionName
           questionName: this.questionName
         }
         }
-        this.$refs.titleDrawer.open(this.title, type, question)
+        var matterId = this.total.find(item=>{
+          return item.name == type
+        }).id
+        var data = {
+          scenarioId:this.scenarioId,
+          matterId:matterId,
+          isPatentMining:isPatentMining
+        }
+        this.$refs.titleDrawer.open(data)
       },
       },
        //获取事件数量
        //获取事件数量
-       async getEventNumber() {
-        await this.$api.queryApplicationScenarioEventNumber().then(response => {
-          if (response.code == 200) {
-            this.QuestionTotal = response.data
+      async getEventNumber() {
+        var params = {
+          "current": 1,
+          "size": 10,
+          "searchQuery": `scenarioNames=[${this.scenarioId}]`,
+          "orderDTOList": [
+            {
+              "orderBy": "createTime",
+              "orderType": 1
+            }
+          ],
+          "groupBy": "scenarioNames"
+        }
+      await this.$api.groupEvent(params).then(res => {
+        if (res.code == 200) {
+          if(res.data.data.values.length>0){
+            this.QuestionTotal=res.data.data.values
+          }else{
+            this.QuestionTotal=[
+              {
+                name:this.title,
+                value:this.scenarioId,
+                count:0
+              }
+            ]
           }
           }
-        })
+          
+        }
+      }).catch(err => {
+        this.QuestionTotal = [
+          {
+            name:this.title,
+            value:this.scenarioId,
+            count:0
+          }
+        ]
+      })
+        // await this.$api.queryApplicationScenarioEventNumber().then(response => {
+        //   if (response.code == 200) {
+        //     this.QuestionTotal = response.data
+        //   }
+        // })
       },
       },
       //获取应用场景下流程节点对应项目数量
       //获取应用场景下流程节点对应项目数量
-      async getProjectTypeTotal() {
-        this.show = true
-        if (this.questionName) {
-          var params = {
-            applicationScenario: this.QuestionTotal.find(item => { return item.applicationScenarioName == this.title }).applicationScenarioValue,
-            eventId: this.questionId
-          }
-          await this.$api.queryInvestigationTypeProjectNumber(params).then(response => {
-            if (response.code == 200) {
-              var total = {}
-              response.data.map(item => {
-                total[item.investigationTypeName] = item.projectNumber
-              })
-              this.total = total
-            }
+      async init() {
+        var matter = []
+        await this.$api.getMatter([this.scenarioId]).then(response => {
+          matter = response.data.data
+        })
+        const [ProjectTotal,ReportTotal,PatentMiningTotal] = await Promise.allSettled([this.getProjectTotal(),this.getReportTotal(),this.getPatentMiningTotal()])
+        var projectTotal = ProjectTotal.status =='fulfilled'?ProjectTotal.value:[]
+        var reportTotal = ReportTotal.status =='fulfilled'?ReportTotal.value:[]
+        var patentMiningTotal = PatentMiningTotal.status =='fulfilled'?PatentMiningTotal.value:[]
+        for(var i = 0;i<matter.length;i++){
+          let total = {}
+          let project = projectTotal.find(item=>{
+            return item.value == matter[i].id
           })
           })
-          return false
+          total.projectCount = project?project.count:0
+          let report = reportTotal.find(item=>{
+            return item.value == matter[i].id
+          })
+          total.reportCount = report?report.count:0
+          let patentMining = patentMiningTotal.find(item=>{
+            return item.value == matter[i].id
+          })
+          total.patentMiningCount = patentMining?patentMining.count:0
+          matter[i].total = total
         }
         }
-        await this.$api.getProjectTypeTotal({ scenario: this.title }).then(response => {
-          this.total = response.data
-        })
+        this.total = matter
+        // this.show = true
+        // if (this.questionName) {
+        //   var params = {
+        //     applicationScenario: this.QuestionTotal.find(item => { return item.applicationScenarioName == this.title }).applicationScenarioValue,
+        //     eventId: this.questionId
+        //   }
+        //   await this.$api.queryInvestigationTypeProjectNumber(params).then(response => {
+        //     if (response.code == 200) {
+        //       var total = {}
+        //       response.data.map(item => {
+        //         total[item.investigationTypeName] = item.projectNumber
+        //       })
+        //       this.total = total
+        //     }
+        //   })
+        //   return false
+        // }
+        // await this.$api.getProjectTypeTotal({ scenario: this.title }).then(response => {
+        //   this.total = response.data
+        // })
+      },
+      //获取每个调查类型的数据库数量
+      async getProjectTotal(){
+        return await this.$api.groupPatentProject(this.queryParams).then( async response=>await response.data.data.values)
+      },
+      //获取每个调查类型的报告数量
+      async getReportTotal(){
+        return await this.$api.groupReportProject(this.queryParams).then( async response=>await response.data.data.values)
+      },
+      //获取每个调查类型的挖掘数量
+      async getPatentMiningTotal(){
+        return await this.$api.groupPatentDigProject(this.queryParams).then( async response=>await response.data.data.values)
       },
       },
       //关闭抽屉弹窗回调
       //关闭抽屉弹窗回调
       close() { },
       close() { },
@@ -114,7 +237,7 @@
       
       
       position: absolute;
       position: absolute;
       left: 0; 
       left: 0; 
-    //   top: 50px;
+      // top: 50px;
       bottom:0;
       bottom:0;
       right:0;
       right:0;
       margin:auto;
       margin:auto;