소스 검색

更新点位标签内容,更新配置信息点内容

chuwu 6 년 전
부모
커밋
ab31e49153
58개의 변경된 파일11712개의 추가작업 그리고 153개의 파일을 삭제
  1. 77 70
      build/webpack.base.conf.js
  2. 81 57
      config/index.js
  3. 3 0
      package.json
  4. 3 0
      src/api/scan/config.js
  5. 30 0
      src/api/scan/fetch.js
  6. 50 0
      src/api/scan/httpUtil.js
  7. 764 0
      src/api/scan/request.js
  8. 477 0
      src/assets/css/jsmind.css
  9. 2934 0
      src/assets/js/jsmind.js
  10. 120 0
      src/assets/scss/point/point_config/common.scss
  11. 474 0
      src/assets/scss/point/point_config/reset.scss
  12. 244 0
      src/components/common/handsontable.vue
  13. 73 0
      src/components/common/jsmind.vue
  14. 49 0
      src/components/common/search_input.vue
  15. 65 0
      src/components/config_point/cut_string.vue
  16. 83 0
      src/components/config_point/data_origin.vue
  17. 223 0
      src/components/config_point/examine_main.vue
  18. 285 0
      src/components/config_point/find_keyword.vue
  19. 185 0
      src/components/config_point/ip_input.vue
  20. 156 0
      src/components/config_point/location_flag.vue
  21. 97 0
      src/components/config_point/select_one.vue
  22. 94 0
      src/components/config_point/step3_edit/auto_handle.vue
  23. 129 0
      src/components/config_point/step3_edit/enum_handle.vue
  24. 119 0
      src/components/config_point/step3_edit/formula_handle.vue
  25. 430 0
      src/components/config_point/step3_edit/index.vue
  26. 43 0
      src/components/config_point/step3_edit/no_handle.vue
  27. 182 0
      src/components/config_point/step3_edit/split_handle.vue
  28. 141 0
      src/components/config_point/step3_point/3_identify.vue
  29. 259 0
      src/components/config_point/step3_point/3_temps.vue
  30. 195 0
      src/components/config_point/step3_point/dialog_main.vue
  31. 135 0
      src/components/config_point/step3_point/steps3_main.vue
  32. 126 0
      src/components/echarts/doughnut.vue
  33. 75 0
      src/components/el_pack/dialog.vue
  34. 12 0
      src/fetch/data_plat.js
  35. 40 0
      src/fetch/fetch.js
  36. 7 0
      src/fetch/index.js
  37. 269 0
      src/fetch/point_http.js
  38. 116 0
      src/fetch/request.js
  39. 1 1
      src/framework/layout/Main.vue
  40. 3 7
      src/framework/style/theme.scss
  41. 7 7
      src/main.js
  42. 18 8
      src/router/sagacloud.js
  43. 5 3
      src/store/index.js
  44. 42 0
      src/store/moudles/project.js
  45. 185 0
      src/utils/handsontable/delType.js
  46. 213 0
      src/utils/point_edit/handson_header.js
  47. 36 0
      src/utils/point_edit/steps2.js
  48. 57 0
      src/utils/point_edit/steps3.js
  49. 37 0
      src/utils/tools.js
  50. 194 0
      src/views/point/config_point/edit_origin/index.vue
  51. 108 0
      src/views/point/config_point/index.vue
  52. 17 0
      src/views/point/config_point/steps/collection.vue
  53. 102 0
      src/views/point/config_point/steps/index.vue
  54. 227 0
      src/views/point/config_point/steps/step1.vue
  55. 219 0
      src/views/point/config_point/steps/step2.vue
  56. 151 0
      src/views/point/config_point/steps/step3.vue
  57. 282 0
      src/views/point/config_point/steps/step4.vue
  58. 963 0
      src/views/project_setting/collection_setting.vue

+ 77 - 70
build/webpack.base.conf.js

@@ -3,80 +3,87 @@ const path = require('path')
 const utils = require('./utils')
 const config = require('../config')
 const vueLoaderConfig = require('./vue-loader.conf')
+const webpack = require('webpack')
 
-function resolve (dir) {
-  return path.join(__dirname, '..', dir)
+function resolve(dir) {
+    return path.join(__dirname, '..', dir)
 }
 
 
 
 module.exports = {
-  context: path.resolve(__dirname, '../'),
-  entry: {
-    app: './src/main.js'
-  },
-  output: {
-    path: config.build.assetsRoot,
-    filename: '[name].js',
-    publicPath: process.env.NODE_ENV === 'production'
-      ? config.build.assetsPublicPath
-      : config.dev.assetsPublicPath
-  },
-  resolve: {
-    extensions: ['.js', '.vue', '.json'],
-    alias: {
-      'vue$': 'vue/dist/vue.esm.js',
-      '@': resolve('src'),
-    }
-  },
-  module: {
-    rules: [
-      {
-        test: /\.vue$/,
-        loader: 'vue-loader',
-        options: vueLoaderConfig
-      },
-      {
-        test: /\.js$/,
-        loader: 'babel-loader',
-        include: [resolve('src'), resolve('test'), resolve('node_modules/webpack-dev-server/client')]
-      },
-      {
-        test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
-        loader: 'url-loader',
-        options: {
-          limit: 10000,
-          name: utils.assetsPath('img/[name].[hash:7].[ext]')
-        }
-      },
-      {
-        test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/,
-        loader: 'url-loader',
-        options: {
-          limit: 10000,
-          name: utils.assetsPath('media/[name].[hash:7].[ext]')
-        }
-      },
-      {
-        test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/,
-        loader: 'url-loader',
-        options: {
-          limit: 10000,
-          name: utils.assetsPath('fonts/[name].[hash:7].[ext]')
+    context: path.resolve(__dirname, '../'),
+    entry: {
+        app: './src/main.js'
+    },
+    output: {
+        path: config.build.assetsRoot,
+        filename: '[name].js',
+        publicPath: process.env.NODE_ENV === 'production' ?
+            config.build.assetsPublicPath : config.dev.assetsPublicPath
+    },
+    resolve: {
+        extensions: ['.js', '.vue', '.json'],
+        alias: {
+            'vue$': 'vue/dist/vue.esm.js',
+            '@': resolve('src'),
+            'jquery': 'jquery',
         }
-      }
-    ]
-  },
-  node: {
-    // prevent webpack from injecting useless setImmediate polyfill because Vue
-    // source contains it (although only uses it if it's native).
-    setImmediate: false,
-    // prevent webpack from injecting mocks to Node native modules
-    // that does not make sense for the client
-    dgram: 'empty',
-    fs: 'empty',
-    net: 'empty',
-    tls: 'empty',
-    child_process: 'empty'
-  }
-}
+    },
+    // 增加一个plugins
+    plugins: [
+        new webpack.ProvidePlugin({
+            $: "jquery",
+            jQuery: "jquery"
+        })
+    ],
+    module: {
+        rules: [{
+                test: /\.vue$/,
+                loader: 'vue-loader',
+                options: vueLoaderConfig
+            },
+            {
+                test: /\.js$/,
+                loader: 'babel-loader',
+                include: [resolve('src'), resolve('test'), resolve('node_modules/webpack-dev-server/client')]
+            },
+            {
+                test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
+                loader: 'url-loader',
+                options: {
+                    limit: 10000,
+                    name: utils.assetsPath('img/[name].[hash:7].[ext]')
+                }
+            },
+            {
+                test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/,
+                loader: 'url-loader',
+                options: {
+                    limit: 10000,
+                    name: utils.assetsPath('media/[name].[hash:7].[ext]')
+                }
+            },
+            {
+                test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/,
+                loader: 'url-loader',
+                options: {
+                    limit: 10000,
+                    name: utils.assetsPath('fonts/[name].[hash:7].[ext]')
+                }
+            }
+        ]
+    },
+    node: {
+        // prevent webpack from injecting useless setImmediate polyfill because Vue
+        // source contains it (although only uses it if it's native).
+        setImmediate: false,
+        // prevent webpack from injecting mocks to Node native modules
+        // that does not make sense for the client
+        dgram: 'empty',
+        fs: 'empty',
+        net: 'empty',
+        tls: 'empty',
+        child_process: 'empty'
+    }
+}

+ 81 - 57
config/index.js

@@ -5,71 +5,95 @@
 const path = require('path')
 
 module.exports = {
-  dev: {
-    // Paths
-    assetsSubDirectory: 'static',
-    assetsPublicPath: '/',
-    proxyTable: {
-      '/admin': {
-        target: 'http://localhost:52009',
-        changeOrigin: true,
-        pathRewrite: {
-          // "^/apis": ""
-        }
-      }
-    },
+    dev: {
+        // Paths
+        assetsSubDirectory: 'static',
+        assetsPublicPath: '/',
+        proxyTable: {
+            '/admin': {
+                target: 'http://localhost:52009',
+                changeOrigin: true,
+                pathRewrite: {
+                    // "^/apis": ""
+                }
+            },
+            '/data-platform-3': {
+                // 目标 API 地址
+                target: 'http://192.168.20.225:8080/',
+                // 如果要代理 websockets
+                ws: true,
+                // 将主机标头的原点更改为目标URL
+                changeOrigin: false
+            },
+            '/pointconfig': {
+                // 目标 API 地址
+                target: 'http://172.16.0.141:8080/',
+                // 如果要代理 websockets
+                ws: true,
+                // 将主机标头的原点更改为目标URL
+                changeOrigin: false
+            },
+            '/ScanBuilding': {
+                // 目标 API 地址
+                target: 'http://172.16.0.141:8080/',
+                // 如果要代理 websockets
+                ws: true,
+                // 将主机标头的原点更改为目标URL
+                changeOrigin: false
+            },
+        },
 
-    // Various Dev Server settings
-    host: 'localhost', // can be overwritten by process.env.HOST
-    port: 8080, // can be overwritten by process.env.PORT, if port is in use, a free one will be determined
-    autoOpenBrowser: false,
-    errorOverlay: true,
-    notifyOnErrors: true,
-    poll: false, // https://webpack.js.org/configuration/dev-server/#devserver-watchoptions-
+        // Various Dev Server settings
+        host: '0.0.0.0', // can be overwritten by process.env.HOST
+        port: 8080, // can be overwritten by process.env.PORT, if port is in use, a free one will be determined
+        autoOpenBrowser: false,
+        errorOverlay: true,
+        notifyOnErrors: true,
+        poll: false, // https://webpack.js.org/configuration/dev-server/#devserver-watchoptions-
 
-    /**
-     * Source Maps
-     */
+        /**
+         * Source Maps
+         */
 
-    // https://webpack.js.org/configuration/devtool/#development
-    devtool: 'cheap-module-eval-source-map',
+        // https://webpack.js.org/configuration/devtool/#development
+        devtool: 'cheap-module-eval-source-map',
 
-    // If you have problems debugging vue-files in devtools,
-    // set this to false - it *may* help
-    // https://vue-loader.vuejs.org/en/options.html#cachebusting
-    cacheBusting: true,
+        // If you have problems debugging vue-files in devtools,
+        // set this to false - it *may* help
+        // https://vue-loader.vuejs.org/en/options.html#cachebusting
+        cacheBusting: true,
 
-    cssSourceMap: true
-  },
+        cssSourceMap: true
+    },
 
-  build: {
-    // Template for index.html
-    index: path.resolve(__dirname, '../dist/index.html'),
+    build: {
+        // Template for index.html
+        index: path.resolve(__dirname, '../dist/index.html'),
 
-    // Paths
-    assetsRoot: path.resolve(__dirname, '../dist'),
-    assetsSubDirectory: 'static',
-    assetsPublicPath: '/',
+        // Paths
+        assetsRoot: path.resolve(__dirname, '../dist'),
+        assetsSubDirectory: 'static',
+        assetsPublicPath: '/',
 
-    /**
-     * Source Maps
-     */
+        /**
+         * Source Maps
+         */
 
-    productionSourceMap: true,
-    // https://webpack.js.org/configuration/devtool/#production
-    devtool: '#source-map',
+        productionSourceMap: true,
+        // https://webpack.js.org/configuration/devtool/#production
+        devtool: '#source-map',
 
-    // Gzip off by default as many popular static hosts such as
-    // Surge or Netlify already gzip all static assets for you.
-    // Before setting to `true`, make sure to:
-    // npm install --save-dev compression-webpack-plugin
-    productionGzip: false,
-    productionGzipExtensions: ['js', 'css'],
+        // Gzip off by default as many popular static hosts such as
+        // Surge or Netlify already gzip all static assets for you.
+        // Before setting to `true`, make sure to:
+        // npm install --save-dev compression-webpack-plugin
+        productionGzip: false,
+        productionGzipExtensions: ['js', 'css'],
 
-    // Run the build command with an extra argument to
-    // View the bundle analyzer report after build finishes:
-    // `npm run build --report`
-    // Set to `true` or `false` to always turn it on or off
-    bundleAnalyzerReport: process.env.npm_config_report
-  }
-}
+        // Run the build command with an extra argument to
+        // View the bundle analyzer report after build finishes:
+        // `npm run build --report`
+        // Set to `true` or `false` to always turn it on or off
+        bundleAnalyzerReport: process.env.npm_config_report
+    }
+}

+ 3 - 0
package.json

@@ -14,7 +14,10 @@
     "echarts": "^4.1.0",
     "element-ui": "^2.6.1",
     "font-awesome": "^4.7.0",
+    "handsontable-pro": "^6.2.3",
+    "jquery": "^3.3.1",
     "vue": "^2.5.2",
+    "vue-axios": "^2.1.4",
     "vue-router": "^3.0.1",
     "vuex": "^3.1.0"
   },

+ 3 - 0
src/api/scan/config.js

@@ -0,0 +1,3 @@
+export const api = '/ScanBuilding';
+export const sass = 'sass';
+export const physics = '/data-platform-3';

+ 30 - 0
src/api/scan/fetch.js

@@ -0,0 +1,30 @@
+import Vue from 'vue'
+import axios from 'axios'
+import vueAxios from 'vue-axios'
+
+Vue.use(vueAxios, axios)
+    //创建实例
+
+const service = axios.create({
+    timeout: 3000000, //请求时间超出
+    withCredentials: true, //是否跨站点访问控制请求
+})
+
+//request拦截
+service.interceptors.request.use(config => {
+    return config
+}, error => {
+    console.log(error)
+    Promise.reject(error)
+})
+
+//response拦截器
+service.interceptors.response.use(
+    response => response,
+    error => {
+        console.log('err' + error)
+        return Promise.reject(error)
+    }
+)
+
+export default service

+ 50 - 0
src/api/scan/httpUtil.js

@@ -0,0 +1,50 @@
+import { Message } from 'element-ui';
+import fetch from './fetch'
+
+function successResponse(vm, response, success, failed) {
+    let resp = response.data;
+    let result = resp.result ? resp.result : resp.Result;
+
+    if (result === 'success') {
+        if (success) {
+            success(resp);
+        }
+    } else {
+        let msg = resp.message ? resp.message : resp.ResultMsg || resp.resultMsg;
+        Message.error({ message: msg });
+        if (failed) {
+            failed(resp);
+        }
+    }
+
+}
+
+function errorResponse(vm, response, err) {
+    let json = JSON.stringify(response)
+    json = JSON.parse(json)
+    console.error(response)
+    if (err) {
+        Message.error({ message: '接口:' + json.config.url + '请求错误' })
+    } else {
+        Message.error({ message: '请求错误' });
+    }
+}
+
+export default {
+    getJson: function(url, data, success, failed, err) {
+        let vm = this;
+        fetch({ url: url, method: 'get', params: data }).then((response) => {
+            successResponse(vm, response, success, failed)
+        }).catch(error => {
+            errorResponse(vm, error, err);
+        });
+    },
+    postJson: function(url, data, success, failed, err) {
+        let vm = this;
+        fetch({ url: url, method: 'post', data: data }).then((response) => {
+            successResponse(vm, response, success, failed)
+        }).catch(error => {
+            errorResponse(vm, error, err);
+        });
+    }
+}

+ 764 - 0
src/api/scan/request.js

@@ -0,0 +1,764 @@
+import fetch from './fetch'
+import { api, physics } from './config'
+import http from './httpUtil'
+let arithmetic = '/arithmetic'
+
+var Comming = 'revit'
+var ProjId = 'Pj1101080001'
+var UserId = '25518428919955458'
+    //获取打印标签模板test
+export function getTest() {
+    return fetch({ method: 'GET', url: `${api}/service/template/note_template` })
+}
+
+//查看扫楼日志接口
+
+export function getBuildLog(
+    param
+) {
+    let data = {
+        "BeginTime": param.startTime,
+        "Comming": Comming,
+        "EndTime": param.endTime,
+        "Filter": param.filter,
+        "PageNum": param.pageNum,
+        "PageSize": param.pageSize,
+        "ProjId": param.ProjId,
+        "UserId": param.UserId
+    }
+    return fetch({ method: 'POST', url: `${api}/service/user_log/query`, data })
+}
+
+//下载扫楼日志接口
+
+export function dowmloadLog(
+    param
+) {
+    let data = {
+        "BeginTime": param.startTime,
+        "Comming": Comming,
+        "EndTime": param.endTime,
+        "Filter": param.filter,
+        "ProjId": param.ProjId,
+        "UserId": param.UserId
+    }
+    return fetch({ method: 'POST', url: `${api}/service/user_log/export`, data })
+}
+
+//获取扫楼用户表格
+export function getUser(
+    param
+) {
+    let data = {
+        "Comming": Comming,
+        "Filter": param.filter,
+        "PageNum": param.pageNum,
+        "PageSize": param.pageSize,
+        "ProjId": param.ProjId,
+        "UserId": param.UserId
+    }
+    return fetch({ method: 'POST', url: `${api}/service/user/query`, data })
+}
+
+//修改扫楼用户
+export function loadUser(
+    param
+) {
+    let data = {
+        "Comming": Comming,
+        "ProjId": param.ProjId,
+        "UserId": param.UserId,
+        "UserList": param.UserList
+    }
+    return fetch({ method: 'POST', url: `${api}/service/user/update`, data })
+}
+
+//删除扫楼用户
+export function delUser(
+    param
+) {
+    let data = {
+        "Comming": Comming,
+        "ProjId": param.ProjId,
+        "UserId": param.UserId,
+        "UserList": param.UserList
+    }
+    return fetch({ method: 'POST', url: `${api}/service/user/delete`, data })
+}
+
+//添加扫楼用户
+export function addUser(
+    param
+) {
+    let data = {
+        "Comming": Comming,
+        "ProjId": param.ProjId,
+        "UserId": param.UserId,
+        "User": param.User
+    }
+    return fetch({ method: 'POST', url: `${api}/service/user/create`, data })
+}
+
+//根据项目ID获得建筑列表
+export function getBuildSelect(param) {
+    let data = {
+        "Comming": Comming,
+        "ProjId": param.ProjId,
+        "UserId": param.UserId,
+    }
+    return fetch({ method: 'POST', url: `${api}/service/building/query`, data })
+}
+
+//根据建筑ID获取楼层系信息
+export function getFloor(param) {
+    let data = {
+        "Comming": Comming,
+        "ProjId": param.ProjId,
+        "UserId": param.UserId,
+        "BuildId": param.BuildId
+    }
+    return fetch({ method: 'POST', url: `${api}/service/building/floor`, data })
+}
+
+//获取异常资产接口
+export function getErrAssets(param) {
+    let data = {
+        "Comming": Comming,
+        "ProjId": param.ProjId,
+        "UserId": param.UserId,
+        "BuildId": param.BuildId,
+        "PageNum": param.PageNum,
+        "PageSize": param.PageSize,
+        "Type": param.Type,
+        "CodeType": param.CodeType
+    }
+    if (param.BuildId == 'all') {
+        delete data.BuildId
+    }
+
+    if (!param.CodeType) {
+        delete data.CodeType
+    }
+    return fetch({ method: 'POST', url: `${api}/service/fm/exception`, data })
+}
+
+//删除资产接口
+export function delErrAssets(param, paramList) {
+    let data = {
+        "Comming": Comming,
+        "ProjId": param.ProjId,
+        "UserId": param.UserId,
+        "FmList": paramList
+    }
+    return fetch({ method: 'POST', url: `${api}/service/fm/delete`, data })
+}
+
+//根据选择的建筑楼层时间查询点位标签
+export function getPT(param) {
+    let data = {
+        "Comming": Comming,
+        "BeginTime": param.BeginTime,
+        "ProjId": param.ProjId,
+        "UserId": param.UserId,
+        "BeginTime": param.BeginTime,
+        "EndTime": param.EndTime,
+        "BuildId": param.BuildId,
+        "FloorId": param.FloorId
+    }
+    if (data.FloorId == 'all') {
+        delete data.FloorId
+    }
+    return fetch({ method: 'POST', url: `${api}/service/fm/point_group`, data })
+}
+
+//点位标签查看详情
+export function getPoint(param) {
+    let data = {
+        "Comming": Comming,
+        "ProjId": param.ProjId,
+        "UserId": param.UserId,
+        "PointId": param.PointId,
+    }
+    return fetch({ method: 'POST', url: `${api}/service/point/query`, data })
+}
+
+//点位标签详情修改
+export function updatePoint(param) {
+    let data = {
+        "Comming": Comming,
+        "ProjId": param.ProjId,
+        "UserId": param.UserId,
+        "PointList": [param.PointList],
+    }
+    return fetch({ method: 'POST', url: `${api}/service/point/update`, data })
+}
+
+//点击点位标签获取tab设备族列表 
+export function getTabFamily(param) {
+    let data = {
+        "Comming": Comming,
+        "ProjId": param.ProjId,
+        "UserId": param.UserId,
+        "BeginTime": param.BeginTime,
+        "EndTime": param.EndTime,
+        "FloorId": param.FloorId,
+        "Checked": param.Checked,
+        "BuildId": param.BuildId,
+        "PointId": param.PointId
+    }
+    if (data.PointId == 'all') {
+        delete data.PointId
+    }
+    if (data.FloorId == 'all') {
+        delete data.FloorId
+    }
+    return fetch({ method: 'POST', url: `${api}/service/fm/family_list`, data })
+}
+
+//获取表格数据的title
+export function getTableHeader(param) {
+    let data = {
+        "AppType": Comming,
+        "Code": param.code,
+        "ProjId": param.ProjId
+    }
+    return fetch({ method: 'POST', url: `${api}/service/dict/infocode_query`, data })
+}
+
+//获取表格主体内容
+export function getTableMain(param) {
+    let data = {
+        "BeginTime": param.BeginTime,
+        "BuildId": param.BuildId,
+        "Checked": param.Checked,
+        "Comming": Comming,
+        "EndTime": param.EndTime,
+        "Family": param.Family,
+        "FloorId": param.FloorId,
+        "PageNum": param.PageNum,
+        "PageSize": param.PageSize,
+        "PointId": param.PointId,
+        "ProjId": param.ProjId,
+        "UserId": param.UserId
+    }
+    if (data.PointId == 'all') {
+        delete data.PointId
+    }
+    if (data.Checked === '') {
+        delete data.Checked
+    }
+    return fetch({ method: 'POST', url: `${api}/service/fm/query`, data })
+}
+
+export function getPointList(param, success) {
+    let url = `${api}/service/point/queryByIdList`
+    let data = param
+    data.Comming = Comming
+    http.postJson(url, data, success)
+}
+
+export function getdelMain(param) {
+    let data = {
+        "BeginTime": param.BeginTime,
+        "BuildId": param.BuildId,
+        "Checked": param.Checked,
+        "CodeType": param.CodeType,
+        "Comming": Comming,
+        "EndTime": param.EndTime,
+        "Family": param.Family,
+        "FloorId": param.FloorId,
+        "PageNum": param.PageNum,
+        "PageSize": param.PageSize,
+        "PointId": param.PointId,
+        "ProjId": param.ProjId,
+        "UserId": param.UserId
+    }
+    if (data.PointId == 'all') {
+        delete data.PointId
+    }
+    if (data.Checked === '') {
+        delete data.Checked
+    }
+    if (data.FloorId == 'all') {
+        delete data.FloorId
+    }
+    return fetch({ method: 'POST', url: `${api}/service/fm/queryRevit`, data })
+}
+
+export function getTestEquire() {
+    let data = {
+        "Comming": "revit",
+        "FloorId": "Fl110108000327d8f006c39f49feb40e24a7ef223232",
+        "ProjId": "Pj1101080003",
+        "UserId": "string"
+    }
+    return fetch({ method: 'POST', url: `${api}/service/fm/query`, data })
+}
+
+//批量更新表格数据
+export function upDateTableMain(param, paramList) {
+    let data = {
+        "Comming": Comming,
+        "FmList": paramList,
+        "ProjId": param.ProjId,
+        "UserId": param.UserId
+    }
+    return fetch({ method: 'POST', url: `${api}/service/fm/update`, data })
+}
+
+//获取所有设备族/service/dict/equipment_family
+export function getAllFamily() {
+    return fetch({ method: 'GET', url: `${api}/service/dict/equipment_family` })
+}
+
+//获取当前默认楼层/service/fm/default_floor
+export function defaultFloor(param) {
+    let data = {
+        "Comming": Comming,
+        "ProjId": param.ProjId,
+        "UserId": param.UserId
+    }
+    return fetch({ method: 'POST', url: `${api}/service/fm/default_floor`, data })
+}
+
+//物理世界新建岗位(设备系统)
+export function createPost(param) {
+    let data = {
+        "building_id": param.BuildId,
+        "floor_id": param.BIMID,
+        "equipment_category": param.category,
+        "infos": {
+            "BIMID": [
+                { "value": param.BIMID }
+            ],
+            "BIMLocation": [
+                { "value": param.BIMLocation }
+            ]
+        }
+    }
+    return fetch({ method: 'POST', url: `${physics}/godhand/equipment/create?projectId=${param.perjectId}&secret=${param.secret}`, data })
+}
+
+
+//物理世界新建岗位(部件)
+export function createComponent(param) {
+    let data = {
+        "building_id": param.BuildId,
+        "component_category": param.category,
+        "floor_id": param.BIMID,
+        "infos": {
+            "BIMID": [
+                { "value": param.BIMID }
+            ],
+            "BIMLocation": [
+                { "value": param.BIMLocation }
+            ]
+        }
+    }
+    return fetch({ method: 'POST', url: `${physics}/component/create?projectId=${param.perjectId}&secret=${param.secret}`, data })
+}
+
+//通过岗位id查询元空间id
+export function getSpaceId(param) {
+    let data = {
+        "criterias": param.list
+    }
+    return fetch({ method: 'POST', url: `${physics}/relation/query?projectId=${param.perjectId}&secret=${param.secret}`, data })
+}
+
+//通过元空间id查询元空间名称
+export function getSpaceName(param) {
+    let data = {
+        "criterias": param.list
+    }
+    return fetch({ method: 'POST', url: `${physics}/object/batch_query?projectId=${param.perjectId}&secret=${param.secret}`, data })
+}
+
+
+//设备族修改显示接口
+export function setHeader(param) {
+    let data = {
+        "Comming": Comming,
+        "InfoType": param.FamilyId,
+        "InfopointCode": param.code,
+        "ProjId": param.perjectId,
+        "UserId": param.UserId,
+        "Visible": param.Visible
+    }
+    return fetch({ method: 'POST', url: `${api}/service/dict/infopoint_visible`, data })
+}
+
+//获取头部接口
+export function getHeader(param) {
+    let data = {
+            "AppType": Comming,
+            "Code": param.code,
+            "ProjId": param.perjectId
+        }
+        // return fetch({ method: 'POST', url: `${api}/service/dict/equipment_family_info_header`, data })
+    return fetch({ method: 'POST', url: `${api}/service/dict/infocode_query_header`, data })
+}
+
+
+/** 业务空间相关 */
+
+// 业务空间
+export function getSpaceHeader(param) {
+    return fetch({ method: 'GET', url: `${physics}/infocode/query_property?projectId=${param.ProjId}&type=${param.code ? param.code : 'space'}&enrich=true` })
+}
+
+
+//获取某个业务空间下的
+export function getAllbusiness(param) {
+    let data = null
+    if (!!param.id) {
+        data = {
+            "criteria": {
+                "id": param.id,
+                "type": param.type
+            }
+        }
+    } else {
+        data = param.data
+    }
+    return fetch({ method: "POST", url: `${physics}/object/subset_query?projectId=${param.ProjId}&secret=${param.secret}`, data })
+}
+
+//通过BIMID获取物理世界id
+export function formBIMToPri(param) {
+    let data = {
+        "criteria": {
+            "type": param.type,
+            "BIMID": param.ids
+        }
+    }
+    return fetch({ method: "POST", url: `${physics}/fast/object/in_query?projectId=${param.ProjId}&secret=${param.secret}`, data })
+}
+
+//获取业务空间楼层的关系
+export function getSpaceFloor(param) {
+    return fetch({ method: "POST", url: `${physics}/business-space/floor/tree?projectId=${param.ProjId}&secret=${param.secret}` })
+}
+
+//创建业务空间
+export function createBusiness(param) {
+    let data = param.data
+    return fetch({ method: "POST", url: `${physics}/space/create?projectId=${param.ProjId}&secret=${param.secret}`, data })
+        // return fetch({ method: "POST", url: `/test/space/create?projectId=${param.ProjId}&secret=${param.secret}`, data })
+}
+
+//批量创建业务空间
+export function createBusinessList(param) {
+    let data = param.data
+    return fetch({ method: "POST", url: `${physics}/space/batch/create?projectId=${param.ProjId}&secret=${param.secret}`, data })
+}
+
+//更新业务空间
+export function updateBusiness(param) {
+    let data = param.data
+    return fetch({ method: "POST", url: `${physics}/object/batch_update?projectId=${param.ProjId}&secret=${param.secret}`, data })
+}
+
+//模糊搜索设备类型
+export function searchCode(param) {
+    let data = param
+    return fetch({ method: "POST", url: `${physics}/dict/query/equipment_all`, data })
+}
+
+//获取所有设备类型
+export function getEqCode() {
+    return fetch({ method: "GET", url: `${physics}/dict/query/equipment_all` })
+}
+
+//批量删除业务空间
+export function delManySpace(param) {
+    let data = param.data
+    return fetch({ method: "POST", url: `${physics}/space/batch/delete?projectId=${param.ProjId}&secret=${param.secret}`, data })
+}
+
+//添加关系
+export function createRelation(param) {
+    let data = param.data
+    return fetch({ method: "POST", url: `${physics}/relation/create?projectId=${param.ProjId}&secret=${param.secret}`, data })
+}
+
+//获取图实例关系
+export function getGraphyId(param) {
+    let data = {
+        "graph_type": param.type
+    }
+    return fetch({ method: "POST", url: `${physics}/relation/graph_instance/get?projectId=${param.ProjId}&secret=${param.secret}`, data })
+}
+
+//查询业务空间
+export function getBussines(param) {
+    let data = param.data
+    return fetch({ method: "POST", url: `${physics}/object/outside_query?projectId=${param.ProjId}&secret=${param.secret}`, data })
+        // return fetch({ method: "POST", url: `/test/object/outside_query?projectId=${param.ProjId}&secret=${param.secret}`, data })
+}
+
+//替代前一个接口
+export function getBussines2(param) {
+    let data = param.data
+    return fetch({ method: "POST", url: `${physics}/fast/object/in_query?projectId=${param.ProjId}&secret=${param.secret}`, data })
+}
+
+//查询业务空间下的元空间
+export function getRelation(param) {
+    let data = param.criterias
+    return fetch({ method: 'POST', url: `${physics}/relation/query?projectId=${param.ProjId}&secret=${param.secret}`, data })
+}
+
+//查询业务空间下的设备
+export function getSpaceEquip(param) {
+    let data = param.data
+    return fetch({ method: 'POST', url: `${physics}/business-space/space/equip/query?projectId=${param.ProjId}&secret=${param.secret}`, data })
+}
+
+//删除关系实例
+export function deleteRelation(param) {
+    let data = param.data
+    return fetch({ method: 'POST', url: `${physics}/relation/delete?projectId=${param.ProjId}&secret=${param.secret}`, data })
+}
+
+//查询是否关联元空间的业务空间
+export function isSpaceBuss(param) {
+    let data = param.data
+    return fetch({ method: 'POST', url: `${physics}/business-space/floor/space/query?projectId=${param.ProjId}&secret=${param.secret}`, data })
+}
+
+//查询所有提示
+export function getAllMess(param) {
+    let data = {}
+    return fetch({ method: 'POST', url: `${physics}/space/affected/query?projectId=${param.ProjId}&secret=${param.secret}`, data })
+}
+
+//删除提示
+export function deleteNotice(param) {
+    let data = param.data
+    return fetch({ method: 'POST', url: `${physics}/space/affected/delete_notice?projectId=${param.ProjId}&secret=${param.secret}`, data })
+}
+
+//模糊查询楼层下的设备
+export function getEquipSearch(param) {
+    let data = param.data
+    return fetch({ method: 'POST', url: `${physics}/business-space/floor/equip/query?projectId=${param.ProjId}&secret=${param.secret}`, data })
+}
+
+export function getBussTypes(success) {
+    http.getJson(`${physics}/infocode/business_space_type/query`, {}, success)
+}
+
+export function getBussTypes2() {
+    return fetch({ method: 'GET', url: `${physics}/infocode/business_space_type/query` })
+}
+
+
+
+
+//验证元空间是否相邻
+export function isAbut(param) {
+    let data = param.data
+    return fetch({ method: 'POST', url: `${physics}/business-space/space/abut?projectId=${param.ProjId}&secret=${param.secret}`, data })
+}
+
+/**算法接口 */
+export function strDiff(param) {
+    let data = param
+    return fetch({ method: 'POST', url: `${arithmetic}/str_diff`, data })
+}
+
+
+/********* 台账部分  厂商库接口 */
+//获取供应商列表
+export function getManuLib(param, success) {
+    let data = param
+    http.postJson(`${physics}venders/supplier/query`, data, success)
+}
+
+//查询所有供应商信息
+export function getLib(param) {
+    let data = param
+    return fetch({ method: 'POST', url: `${physics}/venders/auxiliary/query/all`, data })
+}
+
+//查询资产的list
+export function getPropertyList(param, success) {
+    let data = param.data
+    let url = `${physics}/data-platform-3/property/relation_query?projectId=${param.ProjId}&secret=${param.secret}`
+    http.postJson(url, data, success)
+}
+
+//获取资产种族编码query/equipment_family
+export function getEquipmentFamily(success) {
+    let url = `${physics}/data-platform-3/dict/query/equipment_family`
+    http.getJson(url, {}, success)
+}
+
+//删除资产
+export function delProperty(param, success) {
+    let url = `${physics}/data-platform-3/property/delete?projectId=${param.ProjId}&secret=${param.secret}`
+    let data = param.data
+    http.postJson(url, data, success)
+}
+
+//获取制定供应商下的供应合同编号
+export function getListForSupplier(param, success) {
+    let url = `${physics}/venders-dp/supplier/contract/query?projectId=${param.ProjId}&secret=${param.secret}`
+    let data = param.data
+    http.postJson(url, data, success)
+}
+
+//获取保单列表
+export function getListForGuarantee(param, success) {
+    let url = `${physics}/venders-dp/insurance/contract/query`
+    let data = param.data
+    http.postJson(url, data, success)
+}
+
+//新建保单
+export function createGuarantee(param, success) {
+    let url = `${physics}/venders/insurance/contract/create `
+    let data = param.data
+    http.postJson(url, data, success)
+}
+
+//创建资产
+export function createProperty(param, success) {
+    let url = `${physics}/property/create?projectId=${param.ProjId}&secret=${param.secret}`
+    let data = param.data
+    http.postJson(url, data, success)
+}
+
+//获取项目内[岗位]和[绑定岗位的资产]的数量
+export function getNumber(param, success) {
+    let url = `${physics}/business-space/equip/count?projectId=${param.ProjId}&secret=${param.secret}`
+    let data = param.data
+    http.postJson(url, data, success)
+}
+
+//获取项目内有实例的所有种族
+export function getFamilyList(param, success) {
+    let url = `${physics}/business-space/equip/type/list?projectId=${param.ProjId}&secret=${param.secret}`
+    let data = param.data
+    http.postJson(url, data, success)
+}
+
+//删除系统、设备
+export function delSystem(param, success) {
+    let url = `${physics}/equipment/delete?projectId=${param.ProjId}&secret=${param.secret}`
+    let data = param.data
+    http.postJson(url, data, success)
+}
+
+
+//创建系统设备
+export function createSystem(param, success) {
+    let url = `${physics}/equipment/create?projectId=${param.ProjId}&secret=${param.secret}`
+    let data = param.data
+    http.postJson(url, data, success)
+}
+
+
+//获取台账资产列表
+export function getBillPropList(param, success) {
+    let url = `${physics}/business-space/property/list?projectId=${param.ProjId}&secret=${param.secret}`
+    let data = param.data
+    http.postJson(url, data, success)
+}
+
+//台账修改资产信息
+export function updateProperty(param, success) {
+    let url = `${physics}/property/update?projectId=${param.ProjId}&secret=${param.secret}`
+    let data = param.data
+    http.postJson(url, data, success)
+}
+
+//台账获取设备列表
+export function getBillEquipList(param, success) {
+    let url = `${physics}/business-space/equip/list?projectId=${param.ProjId}&secret=${param.secret}`
+    let data = param.data
+    http.postJson(url, data, success)
+}
+
+//台账获取系统列表
+export function getBillSystemList(param, success) {
+    let url = `${physics}/business-space/system/list?projectId=${param.ProjId}&secret=${param.secret}`
+    let data = param.data
+    http.postJson(url, data, success)
+}
+
+//台账获取系统关联的设备
+export function getSysToEq(param, success) {
+    let url = `${physics}/object/rel_query?projectId=${param.ProjId}&secret=${param.secret}`
+    let data = param.data
+    http.postJson(url, data, success)
+}
+
+//台账查询型号
+export function getSpecList(param, success) {
+    let url = `${physics}/venders/manufacturer/specification/query_spec`
+    let data = param
+    http.postJson(url, data, success)
+}
+
+//台账根据设备id创建岗位
+export function EqToAssets(param, success) {
+    let url = `${physics}/property/create_by_equip?projectId=${param.ProjId}&secret=${param.secret}`
+    let data = param.data
+    http.postJson(url, data, success)
+}
+
+//获取设定参数和动态参数
+export function BeatchQueryParam(param, success) {
+    let url = `${physics}/parameter/batch_query_param?projectId=${param.ProjId}&secret=${param.secret}`
+    let data = param.data
+    http.postJson(url, data, success)
+}
+
+export function BatchCreateSome(param, success) {
+    let url = `${physics}/equipment/batch/create?projectId=${param.ProjId}&secret=${param.secret}`
+    let data = param.data
+    http.postJson(url, data, success)
+}
+
+export function delBatchList(param, success) {
+    let url = `${physics}/equipment/batch/delete?projectId=${param.ProjId}&secret=${param.secret}`
+    let data = param.data
+    http.postJson(url, data, success)
+}
+
+
+//扫楼创建资产
+export function createFmList(param, success) {
+    let url = `${api}/service/fm/create`
+    param.Comming = Comming
+    let data = param
+    http.postJson(url, data, success)
+}
+
+export function createAssetsList(param, success) {
+    let url = `${api}/service/fm/create_list`
+    param.Comming = Comming
+    let data = param
+    http.postJson(url, data, success)
+}
+
+export function getListForBuss(param, success) {
+    let url = `${physics}/business-space/space/ispace/equip/query?projectId=${param.ProjId}&secret=${param.secret}`
+    let data = param.data
+    http.postJson(url, data, success)
+}
+
+//获取产品list
+export function getProductList(param, success) {
+    let url = `${physics}/venders/manufacturer/product/queryByType`
+    http.postJson(url, param, success)
+}
+
+//完全匹配的厂商信息
+export function getBasicMatch(param) {
+    console.log(param, "param")
+    let data = param
+    return fetch({ method: 'POST', url: `${physics}/venders/basic/autoFillId`, data })
+}

+ 477 - 0
src/assets/css/jsmind.css

@@ -0,0 +1,477 @@
+/*
+ * Released under BSD License
+ * Copyright (c) 2014-2015 hizzgdev@163.com
+ * 
+ * Project Home:
+ *   https://github.com/hizzgdev/jsmind/
+ */
+
+
+/* important section */
+
+.jsmind-inner {
+    position: relative;
+    overflow: auto;
+    width: 100%;
+    height: 100%;
+}
+
+
+/*box-shadow:0 0 2px #000;*/
+
+.jsmind-inner {
+    moz-user-select: -moz-none;
+    -moz-user-select: none;
+    -o-user-select: none;
+    -khtml-user-select: none;
+    -webkit-user-select: none;
+    -ms-user-select: none;
+    user-select: none;
+}
+
+
+/* z-index:1 */
+
+canvas {
+    position: absolute;
+    z-index: 1;
+}
+
+
+/* z-index:2 */
+
+jmnodes {
+    position: absolute;
+    z-index: 2;
+    background-color: rgba(0, 0, 0, 0);
+}
+
+
+/*background color is necessary*/
+
+jmnode {
+    position: absolute;
+    cursor: default;
+    max-width: 400px;
+    white-space: nowrap;
+    overflow: hidden;
+    text-overflow: ellipsis;
+}
+
+jmexpander {
+    position: absolute;
+    width: 11px;
+    height: 11px;
+    display: block;
+    overflow: hidden;
+    line-height: 12px;
+    font-size: 12px;
+    text-align: center;
+    border-radius: 6px;
+    border-width: 1px;
+    border-style: solid;
+    cursor: pointer;
+}
+
+
+/* default theme */
+
+jmnode {
+    padding: 10px;
+    background-color: #fff;
+    color: #333;
+    border-radius: 5px;
+    box-shadow: 1px 1px 1px #666;
+    font: 16px/1.125 Verdana, Arial, Helvetica, sans-serif;
+}
+
+jmnode:hover {
+    box-shadow: 2px 2px 8px #000;
+    background-color: #ebebeb;
+    color: #333;
+}
+
+jmnode.selected {
+    background-color: #11f;
+    color: #fff;
+    box-shadow: 2px 2px 8px #000;
+}
+
+jmnode.root {
+    font-size: 24px;
+}
+
+jmexpander {
+    border-color: gray;
+}
+
+jmexpander:hover {
+    border-color: #000;
+}
+
+@media screen and (max-device-width: 1024px) {
+    jmnode {
+        padding: 5px;
+        border-radius: 3px;
+        font-size: 14px;
+    }
+    jmnode.root {
+        font-size: 21px;
+    }
+}
+
+
+/* primary theme */
+
+jmnodes.theme-primary jmnode {
+    background-color: #428bca;
+    color: #fff;
+    border-color: #357ebd;
+}
+
+jmnodes.theme-primary jmnode:hover {
+    background-color: #3276b1;
+    border-color: #285e8e;
+}
+
+jmnodes.theme-primary jmnode.selected {
+    background-color: #f1c40f;
+    color: #fff;
+}
+
+jmnodes.theme-primary jmnode.root {}
+
+jmnodes.theme-primary jmexpander {}
+
+jmnodes.theme-primary jmexpander:hover {}
+
+
+/* warning theme */
+
+jmnodes.theme-warning jmnode {
+    background-color: #f0ad4e;
+    border-color: #eea236;
+    color: #fff;
+}
+
+jmnodes.theme-warning jmnode:hover {
+    background-color: #ed9c28;
+    border-color: #d58512;
+}
+
+jmnodes.theme-warning jmnode.selected {
+    background-color: #11f;
+    color: #fff;
+}
+
+jmnodes.theme-warning jmnode.root {}
+
+jmnodes.theme-warning jmexpander {}
+
+jmnodes.theme-warning jmexpander:hover {}
+
+
+/* danger theme */
+
+jmnodes.theme-danger jmnode {
+    background-color: #d9534f;
+    border-color: #d43f3a;
+    color: #fff;
+}
+
+jmnodes.theme-danger jmnode:hover {
+    background-color: #d2322d;
+    border-color: #ac2925;
+}
+
+jmnodes.theme-danger jmnode.selected {
+    background-color: #11f;
+    color: #fff;
+}
+
+jmnodes.theme-danger jmnode.root {}
+
+jmnodes.theme-danger jmexpander {}
+
+jmnodes.theme-danger jmexpander:hover {}
+
+
+/* success theme */
+
+jmnodes.theme-success jmnode {
+    background-color: #5cb85c;
+    border-color: #4cae4c;
+    color: #fff;
+}
+
+jmnodes.theme-success jmnode:hover {
+    background-color: #47a447;
+    border-color: #398439;
+}
+
+jmnodes.theme-success jmnode.selected {
+    background-color: #11f;
+    color: #fff;
+}
+
+jmnodes.theme-success jmnode.root {}
+
+jmnodes.theme-success jmexpander {}
+
+jmnodes.theme-success jmexpander:hover {}
+
+
+/* info theme */
+
+jmnodes.theme-info jmnode {
+    background-color: #5dc0de;
+    border-color: #46b8da;
+    ;
+    color: #fff;
+}
+
+jmnodes.theme-info jmnode:hover {
+    background-color: #39b3d7;
+    border-color: #269abc;
+}
+
+jmnodes.theme-info jmnode.selected {
+    background-color: #11f;
+    color: #fff;
+}
+
+jmnodes.theme-info jmnode.root {}
+
+jmnodes.theme-info jmexpander {}
+
+jmnodes.theme-info jmexpander:hover {}
+
+
+/* greensea theme */
+
+jmnodes.theme-greensea jmnode {
+    background-color: #1abc9c;
+    color: #fff;
+}
+
+jmnodes.theme-greensea jmnode:hover {
+    background-color: #16a085;
+}
+
+jmnodes.theme-greensea jmnode.selected {
+    background-color: #11f;
+    color: #fff;
+}
+
+jmnodes.theme-greensea jmnode.root {}
+
+jmnodes.theme-greensea jmexpander {}
+
+jmnodes.theme-greensea jmexpander:hover {}
+
+
+/* nephrite theme */
+
+jmnodes.theme-nephrite jmnode {
+    background-color: #2ecc71;
+    color: #fff;
+}
+
+jmnodes.theme-nephrite jmnode:hover {
+    background-color: #27ae60;
+}
+
+jmnodes.theme-nephrite jmnode.selected {
+    background-color: #11f;
+    color: #fff;
+}
+
+jmnodes.theme-nephrite jmnode.root {}
+
+jmnodes.theme-nephrite jmexpander {}
+
+jmnodes.theme-nephrite jmexpander:hover {}
+
+
+/* belizehole theme */
+
+jmnodes.theme-belizehole jmnode {
+    background-color: #3498db;
+    color: #fff;
+}
+
+jmnodes.theme-belizehole jmnode:hover {
+    background-color: #2980b9;
+}
+
+jmnodes.theme-belizehole jmnode.selected {
+    background-color: #11f;
+    color: #fff;
+}
+
+jmnodes.theme-belizehole jmnode.root {}
+
+jmnodes.theme-belizehole jmexpander {}
+
+jmnodes.theme-belizehole jmexpander:hover {}
+
+
+/* wisteria theme */
+
+jmnodes.theme-wisteria jmnode {
+    background-color: #9b59b6;
+    color: #fff;
+}
+
+jmnodes.theme-wisteria jmnode:hover {
+    background-color: #8e44ad;
+}
+
+jmnodes.theme-wisteria jmnode.selected {
+    background-color: #11f;
+    color: #fff;
+}
+
+jmnodes.theme-wisteria jmnode.root {}
+
+jmnodes.theme-wisteria jmexpander {}
+
+jmnodes.theme-wisteria jmexpander:hover {}
+
+
+/* asphalt theme */
+
+jmnodes.theme-asphalt jmnode {
+    background-color: #34495e;
+    color: #fff;
+}
+
+jmnodes.theme-asphalt jmnode:hover {
+    background-color: #2c3e50;
+}
+
+jmnodes.theme-asphalt jmnode.selected {
+    background-color: #11f;
+    color: #fff;
+}
+
+jmnodes.theme-asphalt jmnode.root {}
+
+jmnodes.theme-asphalt jmexpander {}
+
+jmnodes.theme-asphalt jmexpander:hover {}
+
+
+/* orange theme */
+
+jmnodes.theme-orange jmnode {
+    background-color: #f1c40f;
+    color: #fff;
+}
+
+jmnodes.theme-orange jmnode:hover {
+    background-color: #f39c12;
+}
+
+jmnodes.theme-orange jmnode.selected {
+    background-color: #11f;
+    color: #fff;
+}
+
+jmnodes.theme-orange jmnode.root {}
+
+jmnodes.theme-orange jmexpander {}
+
+jmnodes.theme-orange jmexpander:hover {}
+
+
+/* pumpkin theme */
+
+jmnodes.theme-pumpkin jmnode {
+    background-color: #e67e22;
+    color: #fff;
+}
+
+jmnodes.theme-pumpkin jmnode:hover {
+    background-color: #d35400;
+}
+
+jmnodes.theme-pumpkin jmnode.selected {
+    background-color: #11f;
+    color: #fff;
+}
+
+jmnodes.theme-pumpkin jmnode.root {}
+
+jmnodes.theme-pumpkin jmexpander {}
+
+jmnodes.theme-pumpkin jmexpander:hover {}
+
+
+/* pomegranate theme */
+
+jmnodes.theme-pomegranate jmnode {
+    background-color: #e74c3c;
+    color: #fff;
+}
+
+jmnodes.theme-pomegranate jmnode:hover {
+    background-color: #c0392b;
+}
+
+jmnodes.theme-pomegranate jmnode.selected {
+    background-color: #11f;
+    color: #fff;
+}
+
+jmnodes.theme-pomegranate jmnode.root {}
+
+jmnodes.theme-pomegranate jmexpander {}
+
+jmnodes.theme-pomegranate jmexpander:hover {}
+
+
+/* clouds theme */
+
+jmnodes.theme-clouds jmnode {
+    background-color: #ecf0f1;
+    color: #333;
+}
+
+jmnodes.theme-clouds jmnode:hover {
+    background-color: #bdc3c7;
+}
+
+jmnodes.theme-clouds jmnode.selected {
+    background-color: #11f;
+    color: #fff;
+}
+
+jmnodes.theme-clouds jmnode.root {}
+
+jmnodes.theme-clouds jmexpander {}
+
+jmnodes.theme-clouds jmexpander:hover {}
+
+
+/* asbestos theme */
+
+jmnodes.theme-asbestos jmnode {
+    background-color: #95a5a6;
+    color: #fff;
+}
+
+jmnodes.theme-asbestos jmnode:hover {
+    background-color: #7f8c8d;
+}
+
+jmnodes.theme-asbestos jmnode.selected {
+    background-color: #11f;
+    color: #fff;
+}
+
+jmnodes.theme-asbestos jmnode.root {}
+
+jmnodes.theme-asbestos jmexpander {}
+
+jmnodes.theme-asbestos jmexpander:hover {}

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 2934 - 0
src/assets/js/jsmind.js


+ 120 - 0
src/assets/scss/point/point_config/common.scss

@@ -0,0 +1,120 @@
+$borderWidth: 1px;
+$borderColor: #ccc;
+$hoverColor: #409EFF;
+$w: 800px;
+$radiusWidth: 4px;
+$size3: 23px;
+.saga-size3 {
+    font-size: $size3;
+}
+
+.select-bg {
+    background-color: $hoverColor;
+}
+
+.saga-border {
+    border: $borderWidth solid $borderColor;
+    box-sizing: border-box;
+    border-radius: $radiusWidth;
+}
+
+.el-dialog__body {
+    padding: 0;
+}
+
+body .htFiltersConditionsMenu:not(.htGhostTable) {
+    z-index: 4070;
+}
+
+.border-hover {}
+
+.border-hover:hover {
+    border-color: $hoverColor;
+}
+
+.saga-dashed-border {
+    border: $borderWidth dashed $borderColor;
+    border-radius: $radiusWidth;
+}
+
+.flex {
+    display: flex;
+    justify-content: space-around;
+}
+
+.saga-fill {
+    width: 100%;
+    height: 100%;
+}
+
+.margin5 {
+    margin: 18px;
+}
+
+.dcenter {
+    margin-left: auto;
+    margin-right: auto;
+}
+
+.h1 {
+    font-size: 24px;
+    color: #8E9CC1;
+}
+
+.h3 {
+    font-size: 14px;
+    color: #333;
+}
+
+.h5 {
+    font-size: 12px;
+    color: #999;
+}
+
+.center {
+    text-align: center;
+}
+
+.padding10 {
+    padding: 10px;
+}
+
+.bg-F5 {
+    background: #F5FCFF;
+}
+
+.block {
+    display: block;
+}
+
+.w {
+    width: $w;
+}
+
+.h100 {
+    height: 100%;
+}
+
+.p-over2 {
+    text-overflow: -o-ellipsis-lastline;
+    overflow: hidden;
+    text-overflow: ellipsis;
+    display: -webkit-box;
+    -webkit-line-clamp: 2; //这儿的数字代表的就是你所需要实现效果的第N行
+    -webkit-box-orient: vertical;
+    overflow-wrap: break-word;
+}
+
+.pointer {
+    cursor: pointer;
+}
+
+@media screen and (max-width: 1200px) {
+    .w {
+        width: 560px;
+    }
+    html {
+        overflow-x: auto;
+        overflow-y: auto;
+    }
+}

+ 474 - 0
src/assets/scss/point/point_config/reset.scss

@@ -0,0 +1,474 @@
+$WinWitdh:1200px;
+$BaseC:#555;
+$LinkC:#06f;
+$HoverC:#f60;
+$FontSize:13px;
+$fontFamily: "Spurce Han Sans,Wah Kang font,Microsoft YaHei";
+$allColor: #333; //正文#333
+$color1: #666; //辅助文字#666
+$color2: #999; //#999
+$color3: #ccc; //失效文字#ccc
+$color4: #00A0E8; //链接文字
+$color5: #8E9CC1; //表头文字加粗
+$colorList: ( 1:$color1, 2:$color2, 3:$color3, 4:$color4, 5:$color5);
+$theme1: #5BA7FF;
+$theme2: #FFF;
+$theme3: #8E9CC1;
+$themeList: (1:$theme1, 2:$theme2, 3:$theme3);
+$auxiliary1: #548FF0; //辅助色彩
+$auxiliary2: #FF4121;
+$auxiliary3: #7ED321;
+$auxiliary4: #F5A623;
+$auxiliaryList: ( 1:$auxiliary1, 2:$auxiliary2, 3:$auxiliary3, 4:$auxiliary4);
+$borderColor1: #C2CEDB; //线条色彩
+$borderColor2: #DDD;
+$borderColorList: (1:$borderColor1, 2:$borderColor2);
+$bg1: #FFF;
+$bg2: #F2FBFF;
+$bg3: #EEFAFF;
+$bg4: #FFF5E4;
+$bg5: #E5F6D3;
+$bgList: ( 1:$bg1, 2:$bg2, 3:$bg3, 4:$bg4, 5:$bg5);
+$allSize: 14px; //正常文字大小
+$size1: 12px; //辅助文字大小
+// mixins
+@mixin dz($time:0.25s) {
+    -webkit-transition: all $time ease-in-out;
+    -moz-transition: all $time ease-in-out;
+    -o-transition: all $time ease-in-out;
+    transition: all $time ease-in-out;
+}
+
+.el-dialog__headerbtn {
+    top: -24px;
+    right: -24px;
+    width: 24px;
+    height: 24px;
+    border-radius: 50%;
+    color: #8E9CC1;
+    background-color: #fff;
+}
+
+.el-dialog__header {
+    border-bottom: 1px solid #C2CEDB;
+    box-sizing: border-box;
+    .el-dialog__title {
+        height: 20px;
+        line-height: 20px;
+        font-size: 14px;
+    }
+}
+
+// .el-button--mini,
+// .el-button--mini.is-round {
+//     padding: 5px 20px;
+// }
+// .el-button {
+//     box-sizing: border-box;
+//     border-color: $auxiliary1;
+// }
+// .el-button span {
+//     color: $color4;
+// }
+// .el-button:focus,
+// .el-button:hover {
+//     background-color: $bg1;
+//     border-color: $auxiliary1;
+// }
+// .el-button span {
+//     display: inline-block;
+//     line-height: 20px;
+//     height: 20px;
+// }
+// * {
+//     font-family: $fontFamily;
+//     font-size: $allSize;
+//     color: $allColor;
+// }
+// .color {
+//     color: $allColor;
+// }
+// .el-input__inner:hover{
+//     border-color: 
+// }
+//文字色
+@each $i,
+$color in $colorList {
+    .color#{$i} {
+        color: $color;
+    }
+}
+
+//主题色
+@each $i,
+$theme in $themeList {
+    .theme#{$i} {
+        background-color: $theme;
+    }
+}
+
+//辅助背景色
+@each $i,
+$auxiliary in $auxiliaryList {
+    .auxiliary#{$i} {
+        background-color: $auxiliary;
+    }
+}
+
+//辅助色
+@each $i,
+$auxiliary in $auxiliaryList {
+    .auxiliary-color#{$i} {
+        color: $auxiliary;
+    }
+}
+
+//线条色
+@each $i,
+$borderColor in $borderColorList {
+    .border-color#{$i} {
+        border-color: $borderColor;
+    }
+}
+
+//背景色
+@each $i,
+$bg in $bgList {
+    .bg#{$i} {
+        background-color: $bg;
+    }
+}
+
+@for $i from 1 to 51 {
+    .border-radius#{$i} {
+        border-radius: #{$i}px;
+    }
+}
+
+@for $i from 1 to 11 {
+    .border#{$i} {
+        border-width: #{$i}px;
+        border-style: solid;
+    }
+}
+
+// .color2 {
+//     color: $color2;
+// }
+// .color3 {
+//     color: $color3;
+// }
+// .color4 {
+//     color: $color4;
+// }
+// .color5 {
+//     color: $color5
+// }
+// @charset "UTF-8";
+body,
+ul,
+ol,
+dl,
+dd,
+h1,
+h2,
+h3,
+h4,
+h5,
+h6,
+pre,
+form,
+fieldset,
+legend,
+input,
+button,
+textarea,
+p,
+blockquote,
+table,
+th,
+td,
+menu {
+    margin: 0;
+    padding: 0
+}
+
+html,
+body,
+#app {
+    height: 100%;
+    width: 100%;
+}
+
+table {
+    border-collapse: collapse;
+    border-spacing: 0;
+    table-layout: fixed
+}
+
+ul,
+ol,
+menu {
+    list-style: none
+}
+
+fieldset,
+img {
+    border: none
+}
+
+img,
+object,
+select,
+input,
+textarea,
+button {
+    vertical-align: middle
+}
+
+input,
+textarea,
+select,
+address,
+caption,
+cite,
+code,
+dfn,
+em,
+i,
+b,
+strong,
+small,
+th,
+var,
+abbr {
+    font-size: 100%;
+    font-style: normal
+}
+
+caption,
+th {
+    text-align: left;
+}
+
+article,
+aside,
+footer,
+header,
+hgroup,
+nav,
+section,
+figure,
+figcaption {
+    display: block;
+}
+
+code,
+kbd,
+pre,
+samp,
+tt {
+    font-family: Consolas, "Courier New", Courier, monospace;
+}
+
+address,
+cite,
+dfn,
+em,
+var,
+i {
+    font-style: normal;
+}
+
+blockquote,
+q {
+    quotes: none;
+}
+
+blockquote:before,
+blockquote:after,
+q:before,
+q:after {
+    content: "";
+    content: none;
+}
+
+a {
+    color: $LinkC;
+    text-decoration: none;
+    cursor: pointer;
+    &:link,
+    &:visited,
+    &:active {
+        color: $LinkC;
+    }
+    &:hover,
+    &:focus {
+        color: $HoverC;
+        text-decoration: underline;
+        outline: none;
+    }
+    &,
+    span,
+    i,
+    em,
+    u,
+    strong,
+    b,
+    p,
+    img,
+    ul,
+    li,
+    div,
+    dd,
+    dt,
+    dl,
+    ol,
+    table,
+    th,
+    td,
+    h1,
+    h2,
+    h3,
+    h4,
+    h5,
+    h6,
+    input,
+    textarea,
+    button,
+    small,
+    select {
+        cursor: pointer;
+        @include dz;
+    }
+}
+
+abbr[title],
+acronym[title] {
+    border-bottom: 1px dotted;
+    cursor: help;
+}
+
+// base by fungleo
+html {
+    min-width: $WinWitdh;
+    // overflow-y: scroll;
+}
+
+body {
+    font-size: $FontSize;
+    color: $BaseC;
+    line-height: 2;
+}
+
+body,
+button,
+input,
+select,
+textarea {
+    font-family: tahoma, Helvetica, Arial, "\5FAE\8F6F\96C5\9ED1";
+    *font-family: "\5FAE\8F6F\96C5\9ED1";
+}
+
+h1 {
+    font-size: $FontSize+10;
+}
+
+h2 {
+    font-size: $FontSize+8;
+}
+
+h3 {
+    font-size: $FontSize+6;
+}
+
+h4 {
+    font-size: $FontSize+4;
+}
+
+h5 {
+    font-size: $FontSize+2;
+}
+
+h6 {
+    font-size: $FontSize;
+}
+
+hr {
+    border: none;
+    height: 1px;
+    background: lighten($BaseC, 50%);
+}
+
+.fl {
+    float: left;
+}
+
+.fr {
+    float: right;
+}
+
+.tl {
+    text-align: left;
+}
+
+.tr {
+    text-align: right;
+}
+
+.tc {
+    text-align: center;
+}
+
+.cf:before,
+.cf:after,
+.web:before,
+.web:after,
+.web_:before,
+.web_:after {
+    content: "";
+    display: table;
+}
+
+.cf:after,
+.web:after,
+.web_:after {
+    clear: both;
+}
+
+.cf {
+    zoom: 1;
+}
+
+.web {
+    width: $WinWitdh;
+    margin-left: auto;
+    margin-right: auto;
+    zoom: 1;
+}
+
+.web_ {
+    min-width: $WinWitdh;
+    width: 100%;
+    zoom: 1;
+}
+
+.block {
+    display: block;
+}
+
+.none {
+    display: none
+}
+
+.clear {
+    clear: both;
+}
+
+.fl {
+    float: left;
+}
+
+.disIne {
+    display: inline-block;
+}

+ 244 - 0
src/components/common/handsontable.vue

@@ -0,0 +1,244 @@
+<!--
+    id: 选填,没有得话给随机id
+    settting: handsontable得配置,其中必填data选项
+-->
+
+<template>
+    <div style="height: 100%;">
+        <div :id="id"></div>
+    </div>
+</template>
+<script>
+    import Handsontable from "handsontable-pro"
+    import 'handsontable-pro/dist/handsontable.full.css'
+    import zhCN from 'handsontable-pro/languages/zh-CN';
+    export default {
+        props: {
+            id: {
+                type: String,
+                default: function createRandomId() {
+                    return (Math.random() * 10000000).toString(16).substr(0, 4) + '-' + (new Date()).getTime() + '-' + Math.random().toString().substr(2, 5);
+                }
+            },
+            // settings: {//必填
+            //   type: Object
+            // }
+        },
+        data() {
+            return {
+                hot: null,
+                filtersArr: []
+            }
+        },
+        created() {},
+        mounted() {
+            // console.log(handsontable)
+            // this.init()
+        },
+        methods: {
+            getElement() {
+                return {
+                    width: document.getElementById(this.id).clientWidth,
+                    height: document.getElementById(this.id).parentNode.clientHeight
+                }
+            },
+            afterDocumentKeyDown(e) {
+                this.$emit("keyDown", e)
+            },
+            trimmedRows() {
+                var plugin = this.hot.getPlugin("trimRows").trimmedRows;
+                let dataLength = this.hot.getSourceData().length;
+                let dataArr = new Array();
+                for (let i = 0; i < dataLength; i++) {
+                    dataArr.push(i);
+                }
+                if (plugin.length <= 0) {
+                    dataArr = undefined;
+                } else {
+                    dataArr = this.array_diff(dataArr, plugin);
+                }
+                this.filtersArr = dataArr;
+                return dataArr || [];
+            },
+            //去除数组中相同的元素
+            array_diff(a, b) {
+                for (var i = 0; i < b.length; i++) {
+                    for (var j = 0; j < a.length; j++) {
+                        if (a[j] == b[i]) {
+                            a.splice(j, 1);
+                            j = j - 1;
+                        }
+                    }
+                }
+                return a;
+            },
+            //右键删除
+            romoveFm(index, amout) {
+                console.log(index, amout)
+                this.$emit("delete", index, amout)
+            },
+            //数据发生修改后(失焦)
+            tdChange(changeData, source) {
+                this.$emit("change",changeData,source)
+            },
+            /**
+             * 获取被排序后的数组
+             *
+             * @param changeData 发生改变的数据
+             * @param source     数组
+             *
+             * @return array     经过排序后或者经过搜索后的数组
+             */
+            getParam(changeData, source, hot, trimmedArr) {
+                let param = "";
+                //被筛选过后的数组
+                // let trimmedArr = this.trimmedRows();
+                //是否启用了排序
+                let isSort = hot.getPlugin("columnSorting").isSorted();
+                if (trimmedArr.length && isSort) {
+                    //排序后的数组
+                    let sortArr = hot.getPlugin("columnSorting").rowsMapper.__arrayMap;
+                    param = changeData.map(item => {
+                        return hot.getSourceDataAtRow(trimmedArr[sortArr[item[0]]]);
+                    });
+                } else if (isSort) {
+                    //排序后的数组
+                    let sortArr = hot.getPlugin("columnSorting").rowsMapper.__arrayMap;
+                    param = changeData.map(item => {
+                        return hot.getSourceDataAtRow(sortArr[item[0]]);
+                    });
+                } else if (trimmedArr.length) {
+                    param = changeData.map(item => {
+                        return hot.getSourceDataAtRow(trimmedArr[item[0]]);
+                    });
+                } else {
+                    param = changeData.map(item => {
+                        return hot.getSourceDataAtRow(item[0]);
+                    });
+                }
+                return param;
+            },
+            /**
+             * 
+             * @param {handsontable修改参数} changeData 
+             * @param {*} source 
+             * @param {handsontabele实例} hot 
+             * @param {排序数组} trimmedArr
+             * 
+             * @return 修改数值的前一个对象 
+             */
+            getUnshiftParam(changeData, source, hot, trimmedArr) {
+                //是否启用了排序
+                let isSort = hot.getPlugin("columnSorting").isSorted();
+                if (trimmedArr.length && isSort) {
+                    //排序后的数组
+                    let sortArr = hot.getPlugin("columnSorting").rowsMapper.__arrayMap;
+                    return hot.getSourceDataAtRow(trimmedArr[sortArr[changeData[0][0] - 1]])
+                } else if (isSort) {
+                    //排序后的数组
+                    let sortArr = hot.getPlugin("columnSorting").rowsMapper.__arrayMap;
+                    return hot.getSourceDataAtRow(sortArr[changeData[0][0] - 1])
+                } else if (trimmedArr.length) {
+                    //进行了筛选
+                    return hot.getSourceDataAtRow(trimmedArr[changeData[0][0] - 1])
+                } else {
+                    //没有进行排序和筛选
+                    return hot.getSourceDataAtRow(changeData[0][0] - 1);
+                }
+            },
+            init(settings) {
+                console.log("init")
+                var hotElement = document.getElementById(this.id)
+                var hotSettings = Object.assign({
+                    width: this.getElement().width,
+                    rowHeaders: true,
+                    colHeaders: true,
+                    filters: true,
+                    height: this.getElement().height,
+                    columnSorting: true, //添加排序
+                    sortIndicator: true, //添加排序
+                    renderAllRows: true,
+                    autoColumnSize: true,
+                    language: "zh-CN",
+                    manualColumnResize: true,
+                    manualColumnMove: true,
+                    dropdownMenu: [
+                        "filter_by_condition",
+                        "filter_action_bar"
+                    ],
+                    afterOnCellMouseDown: this.tableDown, //鼠标单击
+                    afterChange: this.tdChange, //修改后
+                    afterRemoveRow: this.romoveFm, //右键删除
+                    afterFilter: this.trimmedRows, //排序
+                    afterDocumentKeyDown: this.afterDocumentKeyDown, //鼠标单击
+                }, settings);
+                console.log(hotSettings, settings)
+                if(!!this.hot){
+                    this.hot.destroy();
+                    this.hot = null
+                }
+                this.hot = new Handsontable(hotElement, hotSettings);
+                console.log(this.hot)
+                this.hot.view.wt.update('onCellDblClick', (row,cell) => { 
+
+                    //Get editor and begin edit mode on current cell (maintain current double click functionality) 
+                    var activeEditor = this.hot.getActiveEditor(); 
+                    console.log(this.hot,activeEditor)
+                    activeEditor.beginEditing(); 
+                    this.onDblClick(activeEditor,row,cell)
+                    //Do whatever you want... 
+
+                }); 
+                let pro = document.getElementById("hot-display-license-info");
+                if (!!pro) {
+                    pro.parentNode.removeChild(pro);
+                }
+                return this.hot
+            },
+
+            //双击
+            onDblClick(activeEditor,row,cell){
+                console.log(111,activeEditor,row,cell)
+            },
+            tableDown(el, rowArr) {
+                if (rowArr.row < 0) {
+                    return false
+                }
+                let filter = this.filtersArr;
+                //被筛选过后的数组
+                let trimmedArr = this.trimmedRows();
+                //是否启用了排序
+                let isSort = this.hot
+                    .getPlugin("columnSorting")
+                    .isSorted();
+                let myHotMainArr = this.hot.getSourceData()
+                // debugger
+                if (trimmedArr.length && isSort) {
+                    let sortArr = this.hot.getPlugin("columnSorting")
+                        .rowsMapper.__arrayMap;
+                    let infos = myHotMainArr[trimmedArr[sortArr[rowArr.row]]];
+                    this.getInfors(infos, rowArr);
+                } else if (isSort) {
+                    //排序后的数组
+                    let sortArr = this.hot.getPlugin("columnSorting").rowsMapper.__arrayMap;
+                    let infos = myHotMainArr[sortArr[rowArr.row]];
+                    this.getInfors(infos, rowArr);
+                } else if (trimmedArr.length) {
+                    let infos = myHotMainArr[trimmedArr[rowArr.row]];
+                    this.getInfors(infos, rowArr);
+                } else {
+                    let infos = myHotMainArr[rowArr.row];
+                    this.getInfors(infos, rowArr);
+                }
+            },
+            getInfors(obj,row){
+                this.$emit("mouseDown",obj,row)
+            }
+        }
+    }
+</script>
+<style lang="scss">
+    .htDropdownMenu:not(.htGhostTable){
+        z-index: 4060;
+    }
+</style>

+ 73 - 0
src/components/common/jsmind.vue

@@ -0,0 +1,73 @@
+<!--
+    initData(基础参数配置,实际数据): 由父组件调用,成功后返回jsmind实例
+    @event {选中节点} selectNode 派发事件selectNode
+-->
+<template>
+    <div class="h100">
+        <div :id="id" style="width:100%;height:100%;"></div>
+    </div>
+</template>
+<script>
+    import "@/assets/js/jsmind.js"
+    import "@/assets/css/jsmind.css"
+    export default {
+        name: "jsMindComponent",
+        props: {
+            id: {
+                type: String,
+                default: function createRandomId() {
+                    return (Math.random() * 10000000).toString(16).substr(0, 4) + '-' + (new Date()).getTime() + '-' + Math.random().toString().substr(2, 5);
+                }
+            },
+        },
+        data() {
+            return {
+                jm: ""
+            }
+        },
+        created() {
+            console.log(111)
+        },
+        mounted() {
+            console.log(jsMind)
+        },
+        methods: {
+            initData(options, data) {
+                let option = Object.assign({
+                        container: this.id,
+                        editable: true,
+                        theme: 'orange'
+                    }, options),
+                    el = {
+                        container: this.id,
+                        editable: true, //是否启用编辑
+                        theme: "greensea", //主题
+                        mode: "side", //显示模式
+                        support_html: true //是否支持节点里的HTML元素
+                    };
+                this.jm = new jsMind(el)
+                this.jm.show(data)
+                console.log(this.jm)
+                this.jm.view.container.addEventListener('click',this.click)
+                return this.jm
+            },
+            click(e){
+                let event = e || window.event,target = event.target || event.srcEvent,val = target.innerHTML;
+                console.log(event,target,target)
+                if(target.nodeName == "JMEXPANDER"){
+                    console.log(target.innerHTML)
+                    //-为展开
+                    if(val == "-"){
+                        console.log(this.jm.get_node(target.getAttribute("nodeid")))
+                        this.$emit("openNode",this.jm.get_node(target.getAttribute("nodeid")))
+                    }else{
+
+                    }
+                }
+            }
+        }
+    }
+</script>
+<style lang="scss" scoped>
+
+</style>

+ 49 - 0
src/components/common/search_input.vue

@@ -0,0 +1,49 @@
+<template>
+  <div class="build_input">
+        <i class="iconfont icon-sousuo"></i>
+        <input type="text" v-model="value" :placeholder="placeholder" @keyup.enter="search">
+    </div>
+</template>
+
+<script>
+export default {
+    props: [ 'placeholder'],
+    data(){
+        return{
+            value: ''
+        }
+    },
+    methods: {
+        search(){
+            this.$emit("search",this.value)
+        },
+    },
+}
+</script>
+
+<style lang="less" scoped>
+.build_input{
+    display: inline-block;
+    width: 23rem;
+    height: 2rem;
+    font-size: 1.4rem;
+    position: relative;
+    input{
+        width: 100%;
+        height: 100%;
+        padding-left: 2rem;
+        font-size: .8rem;
+        box-sizing: border-box;
+    }
+    .icon-sousuo{
+        position: absolute;
+        width: 2rem;
+        height: 2rem;
+        left: 0;
+        top: 3px;
+        bottom: 0;
+        line-height: 2rem;
+        text-align: center;
+    }
+}
+</style>

+ 65 - 0
src/components/config_point/cut_string.vue

@@ -0,0 +1,65 @@
+<template>
+    <div class="flex">
+        <template v-for="(item,index) in stringArr">
+          <span
+            @click="checkItem(item,index)"
+            :class="{'bg': (arr.indexOf(index) > -1)} "
+            class="cut-string saga-border pointer border-hover"
+          >{{item}}</span>
+</template>
+  </div>
+</template>
+<script>
+    export default {
+        props: {
+            string: {
+                type: String,
+                default: ""
+            }
+        },
+        data() {
+            return {
+                stringArr: this.string.split(""),
+                obj: {},
+                arr: []
+            }
+        },
+        created() {},
+        mounted() {},
+        methods: {
+            checkItem(item, index) {
+                this.obj[index] = item
+                this.arr.push(index)
+            },
+            clear() {
+                this.stringArr = this.string.split("")
+                this.obj = {}
+                this.arr = []
+            },
+            getData() {
+                let string = ""
+                for (let key in this.obj) {
+                    string += this.obj[key]
+                }
+                console.log(string)
+                return string
+            }
+        },
+        watch: {
+            string: function() {
+                this.clear()
+            }
+        }
+    }
+</script>
+<style lang="scss" scoped>
+    .cut-string {
+        width: 50px;
+        height: 50px;
+        text-align: center;
+        line-height: 50px;
+    }
+    .bg {
+        background: red;
+    }
+</style>

+ 83 - 0
src/components/config_point/data_origin.vue

@@ -0,0 +1,83 @@
+<template>
+    <div class="saga-fill">
+        <div class="saga-title center h1">{{renderData.Name}}</div>
+        <div class="center h3">通讯协议:{{renderData.ProtocolType}}</div>
+        <div class="padding10 bg-F5">
+            <p class="p-over2 h5">{{renderData.Description}}</p>
+        </div>
+        <div class="doughnut-view">
+            <doughnut v-if="renderData.Sum" width="200" height="200" :renderData="echartsData" :id="id"></doughnut>
+            <div v-else class="center">暂无数据</div>
+        </div>
+        <slot></slot>
+    </div>
+</template>
+<script>
+    import doughnut from "@/components/echarts/doughnut"
+    export default {
+        name: "dataOrgin",
+        components: {
+            doughnut
+        },
+        props: {
+            id: {
+                type: String,
+                default: function createRandomId() {
+                    return (Math.random() * 10000000).toString(16).substr(0, 4) + '-' + (new Date()).getTime() + '-' + Math.random().toString().substr(2, 5);
+                }
+            },
+            renderData: {
+                type: Object,
+                default: function() {
+                    return {}
+                }
+            }
+        },
+        data() {
+            return {
+                echartsData: []
+            }
+        },
+        created() {
+            console.log(this.renderData)
+            this.changeData()
+        },
+        mounted() {},
+        methods: {
+            changeData(){
+                this.echartsData = [
+                    {
+                        name: "未使用-" + this.renderData.Notused,
+                        value: this.renderData.Notused
+                    },
+                    {
+                        name: "未关联物理世界-" + this.renderData.Notrelated,
+                        value: this.renderData.Notrelated
+                    },
+                    {
+                        name: "已关联物理世界-" + this.renderData.Related,
+                        value: this.renderData.Related
+                    }
+                ]
+            }
+        },
+        watch:{
+            renderData: {
+                deep: true,
+                handler: function(){
+                    this.changeData()
+                }
+            }
+        }
+    }
+</script>
+
+<style lang="scss" scoped>
+    .doughnut-view {
+        height: 300px;
+        width: 100%;
+        padding: 5px;
+        box-sizing: border-box;
+    }
+</style>
+

+ 223 - 0
src/components/config_point/examine_main.vue

@@ -0,0 +1,223 @@
+<template>
+    <div>
+        <select-one @check="typeCheck" :renderData="typeArr" infosKey="EquipmentType" name="原始点位描述中的设备类型关键字"></select-one>
+        <select-one @check="paramCheck" :renderData="identifyArr" infosKey="ownMess" name="原始点位描述中设备参数关键字"></select-one>
+        <div class="handson-view saga-border">
+            <div v-if="hotData.length" class="h100">
+                <div class="title-view">
+                    <el-input v-model="inputValue" placeholder="批量填充空白的值/单位说明" style="width:200px;"></el-input>
+                    <span class="w10"></span>
+                    <el-button @click="fullValue">批量填充值/单位说明</el-button>
+                </div>
+                <div class="handson-main">
+                    <handsontable-component ref="handsontable"></handsontable-component>
+                </div>
+                <div class="center">
+                    <el-button @click="saveData">保存修改</el-button>
+                </div>
+            </div>
+            <div v-else class="center">
+                暂无数据
+            </div>
+        </div>
+    </div>
+</template>
+<script>
+    import {
+        mapGetters,
+        mapActions
+    } from "vuex";
+    import {
+        queryAllEqTypeList,
+        queryAllEqParamList,
+        queryPoint,
+        updatePoint
+    } from "@/fetch/point_http"
+    import selectOne from "@/components/config_point/select_one"
+    import handsontableComponent from "@/components/common/handsontable"
+    export default {
+        components: {
+            selectOne,
+            handsontableComponent
+        },
+        computed: {
+            ...mapGetters("project", [
+                "projectId",
+                "datasourceId",
+                "protocolType"
+            ])
+        },
+        data() {
+            return {
+                typeArr: [],
+                identifyArr: [],
+                EquipmentType: "",
+                EquipmentParameter: "",
+                inputValue: "",
+                header: ['原始点位描述', '值/单位说明', '*识别的设备类型关键字', '*识别的设备参数关键字'],
+                type: [{
+                        data: 'RoutingKey',
+                        readOnly: true
+                    },
+                    {
+                        data: 'ValueDescription'
+                    },
+                    {
+                        data: 'KeyEquipmentType'
+                    },
+                    {
+                        data: 'KeyEquipmentParameter'
+                    }
+                ],
+                hot: "",
+                hotData: []
+            }
+        },
+        created() {
+            this.getTypes()
+        },
+        mounted() {},
+        methods: {
+            //保存数据
+            saveData(){
+                let param = this.hot.getSourceData().map(item => {
+                    return {
+                        ValueDescription: item.ValueDescription || null,
+                        KeyEquipmentType: item.KeyEquipmentType || null,
+                        KeyEquipmentParameter: item.KeyEquipmentParameter || null,
+                        Id: item.Id,
+                        DatasourceId: item.DatasourceId
+                    }
+                })
+                console.log(param)
+                updatePoint({
+                    data: {Content: param},
+                    type: this.protocolType
+                },res => {
+                    console.log(res)
+                    this.typeCheck()
+                })
+            },
+            //填充值被点击
+            fullValue(){
+                if(!this.inputValue){
+                    return false
+                }
+                this.hotData.map(item => {
+                    //如果没有值
+                    if(!item.ValueDescription){
+                        item.ValueDescription = this.inputValue
+                    }
+                })
+            },
+            //设备类型被点击
+            typeCheck(item) {
+                this.EquipmentType = item.EquipmentType == "空" ? "" : item.EquipmentType
+                this.getParam()
+            },
+            //设备参数被点击
+            paramCheck(item) {
+                console.log(item, "设备参数")
+                this.inputValue = ""
+                if (!!item) {
+                    this.EquipmentParameter = (item.EquipmentParameter == "空" || !item.EquipmentParameter) ? null : item.EquipmentParameter
+                    this.queryPoint()
+                } else {
+                    this.hotData = []
+                    return false
+                }
+            },
+            //获取点位列表
+            queryPoint() {
+                console.log(this.EquipmentType, this.EquipmentParameter, "EquipmentParameter")
+                let param = {
+                        data: {
+                            Filters: {
+                                DataSourceId: this.datasourceId,
+                                ProjectId: this.projectId,
+                                KeyEquipmentParameter: this.EquipmentParameter,
+                                KeyEquipmentType: this.EquipmentType
+                            }
+                        },
+                        type: this.protocolType
+                    },
+                    width, settings
+                console.log(param.data)
+                queryPoint(param, res => {
+                    this.hotData = res.Content
+                    console.log(res)
+                    if (!!this.hot) {
+                        this.hot.destroy()
+                    }
+                    settings = {
+                        data: this.hotData,
+                        colHeaders: this.header,
+                        columns: this.type,
+                        rowHeights: 30,
+                        maxRows: res.Content.length
+                    }
+                    this.$nextTick(() => {
+                        this.hot = this.$refs.handsontable.init(settings)
+                    })
+                    console.log(this.hot)
+                })
+            },
+            //获取原始点位描述中设备参数关键字
+            getParam() {
+                queryAllEqParamList({
+                    type: this.protocolType,
+                    data: {
+                        DataSourceId: this.datasourceId,
+                        ProjectId: this.projectId,
+                        KeyEquipmentType: this.EquipmentType
+                    }
+                }, res => {
+                    this.identifyArr = res.Content.map(item => {
+                        if (!!item.EquipmentParameter) {
+                            item.ownMess = item.EquipmentParameter + "(涉及原始点位:" + item.PointCount + ")"
+                        } else {
+                            item.ownMess = "空" + "(涉及原始点位:" + item.PointCount + ")"
+                        }
+                        return item
+                    })
+                    console.log(this.identifyArr, "res")
+                })
+            },
+            //获取原始点位描述中的设备类型关键字
+            getTypes() {
+                queryAllEqTypeList({
+                    type: this.protocolType,
+                    data: {
+                        DataSourceId: this.datasourceId,
+                        ProjectId: this.projectId
+                    }
+                }, res => {
+                    // res.Content.unshift({EquipmentType: "空"})
+                    this.typeArr = res.Content
+                    console.log(this.typeArr)
+                })
+            },
+        }
+    }
+</script>
+<style lang="scss" scoped>
+    .handson-view {
+        height: 340px;
+        width: 480px;
+        float: right;
+        overflow-y: auto;
+    }
+    .title-view {
+        height: 50px;
+        line-height: 50px;
+        padding-left: 10px;
+    }
+    .w10 {
+        width: 10px;
+        display: inline-block;
+    }
+    .handson-main {
+        height: calc(100% - 90px);
+        width: 100%;
+    }
+</style>

+ 285 - 0
src/components/config_point/find_keyword.vue

@@ -0,0 +1,285 @@
+<template>
+    <div class="view-find-word">
+        <div class="saga-border">
+            <p class="center">请从下面的原始点位描述中选择"{{title == 'type' ? "设备类型" : "设备参数"}}"关键字</p>
+            <div class="h10"></div>
+            <div>
+                <cut-string v-if="!!Description" :string="Description" ref="cutString"></cut-string>
+                <p v-else class="center">已处理到最后一条</p>
+            </div>
+            <div class="h10"></div>
+            <div class="center">
+                <el-button :disabled="!Description" @click="getCutString">此条无法识别</el-button>
+                <el-button :disabled="!Description" @click="getCutString">继续发现关键字</el-button>
+            </div>
+            <div class="h10"></div>
+        </div>
+        <div class="h10"></div>
+        <div class="find-data">
+            <div class="left-view saga-border">
+                <doughnut v-if="!!sum" width="200" height="200" :renderData="echartsData"></doughnut>
+                <div v-else class="center">暂无数据</div>
+            </div>
+            <div class="right-view saga-border">
+                <div class="find-tags" v-for="tag in tagList">
+                    <el-tag :key="type == 'type' ? tag.EquipmentType : tag.EquipmentParameter" @click="changeName(type == 'type' ? tag.EquipmentType : tag.EquipmentParameter)" @close="closeTag(type == 'type' ? tag.EquipmentType : tag.EquipmentParameter)" closable>
+                        {{type == 'type' ? (tag.EquipmentType + "(" + tag.PointCount + ")") : (tag.EquipmentParameter + "(" + tag.PointCount + ")")}}
+                    </el-tag>
+                </div>
+            </div>
+        </div>
+        <my-dialog :dialogVisible="reNameDialog" @confirm="reNameConfirm" :footer="footer" @cancel="cancel" title="重命名" :isAppendBody="true">
+            <h3 class="center">{{name}}</h3>
+            <el-input v-model="newName" placeholder="请输入新名称"></el-input>
+        </my-dialog>
+    </div>
+</template>
+<script>
+    import cutString from "@/components/config_point/cut_string"
+    import doughnut from "@/components/echarts/doughnut"
+    import myDialog from "@/components/el_pack/dialog"
+    import {
+        findKeysWord,
+        findKeysWordType,
+        queryDataSourceCount,
+        queryEqTypeList,
+        queryEqParamList,
+        renameType,
+        renameParam,
+        setParamTer,
+        setTypeTer,
+        delParamTer,
+        delTypeTer
+    } from "@/fetch/point_http"
+    import {
+        mapGetters,
+        mapActions
+    } from "vuex";
+    export default {
+        props: {
+            type: {
+                type: String,
+                default: "type", //arguments or type
+            }
+        },
+        computed: {
+            ...mapGetters("project", [
+                "projectId",
+                "datasourceId",
+                "protocolType"
+            ])
+        },
+        components: {
+            cutString,
+            doughnut,
+            myDialog
+        },
+        data() {
+            return {
+                title: "",
+                Description: "",
+                echartsData: [],
+                sum: 0,
+                tagList: [],
+                reNameDialog: false,
+                name: "",
+                newName: "",
+                footer: {
+                    cancel: "取消",
+                    confirm: "确定"
+                }
+            }
+        },
+        created() {},
+        mounted() {},
+        methods: {
+            //继续发现关键字
+            getCutString() {
+                // console.log(this.$refs.cutString.getData())
+                if (!this.$refs.cutString.getData()) {
+                    this.$message.error("请确定当前有选择关键字")
+                    return false
+                }
+                let setNameFun;
+                if (this.type == "type") {
+                    setNameFun = setTypeTer
+                } else {
+                    setNameFun = setParamTer
+                }
+                setNameFun({
+                    data: {
+                        DataSourceId: this.datasourceId,
+                        Key: this.$refs.cutString.getData()
+                    },
+                    type: this.protocolType
+                }, res => {
+                    this.$message.success("添加成功")
+                    this.changeType()
+                })
+            },
+            //取消
+            cancel() {
+                this.reNameDialog = false
+            },
+            //关闭标签(删除)
+            closeTag(tag) {
+                // console.log(tag)
+                let delFun;
+                if (this.type == "type") {
+                    delFun = delTypeTer
+                } else {
+                    delFun = delParamTer
+                }
+                let param = {
+                    data: {
+                        DataSourceId: this.datasourceId,
+                        Key: this.type == "type" ? tag : tag
+                    },
+                    type: this.protocolType
+                }
+                this.$confirm("你确定删除该标签?").then(_ => {
+                    this.delAjax(param, delFun)
+                }).catch(_ => {
+                })
+            },
+            delAjax(param, fun) {
+                fun(param, res => {
+                    this.$message.success("删除标签成功")
+                    this.changeType()
+                })
+            },
+            //点击事件,重命名
+            changeName(tag) {
+                this.reNameDialog = true
+                this.newName = ""
+                if (this.type == "type") {
+                    this.name = tag
+                } else {
+                    this.name = tag
+                }
+            },
+            //确定修改名字
+            reNameConfirm() {
+                let reNameFun;
+                if (this.type == "type") {
+                    reNameFun = renameType
+                } else {
+                    reNameFun = renameParam
+                }
+                reNameFun({
+                    data: {
+                        DataSourceId: this.datasourceId,
+                        KeyNew: this.newName,
+                        KeyOld: this.name
+                    },
+                    type: this.protocolType
+                }, res => {
+                    this.$message.success("修改成功")
+                    this.changeType()
+                    this.cancel()
+                })
+            },
+            //获取文字
+            changeType(type) {
+                let queryFun
+                this.type = !!type ? type : this.type 
+                console.log(this.type)
+                if (this.type == "type") {
+                    queryFun = findKeysWordType
+                } else {
+                    queryFun = findKeysWord
+                }
+                queryFun({
+                    data: {
+                        DataSourceId: this.datasourceId,
+                        ProjectId: this.projectId
+                    },
+                    type: this.protocolType
+                }, res => {
+                    console.log("Ressssssss",res)
+                    if (!!res.Content.length) {
+                        this.Description = res.Content[0].Description
+                    } else {
+                        this.Description = ""
+                    }
+                    // console.log(res)
+                })
+                this.getDataForSource()
+                this.getbeenFoundList()
+            },
+            //查询数据源数据
+            getDataForSource() {
+                queryDataSourceCount({
+                    Filters: {
+                        Id: this.datasourceId
+                    }
+                }, res => {
+                    let data = res.Content[0]
+                    this.echartsData = [{
+                            name: "无法识别-" + data.Ignorestandard,
+                            value: data.Ignorestandard
+                        },
+                        {
+                            name: "未识别-" + data.Notstandard,
+                            value: data.Notstandard
+                        },
+                        {
+                            name: "已识别-" + data.Notrelated,
+                            value: data.Notrelated
+                        }
+                    ]
+                    this.sum = data.Sum
+                })
+            },
+            //查询标签列表
+            getbeenFoundList() {
+                let getListFetch;
+                if (this.type == "type") {
+                    getListFetch = queryEqTypeList
+                } else {
+                    getListFetch = queryEqParamList
+                }
+                // console.log(getListFetch)
+                getListFetch({
+                    data: {
+                        ProjectId: this.projectId,
+                        DataSourceId: this.datasourceId
+                    },
+                    type: this.protocolType
+                }, res => {
+                    // console.log(res, 'getListFetch')
+                    this.tagList = res.Content
+                })
+            }
+        },
+        watch:{
+        }
+    }
+</script>
+<style lang="scss" scoped>
+    .view-find-word {
+        .find-data {
+            height: 300px;
+            .left-view {
+                width: 300px;
+                height: 300px;
+                display: inline-block;
+            }
+            .right-view {
+                width: calc(100% - 305px);
+                padding: 5px;
+                box-sizing: border-box;
+                height: 300px;
+                overflow-y: auto;
+                float: right;
+            }
+        }
+        .h10 {
+            height: 10px;
+        }
+        .find-tags {
+            display: inline-block;
+            margin: 8px;
+        }
+    }
+</style>

+ 185 - 0
src/components/config_point/ip_input.vue

@@ -0,0 +1,185 @@
+<template>
+    <ul class="ipAdress">
+        <template v-for="(item,index) in ipAdress">
+            <li class="saga-border" :key="index">
+                <input type="text" @input="checkIpVal(item,index)" @keyup="turnIpPOS(item,index,$event)" v-model="item.value" ref="ipInput" @blur="setDefaultVal(item)">
+            </li>
+            <span v-if="!!value && index == 3" :key="index">:</span>
+            <li v-if="!!value && index == 3" class="saga-border" :key="index">
+                <input type="text" @input="checkIpVal(value[0],4)" @keyup="turnIpPOS(value[0],4,$event)" v-model="value[0].value" ref="ipInput" @blur="setDefaultVal(value)">
+            </li>
+        </template>
+    </ul>
+</template>
+<script>
+    export default {
+        name: "ipInput",
+        props: {
+            ip: {
+                type: [Object, String],
+                default: ""
+            },
+            port: {
+                type: [Number, String],
+                default: ""
+            }
+        },
+        data() {
+            return {
+                ipAdress: [{
+                    value: ''
+                }, {
+                    value: ''
+                }, {
+                    value: ''
+                }, {
+                    value: ''
+                }],
+                value: [{
+                    value: ''
+                }]
+            }
+        },
+        created() {},
+        mounted() {},
+        methods: {
+            //methods
+            changeData() {
+                if (this.ip == '') {
+                    this.ipAdress = [{
+                        value: ''
+                    }, {
+                        value: ''
+                    }, {
+                        value: ''
+                    }, {
+                        value: ''
+                    }]
+                } else {
+                    this.ipAdress = this.ip.split(".").map(item => {
+                        return {
+                            value: item
+                        }
+                    })
+                }
+                if (this.port == "") {
+                    this.$set(this.value[0], `value`, '')
+                } else {
+                    this.$set(this.value[0], `value`, this.port)
+                }
+                console.log(this.value)
+            },
+            checkIpVal(item, index) {
+                let self = this;
+                //确保每个值都处于0-255
+                let val = item.value
+                console.log(val,item)
+                //当输入的是空格时,值赋为空
+                val = val.trim();
+                val = parseInt(val, 10);
+                if (isNaN(val)) {
+                    val = ''
+                } else {
+                    if (index == 4) {
+                        val = val < 0 ? 0 : val;
+                        val = val > 65535 ? 65535 : val;
+                    } else {
+                        val = val < 0 ? 0 : val;
+                        val = val > 255 ? 255 : val;
+                    }
+                }
+                if (index != 4) {
+                    item.value = val;
+                } else {
+                    this.value[0].value = val
+                }
+                this.changeEmit()
+            },
+            turnIpPOS(item, index, event) {
+                let self = this;
+                let e = event || window.event;
+                //左箭头向左跳转,左一不做任何措施
+                if (e.keyCode == 37) {
+                    if (index == 0) {} else {
+                        self.$refs.ipInput[index - 1].focus();
+                    }
+                }
+                //删除键把当前数据删除完毕后会跳转到前一个input,左一不做任何处理
+                if (e.keyCode == 8) {
+                    let val = item.value;
+                    if (!!val && val != 0) {
+                        return false
+                    }
+                    if (index == 0) {} else {
+                        self.$refs.ipInput[index - 1].focus();
+                    }
+                }
+                //右箭头、回车键、空格键、冒号均向右跳转,右一不做任何措施
+                if (e.keyCode == 39 || e.keyCode == 13 || e.keyCode == 32 || e.keyCode == 190) {
+                    if (index == 4) {} else {
+                        self.$refs.ipInput[index + 1].focus();
+                    }
+                }
+                this.changeEmit()
+            },
+            setDefaultVal(item) {
+                //当input失去焦点,而ip没有赋值时,会自动赋值为0
+                let self = this;
+                let val = item.value;
+                if (val == '') {
+                    item.value = '0';
+                }
+                this.changeEmit()
+            },
+            changeEmit() {
+                let returnData = this.ipAdress.map(item => {
+                    return item.value
+                }).join(".")
+                this.$emit("change", returnData, this.value[0].value)
+            }
+        },
+        watch: {
+            ip: function() {
+                this.changeData()
+            }
+        }
+    }
+</script>
+<style lang="scss" scoped>
+    .ipAdress {
+        display: flex;
+        align-items: center;
+        width: 100%;
+        height: 100%;
+        margin-right: 10px;
+        width: 280px;
+        justify-content: space-around;
+    }
+    .ipAdress li {
+        position: relative; //   height: 23px;
+        margin: 2px;
+    }
+    ul[class="ipAdress"] input[type="text"] {
+        border: none;
+        width: 100%; //   height: 23px;
+        text-align: center;
+        background: transparent;
+    }
+    .ipAdress li div {
+        position: absolute;
+        bottom: 2px;
+        right: 0;
+        border-radius: 50%;
+        background: #0190fe;
+        width: 2px;
+        height: 2px;
+    }
+    /*只需要3个div*/
+    .ipAdress li:last-child div {
+        display: none;
+    }
+    /*取消掉默认的input focus状态*/
+    .ipAdress input:focus {
+        outline: none;
+    }
+</style>

+ 156 - 0
src/components/config_point/location_flag.vue

@@ -0,0 +1,156 @@
+<template>
+    <div class="localtion-falg">
+        <div class="select-flag dcenter">
+            <el-tag class="localtion-tag" @close="delTags(item)" :key="item" color="#FFF6E7" type="warning" size="small" v-for="item in localtionArr" closable>{{item}}</el-tag>
+        </div>
+        <div class="localtion-do-point dcenter pointer">更多可用标签</div>
+        <div class="localtion-view">
+            <div class="location-tag-view">
+                <el-tag @click="addToActive(item.Name)" :key="item.Name" class="default-tag pointer" v-for="item in queryLocaltionArr" size="small" color="#fff">{{item.Name}}</el-tag>
+            </div>
+        </div>
+        <div class="center">
+            <el-input v-model="localtionName" style="width:200px;margin-right:10px;"></el-input>
+            <el-button type="primary" @click="addLocaltion">新增标签</el-button>
+        </div>
+    </div>
+</template>
+<script>
+    import {
+        mapGetters,
+        mapActions
+    } from "vuex";
+    import {
+        queryLocaltionFlag,
+        updateLocaltionFlag,
+        delLocaltionFlag,
+        addLocaltionFlag
+    } from "@/fetch/point_http"
+    export default {
+        name: 'localtion-flag',
+        props: {
+            renderData: {
+                type: Object,
+                default:function(){
+                    return {
+                        LocationFlag: []
+                    }
+                }
+            }
+        },
+        data() {
+            return {
+                localtionArr: [],
+                localtionName: "",
+                queryLocaltionArr: []
+            }
+        },
+        computed: {
+            ...mapGetters("project", [
+                "projectId",
+                "datasourceId",
+                "protocolType"
+            ])
+        },
+        created() {},
+        mounted() {
+            this.queryData()
+            this.changeData()
+        },
+        methods: {
+            //将标签添加到活跃标签中
+            addToActive(val){
+                console.log(val)
+                this.localtionArr.push(val)
+                this.changeTags()
+            },
+            //删除已有标签
+            delTags(val){
+                this.localtionArr = this.localtionArr.map(item => {
+                    if(item == val){
+                        return undefined
+                    }else{
+                        return item
+                    }
+                }).filter(d => d);
+                console.log(this.localtionArr)
+                this.changeTags()
+            },
+            changeTags(){
+                this.renderData.LocationFlag = this.localtionArr
+                this.$emit("changeTag")
+            },
+            queryData(){
+                queryLocaltionFlag({},res => {
+                    console.log(res)
+                    this.queryLocaltionArr = res.Content
+                })
+            },
+            //添加位置标签
+            addLocaltion(){
+                let param = {
+                    Name: this.localtionName
+                }
+                addLocaltionFlag(param,res => {
+                    this.queryData()
+                    this.$message.success("添加成功")
+                    this.localtionName = ""
+                })
+            },
+            changeData(){
+                this.localtionArr = this.renderData.LocationFlag || []
+            }
+        },
+        watch: {
+            renderData: {
+                deep: true,
+                handler: function(){
+                    this.changeData()
+                }
+            }
+        }
+    }
+</script>
+<style lang="scss" scoped>
+.localtion-falg{
+    height: 300px;
+    overflow: hidden;
+    .select-flag{
+        height: 80px;
+        width: 540px;
+        line-height: 40px;
+        border-bottom: 1px solid #DEE3F3;
+        overflow-y: auto;
+    }
+    .localtion-do-point{
+        height: 30px;
+        width: 112px;
+        line-height: 30px;
+        background-color: #EEFAFF;
+        font-size: 12px;
+        color: #8E9CC1;
+        text-align: center;
+    }
+    .localtion-tag{
+        border-radius: 100px;
+        color: #F5A623;
+        border-color: #F5A623;
+        margin-right: 10px;
+    }
+    .localtion-view{
+        height: 115px;
+        margin-top: 10px;
+        .location-tag-view{
+            margin-left: 20px;
+            height: 100%;
+            overflow-y: auto;
+            .default-tag{
+                border-color: #C2CEDB;
+                color:#8E9CC1;
+                border-radius: 100px;
+                margin-right: 10px;
+            }
+        }
+    }
+}
+</style>

+ 97 - 0
src/components/config_point/select_one.vue

@@ -0,0 +1,97 @@
+<!--
+    @param name 表头文案
+    @param isOK 是否显示前一级的完成
+    @param renderData 数据
+    @param infosKey  dom中显示renderData中的某个字段
+-->
+
+<template>
+    <div class="select-own-one saga-border">
+        <p>{{name}}</p>
+        <ul v-if="renderData.length">
+            <li v-for="(item,index) in renderData" :key="item">
+                <div @click="checkItem(item,index)"  :class="index == active ? 'saga-active-select': ''" class="select-item select-bg border-bottom pointer">
+                    <span v-if="isOK"></span>
+                    {{item[infosKey]}}
+                </div>
+            </li>
+        </ul>
+        <div v-else>
+            暂无数据
+        </div>
+    </div>
+</template>
+<script>
+    export default {
+        name: "select_one",
+        props: {
+            name: {
+                type: String,
+                default: "原始点位描述"
+            },
+            isOK: {
+                type: Boolean,
+                default: false
+            },
+            renderData: {
+                type: Array,
+                default: function() {
+                    return [
+                    ]
+                }
+            },
+            infosKey: {
+                type: String,
+                default: "name"
+            }
+        },
+        data() {
+            return {
+                active: 0,
+            }
+        },
+        created() {},
+        mounted() {},
+        methods: {
+            checkItem(item,index){
+                this.$emit("check",item)
+                this.active = index
+            },
+            change(){
+                this.$emit("check",this.renderData[this.active])
+            }
+        },
+        watch: {
+            renderData: {
+                deep: true,
+                handler: function (){
+                    this.change()
+                    //do something
+                    console.log("change")
+                }
+            }
+        }
+    }
+</script>
+<style lang="scss" scoped>
+.saga-active-select{
+    background-color: #9FC5F8;
+}
+    .select-own-one {
+        display: inline-block;
+        height: 100%;
+        height: 340px;
+        width: 230px;
+        overflow-y: auto;
+    }
+    .border-bottom{
+        border-bottom: 3px solid #ccc;
+    }
+    .select-item{
+        height: 30px;
+        line-height: 30px;
+    }
+    .select-item:hover{
+        background-color: #9FC5F8;
+    }
+</style>

+ 94 - 0
src/components/config_point/step3_edit/auto_handle.vue

@@ -0,0 +1,94 @@
+<template>
+    <el-form ref='form' :rules='rules' :model='form' label-width='140px'>
+        <el-form-item v-if="devFlag"  ref='form' label='设备标识' prop='EquipmentMark'>
+            <el-input v-model='form.EquipmentMark'></el-input>
+        </el-form-item>
+        <el-form-item label='原始点位值单位' prop='unit'>
+            <el-cascader :options='options' v-model='form.unit' @change='handleChange'></el-cascader>
+            <p class='tip'>数据字典信息点-{{unitObj ? (unitObj.infoPointName || '--') : '--'}}({{unitObj ? (unitObj.unit || '--') : '--'}})</p>
+        </el-form-item>
+    </el-form>
+</template>
+
+<script>
+import { batchQueryUnit } from '@/fetch/point_http'
+export default {
+    name: 'step3_auto-handle',
+    data() {
+        return {
+            options: [],
+            form: {
+                EquipmentMark: '',
+                unit: [],
+                unitStr: null,
+            },
+            rules: {
+                EquipmentMark: [{ required: true, message: '请输入设备标识', trigger: 'blur' }],
+                unit: [{ required: true, message: '请选择原始点位值单位', trigger: ['change', 'blur'] }]
+            }
+        }
+    },
+    props: {
+        unitObj: {
+            default: {}
+        },
+        devFlag: {
+            default: true,
+            type: Boolean
+        }
+    },
+    methods: {
+        getForm(cb) {
+            this.$refs['form'].validate(valid => {
+                if (valid) {
+                    cb(this.form)
+                } else {
+                    cb(false)
+                }
+            })
+        },
+        handleChange(val) {
+            console.log(val)
+            // this.form.unitStr = val.
+        },
+        getUnitList() {
+            batchQueryUnit({}, res=> {
+                if(res.Result == "Success") {
+                    let data = res.Content;
+                    let arr = []
+                    data.forEach(item => { 
+                        let first = {
+                            value: item.Type,
+                            label: item.Type,
+                            children: []
+                        }                        
+                        item.Units.forEach(ele => {
+                            let second = {}
+                            second = {
+                                value: ele.Name,
+                                label: ele.Name
+                            }
+                            first.children.push(second)
+                        })                       
+                        arr.push(first)
+                    })
+                    this.options = arr
+                }
+            })
+        },
+        init() {
+            //获取单位
+            this.getUnitList()
+        }
+    },
+    created() {
+        this.init()
+    }
+}
+</script>
+
+<style scoped lang='scss'>
+.tip {
+    color: #ccc;
+}
+</style>

+ 129 - 0
src/components/config_point/step3_edit/enum_handle.vue

@@ -0,0 +1,129 @@
+<template>
+    <div class='edit-box'>
+        <el-form ref='form' :rules='rules' :model='form' label-width='140px'>
+            <el-form-item v-if="devFlag" label='设备标识' prop='EquipmentMark'>
+                <el-input v-model='form.EquipmentMark'></el-input>
+            </el-form-item>
+        </el-form>
+        <ul class='point-box' v-if='pointArr.length'>
+            <p class='character'>
+                <span>如果</span>
+            </p>
+            <p class='character nm'>
+                <span>那么</span>
+            </p>
+            <li v-for='(item,index) in pointArr' :key='index'>
+                <p>
+                    <span class='name'>原始点位值 =</span>
+                    <span class='value'>
+                        <el-input v-model='item.from'></el-input>
+                    </span>
+                </p>
+                <p>
+                    <span class='name'>转换为标准值 =</span>
+                    <span class='value'>
+                        <el-input v-model='item.to'></el-input>
+                    </span>
+                    <i class='el-icon-delete delete' @click='deleteRow(index)'></i>
+                </p>
+            </li>
+        </ul>
+        <div class='add-btn-box'>
+            <el-button type='primary' @click='addRules'>+添加新转换规则</el-button>
+        </div>
+    </div>
+</template>
+
+<script>
+export default {
+    name: 'step3_auto-handle',
+    data() {
+        return {
+            form: {
+                EquipmentMark: ''
+            },
+            rules: {
+                EquipmentMark: [{ required: true, message: '请输入设备标识', trigger: 'blur' }]
+            },
+            pointArr: []
+        }
+    },
+    props: {
+        devFlag: {
+            default: true,
+            type: Boolean
+        }
+    },
+    methods: {
+        getForm(cb) {
+            this.$refs["form"].validate((valid) => {
+                if(valid){
+                    this.form.pointArr = this.pointArr;
+                    cb(this.form)
+                } else {
+                    cb(false)
+                }
+            })
+        },
+        addRules() {
+            this.pointArr.push(this.newRules())
+        },
+        newRules() {
+            return { from: '', to: '' }
+        },
+        deleteRow(index) {
+            this.pointArr.splice(index, 1)
+        }
+    }
+}
+</script>
+
+<style scoped lang='scss'>
+.edit-box {
+    padding: 20px 0;
+    .tip {
+        color: #ccc;
+    }
+    .point-box {
+        margin-top: 45px;
+        position: relative;
+        width: 500px;
+        .character {
+            position: absolute;
+            top: -25px;
+            left: -6px;
+            font-size: 22px;
+            width: 500px;
+            text-align: left;
+        }
+        .nm {
+            text-align: center;
+        }
+        li {
+            display: flex;
+            justify-content: space-between;
+            margin-top: 5px;
+            p {
+                .name {
+                    padding-left: 40px;
+                }
+                .value {
+                    margin-left: 10px;
+                    display: inline-block;
+                    width: 80px;
+                }
+                .delete {
+                    margin-left: 5px;
+                    cursor: pointer;
+                    position: relative;
+                    z-index: 99999;
+                }
+            }
+        }
+    }
+    .add-btn-box {
+        margin-top: 20px;
+        text-align: center;
+    }
+}
+</style>

+ 119 - 0
src/components/config_point/step3_edit/formula_handle.vue

@@ -0,0 +1,119 @@
+<template>
+    <div class='edit-box'>
+        <el-form ref='form' :rules='rules' :model='form' label-width='140px'>
+            <el-form-item v-if='devFlag' label='设备标识' prop='EquipmentMark'>
+                <el-input v-model='form.EquipmentMark'></el-input>
+            </el-form-item>
+        </el-form>
+        <div class='formula-box'>
+            <p>原始点位</p>
+            <p class='xia-1'>👇</p>
+            <div>
+                截取:
+                <el-switch v-model='subStrVal' active-color='#13ce66' inactive-color='#ff4949'></el-switch>
+                <p class='sub-p'>
+                    <el-input-number v-model='from' :min='1' :max='10' label='描述文字' :disabled="!subStrVal"></el-input-number>位 - 第
+                    <el-input-number  v-model='to' :min='1' :max='10' label='描述文字' :disabled="!subStrVal" @change='subToChange'></el-input-number>位(从1开始)
+                </p>
+            </div>
+            <p class='xia-2'>👇</p>
+            <p>
+                数值计算:
+                <el-switch v-model='valCountVal' active-color='#13ce66' inactive-color='#ff4949'></el-switch>
+            </p>
+            <p>
+                <el-select class='mark' v-model="mark" placeholder="请选择" :disabled="!valCountVal">
+                    <el-option
+                    v-for="item in markArr"
+                    :key="item.value"
+                    :label="item.label"
+                    :value="item.value">
+                    </el-option>
+                </el-select>
+                <el-input class='mark-value' v-model='markValue' :disabled="!valCountVal"></el-input>
+            </p>
+        </div>
+    </div>
+</template>
+
+<script>
+export default {
+    name: 'step3_formula-handle',
+    data() {
+        return {
+            form: {
+                EquipmentMark: '',
+            },
+            rules: {
+                EquipmentMark: [{ required: true, message: '请输入设备标识', trigger: 'blur' }]
+            },
+            subStrVal: true,
+            from: 1,
+            to: 1,
+            valCountVal: true,
+            mark:'plus',
+            markValue: '',
+            markArr:[{
+                label: '+',
+                value: 'plus'
+            }]
+        }
+    },
+    props: {
+        devFlag: {
+            default: true,
+            type: Boolean
+        }
+    },
+    methods: {
+        getForm(cb) {
+            this.$refs["form"].validate((valid) => {
+                if(valid){
+                    if(this.subStrVal) {
+                        this.form.from = this.from;
+                        this.form.to = this.to;
+                    }
+                    if(this.valCountVal) {
+                        this.form.mark = this.mark;
+                        this.form.markValue = this.markValue;
+                    }
+                    cb(this.form)
+                } else {
+                    cb(false)
+                }
+            })
+        },
+        subToChange(val) {
+
+        }
+    },
+    watch: {
+        from(val) {
+            if(val > this.to) {
+                this.to = val
+            } 
+        }
+    }
+}
+</script>
+
+<style lang='scss' scoped>
+.edit-box {
+    .formula-box {
+        padding-left: 40px;
+        .sub-p {
+            margin-top: 10px;
+        }
+        .xia-2 {
+            padding-left: 50px;
+        }
+        .mark {
+            width: 100px;
+        }
+        .mark-value {
+            margin-left: 30px;
+            width: 200px;
+        }
+    }
+}
+</style>

+ 430 - 0
src/components/config_point/step3_edit/index.vue

@@ -0,0 +1,430 @@
+<template>
+    <div class='box'>
+        <div class='left'>
+            <ul>
+                <li>
+                    <span>原始点位信息:</span>&nbsp;&nbsp;&nbsp;
+                    <span>{{editData.Description || '--'}}</span>
+                </li>
+                <li>
+                    <span>位置标签:</span>&nbsp;&nbsp;&nbsp;
+                    <span>{{editData.LocationFlag || '--'}}</span>
+                </li>
+                <li>
+                    <span>设备类型:</span>&nbsp;&nbsp;&nbsp;
+                    <span>{{editData.KeyEquipmentType || '--'}}</span>
+                </li>
+                <li>
+                    <span>设备参数:</span>&nbsp;&nbsp;&nbsp;
+                    <span>{{editData.KeyEquipmentParameter || '--'}}</span>
+                </li>
+                <li>
+                    <span>值/单位说明:</span>&nbsp;&nbsp;&nbsp;
+                    <span>{{editData.ValueDescription || '--'}}</span>
+                </li>
+                <li>
+                    <span>备注:</span>&nbsp;&nbsp;&nbsp;
+                    <span>{{editData.Remarks || '--'}}</span>
+                </li>
+            </ul>
+        </div>
+        <div class='right'>
+            <el-form class='form' :rules='rules' ref='form' :model='form' label-width='140px'>
+                <el-form-item
+                    label='对应数据字典'
+                    prop='dict'
+                    :rules='[{ required: true, message: "请输入对应数据字典", trigger: "change" },{ validator: validateDict, trigger: ["blur", "change"] }]'
+                >
+                    <el-cascader
+                        style='width: 100%;'
+                        :options='options'
+                        v-model='form.dict'
+                        @change='handleChange'
+                        :props='props'
+                        filterable
+                        @active-item-change='handleItemChange'
+                    ></el-cascader>
+                    <div class='dict'>
+                        <!-- <p class='top'>
+                            <i class='el-icon-plus'></i>
+                            <el-button type='text'>添加自定义信息点</el-button>
+                        </p> -->
+                        <p class='btm'>
+                            <el-input type='textarea' :rows='2' placeholder='信息点的单位及值的说明' v-model='form.ValueDescription'></el-input>
+                        </p>
+                    </div>
+                </el-form-item>
+                <el-form-item label='值处理方式' prop='DataRuleType'>
+                    <el-select v-model='form.DataRuleType' placeholder='请选择'>
+                        <el-option
+                            v-for='item in handleTypeArr'
+                            :key='item.value'
+                            :label='item.label'
+                            :value='item.value'
+                        ></el-option>
+                    </el-select>
+                </el-form-item>
+                <!-- components -->
+                <no-handle ref='noHandle' v-if='form.DataRuleType == "无需处理,直接使用"'></no-handle>
+                <auto-handle ref='autoHandle' v-else-if='form.DataRuleType == "需自动单位转换"' :unitObj='unitObj'></auto-handle>
+                <enum-handle ref='enumHandle' v-else-if='form.DataRuleType == "需按设置枚举转换"'></enum-handle>
+                <formula-handle ref='formulaHandle' v-else-if='form.DataRuleType == "需按公式转换"'></formula-handle>
+                <split-handle ref='splitHandle' v-else></split-handle>
+            </el-form>
+            <div class='btn-box'>
+                <el-button type='primary' @click='save'>保存</el-button>
+            </div>
+        </div>
+    </div>
+</template>
+
+<script>
+//components
+import noHandle from './no_handle'
+import autoHandle from './auto_handle'
+import enumHandle from './enum_handle'
+import formulaHandle from './formula_handle'
+import splitHandle from './split_handle'
+//api
+import { getEquipmentAll, getQueryProperty } from '@/fetch/data_plat'
+import { batchCreate } from '@/fetch/point_http'
+export default {
+    name: 'point_config_step3_edit',
+    data() {
+        return {
+            options: [],
+            optionObj: {},
+            infoDict: {}, //信息点字典
+            InfomationPoint: null, //信息点
+            unitObj: {}, //传给自动单位转换的obj
+            props: {
+                value: 'code',
+                label: 'name',
+                children: 'content'
+            },
+            form: {
+                dict: [],
+                ValueDescription: '', 
+                DataRuleType: '无需处理,直接使用'
+            },
+            rules: {
+                DataRuleType: [{ required: true, message: '请选择值处理方式', trigger: 'change' }]
+            },
+            handleTypeArr: [
+                {
+                    label: '无需处理,直接使用',
+                    value: '无需处理,直接使用'
+                },
+                {
+                    label: '需自动单位转换',
+                    value: '需自动单位转换'
+                },
+                {
+                    label: '需按设置枚举转换',
+                    value: '需按设置枚举转换'
+                },
+                {
+                    label: '需按公式转换',
+                    value: '需按公式转换'
+                },
+                {
+                    label: '需按拆分枚举转换',
+                    value: '需按拆分枚举转换'
+                }
+            ]
+        }
+    },
+    props: {
+        editData: {
+            type: Object,
+            default: {}
+        }
+    },
+    components: {
+        noHandle,
+        autoHandle,
+        enumHandle,
+        formulaHandle,
+        splitHandle
+    },
+    methods: {
+        validateDict(rule, value, cb) {
+            if (value.length < 4) {
+                cb(new Error('请选到第四级(可能本设备没有信息点)'))
+            } else {
+                cb()
+            }
+        },
+        //保存
+        save() {
+            this.$refs['form'].validate(valid => {
+                if (valid) {
+                    var flag = this.form.DataRuleType
+                    switch (flag) {
+                        case '无需处理,直接使用':
+                            this.$refs['noHandle'].getForm(noHandle => {
+                                if (noHandle) {
+                                    this.saveForm(this.form, noHandle)
+                                } else {
+                                    this.errMsg()
+                                }
+                            })
+                            break
+                        case '需自动单位转换':
+                            this.$refs['autoHandle'].getForm(autoHandle => {
+                                if (autoHandle) {
+                                    this.saveForm(this.form, autoHandle)
+                                } else {
+                                    this.errMsg()
+                                }
+                            })
+                            break
+                        case '需按设置枚举转换':
+                            this.$refs['enumHandle'].getForm(enumHandle => {
+                                if (enumHandle) {
+                                    this.saveForm(this.form, enumHandle)
+                                } else {
+                                    this.errMsg()
+                                }
+                            })
+                            break
+                        case '需按公式转换':
+                            this.$refs['formulaHandle'].getForm(formulaHandle => {
+                                if (formulaHandle) {
+                                    this.saveForm(this.form, formulaHandle)
+                                } else {
+                                    this.errMsg()
+                                }
+                            })
+                            break
+                        case '需按拆分枚举转换':
+                            this.$refs['splitHandle'].getForm(splitHandle => {
+                                if (splitHandle) {
+                                    this.saveForm(this.form, splitHandle)
+                                } else {
+                                    this.errMsg()
+                                }
+                            })
+                            break
+                    }
+                } else {
+                    this.errMsg()
+                    return false
+                }
+            })
+        },
+        saveForm(basic, other) {
+            console.log(basic, other)
+            let type = basic.DataRuleType
+            let basicParams = {
+                System: basic.dict[0], //系统
+                Specialty: basic.dict[1], //专业
+                EquipmentType: basic.dict[2], //设备类
+                Funcid: basic.dict[3], //信息点id
+                 InfomationPoint: this.InfomationPoint, //信息点
+                DataRuleType: basic.DataRuleType, //值处理方式
+                DataSourceId: '4',
+                PointId: this.editData.Id, //点位ID
+            }
+            let otherParams = {}
+            switch (type) {
+                case '无需处理,直接使用':
+                    otherParams = {
+                        EquipmentMark: other.EquipmentMark
+                    }
+                    break
+                case '需自动单位转换':
+                    otherParams = {}
+                    break
+                case '需按设置枚举转换':
+                    let DataRuleContent2 = other.pointArr.length
+                        ? JSON.stringify([{ seq: 1, ruletype: 'type2', content: other.pointArr }])
+                        : undefined
+                    otherParams = {
+                        EquipmentMark: other.EquipmentMark,
+                        DataRuleContent: DataRuleContent2
+                    }
+                    break
+                case '需按公式转换':
+                    let subRule = other.from
+                        ? {
+                              seq: 1,
+                              ruletype: 'type4',
+                              content: [
+                                  {
+                                      from: other.from,
+                                      to: other.to
+                                  }
+                              ]
+                          }
+                        : undefined
+                    let countRule = other.mark
+                        ? {
+                              seq: 1,
+                              ruletype: 'type6',
+                              content: [
+                                  {
+                                      calculationtype: other.mark,
+                                      value: other.markValue
+                                  }
+                              ]
+                          }
+                        : undefined
+
+                    let DataRuleContent3 = []
+                    if (subRule) {
+                        DataRuleContent3.push(subRule)
+                    }
+                    if (countRule) {
+                        DataRuleContent3.push(countRule)
+                    }
+                    DataRuleContent3 = DataRuleContent3.length ? JSON.stringify(DataRuleContent3) : undefined
+                    otherParams = {
+                        EquipmentMark: other.EquipmentMark,
+                        DataRuleContent: DataRuleContent3
+                    }
+                    break
+                case '需按拆分枚举转换':
+                    let SplitPoints = other.devArr.length ? other.devArr : undefined
+                    let DataRuleContent4 = undefined;
+                    if (other.pointArr) {
+                        DataRuleContent4 = other.pointArr
+                            ? JSON.stringify([
+                                  {
+                                      seq: 1,
+                                      ruletype: 'type4',
+                                      content: other.pointArr
+                                  }
+                              ])
+                            : undefined
+                    }
+                    otherParams = {
+                        SplitPoints: SplitPoints,
+                        DataRuleContent: DataRuleContent4
+                    }
+                    break
+            }
+            let params = [Object.assign(basicParams, otherParams)]
+            console.log(params)
+            batchCreate(params, res=> {
+                console.log(res);
+            })
+        },
+        errMsg() {
+            this.$message({
+                message: '有必填项未填',
+                type: 'warning'
+            })
+        },
+        handleChange(arr) {
+            this.unitObj = this.infoDict[arr[3]]
+            this.InfomationPoint = this.unitObj.infoPointName
+        },
+        handleItemChange(val) {
+            if (val.length == 3) {
+                let params = { type: val[2] }
+                getQueryProperty(params, res => {
+                    if (res.Result == 'success') {
+                        let data = res.Content
+                        let arr = data
+                            .filter(item => {
+                                return item.inputMode == 'L'
+                            })
+                            .map(item => {
+                                return {
+                                    code: item.infoPointCode,
+                                    name: item.infoPointName
+                                }
+                            })
+                        this.infoDict = {}
+                        data.forEach(item => {
+                            this.infoDict[item.infoPointCode] = item
+                        })
+                        this.optionObj = {}
+                        this.getOptionItem(this.options, val[2])
+
+                        if (arr.length) {
+                            this.optionObj.content = arr
+                        } else {
+                            this.optionObj.content = undefined
+                        }
+                    }
+                })
+            }
+        },
+        getOptionItem(arr, code) {
+            for (var i = 0; i < arr.length; i++) {
+                if (arr[i].code == code) {
+                    this.optionObj = arr[i]
+                }
+                if (arr[i].content && arr[i].content.length > 0) {
+                    this.getOptionItem(arr[i].content, code)
+                }
+            }
+        },
+        getEqAll() {
+            let params = { format: true }
+            getEquipmentAll(params, res => {
+                if (res.Result == 'success') {
+                    this.options = res.Content
+                }
+            })
+        },
+        init() {
+            //获取所有的设备
+            this.getEqAll()
+        }
+    },
+    mounted() {
+        this.init()
+    },
+    watch: {
+        editData: {
+            immediate: true,
+            handler(val) {
+                console.log('editData')
+                console.log(val)
+            }
+        }
+    }
+}
+</script>
+
+<style lang='scss' scoped>
+.box {
+    border: 1px solid #ccc;
+    display: flex;
+    padding: 20px 0;
+    .left {
+        width: 40%;
+        ul li {
+            display: flex;
+            height: 40px;
+            line-height: 40px;
+            span:nth-of-type(1) {
+                text-align: right;
+                width: 120px;
+            }
+        }
+    }
+    .right {
+        width: 60%;
+        .form {
+            width: 80%;
+            .dict {
+                .top {
+                    text-align: right;
+                    line-height: 33px;
+                }
+                .btm {
+                    margin-top: 5px;
+                }
+            }
+        }
+        .btn-box {
+            margin-top: 20px;
+            text-align: center;
+        }
+    }
+}
+</style>

+ 43 - 0
src/components/config_point/step3_edit/no_handle.vue

@@ -0,0 +1,43 @@
+<template>
+    <el-form ref='form' :model='form' :rules='rules' label-width='140px'>
+        <el-form-item v-if='devFlag' label='设备标识' prop="EquipmentMark">
+            <el-input v-model='form.EquipmentMark'></el-input>
+        </el-form-item>
+    </el-form>
+</template>
+
+<script>
+export default {
+    name: 'step3_no-handle',
+    data() {
+        return {
+            form: {
+                EquipmentMark: ''
+            },
+            rules: {
+                EquipmentMark: [{ required: true, message: '请输入设备标识', trigger: 'blur' }],
+            }
+        }
+    },
+    props: {
+        devFlag: {
+            default: true,
+            type: Boolean
+        }
+    },
+    methods: {
+        getForm(cb) {
+            this.$refs["form"].validate((valid) => {
+                if(valid){
+                    cb(this.form)
+                } else {
+                    cb(false)
+                }
+            })
+        }
+    }
+}
+</script>
+
+<style>
+</style>

+ 182 - 0
src/components/config_point/step3_edit/split_handle.vue

@@ -0,0 +1,182 @@
+<template>
+    <div class='edit-box'>
+        <el-form v-if='form.devArr.length' class='form' ref='form' :model='form' label-width='140px'>
+            <div class='dev-know' v-for='(item,index) in form.devArr' :key='index'>
+                <el-form-item
+                v-if='devFlag'
+                    label='设备标识:'
+                    :prop='"devArr." + index + ".EquipmentMark"'
+                    :rules='{
+      required: true, message: "设备标识不能为空", trigger: "blur"
+    }'
+                >
+                    <el-input v-model='item.EquipmentMark'></el-input>
+                </el-form-item>
+                <p class='strsub'>
+                    截取 第
+                    <el-input-number v-model='item.SplitStart' :min='1' :max='10' label='描述文字'></el-input-number>位 - 第
+                    <el-input-number v-model='item.SplitEnd' :min='1' :max='10' label='描述文字'></el-input-number>位(从1开始)
+                </p>
+                <i class='el-icon-minus del-sub-icon' @click="delDev(index)"></i>
+            </div>
+        </el-form>
+        <p class='tranf-box'>
+            需要将截取值转换为标准值:
+            <el-switch v-model='tranfVal' active-color='#13ce66' inactive-color='#ff4949'></el-switch>
+        </p>
+        <ul class='point-box' v-if='pointArr.length'>
+            <p class='character'>
+                <span>如果</span>
+            </p>
+            <p class='character nm'>
+                <span>那么</span>
+            </p>
+            <li v-for='(item,index) in pointArr' :key='index'>
+                <p>
+                    <span class='name'>原始点位值 =</span>
+                    <span class='value'>
+                        <el-input v-model='item.from' :disabled='!tranfVal'></el-input>
+                    </span>
+                </p>
+                <p>
+                    <span class='name'>转换为标准值 =</span>
+                    <span class='value'>
+                        <el-input v-model='item.to' :disabled='!tranfVal'></el-input>
+                    </span>
+                    <i class='el-icon-delete delete' @click='deleteRules(index)'></i>
+                </p>
+            </li>
+        </ul>
+        <div class='add-btn-box'>
+            <el-button type='primary' @click='addRules' :disabled='!tranfVal'>+添加新转换规则</el-button>
+        </div>
+    </div>
+</template>
+
+<script>
+export default {
+    name: 'step3_auto-handle',
+    data() {
+        return {
+            form: {
+                devArr: [
+                    {
+                        EquipmentMark: '',
+                        SplitStart: 1,
+                        SplitEnd: 2
+                    },{
+                        EquipmentMark: '',
+                        SplitStart: 1,
+                        SplitEnd: 2
+                    }
+                ]
+            },
+            tranfVal: true,
+            pointArr: []
+        }
+    },
+    props: {
+        devFlag: {
+            default: true,
+            type: Boolean
+        }
+    },
+    methods: {
+        getForm(cb) {
+            this.$refs["form"].validate((valid) => {
+                if(valid){
+                    if(this.tranfVal && this.pointArr.length) {
+                        this.form.pointArr = this.pointArr;
+                    }
+                    cb(this.form)
+                } else {
+                    cb(false)
+                }
+            })
+        },
+        delDev(index) {
+            this.form.devArr.splice(index,1);
+        },
+        addRules() {
+            this.pointArr.push(this.newRules())
+        },
+        newRules() {
+            return { from: '', to: '' }
+        },
+        deleteRules(index) {
+            if (!this.tranfVal) {
+                return false
+            }
+            this.pointArr.splice(index, 1)
+        }
+    }
+}
+</script>
+
+<style scoped lang='scss'>
+.edit-box {
+    .form {
+        .dev-know {
+            margin-top: 5px;
+            background: #e6e6e6;
+            padding: 5px 50px 5px 0;
+            width: 470px;
+            position: relative;
+            .del-sub-icon {
+                position: absolute;
+                right: 15px;
+                top: 50px;
+                cursor: pointer;
+            }
+            .strsub {
+                padding-left: 20px;
+            }
+        }
+    }
+    .tranf-box {
+        height: 50px;
+        line-height: 80px;
+    }
+    .point-box {
+        margin-top: 40px;
+        position: relative;
+        width: 500px;
+        .character {
+            position: absolute;
+            top: -40px;
+            left: 0;
+            font-size: 22px;
+            width: 500px;
+            text-align: left;
+        }
+        .nm {
+            text-align: center;
+        }
+        li {
+            display: flex;
+            justify-content: space-between;
+            margin-top: 5px;
+            p {
+                .name {
+                    padding-left: 40px;
+                }
+                .value {
+                    margin-left: 10px;
+                    display: inline-block;
+                    width: 80px;
+                }
+                .delete {
+                    margin-left: 5px;
+                    cursor: pointer;
+                    position: relative;
+                    z-index: 99999;
+                }
+            }
+        }
+    }
+    .add-btn-box {
+        margin-top: 20px;
+        text-align: center;
+    }
+}
+</style>

+ 141 - 0
src/components/config_point/step3_point/3_identify.vue

@@ -0,0 +1,141 @@
+<template>
+    <div class="identify-steps3">
+        <el-collapse v-model="activeName" @change="handleChange" accordion>
+            <el-collapse-item v-for="(item,index) in renderData" :key="index" :name="index+1">
+                <template slot="title">
+                    {{item.Group}}
+                </template>
+                <div class="collapse-item">
+                    <handsontable-component ref="handsontable"></handsontable-component>
+                </div>
+                <div class="center">
+                    <el-button type="primary" @click="save">保存</el-button>
+                </div>
+            </el-collapse-item>
+        </el-collapse>
+    </div>
+</template>
+<script>
+    import handsontableComponent from "@/components/common/handsontable"
+    import {
+        mapGetters,
+        mapActions
+    } from "vuex";
+    import {updatePoint} from "@/fetch/point_http"
+export default {
+    name: "nullIdentify",
+    props: {
+        renderData: {
+            type: Array,
+            default: function(){
+                return []
+            }
+        }
+    },
+    data(){ return {
+        activeName: "1",
+        hotArr: []
+    }},
+    computed: {
+            ...mapGetters("project", [
+                "projectId",
+                "datasourceId",
+                "protocolType"
+            ])
+        },
+    created(){},
+    mounted(){
+    },
+    methods:{
+        save(){
+            let data = this.hotArr[this.activeName-1].getSourceData()
+            data = data.map(item => {
+                return {
+                    EquipmentMark: item.own,
+                    Id: item.Id,
+                }
+            })
+            updatePoint({
+                data: {
+                    Content: data
+                },
+                type: this.protocolType
+            },res => {
+                this.$emit("saved")
+                this.$message.success("保存成功")
+            })
+        },
+        handleChange(val){
+            if(!val){
+                return false
+            }
+            if(this.renderData.length < this.activeName){
+                return false
+            }
+            let allData =this.renderData[this.activeName-1].PointList,data = {
+                data: allData,
+                colHeaders: ['设备标识','原始点位描述','位置标签','备注'],
+                columns: [
+                    {
+                        data: 'own'
+                    },
+                    {
+                        data: 'Description',
+                        readOnly:true,
+                    },
+                    {
+                        data: 'LocationFlag',
+                        readOnly:true,
+                    },
+                    {
+                        data: 'Remarks',
+                        readOnly:true,
+                    }
+                ],
+                maxRows: allData.length,
+            }
+            if(this.protocolType == 'knx'){
+                data.colHeaders.splice(2,0,'原始点位地址')
+                data.columns.splice(2,0,{
+                    data: 'GroupAddress',
+                    readOnly: true
+                })
+            }
+            if(this.protocolType == 'modbus-tcp'){
+                data.colHeaders.splice(2,0,'原始点位地址')
+                data.columns.splice(2,0,{
+                    data: 'RegistersAddress',
+                    readOnly: true
+                })
+            }
+            this.$nextTick(_ => {
+                this.hotArr[this.activeName-1] = this.$refs.handsontable[this.activeName-1].init(data) 
+            })            
+        }
+    },
+    watch:{
+        renderData: {
+            deep: true,
+            handler: function(){
+                console.log("changeData",this.renderData)
+                this.handleChange(this.activeName)
+            }
+        }
+    },
+    components: {
+        handsontableComponent
+    }
+}
+</script>
+<style lang="scss">
+.identify-steps3{
+    height: 100%;
+    overflow-y: auto;
+    .el-collapse-item__header.is-active{
+        border-bottom-color: #ccc;
+    }
+    .collapse-item{
+        height: 230px;
+    }
+}
+</style>

+ 259 - 0
src/components/config_point/step3_point/3_temps.vue

@@ -0,0 +1,259 @@
+<template>
+    <div>
+        <el-collapse v-if="renderData.length" v-model="activeName" @change="collapseChange" accordion>
+            <el-collapse-item name="1">
+                <template slot="title">①确定与数据字典中信息点得对应
+                </template>
+                <div class="collapse-item">
+                    <el-form class="form" :rules="rules" ref="form" :model="form1" label-width="120px">
+                        <el-form-item
+                            label="对应数据字典"
+                            prop="dict"
+                            :rules="[{ required: true, message: '请输入对应数据字典', trigger: 'change' },{ validator: validateDict, trigger: ['blur', 'change'] }]"
+                        >
+                            <el-cascader
+                            style="width: 100%;"
+                            :options="options"
+                            v-model="form1.dict"
+                            @change="handleChange"
+                            :props="props"
+                            filterable
+                            @active-item-change="handleItemChange"
+                            ></el-cascader>
+                        </el-form-item>
+                    </el-form>
+                    <div class="mess-main">
+                        <div></div>
+                        <div></div>
+                    </div>
+                    <div class="center">
+                        <el-button>下一步</el-button>
+                    </div>
+                </div>
+            </el-collapse-item>
+            <el-collapse-item name="2">
+                <template slot="title">
+                    ②确定值得处理方式
+                </template>
+                <div class="collapse-item">
+                    <el-form class="form" :rules="rules" ref="form2" :model="form2" label-width="140px">
+                        <el-form-item label='值处理方式' prop='DataRuleType'>
+                            <el-select v-model='form2.DataRuleType' placeholder='请选择'>
+                                <el-option
+                                    v-for='item in handleTypeArr'
+                                    :key='item.value'
+                                    :label='item.label'
+                                    :value='item.value'
+                                ></el-option>
+                            </el-select>
+                        </el-form-item>
+                        <!-- components -->
+                        <div ref='noHandle' v-if='form2.DataRuleType == "无需处理,直接使用"'></div>
+                        <auto-handle :devFlag="false" ref='autoHandle' v-else-if='form2.DataRuleType == "需自动单位转换"' :unitObj='unitObj'></auto-handle>
+                        <enum-handle :devFlag="false" ref='enumHandle' v-else-if='form2.DataRuleType == "需按设置枚举转换"'></enum-handle>
+                        <formula-handle :devFlag="false" ref='formulaHandle' v-else-if='form2.DataRuleType == "需按公式转换"'></formula-handle>
+                        <split-handle :devFlag="false" ref='splitHandle' v-else></split-handle>
+                    </el-form>
+                </div>
+                </el-collapse-item>
+                <el-collapse-item name="3">
+                <template slot="title">
+                    三确认并维护涉及到得原始呆腻味对应得设备标识
+                </template>
+            <div class="collapse-item">
+                <handsontable-component ref="handsontable"></handsontable-component>
+            </div>
+            </el-collapse-item>
+        </el-collapse>
+        <div v-else class="center">
+            暂无数据
+        </div>
+    </div>
+</template>
+<script>
+//components
+import noHandle from '@/components/config_point/step3_edit/no_handle'
+import autoHandle from '@/components/config_point/step3_edit/auto_handle'
+import enumHandle from '@/components/config_point/step3_edit/enum_handle'
+import formulaHandle from '@/components/config_point/step3_edit/formula_handle'
+import splitHandle from '@/components/config_point/step3_edit/split_handle'
+import handsontableComponent from "@/components/common/handsontable"
+
+
+import { getEquipmentAll, getQueryProperty } from '@/fetch/data_plat'
+import { batchCreate } from '@/fetch/point_http'
+    export default {
+        name: "tempsThree",
+        props: {
+            renderData: {
+                type:Array,
+                default: function(){
+                    return []
+                }
+            }
+        },
+        data() {
+            return {
+                activeName: 1,
+                form1: {
+                    dict: []
+                },
+                options: [],
+                props: {
+                    value: 'code',
+                    label: 'name',
+                    children: 'content'
+                },
+                infoDict: {}, //信息点字典
+                InfomationPoint: null, //信息点
+                unitObj: {}, //传给自动单位转换的obj
+                handleTypeArr: [
+                    {
+                        label: '无需处理,直接使用',
+                        value: '无需处理,直接使用'
+                    },
+                    {
+                        label: '需自动单位转换',
+                        value: '需自动单位转换'
+                    },
+                    {
+                        label: '需按设置枚举转换',
+                        value: '需按设置枚举转换'
+                    },
+                    {
+                        label: '需按公式转换',
+                        value: '需按公式转换'
+                    },
+                    {
+                        label: '需按拆分枚举转换',
+                        value: '需按拆分枚举转换'
+                    }
+                ],
+                form2: {
+                    ValueDescription: '', 
+                    DataRuleType: '无需处理,直接使用'
+                },
+                rules: {
+                    DataRuleType: [{ required: true, message: '请选择值处理方式', trigger: 'change' }]
+                },
+            }
+        },
+        created() {},
+        mounted() {
+            this.init()
+            console.log(this.renderData)
+        },
+        components:{
+            noHandle,
+            autoHandle,
+            enumHandle,
+            formulaHandle,
+            splitHandle,
+            handsontableComponent
+        },
+        methods: {
+            collapseChange(val) {
+                console.log(this.activeName)
+                if(this.activeName == 3){
+                    let setting = {
+                        data: this.renderData,
+                        maxRows: this.length,
+                        colHeaders: ['设备标识','原始点位描述','位置标签','备注'],
+                        columns: [
+                            {
+                                data: 'EquipmentMark'
+                            },
+                            {
+                                data: 'Description',
+                                readOnly: true
+                            },
+                            {
+                                data: 'LocationFlag',
+                                readOnly: true
+                            },
+                            {
+                                data: 'Remarks',
+                                readOnly: true
+                            }
+                        ]
+                    }
+                    this.$nextTick(_ => {
+                        this.$refs.handsontable.init(setting)
+                    })
+                }
+            },
+            validateDict(rule, value, cb) {
+                if (value.length < 4) {
+                    cb(new Error('请选到第四级(可能本设备没有信息点)'))
+                } else {
+                    cb()
+                }
+            },
+            handleChange(arr) {
+                this.unitObj = this.infoDict[arr[3]]
+                console.log(this.unitObj)
+                this.InfomationPoint = this.unitObj.infoPointName
+            },
+            handleItemChange(val) {
+                if (val.length == 3) {
+                    let params = { type: val[2] }
+                    getQueryProperty(params, res => {
+                        if (res.Result == 'success') {
+                            let data = res.Content
+                            let arr = data
+                                .filter(item => {
+                                    return item.inputMode == 'L'
+                                })
+                                .map(item => {
+                                    return {
+                                        code: item.infoPointCode,
+                                        name: item.infoPointName
+                                    }
+                                })
+                            this.infoDict = {}
+                            data.forEach(item => {
+                                this.infoDict[item.infoPointCode] = item
+                            })
+                            this.optionObj = {}
+                            this.getOptionItem(this.options, val[2])
+
+                            if (arr.length) {
+                                this.optionObj.content = arr
+                            } else {
+                                this.optionObj.content = undefined
+                            }
+                        }
+                    })
+                }
+            },
+            getOptionItem(arr, code) {
+                for (var i = 0; i < arr.length; i++) {
+                    if (arr[i].code == code) {
+                        this.optionObj = arr[i]
+                    }
+                    if (arr[i].content && arr[i].content.length > 0) {
+                        this.getOptionItem(arr[i].content, code)
+                    }
+                }
+            },
+            getEqAll() {
+                let params = { format: true }
+                getEquipmentAll(params, res => {
+                    if (res.Result == 'success') {
+                        this.options = res.Content
+                    }
+                })
+            },
+            init() {
+                //获取所有的设备
+                this.getEqAll()
+            }
+        }
+    }
+</script>
+<style lang="scss" scoped>
+    .collapse-item {
+        height: 170px;
+        overflow-y: auto;
+    }
+</style>

+ 195 - 0
src/components/config_point/step3_point/dialog_main.vue

@@ -0,0 +1,195 @@
+<!--steps3的左侧-->
+<template>
+    <div class="steps3-dialog-main">
+        <select-one  @check="typeCheck" :renderData="typeArr" infosKey="EquipmentType" :name="'原始点位描述中识别的设备类型'"></select-one>
+        <select-one  @check="paramCheck" :renderData="identifyArr" infosKey="ownMess" :name="'已标准化的设备标识'"></select-one>
+        <div class="own-collape">
+            <ident-collape v-if="!isNull" ref="ident" @saved="resetTwo" :renderData="identDataArr"></ident-collape>
+            <div v-else class="h100">
+                <div class="own-table-view">
+                    <handsontable-component ref="handsontable"></handsontable-component>
+                    <div class="center">
+                        <el-button type="primary" @click="">保存</el-button>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</template>
+<script>
+    import selectOne from "@/components/config_point/select_one"
+    import {
+        getStandType,
+        queryPoint,
+        updatePoint,
+        getStandParam,
+        getNullofParam
+    } from "@/fetch/point_http"
+    import tempCollape from "./3_temps"
+    import identCollape from "./3_identify"
+    import {
+        mapGetters,
+        mapActions
+    } from "vuex";
+    import handsontableComponent from "@/components/common/handsontable"
+    export default {
+        name: "updateParam",
+        data() {
+            return {
+                activeName: '1',
+                typeArr: [],
+                identifyArr: [],
+                KeyEquipmentType: "",
+                identDataArr: [],
+                isNull: false,
+                paramData: {},
+                Typs: {}
+            }
+        },
+        computed: {
+            ...mapGetters("project", [
+                "projectId",
+                "datasourceId",
+                "protocolType"
+            ])
+        },
+        created() {
+            this.getData()
+        },
+        mounted() {},
+        methods: {
+            getData(){
+                getStandType({
+                    data: {
+                        DataSourceId: this.datasourceId
+                    },
+                    type: this.protocolType
+                },res => {
+                    this.typeArr = res.Content
+                })
+            },
+            resetTwo(){
+                console.log("触发回调")
+                this.getParamList(this.Typs)
+            },
+            typeCheck(item){
+                console.log(item,"item")
+                this.getParamList(item)
+            },
+            paramCheck(param){
+                this.paramData = param
+                if(!!param.EquipmentMark && param.EquipmentMark == "空"){
+                    //空查询分组信息
+                    getNullofParam({
+                        data: {
+                            DataSourceId: this.datasourceId,
+                            KeyEquipmentType: this.KeyEquipmentType
+                        },
+                        type: this.protocolType
+                    },res =>{
+                        console.log(res)
+                        this.isNull = false
+                        this.identDataArr = res.Content
+                    })
+                }else{
+                    //不是空的情况查询点位列表
+                    console.log(param)
+                    queryPoint({
+                        data: {
+                            Filters: {
+                                equipmentMark: param.EquipmentMark,
+                                KeyEquipmentType: param.EquipmentType
+                            },
+                            PageNumber: 1,
+                            PageSize: 100
+                        },
+                        type: this.protocolType
+                    },res => {
+                        this.isNull = true
+                        this.identDataArr = res.Content
+                        let allData = this.identDataArr,data = {
+                            data: allData,
+                            colHeaders: ['设备标识','原始点位描述','位置标签','备注'],
+                            columns: [
+                                {
+                                    data: 'EquipmentMark'
+                                },
+                                {
+                                    data: 'Description',
+                                    readOnly:true,
+                                },
+                                {
+                                    data: 'LocationFlag',
+                                    readOnly:true,
+                                },
+                                {
+                                    data: 'Remarks',
+                                    readOnly:true,
+                                }
+                            ],
+                            maxRows: allData.length,
+                        }
+                        if(this.protocolType == 'knx'){
+                            data.colHeaders.splice(2,0,'原始点位地址')
+                            data.columns.splice(2,0,{
+                                data: 'GroupAddress',
+                                readOnly: true
+                            })
+                        }
+                        if(this.protocolType == 'modbus-tcp'){
+                            data.colHeaders.splice(2,0,'原始点位地址')
+                            data.columns.splice(2,0,{
+                                data: 'RegistersAddress',
+                                readOnly: true
+                            })
+                        }
+                        console.log(this.activeName,this.$refs.handsontable)
+                        this.$nextTick(_ => {
+                            this.$refs.handsontable.init(data) 
+                        }) 
+                    })
+                }
+            },
+            //通过type获取param的list
+            getParamList(item){
+                this.Typs = item
+                console.log(item)
+                this.KeyEquipmentType = item.EquipmentType
+                getStandParam({
+                    data: {
+                        DataSourceId: this.datasourceId,
+                        KeyEquipmentType: item.EquipmentType
+                    },
+                    type: this.protocolType
+                },res => {
+                    console.log(res,"res")
+                    this.identifyArr = res.Content.map(item => {
+                        item.ownMess = item.EquipmentMark + '(涉及原始点位:' + item.PointCount + ')'
+                        return item
+                    })
+                })
+            }
+        },
+        components: {
+            selectOne,
+            handsontableComponent,
+            tempCollape,
+            identCollape
+        }
+    }
+</script>
+<style lang="scss" scoped>
+    .steps3-dialog-main {
+        height: 400px;
+        .own-table-view{
+            height: calc(100% - 50px);
+        }
+        .own-collape {
+            border: 1px solid #ccc;
+            float: right;
+            width: calc(100% - 520px);
+            height: 340px;
+            position: relative;
+        }
+    }
+</style>

+ 135 - 0
src/components/config_point/step3_point/steps3_main.vue

@@ -0,0 +1,135 @@
+<!--steps3的左侧-->
+<template>
+    <div class="steps3-dialog-main">
+        <select-one  @check="typeCheck" :renderData="typeArr" infosKey="EquipmentType" :name="'原始点位描述中识别的设备类型'"></select-one>
+        <select-one  @check="paramCheck" :renderData="identifyArr" infosKey="ownMess" :name="'已标准化的设备标识'"></select-one>
+        <div class="own-collape">
+            <temp-collape ref="ident" :renderData="identDataArr"></temp-collape>
+        </div>
+    </div>
+</template>
+<script>
+    import selectOne from "@/components/config_point/select_one"
+    import {
+        groupRelated,
+        queryPoint,
+        updatePoint,
+        groupParamRelated,
+        getNullofParam
+    } from "@/fetch/point_http"
+    import tempCollape from "./3_temps"
+    import identCollape from "./3_identify"
+    import {
+        mapGetters,
+        mapActions
+    } from "vuex";
+    import handsontableComponent from "@/components/common/handsontable"
+    export default {
+        name: "updateParam",
+        data() {
+            return {
+                activeName: '1',
+                typeArr: [],
+                identifyArr: [],
+                KeyEquipmentType: "",
+                identDataArr: []
+            }
+        },
+        computed: {
+            ...mapGetters("project", [
+                "projectId",
+                "datasourceId",
+                "protocolType"
+            ])
+        },
+        created() {
+            this.getData()
+        },
+        mounted() {},
+        methods: {
+            getData(){
+                groupRelated({
+                    data: {
+                        DataSourceId: this.datasourceId
+                    },
+                    type: this.protocolType
+                },res => {
+                    this.typeArr = res.Content
+                })
+            },
+            typeCheck(item){
+                console.log(item,"item")
+                this.getParamList(item)
+            },
+            paramCheck(param){
+                if(param.EquipmentMark == "空"){
+                    //空查询分组信息
+                    getNullofParam({
+                        data: {
+                            DataSourceId: this.datasourceId,
+                            KeyEquipmentType: this.KeyEquipmentType
+                        },
+                        type: this.protocolType
+                    },res =>{
+                        console.log(res)
+                        this.identDataArr = res.Content
+                    })
+                }else{
+                    //不是空的情况查询点位列表
+                    console.log(param)
+                    queryPoint({
+                        data: {
+                            Filters: {
+                                KeyEquipmentParameter: param.EquipmentParameter,
+                                KeyEquipmentType: param.EquipmentType
+                                // KeyEquipmentParameter: '温度',
+                                // KeyEquipmentType: '冷机'
+                            },
+                            PageNumber: 1,
+                            PageSize: 100
+                        },
+                        type: this.protocolType
+                    },res => {
+                        console.log(res,"reslist")
+                        this.identDataArr = res.Content
+                    })
+                }
+            },
+            //通过type获取param的list
+            getParamList(item){
+                this.KeyEquipmentType = item.EquipmentType
+                groupParamRelated({
+                    data: {
+                        DataSourceId: this.datasourceId,
+                        KeyEquipmentType: item.EquipmentType
+                    },
+                    type: this.protocolType
+                },res => {
+                    console.log(res,"res")
+                    this.identifyArr = res.Content.map(item => {
+                        item.ownMess = item.EquipmentParameter
+                        return item
+                    })
+                })
+            }
+        },
+        components: {
+            selectOne,
+            handsontableComponent,
+            tempCollape,
+            identCollape
+        }
+    }
+</script>
+<style lang="scss" scoped>
+    .steps3-dialog-main {
+        height: 400px;
+        .own-collape {
+            border: 1px solid #ccc;
+            float: right;
+            width: calc(100% - 520px);
+            height: 340px;
+            position: relative;
+        }
+    }
+</style>

+ 126 - 0
src/components/echarts/doughnut.vue

@@ -0,0 +1,126 @@
+<template>
+    <div style="width:100%;height:100%;" :id="id">
+    </div>
+</template>
+<script>
+    import echarts from "echarts"
+    export default {
+        name: "doughnut",
+        props: {
+            id: {
+                type: String,
+                default: function createRandomId() {
+                    return (Math.random() * 10000000).toString(16).substr(0, 4) + '-' + (new Date()).getTime() + '-' + Math.random().toString().substr(2, 5);
+                }
+            },
+            renderData: {
+                type: Array,
+                default: function() {
+                    return []
+                }
+            }
+        },
+        data() {
+            return {
+                myCharts: null
+            }
+        },
+        created() {},
+        mounted() {
+            this.drawDoughnut()
+        },
+        methods: {
+            drawDoughnut() {
+                console.log(this.renderData, "renderData")
+                let options = {
+                    tooltip: {
+                        trigger: 'item',
+                        formatter: "{b}: ({d}%)"
+                    },
+                    legend: {
+                        orient: 'horizontal',
+                        x: 'center', // 'center'
+                        data: this.renderData.map(item => {
+                            return item.name
+                        })
+                    },
+                    graphic: {
+                        type: 'text',
+                        left: 'center',
+                        top: 'center',
+                        style: {
+                            text: '数据源\n1111',
+                            textAlign: 'center',
+                            fill: '#000',
+                            width: 30,
+                            height: 30
+                        }
+                    },
+                    series: [{
+                        name: '',
+                        type: 'pie',
+                        radius: ['40%', '60%'],
+                        itemStyle: {
+                            normal: {
+                                label: {
+                                    show: true,
+                                    textStyle: {
+                                        color: '#3c4858',
+                                        fontSize: "9"
+                                    },
+                                    formatter: function(val) { //让series 中的文字进行换行
+                                    console.log(val,val)
+                                        return val.name.split("-")[0];
+                                    }
+                                },
+                                title: {
+                                    text: 'aaaa'
+                                },
+                                labelLine: {
+                                    show: false,
+                                    lineStyle: {
+                                        color: '#3c4858'
+                                    }
+                                }
+                            },
+                            emphasis: {
+                                shadowBlur: 5,
+                                shadowOffsetX: 0,
+                                shadowColor: 'rgba(0, 0, 0, 0.5)',
+                                textColor: '#000'
+                            }
+                        },
+                        // data: [{
+                        //         value: 20,
+                        //         name: "1"
+                        //     },
+                        //     {
+                        //         value: 20,
+                        //         name: "2"
+                        //     },
+                        //     {
+                        //         value: 15,
+                        //         name: "3"
+                        //     }
+                        // ]
+                        data: this.renderData
+                    }],
+                    color: ['#9DA2D6', '#FBACA1', '#FFE37F']
+                }
+                this.myCharts = echarts.init(document.getElementById(this.id))
+                this.myCharts.setOption(options)
+            },
+        },
+        watch: {
+            renderData: {
+                deep: true,
+                handler: function() {
+                    this.drawDoughnut()
+                }
+            }
+        }
+    }
+</script>
+<style>
+
+</style>

+ 75 - 0
src/components/el_pack/dialog.vue

@@ -0,0 +1,75 @@
+
+
+<template>
+    <el-dialog :append-to-body="isAppendBody" :title="title" :close-on-press-escape="escape" :close-on-click-modal="isModel" :visible.sync="dialogVisible" :width="width" :before-close="cancel">
+        <slot></slot>
+        <span v-if="!!footer" slot="footer" class="dialog-footer">
+          <el-button @click="cancel">{{footer.cancel ? footer.cancel : "取 消"}}</el-button>
+          <el-button type="primary" @click="confirm">{{footer.confirm ? footer.confirm : "确 定"}}</el-button>
+        </span>
+    </el-dialog>
+</template>
+<script>
+    export default {
+        /**
+         * props //#endregion
+         * @param width  宽度,选填。默认40%,非必填
+         * @param dialogVisible  dialog是否显示,必填,默认false
+         * @param footer   dialog的下级footer的文案{cancel:'',confirm: ''}默认undefind,非必填
+         * @param isModel  model层点击隐藏dialog,非必填,默认true
+         * @param escape  键盘点击esc隐藏dialog,非必填,默认true
+         * @param title  表头文案,默认‘必填’
+         * @param isAppendBody 是否嵌入到body
+         * 
+         * @event cancel 取消事件,父组件必填
+         * @event confirm 确定事件,非必填
+         */
+        name: "ownDialog",
+        props: {
+            width: {
+                type: String,
+                default: "40%"
+            },
+            dialogVisible: {
+                type: Boolean,
+                default: false
+            },
+            footer: {
+                type: [Object, undefined],
+                default: undefined
+            },
+            isModel: {
+                type: Boolean,
+                default: true
+            },
+            escape: {
+                type: Boolean,
+                default: true
+            },
+            title: {
+                type: String,
+                default: "提示"
+            },
+            isAppendBody: {
+                type: Boolean,
+                default: false
+            }
+        },
+        data() {
+            return {}
+        },
+        created() {},
+        mounted() {
+        },
+        methods: {
+            cancel() {
+                this.$emit("cancel")
+            },
+            confirm() {
+                this.$emit("confirm")
+            }
+        }
+    }
+</script>
+<style lang="scss" scoped>
+</style>

+ 12 - 0
src/fetch/data_plat.js

@@ -0,0 +1,12 @@
+import { get, post, request } from './request'
+
+let dataForm = '/data-platform-3'
+
+//所有设备类型编码
+export function getEquipmentAll(params, success) {
+    return get(`${dataForm}/dict/query/equipment_all`, params, success)
+}
+//
+export function getQueryProperty(params, success) {
+    return get(`${dataForm}/infocode/query_property`, params, success)
+}

+ 40 - 0
src/fetch/fetch.js

@@ -0,0 +1,40 @@
+import axios from "axios";
+
+//axios 配置
+
+const instance = axios.create({
+    headers: {
+        "Content-Type": "application/json"
+    },
+    timeout: 30000,
+    baseURL: "", //接口请求地址
+})
+
+instance.interceptors.request.use(config => {
+    // 在发送请求之前做些什么,比如传token
+    const token = localStorage.getItem('token');
+    const projectId = localStorage.getItem('projectId');
+    if (token) {
+        config.headers.Authorization = token;
+    }
+    if (projectId) {
+        config.headers.ProjectId = projectId;
+    }
+    //config.data = JSON.stringify(config.data);
+    return config
+}, error => {
+    console.log(error)
+    return Promise.reject(error)
+})
+
+// 添加相应拦截器
+instance.interceptors.response.use(response => {
+    //对相应的数据做处理
+    const res = response;
+    return res;
+}, error => {
+    console.error(error)
+    return Promise.reject(error)
+})
+
+export default instance

+ 7 - 0
src/fetch/index.js

@@ -0,0 +1,7 @@
+import {get, post, request } from './request'
+
+let dataForm = '/data-platform-3'
+
+export function getTest(success) {
+    return get(`${dataForm}/dict/query/equipment_family`, {}, success)
+}

+ 269 - 0
src/fetch/point_http.js

@@ -0,0 +1,269 @@
+import {get, post, request } from './request'
+
+let point = '/pointconfig'
+let relation = '/relation'
+
+//添加数据源信息
+export function createDataSource(param, success) {
+    let data = param
+    return post(`${point}/datasource/create`, data, success)
+}
+
+//根据id删除数据源
+export function delDataSource(param, success) {
+    let data = param
+    return post(`${point}/datasource/delete`, data, success)
+}
+
+//查询数据源信息
+export function queryDataSource(param, success) {
+    let data = param
+    return post(`${point}/datasource/query`, data, success)
+}
+
+//查询数据源信息-包含统计信息
+export function queryDataSourceCount(param, success) {
+    let data = param
+    return post(`${point}/datasource/queryWithCount`, data, success)
+}
+
+//更新数据源信息
+export function updateDataSource(param, success) {
+    let data = param
+    return post(`${point}/datasource/update`, data, success)
+}
+
+/**----------------位置标签接口---------------------------- */
+//添加
+export function addLocaltionFlag(param, success) {
+    let data = param
+    return post(`${point}/location-flag/create`, data, success)
+}
+//删除
+export function delLocaltionFlag(param, success) {
+    let data = param
+    return post(`${point}/location-flag/delete`, data, success)
+}
+//修改
+export function updateLocaltionFlag(param, success) {
+    let data = param
+    return post(`${point}/location-flag/update`, data, success)
+}
+//查询
+export function queryLocaltionFlag(param, success) {
+    let data = param
+    return post(`${point}/location-flag/query`, data, success)
+}
+
+/**  --------------任何点位接口必传一个type---------------------   */
+//查询point list
+export function queryPoint(param, success) {
+    let data = param.data
+    return post(`${point}/point/${param.type}/query`, data, success)
+}
+
+//更新point
+export function updatePoint(param, success) {
+    let data = param.data,
+        key;
+    data.Content = data.Content.map(item => {
+        for (let key in item) {
+            if (item[key] === "") {
+                item[key] = null
+            }
+        }
+        return item
+    })
+    data.Projection = []
+    data.Content.map(item => {
+        for (key in item) {
+            if (data.Projection.indexOf(key) == -1) {
+                data.Projection.push(key)
+            }
+        }
+    })
+    return post(`${point}/point/${param.type}/update`, data, success)
+}
+
+//删除point
+export function deletePoint(param, success) {
+    let data = param.data
+    return post(`${point}/point/${param.type}/delete`, data, success)
+}
+
+//添加point
+export function createPoint(param, success) {
+    let data = param.data
+    return post(`${point}/point/${param.type}/create`, data, success)
+}
+
+//发现关键字(设备参数)
+export function findKeysWord(param, success) {
+    let data = param.data
+    return post(`${point}/point/${param.type}/next-equipment-parameter`, data, success)
+}
+
+//发现关键字(设备类型)
+export function findKeysWordType(param, success) {
+    let data = param.data
+    return post(`${point}/point/${param.type}/next-equipment-type`, data, success)
+}
+
+//查询设备类型分组列表(涉及点位数,包含空)
+export function queryAllEqTypeList(param, success) {
+    let data = param.data
+    return post(`${point}/point/${param.type}/group-equipment-type-statis-all`, data, success)
+}
+
+//查询设备类型分组列表(涉及点位数)
+export function queryEqTypeList(param, success) {
+    let data = param.data
+    return post(`${point}/point/${param.type}/group-equipment-type-statis`, data, success)
+}
+
+//查询设备参数分组列表(含空参数)
+export function queryAllEqParamList(param, success) {
+    let data = param.data
+    return post(`${point}/point/${param.type}/group-equipment-parameter-all`, data, success)
+}
+
+//查询设备参数分组列表(涉及点位数)
+export function queryEqParamList(param, success) {
+    let data = param.data
+    return post(`${point}/point/${param.type}/group-equipment-parameter-statis`, data, success)
+}
+
+///重命名关键字(设备参数)
+export function renameParam(param, success) {
+    let data = param.data
+    return post(`${point}/point/${param.type}/rename-equipment-parameter`, data, success)
+}
+
+///重命名关键字(设备类型)
+export function renameType(param, success) {
+    let data = param.data
+    return post(`${point}/point/${param.type}/rename-equipment-type`, data, success)
+}
+
+//设定关键字(设备参数)
+export function setParamTer(param, success) {
+    let data = param.data
+    return post(`${point}/point/${param.type}/set-equipment-parameter`, data, success)
+}
+
+//设定关键字(设备类型)
+export function setTypeTer(param, success) {
+    let data = param.data
+    return post(`${point}/point/${param.type}/set-equipment-type`, data, success)
+}
+
+//删除关键字(设备参数)
+export function delParamTer(param, success) {
+    let data = param.data
+    return post(`${point}/point/${param.type}/delete-equipment-parameter`, data, success)
+}
+//删除关键字(设备类型)
+export function delTypeTer(param, success) {
+    let data = param.data
+    return post(`${point}/point/${param.type}/delete-equipment-type`, data, success)
+}
+
+//查询设备类型分组列表(是否标准化设备标识)
+export function getStandType(param, success) {
+    let data = param.data
+    return post(`${point}/point/${param.type}/group-equipment-type-standarded`, data, success)
+}
+
+//查询设备标识分组列表(是否标准化设备标识,通过设备类型)
+export function getStandParam(param, success) {
+    let data = param.data
+    return post(`${point}/point/${param.type}/group-equipment-mark`, data, success)
+}
+
+//查询设备类型分组列表(是否对应数据字典)
+export function groupRelated(param, success) {
+    let data = param.data
+    return post(`${point}/point/${param.type}/group-equipment-type-related`, data, success)
+}
+
+//查询设备参数分组列表
+export function groupParamRelated(param, success) {
+    let data = param.data
+    return post(`${point}/point/${param.type}/group-equipment-parameter`, data, success)
+}
+
+//设备标识为空的查询
+export function getNullofParam(param, success) {
+    let data = param.data
+    return post(`${point}/point/${param.type}/group-equipment-point`, data, success)
+}
+
+//物理世界角度获取图数据(获取系统)
+export function platformSysJsMind(param, success) {
+    let data = param
+    return post(`${point}/relation/check-physical-system`, data, success)
+}
+
+//物理世界角度获取图数据(获取设备类)
+export function platformEqJsMind(param, success) {
+    let data = param
+    return post(`${point}/relation/check-physical-equipment-type`, data, success)
+}
+
+//物理世界角度获取图数据(设备标识)
+export function platformIdentJsMind(param, success) {
+    let data = param
+    return post(`${point}/relation/check-physical-equipment-mark`, data, success)
+}
+
+//物理世界角度获取图数据(物理世界信息点)
+export function platformInfoJsMind(param, success) {
+    let data = param
+    return post(`${point}/relation/check-physical-info`, data, success)
+}
+
+//物理世界角度获取图数据(原始点位)
+export function platformPointJsMind(param, success) {
+    let data = param
+    return post(`${point}/relation/check-physical-point`, data, success)
+}
+
+//原始点位角度检查图(专业系统)
+export function pointSytemJsMind(param, success) {
+    let data = param
+    return post(`${point}/relation/check-original-system`, data, success)
+}
+
+//原始点位角度检查图(原始点位)
+export function pointPostJsMind(param, success) {
+    let data = param
+    return post(`${point}/relation/check-original-point`, data, success)
+}
+
+//原始点位角度检查图(物理世界信息点)
+export function pointInfoJsMind(param, success) {
+    let data = param
+    return post(`${point}/relation/check-original-info`, data, success)
+}
+
+
+//原始点位角度检查图(设备类)
+export function pointTypeJsMind(param, success) {
+    let data = param
+    return post(`${point}/relation/check-original-equipment-type`, data, success)
+}
+
+/******************数据字典-单位接口***************************************************** */
+
+export function batchQueryUnit(param, success) {
+    let data = param
+    return post(`${point}/unit/batchquery`, data, success)
+}
+
+
+/******************物理世界关系对应****************************************************** */
+//批量创建对应关系
+export function batchCreate(param, success) {
+    let data = param
+    return post(`${relation}/batch-create`, data, success)
+}

+ 116 - 0
src/fetch/request.js

@@ -0,0 +1,116 @@
+import instance from "./fetch"
+
+import { Message } from 'element-ui';
+import router from '@/router/index.js'
+
+/**
+ * 
+ * @param {项目的filters} obj
+ * 
+ * @return {处理后的字符串}  string
+ */
+function delFilters(obj) {
+    let str = "",
+        key
+    for (key in obj) {
+        if (!obj[key] && typeof obj[key] != "undefined" && obj[key] != 0) {
+            str += key + " isNull;"
+        } else if (typeof obj[key] == 'string') {
+            str += key + "='" + obj[key] + "';"
+        } else {
+            str += key + "=" + obj[key] + ";"
+        }
+    }
+    console.log(str, "str")
+    return str.split(';').map(item => {
+        return !!item ? item : undefined
+
+    }).filter(d => d).join(';')
+}
+
+function successResponse(response, success, failed) {
+    let res = response.data;
+    let result = res.result || res.Result;
+    if (result == "success" || result == "Success") {
+        success(res)
+    } else if (result == "failure" || result == "Failure") {
+        let msg = res.ResultMsg || res.message || res.Message || res.resultMsg
+        Message.error({ message: msg })
+    } else {
+        router.replace('/login')
+    }
+}
+
+function errorResponse(response, err) {
+    let json = JSON.stringify(err),
+        lastData = JSON.parse(json)
+    console.log(err)
+    if (lastData.hasOwnProperty('config')) {
+        Message.error({ message: '接口:' + lastData.config.url + '请求错误' })
+    } else {
+        Message.error({ message: '请求错误:' + err });
+    }
+}
+
+
+/**
+ * post 请求方法
+ * @param url
+ * @param data
+ * @returns {Promise}
+ */
+export function post(url, data = {}, success) {
+    if (data.hasOwnProperty('Filters')) {
+        data.Filters = delFilters(data.Filters)
+    }
+    console.log(data, 'data')
+    instance.post(url, data).then(response => {
+        //对接口错误码做处理
+        successResponse(response, success)
+    }, err => {
+        errorResponse({}, err)
+    })
+}
+
+
+/**
+ * get 请求方法
+ * @param url
+ * @param data
+ * @returns {Promise}
+ */
+export function get(url, data = {}, success) {
+    instance.get(url, {
+            params: data
+        })
+        .then(response => {
+            successResponse(response, success)
+        })
+        .catch(err => {
+            errorResponse({}, err)
+        })
+}
+
+/**
+ * 封装所有请求
+ * @param methed
+ * @param url
+ * @param data 
+ * @param headers
+ * @returns {Promise}
+ */
+export function request(methed, url, data = {}, headers, success) {
+    instance({
+            method: methed || 'post',
+            url: url,
+            data: methed === 'get' ? { params: data } : data,
+            headers: headers || { 'Content-Type': 'application/json' },
+        })
+        .then(response => {
+            //对接口错误码做处理
+            successResponse(response, success)
+        })
+        .catch(err => {
+            errorResponse(response, err)
+        })
+}

+ 1 - 1
src/framework/layout/Main.vue

@@ -11,7 +11,7 @@
                         <el-breadcrumb-item v-for='(b, index) in breadcrumb' :key='index'>{{b.label}}</el-breadcrumb-item>
                     </el-breadcrumb>
                 </div>
-                <el-scrollbar tag="div" wrapClass="content-scrollbar">
+                <el-scrollbar tag="div" wrapClass="content-scrollbar" style="height:100%;">
                     <router-view class='page-content'/>
                 </el-scrollbar>
             </div>

+ 3 - 7
src/framework/style/theme.scss

@@ -2,14 +2,13 @@ $themeColor: #5BA7FF;
 .body {
     // color: #333;
 }
+
 #app {
     .page-header {
         background: $themeColor;
-
         .page-logo {
             background: #fff;
         }
-
         .data-menu {
             .data-menu-dropdown {
                 color: #fff;
@@ -28,10 +27,8 @@ $themeColor: #5BA7FF;
             }
         }
     }
-
     .page-container {
-        background: #f2f2f2;
-
+        // background: #f2f2f2;
         .page-sidebar-wrapper {
             // color: azure;
             background: #fff;
@@ -58,8 +55,7 @@ $themeColor: #5BA7FF;
             }
         }
     }
-
     .page-footer {
         background: #28303b;
     }
-}
+}

+ 7 - 7
src/main.js

@@ -8,7 +8,7 @@ import store from './store'
 import ElementUI from 'element-ui'
 import 'element-ui/lib/theme-chalk/index.css'
 import './framework/style/awesome.less'
-Vue.use(ElementUI)
+Vue.use(ElementUI, { size: "mini", zIndex: 1000 })
 
 import './framework/style/layout.scss'
 
@@ -19,9 +19,9 @@ Vue.config.productionTip = false
 
 /* eslint-disable no-new */
 new Vue({
-  el: '#app',
-  router,
-  store,
-  components: { App },
-  template: '<App/>'
-})
+    el: '#app',
+    router,
+    store,
+    components: { App },
+    template: '<App/>'
+})

+ 18 - 8
src/router/sagacloud.js

@@ -4,6 +4,14 @@ import Auth from '@/views/system/auth'
 import Dasboard from '@/views/dasboard'
 import ChangePwd from '@/views/system/pwd/ChangePwd'
 
+/**点位部分 */
+import pointConfig from '@/views/point/config_point'
+import editDataSouce from '@/views/point/config_point/edit_origin'
+import pointSteps from '@/views/point/config_point/steps'
+
+/**项目化配置 */
+import collectsetting from "@/views/project_setting/collection_setting"
+
 export default [
     { path: '/auth', name: 'Auth', component: Auth },
     // 系统相关
@@ -45,8 +53,10 @@ export default [
         name: 'LayoutMain',
         component: LayoutMain,
         children: [
-            { path: '', name: 'Dasboard', component: Dasboard },
-            { path: 'pointsetting', name: 'Dasboard', component: Dasboard }
+            { path: '', name: 'pointConfig', component: pointConfig },
+            { path: 'pointsetting', name: 'Dasboard', component: pointConfig },
+            { path: 'editDataSouce', name: 'editDataSouce', component: editDataSouce },
+            { path: 'pointSteps', name: 'pointSteps', component: pointSteps }
         ]
     },
     //项目化配置
@@ -57,7 +67,7 @@ export default [
         children: [
             { path: '', name: 'Dasboard', component: Dasboard },
             { path: 'custominfo', name: 'Dasboard', component: Dasboard },
-            { path: 'collectsetting', name: 'Dasboard', component: Dasboard }
+            { path: 'collectsetting', name: 'collectsetting', component: collectsetting }
         ]
     },
     //台账管理
@@ -69,7 +79,7 @@ export default [
             { path: '', name: 'Dasboard', component: Dasboard },
             { path: 'facility', name: 'Dasboard', component: Dasboard },
             { path: 'system', name: 'Dasboard', component: Dasboard },
-             { path: 'property', name: 'Dasboard', component: Dasboard }
+            { path: 'property', name: 'Dasboard', component: Dasboard }
         ]
     },
     //业务空间管理    
@@ -123,7 +133,7 @@ export default [
         component: LayoutMain,
         children: [
             { path: '', name: 'Dasboard', component: Dasboard },
-            { path: 'envlist', name: 'Dasboard', component: Dasboard }            
+            { path: 'envlist', name: 'Dasboard', component: Dasboard }
         ]
     },
     //市场及商务
@@ -133,7 +143,7 @@ export default [
         component: LayoutMain,
         children: [
             { path: '', name: 'Dasboard', component: Dasboard },
-            { path: 'own', name: 'Dasboard', component: Dasboard }            
+            { path: 'own', name: 'Dasboard', component: Dasboard }
         ]
     },
     //revit服务器端化的web功能
@@ -143,7 +153,7 @@ export default [
         component: LayoutMain,
         children: [
             { path: '', name: 'Dasboard', component: Dasboard },
-            { path: 'revit', name: 'Dasboard', component: Dasboard }            
+            { path: 'revit', name: 'Dasboard', component: Dasboard }
         ]
     },
-]
+]

+ 5 - 3
src/store/index.js

@@ -2,8 +2,9 @@ import Vue from 'vue'
 import Vuex from 'vuex'
 import storage from '@/utils/storage'
 import layout from '@/framework/layout/layout-store'
+import project from "./moudles/project"
 Vue.use(Vuex)
-
+console.log(project, 'project')
 const KEY_LAST_ROUTE = 'last_route'
 
 export default new Vuex.Store({
@@ -34,6 +35,7 @@ export default new Vuex.Store({
     },
     actions: {},
     modules: {
-        layout
+        layout,
+        project
     }
-})
+})

+ 42 - 0
src/store/moudles/project.js

@@ -0,0 +1,42 @@
+const project_mess = {
+    namespaced: true,
+    state: {
+        projectId: "", //项目id
+        datasourceId: "4", //数据源id
+        protocolType: "amqp", //数据源类型
+        dataName: ""
+    },
+    mutations: {
+        set_project(state, val) {
+            state.projectId = val
+        },
+        set_datasource(state, val) {
+            state.datasourceId = val
+        },
+        set_protocol_type(state, val) {
+            state.protocolType = val
+        },
+        set_datasource_name(state, val) {
+            state.dataName = val
+        }
+    },
+    actions: {
+
+    },
+    getters: {
+        projectId: state => state.projectId,
+        datasourceId: state => state.datasourceId,
+        protocolType: state => state.protocolType,
+        dataName: state => state.dataName
+    }
+}
+
+let projectId = localStorage.getItem('projectId')
+if (!projectId) {
+    localStorage.setItem('projectId', '1234567890')
+    project_mess.state.projectId = '1234567890'
+} else {
+    project_mess.state.projectId = projectId
+}
+
+export default project_mess

+ 185 - 0
src/utils/handsontable/delType.js

@@ -0,0 +1,185 @@
+let tagsFun = (instance, td, row, col, prop, value, cellProperties) => {
+        if (!!value) {
+            let arr = value || [],
+                dom = ``;
+            arr.map(item => {
+                dom += `<span style="display: inline-block;line-height:25px;padding: 0px 10px;background: #FFF5E4;border: 1px solid #F5A623;border-radius: 100px;font-size: 12px;color: #F5A623;text-align: center;">${item}</span>`
+            })
+            td.innerHTML = dom
+            return td;
+        }
+        return td
+    }
+    /**
+     * 
+     * @param {表头数组} arr 
+     * @param {添加的参数} '
+     * 
+     * @returns {对应数组} arr
+     */
+
+export function showTypes(arr, infosKey = '') {
+    let data = arr.map(item => {
+        if (item.FirstTag == "控制参数" ||
+            item.FirstTag == "设定参数" ||
+            item.FirstTag == "运行参数") {
+            return undefined
+        }
+        if (item.InfoPointCode == "BIMLocation") {
+            return undefined
+        }
+        if (item.Visible) {
+            //固定不显示的code
+            // if (!showTools.cantShow(item.InfoPointCode)) {
+            //     return undefined
+            // }
+
+            if (item.InfoPointCode == "edit") {
+                return {
+                    data: "Infos." + item.InfoPointCode,
+                    renderer: lookQRCode,
+                    readOnly: true
+                }
+            }
+
+            //图片类型
+            if (
+                item.InfoPointCode == "InstallPic" ||
+                item.InfoPointCode == "InstallDrawing" ||
+                item.InfoPointCode == "Nameplate" ||
+                item.InfoPointCode == "Pic" ||
+                item.InfoPointCode == "Drawing"
+            ) {
+                return {
+                    data: infosKey + item.InfoPointCode,
+                    // renderer: text.picType,
+                    readOnly: true
+                }
+            }
+
+            //文件类型
+            if (item.InfoPointCode == "InsuranceFile" ||
+                item.InfoPointCode == "Archive" ||
+                item.InfoPointCode == "CheckReport") {
+                return {
+                    data: infosKey + item.InfoPointCode,
+                    // renderer: text.fileType,
+                    readOnly: true
+                }
+            }
+
+            if (item.InputMode == "D1") {
+                return {
+                    data: infosKey + item.InfoPointCode,
+                    // renderer: tools.customDropdownRenderer,
+                    editor: "chosen",
+                    chosenOptions: {
+                        // multiple: true,//多选
+                        data: item.DataSource || ""
+                    }
+                };
+            } else if (item.InputMode == "A1" || item.InputMode == "A2") {
+                return {
+                    data: infosKey + item.InfoPointCode,
+                    type: "numeric",
+                    numericFormat: {
+                        pattern: "0,0.00"
+                            // culture: 'de-DE' // use this for EUR (German),
+                            // more cultures available on http://numbrojs.com/languages.html
+                    }
+                };
+            } else if (item.InputMode == "C5") {
+                return {
+                    data: infosKey + item.InfoPointCode,
+                    type: "date",
+                    dateFormat: "YYYY-MM-DD",
+                    correctFormat: true
+                };
+            } else if (
+                item.InputMode == "B1" ||
+                item.InputMode == "L" ||
+                item.InputMode == "L1" ||
+                item.InputMode == "L2"
+            ) {
+                return {
+                    data: infosKey + item.InfoPointCode
+                };
+            } else if (
+                item.InputMode == "X" ||
+                item.InputMode == "F2"
+                // item.InputMode == "L1" ||
+                // item.InputMode == "L2"
+            ) {
+                //   return undefined
+                return {
+                    data: infosKey + item.InfoPointCode,
+                    readOnly: true
+                };
+            } else if (item.InputMode == "D2") {
+                return {
+                    data: infosKey + item.InfoPointCode,
+                    // renderer: tools.customDropdownRenderer,
+                    editor: "chosen",
+                    chosenOptions: {
+                        multiple: true, //多选
+                        data: item.DataSource || ""
+                    }
+                };
+            } else if (item.InputMode == "Own") {
+                return {
+                    data: infosKey + item.InfoPointCode,
+                    // renderer: text.idType,
+                }
+            } else if (item.InputMode == "myOwn") {
+                return {
+                    data: infosKey + item.InfoPointCode,
+                    renderer: tagsFun,
+                }
+            } else {
+                return undefined;
+            }
+        } else {
+            return undefined
+        }
+
+    }).filter(item => item);
+    return data
+}
+
+export function changeHeader(arr) {
+    let data = arr.map(item => {
+        // if (falg) {
+        if (item.FirstTag == "控制参数" ||
+            item.FirstTag == "设定参数" ||
+            item.FirstTag == "运行参数") {
+            return undefined
+        }
+        // }
+
+        if (item.InfoPointCode == "BIMLocation") {
+            return undefined
+        }
+        // if (
+        //     readArr.indexOf(item.InputMode) > -1
+        // ) {
+        if (item.Visible) {
+            if (!item.Unit) {
+                return item.InfoPointName;
+            } else {
+                return item.InfoPointName + "(" + item.Unit + ")";
+            }
+        } else {
+            return undefined
+        }
+        // } else {
+        //     return undefined;
+        // }
+    }).filter(d => d);
+    return data
+}
+let lookQRCode = (instance, td, row, col, prop, value, cellProperties) => {
+    td.style.color = "#409EFF";
+    td.style.cursor = "pointer";
+    td.innerHTML = "编辑"
+    return td
+}

+ 213 - 0
src/utils/point_edit/handson_header.js

@@ -0,0 +1,213 @@
+const headers = {
+    "modbus-tcp": [{
+            InfoPointName: "从站地址",
+            InfoPointCode: "SlaveID",
+            InputMode: "B1",
+            Visible: true,
+            FirstTag: ""
+        },
+        {
+            InfoPointName: "寄存器地址(16位)",
+            InfoPointCode: "Address",
+            InputMode: "B1",
+            Visible: true,
+            FirstTag: ""
+        },
+        {
+            InfoPointName: "寄存器个数",
+            InfoPointCode: "Quantity",
+            InputMode: "B1",
+            Visible: true,
+            FirstTag: ""
+        },
+        {
+            InfoPointName: "位(单双字节)",
+            InfoPointCode: "Convtype",
+            InputMode: "B1",
+            DataSource: [{
+                    Code: "单字",
+                    Name: "单字"
+                },
+                {
+                    Code: "双字",
+                    Name: "双字"
+                }
+            ],
+            Visible: true,
+            FirstTag: ""
+        },
+        {
+            InfoPointName: "翻转规则",
+            InfoPointCode: "ReverseRule",
+            InputMode: "B1",
+            Visible: true,
+            FirstTag: ""
+        }
+    ],
+    "bacnet-ip": [{
+            InfoPointName: "设备标识",
+            InfoPointCode: "DeviceID",
+            InputMode: "B1",
+            Visible: true,
+            FirstTag: ""
+        },
+        {
+            InfoPointName: "实例功能号",
+            InfoPointCode: "InstanceNumber",
+            InputMode: "B1",
+            Visible: true,
+            FirstTag: ""
+        },
+        {
+            InfoPointName: "数据类型",
+            InfoPointCode: "Type",
+            DataSource: [{
+                    Code: "analogInput",
+                    Name: "analogInput"
+                },
+                {
+                    Code: "analogOutput",
+                    Name: "analogOutput"
+                }
+            ],
+            InputMode: "B1",
+            Visible: true,
+            FirstTag: ""
+        }
+    ],
+    "opc": [{
+        InfoPointName: "点位编码(统一标识)",
+        InfoPointCode: "Item",
+        InputMode: "B1",
+        Visible: true,
+        FirstTag: ""
+    }],
+    "knx": [{
+        InfoPointName: "组地址",
+        InfoPointCode: "GroupAddress",
+        InputMode: "B1",
+        Visible: true,
+        FirstTag: ""
+    }],
+    "mqtt": [{
+            InfoPointName: "deviceId",
+            InfoPointCode: "DeviceId",
+            InputMode: "B1",
+            Visible: true,
+            FirstTag: ""
+        },
+        {
+            InfoPointName: "item",
+            InfoPointCode: "Item",
+            InputMode: "B1",
+            Visible: true,
+            FirstTag: ""
+        }
+    ],
+    "amqp": [{
+            InfoPointName: "Exchange",
+            InfoPointCode: "Exchange",
+            InputMode: "B1",
+            Visible: true,
+            FirstTag: ""
+        },
+        {
+            InfoPointName: "type",
+            InfoPointCode: "Type",
+            InputMode: "B1",
+            Visible: true,
+            FirstTag: ""
+        },
+        {
+            InfoPointName: "Routingkey",
+            InfoPointCode: "RoutingKey",
+            InputMode: "B1",
+            Visible: true,
+            FirstTag: ""
+        }
+    ]
+}
+
+let common = [{
+        InfoPointName: "原始点位描述",
+        InfoPointCode: "Description",
+        InputMode: "B1",
+        Visible: true,
+        FirstTag: ""
+    },
+    {
+        InfoPointName: "值/单位说明",
+        InfoPointCode: "ValueDescription",
+        InputMode: "B1",
+        Visible: true,
+        FirstTag: ""
+    },
+    {
+        InfoPointName: "位置标签",
+        InfoPointCode: "LocationFlag",
+        InputMode: "myOwn",
+        Visible: true,
+        FirstTag: ""
+    },
+    {
+        InfoPointName: "备注",
+        InfoPointCode: "Remarks",
+        InputMode: "B1",
+        Visible: true,
+        FirstTag: ""
+    },
+    {
+        InfoPointName: "原始数值",
+        InfoPointCode: "",
+        InputMode: "B1",
+        Visible: true,
+        FirstTag: ""
+    },
+    {
+        InfoPointName: "采集时间",
+        InfoPointCode: "",
+        InputMode: "B1",
+        Visible: true,
+        FirstTag: ""
+    },
+    {
+        InfoPointName: "使用",
+        InfoPointCode: "Used",
+        InputMode: "B1",
+        Visible: true,
+        FirstTag: ""
+    },
+    {
+        InfoPointName: "设备类型关键字",
+        InfoPointCode: "KeyEquipmentType",
+        InputMode: "B1",
+        Visible: true,
+        FirstTag: ""
+    },
+    {
+        InfoPointName: "设备参数关键字",
+        InfoPointCode: "KeyEquipmentParameter",
+        InputMode: "B1",
+        Visible: true,
+        FirstTag: ""
+    },
+    {
+        InfoPointName: "设备标识",
+        InfoPointCode: "EquipmentMark",
+        InputMode: "B1",
+        Visible: true,
+        FirstTag: ""
+    }
+]
+
+/**
+ * 
+ * @param {数据源类型} type
+ * 
+ * @returns  headersArr
+ */
+function getHeaderSetting(type) {
+    return headers[type].concat(common)
+}
+
+export default getHeaderSetting

+ 36 - 0
src/utils/point_edit/steps2.js

@@ -0,0 +1,36 @@
+export default [{
+        InfoPointName: "原始点位描述",
+        InfoPointCode: "Description",
+        InputMode: "B1",
+        Visible: true,
+        FirstTag: ""
+    },
+    {
+        InfoPointName: "位置",
+        InfoPointCode: "LocationFlag",
+        InputMode: "B1",
+        Visible: true,
+        FirstTag: ""
+    },
+    {
+        InfoPointName: "备注",
+        InfoPointCode: "Remarks",
+        InputMode: "B1",
+        Visible: true,
+        FirstTag: ""
+    },
+    {
+        InfoPointName: "设备类型关键字",
+        InfoPointCode: "KeyEquipmentType",
+        InputMode: "B1",
+        Visible: true,
+        FirstTag: ""
+    },
+    {
+        InfoPointName: "设备参数关键字",
+        InfoPointCode: "KeyEquipmentParameter",
+        InputMode: "B1",
+        Visible: true,
+        FirstTag: ""
+    }
+]

+ 57 - 0
src/utils/point_edit/steps3.js

@@ -0,0 +1,57 @@
+export default [{
+        InfoPointName: "原始点位描述",
+        InfoPointCode: "Description",
+        InputMode: "B1",
+        Visible: true,
+        FirstTag: ""
+    },
+    {
+        InfoPointName: "位置",
+        InfoPointCode: "LocationFlag",
+        InputMode: "B1",
+        Visible: true,
+        FirstTag: ""
+    },
+    {
+        InfoPointName: "关键内容",
+        InfoPointCode: "Remarks",
+        InputMode: "B1",
+        Visible: true,
+        FirstTag: ""
+    },
+    {
+        InfoPointName: "设备标识",
+        InfoPointCode: "EquipmentMark",
+        InputMode: "B1",
+        Visible: true,
+        FirstTag: ""
+    },
+    {
+        InfoPointName: "数据字典设备类&信息点",
+        InfoPointCode: "PhysicalRelated",
+        InputMode: "B1",
+        Visible: true,
+        FirstTag: ""
+    },
+    {
+        InfoPointName: "值处理方式",
+        InfoPointCode: "DataRuleType",
+        InputMode: "B1",
+        Visible: true,
+        FirstTag: ""
+    },
+    {
+        InfoPointName: "备注",
+        InfoPointCode: "Remarks",
+        InputMode: "B1",
+        Visible: true,
+        FirstTag: ""
+    },
+    {
+        InfoPointName: "操作",
+        InfoPointCode: "edit",
+        InputMode: "Own",
+        Visible: true,
+        FirstTag: ""
+    }
+]

+ 37 - 0
src/utils/tools.js

@@ -0,0 +1,37 @@
+const tools = {}
+
+//存储cookie
+tools.setCookie = (name, value) => {
+    var Days = 30; /* 设置cookie保存时间 */
+    var exp = new Date();
+    exp.setTime(exp.getTime() + Days * 24 * 60 * 60 * 1000);
+    document.cookie = name + "=" + escape(value) + ";expires=" + exp.toGMTString();
+}
+
+
+//获取cookie
+tools.getCookie = name => {
+    var arr, reg = new RegExp("(^| )" + name + "=([^;]*)(;|$)");
+    if (arr = document.cookie.match(reg)) {
+        return unescape(arr[2]);
+    } else {
+        /* 如果没有参数,那么就获取本域下的所有cookie */
+        return document.cookie;
+    }
+}
+
+tools.delObjKey = (obj, key) => {
+    if (obj.hasOwnProperty(key)) {
+        delete obj[key]
+    }
+}
+
+tools.deepCopy = (obj) => {
+    let temp = obj.constructor === Array ? [] : {}
+    for (let val in obj) {
+        temp[val] = typeof obj[val] == 'object' ? tools.deepCopy(obj[val]) : obj[val]
+    }
+    return temp
+}
+
+export default tools

+ 194 - 0
src/views/point/config_point/edit_origin/index.vue

@@ -0,0 +1,194 @@
+<template>
+    <div>
+        <!-- <bread></bread> -->
+        <div class="margin-view"></div>
+        <div class="btn-view">
+            <el-button class="btn" @click="btnClick">{{ id? '保存修改': '新建'}}</el-button>
+        </div>
+        <div class="content-view">
+            <el-form label-width="10px" style="width:400px;" :model="formData" class="dcenter">
+                <el-form-item label="">
+                    <el-input v-model="formData.Name" placeholder="请输入新项目名称"></el-input>
+                </el-form-item>
+            </el-form>
+            <el-input type="textarea" class="edit-textarea dcenter block" v-model="formData.Description" placeholder="数据源的说明再次编辑维护..."></el-input>
+            <el-form label-width="120px" style="width:400px;" :model="formData" class="dcenter">
+                <el-form-item label="协议类型">
+                    <el-select v-model="formData.ProtocolType" filterable placeholder="请选择">
+                        <el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value"></el-option>
+                    </el-select>
+                </el-form-item>
+                <el-form-item label="主机IP地址">
+                    <ip-input :ip="formData.ProtocolInfo.Ip" :port="formData.ProtocolInfo.Port" @change="changeItem"></ip-input>
+                </el-form-item>
+                <el-form-item label="用户名/密码" v-if="(passWordArr.indexOf(formData.ProtocolType) > -1)">
+                    <el-input v-model="formData.ProtocolInfo.User" style="display:inline-block;width:100px;"></el-input>/
+                    <el-input v-model="formData.ProtocolInfo.Password" style="display:inline-block;width:100px;"></el-input>
+                </el-form-item>
+                <el-form-item label="ProgID" v-if="formData.ProtocolType == 'opc'">
+                    <el-input v-model="formData.ProtocolInfo.ProgID" style="display:inline-block;width:100px;"></el-input>
+                </el-form-item>
+            </el-form>
+        </div>
+    </div>
+</template>
+<script>
+    import ipInput from "@/components/config_point/ip_input"
+    // import bread from "components/common/bread_crumb"
+    import tools from "@/utils/tools"
+    import {
+        queryDataSource,
+        updateDataSource,
+        createDataSource
+    } from "@/fetch/point_http"
+    import {
+        mapGetters,
+        mapActions
+    } from "vuex";
+    export default {
+        computed: {
+            ...mapGetters("project", [
+                "projectId"
+            ])
+        },
+        data() {
+            return {
+                passWordArr: ['mqtt', 'amqp', 'opc'],
+                formData: {
+                    "ProtocolType": "", //协议类型
+                    "Name": "",
+                    ProtocolInfo: {
+                        "Ip": "", //ip
+                        "Port": "", //端口号,有些协议类型没有该信息
+                        "User": "", //用户名
+                        "Password": "", //密码
+                        "ProgID": "", //progID
+                    },
+                    Description: ""
+                },
+                options: [{
+                    value: 'modbus-tcp',
+                    label: 'Modbus TCP'
+                }, {
+                    value: 'bacnet-ip',
+                    label: 'BACNet IP'
+                }, {
+                    value: 'opc',
+                    label: 'OPC'
+                }, {
+                    value: 'knx',
+                    label: 'KNX'
+                }, {
+                    value: 'mqtt',
+                    label: 'MQTT'
+                }, {
+                    value: 'amqp',
+                    label: 'AMQP'
+                }],
+                id: this.$route.query.key
+            }
+        },
+        components: {
+            ipInput,
+            // bread
+        },
+        created() {
+        },
+        mounted() {
+            if (!!this.id) {
+                this.getDataSouse()
+            }
+        },
+        methods: {
+            changeItem(ip, port) {
+                this.formData.ProtocolInfo.Ip = ip
+                this.formData.ProtocolInfo.Port = port
+            },
+            getDataSouse() {
+                let param = {
+                    Filters: {
+                        ProjectId: this.projectId,
+                        Id: this.id
+                    },
+                    "PageNumber": 1,
+                    "PageSize": 50,
+                    "Projection": [
+                    ]
+                }
+                queryDataSource(param, res => {
+                    let data = res.Content[0]
+                    if (!data.ProtocolInfo) {
+                        //信息点为空时
+                        data.ProtocolInfo = {
+                            "Ip": "", //ip
+                            "Port": "",
+                            "User": "", //用户名
+                            "Password": "", //密码
+                            "ProgID": "", //progID
+                        }
+                    } else {
+                        //有信息点时
+                    }
+                    this.formData = data
+                    console.log(this.formData, "formData")
+                })
+            },
+            btnClick() {
+                console.log(this.formData, "form")
+                let param = tools.deepCopy(this.formData)
+                tools.delObjKey(param, "CreateTime")
+                tools.delObjKey(param, "LastUpdate")
+                if (!!this.id) {
+                    console.log(param.ProtocolInfo.Port)
+                    if(param.ProtocolInfo.Port == ""){
+                        delete param.ProtocolType.Port
+                    }
+                    updateDataSource({
+                        Content: [param],
+                        Projection: []
+                    }, res => {
+                        console.log(res, 'res')
+                        this.$router.push({
+                            path: '/configPoint'
+                        })
+                        this.$message.success("更新成功!")
+                    })
+                } else {
+                    param.ProjectId = this.projectId
+                    console.log(param, "param")
+                    createDataSource(param, res => {
+                        console.log(res)
+                        this.$router.push({
+                            path: '/configPoint'
+                        })
+                        this.$message.success("创建成功!")
+                    })
+                }
+            },
+        }
+    }
+</script>
+<style lang="scss">
+    .margin-view {
+        height: 60px;
+    }
+    .btn-view {
+        overflow: hidden;
+        .btn {
+            float: right;
+            margin-right: 40px;
+        }
+    }
+    .content-view {
+        width: 928px;
+        margin: auto;
+        .edit-textarea {
+            margin: 10px 0;
+            height: 117px;
+            textarea {
+                height: 100%;
+                background-color: #EEFAFF;
+            }
+        }
+    }
+</style>

+ 108 - 0
src/views/point/config_point/index.vue

@@ -0,0 +1,108 @@
+<template>
+    <div class="saga-config-point">
+        <h3 class="center">{{projectName}}</h3>
+        <p class="center">此项目包括{{list.length}}个数据源</p>
+        <div class="saga-origin-list dcenter w">
+            <div class="disIne border-hover saga-list-item margin5" v-for="(item,index) in list" :key="index">
+                <data-origin :id="'origin' + index" :renderData="item">
+                    <el-button @click="maintenance(item)" type="text">维护点位</el-button>
+                    <el-button @click="goEdit(item)" type="text">编辑数据源</el-button>
+                </data-origin>
+            </div>
+            <div class="disIne saga-list-item margin5 center pointer" @click="addItem">
+                <i class="add-icon margin50">+</i>
+            </div>
+        </div>
+    </div>
+</template>
+<script>
+    import "@/assets/scss/point/point_config/common.scss"
+    import "@/assets/scss/point/point_config/reset.scss"
+    import dataOrigin from "@/components/config_point/data_origin"
+    import {
+        mapGetters,
+        mapActions
+    } from "vuex";
+    import { queryDataSourceCount } from "@/fetch/point_http"
+    export default {
+        components: {
+            dataOrigin
+        },
+        data() {
+            return {
+                projectName: "项目名称",
+                list: []
+            }
+        },
+        computed: {
+            ...mapGetters("project", [
+                "projectId"
+            ])
+        },
+        created() {},
+        mounted() {
+            console.log(this.projectId)
+            this.getList()
+        },
+        methods: {
+            getList(){
+                let param = {
+                }
+                queryDataSourceCount(param,res => {
+                    console.log(res)
+                    this.list = res.Content
+                })
+            },
+            addItem() {
+                this.$router.push({
+                    path: "editDataSouce"
+                })
+            },
+            goEdit(item) {
+                console.log(item)
+                this.$router.push({
+                    path: "editDataSouce",
+                    query: {
+                        key: item.Id
+                    }
+                })
+            },
+            maintenance(item) {
+                console.log(item)
+                this.$store.commit("project/set_datasource", item.Id);
+                this.$store.commit("project/set_protocol_type", item.ProtocolType);
+                this.$store.commit("project/set_datasource_name", item.Name);
+                this.$router.push({
+                    path: "pointSteps",
+                })
+            }
+        }
+    }
+</script>
+<style lang="scss" scoped>
+    .saga-config-point {
+        height: 100%;
+        overflow-y: auto;
+        .add-icon {
+            font-size: 40px;
+        }
+        .margin50 {
+            display: block;
+            height: 100%;
+            line-height: 8;
+        }
+        .saga-origin-list {
+            display: flex;
+            flex-wrap: wrap; // justify-content: space-around;
+            height: calc(100% - 90px);
+            .saga-list-item {
+                width: 320px;
+                height: 475px;
+                border-radius: 22px;
+                border: 6px solid #dee3f3; //   &:hover {
+                //     border-color: #409eff;
+                //   }
+            }
+        }
+    }
+</style>

+ 17 - 0
src/views/point/config_point/steps/collection.vue

@@ -0,0 +1,17 @@
+<template>
+    <div>
+    </div>
+</template>
+<script>
+    export default {
+        data() {
+            return {}
+        },
+        created() {},
+        mounted() {},
+        methods: {}
+    }
+</script>
+<style>
+
+</style>

+ 102 - 0
src/views/point/config_point/steps/index.vue

@@ -0,0 +1,102 @@
+<template>
+    <div ref="pointStep" class="h100 saga-maintenance" :style="`height:${activeHeight}px;`">
+        <!-- <bread class="bread-view"></bread> -->
+        <div class="saga-btns-view">
+            <template v-for="(item,index) in jsonTitle">
+                <div
+                  :key="index"
+                  @click="changeStep(index)"
+                  class="saga-steps-btn saga-border pointer saga-size3"
+                >{{item}}</div>
+                <div v-if="index < jsonTitle.length - 1" class="saga-steps-btn saga-size3">👉</div>
+            </template>
+        </div>
+        <div class="main-view">
+        <step1 ref="step" v-if="activeStep == 1"></step1>
+        <step2 ref="step" v-if="activeStep == 2"></step2>
+        <step3 ref="step" v-if="activeStep == 3"></step3>
+        <step4 ref="step" v-if="activeStep == 4"></step4>
+        </div>
+    </div>
+</template>
+<script>
+    // import bread from "components/common/bread_crumb"
+    import step1 from "./step1"
+    import step2 from "./step2"
+    import step3 from "./step3"
+    import step4 from "./step4"
+    export default {
+        data() {
+            return {
+                activeStep: 1, //活跃的step
+                jsonTitle: [
+                    "原始点位表收集", "原始点位描述关键内同识别", "原始点位描述标准化", "点位表处理结果检查"
+                ],
+                activeHeight: 0
+            }
+        },
+        created() {},
+        mounted() {
+            // console.log(this.$refs.pointStep.parentElement.parentElement.offsetHeight,'pointStep')
+            this.resize()
+            // document.addEventListener("resize",this.resize)
+            window.onresize = this.resize
+        },
+        methods: {
+            resize(){
+                console.log(222)
+                this.activeHeight = this.$refs.pointStep.parentElement.parentElement.parentElement.offsetHeight - 10
+            },
+            stepClick() {
+                console.log("test")
+            },
+            changeStep(index) {
+                console.log()
+                let step = this.$refs.step
+                let flag = step.hasOwnProperty('noSaveData') ? step.noSaveData() : false
+                if (flag || this.activeStep == 4 || this.activeStep == 3) {
+                    this.activeStep = index + 1
+                } else {
+                    this.$confirm('存在数据未保存, 是否继续?', '提示', {
+                        confirmButtonText: '确定',
+                        cancelButtonText: '取消',
+                        type: 'warning'
+                    }).then(() => {
+                        this.activeStep = index + 1
+                    }).catch(() => {
+                        return false
+                    });
+                }
+            }
+        },
+        components: {
+            // bread,
+            step1,
+            step2,
+            step3,
+            step4
+        },
+    }
+</script>
+<style lang="scss">
+    .h100 {
+        .bread-view {
+            height: 45px;
+        }
+        .main-view {
+            height: calc(100% - 155px);
+            background: #ccc;
+            margin-top: 10px;
+        }
+        .saga-btns-view {
+            .saga-steps-btn {
+                height: 80px;
+                text-align: center;
+                /*设置文本水平居中*/
+                display: table-cell;
+                vertical-align: middle;
+                padding: 0 30px;
+            }
+        }
+    }
+</style>

+ 227 - 0
src/views/point/config_point/steps/step1.vue

@@ -0,0 +1,227 @@
+<template>
+    <div id="handsonStep1">
+        <div class="btns-view">
+            <el-button>获取原始点位当前值</el-button>
+            <el-button>导出Excel模板</el-button>
+            <el-button>导入Excel</el-button>
+            <el-button @click="addRow">新增行</el-button>
+            <el-button @click="saveData">保存</el-button>
+            <el-checkbox v-model="checked">只显示使用的原始点位</el-checkbox>
+        </div>
+        <div id="handsontableSteps1">
+            <handsontable-component ref="handsontable" @mouseDown="clickTable" @change="changeHand"></handsontable-component>
+        </div>
+        <own-dialog :width="'580px'" :index="true" title="位置标签" :dialogVisible="localtionDialog" @cancel="close">
+            <localtion-falg :renderData="renderData"></localtion-falg>
+        </own-dialog>
+    </div>
+</template>
+<script>
+    import handsontableComponent from "@/components/common/handsontable"
+    import getHeaderSetting from "@/utils/point_edit/handson_header"
+    import ownDialog from "@/components/el_pack/dialog"
+    import localtionFalg from "@/components/config_point/location_flag"
+    import {
+        mapGetters,
+        mapActions
+    } from "vuex";
+    import {
+        changeHeader,
+        showTypes
+    } from "@/utils/handsontable/delType"
+    import {
+        queryPoint,
+        updatePoint,
+        createPoint
+    } from "@/fetch/point_http"
+    export default {
+        data() {
+            return {
+                checked: false,
+                settings: {},
+                hot: null,
+                changeFlag: true, //是否发生修改
+                localtionDialog: false,
+                renderData: {}
+            }
+        },
+        computed: {
+            ...mapGetters("project", [
+                "projectId",
+                "datasourceId",
+                "protocolType"
+            ])
+        },
+        created() {},
+        mounted() {
+            if (!this.protocolType) {
+                this.$router.push({
+                    path: "/configPoint"
+                })
+            } else {
+                this.getData()
+            }
+        },
+        methods: {
+            //关闭弹窗
+            close(){
+                this.localtionDialog = false
+            },
+            //点击表格
+            clickTable(info,row){
+                let activeCell = this.hot.getActiveEditor()
+                this.renderData = info
+                console.log(activeCell)
+                if(activeCell.prop == "LocationFlag"){
+                    this.localtionDialog = true
+                }
+            },
+            addRow() {
+                let data = this.hot.getSourceData()
+                data.unshift({})
+                this.hot.loadData(data)
+                this.hot.updateSettings({
+                    maxRows: data.length
+                })
+                console.log(data, this.hot, "data")
+            },
+            getData() {
+                let header, width, param, settings
+                header = getHeaderSetting(this.protocolType)
+                // width = (document.getElementById("app").clientWidth - 50) / header.length
+                param = {
+                    type: this.protocolType,
+                    data: {
+                        Filters: {
+                            DatasourceId: this.datasourceId,
+                        },
+                        "PageNumber": 1,
+                        "PageSize": 50,
+                    }
+                }
+                queryPoint(param, res => {
+                    console.log(res)
+                    settings = {
+                        data: res.Content,
+                        colHeaders: changeHeader(header),
+                        columns: showTypes(header),
+                        // colWidths: width,
+                        rowHeights: 30,
+                        maxRows: res.Content.length
+                    }
+                    this.hot = this.$refs.handsontable.init(settings)
+                    console.log(this.hot)
+                })
+            },
+            //修改提示
+            changeHand(changeData, source) {
+                if (!!changeData) {
+                    this.changeFlag = false
+                }
+                return false
+            },
+            //保存
+            saveData() {
+                if (!!this.hot) {
+                    console.log(this.hot.getSourceData())
+                    let data = this.hot.getSourceData(),
+                        updateList = [],arr1 = [],
+                        createList = [];
+                    data.map(item => {
+                        // console.log(item.LocationFlag,1111)
+                        if (!!item.Id) {
+                            // if(!item.LocationFlag){
+                            //     item.LocationFlag = []
+                            // }
+                            console.log(item)
+                            delete item.CreateTime
+                            delete item.LastUpdate
+                            console.log(item)
+                            arr1.push(item)
+                            updateList.push(item)
+                        } else {
+                            createList.push(item)
+                        }
+                    })
+                    console.log(updateList,arr1, "updateList")
+                    if (updateList.length) {
+                        this.update(updateList)
+                    }
+                    if (createList.length) {
+                        this.createList(createList)
+                    }
+                } else {
+                    this.$message.error("请确保存在数据")
+                }
+            },
+            async createList(createList) {
+                console.log(createList)
+                let i = 0;
+                for (i; i < createList.length; i++) {
+                    if (createList[i].hasOwnProperty("Description")) {
+                        await this.create(createList[i])
+                    }
+                }
+                this.changeFlag = true
+            },
+            async create(obj) {
+                console.log(obj)
+                for(let key in obj){
+                    if(key == "LocationFlag" && obj[key] == ""){
+                        obj[key] = []
+                    }
+                    if(obj[key] === ""){
+                        obj[key] = null
+                    }
+                }
+                obj.DatasourceId = this.datasourceId
+                obj.ProjectId = this.projectId
+                await createPoint({
+                    data: obj,
+                    type: this.protocolType
+                }, res => {
+                    console.log(res)
+                    obj.Id = res.Id
+                })
+            },
+            /**
+             * @param {更新list} updateList
+             * 
+             * 更新点位
+             */
+            update(updateList) {
+                updatePoint({
+                    data: {
+                        Content: updateList
+                    },
+                    type: this.protocolType
+                }, res => {
+                    console.log(res)
+                })
+            },
+            //没有保存的时候弹窗
+            noSaveData() {
+                return this.changeFlag
+            }
+        },
+        components: {
+            handsontableComponent,
+            ownDialog,
+            localtionFalg
+        },
+    }
+</script>
+<style lang="scss" scoped>
+    #handsonStep1 {
+        height: 100%;
+        .btns-view {
+            height: 50px;
+            vertical-align: middle;
+        }
+        #handsontableSteps1 {
+            height: calc(100% - 50px);
+            overflow: hidden;
+            position: relative;
+        }
+    }
+</style>

+ 219 - 0
src/views/point/config_point/steps/step2.vue

@@ -0,0 +1,219 @@
+<template>
+    <div id="handsonStep2">
+        <div class="btns-view">
+            <el-button>AI自动识别</el-button>
+            <el-button @click="discern(1)">批量识别设备类型关键字</el-button>
+            <el-button @click="discern(2)">批量识别设备参数关键字</el-button>
+            <el-button @click="examine">检查&微调</el-button>
+            <el-button @click="reset">刷新</el-button>
+            <el-button @click="saveData">保存</el-button>
+        </div>
+        <div id="handsontableSteps1">
+            <handsontable-component ref="handsontable"></handsontable-component>
+        </div>
+        <own-dialog :width="'60%'" :title="title" :dialogVisible="isDialogShow" @cancel="close">
+            <find-keyword ref="findKeyword" :type="type" @change="changeHand"></find-keyword>
+        </own-dialog>
+        <own-dialog :width="'1000px'" :index="true" title="关键内容设别——检查&微调" :dialogVisible="examineDialog" @cancel="close">
+            <!-- <find-keyword ref="findKeyword" :type="type"></find-keyword> -->
+            <examine-main></examine-main>
+        </own-dialog>
+    </div>
+</template>
+<script>
+    import handsontableComponent from "@/components/common/handsontable"
+    import examineMain from "@/components/config_point/examine_main"
+    import headerArr from "@/utils/point_edit/steps2.js"
+    import {
+        changeHeader,
+        showTypes
+    } from "@/utils/handsontable/delType"
+    import ownDialog from "@/components/el_pack/dialog"
+    import {
+        mapGetters,
+        mapActions
+    } from "vuex";
+    import {
+        queryPoint,
+        updatePoint
+    } from "@/fetch/point_http"
+    import findKeyword from "@/components/config_point/find_keyword"
+    export default {
+        data() {
+            return {
+                checked: false,
+                settings: {},
+                isDialogShow: false,
+                msg: "",
+                hot: null,
+                title: "",
+                type: "",
+                examineDialog: false,
+                changeFlag: true,
+            }
+        },
+        created() {
+            if (!this.protocolType) {
+                this.$router.push({
+                    path: "/configPoint"
+                })
+            }
+        },
+        mounted() {
+            this.getData()
+        },
+        computed: {
+            ...mapGetters("project", [
+                "projectId",
+                "datasourceId",
+                "protocolType"
+            ])
+        },
+        methods: {
+
+            //刷新
+            reset(){
+                console.log(this.changeFlag,"changeFlag")
+                if(!this.changeFlag){
+                    this.$confirm("表格数据尚未保存,确定刷新吗?").then(_ => {
+                        this.saveData()
+                    }).catch(_ =>{
+                        this.getData()
+                    })
+                }else{
+                    this.getData()
+                }
+            },
+            /**
+             *  @param num 代表着1类型2参数
+             * 
+             */
+            discern(num) {
+                if (num == 1) {
+                    this.title = "关键内同识别——批量识别设备类型关键字"
+                    this.type = "type"
+                } else if (num == 2) {
+                    this.title = "关键内同识别——批量识别设备参数关键字"
+                    this.type = "arguments"
+                }
+                this.isChangeData()
+                this.isDialogShow = true
+                this.$nextTick(() => {
+                    this.$refs.findKeyword.changeType(this.type)
+                })
+            },
+            close() {
+                this.isDialogShow = false
+                this.examineDialog = false
+                this.isChangeData()
+            },
+
+            //判断是否修改,修改调用修改接口,否则调用获取最新数据
+            isChangeData(){
+                if (!this.changeFlag) {
+                    this.saveData(false)
+                } else {
+                    this.getData()
+                }
+            },
+            //点击检查按钮
+            examine() {
+                this.isChangeData()
+                this.examineDialog = true
+            },
+            //保存
+            saveData(falg) {
+                if (!!this.hot) {
+                    console.log(this.hot.getSourceData())
+                    let data = this.hot.getSourceData(),
+                        changeData;
+                    changeData = data.map(item => {
+                        return {
+                            Id: item.Id,
+                            DatasourceId: item.DatasourceId,
+                            ProjectId: item.ProjectId,
+                            Description: item.Description || null,
+                            KeyEquipmentParameter: item.KeyEquipmentParameter || null,
+                            Remarks: item.Remarks || null,
+                            LocationFlag: item.LocationFlag || null,
+                            KeyEquipmentType: item.KeyEquipmentType || null
+                        }
+                    })
+                    updatePoint({
+                        data: {
+                            Content: changeData
+                        },
+                        type: this.protocolType
+                    }, res => {
+                        console.log(res)
+                        if (!falg) {
+                            this.$message.success("保存成功")
+                        }
+                        this.getData()
+                    })
+                } else {
+                    this.$message.error("请确保存在数据")
+                }
+            },
+            //发生更改
+            changeHand(changeData, source) {
+                console.log(changeData, source)
+                if (!!changeData) {
+                    this.changeFlag = false
+                }
+                return false
+            },
+            //获取初始数据
+            getData() {
+                let width, param, settings
+                width = (document.getElementById("app").clientWidth - 50) / headerArr.length
+                param = {
+                    type: this.protocolType,
+                    data: {
+                        Filters: {
+                            DatasourceId: this.datasourceId,
+                        },
+                        "PageNumber": 1,
+                        "PageSize": 50,
+                    }
+                }
+                queryPoint(param, res => {
+                    console.log(res)
+                    settings = {
+                        data: res.Content,
+                        colHeaders: changeHeader(headerArr),
+                        columns: showTypes(headerArr),
+                        colWidths: width,
+                        rowHeights: 30,
+                        maxRows: res.Content.length
+                    }
+                    this.hot = this.$refs.handsontable.init(settings)
+                    console.log(this.hot)
+                })
+            },
+            noSaveData() {
+                return this.changeFlag
+            }
+        },
+        components: {
+            handsontableComponent,
+            ownDialog,
+            findKeyword,
+            examineMain
+        }
+    }
+</script>
+<style lang="scss" scoped>
+    #handsonStep2 {
+        height: 100%;
+        .btns-view {
+            height: 50px;
+            vertical-align: middle;
+        }
+        #handsontableSteps1 {
+            height: calc(100% - 50px);
+            overflow: hidden;
+            position: relative;
+        }
+    }
+</style>

+ 151 - 0
src/views/point/config_point/steps/step3.vue

@@ -0,0 +1,151 @@
+<template>
+    <div id="handsonStep2">
+        <div class="btns-view">
+            <el-button @click="dialogShow(1)">根据关键内容批量标准化设备标识</el-button>
+            <el-button @click="dialogShow(2)">根据关键内容批量对应数据字典</el-button>
+            <el-checkbox v-model="checked">只显示未标准化得的原始点位</el-checkbox>
+        </div>
+        <div id="handsontableSteps1">
+            <handsontable-component @mouseDown="clickEdit" ref="handsontable"></handsontable-component>
+        </div>
+        <own-dialog :width="'1000px'" :dialogVisible="isDialogShow" @cancel="close">
+            <dialog-main v-if="!isDataform"></dialog-main>
+            <steps-main v-if="isDataform"></steps-main>
+        </own-dialog>        
+        <own-dialog :width="'1000px'" :dialogVisible="isEditDialogShow" @cancel="closeEdit">
+            <step3-edit v-if="isEditDialogShow" :editData='editData'></step3-edit>
+        </own-dialog>
+    </div>
+</template>
+<script>
+    import handsontableComponent from "@/components/common/handsontable"
+    import headerArr from "@/utils/point_edit/steps3.js"
+     import {
+        changeHeader,
+        showTypes
+    } from "@/utils/handsontable/delType"
+    import {
+        mapGetters,
+        mapActions
+    } from "vuex";
+    import ownDialog from "@/components/el_pack/dialog"
+    import dialogMain from "@/components/config_point/step3_point/dialog_main"
+    import stepsMain from "@/components/config_point/step3_point/steps3_main"
+    import {
+        queryPoint
+    } from "@/fetch/point_http"
+    import step3Edit from '@/components/config_point/step3_edit/index'
+    export default {
+        data() {
+            return {
+                checked: false,
+                settings: {},
+                isDialogShow: false,
+                hot: null,
+                isDataform: false,
+                /************point3_step_edit*********************** */
+                isEditDialogShow: false,                          
+                editData:{},                                  //编辑数据
+            }
+        }, 
+        computed: {
+            ...mapGetters("project", [
+                "projectId",
+                "datasourceId",
+                "protocolType"
+            ])
+        },
+        created() {
+            if (!this.protocolType) {
+                this.$router.push({
+                    path: "/configPoint"
+                })
+            }
+        },
+        mounted() {
+            this.getData()
+        },
+        methods: {
+            //页面关闭
+            close() {
+                this.isDialogShow = false
+            },
+            //页面显示num1为标准化设备标识,2为对应数据字典
+            dialogShow(num) {
+                if (num == 1) {
+                    this.isDataform = false
+                } else if (num == 2) {
+                    this.isDataform = true
+                }
+                this.isDialogShow = true
+            },
+            
+            /**
+             * 表格点击事件
+             * @param {当前条数据} rowData
+             * @param {当前条} row
+             * 
+             * down something
+             */
+            clickEdit(rowData,row){
+                console.log(rowData,row)
+                if(row.row >= 0 && row.col == 7) {
+                    this.isEditDialogShow = true;
+                    this.editData = rowData;
+                }                
+            },
+            closeEdit() {
+                this.isEditDialogShow = false;
+            },
+            //初始化表格实例
+            getData() {
+                let width, param, settings
+                width = (document.getElementById("app").clientWidth - 50) / headerArr.length
+                param = {
+                    type: this.protocolType,
+                    data: {
+                        Filters: {
+                            DatasourceId: this.datasourceId,
+                        },
+                        "PageNumber": 1,
+                        "PageSize": 50,
+                    }
+                }
+                queryPoint(param, res => {
+                    console.log(res)
+                    settings = {
+                        data: res.Content,
+                        colHeaders: changeHeader(headerArr),
+                        columns: showTypes(headerArr),
+                        colWidths: width,
+                        rowHeights: 30,
+                        maxRows: res.Content.length
+                    }
+                    this.hot = this.$refs.handsontable.init(settings)
+                    console.log(this.hot)
+                })
+            }
+        },
+        components: {
+            handsontableComponent,
+            ownDialog,
+            dialogMain,
+            step3Edit,
+            stepsMain
+        }
+    }
+</script>
+<style lang="scss" scoped>
+    #handsonStep2 {
+        height: 100%;
+        .btns-view {
+            height: 50px;
+            vertical-align: middle;
+        }
+        #handsontableSteps1 {
+            height: calc(100% - 50px);
+            overflow: hidden;
+            position: relative;
+        }
+    }
+</style>

+ 282 - 0
src/views/point/config_point/steps/step4.vue

@@ -0,0 +1,282 @@
+<template>
+    <div class="h100 steps4">
+        <div class="btns-view">
+            <el-button>根据关键内容批量标准化设备标识</el-button>
+            <el-button>根据关键内容批量对应数据字典</el-button>
+        </div>
+        <el-tabs type="border-card" @tab-click="clickTabs" class="tabs-h" tab-position="bottom">
+            <el-tab-pane>
+                <span slot="label">
+                        从物理世界角度检查
+                    </span>
+                <js-mind-component ref="jsmind" @openNode="openNode"></js-mind-component>
+            </el-tab-pane>
+            <el-tab-pane class="h100" label="从原始点位表角度检查">
+                <js-mind-component ref="jsmind1" @openNode="openNode"></js-mind-component>
+            </el-tab-pane>
+        </el-tabs>
+    </div>
+</template>
+<script>
+    import {
+        mapGetters,
+        mapActions
+    } from "vuex";
+    import jsMindComponent from "@/components/common/jsmind"
+    import {
+        platformSysJsMind,
+        platformEqJsMind,
+        platformIdentJsMind,
+        platformInfoJsMind,
+        platformPointJsMind,
+        pointSytemJsMind,
+        pointPostJsMind,
+        pointInfoJsMind,
+        pointTypeJsMind,
+    } from "@/fetch/point_http"
+    export default {
+        name: "steps4",
+        data() {
+            return {
+                jsMind: "",
+                activeIndex: 0,
+                mindArr: []
+            }
+        },
+        computed: {
+            ...mapGetters("project", [
+                "projectId",
+                "datasourceId",
+                "protocolType",
+                "dataName"
+            ])
+        },
+        created() {},
+        mounted() {
+            this.clickTabs({
+                index: this.activeIndex
+            })
+        },
+        methods: {
+            //节点选中事件
+            async openNode(node) {
+                //次级列表children,自定义id ownId,请求参数,请求函数ajaxFun,显示子集的文案text,子集的data
+                let children, ownId,param,ajaxFun,text,nodeOwnData;
+                this.jsMind.options.editable = true
+                console.log(node.data)
+                //删除已有的假节点
+                this.removeNode(node, this.jsMind)
+                if (!!node.data && node.data.pointType == "system") {
+                    //系统级
+                    param = {
+                        DataSourceId: this.datasourceId,
+                        PhysicalSystem: node.data.name
+                    }
+                    ajaxFun = this.activeIndex == 0 ? platformEqJsMind : pointTypeJsMind
+                    console.log(ajaxFun)
+                    children = await this.getList(param, ajaxFun)
+                    console.log(children)
+                    children.map(item => {
+                        text = item.EquipmentType || `${item.Description}(${item.Address})`
+                        nodeOwnData = {
+                            pointType: "eq",
+                            name: item.EquipmentType || item.Description,
+                            systemName: node.data.name
+                        }
+                        ownId = this.createRandomId()
+                        this.jsMind.add_node(node, ownId, text , nodeOwnData)
+                        this.addNodeDefault(ownId)
+                    })
+                }
+                if (!!node.data && node.data.pointType == "eq") {
+                    //标识级
+                    param = {
+                        DataSourceId: this.datasourceId,
+                        EquipmentType: node.data.name,
+                        PhysicalSystem: node.data.systemName
+                    }
+                    ajaxFun = this.activeIndex == 0 ? platformIdentJsMind : pointPostJsMind
+                    children = await this.getList(param, ajaxFun)
+                    if (!children) {
+                        return false
+                    }
+                    console.log(children)
+                    children.map(item => {
+                        text = this.activeIndex == 0 ? item.DataQuality + item.EquipmentMark : `${item.Description}(${item.Address}):${item.Data.Data}-${item.Data.Unit}-${item.Data.Time}`
+                        nodeOwnData = {
+                                pointType: "ident",
+                                name: this.activeIndex == 0 ? item.EquipmentMark : item.Description,
+                                systemName: node.data.systemName,
+                                EquipmentType: node.data.name
+                            }
+                            console.log(text,nodeOwnData)
+                        ownId = this.createRandomId()
+                        this.jsMind.add_node(node, ownId, text, nodeOwnData)
+                        this.addNodeDefault(ownId)
+                    })
+                }
+                if (!!node.data && node.data.pointType == "ident") {
+                    //信息级
+                    param = {
+                        DataSourceId: this.datasourceId,
+                        EquipmentType: node.data.EquipmentType,
+                        PhysicalSystem: node.data.systemName,
+                        [ this.activeIndex == 0 ? "EquipmentMark" : "Description"]: node.data.name
+                    }
+                    ajaxFun = this.activeIndex == 0 ? platformInfoJsMind : pointInfoJsMind
+                    children = await this.getList(param, ajaxFun)
+                    if (!children) {
+                        return false
+                    }
+                    console.log(children)
+                    children.map(item => {
+                        ownId = this.createRandomId()
+                        text = `${item.InfomationPoint}(${item.MeterFunc}):${item.Data.Data}-${item.Data.Unit}-${item.Data.Time}`
+                        nodeOwnData = {
+                            pointType: "point",
+                            InfomationPoint: item.InfomationPoint,
+                            EquipmentMark: node.data.name,
+                            systemName: node.data.systemName,
+                            EquipmentType: node.data.EquipmentType
+                        }
+                        this.jsMind.add_node(node, ownId, text, nodeOwnData)
+                        if(this.activeIndex == 0){
+                            console.log(111)
+                            this.addNodeDefault(ownId)
+                        }
+                    })
+                }
+                if (!!node.data && node.data.pointType == "point") {
+                    //信息级
+                    children = await this.getList({
+                        DataSourceId: this.datasourceId,
+                        EquipmentType: node.data.EquipmentType,
+                        PhysicalSystem: node.data.systemName,
+                        EquipmentMark: node.data.EquipmentMark,
+                        InfomationPoint: node.data.InfomationPoint
+                    }, platformPointJsMind)
+                    if (!children) {
+                        return false
+                    }
+                    console.log(children)
+                    children.map(item => {
+                        ownId = this.createRandomId()
+                        this.jsMind.add_node(node, ownId, `${item.Description}(${item.Address}):${item.Data.Data}-${item.Data.Unit}-${item.Data.Time}`, {
+                            pointType: "point",
+                            InfomationPoint: item.InfomationPoint,
+                            EquipmentMark: node.data.name,
+                            systemName: node.data.systemName,
+                            EquipmentType: node.data.EquipmentType
+                        })
+                    })
+                }
+            },
+            //统一添加默认级数
+            addNodeDefault(ownId) {
+                //给下一级添加默认的级数
+                this.jsMind.add_node(ownId, this.createRandomId(), "")
+                //收起该节点下的子节点
+                this.jsMind.collapse_node(ownId)
+            },
+            /**
+             * 删除某个节点下所有的节点
+             * @param {该节点} node
+             * @param {jsmind实例} jsmind
+             */
+            removeNode(node, jsmind) {
+                if(!!node.children){
+                    node.children.map(item => {
+                        this.jsMind.remove_node(item)
+                    })
+                }
+            },
+            //获取接口封装
+            getList(param, fun) {
+                return new Promise((resolve, reject) => {
+                    fun(
+                        param,
+                        res => {
+                            console.log(res)
+                            resolve(res.Content)
+                        }
+                    )
+                })
+            },
+            clickTabs(val) {
+                this.activeIndex = val.index
+                var data = {
+                        id: "root",
+                        topic: this.dataName,
+                        children: []
+                    },
+                    mind = {
+                        /* 元数据,定义思维导图的名称、作者、版本等信息 */
+                        meta: {
+                            name: "jsMind-demo-tree",
+                            author: "sagacloud",
+                            version: "0.2"
+                        },
+                        /* 数据格式声明 */
+                        format: "node_tree",
+                        /* 数据内容 */
+                        data: data
+                    },
+                    id,func;
+                func = this.activeIndex == 0 ? platformSysJsMind : pointSytemJsMind
+                func({
+                    DataSourceId: this.datasourceId
+                }, res => {
+                    data.children = res.Content.map(item => {
+                        id = this.createRandomId();
+                        return {
+                            id: id,
+                            topic: `<div>${item.SpecialtySystem}(${item.PointCount})</div>`,
+                            expanded: false,
+                            pointType: "system",
+                            name: item.SpecialtySystem,
+                            children: [{
+                                id: this.createRandomId(),
+                                topic: "",
+                            }]
+                        }
+                    })
+                    console.log(data, "data")
+                    this.$nextTick(_ => {
+                        if(!!this.mindArr[this.activeIndex]){
+                            this.jsMind = this.mindArr[this.activeIndex]
+                            return false
+                        }
+                        console.log(val.index, this.$refs.jsmind,this.$refs.jsmind1)
+                        if(this.activeIndex == 0){
+                            this.jsMind = this.$refs.jsmind.initData({}, mind)
+                        }else{
+                            this.jsMind = this.$refs.jsmind1.initData({}, mind)
+                        }
+                        this.mindArr[this.activeIndex] = this.jsMind
+                        this.jsMind.options.editable = false
+                    })
+                })
+            },
+            createRandomId() {
+                return (Math.random() * 10000000).toString(16).substr(0, 4) + '-' + (new Date()).getTime() + '-' + Math.random().toString().substr(2, 5);
+            }
+        },
+        components: {
+            jsMindComponent
+        }
+    }
+</script>
+<style lang="scss">
+    .tabs-h {
+        height: calc(100% - 50px);
+        .el-tabs__content {
+            height: calc(100% - 70px);
+            >div {
+                height: 100%;
+            }
+        }
+    }
+    .saga-mind-view {
+        //   height: 450px;
+    }
+</style>

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 963 - 0
src/views/project_setting/collection_setting.vue