|
|
@@ -1,11 +1,12 @@
|
|
|
<template>
|
|
|
+ <div>
|
|
|
<el-dialog
|
|
|
:visible.sync="dialogVisible"
|
|
|
- :width="fullscreen ? '100%' : '1080px'"
|
|
|
+ :width="fullscreen ? '100%' : '1280px'"
|
|
|
:top="fullscreen ? '0' : '3vh'"
|
|
|
append-to-body
|
|
|
:close-on-click-modal="false"
|
|
|
- :close-on-press-escape="true"
|
|
|
+ :close-on-press-escape="!showWorkTypeSelect"
|
|
|
:before-close="handleBeforeClose"
|
|
|
:custom-class="'employee-archive-dialog' + (fullscreen ? ' is-fullscreen' : '')"
|
|
|
@closed="resetForm"
|
|
|
@@ -18,7 +19,7 @@
|
|
|
:title="fullscreen ? '退出全屏' : '全屏'"
|
|
|
@click.stop="toggleFullscreen"
|
|
|
>
|
|
|
- <i :class="fullscreen ? 'el-icon-copy-document' : 'el-icon-full-screen'"></i>
|
|
|
+ <i :class="fullscreen ? 'el-icon-_compress' : 'el-icon-full-screen'"></i>
|
|
|
</button>
|
|
|
</div>
|
|
|
<div class="archive-form-summary">
|
|
|
@@ -91,8 +92,8 @@
|
|
|
<div class="subsection-title"><strong>组织与任职</strong></div>
|
|
|
<el-row :gutter="16">
|
|
|
<el-col :xs="24" :sm="12"><el-form-item label="工号" prop="employeeNo"><el-input
|
|
|
- v-model.trim="form.employeeNo" maxlength="20" placeholder="集团全局唯一"><el-button slot="append"
|
|
|
- :disabled="isEdit" @click="generateEmployeeNo">生成</el-button></el-input></el-form-item></el-col>
|
|
|
+ v-model.trim="form.employeeNo" maxlength="20" placeholder="集团全局唯一" disabled><el-button
|
|
|
+ v-if="!isEdit" slot="append" @click="generateEmployeeNo">生成</el-button></el-input></el-form-item></el-col>
|
|
|
<el-col :xs="24" :sm="12"><el-form-item label="用户账号"><el-input v-model.trim="form.account" maxlength="30"
|
|
|
placeholder="系统登录账号,支持自动生成、手动修改"><template
|
|
|
slot="prepend">@</template></el-input></el-form-item></el-col>
|
|
|
@@ -129,8 +130,9 @@
|
|
|
<el-col :xs="24" :sm="12"><el-form-item label="隶属部门"><el-cascader
|
|
|
:key="`dept-cascader-${form.groupId || 'none'}-${form.factoryId || 'none'}-${deptCascaderKey}`"
|
|
|
v-model="form.deptIds"
|
|
|
- :options="deptOptions" :props="deptCascaderProps" filterable clearable collapse-tags
|
|
|
- class="full-width"
|
|
|
+ :options="deptOptions" :props="deptCascaderProps" filterable clearable
|
|
|
+ :show-all-levels="false"
|
|
|
+ class="full-width dept-multi-cascader"
|
|
|
:disabled="!form.factoryId"
|
|
|
:placeholder="form.factoryId ? '请选择隶属部门(可多选)' : (form.groupId ? '请先选择所属工厂' : '请先选择所属机构')"
|
|
|
@change="handleOrganizationChange" /></el-form-item></el-col>
|
|
|
@@ -270,8 +272,8 @@
|
|
|
<div v-else-if="section.name === 'contract'" class="section-content">
|
|
|
<header class="section-title">
|
|
|
<div>
|
|
|
- <h3>合同与薪酬银行</h3>
|
|
|
- <p>劳动合同只读同步自合同管理;工资卡可在此维护</p>
|
|
|
+ <h3>劳动合同</h3>
|
|
|
+ <p>劳动合同只读同步自合同管理</p>
|
|
|
</div><span>{{ contractState }}</span>
|
|
|
</header>
|
|
|
<div class="subsection-title"><strong>劳动合同(只读)</strong></div>
|
|
|
@@ -292,7 +294,16 @@
|
|
|
<el-col :span="24"><el-form-item label="备注"><el-input :value="form.contract.remark" type="textarea"
|
|
|
:rows="2" readonly placeholder="—" /></el-form-item></el-col>
|
|
|
</el-row>
|
|
|
- <div class="subsection-title"><strong>薪酬银行</strong><el-button type="text" icon="el-icon-plus"
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <div v-else-if="section.name === 'payroll'" class="section-content">
|
|
|
+ <header class="section-title">
|
|
|
+ <div>
|
|
|
+ <h3>薪酬与社保</h3>
|
|
|
+ <p>工资卡银行账户与社保公积金参保记录</p>
|
|
|
+ </div><span>{{ form.socialSecurityRecords.length }} 条社保记录</span>
|
|
|
+ </header>
|
|
|
+ <div class="subsection-title"><strong>薪酬银行</strong><el-button type="primary" size="mini"
|
|
|
@click="addBankAccount">添加银行</el-button></div>
|
|
|
<div v-if="form.bankAccounts.length" class="repeat-list compact-list">
|
|
|
<div v-for="(item, index) in form.bankAccounts" :key="`bank-${index}`" class="repeat-row bank-row">
|
|
|
@@ -304,17 +315,8 @@
|
|
|
</div>
|
|
|
</div>
|
|
|
<div v-else class="inline-empty">暂无银行账户</div>
|
|
|
- </div>
|
|
|
|
|
|
- <div v-else-if="section.name === 'social'" class="section-content">
|
|
|
- <header class="section-title">
|
|
|
- <div>
|
|
|
- <h3>社保、资质与技能</h3>
|
|
|
- <p>社保公积金、工种、证照与技能列表</p>
|
|
|
- </div><span>{{ form.socialSecurityRecords.length }} 条社保记录</span>
|
|
|
- </header>
|
|
|
-
|
|
|
- <div class="subsection-title"><strong>社保公积金</strong><el-button type="text" icon="el-icon-plus"
|
|
|
+ <div class="subsection-title"><strong>社保公积金</strong><el-button type="primary" size="mini"
|
|
|
@click="addSocialSecurity">添加记录</el-button></div>
|
|
|
<div v-if="form.socialSecurityRecords.length" class="repeat-list">
|
|
|
<div v-for="(item, index) in form.socialSecurityRecords" :key="`ss-${index}`" class="repeat-block">
|
|
|
@@ -339,79 +341,111 @@
|
|
|
</div>
|
|
|
</div>
|
|
|
<div v-else class="inline-empty">暂无社保记录</div>
|
|
|
+ </div>
|
|
|
|
|
|
- <div class="subsection-title"><strong>工种</strong><el-button type="text" icon="el-icon-plus"
|
|
|
- @click="addWorkType">添加工种</el-button></div>
|
|
|
- <div v-if="form.workTypes.length" class="repeat-list">
|
|
|
- <div v-for="(item, index) in form.workTypes" :key="`wt-${index}`" class="repeat-block">
|
|
|
- <div class="repeat-block-heading"><strong>工种 {{ index + 1 }}</strong><el-button type="text"
|
|
|
- icon="el-icon-delete" @click="removeItem('workTypes', index)">删除</el-button></div>
|
|
|
- <el-row :gutter="14">
|
|
|
- <el-col :xs="12" :sm="6"><el-form-item label="类型"><el-select v-model="item.type" clearable
|
|
|
- class="full-width"><el-option v-for="opt in workTypeCategoryOptions" :key="opt" :label="opt"
|
|
|
- :value="opt" /></el-select></el-form-item></el-col>
|
|
|
- <el-col :xs="12" :sm="6"><el-form-item label="编码"><el-input v-model.trim="item.code"
|
|
|
- maxlength="20" /></el-form-item></el-col>
|
|
|
- <el-col :xs="12" :sm="6"><el-form-item label="名称"><el-input v-model.trim="item.name"
|
|
|
- maxlength="30" /></el-form-item></el-col>
|
|
|
- <el-col :xs="12" :sm="6"><el-form-item label="等级"><el-select v-model="item.level" clearable
|
|
|
- class="full-width"><el-option v-for="opt in workTypeLevelOptions" :key="opt" :label="opt"
|
|
|
- :value="opt" /></el-select></el-form-item></el-col>
|
|
|
- <el-col :xs="12" :sm="6"><el-form-item label="标准工时费"><el-input-number v-model="item.hourlyWage"
|
|
|
- :min="0" :precision="2" :controls="false" class="full-width" /></el-form-item></el-col>
|
|
|
- <el-col :xs="12" :sm="6"><el-form-item label="工时费单位"><el-select v-model="item.wageUnit" clearable
|
|
|
- class="full-width"><el-option v-for="opt in ['元/小时', '元/天', '元/件']" :key="opt" :label="opt"
|
|
|
- :value="opt" /></el-select></el-form-item></el-col>
|
|
|
- <el-col :xs="12" :sm="6"><el-form-item label="健康状况"><el-select v-model="item.healthStatus" clearable
|
|
|
- class="full-width"><el-option v-for="opt in ['优', '良', '一般', '差']" :key="opt" :label="opt"
|
|
|
- :value="opt" /></el-select></el-form-item></el-col>
|
|
|
- <el-col :xs="12" :sm="6"><el-form-item label="是否特种作业人员"><el-select v-model="item.specialOperator"
|
|
|
- class="full-width"><el-option label="是" value="是" /><el-option label="否"
|
|
|
- value="否" /></el-select></el-form-item></el-col>
|
|
|
- <el-col :span="24"><el-form-item label="证件照">
|
|
|
- <fileMain v-model="item.photo" size="mini" />
|
|
|
- </el-form-item></el-col>
|
|
|
- </el-row>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- <div v-else class="inline-empty">暂无工种记录</div>
|
|
|
+ <div v-else-if="section.name === 'qualification'" class="section-content">
|
|
|
+ <header class="section-title">
|
|
|
+ <div>
|
|
|
+ <h3>资质与技能</h3>
|
|
|
+ <p>工种、证照、技能与档案附件</p>
|
|
|
+ </div><span>{{ form.workTypes.length + form.certificates.length + form.skills.length }} 条资质记录</span>
|
|
|
+ </header>
|
|
|
|
|
|
- <div class="subsection-title"><strong>证照列表</strong><el-button type="text" icon="el-icon-plus"
|
|
|
- @click="addCertificate">添加证照</el-button></div>
|
|
|
- <div v-if="form.certificates.length" class="repeat-list">
|
|
|
- <div v-for="(item, index) in form.certificates" :key="`cert-${index}`" class="repeat-block">
|
|
|
- <div class="repeat-block-heading"><strong>证照 {{ index + 1 }}</strong><el-button type="text"
|
|
|
- icon="el-icon-delete" @click="removeItem('certificates', index)">删除</el-button></div>
|
|
|
- <el-row :gutter="14">
|
|
|
- <el-col :xs="12" :sm="6"><el-form-item label="证照类型" required><el-select v-model="item.type"
|
|
|
- class="full-width"><el-option v-for="opt in certificateTypeOptions" :key="opt" :label="opt"
|
|
|
- :value="opt" /></el-select></el-form-item></el-col>
|
|
|
- <el-col :xs="12" :sm="6"><el-form-item label="证照编号" required><el-input v-model.trim="item.number"
|
|
|
- maxlength="30" /></el-form-item></el-col>
|
|
|
- <el-col :xs="12" :sm="6"><el-form-item label="等级"><el-select v-model="item.level" clearable
|
|
|
- class="full-width"><el-option v-for="opt in certificateLevelOptions" :key="opt" :label="opt"
|
|
|
- :value="opt" /></el-select></el-form-item></el-col>
|
|
|
- <el-col :xs="12" :sm="6"><el-form-item label="状态" required><el-select v-model="item.status"
|
|
|
- class="full-width"><el-option label="有效" value="有效" /><el-option label="失效"
|
|
|
- value="失效" /></el-select></el-form-item></el-col>
|
|
|
- <el-col :xs="12" :sm="6"><el-form-item label="有效期开始时间" required><el-date-picker
|
|
|
- v-model="item.startDate" value-format="yyyy-MM-dd" type="date" placeholder="请选择"
|
|
|
- class="full-width" /></el-form-item></el-col>
|
|
|
- <el-col :xs="12" :sm="6"><el-form-item label="有效期结束时间" required><el-date-picker v-model="item.endDate"
|
|
|
- value-format="yyyy-MM-dd" type="date" placeholder="请选择"
|
|
|
- class="full-width" /></el-form-item></el-col>
|
|
|
- <el-col :xs="12" :sm="6"><el-form-item label="颁布日期"><el-date-picker v-model="item.issueDate"
|
|
|
- value-format="yyyy-MM-dd" type="date" placeholder="请选择"
|
|
|
- class="full-width" /></el-form-item></el-col>
|
|
|
- <el-col :xs="12" :sm="6"><el-form-item label="证照附件">
|
|
|
- <fileMain v-model="item.attachment" size="mini" />
|
|
|
- </el-form-item></el-col>
|
|
|
- <el-col :span="24"><el-form-item label="备注"><el-input v-model.trim="item.remark" maxlength="200"
|
|
|
- placeholder="补充说明信息" /></el-form-item></el-col>
|
|
|
- </el-row>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- <div v-else class="inline-empty">暂无证照记录</div>
|
|
|
+ <div class="subsection-title"><strong>工种</strong><el-button type="primary" size="mini"
|
|
|
+ @click="openWorkTypeSelect">添加工种</el-button></div>
|
|
|
+ <el-table :data="form.workTypes" border size="small" class="work-type-table" empty-text="暂无工种记录">
|
|
|
+ <el-table-column type="index" label="序号" width="55" align="center" />
|
|
|
+ <el-table-column label="类型" min-width="110" show-overflow-tooltip
|
|
|
+ :formatter="workTypeTypeLabel" />
|
|
|
+ <el-table-column prop="code" label="编码" min-width="110" show-overflow-tooltip />
|
|
|
+ <el-table-column prop="name" label="名称" min-width="110" show-overflow-tooltip />
|
|
|
+ <el-table-column label="等级" min-width="110" show-overflow-tooltip
|
|
|
+ :formatter="workTypeLevelLabel" />
|
|
|
+ <el-table-column label="标准工时费" min-width="110" show-overflow-tooltip
|
|
|
+ :formatter="workTypeHourCostLabel" />
|
|
|
+ <el-table-column label="工时费单位" min-width="110" show-overflow-tooltip
|
|
|
+ :formatter="workTypeUnitLabel" />
|
|
|
+ <el-table-column label="操作" width="90" align="left">
|
|
|
+ <template slot-scope="{ $index }">
|
|
|
+ <el-popconfirm class="ele-action" title="确定要删除当前工种吗?"
|
|
|
+ @confirm="removeItem('workTypes', $index)">
|
|
|
+ <el-link slot="reference" type="danger" :underline="false" icon="el-icon-delete">删除</el-link>
|
|
|
+ </el-popconfirm>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ </el-table>
|
|
|
+
|
|
|
+ <div class="subsection-title"><strong>资质证照列表</strong><el-button type="primary" size="mini"
|
|
|
+ @click="addCertificate">添加资质证照</el-button></div>
|
|
|
+ <el-table :data="form.certificates" border size="small" class="certificate-table" empty-text="暂无资质证照记录">
|
|
|
+ <el-table-column type="index" label="序号" width="55" align="center" />
|
|
|
+ <el-table-column min-width="130">
|
|
|
+ <template slot="header"><span class="cell-required">证照类型</span></template>
|
|
|
+ <template slot-scope="{ row }">
|
|
|
+ <el-select v-model="row.type" placeholder="请选择" class="full-width">
|
|
|
+ <el-option v-for="opt in certificateTypeOptions" :key="opt" :label="opt" :value="opt" />
|
|
|
+ </el-select>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column min-width="130">
|
|
|
+ <template slot="header"><span class="cell-required">证照编号</span></template>
|
|
|
+ <template slot-scope="{ row }">
|
|
|
+ <el-input v-model.trim="row.number" maxlength="30" placeholder="请输入" />
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column label="等级" min-width="110">
|
|
|
+ <template slot-scope="{ row }">
|
|
|
+ <el-select v-model="row.level" clearable placeholder="请选择" class="full-width">
|
|
|
+ <el-option v-for="opt in certificateLevelOptions" :key="opt" :label="opt" :value="opt" />
|
|
|
+ </el-select>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column min-width="150">
|
|
|
+ <template slot="header"><span class="cell-required">有效期开始时间</span></template>
|
|
|
+ <template slot-scope="{ row }">
|
|
|
+ <el-date-picker v-model="row.startDate" value-format="yyyy-MM-dd" type="date" placeholder="选择日期"
|
|
|
+ class="full-width" />
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column min-width="150">
|
|
|
+ <template slot="header"><span class="cell-required">有效期结束时间</span></template>
|
|
|
+ <template slot-scope="{ row }">
|
|
|
+ <el-date-picker v-model="row.endDate" value-format="yyyy-MM-dd" type="date" placeholder="选择日期"
|
|
|
+ class="full-width" />
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column label="颁布日期" min-width="150">
|
|
|
+ <template slot-scope="{ row }">
|
|
|
+ <el-date-picker v-model="row.issueDate" value-format="yyyy-MM-dd" type="date" placeholder="选择日期"
|
|
|
+ class="full-width" />
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column label="证照附件" min-width="140">
|
|
|
+ <template slot-scope="{ row }">
|
|
|
+ <fileMain v-model="row.attachment" size="mini" />
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column min-width="110">
|
|
|
+ <template slot="header"><span class="cell-required">状态</span></template>
|
|
|
+ <template slot-scope="{ row }">
|
|
|
+ <el-select v-model="row.status" placeholder="请选择" class="full-width">
|
|
|
+ <el-option label="有效" value="有效" />
|
|
|
+ <el-option label="失效" value="失效" />
|
|
|
+ </el-select>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column label="备注" min-width="140">
|
|
|
+ <template slot-scope="{ row }">
|
|
|
+ <el-input v-model.trim="row.remark" maxlength="200" placeholder="请输入" />
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column label="操作" width="90" align="center">
|
|
|
+ <template slot-scope="{ $index }">
|
|
|
+ <el-button type="text" icon="el-icon-delete" class="certificate-delete-btn"
|
|
|
+ @click="removeItem('certificates', $index)">删除</el-button>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ </el-table>
|
|
|
|
|
|
<div class="subsection-title"><strong>技能列表</strong><el-button type="text" icon="el-icon-plus"
|
|
|
@click="addSkill">添加技能</el-button></div>
|
|
|
@@ -462,10 +496,19 @@
|
|
|
</span>
|
|
|
</span>
|
|
|
</el-dialog>
|
|
|
+ <aptitude-dialog
|
|
|
+ ref="workTypeSelect"
|
|
|
+ :disabled-ids="selectedWorkTypeIds"
|
|
|
+ @success="handleWorkTypeSelect"
|
|
|
+ @update:visible="showWorkTypeSelect = $event"
|
|
|
+ />
|
|
|
+ </div>
|
|
|
</template>
|
|
|
|
|
|
<script>
|
|
|
import EmployeeArchiveRecords from './EmployeeArchiveRecords.vue';
|
|
|
+import AptitudeDialog from '@/views/hrManagement/jobManagement/components/aptitudeDialog.vue';
|
|
|
+import dictMixins from '@/mixins/dictMixins';
|
|
|
import {
|
|
|
getPositionPage,
|
|
|
getPositionById,
|
|
|
@@ -504,7 +547,8 @@ const emptyForm = () => ({
|
|
|
|
|
|
export default {
|
|
|
name: 'EmployeeArchiveForm',
|
|
|
- components: { EmployeeArchiveRecords },
|
|
|
+ components: { EmployeeArchiveRecords, AptitudeDialog },
|
|
|
+ mixins: [dictMixins],
|
|
|
props: {
|
|
|
visible: Boolean,
|
|
|
employee: { type: Object, default: null },
|
|
|
@@ -555,11 +599,18 @@ export default {
|
|
|
};
|
|
|
return {
|
|
|
activeTab: 'base', saving: false, fullscreen: false, form: emptyForm(), organizationTree: [],
|
|
|
+ showWorkTypeSelect: false,
|
|
|
+ workTypeLevelOptions: [
|
|
|
+ { label: '初级', value: '1' },
|
|
|
+ { label: '中级', value: '2' },
|
|
|
+ { label: '高级', value: '3' }
|
|
|
+ ],
|
|
|
sections: [
|
|
|
{ name: 'base', label: '基本信息', subtitle: '身份/任职/联系', icon: 'el-icon-user' },
|
|
|
{ name: 'experience', label: '教育与履历', subtitle: '学习与工作经历', icon: 'el-icon-notebook-2' },
|
|
|
- { name: 'contract', label: '合同与薪酬', subtitle: '合同与银行', icon: 'el-icon-document-checked' },
|
|
|
- { name: 'social', label: '社保与资质', subtitle: '证照与附件', icon: 'el-icon-medal' },
|
|
|
+ { name: 'contract', label: '合同', subtitle: '劳动合同信息', icon: 'el-icon-document-checked' },
|
|
|
+ { name: 'payroll', label: '薪酬与社保', subtitle: '银行/社保公积金', icon: 'el-icon-bank-card' },
|
|
|
+ { name: 'qualification', label: '资质证照', subtitle: '工种/证照/技能', icon: 'el-icon-medal' },
|
|
|
{ name: 'records', label: '业务记录', subtitle: '考勤绩效与异动', icon: 'el-icon-tickets' }
|
|
|
],
|
|
|
// 岗位设定列表(岗位下拉数据源)
|
|
|
@@ -587,8 +638,6 @@ export default {
|
|
|
factoryLoading: false,
|
|
|
socialSecurityOptions: ['四险', '四险一金', '五险', '五险一金', '六险一金'],
|
|
|
contractTypeOptions: ['固定期限', '无固定期限', '以完成一定工作任务为期限', '劳务协议', '实习协议'],
|
|
|
- workTypeCategoryOptions: ['维修', '装配', '检验', '机加', '焊接', '其他'],
|
|
|
- workTypeLevelOptions: ['初级', '中级', '高级', '技师', '高级技师'],
|
|
|
certificateTypeOptions: ['身份证', '护照', '特种作业证', '职称证', '职业资格证', '其他'],
|
|
|
certificateLevelOptions: ['初级', '中级', '高级'],
|
|
|
skillCategoryOptions: ['专业技能', '办公技能', '语言技能', '特种操作技能', '其他'],
|
|
|
@@ -734,8 +783,9 @@ export default {
|
|
|
return {
|
|
|
base: count(['name', 'employeeNo', 'groupId', 'factory', 'deptIds', 'status', 'hireDate', 'positionId', 'employmentType', 'staffingLevel', 'gender', 'birthDate', 'idCard', 'ethnic', 'politicalStatus', 'maritalStatus', 'nativePlace', 'education', 'school', 'phone', 'email', 'wechat', 'currentAddress', 'registeredAddress', 'workAddress', 'emergencyContact', 'emergencyPhone', 'keyProcess']),
|
|
|
experience: count(['educations', 'previousJobs']),
|
|
|
- contract: `${[this.form.contract.number, this.form.contract.type, this.form.bankName, this.form.bankAccount].filter(Boolean).length}/4`,
|
|
|
- social: count(['socialSecurityRecords', 'workTypes', 'certificates', 'skills', 'files']),
|
|
|
+ contract: `${[this.form.contract.number || this.form.contract.name, this.form.contract.startDate, this.form.contract.endDate].filter(Boolean).length}/3`,
|
|
|
+ payroll: count(['bankAccounts', 'socialSecurityRecords']),
|
|
|
+ qualification: count(['workTypes', 'certificates', 'skills', 'files']),
|
|
|
records: `${['attendanceRecords', 'performanceRecords', 'trainingRecords', 'rewardPunishmentRecords', 'awards', 'positionTransfers', 'contractChanges'].reduce((sum, key) => sum + this.form[key].length, 0) + (this.form.leaveInfo.enabled ? 1 : 0)}`
|
|
|
};
|
|
|
},
|
|
|
@@ -743,7 +793,15 @@ export default {
|
|
|
const values = [this.form.name, this.form.employeeNo, this.form.groupId, this.form.positionId, this.form.status, this.form.hireDate, this.form.phone, this.form.gender, this.form.email, this.form.birthDate, this.form.education, this.form.school, this.form.currentAddress, this.form.contract.number, this.form.bankAccount, this.form.insuredDate, this.form.skills.length, this.form.files.length];
|
|
|
return Math.round(values.filter(Boolean).length / values.length * 100);
|
|
|
},
|
|
|
- contractState() { return this.form.contract.name ? (this.form.contract.endDate ? '合同资料已填写' : '待补结束日期') : '待录入合同'; }
|
|
|
+ contractState() { return this.form.contract.name ? (this.form.contract.endDate ? '合同资料已填写' : '待补结束日期') : '待录入合同'; },
|
|
|
+ selectedWorkTypeIds() {
|
|
|
+ return (this.form.workTypes || [])
|
|
|
+ .map((item) => item.id)
|
|
|
+ .filter((id) => id != null && id !== '');
|
|
|
+ }
|
|
|
+ },
|
|
|
+ created() {
|
|
|
+ this.requestDict('工种类型');
|
|
|
},
|
|
|
watch: { visible(value) { if (value) this.loadForm(); } },
|
|
|
methods: {
|
|
|
@@ -799,7 +857,7 @@ export default {
|
|
|
skills: (source.skills || []).map((item) => (typeof item === 'string' ? { name: item, category: '', level: '', years: 0, attachment: [], remark: '' } : { ...item, attachment: toDocIds(item.attachment) })),
|
|
|
certificates: (source.certificates || []).map((item) => ({ ...item, attachment: toDocIds(item.attachment) })),
|
|
|
socialSecurityRecords: source.socialSecurityRecords || [],
|
|
|
- workTypes: (source.workTypes || []).map((item) => ({ ...item, photo: toDocIds(item.photo) })),
|
|
|
+ workTypes: (source.workTypes || []).map((item) => this.mapProfessionToWorkType(item)),
|
|
|
attendanceRecords: source.attendanceRecords || [], performanceRecords: source.performanceRecords || [],
|
|
|
trainingRecords: (source.trainingRecords || []).map((item) => ({ ...item, attachment: toDocIds(item.attachment) })),
|
|
|
rewardPunishmentRecords: (source.rewardPunishmentRecords || []).map((item) => ({ ...item, attachment: toDocIds(item.attachment) })), awards: source.awards || [], positionTransfers: source.positionTransfers || [], contractChanges: source.contractChanges || []
|
|
|
@@ -1325,6 +1383,7 @@ export default {
|
|
|
this.factoryLoading = false;
|
|
|
this.staffingLevelOptions = [];
|
|
|
this.positionOptions = [];
|
|
|
+ this.showWorkTypeSelect = false;
|
|
|
this._managerRequestKey = '';
|
|
|
this.$nextTick(() => {
|
|
|
this.form = emptyForm();
|
|
|
@@ -1591,7 +1650,56 @@ export default {
|
|
|
addBankAccount() { this.form.bankAccounts.push({ bankName: '', bankAccount: '', bankAccountName: '' }); },
|
|
|
addPreviousJob() { this.form.previousJobs.push({ startDate: '', endDate: '', company: '', position: '', department: '', leaveReason: '', description: '' }); },
|
|
|
addSocialSecurity() { this.form.socialSecurityRecords.push({ type: '五险一金', base: 0, insuredDate: '', stopDate: '', stopReason: '' }); },
|
|
|
- addWorkType() { this.form.workTypes.push({ type: '', code: '', name: '', level: '', hourlyWage: 0, wageUnit: '元/小时', healthStatus: '优', specialOperator: '否', photo: [] }); },
|
|
|
+ workTypeTypeLabel(_row, _column, cellValue) {
|
|
|
+ const type = _row?.type ?? cellValue;
|
|
|
+ return this.getDictValue('工种类型', type) || type || '-';
|
|
|
+ },
|
|
|
+ workTypeLevelLabel(_row, _column, cellValue) {
|
|
|
+ const level = _row?.level ?? cellValue;
|
|
|
+ const hit = this.workTypeLevelOptions.find(
|
|
|
+ (item) => String(item.value) === String(level) || item.label === level,
|
|
|
+ );
|
|
|
+ return hit?.label || level || '-';
|
|
|
+ },
|
|
|
+ workTypeHourCostLabel(row) {
|
|
|
+ const wage = row.hourCost ?? row.hourlyWage;
|
|
|
+ return wage || wage === 0 ? wage : '-';
|
|
|
+ },
|
|
|
+ workTypeUnitLabel(row) {
|
|
|
+ return row.unit || row.wageUnit || '-';
|
|
|
+ },
|
|
|
+ mapProfessionToWorkType(item = {}) {
|
|
|
+ const unit = item.unit || (item.money && item.date ? `${item.money}/${item.date}` : '') || item.wageUnit || '';
|
|
|
+ return {
|
|
|
+ id: item.id,
|
|
|
+ type: item.type || '',
|
|
|
+ code: item.code || '',
|
|
|
+ name: item.name || '',
|
|
|
+ level: item.level || '',
|
|
|
+ hourCost: item.hourCost ?? item.hourlyWage ?? '',
|
|
|
+ unit,
|
|
|
+ hourlyWage: item.hourCost ?? item.hourlyWage ?? 0,
|
|
|
+ wageUnit: unit,
|
|
|
+ userId: item.userId || '',
|
|
|
+ userName: item.userName || '',
|
|
|
+ };
|
|
|
+ },
|
|
|
+ openWorkTypeSelect() {
|
|
|
+ this.showWorkTypeSelect = true;
|
|
|
+ this.$refs.workTypeSelect?.open();
|
|
|
+ },
|
|
|
+ handleWorkTypeSelect(selection) {
|
|
|
+ const existIds = new Set(
|
|
|
+ (this.form.workTypes || []).map((item) => String(item.id)).filter((id) => id && id !== 'undefined'),
|
|
|
+ );
|
|
|
+ (selection || []).forEach((item) => {
|
|
|
+ const mapped = this.mapProfessionToWorkType(item);
|
|
|
+ const id = mapped.id == null || mapped.id === '' ? '' : String(mapped.id);
|
|
|
+ if (id && existIds.has(id)) return;
|
|
|
+ this.form.workTypes.push(mapped);
|
|
|
+ if (id) existIds.add(id);
|
|
|
+ });
|
|
|
+ },
|
|
|
addCertificate() { this.form.certificates.push({ type: '', number: '', level: '', status: '有效', startDate: '', endDate: '', issueDate: '', attachment: [], remark: '' }); },
|
|
|
addSkill() { this.form.skills.push({ category: '', name: '', level: '', years: 0, attachment: [], remark: '' }); },
|
|
|
removeItem(key, index) { this.form[key].splice(index, 1); },
|
|
|
@@ -1860,22 +1968,22 @@ export default {
|
|
|
// 劳动合同已改为只读,不再在档案页校验必填/日期
|
|
|
// 薪酬银行:姓名必填
|
|
|
for (const item of this.form.bankAccounts || []) {
|
|
|
- if (!item.bankAccountName) return { tab: 'contract', message: '薪酬银行的姓名(开户人)必填' };
|
|
|
+ if (!item.bankAccountName) return { tab: 'payroll', message: '薪酬银行的姓名(开户人)必填' };
|
|
|
}
|
|
|
// 社保记录:停保≥参保
|
|
|
for (const item of this.form.socialSecurityRecords || []) {
|
|
|
- if (gt(item.insuredDate, item.stopDate)) return { tab: 'social', message: '社保停保日期不能早于参保日期' };
|
|
|
+ if (gt(item.insuredDate, item.stopDate)) return { tab: 'payroll', message: '社保停保日期不能早于参保日期' };
|
|
|
}
|
|
|
// 证照:类型/编号/状态/有效期必填,有效期结束≥开始
|
|
|
for (const item of this.form.certificates || []) {
|
|
|
if (!item.type || !item.number || !item.status || !item.startDate || !item.endDate) {
|
|
|
- return { tab: 'social', message: '证照的必填项未完善(证照类型、证照编号、状态、有效期起止)' };
|
|
|
+ return { tab: 'qualification', message: '证照的必填项未完善(证照类型、证照编号、状态、有效期起止)' };
|
|
|
}
|
|
|
- if (gt(item.startDate, item.endDate)) return { tab: 'social', message: '证照有效期结束时间不能早于开始时间' };
|
|
|
+ if (gt(item.startDate, item.endDate)) return { tab: 'qualification', message: '证照有效期结束时间不能早于开始时间' };
|
|
|
}
|
|
|
// 技能:技能名称必填
|
|
|
for (const item of this.form.skills || []) {
|
|
|
- if (!item.name) return { tab: 'social', message: '技能名称必填' };
|
|
|
+ if (!item.name) return { tab: 'qualification', message: '技能名称必填' };
|
|
|
}
|
|
|
return null;
|
|
|
},
|