对接ESC任务 标签申请

This commit is contained in:
wangchengming 2025-07-08 22:31:06 +08:00
parent a7495f83b4
commit 8e26c3f9ff
9 changed files with 297 additions and 144 deletions

View File

@ -11,7 +11,7 @@ export function getCurrentUserList(query) {
// ESC获取员工资质证书情况列表
export function getUserCertificateList(query) {
return request({
url: 'admin/busUserQualificationCertificate/getList',
url: '/admin/busUserQualificationCertificate/getList',
method: 'post',
data: query
})

View File

@ -46,9 +46,14 @@
<el-table-column prop="userName" label="员工姓名" width="130" />
<el-table-column prop="sourceLabelId" label="当前标签" width="130" />
<el-table-column prop="labelId" label="申请标签" width="130" />
<el-table-column prop="state" label="状态" width="120">
<el-table-column prop="state" label="状态" width="180">
<template #default="scope">
<el-text v-if="scope.row.state == 1" type="info" class="infoinfoText">待审核</el-text>
<el-text v-if="scope.row.state == 1 && scope.row.node == 0" type="info"
class="infoinfoText">待审核</el-text>
<el-text v-if="scope.row.state == 1 && scope.row.node == 1" type="info"
class="infoinfoText">待审核</el-text>
<el-text v-if="scope.row.state == 1 && scope.row.node == 2" type="info"
class="infoinfoText">待标签管理员审核</el-text>
<el-text v-if="scope.row.state == 2" type="success" class="successText">通过</el-text>
<el-text v-if="scope.row.state == 9" type="danger" class="dangerText">驳回</el-text>
</template>

View File

@ -21,90 +21,102 @@
<div class="applyFormContainer">
<el-row class="myRow" :gutter="20">
<el-col :span="8">
<el-form-item label="申请标签" prop="targetQualification">
<el-select v-model="ruleForm.targetQualification" placeholder="请选择申请标签">
<el-option label="Zone one" value="shanghai" />
<el-option label="Zone two" value="beijing" />
<el-form-item label="申请标签" prop="labelId">
<el-select v-model="ruleForm.labelId" placeholder="请选择申请标签" clearable
@change="handleChoseLabl">
<el-option v-for="dict in bus_label" :key="dict.value" :label="dict.label"
:value="dict.value" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="员工工号" prop="employeeNumber">
<el-input v-model="ruleForm.employeeNumber" placeholder="请输入员工工号" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="员工姓名(中文)" prop="employeeChineseName">
<el-input v-model="ruleForm.employeeChineseName" placeholder="请输入员工姓名(中文)" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="员工姓名(英文)" prop="employeeEnglishName">
<el-input v-model="ruleForm.employeeEnglishName" placeholder="请输入员工姓名(英文)" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="部门" prop="departmentName">
<el-select v-model="ruleForm.departmentName" placeholder="请选择部门">
<el-option label="Zone one" value="shanghai" />
<el-option label="Zone two" value="beijing" />
<el-form-item label="员工姓名(中文)" prop="userId">
<el-select v-model="ruleForm.userId" filterable placeholder="请选择员工姓名(中文)"
@change="selectChanged">
<el-option v-for="item in allUsers" :key="item.userId"
:label="`${item.nickName}${item.dept?.deptName || '无部门'}`"
:value="item.userId" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="科室" prop="officeName">
<el-select v-model="ruleForm.officeName" placeholder="请选择科室">
<el-option label="Zone one" value="shanghai" />
<el-option label="Zone two" value="beijing" />
<el-form-item label="员工姓名(英文)" prop="englishName">
<el-input v-model="ruleForm.englishName" placeholder="请输入员工姓名(英文)" disabled />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="员工工号" prop="workNo">
<el-input v-model="ruleForm.workNo" placeholder="请输入员工工号" disabled />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="部门" prop="deptId">
<el-tree-select v-model="ruleForm.deptId" :data="enabledDeptOptions" disabled
:props="{ value: 'id', label: 'label', children: 'children' }" value-key="id"
placeholder="请选择部门" check-strictly />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="科室" prop="sectionId">
<el-select v-model="ruleForm.sectionId" placeholder="请选择科室" disabled>
<el-option v-for="item in sectionData" :key="item.sectionId"
:label="item.sectionName" :value="item.sectionId" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="属地" prop="localityName">
<el-select v-model="ruleForm.localityName" placeholder="请选择属地">
<el-option label="Zone one" value="shanghai" />
<el-option label="Zone two" value="beijing" />
<el-form-item label="属地" prop="dependencyId">
<el-select v-model="ruleForm.dependencyId" placeholder="请选择属地" disabled>
<el-option v-for="item in busDependencyData" :key="item.id"
:label="item.dependencyName" :value="item.id" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="属地ESC" prop="localityManager">
<el-input v-model="ruleForm.localityManager" />
<el-form-item label="属地ESC" prop="escUserName">
<el-input v-model="ruleForm.escUserName" disabled />
</el-form-item>
</el-col>
</el-row>
</div>
<div class="headerTitle">前置条件</div>
<div class="applyFormContainer">
<div class="headerTitle" v-if="ruleForm.labelId">申请信息</div>
<div class="applyFormContainer" v-if="ruleForm.labelId">
<el-table :data="tableData" style="width: 100%">
<el-table-column prop="name" label="资质名称" width="100" />
<el-table-column prop="certificate" label="资质证书" align="center">
<el-table-column prop="qualificationName" label="资质名称" width="100" />
<el-table-column prop="certificateUrl" label="资质证书" align="center">
<template #default="scope">
<el-image v-if="scope.row.certificate"
<el-image v-if="scope.row.certificateUrl"
style="width: 70px; height: 44px;line-height: 50px;"
:src="scope.row.certificate" fit="fill" />
:src="baseUrl + scope.row.certificateUrl" fit="fill" />
<span v-else>请在"ESC任务->资质上传"上传资质证书</span>
</template>
</el-table-column>
<el-table-column prop="expired" label="是否过期" width="120">
<el-table-column prop="status" label="是否过期" width="120">
<template #default="scope">
<el-text v-if="scope.row.expired == false && scope.row.certificate" type="success"
<el-text v-if="scope.row.status == 1 && scope.row.certificateUrl" type="success"
class="successText">正常</el-text>
<el-text v-if="scope.row.expired == true && scope.row.certificate" type="danger"
<el-text v-else-if="scope.row.status == 2 && scope.row.certificateUrl" type="danger"
class="dangerText">过期</el-text>
<span v-else>-</span>
</template>
</el-table-column>
<el-table-column prop="startTime" label="有效开始日期" width="150">
<template #default="scope">
<span v-if="scope.row.startTime && scope.row.certificate"> {{ scope.row.startTime
}}</span>
<span v-if="scope.row.startTime"> {{
moment(scope.row.startTime).format('YYYY-MM-DD')
}}</span>
<span v-else>-</span>
</template>
</el-table-column>
<el-table-column prop="expireTime" label="到期日期" width="130">
<template #default="scope">
<span v-if="scope.row.expireTime && scope.row.certificate"> {{ scope.row.expireTime
<span v-if="scope.row.expireFlag == 0">长期</span>
<template v-else>
<span v-if="scope.row.expireTime"> {{
moment(scope.row.expireTime).format('YYYY-MM-DD')
}}</span>
<span v-else>-</span>
<span v-else>-</span>
</template>
</template>
</el-table-column>
</el-table>
@ -122,9 +134,14 @@
</template>
<script setup>
import { reactive } from 'vue'
import { Plus } from '@element-plus/icons-vue'
import { onMounted, reactive, ref } from 'vue'
import { deptTreeSelect, listUser } from "@/api/system/user"
import { getBusDependencyPage } from "@/api/system/dependency"
import { getSysSectionPage } from "@/api/system/section"
import { submitBusUserLabel } from "@/api/labelManage/labelManage"
import { getUserCertificateList } from "@/api/qualification/myQualifications"
import { useRouter } from 'vue-router'
import moment from 'moment'
const router = useRouter()
const levelList = ref([
@ -132,72 +149,178 @@ const levelList = ref([
{ title: 'ESC任务', path: '/qualification/escTask' },
{ title: '标签申请', path: '/qualification/escTask/lableApplyForm' }
])
const { proxy } = getCurrentInstance()
const { bus_label } = proxy.useDict("bus_label")
const data = reactive({
ruleForm: {},
rules: {
targetQualification: [{ required: true, message: "目标资质不能为空", trigger: "change" }],
employeeNumber: [{ required: true, message: "员工工号不能为空", trigger: "blur" }],
employeeChineseName: [{ required: true, message: "员工姓名(中文)不能为空", trigger: "blur" }],
employeeEnglishName: [{ required: true, message: "员工姓名(英文)", trigger: "blur" }],
departmentName: [{ required: true, message: "部门不能为空", trigger: "change" }],
officeName: [{ required: true, message: "科室不能为空", trigger: "change" }],
localityName: [{ required: true, message: "属地不能为空", trigger: "change" }],
localityManager: [{ required: true, message: "属地ESC不能为空", trigger: "blur" }],
labelId: [{ required: true, message: "申请标签不能为空", trigger: "change" }],
workNo: [{ required: true, message: "员工工号不能为空", trigger: "blur" }],
userName: [{ required: true, message: "员工姓名(中文)不能为空", trigger: "blur" }],
englishName: [{ required: true, message: "员工姓名(英文)", trigger: "blur" }],
deptId: [{ required: true, message: "部门不能为空", trigger: "change" }],
sectionId: [{ required: true, message: "科室不能为空", trigger: "change" }],
dependencyId: [{ required: true, message: "属地不能为空", trigger: "change" }],
escUserName: [{ required: true, message: "属地ESC不能为空", trigger: "blur" }],
},
})
const tableData = [
{
name: '电工证',
certificate: 'https://fuss10.elemecdn.com/e/5d/4a731a90594a4af544c0c25941171jpeg.jpeg',
expired: false,
startTime: '2016-05-03',
expireTime: '2019-05-03',
},
{
name: 'SH',
certificate: 'https://fuss10.elemecdn.com/e/5d/4a731a90594a4af544c0c25941171jpeg.jpeg',
expired: false,
startTime: '2016-05-03',
expireTime: '2019-05-03',
},
{
name: 'ES',
certificate: 'https://fuss10.elemecdn.com/e/5d/4a731a90594a4af544c0c25941171jpeg.jpeg',
expired: false,
startTime: '2016-05-03',
expireTime: '2019-05-03',
},
{
name: 'ESC',
certificate: null,
expired: null,
startTime: '2016-05-03',
expireTime: '2019-05-03',
},
{
name: 'CESC',
certificate: null,
expired: null,
startTime: '2016-05-03',
expireTime: '2019-05-03',
},
{
name: '急救证',
certificate: null,
expired: null,
startTime: '2016-05-03',
expireTime: '2019-05-03',
},
{
name: 'LLP',
certificate: 'https://fuss10.elemecdn.com/e/5d/4a731a90594a4af544c0c25941171jpeg.jpeg',
expired: true,
startTime: '2016-05-03',
expireTime: '2019-05-03',
},
]
const { ruleForm, rules } = toRefs(data)
const queryParams = ref({
pageIndex: 1,
pageSize: 10,
})
const requiredQualifications = ref([])
const loading = ref(true)
const tableData = ref([])
const baseUrl = import.meta.env.VITE_APP_BASE_API
//
onMounted(() => {
getAllUser()
getBusDependencyData()
getDeptTree()
getSysSectionData()
});
//
const allUsers = ref([])
// ,
const getAllUser = () => {
listUser({
status: '0',
pageNum: 1,
pageSize: 5000
}).then(res => {
allUsers.value = res.rows
})
}
//
const busDependencyData = ref([])
//
const getBusDependencyData = () => {
getBusDependencyPage({
pageIndex: 1,
pageSize: 100,
}).then(response => {
if (response.code == 200) {
busDependencyData.value = response.data.list
}
})
}
//
const enabledDeptOptions = ref(undefined)
//
const getDeptTree = () => {
deptTreeSelect().then(res => {
enabledDeptOptions.value = filterDisabledDept(JSON.parse(JSON.stringify(res.data)))
})
}
/** 过滤禁用的部门 */
const filterDisabledDept = (deptList) => {
return deptList.filter(dept => {
if (dept.disabled) {
return false
}
if (dept.children && dept.children.length) {
dept.children = filterDisabledDept(dept.children)
}
return true
})
}
//
const sectionData = ref([])
//
const getSysSectionData = () => {
getSysSectionPage({
pageIndex: 1,
pageSize: 100,
}).then(res => {
if (res.code == 200) {
sectionData.value = res.data.list
}
})
}
//
const selectChanged = async (value) => {
const curUser = allUsers.value.find(item => item.userId == value)
console.log('当前用户信息', curUser)
//UserId ESC
ruleForm.value.userId = curUser.userId;
ruleForm.value.workNo = curUser.workNo;
ruleForm.value.userName = curUser.nickName;
ruleForm.value.englishName = curUser.englishName;
ruleForm.value.deptId = curUser.deptId;
ruleForm.value.sectionId = curUser.sectionId;
ruleForm.value.dependencyId = curUser.dependencyId;
ruleForm.value.escUserName = curUser.escUserName;
loading.value = true;
const res = await getUserQualification();
console.log('获取接口完毕', res);
loading.value = false;
// Filter the data
tableData.value = res.filter(item =>
requiredQualifications.value.some(qualification =>
item.qualificationName === qualification
))
}
//
const handleChoseLabl = async (val) => {
try {
// Define the qualifications mapping
const qualificationsMap = {
'SH': ['电工证', 'SH'],
'ES': ['电工证', 'ES'],
'ESC': ['电工证', 'ESC'],
'CESC': ['电工证', 'CESC'],
'SH+LLP': ['电工证', 'SH', 'LLP', '急救证'],
'ES+LLP': ['电工证', 'ES', 'LLP', '急救证'],
'ESC+LLP': ['电工证', 'ESC', 'LLP', '急救证'],
'CESC+LLP': ['电工证', 'CESC', 'LLP', '急救证']
};
// Get the required qualifications or default to empty array
requiredQualifications.value = qualificationsMap[val] || [];
console.log('rwerwe', requiredQualifications)
if (ruleForm.value.userId) {
loading.value = true;
const res = await getUserQualification();
console.log('获取接口完毕', res);
// Filter the data
tableData.value = res.filter(item =>
requiredQualifications.value.some(qualification =>
item.qualificationName === qualification
))
}
} catch (error) {
console.error('获取失败', error);
} finally {
loading.value = false;
}
};
//
const getUserQualification = async () => {
try {
queryParams.value.userId = ruleForm.value.userId
const res = await getUserCertificateList(queryParams.value);
console.log('diao');
return res.code === 200 ? res.data : [];
} catch (error) {
console.error('获取用户证书失败', error);
return [];
}
};
const handleCancel = () => {
proxy.resetForm("ruleFormRef")
router.push({
@ -210,27 +333,34 @@ const handleCancel = () => {
const handleSubmit = () => {
proxy.$refs["ruleFormRef"].validate(valid => {
if (valid) {
router.push({
path: '/qualification/escTask',
query: {
activeIndex: 2,
const qualificArr = tableData.value.filter(item => item.certificateUrl)
console.log('是否有资质证书', qualificArr)
if (qualificArr.length < requiredQualifications.value.length) {
proxy.$modal.msgError(`资质证书不全,请在"ESC任务->资质上传"上传资质证书!`)
return false;
}
const qualificStateArr = tableData.value.filter(item => item.status == 2)
console.log('是否有资质证书', qualificStateArr)
if (qualificStateArr.length > 0) {
proxy.$modal.msgError(`资质过期,请更新资质证书后再申请!`)
return false;
}
ruleForm.value.qualificationCertificateIds = tableData.value.map(item => item.id)
console.log('sdafasdfas', ruleForm.value)
ruleForm.value.node = 1
submitBusUserLabel(ruleForm.value).then(res => {
if (res.code == 200) {
proxy.$modal.msgSuccess("提交成功")
router.push({
path: '/qualification/escTask',
query: {
activeIndex: 2,
}
})
} else {
proxy.$modal.msgSuccess(res.msg)
}
})
// if (form.value.roleId != undefined) {
// form.value.menuIds = getMenuAllCheckedKeys()
// updateRole(form.value).then(response => {
// proxy.$modal.msgSuccess("")
// open.value = false
// getList()
// })
// } else {
// form.value.menuIds = getMenuAllCheckedKeys()
// addRole(form.value).then(response => {
// proxy.$modal.msgSuccess("")
// open.value = false
// getList()
// })
// }
}
})
}
@ -314,6 +444,10 @@ const handleSubmit = () => {
padding: 20px 20px 0 20px !important;
}
.el-card.is-always-shadow {
box-shadow: none;
}
.headerTitle {
font-family: Microsoft YaHei;
font-weight: 700;

View File

@ -50,11 +50,16 @@
<el-table-column prop="userName" label="员工姓名" width="130" />
<el-table-column prop="sourceQualificationName" label="当前资质" width="130" />
<el-table-column prop="qualificationName" label="目标资质" width="130" />
<el-table-column prop="state" label="状态" width="120">
<el-table-column prop="state" label="状态" width="160">
<template #default="scope">
<el-text v-if="scope.row.state == 1" type="info" class="infoinfoText">待审核</el-text>
<el-text v-if="scope.row.state == 1 && scope.row.node == 0" type="info"
class="infoinfoText">待审核</el-text>
<el-text v-if="scope.row.state == 1 && scope.row.node == 1" type="info"
class="infoinfoText">待审核</el-text>
<el-text v-if="scope.row.state == 1 && scope.row.node == 2" type="info"
class="infoinfoText">待培训中心审核</el-text>
<el-text v-if="scope.row.state == 2" type="success" class="successText">通过</el-text>
<el-text v-if="scope.row.state == 9" type="danger" class="dangerText">驳回</el-text>
<el-text v-if="scope.row.state == 9" type="danger" class="dangerText">驳回</el-text>
</template>
</el-table-column>
<el-table-column label="操作" fixed="right" width="150">
@ -173,7 +178,7 @@ const handleOpenApplyForm = () => {
}
//
const handleReplay = (record) => {
const handleReplay = (record) => {
router.push({
name: 'qualificationReApplyForm',
params: { Id: record.id, node: record.node } //

View File

@ -17,9 +17,14 @@
<el-table-column prop="userName" label="员工姓名" />
<el-table-column prop="sourceLabelId" label="当前标签" />
<el-table-column prop="labelId" label="申请标签" />
<el-table-column prop="state" label="状态" width="120">
<el-table-column prop="state" label="状态" width="180">
<template #default="scope">
<el-text v-if="scope.row.state == 1" type="info" class="infoinfoText">待审核</el-text>
<el-text v-if="scope.row.state == 1 && scope.row.node == 0" type="info"
class="infoinfoText">待审核</el-text>
<el-text v-if="scope.row.state == 1 && scope.row.node == 1" type="info"
class="infoinfoText">待审核</el-text>
<el-text v-if="scope.row.state == 1 && scope.row.node == 2" type="info"
class="infoinfoText">待标签管理员审核</el-text>
<el-text v-if="scope.row.state == 2" type="success" class="successText">通过</el-text>
<el-text v-if="scope.row.state == 9" type="danger" class="dangerText">驳回</el-text>
</template>

View File

@ -123,7 +123,7 @@ const { bus_label } = proxy.useDict("bus_label")
const data = reactive({
ruleForm: {},
rules: {
labelId: [{ required: true, message: "目标资质不能为空", trigger: "change" }],
labelId: [{ required: true, message: "申请标签不能为空", trigger: "change" }],
workNo: [{ required: true, message: "员工工号不能为空", trigger: "blur" }],
userName: [{ required: true, message: "员工姓名(中文)不能为空", trigger: "blur" }],
englishName: [{ required: true, message: "员工姓名(英文)", trigger: "blur" }],

View File

@ -77,7 +77,7 @@
<el-text v-if="detailForm.state == 1 && detailForm.node == 1" type="info"
class="infoinfoText">待审核</el-text>
<el-text v-if="detailForm.state == 1 && detailForm.node == 2" type="info"
class="infoinfoText">培训中心审核</el-text>
class="infoinfoText">标签管理员审核</el-text>
<el-text v-if="detailForm.state == 2" type="success"
class="successText">通过</el-text>
<el-text v-if="detailForm.state == 9" type="danger"
@ -446,7 +446,7 @@ const getDetailInfo = (_id) => {
font-size: 16px !important;
text-align: left !important;
color: #787878 !important;
padding: 0 10px 0 44px;
padding: 0 10px 0 24px;
}
.myFormItemLable .el-form-item__content {
@ -455,7 +455,7 @@ const getDetailInfo = (_id) => {
font-size: 18px !important;
text-align: left !important;
color: #000000 !important;
padding-left: 44px;
padding-left: 24px;
}
.el-form-item--label-left .el-form-item__content {

View File

@ -17,9 +17,14 @@
<el-table-column prop="userName" label="员工姓名" />
<el-table-column prop="sourceQualificationName" label="当前资质" />
<el-table-column prop="qualificationName" label="目标资质" />
<el-table-column prop="state" label="状态" width="120">
<el-table-column prop="state" label="状态" width="160">
<template #default="scope">
<el-text v-if="scope.row.state == 1" type="info" class="infoinfoText">待审核</el-text>
<el-text v-if="scope.row.state == 1 && scope.row.node == 0" type="info"
class="infoinfoText">待审核</el-text>
<el-text v-if="scope.row.state == 1 && scope.row.node == 1" type="info"
class="infoinfoText">待审核</el-text>
<el-text v-if="scope.row.state == 1 && scope.row.node == 2" type="info"
class="infoinfoText">待培训中心审核</el-text>
<el-text v-if="scope.row.state == 2" type="success" class="successText">通过</el-text>
<el-text v-if="scope.row.state == 9" type="danger" class="dangerText">驳回</el-text>
</template>
@ -29,8 +34,7 @@
<el-button type="primary" text class="replayTextBtn" v-if="scope.row.state == 9"
@click="handleReplay(scope.row)">重新申请</el-button>
<el-divider direction="vertical" class="verticalLine" v-if="scope.row.state == 9" />
<router-link :to="'/qualification/viewDetail/' + scope.row.id" custom
v-slot="{ href }">
<router-link :to="'/qualification/viewDetail/' + scope.row.id" custom v-slot="{ href }">
<a class="replayTextBtn" :href="href" target="_blank">查看</a>
</router-link>
<el-divider direction="vertical" class="verticalLine" v-if="scope.row.state == 1" />

View File

@ -2,7 +2,7 @@ import { defineConfig, loadEnv } from 'vite'
import path from 'path'
import createVitePlugins from './vite/plugins'
const baseUrl = 'http://localhost:8088' // 后端接口
const baseUrl = 'http://43.143.229.145:8088' // 后端接口
// https://vitejs.dev/config/
export default defineConfig(({ mode, command }) => {