Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
637fe6f838 | ||
|
|
4f85bb08e2 |
@@ -19,6 +19,7 @@ RoleConstant {
|
|||||||
SCHOOL_UNION_ADMIN("校工会管理员"),
|
SCHOOL_UNION_ADMIN("校工会管理员"),
|
||||||
SCHOOL_UNION_CHAIRMAN("校工会主席"),
|
SCHOOL_UNION_CHAIRMAN("校工会主席"),
|
||||||
SCHOOL_UNION_VICE_CHAIRMAN("校工会副主席"),
|
SCHOOL_UNION_VICE_CHAIRMAN("校工会副主席"),
|
||||||
|
SCHOOL_UNION_FINANCE("校工会财务"),
|
||||||
SCHOOL_OFFICE_DIRECTOR("校工会办公室主任"),
|
SCHOOL_OFFICE_DIRECTOR("校工会办公室主任"),
|
||||||
SCHOOL_UNION_WELFARE_ADMIN("校工会福利管理员"),
|
SCHOOL_UNION_WELFARE_ADMIN("校工会福利管理员"),
|
||||||
SCHOOL_UNION_MEMBER_ADMIN("校工会会员管理员"),
|
SCHOOL_UNION_MEMBER_ADMIN("校工会会员管理员"),
|
||||||
|
|||||||
@@ -0,0 +1,54 @@
|
|||||||
|
package com.budwk.app.flow.handler;
|
||||||
|
|
||||||
|
import com.budwk.app.base.constant.RoleConstant;
|
||||||
|
import com.budwk.app.flow.engine.AssignmentHandler;
|
||||||
|
import com.budwk.app.flow.engine.core.Execution;
|
||||||
|
import com.budwk.app.flow.engine.core.ServiceContext;
|
||||||
|
import com.budwk.app.flow.engine.model.TaskModel;
|
||||||
|
import org.nutz.dao.Dao;
|
||||||
|
import org.nutz.dao.Sqls;
|
||||||
|
import org.nutz.dao.sql.Sql;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 为流程任务分配拥有校工会财务角色的用户。
|
||||||
|
*/
|
||||||
|
public class FlowSchoolUnionFinanceHandler implements AssignmentHandler {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 按校工会财务角色查询参与者,并去除重复的用户 ID。
|
||||||
|
*
|
||||||
|
* @param model 当前流程任务模型,无需额外传入人员参数
|
||||||
|
* @param execution 当前流程执行上下文,无需额外传入业务参数
|
||||||
|
* @return 用户 ID 列表;未配置角色或角色用户时返回空列表
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public List<String> assign(TaskModel model, Execution execution) {
|
||||||
|
Dao dao = ServiceContext.find(Dao.class);
|
||||||
|
Sql sql = Sqls.create("""
|
||||||
|
SELECT
|
||||||
|
userRole.userId
|
||||||
|
FROM
|
||||||
|
`sys_user_role` userRole
|
||||||
|
LEFT JOIN sys_role role ON role.id = userRole.roleId
|
||||||
|
WHERE
|
||||||
|
role.`code` = @roleCode
|
||||||
|
GROUP BY
|
||||||
|
userRole.userId
|
||||||
|
""").setParam("roleCode", RoleConstant.SCHOOL_UNION_FINANCE.name());
|
||||||
|
sql.setCallback(Sqls.callback.strList());
|
||||||
|
dao.execute(sql);
|
||||||
|
return sql.getList(String.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 返回流程设计器中展示的参与者处理类名称。
|
||||||
|
*
|
||||||
|
* @return 流程设计器下拉选项名称
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public String getMessage() {
|
||||||
|
return "获取校工会财务";
|
||||||
|
}
|
||||||
|
}
|
||||||
+7
-3
@@ -229,14 +229,18 @@ public class ProposalMineController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 删除当前用户可删除的提案。
|
||||||
|
*
|
||||||
|
* @param id 提案 ID;仅允许删除本人未发起流程或退回发起节点的提案
|
||||||
|
* @return Result,成功时返回成功结果,不满足删除条件时返回原因
|
||||||
|
*/
|
||||||
@At
|
@At
|
||||||
@SaCheckPermission("proposal.mine")
|
@SaCheckPermission("proposal.mine")
|
||||||
@Aop(TransAop.READ_COMMITTED)
|
@Aop(TransAop.READ_COMMITTED)
|
||||||
@SLog(tag = "提案管理系统-我的提案", msg = "删除提案")
|
@SLog(tag = "提案管理系统-我的提案", msg = "删除提案")
|
||||||
public Result delete(@Valid String id) {
|
public Result delete(@Valid String id) {
|
||||||
dao.delete(ProposalInfo.class, id);
|
return proposalCommonService.deleteMine(id, SecurityUtil.getUserId());
|
||||||
flowEngine.processInstanceService().deleteProcessInstanceByBusinessKey(id);
|
|
||||||
return Result.success();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@At
|
@At
|
||||||
|
|||||||
+10
@@ -3,6 +3,7 @@ package com.budwk.app.zhgh.democratic.proposal.service.common;
|
|||||||
import com.budwk.app.base.service.BaseService;
|
import com.budwk.app.base.service.BaseService;
|
||||||
import com.budwk.app.base.param.PageForm;
|
import com.budwk.app.base.param.PageForm;
|
||||||
import com.budwk.app.base.param.ExportTableColumns;
|
import com.budwk.app.base.param.ExportTableColumns;
|
||||||
|
import com.budwk.app.base.result.Result;
|
||||||
import com.budwk.app.zhgh.democratic.proposal.models.ProposalInfo;
|
import com.budwk.app.zhgh.democratic.proposal.models.ProposalInfo;
|
||||||
import com.budwk.app.zhgh.democratic.proposal.models.ProposalUndertake;
|
import com.budwk.app.zhgh.democratic.proposal.models.ProposalUndertake;
|
||||||
import com.budwk.app.zhgh.democratic.proposal.param.ProposalQueryComprehensiveParam;
|
import com.budwk.app.zhgh.democratic.proposal.param.ProposalQueryComprehensiveParam;
|
||||||
@@ -19,6 +20,15 @@ import java.util.Set;
|
|||||||
|
|
||||||
public interface ProposalCommonService extends BaseService<ProposalInfo> {
|
public interface ProposalCommonService extends BaseService<ProposalInfo> {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 删除当前用户尚未发起流程或已退回发起节点的提案。
|
||||||
|
*
|
||||||
|
* @param id 待删除的提案 ID
|
||||||
|
* @param userId 当前登录用户 ID,用于核对提案创建人
|
||||||
|
* @return Result,删除成功返回 success;提案不存在、非本人或流程不允许删除时返回错误信息
|
||||||
|
*/
|
||||||
|
Result deleteMine(String id, String userId);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 按页面允许的字段白名单添加排序条件,避免前端字段直接进入SQL。
|
* 按页面允许的字段白名单添加排序条件,避免前端字段直接进入SQL。
|
||||||
*
|
*
|
||||||
|
|||||||
+42
@@ -17,6 +17,7 @@ import com.budwk.app.base.exception.BaseException;
|
|||||||
import com.budwk.app.base.param.ExportTableColumns;
|
import com.budwk.app.base.param.ExportTableColumns;
|
||||||
import com.budwk.app.base.param.PageForm;
|
import com.budwk.app.base.param.PageForm;
|
||||||
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.service.impl.BaseServiceImpl;
|
import com.budwk.app.base.service.impl.BaseServiceImpl;
|
||||||
import com.budwk.app.base.utils.CommonDownloadUtil;
|
import com.budwk.app.base.utils.CommonDownloadUtil;
|
||||||
import com.budwk.app.base.utils.PageUtil;
|
import com.budwk.app.base.utils.PageUtil;
|
||||||
@@ -52,6 +53,7 @@ import com.deepoove.poi.config.Configure;
|
|||||||
import com.deepoove.poi.plugin.table.LoopRowTableRenderPolicy;
|
import com.deepoove.poi.plugin.table.LoopRowTableRenderPolicy;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.ddr.poi.html.HtmlRenderPolicy;
|
import org.ddr.poi.html.HtmlRenderPolicy;
|
||||||
|
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.FieldFilter;
|
import org.nutz.dao.FieldFilter;
|
||||||
@@ -62,6 +64,7 @@ import org.nutz.dao.util.cri.SqlExpressionGroup;
|
|||||||
import org.nutz.dao.util.cri.Static;
|
import org.nutz.dao.util.cri.Static;
|
||||||
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.ioc.aop.Aop;
|
||||||
import org.nutz.json.Json;
|
import org.nutz.json.Json;
|
||||||
import org.nutz.lang.Lang;
|
import org.nutz.lang.Lang;
|
||||||
import org.nutz.lang.Strings;
|
import org.nutz.lang.Strings;
|
||||||
@@ -184,6 +187,45 @@ public class ProposalCommonServiceImpl extends BaseServiceImpl<ProposalInfo> imp
|
|||||||
super(dao);
|
super(dao);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 仅允许创建人删除草稿或退回发起节点的提案,并清理其 WF 流程。
|
||||||
|
*
|
||||||
|
* @param id 待删除的提案 ID
|
||||||
|
* @param userId 当前登录用户 ID,用于核对提案创建人
|
||||||
|
* @return Result,删除成功返回 success;提案不存在、非本人或流程不允许删除时返回错误信息
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
@Aop(TransAop.READ_COMMITTED)
|
||||||
|
public Result deleteMine(String id, String userId) {
|
||||||
|
if (StrUtil.isBlank(id) || StrUtil.isBlank(userId)) {
|
||||||
|
return Result.error("提案不存在或无权删除");
|
||||||
|
}
|
||||||
|
ProposalInfo proposal = dao().fetch(ProposalInfo.class, id);
|
||||||
|
if (proposal == null || !Objects.equals(proposal.getCreatedBy(), userId)) {
|
||||||
|
return Result.error("提案不存在或无权删除");
|
||||||
|
}
|
||||||
|
|
||||||
|
List<ProcessInstance> instances = dao().query(ProcessInstance.class,
|
||||||
|
Cnd.where(ProcessInstance::getBusinessNo, "=", id));
|
||||||
|
// 一个提案出现多个流程实例时无法安全判断当前节点,拒绝删除并保留数据。
|
||||||
|
if (instances.size() > 1) {
|
||||||
|
return Result.error("提案流程数据异常,无法删除");
|
||||||
|
}
|
||||||
|
if (!instances.isEmpty()) {
|
||||||
|
ProcessInstance instance = instances.get(0);
|
||||||
|
List<ProcessTask> tasks = flowEngine.processTaskService().getDoingTaskList(instance.getId(), null);
|
||||||
|
// 存在并行任务时,只有所有活动任务均位于发起节点才允许删除。
|
||||||
|
if (!Objects.equals(instance.getState(), ProcessInstanceStateEnum.DOING.getCode())
|
||||||
|
|| tasks.isEmpty() || tasks.stream().anyMatch(task -> !Objects.equals(task.getTaskName(), "startTask"))) {
|
||||||
|
return Result.error("仅未提交或退回发起节点的提案可以删除");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
dao().delete(ProposalInfo.class, id);
|
||||||
|
flowEngine.processInstanceService().deleteProcessInstanceByBusinessKey(id);
|
||||||
|
return Result.success();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 分页查询提案综合列表。
|
* 分页查询提案综合列表。
|
||||||
* 普通查询不关联历史任务表;仅在 origins 包含 answer 且 commonKeyword 非空时,
|
* 普通查询不关联历史任务表;仅在 origins 包含 answer 且 commonKeyword 非空时,
|
||||||
|
|||||||
+2
-2
@@ -101,7 +101,7 @@ public class TeacherCongressInstitutionUserServiceImpl extends BaseServiceImpl<T
|
|||||||
if (identity.equals("主任")) {
|
if (identity.equals("主任")) {
|
||||||
sysRole = sysRoleService.getByCode(RoleConstant.TEACHER_CONGRESS_PREPARATION_LEADERSHIP_GROUP_DIRECTOR);
|
sysRole = sysRoleService.getByCode(RoleConstant.TEACHER_CONGRESS_PREPARATION_LEADERSHIP_GROUP_DIRECTOR);
|
||||||
|
|
||||||
} else if (identity.equals("成员")) {
|
} else if (identity.equals("委员")) {
|
||||||
sysRole = sysRoleService.getByCode(RoleConstant.TEACHER_CONGRESS_PREPARATION_LEADERSHIP_GROUP_MEMBER);
|
sysRole = sysRoleService.getByCode(RoleConstant.TEACHER_CONGRESS_PREPARATION_LEADERSHIP_GROUP_MEMBER);
|
||||||
}
|
}
|
||||||
if (sysRole == null) {
|
if (sysRole == null) {
|
||||||
@@ -148,7 +148,7 @@ public class TeacherCongressInstitutionUserServiceImpl extends BaseServiceImpl<T
|
|||||||
if (institutionUser.getIdentity().equals("主任")) {
|
if (institutionUser.getIdentity().equals("主任")) {
|
||||||
sysRole = sysRoleService.getByCode(RoleConstant.TEACHER_CONGRESS_PREPARATION_LEADERSHIP_GROUP_DIRECTOR);
|
sysRole = sysRoleService.getByCode(RoleConstant.TEACHER_CONGRESS_PREPARATION_LEADERSHIP_GROUP_DIRECTOR);
|
||||||
|
|
||||||
} else if (institutionUser.getIdentity().equals("成员")) {
|
} else if (institutionUser.getIdentity().equals("委员")) {
|
||||||
sysRole = sysRoleService.getByCode(RoleConstant.TEACHER_CONGRESS_PREPARATION_LEADERSHIP_GROUP_MEMBER);
|
sysRole = sysRoleService.getByCode(RoleConstant.TEACHER_CONGRESS_PREPARATION_LEADERSHIP_GROUP_MEMBER);
|
||||||
}
|
}
|
||||||
if (sysRole == null) {
|
if (sysRole == null) {
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ nutz:
|
|||||||
ignore: ^(.+[.])(jsp|png|gif|jpg|js|css|jspx|jpeg|html|mp3|mp4|ico|svg|vue)$
|
ignore: ^(.+[.])(jsp|png|gif|jpg|js|css|jspx|jpeg|html|mp3|mp4|ico|svg|vue)$
|
||||||
exclusions: /favicon/*,/assets/*,/druid/*,/upload/*,/components/*
|
exclusions: /favicon/*,/assets/*,/druid/*,/upload/*,/components/*
|
||||||
server:
|
server:
|
||||||
port: 8081
|
port: 80
|
||||||
host: 0.0.0.0
|
host: 0.0.0.0
|
||||||
|
|
||||||
jetty:
|
jetty:
|
||||||
@@ -21,7 +21,7 @@ jetty:
|
|||||||
#结合ftp使用,或用nginx代理ftp路径
|
#结合ftp使用,或用nginx代理ftp路径
|
||||||
#staticPath: /Users/wizzer/temp/files
|
#staticPath: /Users/wizzer/temp/files
|
||||||
#开发模式静态资源
|
#开发模式静态资源
|
||||||
staticPathLocal: D:/myProject/zhgh_cqgmy/src/main/resources/static
|
staticPathLocal: E:/projects/zhgh_cqgmy/src/main/resources/static
|
||||||
|
|
||||||
security:
|
security:
|
||||||
tokenName: saToken
|
tokenName: saToken
|
||||||
@@ -87,7 +87,7 @@ xsssql:
|
|||||||
beetl:
|
beetl:
|
||||||
RESOURCE:
|
RESOURCE:
|
||||||
#本地路径,开发时设置本地路径,便于调试
|
#本地路径,开发时设置本地路径,便于调试
|
||||||
rootLocal: D:/myProject/zhgh_cqgmy/src/main/resources/views/
|
rootLocal: E:/projects/zhgh_cqgmy/src/main/resources/views/
|
||||||
root: views/
|
root: views/
|
||||||
DELIMITER_STATEMENT_START: "<!--#"
|
DELIMITER_STATEMENT_START: "<!--#"
|
||||||
DELIMITER_STATEMENT_END: "#-->"
|
DELIMITER_STATEMENT_END: "#-->"
|
||||||
|
|||||||
@@ -10,7 +10,7 @@
|
|||||||
:finished="tableFinished"
|
:finished="tableFinished"
|
||||||
finished-text="没有更多了"
|
finished-text="没有更多了"
|
||||||
@load="onLoad">
|
@load="onLoad">
|
||||||
<div class="table-list-container">
|
<div class="table-list-container" @click="showOverflowText">
|
||||||
<div v-for="(row, index) in tableData" :key="index" class="table-list-item"
|
<div v-for="(row, index) in tableData" :key="index" class="table-list-item"
|
||||||
:data-row-id="row && row.id ? row.id : ''">
|
:data-row-id="row && row.id ? row.id : ''">
|
||||||
<slot name="header" :index="index" :row="row">
|
<slot name="header" :index="index" :row="row">
|
||||||
@@ -36,6 +36,12 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</van-list>
|
</van-list>
|
||||||
|
<van-popover ref="overflowPopover" :value="overflowVisible" :style="overflowAnchorStyle"
|
||||||
|
:placement="overflowPlacement" get-container="body" @input="onOverflowInput"
|
||||||
|
@opened="positionOverflow">
|
||||||
|
<div class="table-list-overflow-content">{{ overflowText }}</div>
|
||||||
|
<template #reference><span></span></template>
|
||||||
|
</van-popover>
|
||||||
</van-pull-refresh>
|
</van-pull-refresh>
|
||||||
</template>
|
</template>
|
||||||
<script>
|
<script>
|
||||||
@@ -90,10 +96,138 @@ module.exports = {
|
|||||||
tableLoading: false,
|
tableLoading: false,
|
||||||
tableFinished: false,
|
tableFinished: false,
|
||||||
tableRefreshing: false,
|
tableRefreshing: false,
|
||||||
localPageForm: {...this.page_form}
|
localPageForm: {...this.page_form},
|
||||||
|
overflowVisible: false,
|
||||||
|
overflowText: "",
|
||||||
|
overflowTarget: null,
|
||||||
|
overflowPlacement: "top",
|
||||||
|
overflowAnchorStyle: {}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
|
// 只响应真正被截断的纯文字,保留卡片内按钮和业务插槽原有的点击行为。
|
||||||
|
showOverflowText(event) {
|
||||||
|
const target = event.target
|
||||||
|
if (!target || !target.closest) return
|
||||||
|
const card = target.closest(".table-list-item")
|
||||||
|
if (!card || target.closest(".item-actions, a, button, input, textarea, select, [role=button], [tabindex], [onclick]")) return
|
||||||
|
if (target.children.length || !target.textContent.trim() || this.hasOverflowClickHandler(target, card)) return
|
||||||
|
const style = window.getComputedStyle(target)
|
||||||
|
if (style.textOverflow !== "ellipsis" || (target.scrollWidth <= target.clientWidth && target.scrollHeight <= target.clientHeight)) return
|
||||||
|
|
||||||
|
const rect = target.getBoundingClientRect()
|
||||||
|
this.overflowTarget = target
|
||||||
|
this.overflowText = target.textContent.trim()
|
||||||
|
this.overflowPlacement = rect.top < 180 ? "bottom" : "top"
|
||||||
|
this.overflowAnchorStyle = {
|
||||||
|
position: "fixed",
|
||||||
|
display: "block",
|
||||||
|
pointerEvents: "none",
|
||||||
|
left: rect.left + "px",
|
||||||
|
top: rect.top + "px",
|
||||||
|
width: rect.width + "px",
|
||||||
|
height: rect.height + "px"
|
||||||
|
}
|
||||||
|
if (!this.overflowVisible) this.bindOverflowListeners()
|
||||||
|
this.overflowVisible = true
|
||||||
|
this.$nextTick(() => {
|
||||||
|
const instance = this.$refs.overflowPopover
|
||||||
|
if (instance) instance.updateLocation()
|
||||||
|
setTimeout(() => this.positionOverflow(), 50)
|
||||||
|
setTimeout(() => this.positionOverflow(), 350)
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
// 检查文字及其卡片内的祖先节点,避免干扰已有 Vue 点击事件。
|
||||||
|
hasOverflowClickHandler(target, card) {
|
||||||
|
const ancestors = []
|
||||||
|
let element = target
|
||||||
|
while (element && element !== card.parentElement) {
|
||||||
|
ancestors.push(element)
|
||||||
|
element = element.parentElement
|
||||||
|
}
|
||||||
|
const visit = (node) => {
|
||||||
|
if (!node) return false
|
||||||
|
const events = node.data ? [node.data.on, node.data.nativeOn] : []
|
||||||
|
if (ancestors.includes(node.elm) && events.some((handlers) => handlers &&
|
||||||
|
Object.keys(handlers).some((key) => /^[~!&]*(click|touchstart|pointerdown|mousedown)$/.test(key)))) return true
|
||||||
|
if (node.componentInstance && visit(node.componentInstance._vnode)) return true
|
||||||
|
return Array.isArray(node.children) && node.children.some((child) => visit(child))
|
||||||
|
}
|
||||||
|
return visit(this._vnode)
|
||||||
|
},
|
||||||
|
|
||||||
|
// Vant 的弹层挂在 body;校正窗口边缘的位置,避免完整文字被屏幕裁掉。
|
||||||
|
positionOverflow() {
|
||||||
|
const instance = this.$refs.overflowPopover
|
||||||
|
const popup = instance && instance.$refs.popover && instance.$refs.popover.$el
|
||||||
|
if (!this.overflowVisible || !this.overflowTarget || !popup) return
|
||||||
|
const rect = popup.getBoundingClientRect()
|
||||||
|
const anchor = this.overflowTarget.getBoundingClientRect()
|
||||||
|
if (!rect.width || !rect.height) return
|
||||||
|
const margin = 8
|
||||||
|
const left = Math.max(margin, Math.min(rect.left, window.innerWidth - rect.width - margin))
|
||||||
|
let top = rect.top
|
||||||
|
if (top < margin) top = anchor.bottom + 8
|
||||||
|
if (top + rect.height > window.innerHeight - margin) top = anchor.top - rect.height - 8
|
||||||
|
top = Math.max(margin, Math.min(top, window.innerHeight - rect.height - margin))
|
||||||
|
popup.style.left = (parseFloat(popup.style.left) || 0) + left - rect.left + "px"
|
||||||
|
popup.style.top = (parseFloat(popup.style.top) || 0) + top - rect.top + "px"
|
||||||
|
const arrow = popup.querySelector(".van-popover__arrow")
|
||||||
|
if (arrow) {
|
||||||
|
arrow.style.left = Math.max(12, Math.min(anchor.left + anchor.width / 2 - left, rect.width - 12)) + "px"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
onOverflowInput(visible) {
|
||||||
|
this.overflowVisible = visible
|
||||||
|
if (!visible) {
|
||||||
|
this.overflowTarget = null
|
||||||
|
this.unbindOverflowListeners()
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
// 监听只在气泡打开时存在,PJAX 替换页面前也会关闭气泡并注销。
|
||||||
|
bindOverflowListeners() {
|
||||||
|
document.addEventListener("click", this.closeOverflowOnClick)
|
||||||
|
window.addEventListener("scroll", this.closeOverflowOnMove, true)
|
||||||
|
window.addEventListener("resize", this.closeOverflowOnMove)
|
||||||
|
window.addEventListener("transitionend", this.onOverflowAnimationEnd)
|
||||||
|
window.addEventListener("animationend", this.onOverflowAnimationEnd)
|
||||||
|
$(document).on("pjax:send", this.closeOverflowForNavigation)
|
||||||
|
},
|
||||||
|
|
||||||
|
unbindOverflowListeners() {
|
||||||
|
document.removeEventListener("click", this.closeOverflowOnClick)
|
||||||
|
window.removeEventListener("scroll", this.closeOverflowOnMove, true)
|
||||||
|
window.removeEventListener("resize", this.closeOverflowOnMove)
|
||||||
|
window.removeEventListener("transitionend", this.onOverflowAnimationEnd)
|
||||||
|
window.removeEventListener("animationend", this.onOverflowAnimationEnd)
|
||||||
|
$(document).off("pjax:send", this.closeOverflowForNavigation)
|
||||||
|
},
|
||||||
|
|
||||||
|
closeOverflowForNavigation() {
|
||||||
|
this.onOverflowInput(false)
|
||||||
|
},
|
||||||
|
|
||||||
|
// Vant 会在动画结束时重新计算定位,随后再次限制气泡的屏幕边界。
|
||||||
|
onOverflowAnimationEnd() {
|
||||||
|
if (this.overflowVisible) setTimeout(() => this.positionOverflow(), 0)
|
||||||
|
},
|
||||||
|
|
||||||
|
// 滚动或改变屏幕尺寸时关闭气泡,避免气泡脱离原文字位置。
|
||||||
|
closeOverflowOnMove(event) {
|
||||||
|
if (event && event.target && event.target.closest && event.target.closest(".table-list-overflow-content")) return
|
||||||
|
this.onOverflowInput(false)
|
||||||
|
},
|
||||||
|
|
||||||
|
closeOverflowOnClick(event) {
|
||||||
|
if (!this.overflowVisible) return
|
||||||
|
if (this.overflowTarget && this.overflowTarget.contains(event.target)) return
|
||||||
|
if (event.target.closest && event.target.closest(".table-list-overflow-content")) return
|
||||||
|
this.onOverflowInput(false)
|
||||||
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取当前列表快照。
|
* 获取当前列表快照。
|
||||||
* 返回值包含已加载记录、分页参数和加载完成状态,供业务页面在进入详情前暂存列表现场。
|
* 返回值包含已加载记录、分页参数和加载完成状态,供业务页面在进入详情前暂存列表现场。
|
||||||
@@ -186,10 +320,28 @@ module.exports = {
|
|||||||
},
|
},
|
||||||
mounted() {
|
mounted() {
|
||||||
this.$emit("ready")
|
this.$emit("ready")
|
||||||
|
},
|
||||||
|
beforeDestroy() {
|
||||||
|
this.unbindOverflowListeners()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
<style>
|
||||||
|
/* Vant 将气泡挂到 body,控制宽高并允许长文本在气泡内滚动。 */
|
||||||
|
.table-list-overflow-content {
|
||||||
|
max-width: min(240px, calc(100vw - 48px));
|
||||||
|
max-height: 160px;
|
||||||
|
padding: 10px 12px;
|
||||||
|
overflow-y: auto;
|
||||||
|
color: #253247;
|
||||||
|
font-size: 13px;
|
||||||
|
line-height: 1.55;
|
||||||
|
white-space: pre-wrap;
|
||||||
|
overflow-wrap: anywhere;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
||||||
<style scoped>
|
<style scoped>
|
||||||
.table-list-container {
|
.table-list-container {
|
||||||
padding: 0;
|
padding: 0;
|
||||||
|
|||||||
@@ -706,7 +706,7 @@
|
|||||||
Vue.component("year-van-dropdown-item", httpVueLoader("/components/plugins/vantMore/yearVanDropDownItem.vue?v=" + h5ComponentVersion))
|
Vue.component("year-van-dropdown-item", httpVueLoader("/components/plugins/vantMore/yearVanDropDownItem.vue?v=" + h5ComponentVersion))
|
||||||
Vue.component("van-text-dialog", httpVueLoader("/components/plugins/vantMore/vantTextDialog.vue?v=" + h5ComponentVersion))
|
Vue.component("van-text-dialog", httpVueLoader("/components/plugins/vantMore/vantTextDialog.vue?v=" + h5ComponentVersion))
|
||||||
Vue.component("enum-tag", httpVueLoader("/components/plugins/sysEnum/EnumTag.vue?v=" + h5ComponentVersion))
|
Vue.component("enum-tag", httpVueLoader("/components/plugins/sysEnum/EnumTag.vue?v=" + h5ComponentVersion))
|
||||||
Vue.component("table-list", httpVueLoader("/components/plugins/h5/TableList.vue?v=" + h5ComponentVersion))
|
Vue.component("table-list", httpVueLoader("/components/plugins/h5/TableList.vue?v=" + h5ComponentVersion + "_overflow1"))
|
||||||
Vue.component("table-column", httpVueLoader("/components/plugins/h5/TableColumn.vue?v=" + h5ComponentVersion))
|
Vue.component("table-column", httpVueLoader("/components/plugins/h5/TableColumn.vue?v=" + h5ComponentVersion))
|
||||||
Vue.component("file-preview", httpVueLoader("/components/plugins/sysFilePreview/H5Index.vue?v=" + h5ComponentVersion))
|
Vue.component("file-preview", httpVueLoader("/components/plugins/sysFilePreview/H5Index.vue?v=" + h5ComponentVersion))
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
+1
-1
@@ -100,7 +100,7 @@ layout("/layouts/platform.html"){
|
|||||||
size="mini" type="danger">删除
|
size="mini" type="danger">删除
|
||||||
</el-button>
|
</el-button>
|
||||||
|
|
||||||
<el-button @click="doExportDeclare(row)" size="mini" type="primary">申请表导出</el-button>
|
<el-button v-if="row.instanceState === 20" @click="doExportDeclare(row)" size="mini" type="primary">申请表导出</el-button>
|
||||||
<el-button v-if="row.instanceState === 20" @click="doExportReimbursement(row)" size="mini"
|
<el-button v-if="row.instanceState === 20" @click="doExportReimbursement(row)" size="mini"
|
||||||
type="primary">报销凭证导出
|
type="primary">报销凭证导出
|
||||||
</el-button>
|
</el-button>
|
||||||
|
|||||||
@@ -21,14 +21,29 @@ const PROPOSAL_INFO = {
|
|||||||
</el-descriptions-item>
|
</el-descriptions-item>
|
||||||
<el-descriptions-item label="提案类别">
|
<el-descriptions-item label="提案类别">
|
||||||
{{viewData.typeName}}
|
{{viewData.typeName}}
|
||||||
</el-descriptions-item><!--
|
</el-descriptions-item>
|
||||||
|
<!-- 提案方式和联系电话来自提案详情,未填写时显示占位符。 -->
|
||||||
|
<el-descriptions-item label="提案方式">
|
||||||
|
<dict-tag v-if="viewData.source" :options="dict.type.PROPOSAL_SOURCE"
|
||||||
|
:value="viewData.source"></dict-tag>
|
||||||
|
<span v-else>--</span>
|
||||||
|
</el-descriptions-item>
|
||||||
|
<el-descriptions-item label="联系电话">{{ viewData.mobile || '--' }}</el-descriptions-item><!--
|
||||||
<el-descriptions-item label="建议承办单位">
|
<el-descriptions-item label="建议承办单位">
|
||||||
{{viewData.suggestUnits}}
|
{{viewData.suggestUnits}}
|
||||||
</el-descriptions-item>-->
|
</el-descriptions-item>-->
|
||||||
<el-descriptions-item label="立案结果" :span="2">
|
<!-- 立案结果和类型尚未填写时仍显示字段,并以双横线表示空值。 -->
|
||||||
<dict-tag :options="dict.type.PROPOSAL_CASE_FILING_RESULT"
|
<el-descriptions-item label="立案结果">
|
||||||
|
<dict-tag v-if="viewData.caseFilingResult" :options="dict.type.PROPOSAL_CASE_FILING_RESULT"
|
||||||
:value="viewData.caseFilingResult"></dict-tag>
|
:value="viewData.caseFilingResult"></dict-tag>
|
||||||
|
<span v-else>--</span>
|
||||||
</el-descriptions-item>
|
</el-descriptions-item>
|
||||||
|
<el-descriptions-item label="立案类型">
|
||||||
|
<dict-tag v-if="viewData.caseFilingType" :options="dict.type.PROPOSAL_CASE_FILING_TYPE"
|
||||||
|
:value="viewData.caseFilingType"></dict-tag>
|
||||||
|
<span v-else>--</span>
|
||||||
|
</el-descriptions-item>
|
||||||
|
<el-descriptions-item></el-descriptions-item>
|
||||||
<!--<el-descriptions-item label="调研情况" :span="3">
|
<!--<el-descriptions-item label="调研情况" :span="3">
|
||||||
<div class="text-left">{{viewData.researchFindings}}</div>
|
<div class="text-left">{{viewData.researchFindings}}</div>
|
||||||
</el-descriptions-item>-->
|
</el-descriptions-item>-->
|
||||||
@@ -82,18 +97,22 @@ const PROPOSAL_INFO = {
|
|||||||
{{row.commissionerName}}({{row.commissionerLoginName}})
|
{{row.commissionerName}}({{row.commissionerLoginName}})
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column label="立案结果" prop="caseFilingType">
|
<!-- 委员意见分别展示立案结果和类型,未填写时显示双横线。 -->
|
||||||
|
<el-table-column label="立案结果" prop="caseFilingResult">
|
||||||
<template slot-scope="{row}">
|
<template slot-scope="{row}">
|
||||||
<div style="display: flex;justify-content: center">
|
<div style="display: flex;justify-content: center">
|
||||||
<dict-tag :options="dict.type.PROPOSAL_CASE_FILING_RESULT"
|
<dict-tag v-if="row.caseFilingResult" :options="dict.type.PROPOSAL_CASE_FILING_RESULT"
|
||||||
:value="row.caseFilingResult"></dict-tag>
|
:value="row.caseFilingResult"></dict-tag>
|
||||||
<!-- 普通提案/重点提案暂不展示,历史数据仍保留。 -->
|
<span v-else>--</span>
|
||||||
<template v-if="false">
|
</div>
|
||||||
(
|
|
||||||
<dict-tag :options="dict.type.PROPOSAL_CASE_FILING_TYPE"
|
|
||||||
:value="row.caseFilingType"></dict-tag>
|
|
||||||
)
|
|
||||||
</template>
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="立案类型" prop="caseFilingType">
|
||||||
|
<template slot-scope="{row}">
|
||||||
|
<div style="display: flex;justify-content: center">
|
||||||
|
<dict-tag v-if="row.caseFilingType" :options="dict.type.PROPOSAL_CASE_FILING_TYPE"
|
||||||
|
:value="row.caseFilingType"></dict-tag>
|
||||||
|
<span v-else>--</span>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
@@ -162,7 +181,8 @@ const PROPOSAL_INFO = {
|
|||||||
<el-descriptions-item label="办理用户">{{ task.taskFormData.userName
|
<el-descriptions-item label="办理用户">{{ task.taskFormData.userName
|
||||||
}}({{task.taskFormData.loginName}})
|
}}({{task.taskFormData.loginName}})
|
||||||
</el-descriptions-item>
|
</el-descriptions-item>
|
||||||
<el-descriptions-item label="办理时间" :span="2">{{ task.finishTime }}</el-descriptions-item>
|
<el-descriptions-item label="办理时间" :span="2">{{ task.finishTime }}
|
||||||
|
</el-descriptions-item>
|
||||||
<el-descriptions-item label="附议人" :span="3" v-if="task.taskName === 'invite'">
|
<el-descriptions-item label="附议人" :span="3" v-if="task.taskName === 'invite'">
|
||||||
<el-table v-loading="tableLoading" :data="task?.taskFormData?.seconder">
|
<el-table v-loading="tableLoading" :data="task?.taskFormData?.seconder">
|
||||||
<el-table-column label="姓名" prop="userName"></el-table-column>
|
<el-table-column label="姓名" prop="userName"></el-table-column>
|
||||||
@@ -183,22 +203,27 @@ const PROPOSAL_INFO = {
|
|||||||
}}({{task.taskFormData.loginName}})
|
}}({{task.taskFormData.loginName}})
|
||||||
</el-descriptions-item>
|
</el-descriptions-item>
|
||||||
<el-descriptions-item label="办理时间">{{ task.finishTime }}</el-descriptions-item>
|
<el-descriptions-item label="办理时间">{{ task.finishTime }}</el-descriptions-item>
|
||||||
|
<!-- 立案节点分别展示流程记录中的结果与类型,空值显示双横线。 -->
|
||||||
<el-descriptions-item label="立案结果">
|
<el-descriptions-item label="立案结果">
|
||||||
<div style="display: flex;justify-content: center">
|
<div style="display: flex;justify-content: center">
|
||||||
<dict-tag :options="dict.type.PROPOSAL_CASE_FILING_RESULT"
|
<dict-tag v-if="task.ext.tf_caseFilingResult"
|
||||||
|
:options="dict.type.PROPOSAL_CASE_FILING_RESULT"
|
||||||
:value="task.ext.tf_caseFilingResult"></dict-tag>
|
:value="task.ext.tf_caseFilingResult"></dict-tag>
|
||||||
|
<span v-else>--</span>
|
||||||
<!-- 普通提案/重点提案暂不展示,历史流程变量仍保留。 -->
|
</div>
|
||||||
<template v-if="false">
|
</el-descriptions-item>
|
||||||
(
|
<el-descriptions-item label="立案类型">
|
||||||
<dict-tag :options="dict.type.PROPOSAL_CASE_FILING_TYPE"
|
<div style="display: flex;justify-content: center">
|
||||||
|
<dict-tag v-if="task.ext.tf_caseFilingType"
|
||||||
|
:options="dict.type.PROPOSAL_CASE_FILING_TYPE"
|
||||||
:value="task.ext.tf_caseFilingType"></dict-tag>
|
:value="task.ext.tf_caseFilingType"></dict-tag>
|
||||||
)
|
<span v-else>--</span>
|
||||||
</template>
|
|
||||||
</div>
|
</div>
|
||||||
</el-descriptions-item>
|
</el-descriptions-item>
|
||||||
<template v-if="['CONFIRM_FILING','SUGGESTION'].includes(task.ext.tf_caseFilingResult)">
|
<template v-if="['CONFIRM_FILING','SUGGESTION'].includes(task.ext.tf_caseFilingResult)">
|
||||||
<el-descriptions-item v-if="task.ext.tf_caseFilingResult === 'SUGGESTION'" label="承办单位" :span="3">{{task?.ext?.tf_masterUnitNameStr || task?.ext?.tf_slaveUnitNameStr}}
|
<el-descriptions-item v-if="task.ext.tf_caseFilingResult === 'SUGGESTION'"
|
||||||
|
label="承办单位" :span="3">{{task?.ext?.tf_masterUnitNameStr ||
|
||||||
|
task?.ext?.tf_slaveUnitNameStr}}
|
||||||
</el-descriptions-item>
|
</el-descriptions-item>
|
||||||
<template v-else>
|
<template v-else>
|
||||||
<el-descriptions-item label="主办单位" :span="3">{{task?.ext?.tf_masterUnitNameStr}}
|
<el-descriptions-item label="主办单位" :span="3">{{task?.ext?.tf_masterUnitNameStr}}
|
||||||
@@ -214,7 +239,8 @@ const PROPOSAL_INFO = {
|
|||||||
|
|
||||||
<el-descriptions border class="flow-task-form" :column="3" :key="task.id" v-else>
|
<el-descriptions border class="flow-task-form" :column="3" :key="task.id" v-else>
|
||||||
<el-descriptions-item label="承办单位"
|
<el-descriptions-item label="承办单位"
|
||||||
v-if="['opinion_unit_reply','unit_reply','two_unit_reply','opinion_master_reply','master_reply','slave_reply'].includes(task.taskName)" :span="3">
|
v-if="['opinion_unit_reply','unit_reply','two_unit_reply','opinion_master_reply','master_reply','slave_reply'].includes(task.taskName)"
|
||||||
|
:span="3">
|
||||||
{{task.ext.underTakeName}}
|
{{task.ext.underTakeName}}
|
||||||
</el-descriptions-item>
|
</el-descriptions-item>
|
||||||
|
|
||||||
@@ -223,7 +249,8 @@ const PROPOSAL_INFO = {
|
|||||||
</el-descriptions-item>
|
</el-descriptions-item>
|
||||||
<el-descriptions-item label="办理时间">{{ task.finishTime }}</el-descriptions-item>
|
<el-descriptions-item label="办理时间">{{ task.finishTime }}</el-descriptions-item>
|
||||||
|
|
||||||
<el-descriptions-item label="办理评价" v-if="['feedback'].includes(task.taskName)" :span="3">
|
<el-descriptions-item label="办理评价" v-if="['feedback'].includes(task.taskName)"
|
||||||
|
:span="3">
|
||||||
<dict-tag :options="dict.type.PROPOSAL_FEEDBACK"
|
<dict-tag :options="dict.type.PROPOSAL_FEEDBACK"
|
||||||
:value="task.ext.tf_feedback"></dict-tag>
|
:value="task.ext.tf_feedback"></dict-tag>
|
||||||
</el-descriptions-item>
|
</el-descriptions-item>
|
||||||
@@ -243,7 +270,7 @@ const PROPOSAL_INFO = {
|
|||||||
<snaker-chart ref="snakerChartRef"></snaker-chart>
|
<snaker-chart ref="snakerChartRef"></snaker-chart>
|
||||||
</div>
|
</div>
|
||||||
`,
|
`,
|
||||||
dicts: ["PROPOSAL_TYPE", "PROPOSAL_CASE_FILING_RESULT", "PROPOSAL_CASE_FILING_TYPE", "PROCESS_TASK_SUBMIT_TYPE", "PROPOSAL_FEEDBACK"],
|
dicts: ["PROPOSAL_TYPE", "PROPOSAL_SOURCE", "PROPOSAL_CASE_FILING_RESULT", "PROPOSAL_CASE_FILING_TYPE", "PROCESS_TASK_SUBMIT_TYPE", "PROPOSAL_FEEDBACK"],
|
||||||
props: {
|
props: {
|
||||||
hide_slave: false
|
hide_slave: false
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -60,7 +60,10 @@ const USER_COMPONENT = {
|
|||||||
},
|
},
|
||||||
|
|
||||||
filterUnit(query, item) {
|
filterUnit(query, item) {
|
||||||
return item.username.indexOf(query) > -1
|
// 按姓名或工号筛选人员,字段为空时按空字符串处理。
|
||||||
|
const username = item.username || ""
|
||||||
|
const loginname = item.loginname || ""
|
||||||
|
return username.indexOf(query) > -1 || loginname.indexOf(query) > -1
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -23,9 +23,9 @@ layout("/layouts/platform.html"){
|
|||||||
</el-card>
|
</el-card>
|
||||||
<el-card shadow="never">
|
<el-card shadow="never">
|
||||||
<table-tool :columns.sync="tableColumns">
|
<table-tool :columns.sync="tableColumns">
|
||||||
<el-button class="ml5" icon="el-icon-upload2" type="primary" size="small"
|
<!-- <el-button class="ml5" icon="el-icon-upload2" type="primary" size="small"
|
||||||
@click="openImport">导入提案
|
@click="openImport">导入提案
|
||||||
</el-button>
|
</el-button>-->
|
||||||
</table-tool>
|
</table-tool>
|
||||||
<el-table v-loading="tableLoading" :data="tableData" @sort-change="pageOrder" header-align="center" style="width: 100%" row-key="id">
|
<el-table v-loading="tableLoading" :data="tableData" @sort-change="pageOrder" header-align="center" style="width: 100%" row-key="id">
|
||||||
<el-table-column label="序号" width="50" type="index" :index="indexMethod" fixed="left"></el-table-column>
|
<el-table-column label="序号" width="50" type="index" :index="indexMethod" fixed="left"></el-table-column>
|
||||||
@@ -76,8 +76,7 @@ layout("/layouts/platform.html"){
|
|||||||
<el-button v-if="row.canRevoke" size="mini" type="danger" @click="openRevoke(row)">
|
<el-button v-if="row.canRevoke" size="mini" type="danger" @click="openRevoke(row)">
|
||||||
撤回
|
撤回
|
||||||
</el-button>
|
</el-button>
|
||||||
<!-- v-if="row.taskKey === 'startTask' || !row.instanceId"-->
|
<el-button v-if="row.taskKey === 'startTask' || !row.instanceId" size="mini" type="danger" @click="del(row.id)">
|
||||||
<el-button size="mini" type="danger" @click="del(row.id)">
|
|
||||||
删除
|
删除
|
||||||
</el-button>
|
</el-button>
|
||||||
</template>
|
</template>
|
||||||
|
|||||||
+1
-1
@@ -8,7 +8,7 @@ layout("/layouts/platform.html"){
|
|||||||
<custom-card>
|
<custom-card>
|
||||||
<snaker-start slot="header" label="撰写提案" define_key="JDHTA_NC">
|
<snaker-start slot="header" label="撰写提案" define_key="JDHTA_NC">
|
||||||
<template slot="header-right-label">
|
<template slot="header-right-label">
|
||||||
<el-link type="primary" @click="openImport" v-if="!formData.id" style="margin-right: 15px">导入提案</el-link>
|
<!-- <el-link type="primary" @click="openImport" v-if="!formData.id" style="margin-right: 15px">导入提案</el-link>-->
|
||||||
</template>
|
</template>
|
||||||
</snaker-start>
|
</snaker-start>
|
||||||
<el-form :model="formData" :rules="formRules" label-width="120px" ref="addForm">
|
<el-form :model="formData" :rules="formRules" label-width="120px" ref="addForm">
|
||||||
|
|||||||
@@ -9,26 +9,30 @@ const PROPOSAL_INFO = {
|
|||||||
<van-cell-group :border="false">
|
<van-cell-group :border="false">
|
||||||
<van-cell title="提案编号">{{ viewData.code || '--' }}</van-cell>
|
<van-cell title="提案编号">{{ viewData.code || '--' }}</van-cell>
|
||||||
<van-cell title="提案名称">{{ viewData.name || '--' }}</van-cell>
|
<van-cell title="提案名称">{{ viewData.name || '--' }}</van-cell>
|
||||||
<van-cell title="立案结果" v-if="viewData.caseFilingResult">
|
|
||||||
<dict-tag :options="dict.type.PROPOSAL_CASE_FILING_RESULT"
|
<van-cell title="提案类别">{{ viewData.typeName || '--' }}</van-cell>
|
||||||
:value="viewData.caseFilingResult"></dict-tag>
|
|
||||||
</van-cell>
|
|
||||||
<van-cell title="立案类型" v-if="viewData.caseFilingType">
|
|
||||||
<dict-tag :options="dict.type.PROPOSAL_CASE_FILING_TYPE"
|
|
||||||
:value="viewData.caseFilingType"></dict-tag>
|
|
||||||
</van-cell>
|
|
||||||
<van-cell title="提案类型">{{ viewData.typeName || '--' }}</van-cell>
|
|
||||||
<van-cell title="提案方式">{{ getDictText(dict.type.PROPOSAL_SOURCE, viewData.source) }}
|
<van-cell title="提案方式">{{ getDictText(dict.type.PROPOSAL_SOURCE, viewData.source) }}
|
||||||
</van-cell>
|
</van-cell>
|
||||||
<van-cell title="代表姓名">{{ viewData.createUserName || '--' }}</van-cell>
|
<van-cell title="提案人">{{ viewData.createUserName || '--' }}</van-cell>
|
||||||
<van-cell title="所属教代会">{{ viewData.sessionName || viewData.fullName || '--' }}</van-cell>
|
<van-cell title="教代会届次">{{ viewData.sessionName || viewData.fullName || '--' }}</van-cell>
|
||||||
<van-cell :title="viewData.committeeName ? '所属委员会' : '所属代表团'">
|
<van-cell :title="viewData.committeeName ? '委员会名称' : '代表团名称'">
|
||||||
{{ viewData.committeeName || viewData.delegationName || '--' }}
|
{{ viewData.committeeName || viewData.delegationName || '--' }}
|
||||||
</van-cell>
|
</van-cell>
|
||||||
<van-cell title="单位">{{ viewData.unitName || '--' }}</van-cell>
|
<van-cell title="提案人单位">{{ viewData.unitName || '--' }}</van-cell>
|
||||||
<van-cell title="联系电话">{{ viewData.mobile || '--' }}</van-cell>
|
<van-cell title="联系电话">{{ viewData.mobile || '--' }}</van-cell>
|
||||||
<van-cell title="提案时间">{{ viewData.createTime || '--' }}</van-cell>
|
<van-cell title="提案时间">{{ viewData.createTime || '--' }}</van-cell>
|
||||||
<van-cell title="案由" class="proposal-view-long-cell">
|
<!-- 立案结果和类型尚未填写时仍显示字段,并以双横线表示空值。 -->
|
||||||
|
<van-cell title="立案结果">
|
||||||
|
<dict-tag v-if="viewData.caseFilingResult" :options="dict.type.PROPOSAL_CASE_FILING_RESULT"
|
||||||
|
:value="viewData.caseFilingResult"></dict-tag>
|
||||||
|
<span v-else>--</span>
|
||||||
|
</van-cell>
|
||||||
|
<van-cell title="立案类型">
|
||||||
|
<dict-tag v-if="viewData.caseFilingType" :options="dict.type.PROPOSAL_CASE_FILING_TYPE"
|
||||||
|
:value="viewData.caseFilingType"></dict-tag>
|
||||||
|
<span v-else>--</span>
|
||||||
|
</van-cell>
|
||||||
|
<van-cell title="提案案由" class="proposal-view-long-cell">
|
||||||
<div class="proposal-view-rich-value" v-html="viewData.brief || '--'"></div>
|
<div class="proposal-view-rich-value" v-html="viewData.brief || '--'"></div>
|
||||||
</van-cell>
|
</van-cell>
|
||||||
<van-cell title="建议措施" class="proposal-view-long-cell">
|
<van-cell title="建议措施" class="proposal-view-long-cell">
|
||||||
@@ -48,7 +52,7 @@ const PROPOSAL_INFO = {
|
|||||||
:key="merge.id"
|
:key="merge.id"
|
||||||
class="proposal-view-merge-cell"
|
class="proposal-view-merge-cell"
|
||||||
:title="(index + 1) + '. ' + merge.name"
|
:title="(index + 1) + '. ' + merge.name"
|
||||||
:label="'提案编号:' + merge.code + '|提案人:' + merge.createUserName + '|类别:' + merge.typeName + '|代表团:' + merge.delegationName"
|
:label="'提案编号:' + merge.code + '|提案人:' + merge.createUserName + '|提案类别:' + merge.typeName + '|代表团:' + merge.delegationName"
|
||||||
is-link
|
is-link
|
||||||
@click="openView(merge)">
|
@click="openView(merge)">
|
||||||
</van-cell>
|
</van-cell>
|
||||||
@@ -66,13 +70,16 @@ const PROPOSAL_INFO = {
|
|||||||
<template v-if="opinion.commissionerLoginName">({{ opinion.commissionerLoginName }})
|
<template v-if="opinion.commissionerLoginName">({{ opinion.commissionerLoginName }})
|
||||||
</template>
|
</template>
|
||||||
</van-cell>
|
</van-cell>
|
||||||
|
<!-- 委员意见分别展示立案结果和类型,未填写时显示双横线。 -->
|
||||||
<van-cell title="立案结果">
|
<van-cell title="立案结果">
|
||||||
<dict-tag :options="dict.type.PROPOSAL_CASE_FILING_RESULT"
|
<dict-tag v-if="opinion.caseFilingResult" :options="dict.type.PROPOSAL_CASE_FILING_RESULT"
|
||||||
:value="opinion.caseFilingResult"></dict-tag>
|
:value="opinion.caseFilingResult"></dict-tag>
|
||||||
|
<span v-else>--</span>
|
||||||
</van-cell>
|
</van-cell>
|
||||||
<van-cell title="立案类型" v-if="opinion.caseFilingType">
|
<van-cell title="立案类型">
|
||||||
<dict-tag :options="dict.type.PROPOSAL_CASE_FILING_TYPE"
|
<dict-tag v-if="opinion.caseFilingType" :options="dict.type.PROPOSAL_CASE_FILING_TYPE"
|
||||||
:value="opinion.caseFilingType"></dict-tag>
|
:value="opinion.caseFilingType"></dict-tag>
|
||||||
|
<span v-else>--</span>
|
||||||
</van-cell>
|
</van-cell>
|
||||||
<van-cell title="意见" v-if="opinion.opinionText" class="proposal-view-long-cell">
|
<van-cell title="意见" v-if="opinion.opinionText" class="proposal-view-long-cell">
|
||||||
<div class="proposal-view-rich-value">{{ opinion.opinionText }}</div>
|
<div class="proposal-view-rich-value">{{ opinion.opinionText }}</div>
|
||||||
@@ -158,13 +165,18 @@ const PROPOSAL_INFO = {
|
|||||||
|| '--' }})
|
|| '--' }})
|
||||||
</van-cell>
|
</van-cell>
|
||||||
<van-cell title="办理时间">{{ selectedTask.finishTime || '--' }}</van-cell>
|
<van-cell title="办理时间">{{ selectedTask.finishTime || '--' }}</van-cell>
|
||||||
|
<!-- 立案节点分别展示流程记录中的结果与类型,空值显示双横线。 -->
|
||||||
<van-cell title="立案结果">
|
<van-cell title="立案结果">
|
||||||
<dict-tag :options="dict.type.PROPOSAL_CASE_FILING_RESULT"
|
<dict-tag v-if="selectedTask.ext.tf_caseFilingResult"
|
||||||
|
:options="dict.type.PROPOSAL_CASE_FILING_RESULT"
|
||||||
:value="selectedTask.ext.tf_caseFilingResult"></dict-tag>
|
:value="selectedTask.ext.tf_caseFilingResult"></dict-tag>
|
||||||
|
<span v-else>--</span>
|
||||||
</van-cell>
|
</van-cell>
|
||||||
<van-cell title="立案类型" v-if="selectedTask.ext.tf_caseFilingType">
|
<van-cell title="立案类型">
|
||||||
<dict-tag :options="dict.type.PROPOSAL_CASE_FILING_TYPE"
|
<dict-tag v-if="selectedTask.ext.tf_caseFilingType"
|
||||||
|
:options="dict.type.PROPOSAL_CASE_FILING_TYPE"
|
||||||
:value="selectedTask.ext.tf_caseFilingType"></dict-tag>
|
:value="selectedTask.ext.tf_caseFilingType"></dict-tag>
|
||||||
|
<span v-else>--</span>
|
||||||
</van-cell>
|
</van-cell>
|
||||||
<template
|
<template
|
||||||
v-if="['CONFIRM_FILING', 'SUGGESTION'].includes(selectedTask.ext.tf_caseFilingResult)">
|
v-if="['CONFIRM_FILING', 'SUGGESTION'].includes(selectedTask.ext.tf_caseFilingResult)">
|
||||||
@@ -187,7 +199,7 @@ const PROPOSAL_INFO = {
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<template v-else>
|
<template v-else>
|
||||||
<van-cell title="办理单位"
|
<van-cell title="承办单位"
|
||||||
v-if="['opinion_unit_reply', 'unit_reply', 'two_unit_reply', 'opinion_master_reply', 'master_reply', 'slave_reply'].includes(selectedTask.taskName)">
|
v-if="['opinion_unit_reply', 'unit_reply', 'two_unit_reply', 'opinion_master_reply', 'master_reply', 'slave_reply'].includes(selectedTask.taskName)">
|
||||||
{{ selectedTask.ext.underTakeName || '--' }}
|
{{ selectedTask.ext.underTakeName || '--' }}
|
||||||
</van-cell>
|
</van-cell>
|
||||||
|
|||||||
Reference in New Issue
Block a user