zhoupeng 1 an în urmă
părinte
comite
58fc4abc03

+ 94 - 0
chuanyi_client/package-lock.json

@@ -9,6 +9,7 @@
       "version": "1.0.0",
       "hasInstallScript": true,
       "dependencies": {
+        "@femessage/element-ui": "^2.22.0",
         "axios": "^0.27.2",
         "core-js": "^3.26.1",
         "cron-parser": "^4.7.1",
@@ -512,6 +513,28 @@
         "lodash.uniq": "^4.5.0"
       }
     },
+    "node_modules/@femessage/element-ui": {
+      "version": "2.22.0",
+      "resolved": "https://registry.npmmirror.com/@femessage/element-ui/-/element-ui-2.22.0.tgz",
+      "integrity": "sha512-+xzm5af44TCIfvyPBSk2BpZ9yFDlZkJm5TWT83U3vZZ52z0pET4TcesDEKsAjcu2TbRL6VX/1UbjSHUJQU8URQ==",
+      "dependencies": {
+        "async-validator": "~1.8.1",
+        "babel-helper-vue-jsx-merge-props": "^2.0.0",
+        "classnames": "^2.2.6",
+        "deepmerge": "^1.2.0",
+        "lodash.isequal": "^4.5.0",
+        "normalize-wheel": "^1.0.1",
+        "omit.js": "^1.0.2",
+        "raf": "^3.4.1",
+        "resize-observer-polyfill": "^1.5.0",
+        "shallowequal": "^1.1.0",
+        "throttle-debounce": "^1.0.1",
+        "vue-virtual-scroll-list": "^2.3.1"
+      },
+      "peerDependencies": {
+        "vue": "^2.5.17"
+      }
+    },
     "node_modules/@gar/promisify": {
       "version": "1.1.3",
       "resolved": "https://registry.npmmirror.com/@gar/promisify/-/promisify-1.1.3.tgz",
@@ -4038,6 +4061,11 @@
         "node": ">=0.10.0"
       }
     },
+    "node_modules/classnames": {
+      "version": "2.5.1",
+      "resolved": "https://registry.npmmirror.com/classnames/-/classnames-2.5.1.tgz",
+      "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow=="
+    },
     "node_modules/clean-css": {
       "version": "5.3.1",
       "resolved": "https://registry.npmmirror.com/clean-css/-/clean-css-5.3.1.tgz",
@@ -10363,6 +10391,14 @@
       "resolved": "https://registry.npmmirror.com/omggif/-/omggif-1.0.10.tgz",
       "integrity": "sha512-LMJTtvgc/nugXj0Vcrrs68Mn2D1r0zf630VNtqtpI1FEO7e+O9FP4gqs9AcnBaSEeoHIPm28u6qgPR0oyEpGSw=="
     },
+    "node_modules/omit.js": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmmirror.com/omit.js/-/omit.js-1.0.2.tgz",
+      "integrity": "sha512-/QPc6G2NS+8d4L/cQhbk6Yit1WTB6Us2g84A7A/1+w9d/eRGHyEqC5kkQtHVoHZ5NFWGG7tUGgrhVZwgZanKrQ==",
+      "dependencies": {
+        "babel-runtime": "^6.23.0"
+      }
+    },
     "node_modules/on-finished": {
       "version": "2.4.1",
       "resolved": "https://registry.npmmirror.com/on-finished/-/on-finished-2.4.1.tgz",
@@ -11986,6 +12022,14 @@
       "resolved": "https://registry.npmmirror.com/queue-microtask/-/queue-microtask-1.2.3.tgz",
       "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="
     },
+    "node_modules/raf": {
+      "version": "3.4.1",
+      "resolved": "https://registry.npmmirror.com/raf/-/raf-3.4.1.tgz",
+      "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==",
+      "dependencies": {
+        "performance-now": "^2.1.0"
+      }
+    },
     "node_modules/randombytes": {
       "version": "2.1.0",
       "resolved": "https://registry.npmmirror.com/randombytes/-/randombytes-2.1.0.tgz",
@@ -12914,6 +12958,11 @@
         "node": ">=8"
       }
     },
+    "node_modules/shallowequal": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmmirror.com/shallowequal/-/shallowequal-1.1.0.tgz",
+      "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ=="
+    },
     "node_modules/shebang-command": {
       "version": "1.2.0",
       "resolved": "https://registry.npmmirror.com/shebang-command/-/shebang-command-1.2.0.tgz",
@@ -18133,6 +18182,25 @@
         "lodash.uniq": "^4.5.0"
       }
     },
+    "@femessage/element-ui": {
+      "version": "2.22.0",
+      "resolved": "https://registry.npmmirror.com/@femessage/element-ui/-/element-ui-2.22.0.tgz",
+      "integrity": "sha512-+xzm5af44TCIfvyPBSk2BpZ9yFDlZkJm5TWT83U3vZZ52z0pET4TcesDEKsAjcu2TbRL6VX/1UbjSHUJQU8URQ==",
+      "requires": {
+        "async-validator": "~1.8.1",
+        "babel-helper-vue-jsx-merge-props": "^2.0.0",
+        "classnames": "^2.2.6",
+        "deepmerge": "^1.2.0",
+        "lodash.isequal": "^4.5.0",
+        "normalize-wheel": "^1.0.1",
+        "omit.js": "^1.0.2",
+        "raf": "^3.4.1",
+        "resize-observer-polyfill": "^1.5.0",
+        "shallowequal": "^1.1.0",
+        "throttle-debounce": "^1.0.1",
+        "vue-virtual-scroll-list": "^2.3.1"
+      }
+    },
     "@gar/promisify": {
       "version": "1.1.3",
       "resolved": "https://registry.npmmirror.com/@gar/promisify/-/promisify-1.1.3.tgz",
@@ -21100,6 +21168,11 @@
         }
       }
     },
+    "classnames": {
+      "version": "2.5.1",
+      "resolved": "https://registry.npmmirror.com/classnames/-/classnames-2.5.1.tgz",
+      "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow=="
+    },
     "clean-css": {
       "version": "5.3.1",
       "resolved": "https://registry.npmmirror.com/clean-css/-/clean-css-5.3.1.tgz",
@@ -26235,6 +26308,14 @@
       "resolved": "https://registry.npmmirror.com/omggif/-/omggif-1.0.10.tgz",
       "integrity": "sha512-LMJTtvgc/nugXj0Vcrrs68Mn2D1r0zf630VNtqtpI1FEO7e+O9FP4gqs9AcnBaSEeoHIPm28u6qgPR0oyEpGSw=="
     },
+    "omit.js": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmmirror.com/omit.js/-/omit.js-1.0.2.tgz",
+      "integrity": "sha512-/QPc6G2NS+8d4L/cQhbk6Yit1WTB6Us2g84A7A/1+w9d/eRGHyEqC5kkQtHVoHZ5NFWGG7tUGgrhVZwgZanKrQ==",
+      "requires": {
+        "babel-runtime": "^6.23.0"
+      }
+    },
     "on-finished": {
       "version": "2.4.1",
       "resolved": "https://registry.npmmirror.com/on-finished/-/on-finished-2.4.1.tgz",
@@ -27480,6 +27561,14 @@
       "resolved": "https://registry.npmmirror.com/queue-microtask/-/queue-microtask-1.2.3.tgz",
       "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="
     },
+    "raf": {
+      "version": "3.4.1",
+      "resolved": "https://registry.npmmirror.com/raf/-/raf-3.4.1.tgz",
+      "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==",
+      "requires": {
+        "performance-now": "^2.1.0"
+      }
+    },
     "randombytes": {
       "version": "2.1.0",
       "resolved": "https://registry.npmmirror.com/randombytes/-/randombytes-2.1.0.tgz",
@@ -28238,6 +28327,11 @@
         "kind-of": "^6.0.2"
       }
     },
+    "shallowequal": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmmirror.com/shallowequal/-/shallowequal-1.1.0.tgz",
+      "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ=="
+    },
     "shebang-command": {
       "version": "1.2.0",
       "resolved": "https://registry.npmmirror.com/shebang-command/-/shebang-command-1.2.0.tgz",

+ 1 - 0
chuanyi_client/package.json

@@ -13,6 +13,7 @@
   },
   "main": "background.js",
   "dependencies": {
+    "@femessage/element-ui": "^2.22.0",
     "axios": "^0.27.2",
     "core-js": "^3.26.1",
     "cron-parser": "^4.7.1",

+ 0 - 6
chuanyi_client/src/App.vue

@@ -97,7 +97,6 @@ export default {
   },
   methods: {
     initWebSocket() {
-      console.log('webSocket');
       let _this = this
       if (typeof (WebSocket) === 'undefined') {
         showAlertWin(_this, null, '您使用的环境暂不支持socket服务!')
@@ -123,12 +122,10 @@ export default {
       }
     },
     webSocketOpen(e) {
-      console.log('open', e)
       let _this = this
       let count = 0
       const interval = setInterval(() => {
         count++
-        // console.log('count', count)
         if (_this.webSocket && _this.webSocket.readyState === 1) {
           _this.webSocket.send(getToken())
         } else {
@@ -137,13 +134,10 @@ export default {
       }, 5 * 1000)
     },
     webSocketError(e) {
-      console.log('error', e)
     },
     webSocketMessage(e) {
-      console.log('message', e)
     },
     webSocketClose(e) {
-      console.log('close', e)
       this.webSocket.close()
       this.webSocket = null
     }

+ 2 - 1
chuanyi_client/src/api/datasource.js

@@ -970,13 +970,14 @@ export function stopAutoPrintById(reportTableId) {
 
 export function getDriverItemBySouceId(id) {
     return request({
-        url: '/dataSource/getDriverItemBySouceId?id='+id,
+        url: '/dataSource/getDriverItemBySouceId?id=' + id,
         method: 'get'
     })
 }
 
 export function getCompositeScreen(params) {
     return request({
+        timeout: 60000,
         url: '/dataSource/getCompositeScreen',
         method: 'get',
         params

+ 313 - 388
chuanyi_client/src/components/CustomDialog/DataSourceItem.vue

@@ -1,59 +1,30 @@
 <template>
   <div>
-    <el-dialog
-        :title="dataItemDialogTitle"
-        width="80%"
-        top="10vh"
-        class="cy-custom-dialog"
-        center
-        v-dialog-drag-and-zoom
-        v-if="dataItemDialogVisible"
-        :before-close="itemDialogClose"
-        :visible.sync="dataItemDialogVisible"
-        :close-on-click-modal="false"
-        :append-to-body="true">
+    <el-dialog :title="dataItemDialogTitle" width="80%" top="10vh" class="cy-custom-dialog" center v-dialog-drag-and-zoom
+      v-if="dataItemDialogVisible" :before-close="itemDialogClose" :visible.sync="dataItemDialogVisible"
+      :close-on-click-modal="false" :append-to-body="true">
       <el-form label-width='100px' style="display: flex;">
-          <el-row style="width: 650px;">
-              <el-col :span="12">
-        <el-form-item label='数据源:' style="margin-bottom: 0px; width: 300px;">
-          <el-select v-model="groupBasicForm.dataSourceId" disabled>
-            <el-option
-                v-for="dict in dataSourceList"
-                :key="dict.id"
-                :label="dict.dataSourceName"
-                :value="dict.id"
-            ></el-option>
+        <el-row style="width: 650px;">
+          <el-col :span="12">
+            <el-form-item label='数据源:' style="margin-bottom: 0px; width: 300px;">
+              <el-select v-model="groupBasicForm.dataSourceId" disabled>
+                <el-option v-for="dict in dataSourceList" :key="dict.id" :label="dict.dataSourceName"
+                  :value="dict.id"></el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-select v-model="queryParams.needItemStr" multiple collapse-tags placeholder="请选择">
+            <el-option v-for="item in DriverItemData" :key="item.id" :label="item.itemName" :value="item.itemName">
+            </el-option>
           </el-select>
-        </el-form-item>
-              </el-col>
-                <el-select
-                        v-model="queryParams.needItemStr"
-                        multiple
-                        collapse-tags
-                        placeholder="请选择"
-                >
-                    <el-option
-                            v-for="item in DriverItemData"
-                            :key="item.id"
-                            :label="item.itemName"
-                            :value="item.itemName"
-                    >
-                    </el-option>
-                </el-select>
-                <el-button
-                        type="primary"
-                        size="mini"
-                        style="margin-left: 15px;"
+          <el-button type="primary" size="mini" style="margin-left: 15px;" @click="getCompositeScreen">复合筛选</el-button>
 
-                        @click="query"
-                >复合筛选</el-button>
+          <el-form-item v-if="itemDataStep == 2" label='数据项:' style="margin-bottom: 0px; width: 300px;">
+            <el-input placeholder="请输入数据项名称进行过滤" style="" @input="chooseItemChangeEvent"
+              v-model="filterChooseItemText"></el-input>
+          </el-form-item>
 
-        <el-form-item v-if="itemDataStep == 2" label='数据项:' style="margin-bottom: 0px; width: 300px;">
-          <el-input placeholder="请输入数据项名称进行过滤" style=""
-                    @input="chooseItemChangeEvent" v-model="filterChooseItemText"></el-input>
-        </el-form-item>
-
-          </el-row>
+        </el-row>
       </el-form>
       <div v-if="itemDataStep == 1" style="display: flex; height: calc(100% - 36px); overflow: auto;">
         <!-- 数据项 -->
@@ -62,51 +33,33 @@
           <div class="cy-line" style="padding-bottom: 10px;">
             <div style="height: 35px;">
               <el-input placeholder="输入关键字进行过滤" v-model="filterItemData" size="mini"
-                        prefix-icon="el-icon-search"></el-input>
+                prefix-icon="el-icon-search"></el-input>
             </div>
             <div style="height: calc(100% - 35px); overflow: auto;">
-              <div :style="hasLeavesFlag == 1 ? 'height: 40%; overflow: auto;' : 'height: 100%; overflow: auto;'">
-                  <!--                         :show-checkbox="hasLeavesFlag == 1 ? false : true"-->
-                <el-tree class="cy-item-tree"
-                         ref="itemTree"
-                         :indent="10"
-                         :load="loadGroupDataItemNode"
-                         :props="groupProps"
-                         lazy
-                         node-key="id"
-                         :show-checkbox="true"
-                         :filter-node-method="filterItemEvent"
-                         @node-click="handleItemNodeClick"
-                         :check-on-click-node="true"
-                         :highlight-current="true"
-                         :default-expand-all="itemDataExpandAll">
+              <div :style="'height: 40%; overflow: auto;'">
+                <virtual-tree class="cy-item-tree" ref="itemTree" :data="treeData" :indent="10" node-key="id"
+                  :filter-node-method="filterItemEvent" @node-click="handleItemNodeClick" :check-on-click-node="false"
+                  :show-checkbox="true" :highlight-current="true" :default-expand-all="true">
                   <span class="custom-tree-node" slot-scope="{ node, data }">
-                    <svg-icon v-if="data.isLeaf" icon-class="file-bg"/>
-                    <svg-icon v-else-if="node.expanded" icon-class="folder-open" style="width: 1.2em;"/>
-                    <svg-icon v-else icon-class="folder"/>
+                    <svg-icon v-if="data.isLeaf" icon-class="file-bg" />
+                    <svg-icon v-else-if="node.expanded" icon-class="folder-open" style="width: 1.2em;" />
+                    <svg-icon v-else icon-class="folder" />
                     <span :title='node.label || "-"' style="margin-left: 2px;">{{ node.label }}</span>
                   </span>
-                </el-tree>
+                </virtual-tree>
               </div>
-              <div v-if="hasLeavesFlag == 1" style="height: 60%; overflow: auto;">
+              <div style="height: 60%; overflow: auto;">
                 <el-divider content-position="left" style="margin-bottom: 15px!important;">
                   <i class="el-icon-collection-tag"></i>
                   <span>(共{{ leavesList.length }}项)</span>
                 </el-divider>
-                <el-input placeholder="输入关键字进行过滤"
-                          style="margin-top: -10px;width: calc(100% - 60px);" size="mini"
-                          @input="itemChangeEvent" v-model="filterItemText"></el-input>
-                <el-checkbox v-model="isSelectAllItemData" @change="handleCheckAllChange"
-                             style="margin-left: 5px;">全选
+                <el-input placeholder="输入关键字进行过滤" style="margin-top: -10px;width: calc(100% - 60px);" size="mini"
+                  @input="itemChangeEvent" v-model="filterItemText"></el-input>
+                <el-checkbox v-model="isSelectAllItemData" @change="handleCheckAllChange" style="margin-left: 5px;">全选
                 </el-checkbox>
                 <div class="cy-leaves-div">
-                  <!--                  <el-checkbox-group v-model="leavesChooseList" @change="handleCheckedCitiesChange">-->
-                  <!--                    <el-checkbox v-for="leaves in leavesList" :label="leaves">{{ leaves.itemName }}</el-checkbox>-->
-                  <!--                  </el-checkbox-group>-->
-                  <p-virtual-check ref="pvc"
-                                   :data-sources="leavesList"
-                                   @check-change-all="checkChangeAll"
-                                   @check-change="checkChange"></p-virtual-check>
+                  <p-virtual-check ref="pvc" :data-sources="leavesList" @check-change-all="checkChangeAll"
+                    @check-change="checkChange"></p-virtual-check>
                 </div>
               </div>
             </div>
@@ -146,39 +99,25 @@
               <!--                  <span :title='node.label || data.itemName' style="margin-left: 2px;">{{ node.label || data.itemName }}</span>-->
               <!--                </span>-->
               <!--              </el-tree>-->
-              <p-virtual-check ref="pvcChoose"
-                               :data-sources="chooseItemDataListByTree"
-                               @check-change-all="checkChangeAllChoose"
-                               @check-change="checkChangeChoose"></p-virtual-check>
+              <p-virtual-check ref="pvcChoose" :data-sources="chooseItemDataListByTree"
+                @check-change-all="checkChangeAllChoose" @check-change="checkChangeChoose"></p-virtual-check>
             </div>
           </div>
         </div>
       </div>
       <div v-if="itemDataStep == 2" style="overflow: auto; height: calc(100% - 40px);">
-        <el-button size="mini"
-                   @click="multipleSetting"
-                   style="position: absolute; right: 30px; top: 80px;">批量设置表达式
+        <el-button size="mini" @click="multipleSetting" style="position: absolute; right: 30px; top: 80px;">批量设置表达式
         </el-button>
-        <el-button size="mini"
-                   @click="multipleSettingEventReport"
-                   style="position: absolute; right: 160px; top: 80px; display: none;">批量配置事件驱动
+        <el-button size="mini" @click="multipleSettingEventReport"
+          style="position: absolute; right: 160px; top: 80px; display: none;">批量配置事件驱动
         </el-button>
-        <u-table ref="multipleTable"
-                 row-key="label"
-                 use-virtual
-                 :height="430"
-                 :data="chooseItemDataList"
-                 @selection-change="selectionLineChangeHandle"
-                 @sort-change="sortChange"
-                 :big-data-checkbox="true"
-                 showBodyOverflow="title"
-                 showHeaderOverflow="title"
-                 style="margin-top: 10px;"
-                 border>
-          <u-table-column type="selection" width="55" align="center"/>
-          <u-table-column type="index" label="序号" width="60" fixed align="center"/>
-          <u-table-column label="数据项名称" prop="itemName" sortable="custom" align="center"/>
-          <u-table-column label="四则运算表达式" prop="rule.operationRule" sortable="custom" width="200" align="center"/>
+        <u-table ref="multipleTable" row-key="label" use-virtual :height="430" :data="chooseItemDataList"
+          @selection-change="selectionLineChangeHandle" @sort-change="sortChange" :big-data-checkbox="true"
+          showBodyOverflow="title" showHeaderOverflow="title" style="margin-top: 10px;" border>
+          <u-table-column type="selection" width="55" align="center" />
+          <u-table-column type="index" label="序号" width="60" fixed align="center" />
+          <u-table-column label="数据项名称" prop="itemName" sortable="custom" align="center" />
+          <u-table-column label="四则运算表达式" prop="rule.operationRule" sortable="custom" width="200" align="center" />
           <u-table-column label="操作" width="150" align="center">
             <template slot-scope="scope">
               <el-button size="mini" @click="handleChoose(scope.rowIndex, scope.row)">选择表达式</el-button>
@@ -187,29 +126,17 @@
         </u-table>
       </div>
       <span slot='footer'>
-          <el-button type="primary" v-if="itemDataStep == 1" @click="itemDialogSave1">下一步</el-button>
-          <el-button type="primary" v-if="itemDataStep == 2" @click="itemDialogSave2">确定</el-button>
-          <el-button @click="itemDialogClose">取消</el-button>
+        <el-button type="primary" v-if="itemDataStep == 1" @click="itemDialogSave1">下一步</el-button>
+        <el-button type="primary" v-if="itemDataStep == 2" @click="itemDialogSave2">确定</el-button>
+        <el-button @click="itemDialogClose">取消</el-button>
       </span>
     </el-dialog>
 
-    <el-dialog
-        title="选择表达式"
-        width="500px"
-        top="10vh"
-        center
-        v-dialog-drag
-        v-if="dialogDataModelVisible"
-        :before-close="dialogDataModelClose"
-        :visible.sync="dialogDataModelVisible"
-        :close-on-click-modal="false"
-        :append-to-body="true">
+    <el-dialog title="选择表达式" width="500px" top="10vh" center v-dialog-drag v-if="dialogDataModelVisible"
+      :before-close="dialogDataModelClose" :visible.sync="dialogDataModelVisible" :close-on-click-modal="false"
+      :append-to-body="true">
       <el-select v-model="chooseDataModel" filterable clearable placeholder="请选择表达式" style="width: 100%;">
-        <el-option
-            v-for="(item, index) in this.dataModelList"
-            :key="index"
-            :label="item.title"
-            :value="item.id">
+        <el-option v-for="(item, index) in this.dataModelList" :key="index" :label="item.title" :value="item.id">
         </el-option>
       </el-select>
       <div style="width: 100%; text-align: center; margin-top: 20px;">
@@ -231,11 +158,11 @@ import {
   traverseVisible
 } from "@/utils/cqcy";
 import {
-    getAllDataModel,
-    getAllDataSource, getCompositeScreen, getDriverItemBySouceId,
-    getNextAllItem
+  getAllDataModel, getItemGroupById,
+  getAllDataSource, getCompositeScreen, getDriverItemBySouceId,
+  getNextAllItem
 } from "@/api/datasource";
-import {v4 as uuidv4} from "uuid";
+import { v4 as uuidv4 } from "uuid";
 import PVirtualCheck from "@/components/PVirtualCheck"
 
 export default {
@@ -258,6 +185,8 @@ export default {
       isSelectAllItem: false,
       chooseDataModel: null,
       dataModelList: [],
+      // 树数据
+      treeData: [],
       leavesList: [],
       leavesListF: [],
       leavesChooseList: [],
@@ -276,15 +205,13 @@ export default {
         dataSourceId: null,
         itemList: []
       },
-      // 驱动数据返回类型:0 通用 1 WINCC
-      hasLeavesFlag: 0,
-        DriverItemData: [],
-        queryParams: {
-            id: null,
-            chooseItemStr: "",
-            nextItemStr: "",
-            needItemStr: [],
-        },
+      DriverItemData: [],
+      queryParams: {
+        id: null,
+        chooseItemStr: "",
+        nextItemStr: "",
+        needItemStr: [],
+      },
     }
   },
   props: ['chooseGroup'],
@@ -294,104 +221,153 @@ export default {
     }
   },
   methods: {
-      getDriverItemBySouceId(id) {
-          this.queryParams.id = id;
-          getDriverItemBySouceId(id).then((res) => {
-              console.log(res);
-              if (res.code === 200) {
-                  this.DriverItemData = res.data;
+    getDriverItemBySouceId(id) {
+      this.queryParams.id = id;
+      getDriverItemBySouceId(id).then((res) => {
+        if (res.code === 200) {
+          this.DriverItemData = res.data;
+        }
+      });
+    },
+    getCompositeScreen() {
+      let params = {};
+      params.id = this.queryParams.id
+      params.chooseItemStr = this.queryParams.chooseItemStr
+      params.needItemStr = JSON.stringify(this.queryParams.needItemStr)
+      const treeArr = this.$refs.itemTree.getCheckedNodes();
+      const treeQ = document.getElementsByClassName('el-tree cy-item-tree el-tree--highlight-current')[0]
+        .getElementsByClassName('el-tree-node__content');
+      let seTreeArr = []
+      if (treeArr.length > 0) {
+        for (let i = 0; i < treeQ.length; i++) {
+          const parentClass = treeQ[i].parentElement.classList;
+          if (parentClass.contains('is-current') && !parentClass.contains('is-hidden')) {
+            // 选择的层级
+            let treechild = treeQ[i].nextElementSibling.getElementsByClassName('el-tree-node__content');
+            for (let j = 0; j < treechild.length; j++) {
+              const clz = treechild[j].parentElement.classList;
+              if (clz.contains('is-checked') && !clz.contains('is-hidden')) {
+                seTreeArr.push(treechild[j].textContent)
               }
-          });
-      },
-      query() {
-          this.queryParams.nextItemStr = this.filterItemData;
-
-          let params = this.queryParams;
-          params.needItemStr = JSON.stringify(this.queryParams.needItemStr.length > 0 ? this.queryParams.needItemStr : [])
-          const treeArr = this.$refs.itemTree.getCheckedNodes();
-          const treeQ = document.getElementsByClassName('el-tree cy-item-tree el-tree--highlight-current')[0]
-              .getElementsByClassName('el-tree-node__content');
-          let seTreeArr = []
-          if (treeArr.length > 0) {
-              for (let i = 0; i < treeQ.length; i++) {
-                  const parentClass = treeQ[i].parentElement.classList;
-                  if (parentClass.contains('is-current') && !parentClass.contains('is-hidden')) {
-                      // 选择的层级
-                      let treechild = treeQ[i].nextElementSibling.getElementsByClassName('el-tree-node__content');
-                      for (let j = 0; j < treechild.length; j++) {
-                          const clz = treechild[j].parentElement.classList;
-                          if (clz.contains('is-checked') && !clz.contains('is-hidden')) {
-                              seTreeArr.push(treechild[j].textContent)
-                          }
-                      }
-                      break;
-                  }
+            }
+            break;
+          }
+        }
+      }
+      params.nextItemStr = JSON.stringify(seTreeArr)
+      if (!seTreeArr || seTreeArr.length == 0) {
+        this.$message({
+          message: '节点选择为空',
+          type: 'warning'
+        });
+        return
+      }
+      if (!this.queryParams.needItemStr || this.queryParams.needItemStr.length == 0) {
+        this.$message({
+          message: '复合筛选属性不能为空',
+          type: 'warning'
+        });
+        return
+      }
+      const loading = showLoadingTime(this, "筛选中,请稍候···", 60000);
+      getCompositeScreen(params).then((res) => {
+        if (res.code === 200) {
+          let treeData = this.chooseItemDataListByTree ? this.chooseItemDataListByTree : [];
+          if (res.data && res.data.length > 0) {
+            let lodArr = [];
+            for (let j = 0; j < res.data.length; j++) {
+              lodArr.push(res.data[j].label ? res.data[j].label : res.data[j].itemName);
+            }
+            let status = false;
+            let idArr = {}
+            for (let i = 0; i < treeData.length; i++) {
+              if (lodArr.indexOf(treeData[i].label) !== -1) {
+                idArr[lodArr.indexOf(treeData[i].label)] = '1'
+              }
+            }
+            for (let j = 0; j < res.data.length; j++) {
+              if (!idArr[j]) {
+                treeData.push(res.data[j])
+              } else {
+                status = true;
               }
+            }
+            if (status) {
+              this.$message({
+                message: '请注意,选择的数据项中含有重复的项',
+                type: 'warning'
+              });
+            }
           }
-          params.nextItemStr = JSON.stringify(seTreeArr)
-          getCompositeScreen(params).then((res) => {
-              console.log(this.chooseItemDataListByTree);
-              if (res.code === 200) {
-                  let treeData = this.chooseItemDataListByTree ? this.chooseItemDataListByTree : [];
-                  if (res.data && res.data.length > 0) {
-                      let lodArr = [];
-                      for (let j = 0; j < res.data.length; j++) {
-                          lodArr.push(res.data[j].label ? res.data[j].label : res.data[j].itemName);
-                      }
-                      console.log(lodArr)
-                      let status = false;
-                      let idArr = {}
-                      for (let i = 0; i < treeData.length; i++) {
-                          if (lodArr.indexOf(treeData[i].label) !== -1) {
-                              idArr[lodArr.indexOf(treeData[i].label)] = '1'
-                          }
-                      }
-                      console.log(idArr)
-                      for (let j = 0; j < res.data.length; j++) {
-                          if (!idArr[j]) {
-                              treeData.push(res.data[j])
-                          } else {
-                              status = true;
-                          }
-                      }
-                      console.log(treeData)
-                      if (status) {
-                          this.$message({
-                              message: '请注意,选择的数据项中含有重复的项',
-                              type: 'warning'
-                          });
-                      }
-                  }
 
-
-                  this.handleCheckAllChange(false);
-                  this.$nextTick(() => {
-                      this.chooseItemDataListByTree = treeData;
-                      this.isSelectAllItem = false;
-                      this.isSelectAllItemData = false;
-                      this.leavesChooseList = [];
-                      this.queryParams.needItemStr = [];
-                      this.$refs.itemTree.setCheckedKeys([]);
-                      this.$refs.itemTree.setCheckedNodes([]);
-                      // this.$refs.chooseItemTree.setCheckedNodes([])
-                      console.log(this.chooseItemDataListByTree);
-                  });
-                  if (!res.data || res.data.length === 0) {
-                      this.$message({
-                          message: '没有筛选出符合条件的数据项,请重新筛选',
-                          type: 'warning'
-                      });
-                  }
-              }
+          this.handleCheckAllChange(false);
+          this.$nextTick(() => {
+            this.chooseItemDataListByTree = treeData;
+            this.isSelectAllItem = false;
+            this.isSelectAllItemData = false;
+            this.leavesChooseList = [];
+            this.$refs.itemTree.setCheckedKeys([]);
+            this.$refs.itemTree.setCheckedNodes([]);
+            // this.$refs.chooseItemTree.setCheckedNodes([])
           });
-      },
+          if (!res.data || res.data.length === 0) {
+            this.$message({
+              message: '没有筛选出符合条件的数据项,请重新筛选',
+              type: 'warning'
+            });
+          }
+          loading.close()
+        }
+      }).catch((e) => {
+        loading.close()
+        showAlertWin(this, null, e);
+      });
+    },
     /** 显示弹窗 */
     show() {
       this.groupBasicForm.dataSourceId = this.chooseGroup.dataSourceId
       this.getDataSourceList()
+      const loading = showLoading(this, "加载中,请稍候···");
+      this.isSelectAllItem = false;
+      this.dataLineListSelections = [];
+      this.leavesList = [];
+      this.leavesChooseList = [];
+      this.itemDataStep = 1;
+      this.tempItemList = JSON.parse(JSON.stringify(this.groupBasicForm.itemList))
+      this.getNextAllItem(this.chooseGroup.dataSourceId, null, (data) => {
+        //加载树
+        this.treeData = data.children
+        //加载虚拟列表,叶节点
+        let leaves = data.leaves
+        this.leavesList = leaves
+        this.leavesListF = leaves
+        let arr = [];
+        //将原来的数据项加载到,右侧作为已选择的
+        for (let i = 0; i < this.tempItemList.length; i++) {
+          let temp = {
+            nodeIdentifier: null,
+            dataType: null,
+            label: this.tempItemList[i].itemName,
+            nodeIndex: this.tempItemList[i].nodeIndex,
+            itemName: this.tempItemList[i].itemName,
+            itemReadName: this.tempItemList[i].itemReadName,
+            dataModelId: this.tempItemList[i].dataModelId,
+            value: this.tempItemList[i].itemReadName,
+            checked: false,
+          };
+          arr.push(temp)
+        }
+        this.chooseItemDataListByTree = arr
+        this.dataItemDialogTitle = "选择数据项";
+        this.dataItemDialogVisible = true;
+
+        //获取数据源的驱动数据项信息
+        this.getDriverItemBySouceId(this.chooseGroup.dataSourceId)
+        loading.close();
+      })
     },
     /** 自定义排序 */
-    sortChange({prop, order}) {
+    sortChange({ prop, order }) {
       this.chooseItemDataList.sort(customCompare(prop, order))
     },
     /** 动态搜索事件 */
@@ -511,100 +487,71 @@ export default {
       })
       this.leavesList = filterList
     },
-    /** 懒加载数据组数据项查询 */
-    loadGroupDataItemNode(node, resolve) {
-      if (node.level === 0) {
-          // setTimeout(() => {
-              this.getDataItemByDataSource()
-          // }, 200)
-		// console.log(this.itemDataListByTree)
-          // return resolve(this.itemDataListByTree)
-      }
-      let itemNames = []
-      extractDataItemValues(node, itemNames)
-      let itemName = itemNames.reverse().join('!@')
-      let dataSourceId = this.chooseGroup.dataSourceId
-        this.queryParams.chooseItemStr = itemName;
-      if (node.childNodes && node.childNodes.length > 0) {
-          return;
-      }
-	  
-      getNextAllItem(dataSourceId, itemName).then(res => {
-        if (!res.data) {
-          resolve([])
-          return
-        }
-        let datas = res.data.label
-        let leaves = res.data.leaves
-        let leaveList = []
-        if (leaves && leaves.length > 0) {
-          leaves.forEach((t) => {
-            t.label = t.itemName
-            t.value = t.itemReadName
-            t.checked = false
-            leaveList.push(t)
-          })
-        }
-        this.filterItemText = ''
-        this.leavesList = leaveList
-        this.leavesListF = JSON.parse(JSON.stringify(this.leavesList))
-        console.log(11, this.leavesList)
-        let dataList = []
+    /** 获取树节点的下级信息 */
+    getNextAllItem(dataSourceId, itemName, callback) {
+      getNextAllItem(dataSourceId, itemName).then((res) => {
+        let data = {}
+        this.filterLeavesText = "";
+        let datas = res.data.label;
+        let leaves = res.data.leaves;
+        // 模拟数据
+        let dataList = [];
         if (datas && datas.length > 0) {
           datas.forEach((t) => {
             dataList.push({
-              'dataSourceId': dataSourceId,
-              'label': t.itemName,
-              'leaf': false,
-              'children': []
-            })
-          })
+              dataSourceId: dataSourceId,
+              label: t.itemName,
+              leaf: false,
+              children: [],
+            });
+          });
         }
-          this.getDriverItemBySouceId(dataSourceId);
-        resolve(dataList)
-      }).catch((e) => {
-        resolve([])
-        showAlertWin(this, null, e)
+        let leavesList = [];
+        if (leaves && leaves.length > 0) {
+          leaves.forEach((t) => {
+            t.label = t.itemName;
+            t.value = t.itemReadName;
+            t.checked = false;
+            leavesList.push(t);
+          });
+        }
+        data.children = dataList
+        data.leaves = leavesList
+        callback(data);
       })
     },
     /** 数据项点击事件 */
-    handleItemNodeClick(data, n, target) {
-      let node = this.$refs.itemTree.getNode(n)
+    handleItemNodeClick(d, n, t) {
+      let itemNames = [];
+      extractDataItemValues(n, itemNames);
+      let itemName = itemNames.reverse().join("!@");
+      this.queryParams.chooseItemStr = itemName;
+      const loading = showLoading(this, "加载中,请稍候···");
+      if ((!d.children || d.children.length == 0) && (!d.leaves || d.leaves.length == 0)) {
+        this.getNextAllItem(this.groupBasicForm.dataSourceId, itemName, (data) => {
+          //加载树
+          d.children = data.children
+          let leaves = data.leaves
+          d.leaves = leaves
+          //加载虚拟列表,叶节点
+          this.leavesList = leaves
+          this.leavesListF = leaves
+          loading.close();
+        })
+      } else {
+        if (d.leaves) {
+          let leaves = d.leaves
+          this.leavesList = leaves
+          this.leavesListF = leaves
+        }
+        loading.close();
+      }
+      let node = this.$refs.itemTree.getNode(n);
       if (!node) {
-        this.isSelectAllItemData = false
-        node.loaded = false
-        node.expand()
+        this.isSelectAllItemData = false;
+        node.loaded = false;
+        node.expand();
       }
-      // if (this.hasLeavesFlag !== 1) return
-      // this.isSelectAllItemData = false
-      // const loading = showLoading(this, '加载中,请稍候···')
-      // let itemNames = []
-      // extractDataItemValues(node, itemNames)
-      // let itemName = itemNames.reverse().join('!@')
-      // let dataSourceId = node.data.dataSourceId
-      // getNextAllItem(dataSourceId, itemName).then(res => {
-      //   loading.close()
-      //   let data = res.data
-      //
-      //   let leaves = []
-      //   if (data.leaves && data.leaves.length > 0) {
-      //     data.leaves.forEach((t) => {
-      //       t.label = t.itemName
-      //       t.value = t.itemReadName
-      //       t.checked = false
-      //       leaves.push(t)
-      //     })
-      //   }
-      //   this.filterItemText = ''
-      //   this.leavesList = leaves
-      //   console.log(22, this.leavesList)
-      //   this.leavesListF = JSON.parse(JSON.stringify(this.leavesList))
-      // }).catch((e) => {
-      //   loading.close()
-      //   this.leavesList = []
-      //   this.leavesListF = JSON.parse(JSON.stringify(this.leavesList))
-      //   showAlertWin(this, null, e)
-      // })
     },
     /** 根据数据源选择数据项 */
     getDataItemByDataSource() {
@@ -623,10 +570,10 @@ export default {
       if (this.tempItemList && this.tempItemList.length > 0) {
         this.chooseItemDataListByTree = this.tempItemList
       }
-	  this.$nextTick(() => {
-	    // 区分驱动返回数据类型
-	    this.hasLeavesFlag = 1
-	  })
+      this.$nextTick(() => {
+        // 区分驱动返回数据类型
+        this.hasLeavesFlag = 1
+      })
       // const loading = showLoading(this, '加载中,请稍候···')
       // getNextAllItem(id, null).then(res => {
       //   loading.close()
@@ -679,87 +626,63 @@ export default {
     /** 添加数据项 */
     addCheckNodesBtnEvent() {
       // 根据当前选择节点拼接为:XXXX.XXXX.XXX
-      let chooseChannelNameList = []
-      // WinCC数据项处理
-      if (this.hasLeavesFlag === 1) {
-        if (this.leavesChooseList.length == 0) {
-          showAlertMsgWin(this, null, '请选择数据项!')
-          return
-        }
-        for (let i = 0; i < this.leavesChooseList.length; i++) {
-          let temp = {
-            'id': uuidv4(),
-            'nodeIdentifier': null,
-            'dataType': null,
-            'label': this.leavesChooseList[i].fullPath,
-            'nodeIndex': this.leavesChooseList[i].nodeIndex,
-            'itemName': this.leavesChooseList[i].itemName,
-            'itemReadName': this.leavesChooseList[i].itemReadName,
-            'value': this.leavesChooseList[i].itemReadName,
-            'checked': false
-          }
-          chooseChannelNameList.push(temp)
-        }
-      }
-      // 通用数据项处理
-      else {
-        let checkedNodes = this.$refs.itemTree.getCheckedNodes(false, true)
-        if (checkedNodes.length == 0) {
-          showAlertMsgWin(this, null, '请选择数据项!')
-          return
-        }
-        for (let i in checkedNodes) {
-          let checkedNode = checkedNodes[i]
-          if (!checkedNode.isLeaf) {
-            continue
-          }
-          const nodeId = checkedNode.$treeNodeId;
-          let channelName = this.treeFindPath(this.itemDataListByTree, data => data.$treeNodeId === nodeId, "label")
-          let temp = {
-            'id': uuidv4(),
-            'label': channelName.join('.'),
-            'nodeIdentifier': checkedNode.nodeIdentifier,
-            'nodeIndex': checkedNode.nodeIndex,
-            'dataType': checkedNode.dataType,
-            'itemReadName': checkedNode.itemReadName,
-            'value': checkedNode.itemReadName,
-            'checked': false
-          }
-          chooseChannelNameList.push(temp)
-        }
+      let chooseChannelNameList = [];
+      if (this.leavesChooseList.length == 0) {
+        showAlertMsgWin(this, null, "请选择数据项!");
+        return;
       }
-      if (chooseChannelNameList.length == 0) {
-        showAlertMsgWin(this, null, '请选择子数据项!')
-        return
+      for (let i = 0; i < this.leavesChooseList.length; i++) {
+        let temp = {
+          id: uuidv4(),
+          nodeIdentifier: null,
+          dataType: null,
+          label: this.leavesChooseList[i].fullPath,
+          nodeIndex: this.leavesChooseList[i].nodeIndex,
+          itemName: this.leavesChooseList[i].itemName,
+          itemReadName: this.leavesChooseList[i].itemReadName,
+          value: this.leavesChooseList[i].itemReadName,
+          checked: false,
+        };
+        chooseChannelNameList.push(temp);
       }
       // 去重
-      let arr = JSON.parse(JSON.stringify(this.chooseItemDataListByTree))
+      let arr = JSON.parse(JSON.stringify(this.chooseItemDataListByTree));
       if (arr.length == 0) {
-        arr = chooseChannelNameList
+        arr = chooseChannelNameList;
       } else {
+        let status = false;
         for (let i in chooseChannelNameList) {
-          let flag = false
+          let flag = false;
           for (let j in arr) {
-            let tName = arr[j].label ? arr[j].label : arr[j].itemName
+            let tName = arr[j].label ? arr[j].label : arr[j].itemName;
             if (chooseChannelNameList[i].label == tName) {
-              flag = true
-              break
+              flag = true;
+              if (!status) {
+                status = true;
+              }
+              break;
             }
           }
           if (!flag) {
-            arr.push(chooseChannelNameList[i])
+            arr.push(chooseChannelNameList[i]);
           }
         }
+        if (status) {
+          this.$message({
+            message: '请注意,选择的数据项中含有重复的项',
+            type: 'warning'
+          });
+        }
       }
-      this.handleCheckAllChange(false)
+      this.handleCheckAllChange(false);
       this.$nextTick(() => {
-        this.chooseItemDataListByTree = arr
-        this.leavesChooseList = []
-        this.isSelectAllItem = false
-        this.isSelectAllItemData = false
-        this.$refs.itemTree.setCheckedKeys([])
+        this.chooseItemDataListByTree = arr;
+        this.isSelectAllItem = false;
+        this.isSelectAllItemData = false;
+        this.leavesChooseList = [];
+        this.$refs.itemTree.setCheckedKeys([]);
         // this.$refs.chooseItemTree.setCheckedNodes([])
-      })
+      });
     },
     /** 移除数据项 */
     removeCheckNodesBtnEvent() {
@@ -779,7 +702,7 @@ export default {
       if (!_temp || _temp.length == 0) {
         return
       }
-      for (let i = _temp.length - 1; i >= 0; i --) {
+      for (let i = _temp.length - 1; i >= 0; i--) {
         if (_temp[i].checked) {
           this.chooseItemDataListByTree.splice(i, 1)
         }
@@ -830,6 +753,7 @@ export default {
     },
     /** 选择数据项弹出层保存事件:第二步 */
     itemDialogSave2() {
+      this.treeData=[]
       this.filterChooseItemText = ''
       this.chooseItemChangeEvent()
       this.itemDataStep = 1
@@ -867,8 +791,8 @@ export default {
         }
         for (let i = 0; i < dataModelList.length; i++) {
           dataModelList[i].title = dataModelList[i].remark
-              ? ('【' + dataModelList[i].remark + '】' + dataModelList[i].operationRule)
-              : dataModelList[i].operationRule
+            ? ('【' + dataModelList[i].remark + '】' + dataModelList[i].operationRule)
+            : dataModelList[i].operationRule
           this.dataModelList.push(dataModelList[i])
         }
         this.$nextTick(() => {
@@ -955,6 +879,7 @@ export default {
         this.chooseItemDataListByTree = this.tempItemList
         this.groupBasicForm.itemList = this.tempItemList
       }
+      this.treeData=[]
       this.filterChooseItemText = ''
       this.filterItemData = ''
       this.itemDataListByTree = []
@@ -976,8 +901,8 @@ export default {
 </script>
 
 <style scoped>
-.el-tree--highlight-current .el-tree-node.is-current > .el-tree-node__content {
-    background-color: #90b9e1;
-    color: white;
+.el-tree--highlight-current .el-tree-node.is-current>.el-tree-node__content {
+  background-color: #90b9e1;
+  color: white;
 }
 </style>

Fișier diff suprimat deoarece este prea mare
+ 227 - 711
chuanyi_client/src/components/HeaderMain/index.vue


+ 594 - 0
chuanyi_client/src/components/HeaderMain/itemChooseTree.vue

@@ -0,0 +1,594 @@
+<template>
+    <div>
+        <!-- 数据项选择树 -->
+        <el-dialog :title="title" width="80%" top="10vh" custom-class="dialog-max" class="cy-custom-dialog" center
+            :before-close="dialogClose" :visible.sync="visible" @open="handleOpen" @close="handleClose">
+            <el-form label-width="100px">
+                <el-row>
+                    <el-col :span="6">
+                        <el-form-item label="数据源:" style="margin-bottom: 20px; width: 300px">
+                            <el-select v-model="dataSourceId" disabled>
+                                <el-option v-for="dict in dataSourceList" :key="dict.id" :label="dict.dataSourceName"
+                                    :value="dict.id"></el-option>
+                            </el-select>
+                        </el-form-item>
+                        <!-- <el-form-item label="所选路径" style="margin-bottom: 20px; width: 300px">
+                            <el-input style="margin-top: -10px; width: 400px" disabled
+                                v-model="queryParams.chooseItemStr"></el-input>
+                        </el-form-item> -->
+                    </el-col>
+                    <template>
+                        <el-select v-model="queryParams.needItemStr" multiple collapse-tags placeholder="请选择">
+                            <el-option v-for="item in DriverItemData" :key="item.id" :label="item.itemName"
+                                :value="item.itemName">
+                            </el-option>
+                        </el-select>
+                        <el-button type="primary" size="mini" style="margin-left: 15px;"
+                            @click="getCompositeScreen">复合筛选</el-button>
+                    </template>
+                </el-row>
+            </el-form>
+            <!-- <div style="display: flex; height: calc(100% - 36px); overflow: auto"> -->
+            <div style="display: flex; height: calc(100% - 36px);">
+                <!-- 数据项 -->
+                <div class="cy-transform-data">
+                    <el-divider content-position="left">数据项</el-divider>
+                    <div class="cy-line" style="padding-bottom: 10px">
+                        <div style="height: 35px">
+                            <el-input placeholder="输入关键字进行过滤" v-model="filterLabelText" size="mini"
+                                prefix-icon="el-icon-search"></el-input>
+                        </div>
+                        <div style="height: calc(100% - 50px); overflow: auto">
+                            <!-- 树节点 -->
+                            <div style="height: 20vh;overflow: auto;">
+                                <virtual-tree class="cy-group-tree" ref="itemTree" :data="treeData" :indent="10"
+                                    node-key="id" :filter-node-method="filterLabelEvent" @node-click="handleLabelNodeClick"
+                                    @node-expand="handleLabelNodeExpand" @node-collapse="handleLabelNodeCollapse"
+                                    :check-on-click-node="false" :show-checkbox="true" :highlight-current="true"
+                                    :default-expand-all="true">
+                                    <span class="custom-tree-node" slot-scope="{ node, data }">
+                                        <i v-if="data.isLeaf" class="el-icon-document"
+                                            style="color: #e69a0f; margin-right: 5px;" />
+                                        <i v-else-if="node.expanded" class="el-icon-folder-opened"
+                                            style="color: #e69a0f; margin-right: 5px;" />
+                                        <i v-else class="el-icon-folder" style="color: #e69a0f; margin-right: 5px;" />
+                                        <!-- <svg-icon v-if="data.isLeaf" icon-class="file-bg" />
+                                        <svg-icon v-else-if="node.expanded" icon-class="folder-open" style="width: 1.2em" />
+                                        <svg-icon v-else icon-class="folder" /> -->
+                                        <span :title="node.label || '-'" style="margin-left: 2px">{{
+                                            node.label
+                                        }}</span>
+                                    </span>
+                                </virtual-tree>
+                            </div>
+                            <!-- 树节点对应的叶节点 -->
+                            <div style="height: 30vh; overflow: auto">
+                                <el-divider content-position="left" style="margin-bottom: 15px !important">
+                                    <i></i>
+                                    <span>(共{{ leavesList.length }}项)</span>
+                                </el-divider>
+                                <el-input placeholder="输入关键字进行过滤" style="margin-top: -10px; width: calc(100% - 60px)"
+                                    size="mini" @input="filterLeavesEvent" v-model="filterLeavesText"></el-input>
+                                <el-checkbox v-model="isSelectAllLeaves" @change="handleCheckAllLeavesChange"
+                                    style="margin-left: 5px">全选</el-checkbox>
+                                <div class="cy-leaves-div">
+                                    <p-virtual-check ref="pvc" :data-sources="leavesList"
+                                        @check-change-all="checkChangeAllLeaves"
+                                        @check-change="checkChangeLeaves"></p-virtual-check>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+                <!-- 操作按钮 -->
+                <div class="cy-transform-btn">
+                    <el-row>
+                        <el-button size="mini" @click="addCheckNodesBtnEvent">添加&nbsp;&gt;&gt;</el-button>
+                    </el-row>
+                    <el-row>
+                        <el-button size="mini" @click="removeCheckNodesBtnEvent">&lt;&lt;&nbsp;移除</el-button>
+                    </el-row>
+                    <el-row>
+                        <el-button size="mini" @click="removeAllCheckNodesBtnEvent">全部移除</el-button>
+                    </el-row>
+                </div>
+                <!-- 已选择数据项 -->
+                <div class="cy-transform-data">
+                    <el-divider content-position="left">已选择数据项({{ chooseItemDataListByTree.length }})</el-divider>
+                    <div class="cy-line">
+                        <el-checkbox v-model="isSelectAllItem" @change="selectAllItem"
+                            style="margin-left: 10px">全选</el-checkbox>
+                        <div style="height: 60vh; overflow: auto">
+                            <p-virtual-check ref="pvcChoose" :data-sources="chooseItemDataListByTree"
+                                @check-change-all="checkChangeAllChoose"
+                                @check-change="checkChangeChoose"></p-virtual-check>
+                        </div>
+                    </div>
+                </div>
+            </div>
+            <span slot="footer">
+                <el-button type="primary" @click="gotoItemConfig">下一步</el-button>
+                <el-button @click="dialogClose">取消</el-button>
+            </span>
+        </el-dialog>
+
+        <!-- 数据项表达式配置 -->
+        <ItemConfigModel ref="itemConfigModel" @dialogClose="dialogClose" @saveItemChoose="saveItemChoose">
+        </ItemConfigModel>
+    </div>
+</template>
+
+<script>
+import { showLoading } from '@/utils/cqcy'
+import { extractDataItemValues, getNodeAllPath } from '@/utils/cqcy'
+import PVirtualCheck from "@/components/PVirtualCheck/index.vue";
+import { getNextAllItem, getDriverItemBySouceId, getCompositeScreen } from '@/api/source/itemGroup';
+import { getAllDataModel } from '@/api/source/dataModel';
+import ItemConfigModel from './itemConfigModel.vue'
+
+export default {
+    components: {
+        'p-virtual-check': PVirtualCheck,
+        ItemConfigModel
+    },
+    watch: {
+        filterLabelText(val) {
+            this.$refs.itemTree.filter(val);
+        },
+    },
+    created() {
+        this.getAllDataModel()
+    },
+    data() {
+        return {
+            visible: false,
+            title: '选择数据项',
+            dataSourceId: null,
+            treeItemName: null,
+            //树数据
+            treeData: [],
+            //所有数据源信息
+            dataSourceList: [],
+            //所有数据模型
+            dataModelList: [],
+            //原来数据组中包含的数据项信息
+            itemList: [],
+            //过滤树节点的输入文本
+            filterLabelText: null,
+            //左侧展示的叶节点
+            leavesList: [],
+            leavesListF: [],
+            //左侧选中的叶节点
+            leavesChooseList: [],
+            //过滤叶节点的输入文本
+            filterLeavesText: null,
+            //是否全选所有叶节点
+            isSelectAllLeaves: false,
+            //右侧展示的,已选择的数据项
+            chooseItemDataListByTree: [],
+            //右侧,是否选择所有数据项
+            isSelectAllItem: false,
+            queryParams: {
+                id: null,
+                chooseItemStr: "",
+                nextItemStr: "",
+                needItemStr: [],
+            },
+            DriverItemData: []
+        }
+    },
+    methods: {
+        /** 关闭弹出层 */
+        dialogClose() {
+            this.visible = false
+        },
+        /** 弹窗打开事件 */
+        handleOpen() {
+            const loading = showLoading(this, "加载中,请稍候···");
+            this.isSelectAllItem = false
+            this.getNextAllItem(this.dataSourceId, this.treeItemName, (data) => {
+                //加载树
+                this.treeData = data.children
+                //加载虚拟列表,叶节点
+                let leaves = data.leaves
+                this.leavesList = leaves
+                this.leavesListF = leaves
+                let arr = [];
+                //将原来的数据项加载到,右侧作为已选择的
+                for (let i = 0; i < this.itemList.length; i++) {
+                    let temp = {
+                        nodeIdentifier: null,
+                        dataType: null,
+                        label: this.itemList[i].itemName,
+                        nodeIndex: this.itemList[i].nodeIndex,
+                        itemName: this.itemList[i].itemName,
+                        itemReadName: this.itemList[i].itemReadName,
+                        dataModelId: this.itemList[i].dataModelId,
+                        value: this.itemList[i].itemReadName,
+                        checked: false,
+                    };
+                    arr.push(temp)
+                }
+                this.chooseItemDataListByTree = arr
+                //获取数据源的驱动数据项信息
+                this.getDriverItemBySouceId(this.dataSourceId)
+                loading.close();
+            })
+        },
+        /** 弹窗关闭事件 */
+        handleClose() {
+            this.dataSourceId = null
+            this.treeItemName = []
+            this.treeData = []
+            this.leavesList = []
+            this.chooseItemDataListByTree = []
+            this.filterLabelText = null
+            this.filterLeavesText = null
+        },
+        /** 查询改数据源下的驱动数据项信息 */
+        getDriverItemBySouceId(id) {
+            this.queryParams.id = id;
+            getDriverItemBySouceId(id).then((res) => {
+                if (res.code === 200) {
+                    this.DriverItemData = res.data;
+                }
+            });
+        },
+        /** 跳转到配置数据项表达式 */
+        gotoItemConfig() {
+            if (this.chooseItemDataListByTree.length == 0) {
+                this.$message({
+                    message: '请选择数据项!',
+                    type: 'warning'
+                });
+                return;
+            }
+            this.$refs.itemConfigModel.title = '数据项表达式配置'
+            this.$refs.itemConfigModel.visible = true
+            this.$refs.itemConfigModel.leavesChooseList = this.chooseItemDataListByTree
+            this.$refs.itemConfigModel.tableTotal = this.chooseItemDataListByTree.length
+            let arr = [];
+            for (let i = 0; i < this.chooseItemDataListByTree.length; i++) {
+                let temp = this.chooseItemDataListByTree[i];
+                let dataModelId = this.chooseItemDataListByTree[i].dataModelId
+                for (let j = 0; j < this.dataModelList.length; j++) {
+                    if (this.dataModelList[j].id == dataModelId) {
+                        temp.remark = this.dataModelList[j].remark
+                        break
+                    }
+                }
+                arr.push(temp)
+            }
+            this.$refs.itemConfigModel.tableData = arr
+            this.$refs.itemConfigModel.dataModelList = this.dataModelList
+        },
+        /** 将数据项选择的信息,传递给父组件 */
+        saveItemChoose(datas) {
+            this.$emit('saveItemChoose', datas)
+        },
+        /** 获取树节点的下级信息 */
+        getNextAllItem(dataSourceId, itemName, callback) {
+            getNextAllItem(dataSourceId, itemName).then((res) => {
+                let data = {}
+                this.filterLeavesText = "";
+                let datas = res.data.label;
+                let leaves = res.data.leaves;
+                // 模拟数据
+                let dataList = [];
+                if (datas && datas.length > 0) {
+                    datas.forEach((t) => {
+                        dataList.push({
+                            dataSourceId: dataSourceId,
+                            label: t.itemName,
+                            leaf: false,
+                            children: [],
+                        });
+                    });
+                }
+                let leavesList = [];
+                if (leaves && leaves.length > 0) {
+                    leaves.forEach((t) => {
+                        t.label = t.itemName;
+                        t.value = t.itemReadName;
+                        t.checked = false;
+                        leavesList.push(t);
+                    });
+                }
+                data.children = dataList
+                data.leaves = leavesList
+                callback(data);
+            })
+        },
+        /** 过滤树节点事件 */
+        filterLabelEvent(value, data) {
+            if (!value) return true;
+            return data.label.indexOf(value) !== -1;
+        },
+        /** 数据项点击事件 */
+        handleLabelNodeClick(d, n, t) {
+            this.queryParams.chooseItemStr = getNodeAllPath(n, null);
+            const loading = showLoading(this, "加载中,请稍候···");
+            if ((!d.children || d.children.length == 0) && (!d.leaves || d.leaves.length == 0)) {
+                let itemNames = [];
+                extractDataItemValues(n, itemNames);
+                let itemName = itemNames.reverse().join("!@");
+                this.queryParams.chooseItemStr = itemName;
+                this.getNextAllItem(this.dataSourceId, itemName, (data) => {
+                    //加载树
+                    d.children = data.children
+                    let leaves = data.leaves
+                    d.leaves = leaves
+                    //加载虚拟列表,叶节点
+                    this.leavesList = leaves
+                    this.leavesListF = leaves
+                    loading.close();
+                })
+            } else {
+                if (d.leaves) {
+                    let leaves = d.leaves
+                    this.leavesList = leaves
+                    this.leavesListF = leaves
+                }
+                loading.close();
+            }
+        },
+        /** 过滤叶节点事件 */
+        filterLeavesEvent(value) {
+            let arr = JSON.parse(JSON.stringify(this.leavesListF));
+            if (!value || !value.trim()) {
+                this.leavesList = arr;
+                return;
+            }
+            let filterList = arr.filter((v) => {
+                return v.itemName.indexOf(value) !== -1;
+            });
+            this.leavesList = filterList;
+        },
+        /** 全选叶节点事件 */
+        handleCheckAllLeavesChange(flag) {
+            this.$refs.pvc.checkedAll(flag);
+        },
+        /** 是否全部选中 */
+        checkChangeAllLeaves(flag) {
+            this.isSelectAllLeaves = flag;
+        },
+        /** 查看选中的所有叶节点状态,并将checked为true的填入到选中的叶节点中 */
+        checkChangeLeaves(datas) {
+            this.leavesChooseList = [];
+            if (!datas || datas.length == 0) {
+                return;
+            }
+            datas.forEach((data) => {
+                if (data.checked) {
+                    this.leavesChooseList.push(data);
+                }
+            });
+        },
+        /** 将选择的叶节点添加到右边,成为数据项 */
+        addCheckNodesBtnEvent() {
+            // 根据当前选择节点拼接为:XXXX.XXXX.XXX
+            let chooseChannelNameList = [];
+            if (this.leavesChooseList.length == 0) {
+                this.$message({
+                    message: '请选择数据项!',
+                    type: 'warning'
+                });
+                return;
+            }
+            for (let i = 0; i < this.leavesChooseList.length; i++) {
+                let temp = {
+                    nodeIdentifier: null,
+                    dataType: this.leavesChooseList[i].dataType,
+                    label: this.leavesChooseList[i].fullPath,
+                    nodeIndex: this.leavesChooseList[i].nodeIndex,
+                    itemName: this.leavesChooseList[i].fullPath,
+                    // itemName: this.leavesChooseList[i].itemName,
+                    itemReadName: this.leavesChooseList[i].itemReadName,
+                    value: this.leavesChooseList[i].itemReadName,
+                    checked: false,
+                };
+                chooseChannelNameList.push(temp);
+            }
+            // 去重
+            let arr = JSON.parse(JSON.stringify(this.chooseItemDataListByTree));
+            if (arr.length == 0) {
+                arr = chooseChannelNameList;
+            } else {
+                let status = false;
+                for (let i in chooseChannelNameList) {
+                    let flag = false;
+                    for (let j in arr) {
+                        let tName = arr[j].label ? arr[j].label : arr[j].itemName;
+                        if (chooseChannelNameList[i].label == tName) {
+                            flag = true;
+                            if (!status) {
+                                status = true;
+                            }
+                            break;
+                        }
+                    }
+                    if (!flag) {
+                        arr.push(chooseChannelNameList[i]);
+                    }
+                }
+                if (status) {
+                    this.$message({
+                        message: '请注意,选择的数据项中含有重复的项',
+                        type: 'warning'
+                    });
+                }
+            }
+            this.handleCheckAllLeavesChange(false);
+            this.$nextTick(() => {
+                this.chooseItemDataListByTree = arr;
+                this.isSelectAllItem = false;
+                this.isSelectAllLeaves = false;
+                this.leavesChooseList = [];
+                this.$refs.itemTree.setCheckedKeys([]);
+            });
+        },
+        /** 将右边选择的数据项移除 */
+        removeCheckNodesBtnEvent() {
+            let _temp = this.chooseItemDataListByTree;
+            if (!_temp || _temp.length == 0) {
+                return;
+            }
+            for (let i = _temp.length - 1; i >= 0; i--) {
+                if (_temp[i].checked) {
+                    this.chooseItemDataListByTree.splice(i, 1);
+                }
+            }
+
+            // 重置选择
+            this.isSelectAllItem = false;
+            this.$refs.itemTree.setCheckedKeys([]);
+            this.selectAllItem(false);
+        },
+        /** 将右边所有的数据项移除 */
+        removeAllCheckNodesBtnEvent() {
+            if (this.chooseItemDataListByTree.length == 0) {
+                return;
+            }
+            this.isSelectAllItem = false;
+            this.chooseItemDataListByTree = [];
+        },
+        /** 数据项全选事件 */
+        selectAllItem(val) {
+            this.$refs.pvcChoose.checkedAll(val);
+        },
+        /** 是否全部选中监听器 */
+        checkChangeAllChoose(flag) {
+            this.isSelectAllItem = flag;
+        },
+        /** 选中的数据项信息 */
+        checkChangeChoose(datas) {
+            this.chooseItemDataListByTree = datas;
+        },
+        /** 复合筛选 */
+        getCompositeScreen() {
+            const loading = showLoading(this, "筛选中,请稍候···");
+            let params = {};
+            params.id = this.queryParams.id
+            params.chooseItemStr = this.queryParams.chooseItemStr
+            params.needItemStr = JSON.stringify(this.queryParams.needItemStr)
+            //得到选择的所有节点
+            const treeArr = this.$refs.itemTree.getCheckedNodes();
+            const treeQ = document.getElementsByClassName('el-tree cy-group-tree el-tree--highlight-current')[0]
+                .getElementsByClassName('el-tree-node__content');
+            let seTreeArr = []
+            //赛选出需要的节点
+            if (treeArr.length > 0) {
+                for (let i = 0; i < treeQ.length; i++) {
+                    const parentClass = treeQ[i].parentElement.classList;
+                    if (parentClass.contains('is-current') && !parentClass.contains('is-hidden')) {
+                        // 选择的层级
+                        let treechild = treeQ[i].nextElementSibling.getElementsByClassName('el-tree-node__content');
+                        for (let j = 0; j < treechild.length; j++) {
+                            const clz = treechild[j].parentElement.classList;
+                            if (clz.contains('is-checked') && !clz.contains('is-hidden')) {
+                                seTreeArr.push(treechild[j].textContent)
+                            }
+                        }
+                        break;
+                    }
+                }
+            }
+            params.nextItemStr = JSON.stringify(seTreeArr)
+            if (!seTreeArr || seTreeArr.length == 0) {
+                this.$message({
+                    message: '节点选择为空',
+                    type: 'warning'
+                });
+                return
+            }
+            if (!this.queryParams.needItemStr || this.queryParams.needItemStr.length == 0) {
+                this.$message({
+                    message: '复合筛选属性不能为空',
+                    type: 'warning'
+                });
+                return
+            }
+            getCompositeScreen(params).then((res) => {
+                if (res.code === 200) {
+                    let treeData = this.chooseItemDataListByTree ? this.chooseItemDataListByTree : [];
+                    if (res.data && res.data.length > 0) {
+                        let lodArr = [];
+                        for (let j = 0; j < res.data.length; j++) {
+                            lodArr.push(res.data[j].label ? res.data[j].label : res.data[j].itemName);
+                        }
+                        let status = false;
+                        let idArr = {}
+                        for (let i = 0; i < treeData.length; i++) {
+                            if (lodArr.indexOf(treeData[i].label) !== -1) {
+                                idArr[lodArr.indexOf(treeData[i].label)] = '1'
+                            }
+                        }
+                        for (let j = 0; j < res.data.length; j++) {
+                            if (!idArr[j]) {
+                                treeData.push(res.data[j])
+                            } else {
+                                status = true;
+                            }
+                        }
+                        if (status) {
+                            this.$message({
+                                message: '请注意,选择的数据项中含有重复的项',
+                                type: 'warning'
+                            });
+                        }
+                    }
+
+                    this.checkChangeAllLeaves(false);
+                    this.$nextTick(() => {
+                        this.chooseItemDataListByTree = treeData;
+                        this.isSelectAllItem = false;
+                        this.isSelectAllLeaves = false;
+                        this.leavesChooseList = [];
+                        this.queryParams.needItemStr = [];
+                        this.$refs.itemTree.setCheckedKeys([]);
+                        this.$refs.itemTree.setCheckedNodes([]);
+                    });
+                    if (!res.data || res.data.length === 0) {
+                        this.$message({
+                            message: '没有筛选出符合条件的数据项,请重新筛选',
+                            type: 'warning'
+                        });
+                    }
+                    loading.close()
+                }
+            });
+        },
+        /** 查询所有模型数据 */
+        getAllDataModel() {
+            let queryParams = {
+                page: 1,
+                limit: 9999,
+                operationRule: null
+            }
+            getAllDataModel(queryParams).then(res => {
+                if (!res || !res.data) {
+                    this.$message({
+                        message: '数据查询失败!',
+                        type: 'warning'
+                    })
+                    return
+                }
+                this.dataModelList = res.data.dataModelList
+            })
+        }
+    }
+}
+</script>
+
+<style rel="stylesheet/scss" lang="scss" scoped>
+@import './itemChooseTree.css';
+
+.dialog-max {
+    height: 85vh;
+
+    .el-dialog__body {
+        height: 72vh;
+        overflow: hidden;
+    }
+}
+</style>

+ 3 - 0
chuanyi_client/src/main.js

@@ -3,6 +3,8 @@ import Cookies from 'js-cookie';
 import Element from 'element-ui';
 import splitPane from 'vue-splitpane';
 import UmyUi from 'umy-ui';
+/** 虚拟树 */
+import { Tree as virtualTree } from '@femessage/element-ui'
 
 import '@/assets/styles/element-variables.scss';
 import 'font-awesome/css/font-awesome.css';
@@ -16,6 +18,7 @@ import router from './router';
 import store from './store';
 import '@/utils/directives';
 
+Vue.component('virtualTree', virtualTree)
 Vue.component('split-pane', splitPane);
 
 Vue.use(UmyUi);

+ 36 - 2
chuanyi_client/src/utils/cqcy.js

@@ -256,6 +256,24 @@ export function showLoading(_this, tips) {
 }
 
 /**
+ * 创建加载框
+ * @param tips
+ * @returns {Promise<*>}
+ */
+export function showLoadingTime(_this, tips,time) {
+    const loading = _this.$loading({
+        lock: true,
+        text: tips ? tips : '加载中···',
+        spinner: 'el-icon-loading',
+        background: 'rgba(0, 0, 0, 0.7)'
+    });
+    setTimeout(() => {
+        if (loading) loading.close()
+    }, time)
+    return loading
+}
+
+/**
  * HOST 地址验证
  * @param url
  * @returns {boolean}
@@ -626,7 +644,6 @@ export function gotoPage(_this, _path, _query) {
 export function checkReportChangeStatus() {
     let len = getLuckysheetConfig() ? getLuckysheetConfig().length : 0
     let lastLen = localStorage.getItem('REPORT_LEN') ? parseInt(localStorage.getItem('REPORT_LEN')) : 0
-    console.log(len, lastLen)
     if (len > 0 && lastLen > 0 && len != lastLen) {
         if (len < lastLen || len - lastLen > 20)
             return true
@@ -671,4 +688,21 @@ export function withDateFormatLength(listDate) {
         arr.push(date.substring(0, 19))
     })
     return arr
-}
+}
+
+/**
+ * 数据组获取父级标签
+ * @param obj
+ * @param arr
+ */
+export function getNodeAllPath(node, str) {
+    if (str) {
+      str = node.data.label + "." + str
+    } else {
+      str = node.data.label
+    }
+    if (node.parent && node.parent.parent) {
+      str = getNodeAllPath(node.parent, str)
+    }
+    return str;
+  }

+ 0 - 5
chuanyi_client/src/utils/request.js

@@ -37,7 +37,6 @@ service.interceptors.request.use(config => {
     if (sysHost) {
         config.baseURL = sysHost
     }
-    console.log(config.baseURL)
     // get请求映射params参数
     if (config.method === 'get' && config.params) {
         let url = config.url + '?' + tansParams(config.params);
@@ -63,7 +62,6 @@ service.interceptors.request.use(config => {
             const interval = 1000;                         // 间隔时间(ms),小于此时间视为重复提交
             if (s_data === requestObj.data && requestObj.time - s_time < interval && s_url === requestObj.url) {
                 const message = cqcyCode[901];
-                console.warn(`[${s_url}]: ` + message)
                 // return Promise.reject(new Error(message))
                 return  Promise.reject(message)
             } else {
@@ -75,7 +73,6 @@ service.interceptors.request.use(config => {
     }
     return config
 }, error => {
-    console.log(error)
     Promise.reject(error)
 })
 
@@ -142,7 +139,6 @@ service.interceptors.response.use(res => {
         //     type: 'error',
         //     duration: 5 * 1000
         // })
-        console.warn(message)
         return Promise.reject(message)
     }
 )
@@ -174,7 +170,6 @@ export function download(url, params, filename, config) {
         }
         downloadLoadingInstance.close();
     }).catch((r) => {
-        console.error(r)
         Message.error(cqcyCode[902])
         downloadLoadingInstance.close();
     })

+ 686 - 0
chuanyi_client/src/views/group_item/index copy.vue

@@ -0,0 +1,686 @@
+<template>
+  <div class="cqcy-content" v-if="chooseGroupId">
+    <div style="margin-bottom: 10px;">
+      <span style="color: #474646; font-size: 14px;">数据组:</span>
+      <el-select v-model="chooseGroupId" disabled size="mini">
+        <el-option
+            v-for="dict in groupDataList"
+            :key="dict.id"
+            :label="dict.groupName"
+            :value="dict.id"
+        ></el-option>
+      </el-select>
+      <span style="margin-left: 20px; color: #474646; font-size: 14px;">数据项名称:</span>
+      <el-input placeholder="请输入数据项名称"
+                size="mini"
+                style="width: 200px;"
+                @input="itemChangeEvent"
+                v-model="filterItemText"
+                prefix-icon="el-icon-search">
+      </el-input>
+      <el-checkbox v-model="groupRunStatus" size="mini" style="margin-left: 20px;"
+                   @change="groupRunCheckboxEvent" title="固定每5秒刷新一次数据">实时数据</el-checkbox>
+      <el-button type="danger"
+                 v-show="!groupRunStatus"
+                 icon="el-icon-delete"
+                 size="mini"
+                 @click="multipleDelItemEvent"
+                 style="float: right;">批量删除</el-button>
+      <el-button type="primary"
+                 v-show="!groupRunStatus"
+                 icon="el-icon-s-tools"
+                 size="mini"
+                 @click="multipleModelItemEvent"
+                 style="float: right; margin-right: 15px;">批量设置表达式</el-button>
+      <el-button type="primary"
+                 v-show="!groupRunStatus"
+                 icon="el-icon-plus"
+                 size="mini"
+                 @click="addGroupItemEvent"
+                 style="float: right; margin-right: 5px;">添加数据项</el-button>
+    </div>
+    <u-table class="cy-group-items"
+             row-key="label"
+             use-virtual
+             :height="uTableHeight"
+             :data="itemDataList"
+             @selection-change="selectionLineChangeHandle"
+             @sort-change="sortChange"
+             :big-data-checkbox="true"
+             showBodyOverflow="title"
+             showHeaderOverflow="title"
+             border>
+      <u-table-column type="selection" width="55" align="center"/>
+      <u-table-column type="index" label="序号" width="60" fixed align="center"/>
+      <u-table-column label="数据项名称" prop="itemName" sortable="custom" align="center"/>
+      <template v-if="groupRunStatus">
+        <u-table-column prop="dataType" sortable="custom" label="数据项类型" align="center" width="120">
+        </u-table-column>
+        <u-table-column prop="operationRule" sortable="custom" label="表达式" align="center" width="150">
+          <template slot-scope="scope">
+            {{ scope.row.operationRule ? scope.row.operationRule : '默认值' }}
+          </template>
+        </u-table-column>
+        <u-table-column prop="quality" sortable="custom" label="质量" align="center" width="60">
+        </u-table-column>
+        <u-table-column prop="dataOrgValue" sortable="custom" label="原始数据值" align="center" width="120">
+          <template slot-scope="scope">
+            {{ (scope.row.dataOrgValue != null
+              && scope.row.dataOrgValue != 'undefined'
+              && scope.row.dataOrgValue != 'null') ? scope.row.dataOrgValue : '' }}
+          </template>
+        </u-table-column>
+        <u-table-column prop="dataValue" sortable="custom" label="计算值" align="center" width="100">
+          <template slot-scope="scope">
+            {{ (scope.row.dataValue != null
+              && scope.row.dataValue != 'undefined'
+              && scope.row.dataValue != 'null') ? scope.row.dataValue : '' }}
+          </template>
+        </u-table-column>
+        <u-table-column prop="dataSourceName" sortable="custom" label="数据源名称" align="center" width="180">
+        </u-table-column>
+        <u-table-column prop="createTime" sortable label="取值时间" align="center" width="180">
+        </u-table-column>
+      </template>
+      <template v-else>
+        <u-table-column prop="describe" sortable="custom" label="别名" align="center" width="150">
+          <template slot-scope="scope" v-if="scope.row.describe">
+            <!--          <el-tag type="primary" disable-transitions>{{ scope.row.describe }}</el-tag>-->
+            <span>{{ scope.row.describe }}</span>
+          </template>
+        </u-table-column>
+        <u-table-column prop="dataSourceName" sortable="custom" label="数据源名称" align="center" width="180">
+        </u-table-column>
+        <u-table-column prop="operationRule" sortable="custom" label="表达式" align="center" width="200">
+          <template slot-scope="scope">
+            {{ scope.row.operationRule ? scope.row.operationRule : '默认值' }}
+          </template>
+        </u-table-column>
+        <u-table-column label="操作" align="center" width="180">
+          <template slot-scope="scope">
+            <el-button type="text"
+                       size="small"
+                       icon="el-icon-edit"
+                       @click="handleClickByEdit(scope.row)">编辑</el-button>
+            <el-button type="text"
+                       size="small"
+                       icon="el-icon-delete"
+                       style="color: red;"
+                       @click="handleClickByDel(scope.row)">删除</el-button>
+          </template>
+        </u-table-column>
+      </template>
+    </u-table>
+
+    <!-- 修改数据项基础信息 -->
+    <el-dialog
+        title="修改数据项"
+        width="600px"
+        top="10vh"
+        center
+        v-dialog-drag
+        v-if="dialogItemVisible"
+        :before-close="dialogClose"
+        :visible.sync="dialogItemVisible"
+        :close-on-click-modal="false"
+        :append-to-body="true">
+      <el-form ref="itemForm" :model="itemForm" label-width="150px">
+        <el-form-item label="ID" prop="id" style="display: none;">
+          <el-input v-model='itemForm.id'
+                    type="text"
+                    auto-complete="off"></el-input>
+        </el-form-item>
+        <el-form-item label="数据模型:" prop="dataModelId">
+          <el-select v-model="itemForm.dataModelId" filterable clearable placeholder="请选择表达式" style="width: 100%;">
+            <el-option
+                v-for="(item, index) in this.dataModelList"
+                :key="index"
+                :label="item.title"
+                :value="item.id">
+            </el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="数据项描述信息:" prop="describe">
+          <el-input v-model.trim='itemForm.describe'
+                    type="text"
+                    auto-complete="off"
+                    show-word-limit
+                    maxlength="20"
+                    placeholder="请输入描述信息"></el-input>
+        </el-form-item>
+<!--        <el-divider content-position="left" class="cy-divider">事件报表配置(以下任意一项配置为空都将会无效)</el-divider>-->
+<!--        <el-form-item label="事件驱动产生条件:" prop="eventMode">-->
+<!--          <el-radio-group v-model="itemForm.eventMode">-->
+<!--            <el-radio label="0">大于</el-radio>-->
+<!--            <el-radio label="1">小于</el-radio>-->
+<!--            <el-radio label="2">布尔类型</el-radio>-->
+<!--          </el-radio-group>-->
+<!--        </el-form-item>-->
+<!--        <el-form-item label="阈值:" prop="eventValue">-->
+<!--          <el-input v-model="itemForm.eventValue" placeholder="请输入阈值" maxlength="8">-->
+<!--          </el-input>-->
+<!--        </el-form-item>-->
+<!--        <el-form-item label="事件驱动报表:" prop="tableReportId">-->
+<!--          <el-select v-model="itemForm.tableReportId" filterable clearable-->
+<!--                     placeholder="请选择事件驱动报表" style="width: 100%;">-->
+<!--            <el-option-->
+<!--                v-for="(item, index) in this.eventReportList"-->
+<!--                :key="index"-->
+<!--                :label="item.reportTableName"-->
+<!--                :value="item.id">-->
+<!--            </el-option>-->
+<!--          </el-select>-->
+<!--        </el-form-item>-->
+      </el-form>
+      <span slot='footer'>
+        <el-button type="primary" @click="editConfirmEvent" style="margin-top: 20px;">确定</el-button>
+        <el-button @click="dialogClose" style="margin-top: 20px;">取消</el-button>
+      </span>
+    </el-dialog>
+
+    <el-dialog
+        title="选择表达式"
+        width="500px"
+        top="10vh"
+        center
+        v-dialog-drag
+        v-if="dialogDataModelVisible"
+        :before-close="dialogDataModelClose"
+        :visible.sync="dialogDataModelVisible"
+        :close-on-click-modal="false"
+        :append-to-body="true">
+      <el-select v-model="chooseDataModel" filterable clearable placeholder="请选择表达式" style="width: 100%;">
+        <el-option
+            v-for="(item, index) in this.dataModelList"
+            :key="index"
+            :label="item.title"
+            :value="item.id">
+        </el-option>
+      </el-select>
+      <div style="width: 100%; text-align: center; margin-top: 20px;">
+        <el-button type="primary" @click="saveDataModelEvent">确定</el-button>
+        <el-button @click="dialogDataModelClose">取消</el-button>
+      </div>
+    </el-dialog>
+
+    <!-- 选择数据项 -->
+    <data-source-item ref="dataSourceItem" @update-message="updateDataItemEmit" :chooseGroup="chooseGroup"></data-source-item>
+
+  </div>
+</template>
+
+<script>
+import {
+  addItemList,
+  batchSetExpresses,
+  deleteItemByIdList,
+  getAllDataModel,
+  getItemById,
+  getItemGroupById,
+  getItemValueById,
+  updateItem
+} from "@/api/datasource";
+import {customCompare, showAlertMsgWin, showAlertWin, showConfirmWin, showLoading} from "@/utils/cqcy";
+import cqcyCode from "@/utils/cqcyCode";
+import DataSourceItem from "@/components/CustomDialog/DataSourceItem.vue";
+
+export default {
+  name: "index",
+  components: {
+    DataSourceItem
+  },
+  data() {
+    return {
+      dialogItemVisible: false,
+      dialogDataModelVisible: false,
+      itemDataList: [],
+      itemDataListF: [],
+      groupDataList: [],
+      dataModelList: [],
+      chooseDataModel: null,
+      selectionItems: [],
+      eventReportList: [],
+      chooseGroup: null,
+      chooseGroupId: null,
+      groupRunStatus: false,
+      timeInterval: null,
+      filterItemText: '',
+      uTableHeight: 500,
+      itemForm: {
+        id: null,
+        dataModelId: null,
+        // eventMode: null,
+        // eventValue: null,
+        // tableReportId: null,
+        describe: ''
+      }
+    }
+  },
+  watch: {
+    '$route'(to, from) {
+      this.readParams()
+    },
+    '$route.query.t': {
+      handler(o, n) {
+      }
+    },
+    deep: true
+  },
+  created() {
+    this.readParams()
+  },
+  beforeDestroy() {
+    if (this.timeInterval) {
+      clearInterval(this.timeInterval)
+      this.timeInterval = null
+    }
+    // sessionStorage.removeItem('GROUP_ID')
+  },
+  methods: {
+    sortChange({ prop, order }) {
+      this.itemDataList.sort(customCompare(prop, order))
+    },
+    itemChangeEvent(value) {
+      let arr = JSON.parse(JSON.stringify(this.itemDataListF))
+      if (!value || !value.trim()) {
+        this.itemDataList = arr
+        return
+      }
+      let filterList = arr.filter(v => {
+        return v.itemName.indexOf(value) !== -1
+      })
+      this.itemDataList = filterList
+    },
+    /** 读取参数 */
+    readParams() {
+      this.filterItemText = ''
+      // let groupListStorage = sessionStorage.getItem('GROUP_LIST') ? sessionStorage.getItem('GROUP_LIST') : '[]'
+      // this.groupDataList = JSON.parse(groupListStorage)
+      let groupId = sessionStorage.getItem('GROUP_ID') ? sessionStorage.getItem('GROUP_ID') : '-1'
+      this.chooseGroupId = parseInt(groupId)
+      this.groupRunStatus = false
+      this.getGroupById(this.chooseGroupId)
+      // this.getItemValueById()
+    },
+    /** 运行状态值 */
+    groupRunCheckboxEvent(val) {
+      this.groupRunStatus = val
+      this.getItemValueById()
+    },
+    /** 获取数据项值信息 */
+    getItemValueById() {
+      if (!this.groupRunStatus || !this.chooseGroup) {
+        this.filterItemText = ''
+        if (this.timeInterval) {
+          clearInterval(this.timeInterval)
+          this.timeInterval = null
+        }
+        this.getGroupById(this.chooseGroupId)
+        return
+      }
+      getItemValueById(this.chooseGroup.id).then(res => {
+        // this.filterItemText = ''
+        let list = res.data
+        if (!list) return
+        // 避免布尔类型时页面无法显示数据
+        for (let i = 0; i < list.length; i ++) {
+          list[i].dataValue += ''
+          list[i].quality += ''
+        }
+        if (this.filterItemText) {
+          let filterList = list.filter(v => {
+            return v.itemName.indexOf(this.filterItemText) !== -1
+          })
+          this.itemDataList = filterList
+        } else {
+          this.itemDataList = list
+        }
+        this.itemDataListF = JSON.parse(JSON.stringify(list))
+      }).catch((e) => {
+        showAlertWin(this, null, e)
+      })
+      let temp = setInterval(() => {
+        getItemValueById(this.chooseGroup.id).then(res => {
+          // this.filterItemText = ''
+          let list = res.data
+          // 避免布尔类型时页面无法显示数据
+          for (let i = 0; i < list.length; i ++) {
+            list[i].dataValue += ''
+            list[i].quality += ''
+          }
+          if (this.filterItemText) {
+            let filterList = list.filter(v => {
+              return v.itemName.indexOf(this.filterItemText) !== -1
+            })
+            this.itemDataList = filterList
+          } else {
+            this.itemDataList = list
+          }
+          this.itemDataListF = JSON.parse(JSON.stringify(list))
+        }).catch((e) => {
+          // showAlertWin(this, e)
+        })
+      }, 5 * 1000)
+      this.timeInterval = temp
+    },
+    setRowHeight() {
+      if ($('.cqcy-content') && $('.cqcy-content')[0]) {
+        this.uTableHeight = $('.cqcy-content')[0].offsetHeight - 100
+      }
+    },
+    /** 获取组详细信息 */
+    getGroupById(id) {
+      this.setRowHeight()
+      if (this.timeInterval) {
+        clearInterval(this.timeInterval)
+        this.timeInterval = null
+      }
+      if (!id || id <= 0) {
+        this.chooseGroupId = null
+        return
+      }
+      this.filterItemText = ''
+      const loading = showLoading(this, '加载中,请稍候···')
+      getItemGroupById(id).then(res => {
+        loading.close()
+        this.chooseGroup = res.data
+        this.groupDataList = [{
+          'id': this.chooseGroup.id,
+          'groupName': this.chooseGroup.groupName
+        }]
+        this.setRowHeight()
+        this.itemDataList = this.chooseGroup.itemList
+        this.itemDataListF = JSON.parse(JSON.stringify(this.itemDataList))
+      }).catch((e) => {
+        loading.close()
+        showAlertWin(this, null, e)
+      })
+    },
+    /** 查询所有数据模型 */
+    getAllDataModel(callback) {
+      let loading = showLoading(this, '数据加载中,请稍候···')
+      let params = {
+        'page': 1,
+        'limit': 1000
+      }
+      getAllDataModel(params).then(res => {
+        loading.close()
+        this.dataModelList = res.data.dataModelList
+        for (let i = 0; i < this.dataModelList.length; i ++) {
+          this.dataModelList[i].title = this.dataModelList[i].remark
+              ? ('【' + this.dataModelList[i].remark + '】' + this.dataModelList[i].operationRule)
+              : this.dataModelList[i].operationRule
+        }
+        if (callback) callback(true)
+      }).catch((e) => {
+        loading.close()
+        if (callback) callback(false)
+        showAlertWin(this, null, e)
+      })
+    },
+    /** 编辑 */
+    handleClickByEdit(row) {
+      let _this = this
+      if (!row || !row.id) {
+        showAlertMsgWin(_this, null, cqcyCode[201])
+        return
+      }
+      _this.getAllDataModel(status => {
+        if (!status) return
+        const loading = showLoading(_this, '加载中,请稍候···')
+        getItemById(row.id).then(res => {
+          loading.close()
+          if (res.data.runState == 1) {
+            showAlertMsgWin(this, null, '该数据组正在运行中,禁止修改!')
+            return
+          }
+          _this.$nextTick(() => {
+            _this.itemForm.id = row.id
+            _this.itemForm.dataModelId = res.data.dataModelId
+            _this.itemForm.describe = res.data.describe
+            // _this.itemForm.tableReportId = res.data.tableReportId
+            // _this.itemForm.eventMode = res.data.eventMode + ''
+            // _this.itemForm.eventValue = res.data.eventValue
+            _this.dialogItemVisible = true
+          })
+        }).catch((e) => {
+          loading.close()
+          showAlertWin(_this, null, e)
+        })
+        // let params = {
+        //   'page': 1,
+        //   'limit': 1000,
+        //   'isAutoReport': 3
+        // }
+        // getAllReportTable(params).then(res => {
+        //   let eventReportList = res.data.reportTableList
+        //   this.eventReportList = eventReportList
+        //   getItemById(row.id).then(res => {
+        //     loading.close()
+        //     _this.$nextTick(() => {
+        //       _this.itemForm.id = row.id
+        //       _this.itemForm.dataModelId = res.data.dataModelId
+        //       _this.itemForm.describe = res.data.describe
+        //       _this.itemForm.tableReportId = res.data.tableReportId
+        //       _this.itemForm.eventMode = res.data.eventMode + ''
+        //       _this.itemForm.eventValue = res.data.eventValue
+        //       _this.dialogItemVisible = true
+        //     })
+        //   }).catch((e) => {
+        //     loading.close()
+        //     showAlertWin(_this, e)
+        //   })
+        // }).catch((e) => {
+        //   loading.close()
+        //   showAlertWin(this, e)
+        // })
+      })
+    },
+    /** 编辑确认事件 */
+    editConfirmEvent() {
+      // if (this.itemForm.eventValue) {
+      //   let reg = /^(\-)?\d+(\.\d{1,2})?$/
+      //   if (!reg.test(this.itemForm.eventValue)) {
+      //     this.$message({
+      //       message: '阈值不合法',
+      //       type: 'warning'
+      //     })
+      //     return
+      //   }
+      //   if (this.itemForm.eventMode == '2' && this.itemForm.eventValue != 0 && this.itemForm.eventValue != 1) {
+      //     this.$message({
+      //       message: '布尔类型时阈值只能为0或者1',
+      //       type: 'warning'
+      //     })
+      //     return
+      //   }
+      // }
+      const loading = showLoading(this, '加载中,请稍候···')
+      // 若驱动报表事件任意一项为空,则清空报表事项
+      // if ((!this.itemForm.eventMode || this.itemForm.eventMode == 'null')
+      //     || (this.itemForm.eventValue == null || this.itemForm.eventValue == '')
+      //     || !this.itemForm.tableReportId) {
+      //   this.itemForm.eventMode = null
+      //   this.itemForm.eventValue = null
+      //   this.itemForm.tableReportId = null
+      // }
+      let params = JSON.parse(JSON.stringify(this.itemForm))
+      updateItem(params).then(res => {
+        loading.close()
+        let msg = res.data ? '编辑成功!' : '编辑失败!'
+        showAlertMsgWin(this, null, msg)
+        this.dialogItemVisible = false
+        this.getGroupById(this.chooseGroupId)
+      }).catch((e) => {
+        loading.close()
+        showAlertWin(this, null, e)
+      })
+    },
+    /** 删除数据项 */
+    delItems(ids) {
+      if (ids.length === this.itemDataListF.length) {
+        showAlertMsgWin(this, null, '至少保留一项数据项信息!')
+        return
+      }
+      const loading = showLoading(this, '删除中,请稍候···')
+      deleteItemByIdList(ids).then(res => {
+        loading.close()
+        let msg = res.data ? '删除成功!' : '删除失败!'
+        showAlertMsgWin(this, null, msg)
+        this.getGroupById(this.chooseGroupId)
+      }).catch((e) => {
+        loading.close()
+        showAlertWin(this, null, e)
+      })
+    },
+    /** 删除 */
+    handleClickByDel(row) {
+      if (!row || !row.id) {
+        showAlertMsgWin(this, null, cqcyCode[201])
+        return
+      }
+      if (this.chooseGroup && this.chooseGroup.runState == 1) {
+        showAlertMsgWin(this, null, '该数据组正在运行中,禁止删除!')
+        return
+      }
+      showConfirmWin(this, null, '您确定要删除该数据项吗?', () => {
+        this.delItems([row.id])
+      })
+    },
+    /** 多选事件 */
+    selectionLineChangeHandle(val) {
+      this.selectionItems = val
+    },
+    /** 批量设置组数据中数据项表达式 */
+    multipleModelItemEvent() {
+      if (!this.selectionItems || this.selectionItems.length == 0) {
+        showAlertMsgWin(this, null, '请至少选择一项数据!')
+        return
+      }
+      if (this.chooseGroup && this.chooseGroup.runState == 1) {
+        showAlertMsgWin(this, null, '该数据组正在运行中,禁止修改!')
+        return
+      }
+      this.getAllDataModel(status => {
+        this.dialogDataModelVisible = true
+      })
+    },
+    /** 添加数据项 */
+    addGroupItemEvent() {
+        const loading = showLoading(this, '加载中,请稍候···')
+        getItemGroupById(this.chooseGroupId).then(res => {
+            loading.close()
+            if (res.data.runState == 1) {
+                showAlertMsgWin(this, null, '该数据组正在运行中,禁止添加数据项!')
+            } else {
+                this.$refs.dataSourceItem.show()
+            }
+        }).catch((e) => {
+            loading.close()
+            showAlertWin(this, null, e)
+        })
+    },
+    /** 批量设置组数据中数据项表达式 */
+    saveDataModelEvent() {
+      // let ids = Array.from(this.selectionItems, ({ id }) => id)
+      let itemList = []
+      this.selectionItems.forEach((item) => {
+        itemList.push({
+          'id': item.id,
+          'itemGroupId': item.itemGroupId,
+          'dataModelId': this.chooseDataModel
+        })
+      })
+      let params = {
+        'itemList': itemList
+      }
+      const loading = showLoading(this, '设置中,请稍候···')
+      batchSetExpresses(params).then(res => {
+        loading.close()
+        let msg = res.data ? '设置成功!' : '设置失败!'
+        showAlertMsgWin(this, null, msg)
+        this.dialogDataModelVisible = false
+        this.selectionItems = []
+        this.chooseDataModel = null
+        this.getGroupById(this.chooseGroupId)
+      }).catch((e) => {
+        loading.close()
+        showAlertWin(this, null, e)
+      })
+    },
+    /** 批量删除组数据中数据项 */
+    multipleDelItemEvent() {
+      if (!this.selectionItems || this.selectionItems.length == 0) {
+        showAlertMsgWin(this, null, '请至少选择一项数据!')
+        return
+      }
+      if (this.chooseGroup && this.chooseGroup.runState == 1) {
+        showAlertMsgWin(this, null, '该数据组正在运行中,禁止删除!')
+        return
+      }
+      showConfirmWin(this, null, '您确定要删除已选择数据项吗?', () => {
+        let ids = Array.from(this.selectionItems, ({ id }) => id)
+        this.delItems(ids)
+      })
+    },
+    /** 更新已选择数据项 */
+    updateDataItemEmit(items) {
+      let params = {
+        'id': this.chooseGroup.id,
+        'itemList': items
+      }
+      const loading = showLoading(this, '添加中,请稍候···')
+      addItemList(params).then(res => {
+        loading.close()
+        let msg = res.data ? '设置成功!' : '设置失败!'
+        showAlertMsgWin(this, null, msg)
+        this.dialogDataModelVisible = false
+        this.selectionItems = []
+        this.chooseDataModel = null
+        this.getGroupById(this.chooseGroupId)
+      }).catch((e) => {
+        loading.close()
+        showAlertWin(this, null, e)
+      })
+    },
+    /** 弹出层关闭事件 */
+    dialogClose(done) {
+      if (this.$refs['itemForm']) {
+        this.$refs['itemForm'].resetFields()
+      }
+      if (typeof (done) === 'function') {
+        done()
+      } else {
+        this.dialogItemVisible = false
+      }
+    },
+    /** 数据模型弹出层关闭事件 */
+    dialogDataModelClose(done) {
+      if (typeof(done) === 'function') {
+        done()
+      } else {
+        this.dialogDataModelVisible = false
+      }
+    },
+  }
+}
+</script>
+
+<style rel="stylesheet/scss" lang="scss">
+.el-table--enable-row-hover .el-table__body tr:hover > td {
+  background-color: transparent !important;
+}
+
+.cy-divider {
+  margin-top: 50px;
+  .el-divider__text {
+    font-size: 12px;
+    color: #5e5e5e;
+  }
+}
+
+.cy-group-items {
+  margin-top: 10px;
+  height: calc(100% - 100px);
+}
+</style>

+ 77 - 140
chuanyi_client/src/views/group_item/index.vue

@@ -3,56 +3,27 @@
     <div style="margin-bottom: 10px;">
       <span style="color: #474646; font-size: 14px;">数据组:</span>
       <el-select v-model="chooseGroupId" disabled size="mini">
-        <el-option
-            v-for="dict in groupDataList"
-            :key="dict.id"
-            :label="dict.groupName"
-            :value="dict.id"
-        ></el-option>
+        <el-option v-for="dict in groupDataList" :key="dict.id" :label="dict.groupName" :value="dict.id"></el-option>
       </el-select>
       <span style="margin-left: 20px; color: #474646; font-size: 14px;">数据项名称:</span>
-      <el-input placeholder="请输入数据项名称"
-                size="mini"
-                style="width: 200px;"
-                @input="itemChangeEvent"
-                v-model="filterItemText"
-                prefix-icon="el-icon-search">
+      <el-input placeholder="请输入数据项名称" size="mini" style="width: 200px;" @input="itemChangeEvent" v-model="filterItemText"
+        prefix-icon="el-icon-search">
       </el-input>
-      <el-checkbox v-model="groupRunStatus" size="mini" style="margin-left: 20px;"
-                   @change="groupRunCheckboxEvent" title="固定每5秒刷新一次数据">实时数据</el-checkbox>
-      <el-button type="danger"
-                 v-show="!groupRunStatus"
-                 icon="el-icon-delete"
-                 size="mini"
-                 @click="multipleDelItemEvent"
-                 style="float: right;">批量删除</el-button>
-      <el-button type="primary"
-                 v-show="!groupRunStatus"
-                 icon="el-icon-s-tools"
-                 size="mini"
-                 @click="multipleModelItemEvent"
-                 style="float: right; margin-right: 15px;">批量设置表达式</el-button>
-      <el-button type="primary"
-                 v-show="!groupRunStatus"
-                 icon="el-icon-plus"
-                 size="mini"
-                 @click="addGroupItemEvent"
-                 style="float: right; margin-right: 5px;">添加数据项</el-button>
+      <el-checkbox v-model="groupRunStatus" size="mini" style="margin-left: 20px;" @change="groupRunCheckboxEvent"
+        title="固定每5秒刷新一次数据">实时数据</el-checkbox>
+      <el-button type="danger" v-show="!groupRunStatus" icon="el-icon-delete" size="mini" @click="multipleDelItemEvent"
+        style="float: right;">批量删除</el-button>
+      <el-button type="primary" v-show="!groupRunStatus" icon="el-icon-s-tools" size="mini"
+        @click="multipleModelItemEvent" style="float: right; margin-right: 15px;">批量设置表达式</el-button>
+      <el-button type="primary" v-show="!groupRunStatus" icon="el-icon-plus" size="mini" @click="addGroupItemEvent"
+        style="float: right; margin-right: 5px;">添加数据项</el-button>
     </div>
-    <u-table class="cy-group-items"
-             row-key="label"
-             use-virtual
-             :height="uTableHeight"
-             :data="itemDataList"
-             @selection-change="selectionLineChangeHandle"
-             @sort-change="sortChange"
-             :big-data-checkbox="true"
-             showBodyOverflow="title"
-             showHeaderOverflow="title"
-             border>
-      <u-table-column type="selection" width="55" align="center"/>
-      <u-table-column type="index" label="序号" width="60" fixed align="center"/>
-      <u-table-column label="数据项名称" prop="itemName" sortable="custom" align="center"/>
+    <u-table class="cy-group-items" row-key="label" use-virtual :height="uTableHeight" :data="itemDataList"
+      @selection-change="selectionLineChangeHandle" @sort-change="sortChange" :big-data-checkbox="true"
+      showBodyOverflow="title" showHeaderOverflow="title" border>
+      <u-table-column type="selection" width="55" align="center" />
+      <u-table-column type="index" label="序号" width="60" fixed align="center" />
+      <u-table-column label="数据项名称" prop="itemName" sortable="custom" align="center" />
       <template v-if="groupRunStatus">
         <u-table-column prop="dataType" sortable="custom" label="数据项类型" align="center" width="120">
         </u-table-column>
@@ -98,79 +69,54 @@
         </u-table-column>
         <u-table-column label="操作" align="center" width="180">
           <template slot-scope="scope">
-            <el-button type="text"
-                       size="small"
-                       icon="el-icon-edit"
-                       @click="handleClickByEdit(scope.row)">编辑</el-button>
-            <el-button type="text"
-                       size="small"
-                       icon="el-icon-delete"
-                       style="color: red;"
-                       @click="handleClickByDel(scope.row)">删除</el-button>
+            <el-button type="text" size="small" icon="el-icon-edit" @click="handleClickByEdit(scope.row)">编辑</el-button>
+            <el-button type="text" size="small" icon="el-icon-delete" style="color: red;"
+              @click="handleClickByDel(scope.row)">删除</el-button>
           </template>
         </u-table-column>
       </template>
     </u-table>
 
     <!-- 修改数据项基础信息 -->
-    <el-dialog
-        title="修改数据项"
-        width="600px"
-        top="10vh"
-        center
-        v-dialog-drag
-        v-if="dialogItemVisible"
-        :before-close="dialogClose"
-        :visible.sync="dialogItemVisible"
-        :close-on-click-modal="false"
-        :append-to-body="true">
+    <el-dialog title="修改数据项" width="600px" top="10vh" center v-dialog-drag v-if="dialogItemVisible"
+      :before-close="dialogClose" :visible.sync="dialogItemVisible" :close-on-click-modal="false" :append-to-body="true">
       <el-form ref="itemForm" :model="itemForm" label-width="150px">
         <el-form-item label="ID" prop="id" style="display: none;">
-          <el-input v-model='itemForm.id'
-                    type="text"
-                    auto-complete="off"></el-input>
+          <el-input v-model='itemForm.id' type="text" auto-complete="off"></el-input>
         </el-form-item>
         <el-form-item label="数据模型:" prop="dataModelId">
           <el-select v-model="itemForm.dataModelId" filterable clearable placeholder="请选择表达式" style="width: 100%;">
-            <el-option
-                v-for="(item, index) in this.dataModelList"
-                :key="index"
-                :label="item.title"
-                :value="item.id">
+            <el-option v-for="(item, index) in this.dataModelList" :key="index" :label="item.title" :value="item.id">
             </el-option>
           </el-select>
         </el-form-item>
         <el-form-item label="数据项描述信息:" prop="describe">
-          <el-input v-model.trim='itemForm.describe'
-                    type="text"
-                    auto-complete="off"
-                    show-word-limit
-                    maxlength="20"
-                    placeholder="请输入描述信息"></el-input>
+          <el-input v-model.trim='itemForm.describe' type="text" auto-complete="off" show-word-limit maxlength="20"
+            placeholder="请输入描述信息"></el-input>
         </el-form-item>
-<!--        <el-divider content-position="left" class="cy-divider">事件报表配置(以下任意一项配置为空都将会无效)</el-divider>-->
-<!--        <el-form-item label="事件驱动产生条件:" prop="eventMode">-->
-<!--          <el-radio-group v-model="itemForm.eventMode">-->
-<!--            <el-radio label="0">大于</el-radio>-->
-<!--            <el-radio label="1">小于</el-radio>-->
-<!--            <el-radio label="2">布尔类型</el-radio>-->
-<!--          </el-radio-group>-->
-<!--        </el-form-item>-->
-<!--        <el-form-item label="阈值:" prop="eventValue">-->
-<!--          <el-input v-model="itemForm.eventValue" placeholder="请输入阈值" maxlength="8">-->
-<!--          </el-input>-->
-<!--        </el-form-item>-->
-<!--        <el-form-item label="事件驱动报表:" prop="tableReportId">-->
-<!--          <el-select v-model="itemForm.tableReportId" filterable clearable-->
-<!--                     placeholder="请选择事件驱动报表" style="width: 100%;">-->
-<!--            <el-option-->
-<!--                v-for="(item, index) in this.eventReportList"-->
-<!--                :key="index"-->
-<!--                :label="item.reportTableName"-->
-<!--                :value="item.id">-->
-<!--            </el-option>-->
-<!--          </el-select>-->
-<!--        </el-form-item>-->
+        <!--        <el-divider content-position="left" class="cy-divider">事件报表配置(以下任意一项配置为空都将会无效)</el-divider>-->
+        <!--        <el-form-item label="事件驱动产生条件:" prop="eventMode">-->
+        <!--          <el-radio-group v-model="itemForm.eventMode">-->
+        <!--            <el-radio label="0">大于</el-radio>-->
+        <!--            <el-radio label="1">小于</el-radio>-->
+        <!--            <el-radio label="2">布尔类型</el-radio>-->
+        <!--          </el-radio-group>-->
+        <!--        </el-form-item>-->
+        <!--        <el-form-item label="阈值:" prop="eventValue">-->
+        <!--          <el-input v-model="itemForm.eventValue" placeholder="请输入阈值" maxlength="8">-->
+        <!--          </el-input>-->
+        <!--        </el-form-item>-->
+        <!--        <el-form-item label="事件驱动报表:" prop="tableReportId">-->
+        <!--          <el-select v-model="itemForm.tableReportId" filterable clearable-->
+        <!--                     placeholder="请选择事件驱动报表" style="width: 100%;">-->
+        <!--            <el-option-->
+        <!--                v-for="(item, index) in this.eventReportList"-->
+        <!--                :key="index"-->
+        <!--                :label="item.reportTableName"-->
+        <!--                :value="item.id">-->
+        <!--            </el-option>-->
+        <!--          </el-select>-->
+        <!--        </el-form-item>-->
       </el-form>
       <span slot='footer'>
         <el-button type="primary" @click="editConfirmEvent" style="margin-top: 20px;">确定</el-button>
@@ -178,23 +124,11 @@
       </span>
     </el-dialog>
 
-    <el-dialog
-        title="选择表达式"
-        width="500px"
-        top="10vh"
-        center
-        v-dialog-drag
-        v-if="dialogDataModelVisible"
-        :before-close="dialogDataModelClose"
-        :visible.sync="dialogDataModelVisible"
-        :close-on-click-modal="false"
-        :append-to-body="true">
+    <el-dialog title="选择表达式" width="500px" top="10vh" center v-dialog-drag v-if="dialogDataModelVisible"
+      :before-close="dialogDataModelClose" :visible.sync="dialogDataModelVisible" :close-on-click-modal="false"
+      :append-to-body="true">
       <el-select v-model="chooseDataModel" filterable clearable placeholder="请选择表达式" style="width: 100%;">
-        <el-option
-            v-for="(item, index) in this.dataModelList"
-            :key="index"
-            :label="item.title"
-            :value="item.id">
+        <el-option v-for="(item, index) in this.dataModelList" :key="index" :label="item.title" :value="item.id">
         </el-option>
       </el-select>
       <div style="width: 100%; text-align: center; margin-top: 20px;">
@@ -204,7 +138,8 @@
     </el-dialog>
 
     <!-- 选择数据项 -->
-    <data-source-item ref="dataSourceItem" @update-message="updateDataItemEmit" :chooseGroup="chooseGroup"></data-source-item>
+    <data-source-item ref="dataSourceItem" @update-message="updateDataItemEmit"
+      :chooseGroup="chooseGroup"></data-source-item>
 
   </div>
 </template>
@@ -220,7 +155,7 @@ import {
   getItemValueById,
   updateItem
 } from "@/api/datasource";
-import {customCompare, showAlertMsgWin, showAlertWin, showConfirmWin, showLoading} from "@/utils/cqcy";
+import { customCompare, showAlertMsgWin, showAlertWin, showConfirmWin, showLoading } from "@/utils/cqcy";
 import cqcyCode from "@/utils/cqcyCode";
 import DataSourceItem from "@/components/CustomDialog/DataSourceItem.vue";
 
@@ -323,7 +258,7 @@ export default {
         let list = res.data
         if (!list) return
         // 避免布尔类型时页面无法显示数据
-        for (let i = 0; i < list.length; i ++) {
+        for (let i = 0; i < list.length; i++) {
           list[i].dataValue += ''
           list[i].quality += ''
         }
@@ -344,7 +279,7 @@ export default {
           // this.filterItemText = ''
           let list = res.data
           // 避免布尔类型时页面无法显示数据
-          for (let i = 0; i < list.length; i ++) {
+          for (let i = 0; i < list.length; i++) {
             list[i].dataValue += ''
             list[i].quality += ''
           }
@@ -406,10 +341,10 @@ export default {
       getAllDataModel(params).then(res => {
         loading.close()
         this.dataModelList = res.data.dataModelList
-        for (let i = 0; i < this.dataModelList.length; i ++) {
+        for (let i = 0; i < this.dataModelList.length; i++) {
           this.dataModelList[i].title = this.dataModelList[i].remark
-              ? ('【' + this.dataModelList[i].remark + '】' + this.dataModelList[i].operationRule)
-              : this.dataModelList[i].operationRule
+            ? ('【' + this.dataModelList[i].remark + '】' + this.dataModelList[i].operationRule)
+            : this.dataModelList[i].operationRule
         }
         if (callback) callback(true)
       }).catch((e) => {
@@ -567,18 +502,19 @@ export default {
     },
     /** 添加数据项 */
     addGroupItemEvent() {
-        const loading = showLoading(this, '加载中,请稍候···')
-        getItemGroupById(this.chooseGroupId).then(res => {
-            loading.close()
-            if (res.data.runState == 1) {
-                showAlertMsgWin(this, null, '该数据组正在运行中,禁止添加数据项!')
-            } else {
-                this.$refs.dataSourceItem.show()
-            }
-        }).catch((e) => {
-            loading.close()
-            showAlertWin(this, null, e)
-        })
+      const loading = showLoading(this, '加载中,请稍候···')
+      getItemGroupById(this.chooseGroupId).then(res => {
+        loading.close()
+        if (res.data.runState == 1) {
+          showAlertMsgWin(this, null, '该数据组正在运行中,禁止添加数据项!')
+        } else {
+          this.$refs.dataSourceItem.groupBasicForm.itemList = res.data.itemList
+          this.$refs.dataSourceItem.show()
+        }
+      }).catch((e) => {
+        loading.close()
+        showAlertWin(this, null, e)
+      })
     },
     /** 批量设置组数据中数据项表达式 */
     saveDataModelEvent() {
@@ -656,7 +592,7 @@ export default {
     },
     /** 数据模型弹出层关闭事件 */
     dialogDataModelClose(done) {
-      if (typeof(done) === 'function') {
+      if (typeof (done) === 'function') {
         done()
       } else {
         this.dialogDataModelVisible = false
@@ -667,12 +603,13 @@ export default {
 </script>
 
 <style rel="stylesheet/scss" lang="scss">
-.el-table--enable-row-hover .el-table__body tr:hover > td {
+.el-table--enable-row-hover .el-table__body tr:hover>td {
   background-color: transparent !important;
 }
 
 .cy-divider {
   margin-top: 50px;
+
   .el-divider__text {
     font-size: 12px;
     color: #5e5e5e;

+ 3 - 0
cqcy-ei/cqcy-ei-da/src/main/resources/application.yml

@@ -1,3 +1,6 @@
+server:
+  max-http-header-size: 10MB
+  
 spring:
   profiles:
     active: @spring.profiles.active@

Unele fișiere nu au fost afișate deoarece prea multe fișiere au fost modificate în acest diff