This commit is contained in:
@jyuhsin
2026-01-28 09:07:42 +08:00
parent a56afdd4f1
commit 863a634225
15 changed files with 1158 additions and 236 deletions
@@ -343,6 +343,7 @@ public class ProposalMineController {
seconded.setUnionName(item.getString("unionName")); seconded.setUnionName(item.getString("unionName"));
seconded.setDelegationName(item.getString("delegationName")); seconded.setDelegationName(item.getString("delegationName"));
seconded.setMobile(item.getString("mobile")); seconded.setMobile(item.getString("mobile"));
seconded.setMode(true);
seconded.setInviteTime(new Date()); seconded.setInviteTime(new Date());
return seconded; return seconded;
}).toList(); }).toList();
@@ -0,0 +1,179 @@
package com.budwk.app.zhgh.democratic.proposal.controller.transact;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.dev33.satoken.annotation.SaMode;
import cn.hutool.core.util.ObjectUtil;
import com.budwk.app.base.annotation.SLog;
import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.result.Result;
import com.budwk.app.flow.enums.ProcessSubmitTypeEnum;
import com.budwk.app.sys.views.View_user;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.zhgh.democratic.proposal.models.ProposalConfig;
import com.budwk.app.zhgh.democratic.proposal.models.ProposalSecond;
import com.budwk.app.zhgh.democratic.proposal.param.ProposalSearchParam;
import com.budwk.app.zhgh.democratic.proposal.service.ProposalSecondedService;
import com.budwk.app.zhgh.democratic.proposal.service.common.ProposalCommonService;
import com.budwk.app.zhgh.democratic.teachercongress.delegate.models.Teacher_congress_delegate;
import com.budwk.app.zhgh.democratic.teachercongress.delegation.models.Teacher_congress_delegation;
import com.budwk.app.zhgh.democratic.teachercongress.prepare.models.Teacher_congress_session;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.nutz.aop.interceptor.ioc.TransAop;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.dao.util.cri.Static;
import org.nutz.ioc.aop.Aop;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import org.nutz.mvc.annotation.Param;
import javax.validation.Valid;
import java.util.Date;
import java.util.List;
/**
* @ClassName ProposalPositiveSecondedController
* @Author JyuHsin
* @Date 2026/1/27 14:27
* @Version 1.0
* @Description TODO
*/
@IocBean
@At("/platform/proposal/positiveSeconded")
@Slf4j
@Ok("json:full")
@Api(tags = "提案管理系统-提案主动附议")
public class ProposalPositiveSecondedController {
@Inject
private Dao dao;
@Inject
private ProposalSecondedService proposalSecondedService;
@Inject
private ProposalCommonService proposalCommonService;
@At("")
@Ok("beetl:/platform/zhgh/democratic/proposal/transact/positiveSeconded/index.html")
@SaCheckPermission(value = {"proposal.positiveSeconded", "proposal.positiveSeconded.h5"}, mode = SaMode.OR)
public void index() {
}
@At("/h5")
@Ok("beetl:/platform/zhghh5/democratic/proposal/transact/positiveSeconded/index.html")
@SaCheckPermission(value = {"proposal.positiveSeconded", "proposal.positiveSeconded.h5"}, mode = SaMode.OR)
public void h5Index() {
}
@At
@SaCheckPermission(value = {"proposal.positiveSeconded", "proposal.positiveSeconded.h5"}, mode = SaMode.OR)
public Result pageData(@Valid ProposalSearchParam pageForm, boolean approval) {
Sql sql = Sqls.create("""
SELECT
info.*,
type.name AS typeName,
tcs.fullName AS sessionName,
tcd.`name` AS delegationName,
ins.state instanceState,
t.displayName taskName,
IFNULL(GROUP_CONCAT(DISTINCT t.displayName),'结束') curTaskName,
sum( CASE WHEN ps.seconderId=@seconderId and ps.isAgree is not null THEN 1 ELSE 0 END ) as count
FROM
`proposal_info` info
LEFT JOIN proposal_second ps ON ps.proposalId = info.id
LEFT JOIN proposal_type type on type.id = info.typeId
LEFT JOIN teacher_congress_session tcs on tcs.id = info.sessionId
LEFT JOIN teacher_congress_delegation tcd on tcd.id = info.delegationId
LEFT JOIN wf_process_instance ins ON ins.businessNo = info.id
LEFT JOIN wf_process_task t ON t.processInstanceId = ins.id AND t.taskState = 10
$condition
""");
Cnd cnd = Cnd.NEW();
sql.setCondition(cnd);
sql.setParam("seconderId", SecurityUtil.getUserId());
cnd.and("t.taskName", "in", List.of("invite", "second", "delegation", "committee"));
cnd.and("ins.id", "is not", null);
if (approval) {
cnd.and("ps.seconderId", "=", SecurityUtil.getUserId());
cnd.and("ps.mode", "=", false);
cnd.and("ps.isAgree", "is not", null);
} else {
cnd.and(new Static("info.id not in (select proposalId from proposal_second where seconderId = '%s' and isAgree is not null)".formatted(SecurityUtil.getUserId())));
}
cnd.groupBy("info.id");
ProposalSearchParam.buildSearch(cnd, pageForm);
Pagination pagination = proposalCommonService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql);
return Result.success(pagination);
}
@At
@Aop(TransAop.READ_COMMITTED)
@ApiOperation("主动附议")
@SLog(tag = "提案管理系统-主动附议", msg = "主动附议")
@SaCheckPermission(value = {"proposal.positiveSeconded", "proposal.positiveSeconded.h5"}, mode = SaMode.OR)
public Result handle(@Param("proposalId") String proposalId,
@Param("opinion") String opinion,
@Param("submitType") Integer submitType) {
View_user user = dao.fetch(View_user.class, Cnd.where("id", "=", SecurityUtil.getUserId()));
// 查询当前用户所属的教代会
Teacher_congress_session session = dao.fetch(Teacher_congress_session.class, Cnd.where("enable", "=", 1).desc("startDate"));
Teacher_congress_delegate delegate = dao.fetch(Teacher_congress_delegate.class, Cnd.where("sessionId", "=", session.getId()).and("userId", "=", user.getId()));
if (delegate == null) {
return Result.error("未查询到您的代表信息");
}
Teacher_congress_delegation delegation = dao.fetch(Teacher_congress_delegation.class, delegate.getDelegationId());
if (delegation == null) {
return Result.error("未查询到您所在的代表团信息");
}
ProposalSecond seconded = new ProposalSecond();
seconded.setProposalId(proposalId);
seconded.setSeconderId(user.getId());
seconded.setUserName(user.getUsername());
seconded.setLoginName(user.getLoginname());
seconded.setUnitName(user.getUnitName());
seconded.setUnionName(user.getUnionName());
seconded.setDelegationName(delegation.getName());
seconded.setMobile(user.getMobile());
seconded.setMode(false);
seconded.setInviteTime(new Date());
seconded.setOpinion(opinion);
seconded.setSecondedTime(new Date());
seconded.setIsAgree(ObjectUtil.equals(submitType, ProcessSubmitTypeEnum.AGREE.getCode()));
dao.insert(seconded);
return Result.success();
}
@At
@SaCheckPermission(value = {"proposal.positiveSeconded", "proposal.positiveSeconded.h5"}, mode = SaMode.OR)
public Result listPositiveSeconded(String bizId) {
List<ProposalSecond> list = dao.query(ProposalSecond.class, Cnd.where(ProposalSecond::getProposalId, "=", bizId).and(ProposalSecond::getMode, "=", false));
return Result.success(list);
}
@At
@SaCheckPermission(value = {"proposal.positiveSeconded", "proposal.positiveSeconded.h5"}, mode = SaMode.OR)
public Result validateTime() {
ProposalConfig config = dao.fetch(ProposalConfig.class, Cnd.NEW());
if(System.currentTimeMillis() < config.getSecondedStartTime().getTime()) {
return Result.error(99, "主动附议时间未开始");
}
if(System.currentTimeMillis() > config.getSecondedEndTime().getTime()) {
return Result.error(99, "主动附议时间已结束");
}
return Result.success();
}
}
@@ -1,28 +1,38 @@
package com.budwk.app.zhgh.democratic.proposal.controller.transact; package com.budwk.app.zhgh.democratic.proposal.controller.transact;
import cn.dev33.satoken.annotation.SaCheckPermission; import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil;
import com.budwk.app.base.annotation.SLog;
import com.budwk.app.base.constant.RoleConstant; import com.budwk.app.base.constant.RoleConstant;
import com.budwk.app.base.page.Pagination; import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.result.Result; import com.budwk.app.base.result.Result;
import com.budwk.app.base.service.BaseService; import com.budwk.app.base.service.BaseService;
import com.budwk.app.bpm.service.BpmService; import com.budwk.app.bpm.service.BpmService;
import com.budwk.app.flow.enums.ProcessSubmitTypeEnum;
import com.budwk.app.flow.enums.ProcessTaskStateEnum; import com.budwk.app.flow.enums.ProcessTaskStateEnum;
import com.budwk.app.web.commons.auth.utils.AuthUtil; import com.budwk.app.web.commons.auth.utils.AuthUtil;
import com.budwk.app.web.commons.auth.utils.SecurityUtil; import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.zhgh.democratic.proposal.models.ProposalInfo;
import com.budwk.app.zhgh.democratic.proposal.models.ProposalSecond;
import com.budwk.app.zhgh.democratic.proposal.param.ProposalSearchParam; import com.budwk.app.zhgh.democratic.proposal.param.ProposalSearchParam;
import com.budwk.app.zhgh.democratic.proposal.service.ProposalSecondedService; import com.budwk.app.zhgh.democratic.proposal.service.ProposalSecondedService;
import com.budwk.app.zhgh.democratic.proposal.service.common.ProposalCommonService; import com.budwk.app.zhgh.democratic.proposal.service.common.ProposalCommonService;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
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;
import org.nutz.mvc.annotation.At; import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok; import org.nutz.mvc.annotation.Ok;
import org.nutz.mvc.annotation.Param;
import javax.validation.Valid; import javax.validation.Valid;
import java.util.List; import java.util.List;
@@ -37,89 +47,111 @@ import java.util.List;
@Api(tags = "提案管理系统-提案附议") @Api(tags = "提案管理系统-提案附议")
public class ProposalSecondedController { public class ProposalSecondedController {
@Inject @Inject
private Dao dao; private Dao dao;
@Inject @Inject
private BaseService baseService; private BaseService baseService;
@Inject @Inject
private ProposalCommonService proposalCommonService; private ProposalCommonService proposalCommonService;
@Inject @Inject
private BpmService bpmService; private BpmService bpmService;
@Inject @Inject
private ProposalSecondedService proposalSecondedService; private ProposalSecondedService proposalSecondedService;
@At("") @At("")
@Ok("beetl:/platform/zhgh/democratic/proposal/transact/seconded/index.html") @Ok("beetl:/platform/zhgh/democratic/proposal/transact/seconded/index.html")
@SaCheckPermission("proposal.seconded") @SaCheckPermission("proposal.seconded")
public void index() { public void index() {
} }
@At("/h5") @At("/h5")
@Ok("beetl:/platform/zhghh5/democratic/proposal/transact/seconded/index.html") @Ok("beetl:/platform/zhghh5/democratic/proposal/transact/seconded/index.html")
@SaCheckPermission("proposal.seconded") @SaCheckPermission("proposal.seconded")
public void h5Index() { public void h5Index() {
} }
@At @At
@SaCheckPermission("proposal.seconded") @SaCheckPermission("proposal.seconded")
public Result pageData(@Valid ProposalSearchParam pageForm, boolean approval) { public Result pageData(@Valid ProposalSearchParam pageForm, boolean approval) {
Sql sql = Sqls.create(""" Sql sql = Sqls.create("""
SELECT SELECT
info.*, info.*,
type.name AS typeName, type.name AS typeName,
tcs.fullName AS sessionName, tcs.fullName AS sessionName,
tcd.`name` AS delegationName, tcd.`name` AS delegationName,
ins.id AS instanceId, ins.id AS instanceId,
ins.businessNo, ins.businessNo,
ins.state instanceState, ins.state instanceState,
ins.variable instanceVariable, ins.variable instanceVariable,
ins.processDefineId instanceProcessDefineId, ins.processDefineId instanceProcessDefineId,
t.id taskId, t.id taskId,
t.taskName AS taskKey, t.taskName AS taskKey,
t.displayName taskName, t.displayName taskName,
t.taskType, t.taskType,
t.performType taskPerformType, t.performType taskPerformType,
t.taskState, t.taskState,
t.finishTime, t.finishTime,
t.taskParentId, t.taskParentId,
t.variable taskVariable, t.variable taskVariable,
ta.actorName taskActorName, ta.actorId taskActorUserId,
IFNULL(GROUP_CONCAT(DISTINCT nt.displayName),'结束') curTaskName, ta.actorName taskActorName,
IF(rt.id IS NOT NULL, 1, 0) AS canRevoke IFNULL(GROUP_CONCAT(DISTINCT nt.displayName),'结束') curTaskName,
FROM IF(rt.id IS NOT NULL, 1, 0) AS canRevoke
wf_process_task t FROM
LEFT JOIN wf_process_instance ins ON ins.id = t.processInstanceId wf_process_task t
LEFT JOIN wf_process_task_actor ta ON ta.processTaskId = t.id LEFT JOIN wf_process_instance ins ON ins.id = t.processInstanceId
LEFT JOIN wf_process_task nt ON nt.processInstanceId = ins.id AND nt.taskState = 10 LEFT JOIN wf_process_task_actor ta ON ta.processTaskId = t.id
LEFT JOIN wf_process_task rt ON rt.processInstanceId = ins.id AND rt.taskParentId = t.id AND rt.taskState = 10 LEFT JOIN wf_process_task nt ON nt.processInstanceId = ins.id AND nt.taskState = 10
LEFT JOIN proposal_info info ON info.id = ins.businessNo LEFT JOIN wf_process_task rt ON rt.processInstanceId = ins.id AND rt.taskParentId = t.id AND rt.taskState = 10
LEFT JOIN proposal_type type on type.id = info.typeId LEFT JOIN proposal_info info ON info.id = ins.businessNo
LEFT JOIN teacher_congress_session tcs on tcs.id = info.sessionId LEFT JOIN proposal_type type on type.id = info.typeId
LEFT JOIN teacher_congress_delegation tcd on tcd.id = info.delegationId LEFT JOIN teacher_congress_session tcs on tcs.id = info.sessionId
$condition LEFT JOIN teacher_congress_delegation tcd on tcd.id = info.delegationId
"""); $condition
Cnd cnd = Cnd.NEW(); """);
cnd.and("t.taskName", "=", "second"); Cnd cnd = Cnd.NEW();
cnd.and("t.taskName", "=", "second");
if (!AuthUtil.hasRole(RoleConstant.SYSADMIN.name())) { if (!AuthUtil.hasRole(RoleConstant.SYSADMIN.name())) {
cnd.and("ta.actorId", "in", List.of(SecurityUtil.getUserId())); cnd.and("ta.actorId", "in", List.of(SecurityUtil.getUserId()));
} }
if (approval) { if (approval) {
cnd.and("t.taskState", "in", List.of(ProcessTaskStateEnum.FINISHED.getCode(), ProcessTaskStateEnum.INTERRUPT.getCode())); cnd.and("t.taskState", "in", List.of(ProcessTaskStateEnum.FINISHED.getCode(), ProcessTaskStateEnum.INTERRUPT.getCode()));
} else { } else {
cnd.and("t.taskState", "=", ProcessTaskStateEnum.DOING.getCode()); cnd.and("t.taskState", "=", ProcessTaskStateEnum.DOING.getCode());
} }
ProposalSearchParam.buildSearch(cnd, pageForm); ProposalSearchParam.buildSearch(cnd, pageForm);
cnd.groupBy("t.id"); cnd.groupBy("t.id");
cnd.desc("t.createdAt"); cnd.desc("t.createdAt");
sql.setCondition(cnd); sql.setCondition(cnd);
Pagination pagination = baseService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql); Pagination pagination = baseService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql);
List<NutMap> list = pagination.getList(NutMap.class); List<NutMap> list = pagination.getList(NutMap.class);
for (NutMap row : list) { for (NutMap row : list) {
// String instanceId = row.getString("instanceId"); // String instanceId = row.getString("instanceId");
} }
return Result.success(pagination); return Result.success(pagination);
} }
@At
@SaCheckPermission("proposal.seconded")
@Aop(TransAop.READ_COMMITTED)
@ApiOperation("修改提案附议信息")
@SLog(tag = "提案管理系统-附议提案", msg = "修改提案附议信息")
public Result updateInfo(@Param("proposalId") String proposalId,
@Param("taskActorUserId") String taskActorUserId,
@Param("opinion") String opinion,
@Param("submitType") Integer submitType) {
// 查询附议信息表
ProposalSecond proposalSecond = dao.fetch(
ProposalSecond.class,
Cnd.where(ProposalSecond::getProposalId, "=", proposalId)
.and(ProposalSecond::getSeconderId, "=", taskActorUserId)
);
proposalSecond.setIsAgree(ObjectUtil.equals(submitType, ProcessSubmitTypeEnum.AGREE.getCode()));
proposalSecond.setOpinion(opinion);
proposalSecond.setSecondedTime(DateUtil.date());
dao.update(proposalSecond);
return Result.success();
}
} }
@@ -1,5 +1,6 @@
package com.budwk.app.zhgh.democratic.proposal.models; package com.budwk.app.zhgh.democratic.proposal.models;
import cn.hutool.core.date.DateTime;
import com.budwk.app.base.model.BaseModel; import com.budwk.app.base.model.BaseModel;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
@@ -60,4 +61,14 @@ public class ProposalConfig extends BaseModel {
@Comment("校领导单位") @Comment("校领导单位")
@ColDefine(type = ColType.MYSQL_JSON) @ColDefine(type = ColType.MYSQL_JSON)
private List<String> schoolLeaderUnitIds; private List<String> schoolLeaderUnitIds;
@Column
@Comment("附议开始时间")
@ColDefine(type = ColType.DATETIME)
private DateTime secondedStartTime;
@Column
@Comment("附议结束时间")
@ColDefine(type = ColType.DATETIME)
private DateTime secondedEndTime;
} }
@@ -77,4 +77,14 @@ public class ProposalSecond extends BaseModel {
@ColDefine(type = ColType.BOOLEAN) @ColDefine(type = ColType.BOOLEAN)
private Boolean isAgree; private Boolean isAgree;
@Column
@Comment("附议类型,true表示正常邀请,false表示主动附议")
@ColDefine(type = ColType.BOOLEAN)
@Default("1")
private Boolean mode;
@Column
@Comment("附议人内容")
@ColDefine(type = ColType.VARCHAR, width = 500)
private String opinion;
} }
@@ -0,0 +1,120 @@
<template>
<!-- 完全自定义卡片容器复刻el-card样式 -->
<div
class="el-card custom-card"
:style="{ width: width || '100%' }"
v-bind="$attrs"
v-on="$listeners"
>
<!-- 卡片头部 - 独立节点 -->
<div v-if="$slots.header" class="el-card__header card-header">
<slot name="header"></slot>
</div>
<!-- 可滚动内容区域 - 独立节点 -->
<div class="el-card__body card-body">
<slot></slot>
</div>
<!-- 卡片底部 - 独立节点 -->
<div v-if="$slots.footer" class="el-card__footer card-footer">
<slot name="footer"></slot>
</div>
</div>
</template>
<script>
module.exports = {
name: 'CustomCard',
inheritAttrs: false,
props: {
// 保留el-card的核心属性,保证使用体验一致
width: {
type: String,
default: ''
},
shadow: {
type: String,
default: 'hover', // 同el-card默认值
validator: (val) => ['always', 'hover', 'never'].includes(val)
}
},
computed: {
// 根据shadow属性动态设置阴影样式
shadowClass() {
return {
'el-card--shadow-always': this.shadow === 'always',
'el-card--shadow-hover': this.shadow === 'hover',
'el-card--shadow-never': this.shadow === 'never'
}
}
}
}
</script>
<style scoped>
/* 卡片核心样式 - 完全复刻el-card */
.custom-card {
display: flex;
flex-direction: column;
height: calc(100vh - 84px); /* 关键:卡片高度撑满父容器 */
background: #fff;
border-radius: 4px;
box-sizing: border-box;
margin: 0;
border: 0;
/* 继承el-card的字体样式 */
color: var(--el-text-color-primary);
font-size: 14px;
transition: box-shadow 0.3s ease-in-out;
overflow: hidden;
}
/* 阴影样式 - 完全对齐el-card */
:deep(.el-card--shadow-always) {
box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
}
:deep(.el-card--shadow-hover):hover {
box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
}
:deep(.el-card--shadow-never) {
box-shadow: none;
}
/* 头部样式 - 固定高度,不滚动 */
.card-header {
flex-shrink: 0; /* 关键:不被压缩 */
padding: 18px 20px;
border-bottom: 1px solid #ebeef5;
box-sizing: border-box;
}
/* 内容区域 - 自动填充剩余空间,可滚动 */
.card-body {
flex: 1; /* 关键:占满剩余高度 */
padding: 20px;
overflow-y: auto; /* 垂直滚动 */
overflow-x: hidden; /* 隐藏水平滚动 */
box-sizing: border-box;
}
/* 底部样式 - 固定高度,不滚动 */
.card-footer {
flex-shrink: 0; /* 关键:不被压缩 */
padding: 18px 20px;
border-top: 1px solid #ebeef5;
box-sizing: border-box;
text-align: right;
}
/* 兼容el-card的默认样式覆盖 */
:deep(.el-card__header) {
padding: 0;
margin: 0;
border: 0;
}
:deep(.el-card__body) {
padding: 0;
margin: 0;
}
</style>
@@ -392,6 +392,7 @@
Vue.component("excel-import", httpVueLoader("/components/plugins/sysImport/excelImport.vue?v=" + new Date().getTime())) Vue.component("excel-import", httpVueLoader("/components/plugins/sysImport/excelImport.vue?v=" + new Date().getTime()))
Vue.component("flow-form-button", httpVueLoader("/components/plugins/flowable/formButton.vue?v=" + new Date().getTime())) Vue.component("flow-form-button", httpVueLoader("/components/plugins/flowable/formButton.vue?v=" + new Date().getTime()))
Vue.component("snaker-flow", httpVueLoader("/components/plugins/snaker/snakerFlow.vue?v=" + new Date().getTime())) Vue.component("snaker-flow", httpVueLoader("/components/plugins/snaker/snakerFlow.vue?v=" + new Date().getTime()))
Vue.component("custom-card", httpVueLoader("/components/plugins/sysCard/index.vue?v=" + new Date().getTime()))
Vue.component( Vue.component(
"snaker-flow-task-form-action", "snaker-flow-task-form-action",
httpVueLoader("/components/plugins/snaker/snakerFlowTaskFormAction.vue?v=" + new Date().getTime()) httpVueLoader("/components/plugins/snaker/snakerFlowTaskFormAction.vue?v=" + new Date().getTime())
@@ -137,8 +137,34 @@ const PROPOSAL_INFO = {
<el-table-column label="单位" prop="unitName"></el-table-column> <el-table-column label="单位" prop="unitName"></el-table-column>
<el-table-column label="分工会" prop="unionName"></el-table-column> <el-table-column label="分工会" prop="unionName"></el-table-column>
<el-table-column label="代表团" prop="delegationName"></el-table-column> <el-table-column label="代表团" prop="delegationName"></el-table-column>
<el-table-column label="附议模式" prop="mode">
<template slot-scope="{ row }">
<el-tag size="mini" type="primary">邀请附议</el-tag>
</template>
</el-table-column>
</el-table> </el-table>
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item label="主动附议" :span="3" v-if="task.taskName === 'invite'">
<el-table v-if="positiveSecondList.length > 0" :data="positiveSecondList">
<el-table-column label="姓名" prop="userName"></el-table-column>
<el-table-column label="工号" prop="loginName"></el-table-column>
<el-table-column label="单位" prop="unitName"></el-table-column>
<el-table-column label="附议时间" prop="secondedTime"></el-table-column>
<el-table-column label="附议结果" prop="isAgree">
<template slot-scope="{ row }">
<el-tag v-if="row.isAgree === true" size="mini" type="success">同意</el-tag>
<el-tag v-else size="mini" type="danger">不同意</el-tag>
</template>
</el-table-column>
<el-table-column label="意见" prop="opinion" show-overflow-tooltip></el-table-column>
<el-table-column label="附议模式" prop="mode">
<template slot-scope="{ row }">
<el-tag size="mini" type="primary">主动附议</el-tag>
</template>
</el-table-column>
</el-table>
<span v-else>暂无主动附议信息</span>
</el-descriptions-item>
</el-descriptions> </el-descriptions>
<!--提案委员会立案--> <!--提案委员会立案-->
@@ -208,7 +234,8 @@ const PROPOSAL_INFO = {
viewData: {}, viewData: {},
doneTasks: [], doneTasks: [],
row: null, row: null,
viewDialogVisible: false viewDialogVisible: false,
positiveSecondList: [],
} }
}, },
methods: { methods: {
@@ -218,6 +245,7 @@ const PROPOSAL_INFO = {
this.visible = true this.visible = true
this.getInfo() this.getInfo()
this.getDoneTasks() this.getDoneTasks()
this.listPositiveSeconded()
}, },
// 获取申请信息 // 获取申请信息
@@ -246,6 +274,15 @@ const PROPOSAL_INFO = {
}) })
}, },
// 获取主动附议信息
listPositiveSeconded() {
this.$axios.post("/platform/proposal/positiveSeconded/listPositiveSeconded", {bizId: this.row.id}).then((res) => {
if (res.code === 0) {
this.positiveSecondList = res.data
}
})
},
}, },
style: style:
/*language=CSS*/ /*language=CSS*/
@@ -19,6 +19,17 @@ layout("/layouts/platform.html"){
<el-option :key="item.id" :label="item.name" :value="item.id" v-for="item in unitOptions"></el-option> <el-option :key="item.id" :label="item.name" :value="item.id" v-for="item in unitOptions"></el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="主动附议时间" prop="secondedTime">
<el-date-picker
style="width: 100%"
v-model="formData.secondedTime"
type="datetimerange"
value-format="yyyy-MM-dd HH:mm"
range-separator="-"
start-placeholder="主动附议开始时间"
end-placeholder="主动附议结束时间">
</el-date-picker>
</el-form-item>
<el-form-item label="协办单位是否需要答复" prop="slaveUnitNeedReply"> <el-form-item label="协办单位是否需要答复" prop="slaveUnitNeedReply">
<el-radio-group v-model="formData.slaveUnitNeedReply" size="small"> <el-radio-group v-model="formData.slaveUnitNeedReply" size="small">
<el-radio border :label="true"></el-radio> <el-radio border :label="true"></el-radio>
@@ -75,7 +86,8 @@ layout("/layouts/platform.html"){
trigger: ["blur", "change"] trigger: ["blur", "change"]
} }
], ],
schoolLeaderUnitIds: [{ required: true, message: "请选择校领导单位", trigger: ["blur", "change"] }] schoolLeaderUnitIds: [{ required: true, message: "请选择校领导单位", trigger: ["blur", "change"] }],
secondedTime: [{ required: true, message: "请选择附议时间", trigger: ["blur", "change"] }],
} }
} }
}, },
@@ -89,12 +101,15 @@ layout("/layouts/platform.html"){
this.$axios.post(loc() + "/findOne").then((res) => { this.$axios.post(loc() + "/findOne").then((res) => {
if (res.code === 0) { if (res.code === 0) {
this.formData = res.data this.formData = res.data
this.$set(this.formData, 'secondedTime', [this.formData.secondedStartTime || '', this.formData.secondedEndTime || ''])
} }
}) })
}, },
save() { save() {
this.$refs.formRef.validate((valid) => { this.$refs.formRef.validate((valid) => {
if (valid) { if (valid) {
this.$set(this.formData, 'secondedStartTime', this.formData.secondedTime[0] || '')
this.$set(this.formData, 'secondedEndTime', this.formData.secondedTime[1] || '')
this.$axios this.$axios
.post(loc() + "/update", { .post(loc() + "/update", {
config: JSON.stringify(this.formData) config: JSON.stringify(this.formData)
@@ -0,0 +1,240 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app">
<guava ref="guava">
<el-card shadow="never">
<search @search="doSearch">
<search-item label="教代会">
<el-select @change="meetingChange" clearable filterable placeholder="请选择所属教代会"
v-model="pageForm.sessionId">
<el-option :key="item.id" :label="item.fullName" :value="item.id"
v-for="item in sessionOptions"></el-option>
</el-select>
</search-item>
<search-item label="提案名称">
<el-input v-model="pageForm.name" placeholder="请输入提案名称" @keyup.enter.native="doSearch" clearable
style="width: 100%"></el-input>
</search-item>
<search-item label="姓名/工号">
<el-input clearable placeholder="请输入姓名或工号" v-model="pageForm.createUserKeyword"
@keyup.enter.native="doSearch"></el-input>
</search-item>
<search-item label="代表团">
<el-select clearable filterable placeholder="请选择所属代表团" v-model="pageForm.delegationId">
<el-option :key="item.id" :label="item.name" :value="item.id"
v-for="item in delegationOptions"></el-option>
</el-select>
</search-item>
</search>
</el-card>
<el-card shadow="never">
<table-tool :columns.sync="tableColumns">
<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 :data="tableData" @sort-change="pageOrder" style="width: 100%">
<el-table-column label="序号" width="50" type="index" :index="indexMethod" fixed="left"></el-table-column>
<el-table-column
:label="column.label"
:prop="column.prop"
:key="column.key"
:min-width="column.width"
:fixed="column.fixed"
show-overflow-tooltip
v-for="column in tableColumns"
v-if="column.visible !== false"
>
<template v-if="column.prop === 'caseFilingResult'" scope="{row}">
<dict-tag :options="dict.type.PROPOSAL_CASE_FILING_RESULT"
:value="row.caseFilingResult"></dict-tag>
</template>
<template v-else-if="column.prop === 'merge'" scope="{row}">
<el-tag v-if="row.merge" size="small"></el-tag>
</template>
<template v-else-if="column.prop === 'instanceState'" 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="openView(row)" size="mini" type="primary">查看</el-button>
<el-button v-if="row.count === 0" @click="openAudit(row)" size="mini" type="primary">附议</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
<template #edit>
<proposal-info ref="proposalInfoRef">
<div v-if="showApprovalForm">
<div class="process-title">主动附议</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(20)" size="small" type="danger">不同意</el-button>
<el-button @click="handleTaskAction(1)" size="small" type="primary">同意</el-button>
</el-row>
</div>
</proposal-info>
</template>
</guava>
</div>
<script nonce="${cspNonce!}">
<!--#include('../../common/info.js'){}#-->
new Vue({
el: "#app",
store,
mixins: [initTableMixins],
components: {
"proposal-info": PROPOSAL_INFO
},
data() {
return {
tableColumns: [
{label: "提案编号", prop: "code"},
{label: "提案名称", prop: "name", width: "200px"},
{label: "提案人", prop: "createUserName"},
{label: "提案类别", prop: "typeName"},
{label: "代表团", prop: "delegationName"},
{label: "当前节点", prop: "taskName"},
{label: "流程状态", prop: "instanceState"}
],
pageForm: {
approval: false
},
showApprovalForm: false,
sessionOptions: [],
delegationOptions: [],
row: {},
}
},
methods: {
openView(row) {
this.$refs.guava.edit(() => {
this.showApprovalForm = false
this.$refs.proposalInfoRef.onOpen(row)
})
},
async openAudit(row) {
const validatePass = await this.validateTime();
if (!validatePass) {
return;
}
this.row = row
this.$refs.guava.edit(() => {
this.showApprovalForm = true
this.formData = {
processTaskId: row.taskId,
taskName: row.curTaskName,
tf_opinion: "同意该提案"
}
this.$refs.proposalInfoRef.onOpen(row)
})
},
// 判断是否在主动附议时间内
validateTime() {
return this.$axios.post("/platform/proposal/positiveSeconded/validateTime")
.then((res) => {
if (res.code !== 0) {
this.$message.error(res.msg);
return false;
}
return true;
})
},
handleTaskAction(val) {
this.$refs.formRef.validate(valid => {
if (!valid) return
this.$confirm("您确定要提交吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.$axios.post("/platform/proposal/positiveSeconded/handle", {
proposalId: this.row.id,
opinion: this.formData.tf_opinion,
submitType: val,
}).then((res) => {
if (res.code === 0) {
this.$refs.guava.index()
this.$message.success(res.msg)
this.doSearch()
}
})
})
})
},
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()
}
})
})
},
// 教代会
async meetingChange(val) {
this.formData.delegationId = null
this.formData.committeeId = null
this.doSearch()
this.listDelegation()
},
// 查询开启的教代会
listOpenSession() {
this.$axios.post("/platform/proposal/common/listOpenSession").then((res) => {
if (res.code === 0) {
this.sessionOptions = res.data
if (this.sessionOptions) {
this.$set(this.pageForm, "sessionId", this.sessionOptions[0].id)
this.pageData()
this.listDelegation()
}
}
})
},
listDelegation() {
this.$axios.post("/platform/proposal/common/listDelegation", {sessionId: this.pageForm.sessionId}).then((res) => {
if (res.code === 0) {
this.delegationOptions = res.data
}
})
},
},
created() {
this.pageData()
this.listOpenSession()
this.listDelegation()
}
})
</script>
<!--#
}
#-->
@@ -116,6 +116,7 @@ layout("/layouts/platform.html"){
showApprovalForm: false, showApprovalForm: false,
sessionOptions: [], sessionOptions: [],
delegationOptions: [], delegationOptions: [],
row: {},
} }
}, },
methods: { methods: {
@@ -126,6 +127,7 @@ layout("/layouts/platform.html"){
}) })
}, },
openAudit(row) { openAudit(row) {
this.row = row
this.$refs.guava.edit(() => { this.$refs.guava.edit(() => {
this.showApprovalForm = true this.showApprovalForm = true
this.formData = { this.formData = {
@@ -155,12 +157,22 @@ layout("/layouts/platform.html"){
this.$refs.guava.index() this.$refs.guava.index()
this.$message.success(res.msg) this.$message.success(res.msg)
this.doSearch() this.doSearch()
this.updateSecond(val)
} }
}) })
}) })
}) })
}, },
updateSecond(submitType) {
this.$axios.post("/platform/proposal/seconded/updateInfo", {
proposalId: this.row.id,
taskActorUserId: this.row.taskActorUserId,
opinion: this.formData.tf_opinion,
submitType: submitType,
})
},
onRevoke(row) { onRevoke(row) {
this.$confirm("您确定要撤回吗?", "提示", { this.$confirm("您确定要撤回吗?", "提示", {
confirmButtonText: "确定", confirmButtonText: "确定",
@@ -5,162 +5,160 @@ layout("/layouts/platform.html"){
<style></style> <style></style>
<div id="app" v-cloak> <div id="app" v-cloak>
<template> <custom-card>
<el-card shadow="never"> <snaker-start slot="header" label="撰写提案" define_key="JDHTA"></snaker-start>
<snaker-start slot="header" label="撰写提案" define_key="JDHTA"></snaker-start>
<template>
<el-form :model="formData" :rules="formRules" label-width="120px" ref="addForm">
<el-row :gutter="20" type="flex">
<el-col :span="12">
<el-form-item label="代表姓名" prop="createUserName">
<el-input readonly v-model="formData.createUserName" disabled></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="提案时间" prop="createTime">
<el-input readonly v-model="formData.createTime" disabled></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20" type="flex"> <el-form :model="formData" :rules="formRules" label-width="120px" ref="addForm">
<el-col :span="12"> <el-row :gutter="20" type="flex">
<el-form-item label="所属教代会" prop="sessionId"> <el-col :span="12">
<el-select <el-form-item label="代表姓名" prop="createUserName">
@change="meetingChange" <el-input readonly v-model="formData.createUserName" disabled></el-input>
clearable </el-form-item>
filterable </el-col>
placeholder="所属教代会" <el-col :span="12">
v-model="formData.sessionId" <el-form-item label="提案时间" prop="createTime">
style="width: 100%" <el-input readonly v-model="formData.createTime" disabled></el-input>
> </el-form-item>
<el-option :key="item.id" :label="item.fullName" :value="item.id" </el-col>
v-for="item in sessionOptions"></el-option> </el-row>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12"> <el-row :gutter="20" type="flex">
<el-form-item label="所属代表团" prop="delegationId"> <el-col :span="12">
<el-select clearable filterable placeholder="所属代表团" v-model="formData.delegationId" <el-form-item label="所属教代会" prop="sessionId">
style="width: 100%" disabled> <el-select
<el-option :key="item.id" :label="item.name" :value="item.id" @change="meetingChange"
v-for="item in delegationOptions"></el-option> clearable
</el-select> filterable
</el-form-item> placeholder="请选择所属教代会"
v-model="formData.sessionId"
<el-form-item label="所属委员会" prop="committeeId" v-if="formData.mannerCode=='W03'"> style="width: 100%"
<el-select clearable filterable placeholder="所属委员会" v-model="formData.committeeId" >
style="width: 100%"> <el-option :key="item.id" :label="item.fullName" :value="item.id"
<el-option :key="item.id" :label="item.name" :value="item.id" v-for="item in sessionOptions"></el-option>
v-for="item in committeeOptions"></el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="单位" prop="unitName">
<el-input v-model="formData.unitName" disabled></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="联系电话" prop="mobile">
<el-input v-model="formData.mobile" clearable placeholder="联系电话"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20" type="flex">
<el-col :span="12">
<el-form-item label="提案名称" prop="name">
<el-input maxlength="100" placeholder="提案名称" v-model="formData.name"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="提案方式" prop="source">
<el-select v-model="formData.source" style="width: 100%">
<el-option :key="item.code" :label="item.name" :value="item.code"
v-for="item in sourceOptions"></el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20" type="flex">
<el-col :span="12">
<el-form-item label="提案类别" prop="typeId">
<el-select v-model="formData.typeId" style="width: 100%">
<el-option :key="item.code" :label="item.name" :value="item.id"
v-for="item in typeOptions"></el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
<!-- <el-form-item label="提案摘要" prop="excerpt">-->
<!-- <span slot="label">-->
<!-- 提案摘要-->
<!-- <el-tooltip content="请简述提案内容和依据、改进建议和措施摘要" placement="right">-->
<!-- <i class="el-icon-question"></i>-->
<!-- </el-tooltip>-->
<!-- </span>-->
<!-- <el-input-->
<!-- v-model="formData.excerpt"-->
<!-- type="textarea"-->
<!-- autosize-->
<!-- :autosize="{ minRows: 4, maxRows: 4}"-->
<!-- placeholder="提案摘要"-->
<!-- ></el-input>-->
<!-- </el-form-item>-->
<!-- <el-form-item label="调研情况" prop="researchFindings">-->
<!-- <el-input-->
<!-- v-model="formData.researchFindings"-->
<!-- type="textarea"-->
<!-- autosize-->
<!-- :autosize="{ minRows: 4, maxRows: 4}"-->
<!-- placeholder="调研情况"-->
<!-- ></el-input>-->
<!-- </el-form-item>-->
<el-form-item label="建议承办单位" prop="suggestUnits">
<el-select v-model="formData.suggestUnits" multiple filterable style="width: 100%"
placeholder="请选择建议承办单位">
<el-option :key="item.id" :label="item.name" :value="item.name"
v-for="item in suggestUnitOptions"></el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="案由" prop="brief"> </el-col>
<text-editor v-model="formData.brief" key="brief" placeholder="案由"></text-editor>
</el-form-item> <el-col :span="12">
<el-form-item label="建议措施" prop="measures"> <el-form-item label="所属代表团" prop="delegationId">
<text-editor v-model="formData.measures" key="measures" <el-select clearable filterable placeholder="请选择所属代表团" v-model="formData.delegationId"
placeholder="建议措施"></text-editor> style="width: 100%" disabled>
</el-form-item> <el-option :key="item.id" :label="item.name" :value="item.id"
<el-form-item label="附件上传" prop="files"> v-for="item in delegationOptions"></el-option>
<file-upload </el-select>
:value.sync="formData.files"
:upload_number="5"
upload_result_category="array"
upload_mode="drag"
complete_result
></file-upload>
</el-form-item> </el-form-item>
<!-- <el-form-item label="电子签名" prop="signature">--> <el-form-item label="所属委员会" prop="committeeId" v-if="formData.mannerCode=='W03'">
<!-- <pc-signature v-model="formData.signature"></pc-signature>--> <el-select clearable filterable placeholder="请选择所属委员会" v-model="formData.committeeId"
<!-- </el-form-item>--> style="width: 100%">
</el-form> <el-option :key="item.id" :label="item.name" :value="item.id"
<el-row justify="end" type="flex" v-if="isWriteTime"> v-for="item in committeeOptions"></el-option>
<el-button type="primary" @click="onSave">保存</el-button> </el-select>
<el-button type="primary" @click="onSubmit" v-if="!taskId">提交</el-button> </el-form-item>
<el-button type="primary" @click="onSubmitAgain" v-else>提交</el-button> </el-col>
</el-row> </el-row>
</template>
</el-card> <el-row :gutter="20">
</template> <el-col :span="12">
<el-form-item label="单位" prop="unitName">
<el-input v-model="formData.unitName" disabled></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="联系电话" prop="mobile">
<el-input v-model="formData.mobile" clearable placeholder="请输入联系电话"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20" type="flex">
<el-col :span="12">
<el-form-item label="提案名称" prop="name">
<el-input maxlength="100" placeholder="请输入提案名称" v-model="formData.name"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="提案方式" prop="source">
<el-select v-model="formData.source" style="width: 100%" placeholder="请选择提案方式">
<el-option :key="item.code" :label="item.name" :value="item.code"
v-for="item in sourceOptions"></el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20" type="flex">
<el-col :span="12">
<el-form-item label="提案类别" prop="typeId">
<el-select v-model="formData.typeId" style="width: 100%" placeholder="请选择提案类别">
<el-option :key="item.code" :label="item.name" :value="item.id"
v-for="item in typeOptions"></el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
<!-- <el-form-item label="提案摘要" prop="excerpt">-->
<!-- <span slot="label">-->
<!-- 提案摘要-->
<!-- <el-tooltip content="请简述提案内容和依据、改进建议和措施摘要" placement="right">-->
<!-- <i class="el-icon-question"></i>-->
<!-- </el-tooltip>-->
<!-- </span>-->
<!-- <el-input-->
<!-- v-model="formData.excerpt"-->
<!-- type="textarea"-->
<!-- autosize-->
<!-- :autosize="{ minRows: 4, maxRows: 4}"-->
<!-- placeholder="提案摘要"-->
<!-- ></el-input>-->
<!-- </el-form-item>-->
<!-- <el-form-item label="调研情况" prop="researchFindings">-->
<!-- <el-input-->
<!-- v-model="formData.researchFindings"-->
<!-- type="textarea"-->
<!-- autosize-->
<!-- :autosize="{ minRows: 4, maxRows: 4}"-->
<!-- placeholder="调研情况"-->
<!-- ></el-input>-->
<!-- </el-form-item>-->
<el-form-item label="建议承办单位" prop="suggestUnits">
<el-select v-model="formData.suggestUnits" multiple filterable style="width: 100%"
placeholder="请选择建议承办单位">
<el-option :key="item.id" :label="item.name" :value="item.name"
v-for="item in suggestUnitOptions"></el-option>
</el-select>
</el-form-item>
<el-form-item label="案由" prop="brief">
<text-editor v-model="formData.brief" key="brief" placeholder="请输入案由"></text-editor>
</el-form-item>
<el-form-item label="建议措施" prop="measures">
<text-editor v-model="formData.measures" key="measures"
placeholder="请输入建议措施"></text-editor>
</el-form-item>
<el-form-item label="附件上传" prop="files">
<file-upload
:value.sync="formData.files"
:upload_number="5"
upload_result_category="array"
upload_mode="drag"
complete_result
></file-upload>
</el-form-item>
<!-- <el-form-item label="电子签名" prop="signature">-->
<!-- <pc-signature v-model="formData.signature"></pc-signature>-->
<!-- </el-form-item>-->
</el-form>
<template slot="footer" v-if="isWriteTime">
<el-button type="primary" @click="onSave">保存</el-button>
<el-button type="primary" @click="onSubmit" v-if="!taskId">提交</el-button>
<el-button type="primary" @click="onSubmitAgain" v-else>提交</el-button>
</template>
</custom-card>
<el-dialog title="提案撰写须知" :visible.sync="noticeDialogVisible" :show-close="false" width="50%"> <el-dialog title="提案撰写须知" :visible.sync="noticeDialogVisible" :show-close="false" width="50%">
<div v-html="proposalConfig.writeRemind" style="max-height: 50vh; overflow-y: auto"></div> <div v-html="proposalConfig.writeRemind" style="max-height: 50vh; overflow-y: auto"></div>
@@ -108,17 +108,38 @@ const PROPOSAL_INFO = {
<van-cell title="办理时间">{{ task.finishTime }}</van-cell> <van-cell title="办理时间">{{ task.finishTime }}</van-cell>
<van-cell title="附议人" v-if="task.taskName === 'invite'" <van-cell title="附议人" v-if="task.taskName === 'invite'"
class="direction-column-cell"> class="direction-column-cell">
<el-table :data="task?.taskFormData?.seconder"> <el-table :data="task?.taskFormData?.seconder" size="mini" border>
<el-table-column label="姓名" prop="userName"></el-table-column> <el-table-column label="姓名" prop="userName"></el-table-column>
<el-table-column label="工号" prop="loginName"></el-table-column>
<el-table-column label="性别" prop="sex"></el-table-column>
<el-table-column label="单位" prop="unitName" show-overflow-tooltip></el-table-column> <el-table-column label="单位" prop="unitName" show-overflow-tooltip></el-table-column>
<el-table-column label="分工会" prop="unionName"
show-overflow-tooltip></el-table-column>
<el-table-column label="代表团" prop="delegationName" <el-table-column label="代表团" prop="delegationName"
show-overflow-tooltip></el-table-column> show-overflow-tooltip></el-table-column>
<el-table-column label="附议模式" prop="mode">
<template slot-scope="{ row }">
<el-tag size="mini" type="primary">邀请附议</el-tag>
</template>
</el-table-column>
</el-table> </el-table>
</van-cell> </van-cell>
<van-cell title="主动附议" v-if="task.taskName === 'invite'"
class="direction-column-cell">
<el-table v-if="positiveSecondList.length > 0" :data="positiveSecondList" size="mini" border>
<el-table-column label="姓名" prop="userName" show-overflow-tooltip></el-table-column>
<el-table-column label="附议时间" prop="secondedTime" show-overflow-tooltip></el-table-column>
<el-table-column label="附议结果" prop="isAgree">
<template slot-scope="{ row }">
<el-tag v-if="row.isAgree === true" size="mini" type="success">同意</el-tag>
<el-tag v-else size="mini" type="danger">不同意</el-tag>
</template>
</el-table-column>
<el-table-column label="意见" prop="opinion" show-overflow-tooltip></el-table-column>
<el-table-column label="附议模式" prop="mode">
<template slot-scope="{ row }">
<el-tag size="mini" type="primary">主动附议</el-tag>
</template>
</el-table-column>
</el-table>
<span v-else>暂无主动附议信息</span>
</van-cell>
</van-cell-group> </van-cell-group>
<!--提案委员会立案--> <!--提案委员会立案-->
@@ -179,6 +200,7 @@ const PROPOSAL_INFO = {
doneTasks: [], doneTasks: [],
row: null, row: null,
originalRow: null, // 用于保存原始数据,支持返回功能 originalRow: null, // 用于保存原始数据,支持返回功能
positiveSecondList: [],
} }
}, },
methods: { methods: {
@@ -188,6 +210,7 @@ const PROPOSAL_INFO = {
this.visible = true this.visible = true
this.getInfo() this.getInfo()
this.getDoneTasks() this.getDoneTasks()
this.listPositiveSeconded()
}, },
// 关闭 // 关闭
@@ -236,5 +259,14 @@ const PROPOSAL_INFO = {
} }
}) })
}, },
// 获取主动附议信息
listPositiveSeconded() {
this.$axios.post("/platform/proposal/positiveSeconded/listPositiveSeconded", {bizId: this.row.id}).then((res) => {
if (res.code === 0) {
this.positiveSecondList = res.data
}
})
},
} }
}; };
@@ -0,0 +1,222 @@
<!--#
layout("/layouts/platform_h5.html"){
#-->
<div id="app" v-cloak>
<van-nav-bar @click-left="historyBack" left-arrow left-text="返回" title="主动附议" placeholder fixed></van-nav-bar>
<van-sticky offset-top="46px">
<van-search
v-model="pageForm.name"
:show-action="false"
:reverse-color="false"
input-align="left"
placeholder="请输入提案名称搜索"
@search="doSearch"
></van-search>
<van-dropdown-menu :close-on-click-outside="false" :close-on-click-overlay="false">
<van-dropdown-item v-model="pageForm.sessionId" :options="sessionOptions" :multiple="false"
@change="sessionChange"></van-dropdown-item>
<van-dropdown-item
v-model="pageForm.delegationId"
:options="delegationOptions"
@change="doSearch"
></van-dropdown-item>
</van-dropdown-menu>
<van-tabs v-model="pageForm.approvalText"
@change="(val)=>{this.pageForm.approval = val==='1';this.doSearch();}">
<van-tab title="已附议" name="1"></van-tab>
<van-tab title="未附议" name="0"></van-tab>
</van-tabs>
</van-sticky>
<table-list api="/platform/proposal/positiveSeconded/pageData" :page_form.sync="pageForm" @ready="onReady"
ref="tableListRef"
title="name">
<template v-slot="{index,row}">
<table-column label="提案编号">{{row.code}}</table-column>
<table-column label="提案类别">{{row.typeName}}</table-column>
<table-column label="提案人">{{row.createUserName}}</table-column>
<table-column label="代表团">{{row.delegationName}}</table-column>
<table-column label="当前节点">{{row.curTaskName}}</table-column>
</template>
<template #actions="{index,row}">
<div class="action-btn" @click="onView(row)">
<i class="fa fa-eye"></i>
<span>查看</span>
</div>
<div class="action-btn" v-if="row.count === 0" @click="onApproval(row)">
<i class="fa fa-edit"></i>
<span>附议</span>
</div>
</template>
</table-list>
<proposal-info ref="proposalInfoRef">
<div v-if="showApprovalForm">
<div class="process-title">主动附议</div>
<van-form ref="formRef">
<van-field
v-model="formData.tf_opinion"
name="tf_opinion"
label="审批意见"
placeholder="请输入审批意见"
:rules="[{ required: true, message: '请填写审批意见' }]"
required
maxlength="100"
show-word-limit
></van-field>
</van-form>
<div style="display: flex; justify-content: space-between; column-gap: 10px; padding: 10px">
<van-button type="danger" block @click="handleTaskAction(20)">不同意</van-button>
<van-button type="primary" block @click="handleTaskAction(1)">同意</van-button>
</div>
</div>
</proposal-info>
</div>
<script nonce="${cspNonce!}">
<!--#include("../../common/info.js"){}#-->
const vue = new Vue({
el: "#app",
store,
data() {
return {
pageForm: {
pageNumber: 1,
pageSize: 10,
totalCount: 0,
name: null,
sessionId: null,
approvalText: "0",
approval: false,
delegationId: null,
},
sessionOptions: [],
delegationOptions: [
{
text: "全部代表团",
value: null
}
],
formData: {},
showApprovalForm: false,
rules: {
approvalSignature: [{required: true, message: "请签字"}]
},
row: {},
}
},
components: {
"proposal-info": PROPOSAL_INFO
},
methods: {
onReady() {
this.listSession()
},
sessionChange(val) {
this.pageForm.delegationId = null
if (this.pageForm.sessionId) {
this.listDelegation()
} else {
this.delegationOptions = [
{
text: "全部代表团",
value: null
}
]
}
this.doSearch()
},
listDelegation() {
this.$axios.post("/platform/proposal/common/listDelegation", { sessionId: this.pageForm.sessionId }).then((res) => {
if (res.code === 0) {
this.delegationOptions = [
{
text: "全部代表团",
value: null
}
].concat(res.data.map((v) => ({ text: v.name, value: v.id })))
}
})
},
listSession() {
this.$axios.post("/platform/proposal/common/listSession").then((res) => {
if (res.code === 0) {
this.sessionOptions = res.data.map((v) => ({text: v.fullName, value: v.id}))
if (this.sessionOptions.length > 0) {
this.pageForm.sessionId = this.sessionOptions[0].value
this.doSearch()
this.listDelegation()
}
}
})
},
onView(row) {
this.showApprovalForm = false
this.$refs.proposalInfoRef.onOpen(row)
},
async onApproval(row) {
const validatePass = await this.validateTime();
if (!validatePass) {
return;
}
this.row = row
this.showApprovalForm = true
this.$refs.proposalInfoRef.onOpen(row)
this.formData = {
processTaskId: row.taskId,
taskName: row.curTaskName,
tf_opinion: "同意该提案"
}
},
// 判断是否在主动附议时间内
validateTime() {
return this.$axios.post("/platform/proposal/positiveSeconded/validateTime")
.then((res) => {
if (res.code !== 0) {
this.$toast(res.msg);
return false;
}
return true;
})
},
async handleTaskAction(val) {
try {
await this.$refs.formRef.validate();
this.$dialog.confirm({
title: "提示",
message: "您确定要提交吗?"
}).then(() => {
this.$axios.post("/platform/proposal/positiveSeconded/handle", {
proposalId: this.row.id,
opinion: this.formData.tf_opinion,
submitType: val,
}).then((res) => {
if (res.code === 0) {
this.$refs.proposalInfoRef.onClose()
this.$toast.success(res.msg)
this.doSearch()
}
})
}).catch(() => {})
} catch (error) {}
},
doSearch() {
this.$nextTick(() => {
this.pageForm.pageNumber = 1
this.pageForm.totalCount = 0
this.$refs.tableListRef.doSearch()
})
},
}
})
</script>
<!--#
}
#-->
@@ -98,7 +98,8 @@ layout("/layouts/platform_h5.html"){
showApprovalForm: false, showApprovalForm: false,
rules: { rules: {
approvalSignature: [{required: true, message: "请签字"}] approvalSignature: [{required: true, message: "请签字"}]
} },
row: {},
} }
}, },
components: { components: {
@@ -131,6 +132,7 @@ layout("/layouts/platform_h5.html"){
}, },
onApproval(row) { onApproval(row) {
this.row = row
this.showApprovalForm = true this.showApprovalForm = true
this.$refs.proposalInfoRef.onOpen(row) this.$refs.proposalInfoRef.onOpen(row)
this.formData = { this.formData = {
@@ -157,6 +159,7 @@ layout("/layouts/platform_h5.html"){
this.$refs.proposalInfoRef.onClose() this.$refs.proposalInfoRef.onClose()
this.$toast.success(res.msg) this.$toast.success(res.msg)
this.doSearch() this.doSearch()
this.updateSecond(val)
} }
}) })
}).catch(() => { }).catch(() => {
@@ -167,6 +170,15 @@ layout("/layouts/platform_h5.html"){
} }
}, },
updateSecond(submitType) {
this.$axios.post("/platform/proposal/seconded/updateInfo", {
proposalId: this.row.id,
taskActorUserId: this.row.taskActorUserId,
opinion: this.formData.tf_opinion,
submitType: submitType,
})
},
doSearch() { doSearch() {
this.$nextTick(() => { this.$nextTick(() => {
this.pageForm.pageNumber = 1 this.pageForm.pageNumber = 1