From bab72ac2526af1116e1f3af25b5b635141317699 Mon Sep 17 00:00:00 2001
From: liujun <liujun@zcloudchina.com>
Date: Fri, 19 Jan 2024 20:44:33 +0800
Subject: [PATCH 01/11] =?UTF-8?q?=E5=8E=BB=E9=99=A4debugger?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 src/views/map/index.vue | 98 ++++++++++++++++++++---------------------
 1 file changed, 49 insertions(+), 49 deletions(-)

diff --git a/src/views/map/index.vue b/src/views/map/index.vue
index 96c7677..fa61f10 100644
--- a/src/views/map/index.vue
+++ b/src/views/map/index.vue
@@ -1108,58 +1108,58 @@ export default {
     },
     keepalive(token) {
       // 第二套方案
-      requestFN(
-        '/map/loginOrKeepAlive',
-        {
-        }
-      ).then((data) => {
-
-      })
+      // requestFN(
+      //   '/map/loginOrKeepAlive',
+      //   {
+      //   }
+      // ).then((data) => {
+      //
+      // })
     },
     ysVideoInit() {
       // 第二套方案
-      var _this = this
-      requestFN(
-        '/map/loginOrKeepAlive',
-        {
-        }
-      ).then((data) => {
-        const token = data.token
-        var nbsp = String.fromCharCode(160)
-        var arr = []
-        arr.length = 40
-        const str = arr.fill(nbsp).join('')
-        const voidPath = imosPlayer.getUniqueID()
-        window.voidPath = voidPath
-        document.title = document.title + str + new Date().getTime()
-        _this.keepalive(token)
-        setInterval(_this.keepalive, 30000, token)
-
-        window.videoWindow = 0
-        imosPlayer.setLinkPort('8093')
-        imosPlayer
-          .init({
-            ip: '172.14.0.54',
-            token: token,
-            title: document.title,
-            voidListenerPath: '\\' + voidPath
-          })
-          .then(async(resr) => {
-            if (resr.ErrCode === 0) {
-              // imosPlayer.setLiveNetLinkMode(liveNetProtocol, liveByMS)
-              // imosPlayer.setReplayNetLinkMode(replayNetProtocol, replayByMS)
-
-              // eslint-disable-next-line no-alert
-              console.info('登录成功')
-            } else {
-              // eslint-disable-next-line no-alert
-              console.info(resr.ErrMsg)
-            }
-          })
-          .catch((err) => {
-            console.error(err)
-          })
-      })
+      // var _this = this
+      // requestFN(
+      //   '/map/loginOrKeepAlive',
+      //   {
+      //   }
+      // ).then((data) => {
+      //   const token = data.token
+      //   var nbsp = String.fromCharCode(160)
+      //   var arr = []
+      //   arr.length = 40
+      //   const str = arr.fill(nbsp).join('')
+      //   const voidPath = imosPlayer.getUniqueID()
+      //   window.voidPath = voidPath
+      //   document.title = document.title + str + new Date().getTime()
+      //   _this.keepalive(token)
+      //   setInterval(_this.keepalive, 30000, token)
+      //
+      //   window.videoWindow = 0
+      //   imosPlayer.setLinkPort('8093')
+      //   imosPlayer
+      //     .init({
+      //       ip: '172.14.0.54',
+      //       token: token,
+      //       title: document.title,
+      //       voidListenerPath: '\\' + voidPath
+      //     })
+      //     .then(async(resr) => {
+      //       if (resr.ErrCode === 0) {
+      //         // imosPlayer.setLiveNetLinkMode(liveNetProtocol, liveByMS)
+      //         // imosPlayer.setReplayNetLinkMode(replayNetProtocol, replayByMS)
+      //
+      //         // eslint-disable-next-line no-alert
+      //         console.info('登录成功')
+      //       } else {
+      //         // eslint-disable-next-line no-alert
+      //         console.info(resr.ErrMsg)
+      //       }
+      //     })
+      //     .catch((err) => {
+      //       console.error(err)
+      //     })
+      // })
     },
     // keepalive(token) {
     //   axios({

From e6d21ace08b7cd5110dc530113b62dc82701312d Mon Sep 17 00:00:00 2001
From: liujun <liujun@zcloudchina.com>
Date: Mon, 22 Jan 2024 16:01:47 +0800
Subject: [PATCH 02/11] =?UTF-8?q?=E8=8B=A5=E5=B9=B2bug=E4=BF=AE=E6=94=B9?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 src/views/xgf/flow/components/QRCode.vue   |  36 ++
 src/views/xgf/flow/components/apply.vue    | 320 +++++++++++++
 src/views/xgf/flow/components/list.vue     | 241 ++++++++++
 src/views/xgf/flow/components/picture.vue  |  36 ++
 src/views/xgf/flow/components/record.vue   | 198 ++++++++
 src/views/xgf/flow/components/sendUtil.vue | 238 ++++++++++
 src/views/xgf/flow/components/user.vue     | 250 ++++++++++
 src/views/xgf/flow/components/users.vue    | 513 +++++++++++++++++++++
 src/views/xgf/flow/index.vue               |  23 +
 9 files changed, 1855 insertions(+)
 create mode 100644 src/views/xgf/flow/components/QRCode.vue
 create mode 100644 src/views/xgf/flow/components/apply.vue
 create mode 100644 src/views/xgf/flow/components/list.vue
 create mode 100644 src/views/xgf/flow/components/picture.vue
 create mode 100644 src/views/xgf/flow/components/record.vue
 create mode 100644 src/views/xgf/flow/components/sendUtil.vue
 create mode 100644 src/views/xgf/flow/components/user.vue
 create mode 100644 src/views/xgf/flow/components/users.vue
 create mode 100644 src/views/xgf/flow/index.vue

diff --git a/src/views/xgf/flow/components/QRCode.vue b/src/views/xgf/flow/components/QRCode.vue
new file mode 100644
index 0000000..297e138
--- /dev/null
+++ b/src/views/xgf/flow/components/QRCode.vue
@@ -0,0 +1,36 @@
+<template>
+  <div>
+    <el-dialog :visible.sync="visible" :append-to-body="appendToBody" title="相关方安全告知培训合格证" width="370px" destroy-on-close	>
+      <vue-qr :text="qrCodeStr" :margin="0" :size="320" color-dark="#000" color-light="#fff"/>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import vueQr from 'vue-qr'
+
+export default {
+  components: { vueQr },
+  props: {
+    appendToBody: {
+      type: Boolean,
+      default: false
+    }
+  },
+  data() {
+    return {
+      visible: false,
+      qrCodeStr: ''
+    }
+  },
+  methods: {
+    init(e) {
+      this.visible = true
+      this.qrCodeStr = e.qrCodeStr
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+</style>
diff --git a/src/views/xgf/flow/components/apply.vue b/src/views/xgf/flow/components/apply.vue
new file mode 100644
index 0000000..199811d
--- /dev/null
+++ b/src/views/xgf/flow/components/apply.vue
@@ -0,0 +1,320 @@
+<template>
+  <el-dialog
+    v-if="visible"
+    :visible.sync="visible"
+    :before-close="handleClose"
+    :append-to-body="true"
+    title="培训申请"
+    width="60%">
+    <el-form ref="form" :model="form" :rules="rules" label-width="120px">
+      <el-row>
+        <el-col :span="12">
+          <el-form-item
+            prop="TERRITORIALITY"
+            label="集团单位 "
+          >
+            <Treeselect
+              :options="jituanDanweiTreeData"
+              :normalizer="normalizer"
+              v-model="form.TERRITORIALITY"
+              placeholder="请选择集团单位 "
+              no-options-text="暂无数据"
+              no-children-text="暂无数据"
+              style="width: 100%;"
+              @select="getUserList($event)"
+            />
+          </el-form-item>
+        </el-col>
+
+        <el-col :span="12">
+          <el-form-item
+            prop="TERRITORIALITY_USER_ID"
+            label="审核人员"
+          >
+            <div style="display:flex;justify-content: space-between;align-items: flex-start;">
+              <el-select v-model="form.TERRITORIALITY_USER_ID">
+                <el-option
+                  v-for="item in companyUserList"
+                  :key="item.USER_ID"
+                  :label="item.NAME"
+                  :value="item.USER_ID"/>
+              </el-select>
+            </div>
+          </el-form-item>
+        </el-col>
+      </el-row>
+
+      <el-row>
+        <el-col :span="12">
+          <el-form-item
+            prop="MANAGER"
+            label="主管部门"
+          >
+            <Treeselect
+              :options="treeData"
+              :normalizer="normalizer"
+              v-model="form.MANAGER"
+              :disabled="true"
+              placeholder="请选择主管部门"
+              no-options-text="暂无数据"
+              no-children-text="暂无数据"
+              style="width: 100%;"
+              @select="getmanagerUserList($event)"
+            />
+          </el-form-item>
+        </el-col>
+
+        <el-col :span="12">
+          <el-form-item
+            prop="MANAGER_USER_ID"
+            label="审核人员"
+          >
+            <div style="display:flex;justify-content: space-between;align-items: flex-start;">
+              <el-select v-model="form.MANAGER_USER_ID">
+                <el-option
+                  v-for="item in managercompanyUserList"
+                  :key="item.USER_ID"
+                  :label="item.NAME"
+                  :value="item.USER_ID"/>
+              </el-select>
+            </div>
+          </el-form-item>
+        </el-col>
+      </el-row>
+      <el-row>
+        <el-col :span="12">
+          <el-form-item
+            prop="SUPERVISION"
+            label="安监部门"
+          >
+            <Treeselect
+              :options="treeData"
+              :normalizer="normalizer"
+              v-model="form.SUPERVISION"
+              :disabled="true"
+              placeholder="请选择安监部门"
+              no-options-text="暂无数据"
+              no-children-text="暂无数据"
+              style="width: 100%;"
+            />
+          </el-form-item>
+        </el-col>
+
+        <el-col :span="12">
+          <el-form-item
+            prop="SUPERVISION_USER_ID"
+            label="审核人员"
+          >
+            <div style="display:flex;justify-content: space-between;align-items: flex-start;">
+              <el-select v-model="form.SUPERVISION_USER_ID">
+                <el-option v-for="item in userList" :key="item.USER_ID" :label="item.NAME" :value="item.USER_ID"/>
+              </el-select>
+            </div>
+          </el-form-item>
+        </el-col>
+      </el-row>
+
+      <el-row>
+        <el-col :span="24">
+          <el-form-item label="备注">
+            <el-input :rows="3" v-model="form.DESCR" type="textarea" placeholder="这里输入备注..."/>
+          </el-form-item>
+        </el-col>
+      </el-row>
+    </el-form>
+
+    <div slot="footer" class="dialog-footer">
+      <el-button @click="closeWindow">取 消</el-button>
+      <el-button :loading="loading" type="primary" @click="save">确 定</el-button>
+    </div>
+  </el-dialog>
+</template>
+
+<script>
+import { requestFN } from '@/utils/request'
+import Treeselect from '@riophae/vue-treeselect'
+import '@riophae/vue-treeselect/dist/vue-treeselect.css'
+
+export default {
+  components: {
+    Treeselect
+  },
+  props: {
+    corpInfo: {
+      type: String,
+      default: ''
+    }
+  },
+  data() {
+    return {
+      visible: false,
+      loading: false,
+      treeData: [],
+      companyTreeData: [],
+      corpinfo: {},
+      userList: [],
+      companyUserList: [],
+      managercompanyUserList: [],
+      jituanDanwei: '',
+      jituanDanweiTreeData: [],
+      normalizer(node) {
+        return {
+          id: node.id,
+          label: node.name,
+          children: node.nodes
+        }
+      },
+      form: {},
+      rules: {
+        // SUPERVISION: [{ required: true, message: '安监部门不能为空', trigger: 'blur' }],
+        SUPERVISION_USER_ID: [{ required: true, message: '审核人员不能为空', trigger: 'blur' }],
+        MANAGER: [{ required: true, message: '主管部门不能为空', trigger: 'blur' }],
+        MANAGER_USER_ID: [{ required: true, message: '审核人员不能为空', trigger: 'blur' }],
+        TERRITORIALITY: [{ required: true, message: '属地管理部门不能为空', trigger: 'blur' }],
+        TERRITORIALITY_USER_ID: [{ required: true, message: '审核人员不能为空', trigger: 'blur' }]
+      }
+    }
+  },
+  methods: {
+    async init(e) {
+      if (e) {
+        this.users = e
+      }
+      this.visible = true
+      this.loading = false
+      this.form = {}
+      /**
+       * 获取相关方的 集团单位  corpinfo/getDataForEditByCorpInfoId
+       * 根据集团单位 找到 对应的 企业id
+       */
+      await this.getCorpinfo()
+    },
+    getCorpinfo() {
+      requestFN(
+        '/corpinfo/getDataForEditByCorpInfoId',
+        {
+          CORPINFO_ID: JSON.parse(sessionStorage.getItem('user')).CORPINFO_ID,
+          tm: new Date().getTime()
+        }
+      ).then((data) => {
+        this.corpinfo = data.pd
+        // 河港机械	jtdw002  1e6dbbe16004402f8d2c0e52afd9a676
+        // 河港港工	jtdw003  3a854eefa7894e06aaa1a2611bca80f6
+        // 河港检测	jtdw004  020578a4c1f04bc692ee25145c2efbe5
+        // 方宇物业	jtdw005 90966974de3c4b83aca6f8fd6432d5c2
+
+        if (data.pd.CORP_TYPE == 'jtdw002') {
+          this.jituanDanwei = '1e6dbbe16004402f8d2c0e52afd9a676'
+        }
+        if (data.pd.CORP_TYPE == 'jtdw003') {
+          this.jituanDanwei = '3a854eefa7894e06aaa1a2611bca80f6'
+        }
+        if (data.pd.CORP_TYPE == 'jtdw004') {
+          this.jituanDanwei = '020578a4c1f04bc692ee25145c2efbe5'
+        }
+        if (data.pd.CORP_TYPE == 'jtdw005') {
+          this.jituanDanwei = '90966974de3c4b83aca6f8fd6432d5c2'
+        }
+        this.getTreeData()
+      })
+    },
+    // 获得部门树
+    getTreeData() {
+      requestFN(
+        '/regulatoryApi/department/listTree',
+        {}
+      ).then((data) => {
+        this.treeData = JSON.parse(data.zTreeNodes)
+        // 必须指定【股份-安全监督部】
+        this.form.SUPERVISION = 'c31058273a2d40f9b83dd8e5ae3a723c'
+        this.form.MANAGER = this.corpinfo.MAIN_DEPARTMENT
+        this.getRegulatoryUserList(this.form.SUPERVISION)
+        this.getmanagerUserList(this.corpinfo.MAIN_DEPARTMENT)
+      }).catch((e) => {
+        console.log(e)
+      })
+
+      if (this.jituanDanwei) {
+        requestFN(
+          '/companyApi/department/listTree',
+          { CORPINFO_ID: this.jituanDanwei }
+        ).then((data) => {
+          this.jituanDanweiTreeData = JSON.parse(data.zTreeNodes)
+        }).catch((e) => {
+        })
+      }
+    },
+    getRegulatoryUserList(DEPARTMENT_ID) {
+      requestFN(
+        '/regulatoryApi/user/listAll',
+        {
+          DEPARTMENT_ID: DEPARTMENT_ID,
+          ISASSESS: '1'
+        }
+      ).then((data) => {
+        this.userList = data.userList
+      }).catch((e) => {
+      })
+    },
+    // 人员
+    getUserList({ id: DEPARTMENT_ID }) {
+      requestFN(
+        '/companyApi/user/listAll',
+        {
+          DEPARTMENT_ID
+        }
+      ).then((data) => {
+        this.companyUserList = data.userList
+      }).catch((e) => {
+      })
+    },
+    getmanagerUserList(DEPARTMENT_ID) {
+      requestFN(
+        '/regulatoryApi/user/listAll',
+        {
+          DEPARTMENT_ID: DEPARTMENT_ID
+        }
+      ).then((data) => {
+        this.managercompanyUserList = data.userList
+      }).catch((e) => {
+      })
+    },
+
+    save() {
+      this.$refs.form.validate(valid => {
+        if (valid) {
+          this.loading = true
+          this.form.USER_COUNT = this.users.length
+          this.form.AUDIT_STATUS = 0
+          this.form.TYPE = 2
+          requestFN(
+            '/trainingbatch/add',
+            {
+              ...this.form,
+              users: this.users.join(',')
+            }
+          ).then((data) => {
+            this.loading = false
+            this.$message({
+              message: '申请成功',
+              type: 'success'
+            })
+            this.handleClose()
+          }).catch((e) => {
+            this.listLoading = false
+          })
+        } else {
+          return false
+        }
+      })
+    },
+    handleClose() {
+      this.visible = false
+      this.$emit('finish', '')
+    },
+    closeWindow() {
+      this.handleClose()
+    }
+  }
+}
+</script>
diff --git a/src/views/xgf/flow/components/list.vue b/src/views/xgf/flow/components/list.vue
new file mode 100644
index 0000000..0c25b19
--- /dev/null
+++ b/src/views/xgf/flow/components/list.vue
@@ -0,0 +1,241 @@
+<template>
+  <div class="app-container">
+    <el-form label-width="130px">
+      <el-row>
+        <el-col :span="6">
+          <el-form-item label="用户名">
+            <el-input v-model="KEYWORDS" placeholder="请输入用户名"/>
+          </el-form-item>
+        </el-col>
+        <el-col v-if="false" :span="6">
+          <el-form-item label="培训状态">
+            <el-select v-model="STATUS" placeholder="请选择培训状态" style="width: 100%;" clearable>
+              <el-option v-for="item in statusList" :key="item.value" :label="item.label" :value="item.value"/>
+            </el-select>
+          </el-form-item>
+        </el-col>
+        <el-col :span="6">
+          <el-form-item label-width="10px">
+            <el-button v-waves class="filter-item" type="primary" icon="el-icon-search" @click="getQuery">
+              搜索
+            </el-button>
+            <el-button v-waves class="filter-item" type="success" icon="el-icon-refresh" @click="goKeyReset">
+              重置
+            </el-button>
+          </el-form-item>
+        </el-col>
+      </el-row>
+    </el-form>
+    <el-table
+      ref="multipleTable"
+      :data="varList"
+      :header-cell-style="{'font-weight': 'bold','color': '#000'}"
+      tooltip-effect="dark"
+      border
+      fit
+      highlight-current-row>
+      <el-table-column :selectable="handleSelectWithDifferentStatus" type="selection" width="55" align="center"/>
+      <el-table-column type="index" label="序号" width="50" align="center"/>
+      <el-table-column prop="USERNAME" label="用户名" align="center"/>
+      <el-table-column prop="NAME" label="姓名" align="center"/>
+      <el-table-column prop="BELONG_TO_CORP_NAME" label="外派公司名称" align="center"/>
+      <el-table-column label="操作" align="center" width="250">
+        <template slot-scope="{row}">
+          <el-button type="primary" icon="el-icon-edit" size="mini" @click="handleShow(row)">详情</el-button>
+          <el-button v-if="row.power_flag === '1'" type="primary" icon="el-icon-s-claim" size="mini" @click="approve([row])">审批</el-button>
+          <el-button v-if="false" type="success" icon="el-icon-edit" size="mini" @click="getUserInfo(row)">电子合格证</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    <div class="page-btn-group">
+      <div>
+        <el-button v-if="false" type="primary" icon="el-icon-plus" @click="handleAdd">批量同意</el-button>
+      </div>
+      <pagination :total="total" :page.sync="listQuery.page" :limit.sync="listQuery.limit" @pagination="getList"/>
+    </div>
+    <user ref="userInfo" append-to-body/>
+    <user-info ref="userInfos" append-to-body/>
+    <send-util ref="sendUtil" append-to-body @refresh="getList"/>
+  </div>
+</template>
+
+<script>
+import Pagination from '@/components/Pagination' // 通过 el-pagination二次打包
+import { requestFN } from '@/utils/request'
+import waves from '@/directive/waves' // waves directive
+import vueQr from 'vue-qr'
+import apply from './apply'
+import user from './user.vue'
+import SendUtil from './sendUtil.vue'
+import UserInfo from '../../flow_audit/userInfo.vue'
+
+export default {
+  components: { UserInfo, SendUtil, Pagination, apply, vueQr, user },
+  directives: { waves },
+  data() {
+    return {
+      config: config,
+      QRCodeDialog: false,
+      qrcodeStr: '',
+      userDetailForm: {},
+      specialUsersList: {},
+      detailForm: {},
+      userEntryForm: {},
+      imgUrl: '',
+      SUPERVISE_CORPINFO_ID: '',
+      wenhuachengduList: [], // 文化程度
+      postList: [], // 岗位名称
+      photosOfLevel: [], // 三级教育照片
+      trainRecordList: [], // 培训记录
+      contractFileList: [], // 合同文件
+      insuranceFileList: [], // 保险文件
+      gongshangbaoxianFile: [],
+      userPhotoFile: [], // 头像
+      userCardIDPhotoFile: [], // 身份证照片
+      socialPhotoFile: [], // 身份证照片
+      listQuery: {
+        page: 1,
+        limit: 10
+      },
+      total: 0,
+      varList: [],
+      KEYWORDS: '',
+      statusList: [{ value: 0, label: '未培训' }, { value: 1, label: '培训中' }, {
+        value: 2,
+        label: '已培训(合格)'
+      }, { value: 3, label: '已培训(不合格)' }, { value: 9, label: '申请中' }],
+      STATUS: '',
+      add: false,		// 新增按钮
+      del: false,		// 删除按钮
+      edit: false	// 修改按钮
+    }
+  },
+  created() {
+    this.getDict()
+    this.getList()
+    this.hasButton()
+  },
+  methods: {
+    handleSelectWithDifferentStatus(row, rowIndex) {
+      if (row.STATUS === 0) {
+        // 不禁用
+        return true
+      } else {
+        // 禁用
+        return false
+      }
+    },
+    getQuery() {
+      if (this.$refs.multipleTable) {
+        this.$refs.multipleTable.clearSelection()
+      }
+      this.listQuery = {
+        page: 1,
+        limit: 10
+      }
+      this.getList()
+    },
+    goKeyReset() {
+      this.KEYWORDS = ''
+      this.STATUS = ''
+      this.getQuery()
+    },
+    getList() {
+      this.listLoading = true
+      requestFN(
+        '/xgf/user/getAppointApproveList?showCount=' + this.listQuery.limit + '&currentPage=' + this.listQuery.page,
+        {
+          KEYWORDS: this.KEYWORDS,
+          STATUS: '1',
+          EMPLOY_FLAG: '1',
+          CHECK_STATUS: '1'
+        }
+      ).then((data) => {
+        this.listLoading = false
+        this.varList = data.list
+        this.total = data.page.totalResult
+      })
+        .catch((e) => {
+          this.listLoading = false
+        })
+    },
+    handleShow(row) {
+      this.$refs.userInfos.init(row)
+    },
+    approve(row) {
+      this.$refs.sendUtil.init(row)
+    },
+    getUserInfo(row) {
+      this.$refs.userInfo.init(row)
+    },
+    handleAdd() {
+      const _selectData = this.$refs.multipleTable.selection
+      if (_selectData == null || _selectData.length == 0) {
+        this.$message({
+          message: '未勾选培训人员...',
+          type: 'error'
+        })
+        return false
+      }
+
+      var users = []
+      _selectData.map(item => {
+        if (item.STATUS === 0) {
+          users.push(item.USER_ID)
+        }
+      })
+
+      if (users == null || users.length == 0) {
+        this.$message({
+          message: '勾选人员暂无法提交申请...',
+          type: 'error'
+        })
+        return false
+      }
+      this.$refs.apply.init(users)
+    },
+    hasButton() {
+      var keys = 'trainingbatch:add,trainingbatch:del,trainingbatch:edit,fhSms,email,fromExcel,toExcel'
+      requestFN(
+        '/head/hasButton',
+        {
+          keys: keys, tm: new Date().getTime()
+        }
+      ).then((data) => {
+        if (data.result == 'success') {
+          this.add = data.trainingbatchfhadminadd	// 增
+          this.del = data.trainingbatchfhadmindel	// 删
+          this.edit = data.trainingbatchfhadminedit	// 改
+          this.fromExcel = data.fromExcel	// 从excel导入权限
+          this.toExcel = data.toExcel		// 导出到excel权限
+        } else if (data.result == 'exception') {
+          // showException('按钮权限', data.exception)// 显示异常
+          console.info('按钮权限:', data.exception)
+        }
+      })
+        .catch((e) => {
+          this.listLoading = false
+        })
+    },
+    getDict: function() {
+      requestFN(
+        'dictionaries/getLevels',
+        { DICTIONARIES_ID: 'd7d80f08d73a4accbccf4fd3d8d1d867' }
+      ).then((data) => {
+        this.wenhuachengduList = data.list
+      }).catch((e) => {
+        this.listLoading = false
+      })
+      requestFN(
+        'dictionaries/getLevels',
+        { DICTIONARIES_ID: '09e36ac01e9540f8bc84eab1c1a78754' }
+      ).then((data) => {
+        this.postList = data.list
+      }).catch((e) => {
+        this.listLoading = false
+      })
+    }
+  }
+}
+</script>
+
diff --git a/src/views/xgf/flow/components/picture.vue b/src/views/xgf/flow/components/picture.vue
new file mode 100644
index 0000000..57e7255
--- /dev/null
+++ b/src/views/xgf/flow/components/picture.vue
@@ -0,0 +1,36 @@
+<template>
+  <div>
+    <el-dialog :visible.sync="visible" :append-to-body="appendToBody" title="头像" width="370px" destroy-on-close	>
+      <el-image :src="src"/>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import vueQr from 'vue-qr'
+
+export default {
+  components: { vueQr },
+  props: {
+    appendToBody: {
+      type: Boolean,
+      default: false
+    }
+  },
+  data() {
+    return {
+      visible: false,
+      src: ''
+    }
+  },
+  methods: {
+    init(e) {
+      this.visible = true
+      this.src = e.src
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+</style>
diff --git a/src/views/xgf/flow/components/record.vue b/src/views/xgf/flow/components/record.vue
new file mode 100644
index 0000000..e82258d
--- /dev/null
+++ b/src/views/xgf/flow/components/record.vue
@@ -0,0 +1,198 @@
+<template>
+  <div class="app-container">
+    <el-page-header content="申请记录" @back="goBack"/>
+    <el-form label-width="130px">
+      <el-row>
+        <el-col :span="5">
+          <el-form-item label="申请人员">
+            <el-input v-model="KEYWORDS" placeholder="请输入申请人员"/>
+          </el-form-item>
+        </el-col>
+        <el-col :span="5">
+          <el-form-item label="主管部门">
+            <Treeselect
+              :options="companyTreeData"
+              :normalizer="normalizer"
+              v-model="MANAGER"
+              placeholder="请选择部门"
+              no-options-text="暂无数据"
+              no-children-text="暂无数据"
+              style="width: 100%;"
+            />
+          </el-form-item>
+        </el-col>
+        <el-col :span="5">
+          <el-form-item label="属地管理部门">
+            <Treeselect
+              :options="companyTreeData"
+              :normalizer="normalizer"
+              v-model="TERRITORIALITY"
+              placeholder="请选择部门"
+              no-options-text="暂无数据"
+              no-children-text="暂无数据"
+              style="width: 100%;"
+            />
+          </el-form-item>
+        </el-col>
+        <el-col :span="5">
+          <el-form-item label="申请状态">
+            <el-select v-model="AUDIT_STATUS" placeholder="请选择申请状态" style="width: 100%;">
+              <el-option v-for="item in statusList" :key="item.value" :label="item.label" :value="item.value" />
+            </el-select>
+          </el-form-item>
+        </el-col>
+        <el-col :span="4">
+          <el-form-item label-width="10px">
+            <el-button v-waves class="filter-item" type="primary" icon="el-icon-search" @click="getQuery">
+              搜索
+            </el-button>
+            <el-button v-waves class="filter-item" type="success" icon="el-icon-refresh" @click="goKeyReset">
+              重置
+            </el-button>
+          </el-form-item>
+        </el-col>
+      </el-row>
+    </el-form>
+    <el-table ref="multipleTable" :data="varList" :header-cell-style="{'font-weight': 'bold','color': '#000'}" tooltip-effect="dark" border fit highlight-current-row>
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column type="index" label="序号" width="50" align="center" />
+      <el-table-column prop="CREATTIME" label="申请时间" align="center" />
+      <el-table-column prop="CREATOR" label="申请人员" align="center" />
+      <el-table-column prop="SUPERVISION_DEPARTMENT_NAME" label="安监部门" align="center" />
+      <el-table-column prop="MANAGER_DEPT_NAME" label="主管部门" align="center" />
+      <el-table-column prop="TERRITORIALITY_DEPARTMENT_NAME" label="属地管理部门" align="center" />
+      <el-table-column prop="TRAIN_DATE" label="申请年份" align="center" >
+        <template slot-scope="{row}">
+          {{ new Date(row.CREATTIME).getFullYear() }}
+        </template>
+      </el-table-column>
+      <el-table-column prop="AUDIT_STATUS" label="申请状态" align="center" >
+        <template slot-scope="{row}">
+          <span v-if="row.AUDIT_STATUS === 0">待审核</span>
+          <span v-if="row.AUDIT_STATUS === 1">审核中</span>
+          <span v-if="row.AUDIT_STATUS === 2">待培训</span>
+          <span v-if="row.AUDIT_STATUS === 3">已完成</span>
+        </template>
+      </el-table-column>
+      <el-table-column prop="PASS_COUNT" label="审核通过人数" align="center" /> <!-- 已更新为申请状态中的审核通过人员数-->
+      <el-table-column prop="USER_COUNT" label="申请人数" align="center" />
+      <el-table-column label="操作" align="center" width="200">
+        <template slot-scope="{row}">
+          <el-button type="primary" icon="el-icon-edit" size="mini" @click="handleShow(row)">查看</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    <div class="page-btn-group">
+      <div/>
+      <pagination :total="total" :page.sync="listQuery.page" :limit.sync="listQuery.limit" @pagination="getList" />
+    </div>
+
+    <users ref="users"/>
+  </div>
+</template>
+
+<script>
+import Pagination from '@/components/Pagination' // 通过 el-pagination二次打包
+import { requestFN } from '@/utils/request'
+import waves from '@/directive/waves' // waves directive
+import Treeselect from '@riophae/vue-treeselect'
+import '@riophae/vue-treeselect/dist/vue-treeselect.css'
+import users from './users'
+export default {
+  components: { Pagination, Treeselect, users },
+  directives: { waves },
+  data() {
+    return {
+      listQuery: {
+        page: 1,
+        limit: 10
+      },
+      total: 0,
+      varList: [],
+      treeData: [],
+      companyTreeData: [],
+      normalizer(node) {
+        return {
+          id: node.id,
+          label: node.name,
+          children: node.nodes
+        }
+      },
+      MANAGER: null,
+      TERRITORIALITY: null,
+      statusList: [{ value: 0, label: '待审核' }, { value: 1, label: '审核中' }, { value: 2, label: '待培训' }, { value: 3, label: '已完成' }],
+      AUDIT_STATUS: '',
+      KEYWORDS: ''
+    }
+  },
+  created() {
+    this.getList()
+    this.getTreeData()
+  },
+  methods: {
+    getQuery() {
+      this.$refs.multipleTable.clearSelection()
+      this.listQuery = {
+        page: 1,
+        limit: 10
+      }
+      this.getList()
+    },
+    goKeyReset() {
+      this.MANAGER = null
+      this.TERRITORIALITY = null
+      this.AUDIT_STATUS = ''
+      this.KEYWORDS = ''
+      this.getQuery()
+    },
+    getList() {
+      this.listLoading = true
+      requestFN(
+        '/trainingbatch/list?showCount=' + this.listQuery.limit + '&currentPage=' + this.listQuery.page,
+        {
+          MANAGER: this.MANAGER,
+          TERRITORIALITY: this.TERRITORIALITY,
+          AUDIT_STATUS: this.AUDIT_STATUS,
+          KEYWORDS: this.KEYWORDS,
+          TYPE: 2,
+          USER_ID: JSON.parse(sessionStorage.getItem('user')).USER_ID
+        }
+      ).then((data) => {
+        this.listLoading = false
+        this.varList = data.varList
+        console.log(this.varList)
+        this.total = data.page.totalResult
+      })
+        .catch((e) => {
+          this.listLoading = false
+        })
+    },
+
+    // 获得部门树
+    getTreeData() {
+      requestFN(
+        '/regulatoryApi/department/listTree',
+        {}
+      ).then((data) => {
+        this.treeData = JSON.parse(data.zTreeNodes)
+      }).catch((e) => {
+      })
+      requestFN(
+        '/companyApi/department/listTree',
+        { CORPINFO_ID: this.$parent.SUPERVISE_CORPINFO_ID }
+      ).then((data) => {
+        this.companyTreeData = JSON.parse(data.zTreeNodes)
+      }).catch((e) => {
+      })
+    },
+
+    handleShow(row) {
+      this.$refs.users.init(row)
+    },
+    goBack() {
+      this.$parent.activeName = 'List'
+    }
+  }
+}
+</script>
+
diff --git a/src/views/xgf/flow/components/sendUtil.vue b/src/views/xgf/flow/components/sendUtil.vue
new file mode 100644
index 0000000..5cf5078
--- /dev/null
+++ b/src/views/xgf/flow/components/sendUtil.vue
@@ -0,0 +1,238 @@
+<template>
+  <div>
+    <el-dialog v-loading = "loading" :visible.sync="visible" :append-to-body="appendToBody" :before-close="beforeClose" title="审批" width="1200px" destroy-on-close>
+      <el-form ref="form" :model="form" :rules="rules" label-width="200px" label-position="right" type="flex">
+        <el-row :gutter="12">
+          <el-col :span="12">
+            <el-form-item prop="STATUS" label="是否通过: ">
+              <el-select v-model="form.STATUS" style="width: 300px" placeholder="请选择">
+                <el-option label="是" value="1"/>
+                <el-option label="否" value="0"/>
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item v-if="form.STATUS === '1' && isShow" prop="APPOINT_DEPARTMENT_ID" label="指定监管部门:">
+              <Treeselect
+                :options="departmentTree"
+                :normalizer="normalizer"
+                v-model="form.APPOINT_DEPARTMENT_ID"
+                placeholder="请选择部门"
+                no-options-text="暂无数据"
+                no-children-text="暂无数据"
+                style="width: 100%;"
+                @select="getPeopleList($event)"
+              />
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row>
+          <el-col v-if="form.STATUS === '0'" :span="12">
+            <el-form-item v-if="form.STATUS === '0'" prop="OPINION" label="打回原因:">
+              <el-input v-model="form.OPINION" :rows="2" type="textarea" placeholder="填写审批意见"/>
+            </el-form-item>
+          </el-col>
+          <el-col v-if="form.STATUS === '1' && isShow" :span="12">
+            <el-form-item v-if="form.STATUS === '1'" prop="APPOINT_USER_ID" label="指定监管部门审批人:">
+              <el-select v-model="form.user" style="width: 300px" placeholder="请选择" @change="chooseUser">
+                <el-option v-for="item in peopleList" :key="item.USER_ID" :value="JSON.stringify(item)" :label="item.NAME"/>
+              </el-select>
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+
+      <div slot="footer" class="dialog-footer">
+        <el-button @click="handleClose">关 闭</el-button>
+        <el-button type="primary" @click="sendMessage('1')">确 定</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import vueQr from 'vue-qr'
+import Treeselect from '@riophae/vue-treeselect'
+import { requestFN } from '@/utils/request'
+
+export default {
+  components: { Treeselect, vueQr },
+  props: {
+    appendToBody: {
+      type: Boolean,
+      default: false
+    }
+  },
+  data() {
+    return {
+      visible: false,
+      loading: false,
+      form: {
+        STATUS: null,
+        APPOINT_CORP_ID: '',
+        APPOINT_CORP_NAME: '',
+        APPOINT_DEPARTMENT_ID: null,
+        APPOINT_DEPARTMENT_NAME: '',
+        APPOINT_USER_ID: null,
+        APPOINT_USER_NAME: '',
+        OPINION: '',
+        user: '',
+        tm: new Date().getTime(),
+        list: [],
+        isShow: true,
+        info: {}
+      },
+      rules: {
+        STATUS: [
+          { required: true, message: '请选择是否通过', trigger: 'change' }
+        ],
+        APPOINT_DEPARTMENT_ID: [
+          { required: true, message: '请选择指定监管部门', trigger: 'change' }
+        ],
+        APPOINT_USER_ID: [
+          { required: true, message: '请选择指定监管部门审批人', trigger: 'change' }
+        ],
+        OPINION: [
+          { required: true, message: '请填写打回原因', trigger: 'change' }
+        ]
+      },
+      heirloom: {},
+
+      normalizer(node) {
+        return {
+          id: node.id,
+          label: node.name,
+          children: node.nodes
+        }
+      },
+
+      departmentTree: [],
+      peopleList: []
+    }
+  },
+  methods: {
+    async init(e) {
+      console.log(e)
+      this.loading = true
+      this.visible = true
+      this.heirloom = JSON.stringify(e)
+      this.form.list = JSON.stringify(e)
+      this.info = e[0]
+      if (this.info.FLOWS_TYPE === '0') {
+        if (this.info.FLOWS_STEP === 0) {
+          this.isShow = true
+          await this.getDepartmentTree()
+        } else {
+          this.isShow = false
+        }
+      } else {
+        this.isShow = true
+        await this.getCorpDepartmentTree()
+      }
+      this.loading = false
+    },
+    sendMessage(e) {
+      this.$refs.form.validate((valid) => {
+        if (!valid) {
+          this.$message.error('请填写完整信息')
+        } else {
+          requestFN('/xgf/user/approve', this.form)
+            .then((data) => {
+              this.$message.success('推送成功')
+              this.visible = false
+              this.$emit('refresh', '')
+            })
+            .catch((e) => {
+              console.log(e)
+            })
+        }
+      })
+    },
+    getDepartmentTree() {
+      return new Promise(resolve => {
+        requestFN(
+          '/department/listTree',
+          {}
+        ).then((data) => {
+          this.departmentTree = this.removeEmptyChildren(JSON.parse(data.zTreeNodes))
+          resolve(true)
+        }).catch((e) => {
+        })
+      })
+    },
+    getCorpDepartmentTree() {
+      return new Promise(resolve => {
+        requestFN(
+          '/openApi/corpDepartment/listTree',
+          {}
+        ).then((data) => {
+          this.departmentTree = this.removeEmptyChildren(JSON.parse(data.zTreeNodes))
+          resolve(true)
+        }).catch((e) => {
+        })
+      })
+    },
+    getPeopleList(e) {
+      this.form.APPOINT_DEPARTMENT_NAME = e.name
+      if (this.info.FLOWS_TYPE === '0') {
+        requestFN(
+          '/user/listAll',
+          {
+            DEPARTMENT_ID: e.id
+          }
+        ).then((data) => {
+          this.peopleList = data.userList
+        }).catch((e) => {
+          console.log(e)
+        })
+      } else {
+        requestFN(
+          '/user/listAllManageAndCorp',
+          {
+            DEPARTMENT_ID: e.id
+          }
+        ).then((data) => {
+          this.peopleList = data.userList
+        }).catch((e) => {
+          console.log(e)
+        })
+      }
+    },
+    chooseUser(e) {
+      const entity = JSON.parse(e)
+      this.form.APPOINT_USER_ID = entity.USER_ID
+      this.form.APPOINT_USER_NAME = entity.NAME
+    },
+
+    handleClose() {
+      this.form = {
+        STATUS: '',
+        APPOINT_DEPARTMENT_ID: null,
+        APPOINT_DEPARTMENT_NAME: '',
+        APPOINT_USER_ID: '',
+        APPOINT_USER_NAME: '',
+        user: '',
+        list: [],
+        tm: new Date().getTime()
+      }
+      this.visible = false
+    },
+    beforeClose() {
+      this.visible = false
+      this.form = {
+        STATUS: '',
+        APPOINT_DEPARTMENT_ID: null,
+        APPOINT_DEPARTMENT_NAME: '',
+        APPOINT_USER_ID: '',
+        APPOINT_USER_NAME: '',
+        user: '',
+        list: [],
+        tm: new Date().getTime()
+      }
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+</style>
diff --git a/src/views/xgf/flow/components/user.vue b/src/views/xgf/flow/components/user.vue
new file mode 100644
index 0000000..889dc08
--- /dev/null
+++ b/src/views/xgf/flow/components/user.vue
@@ -0,0 +1,250 @@
+<template>
+  <div>
+    <el-dialog :visible.sync="visible" :append-to-body="appendToBody" title="相关方安全告知培训合格证" width="370px">
+      <div v-for="item in peopleList" :key="item.CLASS_INFO_ID" style="height: 220px">
+        <div class="bg_table">
+          <div class="title">相关方安全告知培训合格证</div>
+          <div class="red">{{ item.CLASS_NO }}</div>
+          <table class="table">
+            <tr>
+              <td style="width: 120px">
+                <div class="text textone name">姓名</div>
+              </td>
+              <td style="width: 100px;">
+                <div class="text text1 tcenter">{{ item.NAME }}</div>
+              </td>
+              <td style="width: 86px">
+                <div class="text text2 tcenter">工种</div>
+              </td>
+              <td style="width: 148px;">
+                <div v-if="item.JOBS_TYPE" class="text tcenter ">{{ item.JOBS_TYPE }}</div>
+                <div v-else>暂无</div>
+              </td>
+              <td rowspan="4" style="width: 134px;">
+                <img v-if="!getShowPicture(item)" src="../../../../assets/images/peopleHead.png" alt="" style="width: 116px; height: 146px">
+                <img v-if="getShowPicture(item)" :src="config.fileUrl + item.PHOTO" alt="" style="width: 116px; height: 146px" @click="openPicture(config.fileUrl + item.PHOTO)">
+              </td>
+            </tr>
+            <tr>
+              <td>
+                <div class="text textone">资质</div>
+              </td>
+              <td colspan="3">
+                <div v-if="item.CERTIFICATE" class="text">{{ item.CERTIFICATE }}</div>
+                <div v-else>暂无</div>
+              </td>
+            </tr>
+            <tr>
+              <td>
+                <div class="text textone">培训时间</div>
+              </td>
+              <td colspan="3">
+                <div class="text">{{ item.OPENING_TIME }}</div>
+              </td>
+            </tr>
+            <tr>
+              <td>
+                <div class="text textone">有效期限</div>
+              </td>
+              <td colspan="3">
+                <div class="text">{{ item.VALIDITY_PERIOD_END }}</div>
+              </td>
+            </tr>
+            <tr>
+              <td>
+                <div class="text textone">所在单位</div>
+              </td>
+              <td colspan="3">
+                <div class="text">{{ item.DEPARTMENT_NAME }}</div>
+              </td>
+              <td rowspan="3" style="padding-top: 6px" @click="click(config.messageUrl + '?CLASS_INFO_ID=' + item.CLASS_INFO_ID)">
+                <vue-qr :text="config.messageUrl + '?CLASS_INFO_ID=' + item.CLASS_INFO_ID" :margin="0" :size="110" color-dark="#000" color-light="#fff"/>
+              </td>
+            </tr>
+            <tr>
+              <td>
+                <div class="text textone">身份证号</div>
+              </td>
+              <td colspan="3">
+                <div class="text">{{ item.CARD_ID }}</div>
+              </td>
+            </tr>
+            <tr>
+              <td>
+                <div class="text textone">手机</div>
+              </td>
+              <td colspan="3">
+                <div class="text">{{ item.PHONE }}</div>
+              </td>
+            </tr>
+          </table>
+        </div>
+      </div>
+    </el-dialog>
+    <QRCode ref="QRcode" append-to-body/>
+    <Picture ref="Picture" append-to-body/>
+  </div>
+</template>
+
+<script>
+import { requestFN } from '@/utils/request'
+import vueQr from 'vue-qr'
+import QRCode from './QRCode.vue'
+import Picture from './picture.vue'
+
+export default {
+  components: { QRCode, Picture, vueQr },
+  props: {
+    appendToBody: {
+      type: Boolean,
+      default: false
+    }
+  },
+  data() {
+    return {
+      config: config,
+      visible: false,
+      peopleList: [],
+      CLASS_MESSAGE_ID: '',
+      CLASS_INFO_ID: '',
+      USER_ID: '',
+      qrCodeStr: ''
+    }
+  },
+  methods: {
+    init(e) {
+      console.info(e)
+      if (e && e.CLASS_INFO_ID) {
+        this.CLASS_INFO_ID = e.CLASS_INFO_ID
+      }
+      if (e && e.CLASS_MESSAGE_ID) {
+        this.CLASS_MESSAGE_ID = e.CLASS_MESSAGE_ID
+      }
+      if (e && e.USER_ID) {
+        this.USER_ID = e.USER_ID
+      }
+      this.qrCodeStr = config.messageUrl + '?CLASS_INFO_ID=' + this.CLASS_INFO_ID
+      this.visible = true
+      this.getInfo()
+    },
+    getInfo() {
+      requestFN('/trainusers/getUserinfoList', {
+        CLASS_INFO_ID: this.CLASS_INFO_ID,
+        CLASS_MESSAGE_ID: this.CLASS_MESSAGE_ID,
+        USER_ID: this.USER_ID
+      })
+        .then((data) => {
+          this.peopleList = data.list
+        }).catch((e) => {
+          console.log(e)
+        })
+    },
+    getShowPicture(row) {
+      if (row.PHOTO && row.PHOTO !== '' && (row.PHOTO.indexOf('.jpg') >= 0 || row.PHOTO.indexOf('.png') >= 0 || row.PHOTO.indexOf('.jpeg') >= 0)) {
+        return true
+      }
+    },
+    click(e) {
+      this.$refs.QRcode.init({ qrCodeStr: e })
+    },
+    openPicture(src) {
+      this.$refs.Picture.init({ src: src })
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+
+.name{
+  width: 120px;
+  overflow: hidden;//溢出隐藏
+  white-space: nowrap; // 强制一行显示
+  text-overflow: ellipsis;// 显示。。。省略号
+}
+.red {
+  width: 660px;
+  color: #ff0000;
+  margin-left: 34px;
+  font-size: 24px;
+}
+
+.bg_table {
+  background: url("../../../../assets/tablebg.jpg") no-repeat bottom center;
+  background-size: 100%;
+  width: 660px;
+  height: 430px;
+  border: 4px solid #453d3a;
+  transform: scale(0.5);
+  transform-origin: top left;
+
+  .title {
+    font-size: 28px;
+    text-align: center;
+    margin-top: 34px;
+    font-weight: bold;
+    color: #000000;
+  }
+
+  .table {
+    border-collapse: collapse;
+    width: 590px;
+    color: #453d3a;
+    font-size: 20px;
+    margin: 34px;
+    text-align: left;
+    margin-top: 10px;
+
+    .tcenter {
+      text-align: center
+    }
+
+    .w60 {
+      width: 100px;
+    }
+
+    .w74 {
+      width: 148px
+    }
+
+    th, td {
+      border: 2px solid #453d3a;
+      text-align: left;
+      height: 40px;
+      padding: 0 16px;
+
+      box-sizing: border-box;
+
+      .textone {
+        width: 80px;
+        text-align: justify;
+        text-align-last: justify;
+        text-justify: distribute-all-lines;
+        margin: 0 auto;
+      }
+
+      .text1 {
+        width: 60px;
+        text-align: justify;
+        text-align-last: justify;
+        text-justify: distribute-all-lines;
+        margin: 0 auto;
+
+      }
+
+      .text2 {
+        width: 50px;
+        text-align: justify;
+        text-align-last: justify;
+        text-justify: distribute-all-lines;
+        margin: 0 auto;
+
+      }
+
+      .text {
+
+      }
+    }
+  }
+}
+</style>
diff --git a/src/views/xgf/flow/components/users.vue b/src/views/xgf/flow/components/users.vue
new file mode 100644
index 0000000..2d11653
--- /dev/null
+++ b/src/views/xgf/flow/components/users.vue
@@ -0,0 +1,513 @@
+<template>
+  <div class="app-container">
+    <el-dialog
+      v-if="visible"
+      :visible.sync="visible"
+      :before-close="handleClose"
+      :append-to-body="true"
+      title="申请详情"
+      width="60%">
+      <div class="level-title mt-20" style="display: flex;justify-content: space-between;">
+        <h1>申请信息</h1>
+      </div>
+      <table class="table-ui" style="margin-bottom: 20px;">
+        <tr>
+          <th style="width: 17%">申请人</th>
+          <td style="width: 17%">{{ pd.CREATOR }}</td>
+          <th style="width: 17%">申请时间</th>
+          <td style="width: 17%">{{ pd.CREATTIME }}</td>
+          <th style="width: 17%">备注</th>
+          <td style="width: 15%">{{ pd.DESCR }}</td>
+        </tr>
+        <tr>
+          <th style="width: 30px">安监部门</th>
+          <td style="width: 50px">{{ pd.SUPERVISION_DEPARTMENT_NAME }}</td>
+          <th style="width: 30px">审核人</th>
+          <td style="width: 50px">{{ pd.SUPERVISION_USER_NAME }}</td>
+          <th style="width: 30px">审核时间</th>
+          <td style="width: 50px">{{ pd.SUPERVISION_TIME }}</td>
+        </tr>
+        <tr>
+          <th>主管部门</th>
+          <td>{{ pd.MANAGER_DEPT_NAME }}</td>
+          <th>审核人</th>
+          <td>{{ pd.MANAGER_USER_NAME }}</td>
+          <th>审核时间</th>
+          <td>{{ pd.MANAGER_TIME }}</td>
+        </tr>
+        <tr>
+          <th>属地管理部门</th>
+          <td>{{ pd.TERRITORIALITY_DEPARTMENT_NAME }}</td>
+          <th>审核人</th>
+          <td>{{ pd.TERRITORIALITY_USER_NAME }}</td>
+          <th>审核时间</th>
+          <td>{{ pd.TERRITORIALITY_TIME }}</td>
+        </tr>
+        <tr v-if="pd.AUDIT_DESCR">
+          <th>股份公司意见</th>
+          <td colspan="5">{{ pd.AUDIT_DESCR }}</td>
+        </tr>
+        <tr v-if="pd.CORP_AUDIT_DESCR">
+          <th>分公司意见</th>
+          <td colspan="5">{{ pd.CORP_AUDIT_DESCR }}</td>
+        </tr>
+      </table>
+      <div class="level-title">
+        <h1>申请人员列表</h1>
+      </div>
+      <el-table ref="multipleTable" :data="userList" :header-cell-style="{'font-weight': 'bold','color': '#000'}" tooltip-effect="dark" border fit highlight-current-row>
+        <el-table-column type="selection" width="55" align="center" />
+        <el-table-column type="index" label="序号" width="50" align="center" />
+        <el-table-column prop="USERNAME" label="用户名" align="center" />
+        <el-table-column prop="NAME" label="姓名" align="center" />
+        <el-table-column prop="DEPARTMENT_NAME" label="部门" align="center" />
+        <el-table-column prop="STATE" label="审核状态" align="center" >
+          <template slot-scope="{row}">
+            <el-tag v-if="row.MANAGER_STATE === 0 || row.SUPERVISION_STATE === 0 || row.TERRITORIALITY_STATE === 0" type="danger">审核不通过</el-tag>
+            <el-tag v-else-if="row.MANAGER_STATE === 1 && row.SUPERVISION_STATE === 1 && row.TERRITORIALITY_STATE === 1" type="success">审核通过</el-tag>
+            <el-tag v-else type="success">待审核</el-tag>
+          </template>
+        </el-table-column>
+        <el-table-column label="操作" align="center" width="200" >
+          <template slot-scope="{row}">
+            <el-button type="primary" icon="el-icon-edit" size="mini" @click="handleShow(row.USER_ID)">查看</el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+      <div class="page-btn-group">
+        <div/>
+        <pagination :total="total" :page.sync="listQuery.page" :limit.sync="listQuery.limit" @pagination="getUserList" />
+      </div>
+      <div slot="footer" class="dialog-footer">
+        <el-button @click="closeWindow">关 闭</el-button>
+      </div>
+    </el-dialog>
+    <el-dialog
+      v-if="userInfoDialog"
+      :visible.sync="userInfoDialog"
+      :append-to-body="true"
+      title="查看"
+      width="60%">
+      <table class="table-ui" style="margin-bottom: 20px;">
+        <div class="level-title">
+          <h1>人员信息</h1>
+        </div>
+        <tr>
+          <th>照片</th>
+          <td>
+            <span v-if="imgUrl != ''">
+              <div class="img-flex">
+                <viewer>
+                  <img :src="imgUrl" width="40" height="40" style="object-fit: cover;">
+                </viewer>
+              </div>
+            </span>
+            <span v-else/>
+          </td>
+          <th>姓名</th>
+          <td>{{ userDetailForm.NAME }}</td>
+          <th>性别</th>
+          <td>{{ userDetailForm.SEX === '0' ? '男' : '女' }}</td>
+        </tr>
+        <tr>
+          <th>出生年月</th>
+          <td>{{ userDetailForm.DATE_OF_BIRTH }}</td>
+          <th>年龄</th>
+          <td>{{ userDetailForm.AGE }}</td>
+          <th>手机号</th>
+          <td>{{ userDetailForm.PHONE }}</td>
+        </tr>
+        <tr>
+          <th>身份证</th>
+          <td>{{ userDetailForm.CARD_ID }}</td>
+          <th>身份证照片</th>
+          <!--if条件不可删除-->
+          <td v-if="userCardIDPhotoFile.length>0" colspan="3">
+            <span>
+              <div class="img-flex">
+                <viewer>
+                  <img
+                    v-for="item in userCardIDPhotoFile"
+                    :src="config.fileUrl + item.FILEPATH"
+                    :key="item.IMGFILES_ID"
+                    width="40"
+                    height="40"
+                    style="object-fit: cover;">
+                </viewer>
+              </div>
+            </span>
+          </td>
+        </tr>
+
+        <tr>
+          <th>民族</th>
+          <td>{{ userDetailForm.minzuName ? userDetailForm.minzuName : '暂无信息' }}</td>
+          <th>婚姻状况</th>
+          <td>{{ userDetailForm.MARITALSTATUS === '0' ? '未婚' : '已婚' }}</td>
+          <th>政治面貌</th>
+          <td>{{ userDetailForm.zzName }} {{
+            userDetailForm.zzName == '中共党员' ? '入党时间' + userDetailForm.POLITICAL_TIME : ''
+          }}
+          </td>
+        </tr>
+
+        <tr>
+          <th>户口所在地</th>
+          <td>{{ userDetailForm.HKLOCAL ? userDetailForm.HKLOCAL : '暂无信息' }}</td>
+          <th>现住址</th>
+          <td>{{ userDetailForm.ADDRESS ? userDetailForm.ADDRESS : '暂无信息' }}</td>
+          <th>联系电话</th>
+          <td>{{ userDetailForm.PHONE }}</td>
+        </tr>
+        <tr>
+          <th>文化程度</th>
+          <td>{{ userDetailForm.DEGREE_OF_EDUCATION_NAME }}</td>
+          <th>岗位名称(工种)</th>
+          <td colspan="5">{{ userDetailForm.POST_ID }}</td>
+        </tr>
+        <tr>
+          <th>是否缴纳社保</th>
+          <td :colspan="userDetailForm.IS_SOCIAL === '1' ? '':5">{{ formatLabel(userDetailForm.IS_SOCIAL) }}</td>
+          <th v-if="userDetailForm.IS_SOCIAL === '1'">社会保障号码</th>
+          <td v-if="userDetailForm.IS_SOCIAL === '1'">{{ userDetailForm.SOCIAL_NUMBER }}</td>
+          <th v-if="userDetailForm.IS_SOCIAL === '1'">社保卡照片</th>
+          <td v-if="userDetailForm.IS_SOCIAL === '1'&& socialPhotoFile.length>0" colspan="3">
+            <span>
+              <div class="img-flex">
+                <viewer>
+                  <img
+                    v-for="item in socialPhotoFile"
+                    :src="config.fileUrl + item.FILEPATH"
+                    :key="item.IMGFILES_ID"
+                    width="40"
+                    height="40"
+                    style="object-fit: cover;">
+                </viewer>
+              </div>
+            </span>
+          </td>
+        </tr>
+        <tr>
+          <th>是否参加三级安全培训</th>
+          <td>{{ formatLabel(userDetailForm.IS_LEVEL_THREE) }}</td>
+          <th v-if="userDetailForm.IS_LEVEL_THREE == 1">三级安全培训照片</th>
+          <td v-if="userDetailForm.IS_LEVEL_THREE == 1 && photosOfLevel.length>0" colspan="5">
+            <span>
+              <div class="img-flex">
+                <viewer>
+                  <img
+                    v-for="item in photosOfLevel"
+                    :src="config.fileUrl + item.FILEPATH"
+                    :key="item.IMGFILES_ID"
+                    width="40"
+                    height="40"
+                    style="object-fit: cover;">
+                </viewer>
+              </div>
+            </span>
+          </td>
+        </tr>
+        <tr>
+          <th>是否缴纳保险</th>
+          <td>{{ formatLabel(userDetailForm.IS_BF) }}</td>
+          <th>是否特殊工种</th>
+          <td>{{ formatLabel(userDetailForm.IS_SPECIAL_JOB) }}</td>
+          <th>是否流动人员</th>
+          <td>{{ formatLabel(userDetailForm.ISFLOW) }}</td>
+        </tr>
+      </table>
+      <div class="level-title">
+        <h1>培训记录</h1>
+      </div>
+      <el-table
+        :data="trainRecordList"
+        :header-cell-style="{'font-weight': 'bold','color': '#000'}"
+        tooltip-effect="dark"
+        border
+        fit
+        highlight-current-row>
+        <el-table-column type="selection" width="55" align="center"/>
+        <el-table-column type="index" label="序号" width="50" align="center"/>
+        <el-table-column prop="CLASS_NAME" label="班级名称" align="center"/>
+        <el-table-column prop="OPENING_TIME" label="开班时间" align="center"/>
+        <el-table-column prop="TRAINING_TYPE_NAME" label="培训类型" align="center"/>
+        <el-table-column prop="PLACE_NAME" label="培训地点" align="center"/>
+        <el-table-column label="培训有效期" align="center">
+          <template slot-scope="{row}">
+            <span>{{ formatDate(row.VALIDITY_PERIOD_START) }} 至 {{ formatDate(row.VALIDITY_PERIOD_END) }}</span>
+          </template>
+        </el-table-column>
+      </el-table>
+      <div v-if="userDetailForm.IS_SPECIAL_JOB == '1'" class="level-title">
+        <h1>特种作业人员信息</h1>
+      </div>
+      <table v-for="(item,index) in specialUsersList" :key="index" class="table-ui" style="margin-bottom: 20px;">
+        <tr>
+          <th style="width: 150px">证书名称</th>
+          <td style="width: 150px">{{ item.CERTIFICATE }}</td>
+          <th style="width: 150px">作业类别</th>
+          <td style="width: 180px">{{ item.SPECIAL_TYPE_NAME }}</td>
+          <th style="width: 150px">操作项目</th>
+          <td>{{ item.OPERATION_TYPE_NAME }}</td>
+        </tr>
+        <tr>
+          <th>特种作业证书编号</th>
+          <td>{{ item.SPECIAL_NUMBER }}</td>
+          <th>发证机关</th>
+          <td colspan="3">{{ item.ISSUING_AUTHORITY }}</td>
+        </tr>
+        <tr>
+          <th>复审时间</th>
+          <td>{{ item.REVIEW_TIME }}</td>
+          <th>有效期</th>
+          <td colspan="3">{{ item.VALIDITY_TIME_START }} 至 {{ item.VALIDITY_TIME_END }}</td>
+        </tr>
+      </table>
+      <div
+        v-if="detailForm.SUPERVISION_STATE === 0 || detailForm.MANAGER_STATE === 0 || detailForm.TERRITORIALITY_STATE === 0"
+        class="level-title mt-20">
+        <h1>打回信息</h1>
+      </div>
+      <table
+        v-if="detailForm.SUPERVISION_STATE === 0 || detailForm.MANAGER_STATE === 0 || detailForm.TERRITORIALITY_STATE === 0"
+        class="table-ui"
+        style="margin-bottom: 20px;">
+        <tr>
+          <th>打回人</th>
+          <td v-if="detailForm.SUPERVISION_STATE === 0">{{ detailForm.SUPERVISION_USER_NAME }}</td>
+          <td v-if="detailForm.MANAGER_STATE === 0">{{ detailForm.MANAGER_USER_NAME }}</td>
+          <td
+            v-if="detailForm.TERRITORIALITY_STATE === 0 && detailForm.MANAGER_USER_NAME !== detailForm.TERRITORIALITY_USER_NAME">
+            {{ detailForm.TERRITORIALITY_USER_NAME }}
+          </td>
+          <th>打回原由</th>
+          <td v-if="detailForm.SUPERVISION_STATE === 0">{{ detailForm.SUPERVISION_OPINION }}</td>
+          <td v-if="detailForm.MANAGER_STATE === 0">{{ detailForm.MANAGER_OPINION }}</td>
+          <td
+            v-if="detailForm.TERRITORIALITY_STATE === 0 && detailForm.MANAGER_USER_NAME !== detailForm.TERRITORIALITY_USER_NAME">
+            {{ detailForm.TERRITORIALITY_OPINION }}
+          </td>
+        </tr>
+      </table>
+      <div slot="footer" class="dialog-footer">
+        <el-button @click="userInfoDialog = false">关 闭</el-button>
+      </div>
+    </el-dialog>
+    <el-dialog :visible.sync="QRCodeDialog" title="查看二维码" width="680px" class="top-dialog">
+      <div class="table-qrcode" style="text-align: center;padding-top: 30px;">
+        <vue-qr :text="qrcodeStr" :margin="0" :size="300" color-dark="#000" color-light="#fff" />
+      </div>
+      <div slot="footer" class="dialog-footer">
+        <el-button @click="QRCodeDialog = false">关 闭</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import Pagination from '@/components/Pagination' // 通过 el-pagination二次打包
+import { requestFN } from '@/utils/request'
+import vueQr from 'vue-qr'
+import dateformat from '@/utils/dateformat'
+import '@riophae/vue-treeselect/dist/vue-treeselect.css'
+export default {
+  components: {
+    Pagination,
+    vueQr
+  },
+  data() {
+    return {
+      config: config,
+      contractFileList: [], // 合同文件
+      insuranceFileList: [], // 保险文件
+      userInfoDialog: false,
+      QRCodeDialog: false,
+      qrcodeStr: '',
+      userDetailForm: {},
+      userEntryForm: {},
+      specialUsersList: {},
+      imgUrl: '',
+      wenhuachengduList: [], // 文化程度
+      userCardIDPhotoFile: [], // 身份证照片
+      postList: [], // 岗位名称
+      trainRecordList: [], // 培训记录
+      visible: false,
+      pd: {},
+      userList: [],
+      listQuery: {
+        page: 1,
+        limit: 10
+      },
+      total: 0,
+      photosOfLevel: []
+    }
+  },
+  methods: {
+    formatDate(date, column) {
+      if (date) {
+        return dateformat(date, 'YYYY-MM-DD')
+      } else {
+        return ''
+      }
+    },
+    init(e) {
+      if (e) {
+        this.pd = e
+      }
+      this.visible = true
+      this.userList = []
+      this.getDict()
+      this.getUserList()
+    },
+    // 获取数据字典数据
+    getDict: function() {
+      requestFN(
+        '/dictionaries/getLevels',
+        {
+          DICTIONARIES_ID: '1144b16d85f14b108ea7859e2be9d001'
+        }
+      ).then((data) => {
+        this.flowAreaList = data.list
+      }).catch((e) => {
+
+      })
+      requestFN(
+        'dictionaries/getLevels',
+        { DICTIONARIES_ID: 'd7d80f08d73a4accbccf4fd3d8d1d867' }
+      ).then((data) => {
+        this.wenhuachengduList = data.list
+      }).catch((e) => {
+        this.listLoading = false
+      })
+      requestFN(
+        'dictionaries/getLevels',
+        { DICTIONARIES_ID: '09e36ac01e9540f8bc84eab1c1a78754' }
+      ).then((data) => {
+        this.postList = data.list
+      }).catch((e) => {
+        this.listLoading = false
+      })
+    },
+
+    // 人员
+    getUserList() {
+      requestFN(
+        '/trainingbatch/batchUserList?showCount=' + this.listQuery.limit + '&currentPage=' + this.listQuery.page,
+        {
+          TRAININGBATCH_ID: this.pd.TRAININGBATCH_ID
+        }
+      ).then((data) => {
+        this.userList = data.varList
+        this.total = data.page.totalResult
+      }).catch((e) => {
+      })
+    },
+    // 二维码
+    showQRCode(id) {
+      this.QRCodeDialog = true
+      const arr = [{ USER_ID: id, CODE_TYPE: '1' }]
+      this.qrcodeStr = JSON.stringify(arr)
+    },
+    // 查看
+    async handleShow(USER_ID) {
+      await this.getUserInfoById(USER_ID)
+      await this.getOtherUserInfoById(USER_ID)
+      this.userInfoDialog = true
+    },
+    getUserInfoById(id) {
+      return new Promise((resolve, reject) => {
+        requestFN(
+          '/user/getFloatPersonDetailById',
+          {
+            USER_ID: id,
+            TRAININGBATCH_ID: this.pd.TRAININGBATCH_ID,
+            CORPINFO_ID: JSON.parse(sessionStorage.getItem('user')).CORPINFO_ID
+          }
+        ).then((data) => {
+          this.userDetailForm = Object.assign(this.userDetailForm, data.userDetail)
+          this.userEntryForm = Object.assign(this.userEntryForm, data.eCard)
+          if (this.userDetailForm.PHOTO) {
+            this.imgUrl = config.fileUrl + this.userDetailForm.PHOTO
+          }
+          this.trainRecordList = data.recordList
+          // this.insuranceFileList = data.insuranceFile
+          // this.contractFileList = data.contractFile
+          resolve()
+        }).catch((e) => {
+          reject()
+        })
+      })
+    },
+    getOtherUserInfoById(id) {
+      return new Promise((resolve, reject) => {
+        requestFN(
+          'user/getDetailByUserIdAndCorpInfoId',
+          {
+            USER_ID: id,
+            CORPINFO_ID: JSON.parse(sessionStorage.getItem('user')).CORPINFO_ID,
+            CER_TYPE: '7498057c4c1f4a11b9a960e66ea04a7a'
+          }
+        ).then((data) => {
+          Object.assign(this.userDetailForm, data.pd)
+          this.userPhotoFile = data.userPhotoFile
+          if (this.userPhotoFile.length > 0) {
+            this.imgUrl = config.fileUrl + this.userPhotoFile[0].FILEPATH
+          }
+          this.insuranceFileList = data.insuranceFile
+          this.specialUsersList = data.specialUsers
+          this.contractFileList = data.contractFile
+          this.userCardIDPhotoFile = data.userCardIDPhotoFile
+          this.socialPhotoFile = data.socialPhotoFile
+          this.gongshangbaoxianFile = data.gongshangbaoxianFile
+          resolve()
+        }).catch((e) => {
+          reject()
+        })
+      })
+    },
+    // 转换是否
+    formatLabel(value) {
+      if (value == '1') {
+        return '是'
+      } else if (value == '0') {
+        return '否'
+      } else {
+        return ''
+      }
+    },
+    // 转换字典数据
+    formatDictioariesLabel(value, type) {
+      var list = []
+      if (type == '0') {
+        list = this.wenhuachengduList
+      } else if (type == '1') {
+        list = this.postList
+      }
+      if (value) {
+        if (list.length > 0) {
+          var data = ''
+          for (let i = 0; i < list.length; i++) {
+            const obj = list[i]
+            if (value == obj.BIANMA) {
+              data = obj.NAME
+              break
+            }
+          }
+          return data
+        } else {
+          return value
+        }
+      } else {
+        return ''
+      }
+    },
+
+    handleClose() {
+      this.visible = false
+    },
+    closeWindow() {
+      this.handleClose()
+    }
+  }
+}
+</script>
diff --git a/src/views/xgf/flow/index.vue b/src/views/xgf/flow/index.vue
new file mode 100644
index 0000000..70cda6e
--- /dev/null
+++ b/src/views/xgf/flow/index.vue
@@ -0,0 +1,23 @@
+<template>
+  <component :is="activeName" />
+</template>
+
+<script>
+import List from './components/list'
+import Record from './components/record'
+export default {
+  components: {
+    List: List,
+    Record: Record
+  },
+  data() {
+    return {
+      activeName: 'List',
+      SUPERVISE_CORPINFO_ID: ''
+    }
+  }
+}
+</script>
+
+<style scoped>
+</style>

From cdbeacee285b970e235a5bad0a949636f9033de6 Mon Sep 17 00:00:00 2001
From: liujun <liujun@zcloudchina.com>
Date: Mon, 22 Jan 2024 16:38:42 +0800
Subject: [PATCH 03/11] =?UTF-8?q?=E8=8B=A5=E5=B9=B2bug=E4=BF=AE=E6=94=B9?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 src/views/xgf/flow/components/entrust.vue  | 189 +++++++++++++++++++++
 src/views/xgf/flow/components/list.vue     |  10 +-
 src/views/xgf/flow/components/sendUtil.vue |  50 ++----
 3 files changed, 210 insertions(+), 39 deletions(-)
 create mode 100644 src/views/xgf/flow/components/entrust.vue

diff --git a/src/views/xgf/flow/components/entrust.vue b/src/views/xgf/flow/components/entrust.vue
new file mode 100644
index 0000000..88f2e0c
--- /dev/null
+++ b/src/views/xgf/flow/components/entrust.vue
@@ -0,0 +1,189 @@
+<template>
+  <div>
+    <el-dialog v-loading = "loading" :visible.sync="visible" :append-to-body="appendToBody" :before-close="beforeClose" title="审批" width="1200px" destroy-on-close>
+      <el-form ref="form" :model="form" :rules="rules" label-width="200px" label-position="right" type="flex">
+        <el-row :gutter="12">
+          <el-col :span="12">
+            <el-form-item prop="APPOINT_DEPARTMENT_ID" label="指定监管部门:">
+              <Treeselect
+                :options="departmentTree"
+                :normalizer="normalizer"
+                v-model="form.APPOINT_DEPARTMENT_ID"
+                placeholder="请选择部门"
+                no-options-text="暂无数据"
+                no-children-text="暂无数据"
+                style="width: 100%;"
+                @select="getPeopleList($event)"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item prop="APPOINT_USER_ID" label="指定监管部门审批人:">
+              <el-select v-model="form.user" style="width: 300px" placeholder="请选择" @change="chooseUser">
+                <el-option v-for="item in peopleList" :key="item.USER_ID" :value="JSON.stringify(item)" :label="item.NAME"/>
+              </el-select>
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+
+      <div slot="footer" class="dialog-footer">
+        <el-button @click="handleClose">关 闭</el-button>
+        <el-button type="primary" @click="sendMessage('1')">确 定</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import vueQr from 'vue-qr'
+import Treeselect from '@riophae/vue-treeselect'
+import { requestFN } from '@/utils/request'
+
+export default {
+  components: { Treeselect, vueQr },
+  props: {
+    appendToBody: {
+      type: Boolean,
+      default: false
+    }
+  },
+  data() {
+    return {
+      visible: false,
+      loading: false,
+      form: {
+        STATUS: null,
+        APPOINT_CORP_ID: '',
+        APPOINT_CORP_NAME: '',
+        APPOINT_DEPARTMENT_ID: null,
+        APPOINT_DEPARTMENT_NAME: '',
+        APPOINT_USER_ID: null,
+        APPOINT_USER_NAME: '',
+        OPINION: '',
+        user: '',
+        tm: new Date().getTime(),
+        list: [],
+        isShow: true,
+        info: {}
+      },
+      rules: {
+        STATUS: [
+          { required: true, message: '请选择是否通过', trigger: 'change' }
+        ],
+        APPOINT_DEPARTMENT_ID: [
+          { required: true, message: '请选择指定监管部门', trigger: 'change' }
+        ],
+        APPOINT_USER_ID: [
+          { required: true, message: '请选择指定监管部门审批人', trigger: 'change' }
+        ],
+        OPINION: [
+          { required: true, message: '请填写打回原因', trigger: 'change' }
+        ]
+      },
+      heirloom: {},
+
+      normalizer(node) {
+        return {
+          id: node.id,
+          label: node.name,
+          children: node.nodes
+        }
+      },
+
+      departmentTree: [],
+      peopleList: []
+    }
+  },
+  methods: {
+    async init(e) {
+      console.log(e)
+      this.loading = true
+      this.visible = true
+      this.heirloom = JSON.stringify(e)
+      this.form.list = JSON.stringify(e)
+      this.getDepartmentTree()
+      this.loading = false
+    },
+    sendMessage(e) {
+      this.$refs.form.validate((valid) => {
+        if (!valid) {
+          this.$message.error('请填写完整信息')
+        } else {
+          requestFN('/xgf/user/approve', this.form)
+            .then((data) => {
+              this.$message.success('推送成功')
+              this.visible = false
+              this.$emit('refresh', '')
+            })
+            .catch((e) => {
+              console.log(e)
+            })
+        }
+      })
+    },
+    getDepartmentTree() {
+      return new Promise(resolve => {
+        requestFN(
+          '/corpDepartment/listTreeManageAndCorpHasOrder',
+          {}
+        ).then((data) => {
+          const treeData = this.listTransTree(JSON.parse(data.zTreeNodes), 'id', 'pId', 'nodes')
+          this.departmentTree = this.removeEmptyChildren(treeData)
+          resolve(true)
+        }).catch((e) => {
+          console.log(e)
+        })
+      })
+    },
+    getPeopleList(e) {
+      this.form.APPOINT_DEPARTMENT_NAME = e.name
+      requestFN(
+        '/user/listAllCorp',
+        {
+          DEPARTMENT_ID: e.id
+        }
+      ).then((data) => {
+        this.peopleList = data.userList
+      }).catch((e) => {
+        console.log(e)
+      })
+    },
+    chooseUser(e) {
+      const entity = JSON.parse(e)
+      this.form.APPOINT_USER_ID = entity.USER_ID
+      this.form.APPOINT_USER_NAME = entity.NAME
+    },
+
+    handleClose() {
+      this.form = {
+        STATUS: '',
+        APPOINT_DEPARTMENT_ID: null,
+        APPOINT_DEPARTMENT_NAME: '',
+        APPOINT_USER_ID: '',
+        APPOINT_USER_NAME: '',
+        user: '',
+        list: [],
+        tm: new Date().getTime()
+      }
+      this.visible = false
+    },
+    beforeClose() {
+      this.visible = false
+      this.form = {
+        STATUS: '',
+        APPOINT_DEPARTMENT_ID: null,
+        APPOINT_DEPARTMENT_NAME: '',
+        APPOINT_USER_ID: '',
+        APPOINT_USER_NAME: '',
+        user: '',
+        list: [],
+        tm: new Date().getTime()
+      }
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+</style>
diff --git a/src/views/xgf/flow/components/list.vue b/src/views/xgf/flow/components/list.vue
index 0c25b19..dcf0f3a 100644
--- a/src/views/xgf/flow/components/list.vue
+++ b/src/views/xgf/flow/components/list.vue
@@ -39,10 +39,11 @@
       <el-table-column prop="USERNAME" label="用户名" align="center"/>
       <el-table-column prop="NAME" label="姓名" align="center"/>
       <el-table-column prop="BELONG_TO_CORP_NAME" label="外派公司名称" align="center"/>
-      <el-table-column label="操作" align="center" width="250">
+      <el-table-column label="操作" align="center" width="350">
         <template slot-scope="{row}">
           <el-button type="primary" icon="el-icon-edit" size="mini" @click="handleShow(row)">详情</el-button>
           <el-button v-if="row.power_flag === '1'" type="primary" icon="el-icon-s-claim" size="mini" @click="approve([row])">审批</el-button>
+          <el-button v-if="row.power_flag === '1'" type="primary" icon="el-icon-s-claim" size="mini" @click="entrust([row])">委托制单单位审批</el-button>
           <el-button v-if="false" type="success" icon="el-icon-edit" size="mini" @click="getUserInfo(row)">电子合格证</el-button>
         </template>
       </el-table-column>
@@ -56,6 +57,7 @@
     <user ref="userInfo" append-to-body/>
     <user-info ref="userInfos" append-to-body/>
     <send-util ref="sendUtil" append-to-body @refresh="getList"/>
+    <entrust ref="entrust" append-to-body @refresh="getList"/>
   </div>
 </template>
 
@@ -68,9 +70,10 @@ import apply from './apply'
 import user from './user.vue'
 import SendUtil from './sendUtil.vue'
 import UserInfo from '../../flow_audit/userInfo.vue'
+import Entrust from './entrust.vue'
 
 export default {
-  components: { UserInfo, SendUtil, Pagination, apply, vueQr, user },
+  components: { Entrust, UserInfo, SendUtil, Pagination, apply, vueQr, user },
   directives: { waves },
   data() {
     return {
@@ -165,6 +168,9 @@ export default {
     approve(row) {
       this.$refs.sendUtil.init(row)
     },
+    entrust(row) {
+      this.$refs.entrust.init(row)
+    },
     getUserInfo(row) {
       this.$refs.userInfo.init(row)
     },
diff --git a/src/views/xgf/flow/components/sendUtil.vue b/src/views/xgf/flow/components/sendUtil.vue
index 5cf5078..655580d 100644
--- a/src/views/xgf/flow/components/sendUtil.vue
+++ b/src/views/xgf/flow/components/sendUtil.vue
@@ -12,7 +12,7 @@
             </el-form-item>
           </el-col>
           <el-col :span="12">
-            <el-form-item v-if="form.STATUS === '1' && isShow" prop="APPOINT_DEPARTMENT_ID" label="指定监管部门:">
+            <el-form-item v-if="form.STATUS === '1' " prop="APPOINT_DEPARTMENT_ID" label="指定监管部门:">
               <Treeselect
                 :options="departmentTree"
                 :normalizer="normalizer"
@@ -32,7 +32,7 @@
               <el-input v-model="form.OPINION" :rows="2" type="textarea" placeholder="填写审批意见"/>
             </el-form-item>
           </el-col>
-          <el-col v-if="form.STATUS === '1' && isShow" :span="12">
+          <el-col v-if="form.STATUS === '1' " :span="12">
             <el-form-item v-if="form.STATUS === '1'" prop="APPOINT_USER_ID" label="指定监管部门审批人:">
               <el-select v-model="form.user" style="width: 300px" placeholder="请选择" @change="chooseUser">
                 <el-option v-for="item in peopleList" :key="item.USER_ID" :value="JSON.stringify(item)" :label="item.NAME"/>
@@ -117,18 +117,7 @@ export default {
       this.visible = true
       this.heirloom = JSON.stringify(e)
       this.form.list = JSON.stringify(e)
-      this.info = e[0]
-      if (this.info.FLOWS_TYPE === '0') {
-        if (this.info.FLOWS_STEP === 0) {
-          this.isShow = true
-          await this.getDepartmentTree()
-        } else {
-          this.isShow = false
-        }
-      } else {
-        this.isShow = true
-        await this.getCorpDepartmentTree()
-      }
+      this.getDepartmentTree()
       this.loading = false
     },
     sendMessage(e) {
@@ -174,29 +163,16 @@ export default {
     },
     getPeopleList(e) {
       this.form.APPOINT_DEPARTMENT_NAME = e.name
-      if (this.info.FLOWS_TYPE === '0') {
-        requestFN(
-          '/user/listAll',
-          {
-            DEPARTMENT_ID: e.id
-          }
-        ).then((data) => {
-          this.peopleList = data.userList
-        }).catch((e) => {
-          console.log(e)
-        })
-      } else {
-        requestFN(
-          '/user/listAllManageAndCorp',
-          {
-            DEPARTMENT_ID: e.id
-          }
-        ).then((data) => {
-          this.peopleList = data.userList
-        }).catch((e) => {
-          console.log(e)
-        })
-      }
+      requestFN(
+        '/user/listAll',
+        {
+          DEPARTMENT_ID: e.id
+        }
+      ).then((data) => {
+        this.peopleList = data.userList
+      }).catch((e) => {
+        console.log(e)
+      })
     },
     chooseUser(e) {
       const entity = JSON.parse(e)

From 67358620385f48ce7e60da608a68ca43153bad15 Mon Sep 17 00:00:00 2001
From: liujun <liujun@zcloudchina.com>
Date: Mon, 22 Jan 2024 18:11:55 +0800
Subject: [PATCH 04/11] =?UTF-8?q?=E8=8B=A5=E5=B9=B2bug=E4=BF=AE=E6=94=B9?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 src/views/xgf/flow/components/list.vue     | 2 +-
 src/views/xgf/flow/components/sendUtil.vue | 6 ++++--
 2 files changed, 5 insertions(+), 3 deletions(-)

diff --git a/src/views/xgf/flow/components/list.vue b/src/views/xgf/flow/components/list.vue
index dcf0f3a..a96ceb0 100644
--- a/src/views/xgf/flow/components/list.vue
+++ b/src/views/xgf/flow/components/list.vue
@@ -43,7 +43,7 @@
         <template slot-scope="{row}">
           <el-button type="primary" icon="el-icon-edit" size="mini" @click="handleShow(row)">详情</el-button>
           <el-button v-if="row.power_flag === '1'" type="primary" icon="el-icon-s-claim" size="mini" @click="approve([row])">审批</el-button>
-          <el-button v-if="row.power_flag === '1'" type="primary" icon="el-icon-s-claim" size="mini" @click="entrust([row])">委托制单单位审批</el-button>
+          <el-button v-if="row.power_flag === '1' && row.FLOWS_STEP === 2" type="primary" icon="el-icon-s-claim" size="mini" @click="entrust([row])">委托制单单位审批</el-button>
           <el-button v-if="false" type="success" icon="el-icon-edit" size="mini" @click="getUserInfo(row)">电子合格证</el-button>
         </template>
       </el-table-column>
diff --git a/src/views/xgf/flow/components/sendUtil.vue b/src/views/xgf/flow/components/sendUtil.vue
index 655580d..a49a643 100644
--- a/src/views/xgf/flow/components/sendUtil.vue
+++ b/src/views/xgf/flow/components/sendUtil.vue
@@ -12,7 +12,7 @@
             </el-form-item>
           </el-col>
           <el-col :span="12">
-            <el-form-item v-if="form.STATUS === '1' " prop="APPOINT_DEPARTMENT_ID" label="指定监管部门:">
+            <el-form-item v-if="form.STATUS === '1' && !form.STEP" prop="APPOINT_DEPARTMENT_ID" label="指定监管部门:">
               <Treeselect
                 :options="departmentTree"
                 :normalizer="normalizer"
@@ -32,7 +32,7 @@
               <el-input v-model="form.OPINION" :rows="2" type="textarea" placeholder="填写审批意见"/>
             </el-form-item>
           </el-col>
-          <el-col v-if="form.STATUS === '1' " :span="12">
+          <el-col v-if="form.STATUS === '1' && !form.STEP " :span="12">
             <el-form-item v-if="form.STATUS === '1'" prop="APPOINT_USER_ID" label="指定监管部门审批人:">
               <el-select v-model="form.user" style="width: 300px" placeholder="请选择" @change="chooseUser">
                 <el-option v-for="item in peopleList" :key="item.USER_ID" :value="JSON.stringify(item)" :label="item.NAME"/>
@@ -76,6 +76,7 @@ export default {
         APPOINT_USER_ID: null,
         APPOINT_USER_NAME: '',
         OPINION: '',
+        STEP: false,
         user: '',
         tm: new Date().getTime(),
         list: [],
@@ -117,6 +118,7 @@ export default {
       this.visible = true
       this.heirloom = JSON.stringify(e)
       this.form.list = JSON.stringify(e)
+      this.form.STEP = (e[0].FLOWS_STEP === 3)
       this.getDepartmentTree()
       this.loading = false
     },

From 6b7f02e67047256abc460ae1684756b7035356eb Mon Sep 17 00:00:00 2001
From: liujun <liujun@zcloudchina.com>
Date: Mon, 22 Jan 2024 18:47:25 +0800
Subject: [PATCH 05/11] =?UTF-8?q?=E8=8B=A5=E5=B9=B2bug=E4=BF=AE=E6=94=B9?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 src/views/xgf/flow/components/entrust.vue | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/src/views/xgf/flow/components/entrust.vue b/src/views/xgf/flow/components/entrust.vue
index 88f2e0c..799927c 100644
--- a/src/views/xgf/flow/components/entrust.vue
+++ b/src/views/xgf/flow/components/entrust.vue
@@ -65,7 +65,8 @@ export default {
         tm: new Date().getTime(),
         list: [],
         isShow: true,
-        info: {}
+        info: {},
+        entrustFlag: '1'
       },
       rules: {
         STATUS: [

From 64418d7031225095b6b55968ce248186ce71cd2f Mon Sep 17 00:00:00 2001
From: liujun <liujun@zcloudchina.com>
Date: Tue, 23 Jan 2024 17:22:38 +0800
Subject: [PATCH 06/11] =?UTF-8?q?=E8=8B=A5=E5=B9=B2bug=E4=BF=AE=E6=94=B9?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../xgf/peopleList/components/QRCode.vue      |  36 ++
 src/views/xgf/peopleList/components/apply.vue | 320 +++++++++++
 .../xgf/peopleList/components/entrust.vue     | 190 +++++++
 src/views/xgf/peopleList/components/list.vue  | 247 +++++++++
 .../xgf/peopleList/components/picture.vue     |  36 ++
 .../xgf/peopleList/components/record.vue      | 198 +++++++
 .../xgf/peopleList/components/sendUtil.vue    | 216 ++++++++
 src/views/xgf/peopleList/components/user.vue  | 250 +++++++++
 src/views/xgf/peopleList/components/users.vue | 513 ++++++++++++++++++
 src/views/xgf/peopleList/index.vue            |  23 +
 10 files changed, 2029 insertions(+)
 create mode 100644 src/views/xgf/peopleList/components/QRCode.vue
 create mode 100644 src/views/xgf/peopleList/components/apply.vue
 create mode 100644 src/views/xgf/peopleList/components/entrust.vue
 create mode 100644 src/views/xgf/peopleList/components/list.vue
 create mode 100644 src/views/xgf/peopleList/components/picture.vue
 create mode 100644 src/views/xgf/peopleList/components/record.vue
 create mode 100644 src/views/xgf/peopleList/components/sendUtil.vue
 create mode 100644 src/views/xgf/peopleList/components/user.vue
 create mode 100644 src/views/xgf/peopleList/components/users.vue
 create mode 100644 src/views/xgf/peopleList/index.vue

diff --git a/src/views/xgf/peopleList/components/QRCode.vue b/src/views/xgf/peopleList/components/QRCode.vue
new file mode 100644
index 0000000..297e138
--- /dev/null
+++ b/src/views/xgf/peopleList/components/QRCode.vue
@@ -0,0 +1,36 @@
+<template>
+  <div>
+    <el-dialog :visible.sync="visible" :append-to-body="appendToBody" title="相关方安全告知培训合格证" width="370px" destroy-on-close	>
+      <vue-qr :text="qrCodeStr" :margin="0" :size="320" color-dark="#000" color-light="#fff"/>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import vueQr from 'vue-qr'
+
+export default {
+  components: { vueQr },
+  props: {
+    appendToBody: {
+      type: Boolean,
+      default: false
+    }
+  },
+  data() {
+    return {
+      visible: false,
+      qrCodeStr: ''
+    }
+  },
+  methods: {
+    init(e) {
+      this.visible = true
+      this.qrCodeStr = e.qrCodeStr
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+</style>
diff --git a/src/views/xgf/peopleList/components/apply.vue b/src/views/xgf/peopleList/components/apply.vue
new file mode 100644
index 0000000..199811d
--- /dev/null
+++ b/src/views/xgf/peopleList/components/apply.vue
@@ -0,0 +1,320 @@
+<template>
+  <el-dialog
+    v-if="visible"
+    :visible.sync="visible"
+    :before-close="handleClose"
+    :append-to-body="true"
+    title="培训申请"
+    width="60%">
+    <el-form ref="form" :model="form" :rules="rules" label-width="120px">
+      <el-row>
+        <el-col :span="12">
+          <el-form-item
+            prop="TERRITORIALITY"
+            label="集团单位 "
+          >
+            <Treeselect
+              :options="jituanDanweiTreeData"
+              :normalizer="normalizer"
+              v-model="form.TERRITORIALITY"
+              placeholder="请选择集团单位 "
+              no-options-text="暂无数据"
+              no-children-text="暂无数据"
+              style="width: 100%;"
+              @select="getUserList($event)"
+            />
+          </el-form-item>
+        </el-col>
+
+        <el-col :span="12">
+          <el-form-item
+            prop="TERRITORIALITY_USER_ID"
+            label="审核人员"
+          >
+            <div style="display:flex;justify-content: space-between;align-items: flex-start;">
+              <el-select v-model="form.TERRITORIALITY_USER_ID">
+                <el-option
+                  v-for="item in companyUserList"
+                  :key="item.USER_ID"
+                  :label="item.NAME"
+                  :value="item.USER_ID"/>
+              </el-select>
+            </div>
+          </el-form-item>
+        </el-col>
+      </el-row>
+
+      <el-row>
+        <el-col :span="12">
+          <el-form-item
+            prop="MANAGER"
+            label="主管部门"
+          >
+            <Treeselect
+              :options="treeData"
+              :normalizer="normalizer"
+              v-model="form.MANAGER"
+              :disabled="true"
+              placeholder="请选择主管部门"
+              no-options-text="暂无数据"
+              no-children-text="暂无数据"
+              style="width: 100%;"
+              @select="getmanagerUserList($event)"
+            />
+          </el-form-item>
+        </el-col>
+
+        <el-col :span="12">
+          <el-form-item
+            prop="MANAGER_USER_ID"
+            label="审核人员"
+          >
+            <div style="display:flex;justify-content: space-between;align-items: flex-start;">
+              <el-select v-model="form.MANAGER_USER_ID">
+                <el-option
+                  v-for="item in managercompanyUserList"
+                  :key="item.USER_ID"
+                  :label="item.NAME"
+                  :value="item.USER_ID"/>
+              </el-select>
+            </div>
+          </el-form-item>
+        </el-col>
+      </el-row>
+      <el-row>
+        <el-col :span="12">
+          <el-form-item
+            prop="SUPERVISION"
+            label="安监部门"
+          >
+            <Treeselect
+              :options="treeData"
+              :normalizer="normalizer"
+              v-model="form.SUPERVISION"
+              :disabled="true"
+              placeholder="请选择安监部门"
+              no-options-text="暂无数据"
+              no-children-text="暂无数据"
+              style="width: 100%;"
+            />
+          </el-form-item>
+        </el-col>
+
+        <el-col :span="12">
+          <el-form-item
+            prop="SUPERVISION_USER_ID"
+            label="审核人员"
+          >
+            <div style="display:flex;justify-content: space-between;align-items: flex-start;">
+              <el-select v-model="form.SUPERVISION_USER_ID">
+                <el-option v-for="item in userList" :key="item.USER_ID" :label="item.NAME" :value="item.USER_ID"/>
+              </el-select>
+            </div>
+          </el-form-item>
+        </el-col>
+      </el-row>
+
+      <el-row>
+        <el-col :span="24">
+          <el-form-item label="备注">
+            <el-input :rows="3" v-model="form.DESCR" type="textarea" placeholder="这里输入备注..."/>
+          </el-form-item>
+        </el-col>
+      </el-row>
+    </el-form>
+
+    <div slot="footer" class="dialog-footer">
+      <el-button @click="closeWindow">取 消</el-button>
+      <el-button :loading="loading" type="primary" @click="save">确 定</el-button>
+    </div>
+  </el-dialog>
+</template>
+
+<script>
+import { requestFN } from '@/utils/request'
+import Treeselect from '@riophae/vue-treeselect'
+import '@riophae/vue-treeselect/dist/vue-treeselect.css'
+
+export default {
+  components: {
+    Treeselect
+  },
+  props: {
+    corpInfo: {
+      type: String,
+      default: ''
+    }
+  },
+  data() {
+    return {
+      visible: false,
+      loading: false,
+      treeData: [],
+      companyTreeData: [],
+      corpinfo: {},
+      userList: [],
+      companyUserList: [],
+      managercompanyUserList: [],
+      jituanDanwei: '',
+      jituanDanweiTreeData: [],
+      normalizer(node) {
+        return {
+          id: node.id,
+          label: node.name,
+          children: node.nodes
+        }
+      },
+      form: {},
+      rules: {
+        // SUPERVISION: [{ required: true, message: '安监部门不能为空', trigger: 'blur' }],
+        SUPERVISION_USER_ID: [{ required: true, message: '审核人员不能为空', trigger: 'blur' }],
+        MANAGER: [{ required: true, message: '主管部门不能为空', trigger: 'blur' }],
+        MANAGER_USER_ID: [{ required: true, message: '审核人员不能为空', trigger: 'blur' }],
+        TERRITORIALITY: [{ required: true, message: '属地管理部门不能为空', trigger: 'blur' }],
+        TERRITORIALITY_USER_ID: [{ required: true, message: '审核人员不能为空', trigger: 'blur' }]
+      }
+    }
+  },
+  methods: {
+    async init(e) {
+      if (e) {
+        this.users = e
+      }
+      this.visible = true
+      this.loading = false
+      this.form = {}
+      /**
+       * 获取相关方的 集团单位  corpinfo/getDataForEditByCorpInfoId
+       * 根据集团单位 找到 对应的 企业id
+       */
+      await this.getCorpinfo()
+    },
+    getCorpinfo() {
+      requestFN(
+        '/corpinfo/getDataForEditByCorpInfoId',
+        {
+          CORPINFO_ID: JSON.parse(sessionStorage.getItem('user')).CORPINFO_ID,
+          tm: new Date().getTime()
+        }
+      ).then((data) => {
+        this.corpinfo = data.pd
+        // 河港机械	jtdw002  1e6dbbe16004402f8d2c0e52afd9a676
+        // 河港港工	jtdw003  3a854eefa7894e06aaa1a2611bca80f6
+        // 河港检测	jtdw004  020578a4c1f04bc692ee25145c2efbe5
+        // 方宇物业	jtdw005 90966974de3c4b83aca6f8fd6432d5c2
+
+        if (data.pd.CORP_TYPE == 'jtdw002') {
+          this.jituanDanwei = '1e6dbbe16004402f8d2c0e52afd9a676'
+        }
+        if (data.pd.CORP_TYPE == 'jtdw003') {
+          this.jituanDanwei = '3a854eefa7894e06aaa1a2611bca80f6'
+        }
+        if (data.pd.CORP_TYPE == 'jtdw004') {
+          this.jituanDanwei = '020578a4c1f04bc692ee25145c2efbe5'
+        }
+        if (data.pd.CORP_TYPE == 'jtdw005') {
+          this.jituanDanwei = '90966974de3c4b83aca6f8fd6432d5c2'
+        }
+        this.getTreeData()
+      })
+    },
+    // 获得部门树
+    getTreeData() {
+      requestFN(
+        '/regulatoryApi/department/listTree',
+        {}
+      ).then((data) => {
+        this.treeData = JSON.parse(data.zTreeNodes)
+        // 必须指定【股份-安全监督部】
+        this.form.SUPERVISION = 'c31058273a2d40f9b83dd8e5ae3a723c'
+        this.form.MANAGER = this.corpinfo.MAIN_DEPARTMENT
+        this.getRegulatoryUserList(this.form.SUPERVISION)
+        this.getmanagerUserList(this.corpinfo.MAIN_DEPARTMENT)
+      }).catch((e) => {
+        console.log(e)
+      })
+
+      if (this.jituanDanwei) {
+        requestFN(
+          '/companyApi/department/listTree',
+          { CORPINFO_ID: this.jituanDanwei }
+        ).then((data) => {
+          this.jituanDanweiTreeData = JSON.parse(data.zTreeNodes)
+        }).catch((e) => {
+        })
+      }
+    },
+    getRegulatoryUserList(DEPARTMENT_ID) {
+      requestFN(
+        '/regulatoryApi/user/listAll',
+        {
+          DEPARTMENT_ID: DEPARTMENT_ID,
+          ISASSESS: '1'
+        }
+      ).then((data) => {
+        this.userList = data.userList
+      }).catch((e) => {
+      })
+    },
+    // 人员
+    getUserList({ id: DEPARTMENT_ID }) {
+      requestFN(
+        '/companyApi/user/listAll',
+        {
+          DEPARTMENT_ID
+        }
+      ).then((data) => {
+        this.companyUserList = data.userList
+      }).catch((e) => {
+      })
+    },
+    getmanagerUserList(DEPARTMENT_ID) {
+      requestFN(
+        '/regulatoryApi/user/listAll',
+        {
+          DEPARTMENT_ID: DEPARTMENT_ID
+        }
+      ).then((data) => {
+        this.managercompanyUserList = data.userList
+      }).catch((e) => {
+      })
+    },
+
+    save() {
+      this.$refs.form.validate(valid => {
+        if (valid) {
+          this.loading = true
+          this.form.USER_COUNT = this.users.length
+          this.form.AUDIT_STATUS = 0
+          this.form.TYPE = 2
+          requestFN(
+            '/trainingbatch/add',
+            {
+              ...this.form,
+              users: this.users.join(',')
+            }
+          ).then((data) => {
+            this.loading = false
+            this.$message({
+              message: '申请成功',
+              type: 'success'
+            })
+            this.handleClose()
+          }).catch((e) => {
+            this.listLoading = false
+          })
+        } else {
+          return false
+        }
+      })
+    },
+    handleClose() {
+      this.visible = false
+      this.$emit('finish', '')
+    },
+    closeWindow() {
+      this.handleClose()
+    }
+  }
+}
+</script>
diff --git a/src/views/xgf/peopleList/components/entrust.vue b/src/views/xgf/peopleList/components/entrust.vue
new file mode 100644
index 0000000..799927c
--- /dev/null
+++ b/src/views/xgf/peopleList/components/entrust.vue
@@ -0,0 +1,190 @@
+<template>
+  <div>
+    <el-dialog v-loading = "loading" :visible.sync="visible" :append-to-body="appendToBody" :before-close="beforeClose" title="审批" width="1200px" destroy-on-close>
+      <el-form ref="form" :model="form" :rules="rules" label-width="200px" label-position="right" type="flex">
+        <el-row :gutter="12">
+          <el-col :span="12">
+            <el-form-item prop="APPOINT_DEPARTMENT_ID" label="指定监管部门:">
+              <Treeselect
+                :options="departmentTree"
+                :normalizer="normalizer"
+                v-model="form.APPOINT_DEPARTMENT_ID"
+                placeholder="请选择部门"
+                no-options-text="暂无数据"
+                no-children-text="暂无数据"
+                style="width: 100%;"
+                @select="getPeopleList($event)"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item prop="APPOINT_USER_ID" label="指定监管部门审批人:">
+              <el-select v-model="form.user" style="width: 300px" placeholder="请选择" @change="chooseUser">
+                <el-option v-for="item in peopleList" :key="item.USER_ID" :value="JSON.stringify(item)" :label="item.NAME"/>
+              </el-select>
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+
+      <div slot="footer" class="dialog-footer">
+        <el-button @click="handleClose">关 闭</el-button>
+        <el-button type="primary" @click="sendMessage('1')">确 定</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import vueQr from 'vue-qr'
+import Treeselect from '@riophae/vue-treeselect'
+import { requestFN } from '@/utils/request'
+
+export default {
+  components: { Treeselect, vueQr },
+  props: {
+    appendToBody: {
+      type: Boolean,
+      default: false
+    }
+  },
+  data() {
+    return {
+      visible: false,
+      loading: false,
+      form: {
+        STATUS: null,
+        APPOINT_CORP_ID: '',
+        APPOINT_CORP_NAME: '',
+        APPOINT_DEPARTMENT_ID: null,
+        APPOINT_DEPARTMENT_NAME: '',
+        APPOINT_USER_ID: null,
+        APPOINT_USER_NAME: '',
+        OPINION: '',
+        user: '',
+        tm: new Date().getTime(),
+        list: [],
+        isShow: true,
+        info: {},
+        entrustFlag: '1'
+      },
+      rules: {
+        STATUS: [
+          { required: true, message: '请选择是否通过', trigger: 'change' }
+        ],
+        APPOINT_DEPARTMENT_ID: [
+          { required: true, message: '请选择指定监管部门', trigger: 'change' }
+        ],
+        APPOINT_USER_ID: [
+          { required: true, message: '请选择指定监管部门审批人', trigger: 'change' }
+        ],
+        OPINION: [
+          { required: true, message: '请填写打回原因', trigger: 'change' }
+        ]
+      },
+      heirloom: {},
+
+      normalizer(node) {
+        return {
+          id: node.id,
+          label: node.name,
+          children: node.nodes
+        }
+      },
+
+      departmentTree: [],
+      peopleList: []
+    }
+  },
+  methods: {
+    async init(e) {
+      console.log(e)
+      this.loading = true
+      this.visible = true
+      this.heirloom = JSON.stringify(e)
+      this.form.list = JSON.stringify(e)
+      this.getDepartmentTree()
+      this.loading = false
+    },
+    sendMessage(e) {
+      this.$refs.form.validate((valid) => {
+        if (!valid) {
+          this.$message.error('请填写完整信息')
+        } else {
+          requestFN('/xgf/user/approve', this.form)
+            .then((data) => {
+              this.$message.success('推送成功')
+              this.visible = false
+              this.$emit('refresh', '')
+            })
+            .catch((e) => {
+              console.log(e)
+            })
+        }
+      })
+    },
+    getDepartmentTree() {
+      return new Promise(resolve => {
+        requestFN(
+          '/corpDepartment/listTreeManageAndCorpHasOrder',
+          {}
+        ).then((data) => {
+          const treeData = this.listTransTree(JSON.parse(data.zTreeNodes), 'id', 'pId', 'nodes')
+          this.departmentTree = this.removeEmptyChildren(treeData)
+          resolve(true)
+        }).catch((e) => {
+          console.log(e)
+        })
+      })
+    },
+    getPeopleList(e) {
+      this.form.APPOINT_DEPARTMENT_NAME = e.name
+      requestFN(
+        '/user/listAllCorp',
+        {
+          DEPARTMENT_ID: e.id
+        }
+      ).then((data) => {
+        this.peopleList = data.userList
+      }).catch((e) => {
+        console.log(e)
+      })
+    },
+    chooseUser(e) {
+      const entity = JSON.parse(e)
+      this.form.APPOINT_USER_ID = entity.USER_ID
+      this.form.APPOINT_USER_NAME = entity.NAME
+    },
+
+    handleClose() {
+      this.form = {
+        STATUS: '',
+        APPOINT_DEPARTMENT_ID: null,
+        APPOINT_DEPARTMENT_NAME: '',
+        APPOINT_USER_ID: '',
+        APPOINT_USER_NAME: '',
+        user: '',
+        list: [],
+        tm: new Date().getTime()
+      }
+      this.visible = false
+    },
+    beforeClose() {
+      this.visible = false
+      this.form = {
+        STATUS: '',
+        APPOINT_DEPARTMENT_ID: null,
+        APPOINT_DEPARTMENT_NAME: '',
+        APPOINT_USER_ID: '',
+        APPOINT_USER_NAME: '',
+        user: '',
+        list: [],
+        tm: new Date().getTime()
+      }
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+</style>
diff --git a/src/views/xgf/peopleList/components/list.vue b/src/views/xgf/peopleList/components/list.vue
new file mode 100644
index 0000000..a96ceb0
--- /dev/null
+++ b/src/views/xgf/peopleList/components/list.vue
@@ -0,0 +1,247 @@
+<template>
+  <div class="app-container">
+    <el-form label-width="130px">
+      <el-row>
+        <el-col :span="6">
+          <el-form-item label="用户名">
+            <el-input v-model="KEYWORDS" placeholder="请输入用户名"/>
+          </el-form-item>
+        </el-col>
+        <el-col v-if="false" :span="6">
+          <el-form-item label="培训状态">
+            <el-select v-model="STATUS" placeholder="请选择培训状态" style="width: 100%;" clearable>
+              <el-option v-for="item in statusList" :key="item.value" :label="item.label" :value="item.value"/>
+            </el-select>
+          </el-form-item>
+        </el-col>
+        <el-col :span="6">
+          <el-form-item label-width="10px">
+            <el-button v-waves class="filter-item" type="primary" icon="el-icon-search" @click="getQuery">
+              搜索
+            </el-button>
+            <el-button v-waves class="filter-item" type="success" icon="el-icon-refresh" @click="goKeyReset">
+              重置
+            </el-button>
+          </el-form-item>
+        </el-col>
+      </el-row>
+    </el-form>
+    <el-table
+      ref="multipleTable"
+      :data="varList"
+      :header-cell-style="{'font-weight': 'bold','color': '#000'}"
+      tooltip-effect="dark"
+      border
+      fit
+      highlight-current-row>
+      <el-table-column :selectable="handleSelectWithDifferentStatus" type="selection" width="55" align="center"/>
+      <el-table-column type="index" label="序号" width="50" align="center"/>
+      <el-table-column prop="USERNAME" label="用户名" align="center"/>
+      <el-table-column prop="NAME" label="姓名" align="center"/>
+      <el-table-column prop="BELONG_TO_CORP_NAME" label="外派公司名称" align="center"/>
+      <el-table-column label="操作" align="center" width="350">
+        <template slot-scope="{row}">
+          <el-button type="primary" icon="el-icon-edit" size="mini" @click="handleShow(row)">详情</el-button>
+          <el-button v-if="row.power_flag === '1'" type="primary" icon="el-icon-s-claim" size="mini" @click="approve([row])">审批</el-button>
+          <el-button v-if="row.power_flag === '1' && row.FLOWS_STEP === 2" type="primary" icon="el-icon-s-claim" size="mini" @click="entrust([row])">委托制单单位审批</el-button>
+          <el-button v-if="false" type="success" icon="el-icon-edit" size="mini" @click="getUserInfo(row)">电子合格证</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    <div class="page-btn-group">
+      <div>
+        <el-button v-if="false" type="primary" icon="el-icon-plus" @click="handleAdd">批量同意</el-button>
+      </div>
+      <pagination :total="total" :page.sync="listQuery.page" :limit.sync="listQuery.limit" @pagination="getList"/>
+    </div>
+    <user ref="userInfo" append-to-body/>
+    <user-info ref="userInfos" append-to-body/>
+    <send-util ref="sendUtil" append-to-body @refresh="getList"/>
+    <entrust ref="entrust" append-to-body @refresh="getList"/>
+  </div>
+</template>
+
+<script>
+import Pagination from '@/components/Pagination' // 通过 el-pagination二次打包
+import { requestFN } from '@/utils/request'
+import waves from '@/directive/waves' // waves directive
+import vueQr from 'vue-qr'
+import apply from './apply'
+import user from './user.vue'
+import SendUtil from './sendUtil.vue'
+import UserInfo from '../../flow_audit/userInfo.vue'
+import Entrust from './entrust.vue'
+
+export default {
+  components: { Entrust, UserInfo, SendUtil, Pagination, apply, vueQr, user },
+  directives: { waves },
+  data() {
+    return {
+      config: config,
+      QRCodeDialog: false,
+      qrcodeStr: '',
+      userDetailForm: {},
+      specialUsersList: {},
+      detailForm: {},
+      userEntryForm: {},
+      imgUrl: '',
+      SUPERVISE_CORPINFO_ID: '',
+      wenhuachengduList: [], // 文化程度
+      postList: [], // 岗位名称
+      photosOfLevel: [], // 三级教育照片
+      trainRecordList: [], // 培训记录
+      contractFileList: [], // 合同文件
+      insuranceFileList: [], // 保险文件
+      gongshangbaoxianFile: [],
+      userPhotoFile: [], // 头像
+      userCardIDPhotoFile: [], // 身份证照片
+      socialPhotoFile: [], // 身份证照片
+      listQuery: {
+        page: 1,
+        limit: 10
+      },
+      total: 0,
+      varList: [],
+      KEYWORDS: '',
+      statusList: [{ value: 0, label: '未培训' }, { value: 1, label: '培训中' }, {
+        value: 2,
+        label: '已培训(合格)'
+      }, { value: 3, label: '已培训(不合格)' }, { value: 9, label: '申请中' }],
+      STATUS: '',
+      add: false,		// 新增按钮
+      del: false,		// 删除按钮
+      edit: false	// 修改按钮
+    }
+  },
+  created() {
+    this.getDict()
+    this.getList()
+    this.hasButton()
+  },
+  methods: {
+    handleSelectWithDifferentStatus(row, rowIndex) {
+      if (row.STATUS === 0) {
+        // 不禁用
+        return true
+      } else {
+        // 禁用
+        return false
+      }
+    },
+    getQuery() {
+      if (this.$refs.multipleTable) {
+        this.$refs.multipleTable.clearSelection()
+      }
+      this.listQuery = {
+        page: 1,
+        limit: 10
+      }
+      this.getList()
+    },
+    goKeyReset() {
+      this.KEYWORDS = ''
+      this.STATUS = ''
+      this.getQuery()
+    },
+    getList() {
+      this.listLoading = true
+      requestFN(
+        '/xgf/user/getAppointApproveList?showCount=' + this.listQuery.limit + '&currentPage=' + this.listQuery.page,
+        {
+          KEYWORDS: this.KEYWORDS,
+          STATUS: '1',
+          EMPLOY_FLAG: '1',
+          CHECK_STATUS: '1'
+        }
+      ).then((data) => {
+        this.listLoading = false
+        this.varList = data.list
+        this.total = data.page.totalResult
+      })
+        .catch((e) => {
+          this.listLoading = false
+        })
+    },
+    handleShow(row) {
+      this.$refs.userInfos.init(row)
+    },
+    approve(row) {
+      this.$refs.sendUtil.init(row)
+    },
+    entrust(row) {
+      this.$refs.entrust.init(row)
+    },
+    getUserInfo(row) {
+      this.$refs.userInfo.init(row)
+    },
+    handleAdd() {
+      const _selectData = this.$refs.multipleTable.selection
+      if (_selectData == null || _selectData.length == 0) {
+        this.$message({
+          message: '未勾选培训人员...',
+          type: 'error'
+        })
+        return false
+      }
+
+      var users = []
+      _selectData.map(item => {
+        if (item.STATUS === 0) {
+          users.push(item.USER_ID)
+        }
+      })
+
+      if (users == null || users.length == 0) {
+        this.$message({
+          message: '勾选人员暂无法提交申请...',
+          type: 'error'
+        })
+        return false
+      }
+      this.$refs.apply.init(users)
+    },
+    hasButton() {
+      var keys = 'trainingbatch:add,trainingbatch:del,trainingbatch:edit,fhSms,email,fromExcel,toExcel'
+      requestFN(
+        '/head/hasButton',
+        {
+          keys: keys, tm: new Date().getTime()
+        }
+      ).then((data) => {
+        if (data.result == 'success') {
+          this.add = data.trainingbatchfhadminadd	// 增
+          this.del = data.trainingbatchfhadmindel	// 删
+          this.edit = data.trainingbatchfhadminedit	// 改
+          this.fromExcel = data.fromExcel	// 从excel导入权限
+          this.toExcel = data.toExcel		// 导出到excel权限
+        } else if (data.result == 'exception') {
+          // showException('按钮权限', data.exception)// 显示异常
+          console.info('按钮权限:', data.exception)
+        }
+      })
+        .catch((e) => {
+          this.listLoading = false
+        })
+    },
+    getDict: function() {
+      requestFN(
+        'dictionaries/getLevels',
+        { DICTIONARIES_ID: 'd7d80f08d73a4accbccf4fd3d8d1d867' }
+      ).then((data) => {
+        this.wenhuachengduList = data.list
+      }).catch((e) => {
+        this.listLoading = false
+      })
+      requestFN(
+        'dictionaries/getLevels',
+        { DICTIONARIES_ID: '09e36ac01e9540f8bc84eab1c1a78754' }
+      ).then((data) => {
+        this.postList = data.list
+      }).catch((e) => {
+        this.listLoading = false
+      })
+    }
+  }
+}
+</script>
+
diff --git a/src/views/xgf/peopleList/components/picture.vue b/src/views/xgf/peopleList/components/picture.vue
new file mode 100644
index 0000000..57e7255
--- /dev/null
+++ b/src/views/xgf/peopleList/components/picture.vue
@@ -0,0 +1,36 @@
+<template>
+  <div>
+    <el-dialog :visible.sync="visible" :append-to-body="appendToBody" title="头像" width="370px" destroy-on-close	>
+      <el-image :src="src"/>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import vueQr from 'vue-qr'
+
+export default {
+  components: { vueQr },
+  props: {
+    appendToBody: {
+      type: Boolean,
+      default: false
+    }
+  },
+  data() {
+    return {
+      visible: false,
+      src: ''
+    }
+  },
+  methods: {
+    init(e) {
+      this.visible = true
+      this.src = e.src
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+</style>
diff --git a/src/views/xgf/peopleList/components/record.vue b/src/views/xgf/peopleList/components/record.vue
new file mode 100644
index 0000000..e82258d
--- /dev/null
+++ b/src/views/xgf/peopleList/components/record.vue
@@ -0,0 +1,198 @@
+<template>
+  <div class="app-container">
+    <el-page-header content="申请记录" @back="goBack"/>
+    <el-form label-width="130px">
+      <el-row>
+        <el-col :span="5">
+          <el-form-item label="申请人员">
+            <el-input v-model="KEYWORDS" placeholder="请输入申请人员"/>
+          </el-form-item>
+        </el-col>
+        <el-col :span="5">
+          <el-form-item label="主管部门">
+            <Treeselect
+              :options="companyTreeData"
+              :normalizer="normalizer"
+              v-model="MANAGER"
+              placeholder="请选择部门"
+              no-options-text="暂无数据"
+              no-children-text="暂无数据"
+              style="width: 100%;"
+            />
+          </el-form-item>
+        </el-col>
+        <el-col :span="5">
+          <el-form-item label="属地管理部门">
+            <Treeselect
+              :options="companyTreeData"
+              :normalizer="normalizer"
+              v-model="TERRITORIALITY"
+              placeholder="请选择部门"
+              no-options-text="暂无数据"
+              no-children-text="暂无数据"
+              style="width: 100%;"
+            />
+          </el-form-item>
+        </el-col>
+        <el-col :span="5">
+          <el-form-item label="申请状态">
+            <el-select v-model="AUDIT_STATUS" placeholder="请选择申请状态" style="width: 100%;">
+              <el-option v-for="item in statusList" :key="item.value" :label="item.label" :value="item.value" />
+            </el-select>
+          </el-form-item>
+        </el-col>
+        <el-col :span="4">
+          <el-form-item label-width="10px">
+            <el-button v-waves class="filter-item" type="primary" icon="el-icon-search" @click="getQuery">
+              搜索
+            </el-button>
+            <el-button v-waves class="filter-item" type="success" icon="el-icon-refresh" @click="goKeyReset">
+              重置
+            </el-button>
+          </el-form-item>
+        </el-col>
+      </el-row>
+    </el-form>
+    <el-table ref="multipleTable" :data="varList" :header-cell-style="{'font-weight': 'bold','color': '#000'}" tooltip-effect="dark" border fit highlight-current-row>
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column type="index" label="序号" width="50" align="center" />
+      <el-table-column prop="CREATTIME" label="申请时间" align="center" />
+      <el-table-column prop="CREATOR" label="申请人员" align="center" />
+      <el-table-column prop="SUPERVISION_DEPARTMENT_NAME" label="安监部门" align="center" />
+      <el-table-column prop="MANAGER_DEPT_NAME" label="主管部门" align="center" />
+      <el-table-column prop="TERRITORIALITY_DEPARTMENT_NAME" label="属地管理部门" align="center" />
+      <el-table-column prop="TRAIN_DATE" label="申请年份" align="center" >
+        <template slot-scope="{row}">
+          {{ new Date(row.CREATTIME).getFullYear() }}
+        </template>
+      </el-table-column>
+      <el-table-column prop="AUDIT_STATUS" label="申请状态" align="center" >
+        <template slot-scope="{row}">
+          <span v-if="row.AUDIT_STATUS === 0">待审核</span>
+          <span v-if="row.AUDIT_STATUS === 1">审核中</span>
+          <span v-if="row.AUDIT_STATUS === 2">待培训</span>
+          <span v-if="row.AUDIT_STATUS === 3">已完成</span>
+        </template>
+      </el-table-column>
+      <el-table-column prop="PASS_COUNT" label="审核通过人数" align="center" /> <!-- 已更新为申请状态中的审核通过人员数-->
+      <el-table-column prop="USER_COUNT" label="申请人数" align="center" />
+      <el-table-column label="操作" align="center" width="200">
+        <template slot-scope="{row}">
+          <el-button type="primary" icon="el-icon-edit" size="mini" @click="handleShow(row)">查看</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    <div class="page-btn-group">
+      <div/>
+      <pagination :total="total" :page.sync="listQuery.page" :limit.sync="listQuery.limit" @pagination="getList" />
+    </div>
+
+    <users ref="users"/>
+  </div>
+</template>
+
+<script>
+import Pagination from '@/components/Pagination' // 通过 el-pagination二次打包
+import { requestFN } from '@/utils/request'
+import waves from '@/directive/waves' // waves directive
+import Treeselect from '@riophae/vue-treeselect'
+import '@riophae/vue-treeselect/dist/vue-treeselect.css'
+import users from './users'
+export default {
+  components: { Pagination, Treeselect, users },
+  directives: { waves },
+  data() {
+    return {
+      listQuery: {
+        page: 1,
+        limit: 10
+      },
+      total: 0,
+      varList: [],
+      treeData: [],
+      companyTreeData: [],
+      normalizer(node) {
+        return {
+          id: node.id,
+          label: node.name,
+          children: node.nodes
+        }
+      },
+      MANAGER: null,
+      TERRITORIALITY: null,
+      statusList: [{ value: 0, label: '待审核' }, { value: 1, label: '审核中' }, { value: 2, label: '待培训' }, { value: 3, label: '已完成' }],
+      AUDIT_STATUS: '',
+      KEYWORDS: ''
+    }
+  },
+  created() {
+    this.getList()
+    this.getTreeData()
+  },
+  methods: {
+    getQuery() {
+      this.$refs.multipleTable.clearSelection()
+      this.listQuery = {
+        page: 1,
+        limit: 10
+      }
+      this.getList()
+    },
+    goKeyReset() {
+      this.MANAGER = null
+      this.TERRITORIALITY = null
+      this.AUDIT_STATUS = ''
+      this.KEYWORDS = ''
+      this.getQuery()
+    },
+    getList() {
+      this.listLoading = true
+      requestFN(
+        '/trainingbatch/list?showCount=' + this.listQuery.limit + '&currentPage=' + this.listQuery.page,
+        {
+          MANAGER: this.MANAGER,
+          TERRITORIALITY: this.TERRITORIALITY,
+          AUDIT_STATUS: this.AUDIT_STATUS,
+          KEYWORDS: this.KEYWORDS,
+          TYPE: 2,
+          USER_ID: JSON.parse(sessionStorage.getItem('user')).USER_ID
+        }
+      ).then((data) => {
+        this.listLoading = false
+        this.varList = data.varList
+        console.log(this.varList)
+        this.total = data.page.totalResult
+      })
+        .catch((e) => {
+          this.listLoading = false
+        })
+    },
+
+    // 获得部门树
+    getTreeData() {
+      requestFN(
+        '/regulatoryApi/department/listTree',
+        {}
+      ).then((data) => {
+        this.treeData = JSON.parse(data.zTreeNodes)
+      }).catch((e) => {
+      })
+      requestFN(
+        '/companyApi/department/listTree',
+        { CORPINFO_ID: this.$parent.SUPERVISE_CORPINFO_ID }
+      ).then((data) => {
+        this.companyTreeData = JSON.parse(data.zTreeNodes)
+      }).catch((e) => {
+      })
+    },
+
+    handleShow(row) {
+      this.$refs.users.init(row)
+    },
+    goBack() {
+      this.$parent.activeName = 'List'
+    }
+  }
+}
+</script>
+
diff --git a/src/views/xgf/peopleList/components/sendUtil.vue b/src/views/xgf/peopleList/components/sendUtil.vue
new file mode 100644
index 0000000..a49a643
--- /dev/null
+++ b/src/views/xgf/peopleList/components/sendUtil.vue
@@ -0,0 +1,216 @@
+<template>
+  <div>
+    <el-dialog v-loading = "loading" :visible.sync="visible" :append-to-body="appendToBody" :before-close="beforeClose" title="审批" width="1200px" destroy-on-close>
+      <el-form ref="form" :model="form" :rules="rules" label-width="200px" label-position="right" type="flex">
+        <el-row :gutter="12">
+          <el-col :span="12">
+            <el-form-item prop="STATUS" label="是否通过: ">
+              <el-select v-model="form.STATUS" style="width: 300px" placeholder="请选择">
+                <el-option label="是" value="1"/>
+                <el-option label="否" value="0"/>
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item v-if="form.STATUS === '1' && !form.STEP" prop="APPOINT_DEPARTMENT_ID" label="指定监管部门:">
+              <Treeselect
+                :options="departmentTree"
+                :normalizer="normalizer"
+                v-model="form.APPOINT_DEPARTMENT_ID"
+                placeholder="请选择部门"
+                no-options-text="暂无数据"
+                no-children-text="暂无数据"
+                style="width: 100%;"
+                @select="getPeopleList($event)"
+              />
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row>
+          <el-col v-if="form.STATUS === '0'" :span="12">
+            <el-form-item v-if="form.STATUS === '0'" prop="OPINION" label="打回原因:">
+              <el-input v-model="form.OPINION" :rows="2" type="textarea" placeholder="填写审批意见"/>
+            </el-form-item>
+          </el-col>
+          <el-col v-if="form.STATUS === '1' && !form.STEP " :span="12">
+            <el-form-item v-if="form.STATUS === '1'" prop="APPOINT_USER_ID" label="指定监管部门审批人:">
+              <el-select v-model="form.user" style="width: 300px" placeholder="请选择" @change="chooseUser">
+                <el-option v-for="item in peopleList" :key="item.USER_ID" :value="JSON.stringify(item)" :label="item.NAME"/>
+              </el-select>
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+
+      <div slot="footer" class="dialog-footer">
+        <el-button @click="handleClose">关 闭</el-button>
+        <el-button type="primary" @click="sendMessage('1')">确 定</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import vueQr from 'vue-qr'
+import Treeselect from '@riophae/vue-treeselect'
+import { requestFN } from '@/utils/request'
+
+export default {
+  components: { Treeselect, vueQr },
+  props: {
+    appendToBody: {
+      type: Boolean,
+      default: false
+    }
+  },
+  data() {
+    return {
+      visible: false,
+      loading: false,
+      form: {
+        STATUS: null,
+        APPOINT_CORP_ID: '',
+        APPOINT_CORP_NAME: '',
+        APPOINT_DEPARTMENT_ID: null,
+        APPOINT_DEPARTMENT_NAME: '',
+        APPOINT_USER_ID: null,
+        APPOINT_USER_NAME: '',
+        OPINION: '',
+        STEP: false,
+        user: '',
+        tm: new Date().getTime(),
+        list: [],
+        isShow: true,
+        info: {}
+      },
+      rules: {
+        STATUS: [
+          { required: true, message: '请选择是否通过', trigger: 'change' }
+        ],
+        APPOINT_DEPARTMENT_ID: [
+          { required: true, message: '请选择指定监管部门', trigger: 'change' }
+        ],
+        APPOINT_USER_ID: [
+          { required: true, message: '请选择指定监管部门审批人', trigger: 'change' }
+        ],
+        OPINION: [
+          { required: true, message: '请填写打回原因', trigger: 'change' }
+        ]
+      },
+      heirloom: {},
+
+      normalizer(node) {
+        return {
+          id: node.id,
+          label: node.name,
+          children: node.nodes
+        }
+      },
+
+      departmentTree: [],
+      peopleList: []
+    }
+  },
+  methods: {
+    async init(e) {
+      console.log(e)
+      this.loading = true
+      this.visible = true
+      this.heirloom = JSON.stringify(e)
+      this.form.list = JSON.stringify(e)
+      this.form.STEP = (e[0].FLOWS_STEP === 3)
+      this.getDepartmentTree()
+      this.loading = false
+    },
+    sendMessage(e) {
+      this.$refs.form.validate((valid) => {
+        if (!valid) {
+          this.$message.error('请填写完整信息')
+        } else {
+          requestFN('/xgf/user/approve', this.form)
+            .then((data) => {
+              this.$message.success('推送成功')
+              this.visible = false
+              this.$emit('refresh', '')
+            })
+            .catch((e) => {
+              console.log(e)
+            })
+        }
+      })
+    },
+    getDepartmentTree() {
+      return new Promise(resolve => {
+        requestFN(
+          '/department/listTree',
+          {}
+        ).then((data) => {
+          this.departmentTree = this.removeEmptyChildren(JSON.parse(data.zTreeNodes))
+          resolve(true)
+        }).catch((e) => {
+        })
+      })
+    },
+    getCorpDepartmentTree() {
+      return new Promise(resolve => {
+        requestFN(
+          '/openApi/corpDepartment/listTree',
+          {}
+        ).then((data) => {
+          this.departmentTree = this.removeEmptyChildren(JSON.parse(data.zTreeNodes))
+          resolve(true)
+        }).catch((e) => {
+        })
+      })
+    },
+    getPeopleList(e) {
+      this.form.APPOINT_DEPARTMENT_NAME = e.name
+      requestFN(
+        '/user/listAll',
+        {
+          DEPARTMENT_ID: e.id
+        }
+      ).then((data) => {
+        this.peopleList = data.userList
+      }).catch((e) => {
+        console.log(e)
+      })
+    },
+    chooseUser(e) {
+      const entity = JSON.parse(e)
+      this.form.APPOINT_USER_ID = entity.USER_ID
+      this.form.APPOINT_USER_NAME = entity.NAME
+    },
+
+    handleClose() {
+      this.form = {
+        STATUS: '',
+        APPOINT_DEPARTMENT_ID: null,
+        APPOINT_DEPARTMENT_NAME: '',
+        APPOINT_USER_ID: '',
+        APPOINT_USER_NAME: '',
+        user: '',
+        list: [],
+        tm: new Date().getTime()
+      }
+      this.visible = false
+    },
+    beforeClose() {
+      this.visible = false
+      this.form = {
+        STATUS: '',
+        APPOINT_DEPARTMENT_ID: null,
+        APPOINT_DEPARTMENT_NAME: '',
+        APPOINT_USER_ID: '',
+        APPOINT_USER_NAME: '',
+        user: '',
+        list: [],
+        tm: new Date().getTime()
+      }
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+</style>
diff --git a/src/views/xgf/peopleList/components/user.vue b/src/views/xgf/peopleList/components/user.vue
new file mode 100644
index 0000000..889dc08
--- /dev/null
+++ b/src/views/xgf/peopleList/components/user.vue
@@ -0,0 +1,250 @@
+<template>
+  <div>
+    <el-dialog :visible.sync="visible" :append-to-body="appendToBody" title="相关方安全告知培训合格证" width="370px">
+      <div v-for="item in peopleList" :key="item.CLASS_INFO_ID" style="height: 220px">
+        <div class="bg_table">
+          <div class="title">相关方安全告知培训合格证</div>
+          <div class="red">{{ item.CLASS_NO }}</div>
+          <table class="table">
+            <tr>
+              <td style="width: 120px">
+                <div class="text textone name">姓名</div>
+              </td>
+              <td style="width: 100px;">
+                <div class="text text1 tcenter">{{ item.NAME }}</div>
+              </td>
+              <td style="width: 86px">
+                <div class="text text2 tcenter">工种</div>
+              </td>
+              <td style="width: 148px;">
+                <div v-if="item.JOBS_TYPE" class="text tcenter ">{{ item.JOBS_TYPE }}</div>
+                <div v-else>暂无</div>
+              </td>
+              <td rowspan="4" style="width: 134px;">
+                <img v-if="!getShowPicture(item)" src="../../../../assets/images/peopleHead.png" alt="" style="width: 116px; height: 146px">
+                <img v-if="getShowPicture(item)" :src="config.fileUrl + item.PHOTO" alt="" style="width: 116px; height: 146px" @click="openPicture(config.fileUrl + item.PHOTO)">
+              </td>
+            </tr>
+            <tr>
+              <td>
+                <div class="text textone">资质</div>
+              </td>
+              <td colspan="3">
+                <div v-if="item.CERTIFICATE" class="text">{{ item.CERTIFICATE }}</div>
+                <div v-else>暂无</div>
+              </td>
+            </tr>
+            <tr>
+              <td>
+                <div class="text textone">培训时间</div>
+              </td>
+              <td colspan="3">
+                <div class="text">{{ item.OPENING_TIME }}</div>
+              </td>
+            </tr>
+            <tr>
+              <td>
+                <div class="text textone">有效期限</div>
+              </td>
+              <td colspan="3">
+                <div class="text">{{ item.VALIDITY_PERIOD_END }}</div>
+              </td>
+            </tr>
+            <tr>
+              <td>
+                <div class="text textone">所在单位</div>
+              </td>
+              <td colspan="3">
+                <div class="text">{{ item.DEPARTMENT_NAME }}</div>
+              </td>
+              <td rowspan="3" style="padding-top: 6px" @click="click(config.messageUrl + '?CLASS_INFO_ID=' + item.CLASS_INFO_ID)">
+                <vue-qr :text="config.messageUrl + '?CLASS_INFO_ID=' + item.CLASS_INFO_ID" :margin="0" :size="110" color-dark="#000" color-light="#fff"/>
+              </td>
+            </tr>
+            <tr>
+              <td>
+                <div class="text textone">身份证号</div>
+              </td>
+              <td colspan="3">
+                <div class="text">{{ item.CARD_ID }}</div>
+              </td>
+            </tr>
+            <tr>
+              <td>
+                <div class="text textone">手机</div>
+              </td>
+              <td colspan="3">
+                <div class="text">{{ item.PHONE }}</div>
+              </td>
+            </tr>
+          </table>
+        </div>
+      </div>
+    </el-dialog>
+    <QRCode ref="QRcode" append-to-body/>
+    <Picture ref="Picture" append-to-body/>
+  </div>
+</template>
+
+<script>
+import { requestFN } from '@/utils/request'
+import vueQr from 'vue-qr'
+import QRCode from './QRCode.vue'
+import Picture from './picture.vue'
+
+export default {
+  components: { QRCode, Picture, vueQr },
+  props: {
+    appendToBody: {
+      type: Boolean,
+      default: false
+    }
+  },
+  data() {
+    return {
+      config: config,
+      visible: false,
+      peopleList: [],
+      CLASS_MESSAGE_ID: '',
+      CLASS_INFO_ID: '',
+      USER_ID: '',
+      qrCodeStr: ''
+    }
+  },
+  methods: {
+    init(e) {
+      console.info(e)
+      if (e && e.CLASS_INFO_ID) {
+        this.CLASS_INFO_ID = e.CLASS_INFO_ID
+      }
+      if (e && e.CLASS_MESSAGE_ID) {
+        this.CLASS_MESSAGE_ID = e.CLASS_MESSAGE_ID
+      }
+      if (e && e.USER_ID) {
+        this.USER_ID = e.USER_ID
+      }
+      this.qrCodeStr = config.messageUrl + '?CLASS_INFO_ID=' + this.CLASS_INFO_ID
+      this.visible = true
+      this.getInfo()
+    },
+    getInfo() {
+      requestFN('/trainusers/getUserinfoList', {
+        CLASS_INFO_ID: this.CLASS_INFO_ID,
+        CLASS_MESSAGE_ID: this.CLASS_MESSAGE_ID,
+        USER_ID: this.USER_ID
+      })
+        .then((data) => {
+          this.peopleList = data.list
+        }).catch((e) => {
+          console.log(e)
+        })
+    },
+    getShowPicture(row) {
+      if (row.PHOTO && row.PHOTO !== '' && (row.PHOTO.indexOf('.jpg') >= 0 || row.PHOTO.indexOf('.png') >= 0 || row.PHOTO.indexOf('.jpeg') >= 0)) {
+        return true
+      }
+    },
+    click(e) {
+      this.$refs.QRcode.init({ qrCodeStr: e })
+    },
+    openPicture(src) {
+      this.$refs.Picture.init({ src: src })
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+
+.name{
+  width: 120px;
+  overflow: hidden;//溢出隐藏
+  white-space: nowrap; // 强制一行显示
+  text-overflow: ellipsis;// 显示。。。省略号
+}
+.red {
+  width: 660px;
+  color: #ff0000;
+  margin-left: 34px;
+  font-size: 24px;
+}
+
+.bg_table {
+  background: url("../../../../assets/tablebg.jpg") no-repeat bottom center;
+  background-size: 100%;
+  width: 660px;
+  height: 430px;
+  border: 4px solid #453d3a;
+  transform: scale(0.5);
+  transform-origin: top left;
+
+  .title {
+    font-size: 28px;
+    text-align: center;
+    margin-top: 34px;
+    font-weight: bold;
+    color: #000000;
+  }
+
+  .table {
+    border-collapse: collapse;
+    width: 590px;
+    color: #453d3a;
+    font-size: 20px;
+    margin: 34px;
+    text-align: left;
+    margin-top: 10px;
+
+    .tcenter {
+      text-align: center
+    }
+
+    .w60 {
+      width: 100px;
+    }
+
+    .w74 {
+      width: 148px
+    }
+
+    th, td {
+      border: 2px solid #453d3a;
+      text-align: left;
+      height: 40px;
+      padding: 0 16px;
+
+      box-sizing: border-box;
+
+      .textone {
+        width: 80px;
+        text-align: justify;
+        text-align-last: justify;
+        text-justify: distribute-all-lines;
+        margin: 0 auto;
+      }
+
+      .text1 {
+        width: 60px;
+        text-align: justify;
+        text-align-last: justify;
+        text-justify: distribute-all-lines;
+        margin: 0 auto;
+
+      }
+
+      .text2 {
+        width: 50px;
+        text-align: justify;
+        text-align-last: justify;
+        text-justify: distribute-all-lines;
+        margin: 0 auto;
+
+      }
+
+      .text {
+
+      }
+    }
+  }
+}
+</style>
diff --git a/src/views/xgf/peopleList/components/users.vue b/src/views/xgf/peopleList/components/users.vue
new file mode 100644
index 0000000..2d11653
--- /dev/null
+++ b/src/views/xgf/peopleList/components/users.vue
@@ -0,0 +1,513 @@
+<template>
+  <div class="app-container">
+    <el-dialog
+      v-if="visible"
+      :visible.sync="visible"
+      :before-close="handleClose"
+      :append-to-body="true"
+      title="申请详情"
+      width="60%">
+      <div class="level-title mt-20" style="display: flex;justify-content: space-between;">
+        <h1>申请信息</h1>
+      </div>
+      <table class="table-ui" style="margin-bottom: 20px;">
+        <tr>
+          <th style="width: 17%">申请人</th>
+          <td style="width: 17%">{{ pd.CREATOR }}</td>
+          <th style="width: 17%">申请时间</th>
+          <td style="width: 17%">{{ pd.CREATTIME }}</td>
+          <th style="width: 17%">备注</th>
+          <td style="width: 15%">{{ pd.DESCR }}</td>
+        </tr>
+        <tr>
+          <th style="width: 30px">安监部门</th>
+          <td style="width: 50px">{{ pd.SUPERVISION_DEPARTMENT_NAME }}</td>
+          <th style="width: 30px">审核人</th>
+          <td style="width: 50px">{{ pd.SUPERVISION_USER_NAME }}</td>
+          <th style="width: 30px">审核时间</th>
+          <td style="width: 50px">{{ pd.SUPERVISION_TIME }}</td>
+        </tr>
+        <tr>
+          <th>主管部门</th>
+          <td>{{ pd.MANAGER_DEPT_NAME }}</td>
+          <th>审核人</th>
+          <td>{{ pd.MANAGER_USER_NAME }}</td>
+          <th>审核时间</th>
+          <td>{{ pd.MANAGER_TIME }}</td>
+        </tr>
+        <tr>
+          <th>属地管理部门</th>
+          <td>{{ pd.TERRITORIALITY_DEPARTMENT_NAME }}</td>
+          <th>审核人</th>
+          <td>{{ pd.TERRITORIALITY_USER_NAME }}</td>
+          <th>审核时间</th>
+          <td>{{ pd.TERRITORIALITY_TIME }}</td>
+        </tr>
+        <tr v-if="pd.AUDIT_DESCR">
+          <th>股份公司意见</th>
+          <td colspan="5">{{ pd.AUDIT_DESCR }}</td>
+        </tr>
+        <tr v-if="pd.CORP_AUDIT_DESCR">
+          <th>分公司意见</th>
+          <td colspan="5">{{ pd.CORP_AUDIT_DESCR }}</td>
+        </tr>
+      </table>
+      <div class="level-title">
+        <h1>申请人员列表</h1>
+      </div>
+      <el-table ref="multipleTable" :data="userList" :header-cell-style="{'font-weight': 'bold','color': '#000'}" tooltip-effect="dark" border fit highlight-current-row>
+        <el-table-column type="selection" width="55" align="center" />
+        <el-table-column type="index" label="序号" width="50" align="center" />
+        <el-table-column prop="USERNAME" label="用户名" align="center" />
+        <el-table-column prop="NAME" label="姓名" align="center" />
+        <el-table-column prop="DEPARTMENT_NAME" label="部门" align="center" />
+        <el-table-column prop="STATE" label="审核状态" align="center" >
+          <template slot-scope="{row}">
+            <el-tag v-if="row.MANAGER_STATE === 0 || row.SUPERVISION_STATE === 0 || row.TERRITORIALITY_STATE === 0" type="danger">审核不通过</el-tag>
+            <el-tag v-else-if="row.MANAGER_STATE === 1 && row.SUPERVISION_STATE === 1 && row.TERRITORIALITY_STATE === 1" type="success">审核通过</el-tag>
+            <el-tag v-else type="success">待审核</el-tag>
+          </template>
+        </el-table-column>
+        <el-table-column label="操作" align="center" width="200" >
+          <template slot-scope="{row}">
+            <el-button type="primary" icon="el-icon-edit" size="mini" @click="handleShow(row.USER_ID)">查看</el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+      <div class="page-btn-group">
+        <div/>
+        <pagination :total="total" :page.sync="listQuery.page" :limit.sync="listQuery.limit" @pagination="getUserList" />
+      </div>
+      <div slot="footer" class="dialog-footer">
+        <el-button @click="closeWindow">关 闭</el-button>
+      </div>
+    </el-dialog>
+    <el-dialog
+      v-if="userInfoDialog"
+      :visible.sync="userInfoDialog"
+      :append-to-body="true"
+      title="查看"
+      width="60%">
+      <table class="table-ui" style="margin-bottom: 20px;">
+        <div class="level-title">
+          <h1>人员信息</h1>
+        </div>
+        <tr>
+          <th>照片</th>
+          <td>
+            <span v-if="imgUrl != ''">
+              <div class="img-flex">
+                <viewer>
+                  <img :src="imgUrl" width="40" height="40" style="object-fit: cover;">
+                </viewer>
+              </div>
+            </span>
+            <span v-else/>
+          </td>
+          <th>姓名</th>
+          <td>{{ userDetailForm.NAME }}</td>
+          <th>性别</th>
+          <td>{{ userDetailForm.SEX === '0' ? '男' : '女' }}</td>
+        </tr>
+        <tr>
+          <th>出生年月</th>
+          <td>{{ userDetailForm.DATE_OF_BIRTH }}</td>
+          <th>年龄</th>
+          <td>{{ userDetailForm.AGE }}</td>
+          <th>手机号</th>
+          <td>{{ userDetailForm.PHONE }}</td>
+        </tr>
+        <tr>
+          <th>身份证</th>
+          <td>{{ userDetailForm.CARD_ID }}</td>
+          <th>身份证照片</th>
+          <!--if条件不可删除-->
+          <td v-if="userCardIDPhotoFile.length>0" colspan="3">
+            <span>
+              <div class="img-flex">
+                <viewer>
+                  <img
+                    v-for="item in userCardIDPhotoFile"
+                    :src="config.fileUrl + item.FILEPATH"
+                    :key="item.IMGFILES_ID"
+                    width="40"
+                    height="40"
+                    style="object-fit: cover;">
+                </viewer>
+              </div>
+            </span>
+          </td>
+        </tr>
+
+        <tr>
+          <th>民族</th>
+          <td>{{ userDetailForm.minzuName ? userDetailForm.minzuName : '暂无信息' }}</td>
+          <th>婚姻状况</th>
+          <td>{{ userDetailForm.MARITALSTATUS === '0' ? '未婚' : '已婚' }}</td>
+          <th>政治面貌</th>
+          <td>{{ userDetailForm.zzName }} {{
+            userDetailForm.zzName == '中共党员' ? '入党时间' + userDetailForm.POLITICAL_TIME : ''
+          }}
+          </td>
+        </tr>
+
+        <tr>
+          <th>户口所在地</th>
+          <td>{{ userDetailForm.HKLOCAL ? userDetailForm.HKLOCAL : '暂无信息' }}</td>
+          <th>现住址</th>
+          <td>{{ userDetailForm.ADDRESS ? userDetailForm.ADDRESS : '暂无信息' }}</td>
+          <th>联系电话</th>
+          <td>{{ userDetailForm.PHONE }}</td>
+        </tr>
+        <tr>
+          <th>文化程度</th>
+          <td>{{ userDetailForm.DEGREE_OF_EDUCATION_NAME }}</td>
+          <th>岗位名称(工种)</th>
+          <td colspan="5">{{ userDetailForm.POST_ID }}</td>
+        </tr>
+        <tr>
+          <th>是否缴纳社保</th>
+          <td :colspan="userDetailForm.IS_SOCIAL === '1' ? '':5">{{ formatLabel(userDetailForm.IS_SOCIAL) }}</td>
+          <th v-if="userDetailForm.IS_SOCIAL === '1'">社会保障号码</th>
+          <td v-if="userDetailForm.IS_SOCIAL === '1'">{{ userDetailForm.SOCIAL_NUMBER }}</td>
+          <th v-if="userDetailForm.IS_SOCIAL === '1'">社保卡照片</th>
+          <td v-if="userDetailForm.IS_SOCIAL === '1'&& socialPhotoFile.length>0" colspan="3">
+            <span>
+              <div class="img-flex">
+                <viewer>
+                  <img
+                    v-for="item in socialPhotoFile"
+                    :src="config.fileUrl + item.FILEPATH"
+                    :key="item.IMGFILES_ID"
+                    width="40"
+                    height="40"
+                    style="object-fit: cover;">
+                </viewer>
+              </div>
+            </span>
+          </td>
+        </tr>
+        <tr>
+          <th>是否参加三级安全培训</th>
+          <td>{{ formatLabel(userDetailForm.IS_LEVEL_THREE) }}</td>
+          <th v-if="userDetailForm.IS_LEVEL_THREE == 1">三级安全培训照片</th>
+          <td v-if="userDetailForm.IS_LEVEL_THREE == 1 && photosOfLevel.length>0" colspan="5">
+            <span>
+              <div class="img-flex">
+                <viewer>
+                  <img
+                    v-for="item in photosOfLevel"
+                    :src="config.fileUrl + item.FILEPATH"
+                    :key="item.IMGFILES_ID"
+                    width="40"
+                    height="40"
+                    style="object-fit: cover;">
+                </viewer>
+              </div>
+            </span>
+          </td>
+        </tr>
+        <tr>
+          <th>是否缴纳保险</th>
+          <td>{{ formatLabel(userDetailForm.IS_BF) }}</td>
+          <th>是否特殊工种</th>
+          <td>{{ formatLabel(userDetailForm.IS_SPECIAL_JOB) }}</td>
+          <th>是否流动人员</th>
+          <td>{{ formatLabel(userDetailForm.ISFLOW) }}</td>
+        </tr>
+      </table>
+      <div class="level-title">
+        <h1>培训记录</h1>
+      </div>
+      <el-table
+        :data="trainRecordList"
+        :header-cell-style="{'font-weight': 'bold','color': '#000'}"
+        tooltip-effect="dark"
+        border
+        fit
+        highlight-current-row>
+        <el-table-column type="selection" width="55" align="center"/>
+        <el-table-column type="index" label="序号" width="50" align="center"/>
+        <el-table-column prop="CLASS_NAME" label="班级名称" align="center"/>
+        <el-table-column prop="OPENING_TIME" label="开班时间" align="center"/>
+        <el-table-column prop="TRAINING_TYPE_NAME" label="培训类型" align="center"/>
+        <el-table-column prop="PLACE_NAME" label="培训地点" align="center"/>
+        <el-table-column label="培训有效期" align="center">
+          <template slot-scope="{row}">
+            <span>{{ formatDate(row.VALIDITY_PERIOD_START) }} 至 {{ formatDate(row.VALIDITY_PERIOD_END) }}</span>
+          </template>
+        </el-table-column>
+      </el-table>
+      <div v-if="userDetailForm.IS_SPECIAL_JOB == '1'" class="level-title">
+        <h1>特种作业人员信息</h1>
+      </div>
+      <table v-for="(item,index) in specialUsersList" :key="index" class="table-ui" style="margin-bottom: 20px;">
+        <tr>
+          <th style="width: 150px">证书名称</th>
+          <td style="width: 150px">{{ item.CERTIFICATE }}</td>
+          <th style="width: 150px">作业类别</th>
+          <td style="width: 180px">{{ item.SPECIAL_TYPE_NAME }}</td>
+          <th style="width: 150px">操作项目</th>
+          <td>{{ item.OPERATION_TYPE_NAME }}</td>
+        </tr>
+        <tr>
+          <th>特种作业证书编号</th>
+          <td>{{ item.SPECIAL_NUMBER }}</td>
+          <th>发证机关</th>
+          <td colspan="3">{{ item.ISSUING_AUTHORITY }}</td>
+        </tr>
+        <tr>
+          <th>复审时间</th>
+          <td>{{ item.REVIEW_TIME }}</td>
+          <th>有效期</th>
+          <td colspan="3">{{ item.VALIDITY_TIME_START }} 至 {{ item.VALIDITY_TIME_END }}</td>
+        </tr>
+      </table>
+      <div
+        v-if="detailForm.SUPERVISION_STATE === 0 || detailForm.MANAGER_STATE === 0 || detailForm.TERRITORIALITY_STATE === 0"
+        class="level-title mt-20">
+        <h1>打回信息</h1>
+      </div>
+      <table
+        v-if="detailForm.SUPERVISION_STATE === 0 || detailForm.MANAGER_STATE === 0 || detailForm.TERRITORIALITY_STATE === 0"
+        class="table-ui"
+        style="margin-bottom: 20px;">
+        <tr>
+          <th>打回人</th>
+          <td v-if="detailForm.SUPERVISION_STATE === 0">{{ detailForm.SUPERVISION_USER_NAME }}</td>
+          <td v-if="detailForm.MANAGER_STATE === 0">{{ detailForm.MANAGER_USER_NAME }}</td>
+          <td
+            v-if="detailForm.TERRITORIALITY_STATE === 0 && detailForm.MANAGER_USER_NAME !== detailForm.TERRITORIALITY_USER_NAME">
+            {{ detailForm.TERRITORIALITY_USER_NAME }}
+          </td>
+          <th>打回原由</th>
+          <td v-if="detailForm.SUPERVISION_STATE === 0">{{ detailForm.SUPERVISION_OPINION }}</td>
+          <td v-if="detailForm.MANAGER_STATE === 0">{{ detailForm.MANAGER_OPINION }}</td>
+          <td
+            v-if="detailForm.TERRITORIALITY_STATE === 0 && detailForm.MANAGER_USER_NAME !== detailForm.TERRITORIALITY_USER_NAME">
+            {{ detailForm.TERRITORIALITY_OPINION }}
+          </td>
+        </tr>
+      </table>
+      <div slot="footer" class="dialog-footer">
+        <el-button @click="userInfoDialog = false">关 闭</el-button>
+      </div>
+    </el-dialog>
+    <el-dialog :visible.sync="QRCodeDialog" title="查看二维码" width="680px" class="top-dialog">
+      <div class="table-qrcode" style="text-align: center;padding-top: 30px;">
+        <vue-qr :text="qrcodeStr" :margin="0" :size="300" color-dark="#000" color-light="#fff" />
+      </div>
+      <div slot="footer" class="dialog-footer">
+        <el-button @click="QRCodeDialog = false">关 闭</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import Pagination from '@/components/Pagination' // 通过 el-pagination二次打包
+import { requestFN } from '@/utils/request'
+import vueQr from 'vue-qr'
+import dateformat from '@/utils/dateformat'
+import '@riophae/vue-treeselect/dist/vue-treeselect.css'
+export default {
+  components: {
+    Pagination,
+    vueQr
+  },
+  data() {
+    return {
+      config: config,
+      contractFileList: [], // 合同文件
+      insuranceFileList: [], // 保险文件
+      userInfoDialog: false,
+      QRCodeDialog: false,
+      qrcodeStr: '',
+      userDetailForm: {},
+      userEntryForm: {},
+      specialUsersList: {},
+      imgUrl: '',
+      wenhuachengduList: [], // 文化程度
+      userCardIDPhotoFile: [], // 身份证照片
+      postList: [], // 岗位名称
+      trainRecordList: [], // 培训记录
+      visible: false,
+      pd: {},
+      userList: [],
+      listQuery: {
+        page: 1,
+        limit: 10
+      },
+      total: 0,
+      photosOfLevel: []
+    }
+  },
+  methods: {
+    formatDate(date, column) {
+      if (date) {
+        return dateformat(date, 'YYYY-MM-DD')
+      } else {
+        return ''
+      }
+    },
+    init(e) {
+      if (e) {
+        this.pd = e
+      }
+      this.visible = true
+      this.userList = []
+      this.getDict()
+      this.getUserList()
+    },
+    // 获取数据字典数据
+    getDict: function() {
+      requestFN(
+        '/dictionaries/getLevels',
+        {
+          DICTIONARIES_ID: '1144b16d85f14b108ea7859e2be9d001'
+        }
+      ).then((data) => {
+        this.flowAreaList = data.list
+      }).catch((e) => {
+
+      })
+      requestFN(
+        'dictionaries/getLevels',
+        { DICTIONARIES_ID: 'd7d80f08d73a4accbccf4fd3d8d1d867' }
+      ).then((data) => {
+        this.wenhuachengduList = data.list
+      }).catch((e) => {
+        this.listLoading = false
+      })
+      requestFN(
+        'dictionaries/getLevels',
+        { DICTIONARIES_ID: '09e36ac01e9540f8bc84eab1c1a78754' }
+      ).then((data) => {
+        this.postList = data.list
+      }).catch((e) => {
+        this.listLoading = false
+      })
+    },
+
+    // 人员
+    getUserList() {
+      requestFN(
+        '/trainingbatch/batchUserList?showCount=' + this.listQuery.limit + '&currentPage=' + this.listQuery.page,
+        {
+          TRAININGBATCH_ID: this.pd.TRAININGBATCH_ID
+        }
+      ).then((data) => {
+        this.userList = data.varList
+        this.total = data.page.totalResult
+      }).catch((e) => {
+      })
+    },
+    // 二维码
+    showQRCode(id) {
+      this.QRCodeDialog = true
+      const arr = [{ USER_ID: id, CODE_TYPE: '1' }]
+      this.qrcodeStr = JSON.stringify(arr)
+    },
+    // 查看
+    async handleShow(USER_ID) {
+      await this.getUserInfoById(USER_ID)
+      await this.getOtherUserInfoById(USER_ID)
+      this.userInfoDialog = true
+    },
+    getUserInfoById(id) {
+      return new Promise((resolve, reject) => {
+        requestFN(
+          '/user/getFloatPersonDetailById',
+          {
+            USER_ID: id,
+            TRAININGBATCH_ID: this.pd.TRAININGBATCH_ID,
+            CORPINFO_ID: JSON.parse(sessionStorage.getItem('user')).CORPINFO_ID
+          }
+        ).then((data) => {
+          this.userDetailForm = Object.assign(this.userDetailForm, data.userDetail)
+          this.userEntryForm = Object.assign(this.userEntryForm, data.eCard)
+          if (this.userDetailForm.PHOTO) {
+            this.imgUrl = config.fileUrl + this.userDetailForm.PHOTO
+          }
+          this.trainRecordList = data.recordList
+          // this.insuranceFileList = data.insuranceFile
+          // this.contractFileList = data.contractFile
+          resolve()
+        }).catch((e) => {
+          reject()
+        })
+      })
+    },
+    getOtherUserInfoById(id) {
+      return new Promise((resolve, reject) => {
+        requestFN(
+          'user/getDetailByUserIdAndCorpInfoId',
+          {
+            USER_ID: id,
+            CORPINFO_ID: JSON.parse(sessionStorage.getItem('user')).CORPINFO_ID,
+            CER_TYPE: '7498057c4c1f4a11b9a960e66ea04a7a'
+          }
+        ).then((data) => {
+          Object.assign(this.userDetailForm, data.pd)
+          this.userPhotoFile = data.userPhotoFile
+          if (this.userPhotoFile.length > 0) {
+            this.imgUrl = config.fileUrl + this.userPhotoFile[0].FILEPATH
+          }
+          this.insuranceFileList = data.insuranceFile
+          this.specialUsersList = data.specialUsers
+          this.contractFileList = data.contractFile
+          this.userCardIDPhotoFile = data.userCardIDPhotoFile
+          this.socialPhotoFile = data.socialPhotoFile
+          this.gongshangbaoxianFile = data.gongshangbaoxianFile
+          resolve()
+        }).catch((e) => {
+          reject()
+        })
+      })
+    },
+    // 转换是否
+    formatLabel(value) {
+      if (value == '1') {
+        return '是'
+      } else if (value == '0') {
+        return '否'
+      } else {
+        return ''
+      }
+    },
+    // 转换字典数据
+    formatDictioariesLabel(value, type) {
+      var list = []
+      if (type == '0') {
+        list = this.wenhuachengduList
+      } else if (type == '1') {
+        list = this.postList
+      }
+      if (value) {
+        if (list.length > 0) {
+          var data = ''
+          for (let i = 0; i < list.length; i++) {
+            const obj = list[i]
+            if (value == obj.BIANMA) {
+              data = obj.NAME
+              break
+            }
+          }
+          return data
+        } else {
+          return value
+        }
+      } else {
+        return ''
+      }
+    },
+
+    handleClose() {
+      this.visible = false
+    },
+    closeWindow() {
+      this.handleClose()
+    }
+  }
+}
+</script>
diff --git a/src/views/xgf/peopleList/index.vue b/src/views/xgf/peopleList/index.vue
new file mode 100644
index 0000000..70cda6e
--- /dev/null
+++ b/src/views/xgf/peopleList/index.vue
@@ -0,0 +1,23 @@
+<template>
+  <component :is="activeName" />
+</template>
+
+<script>
+import List from './components/list'
+import Record from './components/record'
+export default {
+  components: {
+    List: List,
+    Record: Record
+  },
+  data() {
+    return {
+      activeName: 'List',
+      SUPERVISE_CORPINFO_ID: ''
+    }
+  }
+}
+</script>
+
+<style scoped>
+</style>

From 6a05eb91a1b2ff7ccc6e31f64f376678e0599063 Mon Sep 17 00:00:00 2001
From: zhaoyu <zhaoyu>
Date: Fri, 26 Jan 2024 14:04:01 +0800
Subject: [PATCH 07/11] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=B1=95=E7=A4=BA?=
 =?UTF-8?q?=E5=90=8D=E5=AD=97?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 src/views/map/components/menjin.vue | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/src/views/map/components/menjin.vue b/src/views/map/components/menjin.vue
index 1c3ed3a..3395396 100644
--- a/src/views/map/components/menjin.vue
+++ b/src/views/map/components/menjin.vue
@@ -55,8 +55,9 @@
             <div v-if="block3OptionsIndex == 1" class="td">车牌</div>
             <div class="td">时间</div>
             <div class="td">状态</div>
-            <div v-if="block3OptionsIndex == 0" class="td">类型</div>
-            <div v-if="block3OptionsIndex == 1" class="td">来港事由</div>
+            <div class="td">闸机名称</div>
+            <!--<div v-if="block3OptionsIndex == 0" class="td">闸机名称</div>
+            <div v-if="block3OptionsIndex == 1" class="td">来港事由</div>-->
           </div>
           <div v-infinite-scroll="load" :infinite-scroll-disabled="disabled" class="scroll">
             <div v-for="(item,index) in block3List" :key="index" class="tr">

From 7dde890a502e365666d65865e5768e497cffc947 Mon Sep 17 00:00:00 2001
From: liujun <liujun@zcloudchina.com>
Date: Sat, 27 Jan 2024 15:57:51 +0800
Subject: [PATCH 08/11] =?UTF-8?q?13862=20=E9=80=89=E6=8B=A9=E7=AC=AC?=
 =?UTF-8?q?=E4=BA=8C=E4=B8=AA=E5=AE=A1=E6=89=B9=20=E6=8A=A5=E9=94=99?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 src/views/xgf/flow/components/list.vue     | 2 +-
 src/views/xgf/flow/components/sendUtil.vue | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/views/xgf/flow/components/list.vue b/src/views/xgf/flow/components/list.vue
index a96ceb0..c1c6c8b 100644
--- a/src/views/xgf/flow/components/list.vue
+++ b/src/views/xgf/flow/components/list.vue
@@ -43,7 +43,7 @@
         <template slot-scope="{row}">
           <el-button type="primary" icon="el-icon-edit" size="mini" @click="handleShow(row)">详情</el-button>
           <el-button v-if="row.power_flag === '1'" type="primary" icon="el-icon-s-claim" size="mini" @click="approve([row])">审批</el-button>
-          <el-button v-if="row.power_flag === '1' && row.FLOWS_STEP === 2" type="primary" icon="el-icon-s-claim" size="mini" @click="entrust([row])">委托制单单位审批</el-button>
+          <el-button v-if="row.power_flag === '1' && row.FLOWS_STEP === 1" type="primary" icon="el-icon-s-claim" size="mini" @click="entrust([row])">委托制单单位审批</el-button>
           <el-button v-if="false" type="success" icon="el-icon-edit" size="mini" @click="getUserInfo(row)">电子合格证</el-button>
         </template>
       </el-table-column>
diff --git a/src/views/xgf/flow/components/sendUtil.vue b/src/views/xgf/flow/components/sendUtil.vue
index a49a643..a671b91 100644
--- a/src/views/xgf/flow/components/sendUtil.vue
+++ b/src/views/xgf/flow/components/sendUtil.vue
@@ -118,7 +118,7 @@ export default {
       this.visible = true
       this.heirloom = JSON.stringify(e)
       this.form.list = JSON.stringify(e)
-      this.form.STEP = (e[0].FLOWS_STEP === 3)
+      this.form.STEP = (e[0].FLOWS_STEP === 2)
       this.getDepartmentTree()
       this.loading = false
     },

From d8b81339ea006a30491b26bcda8db40110c0784f Mon Sep 17 00:00:00 2001
From: liujun <liujun@zcloudchina.com>
Date: Sat, 27 Jan 2024 16:03:31 +0800
Subject: [PATCH 09/11] =?UTF-8?q?13856=20=E5=AE=A1=E6=A0=B8=E5=AE=8C?=
 =?UTF-8?q?=E4=B8=80=E4=B8=AA=E4=BA=BA=E4=B9=8B=E5=90=8E=EF=BC=8C=E5=AE=A1?=
 =?UTF-8?q?=E6=A0=B8=E4=B8=8B=E4=B8=80=E4=B8=AA=E4=BA=BA=EF=BC=8C=E8=BE=93?=
 =?UTF-8?q?=E5=85=A5=E6=A1=86=E5=86=85=E4=BF=A1=E6=81=AF=E6=B2=A1=E6=9C=89?=
 =?UTF-8?q?=E9=87=8D=E7=BD=AE=E6=B8=85=E7=A9=BA?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 src/views/xgf/flow/components/sendUtil.vue       | 2 ++
 src/views/xgf/peopleList/components/sendUtil.vue | 2 ++
 2 files changed, 4 insertions(+)

diff --git a/src/views/xgf/flow/components/sendUtil.vue b/src/views/xgf/flow/components/sendUtil.vue
index a671b91..8e4c25b 100644
--- a/src/views/xgf/flow/components/sendUtil.vue
+++ b/src/views/xgf/flow/components/sendUtil.vue
@@ -189,6 +189,7 @@ export default {
         APPOINT_DEPARTMENT_NAME: '',
         APPOINT_USER_ID: '',
         APPOINT_USER_NAME: '',
+        OPINION: '',
         user: '',
         list: [],
         tm: new Date().getTime()
@@ -203,6 +204,7 @@ export default {
         APPOINT_DEPARTMENT_NAME: '',
         APPOINT_USER_ID: '',
         APPOINT_USER_NAME: '',
+        OPINION: '',
         user: '',
         list: [],
         tm: new Date().getTime()
diff --git a/src/views/xgf/peopleList/components/sendUtil.vue b/src/views/xgf/peopleList/components/sendUtil.vue
index a49a643..77364e7 100644
--- a/src/views/xgf/peopleList/components/sendUtil.vue
+++ b/src/views/xgf/peopleList/components/sendUtil.vue
@@ -189,6 +189,7 @@ export default {
         APPOINT_DEPARTMENT_NAME: '',
         APPOINT_USER_ID: '',
         APPOINT_USER_NAME: '',
+        OPINION: '',
         user: '',
         list: [],
         tm: new Date().getTime()
@@ -203,6 +204,7 @@ export default {
         APPOINT_DEPARTMENT_NAME: '',
         APPOINT_USER_ID: '',
         APPOINT_USER_NAME: '',
+        OPINION: '',
         user: '',
         list: [],
         tm: new Date().getTime()

From 2bb112123b951853052b3759f56aae92a4259b52 Mon Sep 17 00:00:00 2001
From: liujun <liujun@zcloudchina.com>
Date: Sat, 27 Jan 2024 16:09:30 +0800
Subject: [PATCH 10/11] =?UTF-8?q?13854=20=E9=80=89=E6=8B=A9=E6=A1=86?=
 =?UTF-8?q?=E7=9A=84=E9=AB=98=E5=BA=A6=E9=95=BF=E5=BA=A6=E4=B8=8D=E4=B8=80?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 src/views/xgf/flow/components/sendUtil.vue | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/views/xgf/flow/components/sendUtil.vue b/src/views/xgf/flow/components/sendUtil.vue
index 8e4c25b..ce31f2c 100644
--- a/src/views/xgf/flow/components/sendUtil.vue
+++ b/src/views/xgf/flow/components/sendUtil.vue
@@ -20,7 +20,7 @@
                 placeholder="请选择部门"
                 no-options-text="暂无数据"
                 no-children-text="暂无数据"
-                style="width: 100%;"
+                style="width: 300px"
                 @select="getPeopleList($event)"
               />
             </el-form-item>

From a165aac422f4c4ef23f726cb1d891cb9e0acd85a Mon Sep 17 00:00:00 2001
From: liujun <liujun@zcloudchina.com>
Date: Sat, 27 Jan 2024 16:13:11 +0800
Subject: [PATCH 11/11] =?UTF-8?q?13817=20=E6=89=B9=E9=87=8F=E6=8E=A8?=
 =?UTF-8?q?=E9=80=81=E5=92=8C=E5=8D=95=E7=8B=AC=E6=8E=A8=E9=80=81=20?=
 =?UTF-8?q?=E5=8D=95=E4=BD=8D=E6=90=9C=E7=B4=A2=E6=A1=86=E5=8A=A0=E5=85=B3?=
 =?UTF-8?q?=E9=94=AE=E5=AD=97=E6=90=9C=E7=B4=A2?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 src/views/xgf/flow/components/sendUtil.vue | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/views/xgf/flow/components/sendUtil.vue b/src/views/xgf/flow/components/sendUtil.vue
index ce31f2c..5b1469e 100644
--- a/src/views/xgf/flow/components/sendUtil.vue
+++ b/src/views/xgf/flow/components/sendUtil.vue
@@ -5,7 +5,7 @@
         <el-row :gutter="12">
           <el-col :span="12">
             <el-form-item prop="STATUS" label="是否通过: ">
-              <el-select v-model="form.STATUS" style="width: 300px" placeholder="请选择">
+              <el-select v-model="form.STATUS" filterable style="width: 300px" placeholder="请选择">
                 <el-option label="是" value="1"/>
                 <el-option label="否" value="0"/>
               </el-select>