增加工代会委员会管理

This commit is contained in:
2025-12-10 15:55:26 +08:00
parent 4c8c0ca09f
commit b721d62dd1
10 changed files with 876 additions and 445 deletions
@@ -1,5 +1,6 @@
package com.budwk.app.flow.enums; package com.budwk.app.flow.enums;
import com.budwk.app.base.annotation.DictEnum;
import lombok.Getter; import lombok.Getter;
/** /**
@@ -9,6 +10,7 @@ import lombok.Getter;
* @date 2023/10/7 * @date 2023/10/7
*/ */
@Getter @Getter
@DictEnum(key = "ProcessSubmitTypeEnum", name = "流程提交类型(操作类型)")
public enum ProcessSubmitTypeEnum { public enum ProcessSubmitTypeEnum {
APPLY(0, "发起申请"), APPLY(0, "发起申请"),
AGREE(1, "同意"), AGREE(1, "同意"),
@@ -104,7 +104,7 @@ public class TeacherCongressDelegatePushDwSjAuditController {
$condition $condition
"""); """);
Cnd cnd = Cnd.NEW(); Cnd cnd = Cnd.NEW();
cnd.and("t.taskName", "=", "tcDelegatePushDwSj"); cnd.and("t.taskName", "=", "0cacd1e7-7bb2-47dd-818b-6a73062e0c62");
if (!AuthUtil.hasRoleOr(RoleConstant.SYSADMIN.name())) { if (!AuthUtil.hasRoleOr(RoleConstant.SYSADMIN.name())) {
cnd.and("ta.actorId", "in", List.of(SecurityUtil.getUserId())); cnd.and("ta.actorId", "in", List.of(SecurityUtil.getUserId()));
} }
@@ -142,11 +142,11 @@ public class TeacherCongressDelegatePushDwSjAuditController {
@SaCheckPermission("tc.delegate.push.dwSjAudit") @SaCheckPermission("tc.delegate.push.dwSjAudit")
public Result batchSubmit(String sessionId) { public Result batchSubmit(String sessionId) {
String str = teacherCongressDelegatePushService.batchSubmitWhere(sessionId, null); /* String str = teacherCongressDelegatePushService.batchSubmitWhere(sessionId, null);
if (StrUtil.isNotBlank(str)) { if (StrUtil.isNotBlank(str)) {
return Result.error(str); return Result.error(str);
} }*/
teacherCongressDelegatePushService.batchSubmit("", sessionId); teacherCongressDelegatePushService.batchSubmit(SecurityUtil.getUnionId(), sessionId);
return Result.success(); return Result.success();
} }
@@ -14,10 +14,12 @@ import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.zhgh.democratic.teachercongress.delegate.models.TeacherCongressDelegatePush; import com.budwk.app.zhgh.democratic.teachercongress.delegate.models.TeacherCongressDelegatePush;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import org.nutz.aop.interceptor.ioc.TransAop;
import org.nutz.dao.Cnd; import org.nutz.dao.Cnd;
import org.nutz.dao.Dao; import org.nutz.dao.Dao;
import org.nutz.dao.Sqls; import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql; import org.nutz.dao.sql.Sql;
import org.nutz.ioc.aop.Aop;
import org.nutz.ioc.loader.annotation.Inject; import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean; import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.util.NutMap; import org.nutz.lang.util.NutMap;
@@ -124,4 +126,15 @@ public class TeacherCongressDelegatePushWriteController {
} }
@At
@ApiOperation("代表信息填写的信息")
@SaCheckLogin
@Aop(TransAop.READ_COMMITTED)
public Result finOne(String id){
TeacherCongressDelegatePush delegatePush = baseService.dao().fetch(TeacherCongressDelegatePush.class, Cnd.where("id", "=", id));
return Result.success(delegatePush);
}
} }
@@ -1,6 +1,5 @@
package com.budwk.app.zhgh.democratic.teachercongress.delegate.service; package com.budwk.app.zhgh.democratic.teachercongress.delegate.service;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.lang.Dict; import cn.hutool.core.lang.Dict;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import com.budwk.app.base.service.impl.BaseServiceImpl; import com.budwk.app.base.service.impl.BaseServiceImpl;
@@ -107,8 +106,8 @@ public class TeacherCongressDelegatePushServiceImpl extends BaseServiceImpl<Teac
$condition $condition
"""); """);
Cnd cnd = Cnd.NEW(); Cnd cnd = Cnd.NEW();
cnd.and("t.taskName", "=", "tcDelegatePushUnionFzr"); cnd.and("t.taskName", "=", "c9227a2f-7b73-4549-b1f7-aa4779b31378");
cnd.and("info.pushUnionId", "=", unionId); cnd.and("info.unionId", "=", unionId);
sql.setCondition(cnd); sql.setCondition(cnd);
List<NutMap> delegatePushList = listMap(sql); List<NutMap> delegatePushList = listMap(sql);
@@ -171,10 +170,10 @@ public class TeacherCongressDelegatePushServiceImpl extends BaseServiceImpl<Teac
"""); """);
Cnd cnd = Cnd.NEW(); Cnd cnd = Cnd.NEW();
cnd.andEX("info.sessionId", "=", sessionId); cnd.andEX("info.sessionId", "=", sessionId);
cnd.andEX("info.pushUnionId", "=", unionId); cnd.andEX("info.unionId", "=", unionId);
cnd.andEX("info.schoolLeader", "!=", 1); cnd.andEX("info.schoolLeader", "!=", 1);
SqlExpressionGroup group = new SqlExpressionGroup(); SqlExpressionGroup group = new SqlExpressionGroup();
group.or("t.taskName", "=", "tcDelegatePushUnionFzr"); group.or("t.taskName", "=", "c9227a2f-7b73-4549-b1f7-aa4779b31378");
group.or("t.taskName", "is", null); group.or("t.taskName", "is", null);
cnd.and(group); cnd.and(group);
cnd.and("ins.state", "!=", ProcessInstanceStateEnum.REJECT.getCode()); cnd.and("ins.state", "!=", ProcessInstanceStateEnum.REJECT.getCode());
@@ -0,0 +1,111 @@
const auditInfo = {
template: /*language=HTML*/ `
<div>
<div class="proposal-info">
<div class="process-title">
基础信息
<el-link type="primary" @click="openChart">点击查看流程图</el-link>
</div>
<el-descriptions :column="3" border>
<el-descriptions-item label="姓名">{{ viewData.userName }}</el-descriptions-item>
<el-descriptions-item label="工号">{{viewData.loginName }}</el-descriptions-item>
<el-descriptions-item label="性别">{{viewData.sex }}</el-descriptions-item>
<el-descriptions-item label="出生年月">{{$moment(viewData.birthday).format("YYYY-MM-DD") }}
</el-descriptions-item>
<el-descriptions-item label="手机号">{{viewData.mobile }}</el-descriptions-item>
<el-descriptions-item label="民族">{{viewData.nation }}</el-descriptions-item>
<el-descriptions-item label="政治面貌">{{viewData.political }}</el-descriptions-item>
<el-descriptions-item label="所属工会">{{viewData.unionName }}</el-descriptions-item>
<el-descriptions-item label="所属单位">{{viewData.unitName }}</el-descriptions-item>
<el-descriptions-item label="文化程度">{{viewData.education }}</el-descriptions-item>
<el-descriptions-item label="职务">{{viewData.position }}</el-descriptions-item>
<el-descriptions-item label="职称">{{viewData.professionalTitle }}</el-descriptions-item>
<el-descriptions-item label="是否高级职称">{{viewData.seniorTeacher?'是':'否' }}
</el-descriptions-item>
<el-descriptions-item label="是否中级职称及以下">{{viewData.intermediateBelow?'是':'否' }}
</el-descriptions-item>
<el-descriptions-item label="是否干部">{{viewData.cadre?'是':'否' }}</el-descriptions-item>
<el-descriptions-item label="是否工人">{{viewData.worker?'是':'否' }}</el-descriptions-item>
<el-descriptions-item label="校级领导">{{viewData.schoolLeader?'是':'否' }}</el-descriptions-item>
<el-descriptions-item label="中层领导">{{viewData.middleLevelLeader?'是':'否' }}
</el-descriptions-item>
</el-descriptions>
</div>
<template v-for="task in doneTasks">
<div class="mt10"
v-if="['0cacd1e7-7bb2-47dd-818b-6a73062e0c62'].includes(task.taskName)">
<div class="process-title">{{ task.displayName }}</div>
<el-descriptions border class="flow-task-form" :column="3" :key="task.id"
>
<el-descriptions-item label="办理用户">{{ task.taskFormData.userName
}}({{task.taskFormData.loginName}})
</el-descriptions-item>
<el-descriptions-item label="办理时间">{{ task.finishTime }}</el-descriptions-item>
<el-descriptions-item label="办理结果">
{{processSubmitTypeEnums.find(v=>v.name===task.ext.tf_type)?.message}}
<!-- {{dict.type.PROCESS_TASK_SUBMIT_TYPE.find(v=>v.code==task.ext.tf_type)}}-->
<!-- <dict-tag :options="dict.type.PROCESS_TASK_SUBMIT_TYPE"
:value=""></dict-tag>-->
</el-descriptions-item>
<el-descriptions-item label="办理意见" v-if="!task.ext.isFirstTaskNode">{{
task.taskFormData.opinion }}
</el-descriptions-item>
</el-descriptions>
</div>
</template>
<slot></slot>
<snaker-chart ref="snakerChartRef"></snaker-chart>
</div>
`,
dicts: ["PROCESS_TASK_SUBMIT_TYPE"],
data() {
return {
visible: false,
userData: [],
viewData: {},
row: null,
doneTasks: [],
loading: true,
search: "",
tableKey: "",
activeName: "1",
processSubmitTypeEnums:[]
}
},
methods: {
findOne() {
this.$axios.post("/platform/teacherCongress/delegate/push/write/finOne", {id: this.row.id}).then(resp => {
if (resp.code === 0) {
this.viewData = resp.data
}
})
},
// 打开
onOpen(row) {
this.row = row;
this.visible = true;
this.findOne();
this.getDoneTasks();
this.getEnumOptions()
},
// 获取已办任务审批记录
getDoneTasks() {
this.$axios.post("/flow/common/doneTasks", {bizId: this.row.id}).then((res) => {
if (res.code === 0) {
this.doneTasks = res.data
}
})
},
async getEnumOptions() {
const resp = await this.$axios.post("/open/common/dictEnumOptions", { name: "ProcessSubmitTypeEnum" })
this.processSubmitTypeEnums=resp.data
},
// 查看流程图
openChart() {
this.$refs.snakerChartRef.onOpenFull(this.row.instanceProcessDefineId, this.row.instanceId)
}
}
}
@@ -0,0 +1,278 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app" v-cloak>
<guava ref="guava">
<el-card shadow="never">
<search @search="doSearch">
<search-item label="姓名/工号">
<el-input placeholder="请输入姓名或工号" clearable v-model="pageForm.searchKeyword"></el-input>
</search-item>
<search-item label="教代会">
<el-select v-model="pageForm.sessionId">
<el-option v-for="item in sessionOptions" :label="item.fullName" :value="item.id"
:key="item.id"></el-option>
</el-select>
</search-item>
</search>
</el-card>
<el-card shadow="never">
<push-progress ref="pushProgressRef"></push-progress>
</el-card>
<el-card shadow="never">
<table-tool>
<el-button icon="el-icon-check" size="small" type="primary" @click="onBatchSubmit">正式代表提交上报
</el-button>
<el-radio-group @change="doSearch" v-model="pageForm.isFormalOrAttendance" size="small">
<el-radio-button label="全部"></el-radio-button>
<el-radio-button label="正式代表"></el-radio-button>
<el-radio-button label="列席代表"></el-radio-button>
</el-radio-group>
<el-radio-group v-model="pageForm.approval" size="small"
@change="doSearch">
<el-radio-button :label="true">已审核</el-radio-button>
<el-radio-button :label="false">未审核</el-radio-button>
</el-radio-group>
</table-tool>
<el-table
ref="tableRef"
:data="tableData"
row-key="id"
@sort-change="pageOrder"
>
<el-table-column type="index" width="55" label="序号" :index="indexMethod"></el-table-column>
<el-table-column label="姓名" prop="userName" width="100"></el-table-column>
<el-table-column label="工号" prop="loginName"></el-table-column>
<el-table-column label="性别" prop="sex" width="50"></el-table-column>
<el-table-column label="分工会" prop="unionName" show-overflow-tooltip></el-table-column>
<el-table-column label="职务" prop="position"></el-table-column>
<el-table-column label="职称" prop="professionalTitle"></el-table-column>
<el-table-column label="是否高级职称" prop="seniorTeacher">
<template v-slot="{row}">
<span v-if="row.seniorTeacher" style="color:#0037ff;"></span>
<span v-else></span>
</template>
</el-table-column>
<el-table-column label="是否中级职称及以下" prop="intermediateBelow">
<template v-slot="{row}">
<span v-if="row.intermediateBelow" style="color:#0037ff;"></span>
<span v-else></span>
</template>
</el-table-column>
<el-table-column label="是否干部" prop="cadre">
<template v-slot="{row}">
<span v-if="row.cadre" style="color:#0037ff;"></span>
<span v-else></span>
</template>
</el-table-column>
<el-table-column label="是否工人" prop="worker">
<template v-slot="{row}">
<span v-if="row.worker" style="color:#0037ff;"></span>
<span v-else></span>
</template>
</el-table-column>
<el-table-column label="教代会/工代会代表" prop="isJdh">
<template v-slot="{row}">
<span v-if="row.isJdh" style="color:#0037ff;"></span>
<span v-else></span>
</template>
</el-table-column>
<!-- <el-table-column label="工代会代表" prop="isGdh">-->
<!-- <template v-slot="{row}">-->
<!-- <span v-if="row.isGdh" style="color:#0037ff;">是</span>-->
<!-- <span v-else>否</span>-->
<!-- </template>-->
<!-- </el-table-column>-->
<el-table-column label="代表类型" prop="representativeType"></el-table-column>
<el-table-column prop="curTaskName" label="当前节点"></el-table-column>
<el-table-column prop="instanceState" label="流程状态">
<template slot-scope="{row}">
<enum-tag :value="row.instanceState" name="ProcessInstanceStateEnum" label_key="message"
size="small"></enum-tag>
</template>
</el-table-column>
<el-table-column label="操作" fixed="right" width="300px">
<template slot-scope="{row}">
<el-button @click="onView(row)" size="mini" type="primary">查看</el-button>
<el-button v-if="row.taskState === 10" @click="openAudit(row)" size="mini" type="primary">
审核
</el-button>
<el-button v-if="row.canRevoke" @click="onRevoke(row)" size="mini" type="danger">撤回
</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
<template #edit>
<audit-info ref="auditInfoRef">
<div v-if="showApprovalForm">
<div class="process-title">
{{formData.taskName}}
</div>
<el-form :model="formData" ref="formRef" :rules="formRules" label-width="0" label-suffix=""
class="flow-task-form">
<el-form-item label="审批意见" prop="tf_opinion"
:rules="[{required:true,message:'必填',trigger:['change','blur']}]">
<user-opinion-textarea v-model="formData.tf_opinion"></user-opinion-textarea>
</el-form-item>
</el-form>
<el-row type="flex" justify="end">
<el-button @click="$refs.guava.index()" size="small">取消</el-button>
<el-button @click="handleTaskAction('ROLLBACK')" size="small" type="info">退回修改</el-button>
<el-button @click="handleTaskAction('AGREE')" size="small" type="primary">同意</el-button>
</el-row>
</div>
</audit-info>
</template>
</guava>
</div>
<script>
<!--#include('push-progress.js'){}#-->
<!--#include('auditInfo.js'){}#-->
new Vue({
el: '#app',
mixins: [initTableMixins],
components: {
'push-progress': pushProgress,
'audit-info': auditInfo
},
data() {
return {
sessionOptions: [],
units: [],
pageForm: {
isFormalOrAttendance: "全部",
unionId: "",
sessionId: "",
approval: false,
},
showApprovalForm: false,
}
},
methods: {
doSearch() {
this.pageData()
const fullName = this.sessionOptions.find(v => v.id === this.pageForm.sessionId)?.fullName;
this.$refs.pushProgressRef.refreshData(this.pageForm.sessionId, fullName, this.pageForm.unionId,"JG")
},
onBatchSubmit() {
this.$confirm('您确定要上报吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(async () => {
const loading = createLoading('正在提交中')
this.$axios.post('/platform/teacherCongress/delegate/push/dwSjAudit/batchSubmit', {
sessionId: this.pageForm.sessionId
}).then(resp => {
if (resp.code === 0) {
this.$message.success(resp.msg)
this.doSearch()
}
}).finally(() => {
loading.close()
})
})
},
openAudit(row) {
this.$refs.guava.edit(() => {
this.showApprovalForm = true
this.formData = {
bizId: row.id,
userId: row.userId,
processTaskId: row.taskId,
taskKey: row.taskKey,
taskName: row.taskName,
instanceId: row.instanceId,
submitType: 1,
}
this.$refs.auditInfoRef.onOpen(row)
})
},
onView(row) {
this.$refs.guava.edit(() => {
this.showApprovalForm = false
this.$refs.auditInfoRef.onOpen(row)
})
},
handleTaskAction(tf_type) {
this.$refs.formRef.validate((valid) => {
if (valid) {
this.$confirm("您确定要提交吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.formData.tf_type = tf_type
this.$axios.post("/flow/common/executeTask", {
data: JSON.stringify({
...this.formData,
})
}).then((res) => {
if (res.code === 0) {
this.$message.success(res.msg)
this.doSearch()
this.$refs.guava.index()
}
})
})
}
})
},
onRevoke(row) {
this.$confirm("您确定要撤回吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "info"
}).then(() => {
this.$axios.post("/flow/common/revokeTask", {taskId: row.taskId}).then((res) => {
if (res.code === 0) {
this.$message.success(res.msg)
this.doSearch()
}
})
})
},
listUnion() {
this.$businessTool.listUnit().then((res) => {
this.units = res
})
},
listSession() {
this.$axios.post("/platform/teacherCongress/common/listSession").then((res) => {
if (res.code === 0) {
this.sessionOptions = res.data
if (this.sessionOptions && this.sessionOptions.length > 0) {
this.pageForm.sessionId = this.sessionOptions[0].id
this.doSearch()
}
}
})
}
},
async created() {
this.listUnion()
this.listSession()
}
})
</script>
<!--#
}
#-->
@@ -2,6 +2,7 @@
layout("/layouts/platform.html"){ layout("/layouts/platform.html"){
#--> #-->
<div id="app" v-cloak> <div id="app" v-cloak>
<guava ref="guava">
<el-card shadow="never"> <el-card shadow="never">
<search @search="doSearch"> <search @search="doSearch">
<search-item label="姓名/工号"> <search-item label="姓名/工号">
@@ -43,8 +44,6 @@ layout("/layouts/platform.html"){
</el-button> </el-button>
<!-- <el-button icon="el-icon-download" size="small" type="primary" @click="doExport">导出</el-button>--> <!-- <el-button icon="el-icon-download" size="small" type="primary" @click="doExport">导出</el-button>-->
<el-button icon="el-icon-check" size="small" type="primary" @click="onBatchSubmit">正式代表提交上报
</el-button>
<el-radio-group v-model="pageForm.isFormalOrAttendance" size="small" class="ml10" <el-radio-group v-model="pageForm.isFormalOrAttendance" size="small" class="ml10"
@change="doSearch"> @change="doSearch">
@@ -61,7 +60,8 @@ layout("/layouts/platform.html"){
@sort-change="pageOrder" @sort-change="pageOrder"
> >
<!-- <el-table-column type="selection" width="55" reserve-selection fixed="left" :selectable="(row)=>{return row.taskKey==='0cacd1e7-7bb2-47dd-818b-6a73062e0c62'}"></el-table-column>--> <!-- <el-table-column type="selection" width="55" reserve-selection fixed="left" :selectable="(row)=>{return row.taskKey==='0cacd1e7-7bb2-47dd-818b-6a73062e0c62'}"></el-table-column>-->
<el-table-column type="index" width="55" label="序号" :index="indexMethod" fixed="left"></el-table-column> <el-table-column type="index" width="55" label="序号" :index="indexMethod"
fixed="left"></el-table-column>
<el-table-column label="姓名" prop="userName" width="100" fixed="left"></el-table-column> <el-table-column label="姓名" prop="userName" width="100" fixed="left"></el-table-column>
<el-table-column label="年龄" prop="age" width="80"></el-table-column> <el-table-column label="年龄" prop="age" width="80"></el-table-column>
<el-table-column label="性别" prop="sex" width="80" fixed="left"></el-table-column> <el-table-column label="性别" prop="sex" width="80" fixed="left"></el-table-column>
@@ -173,7 +173,10 @@ layout("/layouts/platform.html"){
<template slot-scope="{row}"> <template slot-scope="{row}">
<el-button @click="onView(row)" size="mini" type="primary">查看</el-button> <el-button @click="onView(row)" size="mini" type="primary">查看</el-button>
<el-button <el-button
v-if="row.taskKey === 'startTask' || row.taskKey==='53ff0c2a-ba93-45e9-a9fd-db51cdab3080' || !row.instanceId" v-if="row.taskKey === 'startTask'
|| row.taskKey==='53ff0c2a-ba93-45e9-a9fd-db51cdab3080'
|| row.taskKey==='97b0846b-22c6-4d34-9002-a6b67d592944'
|| !row.instanceId"
@click="onEdit(row)" size="mini" @click="onEdit(row)" size="mini"
type="primary">编辑 type="primary">编辑
</el-button> </el-button>
@@ -197,6 +200,12 @@ layout("/layouts/platform.html"){
<!--#include("/layouts/pagination.html"){}#--> <!--#include("/layouts/pagination.html"){}#-->
</el-card> </el-card>
<template #view>
<audit-info ref="auditInfoRef">
</audit-info>
</template>
</guava>
<push-formal-dialog ref="pushFormalRef" @refresh="doSearch"></push-formal-dialog> <push-formal-dialog ref="pushFormalRef" @refresh="doSearch"></push-formal-dialog>
<push-attendance-dialog ref="pushAttendanceRef" @refresh="doSearch"></push-attendance-dialog> <push-attendance-dialog ref="pushAttendanceRef" @refresh="doSearch"></push-attendance-dialog>
@@ -222,6 +231,7 @@ layout("/layouts/platform.html"){
<!--#include('push-formal-dialog.js'){}#--> <!--#include('push-formal-dialog.js'){}#-->
<!--#include('push-attendance-dialog.js'){}#--> <!--#include('push-attendance-dialog.js'){}#-->
<!--#include('write.js'){}#--> <!--#include('write.js'){}#-->
<!--#include('auditInfo.js'){}#-->
new Vue({ new Vue({
el: '#app', el: '#app',
mixins: [initTableMixins], mixins: [initTableMixins],
@@ -229,7 +239,8 @@ layout("/layouts/platform.html"){
'push-progress': pushProgress, 'push-progress': pushProgress,
'push-formal-dialog': pushFormalDialog, 'push-formal-dialog': pushFormalDialog,
'push-attendance-dialog': pushAttendanceDialog, 'push-attendance-dialog': pushAttendanceDialog,
'formal-write': write 'formal-write': write,
'audit-info': auditInfo
}, },
data() { data() {
return { return {
@@ -252,9 +263,9 @@ layout("/layouts/platform.html"){
this.$refs.pushProgressRef.refreshData(this.pageForm.sessionId, fullName, this.pageForm.unionId) this.$refs.pushProgressRef.refreshData(this.pageForm.sessionId, fullName, this.pageForm.unionId)
}, },
onView(row) { onView(row) {
this.writeDialog = true this.$refs.guava.view(() => {
this.userId = row.userId this.$refs.auditInfoRef.onOpen(row)
this.isRead = true })
}, },
onEdit(row) { onEdit(row) {
this.writeDialog = true this.writeDialog = true
@@ -277,33 +288,6 @@ layout("/layouts/platform.html"){
}, },
doExport() { doExport() {
}, },
onBatchSubmit() {
const selection = this.$refs.tableRef.selection
/*if (selection.length === 0){
this.$message.warning('请选择要上报的记录')
return
}*/
this.$confirm('您确定要上报吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(async () => {
const loading = createLoading('正在提交中')
this.$axios.post('/platform/teacherCongress/delegate/push/batchSubmit', {
ids: JSON.stringify(selection.map(v => v.id)),
sessionId: this.pageForm.sessionId
}).then(resp => {
if (resp.code === 0) {
this.$message.success(resp.msg)
this.doSearch()
this.$refs.tableRef.clearSelection()
}
}).finally(() => {
loading.close()
})
})
},
listUnion() { listUnion() {
this.$businessTool.listUnion().then((res) => { this.$businessTool.listUnion().then((res) => {
this.unionOptions = res this.unionOptions = res
@@ -450,76 +450,76 @@ const pushProgress = {
return { return {
metrics: { metrics: {
total: { total: {
current: 15, current: 0,
target: 15, target: 0,
progress: 100, progress: 0,
remaining: 0 remaining: 0
}, },
female: { female: {
current: 3, current: 0,
target: 5, target: 0,
progress: 60, progress: 0,
remaining: 2 remaining: 0
}, },
seniorTeacher: { seniorTeacher: {
current: 4, current: 0,
target: 6, target: 0,
progress: 66.7, progress: 0,
remaining: 2 remaining: 0
}, },
intermediateBelow: { intermediateBelow: {
current: 4, current: 0,
target: 6, target: 0,
progress: 66.7, progress: 0,
remaining: 2 remaining: 0
}, },
cadre: { cadre: {
current: 4, current: 0,
target: 6, target: 0,
progress: 66.7, progress: 0,
remaining: 2 remaining: 0
}, },
worker: { worker: {
current: 4, current: 0,
target: 6, target: 0,
progress: 66.7, progress: 0,
remaining: 2 remaining: 0
}, },
ordinaryTeacher: { ordinaryTeacher: {
current: 8, current: 0,
target: 10, target: 0,
progress: 80, progress: 0,
remaining: 2 remaining: 0
}, },
under45: { under45: {
current: 5, current: 0,
target: 7, target: 0,
progress: 71.4, progress: 0,
remaining: 2 remaining: 0
},
ethnicMinority: {
current: 0,
target: 0,
progress: 0,
remaining: 0
},
schoolLeader: {
current: 0,
target: 0,
progress: 0,
remaining: 0
},
middleLevelLeader: {
current: 0,
target: 0,
progress: 0,
remaining: 0
}, },
employ: { employ: {
current: 5, current: 0,
target: 7, target: 0,
progress: 71.4, progress: 0,
remaining: 2 remaining: 0
},
ethnicMinority:{
current: 1,
target: 2,
progress: 50,
remaining: 1
},
schoolLeader:{
current: 2,
target: 3,
progress: 66.7,
remaining: 1
},
middleLevelLeader:{
current: 1,
target: 2,
progress: 33.3,
remaining: 1
} }
}, },
teacherMeetName: null teacherMeetName: null
@@ -47,13 +47,15 @@ const write = {
</div> </div>
</div> </div>
<el-tabs v-model="activeName">
<el-tab-pane label="填写信息" name="one">
<el-form <el-form
ref="formRef" ref="formRef"
:model="formData" :model="formData"
:rules="rules" :rules="rules"
label-width="150px" label-width="150px"
:class="{ hidden: !isSelected }" :class="{ hidden: !isSelected }"
:disabled="(formData && formData.taskKey!=='53ff0c2a-ba93-45e9-a9fd-db51cdab3080') || is_read" :disabled="(formData && !['53ff0c2a-ba93-45e9-a9fd-db51cdab3080','97b0846b-22c6-4d34-9002-a6b67d592944'].includes(formData.taskKey)) || is_read"
> >
<div class="form-section"> <div class="form-section">
<h3 class="section-title">基本信息</h3> <h3 class="section-title">基本信息</h3>
@@ -90,7 +92,8 @@ const write = {
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
<el-form-item label="民族" prop="nation"> <el-form-item label="民族" prop="nation">
<dict-select v-model="formData.nation" style="width: 100%" placeholder="请选择民族" <dict-select v-model="formData.nation" style="width: 100%"
placeholder="请选择民族"
code="USER_NATION"></dict-select> code="USER_NATION"></dict-select>
</el-form-item> </el-form-item>
</el-col> </el-col>
@@ -182,16 +185,6 @@ const write = {
</el-row> </el-row>
</div> </div>
<div class="form-grid"> <div class="form-grid">
@@ -205,14 +198,40 @@ const write = {
</div> </div>
</div> </div>
<div v-if="formData && formData.taskKey==='53ff0c2a-ba93-45e9-a9fd-db51cdab3080'" <div v-if="formData && ['53ff0c2a-ba93-45e9-a9fd-db51cdab3080','97b0846b-22c6-4d34-9002-a6b67d592944'].includes(formData.taskKey)"
class="form-actions"> class="form-actions">
<el-button @click="onSave">保存草稿</el-button> <el-button @click="onSave">保存草稿</el-button>
<el-button type="primary" @click="onSubmit">提交信息</el-button> <el-button type="primary" @click="onSubmit">提交信息</el-button>
</div> </div>
</el-form> </el-form>
</el-tab-pane>
<el-tab-pane label="审核信息" name="two" v-if="doneTasks&&doneTasks.length>0">
<template v-for="task in doneTasks">
<div class="mt10"
v-if="['0cacd1e7-7bb2-47dd-818b-6a73062e0c62'].includes(task.taskName)">
<div class="process-title">{{ task.displayName }}</div>
<div v-if="isSelected && formData && formData.taskKey!=='53ff0c2a-ba93-45e9-a9fd-db51cdab3080'" <el-descriptions border class="flow-task-form" :column="3" :key="task.id"
>
<el-descriptions-item label="办理用户">{{ task.taskFormData.userName
}}({{task.taskFormData.loginName}})
</el-descriptions-item>
<el-descriptions-item label="办理时间">{{ task.finishTime }}
</el-descriptions-item>
<el-descriptions-item label="办理结果">
{{processSubmitTypeEnums.find(v=>v.name===task.ext.tf_type)?.message}}
<!-- <dict-tag :options="dict.type.PROCESS_TASK_SUBMIT_TYPE"
:value="task.ext.submitType"></dict-tag>-->
</el-descriptions-item>
<el-descriptions-item label="办理意见" v-if="!task.ext.isFirstTaskNode">{{
task.taskFormData.opinion }}
</el-descriptions-item>
</el-descriptions>
</div>
</template>
</el-tab-pane>
</el-tabs>
<div v-if="isSelected && formData && !['53ff0c2a-ba93-45e9-a9fd-db51cdab3080','97b0846b-22c6-4d34-9002-a6b67d592944'].includes(formData.taskKey)"
class="completion-panel"> class="completion-panel">
<div> <div>
<i class="el-icon-success completion-icon"></i> <i class="el-icon-success completion-icon"></i>
@@ -247,6 +266,9 @@ const write = {
}, },
data() { data() {
return { return {
doneTasks: [],
activeName: "one",
processSubmitTypeEnums:[],
isSelected: true, isSelected: true,
formData: { formData: {
teacherMeetId: null teacherMeetId: null
@@ -300,6 +322,14 @@ const write = {
} }
}, },
methods: { methods: {
// 获取已办任务审批记录
getDoneTasks() {
this.$axios.post("/flow/common/doneTasks", {bizId: this.formData.id}).then((res) => {
if (res.code === 0) {
this.doneTasks = res.data
}
})
},
async listSession() { async listSession() {
const res = await this.$axios.post("/platform/teacherCongress/common/listSession") const res = await this.$axios.post("/platform/teacherCongress/common/listSession")
if (res.code === 0) { if (res.code === 0) {
@@ -321,7 +351,10 @@ const write = {
} }
} }
}, },
async getEnumOptions() {
const resp = await this.$axios.post("/open/common/dictEnumOptions", { name: "ProcessSubmitTypeEnum" })
this.processSubmitTypeEnums=resp.data
},
async initInfo() { async initInfo() {
const {code, data} = await $.get('/platform/teacherCongress/delegate/push/write/info', { const {code, data} = await $.get('/platform/teacherCongress/delegate/push/write/info', {
sessionId: this.formData.sessionId sessionId: this.formData.sessionId
@@ -330,6 +363,8 @@ const write = {
this.isSelected = data.isSelected this.isSelected = data.isSelected
if (this.isSelected) { if (this.isSelected) {
this.formData = data.delegate this.formData = data.delegate
this.getDoneTasks()
this.getEnumOptions()
} }
} }
}, },
@@ -2,6 +2,7 @@
layout("/layouts/platform.html"){ layout("/layouts/platform.html"){
#--> #-->
<div id="app" v-cloak> <div id="app" v-cloak>
<guava ref="guava">
<el-card shadow="never"> <el-card shadow="never">
<search @search="doSearch"> <search @search="doSearch">
<search-item label="姓名/工号"> <search-item label="姓名/工号">
@@ -115,6 +116,11 @@ layout("/layouts/platform.html"){
<!--#include("/layouts/pagination.html"){}#--> <!--#include("/layouts/pagination.html"){}#-->
</el-card> </el-card>
<template #edit>
<audit-info ref="auditInfoRef">
</audit-info>
</template>
</guava>
<el-dialog :close-on-click-modal="false" <el-dialog :close-on-click-modal="false"
class="write-dialog" class="write-dialog"
:visible.sync="writeDialog" :visible.sync="writeDialog"
@@ -134,11 +140,13 @@ layout("/layouts/platform.html"){
<script> <script>
<!--#include('write.js'){}#--> <!--#include('write.js'){}#-->
<!--#include('auditInfo.js'){}#-->
new Vue({ new Vue({
el: '#app', el: '#app',
mixins: [initTableMixins], mixins: [initTableMixins],
components: { components: {
'formal-write': write 'formal-write': write,
'audit-info': auditInfo
}, },
data() { data() {
return { return {
@@ -161,9 +169,10 @@ layout("/layouts/platform.html"){
this.$downLoad("/platform/teacherCongress/delegate/push/zcAudit/exportExcel", this.pageForm) this.$downLoad("/platform/teacherCongress/delegate/push/zcAudit/exportExcel", this.pageForm)
}, },
onView(row) { onView(row) {
this.writeDialog = true this.$refs.guava.edit(() => {
this.userId = row.userId this.showApprovalForm = false
this.isRead = true this.$refs.auditInfoRef.onOpen(row)
})
}, },
handleTaskAction(row, submitType) { handleTaskAction(row, submitType) {
this.$confirm("您确定要提交吗?", "提示", { this.$confirm("您确定要提交吗?", "提示", {