Newer
Older
xc-business-system / src / views / quality / components / selectUser.vue
liyaguang on 28 Feb 4 KB 质量监督报告需求修改
<!-- 选择审批人 -->
<script lang="ts" setup name="SelectUser">
import type { Ref } from 'vue'
import { defineExpose, nextTick, reactive, ref } from 'vue'
import type { FormInstance, FormRules } from 'element-plus'
import { getUserList } from '@/api/system/user'
import type { userType } from '@/views/system/user/user-interface'
import { getProcessDetail } from '@/api/system/process'
const $props = defineProps({
  nextName: {
    type: String,
    default: '',
  },
  showNextText: {
    type: Boolean,
    default: false,
  },
  formId: {
    type: String,
    default: '',
  }
})
const emits = defineEmits(['confirm'])
const dataFormRef = ref()
const dialogFormVisible = ref(false) // 对话框是否显示
// 表单
const areaForm = ref({
  user: '',
})
const nextText = ref('')
// 前端校验规则
const rules: FormRules = {
  user: [{ required: true, message: '审批人必选', trigger: ['blur', 'change'] }],
}
// 重置表单
const resetForm = () => {
  areaForm.value = {
    user: '',
  }
}
// 获取用户列表
const userList = ref<userType[]>([])
const dict = {
  监督负责: ['质量监督', '质量负责', '监督负责'],
  质量负责: ['质量监督', '质量负责', '监督负责'],
  内审组长: ['组长'],
  部门负责: ['部门负责'],
} as { [key: string]: string[] }
const fetchDict = () => {
  getUserList({ offset: 1, limit: 99999 }).then((res) => {
    if ($props.nextName) {
      const data = dict[$props.nextName]
      userList.value = res.data.rows.filter((item: any) => item.roleName.split(',').some((citem: string) => data.some((ccitem: string) => citem.includes(ccitem))))
    }
    else {
      userList.value = res.data.rows
    }
  })
}
fetchDict()
// 保存按钮
const saveForm = async (formEl: FormInstance | undefined) => {
  if (!formEl) { return }
  await formEl.validate((valid, fields) => {
    if (valid) {
      console.log('选择的审批人', areaForm.value.user)

      emits('confirm', areaForm.value.user)
      dialogFormVisible.value = false
    }
  })
}
// 获取当前审批节点的下一节点
const getApprovalNextRecord = () => {
  if (!$props.formId) {
    nextText.value = ''
    return
  }
  getProcessDetail($props.formId).then(res => {
    if (res.data?.nodeConfig) {
      function flattenObject(obj: any, parentKey: string = '', result: any = {}): any {
        for (let key in obj) {
          if (obj.hasOwnProperty(key)) {
            const newKey = parentKey ? `${parentKey}.${key}` : key;
            if (typeof obj[key] === 'object' && obj[key] !== null && !Array.isArray(obj[key])) {
              flattenObject(obj[key], newKey, result);
            } else {
              result[newKey] = obj[key];
            }
          }
        }
        return result;
      }
      const response = flattenObject(res.data.nodeConfig)
      const result = []
      for (let key in response) {
        if (key.includes('nodeName')) {
          result.push(response[key])
        }
      }
      nextText.value = result[1] || ''
    }
    else {
      nextText.value = ''
    }
  })
}
// 初始化对话框
const initDialog = () => {
  dialogFormVisible.value = true
  nextText.value = ''
  getApprovalNextRecord()
  resetForm()
  nextTick(() => {
    dataFormRef.value?.clearValidate()
  })
}
defineExpose({
  initDialog,
})

const cancel = () => {
  dialogFormVisible.value = false
}
</script>

<template>
  <el-dialog v-model="dialogFormVisible" :close-on-click-modal="false" title="选择审批人" append-to-body width="30%">
    <el-form ref="dataFormRef" :rules="rules" :model="areaForm" label-position="right" label-width="80px">
      <el-row :gutter="24">
        <el-col :span="24">
          <el-form-item label="审批人" prop="user">
            <el-select v-model="areaForm.user" filterable multiple placeholder="审批人">
              <el-option v-for="(item) in userList" :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-row>
      <el-row v-if="showNextText && nextText" :gutter="24">
        <el-col :span="24">
          <el-form-item label="下一节点:">
            <el-input v-model="nextText" placeholder="下一节点" disabled />
          </el-form-item>
        </el-col>
      </el-row>
    </el-form>
    <template #footer>
      <div class="dialog-footer">
        <el-button type="primary" @click="saveForm(dataFormRef)">
          保存
        </el-button>
        <el-button @click="cancel">
          取消
        </el-button>
      </div>
    </template>
  </el-dialog>
</template>

<style lang="scss" scoped>
.el-dialog {
  width: 700px;
}

.el-select {
  width: 100%;
}
</style>