Преглед изворни кода

特殊提交:从主干手动同步排班、设备管理看板功能等通用问题修改功能

cfort пре 1 година
родитељ
комит
898a49c599

+ 179 - 180
src/store/modules/ibps/modules/api.js

@@ -8,196 +8,195 @@ let base = BASE_API
 let websocket = BASE_WEBSOCKET
 
 if (process.env.NODE_ENV === 'development') {
-  optionsEnv = Object.keys(env)
-    .filter(keyName => /^VUE_APP_BASE_API_\d+_\w+$/.test(keyName))
-    .map(keyName => {
-      const [index, single, ...name] = keyName.replace('VUE_APP_BASE_API_', '').split('_')
-      return {
-        index: Number(index),
-        single: Number(single) === 1,
-        name: name.join('_'),
-        value: env[keyName]
-      }
-    })
-    .sort((a, b) => a.index - b.index)
-    .map(e => ({
-      single: e.single,
-      name: e.name,
-      value: e.value,
-      type: 'env'
-    }))
+    optionsEnv = Object.keys(env)
+        .filter(keyName => /^VUE_APP_BASE_API_\d+_\w+$/.test(keyName))
+        .map(keyName => {
+            const [index, single, ...name] = keyName.replace('VUE_APP_BASE_API_', '').split('_')
+            return {
+                index: Number(index),
+                single: Number(single) === 1,
+                name: name.join('_'),
+                value: env[keyName]
+            }
+        })
+        .sort((a, b) => a.index - b.index)
+        .map(e => ({
+            single: e.single,
+            name: e.name,
+            value: e.value,
+            type: 'env'
+        }))
 
-  base = BASE_API || (optionsEnv.length > 0 ? optionsEnv[0].value : '')
+    base = BASE_API || (optionsEnv.length > 0 ? optionsEnv[0].value : '')
 
-  websocket = BASE_WEBSOCKET || (optionsEnv.length > 0 ? optionsEnv[0].value : '')
+    websocket = BASE_WEBSOCKET || (optionsEnv.length > 0 ? optionsEnv[0].value : '')
 }
 
 export default {
-  namespaced: true,
-  state: {
-    // 是否是单体
-    single,
-    // 网络请求地址
-    base,
-    // websocket 地址
-    websocket,
-    // env 中设置的地址选项
-    optionsEnv,
-    // 用户自己添加的地址
-    optionsUser: []
-  },
-  getters: {
-    // 混合系统提供的地址和用户自己设置的地址记录
-    options(state) {
-      return [
-        ...state.optionsUser,
-        ...state.optionsEnv
-      ]
-    }
-  },
-  actions: {
-    /**
-       * @description 设置自定义选项
-       * @param {Object} vuex context
-       * @param {String} value
-       * @param {Boolean} single
-       */
-    async custom({ state, dispatch }, {
-      baseUrl,
-      single = false
-    }) {
-      // 如果和现在的值一样 直接返回
-      if (state.base === baseUrl) return
-      // 如果不是选项中的值 将其加入选项
-      const findIndex = [
-        ...state.optionsEnv,
-        ...state.optionsUser
-      ].map(e => e.value).indexOf(baseUrl)
-
-      if (findIndex === -1) {
-        state.optionsUser.push({
-          name: '自定义',
-          single: single,
-          value: baseUrl,
-          type: 'custom'
-        })
-        // 持久化用户自定义选项
-        await dispatch('ibps/db/set', {
-          dbName: 'sys',
-          path: 'api.optionsUser',
-          value: state.optionsUser,
-          user: false
-        }, { root: true })
-      } else {
-        Notification({
-          title: '接口地址已经存在!!',
-          type: 'warning',
-          message: baseUrl
-        })
-      }
+    namespaced: true,
+    state: {
+        // 是否是单体
+        single,
+        // 网络请求地址
+        base,
+        // websocket 地址
+        websocket,
+        // env 中设置的地址选项
+        optionsEnv,
+        // 用户自己添加的地址
+        optionsUser: []
     },
-    /**
-     *
-       * @description 改变网络请求地址
-       * @param {Object} vuex context
-       * @param {String} value
-       * @param {Boolean} single
-     */
-    async set({ state, dispatch }, {
-      baseUrl,
-      single = false,
-      vm
-    }) {
-      // 设置当前子系统为空
-      await dispatch('ibps/system/set', null, {
-        root: true
-      })
-      // 注销当前用户登录
-      await dispatch('ibps/account/fedLogout', {
-        vm: vm
-      }, { root: true })
+    getters: {
+        // 混合系统提供的地址和用户自己设置的地址记录
+        options (state) {
+            return [
+                ...state.optionsUser,
+                ...state.optionsEnv
+            ]
+        }
+    },
+    actions: {
+        /**
+         * @description 设置自定义选项
+         * @param {Object} vuex context
+         * @param {String} value
+         * @param {Boolean} single
+         */
+        async custom ({ state, dispatch }, {
+            baseUrl,
+            single = false
+        }) {
+            // 如果和现在的值一样 直接返回
+            if (state.base === baseUrl) return
+            // 如果不是选项中的值 将其加入选项
+            const findIndex = [
+                ...state.optionsEnv,
+                ...state.optionsUser
+            ].map(e => e.value).indexOf(baseUrl)
 
-      // 接口地址变更
-      state.base = baseUrl
-      // 持久化接口地址设置
-      await dispatch('ibps/db/set', {
-        dbName: 'sys',
-        path: 'api.base',
-        value: state.base,
-        user: false
-      }, { root: true })
+            if (findIndex === -1) {
+                state.optionsUser.push({
+                    name: '自定义',
+                    single: single,
+                    value: baseUrl,
+                    type: 'custom'
+                })
+                // 持久化用户自定义选项
+                await dispatch('ibps/db/set', {
+                    dbName: 'sys',
+                    path: 'api.optionsUser',
+                    value: state.optionsUser,
+                    user: false
+                }, { root: true })
+            } else {
+                Notification({
+                    title: '接口地址已经存在!!',
+                    type: 'warning',
+                    message: baseUrl
+                })
+            }
+        },
+        /**
+         * @description 改变网络请求地址
+         * @param {Object} vuex context
+         * @param {String} value
+         * @param {Boolean} single
+         */
+        async set ({ state, dispatch }, {
+            baseUrl,
+            single = false,
+            vm
+        }) {
+            // 设置当前子系统为空
+            await dispatch('ibps/system/set', null, {
+                root: true
+            })
+            // 注销当前用户登录
+            await dispatch('ibps/account/fedLogout', {
+                vm: vm
+            }, { root: true })
 
-      // 单体应用变更
-      state.single = single
-      // 持久化单体应用设置
-      await dispatch('ibps/db/set', {
-        dbName: 'sys',
-        path: 'api.single',
-        value: state.single,
-        user: false
-      }, { root: true })
-      // 显示提示
-      Notification({
-        title: '接口地址变更',
-        message: baseUrl
-      })
-    },
-    /**
-       * @description 删除一个用户自己的地址配置
-       * @param {Object} vuex context
-       * @param {String} value
-       */
-    async remove({ state, dispatch }, value) {
-      const index = state.optionsUser.map(e => e.value).indexOf(value)
-      if (index >= 0) {
-        // 移除
-        state.optionsUser.splice(index, 1)
-        // 持久化用户自定义选项
-        await dispatch('ibps/db/set', {
-          dbName: 'sys',
-          path: 'api.optionsUser',
-          value: state.optionsUser,
-          user: false
-        }, { root: true })
+            // 接口地址变更
+            state.base = baseUrl
+            // 持久化接口地址设置
+            await dispatch('ibps/db/set', {
+                dbName: 'sys',
+                path: 'api.base',
+                value: state.base,
+                user: false
+            }, { root: true })
 
-        // 显示提示
-        Message({
-          message: `${value} 已经删除`,
-          type: 'success'
-        })
-      }
-    },
-    /**
-       * @description 加载设置
-       * @param {Object} vuex context
-       */
-    async load({ state, dispatch }) {
-      if (process.env.NODE_ENV !== 'development') {
-        return
-      }
-      // 加载接口地址设置
-      state.base = await dispatch('ibps/db/get', {
-        dbName: 'sys',
-        path: 'api.base',
-        defaultValue: base,
-        user: false
-      }, { root: true })
+            // 单体应用变更
+            state.single = single
+            // 持久化单体应用设置
+            await dispatch('ibps/db/set', {
+                dbName: 'sys',
+                path: 'api.single',
+                value: state.single,
+                user: false
+            }, { root: true })
+            // 显示提示
+            Notification({
+                title: '接口地址变更',
+                message: baseUrl
+            })
+        },
+        /**
+         * @description 删除一个用户自己的地址配置
+         * @param {Object} vuex context
+         * @param {String} value
+         */
+        async remove ({ state, dispatch }, value) {
+            const index = state.optionsUser.map(e => e.value).indexOf(value)
+            if (index >= 0) {
+                // 移除
+                state.optionsUser.splice(index, 1)
+                // 持久化用户自定义选项
+                await dispatch('ibps/db/set', {
+                    dbName: 'sys',
+                    path: 'api.optionsUser',
+                    value: state.optionsUser,
+                    user: false
+                }, { root: true })
+
+                // 显示提示
+                Message({
+                    message: `${value} 已经删除`,
+                    type: 'success'
+                })
+            }
+        },
+        /**
+         * @description 加载设置
+         * @param {Object} vuex context
+         */
+        async load ({ state, dispatch }) {
+            if (process.env.NODE_ENV !== 'development') {
+                return
+            }
+            // 加载接口地址设置
+            state.base = await dispatch('ibps/db/get', {
+                dbName: 'sys',
+                path: 'api.base',
+                defaultValue: base,
+                user: false
+            }, { root: true })
 
-      // 加载单体应用设置
-      state.single = await dispatch('ibps/db/get', {
-        dbName: 'sys',
-        path: 'api.single',
-        defaultValue: single,
-        user: false
-      }, { root: true })
+            // 加载单体应用设置
+            state.single = await dispatch('ibps/db/get', {
+                dbName: 'sys',
+                path: 'api.single',
+                defaultValue: single,
+                user: false
+            }, { root: true })
 
-      // 加载接口地址设置
-      state.optionsUser = await dispatch('ibps/db/get', {
-        dbName: 'sys',
-        path: 'api.optionsUser',
-        defaultValue: [],
-        user: false
-      }, { root: true })
+            // 加载接口地址设置
+            state.optionsUser = await dispatch('ibps/db/get', {
+                dbName: 'sys',
+                path: 'api.optionsUser',
+                defaultValue: [],
+                user: false
+            }, { root: true })
+        }
     }
-  }
 }

+ 3 - 3
src/store/modules/ibps/modules/user.js

@@ -75,9 +75,9 @@ export default {
                         const info = response.data
                         /**
                          * store 统一存储高权限角色,用于各模块校验附件下载权限
-                         * 初定角色为:系统管理角色、主任、质量负责人、文件管理负责人、文件管理员
+                         * 初定角色为:系统管理角色、主任、质量负责人、文件管理负责人、文件管理员,文件下载角色
                          */
-                        info.highRoles = ['xtgljs', 'syszr', 'zlfzr', 'wjglzzc', 'wjgly']
+                        info.highRoles = ['xtgljs', 'syszr', 'zlfzr', 'wjglzzc', 'wjgly', 'wjxzjs']
                         const { role = [] } = info || {}
                         const hasHighRole = role.some(item => info.highRoles.includes(item.alias))
                         // 用于文件预览页判定是否开启下载权限
@@ -178,7 +178,7 @@ export default {
          */
         getUserList ({ state, dispatch }, { first, second }) {
             const params = second ? `'%${second}%' or entity.id_ = '${first}'` : first ? `'%${first}%'` : '%%'
-            const sql = `select users.id_ as userId, users.name_ as userName, ifnull(users.mobile_, '') as phone, ifnull(group_concat(distinct positions.id_ order by positions.id_ separator ','), '') as positionId, ifnull(group_concat(distinct positions.name_ order by positions.id_ separator ','), '') as positions, ifnull(group_concat(distinct roles.id_ order by roles.role_note_ asc separator ','), '') as roleId, ifnull(group_concat(distinct roles.name_ order by roles.role_note_ asc separator ','), '') as roles, (select ifnull(people.qian_zi_tu_wen_, '') from t_ryjbqk as people where people.parent_id_ = users.id_) as signatureId, (select ifnull(files.file_name_, '') from ibps_file_attachment as files where files.id_ = signatureId) as signatureName from ibps_party_employee as users left join (select ur.user_id_, r.role_note_, group_concat(distinct r.id_ order by r.id_ separator ',') as id_, group_concat(distinct r.name_ order by r.id_ separator ',') as name_ from ibps_party_user_role as ur join ibps_party_role as r on ur.role_id_ = r.id_ group by ur.user_id_) as roles on users.id_ = roles.user_id_ left join ibps_party_entity as positions on find_in_set(positions.id_, users.positions_) where exists (select 1 from ibps_party_entity as entity where find_in_set(entity.id_, users.positions_) and (entity.path_ like ${params})) group by users.id_`
+            const sql = `select users.id_ as userId, users.name_ as userName, ifnull(users.mobile_, '') as phone, ifnull(group_concat(distinct positions.id_ order by positions.id_ separator ','), '') as positionId, ifnull(group_concat(distinct positions.name_ order by positions.id_ separator ','), '') as positions, ifnull(group_concat(distinct roles.id_ order by roles.role_note_ asc separator ','), '') as roleId, ifnull(group_concat(distinct roles.name_ order by roles.role_note_ asc separator ','), '') as roles, (select ifnull(people.qian_zi_tu_wen_, '') from t_ryjbqk as people where people.parent_id_ = users.id_ order by create_time_ desc limit 1) as signatureId, (select ifnull(files.file_name_, '') from ibps_file_attachment as files where files.id_ = signatureId) as signatureName from ibps_party_employee as users left join (select ur.user_id_, r.role_note_, group_concat(distinct r.id_ order by r.id_ separator ',') as id_, group_concat(distinct r.name_ order by r.id_ separator ',') as name_ from ibps_party_user_role as ur join ibps_party_role as r on ur.role_id_ = r.id_ group by ur.user_id_) as roles on users.id_ = roles.user_id_ left join ibps_party_entity as positions on find_in_set(positions.id_, users.positions_) where exists (select 1 from ibps_party_entity as entity where find_in_set(entity.id_, users.positions_) and (entity.path_ like ${params})) group by users.id_`
             common.request('sql', sql).then(res => {
                 const { data = [] } = res.variables || {}
                 dispatch('ibps/param/setUserList', data, {

+ 5 - 5
src/views/business/deviceManagement/components/CarouselTabl.vue

@@ -2,7 +2,7 @@
     <div style="width: 98%;height: 98%;overflow: hidden;padding: 1%;">
         <div class="title" style="vertical-align: top; height: 10%;font-size: 24px;color: white;font-weight:600;">{{ title }}</div>
         <div v-show="showChart" style="width:100%;height: 87%;display: flex;justify-content: center;">
-            <dv-scroll-board :key="scrollBoardKey" :config="configData" style="width:100%;height:100%" />
+            <dv-scroll-board :key="scrollBoardKey" :config="configData" style="width:100%;height:100%;font-size: 12px" />
         </div>
         <div v-show="!showChart" :class="$style.nullShow">暂无数据</div>
     </div>
@@ -12,7 +12,7 @@
 export default {
     props: {
         value: {
-            type: Object,
+            type: Object
         },
         title: {
             type: String,
@@ -29,15 +29,15 @@ export default {
     watch: {
         value: {
             handler (newVal, oldVal) {
-                if(newVal.data.length>0){
+                if (newVal.data.length > 0) {
                     this.configData = { ...newVal }
                     this.scrollBoardKey++
                     this.showChart = true
-                }else{
+                } else {
                     this.shoshowChartw = false
                 }
             },
-            deep: true,
+            deep: true
             // immediate: true
         }
     },

+ 6 - 1
src/views/business/deviceManagement/components/barChart.vue

@@ -149,8 +149,13 @@
           },
           yAxis: {
             type: 'value',
+            min:0,
             axisLabel: {
-                color: '#fff'
+                color: '#fff',
+                formatter: function(value) {
+                  console.log(value)
+                  return (value+'').indexOf('.')===-1?value: ''
+                }
             },
             splitLine:{
               show:true,

+ 213 - 192
src/views/business/deviceManagement/components/barCharto.vue

@@ -1,220 +1,241 @@
 <template>
-  <div :class="$style.statisticsPage" :style="{width:width,height:height}">
-      <div v-show="show" :id="'staff'+id" :style="{height:'100%'}"/>
-      <div v-show="!show" :style="{height:'100%'}">
-        <div style="height:8%;font-size:24px;font-weight: 600;"> {{ title }} </div>
-        <div :class="$style.nullShow">暂无数据</div>
-      </div>
-  </div>
+    <div :class="$style.statisticsPage" :style="{width:width,height:height}">
+        <div v-show="show" :id="'staff'+id" :style="{height:'100%'}" />
+        <div v-show="!show" :style="{height:'100%'}">
+            <div style="height:8%;font-size:24px;font-weight: 600;"> {{ title }} </div>
+            <div :class="$style.nullShow">暂无数据</div>
+        </div>
+    </div>
 </template>
 
 <script>
-  import * as echarts from 'echarts'
-  export default {
+import * as echarts from 'echarts'
+export default {
     components: {
     },
     props: {
-      value: {
-        type: Array,
-      },
-      width:{
-        type:String,
-        default:"100%"
-      },
-      height:{
-        type:String,
-        default: "100%"
-      },
-      id:{
-        type:Number,
-        default:0
-      },
-      click:{
-        type:String,
-        default:'true'
-      },
-      colorw:{
-        type:String,
-        default:'#fff'
-      },
-      title:{
-        type: String
-      },
-      data: {
-        type: Array,
-      },
-      lineTF: {
-        type: Boolean,
-        default: false
-      },
-      colorIndex: {
-        type: Number,
-        default: 0
-      }
-    },
-    data () {
-      return {
-        correspondence: {
-          numO: '1年以下',
-          numOT: '1-3年',
-          numTF: '3-5年',
-          numF: '5年以上',
-          // numAll: '设备总数',
-          numR: '良好数',
-          numS: '停用数',
-          numP: '待处理',
-          numC: '已完成',
-          numJ: '计划数',
-          numW: '完成数'
+        value: {
+            type: Array
         },
-        correspondenceUn:{
-          rate: '完成率'
+        width: {
+            type: String,
+            default: '100%'
         },
-        // color: ['rgb(78,203,115)', 'rgb(251,211,55)', 'rgb(16,142,233)']
-        color: ['#5470c6', '#339933', '#FF0033', 'rgb(251,211,55)'],
-        show: false
-      }
+        height: {
+            type: String,
+            default: '100%'
+        },
+        id: {
+            type: Number,
+            default: 0
+        },
+        click: {
+            type: String,
+            default: 'true'
+        },
+        colorw: {
+            type: String,
+            default: '#fff'
+        },
+        title: {
+            type: String
+        },
+        data: {
+            type: Array
+        },
+        lineTF: {
+            type: Boolean,
+            default: false
+        },
+        colorIndex: {
+            type: Number,
+            default: 0
+        },
+        stack: {
+            type: Boolean,
+            default: false
+        }
+    },
+    data () {
+        return {
+            correspondence: {
+                numO: '1年以下',
+                numOT: '1-3年',
+                numTF: '3-5年',
+                numF: '5年以上',
+                // numAll: '设备总数',
+                numP: '待处理',
+                numC: '已完成',
+                numJ: '计划数',
+                numW: '完成数'
+            },
+            correspondenceUn: {
+                rate: '完成率'
+            },
+            correspondenceCondition: {
+                // numAll: '设备总数',
+                numLimit: '限用',
+                numR: '使用',
+                numScrap: '报废',
+                numS: '停用'
+
+            },
+            dynamicMappingCondition: {
+                '限用': '限用数',
+                '使用': '使用数',
+                '报废': '报废数',
+                '停用': '停用数'
+            },
+            // color: ['rgb(78,203,115)', 'rgb(251,211,55)', 'rgb(16,142,233)']
+            color: ['#5470c6', '#339933', '#FF0033', 'rgb(251,211,55)'],
+            show: false
+        }
     },
     watch: {
         value: {
             handler (newVal) {
-                if(newVal.length>0){
-                  this.show = true
-                  setTimeout(() => {
-                    this.drawLine()
-                  }, 100)
-                }else{
-                  this.show = false
-                }  
+                if (newVal.length > 0) {
+                    this.show = true
+                    setTimeout(() => {
+                        this.drawLine()
+                    }, 100)
+                } else {
+                    this.show = false
+                }
             },
             deep: true
         }
     },
-    mounted(){
-      // setTimeout(() => {
-      //   this.drawLine()
-      // }, 100);
+    mounted () {
+        // setTimeout(() => {
+        //   this.drawLine()
+        // }, 100);
     },
     methods: {
-      drawLine(){
-        const that = this
-        let xData = []
-        for (const key in this.value[0]) {
-          if (this.correspondence.hasOwnProperty(key) || key === 'org') {
-            xData.push(key)
-          }
-        }
-        let serArr = []
-        for (let i = 1; i < xData.length; i++) {
-          let ser = {
-            name: '',
-            type: 'bar',
-            barWidth: xData.length>3?10:20,
-            color: ''
-          }
-          ser.name = xData[i]
-          ser.color = this.color[i-1+this.colorIndex]
-          serArr.push(ser)
-        }
-        if(this.lineTF){
-          serArr.push({
-            name: 'rate',
-            type: 'line',
-            // barWidth: xData.length>3?10:20,
-            color: 'rgb(251,211,55)'
-          })
-        }
-        
-        let staff = echarts.init(document.getElementById('staff'+this.id))
-        let option
-
-        option = {
-          title: {
-            text: this.title,
-            left: 'left',
-            textStyle:{ fontSize:24,color: this.colorw }
-          },
-          legend: {
-            left: 'left',
-            top: '40',
-            textStyle: {
-              color: '#fff'
-            },
-            formatter: function (name) {
-              return that.correspondence[name] || that.correspondenceUn[name]
+        drawLine () {
+            const that = this
+            const xData = []
+            for (const key in this.value[0]) {
+                if (this.correspondenceCondition.hasOwnProperty(key) || this.correspondence.hasOwnProperty(key) || key === 'org') {
+                    xData.push(key)
+                }
             }
-          },
-          grid: { // 让图表占满容器
-              top: '80px',
-              left: '40px',
-              right: '20px',
-              bottom: '40px'
-          },
-          tooltip: {
-            trigger: 'axis',
-            axisPointer: {
-              type: 'cross',
-              crossStyle: {
-                color: '#999'
-              }
-            },
-            formatter: function (params) {
-              let str = `${that.value[params[0].dataIndex].org}`
-              params.forEach(item =>{
-                let nameNum = ''
-                nameNum = that.correspondence[item.seriesName] || that.correspondenceUn[item.seriesName]
-                str += `<br /> ${item.marker} ${nameNum}  ${item.data[item.seriesName]}`
-              })
-              return str
+            const serArr = []
+            for (let i = 1; i < xData.length; i++) {
+                const ser = {
+                    name: '',
+                    type: 'bar',
+                    barWidth: xData.length > 3 ? 30 : 20,
+                    color: ''
+                }
+                if (this.stack) {
+                    ser['stack'] = 'Ad'
+                }
+                ser.name = xData[i]
+                ser.color = this.color[i - 1 + this.colorIndex]
+                serArr.push(ser)
+            }
+            if (this.lineTF) {
+                serArr.push({
+                    name: 'rate',
+                    type: 'line',
+                    // barWidth: xData.length>3?10:20,
+                    color: 'rgb(251,211,55)'
+                })
             }
-          },
-          dataset: {
-            dimensions: xData,
-            source: this.value
-          },
-          xAxis: {
-            type: 'category',
-            axisLabel: {
-              color: '#fff',
-              interval: 0,
-              rotate: 20,
-              margin: 15,
-              formatter: function (params) {
-                let str = ""
-                let paramsLen = params.length
-                let len = 5
-                let rowNumber = Math.ceil(paramsLen / len)
-                if (paramsLen > len) {
-                  for (let i = 0; i < rowNumber; i++) {
-                    let temp = ""
-                    let start = i * len
-                    let end = start + len
-                    if (i == rowNumber - 1) {
-                      temp = params.substring(start, paramsLen)
-                    } else {
-                      temp = params.substring(start, end) + "\n"
+
+            const staff = echarts.init(document.getElementById('staff' + this.id))
+            const option = {
+                title: {
+                    text: this.title,
+                    left: 'left',
+                    textStyle: { fontSize: 24, color: this.colorw }
+                },
+                legend: {
+                    left: 'left',
+                    top: '40',
+                    textStyle: {
+                        color: '#fff'
+                    },
+                    formatter: function (name) {
+                        return that.correspondence[name] || that.correspondenceUn[name] || that.dynamicMappingCondition[that.correspondenceCondition[name]]
                     }
-                    str += temp
-                  }
-                } else {
-                  str = params
-                }
-                return str
-              }
+                },
+                grid: { // 让图表占满容器
+                    top: '80px',
+                    left: '40px',
+                    right: '20px',
+                    bottom: '40px'
+                },
+                tooltip: {
+                    trigger: 'axis',
+                    axisPointer: {
+                        type: 'cross',
+                        crossStyle: {
+                            color: '#999'
+                        }
+                    },
+                    formatter: function (params) {
+                        let str = `${that.value[params[0].dataIndex].org}`
+                        params.forEach(item => {
+                            let nameNum = ''
+                            nameNum = that.correspondence[item.seriesName] || that.correspondenceUn[item.seriesName] || that.dynamicMappingCondition[that.correspondenceCondition[item.seriesName]]
+                            str += `<br /> ${item.marker} ${nameNum}  ${item.data[item.seriesName]}`
+                        })
+                        return str
+                    }
+                },
+                dataset: {
+                    dimensions: xData,
+                    source: this.value
+                },
+                xAxis: {
+                    type: 'category',
+                    axisLabel: {
+                        color: '#fff',
+                        interval: 0,
+                        rotate: 20,
+                        margin: 15,
+                        formatter: function (params) {
+                            let str = ''
+                            const paramsLen = params.length
+                            const len = 5
+                            const rowNumber = Math.ceil(paramsLen / len)
+                            if (paramsLen > len) {
+                                for (let i = 0; i < rowNumber; i++) {
+                                    let temp = ''
+                                    const start = i * len
+                                    const end = start + len
+                                    if (i == rowNumber - 1) {
+                                        temp = params.substring(start, paramsLen)
+                                    } else {
+                                        temp = params.substring(start, end) + '\n'
+                                    }
+                                    str += temp
+                                }
+                            } else {
+                                str = params
+                            }
+                            return str
+                        }
+                    }
+                },
+                yAxis: {
+                    axisLabel: {
+                        color: '#fff',
+                        min: 0,
+                        formatter: function (value) {
+                            return (value + '').indexOf('.') === -1 ? value : ''
+                        }
+                    }
+                    // interval: interval
+                },
+                series: serArr
             }
-          },
-          yAxis: {
-            axisLabel: {
-              color: '#fff'
-            },
-            // interval: interval
-          },
-          series: serArr
+            option && staff.setOption(option)
         }
-       option && staff.setOption(option);
-      },
     }
-  }
+}
 </script>
 <style lang="scss" module>
   /* #zlmbPie:hover{

Разлика између датотеке није приказан због своје велике величине
+ 0 - 9
src/views/business/deviceManagement/components/entirety.vue


+ 75 - 75
src/views/business/deviceManagement/constants/simulated.js

@@ -154,111 +154,111 @@ export const verificationData = [
 ]
 export const scrapData = [
     [
-        "微生物组",
-        "游标卡尺",
-        "JYK-1690",
-        "停用"
+        '微生物组',
+        '游标卡尺',
+        'JYK-1690',
+        '停用'
     ],
     [
-        "微生物组",
-        "生物安全柜",
-        "JYK-1688",
-        "停用"
+        '微生物组',
+        '生物安全柜',
+        'JYK-1688',
+        '停用'
     ],
     [
-        "微生物组",
-        "医用离心机",
-        "JYK-1682",
-        "停用"
+        '微生物组',
+        '医用离心机',
+        'JYK-1682',
+        '停用'
     ],
     [
-        "微生物组",
-        "生物安全柜",
-        "JYK-1689",
-        "停用"
+        '微生物组',
+        '生物安全柜',
+        'JYK-1689',
+        '停用'
     ],
     [
-        "免疫组",
-        "医用离心机",
-        "JYK-1692",
-        "停用"
+        '免疫组',
+        '医用离心机',
+        'JYK-1692',
+        '停用'
     ],
     [
-        "免疫组",
-        "数显混匀器",
-        "JYK-1691",
-        "停用"
+        '免疫组',
+        '数显混匀器',
+        'JYK-1691',
+        '停用'
     ],
     [
-        "生化组",
-        "笔式电导率测定仪",
-        "JYK-1679",
-        "停用"
+        '生化组',
+        '笔式电导率测定仪',
+        'JYK-1679',
+        '停用'
     ],
     [
-        "生化组",
-        "Beckman Coulter IMMAGE 800特定蛋白分析仪",
-        "JYK-1594",
-        "停用"
+        '生化组',
+        'Beckman Coulter IMMAGE 800特定蛋白分析仪',
+        'JYK-1594',
+        '停用'
     ],
     [
-        "临检组",
-        "显微镜",
-        "JYK-0453",
-        "停用"
+        '临检组',
+        '显微镜',
+        'JYK-0453',
+        '停用'
     ],
     [
-        "临检组",
-        "自动染色仪",
-        "JYK-0447",
-        "停用"
+        '临检组',
+        '自动染色仪',
+        'JYK-0447',
+        '停用'
     ],
     [
-        "临检组",
-        "检验分析用纯水设备",
-        "JYK-1663",
-        "停用"
+        '临检组',
+        '检验分析用纯水设备',
+        'JYK-1663',
+        '停用'
     ],
     [
-        "临检组",
-        "超纯水机",
-        "JYK-0456",
-        "停用"
+        '临检组',
+        '超纯水机',
+        'JYK-0456',
+        '停用'
     ],
     [
-        "临检组",
-        "干式荧光免疫分析仪",
-        "JYK-0434",
-        "停用"
+        '临检组',
+        '干式荧光免疫分析仪',
+        'JYK-0434',
+        '停用'
     ],
     [
-        "临检组",
-        "全自动血细胞分析仪",
-        "JYK-0420",
-        "停用"
+        '临检组',
+        '全自动血细胞分析仪',
+        'JYK-0420',
+        '停用'
     ],
     [
-        "临检组",
-        "尿液分析仪",
-        "JYK-0449",
-        "停用"
+        '临检组',
+        '尿液分析仪',
+        'JYK-0449',
+        '停用'
     ]
 ]
 export const entiretyData = {
-    totality:{
+    totality: {
         sum: 50,
         month: {
             add: 10,
             outService: 10,
             scrap: 10
-        },
+        }
         // year: {
         //     add: 10,
         //     outService: 10,
         //     scrap: 10
         // }
     },
-    calibrate:{
+    calibrate: {
         sum: 50,
         month: {
             calibrateNum: 10,
@@ -268,18 +268,18 @@ export const entiretyData = {
             calibrateNum: 10,
             outService: 10
         }
-    },
-    upkeep:{
-        sum: 50,
-        month: {
-            upkeep: 10,
-            unUpkeep: 10
-        },
-        year: {
-            upkeep: 10,
-            unUpkeep: 10
-        }
     }
+    // upkeep: {
+    //     sum: 50,
+    //     month: {
+    //         upkeep: 10,
+    //         unUpkeep: 10
+    //     },
+    //     year: {
+    //         upkeep: 10,
+    //         unUpkeep: 10
+    //     }
+    // }
 }
 export default {
     distributionDataObj,
@@ -290,4 +290,4 @@ export default {
     verificationData,
     scrapData,
     entiretyData
-}
+}

+ 63 - 60
src/views/business/deviceManagement/index.vue

@@ -15,40 +15,40 @@
             <dv-border-box-1>
                 <div class="vessel">
                     <div class="area">
-                        <dv-border-box-7 :color="dvColor" :backgroundColor="dvBackColor" style="width:100%;height:31.66%;">
+                        <dv-border-box-7 :color="dvColor" :background-color="dvBackColor" style="width:100%;height:31.66%;">
                             <middleCard v-if="mergeData[0].numData.length>0" v-model="mergeData[0].numData" :title="mergeData[0].title" :width="'98%'" :height="'98%'" />
                         </dv-border-box-7>
                         <dv-decoration-2 :key="`line1`" :dur="6" style="width:100%;height:2.5%;" />
-                        <dv-border-box-7 :color="dvColor" :backgroundColor="dvBackColor" style="width:100%;height:31.66%;">
-                            <pie-chart v-if="mergeData[1].numData.length>0" :title="mergeData[1].title" v-model="mergeData[1].numData" :width="'98%'" :height="'98%'" :id="1"/>
+                        <dv-border-box-7 :color="dvColor" :background-color="dvBackColor" style="width:100%;height:31.66%;">
+                            <pie-chart v-if="mergeData[1].numData.length>0" :id="1" v-model="mergeData[1].numData" :title="mergeData[1].title" :width="'98%'" :height="'98%'" />
                         </dv-border-box-7>
                         <dv-decoration-2 :key="`line2`" :dur="6" style="width:100%;height:2.5%;" />
-                        <dv-border-box-7 :color="dvColor" :backgroundColor="dvBackColor" style="width:100%;height:31.66%;">
-                            <bar-chart v-if="mergeData[2].numData.length>0" :title="mergeData[2].title" v-model="mergeData[2].numData" :width="'98%'" :height="'98%'" :id="1" />
+                        <dv-border-box-7 :color="dvColor" :background-color="dvBackColor" style="width:100%;height:31.66%;">
+                            <bar-chart v-if="mergeData[2].numData.length>0" :id="1" v-model="mergeData[2].numData" :title="mergeData[2].title" :stack="true" :width="'98%'" :height="'98%'" />
                         </dv-border-box-7>
                     </div>
                     <dv-decoration-2 :key="`line3`" :reverse="true" :dur="6" style="width:1%;height:100%;" />
                     <div class="area midArea">
-                        <dv-border-box-7 :color="dvColor" :backgroundColor="dvBackColor" style="width:100%;height:41.5%;">
-                            <entirety :title="mergeData[7].title" v-model="mergeData[7].numData" :width="'98%'" :height="'98%'"/>
+                        <dv-border-box-7 :color="dvColor" :background-color="dvBackColor" style="width:100%;height:41.5%;">
+                            <entirety v-model="mergeData[7].numData" :title="mergeData[7].title" :width="'98%'" :height="'98%'" />
                         </dv-border-box-7>
                         <dv-decoration-2 :key="`line5`" :dur="6" style="width:100%;height:2.5%;" />
-                        <dv-border-box-7 :color="dvColor" :backgroundColor="dvBackColor" style="width:100%;height:56.18%;">
-                            <bar-chart v-if="mergeData[3].numData.length>0" :title="mergeData[3].title" v-model="mergeData[3].numData" :colorIndex="1" :width="'98%'" :height="'98%'" :id="2" />
+                        <dv-border-box-7 :color="dvColor" :background-color="dvBackColor" style="width:100%;height:56.18%;">
+                            <CarouselTabl v-if="mergeData[6].numData.data.length>0" v-model="mergeData[6].numData" :title="mergeData[6].title" />
                         </dv-border-box-7>
                     </div>
                     <dv-decoration-2 :key="`line4`" :reverse="true" :dur="6" style="width:1%;height:100%;" />
                     <div class="area">
-                        <dv-border-box-7 :color="dvColor" :backgroundColor="dvBackColor" style="width:100%;height:31.66%;">
-                            <bar-chart v-if="mergeData[4].numData.length>0" :title="mergeData[4].title" v-model="mergeData[4].numData" :lineTF="true" :width="'98%'" :height="'98%'" :id="3" />
+                        <dv-border-box-7 :color="dvColor" :background-color="dvBackColor" style="width:100%;height:31.66%;">
+                            <bar-chart v-if="mergeData[4].numData.length>0" :id="3" v-model="mergeData[4].numData" :title="mergeData[4].title" :line-t-f="true" :width="'98%'" :height="'98%'" />
                         </dv-border-box-7>
                         <dv-decoration-2 :key="`6`" :dur="6" style="width:100%;height:2.5%;" />
-                        <dv-border-box-7 :color="dvColor" :backgroundColor="dvBackColor" style="width:100%;height:31.66%;">
-                            <bar-chart v-if="mergeData[5].numData.length>0" :title="mergeData[5].title" v-model="mergeData[5].numData" :width="'98%'" :height="'98%'" :id="4" />
+                        <dv-border-box-7 :color="dvColor" :background-color="dvBackColor" style="width:100%;height:31.66%;">
+                            <bar-chart v-if="mergeData[5].numData.length>0" :id="4" v-model="mergeData[5].numData" :title="mergeData[5].title" :width="'98%'" :height="'98%'" />
                         </dv-border-box-7>
                         <dv-decoration-2 :key="`line7`" :dur="6" style="width:100%;height:2.5%;" />
-                        <dv-border-box-7 :color="dvColor" :backgroundColor="dvBackColor" style="width:100%;height:31.66%;">
-                            <CarouselTabl v-if="mergeData[6].numData.data.length>0" :title="mergeData[6].title" v-model="mergeData[6].numData"/> 
+                        <dv-border-box-7 :color="dvColor" :background-color="dvBackColor" style="width:100%;height:31.66%;">
+                            <bar-chart v-if="mergeData[3].numData.length>0" :id="2" v-model="mergeData[3].numData" :title="mergeData[3].title" :stack="true" :color-index="0" :width="'98%'" :height="'98%'" />
                         </dv-border-box-7>
                     </div>
                 </div>
@@ -66,12 +66,12 @@ export default {
         PieChart: () => import('./components/pieChart.vue'),
         middleCard: () => import('./components/getPieView'),
         CarouselTabl: () => import('./components/CarouselTabl'),
-        entirety: () => import('./components/entirety'),
+        entirety: () => import('./components/entirety')
     },
     data () {
         const { deptList = [] } = this.$store.getters || {}
-        let chooseDept = deptList.filter(e => e.depth == 4)
-        chooseDept.unshift({positionId: " ",positionName: "全科室"})
+        const chooseDept = deptList.filter(e => e.depth == 4)
+        chooseDept.unshift({ positionId: ' ', positionName: '全科室' })
         return {
             deptList,
             chooseDept,
@@ -80,32 +80,32 @@ export default {
             title: '设备管理看板',
             fontSize: 18,
             // show: true,
-            hoverClassAdd:'w',
+            hoverClassAdd: 'w',
             dvColor: ['rgb(22,47,98)', 'rgba(116, 142, 194, 1)'],
             dvBackColor: 'rgba(6, 30, 93, 0)',
-            mergeData:[
+            mergeData: [
                 {
-                    title: '检验科各型设备分布情况',
+                    title: '设备类型统计',
                     numData: dataobj.distributionDataObj
                 },
                 {
-                    title: '各组设备总数分布情况',
+                    title: '设备数量统计',
                     numData: dataobj.numDistributionDataObj
                 },
                 {
-                    title: '部门设备寿命情况统计',
+                    title: '设备使用寿命统计',
                     numData: dataobj.lifeTimeData
                 },
                 {
-                    title: '各部门设备完好情况',
+                    title: '设备状况统计',
                     numData: dataobj.intactData
                 },
                 {
-                    title: '各部门设备维护完成情况',
+                    title: '设备维护完成情况',
                     numData: dataobj.completeData
                 },
                 {
-                    title: '各部门设备检定/校准完成情况',
+                    title: '设备检定/校准完成情况',
                     numData: dataobj.verificationData
                 },
                 // {
@@ -119,17 +119,17 @@ export default {
                 //         hoverPause: true
                 //     }
                 // },
-                 {
-                    title: "检验科设备信息",
+                {
+                    title: '设备维修情况统计',
                     numData: {
-                           // header: ["部门", "设备名称", "设备编号", "状态"],
-                        header: ["部门", "设备名称", "设备编号", "状态","维修次数"],
-                        headerBGC: "rgba(0,0,0,0)",
+                        // header: ["部门", "设备名称", "设备编号", "状态"],
+                        header: ['部门', '设备名称', '设备编号', '状态', '维修次数'],
+                        headerBGC: 'rgba(0,0,0,0)',
                         data: dataobj.scrapData,
-                        columnWidth: ["100", "220", "110","110","120"],
+                        columnWidth: ['120', '270', '220', '90', '110'],
                         rowNum: 5,
                         hoverPause: true
-                        }
+                    }
                 },
                 {
                     title: '设备整体情况',
@@ -165,27 +165,27 @@ export default {
             })
             this.initializeData()
             equipDashBoard().then(res => {
-                let data = res.data[0] || {}
-                
-                const numDistributionDataObj = data.numDistributionDataObj.filter((item,i)=>{
-                    return item.name.indexOf('综合')===-1
+                const data = res.data[0] || {}
+
+                const numDistributionDataObj = data.numDistributionDataObj.filter((item, i) => {
+                    return item.name.indexOf('综合') === -1
                 })
-                const lifeTimeData = data.lifeTimeData.filter((item,i)=>{
-                    return item.org.indexOf('综合')===-1
+                const lifeTimeData = data.lifeTimeData.filter((item, i) => {
+                    return item.org.indexOf('综合') === -1
                 })
-                
-                const intactData = data.intactData.filter((item,i)=>{
-                    return item.org.indexOf('综合')===-1
+
+                const intactData = data.intactData.filter((item, i) => {
+                    return item.org.indexOf('综合') === -1
                 })
                 console.log(data.verificationData)
-                const verificationData = data.intactData.filter((item,i)=>{
-                    return item.org.indexOf('综合')===-1
+                const verificationData = data.verificationData.filter((item, i) => {
+                    return item.org.indexOf('综合') === -1
                 })
-                const scrapData = data.scrapData.filter((item,i)=>{
-                    return item[0].indexOf('综合')===-1
+                const scrapData = data.scrapData.filter((item, i) => {
+                    return item[0].indexOf('综合') === -1
                 })
 
-                const scrapDataList=JSON.parse(JSON.stringify(scrapData))
+                const scrapDataList = JSON.parse(JSON.stringify(scrapData))
                 for (var i = 0; i < scrapData.length; i++) {
                     if (i < scrapData.length - 1) {
                         const a = JSON.parse(JSON.stringify(scrapData[i][1]))
@@ -195,34 +195,37 @@ export default {
                             scrapData[i + 1][1] = a
                         }
                     }
-                scrapDataList[i][0] = scrapData[i][4]
-                scrapDataList[i][1] = scrapData[i][5]
-                scrapDataList[i][2] = scrapData[i][3]
-                scrapDataList[i][3] = scrapData[i][7]
-                scrapDataList[i][4] = "&nbsp;&nbsp;&nbsp;&nbsp;"+scrapData[i][1]+'次'
-                scrapDataList[i].splice(5, 3)
+                    scrapDataList[i][0] = scrapData[i][4]
+                    scrapDataList[i][1] = scrapData[i][5]
+                    scrapDataList[i][2] = scrapData[i][3]
+                    scrapDataList[i][3] = scrapData[i][7]
+                    scrapDataList[i][4] = '&nbsp;&nbsp;&nbsp;&nbsp;' + scrapData[i][1] + '次'
+                    scrapDataList[i].splice(5, 3)
                 }
                 this.mergeData[0].numData = data.distributionDataObj || []
                 this.mergeData[1].numData = numDistributionDataObj
                 this.mergeData[2].numData = lifeTimeData
                 this.mergeData[3].numData = intactData
                 this.mergeData[4].numData = []
-                if(data.completeData !== null && data.completeData.length>0){
+                if (data.completeData !== null && data.completeData.length > 0) {
                     data.completeData.forEach(element => {
-                        if(element.org.indexOf('综合')===-1){
-                            this.mergeData[4].numData.push({...element,rate: element.numP!==0?(element.numC/element.numP).toFixed(2) * 100:0})
+                        if (element.org.indexOf('综合') === -1) {
+                            console.log((element.numC / element.numP).toFixed(4), (element.numC / element.numP).toFixed(4) * 100)
+                            this.mergeData[4].numData.push({ ...element, rate: (element.numP !== 0 ? ((element.numC * 100) / element.numP).toFixed(2) : 0) + '%' })
                         }
                     })
                 }
                 this.mergeData[5].numData = verificationData
                 this.mergeData[6].numData.data = scrapDataList
-                this.mergeData[7].numData = data.entiretyData || []
+                const { upKeep, ...b } = data.entiretyData
+                this.mergeData[7].numData = b || []
+                console.log(data.entiretyData, b, this.mergeData[7].numData)
                 loading.close()
             })
         },
         goBack () {
             this.$router.back(-1)
-        },
+        }
     }
 }
 </script>
@@ -265,7 +268,7 @@ export default {
                     justify-content: space-evenly;
                     align-content: space-evenly;
                     .area{
-                        width: 26%;
+                        width: 28%;
                         height: 100%;
                         .dv-border-box-7{
                             .border-box-content{
@@ -275,7 +278,7 @@ export default {
                         }
                     }
                     .midArea{
-                        width: 45%;
+                        width: 41%;
                     }
                 }
             }

+ 1 - 1
src/views/business/​scheduleManage/adjust.vue

@@ -95,7 +95,7 @@ export default {
                     // effect: 'display',
                     actions: [
                         { key: 'edit', label: '编辑', type: 'primary', icon: 'ibps-icon-edit', hidden: function (row) { return row.status !== '已暂存' && row.status !== '已取消' } },
-                        { key: 'cancel', label: '取消', type: 'danger', icon: 'ibps-icon-cancel', hidden: function (row) { return row.status !== '待审核' } },
+                        { key: 'cancel', label: '取消', type: 'danger', icon: 'ibps-icon-cancel', hidden: function (row) { return !(row.status === '待审核' && row.createBy === this.$store.getters.userId) } },
                         { key: 'edit', label: '再次申请', type: 'primary', icon: 'ibps-icon-edit', hidden: function (row) { return row.status !== '已拒绝' } },
                         { key: 'detail', label: '详情', type: 'primary', icon: 'ibps-icon-list-alt' }
                     ]

+ 13 - 1
src/views/business/​scheduleManage/adjustVerify.vue

@@ -574,11 +574,23 @@ export default {
         /**
          * 批量处理同意/不同意
          */
-        async handleMassAgree (key, data) {
+        async handleMassAgree (key, data, selection) {
             if (!data || data.length < 1) {
                 ActionUtils.warning('请选择数据!')
                 return
             }
+            let flag = []
+            data = data.filter((row, index) => {
+                if (this.showAgreeBtn(row)) {
+                    flag.push(index + 1)
+                    return false
+                }
+                return true
+            })
+            if (flag.length > 0) {
+                this.$message.warning('所选数据中【序号:' + flag.join(',') + '】您无权限处理或已结束审核审批!')
+                return
+            }
             if (key === 'massAgree') {
                 this.updateMassData(key, data)
             } else {

+ 3 - 5
src/views/business/​scheduleManage/components/adjust-edit.vue

@@ -381,7 +381,6 @@ export default {
             // 初始化表单数据的方法
             const initializeFormData = (data) => {
                 const { scheduleId, reason, status, rejectReason, executor, executeDate, adjustmentDetailPoList } = data || {}
-                debugger
                 this.reScheduleValue = data.type
                 // this.reScheduleValue = 'paiban'
                 self.formData = {
@@ -436,7 +435,7 @@ export default {
         async getScheduleInfo (id, self) { // 获取排班下拉的列表
             await getStaffSchedule({ id }).then(async (res) => {
                 const { data } = res
-                // self.scheduleList = [data]
+                self.scheduleList = [data]
                 const config = data.config ? JSON.parse(data.config) : {}
                 self.scheduleInfo = {
                     startDate: data.startDate,
@@ -445,11 +444,10 @@ export default {
                     shiftList: data.staffScheduleDetailPoList,
                     executor: JSON.stringify(config.approver) || ''
                 }
-                debugger
-                /* self.scheduleOptions = self.scheduleList.map(s => ({
+                self.scheduleOptions = self.scheduleList.map(s => ({
                     label: s.title,
                     value: s.id
-                }))*/
+                }))
                 if (this.params.action !== 'view') {
                     self.handleScheduleChange(id)
                 }

+ 0 - 2
src/views/business/​scheduleManage/list.vue

@@ -106,7 +106,6 @@ export default {
                     actions: [
                         { key: 'adjust', label: '申请调班', type: 'primary', icon: 'ibps-icon-exchange', hidden: false },
                         { key: 'edit', label: '编辑', type: 'primary', icon: 'ibps-icon-edit', hidden: (row) => {
-                            debugger
                             return !this.isRoleFilter() && this.$store.getters.userId !== row.createBy
                         } },
                         { key: 'preview', label: '查看', type: 'primary', icon: 'ibps-icon-eye', hidden: false }
@@ -163,7 +162,6 @@ export default {
          * 判断当前用户是否为超级管理员和高权限角色和专业组组长
          */
         isRoleFilter () {
-            debugger
             const highRoles = this.$store.getters.userInfo.highRoles || [] // 高权限角色
             const userRole = this.$store.getters.userInfo.role || [] // 用户权限角色
             let isHighRole = false

+ 1 - 1
src/views/system/jbdScan/goods/guanshenzhuangtai.vue

@@ -264,7 +264,7 @@ export default {
                 {
                     stepIndex: 80,
                     title: '管审报告',
-                    post: '质量负责人/检验科主任'
+                    post: '质量负责人/主任'
                 },
                 {
                     stepIndex: 100,

Неке датотеке нису приказане због велике количине промена