This commit is contained in:
lcw
2026-01-15 09:34:36 +08:00
parent f9f417a7cd
commit bf02efe72e
7 changed files with 411 additions and 25 deletions

224
src/components/steps.vue Normal file
View File

@ -0,0 +1,224 @@
<template>
<div>
<el-dialog class="steps-dialog" title="审核流程" v-model="dialogForm" width="420px">
<div class="steps-body">
<el-steps direction="vertical" :active="active" :space="90">
<el-step title="保安公司审核">
<template #description>
<div class="audit-description">
<div class="audit-time">{{ dataForm.bakkShsj || '未审核' }}<span class="audit-status"
v-if="dataForm.bakkShsj"
:class="{ 'status-pending': dataForm.bakkShzt == 0, 'status-pass': dataForm.bakkShzt == 1, 'status-reject': dataForm.bakkShzt == 2 }">{{
dataForm.bakkShzt == 0 ? '待审核' : dataForm.bakkShzt == 1 ? '通过' : '驳回' }}</span></div>
<div v-if="dataForm.bakkShzt == 2" class="reject-reason">
<span class="reject-label">驳回原因</span>
<span>{{ dataForm.bhyy || '未审核' }}</span>
</div>
</div>
</template>
</el-step>
<el-step title="培训公司审核">
<template #description>
<div class="audit-description">
<div class="audit-time">{{ dataForm.pxgsShsj || '未审核' }}
<span class="audit-status" v-if="dataForm.pxgsShsj"
:class="{ 'status-pending': dataForm.pxgsShzt == 0, 'status-pass': dataForm.pxgsShzt == 1, 'status-reject': dataForm.pxgsShzt == 2 }">{{
dataForm.pxgsShzt == 0 ? '待审核' : dataForm.pxgsShzt == 1 ? '通过' : '驳回' }}</span>
</div>
<div v-if="dataForm.pxgsShsj == 2" class="reject-reason">
<span class="reject-label">驳回原因</span>
<span>{{ dataForm.pxgsBhyy || '未审核' }}</span>
</div>
</div>
</template>
</el-step>
<el-step title="公安局审核" :description="dataForm.gonganShsj || '未审核'">
<template #description>
<div class="audit-description">
<div class="audit-time">{{ dataForm.gonganShsj || '未审核' }}
<span class="audit-status" v-if="dataForm.gonganShsj"
:class="{ 'status-pending': dataForm.gonganShzt == 0, 'status-pass': dataForm.gonganShzt == 1, 'status-reject': dataForm.gonganShzt == 2 }">{{
dataForm.gonganShzt == 0 ? '待审核' : dataForm.gonganShzt == 1 ? '通过' : '驳回' }}</span>
</div>
<div v-if="dataForm.gonganShsj == 2" class="reject-reason">
<span class="reject-label">驳回原因</span>
<span>{{ dataForm.gonganBhyy || '未审核' }}</span>
</div>
</div>
</template>
</el-step>
</el-steps>
</div>
</el-dialog>
</div>
</template>
<!-- :description="dataForm.pxgsShsj || '未审核'" -->
<script setup>
import { qcckPost } from "@/api/qcckApi.js";
import { ref, defineExpose } from 'vue';
const dialogForm = ref(false);
const active = ref(0)
const dataForm = ref({})
const init = (row) => {
let ids = [row.id]
qcckPost(ids, "/mosty-base/bans/njxx/getAuditStatusList").then(res => {
dialogForm.value = true;
let obj = res ? res[0] : {};
dataForm.value = obj;
active.value = Number(obj.currentAuditStage) - 1;
})
}
defineExpose({
init
})
</script>
<style scoped lang="scss">
.steps-body {
height: 300px;
padding: 6px 10px 10px;
box-sizing: border-box;
}
.audit-description {
display: flex;
flex-direction: column;
gap: 4px;
margin: 10px 0;
}
.audit-time {
font-size: 16px;
color: #9AA8B6;
line-height: 20px;
}
.reject-reason {
font-size: 14px;
line-height: 18px;
margin-top: 4px;
padding: 6px 10px;
background-color: #fef2f2;
border-left: 3px solid #f87171;
border-radius: 0 4px 4px 0;
color: #dc2626;
}
.reject-label {
font-weight: 600;
margin-right: 4px;
}
.audit-status {
margin-left: 8px;
padding: 2px 8px;
border-radius: 10px;
font-size: 16px;
font-weight: 500;
}
.status-pending {
background-color: #f3f4f6;
color: #6b7280;
}
.status-pass {
background-color: #d1fae5;
color: #065f46;
}
.status-reject {
background-color: #fee2e2;
color: #b91c1c;
}
:deep(.steps-dialog .el-dialog__header) {
text-align: center;
padding: 20px 20px 10px;
}
:deep(.steps-dialog .el-dialog__title) {
font-size: 24px;
font-weight: 700;
color: #333;
}
:deep(.steps-dialog .el-dialog__body) {
padding: 0 20px 20px;
}
:deep(.steps-dialog .el-step__title) {
font-size: 18px;
font-weight: 600;
color: #333;
line-height: 22px;
}
:deep(.steps-dialog .el-step__description) {
font-size: 16px;
color: #9AA8B6;
line-height: 20px;
margin-top: 8px;
}
:deep(.steps-dialog .el-step__line) {
left: 8px;
background-color: transparent;
border-left: 1px dashed #dadada;
}
:deep(.steps-dialog .el-step.is-vertical .el-step__head) {
width: 24px;
}
:deep(.steps-dialog .el-step__icon) {
width: 16px;
height: 16px;
border-radius: 50%;
}
:deep(.steps-dialog .el-step__head.is-process .el-step__icon),
:deep(.steps-dialog .el-step__head.is-process .el-step__icon.is-text) {
background: #2e6bff;
border: none;
box-shadow: 0 0 0 5px rgba(46, 107, 255, 0.15);
}
:deep(.steps-dialog .el-step.is-wait .el-step__icon),
:deep(.steps-dialog .el-step.is-finish .el-step__icon) {
background: #fff;
border: 1px solid #dadada;
box-shadow: none;
}
:deep(.steps-dialog .el-step__icon-inner) {
display: none;
}
::v-deep .is-finish .el-step__icon {
background: #86b6f1;
}
::v-deep .el-dialog__close {
width: 30px;
height: 30px;
color: #fff;
svg {
width: 30px;
height: 30px;
}
}
::v-deep .el-dialog__headerbtn {
top: auto;
bottom: -60px;
border: 2px solid #fff;
color: #fff;
left: 50%;
transform: translateX(-50%);
border-radius: 50%;
}
</style>

View File

@ -99,7 +99,7 @@ import { ref, computed, defineEmits, getCurrentInstance,defineProps } from 'vue'
import { qcckPost } from "@/api/qcckApi.js"; import { qcckPost } from "@/api/qcckApi.js";
const emit = defineEmits(["refresh"]); const emit = defineEmits(["refresh"]);
const { proxy } = getCurrentInstance(); const { proxy } = getCurrentInstance();
const baseUrl = '/bagl/mosty-base/minio/image/download' const baseUrl = '/bagl/mosty-base/minio/image/download/'
const props = defineProps({ const props = defineProps({
dic: { dic: {
default: [[]], //二维数组 default: [[]], //二维数组
@ -174,7 +174,7 @@ defineExpose({ init })
color: #0072FF; color: #0072FF;
border: 5px solid #0072FF; border: 5px solid #0072FF;
} }
} }
} }
.desc { .desc {

View File

@ -3,14 +3,56 @@
<el-dialog class="steps-dialog" title="审核流程" v-model="dialogForm" width="420px"> <el-dialog class="steps-dialog" title="审核流程" v-model="dialogForm" width="420px">
<div class="steps-body"> <div class="steps-body">
<el-steps direction="vertical" :active="active" :space="90"> <el-steps direction="vertical" :active="active" :space="90">
<el-step title="保安公司审核" :description="dataForm.bakkShsj || '未审核'" /> <el-step title="保安公司审核">
<el-step title="培训公司审核" :description="dataForm.pxgsShsj || '未审核'" /> <template #description>
<el-step title="公安局审核" :description="dataForm.gonganShsj || '未审核'" /> <div class="audit-description">
<div class="audit-time">{{ dataForm.bakkShsj || '未审核' }}<span class="audit-status"
v-if="dataForm.bakkShsj"
:class="{ 'status-pending': dataForm.bakkShzt == 0, 'status-pass': dataForm.bakkShzt == 1, 'status-reject': dataForm.bakkShzt == 2 }">{{
dataForm.bakkShzt == 0 ? '待审核' : dataForm.bakkShzt == 1 ? '通过' : '驳回' }}</span></div>
<div v-if="dataForm.bakkShzt == 2" class="reject-reason">
<span class="reject-label">驳回原因</span>
<span>{{ dataForm.bhyy || '未审核' }}</span>
</div>
</div>
</template>
</el-step>
<el-step title="培训公司审核">
<template #description>
<div class="audit-description">
<div class="audit-time">{{ dataForm.pxgsShsj || '未审核' }}
<span class="audit-status" v-if="dataForm.pxgsShsj"
:class="{ 'status-pending': dataForm.pxgsShzt == 0, 'status-pass': dataForm.pxgsShzt == 1, 'status-reject': dataForm.pxgsShzt == 2 }">{{
dataForm.pxgsShzt == 0 ? '待审核' : dataForm.pxgsShzt == 1 ? '通过' : '驳回' }}</span>
</div>
<div v-if="dataForm.pxgsShsj == 2" class="reject-reason">
<span class="reject-label">驳回原因</span>
<span>{{ dataForm.pxgsBhyy || '未审核' }}</span>
</div>
</div>
</template>
</el-step>
<el-step title="公安局审核" :description="dataForm.gonganShsj || '未审核'">
<template #description>
<div class="audit-description">
<div class="audit-time">{{ dataForm.gonganShsj || '未审核' }}
<span class="audit-status" v-if="dataForm.gonganShsj"
:class="{ 'status-pending': dataForm.gonganShzt == 0, 'status-pass': dataForm.gonganShzt == 1, 'status-reject': dataForm.gonganShzt == 2 }">{{
dataForm.gonganShzt == 0 ? '待审核' : dataForm.gonganShzt == 1 ? '通过' : '驳回' }}</span>
</div>
<div v-if="dataForm.gonganShsj == 2" class="reject-reason">
<span class="reject-label">驳回原因</span>
<span>{{ dataForm.gonganBhyy || '未审核' }}</span>
</div>
</div>
</template>
</el-step>
</el-steps> </el-steps>
</div> </div>
</el-dialog> </el-dialog>
</div> </div>
</template> </template>
<!-- :description="dataForm.pxgsShsj || '未审核'" -->
<script setup> <script setup>
import { qcckPost } from "@/api/qcckApi.js"; import { qcckPost } from "@/api/qcckApi.js";
@ -20,7 +62,7 @@ const active = ref(0)
const dataForm = ref({}) const dataForm = ref({})
const init = (row) => { const init = (row) => {
let ids = [row.id] let ids = [row.id]
qcckPost(ids,"/mosty-base/bans/njxx/getAuditStatusList").then(res=>{ qcckPost(ids, "/mosty-base/bans/njxx/getAuditStatusList").then(res => {
dialogForm.value = true; dialogForm.value = true;
let obj = res ? res[0] : {}; let obj = res ? res[0] : {};
dataForm.value = obj; dataForm.value = obj;
@ -35,11 +77,63 @@ defineExpose({
<style scoped lang="scss"> <style scoped lang="scss">
.steps-body { .steps-body {
height: 260px; height: 300px;
padding: 6px 10px 10px; padding: 6px 10px 10px;
box-sizing: border-box; box-sizing: border-box;
} }
.audit-description {
display: flex;
flex-direction: column;
gap: 4px;
margin: 10px 0;
}
.audit-time {
font-size: 16px;
color: #9AA8B6;
line-height: 20px;
}
.reject-reason {
font-size: 14px;
line-height: 18px;
margin-top: 4px;
padding: 6px 10px;
background-color: #fef2f2;
border-left: 3px solid #f87171;
border-radius: 0 4px 4px 0;
color: #dc2626;
}
.reject-label {
font-weight: 600;
margin-right: 4px;
}
.audit-status {
margin-left: 8px;
padding: 2px 8px;
border-radius: 10px;
font-size: 16px;
font-weight: 500;
}
.status-pending {
background-color: #f3f4f6;
color: #6b7280;
}
.status-pass {
background-color: #d1fae5;
color: #065f46;
}
.status-reject {
background-color: #fee2e2;
color: #b91c1c;
}
:deep(.steps-dialog .el-dialog__header) { :deep(.steps-dialog .el-dialog__header) {
text-align: center; text-align: center;
padding: 20px 20px 10px; padding: 20px 20px 10px;
@ -102,19 +196,23 @@ defineExpose({
:deep(.steps-dialog .el-step__icon-inner) { :deep(.steps-dialog .el-step__icon-inner) {
display: none; display: none;
} }
::v-deep .is-finish .el-step__icon{
::v-deep .is-finish .el-step__icon {
background: #86b6f1; background: #86b6f1;
} }
::v-deep .el-dialog__close{
::v-deep .el-dialog__close {
width: 30px; width: 30px;
height: 30px; height: 30px;
color: #fff; color: #fff;
svg{
svg {
width: 30px; width: 30px;
height: 30px; height: 30px;
} }
} }
::v-deep .el-dialog__headerbtn{
::v-deep .el-dialog__headerbtn {
top: auto; top: auto;
bottom: -60px; bottom: -60px;
border: 2px solid #fff; border: 2px solid #fff;

View File

@ -3,7 +3,7 @@
<div class="titleBox"> <div class="titleBox">
<PageTitle title="保安员年检管理" > <PageTitle title="保安员年检管理" >
<el-button type="primary" @click="onBatchAudit(selectedRows)">批量审核</el-button> <el-button type="primary" @click="onBatchAudit(selectedRows)">批量审核</el-button>
<el-button type="primary" @click="handleItemSp(selectedRows)">批量送培</el-button> <!-- <el-button type="primary" @click="handleItemSp(selectedRows)">批量送培</el-button> -->
</PageTitle> </PageTitle>
</div> </div>
<!-- 搜索 --> <!-- 搜索 -->
@ -32,7 +32,7 @@
<!--currentAuditStage 当前审核阶段1-保安公司审核阶段2-培训公司审核阶段3-公安局审核阶段4-审核完成 --> <!--currentAuditStage 当前审核阶段1-保安公司审核阶段2-培训公司审核阶段3-公安局审核阶段4-审核完成 -->
<el-link type="primary" link @click="onBatchAudit([row.id])" v-if="row.bakkShzt == 0">立即审核</el-link> <el-link type="primary" link @click="onBatchAudit([row.id])" v-if="row.bakkShzt == 0">立即审核</el-link>
<el-link type="primary" link @click="addEdit('RefSteap', row)">审核流程</el-link> <el-link type="primary" link @click="addEdit('RefSteap', row)">审核流程</el-link>
<el-link type="primary" link @click="handleItemSp([row.id])" v-if="row.sptz == 0 && row.bakkShzt == 1">送培</el-link> <!-- <el-link type="primary" link @click="handleItemSp([row.id])" v-if="row.sptz == 0 && row.bakkShzt == 1">送培</el-link> -->
<el-link type="primary" link @click="addEdit('detail', row)">详情</el-link> <el-link type="primary" link @click="addEdit('detail', row)">详情</el-link>
</template> </template>
</MyTable> </MyTable>
@ -57,7 +57,8 @@ import MyTable from "@/components/aboutTable/MyTable.vue";
import Pages from "@/components/aboutTable/Pages.vue"; import Pages from "@/components/aboutTable/Pages.vue";
import Search from "@/components/aboutTable/Search.vue"; import Search from "@/components/aboutTable/Search.vue";
import DetailForm from "./components/detailForm.vue"; import DetailForm from "./components/detailForm.vue";
import Steps from "./components/steps.vue"; // import Steps from "./components/steps.vue";
import Steps from '@/components/steps.vue'
import ShForm from "./components/shForm.vue"; import ShForm from "./components/shForm.vue";
import { qcckPost } from "@/api/qcckApi.js"; import { qcckPost } from "@/api/qcckApi.js";
import { reactive, ref, onMounted, getCurrentInstance, nextTick } from "vue"; import { reactive, ref, onMounted, getCurrentInstance, nextTick } from "vue";

View File

@ -1,21 +1,22 @@
<template> <template>
<div> <div>
<el-dialog v-model="visible" title="批量送培" width="80%" @close="close"> <el-dialog v-model="visible" title="批量送培" width="80%" @close="close">
<MyTable <MyTable
:tableData="pageData.tableData" :tableData="pageData.tableData"
:tableColumn="pageData.tableColumn" :tableColumn="pageData.tableColumn"
:tableHeight="pageData.tableHeight" :tableHeight="pageData.tableHeight"
:key="pageData.keyCount" :key="pageData.keyCount"
:tableConfiger="pageData.tableConfiger" :tableConfiger="pageData.tableConfiger"
@chooseData="chooseData" @chooseData="chooseData"
> >
</MyTable> </MyTable>
<div class="flex just-center mt10"> <div class="flex just-center mt10">
<el-button type="primary" @click="close">取消</el-button> <el-button type="primary" @click="close">取消</el-button>
<el-button type="primary" @click="onBatchAudit">确定</el-button> <el-button type="primary" @click="changePxgs">确定</el-button>
</div> </div>
</el-dialog> </el-dialog>
</div> </div>
<TrainingCompany ref="trainingCompany" @onBatchAudit="onBatchAudit"/>
</template> </template>
<script setup> <script setup>
@ -23,6 +24,7 @@ import { ElMessage } from "element-plus";
import { getItem } from '@/utils/storage.js' import { getItem } from '@/utils/storage.js'
import { qcckPost } from "@/api/qcckApi.js"; import { qcckPost } from "@/api/qcckApi.js";
import MyTable from "@/components/aboutTable/MyTable.vue"; import MyTable from "@/components/aboutTable/MyTable.vue";
import TrainingCompany from "./trainingCompany.vue";
import { ref , reactive , defineExpose , getCurrentInstance, defineEmits} from 'vue' import { ref , reactive , defineExpose , getCurrentInstance, defineEmits} from 'vue'
const userInfo = getItem('userInfo'); const userInfo = getItem('userInfo');
const emit = defineEmits(['refresh']) const emit = defineEmits(['refresh'])
@ -74,10 +76,12 @@ const init = () => {
pageData.tableConfiger.loading = false; pageData.tableConfiger.loading = false;
}) })
} }
const onBatchAudit = () => { // 送培
const trainingCompany=ref()
const onBatchAudit = (val) => {
if (ids.value.length === 0) return ElMessage.warning("请选择要送培的人员"); if (ids.value.length === 0) return ElMessage.warning("请选择要送培的人员");
proxy.$modal.confirm("是否确认送培?").then(() => { proxy.$modal.confirm("是否确认送培?").then(() => {
let params = { ssbakk:userInfo.pxgs, ssbakkId:userInfo.pxgsid, ids:ids.value } let params = { ids:ids.value ,...val}
qcckPost(params,'/mosty-base/bans/njxx/sendTraining').then(res=>{ qcckPost(params,'/mosty-base/bans/njxx/sendTraining').then(res=>{
ElMessage.success("送培成功"); ElMessage.success("送培成功");
emit('refresh'); emit('refresh');
@ -85,6 +89,11 @@ const onBatchAudit = () => {
}) })
}); });
} }
const changePxgs = () => {
trainingCompany.value.init()
}
const close = () => { const close = () => {
visible.value = false; visible.value = false;
ids.value = []; ids.value = [];
@ -97,4 +106,4 @@ defineExpose({
<style scoped lang="scss"> <style scoped lang="scss">
</style> </style>

View File

@ -0,0 +1,54 @@
<template>
<div>
<el-dialog v-model="visible" title="选择培训公司" width="20%" @close="close">
<div>
<el-select v-model="dataValue" placeholder="请选择" filterable clearable>
<el-option v-for="item in dataList" :key="item.companyId" :label="item.companyName" :value="item.companyId" />
</el-select>
<div class="flex just-center mt10">
<el-button type="primary" @click="close">取消</el-button>
<el-button type="primary" @click="onBatchAudit">确定</el-button>
</div>
</div>
</el-dialog>
</div>
</template>
<script setup>
import { qcckPost } from "@/api/qcckApi.js";
import { ref, reactive, defineExpose, getCurrentInstance, defineEmits } from 'vue'
const visible = ref(false);
const dataList = ref()
const dataValue = ref()
const emit = defineEmits(['onBatchAudit'])
const init = () => {
visible.value = true;
let promes = {
pageNum: 1,
pageSize: 9999,
}
qcckPost(promes, '/mosty-base/baxx/dwgl/list').then((res) => {
dataList.value = res.map(item => {
return {
companyName: item.dwmc,
companyId: item.id
}
}) || []
}).catch((err) => {
})
}
const onBatchAudit = () => {
const data=dataList.value.find(item=>item.ssbakkId===dataValue.value)
emit('onBatchAudit', data)
close()
}
const close = () => {
visible.value = false;
dataList.value = []
}
defineExpose({
init
})
</script>
<style scoped lang="scss"></style>

View File

@ -43,7 +43,7 @@ import MyTable from "@/components/aboutTable/MyTable.vue";
import Pages from "@/components/aboutTable/Pages.vue"; import Pages from "@/components/aboutTable/Pages.vue";
import Search from "@/components/aboutTable/Search.vue"; import Search from "@/components/aboutTable/Search.vue";
import DetailForm from "./components/detailForm.vue"; import DetailForm from "./components/detailForm.vue";
import Steps from "./components/steps.vue"; import Steps from "@/components/steps.vue";
import AddSp from "./components/addSp.vue"; import AddSp from "./components/addSp.vue";
import {getItem} from '@/utils/storage.js' import {getItem} from '@/utils/storage.js'
import { qcckPost } from "@/api/qcckApi.js"; import { qcckPost } from "@/api/qcckApi.js";
@ -142,7 +142,7 @@ const getList = () => {
const chooseData = (rows) => { const chooseData = (rows) => {
selectedRows.value = Array.isArray(rows) ? rows.map(v=>v.id) : []; selectedRows.value = Array.isArray(rows) ? rows.map(v=>v.id) : [];
}; };
const onBatchAudit = () => { const onBatchAudit = () => {
addSpDiloag.value.init(); addSpDiloag.value.init();