Newer
Older
xc-business-system / src / views / quality / internal / workManage / components / edit.vue
lyg on 26 Nov 13 KB 内部审核修改bug
<!-- 内部审核工作管理新建 -->
<script name="QualityInternalWorkAdd" lang="ts" setup>
import { ElMessage, type FormInstance, type FormRules, type UploadUserFile, dayjs } from 'element-plus'
import fileList from './fileList.vue'
import { getDictByCode } from '@/api/system/dict'
import { getUserList } from '@/api/system/user'
import { addWork, detailWork } from '@/api/quality/internal/workManage'
import { filterUser } from '@/views/quality/internal/workManage/components/filterUser'
import { getStaffList } from '@/api/resource/register'
import useUserStore from '@/store/modules/user'
import quality from '/public/config/quality.json'
const $route = useRoute()
const $router = useRouter()
const ruleFormRef = ref<FormInstance>() // from组件
const userStore = useUserStore()
// 表单
const ruleForm = ref({
  yearTime: '',
  yearNum: '',
  bizLabCode: '',
  beginTime: '',
  endTime: '',
  commanderId: '', // 质量负责人
  groupLeader: '', // 组长
  teamMembers: [] as any, // 组员
  currentStage: '', // 当前阶段
  internalAuditFiles: [],
  workName: '',
})
// 表单验证规则
const rules = ref<FormRules>({
  yearTime: [{ required: true, message: '年份必选', trigger: ['blur', 'change'] }],
  yearNum: [{ required: true, message: '月份必选', trigger: ['blur', 'change'] }],
  bizLabCode: [{ required: true, message: '实验室必选', trigger: ['blur', 'change'] }],
  beginTime: [{ required: true, message: '开始时间必选', trigger: ['blur', 'change'] }],
  endTime: [{ required: true, message: '结束时间必选', trigger: ['blur', 'change'] }],
  commanderId: [{ required: true, message: '质量负责人必选', trigger: ['blur', 'change'] }],
  groupLeader: [{ required: true, message: '内审组长必选', trigger: ['blur', 'change'] }],
  teamMembers: [{ required: true, message: '内审组员必选', trigger: ['blur', 'change'] }],
})
const labelList = ref<{ id: string; value: string; name: string }[]>()// 实验室代码
const yearList = ref<{ id: string; value: string; name: string }[]>([])// 年度
const monthList = ref<{ id: string; value: string; name: string }[]>([])// 月份
const userList1 = ref<any[]>([]) // 用户列表
const userList2 = ref<any[]>([]) // 用户列表
const userList3 = ref<any[]>([]) // 用户列表
const internalAudit = ref<any[]>([]) // 内审员列表
const currentStageList = ref<{ id: string; value: string; name: string }[]>([])// 当前阶段
// 获取字典
const fetchDict = async () => {
  // 获取实验室代码字典
  getDictByCode('bizLabCode').then((res) => {
    labelList.value = res.data
  })
  // 当前阶段
  getDictByCode('auditManagementFileType').then((res) => {
    currentStageList.value = res.data.filter(item => item.name !== '其他')
  })
  // 循环出最近十年的year
  // 获取当前年份
  const year = new Date().getFullYear() + 5
  for (let i = year; i > year - 10; i--) {
    yearList.value?.push({
      name: String(i),
      value: String(i),
      id: String(i),
    })
  }
  yearList.value?.reverse()
  // 月份
  for (let i = 1; i < 13; i++) {
    monthList.value?.push({
      name: String(i),
      value: String(i),
      id: String(i),
    })
  }
  const res = await getUserList({ limit: 9999, offset: 1 })
  const allUserList = res.data.rows
  // 获取内审员
  getStaffList({ limit: 9999, offset: 1 }).then((res) => {
    internalAudit.value = res.data.rows.filter((item: any) => item.auditorCertificate === 1).map((item: any) => ({
      deptName: item.deptName,
      name: item.staffName,
      id: allUserList.filter(citem => citem.account === item.account)[0]?.id,
    }))
  })
  userList1.value = await filterUser(quality.roleTips['质量负责人'])
  // userList2.value = await filterUser(quality.roleTips['内审组长'])
  userList3.value = await filterUser(quality.roleTips['内审组员'])
  console.log(userList3.value, 'userList3.value')
}
fetchDict()
const fileRef = ref()
// 新建
const createRow = () => {
  const data = {
    ...ruleForm.value,
    internalAuditFiles: fileRef.value.list,
    workName: `${ruleForm.value.yearTime}年第${ruleForm.value.yearNum}次内部审核工作`,
    createId: userStore.id,
    createName: userStore.name,
  }
  if (ruleForm.value.teamMembers.length) {
    data.teamMembers = data.teamMembers.join(',')
  }
  addWork(data).then((res) => {
    ElMessage.success('添加成功')
    $router.go(-1)
  })
}
// 保存按钮
const saveForm = async (formEl: FormInstance | undefined) => {
  if (!formEl) { return }
  await formEl.validate((valid, fields) => {
    if (valid) {
      if ($route.path.includes('create')) {
        createRow()
      }
      // else if ($route.path.includes('update')) {
      //   updateRow()
      // }
    }
  })
}
// 页面挂载
const isShowHandler = ref(true)
onMounted(() => {
  if ($route.path.includes('create')) {
    // console.log('新建')
  }
  else {
    // 获取详情
    detailWork({ id: $route.query.id as string }).then((res) => {
      for (const i in res.data) {
        if (typeof res.data[i] === 'number') {
          res.data[i] = String(res.data[i])
        }
      }
      ruleForm.value = res.data
      if (res.data.teamMembers) {
        ruleForm.value.teamMembers = res.data.teamMembers.split(',')
      }
      else {
        ruleForm.value.teamMembers = []
      }
      // 判断是否展示快捷操作
      // isShowHandler
      isShowHandler.value = new Date(dayjs(ruleForm.value.endTime).format()).getTime() - new Date().getTime() > 0
    })
  }
})
const { proxy } = getCurrentInstance() as any
const btnList = ref([
  {
    name: '创建现场审核计划',
    url: '/internalscene/create?approvalStatusName=全部',
  },
  {
    name: '创建内部审核工作登记表',
    url: '/internalregistration/create?approvalStatusName=全部',
  },
  {
    name: '创建内部审核检查表',
    url: '/internalinspect/create?approvalStatusName=全部',
  },
  {
    name: '创建会议记录',
    url: '/meetinglist/create',
  },
  {
    name: '创建内部不符合项报告',
    url: '/internaldissatisfied/create',
  },
  {
    name: '创建纠正措施处理单',
    url: '/correcthandle/create?approvalStatusName=全部',
  },
  {
    name: '创建预防措施处理单',
    url: '/preventhandle/create',
  },
  {
    name: '创建内部审核报告',
    url: '/internalreport/create?approvalStatusName=全部',
  },
])
const shortcut = (url: string) => {
  $router.push({
    path: url,
    query: {
      data: JSON.stringify(ruleForm.value),
    },
  })
}
</script>

<template>
  <app-container style="overflow: hidden;">
    <detail-page title="内部审核工作管理">
      <template #btns>
        <el-button v-if="$route.path.includes('create')" type="primary" @click="saveForm(ruleFormRef)">
          保存
        </el-button>
        <el-button type="info" @click="() => $router.go(-1)">
          关闭
        </el-button>
      </template>
    </detail-page>
    <detail-block title="">
      <el-form ref="ruleFormRef" :model="ruleForm" :class="$route.path.includes('detail') ? 'isDetail' : ''" :rules="rules" label-position="right" label-width="120px" class="form" :disabled="$route.path.includes('detail')">
        <el-row :gutter="24" class="marg">
          <el-col :span="6">
            <el-form-item label="工作名称" style="display: flex;">
              <el-form-item label="" label-width="0px" prop="yearTime">
                <el-select
                  v-model="ruleForm.yearTime"
                  placeholder="年份"
                  class="short-input"
                  filterable
                  style="width: 80px;"
                >
                  <el-option v-for="item in yearList" :key="item.id" :label="item.name" :value="item.value" />
                </el-select>
                年第
              </el-form-item>
              <el-form-item label="" label-width="0px" prop="yearNum">
                <el-select
                  v-model="ruleForm.yearNum"
                  placeholder="次数"
                  class="short-input"
                  filterable
                  style="width: 80px;"
                >
                  <el-option v-for="item in monthList" :key="item.id" :label="item.name" :value="item.value" />
                </el-select>
                次内部审核
              </el-form-item>
            </el-form-item>
          </el-col>
          <el-col :span="6">
            <el-form-item label="实验室" prop="bizLabCode">
              <el-select
                v-model="ruleForm.bizLabCode"
                placeholder="实验室"
                class="short-input"
                filterable
                style="width: 100%;"
              >
                <el-option v-for="item in labelList" :key="item.id" :label="item.name" :value="item.value" />
              </el-select>
            </el-form-item>
          </el-col>
          <el-col :span="6">
            <el-form-item label="开始时间" prop="beginTime">
              <el-date-picker
                v-model="ruleForm.beginTime"
                type="date"
                style="width: 100%;"
                format="YYYY-MM-DD"
                value-format="YYYY-MM-DD"
                placeholder="开始时间"
              />
            </el-form-item>
          </el-col>
          <el-col :span="6">
            <el-form-item label="结束时间" prop="endTime">
              <el-date-picker
                v-model="ruleForm.endTime"
                type="date"
                style="width: 100%;"
                format="YYYY-MM-DD"
                value-format="YYYY-MM-DD"
                placeholder="结束时间"
              />
            </el-form-item>
          </el-col>
        </el-row>
        <el-row :gutter="24" class="marg">
          <el-col :span="6">
            <el-form-item label="质量负责人" prop="commanderId">
              <!-- <el-input v-model.trim="ruleForm.createUserName" /> -->
              <el-select v-model="ruleForm.commanderId" filterable clearable placeholder="质量负责人" style="width: 100%;">
                <el-option v-for="(item) in userList1" :key="item.id" :label="item.name" :value="item.id">
                  <span style="float: left;">{{ item.name }}</span>
                  <span style="float: right; color: #8492a6; font-size: 13px;">{{ item.deptName }}</span>
                </el-option>
              </el-select>
            </el-form-item>
          </el-col>
          <el-col :span="6">
            <el-form-item label="内审组组长" prop="groupLeader">
              <el-select v-model="ruleForm.groupLeader" filterable clearable placeholder="内审组组长" style="width: 100%;">
                <el-option v-for="(item) in internalAudit" :key="item.id" :label="item.name" :value="item.name">
                  <span style="float: left;">{{ item.name }}</span>
                  <span style="float: right; color: #8492a6; font-size: 13px;">{{ item.deptName }}</span>
                </el-option>
              </el-select>
            </el-form-item>
          </el-col>
          <el-col :span="6">
            <el-form-item label="内审组组员" prop="teamMembers">
              <el-tooltip
                v-if="$route.path.includes('detail')"
                class="box-item"
                effect="dark"
                :content="`${ruleForm.teamMembers ? ruleForm.teamMembers?.join() : ''}`"
                placement="bottom"
              >
                <el-select v-model="ruleForm.teamMembers" multiple filterable clearable placeholder="内审组组员" style="width: 100%;">
                  <el-option v-for="(item) in userList3" :key="item.id" :label="item.name" :value="item.name">
                    <span style="float: left;">{{ item.name }}</span>
                    <span style="float: right; color: #8492a6; font-size: 13px;">{{ item.deptName }}</span>
                  </el-option>
                </el-select>
              </el-tooltip>
              <el-select v-else v-model="ruleForm.teamMembers" multiple filterable clearable placeholder="内审组组员" style="width: 100%;">
                <el-option v-for="(item) in userList3" :key="item.id" :label="item.name" :value="item.name">
                  <span style="float: left;">{{ item.name }}</span>
                  <span style="float: right; color: #8492a6; font-size: 13px;">{{ item.deptName }}</span>
                </el-option>
              </el-select>
            </el-form-item>
          </el-col>
          <el-col :span="6">
            <el-form-item label="当前阶段" prop="currentStage">
              <el-select
                v-model="ruleForm.currentStage"
                placeholder="当前阶段"
                class="short-input"
                style="width: 100%;"
              >
                <el-option v-for="item in currentStageList" :key="item.id" :label="item.name" :value="item.value" />
              </el-select>
            </el-form-item>
          </el-col>
        </el-row>
      </el-form>
    </detail-block>
    <detail-block v-if="$route.path.includes('detail') && isShowHandler" title="快捷操作">
      <el-form :model="{}" label-width="120px">
        <el-row :gutter="24">
          <el-col :span="24">
            <el-form-item label=" ">
              <div class="btn-container">
                <el-button v-for="item in btnList" :key="item.name" type="primary" @click="shortcut(item.url)">
                  {{ item.name }}
                </el-button>
              </div>
            </el-form-item>
          </el-col>
        </el-row>
      </el-form>
    </detail-block>
    <file-list ref="fileRef" :data="ruleForm.internalAuditFiles" />
  </app-container>
</template>

<style lang="scss" scoped>
// 详情页面隐藏小红点
.isDetail {
  ::v-deep {
    .el-form-item.is-required:not(.is-no-asterisk) .el-form-item__label-wrap > .el-form-item__label::before,
    .el-form-item.is-required:not(.is-no-asterisk) > .el-form-item__label::before {
      content: "";
      display: none;
    }
  }
}
</style>