|
|
@@ -7,16 +7,21 @@
|
|
|
<div class="flex1 ov-hd d-flex j-ed">
|
|
|
<el-form :model="queryParams" ref="queryFormRef" :inline="true" label-width="auto">
|
|
|
<el-form-item label="会议名称" prop="trainingName">
|
|
|
- <el-input v-model="queryParams.trainingName" placeholder="搜会议名称" clearable style="width: 160px" @keyup.enter="handleQuery" />
|
|
|
+ <el-input v-model="queryParams.trainingName" placeholder="搜会议名称" clearable
|
|
|
+ style="width: 160px" @keyup.enter="handleQuery" />
|
|
|
</el-form-item>
|
|
|
<el-form-item label="培训方式" prop="joinType">
|
|
|
- <el-select v-model="queryParams.joinType" placeholder="请选择培训方式" clearable style="width: 160px" @change="handleQuery">
|
|
|
- <el-option v-for="item in dm_training_join_type" :key="item.value" :label="item.label" :value="item.value" />
|
|
|
+ <el-select v-model="queryParams.joinType" placeholder="请选择培训方式" clearable
|
|
|
+ style="width: 160px" @change="handleQuery">
|
|
|
+ <el-option v-for="item in dm_training_join_type" :key="item.value"
|
|
|
+ :label="item.label" :value="item.value" />
|
|
|
</el-select>
|
|
|
</el-form-item>
|
|
|
<el-form-item label="是否颁发证书" prop="certFlag">
|
|
|
- <el-select v-model="queryParams.certFlag" placeholder="请选择是否颁发证书" clearable style="width: 160px" @change="handleQuery">
|
|
|
- <el-option v-for="item in yes_no" :key="item.value" :label="item.label" :value="item.value" />
|
|
|
+ <el-select v-model="queryParams.certFlag" placeholder="请选择是否颁发证书" clearable
|
|
|
+ style="width: 160px" @change="handleQuery">
|
|
|
+ <el-option v-for="item in yes_no" :key="item.value" :label="item.label"
|
|
|
+ :value="item.value" />
|
|
|
</el-select>
|
|
|
</el-form-item>
|
|
|
<el-form-item>
|
|
|
@@ -30,7 +35,8 @@
|
|
|
<div class="d-flex flex1 ov-hd flex-cln pd-16">
|
|
|
<div class="d-flex j-sb mb-16">
|
|
|
<div>
|
|
|
- <searchTabs v-model="queryParams.status" @change="handleQuery" :list="tabs" key-label="name" key-count="num" key-value="type"></searchTabs>
|
|
|
+ <searchTabs v-model="queryParams.status" @change="handleQuery" :list="tabs" key-label="name"
|
|
|
+ key-count="num" key-value="type"></searchTabs>
|
|
|
</div>
|
|
|
<el-button type="primary" @click="router.push({ path: 'lmmeetingadd' })">新增会议</el-button>
|
|
|
</div>
|
|
|
@@ -38,8 +44,11 @@
|
|
|
<vxe-table :loading="loading" border :data="dataList" min-height="0" max-height="100%">
|
|
|
<vxe-column title="序号" align="center" type="seq" width="60" />
|
|
|
<vxe-column field="trainingName" title="会议名称" :formatter="colNoData" />
|
|
|
- <vxe-column field="trainingTime" min-width="200" title="培训时间">
|
|
|
- <template #default="{ row }">{{ row.trainingStart }}~{{ row.trainingEnd }}</template>
|
|
|
+ <vxe-column field="trainingTime" min-width="150" title="培训时间">
|
|
|
+ <template #default="{ row }">{{ row.trainingStart }}~{{ row.trainingEnd }}</template>
|
|
|
+ </vxe-column>
|
|
|
+ <vxe-column field="signupsTime" min-width="150" title="报名时间">
|
|
|
+ <template #default="{ row }">{{ row.signupStart }}~{{ row.signupEnd }}</template>
|
|
|
</vxe-column>
|
|
|
<vxe-column field="joinType" title="培训方式" width="80">
|
|
|
<template #default="{ row }">
|
|
|
@@ -55,41 +64,70 @@
|
|
|
<vxe-column field="joinCount" title="报名人数" width="80" />
|
|
|
<vxe-column field="signCount" title="签到人数" width="80" />
|
|
|
<vxe-column field="certCount" title="领取证书人数" width="80" />
|
|
|
- <vxe-column title="创建人" align="center" field="createByName" width="80" :formatter="colNoData" />
|
|
|
- <vxe-column title="创建时间" align="center" field="createTime" min-width="100" :formatter="colNoData" />
|
|
|
<vxe-column field="certFlag" title="会议状态" width="80">
|
|
|
<template #default="{ row }">
|
|
|
<DictTag :options="dm_training_status" :value="row?.trainingStatus"></DictTag>
|
|
|
</template>
|
|
|
</vxe-column>
|
|
|
- <vxe-column title="操作" width="300" fixed="right">
|
|
|
+ <vxe-column field="certFlag" title="签到二维码" width="120" align="center">
|
|
|
<template #default="{ row }">
|
|
|
- <el-button v-if="['3'].includes(row?.trainingStatus)" type="primary" text @click="trainingOn(row)">上架</el-button>
|
|
|
- <span></span>
|
|
|
- <el-button v-if="!['3'].includes(row?.trainingStatus)" type="danger" text @click="trainingOff(row)">下架</el-button>
|
|
|
+ <el-button @click="trainingSignIn(row)"
|
|
|
+ :style="{ color: !['1', '0'].includes(row?.trainingStatus) ? '#999' : '#0079fe' }"
|
|
|
+ text :disabled="!['1', '0'].includes(row?.trainingStatus)">
|
|
|
+ 查看
|
|
|
+ </el-button>
|
|
|
+ </template>
|
|
|
+ </vxe-column>
|
|
|
+ <vxe-column title="临时报名通道" align="center" field="createByName" width="130"
|
|
|
+ :formatter="colNoData">
|
|
|
+ <template #default="{ row }">
|
|
|
+ <el-popconfirm confirm-button-text="修改" cancel-button-text="取消" title="是否修改临时报名的状态?"
|
|
|
+ @confirm="confirmEvent(row)" @cancel="cancelEvent">
|
|
|
+ <template #reference>
|
|
|
+ <el-switch v-model="row.tempStatus" :loading="loading1" active-value="1"
|
|
|
+ inactive-value="0" :before-change="beforeChange1" />
|
|
|
+ </template>
|
|
|
+ </el-popconfirm>
|
|
|
+ <el-button v-if="row.tempStatus == '1'" type="primary" text>
|
|
|
+ 查看
|
|
|
+ </el-button>
|
|
|
+ </template>
|
|
|
+ </vxe-column>
|
|
|
+ <vxe-column title=" 创建人" align="center" field="createByName" width="80"
|
|
|
+ :formatter="colNoData" />
|
|
|
+ <vxe-column title="创建时间" align="center" field="createTime" width="200" :formatter="colNoData" />
|
|
|
+ <vxe-column title="操作" width="300" fixed="right" align="center">
|
|
|
+ <template #default="{ row }">
|
|
|
+ <el-button v-if="['3'].includes(row?.trainingStatus)" type="primary" text
|
|
|
+ @click="trainingOn(row)">上架</el-button>
|
|
|
<span></span>
|
|
|
- <el-button v-if="['3'].includes(row?.trainingStatus)" type="primary" @click="editRow(row)" text>编辑</el-button>
|
|
|
+ <el-button v-if="!['3'].includes(row?.trainingStatus)" type="danger" text
|
|
|
+ @click="trainingOff(row)">下架</el-button>
|
|
|
<span></span>
|
|
|
- <el-button v-if="['1', '0'].includes(row?.trainingStatus)" @click="trainingSignIn(row)" style="color: #0079fe;" text>签到二维码</el-button>
|
|
|
+ <el-button v-if="['3'].includes(row?.trainingStatus)" type="primary"
|
|
|
+ @click="editRow(row)" text>编辑</el-button>
|
|
|
<span></span>
|
|
|
- <el-button @click="router.push({ path: 'lmmeetingdetail', query: { id: row?.id } })" style="color: #0079fe;" text>详情</el-button>
|
|
|
+ <el-button @click="router.push({ path: 'lmmeetingdetail', query: { id: row?.id } })"
|
|
|
+ style="color: #0079fe;" text>人员管理及详情</el-button>
|
|
|
<span></span>
|
|
|
<el-button text type="danger" @click="deleteRow(row)">删除</el-button>
|
|
|
</template>
|
|
|
</vxe-column>
|
|
|
</vxe-table>
|
|
|
</div>
|
|
|
- <pagination :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
|
|
|
+ <pagination :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize"
|
|
|
+ @pagination="getList" />
|
|
|
</div>
|
|
|
</div>
|
|
|
</div>
|
|
|
- <SignInCode v-if="showSignIn" v-model:show="showSignIn" :info="rowInfo" :dict="{ dm_training_join_type }"></SignInCode>
|
|
|
+ <SignInCode v-if="showSignIn" v-model:show="showSignIn" :info="rowInfo" :dict="{ dm_training_join_type }">
|
|
|
+ </SignInCode>
|
|
|
</template>
|
|
|
|
|
|
<script setup name="meeting" lang="ts">
|
|
|
import { colNoData, colNoUnm } from '@/utils/noData';
|
|
|
import { searchTabs } from '@/views/models';
|
|
|
-import { trainingList, queryTrainingCount, trainingDelete, publishTraining, unpublishTraining } from '@/api/training';
|
|
|
+import { trainingList, queryTrainingCount, trainingDelete, publishTraining, unpublishTraining, offOrNoTemp } from '@/api/training';
|
|
|
import { SignInCode } from '../models';
|
|
|
|
|
|
const router = useRouter();
|
|
|
@@ -111,7 +149,7 @@ const data = reactive<any>({
|
|
|
},
|
|
|
rules: {}
|
|
|
});
|
|
|
-
|
|
|
+const temporaryRegistration = ref(false)
|
|
|
const { queryParams, form } = toRefs(data);
|
|
|
/** 查询会员信息列表 */
|
|
|
const getList = async () => {
|
|
|
@@ -121,7 +159,39 @@ const getList = async () => {
|
|
|
total.value = res.total;
|
|
|
loading.value = false;
|
|
|
};
|
|
|
+const loading1 = ref(false)
|
|
|
+let resolvePromise: ((value: boolean) => void) | null = null;
|
|
|
|
|
|
+const beforeChange1 = (): Promise<boolean> => {
|
|
|
+ loading1.value = true;
|
|
|
+ return new Promise((resolve) => {
|
|
|
+ // 存储 resolve 以便在 confirm/cancel 时调用
|
|
|
+ resolvePromise = resolve;
|
|
|
+ });
|
|
|
+};
|
|
|
+const offOrNoTemps = async (row) => {
|
|
|
+ const res = await offOrNoTemp({
|
|
|
+ trainingId: row.id,
|
|
|
+ tempStatus: row.tempStatus == '1' ? '0' : '1'
|
|
|
+ })
|
|
|
+}
|
|
|
+
|
|
|
+const confirmEvent = (row) => {
|
|
|
+ if (resolvePromise) {
|
|
|
+ loading1.value = false;
|
|
|
+ resolvePromise(true); // 允许切换
|
|
|
+ resolvePromise = null; // 清空引用
|
|
|
+ offOrNoTemps(row)
|
|
|
+ }
|
|
|
+};
|
|
|
+
|
|
|
+const cancelEvent = () => {
|
|
|
+ if (resolvePromise) {
|
|
|
+ loading1.value = false;
|
|
|
+ resolvePromise(false); // 阻止切换
|
|
|
+ resolvePromise = null; // 清空引用
|
|
|
+ }
|
|
|
+};
|
|
|
/** 搜索按钮操作 */
|
|
|
const handleQuery = () => {
|
|
|
queryParams.value.pageNum = 1;
|
|
|
@@ -196,4 +266,4 @@ onMounted(() => {
|
|
|
getMeetingCount();
|
|
|
getList();
|
|
|
});
|
|
|
-</script>
|
|
|
+</script>
|