Newer
Older
xc-business-system / src / views / workbench / components / eqptManage.vue
<!-- 受检设备管理 -->
<script lang="ts" setup name="EqptManage">
import { ElMessage } from 'element-plus'
import dayjs from 'dayjs'
import { getDictByCode } from '@/api/system/dict'
import type { deptType, dictType } from '@/global'
import { getDeptMeasureList, getTaskList } from '@/api/business/manager/task'
import useUserStore from '@/store/modules/user'
const user = useUserStore() // 用户信息
const $router = useRouter()
const loading = ref(false)
const labCode = ref('') // 实验室
const groupCode = ref('') as any // 部门
const isAdministrator = ref('0') // 是不是超级管理员
const showEmpty = ref(false)
const emptyDisc = ref('') // 描述文字
const columns = ref([
  { text: '设备名称', value: 'sampleName', align: 'center' },
  { text: '规格型号', value: 'sampleModel', align: 'center' },
  { text: '出厂编号', value: 'manufactureNo', align: 'center' },
  { text: '送检时间', value: 'realDeliverTime', align: 'center', width: '120' },
  { text: '要求检完时间', value: 'requireOverTime', align: 'center', width: '120' },
]) as any
const columns_distributed = [
  { text: '设备名称', value: 'sampleName', align: 'center' },
  { text: '规格型号', value: 'sampleModel', align: 'center' },
  { text: '出厂编号', value: 'manufactureNo', align: 'center' },
  { text: '送检时间', value: 'realDeliverTime', align: 'center', width: '120' },
  { text: '要求检完时间', value: 'requireOverTime', align: 'center', width: '120' },
]

const columns_measure = [
  { text: '设备名称', value: 'sampleName', align: 'center' },
  { text: '规格型号', value: 'sampleModel', align: 'center' },
  { text: '出厂编号', value: 'manufactureNo', align: 'center' },
  // { text: '送检时间', value: 'realDeliverTime', align: 'center', width: '120' },
  { text: '要求检完时间', value: 'requireOverTime', align: 'center', width: '120' },
]

const distributedEquipmentCount = ref('-') // 待分发设备数量
const measureEquipmentCount = ref('-') // 待检设备数量
const overdueEquipmentCount = ref('-') // 超期未检设备数量
const distributedList = ref([]) // 待分发检设备数量
const measureList = ref([]) // 待检设备数量
const overdueList = ref([]) // 超期未检设备数量
// -------------------------------------标签--------------------------------------------------
const radioMenus = ref([ // 标签内容
  { name: '待分发列表', value: 'distributed' },
  { name: '待检列表', value: 'measure' },
  { name: '超期未检列表', value: 'overdue' },
])
const current = ref('') // 选择的tab 默认基本信息
// ------------------------------------------字典----------------------------------------------
const groupCodeList = ref([]) as any // 部门
const labCodeList = ref<dictType[]>([]) // 实验室

/**
 * 获取字典
 */
function getDict() {
  // 部门
  getDictByCode('bizGroupCode').then((response) => {
    const tempMenu = ['电学电源组', '热工力学组', '无线电脉冲组']
    tempMenu.forEach((item) => {
      const tempFindData = response.data.find((e: { name: string; value: string }) => e.name === item)
      if (tempFindData) {
        groupCodeList.value.push({
          name: tempFindData.name,
          id: `${tempFindData.id}`,
          value: `${tempFindData.value}`,
        })
      }
    })
    groupCodeList.value.unshift({
      id: 'A',
      name: '全部',
      value: 'A',
    })
  })

  // 实验室
  getDictByCode('bizLabCode').then((response) => {
    labCodeList.value = response.data
  })
}
getDict()

// -------------------------------------数据--------------------------------------------------------
// ============待分发、已超期列表=====来源于任务分发=======
const listQueryDistributed = ref({
  sampleNo: '', // 样品编号
  sampleName: '', // 样品名称
  orderNo: '', // 委托书编号
  customerNo: '', // 委托方代码
  customerName: '', // 委托方名称
  isUrgent: '', // 是否加急
  sampleBelong: '', // 样品属性
  startTime: '', // 应检完时间-开始
  endTime: '', // 应检完时间-结束
  sampleStatus: '2', // 样品状态:默认待分发
  groupCode: '', // 实验室部门
  labCode: '', // 实验室
  offset: 1,
  limit: 99999999,
})

/**
 * 查询待分发和已超期列表
 * @param type 查询类型 distributed待分发   overdue已超期
 */
function fetchDistributedData(type: 'distributed' | 'overdue') {
  listQueryDistributed.value.sampleStatus = type === 'distributed' ? '2' : '8'
  listQueryDistributed.value.labCode = labCode.value === 'A' ? null : labCode.value as any
  listQueryDistributed.value.groupCode = groupCode.value === 'A' ? null : groupCode.value
  loading.value = true
  getTaskList(listQueryDistributed.value).then((response) => {
    const tempList = response.data.rows.map((item: { realDeliverTime: string; requireOverTime: string }) => {
      return {
        ...item,
        realDeliverTime: item.realDeliverTime ? dayjs(item.realDeliverTime).format('YYYY-MM-DD') : item.realDeliverTime,
        requireOverTime: item.requireOverTime ? dayjs(item.requireOverTime).format('YYYY-MM-DD') : item.requireOverTime,
      }
    })
    if (type === 'distributed') { // 待分发
      distributedList.value = tempList
      distributedEquipmentCount.value = response.data.total
    }
    else { // 已超期
      overdueList.value = tempList
      overdueEquipmentCount.value = response.data.total
    }
    loading.value = false
  })
}

// =================待检测(来源于实验室待检测设备)============
const listQueryMeasure = ref({
  customerName: '', //	委托方名称
  customerNo: '', //	委托方编号
  helpInstruction: '', //	辅助字段
  isUrgent: '', //	是否加急(1是0否null全部)
  manufactureNo: '', //	出厂编号
  manufacturer: '', //	生产厂家
  model: '', //	规格型号
  orderNo: '', //	任务单编号
  sampleName: '', //	受检设备名称
  sampleNo: '', //	样品编号
  startTime: '', //	要求检完时间开始
  endTime: '', //	要求检完时间结束
  measureStatus: '2', // 检测状态 2 待检测
  measureValidDateStart: '', //	检定有效期开始
  measureValidDateEnd: '', //	检定有效期结束
  meterIdentify: '', // 计量标识
  traceDateStart: '', //	测试、校准或检定日期开始
  traceDateEnd: '', //	测试、校准或检定日期结束
  restrictionInstruction: '', // 限用说明
  conclusion: '', // 结论
  groupCode: '', // 实验室部门
  labCode: '', // 实验室
  glStaff: '0', // 是否为综合管理组人员1/0
  offset: 1,
  limit: 99999999,
})

// 数据查询
function fetchMeasureData() {
  listQueryMeasure.value.glStaff = user.groupNo === 'GL' ? '1' : '0'
  listQueryMeasure.value.labCode = labCode.value === 'A' ? null : labCode.value as any
  listQueryMeasure.value.groupCode = groupCode.value === 'A' ? null : groupCode.value
  loading.value = true
  getDeptMeasureList(listQueryMeasure.value).then((res) => {
    measureList.value = res.data.rows.map((item: any) => {
      return {
        ...item,
        realDeliverTime: item.realDeliverTime ? dayjs(item.realDeliverTime).format('YYYY-MM-DD') : item.realDeliverTime,
        requireOverTime: item.requireOverTime ? dayjs(item.requireOverTime).format('YYYY-MM-DD') : item.requireOverTime,
      }
    })
    measureEquipmentCount.value = res.data.total
    loading.value = false
  })
}
// --------------------------------------------钩子-------------------------------------------------
// 改变实验室\部门
const changeSelect = () => {
  if (!showEmpty.value && (isAdministrator.value === '1' || (user.bizLabCode && user.groupNo))) {
    fetchData()
  }
}

function fetchData() {
  fetchDistributedData('distributed')
  fetchDistributedData('overdue')
  fetchMeasureData()
}

const controlMenu = () => {
  if (user.bizLabCode && user.groupNo) {
    if (user.groupNo === 'GL' || isAdministrator.value === '1') {
      radioMenus.value = [ // 标签内容
        { name: '待分发列表', value: 'distributed' },
        { name: '待检列表', value: 'measure' },
        { name: '超期未检列表', value: 'overdue' },
      ]
    }
    else {
      radioMenus.value = [ // 标签内容
        { name: '待检列表', value: 'measure' },
        { name: '超期未检列表', value: 'overdue' },
      ]
    }
  }
  current.value = radioMenus.value[0].value
}

watch(() => current.value, (newValue) => {
  if (newValue === 'measure') {
    columns.value = columns_measure
  }
  else {
    columns.value = columns_distributed
  }
})

onMounted(() => {
  isAdministrator.value = user.roleTips.includes('administrator') ? '1' : '0' // 是否是超级管理员
  console.log('是否是超级管理员', user.roleTips, isAdministrator.value)
  if (isAdministrator.value === '1') { // 超级管理员
    labCode.value = user.bizLabCode || 'A' // 有实验室就默认本人实验室,没有实验室就默认全站
    groupCode.value = 'A' // 超级管理员默认查看全部
    controlMenu()
    fetchData()
  }
  else { // 不是超级管理员
    if (!user.bizLabCode) { // 没有实验室
      emptyDisc.value = '此用户非超级管理员且无实验室,无权限查看'
      showEmpty.value = true
    }
    else if (!user.groupNo) { // 有实验室但没有组
      emptyDisc.value = '此用户非超级管理员且无部门,无权限查看'
      showEmpty.value = true
    }
    else { // 有实验室且有组
      showEmpty.value = false
      if (user.groupNo === 'GL') { // 综合管理组
        labCode.value = user.bizLabCode // 实验室
        // 综合管理组默认查实验室下面的所有数据,不筛选部门
        groupCode.value = 'A'
        // 综合管理组可以查看待分发
      }
      else { // 其他组
        labCode.value = user.bizLabCode // 实验室
        // 其他组默认筛选自己组
        groupCode.value = user.groupNo
      }
      controlMenu()
      fetchData()
    }
  }
})
</script>

<template>
  <el-empty v-show="showEmpty" :description="emptyDisc" />
  <div v-show="!showEmpty" class="workBench-measure-manage">
    <!-- 超级管理员才可以筛选实验室 -->
    <el-select v-model="labCode" :disabled="isAdministrator === '0'" style="width: 130px;position: absolute; top: 5px;right: 150px;" class="short-input" placeholder="实验室" @change="changeSelect">
      <el-option v-for="item in labCodeList" :key="item.id" :label="item.name" :value="item.value" />
    </el-select>
    <!-- 综合管理组才可以筛选部门 -->
    <el-select v-model="groupCode" :disabled="isAdministrator === '0' && user.groupNo !== 'GL'" style="width: 130px;position: absolute; top: 5px;right: 10px;" class="short-input" placeholder="部门" @change="changeSelect">
      <el-option v-for="item in groupCodeList" :key="item.id" :label="item.name" :value="item.value" />
    </el-select>
    <div v-loading="loading" style="display: flex;flex-direction: column;width: 100%;height: 100%;">
      <!-- 核查记录统计 -->
      <div style="height: 40px;display: flex;margin: 16px 0;justify-content: space-around;">
        <div v-show="user.groupNo === 'GL' || isAdministrator === '1'" style="display: flex;margin-right: 20px;">
          <el-icon :size="30" color="#3d7eff">
            <svg-icon name="icon-device" />
          </el-icon>
          <div>
            <div style="font-size: 14px;">
              待分发设备数量
            </div>
            <div style="margin-left: 10px;color: #000;font-weight: 600;">
              {{ distributedEquipmentCount }}
            </div>
          </div>
        </div>
        <div style="display: flex;">
          <el-icon :size="30" color="#ff9a00">
            <svg-icon name="icon-device" />
          </el-icon>
          <div>
            <div style="font-size: 14px;">
              待检设备数量
            </div>
            <div style="margin-left: 10px;color: #000;font-weight: 600;">
              {{ measureEquipmentCount }}
            </div>
          </div>
        </div>
        <div style="display: flex;">
          <el-icon :size="30" color="#df4b44">
            <svg-icon name="icon-device" />
          </el-icon>
          <div>
            <div style="font-size: 14px;">
              超期未检设备数量
            </div>
            <div style="margin-left: 10px;color: #000;font-weight: 600;">
              {{ overdueEquipmentCount }}
            </div>
          </div>
        </div>
      </div>
      <el-radio-group v-model="current" size="small" style="margin-bottom: 10px;">
        <el-radio-button v-for="item in radioMenus" :key="item.value" :label="item.value">
          {{ item.name }}
        </el-radio-button>
      </el-radio-group>
      <el-table
        :data="current === 'distributed' ? distributedList : current === 'measure' ? measureList : overdueList"
        border
        style="width: 100%;height: 100%;"
      >
        <el-table-column align="center" label="序号" width="80" type="index" />
        <el-table-column
          v-for="item in columns"
          :key="item.value"
          :prop="item.value"
          :label="item.text"
          :width="item.width"
          align="center"
          show-overflow-tooltip
        />
      </el-table>
    </div>
  </div>
</template>

<style lang="scss" scoped>
.workBench-measure-manage {
  width: 100%;
  height: 100%;
  overflow: auto;
  box-sizing: border-box;

  .title {
    font-size: 16px;
    padding: 0;
    margin: 0 0 6px;
  }
}
</style>