工会干部培训

This commit is contained in:
=
2025-10-27 16:28:42 +08:00
parent 5f8de5e32b
commit 712b1ea597
18 changed files with 298 additions and 74 deletions
+14 -14
View File
@@ -354,20 +354,20 @@ layout("/layouts/v4/baseLayout.html"){
</div>
<!-- 字母过滤 -->
<div class="apps-filter">
<div class="apps-filter-title">首字母:</div>
<div class="apps-filter-tags alphabet-filter">
<div :class="['filter-tag', activeAlphabet === '' ? 'active' : '']" @click="changeAlphabet('')">全部</div>
<div
v-for="letter in alphabets"
:key="letter"
:class="['alphabet-item', activeAlphabet === letter ? 'active' : '']"
@click="changeAlphabet(letter)"
>
{{ letter }}
</div>
</div>
</div>
<!-- <div class="apps-filter">-->
<!-- <div class="apps-filter-title">首字母:</div>-->
<!-- <div class="apps-filter-tags alphabet-filter">-->
<!-- <div :class="['filter-tag', activeAlphabet === '' ? 'active' : '']" @click="changeAlphabet('')">全部</div>-->
<!-- <div-->
<!-- v-for="letter in alphabets"-->
<!-- :key="letter"-->
<!-- :class="['alphabet-item', activeAlphabet === letter ? 'active' : '']"-->
<!-- @click="changeAlphabet(letter)"-->
<!-- >-->
<!-- {{ letter }}-->
<!-- </div>-->
<!-- </div>-->
<!-- </div>-->
</div>
<!-- 应用网格 -->
@@ -42,8 +42,8 @@ const singleSignUp = {
</el-descriptions-item>
<el-descriptions-item label="报名方式">
<span v-if="viewData.signUpMethod===1">个人报名</span>
<span v-else-if="viewData.signUpMethod===2">分工会报名</span>
<span v-else-if="viewData.signUpMethod===3">组队报名</span>
<span v-else-if="viewData.signUpMethod===2">组队报名</span>
<span v-else-if="viewData.signUpMethod===3">分工会报名</span>
<span v-else-if="!viewData.signUpMethod">无需报名</span>
</el-descriptions-item>
<el-descriptions-item label="是否用于报名">
@@ -9,12 +9,41 @@ const formEdit = {
<!-- Step 1: 基础信息 -->
<div v-show="activeStep === 0">
<el-form :model="formData" ref="form" :rules="formRules" label-width="120px" class="form-container">
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="活动名称" prop="name">
<el-input v-model="formData.name" placeholder="请输入活动名称" maxlength="50"
show-word-limit>
</el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item prop="activityGroupId" label="可报名人员范围">
<div style="display: flex; justify-content: space-between">
<div style="width: 99%">
<el-select prop="groupId" placeholder="参加人员范围"
v-model="formData.activityGroupId"
style="width: 99%;"
clearable
filterable>
<el-option v-for="item in activityGroupList"
:label="item.groupName"
:value="item.groupId"
:key="item.groupId"
></el-option>
</el-select>
</div>
<div>
<el-button
@click="$refs.drawerUserScope.userScopeDialog = true"
type="primary">设置
</el-button>
</div>
</div>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="报名开始时间" prop="signUpStartTime">
@@ -107,8 +136,16 @@ const formEdit = {
{{ submitting ? '提交中...' : '确定' }}
</el-button>
</div>
<drawer-user-scope
@group_change="getActivityGroup"
ref="drawerUserScope"
:group_id.sync="formData.activityGroupId"
></drawer-user-scope>
</el-dialog>
`,
components: {
"drawer-user-scope": httpVueLoader("/components/module/activity/DrawerUserScope.vue")
},
data() {
// 日期验证器
const validateDateRange = (rule, value, callback) => {
@@ -142,6 +179,7 @@ const formEdit = {
visible: false,
activeStep: 0,
submitting: false,
activityGroupList: [],
formData: {
quotas: []
},
@@ -188,6 +226,10 @@ const formEdit = {
}
},
methods: {
async getActivityGroup() {
const { data } = await $.get("/platform/activity/basic/scope/getActivityUserScopeGroup")
this.activityGroupList = data
},
// 处理关闭弹窗
handleClose() {
this.visible = false;
@@ -367,6 +409,9 @@ const formEdit = {
})
}
},
async created() {
await this.getActivityGroup()
},
style: /*language=CSS*/ `
.form-container {
padding: 0 50px;
@@ -15,7 +15,12 @@ layout("/layouts/platform.html"){
</el-card>
<el-card shadow="never">
<table-tool></table-tool>
<table-tool label="活动列表">
<el-radio-group v-model="pageForm.isEnrolled" @change="doSearch" size="mini" class="ml10">
<el-radio-button :label="true">已报名</el-radio-button>
<el-radio-button :label="false">未报名</el-radio-button>
</el-radio-group>
</table-tool>
<el-table :data="tableData">
<el-table-column type="index" width="50px" label="序号" :index="indexMethod"></el-table-column>
<el-table-column prop="name" label="名称" show-overflow-tooltip></el-table-column>
@@ -65,6 +70,7 @@ layout("/layouts/platform.html"){
data() {
return {
pageForm: {
isEnrolled: false,
year: new Date().getFullYear().toString(),
searchKeyword: ""
},
@@ -5,9 +5,12 @@ const signForm = {
<snaker-start slot="header" define_key="GBPX" label="活动报名"></snaker-start>
</div>
<el-descriptions :column="2" border class="margin-top" style="margin: 10px" title="">
<el-descriptions-item label="活动名称" span="2">
<el-descriptions-item label="活动名称" >
<span class="item-center"> {{ viewData.name }}</span>
</el-descriptions-item>
<el-descriptions-item label="分工会名额">
{{ quota }}人 / 剩余: {{ remainingQuota }}人
</el-descriptions-item>
<el-descriptions-item label="报名开始时间">
{{ viewData.signUpStartTime }}
</el-descriptions-item>
@@ -20,16 +23,32 @@ const signForm = {
<el-descriptions-item label="结束时间">
{{ viewData.endTime }}
</el-descriptions-item>
<el-descriptions-item label="分工会名额">
{{ quota }}人 / 剩余: {{ remainingQuota }}人
</el-descriptions-item>
<el-descriptions-item label="活动内容" span="2">
<div v-html="viewData.notice"></div>
</el-descriptions-item>
</el-descriptions>
<!-- 个人报名信息 -->
<div class="process-title">个人报名信息</div>
<div class="process-title">选择报名人员</div>
<el-select
v-model="searchTeammateUserId"
filterable
clearable
remote
reserve-keyword
placeholder="请输入关键词"
:remote-method="queryTeammate">
<el-option
v-for="item in teammateOptions"
:key="item.userId"
:label="item.userName + '(' + item.loginName + ')'"
:value="item.userId">
</el-option>
</el-select>
<el-button class="ml5" type="primary" icon="el-icon-plus"
@click="addTeamUser">添加
</el-button>
<el-table :data="teamUsers" class="mt10">
<el-table-column label="序号" type="index" width="60px"></el-table-column>
<el-table-column prop="userName" label="姓名"></el-table-column>
@@ -42,6 +61,12 @@ const signForm = {
<el-input v-model="scope.row.remark" placeholder="请输入备注"></el-input>
</template>
</el-table-column>
<el-table-column label="操作" width="100px">
<template slot-scope="scope">
<el-button type="danger" size="mini" @click="removeTeamUser(scope.$index)">删除
</el-button>
</template>
</el-table-column>
</el-table>
<el-row type="flex" justify="end" class="mt20">
@@ -54,9 +79,12 @@ const signForm = {
store,
data() {
return {
//搜索框
searchTeammateUserId: null,
teammateOptions: [],
dialogVisible: false,
viewData: {},
formData: {}, // 将 signUpData 改为 formData
formData: {},
id: null,
//表格用户(实际上只包含当前用户)
teamUsers: [],
@@ -88,6 +116,44 @@ const signForm = {
this.loadUserData()
},
//查询队友信息
queryTeammate(val) {
if (val) {
this.$axios.post("/platform/cadreTraining/branchUnionSignUp/queryTeammate", {
keyword: val,
tissueId: this.id,
}).then((res) => {
if (res.code === 0) {
res.data.map(v => v.applyUserId = this.$store.state.user.id)
this.teammateOptions = res.data
}
})
}
},
//添加队友
addTeamUser() {
if (!this.searchTeammateUserId) {
this.$message.error("请先选择后再添加")
return
}
if (this.teamUsers.some((v) => v.userId === this.searchTeammateUserId)) {
this.$message.error("请勿重复添加")
return
}
if (this.teamUsers.length >= this.viewData.teamNum) {
this.$message.error("已满员")
return
}
this.teamUsers.push(this.teammateOptions.find((v) => v.userId === this.searchTeammateUserId))
this.searchTeammateUserId = null
},
//移除队友
removeTeamUser(index) {
this.teamUsers.splice(index, 1)
},
// 加载用户数据
async loadUserData() {
try {
@@ -109,65 +109,66 @@ layout("/layouts/platform.html"){
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item prop="planNumber" label="计划书号码">
<el-input v-model="formData.planNumber" placeholder="请输入计划书号码"></el-input>
</el-form-item>
</el-col>
<!-- <el-col :span="12">-->
<!-- <el-form-item prop="planNumber" label="计划书号码">-->
<!-- <el-input v-model="formData.planNumber" placeholder="请输入计划书号码"></el-input>-->
<!-- </el-form-item>-->
<!-- </el-col>-->
<el-col :span="12">
<el-form-item prop="isRenewal" label="是否续保">
<el-select v-model="formData.isRenewal" placeholder="请选择是否续保" style="width: 100%">
<el-option label="是" value="1"></el-option>
<el-option label="否" value="0"></el-option>
</el-select>
</el-form-item>
</el-col>
<!-- <el-col :span="12">-->
<!-- <el-form-item prop="isRenewal" label="是否续保">-->
<!-- <el-select v-model="formData.isRenewal" placeholder="请选择是否续保" style="width: 100%">-->
<!-- <el-option label="是" value="1"></el-option>-->
<!-- <el-option label="否" value="0"></el-option>-->
<!-- </el-select>-->
<!-- </el-form-item>-->
<!-- </el-col>-->
<el-col :span="12">
<el-form-item prop="guaranteedStartTime" label="保障开始时间">
<el-date-picker
v-model="formData.guaranteedStartTime"
type="date"
format="yyyy-MM-dd"
value-format="yyyy-MM-dd"
clearable
placeholder="请选择保障开始时间"
@change="calculateEndTime">
</el-date-picker>
</el-form-item>
</el-col>
<!-- <el-col :span="12">-->
<!-- <el-form-item prop="guaranteedStartTime" label="保障开始时间">-->
<!-- <el-date-picker-->
<!-- v-model="formData.guaranteedStartTime"-->
<!-- type="date"-->
<!-- format="yyyy-MM-dd"-->
<!-- value-format="yyyy-MM-dd"-->
<!-- clearable-->
<!-- placeholder="请选择保障开始时间"-->
<!-- @change="calculateEndTime">-->
<!-- </el-date-picker>-->
<!-- </el-form-item>-->
<!-- </el-col>-->
<el-col :span="12">
<el-form-item prop="guaranteedEndTime" label="保障结束时间">
<el-date-picker
v-model="formData.guaranteedEndTime"
type="date"
format="yyyy-MM-dd"
value-format="yyyy-MM-dd"
clearable
placeholder="请选择保障结束时间"
:readonly="true">
</el-date-picker>
</el-form-item>
</el-col>
<!-- <el-col :span="12">-->
<!-- <el-form-item prop="guaranteedEndTime" label="保障结束时间">-->
<!-- <el-date-picker-->
<!-- v-model="formData.guaranteedEndTime"-->
<!-- type="date"-->
<!-- format="yyyy-MM-dd"-->
<!-- value-format="yyyy-MM-dd"-->
<!-- clearable-->
<!-- placeholder="请选择保障结束时间"-->
<!-- :readonly="true">-->
<!-- </el-date-picker>-->
<!-- </el-form-item>-->
<!-- </el-col>-->
<el-col :span="12">
<el-form-item prop="dangerTime" label="出险时间">
<el-form-item prop="dangerTime" label="入院时间">
<el-date-picker
v-model="formData.dangerTime"
type="datetime"
format="yyyy-MM-dd HH:mm"
value-format="yyyy-MM-dd HH:mm"
clearable
style="width: 100%"
placeholder="请选择出险时间">
</el-date-picker>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item prop="dangerAddress" label="出险地点">
<el-form-item prop="dangerAddress" label="入院地点">
<el-input v-model="formData.dangerAddress" placeholder="请输入出险地点"></el-input>
</el-form-item>
</el-col>
@@ -254,7 +255,6 @@ layout("/layouts/platform.html"){
idCard: [{ required: true, message: '请填写身份证号', trigger: 'blur' }, {pattern: /^[1-9]\d{5}(18|19|20)\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$/, message: '请输入正确的身份证号码', trigger: 'blur'}],
age: [{ required: true, message: '请输入年龄', trigger: 'blur' }, { type: 'number', min: 16, max: 60, message: '年龄必须在16-60岁之间', trigger: 'blur', transform: (value) => Number(value) }],
bankCardNumber: [ { pattern: /^([1-9]{1})(\d{15}|\d{18})$/, message: '请输入正确的银行卡号', trigger: 'blur' }],
sign: [{ required: true, message: '请签字', trigger: 'change' }]
},
projectList: [],
}
@@ -421,6 +421,10 @@ layout("/layouts/platform.html"){
})
},
onView() {
if (!this.formData.projectId) {
this.$message.warning('请先选择所属事项');
return;
}
this.$refs.guava.view(() => {
this.$refs.projectInfoRef.onOpen(this.formData.projectId)
})
@@ -61,7 +61,7 @@ layout("/layouts/platform.html"){
<el-table :data="tableData" @sort-change="pageOrder" style="width: 100%">
<el-table-column type="index" width="50px" label="序号" :index="indexMethod"></el-table-column>
<el-table-column prop="loginName" label="工号"></el-table-column>
<el-table-column prop="userName" label="职工姓名"></el-table-column>
<el-table-column prop="userName" label="姓名"></el-table-column>
<el-table-column prop="sex" label="性别"></el-table-column>
<el-table-column prop="age" label="年龄"></el-table-column>
<el-table-column prop="unionName" label="所属工会"></el-table-column>
@@ -2,11 +2,39 @@ const formEdit = {
template: /*language=HTML*/ `
<el-dialog :title="formData.id ? '编辑项目' : '新增项目'" :visible="visible" width="70%" :close-on-click-modal="false" :before-close="handleClose">
<el-form :model="formData" :rules="formRules" label-width="110px" ref="form">
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="事项名称" prop="projectName">
<el-input v-model="formData.projectName" placeholder="请输入事项名称" maxlength="50"
show-word-limit></el-input>
</el-col>
</el-form-item>
<el-col :span="12">
<el-form-item prop="activityGroupId" label="可报名人员范围">
<div style="display: flex; justify-content: space-between">
<div style="width: 99%">
<el-select prop="groupId" placeholder="参加人员范围"
v-model="formData.activityGroupId"
style="width: 99%;"
clearable
filterable>
<el-option v-for="item in activityGroupList"
:label="item.groupName"
:value="item.groupId"
:key="item.groupId"
></el-option>
</el-select>
</div>
<div>
<el-button
@click="$refs.drawerUserScope.userScopeDialog = true"
type="primary">设置
</el-button>
</div>
</div>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="开始时间" prop="startTime">
@@ -49,8 +77,16 @@ const formEdit = {
<el-button @click="handleClose">取消</el-button>
<el-button @click="doSubmit" type="primary" :loading="submitting">确定</el-button>
</div>
<drawer-user-scope
@group_change="getActivityGroup"
ref="drawerUserScope"
:group_id.sync="formData.activityGroupId"
></drawer-user-scope>
</el-dialog>
`,
components: {
"drawer-user-scope": httpVueLoader("/components/module/activity/DrawerUserScope.vue")
},
data() {
// 日期验证器
const validateDateRange = (rule, value, callback) => {
@@ -70,6 +106,7 @@ const formEdit = {
visible: false,
submitting: false,
formData: {},
activityGroupList: [],
formRules: {
projectName: [
{ required: true, message: "请输入事项名称", trigger: "blur" },
@@ -106,6 +143,10 @@ const formEdit = {
})
}
},
async getActivityGroup() {
const { data } = await $.get("/platform/activity/basic/scope/getActivityUserScopeGroup")
this.activityGroupList = data
},
async doSubmit() {
const valid = await this.$refs['form'].validate()
@@ -131,5 +172,8 @@ const formEdit = {
this.submitting = false;
})
}
},
async created() {
await this.getActivityGroup()
}
}
@@ -16,7 +16,7 @@ layout("/layouts/platform.html"){
<el-table :data="tableData" @sort-change="pageOrder" style="width: 100%">
<el-table-column type="index" width="50px" label="序号" :index="indexMethod"></el-table-column>
<el-table-column prop="loginName" label="工号"></el-table-column>
<el-table-column prop="userName" label="职工姓名"></el-table-column>
<el-table-column prop="userName" label="姓名"></el-table-column>
<el-table-column prop="sex" label="性别"></el-table-column>
<el-table-column prop="age" label="年龄"></el-table-column>
<el-table-column prop="unionName" label="所属工会"></el-table-column>