上报
This commit is contained in:
@ -73,6 +73,13 @@ const searchConfiger = ref([
|
||||
placeholder: "请输入题目",
|
||||
showType: "input"
|
||||
},
|
||||
{
|
||||
label: "题目类型",
|
||||
prop: "type",
|
||||
placeholder: "请选择题目类型",
|
||||
showType: "select",
|
||||
options: D_BAXX_KTLX
|
||||
},
|
||||
]);
|
||||
|
||||
const queryFrom = ref({});
|
||||
@ -132,11 +139,11 @@ const getList = () => {
|
||||
let data = { ...pageData.pageConfiger, ...queryFrom.value };
|
||||
qcckPost(data, "/mosty-base/baxx/tkgl/page").then((res) => {
|
||||
console.log(res);
|
||||
|
||||
let arr = res.records || []
|
||||
arr.forEach(item => {
|
||||
item.correctAnswer = item.correctAnswer.split(',')
|
||||
item.correctAnswer =item.correctAnswer&&Array.isArray(item.correctAnswer) ? item.correctAnswer.join(',') : item.correctAnswer
|
||||
});
|
||||
console.log(arr);
|
||||
pageData.tableData = arr;
|
||||
pageData.total = res.total;
|
||||
pageData.tableConfiger.loading = false;
|
||||
|
||||
@ -0,0 +1,336 @@
|
||||
<template>
|
||||
<el-dialog v-model="modelValue" width="50%" :show-close="false" center :fullscreen="fullscreen">
|
||||
<!-- 使用title插槽替代header插槽,Element Plus中通常使用title插槽自定义标题 -->
|
||||
<template #title>
|
||||
<div class="dialog-header-content">
|
||||
<div class="dialog-title">{{ videoTitle }}</div>
|
||||
<div class="dialog-header-actions">
|
||||
<el-icon class="header-icon" @click="zoomBox"><FullScreen /></el-icon>
|
||||
<el-icon class="header-icon" @click="handleClose"><Close /></el-icon>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<div class="video-container">
|
||||
<!-- 视频播放区域 -->
|
||||
<div
|
||||
v-if="modelValue"
|
||||
ref="videoPlayerRef"
|
||||
class="video-player"
|
||||
:style="{ height: playerHeight }"
|
||||
>
|
||||
<video
|
||||
ref="videoRef"
|
||||
class="video-element"
|
||||
:src="url"
|
||||
controls
|
||||
autoplay
|
||||
muted
|
||||
playsinline
|
||||
preload="auto"
|
||||
@loadeddata="handleVideoLoaded"
|
||||
@error="handleVideoError"
|
||||
@stalled="handleVideoStalled"
|
||||
>
|
||||
</video>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</el-dialog>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { ref, reactive, watch, onMounted, onBeforeUnmount, nextTick, computed } from "vue";
|
||||
import { ElMessage } from "element-plus";
|
||||
import { Loading } from '@element-plus/icons-vue';
|
||||
import { downVideoFiles } from '@/api/instructCenter'
|
||||
import { qcckPost , qcckGet} from "@/api/qcckApi.js";
|
||||
// https://lam.clcud.com:1443/bagl/mosty-base/AppUserConfig/image/url/f1c7dd25d0fe45079b49de5ec4637923
|
||||
// 定义组件属性
|
||||
const props = defineProps({
|
||||
modelValue: {
|
||||
type: Boolean,
|
||||
default: false
|
||||
},
|
||||
// 父组件传递的视频信息
|
||||
listQuery: {
|
||||
type: Object,
|
||||
default: () => ({})
|
||||
},
|
||||
// 视频标题
|
||||
videoTitle: {
|
||||
type: String,
|
||||
default: '测试'
|
||||
}
|
||||
});
|
||||
|
||||
// 定义组件事件
|
||||
const emit = defineEmits(['update:modelValue', 'close']);
|
||||
|
||||
// 响应式数据
|
||||
const videoPlayerRef = ref(null);
|
||||
const videoRef = ref(null);
|
||||
const player = ref(null);
|
||||
const loading = ref(false);
|
||||
const playing = ref(false);
|
||||
const errorMessage = ref('');
|
||||
const playerHeight = ref('60vh');
|
||||
const fullscreen=ref(false);
|
||||
const videoMuted = ref(true);
|
||||
const url=ref('')
|
||||
// 计算属性:获取安全的视频源URL
|
||||
const getVideoSrc = () => {
|
||||
// 确保listQuery.fjid是字符串类型
|
||||
const fjid = JSON.parse(props.listQuery.fjid)?.map(item => item.id).join(',') || '';
|
||||
downVideoFiles(fjid).then(res => {
|
||||
url.value=res
|
||||
});
|
||||
}
|
||||
// 监听对话框显示状态
|
||||
watch(() => props.modelValue, (newVal) => {
|
||||
if (newVal) {
|
||||
getVideoSrc()
|
||||
} else {
|
||||
// 对话框关闭时,销毁播放器
|
||||
destroyPlayer();
|
||||
}
|
||||
});
|
||||
|
||||
const zoomBox = () => {
|
||||
fullscreen.value = !fullscreen.value;
|
||||
playerHeight.value = fullscreen.value ? '89vh' : '60vh';
|
||||
};
|
||||
|
||||
|
||||
// 停止播放
|
||||
const stopPlay = () => {
|
||||
try {
|
||||
if (player.value) {
|
||||
// 实际项目中这里应该是播放器的停止方法
|
||||
// player.value.stop();
|
||||
playing.value = false;
|
||||
ElMessage.info('视频已停止');
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('停止播放失败:', error);
|
||||
ElMessage.error('停止播放失败');
|
||||
}
|
||||
};
|
||||
|
||||
// 销毁播放器
|
||||
const destroyPlayer = () => {
|
||||
try {
|
||||
if (player.value) {
|
||||
// 实际项目中这里应该是播放器的销毁方法
|
||||
// player.value.destroy();
|
||||
player.value = null;
|
||||
playing.value = false;
|
||||
loading.value = false;
|
||||
errorMessage.value = '';
|
||||
console.log('播放器已销毁');
|
||||
}
|
||||
} catch (error) {
|
||||
// console.error('销毁播放器失败:', error);
|
||||
}
|
||||
};
|
||||
|
||||
// 关闭对话框
|
||||
const handleClose = () => {
|
||||
stopPlay();
|
||||
emit('update:modelValue', false);
|
||||
emit('close');
|
||||
};
|
||||
|
||||
// 视频加载完成后的处理
|
||||
const handleVideoLoaded = () => {
|
||||
console.log('视频数据加载完成');
|
||||
if (videoRef.value) {
|
||||
// 尝试播放视频
|
||||
videoRef.value.play().then(() => {
|
||||
console.log('视频播放成功');
|
||||
playing.value = true;
|
||||
}).catch(error => {
|
||||
console.error('视频加载后自动播放失败:', error);
|
||||
// 显示用户提示
|
||||
ElMessage.warning('视频需要点击播放按钮开始播放');
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
// 视频错误处理
|
||||
const handleVideoError = (event) => {
|
||||
console.error('视频加载错误:', event.target.error);
|
||||
errorMessage.value = `视频加载失败: ${getErrorMessage(event.target.error.code)}`;
|
||||
loading.value = false;
|
||||
};
|
||||
|
||||
// 视频卡顿处理
|
||||
const handleVideoStalled = () => {
|
||||
console.warn('视频加载卡顿,尝试重新加载');
|
||||
if (videoRef.value) {
|
||||
// 尝试重新加载视频
|
||||
videoRef.value.load();
|
||||
}
|
||||
};
|
||||
|
||||
// 获取错误消息
|
||||
const getErrorMessage = (errorCode) => {
|
||||
const errorMessages = {
|
||||
1: '用户中止了获取过程',
|
||||
2: '网络错误导致获取过程失败',
|
||||
3: '解码过程出错',
|
||||
4: '媒体格式不支持',
|
||||
5: '其他未知错误'
|
||||
};
|
||||
return errorMessages[errorCode] || '未知错误';
|
||||
};
|
||||
|
||||
// 切换静音状态
|
||||
const toggleMute = () => {
|
||||
if (videoRef.value) {
|
||||
videoRef.value.muted = !videoRef.value.muted;
|
||||
videoMuted.value = videoRef.value.muted;
|
||||
}
|
||||
};
|
||||
|
||||
// 组件卸载前清理
|
||||
onBeforeUnmount(() => {
|
||||
destroyPlayer();
|
||||
});
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
@import "@/assets/css/layout.scss";
|
||||
|
||||
.el-dialog {
|
||||
.el-dialog__header {
|
||||
background: linear-gradient(135deg, #1a1a1a 0%, #2d2d2d 100%);
|
||||
padding: 12px 24px;
|
||||
margin: 0;
|
||||
border-bottom: 2px solid #409eff;
|
||||
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
|
||||
}
|
||||
|
||||
.el-dialog__body {
|
||||
padding: 16px 24px 24px;
|
||||
background-color: #0a0a0a;
|
||||
color: white;
|
||||
overflow: hidden;
|
||||
}
|
||||
}
|
||||
|
||||
// 头部内容样式
|
||||
.dialog-header-content {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
// 标题样式
|
||||
.dialog-title {
|
||||
color: #0b0b0b;
|
||||
margin: 0;
|
||||
font-weight: 500;
|
||||
font-size: 18px;
|
||||
line-height: 1.4;
|
||||
}
|
||||
|
||||
// 头部操作按钮容器
|
||||
.dialog-header-actions {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 16px;
|
||||
}
|
||||
|
||||
// 头部图标样式
|
||||
.header-icon {
|
||||
width: 24px;
|
||||
height: 24px;
|
||||
color: #000000;
|
||||
cursor: pointer;
|
||||
transition: all 0.3s ease;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
border-radius: 4px;
|
||||
padding: 2px;
|
||||
|
||||
&:hover {
|
||||
background-color: rgba(255, 255, 255, 0.1);
|
||||
color: #409eff;
|
||||
transform: scale(1.1);
|
||||
}
|
||||
}
|
||||
|
||||
.video-container {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.video-player {
|
||||
width: 100%;
|
||||
position: relative;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
overflow: hidden;
|
||||
background-color: #000;
|
||||
border-radius: 8px;
|
||||
box-shadow: inset 0 0 10px rgba(0, 0, 0, 0.5);
|
||||
}
|
||||
|
||||
// 视频元素样式
|
||||
.video-element {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
object-fit: contain;
|
||||
background-color: #000;
|
||||
display: block;
|
||||
}
|
||||
|
||||
.loading-overlay {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
background-color: rgba(0, 0, 0, 0.7);
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
z-index: 10;
|
||||
}
|
||||
|
||||
// 全屏状态下的样式增强
|
||||
:deep(.el-dialog--fullscreen) {
|
||||
.el-dialog__header {
|
||||
position: fixed;
|
||||
top: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
z-index: 100;
|
||||
}
|
||||
|
||||
.el-dialog__body {
|
||||
margin-top: 60px; // 为固定头部留出空间
|
||||
padding: 20px;
|
||||
}
|
||||
}
|
||||
|
||||
.video-controls {
|
||||
margin-top: 15px;
|
||||
display: flex;
|
||||
gap: 10px;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
.error-message {
|
||||
margin-top: 15px;
|
||||
width: 100%;
|
||||
}
|
||||
</style>
|
||||
@ -24,6 +24,7 @@
|
||||
<el-link type="primary" link @click="addEdit('edit', row)">编辑</el-link>
|
||||
<el-link type="primary" link @click="addEdit('detail', row)">详情</el-link>
|
||||
<el-link type="danger" link @click="handleDelete([row.id])">删除</el-link>
|
||||
<el-link type="primary" @click="videoDisplays(row)">视频播放</el-link>
|
||||
</template>
|
||||
</MyTable>
|
||||
<Pages @changeNo="changeNo" @changeSize="changeSize" :tableHeight="pageData.tableHeight" :pageConfiger="{
|
||||
@ -34,10 +35,13 @@
|
||||
<!-- 详情 -->
|
||||
<DetailForm ref="detailDiloag" @refresh="getList" />
|
||||
</div>
|
||||
|
||||
<VideoDisplay v-model="showVideoDisplay" :videoTitle="videoTitle" :listQuery="videoDisplayData"/>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import PageTitle from "@/components/aboutTable/PageTitle.vue";
|
||||
import VideoDisplay from "./components/videoDisplay.vue";
|
||||
import MyTable from "@/components/aboutTable/MyTable.vue";
|
||||
import Pages from "@/components/aboutTable/Pages.vue";
|
||||
import Search from "@/components/aboutTable/Search.vue";
|
||||
@ -45,6 +49,7 @@ import DetailForm from "./components/detailForm.vue";
|
||||
import { qcckGet, qcckPost, qcckDelete } from "@/api/qcckApi.js";
|
||||
import { reactive, ref, onMounted, getCurrentInstance, nextTick } from "vue";
|
||||
const { proxy } = getCurrentInstance();
|
||||
const showVideoDisplay = ref(false)
|
||||
const detailDiloag = ref();
|
||||
const searchBox = ref(); //搜索框
|
||||
const baseUrl = 'data:image/jpeg;base64,'
|
||||
@ -71,7 +76,7 @@ const pageData = reactive({
|
||||
pageSize: 20,
|
||||
pageCurrent: 1
|
||||
},
|
||||
controlsWidth: 180,
|
||||
controlsWidth: 240,
|
||||
tableColumn: [
|
||||
{ label: "视频标题", prop: "spbt" },
|
||||
]
|
||||
@ -137,6 +142,14 @@ const tabHeightFn = () => {
|
||||
tabHeightFn();
|
||||
};
|
||||
};
|
||||
const videoDisplayData = ref();
|
||||
const videoTitle=ref('');
|
||||
// 视频播放
|
||||
const videoDisplays = (val) => {
|
||||
// videoTitle.value=val.spbt
|
||||
showVideoDisplay.value = true
|
||||
videoDisplayData.value = val
|
||||
}
|
||||
</script>
|
||||
|
||||
<style>
|
||||
|
||||
210
src/views/Training/securityNjgl/components/detailForm.vue
Normal file
210
src/views/Training/securityNjgl/components/detailForm.vue
Normal file
@ -0,0 +1,210 @@
|
||||
<template>
|
||||
<div class="dialog" v-if="dialogForm">
|
||||
<div class="head_box">
|
||||
<span>详情</span>
|
||||
<div><el-button size="small" @click="close">关闭</el-button></div>
|
||||
</div>
|
||||
<div class="cntinfo">
|
||||
<!-- 标签 -->
|
||||
<ul class="tag-box">
|
||||
<li class="tag_item" :class="detail.bakkShzt == 0 ? 'dsh_item' : detail.bakkShzt == 1 ? 'tgg_item' : 'jtb_item'">
|
||||
<!-- 0-待审核 1-通过 2-驳回 -->
|
||||
{{ detail.bakkShzt == 0 ? '待审核' : detail.bakkShzt == 1 ? '通过' : '驳回' }}
|
||||
</li>
|
||||
</ul>
|
||||
<!-- 内容描述 -->
|
||||
<el-descriptions class="desc" :column="3" border label-width="200px">
|
||||
<el-descriptions-item label="保安公司名称">{{ detail.ssbakk }}</el-descriptions-item>
|
||||
<el-descriptions-item label="年审年份">{{ detail.njnf }}</el-descriptions-item>
|
||||
<el-descriptions-item label="姓名">{{ detail.xm }}</el-descriptions-item>
|
||||
|
||||
<el-descriptions-item label="身份证号码">{{ detail.sfzhm }}</el-descriptions-item>
|
||||
<el-descriptions-item label="电话">{{ detail.dh }}</el-descriptions-item>
|
||||
<el-descriptions-item label="性别">
|
||||
<DictTag :value="detail.xb" :tag="false" :options="props.dic.D_BZ_XB" />
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="民族">
|
||||
<DictTag :value="detail.mz" :tag="false" :options="props.dic.D_BZ_MZ" />
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="籍贯">{{ detail.jg }}</el-descriptions-item>
|
||||
<el-descriptions-item label="文化程度">
|
||||
<DictTag :value="detail.whcd" :tag="false" :options="props.dic.D_BZ_WHCD" />
|
||||
</el-descriptions-item>
|
||||
|
||||
<el-descriptions-item label="证书编号">{{ detail.zsbh }}</el-descriptions-item>
|
||||
<el-descriptions-item label="上岗证号码">{{ detail.sgxkhm }}</el-descriptions-item>
|
||||
<el-descriptions-item label="服务行业">
|
||||
<DictTag :value="detail.fwxy" :tag="false" :options="props.dic.D_BAXX_SSHY" />
|
||||
</el-descriptions-item>
|
||||
|
||||
<el-descriptions-item label="服务行业名称">{{ detail.fwxymc }}</el-descriptions-item>
|
||||
<el-descriptions-item label="入职时间">{{ detail.rzsj }}</el-descriptions-item>
|
||||
<el-descriptions-item label="政治面貌">
|
||||
<DictTag :value="detail.zzmm" :tag="false" :options="props.dic.D_BZ_ZZMM" />
|
||||
</el-descriptions-item>
|
||||
|
||||
<el-descriptions-item label="无犯罪记录证明">
|
||||
<div class="img-grid one">
|
||||
<el-image
|
||||
:src="baseUrl + detail.wfbjlzm"
|
||||
fit="cover"
|
||||
:preview-src-list='[baseUrl + detail.wfbjlzm]'
|
||||
preview-teleported
|
||||
class="img"
|
||||
/>
|
||||
</div>
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="体检报告">
|
||||
<div class="img-grid one">
|
||||
<el-image
|
||||
:src="baseUrl + detail.tjbg"
|
||||
fit="cover"
|
||||
:preview-src-list='[baseUrl + detail.tjbg]'
|
||||
preview-teleported
|
||||
class="img"
|
||||
/>
|
||||
</div>
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="身份证正反面">
|
||||
<div class="img-grid two">
|
||||
<el-image
|
||||
:src="baseUrl + detail.sfzzm"
|
||||
fit="cover"
|
||||
:preview-src-list='[baseUrl + detail.sfzzm]'
|
||||
preview-teleported
|
||||
class="img"
|
||||
/>
|
||||
<el-image
|
||||
:src="baseUrl + detail.sfzfm"
|
||||
fit="cover"
|
||||
:preview-src-list='[baseUrl + detail.sfzfm]'
|
||||
preview-teleported
|
||||
class="img"
|
||||
/>
|
||||
</div>
|
||||
</el-descriptions-item>
|
||||
|
||||
<el-descriptions-item label="审核时间">{{ detail.shsj }}</el-descriptions-item>
|
||||
<el-descriptions-item label="发证机关">{{ detail.fqjg }}</el-descriptions-item>
|
||||
<el-descriptions-item label="发证日期">{{ detail.fqsj }}</el-descriptions-item>
|
||||
|
||||
<el-descriptions-item label="驳回原因" :span="3" v-if="detail.bakkShzt == 2">{{ detail.bhyy }}</el-descriptions-item>
|
||||
</el-descriptions>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { ref, computed, defineEmits, getCurrentInstance,defineProps } from 'vue';
|
||||
import { qcckPost } from "@/api/qcckApi.js";
|
||||
const emit = defineEmits(["refresh"]);
|
||||
const { proxy } = getCurrentInstance();
|
||||
const baseUrl = '/bagl/mosty-base/minio/image/download/'
|
||||
const props = defineProps({
|
||||
dic: {
|
||||
default: [[]], //二维数组
|
||||
type: Array
|
||||
}
|
||||
})
|
||||
|
||||
const dialogForm = ref(false);
|
||||
const listQuery = ref({});
|
||||
const detail = ref({})
|
||||
|
||||
// 初始化数据
|
||||
const init = (type, row,) => {
|
||||
dialogForm.value = true;
|
||||
qcckPost({},'/mosty-base/bans/njxx/getInfo/'+row.id).then(res => {
|
||||
let zj = res.sfzzfmj.split(',');
|
||||
res.sfzzm = [zj[0]];
|
||||
res.sfzfm = [zj[1]];
|
||||
detail.value = res || {};
|
||||
})
|
||||
};
|
||||
|
||||
const close = () => {
|
||||
dialogForm.value = false;
|
||||
detail.value = {};
|
||||
};
|
||||
|
||||
defineExpose({ init })
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
@import "@/assets/css/layout.scss";
|
||||
.mapBox {
|
||||
width: calc(100% - 24rem);
|
||||
height: 500px;
|
||||
overflow: hidden;
|
||||
margin: 0 12rem;
|
||||
}
|
||||
.cntinfo{
|
||||
position: relative;
|
||||
padding: 10px 20px;
|
||||
box-sizing: border-box;
|
||||
.tag-box{
|
||||
position: absolute;
|
||||
top: 20px;
|
||||
right: 50px;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 10px;
|
||||
z-index: 99999;
|
||||
.tag_item{
|
||||
width: 70px;
|
||||
height: 70px;
|
||||
border-radius: 50%;
|
||||
line-height: 65px;
|
||||
text-align: center;
|
||||
font-size: 16px;
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
.jtb_item{
|
||||
border: 5px solid #FA3758;
|
||||
color: #FA3758;
|
||||
background: rgba(250,55,88,0.2);
|
||||
}
|
||||
.tgg_item{
|
||||
color: #28EEBF;
|
||||
background: rgba(40,238,191,0.2);
|
||||
border: 5px solid #28EEBF;
|
||||
}
|
||||
.dsh_item{
|
||||
background: rgba(0,114,255,0.2);
|
||||
color: #0072FF;
|
||||
border: 5px solid #0072FF;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.desc {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.img-grid {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 10px;
|
||||
min-height: 70px;
|
||||
}
|
||||
|
||||
.img-grid.one .img,
|
||||
.img-grid.one .img-placeholder {
|
||||
width: 64px;
|
||||
height: 64px;
|
||||
}
|
||||
|
||||
.img-grid.two .img,
|
||||
.img-grid.two .img-placeholder {
|
||||
width: 64px;
|
||||
height: 64px;
|
||||
}
|
||||
|
||||
.img-placeholder {
|
||||
background: #d9d9d9;
|
||||
border-radius: 2px;
|
||||
}
|
||||
::v-deep .el-descriptions__label.el-descriptions__cell.is-bordered-label{
|
||||
background: #F6FAFF;
|
||||
}
|
||||
</style>
|
||||
138
src/views/Training/securityNjgl/components/shForm.vue
Normal file
138
src/views/Training/securityNjgl/components/shForm.vue
Normal file
@ -0,0 +1,138 @@
|
||||
<template>
|
||||
<div>
|
||||
<el-dialog class="steps-dialog" title="审核" v-model="dialogForm" :close-on-click-modal="false" @close="dialogForm = false,formData = {}" width="420px">
|
||||
<el-form :model="formData" ref="formRef" :rules="rules" label-width="120px">
|
||||
<el-form-item label="是否通过" prop="auditStatus">
|
||||
<el-radio-group v-model="formData.auditStatus">
|
||||
<el-radio label="1">通过</el-radio>
|
||||
<el-radio label="0">不通过</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
<el-form-item label="驳回原因" prop="rejectReason" v-if="formData.auditStatus === '0'">
|
||||
<el-input v-model="formData.rejectReason" type="textarea" placeholder="请输入驳回原因" :autosize="{ minRows: 2, maxRows: 4 }" />
|
||||
</el-form-item>
|
||||
<div class="flex just-center">
|
||||
<el-button @click="dialogForm = false,formData = {}">取消</el-button>
|
||||
<el-button type="primary" :loading="loading" @click="submitForm">提交</el-button>
|
||||
</div>
|
||||
</el-form>
|
||||
</el-dialog>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { ElMessage } from "element-plus";
|
||||
import { ref, defineExpose,defineEmits } from 'vue';
|
||||
import { qcckPost } from "@/api/qcckApi.js";
|
||||
const emit = defineEmits(['refresh'])
|
||||
const dialogForm = ref(false);
|
||||
const loading = ref(false)
|
||||
const formData = ref({})
|
||||
const rules = ref({
|
||||
auditType: [{ required: true, message: '请选择审核类型', trigger: 'blur' }],
|
||||
auditStatus: [{ required: true, message: '请选择是否通过', trigger: 'blur' }],
|
||||
rejectReason: [{ required: true, message: '请输入驳回原因', trigger: 'blur' }],
|
||||
})
|
||||
const formRef = ref();
|
||||
const idsVal = ref([])
|
||||
const init = (ids) => {
|
||||
idsVal.value = ids;
|
||||
dialogForm.value = true;
|
||||
}
|
||||
|
||||
const submitForm = () =>{
|
||||
formRef.value.validate((valid) => {
|
||||
if (!valid) return;
|
||||
loading.value = true;
|
||||
// // 保安公司审核 - bakk 培训公司审核 -- pxgs 公安局审核 -- gongan
|
||||
let params = { ...formData.value,ids:idsVal.value,auditType:'bakk' }
|
||||
qcckPost(params,"/mosty-base/bans/njxx/batchAudit").then((res) => {
|
||||
loading.value = false;
|
||||
ElMessage.success("操作成功");
|
||||
dialogForm.value = false;
|
||||
formData.value={}
|
||||
emit('refresh')
|
||||
}).catch(()=>{
|
||||
loading.value = false;
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
defineExpose({
|
||||
init
|
||||
})
|
||||
</script>
|
||||
|
||||
<style scoped lang="scss">
|
||||
.steps-body {
|
||||
height: 260px;
|
||||
padding: 6px 10px 10px;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
: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;
|
||||
}
|
||||
</style>
|
||||
224
src/views/Training/securityNjgl/components/steps.vue
Normal file
224
src/views/Training/securityNjgl/components/steps.vue
Normal 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>
|
||||
238
src/views/Training/securityNjgl/index.vue
Normal file
238
src/views/Training/securityNjgl/index.vue
Normal file
@ -0,0 +1,238 @@
|
||||
<template>
|
||||
<div>
|
||||
<div class="titleBox">
|
||||
<PageTitle title="保安员年检管理" >
|
||||
<el-button type="primary" @click="onBatchAudit(selectedRows)">批量审核</el-button>
|
||||
<!-- <el-button type="primary" @click="handleItemSp(selectedRows)">批量送培</el-button> -->
|
||||
</PageTitle>
|
||||
</div>
|
||||
<!-- 搜索 -->
|
||||
<div ref="searchBox">
|
||||
<Search :searchArr="searchConfiger" @submit="onSearch" :key="pageData.keyCount" />
|
||||
</div>
|
||||
<!-- 表格 -->
|
||||
<div class="tabBox">
|
||||
<MyTable :tableData="pageData.tableData" :tableColumn="pageData.tableColumn" :tableHeight="pageData.tableHeight"
|
||||
:key="pageData.keyCount" :tableConfiger="pageData.tableConfiger" :controlsWidth="pageData.controlsWidth"
|
||||
@chooseData="chooseData">
|
||||
<template #whcd="{ row }">
|
||||
<DictTag :value="row.whcd" :tag="false" :options="D_BZ_WHCD" />
|
||||
</template>
|
||||
<template #fwxy="{ row }">
|
||||
<DictTag :value="row.fwxy" :tag="false" :options="D_BAXX_SSHY" />
|
||||
</template>
|
||||
<template #bakkShzt="{ row }">
|
||||
<DictTag :value="row.bakkShzt" :tag="false" :color="row.bakkShzt == 0 ? '#ff0000' : row.bakkShzt == 1 ? '#28EEBF' : '#FA3758'" :options="D_BA_SHZT" />
|
||||
</template>
|
||||
<template #sptz="{ row }">
|
||||
<DictTag :value="row.sptz" :tag="false" :options="D_BA_SPZT" />
|
||||
</template>
|
||||
<!-- 操作 -->
|
||||
<template #controls="{ row }">
|
||||
<!--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="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="addEdit('detail', row)">详情</el-link>
|
||||
</template>
|
||||
</MyTable>
|
||||
<Pages @changeNo="changeNo" @changeSize="changeSize" :tableHeight="pageData.tableHeight" :pageConfiger="{
|
||||
...pageData.pageConfiger,
|
||||
total: pageData.total
|
||||
}"></Pages>
|
||||
</div>
|
||||
<!-- 详情 -->
|
||||
<DetailForm ref="detailDiloag" :dic="{D_BZ_ZZMM,D_BZ_XB,D_BZ_MZ,D_BA_SHZT,D_BAXX_SSHY,D_BA_SPZT,D_BZ_WHCD}"/>
|
||||
<!-- 审核流程 -->
|
||||
<Steps ref="RefSteap" ></Steps>
|
||||
<!-- 审核 -->
|
||||
<ShForm ref="shForm" @refresh="getList" />
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { getItem } from "@/utils/storage";
|
||||
import PageTitle from "@/components/aboutTable/PageTitle.vue";
|
||||
import MyTable from "@/components/aboutTable/MyTable.vue";
|
||||
import Pages from "@/components/aboutTable/Pages.vue";
|
||||
import Search from "@/components/aboutTable/Search.vue";
|
||||
import DetailForm from "./components/detailForm.vue";
|
||||
// import Steps from "./components/steps.vue";
|
||||
import Steps from '@/components/steps.vue'
|
||||
import ShForm from "./components/shForm.vue";
|
||||
import { qcckPost } from "@/api/qcckApi.js";
|
||||
import { reactive, ref, onMounted, getCurrentInstance, nextTick } from "vue";
|
||||
import { ElMessage } from "element-plus";
|
||||
const { proxy } = getCurrentInstance();
|
||||
const { D_BZ_ZZMM,D_BZ_XB,D_BZ_MZ,D_BA_SHZT,D_BAXX_SSHY,D_BA_SPZT,D_BZ_WHCD } = proxy.$dict('D_BZ_ZZMM','D_BZ_XB','D_BZ_MZ','D_BA_SHZT','D_BAXX_SSHY','D_BA_SPZT','D_BZ_WHCD');
|
||||
const userInfo = getItem('userInfo');
|
||||
const detailDiloag = ref();
|
||||
const RefSteap = ref();
|
||||
const shForm = ref();
|
||||
const searchBox = ref(); //搜索框
|
||||
const selectedRows = ref([]);
|
||||
const searchConfiger = ref([
|
||||
{
|
||||
label: "姓名",
|
||||
prop: "xm",
|
||||
showType: "input"
|
||||
},
|
||||
{
|
||||
label: "身份证号码",
|
||||
prop: "sfzhm",
|
||||
showType: "input"
|
||||
},
|
||||
{
|
||||
label: "电话",
|
||||
prop: "dh",
|
||||
showType: "input"
|
||||
},
|
||||
{
|
||||
label: "审核状态",
|
||||
prop: "bakkShzt",
|
||||
showType: "select",
|
||||
placeholder: "不限",
|
||||
clearable: true,
|
||||
defaultVal: "",
|
||||
options: D_BA_SHZT
|
||||
},
|
||||
{
|
||||
label: "送培状态",
|
||||
prop: "sptz",
|
||||
showType: "select",
|
||||
placeholder: "不限",
|
||||
clearable: true,
|
||||
defaultVal: "",
|
||||
options: D_BA_SPZT
|
||||
}
|
||||
]);
|
||||
const queryFrom = ref({});
|
||||
const pageData = reactive({
|
||||
tableData: [],
|
||||
keyCount: 0,
|
||||
tableConfiger: {
|
||||
rowHieght: 61,
|
||||
showSelectType: "checkBox",
|
||||
loading: false
|
||||
},
|
||||
total: 0,
|
||||
pageConfiger: {
|
||||
pageSize: 20,
|
||||
pageNum: 1
|
||||
},
|
||||
controlsWidth: 280,
|
||||
tableColumn: [
|
||||
{ label: "保安公司名称", prop: "ssbakk", showOverflowTooltip: true },
|
||||
{ label: "年审年份", prop: "njnf" },
|
||||
{ label: "姓名", prop: "xm" },
|
||||
{ label: "身份证号码", prop: "sfzhm", showOverflowTooltip: true },
|
||||
{ label: "电话", prop: "dh" },
|
||||
{ label: "文化程度", prop: "whcd",showSolt: true },
|
||||
{ label: "证书编号", prop: "zsbh", showOverflowTooltip: true },
|
||||
{ label: "服务行业", prop: "fwxy", showSolt: true },
|
||||
{ label: "入职时间", prop: "rzsj" },
|
||||
{ label: "上岗证号码", prop: "sgxkhm", showOverflowTooltip: true },
|
||||
{ label: "审核状态", prop: "bakkShzt", showSolt: true },
|
||||
{ label: "审核时间", prop: "shsj" },
|
||||
{ label: "送培状态", prop: "sptz", showSolt: true }
|
||||
]
|
||||
});
|
||||
onMounted(() => {
|
||||
getList();
|
||||
tabHeightFn();
|
||||
});
|
||||
// 搜索
|
||||
const onSearch = (val) => {
|
||||
queryFrom.value = { ...val };
|
||||
pageData.pageConfiger.pageNum = 1;
|
||||
getList();
|
||||
};
|
||||
const changeNo = (val) => {
|
||||
pageData.pageConfiger.pageNum = val;
|
||||
getList();
|
||||
};
|
||||
const changeSize = (val) => {
|
||||
pageData.pageConfiger.pageSize = val;
|
||||
getList();
|
||||
};
|
||||
// 获取列表
|
||||
const getList = () => {
|
||||
pageData.tableConfiger.loading = true;
|
||||
|
||||
const promes = {
|
||||
...pageData.pageConfiger,
|
||||
...queryFrom.value,
|
||||
ssbakk:userInfo.pxgs,
|
||||
ssbakkId:userInfo.pxgsid,
|
||||
}
|
||||
|
||||
qcckPost(promes,'/mosty-base/bans/njxx/page').then(res => {
|
||||
pageData.tableData = res.records || [];
|
||||
pageData.total = res.total;
|
||||
pageData.tableConfiger.loading = false;
|
||||
}).catch((err) => {
|
||||
pageData.tableConfiger.loading = false;
|
||||
})
|
||||
};
|
||||
|
||||
const chooseData = (rows) => {
|
||||
selectedRows.value = Array.isArray(rows) ? rows.map(v=>v.id) : [];
|
||||
};
|
||||
|
||||
const onBatchAudit = (valIds) => {
|
||||
let ids = [];
|
||||
valIds.forEach(id =>{
|
||||
let obj = pageData.tableData.find(it=>it.id == id);
|
||||
if(obj && obj.bakkShzt == 0) ids.push(id);
|
||||
});
|
||||
if (!ids.length) return ElMessage.warning("请选择未审核的数据!该数据再审核状态下不能操作!");
|
||||
shForm.value.init(ids);
|
||||
};
|
||||
|
||||
// 送培
|
||||
const handleItemSp = (valIds) =>{
|
||||
let ids = [];
|
||||
valIds.forEach(id =>{
|
||||
let obj = pageData.tableData.find(it=>it.id == id);
|
||||
if(obj && obj.sptz == 0 && obj.bakkShzt == 1) ids.push(id);
|
||||
});
|
||||
if (!ids.length) return ElMessage.warning("请选择未送培的数据!该数据已送培!");
|
||||
proxy.$modal.confirm("是否确认送培?").then(() => {
|
||||
let params = {
|
||||
ssbakk:userInfo.pxgs,
|
||||
ssbakkId:userInfo.pxgsid,
|
||||
ids:ids
|
||||
}
|
||||
qcckPost(params,'/mosty-base/bans/njxx/sendTraining').then(res=>{
|
||||
getList()
|
||||
ElMessage.success("送培成功");
|
||||
})
|
||||
});
|
||||
}
|
||||
|
||||
// 详情
|
||||
const addEdit = (type, row) => {
|
||||
nextTick(() => {
|
||||
if(type == 'RefSteap'){
|
||||
RefSteap.value.init(row);
|
||||
}else{
|
||||
detailDiloag.value.init(type, row);
|
||||
}
|
||||
})
|
||||
};
|
||||
|
||||
|
||||
// 表格高度计算
|
||||
const tabHeightFn = () => {
|
||||
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 250;
|
||||
window.onresize = function () {
|
||||
tabHeightFn();
|
||||
};
|
||||
};
|
||||
</script>
|
||||
|
||||
<style>
|
||||
.el-loading-mask {
|
||||
background: rgba(0, 0, 0, 0.5) !important;
|
||||
}
|
||||
</style>
|
||||
109
src/views/Training/securityNjsp/components/addSp.vue
Normal file
109
src/views/Training/securityNjsp/components/addSp.vue
Normal file
@ -0,0 +1,109 @@
|
||||
<template>
|
||||
<div>
|
||||
<el-dialog v-model="visible" title="批量送培" width="80%" @close="close">
|
||||
<MyTable
|
||||
:tableData="pageData.tableData"
|
||||
:tableColumn="pageData.tableColumn"
|
||||
:tableHeight="pageData.tableHeight"
|
||||
:key="pageData.keyCount"
|
||||
:tableConfiger="pageData.tableConfiger"
|
||||
@chooseData="chooseData"
|
||||
>
|
||||
</MyTable>
|
||||
<div class="flex just-center mt10">
|
||||
<el-button type="primary" @click="close">取消</el-button>
|
||||
<el-button type="primary" @click="changePxgs">确定</el-button>
|
||||
</div>
|
||||
</el-dialog>
|
||||
</div>
|
||||
<TrainingCompany ref="trainingCompany" @onBatchAudit="onBatchAudit"/>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { ElMessage } from "element-plus";
|
||||
import { getItem } from '@/utils/storage.js'
|
||||
import { qcckPost } from "@/api/qcckApi.js";
|
||||
import MyTable from "@/components/aboutTable/MyTable.vue";
|
||||
import TrainingCompany from "./trainingCompany.vue";
|
||||
import { ref , reactive , defineExpose , getCurrentInstance, defineEmits} from 'vue'
|
||||
const userInfo = getItem('userInfo');
|
||||
const emit = defineEmits(['refresh'])
|
||||
const { proxy } = getCurrentInstance();
|
||||
const visible = ref(false);
|
||||
const pageData = reactive({
|
||||
tableData: [],
|
||||
keyCount: 0,
|
||||
tableConfiger: {
|
||||
rowHieght: 61,
|
||||
showSelectType: "checkBox",
|
||||
loading: false,
|
||||
haveControls: false
|
||||
},
|
||||
tableHeight: 550,
|
||||
tableColumn: [
|
||||
{ label: "保安公司名称", prop: "ssbakk",showOverflowTooltip: true },
|
||||
{ label: "年审年份", prop: "njnf"},
|
||||
{ label: "姓名", prop: "xm" },
|
||||
{ label: "身份证号码", prop: "sfzhm",showOverflowTooltip: true },
|
||||
{ label: "电话", prop: "dh" },
|
||||
{ label: "文化程度", prop: "whcd" },
|
||||
{ label: "证书编号", prop: "zsbh", showOverflowTooltip: true },
|
||||
{ label: "服务行业", prop: "fwxymc" },
|
||||
{ label: "入职时间", prop: "rzsj" },
|
||||
{ label: "上岗证号码", prop: "sgxkhm", showOverflowTooltip: true },
|
||||
]
|
||||
});
|
||||
const ids = ref([])
|
||||
const chooseData = (rows) => {
|
||||
ids.value = Array.isArray(rows) ? rows.map(item => item.id) : [];
|
||||
};
|
||||
|
||||
const init = () => {
|
||||
pageData.tableConfiger.loading = true;
|
||||
pageData.keyCount++;
|
||||
visible.value = true;
|
||||
let promes = {
|
||||
pageNum:1,
|
||||
pageSize:9999,
|
||||
ssbakk:userInfo.pxgs,
|
||||
ssbakkId:userInfo.pxgsid,
|
||||
sptz:0
|
||||
}
|
||||
qcckPost(promes,'/mosty-base/bans/njxx/listForSendTraining').then((res) => {
|
||||
pageData.tableData = res.records || []
|
||||
pageData.tableConfiger.loading = false;
|
||||
}).catch((err) => {
|
||||
pageData.tableConfiger.loading = false;
|
||||
})
|
||||
}
|
||||
// 送培
|
||||
const trainingCompany=ref()
|
||||
const onBatchAudit = (val) => {
|
||||
if (ids.value.length === 0) return ElMessage.warning("请选择要送培的人员");
|
||||
proxy.$modal.confirm("是否确认送培?").then(() => {
|
||||
let params = { ids: ids.value, ...val }
|
||||
qcckPost(params,'/mosty-base/bans/njxx/sendTraining').then(res=>{
|
||||
ElMessage.success("送培成功");
|
||||
emit('refresh');
|
||||
close();
|
||||
})
|
||||
});
|
||||
}
|
||||
const changePxgs = () => {
|
||||
trainingCompany.value.init()
|
||||
}
|
||||
|
||||
|
||||
const close = () => {
|
||||
visible.value = false;
|
||||
ids.value = [];
|
||||
pageData.tableData = []
|
||||
}
|
||||
defineExpose({
|
||||
init
|
||||
})
|
||||
</script>
|
||||
|
||||
<style scoped lang="scss">
|
||||
|
||||
</style>
|
||||
209
src/views/Training/securityNjsp/components/detailForm.vue
Normal file
209
src/views/Training/securityNjsp/components/detailForm.vue
Normal file
@ -0,0 +1,209 @@
|
||||
<template>
|
||||
<div class="dialog" v-if="dialogForm">
|
||||
<div class="head_box">
|
||||
<span>详情</span>
|
||||
<div><el-button size="small" @click="close">关闭</el-button></div>
|
||||
</div>
|
||||
<div class="cntinfo">
|
||||
<!-- 标签 -->
|
||||
<!-- <ul class="tag-box">
|
||||
<li class="tag_item" :class="detail.pxgsShzt == 0 ? 'dsh_item' : detail.pxgsShzt == 1 ? 'tgg_item' : 'jtb_item'"> -->
|
||||
<!-- 0-待审核 1-通过 2-驳回 -->
|
||||
<!-- {{ detail.pxgsShzt == 0 ? '待审核' : detail.pxgsShzt == 1 ? '通过' : '驳回' }}
|
||||
</li>
|
||||
</ul> -->
|
||||
<!-- 内容描述 -->
|
||||
<el-descriptions class="desc" :column="3" border label-width="200px">
|
||||
<el-descriptions-item label="保安公司名称">{{ detail.ssbakk }}</el-descriptions-item>
|
||||
<el-descriptions-item label="年审年份">{{ detail.njnf }}</el-descriptions-item>
|
||||
<el-descriptions-item label="姓名">{{ detail.xm }}</el-descriptions-item>
|
||||
|
||||
<el-descriptions-item label="身份证号码">{{ detail.sfzhm }}</el-descriptions-item>
|
||||
<el-descriptions-item label="电话">{{ detail.dh }}</el-descriptions-item>
|
||||
<el-descriptions-item label="性别">
|
||||
<DictTag :value="detail.xb" :tag="false" :options="props.dic.D_BZ_XB" />
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="民族">
|
||||
<DictTag :value="detail.mz" :tag="false" :options="props.dic.D_BZ_MZ" />
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="籍贯">{{ detail.jg }}</el-descriptions-item>
|
||||
<el-descriptions-item label="文化程度">
|
||||
<DictTag :value="detail.whcd" :tag="false" :options="props.dic.D_BZ_WHCD" />
|
||||
</el-descriptions-item>
|
||||
|
||||
<el-descriptions-item label="证书编号">{{ detail.zsbh }}</el-descriptions-item>
|
||||
<el-descriptions-item label="上岗证号码">{{ detail.sgxkhm }}</el-descriptions-item>
|
||||
<el-descriptions-item label="服务行业">
|
||||
<DictTag :value="detail.fwxy" :tag="false" :options="props.dic.D_BAXX_SSHY" />
|
||||
</el-descriptions-item>
|
||||
|
||||
<el-descriptions-item label="服务行业名称">{{ detail.fwxymc }}</el-descriptions-item>
|
||||
<el-descriptions-item label="入职时间">{{ detail.rzsj }}</el-descriptions-item>
|
||||
<el-descriptions-item label="政治面貌">
|
||||
<DictTag :value="detail.zzmm" :tag="false" :options="props.dic.D_BZ_ZZMM" />
|
||||
</el-descriptions-item>
|
||||
|
||||
<el-descriptions-item label="无犯罪记录证明">
|
||||
<div class="img-grid one">
|
||||
<el-image
|
||||
:src="baseUrl + detail.wfbjlzm"
|
||||
fit="cover"
|
||||
:preview-src-list='[baseUrl + detail.wfbjlzm]'
|
||||
preview-teleported
|
||||
class="img"
|
||||
/>
|
||||
</div>
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="体检报告">
|
||||
<div class="img-grid one">
|
||||
<el-image
|
||||
:src="baseUrl + detail.tjbg"
|
||||
fit="cover"
|
||||
:preview-src-list='[baseUrl + detail.tjbg]'
|
||||
preview-teleported
|
||||
class="img"
|
||||
/>
|
||||
</div>
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="身份证正反面">
|
||||
<div class="img-grid two">
|
||||
<el-image
|
||||
:src="baseUrl + detail.sfzzm"
|
||||
fit="cover"
|
||||
:preview-src-list='[baseUrl + detail.sfzzm]'
|
||||
preview-teleported
|
||||
class="img"
|
||||
/>
|
||||
<el-image
|
||||
:src="baseUrl + detail.sfzfm"
|
||||
fit="cover"
|
||||
:preview-src-list='[baseUrl + detail.sfzfm]'
|
||||
preview-teleported
|
||||
class="img"
|
||||
/>
|
||||
</div>
|
||||
</el-descriptions-item>
|
||||
|
||||
<el-descriptions-item label="审核时间">{{ detail.auditTime }}</el-descriptions-item>
|
||||
<el-descriptions-item label="发证机关">{{ detail.issuingAuthority }}</el-descriptions-item>
|
||||
<el-descriptions-item label="发证日期">{{ detail.issueDate }}</el-descriptions-item>
|
||||
|
||||
<el-descriptions-item label="驳回原因" :span="3">{{ detail.rejectReason }}</el-descriptions-item>
|
||||
</el-descriptions>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { ref, defineEmits } from 'vue';
|
||||
const emit = defineEmits(["refresh"]);
|
||||
const baseUrl = '/bagl/mosty-base/minio/image/download/'
|
||||
const props = defineProps({
|
||||
dic: {
|
||||
default: [[]], //二维数组
|
||||
type: Array
|
||||
}
|
||||
})
|
||||
const dialogForm = ref(false);
|
||||
const listQuery = ref({});
|
||||
const detail = ref({})
|
||||
|
||||
// 初始化数据
|
||||
const init = (type, row,) => {
|
||||
dialogForm.value = true;
|
||||
let obj = JSON.parse(JSON.stringify(row));
|
||||
let zj = obj.sfzzfmj.split(',');
|
||||
obj.sfzzm = [zj[0]];
|
||||
obj.sfzfm = [zj[1]];
|
||||
setTimeout(() => {
|
||||
detail.value = obj;
|
||||
}, 1000);
|
||||
};
|
||||
|
||||
const close = () => {
|
||||
dialogForm.value = false;
|
||||
listQuery.value = {};
|
||||
};;
|
||||
|
||||
|
||||
defineExpose({ init })
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
@import "@/assets/css/layout.scss";
|
||||
|
||||
.mapBox {
|
||||
width: calc(100% - 24rem);
|
||||
height: 500px;
|
||||
overflow: hidden;
|
||||
margin: 0 12rem;
|
||||
}
|
||||
.cntinfo{
|
||||
position: relative;
|
||||
padding: 10px 20px;
|
||||
box-sizing: border-box;
|
||||
.tag-box{
|
||||
position: absolute;
|
||||
top: 20px;
|
||||
right: 50px;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 10px;
|
||||
.tag_item{
|
||||
width: 70px;
|
||||
height: 70px;
|
||||
border-radius: 50%;
|
||||
line-height: 65px;
|
||||
text-align: center;
|
||||
font-size: 16px;
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
.jtb_item{
|
||||
border: 5px solid #FA3758;
|
||||
color: #FA3758;
|
||||
background: rgba(250,55,88,0.2);
|
||||
}
|
||||
.tgg_item{
|
||||
color: #28EEBF;
|
||||
background: rgba(40,238,191,0.2);
|
||||
border: 5px solid #28EEBF;
|
||||
}
|
||||
.dsh_item{
|
||||
background: rgba(0,114,255,0.2);
|
||||
color: #0072FF;
|
||||
border: 5px solid #0072FF;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.desc {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.img-grid {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 10px;
|
||||
min-height: 70px;
|
||||
}
|
||||
|
||||
.img-grid.one .img,
|
||||
.img-grid.one .img-placeholder {
|
||||
width: 64px;
|
||||
height: 64px;
|
||||
}
|
||||
|
||||
.img-grid.two .img,
|
||||
.img-grid.two .img-placeholder {
|
||||
width: 64px;
|
||||
height: 64px;
|
||||
}
|
||||
|
||||
.img-placeholder {
|
||||
background: #d9d9d9;
|
||||
border-radius: 2px;
|
||||
}
|
||||
::v-deep .el-descriptions__label.el-descriptions__cell.is-bordered-label{
|
||||
background: #F6FAFF;
|
||||
}
|
||||
</style>
|
||||
108
src/views/Training/securityNjsp/components/steps.vue
Normal file
108
src/views/Training/securityNjsp/components/steps.vue
Normal file
@ -0,0 +1,108 @@
|
||||
<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="保安公司审核" :description="dataForm.bakkShsj || '未审核'" />
|
||||
<el-step title="培训公司审核" :description="dataForm.pxgsShsj || '未审核'" />
|
||||
<el-step title="公安局审核" :description="dataForm.gonganShsj || '未审核'" />
|
||||
</el-steps>
|
||||
</div>
|
||||
</el-dialog>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { qcckPost } from "@/api/qcckApi.js";
|
||||
import { ref, defineExpose } from 'vue';
|
||||
const dialogForm = ref(false);
|
||||
const active = ref(1)
|
||||
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: 260px;
|
||||
padding: 6px 10px 10px;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
: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;
|
||||
}
|
||||
</style>
|
||||
@ -0,0 +1,59 @@
|
||||
<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 { ElMessage } from "element-plus";
|
||||
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.companyId === dataValue.value)
|
||||
if (data) {
|
||||
emit('onBatchAudit', data)
|
||||
close()
|
||||
} else {
|
||||
ElMessage.warning("请选择培训公司")
|
||||
}
|
||||
}
|
||||
const close = () => {
|
||||
visible.value = false;
|
||||
dataList.value = []
|
||||
}
|
||||
defineExpose({
|
||||
init
|
||||
})
|
||||
</script>
|
||||
|
||||
<style scoped lang="scss"></style>
|
||||
183
src/views/Training/securityNjsp/index.vue
Normal file
183
src/views/Training/securityNjsp/index.vue
Normal file
@ -0,0 +1,183 @@
|
||||
<template>
|
||||
<div>
|
||||
<div class="titleBox">
|
||||
<PageTitle title="保安员年检送培">
|
||||
<el-button type="primary" @click="onBatchAudit">批量送培</el-button>
|
||||
</PageTitle>
|
||||
</div>
|
||||
<!-- 搜索 -->
|
||||
<div ref="searchBox">
|
||||
<Search :searchArr="searchConfiger" @submit="onSearch" :key="pageData.keyCount" />
|
||||
</div>
|
||||
<!-- 表格 -->
|
||||
<div class="tabBox">
|
||||
<MyTable :tableData="pageData.tableData" :tableColumn="pageData.tableColumn" :tableHeight="pageData.tableHeight"
|
||||
:key="pageData.keyCount" :tableConfiger="pageData.tableConfiger" :controlsWidth="pageData.controlsWidth"
|
||||
@chooseData="chooseData">
|
||||
<template #sptz="{ row }">
|
||||
<DictTag :value="row.sptz" :tag="false" :options="D_BA_SPZT" />
|
||||
</template>
|
||||
<template #whcd="{ row }">
|
||||
<DictTag :value="row.whcd" :tag="false" :options="D_BZ_WHCD" />
|
||||
</template>
|
||||
<!-- 操作 -->
|
||||
<template #controls="{ row }">
|
||||
<el-link type="primary" link @click="addEdit('sh', row)">审核流程</el-link>
|
||||
<el-link type="primary" link @click="addEdit('detail', row)">详情</el-link>
|
||||
</template>
|
||||
</MyTable>
|
||||
<Pages @changeNo="changeNo" @changeSize="changeSize" :tableHeight="pageData.tableHeight" :pageConfiger="{
|
||||
...pageData.pageConfiger,
|
||||
total: pageData.total
|
||||
}"></Pages>
|
||||
</div>
|
||||
<!-- 详情 -->
|
||||
<DetailForm ref="detailDiloag" :dic="{ D_BZ_ZZMM,D_BZ_XB,D_BZ_MZ,D_BA_SHZT,D_BAXX_SSHY,D_BA_SPZT,D_BZ_WHCD }"/>
|
||||
<!-- 审核流程 -->
|
||||
<Steps ref="RefSteap" ></Steps>
|
||||
<!-- 送培 -->
|
||||
<AddSp ref="addSpDiloag" @refresh="getList" />
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import PageTitle from "@/components/aboutTable/PageTitle.vue";
|
||||
import MyTable from "@/components/aboutTable/MyTable.vue";
|
||||
import Pages from "@/components/aboutTable/Pages.vue";
|
||||
import Search from "@/components/aboutTable/Search.vue";
|
||||
import DetailForm from "./components/detailForm.vue";
|
||||
import Steps from "@/components/steps.vue";
|
||||
import AddSp from "./components/addSp.vue";
|
||||
import {getItem} from '@/utils/storage.js'
|
||||
import { qcckPost } from "@/api/qcckApi.js";
|
||||
import { reactive, ref, onMounted, getCurrentInstance, nextTick } from "vue";
|
||||
const userInfo = getItem('userInfo');
|
||||
const { proxy } = getCurrentInstance();
|
||||
const { D_BZ_ZZMM,D_BZ_XB,D_BZ_MZ,D_BA_SHZT,D_BAXX_SSHY,D_BA_SPZT,D_BZ_WHCD } = proxy.$dict('D_BZ_ZZMM','D_BZ_XB','D_BZ_MZ','D_BA_SHZT','D_BAXX_SSHY','D_BA_SPZT','D_BZ_WHCD');
|
||||
const detailDiloag = ref();
|
||||
const RefSteap = ref();
|
||||
const addSpDiloag = ref();
|
||||
const shForm = ref();
|
||||
const searchBox = ref(); //搜索框
|
||||
const selectedRows = ref([]);
|
||||
const searchConfiger = ref([
|
||||
{
|
||||
label: "姓名",
|
||||
prop: "xm",
|
||||
showType: "input"
|
||||
},
|
||||
{
|
||||
label: "身份证号码",
|
||||
prop: "sfzhm",
|
||||
showType: "input"
|
||||
},
|
||||
{
|
||||
label: "电话",
|
||||
prop: "dh",
|
||||
showType: "input"
|
||||
},
|
||||
]);
|
||||
const queryFrom = ref({});
|
||||
const pageData = reactive({
|
||||
tableData: [],
|
||||
keyCount: 0,
|
||||
tableConfiger: {
|
||||
rowHieght: 61,
|
||||
showSelectType: "checkBox",
|
||||
loading: false
|
||||
},
|
||||
total: 0,
|
||||
pageConfiger: {
|
||||
pageSize: 20,
|
||||
pageNum: 1
|
||||
},
|
||||
controlsWidth: 180,
|
||||
tableColumn: [
|
||||
{ label: "保安公司名称", prop: "ssbakk",showOverflowTooltip: true },
|
||||
{ label: "培训公司", prop: "sptzCompanyName", showOverflowTooltip: true },
|
||||
{ label: "年审年份", prop: "njnf"},
|
||||
{ label: "姓名", prop: "xm" },
|
||||
{ label: "身份证号码", prop: "sfzhm",showOverflowTooltip: true },
|
||||
{ label: "电话", prop: "dh" },
|
||||
{ label: "文化程度", prop: "whcd", showSolt: true },
|
||||
{ label: "证书编号", prop: "zsbh", showOverflowTooltip: true },
|
||||
{ label: "服务行业", prop: "fwxymc" },
|
||||
{ label: "入职时间", prop: "rzsj" },
|
||||
{ label: "上岗证号码", prop: "sgxkhm", showOverflowTooltip: true },
|
||||
{ label: "送培状态", prop: "sptz", showSolt: true }
|
||||
]
|
||||
});
|
||||
onMounted(() => {
|
||||
getList();
|
||||
tabHeightFn();
|
||||
});
|
||||
// 搜索
|
||||
const onSearch = (val) => {
|
||||
queryFrom.value = { ...val };
|
||||
pageData.pageConfiger.pageNum = 1;
|
||||
getList();
|
||||
};
|
||||
const changeNo = (val) => {
|
||||
pageData.pageConfiger.pageNum = val;
|
||||
getList();
|
||||
};
|
||||
const changeSize = (val) => {
|
||||
pageData.pageConfiger.pageSize = val;
|
||||
getList();
|
||||
};
|
||||
// 获取列表
|
||||
const getList = () => {
|
||||
pageData.tableConfiger.loading = true;
|
||||
const promes = {
|
||||
...pageData.pageConfiger,
|
||||
...queryFrom.value,
|
||||
ssbakk:userInfo.pxgs,
|
||||
ssbakkId:userInfo.pxgsid
|
||||
}
|
||||
qcckPost(promes,'/mosty-base/bans/njxx/listForSendTraining').then((res) => {
|
||||
pageData.tableData = res.records || []
|
||||
pageData.total = res.total;
|
||||
pageData.tableConfiger.loading = false;
|
||||
}).catch((err) => {
|
||||
pageData.tableConfiger.loading = false;
|
||||
})
|
||||
};
|
||||
|
||||
const chooseData = (rows) => {
|
||||
selectedRows.value = Array.isArray(rows) ? rows.map(v=>v.id) : [];
|
||||
};
|
||||
|
||||
const onBatchAudit = () => {
|
||||
addSpDiloag.value.init();
|
||||
};
|
||||
|
||||
|
||||
// 详情
|
||||
const addEdit = (type, row) => {
|
||||
nextTick(() => {
|
||||
if(type == 'sh'){
|
||||
RefSteap.value.init(row);
|
||||
}else if(type == 'shForm'){
|
||||
shForm.value.init(row);
|
||||
}
|
||||
else{
|
||||
detailDiloag.value.init(type, row);
|
||||
}
|
||||
})
|
||||
};
|
||||
|
||||
|
||||
// 表格高度计算
|
||||
const tabHeightFn = () => {
|
||||
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 250;
|
||||
window.onresize = function () {
|
||||
tabHeightFn();
|
||||
};
|
||||
};
|
||||
</script>
|
||||
|
||||
<style>
|
||||
.el-loading-mask {
|
||||
background: rgba(0, 0, 0, 0.5) !important;
|
||||
}
|
||||
</style>
|
||||
210
src/views/Training/trainingCompanyNjgl/components/detailForm.vue
Normal file
210
src/views/Training/trainingCompanyNjgl/components/detailForm.vue
Normal file
@ -0,0 +1,210 @@
|
||||
<template>
|
||||
<div class="dialog" v-if="dialogForm">
|
||||
<div class="head_box">
|
||||
<span>详情</span>
|
||||
<div><el-button size="small" @click="close">关闭</el-button></div>
|
||||
</div>
|
||||
<div class="cntinfo">
|
||||
<!-- 标签 -->
|
||||
<!-- <ul class="tag-box">
|
||||
<li class="tag_item" :class="detail.pxgsShzt == 0 ? 'dsh_item' : detail.pxgsShzt == 1 ? 'tgg_item' : 'jtb_item'"> -->
|
||||
<!-- 0-待审核 1-通过 2-驳回 -->
|
||||
<!-- {{ detail.pxgsShzt == 0 ? '待审核' : detail.pxgsShzt == 1 ? '通过' : '驳回' }}
|
||||
</li>
|
||||
</ul> -->
|
||||
<!-- 内容描述 -->
|
||||
<el-descriptions class="desc" :column="3" border label-width="200px">
|
||||
<el-descriptions-item label="保安公司名称">{{ detail.ssbakk }}</el-descriptions-item>
|
||||
<el-descriptions-item label="年审年份">{{ detail.njnf }}</el-descriptions-item>
|
||||
<el-descriptions-item label="姓名">{{ detail.xm }}</el-descriptions-item>
|
||||
|
||||
<el-descriptions-item label="身份证号码">{{ detail.sfzhm }}</el-descriptions-item>
|
||||
<el-descriptions-item label="年龄">{{ detail.nl }}</el-descriptions-item>
|
||||
<el-descriptions-item label="电话">{{ detail.dh }}</el-descriptions-item>
|
||||
<el-descriptions-item label="性别">
|
||||
<DictTag :value="detail.xb" :tag="false" :options="props.dic.D_BZ_XB" />
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="民族">
|
||||
<DictTag :value="detail.mz" :tag="false" :options="props.dic.D_BZ_MZ" />
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="籍贯">{{ detail.jg }}</el-descriptions-item>
|
||||
<el-descriptions-item label="文化程度">
|
||||
<DictTag :value="detail.whcd" :tag="false" :options="props.dic.D_BZ_WHCD" />
|
||||
</el-descriptions-item>
|
||||
|
||||
<el-descriptions-item label="证书编号">{{ detail.zsbh }}</el-descriptions-item>
|
||||
<el-descriptions-item label="上岗证号码">{{ detail.sgxkhm }}</el-descriptions-item>
|
||||
<el-descriptions-item label="服务行业">
|
||||
<DictTag :value="detail.fwxy" :tag="false" :options="props.dic.D_BAXX_SSHY" />
|
||||
</el-descriptions-item>
|
||||
|
||||
<el-descriptions-item label="服务行业名称">{{ detail.fwxymc }}</el-descriptions-item>
|
||||
<el-descriptions-item label="入职时间">{{ detail.rzsj }}</el-descriptions-item>
|
||||
<el-descriptions-item label="政治面貌">
|
||||
<DictTag :value="detail.zzmm" :tag="false" :options="props.dic.D_BZ_ZZMM" />
|
||||
</el-descriptions-item>
|
||||
|
||||
<el-descriptions-item label="无犯罪记录证明">
|
||||
<div class="img-grid one">
|
||||
<el-image
|
||||
:src="baseUrl + detail.wfbjlzm"
|
||||
fit="cover"
|
||||
:preview-src-list='[baseUrl + detail.wfbjlzm]'
|
||||
preview-teleported
|
||||
class="img"
|
||||
/>
|
||||
</div>
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="体检报告">
|
||||
<div class="img-grid one">
|
||||
<el-image
|
||||
:src="baseUrl + detail.tjbg"
|
||||
fit="cover"
|
||||
:preview-src-list='[baseUrl + detail.tjbg]'
|
||||
preview-teleported
|
||||
class="img"
|
||||
/>
|
||||
</div>
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="身份证正反面">
|
||||
<div class="img-grid two">
|
||||
<el-image
|
||||
:src="baseUrl + detail.sfzzm"
|
||||
fit="cover"
|
||||
:preview-src-list='[baseUrl + detail.sfzzm]'
|
||||
preview-teleported
|
||||
class="img"
|
||||
/>
|
||||
<el-image
|
||||
:src="baseUrl + detail.sfzfm"
|
||||
fit="cover"
|
||||
:preview-src-list='[baseUrl + detail.sfzfm]'
|
||||
preview-teleported
|
||||
class="img"
|
||||
/>
|
||||
</div>
|
||||
</el-descriptions-item>
|
||||
|
||||
<el-descriptions-item label="审核时间">{{ detail.shsj }}</el-descriptions-item>
|
||||
<el-descriptions-item label="发证机关">{{ detail.fqjg }}</el-descriptions-item>
|
||||
<el-descriptions-item label="发证日期">{{ detail.fqsj }}</el-descriptions-item>
|
||||
|
||||
<el-descriptions-item label="驳回原因" :span="3" v-if="detail.pxgsShzt== 2">{{ detail.bhyy }}</el-descriptions-item>
|
||||
</el-descriptions>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { ref, computed, defineEmits, getCurrentInstance,defineProps } from 'vue';
|
||||
import { qcckPost } from "@/api/qcckApi.js";
|
||||
const emit = defineEmits(["refresh"]);
|
||||
const { proxy } = getCurrentInstance();
|
||||
const baseUrl = '/bagl/mosty-base/minio/image/download/'
|
||||
const props = defineProps({
|
||||
dic: {
|
||||
default: [[]], //二维数组
|
||||
type: Array
|
||||
}
|
||||
})
|
||||
|
||||
const dialogForm = ref(false);
|
||||
const detail = ref({})
|
||||
|
||||
// 初始化数据
|
||||
const init = (type, row,) => {
|
||||
dialogForm.value = true;
|
||||
qcckPost({},'/mosty-base/bans/njxx/getInfo/'+row.id).then(res => {
|
||||
let zj = res.sfzzfmj.split(',');
|
||||
res.sfzzm = [zj[0]];
|
||||
res.sfzfm = [zj[1]];
|
||||
detail.value = res || {};
|
||||
})
|
||||
};
|
||||
|
||||
const close = () => {
|
||||
dialogForm.value = false;
|
||||
detail.value = {};
|
||||
};
|
||||
|
||||
defineExpose({ init })
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
@import "@/assets/css/layout.scss";
|
||||
.mapBox {
|
||||
width: calc(100% - 24rem);
|
||||
height: 500px;
|
||||
overflow: hidden;
|
||||
margin: 0 12rem;
|
||||
}
|
||||
.cntinfo{
|
||||
position: relative;
|
||||
padding: 10px 20px;
|
||||
box-sizing: border-box;
|
||||
.tag-box{
|
||||
position: absolute;
|
||||
top: 20px;
|
||||
right: 50px;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 10px;
|
||||
z-index: 99999;
|
||||
.tag_item{
|
||||
width: 70px;
|
||||
height: 70px;
|
||||
border-radius: 50%;
|
||||
line-height: 65px;
|
||||
text-align: center;
|
||||
font-size: 16px;
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
.jtb_item{
|
||||
border: 5px solid #FA3758;
|
||||
color: #FA3758;
|
||||
background: rgba(250,55,88,0.2);
|
||||
}
|
||||
.tgg_item{
|
||||
color: #28EEBF;
|
||||
background: rgba(40,238,191,0.2);
|
||||
border: 5px solid #28EEBF;
|
||||
}
|
||||
.dsh_item{
|
||||
background: rgba(0,114,255,0.2);
|
||||
color: #0072FF;
|
||||
border: 5px solid #0072FF;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.desc {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.img-grid {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 10px;
|
||||
min-height: 70px;
|
||||
}
|
||||
|
||||
.img-grid.one .img,
|
||||
.img-grid.one .img-placeholder {
|
||||
width: 64px;
|
||||
height: 64px;
|
||||
}
|
||||
|
||||
.img-grid.two .img,
|
||||
.img-grid.two .img-placeholder {
|
||||
width: 64px;
|
||||
height: 64px;
|
||||
}
|
||||
|
||||
.img-placeholder {
|
||||
background: #d9d9d9;
|
||||
border-radius: 2px;
|
||||
}
|
||||
::v-deep .el-descriptions__label.el-descriptions__cell.is-bordered-label{
|
||||
background: #F6FAFF;
|
||||
}
|
||||
</style>
|
||||
138
src/views/Training/trainingCompanyNjgl/components/shForm.vue
Normal file
138
src/views/Training/trainingCompanyNjgl/components/shForm.vue
Normal file
@ -0,0 +1,138 @@
|
||||
<template>
|
||||
<div>
|
||||
<el-dialog class="steps-dialog" title="审核" v-model="dialogForm" :close-on-click-modal="false" @close="dialogForm = false,formData = {}" width="420px">
|
||||
<el-form :model="formData" ref="formRef" :rules="rules" label-width="120px">
|
||||
<el-form-item label="是否通过" prop="auditStatus">
|
||||
<el-radio-group v-model="formData.auditStatus">
|
||||
<el-radio label="1">通过</el-radio>
|
||||
<el-radio label="0">不通过</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
<el-form-item label="驳回原因" prop="rejectReason" v-if="formData.auditStatus === '0'">
|
||||
<el-input v-model="formData.rejectReason" type="textarea" placeholder="请输入驳回原因" :autosize="{ minRows: 2, maxRows: 4 }" />
|
||||
</el-form-item>
|
||||
<div class="flex just-center">
|
||||
<el-button @click="dialogForm = false,formData = {}">取消</el-button>
|
||||
<el-button type="primary" :loading="loading" @click="submitForm">提交</el-button>
|
||||
</div>
|
||||
</el-form>
|
||||
</el-dialog>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { ElMessage } from "element-plus";
|
||||
import { ref, defineExpose,defineEmits } from 'vue';
|
||||
import { qcckPost } from "@/api/qcckApi.js";
|
||||
const emit = defineEmits(['refresh'])
|
||||
const dialogForm = ref(false);
|
||||
const loading = ref(false)
|
||||
const formData = ref({})
|
||||
const rules = ref({
|
||||
auditType: [{ required: true, message: '请选择审核类型', trigger: 'blur' }],
|
||||
auditStatus: [{ required: true, message: '请选择是否通过', trigger: 'blur' }],
|
||||
rejectReason: [{ required: true, message: '请输入驳回原因', trigger: 'blur' }],
|
||||
})
|
||||
const formRef = ref();
|
||||
const idsVal = ref([])
|
||||
const init = (ids) => {
|
||||
idsVal.value = ids;
|
||||
dialogForm.value = true;
|
||||
}
|
||||
|
||||
const submitForm = () =>{
|
||||
formRef.value.validate((valid) => {
|
||||
if (!valid) return;
|
||||
loading.value = true;
|
||||
// // 保安公司审核 - bakk 培训公司审核 -- pxgs 公安局审核 -- gongan
|
||||
let params = { ...formData.value,ids:idsVal.value,auditType:'pxgs' }
|
||||
qcckPost(params,"/mosty-base/bans/njxx/batchAudit").then((res) => {
|
||||
loading.value = false;
|
||||
ElMessage.success("操作成功");
|
||||
dialogForm.value = false;
|
||||
formData.value={}
|
||||
emit('refresh')
|
||||
}).catch(()=>{
|
||||
loading.value = false;
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
defineExpose({
|
||||
init
|
||||
})
|
||||
</script>
|
||||
|
||||
<style scoped lang="scss">
|
||||
.steps-body {
|
||||
height: 260px;
|
||||
padding: 6px 10px 10px;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
: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;
|
||||
}
|
||||
</style>
|
||||
126
src/views/Training/trainingCompanyNjgl/components/steps.vue
Normal file
126
src/views/Training/trainingCompanyNjgl/components/steps.vue
Normal file
@ -0,0 +1,126 @@
|
||||
<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="保安公司审核" :description="dataForm.bakkShsj || '未审核'" />
|
||||
<el-step title="培训公司审核" :description="dataForm.pxgsShsj || '未审核'" />
|
||||
<el-step title="公安局审核" :description="dataForm.gonganShsj || '未审核'" />
|
||||
</el-steps>
|
||||
</div>
|
||||
</el-dialog>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<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: 260px;
|
||||
padding: 6px 10px 10px;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
: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>
|
||||
190
src/views/Training/trainingCompanyNjgl/index.vue
Normal file
190
src/views/Training/trainingCompanyNjgl/index.vue
Normal file
@ -0,0 +1,190 @@
|
||||
<template>
|
||||
<div>
|
||||
<div class="titleBox">
|
||||
<PageTitle title="公司保安员年检管理">
|
||||
<el-button type="primary" @click="onBatchAudit(selectedRows)">批量审核</el-button>
|
||||
</PageTitle>
|
||||
</div>
|
||||
<!-- 搜索 -->
|
||||
<div ref="searchBox">
|
||||
<Search :searchArr="searchConfiger" @submit="onSearch" :key="pageData.keyCount" />
|
||||
</div>
|
||||
<!-- 表格 -->
|
||||
<div class="tabBox">
|
||||
<MyTable :tableData="pageData.tableData" :tableColumn="pageData.tableColumn" :tableHeight="pageData.tableHeight"
|
||||
:key="pageData.keyCount" :tableConfiger="pageData.tableConfiger" :controlsWidth="pageData.controlsWidth"
|
||||
@chooseData="chooseData">
|
||||
<template #whcd="{ row }">
|
||||
<DictTag :value="row.whcd" :tag="false" :options="D_BZ_WHCD" />
|
||||
</template>
|
||||
<template #pxgsShzt="{ row }">
|
||||
<DictTag :value="row.pxgsShzt" :tag="false" :color="row.pxgsShzt == 0 ? '#ff0000' : row.pxgsShzt == 1 ? '#28EEBF' : '#FA3758'" :options="D_BA_SHZT" />
|
||||
</template>
|
||||
|
||||
<!-- 操作 -->
|
||||
<template #controls="{ row }">
|
||||
<el-link type="primary" link @click="onBatchAudit([row.id])" v-if="row.pxgsShzt == 0">立即审核</el-link>
|
||||
<el-link type="primary" link @click="addEdit('RefSteap', row)">审核流程</el-link>
|
||||
<el-link type="primary" link @click="addEdit('detail', row)">详情</el-link>
|
||||
</template>
|
||||
</MyTable>
|
||||
<Pages @changeNo="changeNo" @changeSize="changeSize" :tableHeight="pageData.tableHeight" :pageConfiger="{
|
||||
...pageData.pageConfiger,
|
||||
total: pageData.total
|
||||
}"></Pages>
|
||||
</div>
|
||||
<!-- 详情 -->
|
||||
<DetailForm ref="detailDiloag" :dic="{ D_BZ_ZZMM,D_BZ_XB,D_BZ_MZ,D_BA_SHZT,D_BAXX_SSHY,D_BA_SPZT,D_BZ_WHCD}"/>
|
||||
<!-- 审核流程 -->
|
||||
<Steps ref="RefSteap" ></Steps>
|
||||
<!-- 审核 -->
|
||||
<ShForm ref="shForm" @refresh="getList"></ShForm>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import PageTitle from "@/components/aboutTable/PageTitle.vue";
|
||||
import MyTable from "@/components/aboutTable/MyTable.vue";
|
||||
import Pages from "@/components/aboutTable/Pages.vue";
|
||||
import Search from "@/components/aboutTable/Search.vue";
|
||||
import DetailForm from "./components/detailForm.vue";
|
||||
import Steps from "@/components/steps.vue";
|
||||
import ShForm from "./components/shForm.vue";
|
||||
import {getItem} from '@/utils/storage.js'
|
||||
import { qcckPost } from "@/api/qcckApi.js";
|
||||
import { reactive, ref, onMounted, getCurrentInstance, nextTick } from "vue";
|
||||
import { ElMessage } from "element-plus";
|
||||
const { proxy } = getCurrentInstance();
|
||||
const { D_BZ_ZZMM,D_BZ_XB,D_BZ_MZ,D_BA_SHZT,D_BAXX_SSHY,D_BA_SPZT,D_BZ_WHCD } = proxy.$dict('D_BZ_ZZMM','D_BZ_XB','D_BZ_MZ','D_BA_SHZT','D_BAXX_SSHY','D_BA_SPZT','D_BZ_WHCD');
|
||||
const userInfo = getItem('userInfo');
|
||||
const detailDiloag = ref();
|
||||
const RefSteap = ref();
|
||||
const shForm = ref();
|
||||
const searchBox = ref(); //搜索框
|
||||
const selectedRows = ref([]);
|
||||
const searchConfiger = ref([
|
||||
|
||||
{
|
||||
label: "姓名",
|
||||
prop: "xm",
|
||||
showType: "input"
|
||||
},
|
||||
{
|
||||
label: "身份证号码",
|
||||
prop: "sfzhm",
|
||||
showType: "input"
|
||||
},
|
||||
{
|
||||
label: "电话",
|
||||
prop: "dh",
|
||||
showType: "input"
|
||||
},
|
||||
]);
|
||||
const queryFrom = ref({});
|
||||
const pageData = reactive({
|
||||
tableData: [],
|
||||
keyCount: 0,
|
||||
tableConfiger: {
|
||||
rowHieght: 61,
|
||||
showSelectType: "checkBox",
|
||||
loading: false
|
||||
},
|
||||
total: 0,
|
||||
pageConfiger: {
|
||||
pageSize: 20,
|
||||
pageNum: 1
|
||||
},
|
||||
controlsWidth: 220,
|
||||
tableColumn: [
|
||||
{ label: "保安公司名称", prop: "ssbakk",showOverflowTooltip: true },
|
||||
{ label: "年审年份", prop: "njnf"},
|
||||
{ label: "姓名", prop: "xm" },
|
||||
{ label: "身份证号码", prop: "sfzhm",showOverflowTooltip: true },
|
||||
{ label: "电话", prop: "dh" },
|
||||
{ label: "文化程度", prop: "whcd" ,showSolt: true},
|
||||
{ label: "证书编号", prop: "zsbh", showOverflowTooltip: true },
|
||||
{ label: "服务行业", prop: "fwxymc" },
|
||||
{ label: "入职时间", prop: "rzsj" },
|
||||
{ label: "上岗证号码", prop: "sgxkhm", showOverflowTooltip: true },
|
||||
{ label: "审核状态", prop: "pxgsShzt",showSolt: true },
|
||||
]
|
||||
});
|
||||
onMounted(() => {
|
||||
getList();
|
||||
tabHeightFn();
|
||||
});
|
||||
// 搜索
|
||||
const onSearch = (val) => {
|
||||
queryFrom.value = { ...val };
|
||||
pageData.pageConfiger.pageNum = 1;
|
||||
getList();
|
||||
};
|
||||
const changeNo = (val) => {
|
||||
pageData.pageConfiger.pageNum = val;
|
||||
getList();
|
||||
};
|
||||
const changeSize = (val) => {
|
||||
pageData.pageConfiger.pageSize = val;
|
||||
getList();
|
||||
};
|
||||
// 获取列表
|
||||
const getList = () => {
|
||||
pageData.tableConfiger.loading = true;
|
||||
const promes = {
|
||||
...pageData.pageConfiger,
|
||||
...queryFrom.value,
|
||||
sptzCompanyName:userInfo.pxgs,
|
||||
sptzCompanyId:userInfo.pxgsid,
|
||||
// pxgsShzt:'1',//保安公司已通过
|
||||
sptz:'1',//已送培
|
||||
}
|
||||
qcckPost(promes,'/mosty-base/bans/njxx/page').then((res) => {
|
||||
pageData.tableData = res.records || []
|
||||
pageData.total = res.total;
|
||||
pageData.tableConfiger.loading = false;
|
||||
}).catch((err) => {
|
||||
pageData.tableConfiger.loading = false;
|
||||
})
|
||||
};
|
||||
|
||||
const chooseData = (rows) => {
|
||||
selectedRows.value = Array.isArray(rows) ? rows.map(v=>v.id) : [];
|
||||
};
|
||||
|
||||
const onBatchAudit = (valIds) => {
|
||||
let ids = [];
|
||||
valIds.forEach(id =>{
|
||||
let obj = pageData.tableData.find(it=>it.id == id);
|
||||
if(obj && obj.pxgsShzt == 0) ids.push(id);
|
||||
});
|
||||
if (!ids.length) return ElMessage.warning("请选择未审核的数据!该数据再审核状态下不能操作!");
|
||||
shForm.value.init(ids);
|
||||
};
|
||||
|
||||
|
||||
// 详情
|
||||
const addEdit = (type, row) => {
|
||||
nextTick(() => {
|
||||
if(type == 'RefSteap'){
|
||||
RefSteap.value.init(row);
|
||||
}else{
|
||||
detailDiloag.value.init(type, row);
|
||||
}
|
||||
})
|
||||
};
|
||||
|
||||
|
||||
// 表格高度计算
|
||||
const tabHeightFn = () => {
|
||||
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 250;
|
||||
window.onresize = function () {
|
||||
tabHeightFn();
|
||||
};
|
||||
};
|
||||
</script>
|
||||
|
||||
<style>
|
||||
.el-loading-mask {
|
||||
background: rgba(0, 0, 0, 0.5) !important;
|
||||
}
|
||||
</style>
|
||||
174
src/views/Training/trainingCompanyNjsp/components/addForm.vue
Normal file
174
src/views/Training/trainingCompanyNjsp/components/addForm.vue
Normal file
@ -0,0 +1,174 @@
|
||||
<template>
|
||||
<el-dialog :title="'年检签到'+title" v-model="visible" width="80%" :destroy-on-close="true" @close="close">
|
||||
<div class="cntinfo">
|
||||
<FormMessage ref="FormRef" :disabled="disabled" v-model="formData" :rules="rules" :formList="formList" :labelWidth='120'>
|
||||
</FormMessage>
|
||||
<el-divider border-style="dashed"><span class="pointer f16" @click="openPeoList">培训人员<el-icon size="22" color="#409eff" class="ml5" style="top: 4px;"><CirclePlus /></el-icon></span></el-divider>
|
||||
<MyTable :tableData="pageData.tableData" :tableColumn="pageData.tableColumn" :tableHeight="pageData.tableHeight"
|
||||
:key="pageData.keyCount" :tableConfiger="pageData.tableConfiger" :controlsWidth="pageData.controlsWidth"
|
||||
@chooseData="chooseData">
|
||||
<template #whcd="{ row }">
|
||||
<DictTag :value="row.whcd" :tag="false" :options="props.dic.D_BZ_WHCD" />
|
||||
</template>
|
||||
<template #qdztdm="{ row }">
|
||||
<span>{{ row.qdztdm === '1' ? '已签到' : '未签到' }}</span>
|
||||
</template>
|
||||
<!-- 操作 -->
|
||||
<template #controls="{ row }">
|
||||
<el-link type="primary" link @click="deleteItem(row)">删除</el-link>
|
||||
</template>
|
||||
</MyTable>
|
||||
<div class="mt10 flex just-center">
|
||||
<el-button @click="close">关闭</el-button>
|
||||
<el-button @click="save" type="primary" :loading="loading">保存</el-button>
|
||||
</div>
|
||||
</div>
|
||||
</el-dialog>
|
||||
<!-- 选择保安员 -->
|
||||
<ChooseList v-model="shoewList" :data="chooseType" @choosed="choosedList"></ChooseList>
|
||||
</template>
|
||||
<script setup>
|
||||
import { ElMessage } from "element-plus";
|
||||
import { qcckPost } from "@/api/qcckApi";
|
||||
import ChooseList from "@/components/ChooseList/index.vue";
|
||||
import MyTable from "@/components/aboutTable/MyTable.vue";
|
||||
import FormMessage from '@/components/aboutTable/FormMessage.vue'
|
||||
import { ref,reactive,defineEmits } from 'vue'
|
||||
const emit = defineEmits(['refresh'])
|
||||
const props = defineProps({
|
||||
dic: {
|
||||
type: Object,
|
||||
default: () => ({})
|
||||
}
|
||||
})
|
||||
const chooseType = reactive({
|
||||
title: '选择保安员',
|
||||
type: 'Bay',//选择类型
|
||||
Single: false,//是否单选
|
||||
roleIds: [],//回显的数据
|
||||
});
|
||||
const disabled = ref(false)
|
||||
const title = ref('')
|
||||
const formData = ref({})
|
||||
const FormRef = ref()
|
||||
const shoewList = ref(false)
|
||||
const visible = ref(false)
|
||||
const loading = ref(false)
|
||||
const formList = reactive([
|
||||
[
|
||||
{ label: "培训项目名称", prop: "pxxmmc", type: "input" },
|
||||
{ label: "培训地址", prop: "pxdz", type: "input"},
|
||||
],
|
||||
[
|
||||
{ label: "培训开始时间", prop: "pxkssj", type: "date",lx:'datetime' },
|
||||
{ label: "培训结束时间", prop: "pxjssj", type: "date" ,lx:'datetime' },
|
||||
],
|
||||
[
|
||||
{ label: "组织单位", prop: "zzdw", type: "input" },
|
||||
{ label: "培训内容", prop: "pxnr", type: "input" },
|
||||
]
|
||||
])
|
||||
const rules = ref({
|
||||
pxxmmc: [{ required: true, message: '请输入培训项目名称', trigger: ['blur'] }],
|
||||
pxdz: [{ required: true, message: '请输入培训地址', trigger: ['blur'] }],
|
||||
pxkssj: [{ required: true, message: '请选择培训开始时间', trigger: ['change'] }],
|
||||
pxjssj: [{ required: true, message: '请选择培训结束时间', trigger: ['change'] }],
|
||||
zzdw: [{ required: true, message: '请输入组织单位', trigger: ['blur'] }],
|
||||
pxnr: [{ required: true, message: '请输入培训内容', trigger: ['blur'] }],
|
||||
})
|
||||
const pageData = reactive({
|
||||
tableData: [],
|
||||
keyCount: 0,
|
||||
tableConfiger: {
|
||||
rowHieght: 61,
|
||||
showSelectType: "checkBox",
|
||||
loading: false,
|
||||
// haveControls: false
|
||||
},
|
||||
tableHeight: 320,
|
||||
tableColumn: [
|
||||
{ label: "保安公司名称", prop: "ssbakk",showOverflowTooltip: true },
|
||||
{ label: "年审年份", prop: "njnf"},
|
||||
{ label: "姓名", prop: "xm" },
|
||||
{ label: "身份证号码", prop: "sfzhm",showOverflowTooltip: true },
|
||||
{ label: "电话", prop: "dh" },
|
||||
{ label: "文化程度", prop: "whcd" ,showSolt: true},
|
||||
{ label: "证书编号", prop: "zsbh", showOverflowTooltip: true },
|
||||
{ label: "服务行业", prop: "fwxymc" },
|
||||
{ label: "入职时间", prop: "rzsj" },
|
||||
{ label: "上岗证号码", prop: "sgxkhm", showOverflowTooltip: true },
|
||||
{ label: "签到状态", prop: "qdztdm",showSolt: true },
|
||||
{ label: "签到时间", prop: "qdsj" },
|
||||
]
|
||||
});
|
||||
|
||||
const init = (type, row) => {
|
||||
visible.value = true
|
||||
pageData.keyCount++
|
||||
title.value = type == 'add' ? '新增' : '详情';
|
||||
disabled.value = title.value == '详情' ? true : false;
|
||||
if(title.value == '详情'){
|
||||
qcckPost({},'/mosty-base/bans/pxqd-item/getDetailInfo/'+row.id).then(res=>{
|
||||
formData.value = { ...res }
|
||||
delete formData.value.personAndNjxxList;
|
||||
pageData.tableData = res.personAndNjxxList.map(item => {
|
||||
return {
|
||||
...item,
|
||||
ssbakkId: item.bakkid,
|
||||
ssbakk: item.bakkmc,
|
||||
}
|
||||
}) || [];
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
const openPeoList = () => {
|
||||
if(disabled.value) return;
|
||||
shoewList.value = true;
|
||||
}
|
||||
// 删除
|
||||
const deleteItem = (row) => {
|
||||
pageData.tableData = pageData.tableData.filter(it=>it.id != row.id);
|
||||
chooseType.roleIds = chooseType.roleIds.filter(id=>id != row.id);
|
||||
}
|
||||
// 选择的数据
|
||||
const choosedList = (list) => {
|
||||
pageData.tableData = list || [];
|
||||
chooseType.roleIds = list.map(it=>it.id);
|
||||
}
|
||||
|
||||
const save = () => {
|
||||
FormRef.value.submit((val) => {
|
||||
const tableData = pageData.tableData.map(item => {
|
||||
return {
|
||||
...item,
|
||||
bakkid: item.ssbakkId,
|
||||
bakkmc: item.ssbakk,
|
||||
}
|
||||
})
|
||||
let data = { pxqdItem: { ...val }, pxqdPersons: tableData }
|
||||
qcckPost(data,'/mosty-base/bans/pxqd-item/addWithPersons').then(res=>{
|
||||
ElMessage.success('保存成功');
|
||||
emit('refresh')
|
||||
loading.value = false;
|
||||
close()
|
||||
})
|
||||
})
|
||||
|
||||
}
|
||||
const close = () => {
|
||||
FormRef.value?.reset();
|
||||
pageData.tableData = [];
|
||||
disabled.value = false;
|
||||
visible.value = false
|
||||
}
|
||||
defineExpose({
|
||||
init
|
||||
})
|
||||
</script>
|
||||
<style lang="scss" scoped>
|
||||
.cntinfo{
|
||||
padding: 20px 10px;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
</style>
|
||||
63
src/views/Training/trainingCompanyNjsp/components/steps.vue
Normal file
63
src/views/Training/trainingCompanyNjsp/components/steps.vue
Normal file
@ -0,0 +1,63 @@
|
||||
<template>
|
||||
<div>
|
||||
<el-dialog class="steps-dialog" title="上报分局" @close="dialogForm = false" :close-on-click-modal="false"
|
||||
v-model="dialogForm" width="50%">
|
||||
<div class="box">
|
||||
<el-form ref="formRef" :model="formdata" :rules="rules" style="height: 100%;">
|
||||
<el-form-item label="上报分局">
|
||||
<MOSTY.Department width="100%" clearable v-model="formdata.subBureauId" @getDepValue="getDepValue" />
|
||||
</el-form-item>
|
||||
<el-form-item label="上传签到表">
|
||||
<MOSTY.Upload width="100%" :limit="5" clearable v-model="formdata.attendanceSheetPath" />
|
||||
</el-form-item>
|
||||
<el-form-item label="上传现场照片">
|
||||
<MOSTY.Upload width="100%" :limit="5" clearable v-model="formdata.trainingPicturePath" />
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
</div>
|
||||
<div class="flex just-center">
|
||||
<el-button @click="dialogForm = false">取消</el-button>
|
||||
<el-button type="primary" @click="submitForm">上报</el-button>
|
||||
</div>
|
||||
</el-dialog>
|
||||
</div>
|
||||
</template>
|
||||
<script setup>
|
||||
import { ElMessage } from "element-plus";
|
||||
import { qcckPost } from "@/api/qcckApi.js";
|
||||
import * as MOSTY from "@/components/MyComponents/index";
|
||||
import { ref, defineExpose } from 'vue';
|
||||
const dialogForm = ref(true);
|
||||
const formdata = ref({})
|
||||
|
||||
const init = (row) => {
|
||||
formdata.value.pxqdItemId = row.id;
|
||||
dialogForm.value = true;
|
||||
}
|
||||
|
||||
const submitForm = () => {
|
||||
let params = JSON.parse(JSON.stringify(formdata.value));
|
||||
params.attendanceSheetPath = params.attendanceSheetPath.join(',')
|
||||
params.trainingPicturePath = params.trainingPicturePath.join(',')
|
||||
qcckPost(params, "/mosty-base/bans/pxqd-person/reportToSubBureauByItem").then(res => {
|
||||
if (res) {
|
||||
ElMessage({ message: '上报成功', type: 'success', })
|
||||
dialogForm.value = false;
|
||||
formdata.value = {}
|
||||
}
|
||||
})
|
||||
}
|
||||
const getDepValue = (val) => {
|
||||
formdata.value.subBureauId = val.orgCode
|
||||
formdata.value.subBureauName = val.orgName
|
||||
}
|
||||
defineExpose({
|
||||
init
|
||||
})
|
||||
</script>
|
||||
|
||||
<style scoped lang="scss">
|
||||
.box {
|
||||
height: 50vh;
|
||||
}
|
||||
</style>
|
||||
160
src/views/Training/trainingCompanyNjsp/index.vue
Normal file
160
src/views/Training/trainingCompanyNjsp/index.vue
Normal file
@ -0,0 +1,160 @@
|
||||
<template>
|
||||
<div>
|
||||
<div class="titleBox">
|
||||
<PageTitle title="年检签到">
|
||||
<el-button type="primary" @click="onBatchAudit('add',null)">新增</el-button>
|
||||
</PageTitle>
|
||||
</div>
|
||||
<!-- 搜索 -->
|
||||
<div ref="searchBox">
|
||||
<Search :searchArr="searchConfiger" @submit="onSearch" :key="pageData.keyCount" />
|
||||
</div>
|
||||
<!-- 表格 -->
|
||||
<div class="tabBox">
|
||||
<MyTable :tableData="pageData.tableData" :tableColumn="pageData.tableColumn" :tableHeight="pageData.tableHeight"
|
||||
:key="pageData.keyCount" :tableConfiger="pageData.tableConfiger" :controlsWidth="pageData.controlsWidth"
|
||||
@chooseData="chooseData">
|
||||
<template #sptz="{ row }">
|
||||
<DictTag :value="row.sptz" :tag="false" :options="D_BA_SPZT" />
|
||||
</template>
|
||||
<!-- 操作 -->
|
||||
<template #controls="{ row }">
|
||||
<el-link type="primary" link @click="dendDep(row)">上报分局</el-link>
|
||||
<el-link type="primary" link @click="onBatchAudit('detail', row)">详情</el-link>
|
||||
</template>
|
||||
</MyTable>
|
||||
<Pages @changeNo="changeNo" @changeSize="changeSize" :tableHeight="pageData.tableHeight" :pageConfiger="{
|
||||
...pageData.pageConfiger,
|
||||
total: pageData.total
|
||||
}"></Pages>
|
||||
</div>
|
||||
<!-- 新增 -->
|
||||
<AddForm ref="addFormRef" @refresh="getList" :dic="{D_BZ_WHCD}"></AddForm>
|
||||
<!-- 审核流程 -->
|
||||
<Steps ref="RefSteap" ></Steps>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import PageTitle from "@/components/aboutTable/PageTitle.vue";
|
||||
import MyTable from "@/components/aboutTable/MyTable.vue";
|
||||
import Pages from "@/components/aboutTable/Pages.vue";
|
||||
import Search from "@/components/aboutTable/Search.vue";
|
||||
import AddForm from "./components/addForm.vue";
|
||||
import Steps from "./components/steps.vue";
|
||||
import {getItem} from '@/utils/storage.js'
|
||||
import { qcckPost } from "@/api/qcckApi.js";
|
||||
import { reactive, ref, onMounted, getCurrentInstance, nextTick } from "vue";
|
||||
import { ElMessage } from "element-plus";
|
||||
const { proxy } = getCurrentInstance();
|
||||
const { D_BZ_WHCD,D_BA_SPZT } = proxy.$dict("D_BZ_WHCD",'D_BA_SPZT');
|
||||
const RefSteap = ref();
|
||||
const addFormRef = ref();
|
||||
const shForm = ref();
|
||||
const searchBox = ref(); //搜索框
|
||||
const selectedRows = ref([]);
|
||||
const searchConfiger = ref([
|
||||
{
|
||||
label: "培训项目名称",
|
||||
prop: "pxxmmc",
|
||||
showType: "input"
|
||||
},
|
||||
{
|
||||
label: "培训时间",
|
||||
prop: "pxsj",
|
||||
showType: "datetimerange"
|
||||
},
|
||||
]);
|
||||
const queryFrom = ref({});
|
||||
const pageData = reactive({
|
||||
tableData: [],
|
||||
keyCount: 0,
|
||||
tableConfiger: {
|
||||
rowHieght: 61,
|
||||
showSelectType: "checkBox",
|
||||
loading: false
|
||||
},
|
||||
total: 0,
|
||||
pageConfiger: {
|
||||
pageSize: 20,
|
||||
pageNum: 1
|
||||
},
|
||||
controlsWidth: 180,
|
||||
tableColumn: [
|
||||
{ label: "培训项目名称", prop: "pxxmmc",showOverflowTooltip: true },
|
||||
{ label: "培训地址", prop: "zzdw", showOverflowTooltip: true },
|
||||
{ label: "培训开始时间", prop: "pxkssj"},
|
||||
{ label: "培训结束时间", prop: "pxjssj" },
|
||||
{ label: "组织单位", prop: "zzdw",showOverflowTooltip: true },
|
||||
{ label: "培训内容", prop: "pxnr" },
|
||||
{ label: "培训人员", prop: "totalPersonCount" },
|
||||
{ label: "已签到人员", prop: "checkedInPersonCount", showOverflowTooltip: true },
|
||||
{ label: "未签到人员", prop: "notCheckedInPersonCount" },
|
||||
]
|
||||
});
|
||||
onMounted(() => {
|
||||
getList();
|
||||
tabHeightFn();
|
||||
});
|
||||
// 搜索
|
||||
const onSearch = (val) => {
|
||||
queryFrom.value = { ...val };
|
||||
queryFrom.value.pxkssjStart = val.pxsj ? val.pxsj[0]:'';
|
||||
queryFrom.value.pxkssjEnd = val.pxsj ? val.pxsj[1]:'';
|
||||
pageData.pageConfiger.pageNum = 1;
|
||||
getList();
|
||||
};
|
||||
const changeNo = (val) => {
|
||||
pageData.pageConfiger.pageNum = val;
|
||||
getList();
|
||||
};
|
||||
const changeSize = (val) => {
|
||||
pageData.pageConfiger.pageSize = val;
|
||||
getList();
|
||||
};
|
||||
// 获取列表
|
||||
const getList = () => {
|
||||
pageData.tableConfiger.loading = true;
|
||||
const promes = {
|
||||
...pageData.pageConfiger,
|
||||
...queryFrom.value,
|
||||
}
|
||||
delete promes.pxsj;
|
||||
qcckPost(promes,'/mosty-base/bans/pxqd-item/page').then((res) => {
|
||||
pageData.tableData = res.records || []
|
||||
pageData.total = res.total;
|
||||
pageData.tableConfiger.loading = false;
|
||||
}).catch((err) => {
|
||||
pageData.tableConfiger.loading = false;
|
||||
})
|
||||
};
|
||||
|
||||
const chooseData = (rows) => {
|
||||
selectedRows.value = Array.isArray(rows) ? rows : [];
|
||||
};
|
||||
|
||||
const onBatchAudit = (type, row) => {
|
||||
addFormRef.value.init(type, row);
|
||||
};
|
||||
|
||||
|
||||
// 详情
|
||||
const dendDep = (row) => {
|
||||
RefSteap.value.init(row);
|
||||
};
|
||||
|
||||
|
||||
// 表格高度计算
|
||||
const tabHeightFn = () => {
|
||||
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 250;
|
||||
window.onresize = function () {
|
||||
tabHeightFn();
|
||||
};
|
||||
};
|
||||
</script>
|
||||
|
||||
<style>
|
||||
.el-loading-mask {
|
||||
background: rgba(0, 0, 0, 0.5) !important;
|
||||
}
|
||||
</style>
|
||||
Reference in New Issue
Block a user