多体系建设信息化条统-前端
祖安之光
2025-09-04 9605634d1a5d30e4b732f6aaa070d715a9612870
修改新增
3 files modified
29 files added
7513 ■■■■■ changed files
public/6sReviewSheet.docx patch | view | raw | blame | history
public/annualVerificationPlan.docx patch | view | raw | blame | history
public/docChangeInvalidate.docx patch | view | raw | blame | history
public/docDestruction.docx patch | view | raw | blame | history
public/docDistributeRetrieve.docx patch | view | raw | blame | history
public/equipCalibrateConfirm.docx patch | view | raw | blame | history
src/api/assetManage/assetMng.js 137 ●●●●● patch | view | raw | blame | history
src/api/documentManage/index.js 121 ●●●●● patch | view | raw | blame | history
src/api/staffManage/staff.js 16 ●●●●● patch | view | raw | blame | history
src/layout/components/Sidebar/Logo.vue 4 ●●●● patch | view | raw | blame | history
src/views/build/conpanyFunctionConsult/staffManage/staffRegister/components/staffDialog.vue 38 ●●●● patch | view | raw | blame | history
src/views/work/assetMng/toolsMonitorMeasure/annualVerificationPlan/components/editDialog.vue 557 ●●●●● patch | view | raw | blame | history
src/views/work/assetMng/toolsMonitorMeasure/annualVerificationPlan/index.vue 205 ●●●●● patch | view | raw | blame | history
src/views/work/assetMng/toolsMonitorMeasure/equipCalibrateConfirm/components/editDialog.vue 282 ●●●●● patch | view | raw | blame | history
src/views/work/assetMng/toolsMonitorMeasure/equipCalibrateConfirm/index.vue 205 ●●●●● patch | view | raw | blame | history
src/views/work/assetMng/workEnvironmentControl/6sInspectChecklist/components/editDialog.vue 534 ●●●●● patch | view | raw | blame | history
src/views/work/assetMng/workEnvironmentControl/6sInspectChecklist/index.vue 328 ●●●●● patch | view | raw | blame | history
src/views/work/documentManage/docBorrowCopy/components/editDialog.vue 433 ●●●●● patch | view | raw | blame | history
src/views/work/documentManage/docBorrowCopy/index.vue 204 ●●●●● patch | view | raw | blame | history
src/views/work/documentManage/docChangeInvalidate/components/editDialog.vue 619 ●●●●● patch | view | raw | blame | history
src/views/work/documentManage/docChangeInvalidate/index.vue 215 ●●●●● patch | view | raw | blame | history
src/views/work/documentManage/docDestruction/components/editDialog.vue 370 ●●●●● patch | view | raw | blame | history
src/views/work/documentManage/docDestruction/index.vue 180 ●●●●● patch | view | raw | blame | history
src/views/work/documentManage/docDistributeRetrieve/components/editDialog.vue 428 ●●●●● patch | view | raw | blame | history
src/views/work/documentManage/docDistributeRetrieve/index.vue 203 ●●●●● patch | view | raw | blame | history
src/views/work/empResource/deptEmpAnalysis/index.vue 372 ●●●●● patch | view | raw | blame | history
src/views/work/empResource/specialEmp/components/empDialog.vue 728 ●●●●● patch | view | raw | blame | history
src/views/work/empResource/specialEmp/index.vue 261 ●●●●● patch | view | raw | blame | history
src/views/work/knowledgePlatform/externalKnowledge/components/editDialog.vue 259 ●●●●● patch | view | raw | blame | history
src/views/work/knowledgePlatform/externalKnowledge/index.vue 282 ●●●●● patch | view | raw | blame | history
src/views/work/knowledgePlatform/internalKnowledge/components/editDialog.vue 255 ●●●●● patch | view | raw | blame | history
src/views/work/knowledgePlatform/internalKnowledge/index.vue 277 ●●●●● patch | view | raw | blame | history
public/6sReviewSheet.docx
Binary files differ
public/annualVerificationPlan.docx
Binary files differ
public/docChangeInvalidate.docx
Binary files differ
public/docDestruction.docx
Binary files differ
public/docDistributeRetrieve.docx
Binary files differ
public/equipCalibrateConfirm.docx
Binary files differ
src/api/assetManage/assetMng.js
New file
@@ -0,0 +1,137 @@
import request from '@/utils/request'
export function getAnnualVerificationPlanList(params) {
    return request({
        url: '/system/annualVerificationPlan/selectAnnualVerificationPlanList',
        method: 'get',
        params: params
    })
}
export function saveAnnualVerificationPlan(data) {
    return request({
        url: '/system/annualVerificationPlan/saveAnnualVerificationPlan',
        method: 'post',
        data: data
    })
}
export function delAnnualVerificationPlan(params) {
    return request({
        url: '/system/annualVerificationPlan/deletedAnnualVerificationPlan',
        method: 'get',
        params: params
    })
}
export function getAnnualVerificationPlanDetail(params) {
    return request({
        url: '/system/annualVerificationPlan/getAnnualVerificationPlan',
        method: 'get',
        params: params
    })
}
export function getCalibrationMonitoringEquipmentList(params) {
    return request({
        url: '/system/calibrationMonitoringEquipment/selectCalibrationMonitoringEquipmentList',
        method: 'get',
        params: params
    })
}
export function saveCalibrationMonitoringEquipment(data) {
    return request({
        url: '/system/calibrationMonitoringEquipment/saveCalibrationMonitoringEquipment',
        method: 'post',
        data: data
    })
}
export function delCalibrationMonitoringEquipment(params) {
    return request({
        url: '/system/calibrationMonitoringEquipment/deletedCalibrationMonitoringEquipment',
        method: 'get',
        params: params
    })
}
export function getSixInspectionList(params) {
    return request({
        url: '/system/sixInspection/selectSixInspectionList',
        method: 'get',
        params: params
    })
}
export function saveSixInspection(data) {
    return request({
        url: '/system/sixInspection/saveSixInspection',
        method: 'post',
        data: data
    })
}
export function delSixInspection(params) {
    return request({
        url: '/system/sixInspection/deletedSixInspection',
        method: 'get',
        params: params
    })
}
export function getSixInspectionDetail(params) {
    return request({
        url: '/system/sixInspection/getSixInspection',
        method: 'get',
        params: params
    })
}
export function getInternalKnowledgeList(params) {
    return request({
        url: '/system/internal-knowledge/selectInternalKnowledgeList',
        method: 'get',
        params: params
    })
}
export function saveInternalKnowledge(data) {
    return request({
        url: '/system/internal-knowledge/saveInternalKnowledge',
        method: 'post',
        data: data
    })
}
export function delInternalKnowledge(params) {
    return request({
        url: '/system/internal-knowledge/deletedInternalKnowledge',
        method: 'get',
        params: params
    })
}
export function getExternalKnowledgeList(params) {
    return request({
        url: '/system/externalKnowledge/selectExternalKnowledgeList',
        method: 'get',
        params: params
    })
}
export function saveExternalKnowledge(data) {
    return request({
        url: '/system/externalKnowledge/saveExternalKnowledge',
        method: 'post',
        data: data
    })
}
export function delExternalKnowledge(params) {
    return request({
        url: '/system/externalKnowledge/deletedExternalKnowledge',
        method: 'get',
        params: params
    })
}
src/api/documentManage/index.js
New file
@@ -0,0 +1,121 @@
import request from '@/utils/request'
export function getDocDistributeCollectList(params) {
    return request({
        url: '/system/documentDistributionCollection/selectDocumentDistributionCollectionList',
        method: 'get',
        params: params
    })
}
export function saveDocDistributeCollect(data) {
    return request({
        url: '/system/documentDistributionCollection/saveDocumentDistributionCollection',
        method: 'post',
        data: data
    })
}
export function delDocDistributeCollect(params) {
    return request({
        url: '/system/documentDistributionCollection/deletedDocumentDistributionCollection',
        method: 'get',
        params: params
    })
}
export function getDocDistributeCollectDetail(params) {
    return request({
        url: '/system/documentDistributionCollection/getDocumentDistributionCollection',
        method: 'get',
        params: params
    })
}
export function getDocChangesInvalidateList(params) {
    return request({
        url: '/system/documentChangesInvalidated/selectDocumentChangesInvalidatedList',
        method: 'get',
        params: params
    })
}
export function saveDocChangesInvalidate(data) {
    return request({
        url: '/system/documentChangesInvalidated/saveDocumentChangesInvalidated',
        method: 'post',
        data: data
    })
}
export function delDocChangesInvalidate(params) {
    return request({
        url: '/system/documentChangesInvalidated/deletedDocumentChangesInvalidated',
        method: 'get',
        params: params
    })
}
export function getDocChangesInvalidateDetail(params) {
    return request({
        url: '/system/documentChangesInvalidated/getDocumentChangesInvalidated',
        method: 'get',
        params: params
    })
}
export function getDocBorrowCopyList(params) {
    return request({
        url: '/system/documentBorrowCopy/selectDocumentBorrowCopyList',
        method: 'get',
        params: params
    })
}
export function saveDocBorrowCopy(data) {
    return request({
        url: '/system/documentBorrowCopy/saveDocumentBorrowCopy',
        method: 'post',
        data: data
    })
}
export function delDocBorrowCopy(params) {
    return request({
        url: '/system/documentBorrowCopy/deletedDocumentBorrowCopy',
        method: 'get',
        params: params
    })
}
export function getDocBorrowCopyDetail(params) {
    return request({
        url: '/system/documentBorrowCopy/getDocumentBorrowCopy',
        method: 'get',
        params: params
    })
}
export function getDocDestructionApplyList(params) {
    return request({
        url: '/system/documentDestructionApply/selectDocumentDestructionApplyList',
        method: 'get',
        params: params
    })
}
export function saveDocDestructionApply(data) {
    return request({
        url: '/system/documentDestructionApply/saveDocumentDestructionApply',
        method: 'post',
        data: data
    })
}
export function delDocDestructionApply(params) {
    return request({
        url: '/system/documentDestructionApply/deletedDocumentDestructionApply',
        method: 'get',
        params: params
    })
}
src/api/staffManage/staff.js
@@ -151,3 +151,19 @@
        params: params
    })
}
export function updateSpecialCertificate(data) {
    return request({
        url: '/system/user/specialCertificate',
        method: 'put',
        data: data
    })
}
export function getDepEmpsDetail(params) {
    return request({
        url: '/system/user/getUserData',
        method: 'get',
        params: params
    })
}
src/layout/components/Sidebar/Logo.vue
@@ -1,11 +1,11 @@
<template>
  <div class="sidebar-logo-container" :class="{ 'collapse': collapse }" :style="{ backgroundColor: sideTheme === 'theme-dark' ? variables.menuBackground : variables.menuLightBackground }">
    <transition name="sidebarLogoFade">
      <router-link v-if="collapse" key="collapse" class="sidebar-logo-link" to="/build/conpanyFunctionConsult/companyInfo/overview">
      <router-link v-if="collapse" key="collapse" class="sidebar-logo-link" to="/build/companyInfo/overview">
        <img v-if="logo" :src="logo" class="sidebar-logo" />
        <h1 v-else class="sidebar-title" :style="{ color: sideTheme === 'theme-dark' ? variables.logoTitleColor : variables.logoLightTitleColor }">{{ title }}</h1>
      </router-link>
      <router-link v-else key="expand" class="sidebar-logo-link" to="/build/conpanyFunctionConsult/companyInfo/overview">
      <router-link v-else key="expand" class="sidebar-logo-link" to="/build/companyInfo/overview">
        <img v-if="logo" :src="logo" class="sidebar-logo" />
        <h1 class="sidebar-title" :style="{ color: sideTheme === 'theme-dark' ? variables.logoTitleColor : variables.logoLightTitleColor }">{{ title }}</h1>
      </router-link>
src/views/build/conpanyFunctionConsult/staffManage/staffRegister/components/staffDialog.vue
@@ -24,14 +24,34 @@
        <el-form-item label="年龄:" prop="age" v-if="state.title !== '修改密码'">
          <el-input v-model.number.trim="state.form.age" type="number" :disabled="disabled" placeholder="请输入年龄"></el-input>
        </el-form-item>
        <el-form-item label="学历:" prop="qualification" v-if="state.title !== '修改密码'">
          <el-select
              v-model="state.form.qualification"
              placeholder="请选择学历"
              style="width: 100%"
          >
            <el-option
                v-for="item in state.quaList"
                :key="item.id"
                :label="item.name"
                :value="item.id"
            />
          </el-select>
        </el-form-item>
        <el-form-item label="职称:" prop="positional" v-if="state.title !== '修改密码'">
          <el-input v-model.trim="state.form.positional" :disabled="disabled" placeholder="请输入职称"></el-input>
<!--          <el-input v-model.trim="state.form.positional" :disabled="disabled" placeholder="请输入职称"></el-input>-->
          <el-radio-group v-model="state.form.positional"  :disabled="disabled">
            <el-radio label="1">初级</el-radio>
            <el-radio label="2">中级</el-radio>
            <el-radio label="3">高级</el-radio>
          </el-radio-group>
        </el-form-item>
        <el-form-item label="人员类别:"  prop="personType" v-if="state.title !== '修改密码'">
          <el-radio-group v-model="state.form.personType"  :disabled="disabled">
            <el-radio :label="1">技术</el-radio>
            <el-radio :label="2">管理</el-radio>
            <el-radio :label="3">行政</el-radio>
            <el-radio :label="4">特殊作业</el-radio>
          </el-radio-group>
        </el-form-item>
        <el-form-item label="身份证号:"  prop="idCard" v-if="state.title !== '修改密码'">
@@ -329,12 +349,20 @@
    entryTime: [{ required: true, message: '请选择入职时间', trigger: 'blur' }],
    age: [{ required: true, message: '请输入年龄', trigger: 'blur' }],
    personType: [{ required: true, message: '请选择人员类别', trigger: 'blur' }],
    post: [{ required: true, message: '请输入专业', trigger: 'blur' }],
    positional: [{ required: true, message: '请输入职称', trigger: 'blur' }],
    roles: [{ required: true, message: '请选择角色', trigger: 'blur' }]
  },
  companyList: [],
  userList: [],
  roleList: [],
  quaList: [
    {id: 1, name: '高中及以下'},
    {id: 2, name: '专科'},
    {id: 3, name: '本科'},
    {id: 4, name: '硕士'},
    {id: 5, name: '博士及以上'}
  ],
  keyword:'',
  pageNum: 1,
  pageSize: 10,
@@ -386,15 +414,7 @@
    }
    state.form.roles = value.roles.map(i=>i.roleId)
  }
  if(type == 'pwd'){
    state.form.id = value.id
  }
  dialogVisible.value = true
  if(type === 'edit' && state.form && (state.form.userType === 2||state.form.userType === 3)){
    await nextTick(() => {
      // doGetUser()
    })
  }
}
const finshed = ref(false)
src/views/work/assetMng/toolsMonitorMeasure/annualVerificationPlan/components/editDialog.vue
New file
@@ -0,0 +1,557 @@
<template>
  <div class="notice">
    <el-dialog
        v-model="dialogVisible"
        :title="state.title"
        width="75%"
        :before-close="handleClose"
        :close-on-press-escape="false"
        :close-on-click-modal="false"
    >
      <el-form :model="state.form" size="default" ref="superRef" :rules="state.formRules" label-width="150px" >
        <el-form-item v-if="state.isAdmin && state.title !== '上传'" label="企业:" prop="companyId">
          <el-select v-model="state.form.companyId" placeholder="请选择" :disabled="state.title =='查看'" clearable @change="getDeptList">
            <el-option
                v-for="item in state.companyList"
                :key="item.id"
                :label="item.name"
                :value="item.id">
            </el-option>
          </el-select>
        </el-form-item>
        <el-form-item label="计划名称:" prop="name" v-if="state.title !== '上传'">
          <el-input
              v-model.trim="state.form.name"
              style="width: 100%;"
              clearable
              :readonly="state.title == '查看'"
          >
          </el-input>
        </el-form-item>
        <el-form-item label="年份:" prop="year" v-if="state.title !== '上传'">
          <el-date-picker
              v-model="state.form.year"
              type="year"
              value-format="YYYY"
              placeholder="请选择年份"
              :disabled="state.title == '查看'"
          />
        </el-form-item>
        <el-form-item label="设备列表:" prop="annualVerificationDevices" v-if="state.title !== '上传'">
          <el-button
              type="primary"
              plain
              icon="Plus"
              @click="addLine"
              style="margin-bottom: 10px"
              v-if="state.title == '新增'||state.title == '编辑' "
          >新增</el-button>
        </el-form-item>
        <el-table :data="state.form.annualVerificationDevices" class="customedTable" :border="true" v-if="state.title !== '上传'">
          <el-table-column label="序号" type="index" width="80" align="center">
          </el-table-column>
          <el-table-column label="设备编号" prop="deviceNumber" align="center">
            <template #default="scope">
              <el-input
                  v-model.trim="scope.row.deviceNumber"
                  size="large"
                  type="textarea"
                  style="width: 100%;"
                  clearable
                  :readonly="state.title =='查看'"
              >
              </el-input>
            </template>
          </el-table-column>
          <el-table-column label="设备名称" prop="deviceName" align="center">
            <template #default="scope">
              <el-input
                  v-model.trim="scope.row.deviceName"
                  size="large"
                  type="textarea"
                  style="width: 100%;"
                  clearable
                  :readonly="state.title =='查看'"
              >
              </el-input>
            </template>
          </el-table-column>
          <el-table-column label="规格型号" prop="model" align="center">
            <template #default="scope">
              <el-input
                  v-model.trim="scope.row.model"
                  size="large"
                  type="textarea"
                  style="width: 100%;"
                  clearable
                  :readonly="state.title =='查看'"
              >
              </el-input>
            </template>
          </el-table-column>
          <el-table-column label="校准周期" prop="calibrationCycle" align="center">
            <template #default="scope">
              <el-input
                  v-model.trim="scope.row.calibrationCycle"
                  size="large"
                  type="textarea"
                  style="width: 100%;"
                  clearable
                  :readonly="state.title =='查看'"
              >
              </el-input>
            </template>
          </el-table-column>
          <el-table-column label="下次校准时间" prop="nextCalibrationTime" align="center">
            <template #default="scope">
              <el-date-picker
                  :disabled="state.title =='查看'"
                  v-model="scope.row.nextCalibrationTime"
                  type="date"
                  placeholder="请选择日期"
                  value-format="YYYY-MM-DD"
              />
            </template>
          </el-table-column>
          <el-table-column label="实际检定时间" prop="actCalibrationTime" align="center">
            <template #default="scope">
              <el-date-picker
                  :disabled="state.title =='查看'"
                  v-model="scope.row.actCalibrationTime"
                  type="date"
                  placeholder="请选择日期"
                  value-format="YYYY-MM-DD"
              />
            </template>
          </el-table-column>
          <el-table-column label="校准人" prop="calibrationUser" align="center">
            <template #default="scope">
              <el-input
                  v-model.trim="scope.row.calibrationUser"
                  size="large"
                  type="textarea"
                  style="width: 100%;"
                  clearable
                  :readonly="state.title =='查看'"
              >
              </el-input>
            </template>
          </el-table-column>
          <el-table-column label="目前状态" prop="status" align="center">
            <template #default="scope">
              <el-input
                  v-model.trim="scope.row.status"
                  size="large"
                  type="textarea"
                  style="width: 100%;"
                  clearable
                  :readonly="state.title =='查看'"
              >
              </el-input>
            </template>
          </el-table-column>
          <el-table-column label="使用人" prop="useUser" align="center">
            <template #default="scope">
              <el-input
                  v-model.trim="scope.row.useUser"
                  size="large"
                  type="textarea"
                  style="width: 100%;"
                  clearable
                  :readonly="state.title =='查看'"
              >
              </el-input>
            </template>
          </el-table-column>
          <el-table-column label="操作" align="center" width="70" v-if="state.title == '新增'||state.title == '编辑' ">
            <template #default="scope">
              <el-button link type="danger" @click="handleDelete(scope.$index)">删除</el-button>
            </template>
          </el-table-column>
        </el-table>
        <el-form-item label="证书名称:" prop="certificateName" v-if="state.title == '上传'">
          <el-input
              v-model.trim="state.form.certificateName"
              style="width: 100%;"
              clearable
              :readonly="state.title == '查看'"
          >
          </el-input>
        </el-form-item>
        <el-form-item label="检定证书:" prop="certificate" v-if="state.title == '上传'">
          <el-upload accept=".pdf,image/*" :action="state.uploadUrl" :headers="state.header" method="post" :on-success="(res, uploadFile)=>handleAvatarSuccess(res, uploadFile)" :on-exceed="showTip" :limit='state.fileLimit' v-model:file-list="state.fileList" :before-upload="picSize" :on-remove="(file, uploadFiles)=>handleRemove(file, uploadFiles)" >
            <el-button type="primary">点击上传</el-button>
            <template #tip>
              <div class="el-upload__tip">支持上传pdf、图片格式,尺寸小于5M,最多可上传1份</div>
            </template>
          </el-upload>
        </el-form-item>
        <el-row v-if="state.title !== '上传'">
          <el-col :span="12">
            <el-form-item label="编制:" prop="establishmentId">
              <el-select clearable v-model="state.form.establishmentId" :disabled="state.title =='查看'" filterable placeholder="编制" style="width: 100%">
                <el-option
                    v-for="item in state.userList"
                    :key="item.userId"
                    :label="item.name"
                    :value="item.userId"
                />
              </el-select>
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="日期:" prop="establishmentTime" >
              <el-date-picker
                  :disabled="state.title =='查看'"
                  v-model="state.form.establishmentTime"
                  type="date"
                  placeholder="请选择日期"
                  value-format="YYYY-MM-DD"
              />
            </el-form-item>
          </el-col>
        </el-row>
        <el-row v-if="state.title !== '上传'">
          <el-col :span="12">
            <el-form-item label="审核:" prop="processId">
              <el-select clearable v-model="state.form.processId" :disabled="state.title =='查看'" filterable placeholder="审核" style="width: 100%">
                <el-option
                    v-for="item in state.userList"
                    :key="item.userId"
                    :label="item.name"
                    :value="item.userId"
                />
              </el-select>
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="日期:" prop="processTime" >
              <el-date-picker
                  :disabled="state.title =='查看'"
                  v-model="state.form.processTime"
                  type="date"
                  placeholder="请选择日期"
                  value-format="YYYY-MM-DD"
              />
            </el-form-item>
          </el-col>
        </el-row>
        <el-form-item label="检定证书:" v-if="state.title == '查看' && state.form.certificate && state.form.certificate !== ''">
          <el-button type="text" @click="openFile(state.form.certificate)">预览</el-button>
        </el-form-item>
      </el-form>
      <template #footer v-if="state.title !='查看'">
        <span class="dialog-footer">
            <el-button @click="handleClose" size="default">取 消</el-button>
            <el-button type="primary"  @click="onSubmit" size="default" v-preReClick>确认</el-button>
        </span>
      </template>
    </el-dialog>
  </div>
</template>
<script setup>
import {reactive, ref, toRefs, defineEmits, nextTick, onMounted} from 'vue'
import {ElMessage} from "element-plus";
import {getToken} from "@/utils/auth";
import {
  updateMaintenanceEvaluate,
  getMaintenanceEvaluateDetail
} from "@/api/infrastructureMng/ledger";
import {listUser} from "@/api/system/user";
import {getAnnualVerificationPlanDetail, saveAnnualVerificationPlan} from "@/api/assetManage/assetMng";
import {delPic} from "@/api/onlineEducation/banner";
const emit = defineEmits(["getList"]);
const dialogVisible = ref(false)
const superRef = ref()
const checkList = (rule, value, callback) => {
  if (state.form.annualVerificationDevices.length == 0) {
    callback(new Error('设备列表不可为空'))
  } else {
    callback()
  }
}
const checkFileList = (rule, value, callback) => {
  if (state.fileList.length == 0) {
    callback(new Error('请上传证书文件'))
  } else {
    callback()
  }
}
const state = reactive({
  title: '',
  form: {
    id: null,
    companyId: null,
    name: '',
    year: '',
    annualVerificationDevices: [],
    delData: [],
    establishmentId: null,
    establishmentName: '',
    establishmentTime: '',
    processId: null,
    processName: '',
    processTime: '',
    certificateName: '',
    certificate: '',
  },
  oldDeviceList: [],
  formRules:{
    companyId: [{ required: true, message: '请选择企业', trigger: 'blur' }],
    name: [{ required: true, message: '请填写计划名称', trigger: 'blur' }],
    year: [{ required: true, message: '请选择年份', trigger: 'blur' }],
    annualVerificationDevices: [{ required: true, validator: checkList, trigger: 'blur' }],
    establishmentId: [{ required: true, message: '请选择编制人', trigger: 'blur' }],
    establishmentTime: [{ required: true, message: '请选择编制时间', trigger: 'blur' }],
    processId: [{ required: true, message: '请选择审核人', trigger: 'blur' }],
    processTime: [{ required: true, message: '请选择审核时间', trigger: 'blur' }],
    approvalId: [{ required: true, message: '请选择批准人', trigger: 'blur' }],
    certificateName: [{ required: true, message: '请填写证书名称', trigger: 'blur' }],
    certificate: [{ required: true, validator: checkFileList, trigger: 'blur' }]
  },
  isAdmin: false,
  companyList: [],
  userList: [],
  uploadUrl: import.meta.env.VITE_APP_BASE_API + '/system/common/uploadFile',
  header: {
    Authorization: getToken()
  },
  fileLimit: 1,
  fileList: []
})
onMounted(() => {
});
const openFile = (value) =>{
  window.open(import.meta.env.VITE_APP_BASE_API + '/' + value)
}
const openDialog = async (type, value,companyId, isAdmin, companyList) => {
  state.isAdmin = isAdmin
  if(isAdmin){
    state.companyList = companyList
  }
  await getUserList(companyId)
  state.title = type === 'add' ? '新增' : type ==='edit' ? '编辑' : type ==='upload' ? '上传' : '查看'
  state.form.companyId = companyId
  if(state.title == '编辑'||state.title == '查看' ||state.title == '上传'){
    await getInfo(value.id)
  }
  dialogVisible.value = true
}
const addLine = () => {
  const obj = {
    id: null,
    annualVerificationId: null,
    deviceNumber: '',
    deviceName: '',
    model: '',
    calibrationCycle: '',
    nextCalibrationTime: '',
    actCalibrationTime: '',
    calibrationUser: '',
    status: '',
    useUser: ''
  }
  state.form.annualVerificationDevices.push(obj);
}
const handleDelete = (i) =>{
  state.form.annualVerificationDevices = state.form.annualVerificationDevices.filter((item,index) => index != i)
}
const onSubmit = async () => {
  const valid = await superRef.value.validate();
  if(valid){
    const data = JSON.parse(JSON.stringify(state.form))
    data.delData = state.oldDeviceList.filter(i =>!data.annualVerificationDevices.some(item=>item.id == i.id)).map(i=>i.id)
    data.establishmentName = state.userList.find(i=>i.userId == data.establishmentId)?.name
    data.processName = state.userList.find(i=>i.userId == data.processId)?.name
    if(state.title == '新增'){
      delete data.id
      const res = await saveAnnualVerificationPlan(data)
      if(res.code == 200){
        ElMessage.success(res.message)
        emit('getList')
        handleClose()
        dialogVisible.value = false;
      }else{
        ElMessage.warning(res.message)
      }
    }else{
      const res = await saveAnnualVerificationPlan(data)
      if(res.code == 200){
        ElMessage.success(res.message)
        emit('getList')
        handleClose()
        dialogVisible.value = false;
      }else{
        ElMessage.warning(res.message)
      }
    }
  }
}
const getInfo = async (id)=> {
  const res = await getAnnualVerificationPlanDetail({id: id})
  if(res.code == 200){
    Object.keys(state.form).forEach(key => {
      if (key in res.data) {
        state.form[key] = res.data[key]
      }
    })
    state.form.annualVerificationDevices = res.data.annualVerificationDevices?.map(item=>{
      return {
        id: item.id,
        annualVerificationId: item.annualVerificationId,
        deviceNumber: item.deviceNumber,
        deviceName: item.deviceName,
        model: item.model,
        calibrationCycle: item.calibrationCycle,
        nextCalibrationTime: item.nextCalibrationTime,
        actCalibrationTime: item.actCalibrationTime,
        calibrationUser: item.calibrationUser,
        useUser: item.useUser,
        status: item.status
      }
    })
    state.oldDeviceList = state.form.annualVerificationDevices
    if(state.form.certificate) {
      const obj = {
        url: state.form.certificate,
        name: state.form.certificateName
      }
      state.fileList = [obj]
    }
  }else{
    ElMessage.warning(res.message)
  }
}
const getDeptList = async ()=>{
  state.form.establishmentId = null
  state.form.processId = null
  await getUserList(state.form.companyId)
}
const getUserList = async (companyId)=> {
  const res = await listUser({pageIndex: 1,pageSize: 999,companyId: companyId})
  if(res.code == 200){
    state.userList = res.data.list?res.data.list.map(item=>{
      const user = item.id
      const {id, ...data} = item
      return {
        ...data,
        userId: user
      }
    }):[]
  }else{
    ElMessage.warning(res.message)
  }
}
const handleAvatarSuccess = (res, uploadFile) => {
  if(res.code == 200){
    state.form.certificate = res.data.path
  }else{
    state.fileList = []
    ElMessage({
      type: 'warning',
      message: '文件上传失败'
    })
  }
}
const showTip =()=>{
  ElMessage({
    type: 'warning',
    message: '超出文件上传数量'
  });
}
const picSize = async (rawFile) => {
  if(rawFile.size / 1024 / 1024 > 5){
    ElMessage({
      type: 'warning',
      message: '文件大小不能超过5M'
    });
    return false
  }
};
const handleRemove = async (file, uploadFiles) => {
  let path = state.form.filePath;
  await delPic({path: path}).then(res => {
    if(res.code == 200){
      // ElMessage({
      //   type: 'success',
      //   message: '文件已删除'
      // })
      state.form.certificate = ''
    }else{
      ElMessage({
        type: 'warning',
        message: res.message
      })
    }
  }).catch(() => {
    state.form.certificate = ''
  });
}
const handleClose = () => {
  state.form = {
    id: null,
    companyId: null,
    name: '',
    year: '',
    annualVerificationDevices: [],
    delData: [],
    establishmentId: null,
    establishmentName: '',
    establishmentTime: '',
    processId: null,
    processName: '',
    processTime: '',
    certificateName: '',
    certificate: '',
  }
  state.fileList = []
  superRef.value.clearValidate();
  superRef.value.resetFields()
  dialogVisible.value = false;
}
defineExpose({
  openDialog
});
</script>
<style scoped lang="scss">
.notice{
  :deep(.el-form .el-form-item__label) {
    font-size: 15px;
  }
  .file {
    display: flex;
    flex-direction: column;
    align-items: flex-start;
  }
}
</style>
<style lang="scss">
.customedTable{
  width: calc(100% - 150px);
  margin-left: 150px;
  margin-bottom: 30px;
  .el-table__cell{
    padding: 2px 0 !important;
    font-size: 14px !important;
  }
  .cell{
    padding: 0 2px !important;
    font-size: 14px !important;
  }
}
</style>
src/views/work/assetMng/toolsMonitorMeasure/annualVerificationPlan/index.vue
New file
@@ -0,0 +1,205 @@
<template>
  <div class="app-container">
    <div style="display: flex;justify-content: space-between">
      <el-form :inline="true" style="display: flex;align-items: center;flex-wrap: wrap;" >
        <el-form-item>
          <el-button
              type="primary"
              plain
              icon="Plus"
              @click="openDialog('add',{})"
          >新增</el-button>
        </el-form-item>
        <el-form-item v-if="isAdmin" label="企业:" >
          <el-select v-model="data.queryParams.companyId" placeholder="请选择" clearable>
            <el-option
                v-for="item in companyList"
                :key="item.id"
                :label="item.name"
                :value="item.id">
            </el-option>
          </el-select>
        </el-form-item>
        <el-form-item >
          <el-button v-if="isAdmin" type="primary" @click="getList">查询</el-button>
          <el-button v-if="isAdmin" type="primary" plain @click="reset">重置</el-button>
<!--          <el-button type="primary">导出</el-button>-->
        </el-form-item>
      </el-form>
    </div>
    <!-- 表格数据 -->
    <el-table v-loading="loading" :data="dataList" :border="true">
      <el-table-column type="index" label="序号"></el-table-column>
      <el-table-column prop="name" align="center" label="计划名称"></el-table-column>
      <el-table-column prop="certificateName" align="center" label="检定证书">
        <template #default="scope">
          {{scope.row.certificateName}}
        </template>
      </el-table-column>
      <el-table-column label="操作" align="center">
        <template #default="scope">
          <el-button link type="primary" @click="openDialog('view',scope.row)">查看</el-button>
          <el-button link type="primary" @click="openDialog('edit',scope.row)">编辑</el-button>
          <el-button link type="primary" @click="openDialog('upload',scope.row)">上传证书</el-button>
          <el-button link type="primary" @click="downloadFile(scope.row)">导出</el-button>
          <el-button link type="danger" @click="handleDelete(scope.row)">删除</el-button>
        </template>
      </el-table-column>
    </el-table>
    <pagination
        v-show="total > 0"
        :total="total"
        v-model:page="queryParams.pageNum"
        v-model:limit="queryParams.pageSize"
        @pagination="getList"
    />
    <edit-dialog ref="dialogRef" @getList=getList></edit-dialog>
  </div>
</template>
<script setup>
import {getCurrentInstance, onMounted, onUnmounted, reactive, ref, toRefs} from "vue";
import {ElMessage, ElMessageBox} from "element-plus";
import {delCompany, getCompany} from "@/api/onlineEducation/company";
import Cookies from "js-cookie";
import editDialog from './components/editDialog.vue'
import useUserStore from "@/store/modules/user";
import {generateWordDocument} from "@/utils/exportWord";
import {
  delMaintenanceEvaluate,
  getMaintenanceEvaluateDetail,
  getMaintenanceEvaluateList
} from "@/api/infrastructureMng/ledger";
import {
  delAnnualVerificationPlan,
  getAnnualVerificationPlanDetail,
  getAnnualVerificationPlanList
} from "@/api/assetManage/assetMng";
const userStore = useUserStore()
const { proxy } = getCurrentInstance();
const loading = ref(false);
const dialogRef = ref();
const data = reactive({
  queryParams: {
    pageNum: 1,
    pageSize: 10,
    companyId: null
  },
  total: 0,
  dataList: [],
  companyList: [],
  isAdmin: false
});
const { queryParams, total, dataList,companyList, isAdmin } = toRefs(data);
const userInfo = ref()
onMounted(async ()=>{
  if(userStore.roles.includes('admin')){
    data.isAdmin = true
    await getCompanyList()
  }else{
    data.isAdmin = false
    data.queryParams.companyId = userStore.companyId
  }
  await getList()
})
onUnmounted(()=>{
})
const getList = async () => {
  loading.value = true
  const res = await getAnnualVerificationPlanList(data.queryParams)
  if(res.code == 200){
    data.dataList = res.data.list || []
    data.total = res.data.total
  }else{
    ElMessage.warning(res.message)
  }
  loading.value = false
}
const getCompanyList = async ()=>{
  const queryParams = {
    pageNum: 1,
    pageSize: 999
  }
  const res = await getCompany(queryParams)
  if (res.code == 200) {
    data.companyList = res.data.list?res.data.list:[]
  } else {
    ElMessage.warning(res.message)
  }
}
const downloadFile = async (val)=>{
  const res = await getAnnualVerificationPlanDetail({id: val.id})
  if(res.code == 200){
    if(res.data){
      let tableData = res.data
      tableData.table = res.data.annualVerificationDevices.map((item,index)=>{
        return {
          ...item,
          index: index + 1,
          nextCalibrationTime: item.nextCalibrationTime.substring(0,10),
          actCalibrationTime: item.actCalibrationTime.substring(0,10)
        }
      })
      tableData.establishmentTime = tableData.establishmentTime.substring(0,10)
      tableData.processTime = tableData.processTime.substring(0,10)
      try {
        generateWordDocument('/annualVerificationPlan.docx', tableData, tableData.name +'.docx');
      } catch (error){
        ElMessage({
          type: 'warning',
          message: '导出失败'
        });
      }
    }else{
      ElMessage.warning('暂无数据')
    }
  }else{
    ElMessage.warning(res.message)
  }
}
const openDialog = (type, value) => {
  dialogRef.value.openDialog(type, value, data.queryParams.companyId, data.isAdmin, data.companyList);
}
/** 重置新增的表单以及其他数据  */
const reset= async()=> {
  data.queryParams = {
    pageNum: 1,
    pageSize: 10,
    companyId: null
  }
  await getCompanyList()
  await getList()
}
const handleDelete = (val) => {
  ElMessageBox.confirm(
      '确定删除此条数据?',
      '提示',
      {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning',
      })
      .then( async() => {
        const res = await delAnnualVerificationPlan({id: val.id})
        if(res.code == 200){
          ElMessage.success('数据删除成功')
          await getList()
        }else{
          ElMessage.warning(res.message)
        }
      })
}
</script>
src/views/work/assetMng/toolsMonitorMeasure/equipCalibrateConfirm/components/editDialog.vue
New file
@@ -0,0 +1,282 @@
<template>
  <div class="notice">
    <el-dialog
        v-model="dialogVisible"
        :title="state.title"
        width="50%"
        :before-close="handleClose"
        :close-on-press-escape="false"
        :close-on-click-modal="false"
    >
      <el-form :model="state.form" size="default" ref="superRef" :rules="state.formRules" label-width="150px" >
        <el-form-item v-if="state.isAdmin" label="企业:" prop="companyId">
          <el-select v-model="state.form.companyId" placeholder="请选择" :disabled="state.title =='查看'" clearable @change="getDeptList">
            <el-option
                v-for="item in state.companyList"
                :key="item.id"
                :label="item.name"
                :value="item.id">
            </el-option>
          </el-select>
        </el-form-item>
        <el-row>
          <el-col :span="12">
            <el-form-item label="设备名称:" prop="deviceName">
              <el-input v-model.trim="state.form.deviceName" :readonly="state.title =='查看'"></el-input>
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="设备编号:" prop="deviceNumber">
              <el-input v-model.trim="state.form.deviceNumber" :readonly="state.title =='查看'"></el-input>
            </el-form-item>
          </el-col>
        </el-row>
        <el-row>
          <el-col :span="12">
            <el-form-item label="校准日期:" prop="calibrationTime">
              <el-date-picker
                  v-model="state.form.calibrationTime"
                  type="date"
                  value-format="YYYY-MM-DD"
                  placeholder="请选择校准日期"
                  :disabled="state.title =='查看'"
                  style="width: 100%"
              />
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="校准证书编号:" prop="calibrationNumber">
              <el-input v-model.trim="state.form.calibrationNumber" :readonly="state.title =='查看'"></el-input>
            </el-form-item>
          </el-col>
        </el-row>
        <el-form-item label="校准单位:" prop="calibrationCompany">
          <el-input v-model.trim="state.form.calibrationCompany" :readonly="state.title =='查看'"></el-input>
        </el-form-item>
        <el-form-item label="校准结果确认:" prop="calibrationResult">
          <el-radio-group v-model="state.form.calibrationResult" :disabled="state.title =='查看'">
            <el-radio :label="1">满足使用要求</el-radio>
            <el-radio :label="2">不满足使用要求</el-radio>
          </el-radio-group>
        </el-form-item>
        <el-row>
          <el-col :span="12">
            <el-form-item label="确认人:" prop="confirmUser">
<!--              <el-select clearable v-model="state.form.establishmentId" :disabled="state.title =='查看'" filterable placeholder="编制" style="width: 100%">-->
<!--                <el-option-->
<!--                    v-for="item in state.userList"-->
<!--                    :key="item.userId"-->
<!--                    :label="item.name"-->
<!--                    :value="item.userId"-->
<!--                />-->
<!--              </el-select>-->
              <el-input v-model.trim="state.form.confirmUser" :readonly="state.title =='查看'" style="width: 100%"></el-input>
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="日期:" prop="confirmTime">
              <el-date-picker
                  :disabled="state.title =='查看'"
                  v-model="state.form.confirmTime"
                  type="date"
                  placeholder="请选择日期"
              />
            </el-form-item>
          </el-col>
        </el-row>
        <el-row>
          <el-col :span="12">
            <el-form-item label="管理人员:" prop="executiveUser">
<!--              <el-select clearable v-model="state.form.executiveUser" :disabled="state.title =='查看'" filterable placeholder="编制" style="width: 100%">-->
<!--                <el-option-->
<!--                    v-for="item in state.userList"-->
<!--                    :key="item.userId"-->
<!--                    :label="item.name"-->
<!--                    :value="item.userId"-->
<!--                />-->
<!--              </el-select>-->
              <el-input v-model.trim="state.form.executiveUser" :readonly="state.title =='查看'" style="width: 100%"></el-input>
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="日期:" prop="executiveTime">
              <el-date-picker
                  :disabled="state.title =='查看'"
                  v-model="state.form.executiveTime"
                  type="date"
                  placeholder="请选择日期"
              />
            </el-form-item>
          </el-col>
        </el-row>
      </el-form>
      <template #footer v-if="state.title !='查看'">
        <span class="dialog-footer">
            <el-button @click="handleClose" size="default">取 消</el-button>
            <el-button type="primary"  @click="onSubmit" size="default" v-preReClick>确认</el-button>
        </span>
      </template>
    </el-dialog>
  </div>
</template>
<script setup>
import {reactive, ref, toRefs, defineEmits, nextTick, onMounted} from 'vue'
import {ElMessage} from "element-plus";
import {Base64} from "js-base64"
import {getToken} from "@/utils/auth";
import {
  addInternalAuditCheck, getInternalAuditCheckInfo,
  updateInternalAuditCheck
} from "@/api/innerReview/meetingReview";
import {getDepart} from "@/api/orgStructure/depart";
import {listUser} from "@/api/system/user";
import {getMaintenanceRecordDetail, updateMaintenanceRecord} from "@/api/infrastructureMng/ledger";
import {saveCalibrationMonitoringEquipment} from "@/api/assetManage/assetMng";
const emit = defineEmits(["getList"]);
const dialogVisible = ref(false)
const superRef = ref()
const state = reactive({
  title: '',
  form: {
    id: null,
    companyId: null,
    deviceName: '',
    deviceNumber: '',
    calibrationTime: '',
    calibrationNumber: '',
    calibrationCompany: '',
    calibrationResult: null,
    confirmUser: '',
    confirmTime: '',
    executiveUser: '',
    executiveTime: ''
  },
  formRules:{
    companyId: [{ required: true, message: '请选择企业', trigger: 'blur' }],
    deviceName: [{ required: true, message: '请填写设备名称', trigger: 'blur' }],
    deviceNumber: [{ required: true, message: '请填写设备编号',  trigger: 'blur' }],
    calibrationTime: [{ required: true, message: '请选择校准日期',  trigger: 'blur' }],
    calibrationNumber: [{ required: true, message: '请填写校准证书编号',  trigger: 'blur' }],
    calibrationCompany: [{ required: true, message: '请填写校准单位',  trigger: 'blur' }],
    calibrationResult: [{ required: true, message: '请选择校准结果',  trigger: 'blur' }],
    confirmUser: [{ required: true, message: '请填写确认人',  trigger: 'blur' }],
    confirmTime: [{ required: true, message: '请选择日期',  trigger: 'blur' }],
    executiveUser: [{ required: true, message: '请填写管理人员',  trigger: 'blur' }],
    executiveTime: [{ required: true, message: '请选择日期',  trigger: 'blur' }]
  },
  isAdmin: false,
  companyList: [],
  userList: []
})
onMounted(() => {
});
const openDialog = async (type, value,companyId, isAdmin, companyList) => {
  state.isAdmin = isAdmin
  if(isAdmin){
    state.companyList = companyList
  }
  await getUserList(companyId)
  state.title = type === 'add' ? '新增' : type ==='edit' ? '编辑' : '查看'
  state.form.companyId = companyId
  if(state.title == '编辑'||state.title == '查看'){
    Object.keys(state.form).forEach(key => {
      if (key in value) {
        state.form[key] = value[key]
      }
    })
  }
  dialogVisible.value = true
}
const onSubmit = async () => {
  const valid = await superRef.value.validate()
  if(valid){
    const data = JSON.parse(JSON.stringify(state.form))
    if(state.title == '新增'){
      delete data.id
      const res = await saveCalibrationMonitoringEquipment(data)
      if(res.code == 200){
        ElMessage.success(res.message)
        emit('getList')
        handleClose()
        dialogVisible.value = false;
      }else{
        ElMessage.warning(res.message)
      }
    }else{
      const res = await saveCalibrationMonitoringEquipment(data)
      if(res.code == 200){
        ElMessage.success(res.message)
        emit('getList')
        handleClose()
        dialogVisible.value = false;
      }else{
        ElMessage.warning(res.message)
      }
    }
  }
}
const getDeptList = async ()=>{
  await getUserList(state.form.companyId)
}
const getUserList = async (companyId)=> {
  const res = await listUser({pageIndex: 1,pageSize: 999, companyId: companyId})
  if(res.code == 200){
    state.userList = res.data.list?res.data.list.map(item=>{
      const user = item.id
      const {id, ...data} = item
      return {
        ...data,
        userId: user
      }
    }):[]
  }else{
    ElMessage.warning(res.message)
  }
}
const handleClose = () => {
  state.form = {
    id: null,
    companyId: null,
    deviceName: '',
    deviceNumber: '',
    calibrationTime: '',
    calibrationNumber: '',
    calibrationCompany: '',
    calibrationResult: null,
    confirmUser: '',
    confirmTime: '',
    executiveUser: '',
    executiveTime: ''
  }
  superRef.value.clearValidate();
  superRef.value.resetFields()
  dialogVisible.value = false;
}
defineExpose({
  openDialog
});
</script>
<style scoped lang="scss">
.notice{
  :deep(.el-form .el-form-item__label) {
    font-size: 15px;
  }
  .file {
    display: flex;
    flex-direction: column;
    align-items: flex-start;
  }
}
</style>
src/views/work/assetMng/toolsMonitorMeasure/equipCalibrateConfirm/index.vue
New file
@@ -0,0 +1,205 @@
<template>
  <div class="app-container">
    <div style="display: flex;justify-content: space-between">
      <el-form :inline="true" style="display: flex;align-items: center;flex-wrap: wrap;" >
        <el-form-item>
          <el-button
              type="primary"
              plain
              icon="Plus"
              @click="openDialog('add',{})"
          >新增</el-button>
        </el-form-item>
        <el-form-item v-if="isAdmin" label="企业:" >
          <el-select v-model="data.queryParams.companyId" placeholder="请选择" clearable>
            <el-option
                v-for="item in companyList"
                :key="item.id"
                :label="item.name"
                :value="item.id">
            </el-option>
          </el-select>
        </el-form-item>
        <el-form-item >
          <el-button v-if="isAdmin" type="primary" @click="getList">查询</el-button>
          <el-button v-if="isAdmin" type="primary" plain @click="reset">重置</el-button>
<!--          <el-button type="primary">导出</el-button>-->
        </el-form-item>
      </el-form>
    </div>
    <!-- 表格数据 -->
    <el-table v-loading="loading" :data="dataList" :border="true">
      <el-table-column type="index" label="序号"></el-table-column>
      <el-table-column prop="deviceName" align="center" label="确认单">
        <template #default="scope">
          {{scope.row.deviceName + '确认单'}}
        </template>
      </el-table-column>
      <el-table-column label="操作" align="center">
        <template #default="scope">
          <el-button link type="primary" @click="openDialog('view',scope.row)">查看</el-button>
          <el-button link type="primary" @click="openDialog('edit',scope.row)">编辑</el-button>
          <el-button link type="primary" @click="downloadFile(scope.row)">导出</el-button>
          <el-button link type="danger" @click="handleDelete(scope.row)">删除</el-button>
        </template>
      </el-table-column>
    </el-table>
    <pagination
        v-show="total > 0"
        :total="total"
        v-model:page="queryParams.pageNum"
        v-model:limit="queryParams.pageSize"
        @pagination="getList"
    />
    <edit-dialog ref="dialogRef" @getList=getList></edit-dialog>
  </div>
</template>
<script setup>
import {getCurrentInstance, onMounted, onUnmounted, reactive, ref, toRefs} from "vue";
import {ElMessage, ElMessageBox} from "element-plus";
import {delCompany, getCompany} from "@/api/onlineEducation/company";
import Cookies from "js-cookie";
import editDialog from './components/editDialog.vue'
import useUserStore from "@/store/modules/user";
import {generateWordDocument} from "@/utils/exportWord";
import {
  delMaintenanceRecord,
  getMaintenanceRecordDetail,
  getMaintenanceRecordList
} from "@/api/infrastructureMng/ledger";
import {getInternalAuditCheckInfo} from "@/api/innerReview/meetingReview";
import {delCalibrationMonitoringEquipment, getCalibrationMonitoringEquipmentList} from "@/api/assetManage/assetMng";
const userStore = useUserStore()
const { proxy } = getCurrentInstance();
const loading = ref(false);
const dialogRef = ref();
const data = reactive({
  queryParams: {
    pageNum: 1,
    pageSize: 10,
    companyId: null
  },
  total: 0,
  dataList: [],
  companyList: [],
  expertData: [],
  isAdmin: false
});
const fields = ref({
  '序号':'index',
  '名称型号':'username',
  '部门':'idCard',
  '责任人/使用人':'entryTime',
  '编号':'deptName',
  '使用地点':'duty',
  '使用情况':'phone'
});
const { queryParams, total, dataList,companyList, isAdmin,  expertData } = toRefs(data);
const userInfo = ref()
onMounted(async ()=>{
  if(userStore.roles.includes('admin')){
    data.isAdmin = true
    await getCompanyList()
  }else{
    data.isAdmin = false
    data.queryParams.companyId = userStore.companyId
  }
  await getList()
})
onUnmounted(()=>{
})
const getList = async () => {
  loading.value = true
  const res = await getCalibrationMonitoringEquipmentList(data.queryParams)
  if(res.code == 200){
    data.dataList = res.data.list || []
    data.total = res.data.total
  }else{
    ElMessage.warning(res.message)
  }
  loading.value = false
}
const getCompanyList = async ()=>{
  const queryParams = {
    pageNum: 1,
    pageSize: 999
  }
  const res = await getCompany(queryParams)
  if (res.code == 200) {
    data.companyList = res.data.list?res.data.list:[]
    // data.queryParams.companyId = data.companyList[0].id
  } else {
    ElMessage.warning(res.message)
  }
}
const openDialog = (type, value) => {
  dialogRef.value.openDialog(type, value, data.queryParams.companyId, data.isAdmin, data.companyList);
}
const downloadFile = async (val)=>{
  let tableData = val
  tableData.calibrationTime = tableData.calibrationTime.substring(0,10)
  tableData.confirmTime = tableData.confirmTime.substring(0,10)
  tableData.executiveTime = tableData.executiveTime.substring(0,10)
  tableData.typeList = [
    {
      id: 1,
      label: '满足使用要求',
      checked: tableData.calibrationResult == 1 ? false : true
    },
    {
      id: 2,
      label: '不满足使用要求',
      checked: tableData.calibrationResult == 2 ? false : true
    }
  ]
  try {
    generateWordDocument('/equipCalibrateConfirm.docx', tableData, tableData.deviceName + '使用确认单.docx');
  } catch (error){
    ElMessage({
      type: 'warning',
      message: '导出失败'
    });
  }
}
/** 重置新增的表单以及其他数据  */
const reset= async()=> {
  data.queryParams = {
    pageNum: 1,
    pageSize: 10,
    companyId: null
  }
  await getCompanyList()
  await getList()
}
const handleDelete = (val) => {
  ElMessageBox.confirm(
      '确定删除此条数据?',
      '提示',
      {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning',
      })
      .then( async() => {
        const res = await delCalibrationMonitoringEquipment({id: val.id})
        if(res.code == 200){
          ElMessage.success('数据删除成功')
          await getList()
        }else{
          ElMessage.warning(res.message)
        }
      })
}
</script>
src/views/work/assetMng/workEnvironmentControl/6sInspectChecklist/components/editDialog.vue
New file
@@ -0,0 +1,534 @@
<template>
  <div class="notice">
    <el-dialog
        v-model="dialogVisible"
        :title="state.title"
        width="75%"
        :before-close="handleClose"
        :close-on-press-escape="false"
        :close-on-click-modal="false"
    >
      <el-form :model="state.form" size="default" ref="superRef" :rules="state.formRules" label-width="150px">
        <el-form-item v-if="state.isAdmin" label="企业:" prop="companyId">
          <el-select v-model="state.form.companyId" placeholder="请选择" :disabled="state.title =='查看'" clearable @change="getDeptList">
            <el-option
                v-for="item in state.companyList"
                :key="item.id"
                :label="item.name"
                :value="item.id">
            </el-option>
          </el-select>
        </el-form-item>
        <el-row>
          <el-col :span="12">
            <el-form-item label="检查表名称:" prop="inspectionName">
              <el-input v-model.trim="state.form.inspectionName" :readonly="state.title =='查看'"></el-input>
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="年份:" prop="year">
              <el-date-picker
                  v-model="state.form.year"
                  type="year"
                  value-format="YYYY"
                  placeholder="请选择年份"
                  :disabled="state.title =='查看'"
              />
            </el-form-item>
          </el-col>
        </el-row>
        <el-row>
          <el-col :span="12">
            <el-form-item label="受检查区域:" prop="inspectionContent">
              <el-input v-model.trim="state.form.inspectionContent" :readonly="state.title =='查看'"></el-input>
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="检查日期:" prop="inspectionDate">
              <el-date-picker
                  v-model="state.form.inspectionDate"
                  type="date"
                  value-format="YYYY-MM-DD"
                  placeholder="请选择日期"
                  :disabled="state.title =='查看'"
              />
            </el-form-item>
          </el-col>
        </el-row>
        <el-table :data="state.maintainList" :border="true" class="customedTable" style="margin-bottom: 30px">
          <el-table-column label="序号" type="index" align="center"/>
          <el-table-column label="检查项目" prop="project" align="center"/>
          <el-table-column label="是否符合" prop="contentResult" align="center">
            <template #default="scope">
              <el-radio-group v-model="scope.row.contentResult" :disabled="state.title =='查看'">
                <el-radio :label="1">符合</el-radio>
                <el-radio :label="2">不符合</el-radio>
                <el-radio :label="3">不涉及</el-radio>
              </el-radio-group>
            </template>
          </el-table-column>
          <el-table-column label="具体问题" prop="concreteProblems" align="center">
            <template #default="scope">
              <el-input
                  v-model.trim="scope.row.concreteProblems"
                  size="large"
                  type="textarea"
                  style="width: 100%"
                  :readonly="state.title =='查看'"
              >
              </el-input>
            </template>
          </el-table-column>
          <el-table-column label="责任部门" prop="responsibleDepartment" align="center">
            <template #default="scope">
              <el-input
                  v-model.trim="scope.row.responsibleDepartment"
                  size="large"
                  type="textarea"
                  style="width: 100%"
                  :readonly="state.title =='查看'"
              >
              </el-input>
            </template>
          </el-table-column>
        </el-table>
        <el-form-item label="其他问题:" prop="sixInspectionProblemList">
          <el-button
              type="primary"
              plain
              icon="Plus"
              @click="addLine"
              style="margin-bottom: 10px"
              v-if="state.title !== '查看'"
          >新增</el-button>
        </el-form-item>
        <el-table :data="state.form.sixInspectionProblemList" class="customedTable" :border="true">
          <el-table-column label="序号" type="index" width="80" align="center">
          </el-table-column>
          <el-table-column label="问题" prop="problems" align="center">
            <template #default="scope">
              <el-input
                  v-model.trim="scope.row.problems"
                  size="large"
                  type="textarea"
                  style="width: 100%;"
                  clearable
                  :readonly="state.title =='查看'"
              >
              </el-input>
            </template>
          </el-table-column>
          <el-table-column label="备注" prop="remark" align="center">
            <template #default="scope">
              <el-input
                  v-model.trim="scope.row.remark"
                  size="large"
                  type="textarea"
                  style="width: 100%;"
                  clearable
                  :readonly="state.title =='查看'"
              >
              </el-input>
            </template>
          </el-table-column>
          <el-table-column label="操作" align="center" width="70" v-if="state.title !== '查看'">
            <template #default="scope">
              <el-button link type="danger" @click="handleDelete(scope.$index)">删除</el-button>
            </template>
          </el-table-column>
        </el-table>
        <el-row>
          <el-col :span="12">
            <el-form-item label="编制:" prop="establishmentId">
              <el-select clearable v-model="state.form.establishmentId" :disabled="state.title =='查看'" filterable placeholder="编制" style="width: 100%">
                <el-option
                    v-for="item in state.userList"
                    :key="item.userId"
                    :label="item.name"
                    :value="item.userId"
                />
              </el-select>
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="审批:" prop="approvalId">
              <el-select clearable v-model="state.form.approvalId" :disabled="state.title =='查看'" filterable placeholder="审批" style="width: 100%">
                <el-option
                    v-for="item in state.userList"
                    :key="item.userId"
                    :label="item.name"
                    :value="item.userId"
                />
              </el-select>
            </el-form-item>
          </el-col>
        </el-row>
      </el-form>
      <template #footer v-if="state.title !='查看'">
        <span class="dialog-footer">
            <el-button @click="handleClose" size="default">取 消</el-button>
            <el-button type="primary"  @click="onSubmit" size="default" v-preReClick>确认</el-button>
        </span>
      </template>
    </el-dialog>
  </div>
</template>
<script setup>
import {reactive, ref, toRefs, defineEmits, nextTick, onMounted} from 'vue'
import {ElMessage} from "element-plus";
import {Base64} from "js-base64"
import {getToken} from "@/utils/auth";
import {
  addInternalAuditCheck, getInternalAuditCheckInfo,
  updateInternalAuditCheck
} from "@/api/innerReview/meetingReview";
import {getDepart} from "@/api/orgStructure/depart";
import {listUser} from "@/api/system/user";
import {getMaintenanceServiceDetail, updateMaintenanceService} from "@/api/infrastructureMng/ledger";
import {getSixInspectionDetail, saveSixInspection} from "@/api/assetManage/assetMng";
const emit = defineEmits(["getList"]);
const dialogVisible = ref(false)
const superRef = ref()
const checkFiles = (rule, value, callback) => {
  if (state.fileList.length == 0) {
    callback(new Error('请上传文件'))
  } else {
    callback()
  }
}
const state = reactive({
  title: '',
  form: {
    id: null,
    companyId: null,
    inspectionName: '',
    year: '',
    inspectionContent: '',
    inspectionDate: '',
    sixInspectionContentList: [],
    sixInspectionProblemList: [],
    delProblemIds: [],
    establishmentId: null,
    establishmentName: '',
    approvalId: null,
    approvalName: ''
  },
  oldServiceUsers: [],
  maintainList: [
    {
      id: null,
      sort: 1,
      project: '工作区域地面是否清扫干净,无散落杂物',
      contentResult: null,
      concreteProblems: '',
      responsibleDepartment: ''
    },{
      id: null,
      sort: 2,
      project: '工作空间通风和光照条件是否良好',
      contentResult: null,
      concreteProblems: '',
      responsibleDepartment: ''
    },{
      id: null,
      sort: 3,
      project: '工作台或桌面是否擦拭干净或有残留物品',
      contentResult: null,
      concreteProblems: '',
      responsibleDepartment: ''
    },{
      id: null,
      sort: 4,
      project: '工作台或桌面工具、文具、文件等是否干净、整齐有序',
      contentResult: null,
      concreteProblems: '',
      responsibleDepartment: ''
    },{
      id: null,
      sort: 5,
      project: '区域消防器具是否齐全、状态良好、有无定期检查',
      contentResult: null,
      concreteProblems: '',
      responsibleDepartment: ''
    },{
      id: null,
      sort: 6,
      project: '通道是否设置合理或顺畅',
      contentResult: null,
      concreteProblems: '',
      responsibleDepartment: ''
    },{
      id: null,
      sort: 7,
      project: '危化品放置和标识是否合规',
      contentResult: null,
      concreteProblems: '',
      responsibleDepartment: ''
    },{
      id: null,
      sort: 8,
      project: '仓库是否按货物分类进行区域管理',
      contentResult: null,
      concreteProblems: '',
      responsibleDepartment: ''
    },{
      id: null,
      sort: 9,
      project: '整顿时是否考虑方便FIFO原则',
      contentResult: null,
      concreteProblems: '',
      responsibleDepartment: ''
    },{
      id: null,
      sort: 10,
      project: '保留品、不良品、废料是否定期处理',
      contentResult: null,
      concreteProblems: '',
      responsibleDepartment: ''
    },{
      id: null,
      sort: 11,
      project: '不必要或剩余物料、工具、治具等是否全部清离现场',
      contentResult: null,
      concreteProblems: '',
      responsibleDepartment: ''
    },{
      id: null,
      sort: 12,
      project: '作业指导书、安全操作规程等是否设置合理',
      contentResult: null,
      concreteProblems: '',
      responsibleDepartment: ''
    },{
      id: null,
      sort: 13,
      project: '电气设备运行情况和环境条件是否良好',
      contentResult: null,
      concreteProblems: '',
      responsibleDepartment: ''
    },{
      id: null,
      sort: 14,
      project: '员工是否按设备操作规范作业',
      contentResult: null,
      concreteProblems: '',
      responsibleDepartment: ''
    },{
      id: null,
      sort: 15,
      project: '生产人员作业时是否佩戴防护用品',
      contentResult: null,
      concreteProblems: '',
      responsibleDepartment: ''
    }
  ],
  formRules:{
    companyId: [{ required: true, message: '请选择企业', trigger: 'blur' }],
    inspectionName: [{ required: true, message: '请填写检查表名称', trigger: 'blur' }],
    year: [{ required: true, message: '请选择年份', trigger: 'blur' }],
    inspectionContent: [{ required: true, message: '请填写受检查区域', trigger: 'blur' }],
    inspectionDate: [{ required: true, message: '请选择检查日期', trigger: 'blur' }],
    establishmentId: [{ required: true, message: '请选择编制人', trigger: 'blur' }],
    approvalId: [{ required: true, message: '请选择审批人', trigger: 'blur' }],
  },
  isAdmin: false,
  companyList: [],
  userList: []
})
onMounted(() => {
});
const openDialog = async (type, value,companyId, isAdmin, companyList) => {
  state.isAdmin = isAdmin
  if(isAdmin){
    state.companyList = companyList
  }
  await getUserList(companyId)
  state.title = type === 'add' ? '新增' : type ==='edit' ? '编辑' : '查看'
  state.form.companyId = companyId
  if(state.title == '编辑'||state.title == '查看'){
    await getInfo(value.id)
  }
  dialogVisible.value = true
}
const onSubmit = async () => {
  const valid = await superRef.value.validate();
  if(valid){
    if(state.maintainList.find(item=>item.contentResult == null || item.concreteProblems == '' || item.responsibleDepartment == '')){
      ElMessage.warning('请完善检查表格内容')
      return
    }
    const data = JSON.parse(JSON.stringify(state.form))
    data.delProblemIds = state.oldServiceUsers.filter(i =>!data.sixInspectionProblemList.some(item=>item.id == i.id)).map(i=>i.id)
    data.sixInspectionContentList = state.maintainList.map(item=>{
      return {
        id: item.id,
        sort: item.sort,
        contentResult: item.contentResult,
        concreteProblems: item.concreteProblems,
        responsibleDepartment: item.responsibleDepartment
      }
    })
    data.establishmentName = state.userList.find(i=>i.userId == data.establishmentId)?.name
    data.approvalName = state.userList.find(i=>i.userId == data.approvalId)?.name
    if(state.title == '新增'){
      delete data.id
      const res = await saveSixInspection(data)
      if(res.code == 200){
        ElMessage.success(res.message)
        emit('getList')
        handleClose()
        dialogVisible.value = false;
      }else{
        ElMessage.warning(res.message)
      }
    }else{
      const res = await saveSixInspection(data)
      if(res.code == 200){
        ElMessage.success(res.message)
        emit('getList')
        handleClose()
        dialogVisible.value = false;
      }else{
        ElMessage.warning(res.message)
      }
    }
  }
}
const addLine = () => {
  const obj = {
    id: null,
    sixInspectionId: null,
    problems: '',
    remark: ''
  }
  state.form.sixInspectionProblemList.push(obj);
}
const handleDelete = (i) =>{
  state.form.sixInspectionProblemList = state.form.sixInspectionProblemList.filter((item,index) => index != i)
}
const getInfo = async (id)=> {
  const res = await getSixInspectionDetail({id: id})
  if(res.code == 200){
    Object.keys(state.form).forEach(key => {
      if (key in res.data) {
        state.form[key] = res.data[key]
      }
    })
    state.oldServiceUsers = state.form.sixInspectionProblemList?.map(item=>{
      return {
        id: item.id,
        sixInspectionId: item.sixInspectionId,
        problems: item.problems,
        remark: item.remark
      }
    })
    state.maintainList = state.maintainList.map(item=>{
      return {
        id: state.form.sixInspectionContentList.find(i=>i.sort == item.sort)?.id,
        sort: item.sort,
        project: item.project,
        contentResult: state.form.sixInspectionContentList.find(i=>i.sort == item.sort)?.contentResult,
        concreteProblems: state.form.sixInspectionContentList.find(i=>i.sort == item.sort)?.concreteProblems,
        responsibleDepartment: state.form.sixInspectionContentList.find(i=>i.sort == item.sort)?.responsibleDepartment,
      }
    })
  }else{
    ElMessage.warning(res.message)
  }
}
const getDeptList = async ()=>{
  state.form.establishmentId = null
  state.form.establishmentName = ''
  state.form.approvalId = null
  state.form.approvalName = ''
  await getUserList(state.form.companyId)
}
const getUserList = async (companyId)=> {
  const res = await listUser({pageIndex: 1,pageSize: 999,companyId: companyId})
  if(res.code == 200){
    state.userList = res.data.list?res.data.list.map(item=>{
      const user = item.id
      const {id, ...data} = item
      return {
        ...data,
        userId: user
      }
    }):[]
  }else{
    ElMessage.warning(res.message)
  }
}
const handleClose = () => {
  state.form = {
    id: null,
    companyId: null,
    inspectionName: '',
    year: '',
    inspectionContent: '',
    inspectionDate: '',
    sixInspectionContentList: [],
    sixInspectionProblemList: [],
    delProblemIds: [],
    establishmentId: null,
    establishmentName: '',
    approvalId: null,
    approvalName: ''
  }
  state.maintainList = state.maintainList.map(i=>{
    return {
      sort: i.sort,
      project: i.project,
      contentResult: null,
      concreteProblems: '',
      responsibleDepartment: ''
    }
  })
  superRef.value.clearValidate();
  superRef.value.resetFields()
  dialogVisible.value = false;
}
defineExpose({
  openDialog
});
</script>
<style scoped lang="scss">
.notice{
  :deep(.el-form .el-form-item__label) {
    font-size: 15px;
  }
  .file {
    display: flex;
    flex-direction: column;
    align-items: flex-start;
  }
}
</style>
<style lang="scss">
.customedTable{
  width: calc(100% - 150px);
  margin-left: 150px;
  margin-bottom: 30px;
  .el-table__cell{
    padding: 2px 0 !important;
    font-size: 14px !important;
  }
  .cell{
    padding: 0 2px !important;
    font-size: 14px !important;
  }
}
</style>
src/views/work/assetMng/workEnvironmentControl/6sInspectChecklist/index.vue
New file
@@ -0,0 +1,328 @@
<template>
  <div class="app-container">
    <div style="display: flex;justify-content: space-between">
      <el-form :inline="true" style="display: flex;align-items: center;flex-wrap: wrap;" >
        <el-form-item>
          <el-button
              type="primary"
              plain
              icon="Plus"
              @click="openDialog('add',{})"
          >新增</el-button>
        </el-form-item>
        <el-form-item v-if="isAdmin" label="企业:" >
          <el-select v-model="data.queryParams.companyId" placeholder="请选择" clearable>
            <el-option
                v-for="item in companyList"
                :key="item.id"
                :label="item.name"
                :value="item.id">
            </el-option>
          </el-select>
        </el-form-item>
        <el-form-item >
          <el-button v-if="isAdmin" type="primary" @click="getList">查询</el-button>
          <el-button v-if="isAdmin" type="primary" plain @click="reset">重置</el-button>
<!--          <el-button type="primary">导出</el-button>-->
        </el-form-item>
      </el-form>
    </div>
    <!-- 表格数据 -->
    <el-table v-loading="loading" :data="dataList" :border="true">
      <el-table-column type="index" label="序号"></el-table-column>
      <el-table-column prop="inspectionName" align="center" label="检查表名称"></el-table-column>
      <el-table-column prop="year" align="center" label="年份"></el-table-column>
      <el-table-column label="操作" align="center">
        <template #default="scope">
          <el-button link type="primary" @click="openDialog('view',scope.row)">查看</el-button>
          <el-button link type="primary" @click="openDialog('edit',scope.row)">编辑</el-button>
          <el-button link type="primary" @click="downloadFile(scope.row)">导出</el-button>
          <el-button link type="danger" @click="handleDelete(scope.row)">删除</el-button>
        </template>
      </el-table-column>
    </el-table>
    <pagination
        v-show="total > 0"
        :total="total"
        v-model:page="queryParams.pageNum"
        v-model:limit="queryParams.pageSize"
        @pagination="getList"
    />
    <edit-dialog ref="dialogRef" @getList=getList></edit-dialog>
  </div>
</template>
<script setup>
import {getCurrentInstance, onMounted, onUnmounted, reactive, ref, toRefs} from "vue";
import {ElMessage, ElMessageBox} from "element-plus";
import {delCompany, getCompany} from "@/api/onlineEducation/company";
import Cookies from "js-cookie";
import editDialog from './components/editDialog.vue'
import useUserStore from "@/store/modules/user";
import {getStandardTemp,delStandardTemp} from "@/api/standardSys/standardSys";
import { renderAsync } from "docx-preview";
import {
  delInternalAuditCheck,
  delMeetingsList,
  getInternalAuditCheck, getInternalAuditCheckInfo,
  getMeetingsList
} from "@/api/innerReview/meetingReview";
import {generateWordDocument} from "@/utils/exportWord";
import {
  delMaintenanceService,
  getMaintenanceRecordDetail, getMaintenanceServiceDetail,
  getMaintenanceServiceList
} from "@/api/infrastructureMng/ledger";
import {delSixInspection, getSixInspectionDetail, getSixInspectionList} from "@/api/assetManage/assetMng";
const userStore = useUserStore()
const { proxy } = getCurrentInstance();
const loading = ref(false);
const dialogRef = ref();
const data = reactive({
  queryParams: {
    pageNum: 1,
    pageSize: 10,
    companyId: null
  },
  total: 0,
  dataList: [],
  companyList: [],
  isAdmin: false,
  maintainList: [
    {
      id: null,
      sort: 1,
      project: '工作区域地面是否清扫干净,无散落杂物',
      contentResult: null,
      concreteProblems: '',
      responsibleDepartment: ''
    },{
      id: null,
      sort: 2,
      project: '工作空间通风和光照条件是否良好',
      contentResult: null,
      concreteProblems: '',
      responsibleDepartment: ''
    },{
      id: null,
      sort: 3,
      project: '工作台或桌面是否擦拭干净或有残留物品',
      contentResult: null,
      concreteProblems: '',
      responsibleDepartment: ''
    },{
      id: null,
      sort: 4,
      project: '工作台或桌面工具、文具、文件等是否干净、整齐有序',
      contentResult: null,
      concreteProblems: '',
      responsibleDepartment: ''
    },{
      id: null,
      sort: 5,
      project: '区域消防器具是否齐全、状态良好、有无定期检查',
      contentResult: null,
      concreteProblems: '',
      responsibleDepartment: ''
    },{
      id: null,
      sort: 6,
      project: '通道是否设置合理或顺畅',
      contentResult: null,
      concreteProblems: '',
      responsibleDepartment: ''
    },{
      id: null,
      sort: 7,
      project: '危化品放置和标识是否合规',
      contentResult: null,
      concreteProblems: '',
      responsibleDepartment: ''
    },{
      id: null,
      sort: 8,
      project: '仓库是否按货物分类进行区域管理',
      contentResult: null,
      concreteProblems: '',
      responsibleDepartment: ''
    },{
      id: null,
      sort: 9,
      project: '整顿时是否考虑方便FIFO原则',
      contentResult: null,
      concreteProblems: '',
      responsibleDepartment: ''
    },{
      id: null,
      sort: 10,
      project: '保留品、不良品、废料是否定期处理',
      contentResult: null,
      concreteProblems: '',
      responsibleDepartment: ''
    },{
      id: null,
      sort: 11,
      project: '不必要或剩余物料、工具、治具等是否全部清离现场',
      contentResult: null,
      concreteProblems: '',
      responsibleDepartment: ''
    },{
      id: null,
      sort: 12,
      project: '作业指导书、安全操作规程等是否设置合理',
      contentResult: null,
      concreteProblems: '',
      responsibleDepartment: ''
    },{
      id: null,
      sort: 13,
      project: '电气设备运行情况和环境条件是否良好',
      contentResult: null,
      concreteProblems: '',
      responsibleDepartment: ''
    },{
      id: null,
      sort: 14,
      project: '员工是否按设备操作规范作业',
      contentResult: null,
      concreteProblems: '',
      responsibleDepartment: ''
    },{
      id: null,
      sort: 15,
      project: '生产人员作业时是否佩戴防护用品',
      contentResult: null,
      concreteProblems: '',
      responsibleDepartment: ''
    }
  ]
});
const { queryParams, total, dataList,companyList, isAdmin, maintainList } = toRefs(data);
const userInfo = ref()
onMounted(async ()=>{
  if(userStore.roles.includes('admin')){
    data.isAdmin = true
    await getCompanyList()
  }else{
    data.isAdmin = false
    data.queryParams.companyId = userStore.companyId
  }
  await getList()
})
onUnmounted(()=>{
})
const getList = async () => {
  loading.value = true
  const res = await getSixInspectionList(data.queryParams)
  if(res.code == 200){
    data.dataList = res.data.list || []
    data.total = res.data.total
  }else{
    ElMessage.warning(res.message)
  }
  loading.value = false
}
const getCompanyList = async ()=>{
  const queryParams = {
    pageNum: 1,
    pageSize: 999
  }
  const res = await getCompany(queryParams)
  if (res.code == 200) {
    data.companyList = res.data.list?res.data.list:[]
    // data.queryParams.companyId = data.companyList[0].id
  } else {
    ElMessage.warning(res.message)
  }
}
const downloadFile = async (val)=>{
  const res = await getSixInspectionDetail({id: val.id})
  if(res.code == 200){
    if(res.data){
      let tableData = res.data
      tableData.table = data.maintainList.map(item =>{
        return {
          sort: item.sort,
          project: item.project,
          result1: tableData.sixInspectionContentList.find(i=>i.sort == item.sort)?.contentResult == 1 ? '√': '',
          result2: tableData.sixInspectionContentList.find(i=>i.sort == item.sort)?.contentResult == 2 ? '√': '',
          result3: tableData.sixInspectionContentList.find(i=>i.sort == item.sort)?.contentResult == 3 ? '√': '',
          concreteProblems: tableData.sixInspectionContentList.find(i=>i.sort == item.sort)?.concreteProblems,
          responsibleDepartment: tableData.sixInspectionContentList.find(i=>i.sort == item.sort)?.responsibleDepartment,
        }
      })
      if(Array.isArray(tableData.sixInspectionProblemList) && tableData.sixInspectionProblemList.length>0){
        tableData.problem = tableData.sixInspectionProblemList?.map((item,index)=>{
          return {
            ...item,
            index: index + 1
          }
        })
      }
      tableData.inspectionDate = tableData.inspectionDate.substring(0,10)
      if(data.isAdmin){
        tableData.companyName = data.companyList.find(i=>i.id == val.companyId)?.name
      }else{
        tableData.companyName = userStore.companyName
      }
      try {
        generateWordDocument('/6sReviewSheet.docx', tableData, tableData.companyName + tableData.inspectionName + '.docx');
      } catch (error){
        ElMessage({
          type: 'warning',
          message: '导出失败'
        });
      }
    }else{
      ElMessage.warning('暂无数据')
    }
  }else{
    ElMessage.warning(res.message)
  }
}
const openDialog = (type, value) => {
  dialogRef.value.openDialog(type, value, data.queryParams.companyId, data.isAdmin, data.companyList);
}
/** 重置新增的表单以及其他数据  */
const reset= async()=> {
  data.queryParams = {
    pageNum: 1,
    pageSize: 10,
    companyId: null
  }
  await getCompanyList()
  await getList()
}
const handleDelete = (val) => {
  ElMessageBox.confirm(
      '确定删除此条数据?',
      '提示',
      {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning',
      })
      .then( async() => {
        const res = await delSixInspection({id: val.id})
        if(res.code == 200){
          ElMessage.success('数据删除成功')
          await getList()
        }else{
          ElMessage.warning(res.message)
        }
      })
}
</script>
src/views/work/documentManage/docBorrowCopy/components/editDialog.vue
New file
@@ -0,0 +1,433 @@
<template>
  <div class="notice">
    <el-dialog
        v-model="dialogVisible"
        :title="state.title"
        width="75%"
        :before-close="handleClose"
        :close-on-press-escape="false"
        :close-on-click-modal="false"
    >
      <el-form :model="state.form" size="default" ref="superRef" :rules="state.formRules" label-width="150px" >
        <el-form-item v-if="state.isAdmin" label="企业:" prop="companyId">
          <el-select v-model="state.form.companyId" placeholder="请选择" :disabled="state.title =='查看'" clearable @change="getDeptList">
            <el-option
                v-for="item in state.companyList"
                :key="item.id"
                :label="item.name"
                :value="item.id">
            </el-option>
          </el-select>
        </el-form-item>
        <el-form-item label="记录名称:" prop="name">
          <el-input v-model.trim="state.form.name" :readonly="state.title =='查看'"></el-input>
        </el-form-item>
        <el-form-item label="文件借阅复制记录:" prop="documentBorrowCopyRecordList">
          <el-button
              type="primary"
              plain
              icon="Plus"
              @click="addLine"
              style="margin-bottom: 10px"
              v-if="state.title !='查看'"
          >新增</el-button>
        </el-form-item>
        <el-table :data="state.form.documentBorrowCopyRecordList" class="customedTable" :border="true">
          <el-table-column label="序号" type="index" width="80" align="center">
          </el-table-column>
          <el-table-column label="文件名称" prop="fileName" align="center">
            <template #default="scope">
              <el-input
                  v-model.trim="scope.row.fileName"
                  size="large"
                  type="textarea"
                  style="width: 100%;"
                  clearable
                  :readonly="state.title =='查看'"
              >
              </el-input>
            </template>
          </el-table-column>
          <el-table-column label="编号" prop="number" align="center">
            <template #default="scope">
              <el-input
                  v-model.trim="scope.row.number"
                  size="large"
                  type="textarea"
                  style="width: 100%;"
                  clearable
                  :readonly="state.title =='查看'"
              >
              </el-input>
            </template>
          </el-table-column>
          <el-table-column label="发放记录" align="center">
            <el-table-column label="部门" prop="distributionDeptName" align="center">
              <template #default="scope">
                <el-input
                    v-model.trim="scope.row.distributionDeptName"
                    size="large"
                    type="textarea"
                    style="width: 100%;"
                    clearable
                    :readonly="state.title =='查看'"
                >
                </el-input>
              </template>
            </el-table-column>
            <el-table-column label="签收" prop="distributionSign" align="center">
              <template #default="scope">
                <el-input
                    v-model.trim="scope.row.distributionSign"
                    size="large"
                    type="textarea"
                    style="width: 100%;"
                    clearable
                    :readonly="state.title =='查看'"
                >
                </el-input>
              </template>
            </el-table-column>
            <el-table-column label="日期" prop="distributionDate" align="center">
              <template #default="scope">
                <el-date-picker
                    v-model="scope.row.distributionDate"
                    type="date"
                    value-format="YYYY-MM-DD"
                    placeholder="请选择日期"
                    :disabled="state.title =='查看'"
                />
              </template>
            </el-table-column>
            <el-table-column label="份数" prop="distributionNum" align="center">
              <template #default="scope">
                <el-input
                    v-model.trim="scope.row.distributionNum"
                    size="large"
                    type="textarea"
                    style="width: 100%;"
                    clearable
                    :readonly="state.title =='查看'"
                >
                </el-input>
              </template>
            </el-table-column>
          </el-table-column>
          <el-table-column label="回收记录" align="center">
            <el-table-column label="部门" prop="collectionDeptName" align="center">
              <template #default="scope">
                <el-input
                    v-model.trim="scope.row.collectionDeptName"
                    size="large"
                    type="textarea"
                    style="width: 100%;"
                    clearable
                    :readonly="state.title =='查看'"
                >
                </el-input>
              </template>
            </el-table-column>
            <el-table-column label="签回" prop="collectionSign" align="center">
              <template #default="scope">
                <el-input
                    v-model.trim="scope.row.collectionSign"
                    size="large"
                    type="textarea"
                    style="width: 100%;"
                    clearable
                    :readonly="state.title =='查看'"
                >
                </el-input>
              </template>
            </el-table-column>
            <el-table-column label="日期" prop="collectionDate" align="center">
              <template #default="scope">
                <el-date-picker
                    v-model="scope.row.collectionDate"
                    type="date"
                    value-format="YYYY-MM-DD"
                    placeholder="请选择日期"
                    :disabled="state.title =='查看'"
                />
              </template>
            </el-table-column>
            <el-table-column label="份数" prop="collectionNum" align="center">
              <template #default="scope">
                <el-input
                    v-model.trim="scope.row.collectionNum"
                    size="large"
                    type="textarea"
                    style="width: 100%;"
                    clearable
                    :readonly="state.title =='查看'"
                >
                </el-input>
              </template>
            </el-table-column>
          </el-table-column>
          <el-table-column label="备注/版本" prop="remark" align="center">
            <template #default="scope">
              <el-input
                  v-model.trim="scope.row.remark"
                  size="large"
                  type="textarea"
                  style="width: 100%;"
                  clearable
                  :readonly="state.title =='查看'"
              >
              </el-input>
            </template>
          </el-table-column>
          <el-table-column label="操作" align="center" width="70" v-if="state.title !='查看'">
            <template #default="scope">
              <el-button link type="danger" @click="handleDelete(scope.$index)">删除</el-button>
            </template>
          </el-table-column>
        </el-table>
        <el-row>
          <el-col :span="12">
            <el-form-item label="制表:" prop="tabulationId">
              <el-select clearable v-model="state.form.tabulationId" :disabled="state.title =='查看'" filterable placeholder="编制" style="width: 100%">
                <el-option
                    v-for="item in state.userList"
                    :key="item.userId"
                    :label="item.name"
                    :value="item.userId"
                />
              </el-select>
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="日期:" prop="tabulationDate">
              <el-date-picker
                  v-model="state.form.tabulationDate"
                  type="date"
                  value-format="YYYY-MM-DD"
                  placeholder="请选择日期"
                  :disabled="state.title =='查看'"
              />
            </el-form-item>
          </el-col>
        </el-row>
      </el-form>
      <template #footer v-if="state.title !='查看'">
        <span class="dialog-footer">
            <el-button @click="handleClose" size="default">取 消</el-button>
            <el-button type="primary"  @click="onSubmit" size="default" v-preReClick>确认</el-button>
        </span>
      </template>
    </el-dialog>
  </div>
</template>
<script setup>
import {reactive, ref, toRefs, defineEmits, nextTick, onMounted} from 'vue'
import {ElMessage} from "element-plus";
import {getToken} from "@/utils/auth";
import {
  updateMaintenanceEvaluate,
  getMaintenanceEvaluateDetail
} from "@/api/infrastructureMng/ledger";
import {listUser} from "@/api/system/user";
import {
  getDocBorrowCopyDetail,
  getDocDistributeCollectDetail,
  saveDocBorrowCopy,
  saveDocDistributeCollect
} from "@/api/documentManage";
const emit = defineEmits(["getList"]);
const dialogVisible = ref(false)
const superRef = ref()
const checkList = (rule, value, callback) => {
  if (state.form.documentBorrowCopyRecordList.length == 0) {
    callback(new Error('文件发放回收记录不可为空'))
  } else {
    callback()
  }
}
const state = reactive({
  title: '',
  form: {
    id: null,
    companyId: null,
    name: '',
    documentBorrowCopyRecordList: [],
    deleteIds: [],
    tabulationId: null,
    tabulationName: '',
    tabulationDate: ''
  },
  oldDeviceList: [],
  formRules:{
    companyId: [{ required: true, message: '请选择企业', trigger: 'blur' }],
    name: [{ required: true, message: '请填写名称', trigger: 'blur' }],
    tabulationId: [{ required: true, message: '请选择制表人', trigger: 'blur' }],
    tabulationDate: [{ required: true, message: '请选择制表日期', trigger: 'blur' }],
  },
  isAdmin: false,
  companyList: [],
  userList: []
})
onMounted(() => {
});
const openDialog = async (type, value,companyId, isAdmin, companyList) => {
  state.isAdmin = isAdmin
  if(isAdmin){
    state.companyList = companyList
  }
  await getUserList(companyId)
  state.title = type === 'add' ? '新增' : type ==='edit' ? '编辑' : '查看'
  state.form.companyId = companyId
  if(state.title == '编辑'||state.title == '查看'){
    await getInfo(value.id)
  }
  dialogVisible.value = true
}
const addLine = () => {
  const obj = {
    id: null,
    documentId: null,
    fileName: '',
    number: '',
    distributionDeptName: '',
    distributionSign: '',
    distributionDate: '',
    distributionNum: null,
    collectionDeptName: '',
    collectionSign: '',
    collectionDate: '',
    collectionNum: null,
    remark: ''
  }
  state.form.documentBorrowCopyRecordList.push(obj);
}
const handleDelete = (i) =>{
  state.form.documentBorrowCopyRecordList = state.form.documentBorrowCopyRecordList.filter((item,index) => index != i)
}
const onSubmit = async () => {
  const valid = await superRef.value.validate();
  if(valid){
    const data = JSON.parse(JSON.stringify(state.form))
    data.deleteIds = state.oldDeviceList.filter(i =>!data.documentBorrowCopyRecordList.some(item=>item.id == i.id)).map(i=>i.id)
    data.tabulationName = state.userList.find(i=>i.userId == data.tabulationId)?.name
    if(state.title == '新增'){
      delete data.id
      const res = await saveDocBorrowCopy(data)
      if(res.code == 200){
        ElMessage.success(res.message)
        emit('getList')
        handleClose()
        dialogVisible.value = false;
      }else{
        ElMessage.warning(res.message)
      }
    }else{
      const res = await saveDocBorrowCopy(data)
      if(res.code == 200){
        ElMessage.success(res.message)
        emit('getList')
        handleClose()
        dialogVisible.value = false;
      }else{
        ElMessage.warning(res.message)
      }
    }
  }
}
const getInfo = async (id)=> {
  const res = await getDocBorrowCopyDetail({id: id})
  if(res.code == 200){
    Object.keys(state.form).forEach(key => {
      if (key in res.data) {
        state.form[key] = res.data[key]
      }
    })
    state.form.documentBorrowCopyRecordList = res.data.documentBorrowCopyRecordList?.map(
        ({ id, documentId, fileName, number, distributionDeptName, distributionSign, distributionDate, distributionNum, collectionDeptName, collectionSign, collectionDate, collectionNum, remark}) => ({
          id, documentId, fileName, number, distributionDeptName, distributionSign, distributionDate, distributionNum, collectionDeptName, collectionSign, collectionDate, collectionNum, remark
        })
    )
    state.oldDeviceList = state.form.documentBorrowCopyRecordList
  }else{
    ElMessage.warning(res.message)
  }
}
const getDeptList = async ()=>{
  state.form.tabulationId = null
  state.form.tabulationName = ''
  await getUserList(state.form.companyId)
}
const getUserList = async (companyId)=> {
  const res = await listUser({pageIndex: 1,pageSize: 999,companyId: companyId})
  if(res.code == 200){
    state.userList = res.data.list?res.data.list.map(item=>{
      const user = item.id
      const {id, ...data} = item
      return {
        ...data,
        userId: user
      }
    }):[]
  }else{
    ElMessage.warning(res.message)
  }
}
const handleClose = () => {
  state.form = {
    id: null,
    companyId: null,
    name: '',
    documentBorrowCopyRecordList: [],
    deleteIds: [],
    tabulationId: null,
    tabulationName: '',
    tabulationDate: ''
  }
  superRef.value.clearValidate();
  superRef.value.resetFields()
  dialogVisible.value = false;
}
defineExpose({
  openDialog
});
</script>
<style scoped lang="scss">
.notice{
  :deep(.el-form .el-form-item__label) {
    font-size: 15px;
  }
  .file {
    display: flex;
    flex-direction: column;
    align-items: flex-start;
  }
}
</style>
<style lang="scss">
.customedTable{
  width: calc(100% - 150px);
  margin-left: 150px;
  margin-bottom: 30px;
  .el-table__cell{
    padding: 2px 0 !important;
    font-size: 14px !important;
  }
  .cell{
    padding: 0 2px !important;
    font-size: 14px !important;
  }
}
</style>
src/views/work/documentManage/docBorrowCopy/index.vue
New file
@@ -0,0 +1,204 @@
<template>
  <div class="app-container">
    <div style="display: flex;justify-content: space-between">
      <el-form :inline="true" style="display: flex;align-items: center;flex-wrap: wrap;" >
        <el-form-item>
          <el-button
              type="primary"
              plain
              icon="Plus"
              @click="openDialog('add',{})"
          >新增</el-button>
        </el-form-item>
        <el-form-item v-if="isAdmin" label="企业:" >
          <el-select v-model="data.queryParams.companyId" placeholder="请选择" clearable>
            <el-option
                v-for="item in companyList"
                :key="item.id"
                :label="item.name"
                :value="item.id">
            </el-option>
          </el-select>
        </el-form-item>
        <el-form-item >
          <el-button v-if="isAdmin" type="primary" @click="getList">查询</el-button>
          <el-button v-if="isAdmin" type="primary" plain @click="reset">重置</el-button>
<!--          <el-button type="primary">导出</el-button>-->
        </el-form-item>
      </el-form>
    </div>
    <!-- 表格数据 -->
    <el-table v-loading="loading" :data="dataList" :border="true">
      <el-table-column type="index" label="序号"></el-table-column>
      <el-table-column prop="enactmentDate" align="center" label="检查表名称">
        <template #default="scope">
          {{scope.row.name + '记录'}}
        </template>
      </el-table-column>
      <el-table-column label="操作" align="center">
        <template #default="scope">
          <el-button link type="primary" @click="openDialog('view',scope.row)">查看</el-button>
          <el-button link type="primary" @click="openDialog('edit',scope.row)">编辑</el-button>
          <el-button link type="primary" @click="downloadFile(scope.row)">导出</el-button>
          <el-button link type="danger" @click="handleDelete(scope.row)">删除</el-button>
        </template>
      </el-table-column>
    </el-table>
    <pagination
        v-show="total > 0"
        :total="total"
        v-model:page="queryParams.pageNum"
        v-model:limit="queryParams.pageSize"
        @pagination="getList"
    />
    <edit-dialog ref="dialogRef" @getList=getList></edit-dialog>
  </div>
</template>
<script setup>
import {getCurrentInstance, onMounted, onUnmounted, reactive, ref, toRefs} from "vue";
import {ElMessage, ElMessageBox} from "element-plus";
import {delCompany, getCompany} from "@/api/onlineEducation/company";
import Cookies from "js-cookie";
import editDialog from './components/editDialog.vue'
import useUserStore from "@/store/modules/user";
import {generateWordDocument} from "@/utils/exportWord";
import {
  delMaintenanceEvaluate,
  getMaintenanceEvaluateDetail,
  getMaintenanceEvaluateList
} from "@/api/infrastructureMng/ledger";
import {
  delDocBorrowCopy,
  delDocDistributeCollect, getDocBorrowCopyDetail, getDocBorrowCopyList,
  getDocDistributeCollectDetail,
  getDocDistributeCollectList
} from "@/api/documentManage";
const userStore = useUserStore()
const { proxy } = getCurrentInstance();
const loading = ref(false);
const dialogRef = ref();
const data = reactive({
  queryParams: {
    pageNum: 1,
    pageSize: 10,
    companyId: null
  },
  total: 0,
  dataList: [],
  companyList: [],
  isAdmin: false
});
const { queryParams, total, dataList,companyList, isAdmin } = toRefs(data);
const userInfo = ref()
onMounted(async ()=>{
  if(userStore.roles.includes('admin')){
    data.isAdmin = true
    await getCompanyList()
  }else{
    data.isAdmin = false
    data.queryParams.companyId = userStore.companyId
  }
  await getList()
})
onUnmounted(()=>{
})
const getList = async () => {
  loading.value = true
  const res = await getDocBorrowCopyList(data.queryParams)
  if(res.code == 200){
    data.dataList = res.data.list || []
    data.total = res.data.total
  }else{
    ElMessage.warning(res.message)
  }
  loading.value = false
}
const getCompanyList = async ()=>{
  const queryParams = {
    pageNum: 1,
    pageSize: 999
  }
  const res = await getCompany(queryParams)
  if (res.code == 200) {
    data.companyList = res.data.list?res.data.list:[]
    // data.queryParams.companyId = data.companyList[0].id
  } else {
    ElMessage.warning(res.message)
  }
}
const downloadFile = async (val)=>{
  const res = await getDocBorrowCopyDetail({id: val.id})
  if(res.code == 200){
    if(res.data){
      let tableData = res.data
      tableData.table = res.data.documentBorrowCopyRecordList.map((item,index)=>{
        return {
          ...item,
          index: index + 1,
          distributionDate: item.distributionDate.substring(0,10),
          collectionDate: item.collectionDate.substring(0,10)
        }
      })
      tableData.tabulationDate = tableData.tabulationDate.substring(0,10)
      try {
        generateWordDocument('/docDistributeRetrieve.docx', tableData, tableData.name +'文件发放/回收记录.docx');
      } catch (error){
        ElMessage({
          type: 'warning',
          message: '导出失败'
        });
      }
    }else{
      ElMessage.warning('暂无数据')
    }
  }else{
    ElMessage.warning(res.message)
  }
}
const openDialog = (type, value) => {
  dialogRef.value.openDialog(type, value, data.queryParams.companyId, data.isAdmin, data.companyList);
}
/** 重置新增的表单以及其他数据  */
const reset= async()=> {
  data.queryParams = {
    pageNum: 1,
    pageSize: 10,
    companyId: null
  }
  await getCompanyList()
  await getList()
}
const handleDelete = (val) => {
  ElMessageBox.confirm(
      '确定删除此条数据?',
      '提示',
      {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning',
      })
      .then( async() => {
        const res = await delDocBorrowCopy({id: val.id})
        if(res.code == 200){
          ElMessage.success('数据删除成功')
          await getList()
        }else{
          ElMessage.warning(res.message)
        }
      })
}
</script>
src/views/work/documentManage/docChangeInvalidate/components/editDialog.vue
New file
@@ -0,0 +1,619 @@
<template>
  <div class="notice">
    <el-dialog
        v-model="dialogVisible"
        :title="state.title"
        width="50%"
        :before-close="handleClose"
        :close-on-press-escape="false"
        :close-on-click-modal="false"
    >
      <el-form :model="state.form" size="default" ref="superRef" :rules="state.formRules" label-width="150px" >
        <el-form-item v-if="state.isAdmin" label="企业:" prop="companyId">
          <el-select v-model="state.form.companyId" placeholder="请选择" clearable @change="getDeptList" :disabled="state.title =='查看'">
            <el-option
                v-for="item in state.companyList"
                :key="item.id"
                :label="item.name"
                :value="item.id">
            </el-option>
          </el-select>
        </el-form-item>
        <el-row>
          <el-col :span="12">
            <el-form-item label="文件名称:" prop="fileName">
              <el-input v-model.trim="state.form.fileName" :readonly="state.title =='查看'"></el-input>
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="编号:" prop="number">
              <el-input v-model.trim="state.form.number" :readonly="state.title =='查看'"></el-input>
            </el-form-item>
          </el-col>
        </el-row>
        <el-row>
          <el-col :span="12">
            <el-form-item label="提出部门:" prop="deptId">
              <el-select
                  clearable
                  v-model="state.form.deptId"
                  :disabled="state.title =='查看'"
                  filterable
                  placeholder="选择部门"
                  style="width: 100%"
              >
                <el-option
                    v-for="item in state.deptList"
                    :key="item.deptId"
                    :label="item.deptName"
                    :value="item.deptId"
                />
              </el-select>
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="更改人:" prop="modifierId">
              <el-select clearable v-model="state.form.modifierId" :disabled="state.title =='查看'" filterable placeholder="更改人" style="width: 100%">
                <el-option
                    v-for="item in state.userList"
                    :key="item.id"
                    :label="item.name"
                    :value="item.id"
                />
              </el-select>
            </el-form-item>
          </el-col>
        </el-row>
        <el-row>
          <el-col :span="8">
            <el-form-item label="页次:" prop="pageNumber">
              <el-input v-model.trim="state.form.pageNumber" :readonly="state.title =='查看'" style="width: 100%"></el-input>
            </el-form-item>
          </el-col>
          <el-col :span="8">
            <el-form-item label="原版/次:" prop="originalNumber">
              <el-input v-model.trim="state.form.originalNumber" :readonly="state.title =='查看'" style="width: 100%"></el-input>
            </el-form-item>
          </el-col>
          <el-col :span="8">
            <el-form-item label="现版/次:" prop="currentNumber">
              <el-input v-model.trim="state.form.currentNumber" :readonly="state.title =='查看'" style="width: 100%"></el-input>
            </el-form-item>
          </el-col>
        </el-row>
        <el-row>
          <el-col :span="12">
            <el-form-item label="更改原因:" prop="modifierReason">
              <el-input v-model.trim="state.form.modifierReason" type="textarea" :readonly="state.title =='查看'" :autosize="{ minRows: 2 }"></el-input>
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="更改方式:" prop="modifierType">
              <el-select v-model="state.form.modifierType" :disabled="state.title =='查看'" placeholder="请选择" clearable>
                <el-option key="1" label="划改" :value="1"></el-option>
                <el-option key="2" label="换页" :value="2"></el-option>
                <el-option key="3" label="换版" :value="3"></el-option>
              </el-select>
            </el-form-item>
          </el-col>
        </el-row>
        <el-row>
          <el-col :span="12">
            <el-form-item label="更改日期:" prop="modifierTime">
              <el-date-picker
                  :disabled="state.title === '查看'"
                  v-model="state.form.modifierTime"
                  type="date"
                  value-format="YYYY-MM-DD"
                  placeholder="请选择日期"
              />
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="实施日期:" prop="implementTime">
              <el-date-picker
                  :disabled="state.title === '查看'"
                  v-model="state.form.implementTime"
                  type="date"
                  value-format="YYYY-MM-DD"
                  placeholder="请选择日期"
              />
            </el-form-item>
          </el-col>
        </el-row>
        <el-row>
          <el-col :span="12">
            <el-form-item label="更改前:" prop="modifierFront">
              <el-input v-model.trim="state.form.modifierFront" type="textarea" :readonly="state.title =='查看'" :autosize="{ minRows: 2 }"></el-input>
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="更改后:" prop="modifierBack">
              <el-input v-model.trim="state.form.modifierBack" type="textarea" :readonly="state.title =='查看'" :autosize="{ minRows: 2 }"></el-input>
            </el-form-item>
          </el-col>
        </el-row>
        <el-form-item label="评价对其他相关文件的影响:" prop="documentChangesInvalidatedEvaluateList">
          <el-button
              type="primary"
              plain
              icon="Plus"
              @click="addLine(1)"
              style="margin-bottom: 10px"
              v-if="state.title !='查看'"
          >新增</el-button>
        </el-form-item>
        <el-table :data="state.form.documentChangesInvalidatedEvaluateList" class="customedTable" :border="true">
          <el-table-column label="序号" type="index" width="80" align="center">
          </el-table-column>
          <el-table-column label="文件名称" prop="fileName" align="center">
            <template #default="scope">
              <el-input
                  v-model.trim="scope.row.fileName"
                  size="large"
                  type="textarea"
                  style="width: 100%;"
                  clearable
                  :readonly="state.title =='查看'"
              >
              </el-input>
            </template>
          </el-table-column>
          <el-table-column label="编号" prop="fileNumber" align="center">
            <template #default="scope">
              <el-input
                  v-model.trim="scope.row.fileNumber"
                  size="large"
                  type="textarea"
                  style="width: 100%;"
                  clearable
                  :readonly="state.title =='查看'"
              >
              </el-input>
            </template>
          </el-table-column>
          <el-table-column label="操作" align="center" width="70" v-if="state.title !='查看'">
            <template #default="scope">
              <el-button link type="danger" @click="handleDelete(1,scope.$index)">删除</el-button>
            </template>
          </el-table-column>
        </el-table>
        <el-row>
          <el-col :span="12">
            <el-form-item label="申请人:" prop="applyId">
              <el-select clearable v-model="state.form.applyId" :disabled="state.title =='查看'" filterable style="width: 100%">
                <el-option
                    v-for="item in state.userList"
                    :key="item.id"
                    :label="item.name"
                    :value="item.id"
                />
              </el-select>
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="日期:" prop="applyDate">
              <el-date-picker
                  :disabled="state.title === '查看'"
                  v-model="state.form.applyDate"
                  type="date"
                  value-format="YYYY-MM-DD"
                  placeholder="请选择日期"
              />
            </el-form-item>
          </el-col>
        </el-row>
        <el-row>
          <el-col :span="12">
            <el-form-item label="审核:" prop="processId">
              <el-select clearable v-model="state.form.processId" :disabled="state.title =='查看'" filterable style="width: 100%">
                <el-option
                    v-for="item in state.userList"
                    :key="item.id"
                    :label="item.name"
                    :value="item.id"
                />
              </el-select>
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="日期:" prop="processDate">
              <el-date-picker
                  :disabled="state.title === '查看'"
                  v-model="state.form.processDate"
                  type="date"
                  value-format="YYYY-MM-DD"
                  placeholder="请选择日期"
              />
            </el-form-item>
          </el-col>
        </el-row>
        <el-row>
          <el-col :span="12">
            <el-form-item label="批准:" prop="approvalId">
              <el-select clearable v-model="state.form.approvalId" :disabled="state.title =='查看'" filterable style="width: 100%">
                <el-option
                    v-for="item in state.userList"
                    :key="item.id"
                    :label="item.name"
                    :value="item.id"
                />
              </el-select>
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="日期:" prop="approvalDate">
              <el-date-picker
                  :disabled="state.title === '查看'"
                  v-model="state.form.approvalDate"
                  type="date"
                  value-format="YYYY-MM-DD"
                  placeholder="请选择日期"
              />
            </el-form-item>
          </el-col>
        </el-row>
        <el-form-item label="发放信息:" prop="documentChangesInvalidatedIssueList">
          <el-button
              type="primary"
              plain
              icon="Plus"
              @click="addLine(2)"
              style="margin-bottom: 10px"
              v-if="state.title !='查看'"
          >新增</el-button>
        </el-form-item>
        <el-table :data="state.form.documentChangesInvalidatedIssueList" class="customedTable" :border="true">
          <el-table-column label="序号" type="index" width="80" align="center">
          </el-table-column>
          <el-table-column label="发放部门" prop="distributionDeptName" align="center">
            <template #default="scope">
              <el-input
                  v-model.trim="scope.row.distributionDeptName"
                  size="large"
                  type="textarea"
                  style="width: 100%;"
                  clearable
                  :readonly="state.title =='查看'"
              >
              </el-input>
            </template>
          </el-table-column>
          <el-table-column label="签收人" prop="distributionSign" align="center">
            <template #default="scope">
              <el-input
                  v-model.trim="scope.row.distributionSign"
                  size="large"
                  type="textarea"
                  style="width: 100%;"
                  clearable
                  :readonly="state.title =='查看'"
              >
              </el-input>
            </template>
          </el-table-column>
          <el-table-column label="日期" prop="distributionDate" align="center">
            <template #default="scope">
              <el-date-picker
                  v-model="scope.row.distributionDate"
                  type="date"
                  value-format="YYYY-MM-DD"
                  placeholder="请选择日期"
                  :disabled="state.title =='查看'"
              />
            </template>
          </el-table-column>
          <el-table-column label="操作" align="center" width="70" v-if="state.title !='查看'">
            <template #default="scope">
              <el-button link type="danger" @click="handleDelete(2,scope.$index)">删除</el-button>
            </template>
          </el-table-column>
        </el-table>
        <el-form-item label="备注:" prop="remark">
          <el-input v-model.trim="state.form.remark" type="textarea" :autosize="{ minRows: 2 }" :readonly="state.title =='查看'"></el-input>
        </el-form-item>
      </el-form>
      <template #footer v-if="state.title !='查看'">
        <span class="dialog-footer">
            <el-button @click="handleClose" size="default">取 消</el-button>
            <el-button type="primary"  @click="onSubmit" size="default" v-preReClick>确认</el-button>
        </span>
      </template>
    </el-dialog>
  </div>
</template>
<script setup>
import {reactive, ref, toRefs, defineEmits, nextTick, onMounted} from 'vue'
import {ElMessage} from "element-plus";
import {Base64} from "js-base64"
import {getToken} from "@/utils/auth";
import {
  addInternalAuditCheck, getInternalAuditCheckInfo,
  updateInternalAuditCheck
} from "@/api/innerReview/meetingReview";
import {getDepart} from "@/api/orgStructure/depart";
import {listUser} from "@/api/system/user";
import {addStandingBook, updateStandingBook} from "@/api/infrastructureMng/ledger";
import {
  getDocChangesInvalidateDetail,
  getDocDistributeCollectDetail,
  saveDocChangesInvalidate
} from "@/api/documentManage";
const emit = defineEmits(["getList"]);
const dialogVisible = ref(false)
const superRef = ref()
const state = reactive({
  title: '',
  form: {
    id: null,
    companyId: null,
    fileName: '',
    number: '',
    deptId: null,
    modifierId: null,
    modifierName: '',
    pageNumber: '',
    originalNumber: '',
    currentNumber: '',
    modifierReason: '',
    modifierType: null,
    modifierTime: '',
    implementTime: '',
    modifierFront: '',
    modifierBack: '',
    documentChangesInvalidatedEvaluateList: [],
    delEvaluateIds: [],
    applyId: null,
    applyName: '',
    applyDate: '',
    processId: null,
    processName: '',
    processDate: '',
    approvalId: null,
    approvalName: '',
    approvalDate: '',
    documentChangesInvalidatedIssueList: [],
    delInvalidatedIssueIds: [],
    remark: ''
  },
  formRules:{
    companyId: [{ required: true, message: '请选择企业', trigger: 'blur' }],
    fileName: [{ required: true, message: '请填写文件名称', trigger: 'blur' }],
    number: [{ required: true, message: '请填写编号', trigger: 'blur' }],
    deptId: [{ required: true, message: '请选择部门',  trigger: 'blur' }],
    modifierId: [{ required: true, message: '请选择更改人',  trigger: 'blur' }],
    pageNumber: [{ required: true, message: '请填写页次',  trigger: 'blur' }],
    originalNumber: [{ required: true, message: '请填写原版/次',  trigger: 'blur' }],
    currentNumber: [{ required: true, message: '请填写现版/次',  trigger: 'blur' }],
    modifierReason: [{ required: true, message: '请填写更改原因',  trigger: 'blur' }],
    modifierType: [{ required: true, message: '请选择更改方式',  trigger: 'blur' }],
    modifierTime: [{ required: true, message: '请选择更改日期',  trigger: 'blur' }],
    implementTime: [{ required: true, message: '请选择实施日期',  trigger: 'blur' }],
    modifierFront: [{ required: true, message: '请填写更改前',  trigger: 'blur' }],
    modifierBack: [{ required: true, message: '请填写更改后',  trigger: 'blur' }],
    applyId: [{ required: true, message: '请选择申请人',  trigger: 'blur' }],
    applyDate: [{ required: true, message: '请选择申请日期',  trigger: 'blur' }],
    processId: [{ required: true, message: '请选择审核人',  trigger: 'blur' }],
    processDate: [{ required: true, message: '请选择审核日期',  trigger: 'blur' }],
    approvalId: [{ required: true, message: '请选择批准人',  trigger: 'blur' }],
    approvalDate: [{ required: true, message: '请选择批准日期',  trigger: 'blur' }]
  },
  isAdmin: false,
  companyList: [],
  deptList: [],
  userList: [],
  oldList1: [],
  oldList2: []
})
onMounted(() => {
});
const openDialog = async (type, value,companyId, isAdmin, companyList) => {
  state.isAdmin = isAdmin
  if(isAdmin){
    state.companyList = companyList
  }
  await getUserList(companyId)
  await getDepartList(companyId)
  state.title = type === 'add' ? '新增' : type ==='edit' ? '编辑' : '查看'
  state.form.companyId = companyId
  if(state.title == '编辑'||state.title == '查看'){
    await getInfo(value.id)
  }
  dialogVisible.value = true
}
const addLine = (type) => {
  if(type == 1){
    const obj = {
      id: null,
      documentChangesId: null,
      fileName: '',
      fileNumber: ''
    }
    state.form.documentChangesInvalidatedEvaluateList.push(obj);
  }else{
    const obj = {
      id: null,
      documentChangesId: null,
      distributionDeptName: '',
      distributionSign: '',
      distributionDate: ''
    }
    state.form.documentChangesInvalidatedIssueList.push(obj);
  }
}
const handleDelete = (type,i) =>{
  if(type == 1){
    state.form.documentChangesInvalidatedEvaluateList = state.form.documentChangesInvalidatedEvaluateList.filter((item,index) => index != i)
  }else{
    state.form.documentChangesInvalidatedIssueList = state.form.documentChangesInvalidatedIssueList.filter((item,index) => index != i)
  }
}
const onSubmit = async () => {
  const valid = await superRef.value.validate();
  if(valid){
    const data = JSON.parse(JSON.stringify(state.form))
    data.delEvaluateIds = state.oldList1.filter(i =>!data.documentChangesInvalidatedEvaluateList.some(item=>item.id == i.id)).map(i=>i.id)
    data.delInvalidatedIssueIds = state.oldList2.filter(i =>!data.documentChangesInvalidatedIssueList.some(item=>item.id == i.id)).map(i=>i.id)
    data.modifierName = state.userList.find(i=>i.id == data.modifierId)?.name
    data.applyName = state.userList.find(i=>i.id == data.applyId)?.name
    data.processName = state.userList.find(i=>i.id == data.processId)?.name
    data.approvalName = state.userList.find(i=>i.id == data.approvalId)?.name
    if(state.title == '新增'){
      delete data.id
      const res = await saveDocChangesInvalidate(data)
      if(res.code == 200){
        ElMessage.success(res.message)
        emit('getList')
        handleClose()
        dialogVisible.value = false
      }else{
        ElMessage.warning(res.message)
      }
    }else{
      const res = await saveDocChangesInvalidate(data)
      if(res.code == 200){
        ElMessage.success(res.message)
        emit('getList')
        handleClose()
        dialogVisible.value = false
      }else{
        ElMessage.warning(res.message)
      }
    }
  }
}
const getDeptList = async ()=>{
  state.form.modifierId = null
  state.form.applyId= null
  state.form.processId= null
  state.form.approvalId = null
  await getDepartList(state.form.companyId)
  await getUserList(state.form.companyId)
}
const getDepartList = async (companyId)=> {
  const params = {
    companyId: companyId
  }
  const res = await getDepart(params)
  if(res.code == 200){
    state.deptList = res.data
  }else{
    ElMessage.warning(res.message)
  }
}
const getUserList = async (companyId)=> {
  const res = await listUser({pageIndex: 1,pageSize: 999, companyId: companyId})
  if(res.code == 200){
    state.userList = res.data.list?res.data.list:[]
  }else{
    ElMessage.warning(res.message)
  }
}
const getInfo = async (id)=> {
  const res = await getDocChangesInvalidateDetail({id: id})
  if(res.code == 200){
    Object.keys(state.form).forEach(key => {
      if (key in res.data) {
        state.form[key] = res.data[key]
      }
    })
    state.form.documentChangesInvalidatedEvaluateList = res.data.documentChangesInvalidatedEvaluateList?.map(
        ({ id, documentChangesId, fileName, fileNumber}) => ({
          id, documentChangesId, fileName, fileNumber
        })
    )
    state.form.documentChangesInvalidatedIssueList = res.data.documentChangesInvalidatedIssueList?.map(
        ({ id, documentChangesId, distributionDeptName, distributionSign, distributionDate}) => ({
          id, documentChangesId, distributionDeptName, distributionSign, distributionDate
        })
    )
    state.oldList1 = state.form.documentChangesInvalidatedEvaluateList
    state.oldList2 = state.form.documentChangesInvalidatedIssueList
  }else{
    ElMessage.warning(res.message)
  }
}
const handleClose = () => {
  state.form = {
    id: null,
    companyId: null,
    fileName: [],
    number: '',
    deptId: null,
    modifierId: null,
    modifierName: '',
    pageNumber: '',
    originalNumber: '',
    currentNumber: '',
    modifierReason: '',
    modifierType: null,
    modifierTime: '',
    implementTime: '',
    modifierFront: '',
    modifierBack: '',
    documentChangesInvalidatedEvaluateList: [],
    delEvaluateIds: [],
    applyId: null,
    applyName: '',
    applyDate: '',
    processId: null,
    processName: '',
    processDate: '',
    approvalId: null,
    approvalName: '',
    approvalDate: '',
    documentChangesInvalidatedIssueList: [],
    delInvalidatedIssueIds: [],
    remark: ''
  }
  superRef.value.clearValidate();
  superRef.value.resetFields()
  dialogVisible.value = false;
}
defineExpose({
  openDialog
});
</script>
<style scoped lang="scss">
.notice{
  :deep(.el-form .el-form-item__label) {
    font-size: 15px;
  }
  .file {
    display: flex;
    flex-direction: column;
    align-items: flex-start;
  }
}
</style>
<style lang="scss">
.customedTable{
  width: calc(100% - 150px);
  margin-left: 150px;
  margin-bottom: 30px;
  .el-table__cell{
    padding: 2px 0 !important;
    font-size: 14px !important;
  }
  .cell{
    padding: 0 2px !important;
    font-size: 14px !important;
  }
}
</style>
src/views/work/documentManage/docChangeInvalidate/index.vue
New file
@@ -0,0 +1,215 @@
<template>
  <div class="app-container">
    <div style="display: flex;justify-content: space-between">
      <el-form :inline="true" style="display: flex;align-items: center;flex-wrap: wrap;" >
        <el-form-item>
          <el-button
              type="primary"
              plain
              icon="Plus"
              @click="openDialog('add',{})"
          >新增</el-button>
        </el-form-item>
        <el-form-item v-if="isAdmin" label="企业:" >
          <el-select v-model="data.queryParams.companyId" placeholder="请选择" clearable>
            <el-option
                v-for="item in companyList"
                :key="item.id"
                :label="item.name"
                :value="item.id">
            </el-option>
          </el-select>
        </el-form-item>
        <el-form-item >
          <el-button v-if="isAdmin" type="primary" @click="getList">查询</el-button>
          <el-button v-if="isAdmin" type="primary" plain @click="reset">重置</el-button>
        </el-form-item>
      </el-form>
    </div>
    <!-- 表格数据 -->
    <el-table v-loading="loading" :data="dataList" :border="true">
      <el-table-column type="index" label="序号"></el-table-column>
      <el-table-column prop="fileName" align="center" label="文件名称"></el-table-column>
      <el-table-column label="操作" align="center">
        <template #default="scope">
          <el-button link type="primary" @click="openDialog('view',scope.row)">查看</el-button>
          <el-button link type="primary" @click="openDialog('edit',scope.row)">编辑</el-button>
          <el-button link type="primary" @click="downloadFile(scope.row)">导出</el-button>
          <el-button link type="danger" @click="handleDelete(scope.row)">删除</el-button>
        </template>
      </el-table-column>
    </el-table>
    <pagination
        v-show="total > 0"
        :total="total"
        v-model:page="queryParams.pageNum"
        v-model:limit="queryParams.pageSize"
        @pagination="getList"
    />
    <edit-dialog ref="dialogRef" @getList=getList></edit-dialog>
  </div>
</template>
<script setup>
import {getCurrentInstance, onMounted, onUnmounted, reactive, ref, toRefs} from "vue";
import {ElMessage, ElMessageBox, tabsEmits} from "element-plus";
import {delCompany, getCompany} from "@/api/onlineEducation/company";
import Cookies from "js-cookie";
import editDialog from './components/editDialog.vue'
import useUserStore from "@/store/modules/user";
import {getStandardTemp,delStandardTemp} from "@/api/standardSys/standardSys";
import { renderAsync } from "docx-preview";
import {
  delInternalAuditCheck,
  delMeetingsList,
  getInternalAuditCheck, getInternalAuditCheckInfo,
  getMeetingsList
} from "@/api/innerReview/meetingReview";
import {generateWordDocument} from "@/utils/exportWord";
import {delStandingBook, getStandingBookList} from "@/api/infrastructureMng/ledger";
import {
  delDocChangesInvalidate, getDocChangesInvalidateDetail,
  getDocChangesInvalidateList,
  getDocDistributeCollectDetail
} from "@/api/documentManage";
const userStore = useUserStore()
const { proxy } = getCurrentInstance();
const loading = ref(false);
const dialogRef = ref();
const data = reactive({
  queryParams: {
    pageNum: 1,
    pageSize: 10,
    companyId: null
  },
  total: 0,
  dataList: [],
  companyList: [],
  isAdmin: false
});
const { queryParams, total, dataList,companyList, isAdmin } = toRefs(data);
const userInfo = ref()
onMounted(async ()=>{
  if(userStore.roles.includes('admin')){
    data.isAdmin = true
    await getCompanyList()
  }else{
    data.isAdmin = false
    data.queryParams.companyId = userStore.companyId
  }
  await getList()
})
onUnmounted(()=>{
})
const getList = async () => {
  loading.value = true
  const res = await getDocChangesInvalidateList(data.queryParams)
  if(res.code == 200){
    data.dataList = res.data.list || []
    data.total = res.data.total
  }else{
    ElMessage.warning(res.message)
  }
  loading.value = false
}
const getCompanyList = async ()=>{
  const queryParams = {
    pageNum: 1,
    pageSize: 999
  }
  const res = await getCompany(queryParams)
  if (res.code == 200) {
    data.companyList = res.data.list?res.data.list:[]
    // data.queryParams.companyId = data.companyList[0].id
  } else {
    ElMessage.warning(res.message)
  }
}
const openDialog = (type, value) => {
  dialogRef.value.openDialog(type, value, data.queryParams.companyId, data.isAdmin, data.companyList);
}
/** 重置新增的表单以及其他数据  */
const reset= async()=> {
  data.queryParams = {
    pageNum: 1,
    pageSize: 10,
    companyId: null
  }
  await getCompanyList()
  await getList()
}
const downloadFile = async (val)=>{
  const res = await getDocChangesInvalidateDetail({id: val.id})
  if(res.code == 200){
    if(res.data){
      let tableData = res.data
      tableData.table1 = res.data.documentChangesInvalidatedEvaluateList.map((item,index)=>{
        return {
          ...item,
          index: index + 1
        }
      })
      tableData.table2 = res.data.documentChangesInvalidatedIssueList.map((item,index)=>{
        return {
          ...item,
          index: index + 1,
          distributionDate: item.distributionDate.substring(0,10)
        }
      })
      tableData.applyDate = tableData.applyDate.substring(0,10)
      tableData.approvalDate = tableData.approvalDate.substring(0,10)
      tableData.implementTime = tableData.implementTime.substring(0,10)
      tableData.modifierTime = tableData.modifierTime.substring(0,10)
      tableData.processDate = tableData.processDate.substring(0,10)
      tableData.modifierType1 = tableData.modifierType == 1 ? '√' : ''
      tableData.modifierType2 = tableData.modifierType == 2 ? '√' : ''
      tableData.modifierType3 = tableData.modifierType == 3 ? '√' : ''
      try {
        generateWordDocument('/docChangeInvalidate.docx', tableData, tableData.fileName +'文件更改通知单.docx');
      } catch (error){
        ElMessage({
          type: 'warning',
          message: '导出失败'
        });
      }
    }else{
      ElMessage.warning('暂无数据')
    }
  }else{
    ElMessage.warning(res.message)
  }
}
const handleDelete = (val) => {
  ElMessageBox.confirm(
      '确定删除此条数据?',
      '提示',
      {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning',
      })
      .then( async() => {
        const res = await delDocChangesInvalidate({id: val.id})
        if(res.code == 200){
          ElMessage.success('数据删除成功')
          await getList()
        }else{
          ElMessage.warning(res.message)
        }
      })
}
</script>
src/views/work/documentManage/docDestruction/components/editDialog.vue
New file
@@ -0,0 +1,370 @@
<template>
  <div class="notice">
    <el-dialog
        v-model="dialogVisible"
        :title="state.title"
        width="50%"
        :before-close="handleClose"
        :close-on-press-escape="false"
        :close-on-click-modal="false"
    >
      <el-form :model="state.form" size="default" ref="superRef" :rules="state.formRules" label-width="150px" >
        <el-form-item v-if="state.isAdmin" label="企业:" prop="companyId">
          <el-select v-model="state.form.companyId" placeholder="请选择" :disabled="state.title =='查看'" clearable @change="getDeptList">
            <el-option
                v-for="item in state.companyList"
                :key="item.id"
                :label="item.name"
                :value="item.id">
            </el-option>
          </el-select>
        </el-form-item>
        <el-row>
          <el-col :span="12">
            <el-form-item label="文件名称:" prop="fileName">
              <el-input v-model.trim="state.form.fileName" :disabled="state.title =='查看'"></el-input>
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="序号:" prop="sort">
              <el-input v-model.number.trim="state.form.sort" :disabled="state.title =='查看'"></el-input>
            </el-form-item>
          </el-col>
        </el-row>
        <el-row>
          <el-col :span="8">
            <el-form-item label="编号:" prop="number">
              <el-input v-model.trim="state.form.number" :disabled="state.title =='查看'"></el-input>
            </el-form-item>
          </el-col>
          <el-col :span="8">
            <el-form-item label="版本:" prop="edition">
              <el-input v-model.trim="state.form.edition" :disabled="state.title =='查看'"></el-input>
            </el-form-item>
          </el-col>
          <el-col :span="8">
            <el-form-item label="份数:" prop="copies">
              <el-input v-model.number.trim="state.form.copies" type="number" :disabled="state.title =='查看'"></el-input>
            </el-form-item>
          </el-col>
        </el-row>
        <el-row>
          <el-col :span="12">
            <el-form-item label="销毁原因:" prop="destruction">
              <el-input v-model.trim="state.form.destruction" type="textarea" :autosize="{ minRows: 4}" :readonly="state.title =='查看'"></el-input>
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="申请人:" prop="destructionApplyId">
              <el-select clearable v-model="state.form.destructionApplyId" :disabled="state.title =='查看'" filterable placeholder="申请人" style="width: 100%">
                <el-option
                    v-for="item in state.userList"
                    :key="item.userId"
                    :label="item.name"
                    :value="item.userId"
                />
              </el-select>
            </el-form-item>
            <el-form-item label="日期:" prop="destructionApplyDate">
              <el-date-picker
                  v-model="state.form.destructionApplyDate"
                  type="date"
                  value-format="YYYY-MM-DD"
                  placeholder="请选择日期"
                  :disabled="state.title =='查看'"
                  style="width: 100%"
              />
            </el-form-item>
          </el-col>
        </el-row>
        <el-row>
          <el-col :span="12">
            <el-form-item label="所在部意见:" prop="deptOpinions">
              <el-input v-model.trim="state.form.deptOpinions" type="textarea" :autosize="{ minRows: 4}" :readonly="state.title =='查看'"></el-input>
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="人员:" prop="deptUserId">
              <el-select clearable v-model="state.form.deptUserId" :disabled="state.title =='查看'" filterable placeholder="人员" style="width: 100%">
                <el-option
                    v-for="item in state.userList"
                    :key="item.userId"
                    :label="item.name"
                    :value="item.userId"
                />
              </el-select>
            </el-form-item>
            <el-form-item label="日期:" prop="deptDate">
              <el-date-picker
                  v-model="state.form.deptDate"
                  type="date"
                  value-format="YYYY-MM-DD"
                  placeholder="请选择日期"
                  :disabled="state.title =='查看'"
                  style="width: 100%"
              />
            </el-form-item>
          </el-col>
        </el-row>
        <el-row>
          <el-col :span="12">
            <el-form-item label="文件保管部门意见:" prop="safekeepingOpinions">
              <el-input v-model.trim="state.form.safekeepingOpinions" type="textarea" :autosize="{ minRows: 4}" :readonly="state.title =='查看'"></el-input>
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="人员:" prop="safekeepingId">
              <el-select clearable v-model="state.form.safekeepingId" :disabled="state.title =='查看'" filterable placeholder="人员" style="width: 100%">
                <el-option
                    v-for="item in state.userList"
                    :key="item.userId"
                    :label="item.name"
                    :value="item.userId"
                />
              </el-select>
            </el-form-item>
            <el-form-item label="日期:" prop="safekeepingDate">
              <el-date-picker
                  v-model="state.form.safekeepingDate"
                  type="date"
                  value-format="YYYY-MM-DD"
                  placeholder="请选择日期"
                  :disabled="state.title =='查看'"
                  style="width: 100%"
              />
            </el-form-item>
          </el-col>
        </el-row>
        <el-row>
          <el-col :span="12">
            <el-form-item label="管理者代表意见:" prop="managementOpinions">
              <el-input v-model.trim="state.form.managementOpinions" type="textarea" :autosize="{ minRows: 4}" :readonly="state.title =='查看'"></el-input>
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="人员:" prop="managementId">
              <el-select clearable v-model="state.form.managementId" :disabled="state.title =='查看'" filterable placeholder="人员" style="width: 100%">
                <el-option
                    v-for="item in state.userList"
                    :key="item.userId"
                    :label="item.name"
                    :value="item.userId"
                />
              </el-select>
            </el-form-item>
            <el-form-item label="日期:" prop="managementDate">
              <el-date-picker
                  v-model="state.form.managementDate"
                  type="date"
                  value-format="YYYY-MM-DD"
                  placeholder="请选择日期"
                  :disabled="state.title =='查看'"
                  style="width: 100%"
              />
            </el-form-item>
          </el-col>
        </el-row>
      </el-form>
      <template #footer v-if="state.title !='查看'">
        <span class="dialog-footer">
            <el-button @click="handleClose" size="default">取 消</el-button>
            <el-button type="primary"  @click="onSubmit" size="default" v-preReClick>确认</el-button>
        </span>
      </template>
    </el-dialog>
  </div>
</template>
<script setup>
import {reactive, ref, toRefs, defineEmits, nextTick, onMounted} from 'vue'
import {ElMessage} from "element-plus";
import {Base64} from "js-base64"
import {getToken} from "@/utils/auth";
import {
  addInternalAuditCheck, getInternalAuditCheckInfo,
  updateInternalAuditCheck
} from "@/api/innerReview/meetingReview";
import {getDepart} from "@/api/orgStructure/depart";
import {listUser} from "@/api/system/user";
import {getMaintenanceRecordDetail, updateMaintenanceRecord} from "@/api/infrastructureMng/ledger";
import {saveDocDestructionApply} from "@/api/documentManage";
const emit = defineEmits(["getList"]);
const dialogVisible = ref(false)
const superRef = ref()
const state = reactive({
  title: '',
  form: {
    id: null,
    companyId: null,
    fileName: '',
    sort: null,
    number: '',
    edition: '',
    copies: null,
    destruction: '',
    destructionApplyId: null,
    destructionApplyName: '',
    destructionApplyDate: '',
    deptOpinions: '',
    deptUserId: null,
    deptUserName: '',
    deptDate: '',
    safekeepingOpinions: '',
    safekeepingId: null,
    safekeepingName: '',
    safekeepingDate: '',
    managementOpinions: '',
    managementId: null,
    managementName: '',
    managementDate: ''
  },
  formRules:{
    companyId: [{ required: true, message: '请选择企业', trigger: 'blur' }],
    fileName: [{ required: true, message: '请填写文件名称', trigger: 'blur' }],
    destruction: [{ required: true, message: '请填写销毁原因',  trigger: 'blur' }],
    destructionApplyId: [{ required: true, message: '请选择申请人',  trigger: 'blur' }],
    destructionApplyDate: [{ required: true, message: '请选择日期',  trigger: 'blur' }],
    deptOpinions: [{ required: true, message: '请填写所在部门意见',  trigger: 'blur' }],
    deptUserId: [{ required: true, message: '请选择人员',  trigger: 'blur' }],
    deptDate: [{ required: true, message: '请选择日期',  trigger: 'blur' }],
    safekeepingOpinions: [{ required: true, message: '请填写文件保管部门意见',  trigger: 'blur' }],
    safekeepingId: [{ required: true, message: '请选择人员',  trigger: 'blur' }],
    safekeepingDate: [{ required: true, message: '请选择日期',  trigger: 'blur' }],
    managementOpinions: [{ required: true, message: '请填写管理者代表意见',  trigger: 'blur' }],
    managementId: [{ required: true, message: '请选择人员',  trigger: 'blur' }],
    managementDate: [{ required: true, message: '请选择日期',  trigger: 'blur' }]
  },
  isAdmin: false,
  companyList: [],
  userList: []
})
onMounted(() => {
});
const openDialog = async (type, value,companyId, isAdmin, companyList) => {
  state.isAdmin = isAdmin
  if(isAdmin){
    state.companyList = companyList
  }
  await getUserList(companyId)
  state.title = type === 'add' ? '新增' : type ==='edit' ? '编辑' : '查看'
  state.form.companyId = companyId
  if(state.title == '编辑'||state.title == '查看'){
    Object.keys(state.form).forEach(key => {
      if (key in value) {
        state.form[key] = value[key]
      }
    })
  }
  dialogVisible.value = true
}
const onSubmit = async () => {
  const valid = await superRef.value.validate()
  if(valid){
    const data = JSON.parse(JSON.stringify(state.form))
    data.destructionApplyName = state.userList.find(i=>i.userId == data.destructionApplyId)?.name
    data.deptUserName = state.userList.find(i=>i.userId == data.deptUserId)?.name
    data.safekeepingName = state.userList.find(i=>i.userId == data.safekeepingId)?.name
    data.managementName = state.userList.find(i=>i.userId == data.managementId)?.name
    if(state.title == '新增'){
      delete data.id
      const res = await saveDocDestructionApply(data)
      if(res.code == 200){
        ElMessage.success(res.message)
        emit('getList')
        handleClose()
        dialogVisible.value = false;
      }else{
        ElMessage.warning(res.message)
      }
    }else{
      const res = await saveDocDestructionApply(data)
      if(res.code == 200){
        ElMessage.success(res.message)
        emit('getList')
        handleClose()
        dialogVisible.value = false;
      }else{
        ElMessage.warning(res.message)
      }
    }
  }
}
const getDeptList = async ()=>{
  state.form.destructionApplyId = null
  state.form.deptUserId = null
  state.form.safekeepingId = null
  state.form.managementId = null
  await getUserList(state.form.companyId)
}
const getUserList = async (companyId)=> {
  const res = await listUser({pageIndex: 1,pageSize: 999, companyId: companyId})
  if(res.code == 200){
    state.userList = res.data.list?res.data.list.map(item=>{
      const user = item.id
      const {id, ...data} = item
      return {
        ...data,
        userId: user
      }
    }):[]
  }else{
    ElMessage.warning(res.message)
  }
}
const handleClose = () => {
  state.form = {
    id: null,
    companyId: null,
    fileName: '',
    sort: null,
    number: '',
    edition: '',
    copies: null,
    destruction: '',
    destructionApplyId: null,
    destructionApplyName: '',
    destructionApplyDate: '',
    deptOpinions: '',
    deptUserId: null,
    deptUserName: '',
    deptDate: '',
    safekeepingOpinions: '',
    safekeepingId: null,
    safekeepingName: '',
    safekeepingDate: '',
    managementOpinions: '',
    managementId: null,
    managementName: '',
    managementDate: ''
  }
  superRef.value.clearValidate();
  superRef.value.resetFields()
  dialogVisible.value = false;
}
defineExpose({
  openDialog
});
</script>
<style scoped lang="scss">
.notice{
  :deep(.el-form .el-form-item__label) {
    font-size: 15px;
  }
  .file {
    display: flex;
    flex-direction: column;
    align-items: flex-start;
  }
}
</style>
src/views/work/documentManage/docDestruction/index.vue
New file
@@ -0,0 +1,180 @@
<template>
  <div class="app-container">
    <div style="display: flex;justify-content: space-between">
      <el-form :inline="true" style="display: flex;align-items: center;flex-wrap: wrap;" >
        <el-form-item>
          <el-button
              type="primary"
              plain
              icon="Plus"
              @click="openDialog('add',{})"
          >新增</el-button>
        </el-form-item>
        <el-form-item v-if="isAdmin" label="企业:" >
          <el-select v-model="data.queryParams.companyId" placeholder="请选择" clearable>
            <el-option
                v-for="item in companyList"
                :key="item.id"
                :label="item.name"
                :value="item.id">
            </el-option>
          </el-select>
        </el-form-item>
        <el-form-item >
          <el-button v-if="isAdmin" type="primary" @click="getList">查询</el-button>
          <el-button v-if="isAdmin" type="primary" plain @click="reset">重置</el-button>
<!--          <el-button type="primary">导出</el-button>-->
        </el-form-item>
      </el-form>
    </div>
    <!-- 表格数据 -->
    <el-table v-loading="loading" :data="dataList" :border="true">
      <el-table-column type="index" label="序号"></el-table-column>
      <el-table-column prop="fileName" align="center" label="文件名称"></el-table-column>
      <el-table-column label="操作" align="center">
        <template #default="scope">
          <el-button link type="primary" @click="openDialog('view',scope.row)">查看</el-button>
          <el-button link type="primary" @click="openDialog('edit',scope.row)">编辑</el-button>
          <el-button link type="primary" @click="downloadFile(scope.row)">导出</el-button>
          <el-button link type="danger" @click="handleDelete(scope.row)">删除</el-button>
        </template>
      </el-table-column>
    </el-table>
    <pagination
        v-show="total > 0"
        :total="total"
        v-model:page="queryParams.pageNum"
        v-model:limit="queryParams.pageSize"
        @pagination="getList"
    />
    <edit-dialog ref="dialogRef" @getList=getList></edit-dialog>
  </div>
</template>
<script setup>
import {getCurrentInstance, onMounted, onUnmounted, reactive, ref, toRefs} from "vue";
import {ElMessage, ElMessageBox} from "element-plus";
import {delCompany, getCompany} from "@/api/onlineEducation/company";
import Cookies from "js-cookie";
import editDialog from './components/editDialog.vue'
import useUserStore from "@/store/modules/user";
import {generateWordDocument} from "@/utils/exportWord";
import {
  delMaintenanceRecord,
  getMaintenanceRecordDetail,
  getMaintenanceRecordList
} from "@/api/infrastructureMng/ledger";
import {getInternalAuditCheckInfo} from "@/api/innerReview/meetingReview";
import {delDocDestructionApply, getDocDestructionApplyList} from "@/api/documentManage";
const userStore = useUserStore()
const { proxy } = getCurrentInstance();
const loading = ref(false);
const dialogRef = ref();
const data = reactive({
  queryParams: {
    pageNum: 1,
    pageSize: 10,
    companyId: null
  },
  total: 0,
  dataList: [],
  companyList: [],
  isAdmin: false
});
const { queryParams, total, dataList,companyList, isAdmin } = toRefs(data);
const userInfo = ref()
onMounted(async ()=>{
  if(userStore.roles.includes('admin')){
    data.isAdmin = true
    await getCompanyList()
  }else{
    data.isAdmin = false
    data.queryParams.companyId = userStore.companyId
  }
  await getList()
})
onUnmounted(()=>{
})
const getList = async () => {
  loading.value = true
  const res = await getDocDestructionApplyList(data.queryParams)
  if(res.code == 200){
    data.dataList = res.data.list || []
    data.total = res.data.total
  }else{
    ElMessage.warning(res.message)
  }
  loading.value = false
}
const getCompanyList = async ()=>{
  const queryParams = {
    pageNum: 1,
    pageSize: 999
  }
  const res = await getCompany(queryParams)
  if (res.code == 200) {
    data.companyList = res.data.list?res.data.list:[]
    // data.queryParams.companyId = data.companyList[0].id
  } else {
    ElMessage.warning(res.message)
  }
}
const openDialog = (type, value) => {
  dialogRef.value.openDialog(type, value, data.queryParams.companyId, data.isAdmin, data.companyList);
}
const downloadFile = async (val)=>{
    let tableData = val
    tableData.destructionApplyDate = tableData.destructionApplyDate.substring(0,10)
    tableData.deptDate = tableData.deptDate.substring(0,10)
    tableData.safekeepingDate = tableData.safekeepingDate.substring(0,10)
    tableData.managementDate = tableData.managementDate.substring(0,10)
    try {
      generateWordDocument('/docDestruction.docx', tableData, tableData.fileName + '文件销毁申请表.docx');
    } catch (error){
      ElMessage({
        type: 'warning',
        message: '导出失败'
      });
    }
}
/** 重置新增的表单以及其他数据  */
const reset= async()=> {
  data.queryParams = {
    pageNum: 1,
    pageSize: 10,
    companyId: null
  }
  await getCompanyList()
  await getList()
}
const handleDelete = (val) => {
  ElMessageBox.confirm(
      '确定删除此条数据?',
      '提示',
      {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning',
      })
      .then( async() => {
        const res = await delDocDestructionApply({id: val.id})
        if(res.code == 200){
          ElMessage.success('数据删除成功')
          await getList()
        }else{
          ElMessage.warning(res.message)
        }
      })
}
</script>
src/views/work/documentManage/docDistributeRetrieve/components/editDialog.vue
New file
@@ -0,0 +1,428 @@
<template>
  <div class="notice">
    <el-dialog
        v-model="dialogVisible"
        :title="state.title"
        width="75%"
        :before-close="handleClose"
        :close-on-press-escape="false"
        :close-on-click-modal="false"
    >
      <el-form :model="state.form" size="default" ref="superRef" :rules="state.formRules" label-width="150px" >
        <el-form-item v-if="state.isAdmin" label="企业:" prop="companyId">
          <el-select v-model="state.form.companyId" placeholder="请选择" :disabled="state.title =='查看'" clearable @change="getDeptList">
            <el-option
                v-for="item in state.companyList"
                :key="item.id"
                :label="item.name"
                :value="item.id">
            </el-option>
          </el-select>
        </el-form-item>
        <el-form-item label="记录名称:" prop="name">
          <el-input v-model.trim="state.form.name" :readonly="state.title =='查看'"></el-input>
        </el-form-item>
        <el-form-item label="文件发放回收记录:" prop="documentDistributionCollectionRecordList">
          <el-button
              type="primary"
              plain
              icon="Plus"
              @click="addLine"
              style="margin-bottom: 10px"
              v-if="state.title !='查看'"
          >新增</el-button>
        </el-form-item>
        <el-table :data="state.form.documentDistributionCollectionRecordList" class="customedTable" :border="true">
          <el-table-column label="序号" type="index" width="80" align="center">
          </el-table-column>
          <el-table-column label="文件名称" prop="fileName" align="center">
            <template #default="scope">
              <el-input
                  v-model.trim="scope.row.fileName"
                  size="large"
                  type="textarea"
                  style="width: 100%;"
                  clearable
                  :readonly="state.title =='查看'"
              >
              </el-input>
            </template>
          </el-table-column>
          <el-table-column label="编号" prop="number" align="center">
            <template #default="scope">
              <el-input
                  v-model.trim="scope.row.number"
                  size="large"
                  type="textarea"
                  style="width: 100%;"
                  clearable
                  :readonly="state.title =='查看'"
              >
              </el-input>
            </template>
          </el-table-column>
          <el-table-column label="发放记录" align="center">
            <el-table-column label="部门" prop="distributionDeptName" align="center">
              <template #default="scope">
                <el-input
                    v-model.trim="scope.row.distributionDeptName"
                    size="large"
                    type="textarea"
                    style="width: 100%;"
                    clearable
                    :readonly="state.title =='查看'"
                >
                </el-input>
              </template>
            </el-table-column>
            <el-table-column label="签收" prop="distributionSign" align="center">
              <template #default="scope">
                <el-input
                    v-model.trim="scope.row.distributionSign"
                    size="large"
                    type="textarea"
                    style="width: 100%;"
                    clearable
                    :readonly="state.title =='查看'"
                >
                </el-input>
              </template>
            </el-table-column>
            <el-table-column label="日期" prop="distributionDate" align="center">
              <template #default="scope">
                <el-date-picker
                    v-model="scope.row.distributionDate"
                    type="date"
                    value-format="YYYY-MM-DD"
                    placeholder="请选择日期"
                    :disabled="state.title =='查看'"
                />
              </template>
            </el-table-column>
            <el-table-column label="份数" prop="distributionNum" align="center">
              <template #default="scope">
                <el-input
                    v-model.trim="scope.row.distributionNum"
                    size="large"
                    type="textarea"
                    style="width: 100%;"
                    clearable
                    :readonly="state.title =='查看'"
                >
                </el-input>
              </template>
            </el-table-column>
          </el-table-column>
          <el-table-column label="回收记录" align="center">
            <el-table-column label="部门" prop="collectionDeptName" align="center">
              <template #default="scope">
                <el-input
                    v-model.trim="scope.row.collectionDeptName"
                    size="large"
                    type="textarea"
                    style="width: 100%;"
                    clearable
                    :readonly="state.title =='查看'"
                >
                </el-input>
              </template>
            </el-table-column>
            <el-table-column label="签回" prop="collectionSign" align="center">
              <template #default="scope">
                <el-input
                    v-model.trim="scope.row.collectionSign"
                    size="large"
                    type="textarea"
                    style="width: 100%;"
                    clearable
                    :readonly="state.title =='查看'"
                >
                </el-input>
              </template>
            </el-table-column>
            <el-table-column label="日期" prop="collectionDate" align="center">
              <template #default="scope">
                <el-date-picker
                    v-model="scope.row.collectionDate"
                    type="date"
                    value-format="YYYY-MM-DD"
                    placeholder="请选择日期"
                    :disabled="state.title =='查看'"
                />
              </template>
            </el-table-column>
            <el-table-column label="份数" prop="collectionNum" align="center">
              <template #default="scope">
                <el-input
                    v-model.trim="scope.row.collectionNum"
                    size="large"
                    type="textarea"
                    style="width: 100%;"
                    clearable
                    :readonly="state.title =='查看'"
                >
                </el-input>
              </template>
            </el-table-column>
          </el-table-column>
          <el-table-column label="备注/版本" prop="remark" align="center">
            <template #default="scope">
              <el-input
                  v-model.trim="scope.row.remark"
                  size="large"
                  type="textarea"
                  style="width: 100%;"
                  clearable
                  :readonly="state.title =='查看'"
              >
              </el-input>
            </template>
          </el-table-column>
          <el-table-column label="操作" align="center" width="70" v-if="state.title !='查看'">
            <template #default="scope">
              <el-button link type="danger" @click="handleDelete(scope.$index)">删除</el-button>
            </template>
          </el-table-column>
        </el-table>
        <el-row>
          <el-col :span="12">
            <el-form-item label="制表:" prop="tabulationId">
              <el-select clearable v-model="state.form.tabulationId" :disabled="state.title =='查看'" filterable placeholder="编制" style="width: 100%">
                <el-option
                    v-for="item in state.userList"
                    :key="item.userId"
                    :label="item.name"
                    :value="item.userId"
                />
              </el-select>
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="日期:" prop="tabulationDate">
              <el-date-picker
                  v-model="state.form.tabulationDate"
                  type="date"
                  value-format="YYYY-MM-DD"
                  placeholder="请选择日期"
                  :disabled="state.title =='查看'"
              />
            </el-form-item>
          </el-col>
        </el-row>
      </el-form>
      <template #footer v-if="state.title !='查看'">
        <span class="dialog-footer">
            <el-button @click="handleClose" size="default">取 消</el-button>
            <el-button type="primary"  @click="onSubmit" size="default" v-preReClick>确认</el-button>
        </span>
      </template>
    </el-dialog>
  </div>
</template>
<script setup>
import {reactive, ref, toRefs, defineEmits, nextTick, onMounted} from 'vue'
import {ElMessage} from "element-plus";
import {getToken} from "@/utils/auth";
import {
  updateMaintenanceEvaluate,
  getMaintenanceEvaluateDetail
} from "@/api/infrastructureMng/ledger";
import {listUser} from "@/api/system/user";
import {getDocDistributeCollectDetail, saveDocDistributeCollect} from "@/api/documentManage";
const emit = defineEmits(["getList"]);
const dialogVisible = ref(false)
const superRef = ref()
const checkList = (rule, value, callback) => {
  if (state.form.documentDistributionCollectionRecordList.length == 0) {
    callback(new Error('文件发放回收记录不可为空'))
  } else {
    callback()
  }
}
const state = reactive({
  title: '',
  form: {
    id: null,
    companyId: null,
    name: '',
    documentDistributionCollectionRecordList: [],
    deleteIds: [],
    tabulationId: null,
    tabulationName: '',
    tabulationDate: ''
  },
  oldDeviceList: [],
  formRules:{
    companyId: [{ required: true, message: '请选择企业', trigger: 'blur' }],
    name: [{ required: true, message: '请填写名称', trigger: 'blur' }],
    tabulationId: [{ required: true, message: '请选择制表人', trigger: 'blur' }],
    tabulationDate: [{ required: true, message: '请选择制表日期', trigger: 'blur' }],
  },
  isAdmin: false,
  companyList: [],
  userList: []
})
onMounted(() => {
});
const openDialog = async (type, value,companyId, isAdmin, companyList) => {
  state.isAdmin = isAdmin
  if(isAdmin){
    state.companyList = companyList
  }
  await getUserList(companyId)
  state.title = type === 'add' ? '新增' : type ==='edit' ? '编辑' : '查看'
  state.form.companyId = companyId
  if(state.title == '编辑'||state.title == '查看'){
    await getInfo(value.id)
  }
  dialogVisible.value = true
}
const addLine = () => {
  const obj = {
    id: null,
    documentId: null,
    fileName: '',
    number: '',
    distributionDeptName: '',
    distributionSign: '',
    distributionDate: '',
    distributionNum: null,
    collectionDeptName: '',
    collectionSign: '',
    collectionDate: '',
    collectionNum: null,
    remark: ''
  }
  state.form.documentDistributionCollectionRecordList.push(obj);
}
const handleDelete = (i) =>{
  state.form.documentDistributionCollectionRecordList = state.form.documentDistributionCollectionRecordList.filter((item,index) => index != i)
}
const onSubmit = async () => {
  const valid = await superRef.value.validate();
  if(valid){
    const data = JSON.parse(JSON.stringify(state.form))
    data.deleteIds = state.oldDeviceList.filter(i =>!data.documentDistributionCollectionRecordList.some(item=>item.id == i.id)).map(i=>i.id)
    data.tabulationName = state.userList.find(i=>i.userId == data.tabulationId)?.name
    if(state.title == '新增'){
      delete data.id
      const res = await saveDocDistributeCollect(data)
      if(res.code == 200){
        ElMessage.success(res.message)
        emit('getList')
        handleClose()
        dialogVisible.value = false;
      }else{
        ElMessage.warning(res.message)
      }
    }else{
      const res = await saveDocDistributeCollect(data)
      if(res.code == 200){
        ElMessage.success(res.message)
        emit('getList')
        handleClose()
        dialogVisible.value = false;
      }else{
        ElMessage.warning(res.message)
      }
    }
  }
}
const getInfo = async (id)=> {
  const res = await getDocDistributeCollectDetail({id: id})
  if(res.code == 200){
    Object.keys(state.form).forEach(key => {
      if (key in res.data) {
        state.form[key] = res.data[key]
      }
    })
    state.form.documentDistributionCollectionRecordList = res.data.documentDistributionCollectionRecordList?.map(
        ({ id, documentId, fileName, number, distributionDeptName, distributionSign, distributionDate, distributionNum, collectionDeptName, collectionSign, collectionDate, collectionNum, remark}) => ({
          id, documentId, fileName, number, distributionDeptName, distributionSign, distributionDate, distributionNum, collectionDeptName, collectionSign, collectionDate, collectionNum, remark
        })
    )
    state.oldDeviceList = state.form.documentDistributionCollectionRecordList
  }else{
    ElMessage.warning(res.message)
  }
}
const getDeptList = async ()=>{
  state.form.tabulationId = null
  state.form.tabulationName = ''
  await getUserList(state.form.companyId)
}
const getUserList = async (companyId)=> {
  const res = await listUser({pageIndex: 1,pageSize: 999,companyId: companyId})
  if(res.code == 200){
    state.userList = res.data.list?res.data.list.map(item=>{
      const user = item.id
      const {id, ...data} = item
      return {
        ...data,
        userId: user
      }
    }):[]
  }else{
    ElMessage.warning(res.message)
  }
}
const handleClose = () => {
  state.form = {
    id: null,
    companyId: null,
    name: '',
    documentDistributionCollectionRecordList: [],
    deleteIds: [],
    tabulationId: null,
    tabulationName: '',
    tabulationDate: ''
  }
  superRef.value.clearValidate();
  superRef.value.resetFields()
  dialogVisible.value = false;
}
defineExpose({
  openDialog
});
</script>
<style scoped lang="scss">
.notice{
  :deep(.el-form .el-form-item__label) {
    font-size: 15px;
  }
  .file {
    display: flex;
    flex-direction: column;
    align-items: flex-start;
  }
}
</style>
<style lang="scss">
.customedTable{
  width: calc(100% - 150px);
  margin-left: 150px;
  margin-bottom: 30px;
  .el-table__cell{
    padding: 2px 0 !important;
    font-size: 14px !important;
  }
  .cell{
    padding: 0 2px !important;
    font-size: 14px !important;
  }
}
</style>
src/views/work/documentManage/docDistributeRetrieve/index.vue
New file
@@ -0,0 +1,203 @@
<template>
  <div class="app-container">
    <div style="display: flex;justify-content: space-between">
      <el-form :inline="true" style="display: flex;align-items: center;flex-wrap: wrap;" >
        <el-form-item>
          <el-button
              type="primary"
              plain
              icon="Plus"
              @click="openDialog('add',{})"
          >新增</el-button>
        </el-form-item>
        <el-form-item v-if="isAdmin" label="企业:" >
          <el-select v-model="data.queryParams.companyId" placeholder="请选择" clearable>
            <el-option
                v-for="item in companyList"
                :key="item.id"
                :label="item.name"
                :value="item.id">
            </el-option>
          </el-select>
        </el-form-item>
        <el-form-item >
          <el-button v-if="isAdmin" type="primary" @click="getList">查询</el-button>
          <el-button v-if="isAdmin" type="primary" plain @click="reset">重置</el-button>
<!--          <el-button type="primary">导出</el-button>-->
        </el-form-item>
      </el-form>
    </div>
    <!-- 表格数据 -->
    <el-table v-loading="loading" :data="dataList" :border="true">
      <el-table-column type="index" label="序号"></el-table-column>
      <el-table-column prop="enactmentDate" align="center" label="检查表名称">
        <template #default="scope">
          {{scope.row.name + '记录'}}
        </template>
      </el-table-column>
      <el-table-column label="操作" align="center">
        <template #default="scope">
          <el-button link type="primary" @click="openDialog('view',scope.row)">查看</el-button>
          <el-button link type="primary" @click="openDialog('edit',scope.row)">编辑</el-button>
          <el-button link type="primary" @click="downloadFile(scope.row)">导出</el-button>
          <el-button link type="danger" @click="handleDelete(scope.row)">删除</el-button>
        </template>
      </el-table-column>
    </el-table>
    <pagination
        v-show="total > 0"
        :total="total"
        v-model:page="queryParams.pageNum"
        v-model:limit="queryParams.pageSize"
        @pagination="getList"
    />
    <edit-dialog ref="dialogRef" @getList=getList></edit-dialog>
  </div>
</template>
<script setup>
import {getCurrentInstance, onMounted, onUnmounted, reactive, ref, toRefs} from "vue";
import {ElMessage, ElMessageBox} from "element-plus";
import {delCompany, getCompany} from "@/api/onlineEducation/company";
import Cookies from "js-cookie";
import editDialog from './components/editDialog.vue'
import useUserStore from "@/store/modules/user";
import {generateWordDocument} from "@/utils/exportWord";
import {
  delMaintenanceEvaluate,
  getMaintenanceEvaluateDetail,
  getMaintenanceEvaluateList
} from "@/api/infrastructureMng/ledger";
import {
  delDocDistributeCollect,
  getDocDistributeCollectDetail,
  getDocDistributeCollectList
} from "@/api/documentManage";
const userStore = useUserStore()
const { proxy } = getCurrentInstance();
const loading = ref(false);
const dialogRef = ref();
const data = reactive({
  queryParams: {
    pageNum: 1,
    pageSize: 10,
    companyId: null
  },
  total: 0,
  dataList: [],
  companyList: [],
  isAdmin: false
});
const { queryParams, total, dataList,companyList, isAdmin } = toRefs(data);
const userInfo = ref()
onMounted(async ()=>{
  if(userStore.roles.includes('admin')){
    data.isAdmin = true
    await getCompanyList()
  }else{
    data.isAdmin = false
    data.queryParams.companyId = userStore.companyId
  }
  await getList()
})
onUnmounted(()=>{
})
const getList = async () => {
  loading.value = true
  const res = await getDocDistributeCollectList(data.queryParams)
  if(res.code == 200){
    data.dataList = res.data.list || []
    data.total = res.data.total
  }else{
    ElMessage.warning(res.message)
  }
  loading.value = false
}
const getCompanyList = async ()=>{
  const queryParams = {
    pageNum: 1,
    pageSize: 999
  }
  const res = await getCompany(queryParams)
  if (res.code == 200) {
    data.companyList = res.data.list?res.data.list:[]
    // data.queryParams.companyId = data.companyList[0].id
  } else {
    ElMessage.warning(res.message)
  }
}
const downloadFile = async (val)=>{
  const res = await getDocDistributeCollectDetail({id: val.id})
  if(res.code == 200){
    if(res.data){
      let tableData = res.data
      tableData.table = res.data.documentDistributionCollectionRecordList.map((item,index)=>{
        return {
          ...item,
          index: index + 1,
          distributionDate: item.distributionDate.substring(0,10),
          collectionDate: item.collectionDate.substring(0,10)
        }
      })
      tableData.tabulationDate = tableData.tabulationDate.substring(0,10)
      try {
        generateWordDocument('/docDistributeRetrieve.docx', tableData, tableData.name +'文件发放/回收记录.docx');
      } catch (error){
        ElMessage({
          type: 'warning',
          message: '导出失败'
        });
      }
    }else{
      ElMessage.warning('暂无数据')
    }
  }else{
    ElMessage.warning(res.message)
  }
}
const openDialog = (type, value) => {
  dialogRef.value.openDialog(type, value, data.queryParams.companyId, data.isAdmin, data.companyList);
}
/** 重置新增的表单以及其他数据  */
const reset= async()=> {
  data.queryParams = {
    pageNum: 1,
    pageSize: 10,
    companyId: null
  }
  await getCompanyList()
  await getList()
}
const handleDelete = (val) => {
  ElMessageBox.confirm(
      '确定删除此条数据?',
      '提示',
      {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning',
      })
      .then( async() => {
        const res = await delDocDistributeCollect({id: val.id})
        if(res.code == 200){
          ElMessage.success('数据删除成功')
          await getList()
        }else{
          ElMessage.warning(res.message)
        }
      })
}
</script>
src/views/work/empResource/deptEmpAnalysis/index.vue
New file
@@ -0,0 +1,372 @@
<template>
  <div class="app-container">
    <div style="display: flex;justify-content: space-between">
      <el-form :inline="true" style="display: flex;align-items: center;flex-wrap: wrap;" >
<!--        <el-form-item>-->
<!--          <el-button-->
<!--              type="primary"-->
<!--              plain-->
<!--              icon="Plus"-->
<!--              @click="openDialog('add',{})"-->
<!--          >新增</el-button>-->
<!--        </el-form-item>-->
        <el-form-item v-if="isAdmin" label="企业:" >
          <el-select v-model="data.queryParams.companyId" placeholder="请选择" clearable>
            <el-option
                v-for="item in companyList"
                :key="item.id"
                :label="item.name"
                :value="item.id">
            </el-option>
          </el-select>
        </el-form-item>
        <el-form-item >
          <el-button v-if="isAdmin" type="primary" @click="getList">查询</el-button>
          <el-button v-if="isAdmin" type="primary" plain @click="reset">重置</el-button>
        </el-form-item>
      </el-form>
    </div>
    <!-- 表格数据 -->
    <div>
      公司目前拥有职工总人数{{ dataList.totalUser }}人,包括{{ dataList.post }}等专业,
      <span v-if="(dataList.qualification5 && dataList.qualification5>0) || (dataList.qualification4 && dataList.qualification4>0)">
        <span v-if="dataList.qualification5>0">博士</span>
        <span v-if="dataList.qualification4>0">硕士</span>
        高端人才多人,
      </span>
      <span v-if="(dataList.positional3 && dataList.positional3>0) || (dataList.positional2 && dataList.positional2>0) || (dataList.positional1 && dataList.positional1>0)">
        其中
        <span v-if="dataList.positional3>0">高级人称{{dataList.positional3}}人,</span>
        <span v-if="dataList.positional2>0">中级人称{{dataList.positional2}}人,</span>
        <span v-if="dataList.positional1>0">初级人称{{dataList.positional1}}人,</span>。
      </span>
      <br>
      本科及以上学历{{dataList.qualification3 + dataList.qualification4 + dataList.qualification5}}人,占总人数的{{dataList.qualificationBKRatio}}%,
      专业技术人员{{dataList.personTypeJS}}人,占总人数的{{dataList.jsRatio}}%以上,具备稳定的技术研发队伍。
      <br>
      公司员工年龄结构较为年轻化,平均年龄为{{dataList.avgAge}}岁,其中18周岁到40周岁的有{{dataList.age1840}}人,占总人数的{{dataList.age1840Ratio}}%,40周岁以上有{{dataList.age40}}人,占总人数的{{dataList.age40Ratio}}%。
    </div>
    <div style="margin-top: 40px">
      <el-radio-group v-model="tabValue" style="margin-bottom: 20px">
        <el-radio-button :label="1">饼图展示</el-radio-button>
        <el-radio-button :label="2">柱状图展示</el-radio-button>
      </el-radio-group>
      <div v-show="tabValue == 1" style="width: 100%;display: flex">
        <div id="pie1" style="width: 33.33%;height: 500px"></div>
        <div id="pie2" style="width: 33.33%;height: 500px"></div>
        <div id="pie3" style="width: 33.33%;height: 500px"></div>
      </div>
      <div v-show="tabValue == 2" style="width: 100%;display: flex">
        <div id="stick1" style="width: calc((100vw - 280px)/3);height: 500px"></div>
        <div id="stick2" style="width: calc((100vw - 280px)/3);height: 500px"></div>
        <div id="stick3" style="width: calc((100vw - 280px)/3);height: 500px"></div>
      </div>
    </div>
  </div>
</template>
<script setup>
import {getCurrentInstance, onMounted, onUnmounted, reactive, ref, toRefs} from "vue";
import {ElMessage, ElMessageBox} from "element-plus";
import {delCompany, getCompany} from "@/api/onlineEducation/company";
import Cookies from "js-cookie";
import useUserStore from "@/store/modules/user";
import {getDepEmpsDetail} from "@/api/staffManage/staff";
import * as echarts from 'echarts';
const userStore = useUserStore()
const { proxy } = getCurrentInstance();
const loading = ref(false);
const dialogRef = ref();
const data = reactive({
  queryParams: {
    companyId: null
  },
  total: 0,
  dataList: {},
  companyList: [],
  isAdmin: false,
  tabValue: 1
});
const { queryParams, total, dataList,companyList, isAdmin, tabValue } = toRefs(data);
const userInfo = ref()
onMounted(async ()=>{
  userInfo.value = JSON.parse(Cookies.get('userInfo'))
  if(userStore.roles.includes('admin')){
    data.isAdmin = true
    await getCompanyList()
  }else{
    data.isAdmin = false
    data.queryParams.companyId = userStore.companyId
  }
  await getList()
})
onUnmounted(()=>{
})
const getList = async () => {
  loading.value = true
  const res = await getDepEmpsDetail(data.queryParams)
  if(res.code == 200){
    data.dataList = res.data
    await initPie1(data.dataList)
    await initPie2(data.dataList)
    await initPie3(data.dataList)
    await initStick1(data.dataList)
    await initStick2(data.dataList)
    await initStick3(data.dataList)
  }else{
    ElMessage.warning(res.message)
  }
  loading.value = false
}
const getCompanyList = async ()=>{
  const queryParams = {
    pageNum: 1,
    pageSize: 999
  }
  const res = await getCompany(queryParams)
  if (res.code == 200) {
    data.companyList = res.data.list?res.data.list:[]
    data.queryParams.companyId = data.companyList[0].id
  } else {
    ElMessage.warning(res.message)
  }
}
const initPie1 = (data)=>{
  var chartDom = document.getElementById('pie1');
  var myChart = echarts.init(chartDom);
  var option;
  option = {
    title: {
      text: '职称分布',
      left: 'center'
    },
    tooltip: {
      trigger: 'item'
    },
    legend: {
      orient: 'horizontal',
      left: 'center',
      top: 40
    },
    series: [
      {
        type: 'pie',
        radius: '50%',
        data: [
          { value: data.positional3, name: '高级' },
          { value: data.positional2, name: '中级' },
          { value: data.positional1, name: '初级' },
        ],
        emphasis: {
          itemStyle: {
            shadowBlur: 10,
            shadowOffsetX: 0,
            shadowColor: 'rgba(0, 0, 0, 0.5)'
          }
        }
      }
    ]
  };
  option && myChart.setOption(option);
}
const initPie2 = (data)=>{
  var chartDom = document.getElementById('pie2');
  var myChart = echarts.init(chartDom);
  var option;
  option = {
    title: {
      text: '学历分布',
      left: 'center'
    },
    tooltip: {
      trigger: 'item'
    },
    legend: {
      orient: 'horizontal',
      left: 'center',
      top: 40
    },
    series: [
      {
        type: 'pie',
        radius: '50%',
        data: [
          { value: data.qualification1, name: '高中及以下' },
          { value: data.qualification2, name: '专科' },
          { value: data.qualification3, name: '本科' },
          { value: data.qualification4, name: '硕士' },
          { value: data.qualification5, name: '博士及以上' }
        ],
        emphasis: {
          itemStyle: {
            shadowBlur: 10,
            shadowOffsetX: 0,
            shadowColor: 'rgba(0, 0, 0, 0.5)'
          }
        }
      }
    ]
  };
  option && myChart.setOption(option);
}
const initPie3 = (data)=>{
  var chartDom = document.getElementById('pie3');
  var myChart = echarts.init(chartDom);
  var option;
  option = {
    title: {
      text: '年龄分布',
      left: 'center'
    },
    tooltip: {
      trigger: 'item'
    },
    legend: {
      orient: 'horizontal',
      left: 'center',
      top: 40
    },
    series: [
      {
        type: 'pie',
        radius: '50%',
        data: [
          { value: data.age1840, name: '18岁-40岁' },
          { value: data.age40, name: '40岁以上' }
        ],
        emphasis: {
          itemStyle: {
            shadowBlur: 10,
            shadowOffsetX: 0,
            shadowColor: 'rgba(0, 0, 0, 0.5)'
          }
        }
      }
    ]
  }
  option && myChart.setOption(option);
}
const initStick1= (data) =>{
  var chartDom = document.getElementById('stick1');
  var myChart = echarts.init(chartDom);
  var option;
  option = {
    title: {
      text: '职称分布',
      left: 'center'
    },
    tooltip: {
      trigger: 'item'
    },
    legend: {
      orient: 'horizontal',
      left: 'center',
      top: 40
    },
    xAxis: {
      type: 'category',
      data: ['高级', '中级', '初级']
    },
    yAxis: {
      type: 'value'
    },
    series: [
      {
        data: [data.positional3, data.positional2, data.positional1],
        type: 'bar'
      }
    ]
  };
  option && myChart.setOption(option);
}
const initStick2= (data) =>{
  var chartDom = document.getElementById('stick2');
  var myChart = echarts.init(chartDom);
  var option;
  option = {
    title: {
      text: '学历分布',
      left: 'center'
    },
    tooltip: {
      trigger: 'item'
    },
    legend: {
      orient: 'horizontal',
      left: 'center',
      top: 40
    },
    xAxis: {
      type: 'category',
      data: ['高中及以下','专科', '本科', '硕士', '博士及以上']
    },
    yAxis: {
      type: 'value'
    },
    series: [
      {
        data: [data.qualification1, data.qualification2, data.qualification3, data.qualification4, data.qualification5],
        type: 'bar'
      }
    ]
  };
  option && myChart.setOption(option);
}
const initStick3= (data) =>{
  var chartDom = document.getElementById('stick3');
  var myChart = echarts.init(chartDom);
  var option;
  option = {
    title: {
      text: '年龄分布',
      left: 'center'
    },
    tooltip: {
      trigger: 'item'
    },
    legend: {
      orient: 'horizontal',
      left: 'center',
      top: 40
    },
    xAxis: {
      type: 'category',
      data: ['18岁-40岁', '40岁以上']
    },
    yAxis: {
      type: 'value'
    },
    series: [
      {
        data: [data.age1840, data.age40],
        type: 'bar'
      }
    ]
  };
  option && myChart.setOption(option);
}
/** 重置新增的表单以及其他数据  */
const reset= async()=> {
  data.queryParams = {
    pageNum: 1,
    pageSize: 10,
    companyId: null
  }
  await getCompanyList()
  await getList()
}
</script>
src/views/work/empResource/specialEmp/components/empDialog.vue
New file
@@ -0,0 +1,728 @@
<template>
  <div class="notice">
    <el-dialog
        v-model="dialogVisible"
        :title="state.title"
        width="700px"
        :before-close="handleClose"
        :close-on-press-escape="false"
        :close-on-click-modal="false"
    >
      <el-form :model="state.form" size="default" ref="superRef" :rules="state.formRules" label-width="150px" >
        <el-form-item label="用户名:"  prop="username" v-if="state.title == '查看'">
          <el-input v-model.trim="state.form.username" :disabled="state.title =='上传证书' || state.title =='查看'" placeholder="请输入用户名" ></el-input>
        </el-form-item>
        <el-form-item label="姓名:"  prop="name" v-if="state.title == '查看'">
          <el-input v-model.trim="state.form.name" :disabled="disabled" placeholder="请输入姓名"></el-input>
        </el-form-item>
        <el-form-item label="性别:"  prop="sex" v-if="state.title == '查看'">
          <el-radio-group v-model="state.form.sex"  :disabled="disabled">
            <el-radio :label="0">男</el-radio>
            <el-radio :label="1">女</el-radio>
          </el-radio-group>
        </el-form-item>
        <el-form-item label="年龄:" prop="age" v-if="state.title == '查看'">
          <el-input v-model.number.trim="state.form.age" type="number" :disabled="disabled" placeholder="请输入年龄"></el-input>
        </el-form-item>
        <el-form-item label="学历:" prop="qualification" v-if="state.title == '查看'">
          <el-select
              v-model="state.form.qualification"
              placeholder="请选择学历"
              style="width: 100%"
              :disabled="disabled"
          >
            <el-option
                v-for="item in state.quaList"
                :key="item.id"
                :label="item.name"
                :value="item.id"
            />
          </el-select>
        </el-form-item>
        <el-form-item label="职称:" prop="positional" v-if="state.title == '查看'">
          <!--          <el-input v-model.trim="state.form.positional" :disabled="disabled" placeholder="请输入职称"></el-input>-->
          <el-radio-group v-model="state.form.positional"  :disabled="disabled">
            <el-radio label="1">初级</el-radio>
            <el-radio label="2">中级</el-radio>
            <el-radio label="3">高级</el-radio>
          </el-radio-group>
        </el-form-item>
        <el-form-item label="人员类别:"  prop="personType" v-if="state.title == '查看'">
          <el-radio-group v-model="state.form.personType"  :disabled="disabled">
            <el-radio :label="1">技术</el-radio>
            <el-radio :label="2">管理</el-radio>
            <el-radio :label="3">行政</el-radio>
            <el-radio :label="4">特殊作业</el-radio>
          </el-radio-group>
        </el-form-item>
        <el-form-item label="身份证号:"  prop="idCard" v-if="state.title == '查看'">
          <el-input v-model.trim="state.form.idCard" :maxlength="18" :disabled="disabled" placeholder="请输入身份证号"></el-input>
        </el-form-item>
        <el-form-item label="入职时间:" prop="entryTime" v-if="state.title == '查看'" >
          <el-date-picker
              v-model="state.form.entryTime"
              type="date"
              value-format="YYYY-MM-DD"
              placeholder="请选择入职时间"
              :disabled="disabled"
          />
        </el-form-item>
        <el-form-item label="离职时间:" prop="resignTime" v-if="state.title == '查看'">
          <el-date-picker
              v-model="state.form.resignTime"
              type="date"
              value-format="YYYY-MM-DD"
              placeholder="请选择离职时间"
              :disabled="disabled"
          />
        </el-form-item>
        <el-form-item label="密码:" prop="password" v-if="state.title == '新增' || state.title == '修改密码'">
          <el-input v-model.trim="state.form.password" type="password" show-password placeholder="请输入密码"></el-input>
        </el-form-item>
        <el-form-item label="重复密码:" prop="confirmPassword" v-if="state.title == '新增' || state.title == '修改密码'">
          <el-input v-model.trim="state.form.confirmPassword" type="password" show-password placeholder="请输入确认密码"></el-input>
        </el-form-item>
        <el-form-item label="手机号:" prop="phone" v-if="state.title == '查看'">
          <el-input v-model.trim="state.form.phone" :maxlength="11" :disabled="disabled" placeholder="请输入手机号"></el-input>
        </el-form-item>
        <el-form-item label="用户类型:" v-if="state.title == '查看'" prop="userType">
          <el-radio-group v-model="state.form.userType"  :disabled="disabled" @change="changeType" v-if="state.title == '新增' || state.title == '上传证书'">
            <el-radio :label="0" v-if="state.currentUserType == 0">系统管理员</el-radio>
            <el-radio :label="6" v-if="state.currentUserType == 0 || state.currentUserType == 6 ">企业管理员</el-radio>
            <el-radio :label="1" v-if="state.currentUserType == 0 || state.currentUserType == 6 || state.currentUserType ==1">企业用户</el-radio>
            <!--            <el-radio :label="2" v-if="state.currentUserType !== 3">部门级</el-radio>-->
            <!--            <el-radio :label="3">车间(岗位)级</el-radio>-->
            <!--            <el-radio :label="4" v-if="state.currentUserType == 0">其他</el-radio>-->
          </el-radio-group>
          <span v-else>{{state.currentUserType === 0 ? '系统管理员' : state.currentUserType === 1 ? '企业用户' : state.currentUserType === 6 ? '企业管理员' : state.currentUserType === 2 ? '部门级' : state.currentUserType === 3 ? '车间级' :'其他'}}</span>
          <!--          <span v-else-if="state.title == '上传证书'">{{state.form.userType === 0 ? '系统管理员' : state.form.userType === 1 ? '企业用户' : state.form.userType === 2 ? '部门级' : state.form.userType === 3 ? '车间级' :'其他'}}</span>-->
          <!--          <el-radio-group v-model="state.form.userType"  :disabled="disabled" @change="changeType" v-else-if="state.title == '上传证书'">-->
          <!--            <el-radio :label="0" v-if="state.currentUserType == 0">管理员</el-radio>-->
          <!--            <el-radio :label="1" >企业级</el-radio>-->
          <!--            <el-radio :label="2" >部门级</el-radio>-->
          <!--            <el-radio :label="3" >车间(岗位)级</el-radio>-->
          <!--            <el-radio :label="4" >其他</el-radio>-->
          <!--          </el-radio-group>-->
        </el-form-item>
        <el-form-item label="所属企业:" prop="companyName" v-if="state.title == '查看' && state.form.userType !== 0">
          <el-select
              clearable
              v-if="state.isAdmin"
              v-model="state.form.companyName"
              filterable
              :disabled="disabled || (state.title =='上传证书' && state.currentUserType !== 0)"
              remote
              @change="selectValue"
              reserve-keyword
              placeholder="请输入企业名称"
              remote-show-suffix
              :remote-method="getCompanyList"
              :loading="loading"
              style="width: 240px"
          >
            <el-option
                v-for="item in state.companyList"
                :key="item.id"
                :label="item.name"
                :value="item.name"
            />
          </el-select>
          <el-input v-else disabled style="width: 45%" v-model="state.form.companyName"></el-input>
          <!--            <el-select-->
          <!--                v-if="state.isAdmin"-->
          <!--                v-model="state.form.companyName"-->
          <!--                @change="selectValue"-->
          <!--                style="width: 45%"-->
          <!--                v-loadMore="loadMore"-->
          <!--                class="m-2"-->
          <!--                placeholder="请选择所属企业"-->
          <!--                popper-class="more_select_dropdown"-->
          <!--            >-->
          <!--              <el-option-->
          <!--                  v-for="item in state.companyList"-->
          <!--                  :key="item.id"-->
          <!--                  :label="item.name"-->
          <!--                  :value="item.name"-->
          <!--              />-->
          <!--            </el-select>-->
        </el-form-item>
        <!--        <el-form-item label="所属上级账号:" prop="companyName" v-if="state.form.userType == 3">-->
        <!--          <scorllSelect-->
        <!--              :disabled="disabled"-->
        <!--              ref="scrollRef"-->
        <!--              v-model="state.form.parentName"-->
        <!--              @getval = "getSelectUser"-->
        <!--              placeholder="请选择"-->
        <!--              clearable-->
        <!--              style="width: 45%;"-->
        <!--              filterable-->
        <!--              remote-->
        <!--              searchKey="username"-->
        <!--              :methods="getUser">-->
        <!--          </scorllSelect>-->
        <!--        </el-form-item>-->
        <el-form-item label="部门:" prop="deptId" v-if="state.title == '查看' && state.form.userType !== 0">
          <el-select
              clearable
              v-model="state.form.deptId"
              filterable
              :disabled="disabled"
              placeholder="请选择部门"
              style="width: 100%"
              @change="getParentId"
          >
            <el-option
                v-for="item in state.deptList"
                :key="item.deptId"
                :label="item.deptName"
                :value="item.deptId"
            />
          </el-select>
        </el-form-item>
        <el-form-item label="职务:" prop="duty" v-if="state.title == '查看' && state.form.userType !== 0">
          <el-input v-model.trim="state.form.duty" :disabled="disabled" placeholder="请输入职务"></el-input>
        </el-form-item>
        <el-form-item label="专业:" prop="post" v-if="state.title == '查看' && state.form.userType !== 0">
          <el-input v-model.trim="state.form.post" :disabled="disabled" placeholder="请输入专业"></el-input>
        </el-form-item>
        <el-form-item label="角色:" prop="roles" v-if="state.title == '查看'">
          <el-select
              clearable
              v-model="state.form.roles"
              filterable
              :disabled="disabled"
              placeholder="请选择角色"
              multiple
              style="width: 100%"
          >
            <el-option
                v-for="item in state.roleList"
                :key="item.roleId"
                :label="item.roleName"
                :value="item.roleId"
            />
          </el-select>
        </el-form-item>
        <el-form-item label="人员证书:" prop="operationCertificate" v-if="state.title == '上传证书'">
          <el-upload accept=".doc,.docx,.pdf,image/*" :action="state.uploadUrl" :headers="state.header" method="post" :on-success="(res, uploadFile)=>handleAvatarSuccess(res, uploadFile)" :on-exceed="showTip" :limit='state.fileLimit' v-model:file-list="state.fileList" :before-upload="picSize" :on-remove="(file, uploadFiles)=>handleRemove(file, uploadFiles)" >
            <el-button type="primary">点击上传</el-button>
            <template #tip>
              <div class="el-upload__tip">支持上传图片、.doc、.docx、pdf格式文档,尺寸小于5M,最多可上传1份</div>
            </template>
          </el-upload>
        </el-form-item>
      </el-form>
      <template #footer v-if="state.title !='查看'">
        <span class="dialog-footer">
            <el-button @click="handleClose" size="default">取 消</el-button>
            <el-button type="primary"  @click="onSubmit" size="default" v-preReClick>确认</el-button>
        </span>
      </template>
    </el-dialog>
  </div>
</template>
<script setup>
import {reactive, ref, toRefs, defineEmits, nextTick, onMounted} from 'vue'
import { View } from "@element-plus/icons-vue";
import scorllSelect from '@/components/scrollSelect/index.vue'
import {ElMessage} from "element-plus";
import {verifyPhone, verifyPwd, verifyUsername,verifyIdCard} from "@/utils/validate";
import { checkUserName, checkPhone } from "@/api/login"
import {addUser, editUser, getUserById, resetPwd} from "@/api/onlineEducation/user"
import {Base64} from "js-base64"
import {resetUserPwd} from "@/api/sysUsers";
import {getInstitutionDetail} from "@/api/backManage/insitution";
import {getCompany} from "@/api/onlineEducation/company";
import {get} from "@vueuse/core";
import {getUser} from "@/api/onlineEducation/user";
import {debounce} from "@/utils";
import Cookies from "js-cookie";
import {getDepart} from "@/api/orgStructure/depart";
import {getToken} from "@/utils/auth";
import {delPic} from "@/api/onlineEducation/banner";
import {updateSpecialCertificate} from "@/api/staffManage/staff";
const emit = defineEmits(["getList"]);
const dialogVisible = ref(false)
const superRef = ref()
const scrollRef = ref(null)
const equalToPassword = (rule, value, callback) => {
  if (state.form.password !== value) {
    callback(new Error("两次输入的密码不一致"));
  } else {
    callback();
  }
};
const validateUserPhone = (rule, value, callback)=>{
  if(value === ''){
    callback(new Error('请输入手机号'))
  }else{
    if(!verifyPhone(value)){
      callback(new Error('手机号格式有误'))
    }else{
      callback()
    }
  }
}
const checkFiles = (rule, value, callback) => {
  if (state.fileList.length == 0) {
    callback(new Error('请上传证书文件'))
  } else {
    callback()
  }
}
const verifyId = (rule, value, callback)=>{
  if(value === ''){
    callback()
  }else{
    if(!verifyIdCard(value)){
      callback(new Error('身份证号格式有误'))
    }else{
      callback()
    }
  }
}
let validatePwd = (rule, value, callback)=>{
  if(value === ''){
    callback(new Error('请输入密码'))
  }else{
    if(!verifyPwd(value)){
      callback(new Error('密码须包含字母、数字、特殊字符,长度在6-16之间'))
    }else{
      callback()
    }
  }
}
const startUsername = ref('');
const validateUsername = (rule, value, callback)=>{
  if(value === ''){
    callback(new Error('请输入用户名'))
  }else if(state.title == '上传证书' && value == startUsername.value){
    callback()
  }else{
    if(!verifyUsername(value)){
      callback(new Error('用户名须使用字母或数字,长度在5-16之间'))
    }else{
      let param = {}
      if(state.title=='新增/注册') {
        param = {
          username:value
        }
      }else if(state.title=='上传证书'){
        param = {
          username:value,
          id: state.registerForm.id
        }
      }
      callback()
      // checkUserName(param).then((res)=>{
      //   if(res.data == false){
      //     callback(new Error('用户名已被占用,请更换其他用户名'))
      //   }else{
      //     callback()
      //   }
      // })
    }
  }
}
const state = reactive({
  title: '',
  form: {
    id: null,
    name: '',
    phone: '',
    password: '',
    confirmPassword: '',
    username: '',
    userType: null,
    sex: 0,
    companyId: null,
    companyName: '',
    parentId: null,
    entryTime: '',
    resignTime: '',
    idCard: '',
    deptId: null,
    duty: '',
    post: '',
    age: null,
    personType: null,
    positional: '',
    roles: [],
    operationCertificate: ''
  },
  formRules:{
    name: [{ required: true, message: '请输入姓名', trigger: 'blur' }],
    companyName: [{ required: true, message: '请选择所在企业', trigger: 'blur' }],
    // deptId: [{ required: true, message: '请选择部门', trigger: 'blur' }],
    username: [{ required: true, message: '请选择用户名', trigger: 'blur' }],
    password: [{ required: true, validator: validatePwd, trigger: 'blur' }],
    confirmPassword: [{ required: true, validator: equalToPassword, trigger: 'blur' }],
    phone: [{ validator: validateUserPhone,required: true, trigger: 'blur' }],
    userType: [{ required: true, message: '请选择用户类型', trigger: 'blur' }],
    // idCard: [{ validator: verifyId, trigger: 'blur' }],
    entryTime: [{ required: true, message: '请选择入职时间', trigger: 'blur' }],
    age: [{ required: true, message: '请输入年龄', trigger: 'blur' }],
    personType: [{ required: true, message: '请选择人员类别', trigger: 'blur' }],
    post: [{ required: true, message: '请输入专业', trigger: 'blur' }],
    positional: [{ required: true, message: '请输入职称', trigger: 'blur' }],
    roles: [{ required: true, message: '请选择角色', trigger: 'blur' }],
    operationCertificate: [{ validator: checkFiles,required: true, trigger: 'blur' }]
  },
  companyList: [],
  userList: [],
  roleList: [],
  quaList: [
    {id: 1, name: '高中及以下'},
    {id: 2, name: '专科'},
    {id: 3, name: '本科'},
    {id: 4, name: '硕士'},
    {id: 5, name: '博士及以上'}
  ],
  keyword:'',
  pageNum: 1,
  pageSize: 10,
  cloading:false,
  totlePage: 0,
  userParam: {},
  isAdmin: false,
  currentUserType: null,
  uploadUrl: import.meta.env.VITE_APP_BASE_API + '/system/common/uploadFile',
  header: {
    Authorization: getToken()
  },
  fileLimit: 1,
  fileList: []
})
const UisMounted = ref(false);
onMounted(() => {
  UisMounted.value = true;
});
const disabled = ref(false);
const userInfo = ref()
const openDialog = async (type, value, companyId, roleList) => {
  userInfo.value = JSON.parse(Cookies.get('userInfo'))
  await getCompanyList()
  state.currentUserType = userInfo.value.userType
  state.roleList = roleList
  if(state.currentUserType === 0){
    state.isAdmin = true;
    state.form.companyId = null;
  }else {
    state.isAdmin = false;
    state.form.companyId = userInfo.value.companyId;
    state.form.companyName = userInfo.value.companyName;
  }
  await getdeptList(userInfo.value.companyId)
  state.title = type === 'add' ? '新增' : type ==='edit' ? '上传证书' : type ==='pwd' ? '修改密码' : '查看' ;
  if(type === 'edit' || type === 'view') {
    startUsername.value = value.username
    if( type === 'view'){
      disabled.value = true
    }else{
      disabled.value = false
    }
    const res = await getUserById(value.id);
    if(res.code === 200){
      state.form = res.data
    }
    state.form.roles = value.roles.map(i=>i.roleId)
    if(value.operationCertificate) {
      const obj = {
        url: value.operationCertificate,
        name: '证书'
      }
      state.fileList = [obj]
    }
  }
  if(type == 'pwd'){
    state.form.id = value.id
  }
  dialogVisible.value = true
  if(type === 'edit' && state.form && (state.form.userType === 2||state.form.userType === 3)){
    await nextTick(() => {
      // doGetUser()
    })
  }
}
const finshed = ref(false)
const loading = ref(false)
const getCompanyList = async ()=>{
  const queryParams = {
    pageNum: 1,
    pageSize: 999
  }
  const res = await getCompany(queryParams)
  if (res.code == 200) {
    state.companyList = res.data.list?res.data.list:[]
    // data.queryParams.companyId = data.companyList[0].id
  } else {
    ElMessage.warning(res.message)
  }
}
const getdeptList = async (companyId)=> {
  const params = {
    pageNum: 1,
    pageSize: 999,
    companyId: companyId
  }
  const res = await getDepart(params)
  if(res.code == 200){
    state.deptList = res.data
  }else{
    ElMessage.warning(res.message)
  }
}
const handleAvatarSuccess = (res, uploadFile) => {
  if(res.code == 200){
    state.form.operationCertificate = res.data.path
  }else{
    state.fileList = []
    ElMessage({
      type: 'warning',
      message: '文件上传失败'
    })
  }
}
const showTip =()=>{
  ElMessage({
    type: 'warning',
    message: '超出文件上传数量'
  });
}
const picSize = async (rawFile) => {
  if(rawFile.size / 1024 / 1024 > 5){
    ElMessage({
      type: 'warning',
      message: '文件大小不能超过5M'
    });
    return false
  }
};
const handleRemove = async (file, uploadFiles) => {
  let path = state.form.operationCertificate;
  await delPic({path: path}).then(res => {
    if(res.code == 200){
      // ElMessage({
      //   type: 'success',
      //   message: '文件已删除'
      // })
      state.form.operationCertificate = ''
    }else{
      ElMessage({
        type: 'warning',
        message: res.message
      })
    }
  }).catch(() => {
    state.form.imgUrl = ''
  });
}
const onSubmit = async () => {
  const valid = await superRef.value.validate();
  if(valid){
    if((state.form.userType ===2 ||state.form.userType ===3) && (state.form.parentId ===null ||state.form.companyId===null)){
      ElMessage.warning('请选择所属父级账号')
      return;
    }
      const {confirmPassword,...data} = JSON.parse(JSON.stringify(state.form))
      data.password = Base64.encode(data.password)
      data.roles = data.roles.map((item)=>{
        return {
          roleId: item,
          roleName: state.roleList.find(i=>i.roleId == item)?.roleName
        }
      })
      const param = {
        // name: data.name,
        // sex:data.sex,
        // phone: data.phone,
        id:data.id,
        // companyId: data.companyId,
        // deptId: data.deptId,
        // userType:data.userType,
        // username:data.username,
        // password: data.password,
        // parentId: data.parentId,
        // idCard: data.idCard,
        // entryTime: data.entryTime,
        // resignTime: data.resignTime,
        // duty: data.duty,
        // post: data.post,
        // companyName: data.companyName,
        // age: data.age,
        // personType: data.personType,
        // positional: data.positional,
        // roles: data.roles,
        operationCertificate: data.operationCertificate
      }
      const res = await updateSpecialCertificate(param)
      if(res.code == 200){
        ElMessage.success(res.message)
        emit('getList')
        handleClose()
      }else{
        ElMessage.warning(res.message)
      }
  }
}
const doGetUser = () => {
  const param = {
    userType: state.form.userType-1,
    companyId: state.form.companyId,
  }
  scrollRef.value.getList(param,'change');
}
const changeType = async (val) => {
  // state.companyList = [];
  // if(state.isAdmin){
  //   await getCompanyList("")
  // }
  // state.form.parentId = null;
  // state.form.parentName = '';
  // state.form.companyId = null;
  // state.form.companyName = '';
  //当前是管理员级用户
  if(state.form.userType === 0){
    state.form.deptId = null;
    state.form.parentId = null;
    state.form.companyId = null;
    state.form.companyName = '';
    state.form.duty = ''
    state.form.post = ''
  }
  //当前是企业级/其他用户选择部门
  // if((state.currentUserType === 1 && state.form.userType === 2) || (state.currentUserType === 4 && state.form.userType === 2) || (state.currentUserType === 6 && state.form.userType === 2)){
  //   state.form.parentId = userInfo.value.id;
  //   state.form.companyName = userInfo.value.companyName
  //   state.form.companyId = userInfo.value.companyId;
  //   showChild.value = false;
  //   // showCompany.value = true;
  //
  // } else if((state.currentUserType === 1 && state.form.userType === 3) || (state.currentUserType === 4 && state.form.userType === 3)|| (state.currentUserType === 6 && state.form.userType === 3)){
  //   state.form.companyName = userInfo.value.companyName
  //   state.form.companyId = userInfo.value.companyId;
  //   // showCompany.value = true;
  //   showChild.value = true;
  //   const param = {
  //     userType: 2,
  //     companyId: state.form.companyId,
  //   }
  //   nextTick(() => {
  //     scrollRef.value.getList(param,'change');
  //   })
  // }
  // //当前是部门级选择车间
  // if((state.currentUserType === 2 && state.form.userType === 3)){
  //   state.form.parentId = userInfo.value.id;
  //   state.form.companyName = userInfo.value.companyName
  //   state.form.companyId = userInfo.value.companyId;
  //   // showCompany.value = true;
  //   showChild.value = false;
  // }
}
const handleClose = () => {
  state.form = {
    id: null,
    name: '',
    phone: '',
    password: '',
    confirmPassword: '',
    username: '',
    userType: null,
    sex: 0,
    companyId: null,
    companyName: '',
    parentId: null,
    entryTime: '',
    resignTime: '',
    idCard: '',
    deptId: null,
    duty: '',
    post: '',
    age: null,
    personType: null,
    positional: '',
    roles: [],
    operationCertificate: ''
  }
  state.userList = [];
  state.companyList = [];
  state.fileList = []
  state.pageNum = 1;
  state.pageSize = 10;
  superRef.value.clearValidate();
  superRef.value.resetFields()
  dialogVisible.value = false;
}
// //触底函数
// const loadMore = () => {
//   console.log(' 触底了');
//   // 防抖处理
//   setTimeout(() => {
//     if (finshed.value) return //值为true,则代表没有数据了
//     state.pageNum += 1
//     getCompanyList('')
//   }, 500)
// }
const selectValue = (val) => {
  state.form.parentId = null;
  state.companyList.forEach(item => {
    if(item.name === val){
      state.form.companyId = item.id
    }
  })
  getdeptList(state.form.companyId)
}
const getParentId = (val)=>{
  state.form.parentId = null;
  state.deptList.forEach(item => {
    if(item.deptId === val){
      state.form.deptId = item.deptId
      state.form.parentId = item.parentId
    }
  })
}
const getSelectUser = (val) => {
  state.form.parentId = val;
}
defineExpose({
  openDialog
});
</script>
<style scoped lang="scss">
.notice{
  :deep(.el-form .el-form-item__label) {
    font-size: 15px;
  }
  .file {
    display: flex;
    flex-direction: column;
    align-items: flex-start;
  }
}
</style>
src/views/work/empResource/specialEmp/index.vue
New file
@@ -0,0 +1,261 @@
<template>
  <div class="app-container">
    <div style="display: flex;justify-content: space-between">
      <el-form :inline="true" style="display: flex;align-items: center;flex-wrap: wrap;" >
<!--        <el-form-item>-->
<!--          <el-button-->
<!--              type="primary"-->
<!--              plain-->
<!--              icon="Plus"-->
<!--              @click="openDialog('add',{})"-->
<!--          >新增</el-button>-->
<!--        </el-form-item>-->
        <el-form-item label="用户名:" >
          <el-input v-model="data.queryParams.username" placeholder="请输入用户名"></el-input>
        </el-form-item>
<!--        <el-form-item label="用户类型:" >-->
<!--          <el-select v-model="data.queryParams.userType" placeholder="请选择" clearable>-->
<!--            <el-option-->
<!--                v-for="item in data.userTypeList"-->
<!--                :key="item.id"-->
<!--                :label="item.name"-->
<!--                :value="item.id">-->
<!--            </el-option>-->
<!--          </el-select>-->
<!--        </el-form-item>-->
        <el-form-item v-if="isAdmin" label="企业:" >
          <el-select v-model="data.queryParams.companyId" placeholder="请选择" clearable>
            <el-option
                v-for="item in companyList"
                :key="item.id"
                :label="item.name"
                :value="item.id">
            </el-option>
          </el-select>
        </el-form-item>
<!--        <el-form-item label="用户名:" >-->
<!--          <el-input v-model="data.queryParams.username" placeholder="请输入用户名"></el-input>-->
<!--        </el-form-item>-->
<!--        <el-form-item label="用户类型:" >-->
<!--          <el-select v-model="data.queryParams.userType" placeholder="请选择" clearable>-->
<!--            <el-option-->
<!--                v-for="item in data.userTypeList"-->
<!--                :key="item.id"-->
<!--                :label="item.name"-->
<!--                :value="item.id">-->
<!--            </el-option>-->
<!--          </el-select>-->
<!--        </el-form-item>-->
        <el-form-item >
          <el-button type="primary" @click="getList">查询</el-button>
          <el-button type="primary" plain @click="reset" style="margin-right: 12px">重置</el-button>
        </el-form-item>
      </el-form>
    </div>
    <!-- 表格数据 -->
    <el-table v-loading="loading" :data="dataList" :border="true">
      <el-table-column label="序号" type="index" align="center" width="80" />
      <el-table-column label="用户名" prop="username" align="center"/>
      <el-table-column label="姓名" prop="name" align="center"/>
      <el-table-column label="年龄" prop="age" align="center"/>
      <el-table-column label="职称" prop="positional" align="center">
        <template #default="scope">
          {{ scope.row.positional == '1'?'初级':scope.row.personType == '2'?'中级':'高级' }}
        </template>
      </el-table-column>
      <el-table-column label="人员类别" prop="personType" align="center">
        <template #default="scope">
          {{ scope.row.personType == 1?'技术':scope.row.personType == 2?'管理':'行政' }}
        </template>
      </el-table-column>
      <el-table-column label="身份证号" prop="idCard" align="center" />
      <el-table-column label="入职时间" prop="entryTime" align="center"/>
      <el-table-column label="部门" prop="deptName" align="center"/>
      <el-table-column label="职务" prop="duty" align="center"/>
      <el-table-column label="联系方式" prop="phone" align="center"/>
      <el-table-column label="专业" prop="post" align="center"/>
      <el-table-column label="用户类型" prop="userTypeName" align="center"/>
      <el-table-column label="角色" prop="userTypeName" align="center">
        <template #default="scope">
          {{ scope.row.roles?.map(i=>i.roleName).join('、') }}
        </template>
      </el-table-column>
      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" >
        <template #default="scope">
          <el-button link type="primary" @click="openDialog('view',scope.row)">查看</el-button>
          <el-button link type="primary" @click="openDialog('edit',scope.row)">上传证书</el-button>
          <el-button link type="danger" @click="handleDelete(scope.row)">删除</el-button>
        </template>
      </el-table-column>
    </el-table>
    <pagination
        v-show="total > 0"
        :total="total"
        v-model:page="queryParams.pageNum"
        v-model:limit="queryParams.pageSize"
        @pagination="getList"
    />
    <emp-dialog ref="dialogRef" @getList=getList></emp-dialog>
  </div>
</template>
<script setup>
import {getCurrentInstance, onMounted, onUnmounted, reactive, ref, toRefs} from "vue";
import {ElMessage, ElMessageBox} from "element-plus";
import {delCompany, getCompany} from "@/api/onlineEducation/company";
import empDialog from './components/empDialog.vue'
import {delUser, getUser} from "@/api/onlineEducation/user";
import Cookies from "js-cookie";
import useUserStore from "@/store/modules/user";
import {listRole} from "@/api/system/role";
import EmpDialog from "@/views/work/empResource/specialEmp/components/empDialog";
const userStore = useUserStore()
const { proxy } = getCurrentInstance();
const loading = ref(false);
const dialogRef = ref();
const data = reactive({
  queryParams: {
    pageNum: 1,
    pageSize: 10,
    username: '',
    userType: null,
    companyId: null,
    personType: 4
  },
  total: 0,
  dataList: [],
  isAdmin: false,
  companyList: [],
  roleList: [],
  userTypeList: [
    {
      id: 0,
      name: '管理员'
    },
    {
      id: 1,
      name: '企业级'
    },
    {
      id: 2,
      name: '部门级'
    },
    {
      id: 3,
      name: '车间(岗位)级别'
    },
    {
      id: 4,
      name: '其他'
    },
  ]
});
const { queryParams, total, dataList,isAdmin,companyList } = toRefs(data);
const userInfo = ref()
onMounted(async ()=>{
  userInfo.value = JSON.parse(Cookies.get('userInfo'))
  if(userStore.roles.includes('admin')){
    data.isAdmin = true
    await getCompanyList()
  }else{
    data.isAdmin = false
    data.queryParams.companyId = userStore.companyId
  }
  await getList()
  await getRoleList()
})
onUnmounted(()=>{
})
const getList = async () => {
  loading.value = true
  const res = await getUser(data.queryParams)
  if(res.code == 200){
    data.dataList = res.data.list.map(item => {
      return {
        ...item,
        userTypeName: item.userType === 0 ? '系统管理员' : (item.userType === 1 || item.userType === 2 || item.userType === 3) ? '企业用户': item.userType === 6 ? '企业管理员':'其他',
        entryTime: item.entryTime?.substring(0, 10)
      }
    })
    data.total = res.data.total
  }else{
    ElMessage.warning(res.message)
  }
  loading.value = false
}
const getRoleList = () => {
  listRole(proxy.addDateRange({
    pageNum: 1,
    pageSize: 999,
    roleName: undefined,
    roleKey: undefined,
    status: undefined
  }, [])).then(response => {
    data.roleList = response.data.list
  });
}
const getCompanyList = async ()=>{
  const queryParams = {
    pageNum: 1,
    pageSize: 999
  }
  const res = await getCompany(queryParams)
  if (res.code == 200) {
    data.companyList = res.data.list?res.data.list:[]
    // data.queryParams.companyId = data.companyList[0].id
  } else {
    ElMessage.warning(res.message)
  }
}
const openDialog = (type, value) => {
  if(userInfo.value.userType !== 0 && userInfo.value.userType !== 6){
    ElMessage.warning('非管理员身份不可操作')
    return;
  }
  dialogRef.value.openDialog(type, value, data.queryParams.companyId,data.roleList);
}
/** 重置新增的表单以及其他数据  */
const reset = async()=> {
  data.queryParams = {
    pageNum: 1,
    pageSize: 10,
    username: '',
    userType: null,
    companyId: null
  }
  await getCompanyList()
  await getList()
}
const handleDelete = (val) => {
  ElMessageBox.confirm(
      '确定删除此条数据?',
      '提示',
      {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning',
      })
      .then( async() => {
        const res = await delUser(val.id)
        if(res.code == 200){
          ElMessage.success('数据删除成功')
          await getList()
        }else{
          ElMessage.warning(res.message)
        }
      })
}
</script>
src/views/work/knowledgePlatform/externalKnowledge/components/editDialog.vue
New file
@@ -0,0 +1,259 @@
<template>
  <div class="notice">
    <el-dialog
        v-model="dialogVisible"
        :title="state.title"
        width="600px"
        :before-close="handleClose"
        :close-on-press-escape="false"
        :close-on-click-modal="false"
    >
      <el-form :model="state.form" size="default" ref="superRef" :rules="state.formRules" label-width="150px" >
        <el-form-item v-if="state.isAdmin" label="企业:" prop="companyId">
          <el-select v-model="state.form.companyId" placeholder="请选择" clearable style="width: 100%">
            <el-option
                v-for="item in state.companyList"
                :key="item.id"
                :label="item.name"
                :value="item.id">
            </el-option>
          </el-select>
        </el-form-item>
        <el-form-item label="名称:" prop="name">
          <el-input v-model.trim="state.form.name" :readonly="state.title =='查看'" placeholder="名称"></el-input>
        </el-form-item>
        <el-form-item label="文件类型:" prop="knowledgeType">
          <el-select v-model="state.form.knowledgeType" placeholder="请选择" clearable style="width: 100%">
            <el-option
                v-for="item in state.typeList"
                :key="item.id"
                :label="item.name"
                :value="item.id">
            </el-option>
          </el-select>
        </el-form-item>
        <el-form-item label="文件:" prop="filePath">
          <el-upload accept=".doc,.docx,.xls,.xlsx,.pdf" :action="state.uploadUrl" :headers="state.header" method="post" :on-success="(res, uploadFile)=>handleAvatarSuccess(res, uploadFile)" :on-exceed="showTip" :limit='state.fileLimit' v-model:file-list="state.fileList" :before-upload="picSize" :on-remove="(file, uploadFiles)=>handleRemove(file, uploadFiles)" >
            <el-button type="primary">点击上传</el-button>
            <template #tip>
              <div class="el-upload__tip">支持上传.doc、.docx、.xls、.xlsx、.pdf格式文档,尺寸小于5M,最多可上传1张</div>
            </template>
          </el-upload>
        </el-form-item>
      </el-form>
      <template #footer v-if="state.title !='查看'">
        <span class="dialog-footer">
            <el-button @click="handleClose" size="default">取 消</el-button>
            <el-button type="primary"  @click="onSubmit" size="default" v-preReClick>确认</el-button>
        </span>
      </template>
    </el-dialog>
  </div>
</template>
<script setup>
import {reactive, ref, toRefs, defineEmits, nextTick, onMounted} from 'vue'
import {ElMessage} from "element-plus";
import {addUser, editUser, getUserById, resetPwd} from "@/api/onlineEducation/user"
import {Base64} from "js-base64"
import {getCompany} from "@/api/onlineEducation/company";
import {addIndustryTemp, updateIndustryTemp, updateInfoPlatforms} from "@/api/staffManage/staff";
import {getToken} from "@/utils/auth";
import {delPic} from "@/api/onlineEducation/banner";
import {getIndustry} from "@/api/system/industry";
import {saveExternalKnowledge, saveInternalKnowledge} from "@/api/assetManage/assetMng";
const emit = defineEmits(["getList"]);
const dialogVisible = ref(false)
const superRef = ref()
const checkFiles = (rule, value, callback) => {
  if (state.fileList.length == 0) {
    callback(new Error('请上传文件'))
  } else {
    callback()
  }
}
const state = reactive({
  title: '',
  form: {
    id: null,
    companyId: null,
    name: '',
    knowledgeType: null,
    filePath: '',
    fileName: '',
    format: ''
  },
  formRules:{
    companyId: [{ required: true, message: '请选择企业', trigger: 'blur' }],
    name: [{ required: true, message: '请输入名称', trigger: 'blur' }],
    knowledgeType: [{ required: true, message: '请选择文件类型', trigger: 'blur' }],
    filePath: [{ required: true, validator: checkFiles, trigger: 'blur' }]
  },
  isAdmin: false,
  companyList: [],
  typeList: [
    {
      id: 1,
      name: '标准'
    },
    {
      id: 2,
      name: '规范'
    },
    {
      id: 3,
      name: '法律法规'
    },
    {
      id: 4,
      name: '其他'
    }
  ],
  uploadUrl: import.meta.env.VITE_APP_BASE_API + '/system/common/uploadFile',
  header: {
    Authorization: getToken()
  },
  fileLimit: 1,
  fileList: []
})
onMounted(() => {
});
const openDialog = async (type, value,companyId, isAdmin, companyList) => {
  state.isAdmin = isAdmin
  if(isAdmin){
    state.companyList = companyList
  }
  state.title = type === 'add' ? '新增' : type ==='edit' ? '编辑' : '查看'
  state.form.companyId = companyId
  if(state.title == '编辑'||state.title == '查看'){
    Object.keys(state.form).forEach(key => {
      if (key in value) {
        state.form[key] = value[key]
      }
    })
    if(value.filePath) {
      const obj = {
        url: value.filePath,
        name: value.fileName
      }
      state.fileList = [obj]
    }
  }
  dialogVisible.value = true
}
const onSubmit = async () => {
  const valid = await superRef.value.validate();
  if(valid){
    if(state.title == '新增'){
      const {id,...data} = state.form
      const res = await saveExternalKnowledge(data)
      if(res.code == 200){
        ElMessage.success(res.message)
        emit('getList')
        handleClose()
        dialogVisible.value = false;
      }else{
        ElMessage.warning(res.message)
      }
    }else{
      const res = await saveExternalKnowledge(state.form)
      if(res.code == 200){
        ElMessage.success(res.message)
        emit('getList')
        handleClose()
        dialogVisible.value = false;
      }else{
        ElMessage.warning(res.message)
      }
    }
  }
}
const handleAvatarSuccess = (res, uploadFile) => {
  if(res.code == 200){
    state.form.fileName = res.data.originName
    state.form.filePath = res.data.path
    state.form.format = '.' + res.data.filename.split('.')[1]
  }else{
    state.fileList = []
    ElMessage({
      type: 'warning',
      message: '文件上传失败'
    })
  }
}
const showTip =()=>{
  ElMessage({
    type: 'warning',
    message: '超出文件上传数量'
  });
}
const picSize = async (rawFile) => {
  if(rawFile.size / 1024 / 1024 > 5){
    ElMessage({
      type: 'warning',
      message: '文件大小不能超过5M'
    });
    return false
  }
};
const handleRemove = async (file, uploadFiles) => {
  let path = state.form.filePath;
  await delPic({path: path}).then(res => {
    if(res.code == 200){
      // ElMessage({
      //   type: 'success',
      //   message: '文件已删除'
      // })
      state.form.filePath = ''
      state.form.format = ''
      state.form.fileName = ''
    }else{
      ElMessage({
        type: 'warning',
        message: res.message
      })
    }
  }).catch(() => {
    state.form.imgUrl = ''
  });
}
const handleClose = () => {
  state.form = {
    id: null,
    companyId: null,
    name: '',
    knowledgeType: null,
    filePath: '',
    fileName: '',
    format: ''
  }
  state.fileList = []
  superRef.value.clearValidate();
  superRef.value.resetFields()
  dialogVisible.value = false;
}
defineExpose({
  openDialog
});
</script>
<style scoped lang="scss">
.notice{
  :deep(.el-form .el-form-item__label) {
    font-size: 15px;
  }
  .file {
    display: flex;
    flex-direction: column;
    align-items: flex-start;
  }
}
</style>
src/views/work/knowledgePlatform/externalKnowledge/index.vue
New file
@@ -0,0 +1,282 @@
<template>
  <div class="app-container">
    <div style="display: flex;justify-content: space-between">
      <el-form :inline="true" style="display: flex;align-items: center;flex-wrap: wrap;" >
        <el-form-item>
          <el-button
              type="primary"
              plain
              icon="Plus"
              @click="openDialog('add',{})"
          >新增</el-button>
        </el-form-item>
        <el-form-item v-if="isAdmin" label="企业:" >
          <el-select v-model="data.queryParams.companyId" placeholder="请选择" clearable>
            <el-option
                v-for="item in companyList"
                :key="item.id"
                :label="item.name"
                :value="item.id">
            </el-option>
          </el-select>
        </el-form-item>
        <el-form-item >
          <el-button  type="primary" @click="getList">查询</el-button>
          <el-button  type="primary" plain @click="reset">重置</el-button>
          <vue3-json-excel
              :json-data="expertData"
              :fields="fields"
              name="文件清单.xlsx"
              style="margin-left: 12px"
          >
            <el-button type="primary">导出</el-button>
          </vue3-json-excel>
        </el-form-item>
      </el-form>
    </div>
    <!-- 表格数据 -->
    <el-table v-loading="loading" :data="dataList" :border="true">
      <el-table-column label="序号" type="index" align="center" width="80"/>
      <el-table-column label="名称" prop="name" align="center"/>
      <el-table-column label="文件类型" prop="knowledgeType" align="center">
        <template #default="scope">
          {{scope.row.knowledgeType == 1 ? '标准' : scope.row.knowledgeType == 2 ? '规范' : scope.row.knowledgeType == 3 ? '法律法规' : '其他'}}
        </template>
      </el-table-column>
      <el-table-column label="文件" prop="filePath" align="center">
        <template #default="scope">
          <el-link  style="" type="primary" @click="openFile(scope.row.filePath)">{{scope.row.name}}</el-link>
        </template>
      </el-table-column>
      <el-table-column label="上传日期" prop="updateTime" align="center" />
      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" >
        <template #default="scope">
          <el-button link type="primary" @click="downloadFile(scope.row)">下载</el-button>
          <el-button link type="primary" @click="openDialog('edit',scope.row)">编辑</el-button>
          <el-button link type="danger" @click="handleDelete(scope.row)">删除</el-button>
        </template>
      </el-table-column>
    </el-table>
    <pagination
        v-show="total > 0"
        :total="total"
        v-model:page="queryParams.pageNum"
        v-model:limit="queryParams.pageSize"
        @pagination="getList"
    />
    <edit-dialog ref="dialogRef" @getList=getList></edit-dialog>
  </div>
</template>
<script setup>
import {getCurrentInstance, onMounted, onUnmounted, reactive, ref, toRefs} from "vue";
import {ElMessage, ElMessageBox} from "element-plus";
import {delCompany, getCompany} from "@/api/onlineEducation/company";
import { Plus, Upload, Download} from '@element-plus/icons-vue';
import {delUser, getUser} from "@/api/onlineEducation/user";
import Cookies from "js-cookie";
import editDialog from './components/editDialog.vue'
import {
  delIndustryTemp,
  getIndustryTemp, uploadTemplate,
} from "@/api/staffManage/staff";
import useUserStore from "@/store/modules/user";
import axios from "axios";
import {getToken} from "@/utils/auth";
import {getIndustry} from "@/api/system/industry";
import {renderAsync} from "docx-preview";
import {
  delExternalKnowledge,
  delInternalKnowledge,
  getExternalKnowledgeList,
  getInternalKnowledgeList
} from "@/api/assetManage/assetMng";
import {getStandingBookList} from "@/api/infrastructureMng/ledger";
const userStore = useUserStore()
const { proxy } = getCurrentInstance();
const loading = ref(false);
const dialogRef = ref();
const data = reactive({
  queryParams: {
    pageNum: 1,
    pageSize: 10,
    companyId: null
  },
  total: 0,
  dataList: [],
  companyList: [],
  isAdmin: false,
  expertData: []
});
const { queryParams, total, dataList,companyList,isAdmin, expertData } = toRefs(data);
const userInfo = ref()
onMounted(async ()=>{
  if(userStore.roles.includes('admin')){
    data.isAdmin = true
    data.queryParams.companyId = null
    await getCompanyList()
  }else{
    data.isAdmin = false
    data.queryParams.companyId = userStore.companyId
  }
  await getList()
})
onUnmounted(()=>{
})
const fields = ref({
  '序号':'index',
  '文件类型':'knowledgeTypeName',
  '文件名称':'name'
})
const getAllList = async () => {
  let query = {
    pageNum: 1,
    pageSize: 9999,
    companyId: data.queryParams.companyId
  }
  const res = await getExternalKnowledgeList(query)
  if(res.code == 200){
    data.expertData = res.data.list?.map((item,index) => {
      return {
        ...item,
        index: index + 1,
        knowledgeTypeName: item.knowledgeType == 1 ? '标准' : item.knowledgeType == 2 ? '规范' : item.knowledgeType == 3 ? '法律法规' : '其他'
      }
    })
  }else{
    ElMessage.warning(res.message)
  }
}
const openFile = async(path)=>{
  const ext = path.split('.').pop().toLowerCase();
  if (ext === 'doc' || ext === 'xls' || ext === 'xlsx') {
    ElMessageBox.confirm('暂不支持线上预览文件,是否下载查看?', '提示', { confirmButtonText: '确认', cancelButtonText: '取消', type: 'warning' }).then(() => {
      window.open(`${import.meta.env.VITE_APP_BASE_API}/${path}`, '_blank');
    }).catch(() => {
      console.log('取消预览')
    });
    return
  }
  if(ext === 'pdf'){
    window.open(`${import.meta.env.VITE_APP_BASE_API}/${path}`, '_blank')
    return
  }
  try {
    // 1. 获取文件
    const response = await fetch(import.meta.env.VITE_APP_BASE_API + '/' + path);
    const arrayBuffer = await response.arrayBuffer();
    // 2. 创建新窗口
    const win = window.open('', '_blank')
    win.document.write(`
      <!DOCTYPE html>
      <html>
        <head>
          <title>预览</title>
          <style>
            body { margin: 20px; font-family: Arial; }
            .docx-container { width: 100%; height: 100%; }
          </style>
        </head>
        <body>
          <div id="container" class="docx-container"></div>
        </body>
      </html>
    `);
    // 3. 渲染 DOCX
    await renderAsync(arrayBuffer, win.document.getElementById('container'));
  } catch (error) {
    console.error('预览失败:', error);
    alert(`预览失败: ${error.message}`);
  }
}
const getList = async () => {
  loading.value = true
  const res = await getExternalKnowledgeList(data.queryParams)
  if(res.code == 200){
    data.dataList = res.data.list
    data.total = res.data.total
  }else{
    ElMessage.warning(res.message)
  }
  loading.value = false
  await getAllList()
}
const getCompanyList = async ()=>{
  const queryParams = {
    pageNum: 1,
    pageSize: 999
  }
  const res = await getCompany(queryParams)
  if (res.code == 200) {
    data.companyList = res.data.list?res.data.list:[]
  } else {
    ElMessage.warning(res.message)
  }
}
const downloadFile = (e)=>{
  axios.get(import.meta.env.VITE_APP_BASE_API + '/' +e.filePath,{headers:{'Content-Type': 'application/json','Authorization': `${getToken()}`},responseType: 'blob'}).then(res=>{
    if (res) {
      const link = document.createElement('a')
      let blob = new Blob([res.data],{type: res.data.type})
      link.style.display = "none";
      link.href = URL.createObjectURL(blob); // 创建URL
      link.setAttribute("download", e.fileName);
      document.body.appendChild(link);
      link.click();
      document.body.removeChild(link);
    } else {
      ElMessage({
        type: 'warning',
        message: '文件读取失败'
      });
    }
  })
}
const openDialog = (type, value) => {
  dialogRef.value.openDialog(type, value, data.queryParams.companyId, data.isAdmin, data.companyList);
}
/** 重置新增的表单以及其他数据  */
const reset= async()=> {
  data.queryParams = {
    pageNum: 1,
    pageSize: 10,
    companyId: null
  }
  await getCompanyList()
  await getList()
}
const handleDelete = (val) => {
  ElMessageBox.confirm(
      '确定删除此条数据?',
      '提示',
      {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning',
      })
      .then( async() => {
        const res = await delExternalKnowledge({id: val.id})
        if(res.code == 200){
          ElMessage.success('数据删除成功')
          await getList()
        }else{
          ElMessage.warning(res.message)
        }
      })
}
</script>
src/views/work/knowledgePlatform/internalKnowledge/components/editDialog.vue
New file
@@ -0,0 +1,255 @@
<template>
  <div class="notice">
    <el-dialog
        v-model="dialogVisible"
        :title="state.title"
        width="600px"
        :before-close="handleClose"
        :close-on-press-escape="false"
        :close-on-click-modal="false"
    >
      <el-form :model="state.form" size="default" ref="superRef" :rules="state.formRules" label-width="150px" >
        <el-form-item v-if="state.isAdmin" label="企业:" prop="companyId">
          <el-select v-model="state.form.companyId" placeholder="请选择" clearable style="width: 100%">
            <el-option
                v-for="item in state.companyList"
                :key="item.id"
                :label="item.name"
                :value="item.id">
            </el-option>
          </el-select>
        </el-form-item>
        <el-form-item label="名称:" prop="name">
          <el-input v-model.trim="state.form.name" :readonly="state.title =='查看'" placeholder="名称"></el-input>
        </el-form-item>
        <el-form-item label="文件类型:" prop="knowledgeType">
          <el-select v-model="state.form.knowledgeType" placeholder="请选择" clearable style="width: 100%">
            <el-option
                v-for="item in state.typeList"
                :key="item.id"
                :label="item.name"
                :value="item.id">
            </el-option>
          </el-select>
        </el-form-item>
        <el-form-item label="文件:" prop="filePath">
          <el-upload accept=".doc,.docx,.xls,.xlsx,.pdf" :action="state.uploadUrl" :headers="state.header" method="post" :on-success="(res, uploadFile)=>handleAvatarSuccess(res, uploadFile)" :on-exceed="showTip" :limit='state.fileLimit' v-model:file-list="state.fileList" :before-upload="picSize" :on-remove="(file, uploadFiles)=>handleRemove(file, uploadFiles)" >
            <el-button type="primary">点击上传</el-button>
            <template #tip>
              <div class="el-upload__tip">支持上传.doc、.docx、.xls、.xlsx、.pdf格式文档,尺寸小于5M,最多可上传1张</div>
            </template>
          </el-upload>
        </el-form-item>
      </el-form>
      <template #footer v-if="state.title !='查看'">
        <span class="dialog-footer">
            <el-button @click="handleClose" size="default">取 消</el-button>
            <el-button type="primary"  @click="onSubmit" size="default" v-preReClick>确认</el-button>
        </span>
      </template>
    </el-dialog>
  </div>
</template>
<script setup>
import {reactive, ref, toRefs, defineEmits, nextTick, onMounted} from 'vue'
import {ElMessage} from "element-plus";
import {addUser, editUser, getUserById, resetPwd} from "@/api/onlineEducation/user"
import {Base64} from "js-base64"
import {getCompany} from "@/api/onlineEducation/company";
import {addIndustryTemp, updateIndustryTemp, updateInfoPlatforms} from "@/api/staffManage/staff";
import {getToken} from "@/utils/auth";
import {delPic} from "@/api/onlineEducation/banner";
import {getIndustry} from "@/api/system/industry";
import {saveInternalKnowledge} from "@/api/assetManage/assetMng";
const emit = defineEmits(["getList"]);
const dialogVisible = ref(false)
const superRef = ref()
const checkFiles = (rule, value, callback) => {
  if (state.fileList.length == 0) {
    callback(new Error('请上传文件'))
  } else {
    callback()
  }
}
const state = reactive({
  title: '',
  form: {
    id: null,
    companyId: null,
    name: '',
    knowledgeType: null,
    filePath: '',
    fileName: '',
    format: ''
  },
  formRules:{
    companyId: [{ required: true, message: '请选择企业', trigger: 'blur' }],
    name: [{ required: true, message: '请输入名称', trigger: 'blur' }],
    knowledgeType: [{ required: true, message: '请选择文件类型', trigger: 'blur' }],
    filePath: [{ required: true, validator: checkFiles, trigger: 'blur' }]
  },
  isAdmin: false,
  companyList: [],
  typeList: [
    {
      id: 1,
      name: '体系文件'
    },
    {
      id: 2,
      name: '项目文件'
    },
    {
      id: 3,
      name: '其他'
    }
  ],
  uploadUrl: import.meta.env.VITE_APP_BASE_API + '/system/common/uploadFile',
  header: {
    Authorization: getToken()
  },
  fileLimit: 1,
  fileList: []
})
onMounted(() => {
});
const openDialog = async (type, value,companyId, isAdmin, companyList) => {
  state.isAdmin = isAdmin
  if(isAdmin){
    state.companyList = companyList
  }
  state.title = type === 'add' ? '新增' : type ==='edit' ? '编辑' : '查看'
  state.form.companyId = companyId
  if(state.title == '编辑'||state.title == '查看'){
    Object.keys(state.form).forEach(key => {
      if (key in value) {
        state.form[key] = value[key]
      }
    })
    if(value.filePath) {
      const obj = {
        url: value.filePath,
        name: value.fileName
      }
      state.fileList = [obj]
    }
  }
  dialogVisible.value = true
}
const onSubmit = async () => {
  const valid = await superRef.value.validate();
  if(valid){
    if(state.title == '新增'){
      const {id,...data} = state.form
      const res = await saveInternalKnowledge(data)
      if(res.code == 200){
        ElMessage.success(res.message)
        emit('getList')
        handleClose()
        dialogVisible.value = false;
      }else{
        ElMessage.warning(res.message)
      }
    }else{
      const res = await saveInternalKnowledge(state.form)
      if(res.code == 200){
        ElMessage.success(res.message)
        emit('getList')
        handleClose()
        dialogVisible.value = false;
      }else{
        ElMessage.warning(res.message)
      }
    }
  }
}
const handleAvatarSuccess = (res, uploadFile) => {
  if(res.code == 200){
    state.form.fileName = res.data.originName
    state.form.filePath = res.data.path
    state.form.format = '.' + res.data.filename.split('.')[1]
  }else{
    state.fileList = []
    ElMessage({
      type: 'warning',
      message: '文件上传失败'
    })
  }
}
const showTip =()=>{
  ElMessage({
    type: 'warning',
    message: '超出文件上传数量'
  });
}
const picSize = async (rawFile) => {
  if(rawFile.size / 1024 / 1024 > 5){
    ElMessage({
      type: 'warning',
      message: '文件大小不能超过5M'
    });
    return false
  }
};
const handleRemove = async (file, uploadFiles) => {
  let path = state.form.filePath;
  await delPic({path: path}).then(res => {
    if(res.code == 200){
      // ElMessage({
      //   type: 'success',
      //   message: '文件已删除'
      // })
      state.form.filePath = ''
      state.form.format = ''
      state.form.fileName = ''
    }else{
      ElMessage({
        type: 'warning',
        message: res.message
      })
    }
  }).catch(() => {
    state.form.imgUrl = ''
  });
}
const handleClose = () => {
  state.form = {
    id: null,
    companyId: null,
    name: '',
    knowledgeType: null,
    filePath: '',
    fileName: '',
    format: ''
  }
  state.fileList = []
  superRef.value.clearValidate();
  superRef.value.resetFields()
  dialogVisible.value = false;
}
defineExpose({
  openDialog
});
</script>
<style scoped lang="scss">
.notice{
  :deep(.el-form .el-form-item__label) {
    font-size: 15px;
  }
  .file {
    display: flex;
    flex-direction: column;
    align-items: flex-start;
  }
}
</style>
src/views/work/knowledgePlatform/internalKnowledge/index.vue
New file
@@ -0,0 +1,277 @@
<template>
  <div class="app-container">
    <div style="display: flex;justify-content: space-between">
      <el-form :inline="true" style="display: flex;align-items: center;flex-wrap: wrap;" >
        <el-form-item>
          <el-button
              type="primary"
              plain
              icon="Plus"
              @click="openDialog('add',{})"
          >新增</el-button>
        </el-form-item>
        <el-form-item v-if="isAdmin" label="企业:" >
          <el-select v-model="data.queryParams.companyId" placeholder="请选择" clearable>
            <el-option
                v-for="item in companyList"
                :key="item.id"
                :label="item.name"
                :value="item.id">
            </el-option>
          </el-select>
        </el-form-item>
        <el-form-item >
          <el-button  type="primary" @click="getList">查询</el-button>
          <el-button  type="primary" plain @click="reset">重置</el-button>
          <vue3-json-excel
              :json-data="expertData"
              :fields="fields"
              name="文件清单.xlsx"
              style="margin-left: 12px"
          >
            <el-button type="primary">导出</el-button>
          </vue3-json-excel>
        </el-form-item>
      </el-form>
    </div>
    <!-- 表格数据 -->
    <el-table v-loading="loading" :data="dataList" :border="true">
      <el-table-column label="序号" type="index" align="center" width="80"/>
      <el-table-column label="名称" prop="name" align="center"/>
      <el-table-column label="文件类型" prop="knowledgeType" align="center">
        <template #default="scope">
          {{scope.row.knowledgeType == 1 ? '体系' : scope.row.knowledgeType == 2 ? '项目' : '其他'}}
        </template>
      </el-table-column>
      <el-table-column label="文件" prop="filePath" align="center">
        <template #default="scope">
          <el-link  style="" type="primary" @click="openFile(scope.row.filePath)">{{scope.row.name}}</el-link>
        </template>
      </el-table-column>
      <el-table-column label="上传日期" prop="updateTime" align="center" />
      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" >
        <template #default="scope">
          <el-button link type="primary" @click="downloadFile(scope.row)">下载</el-button>
          <el-button link type="primary" @click="openDialog('edit',scope.row)">编辑</el-button>
          <el-button link type="danger" @click="handleDelete(scope.row)">删除</el-button>
        </template>
      </el-table-column>
    </el-table>
    <pagination
        v-show="total > 0"
        :total="total"
        v-model:page="queryParams.pageNum"
        v-model:limit="queryParams.pageSize"
        @pagination="getList"
    />
    <edit-dialog ref="dialogRef" @getList=getList></edit-dialog>
  </div>
</template>
<script setup>
import {getCurrentInstance, onMounted, onUnmounted, reactive, ref, toRefs} from "vue";
import {ElMessage, ElMessageBox} from "element-plus";
import {delCompany, getCompany} from "@/api/onlineEducation/company";
import { Plus, Upload, Download} from '@element-plus/icons-vue';
import {delUser, getUser} from "@/api/onlineEducation/user";
import Cookies from "js-cookie";
import editDialog from './components/editDialog.vue'
import {
  delIndustryTemp,
  getIndustryTemp, uploadTemplate,
} from "@/api/staffManage/staff";
import useUserStore from "@/store/modules/user";
import axios from "axios";
import {getToken} from "@/utils/auth";
import {getIndustry} from "@/api/system/industry";
import {renderAsync} from "docx-preview";
import {delInternalKnowledge, getInternalKnowledgeList} from "@/api/assetManage/assetMng";
import {getStandingBookList} from "@/api/infrastructureMng/ledger";
const userStore = useUserStore()
const { proxy } = getCurrentInstance();
const loading = ref(false);
const dialogRef = ref();
const data = reactive({
  queryParams: {
    pageNum: 1,
    pageSize: 10,
    companyId: null
  },
  total: 0,
  dataList: [],
  companyList: [],
  isAdmin: false,
  expertData: []
});
const { queryParams, total, dataList,companyList,isAdmin, expertData } = toRefs(data);
const userInfo = ref()
onMounted(async ()=>{
  if(userStore.roles.includes('admin')){
    data.isAdmin = true
    data.queryParams.companyId = null
    await getCompanyList()
  }else{
    data.isAdmin = false
    data.queryParams.companyId = userStore.companyId
  }
  await getList()
})
onUnmounted(()=>{
})
const fields = ref({
  '序号':'index',
  '文件类型':'knowledgeTypeName',
  '文件名称':'name'
})
const getAllList = async () => {
  let query = {
    pageNum: 1,
    pageSize: 9999,
    companyId: data.queryParams.companyId
  }
  const res = await getInternalKnowledgeList(query)
  if(res.code == 200){
    data.expertData = res.data.list?.map((item,index) => {
      return {
        ...item,
        index: index + 1,
        knowledgeTypeName: item.knowledgeType == 1 ? '体系' : item.knowledgeType == 2 ? '项目' : '其他'
      }
    })
  }else{
    ElMessage.warning(res.message)
  }
}
const openFile = async(path)=>{
  const ext = path.split('.').pop().toLowerCase();
  if (ext === 'doc' || ext === 'xls' || ext === 'xlsx') {
    ElMessageBox.confirm('暂不支持线上预览文件,是否下载查看?', '提示', { confirmButtonText: '确认', cancelButtonText: '取消', type: 'warning' }).then(() => {
      window.open(`${import.meta.env.VITE_APP_BASE_API}/${path}`, '_blank');
    }).catch(() => {
      console.log('取消预览')
    });
    return
  }
  if(ext === 'pdf'){
    window.open(`${import.meta.env.VITE_APP_BASE_API}/${path}`, '_blank')
    return
  }
  try {
    // 1. 获取文件
    const response = await fetch(import.meta.env.VITE_APP_BASE_API + '/' + path);
    const arrayBuffer = await response.arrayBuffer();
    // 2. 创建新窗口
    const win = window.open('', '_blank')
    win.document.write(`
      <!DOCTYPE html>
      <html>
        <head>
          <title>预览</title>
          <style>
            body { margin: 20px; font-family: Arial; }
            .docx-container { width: 100%; height: 100%; }
          </style>
        </head>
        <body>
          <div id="container" class="docx-container"></div>
        </body>
      </html>
    `);
    // 3. 渲染 DOCX
    await renderAsync(arrayBuffer, win.document.getElementById('container'));
  } catch (error) {
    console.error('预览失败:', error);
    alert(`预览失败: ${error.message}`);
  }
}
const getList = async () => {
  loading.value = true
  const res = await getInternalKnowledgeList(data.queryParams)
  if(res.code == 200){
    data.dataList = res.data.list
    data.total = res.data.total
  }else{
    ElMessage.warning(res.message)
  }
  loading.value = false
  await getAllList()
}
const getCompanyList = async ()=>{
  const queryParams = {
    pageNum: 1,
    pageSize: 999
  }
  const res = await getCompany(queryParams)
  if (res.code == 200) {
    data.companyList = res.data.list?res.data.list:[]
  } else {
    ElMessage.warning(res.message)
  }
}
const downloadFile = (e)=>{
  axios.get(import.meta.env.VITE_APP_BASE_API + '/' +e.filePath,{headers:{'Content-Type': 'application/json','Authorization': `${getToken()}`},responseType: 'blob'}).then(res=>{
    if (res) {
      const link = document.createElement('a')
      let blob = new Blob([res.data],{type: res.data.type})
      link.style.display = "none";
      link.href = URL.createObjectURL(blob); // 创建URL
      link.setAttribute("download", e.fileName);
      document.body.appendChild(link);
      link.click();
      document.body.removeChild(link);
    } else {
      ElMessage({
        type: 'warning',
        message: '文件读取失败'
      });
    }
  })
}
const openDialog = (type, value) => {
  dialogRef.value.openDialog(type, value, data.queryParams.companyId, data.isAdmin, data.companyList);
}
/** 重置新增的表单以及其他数据  */
const reset= async()=> {
  data.queryParams = {
    pageNum: 1,
    pageSize: 10,
    companyId: null
  }
  await getCompanyList()
  await getList()
}
const handleDelete = (val) => {
  ElMessageBox.confirm(
      '确定删除此条数据?',
      '提示',
      {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning',
      })
      .then( async() => {
        const res = await delInternalKnowledge({id: val.id})
        if(res.code == 200){
          ElMessage.success('数据删除成功')
          await getList()
        }else{
          ElMessage.warning(res.message)
        }
      })
}
</script>