Просмотр исходного кода

Merge branch '深圳三院' of http://119.23.210.103:3000/wy/zdqy_firm_former into 深圳三院

shenqilong 7 месяцев назад
Родитель
Сommit
b786c27d4c

Разница между файлами не показана из-за своего большого размера
+ 23289 - 1
package-lock.json


+ 1 - 1
package.json

@@ -86,7 +86,7 @@
     "screenfull": "^5.0.2",
     "script-loader": "^0.7.2",
     "signature_pad": "^3.0.0-beta.3",
-    "sortablejs": "^1.10.2",
+    "sortablejs": "^1.14.0",
     "ua-parser-js": "^0.7.21",
     "v-fit-columns": "^0.2.0",
     "video.js": "^7.8.4",

+ 43 - 0
src/mixins/sortable.js

@@ -0,0 +1,43 @@
+import Sortable from 'sortablejs'
+/**
+ * 组件必须提供一个sortableEnd方法用于拖拽数据更新
+ */
+export default {
+  data() {
+    return {
+      sortable: null
+    }
+  },
+  methods: {
+    // 初始化拖拽排序
+    initSortable() {
+      // 获取表格的tbody元素
+      const el = this.$refs.elTable.$el.querySelectorAll(
+        '.el-table__body-wrapper > table > tbody'
+      )[0]
+      this.sortable = new Sortable(el, {
+        // 拖拽时的类名
+        ghostClass: 'sortable-ghost',
+        // 拖拽动画时间
+        animation: 150,
+        // 结束拖拽时的回调
+        onEnd: this.sortableEnd
+      })
+    },
+    // 重新实例化sortable
+    refreshSortable() {
+      this.$nextTick(() => {
+        if (this.sortable) {
+          this.sortable.destroy()
+        }
+        this.initSortable()
+      })
+    }
+  },
+  // 销毁实例
+  beforeDestroy() {
+    if (this.sortable) {
+      this.sortable.destroy()
+    }
+  }
+}

+ 7 - 3
src/views/business/personAssessment/assessment.vue

@@ -19,20 +19,20 @@
                     <span>{{ gangWeiMap[scope.row.gangWei] || scope.row.gangWei }}</span>
                 </template> -->
             </el-table-column>
-            <el-table-column label="科目" prop="kaoHeLeiMu" width="200"/>
+            <el-table-column label="科目" prop="kaoHeLeiMu" width="200" />
             <!-- <el-table-column label="考核说明" prop="kaoHeLeiXing" width="300" /> -->
             <el-table-column label="要点" prop="kaoHeNeiRong" />
             <el-table-column label="考核标准" prop="kaoHeBiaoZhun" />
             <el-table-column label="评分" prop="kaoHePingFen" width="150">
                 <template slot-scope="scope">
-                    <el-input v-if="!readonly" v-model="scope.row.kaoHePingFen" placeholder="请输入评分" @input="handleInput(scope.$index, scope.column.property)" />
+                    <el-input v-if="!readonly || isEdit" v-model="scope.row.kaoHePingFen" placeholder="请输入评分" @input="handleInput(scope.$index, scope.column.property)" />
                     <span v-else>{{ scope.row.kaoHePingFen }}</span>
                 </template>
             </el-table-column>
             <!-- <el-table-column label="考核情况" prop="shiFouGuoShen" /> -->
             <el-table-column label="是否合格" prop="shiFouHeGe" width="150">
                 <template slot-scope="scope">
-                    <el-radio-group v-if="!readonly" v-model="scope.row.shiFouHeGe" @change="handleRadioChange(scope.$index)">
+                    <el-radio-group v-if="!readonly || isEdit" v-model="scope.row.shiFouHeGe" @change="handleRadioChange(scope.$index)">
                         <el-radio label="是">是</el-radio>
                         <el-radio label="否">否</el-radio>
                     </el-radio-group>
@@ -67,6 +67,9 @@ export default {
         }
     },
     computed: {
+        isEdit () {
+            return this.params?.nodeId === 'Activity_0lcx1y7'
+        },
         initDataWatcher () {
             return this.formData.jyrykhjlzb
         },
@@ -83,6 +86,7 @@ export default {
     watch: {
         initDataWatcher: {
             handler (val) {
+                // console.log('reaonle', this.readonly, this.params)
                 this.initData = this.$utils.isEmpty(val) ? [] : val
                 const temp = JSON.parse(JSON.stringify(this.initData))
                 temp.sort((a, b) => {

+ 202 - 189
src/views/business/trainManagement/components/jobPlanChart.vue

@@ -1,14 +1,20 @@
 <template>
-  <div class="statisticsPage" :style="{width:width,height:height}">
-    <div style="height:8%;font-size:24px;font-weight: 600;"> {{ title }} </div>
-    <div v-show="show" style="height:92%;display:flex">
-      <div style="width:28%;margin: 4% 5% 0 0;">
-        <div class="leftSty">
-          <div class="numSize">手动<div class="numColor"> {{ data.autoNum + ' ' }} ({{calculatedPercentage(data.autoNum, data.total)}}%) </div></div>
-          <div style="flex: 1;"></div>
-          <div class="numSize">自动<div class="numColor" >{{ data.manual + ' ' }} ({{calculatedPercentage(data.manual, data.total)}}%) </div></div>
-          <div style="flex: 6;"><div :id="'jobPie'+id" :style="{height:'8vh',width:'100%'}"/></div>
-          <!-- <div style="width: 100%;font-size: 2vh;">自动创建培训计划</div>
+    <div class="statisticsPage" :style="{ width: width, height: height }">
+        <div style="height:8%;font-size:24px;font-weight: 600;"> {{ title }} </div>
+        <div v-show="show" style="height:92%;display:flex">
+            <div style="width:28%;margin: 4% 5% 0 0;">
+                <div class="leftSty">
+                    <div class="numSize">手动<div class="numColor"> {{ data.autoNum + ' ' }}
+                            ({{ calculatedPercentage(data.autoNum, data.total) }}%) </div>
+                    </div>
+                    <div style="flex: 1;"></div>
+                    <div class="numSize">自动<div class="numColor">{{ data.manual + ' ' }}
+                            ({{ calculatedPercentage(data.manual, data.total) }}%) </div>
+                    </div>
+                    <div style="flex: 6;">
+                        <div :id="'jobPie' + id" :style="{ height: '8vh', width: '100%' }" />
+                    </div>
+                    <!-- <div style="width: 100%;font-size: 2vh;">自动创建培训计划</div>
           <div style="display:flex;display: flex;align-items: center;width:100%">
             <div style="width: 46%;display:flex;flex-flow: column;height: 100%;font-size: 2vh;">
               <div style="line-height: 250%;color: rgb(250, 200, 88);">{{data.autoNum}}</div>
@@ -16,67 +22,67 @@
             </div>
             <div :id="'jobPie'+id" :style="{height:'8vh',width:'64%'}"/>
           </div> -->
+                </div>
+            </div>
+            <div :id="'job' + id" :style="{ height: '100%', width: '72%' }" />
         </div>
-      </div>
-      <div :id="'job'+id" :style="{height:'100%',width:'72%'}"/>
+        <div v-show="!show" class="nullShow">暂无数据</div>
     </div>
-    <div v-show="!show" class="nullShow">暂无数据</div>
-  </div>
 </template>
 
 <script>
-  import * as echarts from 'echarts'
-  import { getFormatDate } from '../utils/config.js'
+import * as echarts from 'echarts'
+import { getFormatDate } from '../utils/config.js'
 
-  export default {
+export default {
     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: Object,
-      }
+        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: Object,
+        }
     },
-    data () {
-      return {
-        show: false
-      }
+    data() {
+        return {
+            show: false
+        }
     },
     watch: {
         value: {
-            handler (val, old) {
-              if(val.length>0){
-                this.show = true
-                setTimeout(() => {
-                  this.drawLine()
-                  this.drawLinePie()
-                }, 100)
-              }else{
-                this.show = false
-              }
+            handler(val, old) {
+                if (val.length > 0) {
+                    this.show = true
+                    setTimeout(() => {
+                        this.drawLine()
+                        this.drawLinePie()
+                    }, 100)
+                } else {
+                    this.show = false
+                }
             },
             deep: true
         },
@@ -87,142 +93,146 @@
         //     deep: true
         // }
     },
-    mounted(){
-      // setTimeout(() => {
-      //   this.drawLine()
-      //   this.drawLinePie()
-      // }, 100);
-      
+    mounted() {
+        // setTimeout(() => {
+        //   this.drawLine()
+        //   this.drawLinePie()
+        // }, 100);
+
     },
     methods: {
-      drawLine(){
-        let xData = []
-        let yData = []
-        this.value.forEach(e => {
-          xData.push(getFormatDate('string', 5, 10, e.date)+'\n'+e.dayName)
-          yData.push(e.value)
-        })
-        const that = this
-        echarts.dispose(document.getElementById('job'+this.id))
-        let job = echarts.init(document.getElementById('job'+this.id))
-        let option;
-        option = {
-          title: {
-            text: '近一周计划发布',
-            left: 'left',
-            textStyle:{ fontSize:18,color: this.colorw },
-            itemGap: 20
-          },
-          grid: {
-            left: '5%',
-            right: '3%',
-            bottom: '15%',
-            top: '20%'
-          },
-          tooltip: {
-            trigger: 'axis',
-            formatter: function (params) {
-              return `${that.value[params[0].dataIndex].date} <br /> ${params[0].marker} ${params[0].data}`
-            }
-          },
-          xAxis: {
-            type: 'category',
-            boundaryGap: false,
-            data: xData,
-            axisLabel: {
-                color: '#fff'
-            }
-          },
-          yAxis: {
-            type: 'value',
-            axisLabel: {
-                color: '#fff'
-            },
-            splitLine:{
-              show:true,
-              lineStyle:{
-                  type: [15,8],
-                  color: ['rgba(255,255,255,0.5)'],
-              }
-            }
-          },
-          series: [
-            {
-              data: yData,
-              type: 'line',
-              smooth: true,
-              itemStyle: {
-                color: 'rgba(24,146,234,1)'
-              },
-              areaStyle: {
-                opacity: 0.8,
-                color: 'rgba(24,146,234,0.5)'
-              }
+        drawLine() {
+            let xData = []
+            let yData = []
+            this.value.forEach(e => {
+                xData.push(getFormatDate('string', 5, 10, e.date) + '\n' + e.dayName)
+                yData.push(e.value)
+            })
+            const that = this
+            echarts.dispose(document.getElementById('job' + this.id))
+            let job = echarts.init(document.getElementById('job' + this.id))
+            let option;
+            option = {
+                title: {
+                    text: '近一周计划发布',
+                    left: 'left',
+                    textStyle: { fontSize: 18, color: this.colorw },
+                    itemGap: 20
+                },
+                grid: {
+                    left: '5%',
+                    right: '3%',
+                    bottom: '15%',
+                    top: '20%'
+                },
+                tooltip: {
+                    trigger: 'axis',
+                    formatter: function (params) {
+                        return `${that.value[params[0].dataIndex].date} <br /> ${params[0].marker} ${params[0].data}`
+                    }
+                },
+                xAxis: {
+                    type: 'category',
+                    boundaryGap: false,
+                    data: xData,
+                    axisLabel: {
+                        color: '#fff'
+                    }
+                },
+                yAxis: {
+                    type: 'value',
+                    axisLabel: {
+                        color: '#fff'
+                    },
+                    splitLine: {
+                        show: true,
+                        lineStyle: {
+                            type: [15, 8],
+                            color: ['rgba(255,255,255,0.5)'],
+                        }
+                    }
+                },
+                series: [
+                    {
+                        data: yData,
+                        type: 'line',
+                        smooth: true,
+                        itemStyle: {
+                            color: 'rgba(24,146,234,1)'
+                        },
+                        areaStyle: {
+                            opacity: 0.8,
+                            color: 'rgba(24,146,234,0.5)'
+                        }
+                    }
+                ]
+            };
+            option && job.setOption(option);
+        },
+        drawLinePie() {
+            const that = this
+            echarts.dispose(document.getElementById('jobPie' + this.id))
+            let jobPie = echarts.init(document.getElementById('jobPie' + this.id))
+            let option
+            option = {
+                tooltip: {
+                    show: false,
+                    trigger: 'item'
+                },
+                series: [
+                    {
+                        name: 'Access From',
+                        type: 'pie',
+                        radius: ['60%', '90%'],
+                        avoidLabelOverlap: false,
+                        label: {
+                            show: false,
+                            position: 'center'
+                        },
+                        itemStyle: {
+                            color: function (params) {
+                                let colorList = ['#1892ea', '#e9e9e9'];
+                                return colorList[params.dataIndex];
+                            }
+                        },
+                        emphasis: {
+                            scale: false
+                        },
+                        labelLine: {
+                            show: false
+                        },
+                        data: [
+                            { value: this.data.rate, name: 'Search Engine' },
+                            { value: 100 - this.data.rate, name: 'Direct' }
+                        ]
+                    }
+                ]
             }
-          ]
-       };
-       option && job.setOption(option);
-      },
-      drawLinePie(){
-        const that = this
-        echarts.dispose(document.getElementById('jobPie'+this.id))
-        let jobPie = echarts.init(document.getElementById('jobPie'+this.id))
-        let option
-        option = {
-          tooltip: {
-            show: false,
-            trigger: 'item'
-          },
-          series: [
-            {
-              name: 'Access From',
-              type: 'pie',
-              radius: ['60%', '90%'],
-              avoidLabelOverlap: false,
-              label: {
-                show: false,
-                position: 'center'
-              },
-              itemStyle:{
-                color: function(params) {
-                  let colorList = ['#1892ea','#e9e9e9'];
-                  return colorList[params.dataIndex];
-                }
-              },
-              emphasis: {
-                scale: false
-              },
-              labelLine: {
-                show: false
-              },
-              data: [
-                { value: this.data.rate, name: 'Search Engine' },
-                { value: 100-this.data.rate, name: 'Direct' }
-              ]
+            option && jobPie.setOption(option)
+        },
+        calculatedPercentage (up, down) {
+            if (down === 0) {
+                return 0 // 避免除零错误
             }
-          ]
-       }
-       option && jobPie.setOption(option)
-      },
-      calculatedPercentage(up, down){
-        return (up/down).toFixed(2)*100
-      }
+            return (up / down).toFixed(2) * 100
+        }
     }
-  }
+}
 </script>
 <style scoped>
-  /* #zlmbPie:hover{
+/* #zlmbPie:hover{
     transition: all 0.5s;
     transform:scale(1.03);
   } */
-  .statisticsPage{
+.statisticsPage {
     box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
     padding: 1%;
     /* background-color: rgba(6, 30, 93, 0.5); */
-  }
-  .leftSty{
+}
+
+.leftSty {
     width: 90%;
-    display:flex;
+    display: flex;
     background-color: rgba(84, 112, 198, 0.3);
     border-radius: 10px;
     padding: 10%;
@@ -230,22 +240,25 @@
     display: flex;
     align-items: center;
     /* flex-flow: column; */
-  }
-  .nullShow{
+}
+
+.nullShow {
     display: flex;
     align-items: center;
     justify-content: center;
     font-size: 18px;
     height: 92%;
-  }
-  .numColor{
+}
+
+.numColor {
     color: rgb(250, 200, 88);
     margin: 2vh 0;
     letter-spacing: normal;
-  }
-  .numSize{
+}
+
+.numSize {
     font-size: 2vh;
     flex: 5;
     letter-spacing: 3px;
-  }
+}
 </style>

+ 192 - 186
src/views/business/trainManagement/components/trainingStaffChart.vue

@@ -1,217 +1,223 @@
 <template>
-  <div class="statisticsPage" :style="{width:width,height:height}">
-    <div style="height:10%;font-size:24px;font-weight: 600;"> {{title}} </div>
-    <div v-show="show" style="height:92%;display:flex;justify-content: space-between;">
-      <div :id="'staff'+id" :style="{height:'100%',width:'76%'}"/>
-      <staff-list v-model="staffData" :style="{height:'80%',width:'22%'}"></staff-list>
+    <div class="statisticsPage" :style="{ width: width, height: height }">
+        <div style="height:10%;font-size:24px;font-weight: 600;"> {{ title }} </div>
+        <div v-show="show" style="height:92%;display:flex;justify-content: space-between;">
+            <div :id="'staff' + id" :style="{ height: '100%', width: '76%' }" />
+            <dv-decoration-2 v-show="show" :color="dvLineColor" :key="`line6`" :reverse="true" :dur="6"
+            style="width:1%;height:100%;margin: auto;" />
+            <staff-list v-model="staffData" :style="{ height: '80%', width: '22%' }"></staff-list>
+        </div>
+        <div v-show="!show" class="nullShow">暂无数据</div>
     </div>
-    <div v-show="!show" class="nullShow">暂无数据</div>
-  </div>
 </template>
 
 <script>
-  import * as echarts from 'echarts'
-  import { getFormatDate } from '../utils/config.js'
-  export default {
+import * as echarts from 'echarts'
+import { getFormatDate } from '../utils/config.js'
+export default {
     components: {
         StaffList: () => import('./staffList.vue')
     },
     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,
-      }
+        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
+        },
+        date: {
+            type: String
+        }
     },
     data () {
-      return {
-        valueArr:[],
-        show: false,
-        staffData: []
-      }
+        return {
+            valueArr: [],
+            show: false,
+            staffData: [],
+            dvLineColor: ['rgba(255, 255, 255, 0.5)'],
+        }
     },
     watch: {
         value: {
-            handler (val,old) {
-              if(val.length>0){
-                this.show = true
-                this.valueArr.length=0
-                val.forEach((item, i) => {
-                  let mid = {date: getFormatDate('string', 5, 10, item.date)+'\n'+ item.dayName, numAll: item.numAll, numReal: item.numReal, numUn: item.numUn}
-                  this.valueArr.push(mid)
-                })
-                setTimeout(() => {
-                  this.drawLine()
-                  this.staffData = this.data
-                }, 100)
-              }else{
-                this.show = false
-              }
+            handler (val, old) {
+                if (val.length > 0) {
+                    this.show = true
+                    this.valueArr.length = 0
+                    val.forEach((item, i) => {
+                        let xValue = getFormatDate('string', 5, 10, item.date) + '\n' + item.dayName
+                        if (this.date === 'y') {
+                            xValue = item.dayName
+                        }
+                        const mid = { date: xValue, numAll: item.numAll, numReal: item.numReal, numUn: item.numUn }
+                        this.valueArr.push(mid)
+                    })
+                    setTimeout(() => {
+                        this.drawLine()
+                        this.staffData = this.data
+                    }, 100)
+                } else {
+                    this.show = false
+                }
             },
             deep: true
         }
     },
-    mounted(){
-      // setTimeout(() => {
-      //   this.drawLine()
-      // }, 100);
-    },
     methods: {
-      drawLine(){
-        let xData = []
-        let yData = []
-        let yData1 = []
-        let yData2 = []
-        this.valueArr.forEach(e => {
-          xData.push(e.date)
-          yData.push(e.numReal)
-          yData1.push(e.numUn)
-          yData2.push(e.numAll)
-        })
-        const that = this
-        echarts.dispose(document.getElementById('staff'+this.id))
-        let staff = echarts.init(document.getElementById('staff'+this.id))
-        let option
-        option = {
-          grid: {
-            left: '3%',
-            right: '1%',
-            bottom: '25%',
-            top: '10%'
-          },
-          tooltip: {
-            trigger: 'axis',
-            axisPointer: {
-              type: 'cross',
-              crossStyle: {
-                color: '#999'
-              }
-            },
-            formatter: function (params) {
-              let str = `${that.valueArr[params[0].dataIndex].date}`
-              params.forEach(item =>{
-                let nameNum = ''
-                if(item.seriesName === 'numUn'){
-                  nameNum = '未参加人数'
-                }else if(item.seriesName === 'numReal'){
-                  nameNum = '实际参训人数'
-                }else if(item.seriesName === 'numAll'){
-                  nameNum = '培训总人数'
-                }
-                str += `<br /> ${item.marker} ${nameNum}  ${item.data}`
-              })
-              return str
-            }
-          },
-          legend: {
-            data: ['numReal', 'numUn', 'numAll'],
-            textStyle: {
-              color: '#fff'
-            },
-            icon: 'circle',
-            bottom: 0,
-            formatter: function (name) {
-              if(name === 'numUn'){
-                return '未参加人数';
-              }else if(name === 'numReal'){
-                return '实际参训人数';
-              }else if(name === 'numAll'){
-                return '培训总人数';
-              }
-            }
-          },
-          xAxis: {
-            type: 'category',
-            boundaryGap: true,
-            data: xData,
-            axisLabel: {
-                color: '#fff'
-            },
-            axisTick: {
-              alignWithLabel: true
-            }
-          },
-          yAxis: {
-            type: 'value',
-            axisLabel: {
-                color: '#fff'
-            },
-            // boundaryGap:true,
-            splitLine:{
-              show:true,
-              lineStyle:{
-                  type: [15,8],
-                  color: ['rgba(255,255,255,0.5)'],
-              }
-            }
-          },
-          series: [
-            {
-              name: 'numReal',
-              type: 'bar',
-              barWidth: 10,
-              color: 'rgb(78,203,115)',
-              data: yData
-            },
-            {
-              name: 'numUn',
-              type: 'bar',
-              barWidth: 10,
-              color: 'rgb(251,211,55)',
-              data: yData1
-            },
-            {
-              name: 'numAll',
-              type: 'line',
-              color: 'rgb(16,142,233)',
-              data: yData2
-            }
-          ]
-       };
-       option && staff.setOption(option);
-      },
+        drawLine () {
+            let xData = []
+            let yData = []
+            let yData1 = []
+            let yData2 = []
+            this.valueArr.forEach(e => {
+                xData.push(e.date)
+                yData.push(e.numReal)
+                yData1.push(e.numUn)
+                yData2.push(e.numAll)
+            })
+            const that = this
+            echarts.dispose(document.getElementById('staff' + this.id))
+            let staff = echarts.init(document.getElementById('staff' + this.id))
+            let option
+            option = {
+                grid: {
+                    left: '3%',
+                    right: '1%',
+                    bottom: '25%',
+                    top: '10%'
+                },
+                tooltip: {
+                    trigger: 'axis',
+                    axisPointer: {
+                        type: 'cross',
+                        crossStyle: {
+                            color: '#999'
+                        }
+                    },
+                    formatter: function (params) {
+                        let str = `${that.valueArr[params[0].dataIndex].date}`
+                        params.forEach(item => {
+                            let nameNum = ''
+                            if (item.seriesName === 'numUn') {
+                                nameNum = '未参加人数'
+                            } else if (item.seriesName === 'numReal') {
+                                nameNum = '实际参训人数'
+                            } else if (item.seriesName === 'numAll') {
+                                nameNum = '培训总人数'
+                            }
+                            str += `<br /> ${item.marker} ${nameNum}  ${item.data}`
+                        })
+                        return str
+                    }
+                },
+                legend: {
+                    data: ['numReal', 'numUn', 'numAll'],
+                    textStyle: {
+                        color: '#fff'
+                    },
+                    icon: 'circle',
+                    bottom: 0,
+                    formatter: function (name) {
+                        if (name === 'numUn') {
+                            return '未参加人数';
+                        } else if (name === 'numReal') {
+                            return '实际参训人数';
+                        } else if (name === 'numAll') {
+                            return '培训总人数';
+                        }
+                    }
+                },
+                xAxis: {
+                    type: 'category',
+                    boundaryGap: true,
+                    data: xData,
+                    axisLabel: {
+                        color: '#fff'
+                    },
+                    axisTick: {
+                        alignWithLabel: true
+                    }
+                },
+                yAxis: {
+                    type: 'value',
+                    axisLabel: {
+                        color: '#fff'
+                    },
+                    // boundaryGap:true,
+                    splitLine: {
+                        show: true,
+                        lineStyle: {
+                            type: [15, 8],
+                            color: ['rgba(255,255,255,0.5)'],
+                        }
+                    }
+                },
+                series: [
+                    {
+                        name: 'numReal',
+                        type: 'bar',
+                        barWidth: 10,
+                        color: 'rgb(78,203,115)',
+                        data: yData
+                    },
+                    {
+                        name: 'numUn',
+                        type: 'bar',
+                        barWidth: 10,
+                        color: 'rgb(251,211,55)',
+                        data: yData1
+                    },
+                    {
+                        name: 'numAll',
+                        type: 'line',
+                        color: 'rgb(16,142,233)',
+                        data: yData2
+                    }
+                ]
+            };
+            option && staff.setOption(option);
+        },
     }
-  }
+}
 </script>
 <style scoped>
-  /* #zlmbPie:hover{
+/* #zlmbPie:hover{
     transition: all 0.5s;
     transform:scale(1.03);
   } */
-  .statisticsPage{
-      box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
-      padding: 1% 1% 0 1%;
-      /* background-color: rgba(6, 30, 93, 0.5); */
-  }
-  .nullShow{
+.statisticsPage {
+    box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
+    padding: 1% 1% 0 1%;
+    /* background-color: rgba(6, 30, 93, 0.5); */
+}
+
+.nullShow {
     display: flex;
     align-items: center;
     justify-content: center;
     font-size: 18px;
     height: 92%;
-  }
+}
 </style>

+ 18 - 18
src/views/business/trainManagement/index.vue

@@ -64,7 +64,7 @@
                             @change="updateAll"
                             :clearable="false"
                         />
-                    </dv-border-box-8>  
+                    </dv-border-box-8>
                 </div>
                 <div :class="$style.back" @click.prevent="goBack()">
                     <dv-border-box-8>返回</dv-border-box-8>
@@ -103,24 +103,24 @@
                     <dv-border-box-12 class="areaTop" :color="dvColor" :backgroundColor="dvBackColor">
                         <div class="area">
                             <job-plan-chart class="merge" :title="mergeData[1].title" v-model="nowWeekData" :data="mergeData[1].numData" :width="'63%'" :height="'85%'" :id="1" />
-                            <dv-decoration-2  :color="dvLineColor" :key="`line1`" :reverse="true" :dur="6" style="width:1%;height:85%;margin: auto;" />
+                            <dv-decoration-2 :color="dvLineColor" :key="`line1`" :reverse="true" :dur="6" style="width:1%;height:85%;margin: auto;" />
                             <pie-chart class="tabular" :title="mergeData[0].title" v-model="mergeData[0].numData" :total="mergeData[0].total" :width="'32%'" :height="'85%'" :id="1"/>
                         </div>
                         <dv-decoration-2 :color="dvLineColor" :key="`line4`" :dur="6" style="width:98%;height:4%;margin: auto;" />
                         <div class="area">
-                            <training-staff-chart class="merge"  :title="mergeData[2].title" v-model="mergeData[2].numData" :data="mergeData[2].perList" :width="'63%'" :height="'85%'" :id="1" />
-                            <dv-decoration-2  :color="dvLineColor" :key="`line2`" :reverse="true" :dur="6" style="width:1%;height:85%;margin: auto;" />
+                            <training-staff-chart class="merge"  :title="mergeData[2].title" v-model="mergeData[2].numData" :data="mergeData[2].perList" :date="hoverClassAdd" :width="'63%'" :height="'85%'" :id="1" />
+                            <dv-decoration-2 :color="dvLineColor" :key="`line2`" :reverse="true" :dur="6" style="width:1%;height:85%;margin: auto;" />
                             <pie-chart class="tabular" :title="mergeData[3].title" v-model="mergeData[3].numData" :total="mergeData[3].total" :width="'32%'" :height="'85%'" :id="2"/>
                         </div>
                     </dv-border-box-12>
                     <div style="width:100%;height:2.64%" />
-                    <dv-border-box-12 class="areaBottom" :color="dvColor" :backgroundColor="dvBackColor">
-                        <div class="area" style="height:100%">
-                            <pre-work-chart class="merge" :title="mergeData[5].title" v-model="mergeData[5].numData" :width="'63%'" :height="'87%'" :id="1" />
-                            <dv-decoration-2 :color="dvLineColor" :key="`line3`" :reverse="true" :dur="6" style="width:1%;height:87%;margin: auto;" />
-                            <pie-chart class="tabular" :title="mergeData[4].title" v-model="mergeData[4].numData" :total="mergeData[4].total" :width="'32%'" :height="'87%'" :id="3"/>
-                        </div>
-                    </dv-border-box-12>
+                    <!-- <dv-border-box-12 class="areaBottom" :color="dvColor" :backgroundColor="dvBackColor"> -->
+                        <!-- <div class="area" style="height:100%"> -->
+                            <!-- <pre-work-chart class="merge" :title="mergeData[5].title" v-model="mergeData[5].numData" :width="'63%'" :height="'87%'" :id="1" /> -->
+                            <!-- <dv-decoration-2 :color="dvLineColor" :key="`line3`" :reverse="true" :dur="6" style="width:1%;height:87%;margin: auto;" /> -->
+                            <!-- <pie-chart class="tabular" :title="mergeData[4].title" v-model="mergeData[4].numData" :total="mergeData[4].total" :width="'32%'" :height="'87%'" :id="3"/> -->
+                        <!-- </div> -->
+                    <!-- </dv-border-box-12> -->
                 </div>
             </dv-border-box-1>
         </dv-full-screen-container>
@@ -157,15 +157,15 @@ export default {
             chartIndex: 0,
             autoPlay: true,
             tabularArr1:[],
-            tabularArr2:[],
+            tabularArr2: [],
             daterange: [],
-            dateValM:'',
-            dateValY:'',
+            dateValM: '',
+            dateValY: '',
             nowWeekData: [],
             dvColor: ['rgb(22,47,98)', 'rgba(116, 142, 194, 1)'],
             dvLineColor: ['rgba(255, 255, 255, 0.5)'],
             dvBackColor: 'rgba(6, 30, 93, 0)',
-            dateVal: ["week","nowWeek"],
+            dateVal: ['week', 'nowWeek'],
             show: true,
             options: data.options,
             hoverClassAdd:'m',
@@ -228,7 +228,7 @@ export default {
         initializeData () {
             const w = window.innerWidth
             const { first = '', second = '' } = this.$store.getters.level || {}
-            let annual = this.hoverClassAdd === 'm' ? this.dateValM.substring(0,4) :this.dateValY 
+            let annual = this.hoverClassAdd === 'm' ? this.dateValM.substring(0,4) :this.dateValY
             this.nowWeekData = []
             this.initData = {}
             this.itemIndex = 0
@@ -414,14 +414,14 @@ export default {
 //         border-color: #1892ea;
 //         color: #FFFFFF;
 //     }
-    
+
 //     ::v-deep .el-button--text:focus,
 //     .el-button--text:hover {
 //         background: #1892ea;
 //         border-color: #1892ea;
 //         color: #FFFFFF;
 //     }
-    
+
     ::v-deep .el-button--text {
         color: #FFFFFF;
         padding: 5px 5px;

+ 10 - 6
src/views/component/sop/xueQingXueShiYan.vue

@@ -18,13 +18,13 @@
                 />
                 <el-table-column label="菌株编号" prop="junZhuBianHao" width="100">
                     <template slot-scope="{row}">
-                        <el-input v-if="!readonly && !shiFouGuoShen" v-model="row.junZhuBianHao" size="mini" placeholder="请输入" />
+                        <el-input v-if="!readonly && !shiFouGuoShen && isEdit" v-model="row.junZhuBianHao" size="mini" placeholder="请输入" />
                         <span v-else>{{ row.junZhuBianHao || '/' }}</span>
                     </template>
                 </el-table-column>
                 <el-table-column label="菌株名称" prop="junZhuMingCheng" width="120">
                     <template slot-scope="{row}">
-                        <el-input v-if="!readonly && !shiFouGuoShen" v-model="row.junZhuMingCheng" size="mini" placeholder="请输入" />
+                        <el-input v-if="!readonly && !shiFouGuoShen && isEdit" v-model="row.junZhuMingCheng" size="mini" placeholder="请输入" />
                         <span v-else>{{ row.junZhuMingCheng || '/' }}</span>
                     </template>
                 </el-table-column>
@@ -96,7 +96,7 @@
                 </el-table-column>
                 <el-table-column label="比对结果判断" prop="biDuiJieGuoPanDua">
                     <template slot-scope="{row}">
-                        <template v-if="!readonly">
+                        <template v-if="!readonly && isEdit">
                             <el-radio v-model="row.biDuiJieGuoPanDua" label="通过">通过</el-radio>
                             <el-radio v-model="row.biDuiJieGuoPanDua" label="不通过">不通过</el-radio>
                         </template>
@@ -136,12 +136,13 @@ export default {
         return {
             tableData: [],
             multipleSelection: [],
-            isRead: false
+            isRead: false,
+            isEdit: true
         }
     },
     computed: {
         shiFouGuoShen () {
-            return this.formData.shiFouGuoShen === '已编制'
+            return this.formData.shiFouGuoShen === '已编制' || this.formData.shiFouGuoShen === '已比对'
         },
         passRate () {
             if (this.tableData.length === 0) return '0'
@@ -153,8 +154,11 @@ export default {
         'formData.smjzhjxqxsyrybdxqb': {
             handler (val) {
                 if (val && val.length) {
-                    // console.log(this.formData)
                     this.tableData = val
+
+                    if (this.params?.nodeId === 'Activity_0zep3tf' && this.formData.faQiRen && this.isEdit) {
+                        this.isEdit = false
+                    }
                 } else {
                     if (this.tableData.length !== 0) {
                         this.tableData = []

+ 1 - 1
src/views/platform/bpmn/bpmInstHis/list.vue

@@ -310,7 +310,7 @@ export default {
         this.loadData()
         this.getConfig()
         const { role = [] } = this.$store.getters.userInfo || {}
-        const roleList = ['xtgljs', 'xxglxzfzr', 'syszr']
+        const roleList = ['xtgljs', 'xxglxzfzr', 'syszr', 'zhsfzr']
         // 系统管理角色、信息管理负责人、检验科主任添加删除按钮
         const hasRole = role.some(item => roleList.includes(item.alias))
         this.listConfig.toolbars.push({

+ 23 - 2
src/views/platform/examination/exam/list.vue

@@ -43,6 +43,17 @@
             <template slot="examTime" slot-scope="{row}">
                 <div>{{ transformTime(row.duration) }}</div>
             </template>
+            <template slot="user">
+                <ibps-user-selector
+                    v-model="searchParams.createBy"
+                    type="user"
+                    readonly-text="text"
+                    :multiple="true"
+                    size="mini"
+                    :temp-search="true"
+                    filterable
+                />
+            </template>
         </ibps-crud>
         <exam-edit
             v-if="showEditDialog"
@@ -86,7 +97,8 @@ export default {
         ExamEdit: () => import('./edit'),
         ExamDetail: () => import('./detail'),
         ExamJudge: () => import('../question/judge'),
-        IbpsCustomDialog: () => import('@/business/platform/data/templaterender/custom-dialog')
+        IbpsCustomDialog: () => import('@/business/platform/data/templaterender/custom-dialog'),
+        IbpsUserSelector: () => import('@/business/platform/org/selector')
     },
     mixins: [FixHeight],
     data () {
@@ -132,6 +144,9 @@ export default {
             },
             examBankId: '',
             showTable: true,
+            searchParams: {
+                createBy: ''
+            },
             listConfig: {
                 toolbars: [
                     { key: 'search' },
@@ -147,7 +162,8 @@ export default {
                         { prop: 'tiKuId', label: '考试题库', fieldType: 'slot', slotName: 'examBankId', itemWidth: 150 },
                         { prop: 'zhuangTai', label: '考试状态', itemWidth: 150, fieldType: 'select', multiple: 'Y', options: statusOption },
                         { prop: ['chuangJianShiJ^S', 'chuangJianShiJ^E'], label: '创建时间', fieldType: 'daterange' },
-                        { prop: ['faBuShiJian^S', 'faBuShiJian^E'], label: '发布时间', fieldType: 'daterange' }
+                        { prop: ['faBuShiJian^S', 'faBuShiJian^E'], label: '发布时间', fieldType: 'daterange' },
+                        { prop: 'createBy', label: '创建人', fieldType: 'slot', slotName: 'user' }
                     ]
                 },
                 // 表格字段配置
@@ -278,6 +294,11 @@ export default {
             if (this.examBankId) {
                 param.tiKuId = this.examBankId.split(',')
             }
+
+            const { createBy } = this.searchParams
+            if (this.$utils.isNotEmpty(createBy)) {
+                param[`createBy`] = createBy.split(',')
+            }
             return {
                 pageNo,
                 // 获取全部数据处理后前端自行分页

+ 60 - 1
src/views/platform/risk/riskDetail.vue

@@ -105,7 +105,14 @@
                         <el-button type="success" size="mini" icon="ibps-icon-add" @click="onAdd">新增风险项</el-button>
                         <el-button type="danger" size="mini" icon="ibps-icon-remove" @click="onRemove">删除</el-button>
                     </div>
-                    <el-table height="300px" :data="tableList" border @selection-change="handleSelectionChange">
+                    <el-alert
+                        style="margin-bottom: 12px"
+                        title=""
+                        type="success"
+                        :closable="false"
+                        description="提示:可以拖动表格数据进行排序"
+                    />
+                    <el-table ref="eltable1" height="300px" :data="tableList" border @selection-change="handleSelectionChange">
                         <el-table-column
                             width="50"
                             type="selection"
@@ -329,11 +336,14 @@
 import dayjs from 'dayjs'
 import ibpsUserSelector from '@/business/platform/org/selector'
 import { getImage } from '@/api/platform/file/attachment'
+import sortableJs from '@/mixins/sortable'
+import Sortable from 'sortablejs'
 export default {
     components: {
         ibpsUserSelector,
         IbpsCustomDialog: () => import('@/business/platform/data/templaterender/custom-dialog')
     },
+    mixins: [sortableJs],
     props: {
         culWays: {
             type: Object,
@@ -502,6 +512,53 @@ export default {
         }
     },
     methods: {
+        // 初始化拖拽排序
+        initSortable () {
+            // 获取表格的tbody元素
+            console.log(this.$refs)
+            const el = this.$refs.eltable1.$el.querySelectorAll(
+                '.el-table__body-wrapper > table > tbody'
+            )[0]
+            this.sortable = new Sortable(el, {
+                // 拖拽时的类名
+                ghostClass: 'sortable-ghost',
+                // 拖拽动画时间
+                animation: 150,
+                // 结束拖拽时的回调
+                onEnd: this.sortableEnd
+            })
+        },
+        sortableEnd (evt) {
+            const { oldIndex, newIndex } = evt
+            // 复制原数组
+            const newData = [...this.tableList]
+            // 操作副本
+            const movedItem = newData.splice(oldIndex, 1)[0]
+            newData.splice(newIndex, 0, movedItem)
+            // 重新赋值(引用变化,触发更新)
+            this.tableList = []
+            this.$nextTick(() => {
+                // 确保数据已更新到DOM
+                this.tableList = newData.map((t, index) => ({
+                    ...t,
+                    tenant_id_: index
+                })) // 可结合表格自身的强制更新
+            })
+            // this.$forceUpdate()
+            // const { oldIndex, newIndex } = evt
+            // const temData = JSON.parse(JSON.stringify(this.tableList))
+            // // 处理数据交换
+            // const currRow = temData.splice(oldIndex, 1)[0]
+            // temData.splice(newIndex, 0, currRow)
+            // console.log(
+            //   'temData==>',
+            //   temData.map((t) => t.yao_su_tiao_kuan_)
+            // )
+            // this.tableList = temData
+            // this.$nextTick(() => {
+            //   this.$refs.eltable1.doLayout()
+            // })
+        },
         handleSelectionChange (val) {
             this.multipleSelection = val
         },
@@ -544,6 +601,7 @@ export default {
                 this.userId = data[0].bian_zhi_ren_
                 this.time = data[0].bian_zhi_shi_jian
                 this.form.xuan_ze_feng_xian = data[0].xuan_ze_feng_xian
+                data.sort((a, b) => a.tenant_id_ - b.tenant_id_)
                 this.tableList = data
                 this.tableList.forEach(i => {
                     if (!Object.hasOwn(i, 'qian_zai_yuan_yin')) i.qian_zai_yuan_yin = ''
@@ -689,6 +747,7 @@ export default {
                 this.rowParams = row
             }
             this.dialogVisible = true
+            !this.readonly && this.refreshSortable()
         },
         // 计算风险指数
         culRate (row) {

+ 15 - 4
src/views/platform/risk/riskPeopleTable.vue

@@ -54,12 +54,14 @@
 <script>
 import ibpsUserSelector from '@/business/platform/org/selector'
 import RiskDetail from './riskDetail.vue'
+import sortableJs from '@/mixins/sortable'
 
 export default {
     components: {
         ibpsUserSelector,
         RiskDetail
     },
+    mixins: [sortableJs],
     props: {
         params: {
             type: Object,
@@ -95,6 +97,13 @@ export default {
         this.getPeopleList()
     },
     methods: {
+        sortableEnd (evt) {
+            const { oldIndex, newIndex } = evt
+            // 处理数据交换
+            const currRow = this.tableList.splice(oldIndex, 1)[0]
+            this.tableList.splice(newIndex, 0, currRow)
+            console.log('排序已变更', this.tableList)
+        },
         // 获取人员部门
         getPersonPosition (id) {
             const userList = this.$store.getters.userList
@@ -120,11 +129,13 @@ export default {
             if (tempList.length) {
                 const myMap = new Map()
                 tempList.forEach(item => {
-                    const category = item.feng_xian_deng_ji
-                    if (!myMap.has(category)) {
-                        myMap.set(category, 0)
+                    if (item.feng_xian_deng_ji) {
+                        const category = item.feng_xian_deng_ji
+                        if (!myMap.has(category)) {
+                            myMap.set(category, 0)
+                        }
+                        myMap.set(category, myMap.get(category) + 1)
                     }
-                    myMap.set(category, myMap.get(category) + 1)
                 })
                 let result = ''
                 myMap.forEach((value, key) => {

Разница между файлами не показана из-за своего большого размера
+ 1587 - 747
src/views/statistics/index.vue


+ 1 - 0
src/views/system/dashboard/components/util.js

@@ -435,6 +435,7 @@ export function buildComponent (name, column, preview, vm) {
                         myTraining: 'rygl/rypx/wdpx',
                         myTesting: 'rygl/kszx/wdks',
                         myDevices: 'sbgls/mywh',
+                        myDiscard: 'lhjcgl/ypgl/ypgqcl',
                         notice: 'tygl/tzgg',
                         myFacility: 'sshjgl/sshjjk/sshjkzzl',
                         quickNavigation: 'xtgl/xtsjpz/tyglpz/kjdhpz'

+ 221 - 229
src/views/system/dashboard/templates/systemGuide.vue

@@ -11,7 +11,7 @@
                     :columns="listConfig.columns"
                     :pagination="pagination"
                     :loading="loading"
-                    :index-row="false"
+                    :index-row="true"
                     :selection-row="false"
                     :display-field="title"
                     @row-click="handleRowClick"
@@ -19,7 +19,7 @@
                     @sort-change="handleSortChange"
                     @pagination-change="handlePaginationChange"
                 >
-                    <template slot="role" slot-scope="{row, column}">
+                    <template slot="role" slot-scope="{ row, column }">
                         <ibps-user-selector
                             v-model="row[column.prop]"
                             type="role"
@@ -51,7 +51,7 @@ export default {
     },
     filters: {
         getUserName (v, list) {
-            const user = list.find(i => i.userId === v)
+            const user = list.find((i) => i.userId === v)
             return user ? user.userName : ''
         }
     },
@@ -59,30 +59,46 @@ export default {
     data () {
         const { first = '', second = '' } = this.$store.getters.level || {}
         const level = second || first
-        const { userList = [], deptList = [], role = [], menus = [], isSuper } = this.$store.getters || {}
+        const {
+            userList = [],
+            deptList = [],
+            role = [],
+            menus = [],
+            isSuper
+        } = this.$store.getters || {}
         const allRolesMap = new Map()
-        userList.forEach(user => {
+        userList.forEach((user) => {
             user.roleId.split(',').forEach((roleId, index) => {
                 if (!allRolesMap.has(roleId)) {
                     allRolesMap.set(roleId, user.roles.split(',')[index])
                 }
             })
         })
-        const allRoles = Array.from(allRolesMap, ([key, value]) => ({ key, value: key, label: value }))
-        const isManager = role.some(i => i.alias === 'xtgljs') || isSuper
-        const roleOption = isManager ? allRoles : role.map(i => ({ key: i.id, value: i.id, label: i.name }))
-        const sysOption = menus.map(i => ({ key: i.alias, value: i.title, label: i.title })).filter(i => !['xtgl', 'xnyz'].includes(i.key))
+        const allRoles = Array.from(allRolesMap, ([key, value]) => ({
+            key,
+            value: key,
+            label: value
+        }))
+        const isManager = role.some((i) => i.alias === 'xtgljs') || isSuper
+        const roleOption = isManager
+            ? allRoles
+            : role.map((i) => ({ key: i.id, value: i.id, label: i.name }))
+        const sysOption = menus
+            .map((i) => ({ key: i.alias, value: i.title, label: i.title }))
+            .filter((i) => !['xtgl', 'xnyz'].includes(i.key))
         searchForm.forms[0].value = isManager ? 'all' : 'aboutMe'
         searchForm.forms[1].options = sysOption
         searchForm.forms[3].options = roleOption
         const fieldWidth = window.innerWidth > 1600 ? 150 : 120
-        const filterOption = [{
-            // descVal: '2',
-            includeSub: true,
-            partyName: '',
-            scriptContent: '',
-            type: 'role'
-        }]
+        const filterOption = [
+            {
+                // descVal: '2',
+                includeSub: true,
+                partyName: '',
+                scriptContent: '',
+                type: 'role'
+            }
+        ]
         return {
             title: '系统指引',
             level,
@@ -110,17 +126,49 @@ export default {
                 ],
                 // 表格字段配置
                 columns: [
-                    { prop: 'sn', label: '序号', width: 60 },
+                    // { prop: '$index', label: '序号', width: 60 },
                     { prop: 'suoShuXiTong', label: '所属子系统', width: 100 },
-                    { prop: 'gongNengMoKuai', label: '所属功能模块', width: fieldWidth },
+                    {
+                        prop: 'gongNengMoKuai',
+                        label: '所属功能模块',
+                        width: fieldWidth
+                    },
                     { prop: 'biaoDanMingChe', label: '记录表单', width: 200 },
-                    { prop: 'biaoDanBianHao', label: '表单编号', width: 240, sortable: 'custom' },
+                    {
+                        prop: 'biaoDanBianHao',
+                        label: '表单编号',
+                        width: 240,
+                        sortable: 'custom'
+                    },
                     { prop: 'tianXieShiJi', label: '填写时机/记录频次', minWidth: 240 },
-                    { prop: 'shiWuLeiXing', label: '事务类型', tags: taskTypeOption, width: 100 },
+                    {
+                        prop: 'shiWuLeiXing',
+                        label: '事务类型',
+                        tags: taskTypeOption,
+                        width: 100
+                    },
                     { prop: 'chengXuWenJian', label: '程序文件', width: 160 },
-                    { prop: 'bianZhiJiaoSe', label: '编制人', width: fieldWidth, fieldType: 'slot', slotName: 'role' },
-                    { prop: 'shenHeJiaoSe', label: '审核人', width: fieldWidth, fieldType: 'slot', slotName: 'role' },
-                    { prop: 'shenPiJiaoSe', label: '审批人', width: fieldWidth, fieldType: 'slot', slotName: 'role' }
+                    {
+                        prop: 'bianZhiJiaoSe',
+                        label: '编制人',
+                        width: fieldWidth,
+                        fieldType: 'slot',
+                        slotName: 'role'
+                    },
+                    {
+                        prop: 'shenHeJiaoSe',
+                        label: '审核人',
+                        width: fieldWidth,
+                        fieldType: 'slot',
+                        slotName: 'role'
+                    },
+                    {
+                        prop: 'shenPiJiaoSe',
+                        label: '审批人',
+                        width: fieldWidth,
+                        fieldType: 'slot',
+                        slotName: 'role'
+                    }
                 ]
             }
         }
@@ -135,122 +183,50 @@ export default {
         }, 200)
     },
     methods: {
-        // getGuide ({ parameters, requestPage, sorts }) {
-        //     // 获取查询角色信息
-        //     let roleParams = ''
-        //     let aboutMeParams = ''
-        //     const range = {
-        //         aboutMe: [],
-        //         sponsor: [],
-        //         review: [],
-        //         approve: []
-        //     }
-        //     const sortField = {
-        //         TABLE_NO_: 'biao_dan_bian_hao'
-        //     }
-        //     let sortParams = 'sn_ + 0 asc'
-        //     if (sorts && sorts.length) {
-        //         sortParams = sorts.map(i => `${sortField[i.field]} ${i.order}`).join(',')
-        //     }
-        //     this.role.forEach(i => {
-        //         range.aboutMe.push(`bian_zhi_jiao_se_ like '%${i.id}%' or shen_he_jiao_se_ like '%${i.id}%' or shen_pi_jiao_se_ like '%${i.id}%'`)
-        //         range.sponsor.push(`bian_zhi_jiao_se_ like '%${i.id}%'`)
-        //         range.review.push(`shen_he_jiao_se_ like '%${i.id}%'`)
-        //         range.approve.push(`shen_pi_jiao_se_ like '%${i.id}%'`)
-        //     })
-        //     parameters.forEach(item => {
-        //         if (item.key === 'range' && item.value !== 'all') {
-        //             aboutMeParams = ` and (${range[item.value].join(' or ')})`
-        //         }
-        //         if (item.key === 'role') {
-        //             roleParams = ` and (bian_zhi_jiao_se_ like '%${item.value}%')`
-        //         }
-        //     })
-        //     // 获取查询字段
-        //     let params = parameters.filter(i => i.key !== 'role' && i.key !== 'range').reduce((acc, curr) => {
-        //         return `${acc} and ${curr.key} like '%${curr.value}%'`
-        //     }, '')
-        //     params = params + aboutMeParams + roleParams
-        //     // and di_dian_ = '${level}'
-        //     const sql = `select sn_ as sn, suo_shu_xi_tong_ as sysName, gong_neng_mo_kuai as module, biao_dan_ming_che as tableName, biao_dan_bian_hao as tableNo, tian_xie_shi_ji_ as timing, shi_wu_lei_xing_ as taskType, cheng_xu_wen_jian as fileName, bian_zhi_ren_ as creator, shen_he_ren_ as reviewer, shen_pi_ren_ as approver, ye_mian_lu_jing_ as path, zi_yuan_lu_jing_ as res from t_bdbhpzb where sn_ + 0 > 0 ${params} order by ${sortParams}`
-        //     const { pageNo = 1, limit = 15 } = requestPage || {}
-        //     return new Promise((resolve, reject) => {
-        //         this.$common.request('sql', sql).then(res => {
-        //             const { data = [] } = res.variables || {}
-        //             const page = {
-        //                 limit,
-        //                 page: pageNo,
-        //                 totalCount: data.length,
-        //                 totalPages: Math.ceil(data.length / limit)
-        //             }
-        //             const result = {
-        //                 data: {
-        //                     dataResult: data.slice((pageNo - 1) * limit, pageNo * limit),
-        //                     pageResult: page
-        //                 }
-        //             }
-        //             resolve(result)
-        //         }).catch(error => {
-        //             reject(error)
-        //         })
-        //     })
-        // },
-        tableRowClassName ({ row, rowIndex }) {
+        tableRowClassName ({ rowIndex }) {
             if (rowIndex % 2 === 1) return 'warning-row'
             return 'success-row'
         },
         loadData () {
             this.loading = true
-            querySystemGuide(this.getSearchFormData()).then(res => {
-                const { dataResult } = res.data
-                const { page, limit } = this.pagination
-                const { isEmpty } = this.$utils
-                // 无排序字段时,默认按序号排序
-                if (isEmpty(this.sorts)) {
-                    dataResult.sort((a, b) => {
-                        return +a.sn - +b.sn
-                    })
-                }
-                // 处理分页
-                const pageResult = {
-                    limit,
-                    page,
-                    totalCount: dataResult.length,
-                    totalPages: Math.ceil(dataResult.length / limit)
-                }
-                const result = {
-                    dataResult: dataResult.slice((page - 1) * limit, page * limit),
-                    pageResult
-                }
-                // console.log(result)
-                ActionUtils.handleListData(this, result)
-            }).finally(() => {
-                this.loading = false
-            })
+            querySystemGuide(this.getSearchFormData())
+                .then((res) => {
+                    const { dataResult } = res.data
+                    const { isEmpty } = this.$utils
+                    // 无排序字段时,默认按序号排序
+                    if (isEmpty(this.sorts)) {
+                        dataResult.sort((a, b) => {
+                            return +a.sn - +b.sn
+                        })
+                    }
+                    // 处理分页
+                    const pageResult = res.data.pageResult
+                    const result = {
+                        dataResult,
+                        pageResult
+                    }
+                    console.log(result)
+                    ActionUtils.handleListData(this, result)
+                })
+                .finally(() => {
+                    this.loading = false
+                })
         },
-        // // 获取表格数据
-        // getData () {
-        //     this.loading = true
-        //     const pageParams = this.pagination && this.pagination.page ? this.pagination : this.defaultPagination
-        //     this.getGuide(this.getFormatParams(null, pageParams)).then(response => {
-        //         const { dataResult, pageResult } = response.data
-        //         this.listData = dataResult
-        //         this.pagination = pageResult || {}
-        //         this.loading = false
-        //     }).catch(() => {
-        //         this.loading = false
-        //     })
-        // },
         /**
-         * 获取格式化参数
-         */
+     * 获取格式化参数
+     */
         getSearchFormData () {
-            const params = this.$refs['guide'] ? this.$refs['guide'].getSearcFormData() : {}
-            const allRoleId = this.role.map(i => i.id)
+            const params = this.$refs['guide']
+                ? this.$refs['guide'].getSearcFormData()
+                : {}
+            const allRoleId = this.role.map((i) => i.id)
             // 默认过滤 SN 字段值不为空的数据
             params[`Q^sn_^SNE`] = '1'
             if (params.range === 'aboutMe') {
-                params[`Q^bian_zhi_jiao_se_^SL`] = params[`Q^shen_he_jiao_se_^SL`] = params[`Q^shen_pi_jiao_se_^SL`] = allRoleId
+                params[`Q^bian_zhi_jiao_se_^SL`] =
+          params[`Q^shen_he_jiao_se_^SL`] =
+          params[`Q^shen_pi_jiao_se_^SL`] =
+            allRoleId
             }
             if (params.range === 'sponsor') {
                 params[`Q^bian_zhi_jiao_se_^SL`] = allRoleId
@@ -270,7 +246,11 @@ export default {
             // 当前后端接口未实现字符串字段【SN】的正确排序,获取全部数据前端自行分页
             const result = {
                 parameters: this.formatParameters(params),
-                ...ActionUtils.formatParams(null, { ...this.pagination, limit: 9999 }, this.sorts)
+                ...ActionUtils.formatParams(
+                    null,
+                    { ...this.pagination, limit: this.pagination.limit || 100 },
+                    this.sorts
+                )
             }
             // console.log(result)
             return result
@@ -281,10 +261,19 @@ export default {
             }
             const parameters = Object.entries(data).map(([key, value]) =>
                 Array.isArray(value)
-                    ? { relation: 'OR', parameters: value.map(v => ({ key, value: v, param: this.$utils.guid() })) }
+                    ? {
+                        relation: 'OR',
+                        parameters: value.map((v) => ({
+                            key,
+                            value: v,
+                            param: this.$utils.guid()
+                        }))
+                    }
                     : { key, value }
             )
-            return parameters.length === 1 ? [parameters[0]] : [{ relation: 'AND', parameters }]
+            return parameters.length === 1
+                ? [parameters[0]]
+                : [{ relation: 'AND', parameters }]
         },
         // 查询
         search () {
@@ -300,11 +289,6 @@ export default {
             ActionUtils.setPagination(this.pagination, page)
             this.loadData()
         },
-        // getFormatParams (v, page) {
-        //     const params = this.$refs.guide ? this.$refs.guide.getSearcFormData() : {}
-        //     const pageParams = { ...page, limit: 100 }
-        //     return ActionUtils.formatParams(params, pageParams, this.sorts)
-        // },
         // 处理表格点击事件
         handleRowClick (data) {
             const { ziYuanLuJing = '' } = data
@@ -317,7 +301,7 @@ export default {
         },
         handleAction (command, position, selection, data) {
             switch (command) {
-                case 'search':// 查询
+                case 'search': // 查询
                     ActionUtils.setFirstPagination(this.pagination || {})
                     this.search()
                     break
@@ -329,103 +313,111 @@ export default {
             const resList = res.split('.')
             const findAlias = (nodes, path) => {
                 const [currentId, ...rest] = path
-                const node = nodes.find(n => n.id === currentId)
-                return node && rest.length ? [node.alias, ...findAlias(node.children, rest)] : node && [node.alias]
+                const node = nodes.find((n) => n.id === currentId)
+                return node && rest.length
+                    ? [node.alias, ...findAlias(node.children, rest)]
+                    : node && [node.alias]
             }
-            this.$store.dispatch('ibps/menu/activeHeaderSet', { activeHeader: resList[0], vm: this })
+            this.$store.dispatch('ibps/menu/activeHeaderSet', {
+                activeHeader: resList[0],
+                vm: this
+            })
             return findAlias(this.menus, resList).join('/')
         }
     }
 }
 </script>
 <style lang="scss" scoped>
-    ::v-deep .el-table__row {
-        cursor: pointer;
-    }
-    ::v-deep .el-tabs__header {
-        margin-bottom: 0;
-    }
-    .el-completing {
-        background: #409eff !important;
-    }
-    .el-col {
-        min-height: 1px;
-    }
-    .firstcol {
-        padding-right: 10px;
-    }
-    .el-nothing {
-        font-size: 13px;
-    }
-    .calendar-day {
-        text-align: center;
-        color: #202535;
-        line-height: 30px;
-        font-size: 12px;
-    }
-    .is-selected {
-        color: #f8a535;
-        font-size: 10px;
-        margin-top: 5px;
-    }
-    #calendar .el-button-group > .el-button:not(:first-child):not(:last-child):after {
-        content: '当月';
-    }
-    #calendar .item {
-        position: relative;
-        margin: 0;
-        padding: 0;
-        height: auto;
-        border-radius: 4px;
-        -webkit-box-sizing: border-box;
-        box-sizing: border-box;
-        overflow: hidden;
-        color: #f8a535;
-    }
-    .ibps-list-split .ibps-list-item {
-        border-bottom: 1px solid #dcdfe6;
-        padding: 6px 0;
-    }
-    .jbd-font-style {
-        font-weight: bold;
-    }
-    .home-text-border {
-        color: #999999;
-        box-shadow: 0 0 0 0 rgba(0, 0, 0, 0.1), 0 0 0 0 rgba(0, 0, 0, 0.1), 0 0 0 0 rgba(0, 0, 0, 0.1), 0 1px 0px 0 rgba(0, 0, 0, 0.1);
-        min-height: 20px;
-        font-size: 14px;
-        margin-left: 60px;
-        margin-bottom: 5px;
-    }
-    .jbd-home-card {
-        overflow: auto;
-    }
-    .jbd-home-task {
-        width: 100%;
-        padding: 10px;
-        cursor: pointer;
-        font-size: 12px;
-        margin-bottom: 35px;
-    }
-    .jbd-home-card::-webkit-scrollbar {
-        display: none;
-    }
-    .jbd-control-cont {
-        text-align: center;
-        position: absolute;
-        z-index: 10;
-        right: 0px;
-        top: 50%;
-    }
-    .tab-container {
-        height: calc(100vh - 160px);
-        min-height: 600px;
-        >div {
-            display: inline-block;
-        }
-        .table-container {
-            width: 100%;
-            vertical-align: top;
-        }
-    }
+::v-deep .el-table__row {
+  cursor: pointer;
+}
+::v-deep .el-tabs__header {
+  margin-bottom: 0;
+}
+.el-completing {
+  background: #409eff !important;
+}
+.el-col {
+  min-height: 1px;
+}
+.firstcol {
+  padding-right: 10px;
+}
+.el-nothing {
+  font-size: 13px;
+}
+.calendar-day {
+  text-align: center;
+  color: #202535;
+  line-height: 30px;
+  font-size: 12px;
+}
+.is-selected {
+  color: #f8a535;
+  font-size: 10px;
+  margin-top: 5px;
+}
+#calendar
+  .el-button-group
+  > .el-button:not(:first-child):not(:last-child):after {
+  content: '当月';
+}
+#calendar .item {
+  position: relative;
+  margin: 0;
+  padding: 0;
+  height: auto;
+  border-radius: 4px;
+  -webkit-box-sizing: border-box;
+  box-sizing: border-box;
+  overflow: hidden;
+  color: #f8a535;
+}
+.ibps-list-split .ibps-list-item {
+  border-bottom: 1px solid #dcdfe6;
+  padding: 6px 0;
+}
+.jbd-font-style {
+  font-weight: bold;
+}
+.home-text-border {
+  color: #999999;
+  box-shadow: 0 0 0 0 rgba(0, 0, 0, 0.1), 0 0 0 0 rgba(0, 0, 0, 0.1),
+    0 0 0 0 rgba(0, 0, 0, 0.1), 0 1px 0px 0 rgba(0, 0, 0, 0.1);
+  min-height: 20px;
+  font-size: 14px;
+  margin-left: 60px;
+  margin-bottom: 5px;
+}
+.jbd-home-card {
+  overflow: auto;
+}
+.jbd-home-task {
+  width: 100%;
+  padding: 10px;
+  cursor: pointer;
+  font-size: 12px;
+  margin-bottom: 35px;
+}
+.jbd-home-card::-webkit-scrollbar {
+  display: none;
+}
+.jbd-control-cont {
+  text-align: center;
+  position: absolute;
+  z-index: 10;
+  right: 0px;
+  top: 50%;
+}
+.tab-container {
+  height: calc(100vh - 160px);
+  min-height: 600px;
+  > div {
+    display: inline-block;
+  }
+  .table-container {
+    width: 100%;
+    vertical-align: top;
+  }
+}
 </style>

Некоторые файлы не были показаны из-за большого количества измененных файлов