Newer
Older
xc-business-system / src / views / system / baseInfo / dept / detail.vue
dutingting on 8 Nov 2023 11 KB 核查测试与修改
<!-- 部门管理详情 -->
<script name="DeptDetail" lang="ts" setup>
import { ElMessage, ElMessageBox } from 'element-plus'
import type { FormInstance, FormRules } from 'element-plus'
import { el } from 'element-plus/es/locale'
import type { deptType } from '@/global'
import { getDictByCode } from '@/api/system/dict'
import type { IlistQueryType } from '@/views/system/user/user-interface'
import { getUserList } from '@/api/system/user'
import { updateDept } from '@/api/system/baseInfoDept'
import type { TableColumn } from '@/components/NormalTable/table_interface'
const textMap: { [key: string]: string } = {
  edit: '编辑',
  add: '新建',
  detail: '详情',
}// 页面类型字典
const loading = ref(false) // 表单加载状态
const pageType = ref('add') // 页面类型: add, edit, detail
const infoId = ref('') // id
const form = ref({ // 表单数据
  deptId: '', // 部门编号
  fullName: '', // 部门名称
  deptType: '', // 部门类型
  directorId: '', // 负责人
  SYNC_ID: '', // 属地
  remark: '', // 备注
  tips: '', // 部门类别
})
const rules = reactive<FormRules>({ // 表单验证规则
  deptType: [{ required: true, message: '部门类型不能为空', trigger: ['blur', 'change'] }],
  SYNC_ID: [{ required: true, message: '属地不能为空', trigger: ['blur', 'change'] }],
  tips: [{ required: true, message: '部门类别不能为空', trigger: ['blur', 'change'] }],
  // directorId: [{ required: true, message: '负责人不能为空', trigger: ['blur', 'change'] }],
})
const ruleFormRef = ref() // 表单ref
// -----------------------------------------字典--------------------------------------------------------------
const deptTypeList = ref<deptType[]>([]) // 部门类型
const sexMap = ref({}) as any// 性别字典
const userList = ref<{ [key: string]: string }[]>([]) // 用户列表
const personTypeMap = ref({}) as any// 人员类别字典
const deptCategoryList = ref<deptType[]>([]) // 部门类别
const placeList = ref<deptType[]>([]) // 属地
/**
 * 获取字典
 */
function getDict() {
  loading.value = true
  // 获取部门类型
  getDictByCode('deptType').then((response) => {
    deptTypeList.value = response.data
    loading.value = false
  })
  // 性别
  getDictByCode('sex').then((response) => {
    response.data.forEach((item: any) => {
      sexMap.value[`${item.value}`] = item.name
    })
  })
  // 获取用户列表
  getUserList({ offset: 1, limit: 999999 }).then((res: any) => {
    userList.value = res.data.rows
  })
  // 人员类别
  getDictByCode('bizStaffType').then((response) => {
    response.data.forEach((item: any) => {
      personTypeMap.value[`${item.value}`] = item.name
    })
  })

  // 获取部门类别
  getDictByCode('eqptDeviceType').then((response) => {
    deptCategoryList.value = response.data
  })
  // 属地
  getDictByCode('bizLabCode').then((response) => {
    placeList.value = response.data
  })
}

// -----------------------------------路由参数-------------------------------------------------
// 从路由中获取页面类型参数
const $route = useRoute()
if ($route.params && $route.params.type) {
  pageType.value = $route.params.type as string
  if ($route.params.id) {
    infoId.value = $route.params.id as string
  }
}
const listRowData = ref({}) as any // 列表页行数据
// ---------------------------------------methods----------------------------------------------------
const $router = useRouter() // 路由实例
// 点击关闭
const close = () => {
  $router.back()
}
// 点击保存
const save = (ruleFormRef: FormInstance | undefined) => {
  if (!ruleFormRef) { return }
  ruleFormRef.validate((valid, fields) => {
    if (valid) { // 基本信息表单通过校验
      ElMessageBox.confirm(
        '确认保存吗?',
        '提示',
        {
          confirmButtonText: '确认',
          cancelButtonText: '取消',
          type: 'warning',
        },
      ).then(() => {
        const params = {
          deptType: form.value.deptType, // 部门类型
          fullName: listRowData.value.fullName, // 部门名称-列表原有数据-不变
          id: listRowData.value.id, // 列表原有数据-不变
          num: listRowData.value.num, // 列表原有数据-不变
          pid: listRowData.value.pid, // 列表原有数据-不变
          simpleName: listRowData.value.simpleName, // 列表原有数据-不变
          tips: form.value.tips, // 部门类别
          version: listRowData.value.version, // 列表原有数据-不变
        }
        // 调保存接口
        updateDept(params).then(() => {
          ElMessage.success('编辑成功')
          pageType.value = 'detail'
        })
      })
    }
  })
}
// -------------------------------------------部门人员-----------------------------------
const listQuery: IlistQueryType = reactive({
  keywords: '', // 关键字
  beginTime: '', // 开始时间
  endTime: '', // 结束时间
  deptId: '', // 部门id
  sort: 'id', // 排序
  deptType: '', // 部门类型
  offset: 1,
  limit: 20,
})
const list = ref([]) // 表格数据
const total = ref(0) // 数据总数
const columns = ref<TableColumn[]>([
  { text: '人员编号', value: 'id', align: 'center', width: '200' },
  { text: '名称', value: 'name', align: 'center' },
  { text: '性别', value: 'sexName', align: 'center', width: '90' },
  { text: '人员类别', value: 'personTypeName', align: 'center' },
])
const deptPersonLoading = ref(false) // 表格loading
// 获取部门人员
const fetchDeptPerson = (isNowPage = false) => {
  deptPersonLoading.value = true
  if (!isNowPage) {
    // 是否显示当前页,否则跳转第一页
    listQuery.offset = 1
  }
  getUserList(listQuery).then((res) => {
    list.value = res.data.rows.map((item: { sexName: string; sex: string; attr1: string }) => {
      return {
        ...item,
        sexName: item.sex ? sexMap.value[item.sex] : item.sex || '未知',
        personTypeName: item.attr1 ? personTypeMap.value[item.attr1] : item.attr1 || '未知',
      }
    })
    total.value = res.data.total
    deptPersonLoading.value = false
  }).catch(() => {
    deptPersonLoading.value = false
  })
}

// 页数发生变化后的操作,可能是页码变化,可能是每页容量变化,此函数必写
const changePage = (val: { size?: number; page?: number }) => {
  if (val && val.size) {
    listQuery.limit = val.size
  }
  if (val && val.page) {
    listQuery.offset = val.page
  }
  fetchDeptPerson(true)
}

// ---------------------------------------钩子-------------------------------------------
onMounted(async () => {
  await getDict() // 获取字典
  listRowData.value = JSON.parse($route.query.row as string) // 列表页行数据
  listQuery.deptId = listRowData.value.deptId // 部门id
  form.value.deptId = listRowData.value.deptId // 部门id
  form.value.fullName = listRowData.value.fullName // 部门名称
  form.value.deptType = listRowData.value.deptType // 部门类型
  form.value.directorId = listRowData.value.directorId // 人员id
  fetchDeptPerson() // 获取部门人员
})
</script>

<template>
  <app-container>
    <detail-page v-loading="loading" :title="`部门管理--${textMap[pageType]}`">
      <template #btns>
        <el-button v-if="pageType !== 'detail'" type="primary" @click="save(ruleFormRef)">
          保存
        </el-button>
        <el-button type="info" @click="close">
          关闭
        </el-button>
      </template>
      <el-form
        ref="ruleFormRef"
        :model="form"
        :label-width="120"
        label-position="right"
        :rules="rules"
      >
        <el-row :gutter="24" class="marg">
          <el-col :span="6">
            <el-form-item label="部门编号:" prop="deptId">
              <el-input v-model="form.deptId" disabled />
            </el-form-item>
          </el-col>
          <el-col :span="6">
            <el-form-item label="部门名称:" prop="fullName">
              <el-input v-model="form.fullName" disabled />
            </el-form-item>
          </el-col>
          <el-col :span="6">
            <el-form-item label="负责人" prop="directorId">
              <el-select
                v-model.trim="form.directorId"
                filterable
                placeholder=" "
                disabled
                class="full-width-input"
              >
                <el-option v-for="item in userList" :key="item.id" :label="item.name" :value="item.id" />
              </el-select>
            </el-form-item>
          </el-col>
          <el-col :span="6">
            <el-form-item label="部门类型:" prop="deptType">
              <el-select
                v-model.trim="form.deptType"
                :placeholder="pageType === 'detail' ? ' ' : '请选择部门类型'"
                size="default"
                :disabled="pageType === 'detail'"
                class="full-width-input"
              >
                <el-option
                  v-for="item in deptTypeList"
                  :key="item.id"
                  :label="item.name"
                  :value="item.value"
                />
              </el-select>
            </el-form-item>
          </el-col>
          <el-col v-if="form.deptType === '3'" :span="6">
            <el-form-item label="部门类别:" prop="tips">
              <el-select
                v-model.trim="form.tips"
                :placeholder="pageType === 'detail' ? ' ' : '请选择部门类别'"
                size="default"
                :disabled="pageType === 'detail'"
                class="full-width-input"
              >
                <el-option
                  v-for="item in deptCategoryList"
                  :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="SYNC_ID">
              <el-select
                v-model.trim="form.SYNC_ID"
                :placeholder="pageType === 'detail' ? ' ' : '请选择属地'"
                size="default"
                :disabled="pageType === 'detail'"
                class="full-width-input"
              >
                <el-option
                  v-for="item in placeList"
                  :key="item.id"
                  :label="item.name"
                  :value="item.value"
                />
              </el-select>
            </el-form-item>
          </el-col>
        </el-row>
        <!-- <el-row :gutter="24" class="marg">
          <el-col :span="12">
            <el-form-item label="备注:">
              <el-input
                v-model="form.remark"
                type="textarea"
                autosize
                :placeholder="pageType === 'detail' ? '' : '请输入备注'"
                :disabled="pageType === 'detail'"
                :class="{ 'detail-input': pageType === 'detail' }"
              />
            </el-form-item>
          </el-col>
        </el-row> -->
      </el-form>
    </detail-page>
    <detail-block title="部门人员">
      <normal-table :data="list" :total="total" :columns="columns" :query="listQuery" :list-loading="deptPersonLoading" @change="changePage">
        <template #preColumns>
          <el-table-column label="序号" width="55" align="center">
            <template #default="scope">
              {{ (listQuery.offset - 1) * listQuery.limit + scope.$index + 1 }}
            </template>
          </el-table-column>
        </template>
      </normal-table>
    </detail-block>
  </app-container>
</template>