Kaynağa Gözat

fix: 人员管理pc端表单基本完成

lirenjie 6 ay önce
ebeveyn
işleme
551068d826

+ 5 - 1
src/api/personnel-entry/index.js

@@ -10,4 +10,8 @@ export function getPersonnelInfo(id){
 /* 编辑更新入职员工 */
 export function updatePersonnel(params){
     return postRequest('/supports/employee/onboarding/update',params)
-}
+}
+/* 获取面试评价 */
+export function getInterviewEvaluation(id){
+    return getRequest(`/supports/interview/evaluation/query/${id}`)
+}

+ 13 - 2
src/components/BsUi/Form/Form.vue

@@ -10,7 +10,7 @@
         </a-col>
         <a-col :span="item.span ?? 24" v-for="(item, idx) in newFormTemp[key]">
           <a-form-item v-if="item.visible === DISPLAY_STATE.VISIBLE" :name="item.field"
-            :required="item.required === REQUIRED_STATE.REQUIRED" v-bind="item.formItemExtraProps">
+            :required="item.required === REQUIRED_STATE.REQUIRED" :label="item.label" v-bind="item.formItemExtraProps">
             <template #label v-if="item.tooltip">
               {{ item.label }}
               <a-tooltip class="tooltip">
@@ -103,6 +103,17 @@ const handleFieldChange = (field, value) => {
   emits('change', value)
 }
 
+const ValidatorSingalField =(field)=>{
+  return new Promise((resolve,reject)=>{
+    formRef.value.validateFields([field])
+    .then((res)=>{
+      resolve(res)
+    })
+    .catch((error)=>{
+      reject(error)
+    })
+  })
+}
 
 const handlerFormValidator = () => {
   return new Promise((resolve, reject) => {
@@ -135,7 +146,7 @@ const newFormTemp = computed(() => {
   return mapValues(groupByIds, (group) => sortBy(group, 'sort'));
 });
 
-defineExpose({ handlerFormValidator })
+defineExpose({ handlerFormValidator ,ValidatorSingalField})
 </script>
 
 <style lang="scss" scoped>

+ 1 - 0
src/components/support/file-upload/index.vue

@@ -157,6 +157,7 @@ const customRequest = async (options) => {
     }
     fileList.value.push(file);
     emit('change', fileList.value);
+    emit('update:value',fileList.value)
   } catch (e) {
     smartSentry.captureError(e);
   } finally {

+ 222 - 16
src/views/personnel-entry/pc/components/interview-evaluation.vue

@@ -1,32 +1,52 @@
 <template>
-    <div class="interview-evaluation" v-show="props.create">
+    <a-button type="primary" @click="createEvaluation">创建评价</a-button>
+    <div class="interview-evaluation" v-for="(item, index) in formData" :key="index"
+        v-if="createInterviewEvaluation && formData && formData.length > 0">
         <div class="interview-header">
             <div class="interview-header-left">
-                <div>创建时间:{{ formatDate(currentTime)  }}</div>
+                <div>创建时间:{{ formatDate(currentTime) }}</div>
                 <div>创建人:{{ userStore.actualName }}</div>
             </div>
-            <a-button type="link" danger @click="claerAll">删除</a-button>
+            <a-button type="link" danger @click="claerItem(index)">删除</a-button>
         </div>
         <div class="interview-content">
-            <BsForm :form-fields="formOptions.formFields" :form-data="formOptions.formData"
-            :form-extra-props="formOptions.formExtraProps" :footer-render="() => null" :form-id="formOptions.formId"
-            :form-groups="formOptions.formGroups" ref="bsFormRef" class="personnel-entry-form" ></BsForm>
+            <BsForm :form-fields="formOptions.formFields" :form-data="formData[index]"
+                :form-extra-props="formOptions.formExtraProps" :footer-render="() => null" :form-id="formOptions.formId"
+                :form-groups="formOptions.formGroups" ref='formRef' class="interview-content-form"></BsForm>
         </div>
     </div>
 </template>
-<script setup lang="ts">
-import { ref, reactive, nextTick, computed } from "vue"
+<script setup>
+import { ref, computed, inject, onMounted, watch } from "vue"
 import { useUserStore } from "/@/store/modules/system/user";
 import BsForm, { useBsForm } from '/@/components/BsUi/Form/index.js';
 import { formatDate } from "/@/utils/date";
-const props = defineProps(['create'])
+const createInterviewEvaluation = ref(false)
+const formData = defineModel('value')
+watch(() => formData.value, (value) => {
+    if (value && value.length > 0) {
+        createInterviewEvaluation.value = true
+    } else {
+        createInterviewEvaluation.value = false
+    }
+})
+// const emit = defineEmits(['setClose'])
 const userStore = useUserStore()
 const current = new Date()
+const formRef = ref(null)
 const currentTime = computed(() => current.getFullYear() + '-' + (current.getMonth() + 1) + '-' + current.getDate())
-
-const { formOptions, setFormPropsValue: setFVal } = useBsForm({
+const formDataInit = {
+    interviewer: null,
+    interviewFormat: null,
+    interviewTime: null,
+    recruitmentChannel: null,
+    salaries: null,
+    salaryNumber: null,
+    interviewEvaluation: null,
+}
+const { formOptions, setFormPropsValue: setFVal, getFormPropsValue: getFValue } = useBsForm({
     formOptions: {
-        formGroups: [
+        formFields: [
             {
                 id: '1',
                 label: '面试官',
@@ -34,11 +54,160 @@ const { formOptions, setFormPropsValue: setFVal } = useBsForm({
                 componentProps: {
                     placeholder: '请输入',
                 },
-                field: 'name',
+                field: 'interviewer',
+                sort: '1',
+                visible: '1',
+                required: '1',
+                span: 6,
+                formItemExtraProps: {
+                    rules: [
+                        {
+                            validator: (_, value) => {
+                                // return Promise.reject(new Error('报错'));
+                                return Promise.resolve();
+                            },
+                        },
+                    ],
+                },
+            },
+            {
+                id: '2',
+                label: '面试形式',
+                component: 'a-input',
+                componentProps: {
+                    placeholder: '请输入',
+                },
+                field: 'interviewFormat',
+                sort: '1',
+                visible: '1',
+                required: '1',
+                span: 6,
+                formItemExtraProps: {
+                    rules: [
+                        {
+                            validator: (_, value) => {
+                                // return Promise.reject(new Error('报错'));
+                                return Promise.resolve();
+                            },
+                        },
+                    ],
+                },
+            },
+            {
+                id: '3',
+                label: '面试时间',
+                component: 'a-date-picker',
+                componentProps: {
+                    placeholder: '请输入',
+                    style: {
+                        width: '100%'
+                    },
+                    valueFormat: 'YYYY-MM-DD'
+                },
+                field: 'interviewTime',
+                sort: '1',
+                visible: '1',
+                required: '1',
+                span: 6,
+                formItemExtraProps: {
+                    rules: [
+                        {
+                            validator: (_, value) => {
+                                // return Promise.reject(new Error('报错'));
+                                return Promise.resolve();
+                            },
+                        },
+                    ],
+                },
+            },
+            {
+                id: '4',
+                label: '招聘渠道',
+                component: 'a-input',
+                componentProps: {
+                    placeholder: '请输入',
+                },
+                field: 'recruitmentChannel',
+                sort: '1',
+                visible: '1',
+                required: '1',
+                span: 6,
+                formItemExtraProps: {
+                    rules: [
+                        {
+                            validator: (_, value) => {
+                                // return Promise.reject(new Error('报错'));
+                                return Promise.resolve();
+                            },
+                        },
+                    ],
+                },
+            },
+            {
+                id: '5',
+                label: '薪资',
+                component: 'a-input',
+                componentProps: {
+                    placeholder: '请输入',
+                },
+                field: 'salary',
+                sort: '1',
+                visible: '1',
+                required: '1',
+                span: 6,
+                formItemExtraProps: {
+                    rules: [
+                        {
+                            validator: (_, value) => {
+                                if (/^0+\d+$/.test(value)) return Promise.reject('数字前不能有0');
+                                if (Number(value) < 0) {
+                                    return Promise.reject('薪资不能小于0');
+                                }
+                                return Promise.resolve();
+                            }
+                        },
+                    ],
+                },
+            },
+            {
+                id: '7',
+                label: '薪数',
+                component: 'a-input',
+                componentProps: {
+                    placeholder: '请输入',
+                    type: 'number'
+                },
+                field: 'salaryNumber',
                 sort: '1',
                 visible: '1',
                 required: '1',
                 span: 6,
+                formItemExtraProps: {
+                    rules: [
+                        {
+                            validator: (_, value) => {
+                                if (/^0+\d+$/.test(value)) return Promise.reject('数字前不能有0');
+                                if (Number(value) < 0) {
+                                    return Promise.reject('薪数不能小于0');
+                                }
+                                return Promise.resolve();
+                            }
+                        },
+                    ],
+                },
+            },
+            {
+                id: '8',
+                label: '面试评价',
+                component: 'a-textarea',
+                componentProps: {
+                    placeholder: '请输入',
+                },
+                field: 'interviewEvaluation',
+                sort: '1',
+                visible: '1',
+                required: '1',
+                span: 24,
                 formItemExtraProps: {
                     rules: [
                         {
@@ -50,17 +219,49 @@ const { formOptions, setFormPropsValue: setFVal } = useBsForm({
                     ],
                 },
             },
-        ]
+        ],
+        formId: 'formId',
+        formExtraProps: {},
     }
 })
-function claerAll(){
-    
+
+async function validateForm() {
+    console.log(1211111);
+
+    await formRef.value.forEach(item => {
+        item.handlerFormValidator()
+    });
+}
+function claerItem(index) {
+    // emit('setClose')
+    console.log(formRef.value);
+
+    if (formData.value && formData.value.length === 0 && createInterviewEvaluation.value === true) {
+        createInterviewEvaluation.value = !createInterviewEvaluation.value
+        formData.value[0] = Object.assign(formData.value[0], formDataInit)
+    } else {
+        formData.value.splice(index, 1)
+    }
+}
+function createEvaluation() {
+    if (createInterviewEvaluation.value === false) {
+        createInterviewEvaluation.value = !createInterviewEvaluation.value
+    }
+    formData.value.push({ ...formDataInit })
+
 }
+const parentAPI = inject('interview');
+parentAPI.registerChild({
+    childMethod: validateForm
+});
 </script>
 <style lang="scss" scoped>
 .interview-evaluation {
     display: flex;
     flex-direction: column;
+    border: 1px dotted #DCDFE6;
+    border-radius: 8px;
+    margin-top: 4px;
 
     .interview-header {
         display: flex;
@@ -68,6 +269,7 @@ function claerAll(){
         justify-content: space-between;
         background-color: #F8F8F9;
         padding: 0 8px;
+
         .interview-header-left {
             display: flex;
             flex-direction: row;
@@ -75,5 +277,9 @@ function claerAll(){
             gap: 8px;
         }
     }
+
+    .interview-content {
+        padding: 8px;
+    }
 }
 </style>

+ 70 - 33
src/views/personnel-entry/pc/components/project-deatil.vue

@@ -4,8 +4,8 @@
             <a-input v-model:value="row.projectName" clearable></a-input>
         </template>
 
-        <template #edit_position="{ row }">
-            <a-input v-model:value="row.position" clearable></a-input>
+        <template #edit_projectAppointment="{ row }">
+            <a-input v-model:value="row.projectAppointment" clearable></a-input>
         </template>
 
         <template #action="{ row }">
@@ -21,10 +21,20 @@
 </template>
 
 <script setup lang="jsx">
-import { ref, nextTick, computed } from 'vue';
+import { ref, nextTick, computed, watch, onMounted } from 'vue';
 import BsTable, { useBsTable } from '/@/components/BsUi/Table/index.js';
 import { DISPLAY_STATE } from '/@/components/BsUi/constant.js';
+import dayjs from 'dayjs';
+import { message } from 'ant-design-vue';
+const formData = defineModel('value')
+const { employeeCode } = defineProps(['employeeCode'])
+onMounted(() => {
+    formData.value = getValue('gridOptions.data')
+})
+watch(() => formData.value, (value) => {
+    console.log(value);
 
+})
 const {
     tableOptions,
     setTablePropsValue: setValue,
@@ -34,6 +44,7 @@ const {
     fetchTableData,
 } = useBsTable({
     tableOptions: {
+        url: '/supports/charge/project/queryPage',
         toolbarTopConfig: {
             enable: false,
         },
@@ -41,6 +52,32 @@ const {
             editConfig: {
                 trigger: 'manual',
                 mode: 'row',
+                showStatus: true,
+                autoClear: false
+            },
+            editRules: {
+                projectName: [
+                    { required: true, message: '项目名称不能为空' }
+                ],
+                projectAppointment: [
+                    { required: true, message: '项目任职不能为空' }
+                ],
+                projectStartTime: [
+                    { required: true, message: '项目开始时间不能为空' }
+                ],
+                projectEndTime: [
+                    { required: true, message: '项目结束时间不能为空' },
+                    {
+                        validator({ cellValue, row }) {
+                            console.log(cellValue, row.projectStartTime);
+                            if (new Date(row.projectStartTime) > new Date(cellValue)) {
+                                return Promise.reject('结束时间必须大于开始时间');
+                            }
+                            return true;
+                        },
+                        message: '结束时间必须大于开始时间'
+                    }
+                ],
             },
             loading: false,
             columns: [
@@ -57,54 +94,47 @@ const {
                     },
                 },
                 {
-                    field: 'position',
+                    field: 'projectAppointment',
                     title: '项目任职',
                     editRender: {},
                     slots: {
-                        edit: 'edit_position',
+                        edit: 'edit_projectAppointment',
                     },
                 },
                 {
-                    field: 'startDate',
+                    field: 'projectStartTime',
                     title: '项目开始时间',
                     editRender: { name: 'VxeDatePicker', props: { type: 'date' } }
                 },
                 {
-                    field: 'endDate',
+                    field: 'projectEndTime',
                     title: '项目结束时间',
                     editRender: { name: 'VxeDatePicker', props: { type: 'date' } }
                 },
                 {
                     field: 'createTime',
                     title: '创建时间',
-                    editRender: { name: 'VxeDatePicker', props: { type: 'date' } }
+                    // editRender: { name: 'VxeDatePicker', props: { type: 'date' } }
                 },
                 {
                     field: 'opt1',
                     title: '操作',
-                    width: '120px',
+                    width: '140px',
                     fixed: 'right',
                     slots: {
                         default: 'action',
                     },
                 },
             ],
-            data: [
-                {
-                    id: 1,
-                    projectName: '项目名称信息展示位置',
-                    position: '具体描述信息,具体描述信息,有具体描述信息',
-                    startDate: '2024-02-24',
-                    endDate: '2025-02-24',
-                    createTime: '2025-06-21 15:12',
-                }
-            ], // 模拟数据源
+            data: formData.value, // 模拟数据源
         },
         searchConfig: {
             enabled: false,
         },
         pagerConfig: {
-            enabled: false,
+            enable: false,
+            pageSize: 100,
+            pageNum: 1,
             isFixed: false,
         },
         toolbarConfig: {
@@ -118,21 +148,26 @@ const {
                     disabled: false,
                     onClick(event) {
                         const newRow = {
-                            id: Date.now(),
                             projectName: '',
                             position: '',
                             startDate: '',
                             endDate: '',
-                            createTime: new Date().toLocaleString(),
+                            createTime: dayjs(new Date()).format('YYYY-MM-DD HH:mm'),
                         };
+
                         nextTick(() => {
                             const $table = getGridRef();
-                            $table.insertAt(newRow,-1)
+                            $table.insertAt(newRow, -1)
+                            // formData.value = getValue('gridOptions.data')
                         });
                     },
                 },
             }],
         },
+        tableSearchBeforeBiz() {
+            const searchParams = getValue('searchConfig.data');
+            setValue('searchConfig.data', { ...searchParams, employeeCode: employeeCode });
+        },
     },
 });
 const hasEditStatus = (row) => {
@@ -141,23 +176,25 @@ const hasEditStatus = (row) => {
         return $grid.isEditByRow(row)
     }
 }
-function saveRowEvent(row) {
+async function saveRowEvent(row) {
     const $grid = getGridRef()
-    console.log(row);
 
     if ($grid) {
-        $grid.clearEdit().then(() => {
-            setValue('gridOptions.loading', true)
-            setTimeout(() => {
-                setValue('gridOptions.loading', false)
-                // VxeUI.modal.message({ content: `保存成功!name=${row.name}`, status: 'success' })
-            }, 300)
-        })
+        const errMap = await $grid.validate(row);
+        if (errMap) {
+            message.warning('校验失败')
+            throw new Error('校验失败')
+        };
+        formData.value.push(row)
+        console.log(formData.value);
+
+        $grid.clearEdit()
+
     }
 }
 const editRowEvent = (row) => {
     const $grid = getGridRef()
-    console.log($grid, row);
+    // console.log($grid, row);
 
     if ($grid) {
         $grid.setEditRow(row)

+ 286 - 143
src/views/personnel-entry/pc/index.vue

@@ -5,57 +5,108 @@
         </div>
         <BsForm :form-fields="formOptions.formFields" :form-data="formOptions.formData"
             :form-extra-props="formOptions.formExtraProps" :footer-render="() => null" :form-id="formOptions.formId"
-            :form-groups="formOptions.formGroups" ref="bsFormRef" class="personnel-entry-form" >
-            
+            :form-groups="formOptions.formGroups" ref="bsFormRef" class="personnel-entry-form">
+
         </BsForm>
         <div class="personnel-entry-footer">
-            <a-button>重置</a-button>
-            <a-button>保存</a-button>
+            <a-button type="primary" ghost @click="reset">重置</a-button>
+            <a-button type="primary" @click="save">保存</a-button>
         </div>
     </div>
 </template>
 <script setup lang="jsx">
-import { ref, reactive, defineComponent } from "vue"
+import { ref, reactive, provide, onMounted } from "vue"
 import BsForm, { useBsForm } from '/@/components/BsUi/Form/index.js';
 import FileUpload from '/@/components/support/file-upload/index.vue'
 import ProjectDeatil from "./components/project-deatil.vue";
 import interviewEvaluation from "./components/interview-evaluation.vue";
-import AreaCascader from '/@/components/framework/area-cascader/index.vue'
+import AreaCascader from '/@/components/framework/area-cascader/index.vue';
+import useBsDict from '/@/utils/dict.js';
+import { addPersonnel, updatePersonnel, getPersonnelInfo, getInterviewEvaluation } from "/@/api/personnel-entry";
+import { useRoute } from "vue-router";
+import { isEmpty } from "lodash";
+import { message } from "ant-design-vue";
+const route = useRoute()
+const { id, employeeCode } = route.query
+const children = ref([])
+
+provide('interview', {
+    registerChild: (child) => children.value.push(child)
+})
+
 const bsFormRef = ref(null);
-const createInterviewEvaluation =ref(false)
+const formDataInit = {
+    name: undefined,
+    sex: 0,
+    idCard: undefined,
+    tel: undefined,
+    post: undefined,
+    type: undefined,
+    workYear: 0,
+    degree: undefined,
+    graduateSchool: undefined,
+    specialized: undefined,
+    provinceCityDistrict: undefined,
+    province: undefined,
+    provinceName: undefined,
+    city: undefined,
+    cityName: undefined,
+    district: undefined,
+    districtName: undefined,
+    address: undefined,
+    emergencyContact: undefined,
+    contactRelationship: undefined,
+    contactTel: undefined,
+    personalExpertise: undefined,
+    idCardFront: undefined,
+    idCardBack: undefined,
+    noCriminalRecord: undefined,
+    dismissingCert: undefined,
+    graduationCert: undefined,
+    degreeCert: undefined,
+    otherCert: undefined,
+    onboardingExamine: undefined,
+    academicInformationNetwork: undefined,
+    attachmentInformation: undefined,
+    evaluationDTOList: [
 
-const { formOptions, setFormPropsValue: setFVal } = useBsForm({
+    ],
+    chargeProjectDTOList: [
+
+    ]
+}
+const { formOptions, setFormPropsValue: setFVal, getFormPropsValue: getFValue } = useBsForm({
     formOptions: {
         formGroups: [
             {
                 id: "1",
                 name: '基本信息',
-                type:'dot'
+                type: 'dot'
             },
             {
                 id: "2",
                 name: '项目信息',
-                type:'dot'
+                type: 'dot'
             },
             {
                 id: "3",
                 name: '证件信息',
-                type:'dot'
+                type: 'dot'
             },
             {
                 id: "4",
                 name: '入职体检报告',
-                type:'dot'
+                type: 'dot'
             },
             {
                 id: "5",
                 name: '面试评价',
-                type:'dot'
+                type: 'dot'
             },
             {
                 id: "6",
                 name: '附件信息',
-                type:'dot'
+                type: 'dot'
             },
         ],
         formFields: [
@@ -66,7 +117,7 @@ const { formOptions, setFormPropsValue: setFVal } = useBsForm({
                 component: 'a-input',
                 componentProps: {
                     placeholder: '请输入姓名',
-                    
+
                 },
                 field: 'name',
                 sort: '1',
@@ -74,14 +125,6 @@ const { formOptions, setFormPropsValue: setFVal } = useBsForm({
                 required: '1',
                 span: 6,
                 formItemExtraProps: {
-                    rules: [
-                        {
-                            validator: (_, value) => {
-                                // return Promise.reject(new Error('报错'));
-                                return Promise.resolve();
-                            },
-                        },
-                    ],
                 },
             },
             {
@@ -91,8 +134,18 @@ const { formOptions, setFormPropsValue: setFVal } = useBsForm({
                 component: 'a-select',
                 componentProps: {
                     placeholder: '请选择性别',
+                    options: [
+                        {
+                            label: '男士',
+                            value: 1
+                        },
+                        {
+                            label: '女士',
+                            value: 0
+                        },
+                    ]
                 },
-                field: '',
+                field: 'sex',
                 sort: '1',
                 visible: '1',
                 required: '1',
@@ -115,8 +168,9 @@ const { formOptions, setFormPropsValue: setFVal } = useBsForm({
                 component: 'a-input',
                 componentProps: {
                     placeholder: '请输入身份证号码',
+                    type: 'number'
                 },
-                field: 'name',
+                field: 'idCard',
                 sort: '1',
                 visible: '1',
                 required: '1',
@@ -124,11 +178,9 @@ const { formOptions, setFormPropsValue: setFVal } = useBsForm({
                 formItemExtraProps: {
                     rules: [
                         {
-                            validator: (_, value) => {
-                                // return Promise.reject(new Error('报错'));
-                                return Promise.resolve();
-                            },
-                        },
+                            pattern: /(^[1-9]\d{5}(18|19|20)\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])\d{3}[\dXx]$)|(^[1-9]\d{5}\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])\d{3}$)/,
+                            message: "请输入正确的身份证号"
+                        }
                     ],
                 },
             },
@@ -139,8 +191,9 @@ const { formOptions, setFormPropsValue: setFVal } = useBsForm({
                 component: 'a-input',
                 componentProps: {
                     placeholder: '请输入手机号',
+                    type: 'number'
                 },
-                field: 'name',
+                field: 'tel',
                 sort: '1',
                 visible: '1',
                 required: '1',
@@ -148,10 +201,8 @@ const { formOptions, setFormPropsValue: setFVal } = useBsForm({
                 formItemExtraProps: {
                     rules: [
                         {
-                            validator: (_, value) => {
-                                // return Promise.reject(new Error('报错'));
-                                return Promise.resolve();
-                            },
+                            pattern: /^(?:(?:\+|00)86)?1[3-9]\d{9}$/,
+                            message: '请输入正确的手机号'
                         },
                     ],
                 },
@@ -163,8 +214,9 @@ const { formOptions, setFormPropsValue: setFVal } = useBsForm({
                 component: 'a-select',
                 componentProps: {
                     placeholder: '请选择岗位',
+                    options: useBsDict.getDictList('BLINK_ENTRY_POST')
                 },
-                field: 'name',
+                field: 'post',
                 sort: '1',
                 visible: '1',
                 required: '1',
@@ -184,11 +236,12 @@ const { formOptions, setFormPropsValue: setFVal } = useBsForm({
                 groupId: "1",
                 id: '6',
                 label: '类型 ',
-                component: 'a-input',
+                component: 'a-select',
                 componentProps: {
                     placeholder: '请选择类型',
+                    options: useBsDict.getDictList('BLINK_ENTRY_TYPE')
                 },
-                field: 'name',
+                field: 'type',
                 sort: '1',
                 visible: '1',
                 required: '1',
@@ -213,16 +266,17 @@ const { formOptions, setFormPropsValue: setFVal } = useBsForm({
                     placeholder: '请输入工作年限',
                     slots: [
                         {
-                            slotName:'suffix',
-                            customRender:()=>{
+                            slotName: 'suffix',
+                            customRender: () => {
                                 return (
-                                    <div></div>
+                                    <div></div>
                                 )
                             }
                         }
-                    ]
+                    ],
+                    type: 'number'
                 },
-                field: 'name',
+                field: 'workYear',
                 sort: '1',
                 visible: '1',
                 required: '1',
@@ -231,9 +285,12 @@ const { formOptions, setFormPropsValue: setFVal } = useBsForm({
                     rules: [
                         {
                             validator: (_, value) => {
-                                // return Promise.reject(new Error('报错'));
+                                transformData('workYear', value)
+                                if (Number(value) < 0) {
+                                    return Promise.reject('工作年限不能小于0');
+                                }
                                 return Promise.resolve();
-                            },
+                            }
                         },
                     ],
                 },
@@ -245,8 +302,9 @@ const { formOptions, setFormPropsValue: setFVal } = useBsForm({
                 component: 'a-select',
                 componentProps: {
                     placeholder: '请选择学历',
+                    options: useBsDict.getDictList('BLINK_ENTRY_DEGREE')
                 },
-                field: 'name',
+                field: 'degree',
                 sort: '1',
                 visible: '1',
                 required: '1',
@@ -270,7 +328,7 @@ const { formOptions, setFormPropsValue: setFVal } = useBsForm({
                 componentProps: {
                     placeholder: '请输入毕业院校',
                 },
-                field: 'name',
+                field: 'graduateSchool',
                 sort: '1',
                 visible: '1',
                 required: '1',
@@ -294,7 +352,7 @@ const { formOptions, setFormPropsValue: setFVal } = useBsForm({
                 componentProps: {
                     placeholder: '请输入专业',
                 },
-                field: 'name',
+                field: 'specialized',
                 sort: '1',
                 visible: '1',
                 required: '1',
@@ -317,10 +375,35 @@ const { formOptions, setFormPropsValue: setFVal } = useBsForm({
                 component: AreaCascader,
                 componentProps: {
                     placeholder: '请选择联系地址',
-                    type:'province_city_district',
-                    width:'100%'
+                    type: 'province_city_district',
+                    width: '100%',
+                    onChange: (value, selectedOptions) => {
+                        let formData = getFValue('formData')
+                        formData = Object.assign(formData, {
+                            province: '',
+                            provinceName: '',
+                            city: '',
+                            cityName: '',
+                            district: '',
+                            districtName: '',
+                        });
+                        // console.log(value, selectedOptions);
+                        if (!isEmpty(selectedOptions)) {
+                            // 地区信息
+
+                            formData.province = selectedOptions[0].value;
+                            formData.provinceName = selectedOptions[0].label;
+
+                            formData.city = selectedOptions[1].value;
+                            formData.cityName = selectedOptions[1].label;
+                            if (selectedOptions[2]) {
+                                formData.district = selectedOptions[2].value;
+                                formData.districtName = selectedOptions[2].label;
+                            }
+                        }
+                    }
                 },
-                field: 'name',
+                field: 'provinceCityDistrict',
                 sort: '1',
                 visible: '1',
                 required: '1',
@@ -344,7 +427,7 @@ const { formOptions, setFormPropsValue: setFVal } = useBsForm({
                 componentProps: {
                     placeholder: '请输入详细地址',
                 },
-                field: 'name',
+                field: 'address',
                 sort: '1',
                 visible: '1',
                 required: '1',
@@ -368,7 +451,7 @@ const { formOptions, setFormPropsValue: setFVal } = useBsForm({
                 componentProps: {
                     placeholder: '请输入紧急联系人',
                 },
-                field: 'name',
+                field: 'emergencyContact',
                 sort: '1',
                 visible: '1',
                 required: '1',
@@ -392,7 +475,7 @@ const { formOptions, setFormPropsValue: setFVal } = useBsForm({
                 componentProps: {
                     placeholder: '请输入与紧急联系人关系',
                 },
-                field: 'name',
+                field: 'contactRelationship',
                 sort: '1',
                 visible: '1',
                 required: '1',
@@ -415,8 +498,9 @@ const { formOptions, setFormPropsValue: setFVal } = useBsForm({
                 component: 'a-input',
                 componentProps: {
                     placeholder: '请输入紧急联系人电话',
+                    type: 'number'
                 },
-                field: 'name',
+                field: 'contactTel',
                 sort: '1',
                 visible: '1',
                 required: '1',
@@ -424,10 +508,8 @@ const { formOptions, setFormPropsValue: setFVal } = useBsForm({
                 formItemExtraProps: {
                     rules: [
                         {
-                            validator: (_, value) => {
-                                // return Promise.reject(new Error('报错'));
-                                return Promise.resolve();
-                            },
+                            pattern: /^(?:(?:\+|00)86)?1[3-9]\d{9}$/,
+                            message: '请输入正确的手机号'
                         },
                     ],
                 },
@@ -440,7 +522,7 @@ const { formOptions, setFormPropsValue: setFVal } = useBsForm({
                 componentProps: {
                     placeholder: '请输入个人专长',
                 },
-                field: 'name',
+                field: 'personalExpertise',
                 sort: '1',
                 visible: '1',
                 required: '1',
@@ -463,8 +545,9 @@ const { formOptions, setFormPropsValue: setFVal } = useBsForm({
                 component: ProjectDeatil,
                 componentProps: {
                     placeholder: '请输入负责项目情况',
+                    employeeCode: employeeCode
                 },
-                field: 'name',
+                field: 'chargeProjectDTOList',
                 sort: '1',
                 visible: '1',
                 required: '1',
@@ -486,13 +569,15 @@ const { formOptions, setFormPropsValue: setFVal } = useBsForm({
                 label: '身份证人像面',
                 component: FileUpload,
                 componentProps: {
-                    buttonText:'人像面上传',
-                    showUploadList:false,
-                    uploadAterClear:true,
-                    maxUploadSize:1,
-                    accept:'.png,.jpg,jpeg'
-                },
-                field: 'name',
+                    buttonText: '人像面上传',
+                    showUploadList: false,
+                    maxUploadSize: 1,
+                    accept: '.png,.jpg,jpeg',
+                    onChange: (value) => {
+                        bsFormRef.value.ValidatorSingalField('idCardFront')
+                    }
+                },
+                field: 'idCardFront',
                 sort: '1',
                 visible: '1',
                 required: '1',
@@ -500,10 +585,15 @@ const { formOptions, setFormPropsValue: setFVal } = useBsForm({
                 formItemExtraProps: {
                     rules: [
                         {
-                            validator: (_, value) => {
-                                // return Promise.reject(new Error('报错'));
+                            transform: (value) => {
+                                console.log(value);
+                            },
+                            asyncValidator: (rule, value) => {
+                                console.log(rule, value);
                                 return Promise.resolve();
                             },
+                            type: 'array',
+                            trigger: 'change'
                         },
                     ],
                 },
@@ -514,13 +604,13 @@ const { formOptions, setFormPropsValue: setFVal } = useBsForm({
                 label: '身份证国徽面',
                 component: FileUpload,
                 componentProps: {
-                    buttonText:'国徽面上传',
-                    showUploadList:false,
-                    uploadAterClear:true,
-                    maxUploadSize:1,
-                    accept:'.png,.jpg,jpeg'
+                    buttonText: '国徽面上传',
+                    showUploadList: false,
+                    uploadAterClear: true,
+                    maxUploadSize: 1,
+                    accept: '.png,.jpg,jpeg'
                 },
-                field: 'name',
+                field: 'idCardBack',
                 sort: '1',
                 visible: '1',
                 required: '1',
@@ -542,13 +632,13 @@ const { formOptions, setFormPropsValue: setFVal } = useBsForm({
                 label: '无犯罪记录证明',
                 component: FileUpload,
                 componentProps: {
-                    buttonText:'证明上传',
-                    showUploadList:false,
-                    uploadAterClear:true,
-                    maxUploadSize:1,
-                    accept:'.png,.jpg,jpeg'
+                    buttonText: '证明上传',
+                    showUploadList: false,
+                    uploadAterClear: true,
+                    maxUploadSize: 1,
+                    accept: '.png,.jpg,jpeg'
                 },
-                field: 'name',
+                field: 'noCriminalRecord',
                 sort: '1',
                 visible: '1',
                 required: '1',
@@ -570,13 +660,13 @@ const { formOptions, setFormPropsValue: setFVal } = useBsForm({
                 label: '解聘证书',
                 component: FileUpload,
                 componentProps: {
-                    buttonText:'证明上传',
-                    showUploadList:false,
-                    uploadAterClear:true,
-                    maxUploadSize:1,
-                    accept:'.png,.jpg,jpeg'
+                    buttonText: '证明上传',
+                    showUploadList: false,
+                    uploadAterClear: true,
+                    maxUploadSize: 1,
+                    accept: '.png,.jpg,jpeg'
                 },
-                field: 'name',
+                field: 'dismissingCert',
                 sort: '1',
                 visible: '1',
                 required: '0',
@@ -598,13 +688,13 @@ const { formOptions, setFormPropsValue: setFVal } = useBsForm({
                 label: '毕业证书',
                 component: FileUpload,
                 componentProps: {
-                    buttonText:'证书上传',
-                    showUploadList:false,
-                    uploadAterClear:true,
-                    maxUploadSize:1,
-                    accept:'.png,.jpg,jpeg'
+                    buttonText: '证书上传',
+                    showUploadList: false,
+                    uploadAterClear: true,
+                    maxUploadSize: 1,
+                    accept: '.png,.jpg,jpeg'
                 },
-                field: 'name',
+                field: 'graduationCert',
                 sort: '1',
                 visible: '1',
                 required: '1',
@@ -626,13 +716,13 @@ const { formOptions, setFormPropsValue: setFVal } = useBsForm({
                 label: '学位证书',
                 component: FileUpload,
                 componentProps: {
-                    buttonText:'证书上传',
-                    showUploadList:false,
-                    uploadAterClear:true,
-                    maxUploadSize:1,
-                    accept:'.png,.jpg,jpeg'
+                    buttonText: '证书上传',
+                    showUploadList: false,
+                    uploadAterClear: true,
+                    maxUploadSize: 1,
+                    accept: '.png,.jpg,jpeg'
                 },
-                field: 'name',
+                field: 'degreeCert',
                 sort: '1',
                 visible: '1',
                 required: '1',
@@ -654,13 +744,13 @@ const { formOptions, setFormPropsValue: setFVal } = useBsForm({
                 label: '其他证书',
                 component: FileUpload,
                 componentProps: {
-                    buttonText:'证书上传',
-                    showUploadList:false,
-                    uploadAterClear:true,
-                    maxUploadSize:1,
-                    accept:'.png,.jpg,jpeg'
+                    buttonText: '证书上传',
+                    showUploadList: false,
+                    uploadAterClear: true,
+                    maxUploadSize: 1,
+                    accept: '.png,.jpg,jpeg'
                 },
-                field: 'name',
+                field: 'otherCert',
                 sort: '1',
                 visible: '1',
                 required: '0',
@@ -676,24 +766,23 @@ const { formOptions, setFormPropsValue: setFVal } = useBsForm({
                     ],
                 },
             },
-             {
+            {
                 groupId: "4",
                 id: '26',
                 label: '体检报告',
                 component: FileUpload,
                 componentProps: {
-                    // placeholder: '请输入',
-                    buttonText:'证书上传',
-                    listType:'text',
-                    maxUploadSize:1,
-                    accept:'.png,.jpg,jpeg,.pdf'
+                    buttonText: '证书上传',
+                    listType: 'text',
+                    maxUploadSize: 1,
+                    accept: '.png,.jpg,jpeg,.pdf'
                 },
-                field: 'name',
+                field: 'onboardingExamine',
                 sort: '1',
                 visible: '1',
                 required: '1',
                 span: 2,
-                tooltip:"支持png、jpg、pdf等常见报告格式",
+                tooltip: "支持png、jpg、pdf等常见报告格式",
                 formItemExtraProps: {
                     rules: [
                         {
@@ -709,16 +798,10 @@ const { formOptions, setFormPropsValue: setFVal } = useBsForm({
                 groupId: "5",
                 id: '26',
                 label: '',
-                component: 'a-button',
+                component: interviewEvaluation,
                 componentProps: {
-                    // placeholder: '请输入',
-                    onClick:()=>{
-                        console.log('1111');
-                        createInterviewEvaluation.value = true
-                    },
-                    buttonText:'创建评价',
                 },
-                field: 'name',
+                field: 'evaluationDTOList',
                 sort: '1',
                 visible: '1',
                 span: 24,
@@ -736,19 +819,20 @@ const { formOptions, setFormPropsValue: setFVal } = useBsForm({
             {
                 groupId: "5",
                 id: '27',
-                label: '',
-                component: interviewEvaluation,
+                label: '学信网核验',
+                component: FileUpload,
                 componentProps: {
-                    // setValue("a.b.0.sort", 1)
-                    create:createInterviewEvaluation,
-                    onClick:()=>{
-                        console.log('1111');
-                    },
+                    buttonText: '点击上传',
+                    listType: 'text',
+                    maxUploadSize: 1,
+                    accept: '.png,.jpg,.pdf'
                 },
-                field: 'name',
+                field: 'academicInformationNetwork',
                 sort: '1',
-                visible: '1', 
-                span: 24,
+                visible: '1',
+                required: '1',
+                tooltip: '支持png、jpg、pdf等常见报告格式',
+                span: 6,
                 formItemExtraProps: {
                     rules: [
                         {
@@ -763,19 +847,22 @@ const { formOptions, setFormPropsValue: setFVal } = useBsForm({
             {
                 groupId: "6",
                 id: '26',
-                label: '',
+                label: '附件上传',
                 component: FileUpload,
                 componentProps: {
-                    buttonText:'点击上传',
-                    listType:'text',
-                    maxUploadSize:3,
-                    accept:'.png,.jpg,jpeg,.pdf,.doc,.ppt,.mp4,.avi'
-                },
-                field: 'name',
+                    buttonText: '点击上传',
+                    listType: 'text',
+                    maxUploadSize: 3,
+                    accept: '.png,.jpg,jpeg,.pdf,.doc,.ppt,.mp4,.avi',
+                    onChange: (value) => {
+                        console.log(value);
+                    }
+                },
+                field: 'attachmentInformation',
                 sort: '1',
                 visible: '1',
                 span: 24,
-                tooltip:"附件上传 支持png、jpg、doc、ppt、pdf、mp4、avi等常见报告格式",
+                tooltip: "附件上传 支持png、jpg、doc、ppt、pdf、mp4、avi等常见报告格式",
                 formItemExtraProps: {
                     rules: [
                         {
@@ -788,13 +875,69 @@ const { formOptions, setFormPropsValue: setFVal } = useBsForm({
                 },
             },
         ],
-        // formData: {
-        //     name: '韩晓辉',
-        // },
+        formData: {
+            ...formDataInit
+        },
         formId: 'formId',
         formExtraProps: {},
     },
 });
+function transformData(field, val) {
+    const formData = getFValue('formData')
+    if (val === null || val === undefined) return;
+    formData[field] = String(Number(val)); // "001" → "1"
+}
+async function save() {
+    if (isEmpty(id)) {
+        /* 新增 */
+        const params = { ...getFValue('formData') }
+        console.log(params);
+        params.tel = parseInt(params.tel)
+        params.contactTel = parseInt(params.contactTel)
+        params.idCard = parseInt(params.idCard)
+        params.salaries = parseInt(params.salaries)
+        params.salaryNumber = parseInt(params.salaryNumber)
+        params.provinceCityDistrict = undefined
+
+        await bsFormRef.value.handlerFormValidator()
+        await children.value[0].childMethod()
+        await addPersonnel(params).then((res) => {
+            if (!res.ok) {
+                message.error(res.msg)
+                return
+            }
+            message.success('新增成功')
+        })
+    } else {
+        /* 编辑 */
+        updatePersonnel()
+    }
+}
+function reset() {
+    if (isEmpty(id)) {
+        /* 新增 */
+        setFVal('formData', formDataInit)
+    } else {
+        /* 编辑 */
+
+    }
+}
+onMounted(async () => {
+    if (!isEmpty(id)) {
+        await getPersonnelInfo(id).then((res) => {
+            setFVal('formData', res.data)
+            setFVal('formData.provinceCityDistrict', [parseInt(res.data.province) , parseInt(res.data.city), parseInt(res.data.district)])
+            setFVal('formData.post',res.data.post[0].valueCode)
+            setFVal('formData.type',res.data.type[0].valueCode)
+            setFVal('formData.degree',res.data.degree[0].valueCode)
+        })
+        await getInterviewEvaluation(id).then((res) => {
+            setFVal('formData.evaluationDTOList', [res.data])
+            console.log(getFValue('formData'));
+
+        })
+    }
+})
 </script>
 <style lang="scss" scoped>
 .personnel-entry {