Newer
Older
xc-business-system / src / views / resource / person / register / component / resume.vue
<!-- 人员登记 基本信息 -->
<script name="RegisterResume" lang="ts" setup>
import { ElMessage, dayjs } from 'element-plus'
import type { IStaffPromoteInfo, IStaffResumeInfo } from '../person-regitster'
import { useCheckList } from '@/commonMethods/useCheckList'
import { useSetAllRowReadable } from '@/commonMethods/useSetAllRowReadable'
import { addPromoteRecList, addResumeRecList, delPromoteRecList, delResumeRecList, getPromoteList, getResumeList } from '@/api/resource/register'

const props = defineProps({
  operation: { type: String, default: '' },
  staffId: { type: String, default: '' },
})

const listQuery = {
  id: '',
  limit: 1000,
  offset: 1,
}

const resumeColumns = [
  { text: '履历名称', value: 'resumeName', align: 'center', required: true },
  { text: '详细介绍', value: 'details', align: 'center', required: true },
  { text: '时间', value: 'resumeDate', align: 'center', width: '160', required: true },
] // 表头

const promoteColumns = [
  { text: '晋升经历', value: 'promoteExperience', align: 'center', required: true },
  { text: '晋升单位', value: 'company', align: 'center', required: true },
  { text: '时间', value: 'promoteDate', align: 'center', width: '160', required: true },
] // 表头

const resumeList = ref<IStaffResumeInfo[]>([]) // 表格数据
const promoteList = ref<IStaffPromoteInfo[]>([])

// 表格被选中的行
const resumeSelected = ref<IStaffResumeInfo[]>([])
const promoteSelected = ref<IStaffPromoteInfo[]>([])

const resumeRecord: IStaffResumeInfo = {
  id: '',
  staffId: '',
  resumeName: '',
  details: '',
  resumeDate: '',
  editable: true,
}

const promoteRecord: IStaffPromoteInfo = {
  id: '',
  staffId: '',
  promoteExperience: '',
  company: '',
  promoteDate: '',
  editable: true,
}

// 逻辑
const addEditableRow = (tableName: string) => {
  switch (tableName) {
    case 'resume':
      resumeList.value = resumeList.value.map((item: any) => ({
        ...item,
        resumeDate: dayjs(item.resumeDate).format('YYYY-MM-DD'),
      }))
      if (useCheckList(resumeList.value, resumeColumns, '经验履历')) {
        useSetAllRowReadable(resumeList.value)
        resumeList.value.push({ ...resumeRecord })
      }
      break

    case 'promote':
      promoteList.value = promoteList.value.map((item: any) => ({
        ...item,
        promoteDate: dayjs(item.promoteDate).format('YYYY-MM-DD'),
      }))
      if (useCheckList(promoteList.value, promoteColumns, '晋升情况')) {
        useSetAllRowReadable(promoteList.value)
        promoteList.value.push({ ...promoteRecord })
      }
      break

    default:
      break
  }
}

// 表格多选
const rsmMultiSelect = (e: any) => {
  resumeSelected.value = e
}
const prmMultiSelect = (e: any) => {
  promoteSelected.value = e
}

const getResumeListByStaffId = () => {
  getResumeList(listQuery).then((res) => {
    if (res.code === 200) {
      resumeList.value = res.data.rows.map((item: any) => ({
        ...item,
        resumeDate: dayjs(item.resumeDate).format('YYYY-MM-DD'),
      }))
    }
  })
}

const getPromoteListByStaffId = () => {
  getPromoteList(listQuery).then((res) => {
    if (res.code === 200) {
      promoteList.value = res.data.rows.map((item: any) => ({
        ...item,
        promoteDate: dayjs(item.promoteDate).format('YYYY-MM-DD'),
      }))
    }
  })
}

// 增加经验履历记录
const addResumeRecords = () => {
  if (useCheckList(resumeList.value, resumeColumns, '经验履历') === false) {
    return
  }

  const newRecords = ref<Array<IStaffResumeInfo>>([])
  newRecords.value = resumeList.value.filter(item => item.id === '')

  if (newRecords.value.length > 0) {
    addResumeRecList(newRecords.value).then((res) => {
      if (res.code === 200) {
        ElMessage.success('添加经验履历记录成功')
        getResumeListByStaffId()
      }
      else {
        ElMessage.error(`添加经验履历记录失败:${res.message}`)
      }
    })
  }
}

// 删除经验履历记录
const delResumeRecords = () => {
  if (resumeSelected.value.length === 0) {
    ElMessage.warning('请至少选择一行')
    return
  }

  // 前端界面删除
  resumeList.value = resumeList.value.filter(item => resumeSelected.value.includes(item) === false)

  // 调用后端接口进行删除
  const abiIdsSelected = ref<string[]>([])
  abiIdsSelected.value = resumeSelected.value.map((item: { id: string }) => item.id)
  abiIdsSelected.value = abiIdsSelected.value.filter(item => item !== '')
  if (abiIdsSelected.value.length > 0) {
    delResumeRecList({ ids: abiIdsSelected.value }).then((res) => {
      if (res.code === 200) {
        ElMessage.success('删除经验履历记录成功')
      }
      else {
        ElMessage.error(`删除经验履历记录失败:${res.message}`)
      }

      getResumeListByStaffId()
    })
  }
}

// 增加晋升情况记录
const addPromoteRecords = () => {
  if (useCheckList(promoteList.value, promoteColumns, '晋升情况') === false) {
    return
  }

  const newRecords = ref<Array<IStaffPromoteInfo>>([])
  newRecords.value = promoteList.value.filter(item => item.id === '')

  if (newRecords.value.length > 0) {
    addPromoteRecList(newRecords.value).then((res) => {
      if (res.code === 200) {
        ElMessage.success('添加晋升情况记录成功')
        getPromoteListByStaffId()
      }
      else {
        ElMessage.error(`添加晋升情况记录失败:${res.message}`)
      }
    })
  }
}

// 删除晋升情况记录
const delPromoteRecords = () => {
  if (promoteSelected.value.length === 0) {
    ElMessage.warning('请至少选择一行')
    return
  }

  // 前端界面删除
  promoteList.value = promoteList.value.filter(item => promoteSelected.value.includes(item) === false)

  // 调用后端接口进行删除
  const proIdsSelected = ref<string[]>([])
  proIdsSelected.value = promoteSelected.value.map((item: { id: string }) => item.id)
  proIdsSelected.value = proIdsSelected.value.filter(item => item !== '')
  if (proIdsSelected.value.length > 0) {
    delPromoteRecList({ ids: proIdsSelected.value }).then((res) => {
      if (res.code === 200) {
        ElMessage.success('删除晋升情况记录成功')
      }
      else {
        ElMessage.error(`删除晋升情况记录失败:${res.message}`)
      }

      getPromoteListByStaffId()
    })
  }
}

watch(() => props.staffId, (newVal: string) => {
  listQuery.id = newVal
  resumeRecord.staffId = newVal
  promoteRecord.staffId = newVal

  getResumeListByStaffId()
  getPromoteListByStaffId()
})

defineExpose({
  addResumeRecords,
  addPromoteRecords,
})
</script>

<template>
  <app-container>
    <el-form ref="resumeFormRef" label-position="right" label-width="110px" border stripe>
      <table-container title="经验履历">
        <template v-if="props.operation !== 'detail'" #btns-right>
          <el-button type="primary" @click="addEditableRow('resume')">
            增加行
          </el-button>
          <el-button type="info" @click="delResumeRecords">
            删除行
          </el-button>
        </template>

        <!-- 表格区域 -->
        <el-table :data="resumeList" border style="width: 100%;" @selection-change="rsmMultiSelect">
          <el-table-column v-if="props.operation !== 'detail'" type="selection" align="center" width="38" />
          <el-table-column align="center" label="序号" width="55" type="index" />
          <el-table-column
            v-for="item in resumeColumns"
            :key="item.value"
            :prop="item.value"
            :label="item.text"
            :width="item.width"
            align="center"
          >
            <template #header>
              <span v-show="item.required && props.operation !== 'detail'" style="color: red;">*</span><span>{{ item.text }}</span>
            </template>
            <template #default="scope">
              <span v-if="!scope.row.editable">{{ scope.row[item.value] }}</span>
              <el-date-picker v-else-if="item.value === 'resumeDate'" v-model="scope.row.resumeDate" format="YYYY-MM-DD" value-format="YYYY-MM-DD HH:mm:ss" type="date" style="width: 100%;" />
              <el-input v-else v-model="scope.row[item.value]" :autofocus="true" :placeholder="`${item.text}`" class="input" />
            </template>
          </el-table-column>
        </el-table>
      </table-container>

      <table-container title="晋升情况">
        <template v-if="props.operation !== 'detail'" #btns-right>
          <el-button type="primary" @click="addEditableRow('promote')">
            增加行
          </el-button>
          <el-button type="info" @click="delPromoteRecords">
            删除行
          </el-button>
        </template>

        <!-- 表格区域 -->
        <el-table :data="promoteList" border style="width: 100%;" @selection-change="prmMultiSelect">
          <el-table-column v-if="props.operation !== 'detail'" type="selection" align="center" width="38" />
          <el-table-column align="center" label="序号" width="55" type="index" />
          <el-table-column
            v-for="item in promoteColumns"
            :key="item.value"
            :prop="item.value"
            :label="item.text"
            :width="item.width"
            align="center"
          >
            <template #header>
              <span v-show="item.required && props.operation !== 'detail'" style="color: red;">*</span><span>{{ item.text }}</span>
            </template>
            <template #default="scope">
              <span v-if="!scope.row.editable">{{ scope.row[item.value] }}</span>
              <el-date-picker v-else-if="item.value === 'promoteDate'" v-model="scope.row.promoteDate" format="YYYY-MM-DD" value-format="YYYY-MM-DD HH:mm:ss" type="date" style="width: 100%;" />
              <el-input v-else v-model="scope.row[item.value]" :autofocus="true" :placeholder="`${item.text}`" class="input" />
            </template>
          </el-table-column>
        </el-table>
      </table-container>
    </el-form>
  </app-container>
</template>