祖安之光
昨天 19453ccbf5f0cd89450768fbcc29f7437ca8b282
修改新增
已修改2个文件
已添加14个文件
3852 ■■■■■ 文件已修改
package.json 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
public/maintainRecord.docx 补丁 | 查看 | 原始文档 | blame | 历史
public/repairRecord.docx 补丁 | 查看 | 原始文档 | blame | 历史
public/reviewRecordStatistic.docx 补丁 | 查看 | 原始文档 | blame | 历史
src/api/infrastructureMng/ledger.js 163 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/build/conpanyFunctionConsult/digitalFileDep/manageType/qualityManual/index.vue 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/work/qualityInfo/infrastructureMng/ledger/components/editDialog.vue 262 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/work/qualityInfo/infrastructureMng/ledger/index.vue 214 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/work/qualityInfo/infrastructureMng/maintainPlan/components/editDialog.vue 541 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/work/qualityInfo/infrastructureMng/maintainPlan/index.vue 549 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/work/qualityInfo/infrastructureMng/maintainRecord/components/editDialog.vue 553 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/work/qualityInfo/infrastructureMng/maintainRecord/index.vue 234 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/work/qualityInfo/infrastructureMng/repairRecord/components/editDialog.vue 463 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/work/qualityInfo/infrastructureMng/repairRecord/index.vue 235 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/work/qualityInfo/infrastructureMng/reviewRecordStatistics/components/editDialog.vue 426 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/work/qualityInfo/infrastructureMng/reviewRecordStatistics/index.vue 207 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
package.json
@@ -52,7 +52,9 @@
    "vue-router": "4.1.4",
    "vue3-json-excel": "^1.0.10-alpha",
    "vue3-tree-org": "^4.2.2",
    "wangeditor5-for-vue3": "^0.1.0"
    "wangeditor5-for-vue3": "^0.1.0",
    "xlsx": "^0.18.5",
    "xlsx-js-style": "^1.2.0"
  },
  "devDependencies": {
    "@vitejs/plugin-vue": "3.1.0",
public/maintainRecord.docx
Binary files differ
public/repairRecord.docx
Binary files differ
public/reviewRecordStatistic.docx
Binary files differ
src/api/infrastructureMng/ledger.js
对比新文件
@@ -0,0 +1,163 @@
import request from '@/utils/request'
export function getStandingBookList(query) {
  return request({
    url: '/system/standingBook/selectStandingBookList',
    method: 'get',
    params: query
  })
}
export function delStandingBook(query) {
  return request({
    url: '/system/standingBook/delStandingBook',
    method: 'get',
    params: query
  })
}
export function addStandingBook(data) {
  return request({
    url: '/system/standingBook/saveStandingBook',
    method: 'post',
    data: data
  })
}
export function updateStandingBook(data) {
  return request({
    url: '/system/standingBook/updateStandingBook',
    method: 'post',
    data: data
  })
}
export function getMaintenanceRecordList(query) {
  return request({
    url: '/system/annualMaintenanceRecord/selectAnnualMaintenanceRecordList',
    method: 'get',
    params: query
  })
}
export function delMaintenanceRecord(query) {
  return request({
    url: '/system/annualMaintenanceRecord/deletedAnnualMaintenanceRecord',
    method: 'get',
    params: query
  })
}
export function updateMaintenanceRecord(data) {
  return request({
    url: '/system/annualMaintenanceRecord/saveAnnualMaintenanceRecord',
    method: 'post',
    data: data
  })
}
export function getMaintenanceRecordDetail(query) {
  return request({
    url: '/system/annualMaintenanceRecord/getAnnualMaintenanceRecord',
    method: 'get',
    params: query
  })
}
export function getMaintenanceServiceList(query) {
  return request({
    url: '/system/annualMaintenanceService/selectAnnualMaintenanceServiceList',
    method: 'get',
    params: query
  })
}
export function delMaintenanceService(query) {
  return request({
    url: '/system/annualMaintenanceService/deletedAnnualMaintenanceService',
    method: 'get',
    params: query
  })
}
export function updateMaintenanceService(data) {
  return request({
    url: '/system/annualMaintenanceService/saveAnnualMaintenanceService',
    method: 'post',
    data: data
  })
}
export function getMaintenanceServiceDetail(query) {
  return request({
    url: '/system/annualMaintenanceService/getAnnualMaintenanceService',
    method: 'get',
    params: query
  })
}
export function getMaintenanceEvaluateList(query) {
  return request({
    url: '/system/annualMaintenanceEvaluate/selectAnnualMaintenanceEvaluateList',
    method: 'get',
    params: query
  })
}
export function delMaintenanceEvaluate(query) {
  return request({
    url: '/system/annualMaintenanceEvaluate/deletedAnnualMaintenanceEvaluate',
    method: 'get',
    params: query
  })
}
export function updateMaintenanceEvaluate(data) {
  return request({
    url: '/system/annualMaintenanceEvaluate/saveAnnualMaintenanceEvaluate',
    method: 'post',
    data: data
  })
}
export function getMaintenanceEvaluateDetail(query) {
  return request({
    url: '/system/annualMaintenanceEvaluate/getAnnualMaintenanceEvaluate',
    method: 'get',
    params: query
  })
}
export function getMaintenancePlanList(query) {
  return request({
    url: '/system/annualMaintenance/selectAnnualMaintenanceList',
    method: 'get',
    params: query
  })
}
export function delMaintenancePlan(query) {
  return request({
    url: '/system/annualMaintenance/deletedAnnualMaintenance',
    method: 'get',
    params: query
  })
}
export function updateMaintenancePlan(data) {
  return request({
    url: '/system/annualMaintenance/saveAnnualMaintenance',
    method: 'post',
    data: data
  })
}
export function getMaintenancePlanDetail(query) {
  return request({
    url: '/system/annualMaintenance/getAnnualMaintenance',
    method: 'get',
    params: query
  })
}
src/views/build/conpanyFunctionConsult/digitalFileDep/manageType/qualityManual/index.vue
@@ -236,7 +236,6 @@
    data.companyInfo.policies = res.data.companyQualityPolicies ? res.data.companyQualityPolicies[0]?.policy : []
    const duties = transToTableData(res.data.sysFunctionalDistributions,data.originDeptList)
    data.companyInfo.allDepts = duties.allDepts
    console.log(data.companyInfo.allDepts,'all')
    data.companyInfo.clauses = duties.clauses
    data.companyInfo.temps = res.data.companyIndustryTemplates?.map((item,index)=>{
      return {
src/views/work/qualityInfo/infrastructureMng/ledger/components/editDialog.vue
对比新文件
@@ -0,0 +1,262 @@
<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-form-item label="名称型号:" prop="model">
          <el-input v-model.trim="state.form.model"></el-input>
        </el-form-item>
        <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-form-item label="责任人/使用人:" prop="personResponsible">
          <el-select clearable v-model="state.form.personResponsible" :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-form-item label="设备类型:" prop="deviceType">
          <el-select v-model="state.form.deviceType" :disabled="state.title =='查看'" placeholder="请选择" clearable>
            <el-option key="1" label="生产设备" :value="1"></el-option>
            <el-option key="2" label="办公自动化设备" :value="2"></el-option>
          </el-select>
        </el-form-item>
        <el-form-item label="编号:" prop="number">
          <el-input v-model.trim="state.form.number" :readonly="state.title =='查看'"></el-input>
        </el-form-item>
        <el-form-item label="品牌:" prop="brand">
          <el-input v-model.trim="state.form.brand" :readonly="state.title =='查看'"></el-input>
        </el-form-item>
        <el-form-item label="密级/类型:" prop="confidentiality">
          <el-input v-model.trim="state.form.confidentiality" :readonly="state.title =='查看'"></el-input>
        </el-form-item>
        <el-form-item label="状态:" prop="status">
          <el-select v-model="state.form.status" :disabled="state.title =='查看'" placeholder="请选择" clearable>
            <el-option key="1" label="完好" :value="1"></el-option>
            <el-option key="2" label="损坏" :value="2"></el-option>
          </el-select>
        </el-form-item>
        <el-form-item label="用途:" prop="purpose">
          <el-input v-model.trim="state.form.purpose" :readonly="state.title =='查看'"></el-input>
        </el-form-item>
        <el-form-item label="使用地点:" prop="location">
          <el-input v-model.trim="state.form.location" :readonly="state.title =='查看'"></el-input>
        </el-form-item>
        <el-form-item label="使用情况:" prop="used">
          <el-input v-model.trim="state.form.used" :readonly="state.title =='查看'"></el-input>
        </el-form-item>
        <el-form-item label="备注:" prop="remark">
          <el-input v-model.trim="state.form.remark" :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";
const emit = defineEmits(["getList"]);
const dialogVisible = ref(false)
const superRef = ref()
const state = reactive({
  title: '',
  form: {
    id: null,
    model: '',
    deptId: null,
    personResponsible: null,
    deviceType: null,
    number: '',
    brand: '',
    confidentiality: '',
    status: null,
    purpose: '',
    location: '',
    used: '',
    remark: '',
    companyId: null
  },
  formRules:{
    companyId: [{ required: true, message: '请选择企业', trigger: 'blur' }],
    deptId: [{ required: true, message: '请选择受部门', trigger: 'blur' }],
    model: [{ required: true, message: '请填写名称型号', trigger: 'blur' }],
    personResponsible: [{ required: true, message: '请选择责任人/使用人',  trigger: 'blur' }],
    deviceType: [{ required: true, message: '请选择设备类型',  trigger: 'blur' }],
    number: [{ required: true, message: '请填写编号',  trigger: 'blur' }]
  },
  isAdmin: false,
  companyList: [],
  deptList: [],
  userList: []
})
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 == '查看'){
    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){
    if(state.title == '新增'){
      const {id,...data} = state.form
      const res = await addStandingBook(data)
      if(res.code == 200){
        ElMessage.success(res.message)
        emit('getList')
        handleClose()
        dialogVisible.value = false;
      }else{
        ElMessage.warning(res.message)
      }
    }else{
      const res = await updateStandingBook(state.form)
      if(res.code == 200){
        ElMessage.success(res.message)
        emit('getList')
        handleClose()
        dialogVisible.value = false;
      }else{
        ElMessage.warning(res.message)
      }
    }
  }
}
const getDeptList = async ()=>{
  state.form.deptId = null
  state.form.personResponsible = 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 handleClose = () => {
  state.form = {
    id: null,
    model: '',
    deptId: null,
    personResponsible: null,
    deviceType: null,
    number: '',
    brand: '',
    confidentiality: '',
    status: null,
    purpose: '',
    location: '',
    used: '',
    remark: '',
    companyId: null
  }
  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/qualityInfo/infrastructureMng/ledger/index.vue
对比新文件
@@ -0,0 +1,214 @@
<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>
          <vue3-json-excel
              :json-data="expertData"
              :fields="fields"
              name="用户花名册.xls"
              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 type="index" label="序号"></el-table-column>
      <el-table-column prop="model" align="center" label="名称型号"></el-table-column>
      <el-table-column prop="deptName" align="center" label="部门"></el-table-column>
      <el-table-column prop="personResponsible" align="center" label="责任人/使用人"></el-table-column>
      <el-table-column prop="number" align="center" label="编号"></el-table-column>
      <el-table-column prop="location" align="center" label="使用地点"></el-table-column>
      <el-table-column prop="used" align="center" label="使用情况"></el-table-column>
<!--      <el-table-column label="检查表" align="center">-->
<!--        <template #default="scope">-->
<!--          {{scope.row.deptName }}内审检查表-->
<!--        </template>-->
<!--      </el-table-column>-->
      <el-table-column label="操作" align="center">
        <template #default="scope">
          <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 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";
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',
  '名称型号':'model',
  '部门':'deptName',
  '责任人/使用人':'personResponsible',
  '编号':'number',
  '使用地点':'location',
  '使用情况':'used'
});
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 getStandingBookList(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 getAllList = async () => {
  let query = {
    pageNum: data.queryParams.pageNum,
    pageSize: 9999,
    companyId: data.queryParams.companyId
  }
  const res = await getStandingBookList(query)
  if(res.code == 200){
    data.expertData = res.data.list?.map((item,index) => {
      return {
        ...item,
        index: index + 1
      }
    })
  }else{
    ElMessage.warning(res.message)
  }
}
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 handleDelete = (val) => {
  ElMessageBox.confirm(
      '确定删除此条数据?',
      '提示',
      {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning',
      })
      .then( async() => {
        const res = await delStandingBook({id: val.id})
        if(res.code == 200){
          ElMessage.success('数据删除成功')
          await getList()
        }else{
          ElMessage.warning(res.message)
        }
      })
}
</script>
src/views/work/qualityInfo/infrastructureMng/maintainPlan/components/editDialog.vue
对比新文件
@@ -0,0 +1,541 @@
<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="180px">
        <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="year">
              <el-date-picker
                  v-model="state.form.year"
                  type="year"
                  value-format="YYYY"
                  placeholder="请选择年份"
                  :disabled="state.title =='查看'"
              />
            </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-form-item label="年度基础设施维护计划:" prop="annualMaintenanceDeviceSaveDTOReqs">
          <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.annualMaintenanceDeviceSaveDTOReqs" class="customedTable" :border="true">-->
<!--          <el-table-column label="序号" type="index" width="80" align="center">-->
<!--          </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-->
<!--              >-->
<!--              </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-->
<!--              >-->
<!--              </el-input>-->
<!--            </template>-->
<!--          </el-table-column>-->
<!--          <el-table-column label="厂内编号" prop="factoryNumber" align="center">-->
<!--            <template #default="scope">-->
<!--              <el-input-->
<!--                  v-model.trim="scope.row.factoryNumber"-->
<!--                  size="large"-->
<!--                  type="textarea"-->
<!--                  style="width: 100%;"-->
<!--                  clearable-->
<!--              >-->
<!--              </el-input>-->
<!--            </template>-->
<!--          </el-table-column>-->
<!--          <el-table-column label="用途" prop="purpose" align="center">-->
<!--            <template #default="scope">-->
<!--              <el-input-->
<!--                  v-model.trim="scope.row.purpose"-->
<!--                  size="large"-->
<!--                  type="textarea"-->
<!--                  style="width: 100%;"-->
<!--                  clearable-->
<!--              >-->
<!--              </el-input>-->
<!--            </template>-->
<!--          </el-table-column>-->
<!--          <el-table-column label="使用部门" prop="deptName" align="center">-->
<!--            <template #default="scope">-->
<!--              <el-input-->
<!--                  v-model.trim="scope.row.deptName"-->
<!--                  size="large"-->
<!--                  type="textarea"-->
<!--                  style="width: 100%;"-->
<!--                  clearable-->
<!--              >-->
<!--              </el-input>-->
<!--            </template>-->
<!--          </el-table-column>-->
<!--          <el-table-column label="操作" align="center" width="70">-->
<!--            <template #default="scope">-->
<!--              <el-button link type="danger" @click="handleDelete(scope.$index)">删除</el-button>-->
<!--            </template>-->
<!--          </el-table-column>-->
<!--        </el-table>-->
        <div v-for="(device,deviceIndex) in state.form.annualMaintenanceDeviceSaveDTOReqs" :key="deviceIndex" class="device-table">
          <table class="seven-col-table">
            <thead>
              <tr>
                <th>序号</th>
                <th>设备名称</th>
                <th>型号</th>
                <th>厂内编号</th>
                <th>用途</th>
                <th>使用部门</th>
                <th v-if="state.title !=='查看'">操作</th>
              </tr>
            </thead>
            <tbody>
            <tr>
              <td>{{deviceIndex + 1}}</td>
              <td>
                <el-input v-model.trim="device.deviceName" type="textarea" style="width: 100%;" clearable :readonly="state.title =='查看'"></el-input>
              </td>
              <td>
                <el-input v-model.trim="device.model" type="textarea" style="width: 100%;" clearable :readonly="state.title =='查看'"></el-input>
              </td>
              <td>
                <el-input v-model.trim="device.factoryNumber" type="textarea" style="width: 100%;" clearable :readonly="state.title =='查看'"></el-input>
              </td>
              <td>
                <el-input v-model.trim="device.purpose" type="textarea" style="width: 100%;" clearable :readonly="state.title =='查看'"></el-input>
              </td>
              <td>
                <el-input v-model.trim="device.deptName" type="textarea" style="width: 100%;" clearable :readonly="state.title =='查看'"></el-input>
              </td>
              <td v-if="state.title !=='查看'">
                <el-button link type="danger" @click="handleDelete(deviceIndex)">删除</el-button>
              </td>
            </tr>
            </tbody>
          </table>
          <table class="maintain-table">
            <thead>
            <tr>
              <th style="width: 120px;">项目</th>
              <th style="width: 80px;">频度</th>
              <th v-for="(month,monthIndex) in state.monthList" :key="monthIndex">{{month.label}}</th>
            </tr>
            </thead>
            <tbody>
            <tr v-for="(line,lineIndex) in state.form.annualMaintenanceDeviceSaveDTOReqs[deviceIndex].annualMaintenanceDeviceTypes" :key="lineIndex">
              <td>{{line.projectType == 1?'日常例行点检':line.projectType == 2?'一级保养':'二级保养'}}</td>
              <td>{{line.frequency == 1?'工作日':line.frequency == 2?'1次/3个月':'1次/6个月'}}</td>
              <td v-for="(month,monthIndex2) in state.monthList" :key="monthIndex2">
                <el-input v-model.trim="line[month.value]" style="width: 100%;" clearable :readonly="state.title =='查看'"></el-input>
              </td>
            </tr>
            </tbody>
          </table>
        </div>
        <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-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-form-item label="做成:" prop="finishId">
          <el-select clearable v-model="state.form.finishId" :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>
      <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 {getMaintenancePlanDetail, updateMaintenancePlan} from "@/api/infrastructureMng/ledger";
const emit = defineEmits(["getList"]);
const dialogVisible = ref(false)
const superRef = ref()
const checkList = (rule, value, callback) => {
  if (state.form.annualMaintenanceDeviceSaveDTOReqs.length == 0) {
    callback(new Error('维护计划不可为空'))
  } else {
    callback()
  }
}
const state = reactive({
  title: '',
  form: {
    id: null,
    companyId: null,
    name: '',
    year: '',
    number: '',
    annualMaintenanceDeviceSaveDTOReqs: [],
    approvalId: null,
    approvalName: '',
    processId: null,
    processName: '',
    finishId: null,
    finishName: '',
    delDeviceIds: []
  },
  oldDeviceList: [],
  formRules:{
    companyId: [{ required: true, message: '请选择企业', trigger: 'blur' }],
    year: [{ required: true, message: '请选择年份', trigger: 'blur' }],
    number: [{ required: true, message: '请填写编号', trigger: 'blur' }],
    approvalId: [{ required: true, message: '请选择核准人',  trigger: 'blur' }],
    processId: [{ required: true, message: '请选择审核人',  trigger: 'blur' }],
    finishId: [{ required: true, message: '请选择做成人',  trigger: 'blur' }],
    annualMaintenanceDeviceSaveDTOReqs: [{ required: true, validator: checkList, trigger: 'blur' }],
  },
  isAdmin: false,
  companyList: [],
  userList: [],
  monthList: [
    {label: '一月',value: 'jan'},
    {label: '二月',value: 'feb'},
    {label: '三月',value: 'mar'},
    {label: '四月',value: 'apr'},
    {label: '五月',value: 'may'},
    {label: '六月',value: 'jun'},
    {label: '七月',value: 'jul'},
    {label: '八月',value: 'aug'},
    {label: '九月',value: 'sep'},
    {label: '十月',value: 'oct'},
    {label: '十一月',value: 'nov'},
    {label: '十二月',value: 'decm'}
  ]
})
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,
    annualMaintenanceId: null,
    annualMaintenanceDeviceTypes: [
      {
        id: null,
        annualMaintenanceDeviceId: null,
        projectType: 1,
        frequency: 1,
        jan: '',
        feb: '',
        mar: '',
        apr: '',
        may: '',
        jun: '',
        jul: '',
        aug: '',
        sep: '',
        oct: '',
        nov: '',
        decm: ''
      },
      {
        id: null,
        annualMaintenanceDeviceId: null,
        projectType: 2,
        frequency: 2,
        jan: '',
        feb: '',
        mar: '',
        apr: '',
        may: '',
        jun: '',
        jul: '',
        aug: '',
        sep: '',
        oct: '',
        nov: '',
        decm: ''
      },
      {
        id: null,
        annualMaintenanceDeviceId: null,
        projectType: 3,
        frequency: 3,
        jan: '',
        feb: '',
        mar: '',
        apr: '',
        may: '',
        jun: '',
        jul: '',
        aug: '',
        sep: '',
        oct: '',
        nov: '',
        decm: ''
      }
    ],
    delDeviceTypeIds: [],
    deviceName: '',
    model: '',
    factoryNumber: '',
    purpose: '',
    deptName: ''
  }
  state.form.annualMaintenanceDeviceSaveDTOReqs.push(obj);
}
const handleDelete = (i) =>{
  state.form.annualMaintenanceDeviceSaveDTOReqs = state.form.annualMaintenanceDeviceSaveDTOReqs.filter((item,index) => index != i)
}
const onSubmit = async () => {
  const valid = await superRef.value.validate();
  console.log(state.form,'form')
  // return
  if(valid){
    const data = JSON.parse(JSON.stringify(state.form))
    data.delDeviceIds = state.oldDeviceList.filter(i =>!data.annualMaintenanceDeviceSaveDTOReqs.some(item=>item.id == i.id)).map(i=>i.id)
    data.approvalName = state.userList.find(i=>i.userId == data.approvalId)?.name
    data.processName = state.userList.find(i=>i.userId == data.processId)?.name
    data.finishName = state.userList.find(i=>i.userId == data.finishId)?.name
    data.name = data.year + '年度基础设施维护计划'
    if(state.title == '新增'){
      delete data.id
      const res = await updateMaintenancePlan(data)
      if(res.code == 200){
        ElMessage.success(res.message)
        emit('getList')
        handleClose()
        dialogVisible.value = false;
      }else{
        ElMessage.warning(res.message)
      }
    }else{
      const res = await updateMaintenancePlan(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 getMaintenancePlanDetail({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.annualMaintenanceDeviceSaveDTOReqs = res.data.annualMaintenanceDeviceList.map(item=>{
      return {
        ...item,
        annualMaintenanceDeviceTypes: [...item.annualMaintenanceDeviceTypeList].sort((a, b) => a.projectType - b.projectType)
      }
    })
    state.oldDeviceList = res.data.annualMaintenanceDeviceList
  }else{
    ElMessage.warning(res.message)
  }
}
const getDeptList = async ()=>{
  state.form.approvalId = null
  state.form.processId = null
  state.form.finishId = 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
      }
    }):[]
    if(state.form.deptId){
      state.interUserList = state.userList.filter(i=>i.deptId !== state.form.deptId)
    }else{
      state.interUserList = state.userList
    }
  }else{
    ElMessage.warning(res.message)
  }
}
const handleClose = () => {
  state.form = {
    id: null,
    companyId: null,
    name: '',
    year: '',
    number: '',
    annualMaintenanceDeviceSaveDTOReqs: [],
    approvalId: null,
    approvalName: '',
    processId: null,
    processName: '',
    finishId: null,
    finishName: '',
    delDeviceIds: []
  }
  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;
  }
  .device-table {
    width: calc(100% - 170px);
    margin-left: 170px;
    margin-bottom: 30px;
    padding: 5px;
    border: 1px solid #2563eb;
    border-radius: 5px;
    background: #fff;
    box-shadow: 8px 8px 15px rgba(0, 21, 41, 0.08), -8px -8px 15px #fff;
  }
  table {
    width: 100%;
    border-collapse: collapse;
    margin-bottom: 4px;
  }
  th, td {
    border: 1px solid #ebeef5;
    padding: 0;
    text-align: center;
  }
  th {
    padding: 4px 0;
    background-color: #f8f8f9;
  }
  .maintain-table{
    margin-bottom: 0;
  }
}
</style>
<style lang="scss">
.device-table {
  .el-textarea__inner{
    border: none !important;
    border-color: rgba(0,0,0,0);
    border-radius: 0;
  }
  .el-input__wrapper{
    border: none !important;
    border-color: rgba(0,0,0,0);
    border-radius: 0;
  }
}
</style>
src/views/work/qualityInfo/infrastructureMng/maintainPlan/index.vue
对比新文件
@@ -0,0 +1,549 @@
<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 v-if="isAdmin" label="年份:">
          <el-date-picker
              v-model="data.queryParams.year"
              type="year"
              value-format="YYYY"
              placeholder="请选择年份"
          />
        </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="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 { utils, writeFile } from 'xlsx-js-style';
import {generateWordDocument} from "@/utils/exportWord";
import {
  delMaintenancePlan,
  getMaintenanceEvaluateDetail,
  getMaintenancePlanDetail,
  getMaintenancePlanList
} 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: [],
  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 getMaintenancePlanList(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 getMaintenancePlanDetail({id: val.id})
//   if(res.code == 200){
//     if(res.data){
//       let tableData = res.data
//       tableData.content = res.data.caluseNum.split('、').map((i,index)=>i + res.data.caluseContent.split(';\n')[index]).join('\n')
//       tableData.interPeople = res.data.internalAuditCheckPeople.map(i=>i.auditUserName)
//       try {
//         generateWordDocument('/interCheck.docx', tableData, tableData.deptName +'内审检查表.docx');
//       } catch (error){
//         ElMessage({
//           type: 'warning',
//           message: '导出失败'
//         });
//       }
//     }else{
//       ElMessage.warning('暂无数据')
//     }
//   }else{
//     ElMessage.warning(res.message)
//   }
// }
const downloadFile = async (val)=>{
  const res = await getMaintenancePlanDetail({id: val.id})
  if(res.code == 200){
    if(res.data){
      let tableData = res.data
      if(data.isAdmin){
        tableData.companyName = data.companyList.find(i=>i.id == val.companyId)?.name
      }else{
        tableData.companyName = userStore.companyName
      }
      const wb = utils.book_new();
      const wsData = [];
      // 第一行:企业名称(合并A1-T1)
      wsData.push([{ v: tableData.companyName, t: 's', s: { font: { bold: true, sz: 16 }, alignment: { horizontal: 'center' } } }]);
      // 第二行:标题(合并A2-T2)
      wsData.push([{ v: tableData.name || '年度基础设施维护计划', t: 's', s: { font: { bold: true, sz: 14 }, alignment: { horizontal: 'center' } } }]);
      // 第三行:表头上半部分
      const row3 = [
        // A-F列(将在下方与row4合并)
        { v: '序号', t: 's', s: headerStyle },
        { v: '设备名称', t: 's', s: headerStyle },
        { v: '型号', t: 's', s: headerStyle },
        { v: '厂内编号', t: 's', s: headerStyle },
        { v: '用途', t: 's', s: headerStyle },
        { v: '使用部门', t: 's', s: headerStyle },
        // G-H列合并(维修保养)
        { v: '维修保养', t: 's', s: mergedHeaderStyle },
        null, // 合并单元格占位
        // I-T列合并(年度)
        { v: `${tableData.year}年度`, t: 's', s: mergedHeaderStyle },
        ...Array(11).fill(null) // 合并单元格占位
      ];
      // 第四行:表头下半部分
      const row4 = [
        // A-F列留空(与row3合并)
        ...Array(6).fill(null),
        // G列:项目
        { v: '项目', t: 's', s: subHeaderStyle },
        // H列:频度
        { v: '频度', t: 's', s: subHeaderStyle },
        // I-T列:月份
        { v: '一月', t: 's', s: subHeaderStyle },
        { v: '二月', t: 's', s: subHeaderStyle },
        { v: '三月', t: 's', s: subHeaderStyle },
        { v: '四月', t: 's', s: subHeaderStyle },
        { v: '五月', t: 's', s: subHeaderStyle },
        { v: '六月', t: 's', s: subHeaderStyle },
        { v: '七月', t: 's', s: subHeaderStyle },
        { v: '八月', t: 's', s: subHeaderStyle },
        { v: '九月', t: 's', s: subHeaderStyle },
        { v: '十月', t: 's', s: subHeaderStyle },
        { v: '十一月', t: 's', s: subHeaderStyle },
        { v: '十二月', t: 's', s: subHeaderStyle }
      ];
      // 添加表头行
      wsData.push(row3);
      wsData.push(row4);
      // 添加数据行
      tableData.annualMaintenanceDeviceList.forEach((device, deviceIndex) => {
        const rowBase = 4 + deviceIndex * 3; // 计算起始行号
        // 获取三种类型的维护数据
        const maintenanceTypes = device.annualMaintenanceDeviceTypeList || [];
        const dailyData = maintenanceTypes.find(item => item.projectType === 1) || {};
        const level1Data = maintenanceTypes.find(item => item.projectType === 2) || {};
        const level2Data = maintenanceTypes.find(item => item.projectType === 3) || {};
        // 主数据行(日常例行点检)
        const mainRow = [
          { v: deviceIndex + 1, t: 'n', s: dataStyle }, // A列:序号
          { v: device.deviceName || '', t: 's', s: dataStyle }, // B列:设备名称
          { v: device.model || '', t: 's', s: dataStyle }, // C列:型号
          { v: device.factoryNumber || '', t: 's', s: dataStyle }, // D列:厂内编号
          { v: device.purpose || '', t: 's', s: dataStyle }, // E列:用途
          { v: device.deptName || '', t: 's', s: dataStyle }, // F列:使用部门
          { v: '日常例行点检', t: 's', s: subDataStyle }, // G列
          { v: getFrequencyText(dailyData.frequency), t: 's', s: subDataStyle }, // H列
          // I-T列:月份数据(日常例行点检)
          { v: dailyData.jan || '', t: 's', s: monthStyle },
          { v: dailyData.feb || '', t: 's', s: monthStyle },
          { v: dailyData.mar || '', t: 's', s: monthStyle },
          { v: dailyData.apr || '', t: 's', s: monthStyle },
          { v: dailyData.may || '', t: 's', s: monthStyle },
          { v: dailyData.jun || '', t: 's', s: monthStyle },
          { v: dailyData.jul || '', t: 's', s: monthStyle },
          { v: dailyData.aug || '', t: 's', s: monthStyle },
          { v: dailyData.sep || '', t: 's', s: monthStyle },
          { v: dailyData.oct || '', t: 's', s: monthStyle },
          { v: dailyData.nov || '', t: 's', s: monthStyle },
          { v: dailyData.decm || '', t: 's', s: monthStyle }
        ];
        // 一级保养行
        const subRow1 = [
          ...Array(6).fill(null), // A-F列留空(与主行合并)
          { v: '一级保养', t: 's', s: subDataStyle }, // G列
          { v: getFrequencyText(level1Data.frequency), t: 's', s: subDataStyle }, // H列
          // I-T列:月份数据(一级保养)
          { v: level1Data.jan || '', t: 's', s: monthStyle },
          { v: level1Data.feb || '', t: 's', s: monthStyle },
          { v: level1Data.mar || '', t: 's', s: monthStyle },
          { v: level1Data.apr || '', t: 's', s: monthStyle },
          { v: level1Data.may || '', t: 's', s: monthStyle },
          { v: level1Data.jun || '', t: 's', s: monthStyle },
          { v: level1Data.jul || '', t: 's', s: monthStyle },
          { v: level1Data.aug || '', t: 's', s: monthStyle },
          { v: level1Data.sep || '', t: 's', s: monthStyle },
          { v: level1Data.oct || '', t: 's', s: monthStyle },
          { v: level1Data.nov || '', t: 's', s: monthStyle },
          { v: level1Data.decm || '', t: 's', s: monthStyle }
        ];
        // 二级保养行
        const subRow2 = [
          ...Array(6).fill(null), // A-F列留空(与主行合并)
          { v: '二级保养', t: 's', s: subDataStyle }, // G列
          { v: getFrequencyText(level2Data.frequency), t: 's', s: subDataStyle }, // H列
          // I-T列:月份数据(二级保养)
          { v: level2Data.jan || '', t: 's', s: monthStyle },
          { v: level2Data.feb || '', t: 's', s: monthStyle },
          { v: level2Data.mar || '', t: 's', s: monthStyle },
          { v: level2Data.apr || '', t: 's', s: monthStyle },
          { v: level2Data.may || '', t: 's', s: monthStyle },
          { v: level2Data.jun || '', t: 's', s: monthStyle },
          { v: level2Data.jul || '', t: 's', s: monthStyle },
          { v: level2Data.aug || '', t: 's', s: monthStyle },
          { v: level2Data.sep || '', t: 's', s: monthStyle },
          { v: level2Data.oct || '', t: 's', s: monthStyle },
          { v: level2Data.nov || '', t: 's', s: monthStyle },
          { v: level2Data.decm || '', t: 's', s: monthStyle }
        ];
        wsData.push(mainRow);
        wsData.push(subRow1);
        wsData.push(subRow2);
      });
      // 6. 说明行(合并A-T)
      const noteRowIndex = wsData.length;
      wsData.push([{
        v: "说明:" + '\n' + "1、日常例行点检项目依设备日常点检表项目进行。" + '\n' + "2、一级保养:以操作工为主,维修工辅导,按计划对设备进行检查,清洗规定部位,疏通油管,更换和清洗油管、油毡、滤油器。调整设备各配合间隙,紧固设备各固定螺,对传动件进行润滑加油。频度为每季度/次。" + '\n' + "3、二级保养:以维修工为主,对设备进行部分解体检查修理。更换或修复磨损件、清洗、换油,检查修理电器部分。频度为半年/次。" + '\n' + "4、以上计划为设备在正常使用状态进行的计划,如设备处于暂停使用时不需做相关保养。",
        t: 's',
        s: noteStyle
      }]);
      // 7. 核准/审核/做成标题行
      const approvalTitleRow = Array(20).fill({ v: '', t: 's', s: dataStyle });
      approvalTitleRow[0] = { v: '核准', t: 's', s: footerHeaderStyle };
      approvalTitleRow[7] = { v: '审核', t: 's', s: footerHeaderStyle };
      approvalTitleRow[14] = { v: '做成', t: 's', s: footerHeaderStyle };
      wsData.push(approvalTitleRow);
      // 8. 人员信息行
      const approvalDataRow = Array(20).fill({ v: '', t: 's', s: dataStyle });
      approvalDataRow[0] = { v: tableData.approvalName || '', t: 's', s: footerDataStyle };
      approvalDataRow[7] = { v: tableData.processName || '', t: 's', s: footerDataStyle };
      approvalDataRow[14] = { v: tableData.finishName || '', t: 's', s: footerDataStyle };
      wsData.push(approvalDataRow);
      // 9. 表单编号行
      const lastRow = wsData.length;
      const noteText = "表单编号:" + tableData.number;
      wsData.push([{
        v: noteText,
        t: 's',
        s: {
          font: { sz: 11 },
          alignment: { horizontal: 'right', vertical: 'center', wrapText: true },
        }
      }]);
      const ws = utils.aoa_to_sheet(wsData);
      // 设置合并单元格
      const merges = [
        // 第一行合并(A1-T1)
        { s: { r: 0, c: 0 }, e: { r: 0, c: 19 } },
        // 第二行合并(A2-T2)
        { s: { r: 1, c: 0 }, e: { r: 1, c: 19 } },
        // A-F列在第三行和第四行合并
        ...Array.from({ length: 6 }, (_, c) => ({
          s: { r: 2, c }, e: { r: 3, c }
        })),
        // 第三行的维修保养合并(G3-H3)
        { s: { r: 2, c: 6 }, e: { r: 2, c: 7 } },
        // 第三行的年度合并(I3-T3)
        { s: { r: 2, c: 8 }, e: { r: 2, c: 19 } },
        // 说明行合并
        { s: { r: noteRowIndex, c: 0 }, e: { r: noteRowIndex, c: 19 } },
        // 核准/审核/做成标题合并
        { s: { r: noteRowIndex + 1, c: 0 }, e: { r: noteRowIndex + 1, c: 6 } },
        { s: { r: noteRowIndex + 1, c: 7 }, e: { r: noteRowIndex + 1, c: 13 } },
        { s: { r: noteRowIndex + 1, c: 14 }, e: { r: noteRowIndex + 1, c: 19 } },
        // 人员信息合并
        { s: { r: noteRowIndex + 2, c: 0 }, e: { r: noteRowIndex + 2, c: 6 } },
        { s: { r: noteRowIndex + 2, c: 7 }, e: { r: noteRowIndex + 2, c: 13 } },
        { s: { r: noteRowIndex + 2, c: 14 }, e: { r: noteRowIndex + 2, c: 19 } },
        { s: { r: lastRow, c: 0 }, e: { r: lastRow, c: 19 } }
      ];
      // 添加每个设备的三行合并
      tableData.annualMaintenanceDeviceList.forEach((_, index) => {
        const rowBase = 4 + index * 3;
        // A-F列在三行中合并
        for (let c = 0; c < 6; c++) {
          merges.push({ s: { r: rowBase, c }, e: { r: rowBase + 2, c } });
        }
      });
      ws['!merges'] = merges;
      merges.forEach(merge => {
        const { s, e } = merge; // 合并区域的起止位置
        // 设置合并区域四个边的边框
        for (let r = s.r; r <= e.r; r++) {
          for (let c = s.c; c <= e.c; c++) {
            const cellRef = utils.encode_cell({ r, c });
            // 保留原有样式,只覆盖边框
            ws[cellRef] = ws[cellRef] || { t: 's', v: '' };
            ws[cellRef].s = {
              ...(ws[cellRef].s || {}),
              border: {
                top:    { style: 'thin', color: { rgb: '000000' } },
                left:   { style: 'thin', color: { rgb: '000000' } },
                bottom: { style: 'thin', color: { rgb: '000000' } },
                right:  { style: 'thin', color: { rgb: '000000' } }
              }
            };
          }
        }
      });
      const totalRows = wsData.length;
      if (!ws['!rows']) {
        ws['!rows'] = Array(totalRows).fill(null);
      }
      ws['!rows'][noteRowIndex] = { hpx: 100 };
      // 设置列宽
      ws['!cols'] = [
        { wch: 8 }, { wch: 15 }, { wch: 12 }, { wch: 12 },
        { wch: 12 }, { wch: 12 }, { wch: 12 }, { wch: 10 },
        ...Array(12).fill({ wch: 8 })
      ];
      // 添加工作表到工作簿
      utils.book_append_sheet(wb, ws, '维护计划');
      // 导出Excel文件
      writeFile(wb, `${tableData.companyName}${tableData.year}年度基础设施维护计划.xlsx`);
    }else{
      ElMessage.warning('暂无数据')
    }
  }else{
    ElMessage.warning(res.message)
  }
}
// 频度文本转换
function getFrequencyText(frequency) {
  switch(frequency) {
    case 1: return '工作日';
    case 2: return '1次/3月';
    case 3: return '1次/6月';
    default: return '';
  }
}
// 样式定义
const headerStyle = {
  font: { bold: true, color: { rgb: 'FFFFFF' } },
  fill: { fgColor: { rgb: '4472C4' } },
  alignment: { horizontal: 'center', vertical: 'center' },
  border: {
    top: { style: 'thin', color: { rgb: '000000' } },
    bottom: { style: 'thin', color: { rgb: '000000' } },
    left: { style: 'thin', color: { rgb: '000000' } },
    right: { style: 'thin', color: { rgb: '000000' } }
  }
};
const mergedHeaderStyle = {
  ...headerStyle,
  fill: { fgColor: { rgb: '70AD47' } }
};
const subHeaderStyle = {
  font: { bold: true },
  fill: { fgColor: { rgb: 'B4C6E7' } },
  alignment: { horizontal: 'center', vertical: 'center' },
  border: headerStyle.border
};
const dataStyle = {
  alignment: { horizontal: 'center', vertical: 'center' },
  border: headerStyle.border
};
const subDataStyle = {
  font: { bold: true },
  fill: { fgColor: { rgb: 'E2EFDA' } },
  alignment: { horizontal: 'center', vertical: 'center' },
  border: headerStyle.border
};
const monthStyle = {
  alignment: { horizontal: 'center', vertical: 'center' },
  border: headerStyle.border
};
const noteStyle = {
  font: { italic: true, sz: 11 },
  alignment: { horizontal: 'left', vertical: 'center', wrapText: true },
  border: {
    top: { style: 'thin', color: { rgb: '000000' } },
    bottom: { style: 'thin', color: { rgb: '000000' } }
  }
};
const footerHeaderStyle = {
  ...headerStyle,
  fill: { fgColor: { rgb: 'D9D9D9' } },
  font: { bold: true, color: { rgb: '000000' } }
};
const footerDataStyle = {
  ...dataStyle,
  font: { bold: true },
  alignment: { horizontal: 'center' }
};
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 delMaintenancePlan({id: val.id})
        if(res.code == 200){
          ElMessage.success('数据删除成功')
          await getList()
        }else{
          ElMessage.warning(res.message)
        }
      })
}
</script>
src/views/work/qualityInfo/infrastructureMng/maintainRecord/components/editDialog.vue
对比新文件
@@ -0,0 +1,553 @@
<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="8">
            <el-form-item label="设备名称:" prop="deviceName">
              <el-input v-model.trim="state.form.deviceName" :disabled="state.title =='查看'"></el-input>
            </el-form-item>
          </el-col>
          <el-col :span="8">
            <el-form-item label="设备编号:" prop="deviceNumber">
              <el-input v-model.trim="state.form.deviceNumber" :disabled="state.title =='查看'"></el-input>
            </el-form-item>
          </el-col>
          <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-row>
        <el-table :data="state.maintainList" :border="true" class="customedTable" :span-method="objectSpanMethod" style="margin-bottom: 30px">
          <el-table-column label="保养内容" align="center" width="100">
            <template #default="scope">
              保养内容
            </template>
          </el-table-column>
          <el-table-column label="标准" prop="standard" align="center">
            <template #default="scope">
              <p style="margin: 0;text-align: left">{{scope.row.standard}}</p>
            </template>
          </el-table-column>
          <el-table-column label="保养等级" prop="level" align="center"/>
          <el-table-column label="结论" prop="conclusion" align="center">
            <template #default="scope">
              <el-input
                  v-model.trim="scope.row.conclusion"
                  size="large"
                  type="textarea"
                  style="width: 100%"
                  :readonly="state.title =='查看'"
              >
              </el-input>
            </template>
          </el-table-column>
          <el-table-column label="整改措施" prop="rectificationMeasures" align="center">
            <template #default="scope">
              <el-input
                  v-model.trim="scope.row.rectificationMeasures"
                  size="large"
                  type="textarea"
                  style="width: 100%"
                  :readonly="state.title =='查看'"
              >
              </el-input>
            </template>
          </el-table-column>
        </el-table>
        <el-form-item label="设备保养验收结论:" prop="conclusion">
          <el-input v-model.trim="state.form.conclusion" type="textarea" :autosize="{ minRows: 2 }" :readonly="state.title =='查看'"></el-input>
        </el-form-item>
        一级保养
        <el-row>
          <el-col :span="6">
            <el-form-item label="操作工:" prop="operatorsOne">
              <el-select clearable v-model="state.form.operatorsOne" :disabled="state.title =='查看'" value-key="userId" filterable multiple placeholder="操作工" style="width: 100%">
                <el-option
                    v-for="item in state.userList"
                    :key="item.userId"
                    :label="item.name"
                    :value="item"
                />
              </el-select>
            </el-form-item>
          </el-col>
          <el-col :span="6">
            <el-form-item label="日期:" prop="operateDateOne">
              <el-date-picker
                  v-model="state.form.operateDateOne"
                  type="date"
                  value-format="YYYY-MM-DD"
                  placeholder="请选择日期"
                  :disabled="state.title =='查看'"
              />
            </el-form-item>
          </el-col>
          <el-col :span="6">
            <el-form-item label="检查:" prop="checkersOne">
              <el-select clearable v-model="state.form.checkersOne" :disabled="state.title =='查看'" value-key="userId" filterable multiple placeholder="检查" style="width: 100%">
                <el-option
                    v-for="item in state.userList"
                    :key="item.userId"
                    :label="item.name"
                    :value="item"
                />
              </el-select>
            </el-form-item>
          </el-col>
          <el-col :span="6">
            <el-form-item label="日期:" prop="checkDateOne">
              <el-date-picker
                  v-model="state.form.checkDateOne"
                  type="date"
                  value-format="YYYY-MM-DD"
                  placeholder="请选择日期"
                  :disabled="state.title =='查看'"
              />
            </el-form-item>
          </el-col>
        </el-row>
        二级保养
        <el-row>
          <el-col :span="6">
            <el-form-item label="操作工:" prop="operatorsTwo">
              <el-select clearable v-model="state.form.operatorsTwo" :disabled="state.title =='查看'" value-key="userId" filterable multiple placeholder="操作工" style="width: 100%">
                <el-option
                    v-for="item in state.userList"
                    :key="item.userId"
                    :label="item.name"
                    :value="item"
                />
              </el-select>
            </el-form-item>
          </el-col>
          <el-col :span="6">
            <el-form-item label="日期:" prop="operateDateTwo">
              <el-date-picker
                  v-model="state.form.operateDateTwo"
                  type="date"
                  value-format="YYYY-MM-DD"
                  placeholder="请选择日期"
                  :disabled="state.title =='查看'"
              />
            </el-form-item>
          </el-col>
          <el-col :span="6">
            <el-form-item label="检查:" prop="checkersTwo">
              <el-select clearable v-model="state.form.checkersTwo" :disabled="state.title =='查看'" value-key="userId" filterable multiple placeholder="检查" style="width: 100%">
                <el-option
                    v-for="item in state.userList"
                    :key="item.userId"
                    :label="item.name"
                    :value="item"
                />
              </el-select>
            </el-form-item>
          </el-col>
          <el-col :span="6">
            <el-form-item label="日期:" prop="checkDateTwo">
              <el-date-picker
                  v-model="state.form.checkDateTwo"
                  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 {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";
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,
    deviceName: '',
    deviceNumber: '',
    number: '',
    annualMaintenanceServiceContentList: [],
    annualMaintenanceServiceUserList: [],
    conclusion: '',
    operatorsOne: [],
    operateDateOne: '',
    checkersOne: [],
    checkDateOne: '',
    operatorsTwo: [],
    operateDateTwo: '',
    checkersTwo: [],
    checkDateTwo: '',
    delServiceUserIds: []
  },
  oldServiceUsers: [],
  maintainList: [
    {
      id: null,
      serviceType: 1,
      standard: '1、设备内外清洁,无黄油、油垢、锈蚀,油质符合要求。',
      level: '一、二级',
      conclusion: '',
      rectificationMeasures: ''
    },{
      id: null,
      serviceType: 2,
      standard: '2、根据设备情况、进行部分零件拆解、清洗、修复。对各紧固零件进行检查、修复,各部配合间隙进行适当调整。',
      level: '一、二级',
      conclusion: '',
      rectificationMeasures: ''
    },{
      id: null,
      serviceType: 3,
      standard: '3、清洗毛毡、油线、滤油器;清理油路、管道、加足润滑油和润滑脂,补齐各种缺欠,保持无黄袍。',
      level: '一、二级',
      conclusion: '',
      rectificationMeasures: ''
    },{
      id: null,
      serviceType: 4,
      standard: '4、对设备所有二操纵机构,各种挡铁、限位开关调修至灵敏可靠,将各种防尘、防屑、装置清洗修复至完整好用。',
      level: '一、二级',
      conclusion: '',
      rectificationMeasures: ''
    },{
      id: null,
      serviceType: 5,
      standard: '5、各润滑部位进行全部清洗,结合换油周期进行换油,油质油量符合要求。',
      level: '二级',
      conclusion: '',
      rectificationMeasures: ''
    },{
      id: null,
      serviceType: 6,
      standard: '6、检查设备的技术状况,调整安装水平,根据设备的使用情况进行全部或部分解体检查、清洗,调整各部分的配合精度。',
      level: '二级',
      conclusion: '',
      rectificationMeasures: ''
    },{
      id: null,
      serviceType: 7,
      standard: '7、修复或更换磨损部件、零件,并为下一次二保或大修做好备件资料准备。',
      level: '二级',
      conclusion: '',
      rectificationMeasures: ''
    },{
      id: null,
      serviceType: 8,
      standard: '8、零部件完整,随机附件基本齐全并保管好。',
      level: '二级',
      conclusion: '',
      rectificationMeasures: ''
    }
  ],
  formRules:{
    companyId: [{ required: true, message: '请选择企业', trigger: 'blur' }],
    deviceName: [{ required: true, message: '请填写设备名称', trigger: 'blur' }],
    deviceNumber: [{ required: true, message: '请填写设备编号', trigger: 'blur' }],
    number: [{ 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 objectSpanMethod = ({row, column, rowIndex, columnIndex,}) => {
  if (columnIndex === 0) {
    if (rowIndex === 0) {
      return {
        rowspan: state.maintainList.length,
        colspan: 1
      }
    } else {
      return {
        rowspan: 0,
        colspan: 0
      }
    }
  }
}
const onSubmit = async () => {
  const valid = await superRef.value.validate();
  if(valid){
    const data = JSON.parse(JSON.stringify(state.form))
    data.operatorsOne = data.operatorsOne.map(i=>{
      return {
        id: i.id || null,
        annualMaintenanceServiceId: i.annualMaintenanceServiceId || null,
        userId: i.userId,
        userName: i.name,
        userType: 1,
        checkDate: data.operateDateOne
      }
    })
    data.checkersOne = data.checkersOne.map(i=>{
      return {
        id: i.id || null,
        annualMaintenanceServiceId: i.annualMaintenanceServiceId || null,
        userId: i.userId,
        userName: i.name,
        userType: 2,
        checkDate: data.checkDateOne
      }
    })
    data.operatorsTwo = data.operatorsTwo.map(i=>{
      return {
        id: i.id || null,
        annualMaintenanceServiceId: i.annualMaintenanceServiceId || null,
        userId: i.userId,
        userName: i.name,
        userType: 3,
        checkDate: data.operateDateTwo
      }
    })
    data.checkersTwo = data.checkersTwo.map(i=>{
      return {
        id: i.id || null,
        annualMaintenanceServiceId: i.annualMaintenanceServiceId || null,
        userId: i.userId,
        userName: i.name,
        userType: 4,
        checkDate: data.checkDateTwo
      }
    })
    data.annualMaintenanceServiceUserList = [...data.operatorsOne,...data.checkersOne,...data.operatorsTwo,...data.checkersTwo]
    data.delServiceUserIds = state.oldServiceUsers.filter(i =>!data.annualMaintenanceServiceUserList.some(item=>item.id == i.id)).map(i=>i.id)
    data.annualMaintenanceServiceContentList = state.maintainList.map(item=>{
      return {
        id: item.id,
        serviceType: item.serviceType,
        conclusion: item.conclusion,
        rectificationMeasures: item.rectificationMeasures
      }
    })
    delete data.operatorsOne
    delete data.checkersOne
    delete data.operatorsTwo
    delete data.checkersTwo
    delete data.operateDateOne
    delete data.checkDateOne
    delete data.operateDateTwo
    delete data.checkDateTwo
    if(state.title == '新增'){
      delete data.id
      const res = await updateMaintenanceService(data)
      if(res.code == 200){
        ElMessage.success(res.message)
        emit('getList')
        handleClose()
        dialogVisible.value = false;
      }else{
        ElMessage.warning(res.message)
      }
    }else{
      const res = await updateMaintenanceService(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 getMaintenanceServiceDetail({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.annualMaintenanceServiceUserList?.map(item=>{
      return {
        id: item.id,
        annualMaintenanceServiceId: item.annualMaintenanceServiceId,
        userId: item.userId,
        name: item.userName,
        userType: item.userType,
        checkDate: item.checkDate.substring(0,10)
      }
    })
    state.form.operatorsOne = state.oldServiceUsers.filter(i=>i.userType == 1)
    state.form.checkersOne = state.oldServiceUsers.filter(i=>i.userType == 2)
    state.form.operatorsTwo = state.oldServiceUsers.filter(i=>i.userType == 3)
    state.form.checkersTwo = state.oldServiceUsers.filter(i=>i.userType == 4)
    state.form.operateDateOne = state.form.operatorsOne[0].checkDate || ''
    state.form.checkDateOne = state.form.checkersOne[0].checkDate || ''
    state.form.operateDateTwo = state.form.operatorsTwo[0].checkDate || ''
    state.form.checkDateTwo = state.form.checkersTwo[0].checkDate || ''
    state.maintainList = state.maintainList.map(item=>{
      return {
        id: state.form.annualMaintenanceServiceContentList.find(i=>i.serviceType == item.serviceType)?.id,
        serviceType: item.serviceType,
        standard: item.standard,
        level: item.level,
        conclusion: state.form.annualMaintenanceServiceContentList.find(i=>i.serviceType == item.serviceType)?.conclusion,
        rectificationMeasures: state.form.annualMaintenanceServiceContentList.find(i=>i.serviceType == item.serviceType)?.rectificationMeasures,
      }
    })
  }else{
    ElMessage.warning(res.message)
  }
}
const getDeptList = async ()=>{
  state.form.operatorsOne = []
  state.form.checkersOne = []
  state.form.operatorsTwo = []
  state.form.checkersTwo = []
  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: '',
    number: '',
    annualMaintenanceServiceContentList: [],
    annualMaintenanceServiceUserList: [],
    conclusion: '',
    operatorsOne: [],
    operateDateOne: '',
    checkersOne: [],
    checkDateOne: '',
    operatorsTwo: [],
    operateDateTwo: '',
    checkersTwo: [],
    checkDateTwo: '',
    delServiceUserIds: []
  }
  state.maintainList = state.maintainList.map(i=>{
    return {
      serviceType: i.serviceType,
      standard: i.standard,
      level: i.level,
      conclusion: '',
      rectificationMeasures: ''
    }
  })
  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{
  .el-table__cell{
    padding: 2px 0 !important;
    font-size: 14px !important;
  }
  .cell{
    padding: 0 2px !important;
    font-size: 14px !important;
  }
}
</style>
src/views/work/qualityInfo/infrastructureMng/maintainRecord/index.vue
对比新文件
@@ -0,0 +1,234 @@
<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="设备名称"></el-table-column>
      <el-table-column prop="deviceNumber" 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";
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 getMaintenanceServiceList(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 getMaintenanceServiceDetail({id: val.id})
  if(res.code == 200){
    if(res.data){
      let tableData = res.data
      if(Array.isArray(tableData.annualMaintenanceServiceUserList) && tableData.annualMaintenanceServiceUserList.length>0){
        const serviceUsers = tableData.annualMaintenanceServiceUserList?.map(item=>{
          return {
            ...item,
            checkDate: item.checkDate.substring(0,10)
          }
        })
        tableData.operatorsOneNames = serviceUsers.filter(i=>i.userType == 1).map(i=>i.userName).join(',')
        tableData.checkersOneNames = serviceUsers.filter(i=>i.userType == 2).map(i=>i.userName).join(',')
        tableData.operatorsTwoNames = serviceUsers.filter(i=>i.userType == 3).map(i=>i.userName).join(',')
        tableData.checkersTwoNames = serviceUsers.filter(i=>i.userType == 4).map(i=>i.userName).join(',')
        tableData.operateDateOne = serviceUsers.find(i=>i.userType == 1).checkDate || ''
        tableData.checkDateOne = serviceUsers.find(i=>i.userType == 2).checkDate || ''
        tableData.operateDateTwo = serviceUsers.find(i=>i.userType == 3).checkDate || ''
        tableData.checkDateTwo = serviceUsers.find(i=>i.userType == 4).checkDate || ''
      }else{
        tableData.operatorsOneNames = ''
        tableData.checkersOneNames = ''
        tableData.operatorsTwoNames = ''
        tableData.checkersTwoNames = ''
        tableData.operateDateOne = ''
        tableData.checkDateOne = ''
        tableData.operateDateTwo = ''
        tableData.checkDateTwo = ''
      }
      if(data.isAdmin){
        tableData.companyName = data.companyList.find(i=>i.id == val.companyId)?.name
      }else{
        tableData.companyName = userStore.companyName
      }
      for(let i = 0; i < 8; i++){
        const num = Number(i) + 1
        if(tableData.annualMaintenanceServiceContentList.find(i=>i.serviceType == num)){
          tableData['col' + num] = tableData.annualMaintenanceServiceContentList.find(i=>i.serviceType == num).conclusion
          tableData['act' + num] = tableData.annualMaintenanceServiceContentList.find(i=>i.serviceType == num).rectificationMeasures
        }else{
          tableData['col' + num] = ''
          tableData['act' + num] = ''
        }
      }
      try {
        generateWordDocument('/maintainRecord.docx', tableData, tableData.companyName + '保养记录表.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 delMaintenanceService({id: val.id})
        if(res.code == 200){
          ElMessage.success('数据删除成功')
          await getList()
        }else{
          ElMessage.warning(res.message)
        }
      })
}
</script>
src/views/work/qualityInfo/infrastructureMng/repairRecord/components/editDialog.vue
对比新文件
@@ -0,0 +1,463 @@
<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="8">
            <el-form-item label="设备名称:" prop="deviceName">
              <el-input v-model.trim="state.form.deviceName" :disabled="state.title =='查看'"></el-input>
            </el-form-item>
          </el-col>
          <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="formNumber">
              <el-input v-model.trim="state.form.formNumber" :disabled="state.title =='查看'"></el-input>
            </el-form-item>
          </el-col>
        </el-row>
        <el-row>
          <el-col :span="12">
            <el-form-item label="故障发生日期:" prop="faultDate">
              <el-date-picker
                  v-model="state.form.faultDate"
                  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="repairDate">
              <el-date-picker
                  v-model="state.form.repairDate"
                  type="date"
                  value-format="YYYY-MM-DD"
                  placeholder="请选择要求维修日期"
                  :disabled="state.title =='查看'"
                  style="width: 100%"
              />
            </el-form-item>
          </el-col>
        </el-row>
        <el-form-item label="故障现象:" prop="failurePhenomenon">
          <el-input v-model.trim="state.form.failurePhenomenon" type="textarea" :autosize="{ minRows: 2 }" :readonly="state.title =='查看'"></el-input>
        </el-form-item>
        <el-row>
          <el-col :span="12">
            <el-form-item label="设施操作/管理员:" prop="maintainUsers">
              <el-select clearable v-model="state.form.maintainUsers" :disabled="state.title =='查看'" value-key="userId" filterable multiple placeholder="设施操作/管理员" style="width: 100%">
                <el-option
                    v-for="item in state.userList"
                    :key="item.userId"
                    :label="item.name"
                    :value="item"
                />
              </el-select>
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="主管:" prop="managerId">
              <el-select clearable v-model="state.form.managerId" :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-item label="故障原因及排除方法:" prop="faultCause">
          <el-input v-model.trim="state.form.faultCause" type="textarea" :autosize="{ minRows: 2 }" :readonly="state.title =='查看'"></el-input>
        </el-form-item>
        <el-row>
          <el-col :span="12">
            <el-form-item label="维修方式:" prop="maintenanceMethod">
              <el-radio-group v-model="state.form.maintenanceMethod" :disabled="state.title =='查看'">
                <el-radio :label="1">内部维修</el-radio>
                <el-radio :label="2">委外维修</el-radio>
              </el-radio-group>
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="委外地点:" prop="outsourcingLocation">
              <el-input v-model.trim="state.form.outsourcingLocation" :disabled="state.title =='查看'"></el-input>
            </el-form-item>
          </el-col>
        </el-row>
        <el-row>
          <el-col :span="12">
            <el-form-item label="维修工时:" prop="repairTime">
              <el-input v-model.trim="state.form.repairTime" :disabled="state.title =='查看'"></el-input>
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="停机时间:" prop="downTime">
              <el-date-picker
                  v-model="state.form.downTime"
                  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="replaceMaterials">
              <el-input v-model.trim="state.form.replaceMaterials" :disabled="state.title =='查看'"></el-input>
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="金额(元):" prop="money">
              <el-input v-model.trim="state.form.money" :disabled="state.title =='查看'"></el-input>
            </el-form-item>
          </el-col>
        </el-row>
        <el-row>
          <el-col :span="12">
            <el-form-item label="维修员:" prop="repairUsers">
              <el-select clearable v-model="state.form.repairUsers" :disabled="state.title =='查看'" value-key="userId" filterable multiple placeholder="维修员" style="width: 100%">
                <el-option
                    v-for="item in state.userList"
                    :key="item.userId"
                    :label="item.name"
                    :value="item"
                />
              </el-select>
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="设备科主管:" prop="deviceManagerId">
              <el-select clearable v-model="state.form.deviceManagerId" :disabled="state.title =='查看'" filterableplaceholder="设备科主管" 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-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-item label="设施管理部门验收确认:" prop="acceptanceConfirmation">
          <el-input v-model.trim="state.form.acceptanceConfirmation" type="textarea" :autosize="{ minRows: 2 }" :readonly="state.title =='查看'"></el-input>
        </el-form-item>
        <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-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-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-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";
const emit = defineEmits(["getList"]);
const dialogVisible = ref(false)
const superRef = ref()
const state = reactive({
  title: '',
  form: {
    id: null,
    deviceName: '',
    number: '',
    formNumber: '',
    faultDate: '',
    repairDate: '',
    failurePhenomenon: '',
    maintainUsers: [],
    managerId: null,
    managerName: '',
    faultCause: '',
    maintenanceMethod: null,
    outsourcingLocation: '',
    repairTime: '',
    downTime: '',
    replaceMaterials: '',
    money: '',
    repairUsers: [],
    annualMaintenanceRecordUsers: [],
    deviceManagerId: null,
    deviceManagerName: '',
    remark: '',
    acceptanceConfirmation: '',
    establishmentId: null,
    processId: null,
    approvalId: null,
    companyId: null
  },
  formRules:{
    companyId: [{ required: true, message: '请选择企业', trigger: 'blur' }],
    deviceName: [{ required: true, message: '请填写设备名称', trigger: 'blur' }],
    number: [{ required: true, message: '请填写编号',  trigger: 'blur' }],
    formNumber: [{ required: true, message: '请填写表单编号',  trigger: 'blur' }],
    faultDate: [{ required: true, message: '请选择故障发生日期',  trigger: 'blur' }],
    repairDate: [{ required: true, message: '请选择要求维修日期',  trigger: 'blur' }],
    failurePhenomenon: [{ required: true, message: '请填写故障现象',  trigger: 'blur' }],
    maintainUsers: [{ required: true, message: '请选择设施操作/管理员',  trigger: 'blur' }],
    managerId: [{ required: true, message: '请选择主管',  trigger: 'blur' }],
    faultCause: [{ required: true, message: '请填写故障原因及排除方法',  trigger: 'blur' }],
    maintenanceMethod: [{ required: true, message: '请选择维修方式',  trigger: 'blur' }],
    establishmentId: [{ required: true, message: '请选择编制人',  trigger: 'blur' }],
    processId: [{ required: true, message: '请选择审核人',  trigger: 'blur' }],
    approvalId: [{ required: true, message: '请选择批准人',  trigger: 'blur' }]
  },
  isAdmin: false,
  companyList: [],
  oldRecordUsers: [],
  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){
    const data = JSON.parse(JSON.stringify(state.form))
    data.maintainUsers = data.maintainUsers.map(i=>{
      return {
        id: i.id || null,
        annualMaintenanceRecordId: i.annualMaintenanceRecordId || null,
        userId: i.userId,
        userName: i.name,
        userType: 1
      }
    })
    data.repairUsers = data.repairUsers.map(i=>{
      return {
        id: i.id || null,
        annualMaintenanceRecordId: i.annualMaintenanceRecordId || null,
        userId: i.userId,
        userName: i.name,
        userType: 2
      }
    })
    data.annualMaintenanceRecordUsers = data.maintainUsers.concat(data.repairUsers)
    data.managerName = state.userList.find(i=>i.userId == data.managerId)?.name
    data.deviceManagerName = state.userList.find(i=>i.userId == data.deviceManagerId)?.name
    data.establishmentName = state.userList.find(i=>i.userId == data.establishmentId)?.name
    data.processName = state.userList.find(i=>i.userId == data.processId)?.name
    data.approvalName = state.userList.find(i=>i.userId == data.approvalId)?.name
    data.delRecordUserIds = state.oldRecordUsers.filter(oldItem => !data.annualMaintenanceRecordUsers.some(newItem => newItem.id === oldItem.id)).map(item => item.id)
    delete data.maintainUsers
    delete data.repairUsers
    if(state.title == '新增'){
      delete data.id
      const res = await updateMaintenanceRecord(data)
      if(res.code == 200){
        ElMessage.success(res.message)
        emit('getList')
        handleClose()
        dialogVisible.value = false;
      }else{
        ElMessage.warning(res.message)
      }
    }else{
      const res = await updateMaintenanceRecord(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 getMaintenanceRecordDetail({id: id})
  if(res.code == 200){
    Object.keys(state.form).forEach(key => {
      if (key in res.data) {
        state.form[key] = res.data[key]
      }
    })
    state.oldRecordUsers = state.form.annualMaintenanceRecordUsers?.map(item=>{
      return {
        id: item.id,
        annualMaintenanceRecordId: item.annualMaintenanceRecordId,
        userId: item.userId,
        name: item.userName,
        userType: item.userType
      }
    })
    state.form.maintainUsers = state.oldRecordUsers.filter(i=>i.userType == 1)
    state.form.repairUsers = state.oldRecordUsers.filter(i=>i.userType == 2)
  }else{
    ElMessage.warning(res.message)
  }
}
const getDeptList = async ()=>{
  state.form.maintainUsers = []
  state.form.managerId = null
  state.form.repairUsers = []
  state.form.annualMaintenanceRecordUsers = []
  state.form.deviceManagerId = null
  state.form.establishmentId = null
  state.form.processId = null
  state.form.approvalId = 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,
    deviceName: '',
    number: '',
    formNumber: '',
    faultDate: '',
    repairDate: '',
    failurePhenomenon: '',
    maintainUsers: [],
    managerId: null,
    faultCause: '',
    maintenanceMethod: null,
    outsourcingLocation: '',
    repairTime: '',
    downTime: '',
    replaceMaterials: '',
    money: '',
    repairUsers: [],
    annualMaintenanceRecordUsers: [],
    deviceManagerId: null,
    deviceManagerName: '',
    remark: '',
    acceptanceConfirmation: '',
    establishmentId: null,
    processId: null,
    approvalId: null,
    companyId: null
  }
  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/qualityInfo/infrastructureMng/repairRecord/index.vue
对比新文件
@@ -0,0 +1,235 @@
<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="设备名称"></el-table-column>
      <el-table-column prop="failurePhenomenon" align="center" label="故障现象"></el-table-column>
      <el-table-column prop="faultCause" align="center" label="故障原因及排除方法"></el-table-column>
      <el-table-column prop="faultDate" align="center" label="故障发生日期">
        <template #default="scope">
          {{scope.row.faultDate.substring(0,10)}}
        </template>
      </el-table-column>
      <el-table-column prop="repairDate" align="center" label="要求维修日期">
        <template #default="scope">
          {{scope.row.repairDate.substring(0,10)}}
        </template>
      </el-table-column>
      <el-table-column prop="manageName" align="center" label="设施操作/管理员"></el-table-column>
      <el-table-column prop="managerName" align="center" label="主管"></el-table-column>
<!--      <el-table-column label="检查表" align="center">-->
<!--        <template #default="scope">-->
<!--          {{scope.row.deptName }}内审检查表-->
<!--        </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";
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 getMaintenanceRecordList(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)=>{
  const res = await getMaintenanceRecordDetail({id: val.id})
  if(res.code == 200){
    if(res.data){
      let tableData = res.data
      tableData.maintainUsers = tableData.annualMaintenanceRecordUsers.filter(i=>i.userType == 1)?.map(i=>i.userName).join('、')
      tableData.repairUsers = tableData.annualMaintenanceRecordUsers.filter(i=>i.userType == 2)?.map(i=>i.userName).join('、')
      tableData.faultDate = tableData.faultDate.substring(0,10)
      tableData.repairDate = tableData.repairDate.substring(0,10)
      tableData.downTime = tableData.downTime.substring(0,10)
      tableData.typeList = [
        {
          id: 1,
          label: '内部维修',
          checked: tableData.maintenanceMethod == 1 ? false : true
        },
        {
          id: 2,
          label: '委外维修',
          checked: tableData.maintenanceMethod == 2 ? false : true
        }
      ]
      if(data.isAdmin){
        tableData.companyName = data.companyList.find(i=>i.id == val.companyId)?.name
      }else{
        tableData.companyName = userStore.companyName
      }
      try {
        generateWordDocument('/repairRecord.docx', tableData, tableData.companyName + '基础设施维修记录.docx');
      } catch (error){
        ElMessage({
          type: 'warning',
          message: '导出失败'
        });
      }
    }else{
      ElMessage.warning('暂无数据')
    }
  }else{
    ElMessage.warning(res.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 delMaintenanceRecord({id: val.id})
        if(res.code == 200){
          ElMessage.success('数据删除成功')
          await getList()
        }else{
          ElMessage.warning(res.message)
        }
      })
}
</script>
src/views/work/qualityInfo/infrastructureMng/reviewRecordStatistics/components/editDialog.vue
对比新文件
@@ -0,0 +1,426 @@
<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="8">
            <el-form-item label="制定日期:" prop="enactmentDate">
              <el-date-picker
                  v-model="state.form.enactmentDate"
                  type="date"
                  value-format="YYYY-MM-DD"
                  placeholder="请选择日期"
                  :disabled="state.title =='查看'"
              />
            </el-form-item>
          </el-col>
          <el-col :span="8">
            <el-form-item label="修订日期:" prop="revisionDate">
              <el-date-picker
                  v-model="state.form.revisionDate"
                  type="date"
                  value-format="YYYY-MM-DD"
                  placeholder="请选择日期"
                  :disabled="state.title =='查看'"
              />
            </el-form-item>
          </el-col>
          <el-col :span="8">
            <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-form-item label="设备属性:" prop="annualMaintenanceEvaluateDeviceList">
          <el-button
              type="primary"
              plain
              icon="Plus"
              @click="addLine"
              style="margin-bottom: 10px"
          >新增</el-button>
        </el-form-item>
        <el-table :data="state.form.annualMaintenanceEvaluateDeviceList" class="customedTable" :border="true">
          <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="location" align="center">
            <template #default="scope">
              <el-input
                  v-model.trim="scope.row.location"
                  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="设备使用部门" prop="deptName" align="center">
            <template #default="scope">
              <el-input
                  v-model.trim="scope.row.deptName"
                  size="large"
                  type="textarea"
                  style="width: 100%;"
                  clearable
                  :readonly="state.title =='查看'"
              >
              </el-input>
            </template>
          </el-table-column>
          <el-table-column label="抽查结果" prop="resultType" align="center">
            <template #default="scope">
              <el-select v-model="scope.row.resultType" :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>
            </template>
          </el-table-column>
          <el-table-column label="操作" align="center" width="70">
            <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="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-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-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-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";
const emit = defineEmits(["getList"]);
const dialogVisible = ref(false)
const superRef = ref()
const checkList = (rule, value, callback) => {
  if (state.form.annualMaintenanceEvaluateDeviceList.length == 0) {
    callback(new Error('设备属性不可为空'))
  } else {
    callback()
  }
}
const state = reactive({
  title: '',
  form: {
    id: null,
    companyId: null,
    enactmentDate: '',
    revisionDate: '',
    number: '',
    annualMaintenanceEvaluateDeviceList: [],
    establishmentId: null,
    establishmentName: '',
    processId: null,
    processName: '',
    approvalId: null,
    approvalName: '',
    evaluateDeviceIds: [],
    name: ''
  },
  oldDeviceList: [],
  formRules:{
    companyId: [{ required: true, message: '请选择企业', trigger: 'blur' }],
    enactmentDate: [{ required: true, message: '请选择指定日期', trigger: 'blur' }],
    revisionDate: [{ required: true, message: '请选择修订日期', trigger: 'blur' }],
    number: [{ required: true, message: '请填写编号',  trigger: 'blur' }],
    annualMaintenanceEvaluateDeviceList: [{ required: true, validator: checkList, trigger: 'blur' }],
    establishmentId: [{ required: true, message: '请选择编制人', trigger: 'blur' }],
    processId: [{ 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 addLine = () => {
  const obj = {
    id: null,
    annualMaintenanceEvaluateId: null,
    deviceNumber: '',
    deviceName: '',
    model: '',
    location: '',
    useUser: '',
    deptName: '',
    resultType: null
  }
  state.form.annualMaintenanceEvaluateDeviceList.push(obj);
}
const handleDelete = (i) =>{
  state.form.annualMaintenanceEvaluateDeviceList = state.form.annualMaintenanceEvaluateDeviceList.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.evaluateDeviceIds = state.oldDeviceList.filter(i =>!data.annualMaintenanceEvaluateDeviceList.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
    data.approvalName = state.userList.find(i=>i.userId == data.approvalId)?.name
    data.name = data.enactmentDate + '设备完好性评价记录及完好率统计表'
    if(state.title == '新增'){
      delete data.id
      const res = await updateMaintenanceEvaluate(data)
      if(res.code == 200){
        ElMessage.success(res.message)
        emit('getList')
        handleClose()
        dialogVisible.value = false;
      }else{
        ElMessage.warning(res.message)
      }
    }else{
      const res = await updateMaintenanceEvaluate(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 getMaintenanceEvaluateDetail({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.annualMaintenanceEvaluateDeviceList = res.data.annualMaintenanceEvaluateDeviceList?.map(item=>{
      return {
        id: item.id,
        annualMaintenanceEvaluateId: item.annualMaintenanceEvaluateId,
        deviceNumber: item.deviceNumber,
        deviceName: item.deviceName,
        model: item.model,
        location: item.location,
        useUser: item.useUser,
        deptName: item.deptName,
        resultType: item.resultType
      }
    })
    state.oldDeviceList = state.form.annualMaintenanceEvaluateDeviceList
  }else{
    ElMessage.warning(res.message)
  }
}
const getDeptList = async ()=>{
  state.form.establishmentId = null
  state.form.processId = null
  state.form.approvalId = 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,
    enactmentDate: '',
    revisionDate: '',
    number: '',
    annualMaintenanceEvaluateDeviceList: [],
    establishmentId: null,
    establishmentName: '',
    processId: null,
    processName: '',
    approvalId: null,
    approvalName: '',
    evaluateDeviceIds: [],
    name: ''
  }
  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/qualityInfo/infrastructureMng/reviewRecordStatistics/index.vue
对比新文件
@@ -0,0 +1,207 @@
<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="companyName" align="center" label="公司名称" v-if="isAdmin"></el-table-column>
      <el-table-column prop="enactmentDate" align="center" label="名称">
        <template #default="scope">
          {{scope.row.enactmentDate.substring(0,10) + '设备完好性评价记录及完好率统计表'}}
        </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";
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 getMaintenanceEvaluateList(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 getMaintenanceEvaluateDetail({id: val.id})
  if(res.code == 200){
    if(res.data){
      let tableData = res.data
      tableData.table = res.data.annualMaintenanceEvaluateDeviceList.map((item,index)=>{
        return {
          ...item,
          index: index + 1,
          isWell: item.resultType == 1 ? '√' : '',
          isFix: item.resultType == 2 ? '√' : '',
          isCrap: item.resultType == 3 ? '√' : ''
        }
      })
      tableData.deviceCount = tableData.table.length
      tableData.enactmentDate = tableData.enactmentDate.substring(0,10)
      tableData.revisionDate = tableData.revisionDate.substring(0,10)
      if(data.isAdmin){
        tableData.companyName = data.companyList.find(i=>i.id == val.companyId)?.name
      }else{
        tableData.companyName = userStore.companyName
      }
      try {
        generateWordDocument('/reviewRecordStatistic.docx', tableData, tableData.enactmentDate +'设备完好性评价记录及完好率统计表.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 delMaintenanceEvaluate({id: val.id})
        if(res.code == 200){
          ElMessage.success('数据删除成功')
          await getList()
        }else{
          ElMessage.warning(res.message)
        }
      })
}
</script>