This commit is contained in:
2025-12-22 17:56:16 +08:00
59 changed files with 996 additions and 686 deletions
@@ -0,0 +1,14 @@
package com.budwk.app.base.event.flow.jumptofirsttask;
/**
* @version 1.0
* @Author FKY
* @nameFlowJumpToFirstTaskNodeListener
* @Date 2025/12/20 14:10
* @注释
*/
public interface FlowJumpToFirstTaskNodeListener {
void receive(Long processTaskId);
}
@@ -0,0 +1,25 @@
package com.budwk.app.base.event.flow.jumptofirsttask;
import com.budwk.app.base.event.user.UserChangeEventListener;
import com.budwk.app.base.utils.AppIocUtil;
import org.nutz.ioc.Ioc;
import org.nutz.mvc.Mvcs;
/**
* @version 1.0
* @Author FKY
* @nameFlowJumpToFirstTaskNodeEvent
* @Date 2025/12/20 14:09
* @注释
*/
public class FlowJumpToFirstTaskNodePublisher {
public static void broadcast(Long processTaskId) {
String[] names = Mvcs.getIoc().getNamesByType(FlowJumpToFirstTaskNodeListener.class);
for (String listener : names) {
FlowJumpToFirstTaskNodeListener listenerBean = Mvcs.getIoc().get(FlowJumpToFirstTaskNodeListener.class, listener);
listenerBean.receive(processTaskId);
}
}
}
@@ -48,6 +48,7 @@ public class FlowTodoCenterController {
t.displayName AS taskName, t.displayName AS taskName,
t.taskState, t.taskState,
t.formKey, t.formKey,
t.h5FormKey,
t.createdAt, t.createdAt,
t.finishTime, t.finishTime,
t.variable, t.variable,
@@ -92,6 +93,7 @@ public class FlowTodoCenterController {
t.displayName AS taskName, t.displayName AS taskName,
t.taskState, t.taskState,
t.formKey, t.formKey,
t.h5FormKey,
t.createdAt, t.createdAt,
t.finishTime, t.finishTime,
t.variable, t.variable,
@@ -140,7 +142,9 @@ public class FlowTodoCenterController {
ins.createdAt, ins.createdAt,
ins.variable ->> '$.instanceName' AS instanceName, ins.variable ->> '$.instanceName' AS instanceName,
GROUP_CONCAT(DISTINCT t.displayName) as taskName, GROUP_CONCAT(DISTINCT t.displayName) as taskName,
cat.`name` categoryName cat.`name` categoryName,
t.formKey,
t.h5FormKey
FROM FROM
wf_process_instance ins wf_process_instance ins
LEFT JOIN wf_process_task t ON t.processInstanceId = ins.id and t.taskState = 10 LEFT JOIN wf_process_task t ON t.processInstanceId = ins.id and t.taskState = 10
@@ -179,7 +183,7 @@ public class FlowTodoCenterController {
ins.variable, ins.variable,
ins.createdAt, ins.createdAt,
ins.variable ->> '$.instanceName' AS instanceName, ins.variable ->> '$.instanceName' AS instanceName,
cat.`name` categoryName cat.`name` categoryName
FROM FROM
wf_process_instance ins wf_process_instance ins
LEFT JOIN wf_process_define def ON def.id = ins.processDefineId LEFT JOIN wf_process_define def ON def.id = ins.processDefineId
@@ -41,6 +41,8 @@ public class TaskModel extends NodeModel {
*/ */
private String countersignCompletionCondition; private String countersignCompletionCondition;
private String h5form;
@Override @Override
public void exec(Execution execution) { public void exec(Execution execution) {
// 执行任务节点自定义执行逻辑 // 执行任务节点自定义执行逻辑
@@ -21,6 +21,7 @@ public interface NodeParser {
String EXPR_KEY = "expr"; // 表达式key String EXPR_KEY = "expr"; // 表达式key
String HANDLE_CLASS_KEY = "handleClass"; // 表达式处理类 String HANDLE_CLASS_KEY = "handleClass"; // 表达式处理类
String FORM_KEY = "form"; // 表单标识 String FORM_KEY = "form"; // 表单标识
String H5_FORM_KEY = "h5form"; // 表单标识
String ASSIGNEE_KEY = "assignee"; // 参与人 String ASSIGNEE_KEY = "assignee"; // 参与人
String ASSIGNMENT_HANDLE_KEY = "assignmentHandler"; // 参与人处理类 String ASSIGNMENT_HANDLE_KEY = "assignmentHandler"; // 参与人处理类
String TASK_TYPE_KEY = "taskType"; // 任务类型(主办/协办) String TASK_TYPE_KEY = "taskType"; // 任务类型(主办/协办)
@@ -29,6 +29,7 @@ public class TaskParser extends AbstractNodeParser {
TaskModel taskModel = (TaskModel)nodeModel; TaskModel taskModel = (TaskModel)nodeModel;
Dict properties = lfNode.getProperties(); Dict properties = lfNode.getProperties();
taskModel.setForm(properties.getStr(FORM_KEY)); taskModel.setForm(properties.getStr(FORM_KEY));
taskModel.setH5form(properties.getStr(H5_FORM_KEY));
taskModel.setAssignee(properties.getStr(ASSIGNEE_KEY)); taskModel.setAssignee(properties.getStr(ASSIGNEE_KEY));
taskModel.setAssignmentHandler(properties.getStr(ASSIGNMENT_HANDLE_KEY)); taskModel.setAssignmentHandler(properties.getStr(ASSIGNMENT_HANDLE_KEY));
taskModel.setTaskType(ProcessTaskTypeEnum.codeOf(properties.get(TASK_TYPE_KEY))); taskModel.setTaskType(ProcessTaskTypeEnum.codeOf(properties.get(TASK_TYPE_KEY)));
@@ -66,6 +66,10 @@ public class ProcessTask extends BaseModel {
@Column @Column
private String formKey; private String formKey;
@Comment("h5任务处理表单KEY")
@Column
private String h5FormKey;
@Comment("父任务ID") @Comment("父任务ID")
@Column @Column
private Long taskParentId; private Long taskParentId;
@@ -2,6 +2,7 @@ package com.budwk.app.flow.service;
import cn.hutool.core.lang.Dict; import cn.hutool.core.lang.Dict;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import com.budwk.app.base.event.flow.jumptofirsttask.FlowJumpToFirstTaskNodePublisher;
import com.budwk.app.flow.constant.FlowConst; import com.budwk.app.flow.constant.FlowConst;
import com.budwk.app.flow.engine.FlowEngine; import com.budwk.app.flow.engine.FlowEngine;
import com.budwk.app.flow.enums.ProcessSubmitTypeEnum; import com.budwk.app.flow.enums.ProcessSubmitTypeEnum;
@@ -52,6 +53,10 @@ public class FlowCommonService {
} else if (ObjectUtil.equals(submitType, ProcessSubmitTypeEnum.ROLLBACK_TO_OPERATOR.getCode())) { } else if (ObjectUtil.equals(submitType, ProcessSubmitTypeEnum.ROLLBACK_TO_OPERATOR.getCode())) {
// 退回发起人 // 退回发起人
flowEngine.executeAndJumpToFirstTaskNode(processTaskId, operator, args); flowEngine.executeAndJumpToFirstTaskNode(processTaskId, operator, args);
// 退回发起人发送订阅消息,执行相关操作
FlowJumpToFirstTaskNodePublisher.broadcast(processTaskId);
} else if (ObjectUtil.equals(submitType, ProcessSubmitTypeEnum.COUNTERSIGN_DISAGREE.getCode())) { } else if (ObjectUtil.equals(submitType, ProcessSubmitTypeEnum.COUNTERSIGN_DISAGREE.getCode())) {
// 会签不同意,追加不同意标识 // 会签不同意,追加不同意标识
args.put(FlowConst.COUNTERSIGN_DISAGREE_FLAG, 1); args.put(FlowConst.COUNTERSIGN_DISAGREE_FLAG, 1);
@@ -174,6 +174,7 @@ public class ProcessTaskServiceImpl extends BaseServiceImpl<ProcessTask> impleme
processTask.setTaskState(ProcessTaskStateEnum.DOING.getCode()); processTask.setTaskState(ProcessTaskStateEnum.DOING.getCode());
processTask.setTaskType(taskModel.getTaskType().getCode()); processTask.setTaskType(taskModel.getTaskType().getCode());
processTask.setFormKey(taskModel.getForm()); processTask.setFormKey(taskModel.getForm());
processTask.setH5FormKey(taskModel.getH5form());
processTask.setProcessInstanceId(execution.getProcessInstanceId()); processTask.setProcessInstanceId(execution.getProcessInstanceId());
// 增加是否为第一个任务节点标识 // 增加是否为第一个任务节点标识
@@ -300,7 +300,7 @@ public class SysUnitController {
) )
)); ));
} }
List<Tree<String>> treeList = TreeUtil.build(nodeList, StrUtil.blankToDefault(pid, "0000")); List<Tree<String>> treeList = TreeUtil.build(nodeList, StrUtil.blankToDefault(pid, "0"));
// NutMap menuMap = NutMap.NEW(); // NutMap menuMap = NutMap.NEW();
// for (Sys_unit unit : list) { // for (Sys_unit unit : list) {
@@ -326,7 +326,7 @@ public class SysUnitController {
public Object addDo(@Param("..") Sys_unit unit, @Param("parentId") String parentId, HttpServletRequest req) { public Object addDo(@Param("..") Sys_unit unit, @Param("parentId") String parentId, HttpServletRequest req) {
try { try {
if ("root".equals(parentId)) { if ("root".equals(parentId)) {
parentId = ""; parentId = "0";
} }
unit.setCreatedBy(SecurityUtil.getUserId()); unit.setCreatedBy(SecurityUtil.getUserId());
unit.setUnitType("用户自建"); unit.setUnitType("用户自建");
@@ -60,6 +60,7 @@ public class SysV4ServController {
cnd.where().andLike("t.disPlayName", keyword); cnd.where().andLike("t.disPlayName", keyword);
} }
cnd.andEX("t.category", "=", categoryId); cnd.andEX("t.category", "=", categoryId);
cnd.andEX("t.pinyinName", "=", letter);
sql.setCondition(cnd); sql.setCondition(cnd);
List<NutMap> list = sysMenuService.listMap(sql); List<NutMap> list = sysMenuService.listMap(sql);
return Result.success(list); return Result.success(list);
@@ -30,7 +30,7 @@ public class CspProcessor extends AbstractProcessor {
"style-src * 'unsafe-inline' data:; " + "style-src * 'unsafe-inline' data:; " +
"img-src 'self' data: https:; " + "img-src 'self' data: https:; " +
"font-src * data: https:; " + "font-src * data: https:; " +
"connect-src 'self' https:; " + "connect-src 'self' https: webpack:; " +
"frame-ancestors 'self'; " + "frame-ancestors 'self'; " +
"object-src 'self';"; "object-src 'self';";
@@ -37,6 +37,7 @@ 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.dao.util.cri.SqlExpressionGroup;
import org.nutz.ioc.aop.Aop; 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;
@@ -65,232 +66,225 @@ import java.util.*;
@At("/platform/activityDeclare/mine") @At("/platform/activityDeclare/mine")
public class ActivityDeclareMineController { public class ActivityDeclareMineController {
@Inject @Inject
private Dao dao; private Dao dao;
@Inject @Inject
private FlowEngine flowEngine; private FlowEngine flowEngine;
@Inject @Inject
private SysOfficeTemplateUtil sysOfficeTemplateUtil; private SysOfficeTemplateUtil sysOfficeTemplateUtil;
@Inject @Inject
private ActivityDeclareService activityDeclareService; private ActivityDeclareService activityDeclareService;
@At("") @At("")
@SaCheckPermission("activityDeclare.mine") @SaCheckPermission("activityDeclare.mine")
@Ok("beetl:/platform/zhgh/activity/declarereimbursement/declare/mine/index.html") @Ok("beetl:/platform/zhgh/activity/declarereimbursement/declare/mine/index.html")
public void index() { public void index() {
} }
@At @At
@ApiOperation("活动申报,我的申请列表") @ApiOperation("活动申报,我的申请列表")
@SaCheckPermission("activityDeclare.mine") @SaCheckPermission("activityDeclare.mine")
public Result pageData(CommonPageParam pageParam) { public Result pageData(CommonPageParam pageParam) {
Sql sql = Sqls.create(""" Sql sql = Sqls.create("""
SELECT SELECT
info.id, info.id,
info.userName, info.userName,
info.mobile, info.mobile,
info.loginName, info.loginName,
info.applyTime, info.applyTime,
info.activityName, info.activityName,
info.activityAddress, info.activityAddress,
info.planStartTime, info.planStartTime,
info.planEndTime, info.planEndTime,
info.declareUnitName, info.declareUnitName,
info.activityType, info.activityType,
info.activityContent, info.activityContent,
info.activityNumber, info.activityNumber,
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,
IF((SELECT taskName FROM wf_process_task tt WHERE tt.id = t.taskParentId) = 'startTask', 1, 0) canRevoke, IF((SELECT taskName FROM wf_process_task tt WHERE tt.id = t.taskParentId) = 'startTask', 1, 0) canRevoke,
(select MAX(id) from wf_process_task where processInstanceId = ins.id and taskName = 'startTask' AND taskState in (10,20)) AS startTaskId (select MAX(id) from wf_process_task where processInstanceId = ins.id and taskName = 'startTask' AND taskState in (10,20)) AS startTaskId
FROM FROM
activity_declare_info info activity_declare_info info
LEFT JOIN `wf_process_instance` ins ON ins.businessNo = info.id 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 LEFT JOIN wf_process_task t ON t.processInstanceId = ins.id AND t.taskState = 10
LEFT JOIN wf_process_task_actor ta ON ta.processTaskId = t.id LEFT JOIN wf_process_task_actor ta ON ta.processTaskId = t.id
$condition $condition
"""); """);
Cnd cnd = Cnd.NEW(); Cnd cnd = Cnd.NEW();
pageParam.buildSearch(cnd, "info."); pageParam.buildSearch(cnd, "info.");
if (!AuthUtil.hasRoleOr(RoleConstant.SYSADMIN.name(), RoleConstant.SCHOOL_UNION_MEMBER_ADMIN.name())) { if (StrUtil.isAllBlank(pageParam.getPageOrderName(), pageParam.getPageOrderBy())) {
if (AuthUtil.hasRole(RoleConstant.BRANCH_UNION_CHAIRMAN.name())) { cnd.desc("info.applyTime");
cnd.and("info.unionId", "=", SecurityUtil.getUnionId()); } else {
} else { cnd.orderBy("info." + pageParam.getPageOrderName(), PageUtil.getOrder(pageParam.getPageOrderBy()));
cnd.and("info.userId", "=", SecurityUtil.getUserId()); }
} sql.setCondition(cnd);
} Pagination<NutMap> pagination = activityDeclareService.listPageMap(pageParam.getPageNumber(), pageParam.getPageSize(), sql);
if (StrUtil.isAllBlank(pageParam.getPageOrderName(), pageParam.getPageOrderBy())) { return Result.success().addData(pagination);
cnd.desc("info.applyTime"); }
} else {
cnd.orderBy("info." + pageParam.getPageOrderName(), PageUtil.getOrder(pageParam.getPageOrderBy()));
}
sql.setCondition(cnd);
Pagination<NutMap> pagination = activityDeclareService.listPageMap(pageParam.getPageNumber(), pageParam.getPageSize(), sql);
return Result.success().addData(pagination);
}
@At @At
@ApiOperation("活动申报,查看活动申报") @ApiOperation("活动申报,查看活动申报")
@SaCheckPermission("activityDeclare") @SaCheckPermission("activityDeclare")
public Result findOne(@Valid String id) { public Result findOne(@Valid String id) {
ActivityDeclareInfo info = dao.fetch(ActivityDeclareInfo.class, id); ActivityDeclareInfo info = dao.fetch(ActivityDeclareInfo.class, id);
return Result.success().addData(info); return Result.success().addData(info);
} }
@At @At
@ApiOperation("删除活动申报") @ApiOperation("删除活动申报")
@Aop(TransAop.READ_COMMITTED) @Aop(TransAop.READ_COMMITTED)
@SaCheckPermission("activityDeclare.mine") @SaCheckPermission("activityDeclare.mine")
@SLog(tag = "活动申报", msg = "删除活动申报id: ${args[0]}") @SLog(tag = "活动申报", msg = "删除活动申报id: ${args[0]}")
public Result onDelete(@Valid String id) { public Result onDelete(@Valid String id) {
dao.clear(ActivityDeclareInfo.class, Cnd.where("id", "=", id)); dao.clear(ActivityDeclareInfo.class, Cnd.where("id", "=", id));
// 删除流程相关 // 删除流程相关
flowEngine.processInstanceService().deleteProcessInstanceByBusinessKey(id); flowEngine.processInstanceService().deleteProcessInstanceByBusinessKey(id);
// 如果有报销的流程,也一并删除 // 如果有报销的流程,也一并删除
ActivityReimbursementInfo reimbursementInfo = dao.fetch(ActivityReimbursementInfo.class, Cnd.where("declareId", "=", id)); ActivityReimbursementInfo reimbursementInfo = dao.fetch(ActivityReimbursementInfo.class, Cnd.where("declareId", "=", id));
if (Lang.isNotEmpty(reimbursementInfo)) { if (Lang.isNotEmpty(reimbursementInfo)) {
dao.clear(ActivityReimbursementInfo.class, Cnd.where("id", "=", reimbursementInfo.getId())); dao.clear(ActivityReimbursementInfo.class, Cnd.where("id", "=", reimbursementInfo.getId()));
// 删除流程相关 // 删除流程相关
flowEngine.processInstanceService().deleteProcessInstanceByBusinessKey(reimbursementInfo.getId()); flowEngine.processInstanceService().deleteProcessInstanceByBusinessKey(reimbursementInfo.getId());
} }
return Result.success(); return Result.success();
} }
@At @At
@Ok("void") @Ok("void")
@SaCheckPermission("activityDeclare.mine") @SaCheckPermission("activityDeclare.mine")
@SLog(tag = "活动申报", msg = "导出活动申报表") @SLog(tag = "活动申报", msg = "导出活动申报表")
public void doExportDeclare(@Valid String id, HttpServletResponse response) { public void doExportDeclare(@Valid String id, HttpServletResponse response) {
HashMap<String, Object> docData = new HashMap<>(); HashMap<String, Object> docData = new HashMap<>();
Sql sql = Sqls.create(""" Sql sql = Sqls.create("""
SELECT SELECT
info.*, info.*,
ins.id AS instanceId ins.id AS instanceId
FROM FROM
`activity_declare_info` info `activity_declare_info` info
LEFT JOIN wf_process_instance ins ON ins.businessNo = info.id LEFT JOIN wf_process_instance ins ON ins.businessNo = info.id
WHERE WHERE
ins.state = 20 AND info.id = @id ins.state = 20 AND info.id = @id
""").setParam("id", id); """).setParam("id", id);
sql.setCallback(Sqls.callback.map()); sql.setCallback(Sqls.callback.map());
dao.execute(sql); dao.execute(sql);
NutMap info = (NutMap) sql.getResult(); NutMap info = (NutMap) sql.getResult();
String activityContent = info.getString("activityContent"); String activityContent = info.getString("activityContent");
info.put("activityContent", sysOfficeTemplateUtil.convertRichTextToDocText(activityContent)); info.put("activityContent", sysOfficeTemplateUtil.convertRichTextToDocText(activityContent));
docData.put("schoolName", Globals.AppName); docData.put("schoolName", Globals.AppName);
docData.put("info", info); docData.put("info", info);
List<ProcessTaskVO> doneTaskVos = new ArrayList<>(); List<ProcessTaskVO> doneTaskVos = new ArrayList<>();
List<ProcessTask> doneTaskList = flowEngine.processTaskService().getDoneTaskList(info.getLong("instanceId"), null); List<ProcessTask> doneTaskList = flowEngine.processTaskService().getDoneTaskList(info.getLong("instanceId"), null);
for (ProcessTask doneTask : doneTaskList) { for (ProcessTask doneTask : doneTaskList) {
ProcessTaskVO taskVO = flowEngine.processTaskService().findById(doneTask.getId()); ProcessTaskVO taskVO = flowEngine.processTaskService().findById(doneTask.getId());
doneTaskVos.add(taskVO); doneTaskVos.add(taskVO);
} }
// 分工会审核 // 分工会审核
doneTaskVos.stream().filter(task -> "分工会审核".equals(task.getDisplayName())) doneTaskVos.stream().filter(task -> "分工会审核".equals(task.getDisplayName()))
.max(Comparator.comparing(ProcessTaskVO::getCreatedAt)) .max(Comparator.comparing(ProcessTaskVO::getCreatedAt))
.ifPresent(v -> { .ifPresent(v -> {
Dict taskFormData = v.getTaskFormData(); Dict taskFormData = v.getTaskFormData();
HashMap<String, Object> approval = new HashMap<>(); HashMap<String, Object> approval = new HashMap<>();
approval.put("date", DateUtil.format(v.getFinishTime(), "yyyy年MM月dd日")); approval.put("date", DateUtil.format(v.getFinishTime(), "yyyy年MM月dd日"));
approval.put("user", taskFormData.getStr("tf_userName")); approval.put("user", taskFormData.getStr("tf_userName"));
if (StrUtil.isNotBlank(taskFormData.getStr("tf_sign"))) { if (StrUtil.isNotBlank(taskFormData.getStr("tf_sign"))) {
approval.put("sign", sysOfficeTemplateUtil.createPictureRenderData(taskFormData.getStr("tf_sign"))); approval.put("sign", sysOfficeTemplateUtil.createPictureRenderData(taskFormData.getStr("tf_sign")));
} }
approval.put("opinion", taskFormData.getStr("tf_opinion")); approval.put("opinion", taskFormData.getStr("tf_opinion"));
docData.put("fgh", approval); docData.put("fgh", approval);
}); });
// 协会负责人审核 // 协会负责人审核
doneTaskVos.stream().filter(task -> "协会负责人审核".equals(task.getDisplayName())) doneTaskVos.stream().filter(task -> "协会负责人审核".equals(task.getDisplayName()))
.max(Comparator.comparing(ProcessTaskVO::getCreatedAt)) .max(Comparator.comparing(ProcessTaskVO::getCreatedAt))
.ifPresent(v -> { .ifPresent(v -> {
Dict taskFormData = v.getTaskFormData(); Dict taskFormData = v.getTaskFormData();
HashMap<String, Object> approval = new HashMap<>(); HashMap<String, Object> approval = new HashMap<>();
approval.put("date", DateUtil.format(v.getFinishTime(), "yyyy年MM月dd日")); approval.put("date", DateUtil.format(v.getFinishTime(), "yyyy年MM月dd日"));
approval.put("user", taskFormData.getStr("tf_userName")); approval.put("user", taskFormData.getStr("tf_userName"));
if (StrUtil.isNotBlank(taskFormData.getStr("tf_sign"))) { if (StrUtil.isNotBlank(taskFormData.getStr("tf_sign"))) {
approval.put("sign", sysOfficeTemplateUtil.createPictureRenderData(taskFormData.getStr("tf_sign"))); approval.put("sign", sysOfficeTemplateUtil.createPictureRenderData(taskFormData.getStr("tf_sign")));
} }
approval.put("opinion", taskFormData.getStr("tf_opinion")); approval.put("opinion", taskFormData.getStr("tf_opinion"));
docData.put("xh", approval); docData.put("xh", approval);
}); });
// 校工会负责人审核 // 校工会负责人审核
doneTaskVos.stream().filter(task -> "校工会负责人审核".equals(task.getDisplayName())) doneTaskVos.stream().filter(task -> "校工会负责人审核".equals(task.getDisplayName()))
.max(Comparator.comparing(ProcessTaskVO::getCreatedAt)) .max(Comparator.comparing(ProcessTaskVO::getCreatedAt))
.ifPresent(v -> { .ifPresent(v -> {
Dict taskFormData = v.getTaskFormData(); Dict taskFormData = v.getTaskFormData();
HashMap<String, Object> approval = new HashMap<>(); HashMap<String, Object> approval = new HashMap<>();
approval.put("date", DateUtil.format(v.getFinishTime(), "yyyy年MM月dd日")); approval.put("date", DateUtil.format(v.getFinishTime(), "yyyy年MM月dd日"));
approval.put("user", taskFormData.getStr("tf_userName")); approval.put("user", taskFormData.getStr("tf_userName"));
if (StrUtil.isNotBlank(taskFormData.getStr("tf_sign"))) { if (StrUtil.isNotBlank(taskFormData.getStr("tf_sign"))) {
approval.put("sign", sysOfficeTemplateUtil.createPictureRenderData(taskFormData.getStr("tf_sign"))); approval.put("sign", sysOfficeTemplateUtil.createPictureRenderData(taskFormData.getStr("tf_sign")));
} }
approval.put("opinion", taskFormData.getStr("tf_opinion")); approval.put("opinion", taskFormData.getStr("tf_opinion"));
docData.put("xfzr", approval); docData.put("xfzr", approval);
}); });
// 校工会主席审核 // 校工会主席审核
doneTaskVos.stream().filter(task -> "校工会主席审核".equals(task.getDisplayName())) doneTaskVos.stream().filter(task -> "校工会主席审核".equals(task.getDisplayName()))
.max(Comparator.comparing(ProcessTaskVO::getCreatedAt)) .max(Comparator.comparing(ProcessTaskVO::getCreatedAt))
.ifPresent(v -> { .ifPresent(v -> {
Dict taskFormData = v.getTaskFormData(); Dict taskFormData = v.getTaskFormData();
HashMap<String, Object> approval = new HashMap<>(); HashMap<String, Object> approval = new HashMap<>();
approval.put("date", DateUtil.format(v.getFinishTime(), "yyyy年MM月dd日")); approval.put("date", DateUtil.format(v.getFinishTime(), "yyyy年MM月dd日"));
approval.put("user", taskFormData.getStr("tf_userName")); approval.put("user", taskFormData.getStr("tf_userName"));
if (StrUtil.isNotBlank(taskFormData.getStr("tf_sign"))) { if (StrUtil.isNotBlank(taskFormData.getStr("tf_sign"))) {
approval.put("sign", sysOfficeTemplateUtil.createPictureRenderData(taskFormData.getStr("tf_sign"))); approval.put("sign", sysOfficeTemplateUtil.createPictureRenderData(taskFormData.getStr("tf_sign")));
} }
approval.put("opinion", taskFormData.getStr("tf_opinion")); approval.put("opinion", taskFormData.getStr("tf_opinion"));
docData.put("xzx", approval); docData.put("xzx", approval);
}); });
String budgetsStr = info.getString("budgets"); String budgetsStr = info.getString("budgets");
List<ActivityBudgetVO> list = JSONUtil.parseArray(budgetsStr).toList(ActivityBudgetVO.class); List<ActivityBudgetVO> list = JSONUtil.parseArray(budgetsStr).toList(ActivityBudgetVO.class);
for (int i = 0; i < list.size(); i++) { for (int i = 0; i < list.size(); i++) {
list.get(i).setRanking(i + 1); list.get(i).setRanking(i + 1);
} }
docData.put("budgets", list); docData.put("budgets", list);
LoopRowTableRenderPolicy policy = new LoopRowTableRenderPolicy(); LoopRowTableRenderPolicy policy = new LoopRowTableRenderPolicy();
Configure config = Configure.builder() Configure config = Configure.builder()
.bind("budgets", policy) .bind("budgets", policy)
.build(); .build();
String fileName = Globals.AppName + "" + info.getString("activityName") + "】申报表.docx"; String fileName = Globals.AppName + "" + info.getString("activityName") + "】申报表.docx";
try (ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream()) { try (ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream()) {
XWPFTemplate.compile(sysOfficeTemplateUtil.getTemplate("activity_declare"), config).render(docData).writeAndClose(byteArrayOutputStream); XWPFTemplate.compile(sysOfficeTemplateUtil.getTemplate("activity_declare"), config).render(docData).writeAndClose(byteArrayOutputStream);
CommonDownloadUtil.download(fileName, byteArrayOutputStream.toByteArray(), response); CommonDownloadUtil.download(fileName, byteArrayOutputStream.toByteArray(), response);
} catch (IOException e) { } catch (IOException e) {
log.error("活动申报表导出失败,id:{},错误信息:{}", id, e.getMessage()); log.error("活动申报表导出失败,id:{},错误信息:{}", id, e.getMessage());
} }
} }
} }
@@ -51,15 +51,18 @@ public class CommonPageParam extends PageForm {
if (!AuthUtil.hasRoleOr(RoleConstant.SYSADMIN.name(), RoleConstant.SCHOOL_UNION_ADMIN.name())) { if (!AuthUtil.hasRoleOr(RoleConstant.SYSADMIN.name(), RoleConstant.SCHOOL_UNION_ADMIN.name())) {
cnd.and(prefix + "declareUnitName", "<>", ActivityDeclareReimbursement.SCHOOL_UNION.name()); cnd.and(prefix + "declareUnitName", "<>", ActivityDeclareReimbursement.SCHOOL_UNION.name());
SqlExpressionGroup group = new SqlExpressionGroup();
if (AuthUtil.hasRoleOr(RoleConstant.BRANCH_UNION_CHAIRMAN.name(), if (AuthUtil.hasRoleOr(RoleConstant.BRANCH_UNION_CHAIRMAN.name(),
RoleConstant.BRANCH_UNION_ADMIN.name(), RoleConstant.BRANCH_UNION_ADMIN.name(),
RoleConstant.BRANCH_UNION_OPERATOR.name())) { RoleConstant.BRANCH_UNION_OPERATOR.name())) {
cnd.and(prefix + "unionid", "=", SecurityUtil.getUnionId()); group.or(prefix + "unionid", "=", SecurityUtil.getUnionId());
} else if (AuthUtil.hasRoleOr(RoleConstant.CLUB_MANAGER.name(), RoleConstant.CLUB_PRESIDENT.name())) {
// cnd.and(prefix + "clubId", "=", );
} else {
cnd.andEX(prefix + "userId", "=", SecurityUtil.getUserId());
} }
if (AuthUtil.hasRoleOr(RoleConstant.CLUB_MANAGER.name(), RoleConstant.CLUB_PRESIDENT.name())) {
// cnd.and(prefix + "clubId", "=", );
group.or(prefix + "clubId", "in", SecurityUtil.getClubIds());
}
group.or(prefix + "userId", "=", SecurityUtil.getUserId());
cnd.and(group);
} else { } else {
cnd.andEX(prefix + "unionId", "=", this.getUnionId()); cnd.andEX(prefix + "unionId", "=", this.getUnionId());
cnd.andEX(prefix + "clubId", "=", this.getClubId()); cnd.andEX(prefix + "clubId", "=", this.getClubId());
@@ -91,6 +91,7 @@ public class ActivityBudgetSchoolAuditController {
cnd.and("t.taskName", "=", "b6f29037-972d-4b97-8677-c3b3672ef0dc"); cnd.and("t.taskName", "=", "b6f29037-972d-4b97-8677-c3b3672ef0dc");
// cnd.and("ta.actorId", "in", List.of(SecurityUtil.getUserId())); // cnd.and("ta.actorId", "in", List.of(SecurityUtil.getUserId()));
cnd.andEX("info.unionId", "=", unionId); cnd.andEX("info.unionId", "=", unionId);
cnd.andEX("info.clubId", "=", clubId);
cnd.andEX("info.outlayManageSource", "=", outlayManageSource); cnd.andEX("info.outlayManageSource", "=", outlayManageSource);
cnd.andEX("info.budgetReimburseType", "=", budgetReimburseType); cnd.andEX("info.budgetReimburseType", "=", budgetReimburseType);
@@ -91,6 +91,7 @@ public class ActivityBudgetSchoolPrincipalController {
cnd.and("t.taskName", "=", "0b6aea8c-9d24-4d6d-b10b-4c930c919093"); cnd.and("t.taskName", "=", "0b6aea8c-9d24-4d6d-b10b-4c930c919093");
cnd.and("ta.actorId", "in", List.of(SecurityUtil.getUserId())); cnd.and("ta.actorId", "in", List.of(SecurityUtil.getUserId()));
cnd.andEX("info.unionId", "=", unionId); cnd.andEX("info.unionId", "=", unionId);
cnd.andEX("info.clubId", "=", clubId);
cnd.andEX("info.outlayManageSource", "=", outlayManageSource); cnd.andEX("info.outlayManageSource", "=", outlayManageSource);
cnd.andEX("info.budgetReimburseType", "=", budgetReimburseType); cnd.andEX("info.budgetReimburseType", "=", budgetReimburseType);
@@ -2,6 +2,7 @@ package com.budwk.app.zhgh.democratic.proposal.controller.common;
import cn.dev33.satoken.annotation.SaCheckLogin; import cn.dev33.satoken.annotation.SaCheckLogin;
import cn.dev33.satoken.annotation.SaCheckPermission; import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.hutool.core.util.StrUtil;
import com.budwk.app.base.result.Result; import com.budwk.app.base.result.Result;
import com.budwk.app.zhgh.democratic.proposal.models.ProposalConfig; import com.budwk.app.zhgh.democratic.proposal.models.ProposalConfig;
import com.budwk.app.zhgh.democratic.proposal.models.ProposalType; import com.budwk.app.zhgh.democratic.proposal.models.ProposalType;
@@ -49,8 +50,11 @@ public class ProposalCommonController {
@At @At
@SaCheckLogin @SaCheckLogin
@ApiOperation("查询全部的教代会") @ApiOperation("查询全部的教代会")
public Result listSession() { public Result listSession(String orderBy) {
List<Teacher_congress_session> list = dao.query(Teacher_congress_session.class, Cnd.NEW().desc("startDate")); if (StrUtil.isBlank(orderBy)) {
orderBy = "desc";
}
List<Teacher_congress_session> list = dao.query(Teacher_congress_session.class, Cnd.NEW().orderBy("startDate", orderBy));
return Result.success(list); return Result.success(list);
} }
@@ -89,7 +89,13 @@ public class ProposalSeniorBasicController {
@ApiOperation(value = "提案内容修改") @ApiOperation(value = "提案内容修改")
@Aop(TransAop.READ_COMMITTED) @Aop(TransAop.READ_COMMITTED)
public Result update(@Valid @Param("info") ProposalInfo proposalInfo) { public Result update(@Valid @Param("info") ProposalInfo proposalInfo) {
dao.update(proposalInfo,"^name|typeId|brief|measures|excerpt|suggestUnits$"); int count = dao.count(ProposalInfo.class, Cnd.where("code", "=", proposalInfo.getCode()).and("id", "<>", proposalInfo.getId()));
if (count > 0) {
return Result.error("提案编号已存在");
}
dao.update(proposalInfo,"^code|name|typeId|brief|measures|excerpt|suggestUnits|files$");
return Result.success(); return Result.success();
} }
@@ -93,7 +93,8 @@ public class ProposalSchoolLeaderApprovalController {
t.taskParentId, t.taskParentId,
t.variable taskVariable, t.variable taskVariable,
IFNULL(GROUP_CONCAT(DISTINCT nt.displayName),'结束') curTaskName, IFNULL(GROUP_CONCAT(DISTINCT nt.displayName),'结束') curTaskName,
IF(rt.id IS NOT NULL, 1, 0) AS canRevoke IF(rt.id IS NOT NULL, 1, 0) AS canRevoke,
GROUP_CONCAT(DISTINCT ta.actorName, '(', ta.actorAccount, ')' ) AS auditUser
FROM FROM
wf_process_task t wf_process_task t
LEFT JOIN wf_process_instance ins ON ins.id = t.processInstanceId LEFT JOIN wf_process_instance ins ON ins.id = t.processInstanceId
@@ -104,7 +104,8 @@ public class ProposalUnderTakeReplyController {
t.variable->>'$.underTakeName' AS underTakeName, t.variable->>'$.underTakeName' AS underTakeName,
IF(JSON_EXTRACT(t.variable, '$.underTakeIsMaster') = true, 1, 0) AS underTakeIsMaster, IF(JSON_EXTRACT(t.variable, '$.underTakeIsMaster') = true, 1, 0) AS underTakeIsMaster,
t.variable->>'$.tf_transferUserId' AS tf_transferUserId, t.variable->>'$.tf_transferUserId' AS tf_transferUserId,
transferUser.username AS transferUserName transferUser.username AS transferUserName,
GROUP_CONCAT(DISTINCT ta.actorName, '(', ta.actorAccount, ')' ) AS auditUser
FROM FROM
wf_process_task t wf_process_task t
LEFT JOIN wf_process_instance ins ON ins.id = t.processInstanceId LEFT JOIN wf_process_instance ins ON ins.id = t.processInstanceId
@@ -13,8 +13,10 @@ import com.budwk.app.sys.models.Sys_user_role;
import com.budwk.app.sys.services.SysRoleService; import com.budwk.app.sys.services.SysRoleService;
import com.budwk.app.zhgh.democratic.proposal.models.ProposalReplyUnit; import com.budwk.app.zhgh.democratic.proposal.models.ProposalReplyUnit;
import com.budwk.app.zhgh.democratic.proposal.models.ProposalUndertake; import com.budwk.app.zhgh.democratic.proposal.models.ProposalUndertake;
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.ioc.aop.Aop;
import java.util.List; import java.util.List;
@@ -22,7 +24,9 @@ import java.util.List;
* 提案主办单位处理人 * 提案主办单位处理人
*/ */
public class ProposalMasterUnitAssignmentHandler implements AssignmentHandler { public class ProposalMasterUnitAssignmentHandler implements AssignmentHandler {
@Override @Override
@Aop(TransAop.READ_COMMITTED)
public List<String> assign(TaskModel model, Execution execution) { public List<String> assign(TaskModel model, Execution execution) {
Dao dao = ServiceContext.find(Dao.class); Dao dao = ServiceContext.find(Dao.class);
SysRoleService sysRoleService = ServiceContext.find(SysRoleService.class); SysRoleService sysRoleService = ServiceContext.find(SysRoleService.class);
@@ -42,7 +46,8 @@ public class ProposalMasterUnitAssignmentHandler implements AssignmentHandler {
// 如果没有 认为是需要重新答复 从记录表里取值 // 如果没有 认为是需要重新答复 从记录表里取值
if(StrUtil.isBlank(masterUnitId)){ if(StrUtil.isBlank(masterUnitId)){
ProposalReplyUnit masterUnit = dao.fetch(ProposalReplyUnit.class, Cnd.where(ProposalReplyUnit::getProposalId, "=", proposalId).and(ProposalReplyUnit::getIsMaster, "=", 1)); ProposalReplyUnit masterUnit = dao.fetch(ProposalReplyUnit.class, Cnd.where(ProposalReplyUnit::getProposalId, "=", proposalId)
.and(ProposalReplyUnit::getIsMaster, "=", 1));
if (masterUnit == null) { if (masterUnit == null) {
throw new BaseException("系统异常"); throw new BaseException("系统异常");
} }
@@ -26,9 +26,13 @@ public class ProposalCaseTaskRevokeEventListener implements ProcessEventListener
if (event.getEventType() == ProcessEventTypeEnum.PROCESS_TASK_REVOKE) { if (event.getEventType() == ProcessEventTypeEnum.PROCESS_TASK_REVOKE) {
Long taskId = event.getSourceId(); Long taskId = event.getSourceId();
ProcessTask task = dao.fetch(ProcessTask.class, taskId); ProcessTask task = dao.fetch(ProcessTask.class, taskId);
ProcessInstance instance = dao.fetch(ProcessInstance.class, task.getProcessInstanceId());
String businessNo = instance.getBusinessNo(); ProcessTask parentProcessTask = dao.fetch(ProcessTask.class, task.getTaskParentId());
dao.clear(ProposalReplyUnit.class, Cnd.where(ProposalReplyUnit::getProposalId, "=", businessNo)); if ("committee".equals(parentProcessTask.getTaskName())) {
ProcessInstance instance = dao.fetch(ProcessInstance.class, task.getProcessInstanceId());
String businessNo = instance.getBusinessNo();
dao.clear(ProposalReplyUnit.class, Cnd.where(ProposalReplyUnit::getProposalId, "=", businessNo));
}
} }
} }
} }
@@ -0,0 +1,39 @@
package com.budwk.app.zhgh.democratic.proposal.listenter;
import com.budwk.app.base.event.flow.jumptofirsttask.FlowJumpToFirstTaskNodeListener;
import com.budwk.app.flow.entity.ProcessInstance;
import com.budwk.app.flow.entity.ProcessTask;
import com.budwk.app.flow.service.ProcessInstanceService;
import com.budwk.app.flow.service.ProcessTaskService;
import com.budwk.app.zhgh.democratic.proposal.models.ProposalSecond;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
/**
* @version 1.0
* @Author FKY
* @nameProposalJumpToWriteEventListener
* @Date 2025/12/20 14:50
* @注释 提案退回发起人监听器
*/
@IocBean
public class ProposalJumpToWriteEventListener implements FlowJumpToFirstTaskNodeListener {
@Inject
private Dao dao;
@Inject
private ProcessTaskService processTaskService;
@Inject
private ProcessInstanceService processInstanceService;
@Override
public void receive(Long processTaskId) {
ProcessTask processTask = processTaskService.getById(processTaskId);
ProcessInstance processInstance = processInstanceService.getById(processTask.getProcessInstanceId());
// 清空提案的附议人
dao.clear(ProposalSecond.class, Cnd.where(ProposalSecond::getProposalId, "=", processInstance.getBusinessNo()));
}
}
@@ -8,6 +8,7 @@ import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import org.nutz.dao.Cnd; import org.nutz.dao.Cnd;
import org.nutz.dao.util.cri.SqlExpressionGroup; import org.nutz.dao.util.cri.SqlExpressionGroup;
import org.nutz.lang.Lang;
@EqualsAndHashCode(callSuper = true) @EqualsAndHashCode(callSuper = true)
@Data @Data
@@ -58,6 +59,8 @@ public class ProposalQueryComprehensiveParam extends PageForm {
@ApiModelProperty(name = "通用关键字") @ApiModelProperty(name = "通用关键字")
private String commonKeyword; private String commonKeyword;
@ApiModelProperty(name = "搜索关键字")
private String createUserKeyword;
/** /**
@@ -71,7 +74,12 @@ public class ProposalQueryComprehensiveParam extends PageForm {
cnd = Cnd.NEW(); cnd = Cnd.NEW();
} }
//教代会届次 //教代会届次
cnd.andEX("info.sessionId", "=", searchParam.getSessionId()); if (Lang.isNotEmpty(searchParam.getSessionIds())) {
cnd.and("info.sessionId", "in", searchParam.getSessionIds());
} else {
cnd.andEX("info.sessionId", "=", searchParam.getSessionId());
}
//提案名称 //提案名称
if (StrUtil.isNotBlank(searchParam.getName())) { if (StrUtil.isNotBlank(searchParam.getName())) {
cnd.where().andLike("info.name", searchParam.getName()); cnd.where().andLike("info.name", searchParam.getName());
@@ -93,6 +101,14 @@ public class ProposalQueryComprehensiveParam extends PageForm {
if (StrUtil.isNotBlank(searchParam.getCreateUserName())) { if (StrUtil.isNotBlank(searchParam.getCreateUserName())) {
cnd.where().andLike("info.createUserName", searchParam.getCreateUserName()); cnd.where().andLike("info.createUserName", searchParam.getCreateUserName());
} }
if (StrUtil.isNotBlank(searchParam.getCreateUserKeyword())) {
SqlExpressionGroup seg = new SqlExpressionGroup();
seg.orLike("info.createUserName", searchParam.getCreateUserKeyword());
seg.orLike("info.createUserLoginName", searchParam.getCreateUserKeyword());
cnd.and(seg);
}
// 提案人分工会 // 提案人分工会
cnd.andEX("tcde.unionId", "=", searchParam.getUnionId()); cnd.andEX("tcde.unionId", "=", searchParam.getUnionId());
// 提案人单位 // 提案人单位
@@ -36,6 +36,7 @@ import org.nutz.dao.sql.Sql;
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.json.Json; import org.nutz.json.Json;
import org.nutz.lang.Lang;
import org.nutz.lang.util.NutMap; import org.nutz.lang.util.NutMap;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
@@ -209,7 +210,9 @@ public class ProposalExportServiceImpl extends BaseServiceImpl<ProposalInfo> imp
if (inviteTask != null) { if (inviteTask != null) {
NutMap variable = Json.fromJson(NutMap.class, inviteTask.getVariable()); NutMap variable = Json.fromJson(NutMap.class, inviteTask.getVariable());
List<NutMap> seconders = variable.getAsList(FlowConst.TASK_FORM_DATA_PREFIX + "seconder", NutMap.class); List<NutMap> seconders = variable.getAsList(FlowConst.TASK_FORM_DATA_PREFIX + "seconder", NutMap.class);
list.get(i).put("secondedUserNames", seconders.stream().map(v -> v.getString("userName")).collect(Collectors.joining(","))); if (Lang.isNotEmpty(seconders)) {
list.get(i).put("secondedUserNames", seconders.stream().map(v -> v.getString("userName")).collect(Collectors.joining(",")));
}
} }
} }
@@ -67,174 +67,176 @@ public class TeacherCongressSessionServiceImpl extends BaseServiceImpl<Teacher_c
session.setFullName("" + session.getJ() + "" + session.getC()); session.setFullName("" + session.getJ() + "" + session.getC());
insert(session); insert(session);
//代表团角色ID
Sys_role delegationHeadRole = sysRoleService.getByCode(RoleConstant.TEACHER_CONGRESS_DELEGATION_HEAD);
Sys_role delegationViceHeadRole = sysRoleService.getByCode(RoleConstant.TEACHER_CONGRESS_VICE_DELEGATION_HEAD);
Sys_role delegationContactRole = sysRoleService.getByCode(RoleConstant.TEACHER_CONGRESS_DELEGATION_CONTACT);
// 继承上届信息 // 继承上届信息
//查询本届上次的信息 if (isExtend) {
int c_num = Convert.chineseToNumber(session.getC().replaceAll("", "")); //代表团角色ID
if (c_num == 1) return; Sys_role delegationHeadRole = sysRoleService.getByCode(RoleConstant.TEACHER_CONGRESS_DELEGATION_HEAD);
int last_c_num = c_num - 1; Sys_role delegationViceHeadRole = sysRoleService.getByCode(RoleConstant.TEACHER_CONGRESS_VICE_DELEGATION_HEAD);
String last_c = Convert.numberToChinese(last_c_num, false); Sys_role delegationContactRole = sysRoleService.getByCode(RoleConstant.TEACHER_CONGRESS_DELEGATION_CONTACT);
Teacher_congress_session lastSession = fetch(Cnd.where(Teacher_congress_session::getJ, "=", session.getJ())
.and(Teacher_congress_session::getC, "=", last_c + ""));
if (ObjectUtil.isEmpty(lastSession)) return; //查询本届上次的信息
int c_num = Convert.chineseToNumber(session.getC().replaceAll("", ""));
if (c_num == 1) return;
int last_c_num = c_num - 1;
String last_c = Convert.numberToChinese(last_c_num, false);
Teacher_congress_session lastSession = fetch(Cnd.where(Teacher_congress_session::getJ, "=", session.getJ())
.and(Teacher_congress_session::getC, "=", last_c + ""));
//机构及机构人员数据 if (ObjectUtil.isEmpty(lastSession)) return;
List<Teacher_congress_institution> lastInstitutions = dao().query(Teacher_congress_institution.class, Cnd.where(Teacher_congress_institution::getSessionId, "=", lastSession.getId()));
List<TreeNode<String>> treeNodes = lastInstitutions.stream().map(institution -> new TreeNode<>(institution.getId(), institution.getParentId(), institution.getName(), institution.getLocation()).setExtra(Map.of("code", institution.getCode(), "sessionId", institution.getSessionId()))).toList();
List<Tree<String>> treeList = TreeUtil.build(treeNodes, "0");
insertInstitution(session.getId(), "0", treeList);
//从代表团入手 //机构及机构人员数据
List<Teacher_congress_delegation> lastDelegations = dao().query(Teacher_congress_delegation.class, Cnd.where("sessionId", "=", lastSession.getId())); List<Teacher_congress_institution> lastInstitutions = dao().query(Teacher_congress_institution.class, Cnd.where(Teacher_congress_institution::getSessionId, "=", lastSession.getId()));
for (Teacher_congress_delegation lastDelegation : lastDelegations) { List<TreeNode<String>> treeNodes = lastInstitutions.stream().map(institution -> new TreeNode<>(institution.getId(), institution.getParentId(), institution.getName(), institution.getLocation()).setExtra(Map.of("code", institution.getCode(), "sessionId", institution.getSessionId()))).toList();
//代表团继承 List<Tree<String>> treeList = TreeUtil.build(treeNodes, "0");
Teacher_congress_delegation newDelegation = BeanUtil.copyProperties(lastDelegation, Teacher_congress_delegation.class); insertInstitution(session.getId(), "0", treeList);
newDelegation.setId(null);
newDelegation.setSessionId(session.getId());
dao().insert(newDelegation);
//团长角色权限继承 //从代表团入手
List<Sys_user_role> lastHeadUserRoles = dao().query(Sys_user_role.class, Cnd.where(Sys_user_role::getTcDelegationId, "=", lastDelegation.getId()) List<Teacher_congress_delegation> lastDelegations = dao().query(Teacher_congress_delegation.class, Cnd.where("sessionId", "=", lastSession.getId()));
.and(Sys_user_role::getRoleId, "=", delegationHeadRole.getId())); for (Teacher_congress_delegation lastDelegation : lastDelegations) {
for (Sys_user_role lastHeadUser : lastHeadUserRoles) { //代表团继承
Sys_user_role newHeadUser = BeanUtil.copyProperties(lastHeadUser, Sys_user_role.class); Teacher_congress_delegation newDelegation = BeanUtil.copyProperties(lastDelegation, Teacher_congress_delegation.class);
newHeadUser.setTcDelegationId(newDelegation.getId()); newDelegation.setId(null);
newHeadUser.setTcSessionId(session.getId()); newDelegation.setSessionId(session.getId());
dao().insert(newHeadUser); dao().insert(newDelegation);
}
//副团长角色权限继承
List<Sys_user_role> lastViceHeadUserRoles = dao().query(Sys_user_role.class, Cnd.where(Sys_user_role::getTcDelegationId, "=", lastDelegation.getId())
.and(Sys_user_role::getRoleId, "=", delegationViceHeadRole.getId()));
for (Sys_user_role lastViceHeadUser : lastViceHeadUserRoles) {
Sys_user_role newViceHeadUser = BeanUtil.copyProperties(lastViceHeadUser, Sys_user_role.class);
newViceHeadUser.setTcDelegationId(newDelegation.getId());
newViceHeadUser.setTcSessionId(session.getId());
dao().insert(newViceHeadUser);
}
//联络人角色权限继承
List<Sys_user_role> lastContactUserRoles = dao().query(Sys_user_role.class, Cnd.where(Sys_user_role::getTcDelegationId, "=", lastDelegation.getId())
.and(Sys_user_role::getRoleId, "=", delegationContactRole.getId()));
for (Sys_user_role lastContactUser : lastContactUserRoles) {
Sys_user_role newContactUser = BeanUtil.copyProperties(lastContactUser, Sys_user_role.class);
newContactUser.setTcDelegationId(newDelegation.getId());
newContactUser.setTcSessionId(session.getId());
dao().insert(newContactUser);
}
//组成分工会 //团长角色权限继承
List<Teacher_congress_delegation_union> lastDelegationUnions = dao().query(Teacher_congress_delegation_union.class, Cnd.where(Teacher_congress_delegation_union::getDelegationId, "=", lastDelegation.getId())); List<Sys_user_role> lastHeadUserRoles = dao().query(Sys_user_role.class, Cnd.where(Sys_user_role::getTcDelegationId, "=", lastDelegation.getId())
List<Teacher_congress_delegation_union> newDelegationUnions = lastDelegationUnions.stream().map(lastDelegationUnion -> { .and(Sys_user_role::getRoleId, "=", delegationHeadRole.getId()));
Teacher_congress_delegation_union newDelegationUnion = BeanUtil.copyProperties(lastDelegationUnion, Teacher_congress_delegation_union.class); for (Sys_user_role lastHeadUser : lastHeadUserRoles) {
newDelegationUnion.setId(R.UU32()); Sys_user_role newHeadUser = BeanUtil.copyProperties(lastHeadUser, Sys_user_role.class);
newDelegationUnion.setDelegationId(newDelegation.getId()); newHeadUser.setTcDelegationId(newDelegation.getId());
newDelegationUnion.setSessionId(session.getId()); newHeadUser.setTcSessionId(session.getId());
newDelegationUnion.setCreatedAt(null); dao().insert(newHeadUser);
newDelegationUnion.setUpdatedAt(null); }
newDelegationUnion.setCreatedBy(null); //副团长角色权限继承
newDelegationUnion.setUpdatedBy(null); List<Sys_user_role> lastViceHeadUserRoles = dao().query(Sys_user_role.class, Cnd.where(Sys_user_role::getTcDelegationId, "=", lastDelegation.getId())
return newDelegationUnion; .and(Sys_user_role::getRoleId, "=", delegationViceHeadRole.getId()));
}).toList(); for (Sys_user_role lastViceHeadUser : lastViceHeadUserRoles) {
dao().fastInsert(newDelegationUnions); Sys_user_role newViceHeadUser = BeanUtil.copyProperties(lastViceHeadUser, Sys_user_role.class);
newViceHeadUser.setTcDelegationId(newDelegation.getId());
newViceHeadUser.setTcSessionId(session.getId());
//组成单位 dao().insert(newViceHeadUser);
List<Teacher_congress_delegation_unit> lastDelegationUnits = dao().query(Teacher_congress_delegation_unit.class, Cnd.where(Teacher_congress_delegation_unit::getDelegationId, "=", lastDelegation.getId())); }
List<Teacher_congress_delegation_unit> newDelegationUnits = lastDelegationUnits.stream().map(lastDelegationUnit -> { //联络人角色权限继承
Teacher_congress_delegation_unit newDelegationUnit = BeanUtil.copyProperties(lastDelegationUnit, Teacher_congress_delegation_unit.class); List<Sys_user_role> lastContactUserRoles = dao().query(Sys_user_role.class, Cnd.where(Sys_user_role::getTcDelegationId, "=", lastDelegation.getId())
newDelegationUnit.setId(R.UU32()); .and(Sys_user_role::getRoleId, "=", delegationContactRole.getId()));
newDelegationUnit.setDelegationId(newDelegation.getId()); for (Sys_user_role lastContactUser : lastContactUserRoles) {
newDelegationUnit.setSessionId(session.getId()); Sys_user_role newContactUser = BeanUtil.copyProperties(lastContactUser, Sys_user_role.class);
newDelegationUnit.setCreatedAt(null); newContactUser.setTcDelegationId(newDelegation.getId());
newDelegationUnit.setUpdatedAt(null); newContactUser.setTcSessionId(session.getId());
newDelegationUnit.setCreatedBy(null); dao().insert(newContactUser);
newDelegationUnit.setUpdatedBy(null);
return newDelegationUnit;
}).toList();
dao().fastInsert(newDelegationUnits);
}
//代表数据 单位 分工会 要根据最新的设置来调整
//代表数据
List<Teacher_congress_delegate> lastDelegates = dao().query(Teacher_congress_delegate.class, Cnd.where(Teacher_congress_delegate::getSessionId, "=", lastSession.getId()));
List<Teacher_congress_delegate> newDelegates = lastDelegates.stream().map(lastDelegate -> {
Teacher_congress_delegate newDelegate = BeanUtil.copyProperties(lastDelegate, Teacher_congress_delegate.class);
newDelegate.setId(R.UU32());
newDelegate.setSessionId(session.getId());
newDelegate.setCreatedAt(null);
newDelegate.setUpdatedAt(null);
newDelegate.setCreatedBy(null);
newDelegate.setUpdatedBy(null);
//查询本人最新的信息从用户表中
View_user vwUser = dao().fetch(View_user.class, Cnd.where(Sys_user::getId, "=", lastDelegate.getUserId()));
if (ObjectUtil.isNotEmpty(vwUser)) {
newDelegate.setUnitId(vwUser.getUnitId());
newDelegate.setUnitName(vwUser.getUnitName());
newDelegate.setUnionId(vwUser.getUnionId());
newDelegate.setUnionName(vwUser.getUnionName());
newDelegate.setSex(vwUser.getSex());
newDelegate.setMobile(vwUser.getMobile());
//去查询他当前所处的单位、分工会处于哪个代表团
if (StrUtil.isNotBlank(vwUser.getUnionId())) {
Teacher_congress_delegation_union delegationUnion = dao().fetch(Teacher_congress_delegation_union.class, Cnd.where(Teacher_congress_delegation_union::getSessionId, "=", session.getId())
.and(Teacher_congress_delegation_union::getUnionId, "=", vwUser.getUnionId()));
if (ObjectUtil.isNotEmpty(delegationUnion)) {
newDelegate.setDelegationId(delegationUnion.getDelegationId());
}
} }
if (StrUtil.isNotBlank(vwUser.getUnitId())) { //组成分工会
Teacher_congress_delegation_unit delegationUnit = dao().fetch(Teacher_congress_delegation_unit.class, Cnd.where(Teacher_congress_delegation_unit::getSessionId, "=", session.getId()) List<Teacher_congress_delegation_union> lastDelegationUnions = dao().query(Teacher_congress_delegation_union.class, Cnd.where(Teacher_congress_delegation_union::getDelegationId, "=", lastDelegation.getId()));
.and(Teacher_congress_delegation_unit::getUnitId, "=", vwUser.getUnitId())); List<Teacher_congress_delegation_union> newDelegationUnions = lastDelegationUnions.stream().map(lastDelegationUnion -> {
if (ObjectUtil.isNotEmpty(delegationUnit)) { Teacher_congress_delegation_union newDelegationUnion = BeanUtil.copyProperties(lastDelegationUnion, Teacher_congress_delegation_union.class);
newDelegate.setDelegationId(delegationUnit.getDelegationId()); newDelegationUnion.setId(R.UU32());
newDelegationUnion.setDelegationId(newDelegation.getId());
newDelegationUnion.setSessionId(session.getId());
newDelegationUnion.setCreatedAt(null);
newDelegationUnion.setUpdatedAt(null);
newDelegationUnion.setCreatedBy(null);
newDelegationUnion.setUpdatedBy(null);
return newDelegationUnion;
}).toList();
dao().fastInsert(newDelegationUnions);
//组成单位
List<Teacher_congress_delegation_unit> lastDelegationUnits = dao().query(Teacher_congress_delegation_unit.class, Cnd.where(Teacher_congress_delegation_unit::getDelegationId, "=", lastDelegation.getId()));
List<Teacher_congress_delegation_unit> newDelegationUnits = lastDelegationUnits.stream().map(lastDelegationUnit -> {
Teacher_congress_delegation_unit newDelegationUnit = BeanUtil.copyProperties(lastDelegationUnit, Teacher_congress_delegation_unit.class);
newDelegationUnit.setId(R.UU32());
newDelegationUnit.setDelegationId(newDelegation.getId());
newDelegationUnit.setSessionId(session.getId());
newDelegationUnit.setCreatedAt(null);
newDelegationUnit.setUpdatedAt(null);
newDelegationUnit.setCreatedBy(null);
newDelegationUnit.setUpdatedBy(null);
return newDelegationUnit;
}).toList();
dao().fastInsert(newDelegationUnits);
}
//代表数据 单位 分工会 要根据最新的设置来调整
//代表数据
List<Teacher_congress_delegate> lastDelegates = dao().query(Teacher_congress_delegate.class, Cnd.where(Teacher_congress_delegate::getSessionId, "=", lastSession.getId()));
List<Teacher_congress_delegate> newDelegates = lastDelegates.stream().map(lastDelegate -> {
Teacher_congress_delegate newDelegate = BeanUtil.copyProperties(lastDelegate, Teacher_congress_delegate.class);
newDelegate.setId(R.UU32());
newDelegate.setSessionId(session.getId());
newDelegate.setCreatedAt(null);
newDelegate.setUpdatedAt(null);
newDelegate.setCreatedBy(null);
newDelegate.setUpdatedBy(null);
//查询本人最新的信息从用户表中
View_user vwUser = dao().fetch(View_user.class, Cnd.where(Sys_user::getId, "=", lastDelegate.getUserId()));
if (ObjectUtil.isNotEmpty(vwUser)) {
newDelegate.setUnitId(vwUser.getUnitId());
newDelegate.setUnitName(vwUser.getUnitName());
newDelegate.setUnionId(vwUser.getUnionId());
newDelegate.setUnionName(vwUser.getUnionName());
newDelegate.setSex(vwUser.getSex());
newDelegate.setMobile(vwUser.getMobile());
//去查询他当前所处的单位、分工会处于哪个代表团
if (StrUtil.isNotBlank(vwUser.getUnionId())) {
Teacher_congress_delegation_union delegationUnion = dao().fetch(Teacher_congress_delegation_union.class, Cnd.where(Teacher_congress_delegation_union::getSessionId, "=", session.getId())
.and(Teacher_congress_delegation_union::getUnionId, "=", vwUser.getUnionId()));
if (ObjectUtil.isNotEmpty(delegationUnion)) {
newDelegate.setDelegationId(delegationUnion.getDelegationId());
}
}
if (StrUtil.isNotBlank(vwUser.getUnitId())) {
Teacher_congress_delegation_unit delegationUnit = dao().fetch(Teacher_congress_delegation_unit.class, Cnd.where(Teacher_congress_delegation_unit::getSessionId, "=", session.getId())
.and(Teacher_congress_delegation_unit::getUnitId, "=", vwUser.getUnitId()));
if (ObjectUtil.isNotEmpty(delegationUnit)) {
newDelegate.setDelegationId(delegationUnit.getDelegationId());
}
}
}
return newDelegate;
}).toList();
dao().insert(newDelegates);
//代表权限数据
for (Teacher_congress_delegate newDelegate : newDelegates) {
Sys_user_role sysUserRole = new Sys_user_role();
sysUserRole.setTcSessionId(session.getId());
sysUserRole.setUserId(newDelegate.getUserId());
sysUserRole.setRoleId(newDelegate.getRoleId());
sysUserRole.setTcDelegationId(newDelegate.getDelegationId());
dao().insert(sysUserRole);
}
Sys_role committeeDoctorRole = sysRoleService.getByCode(RoleConstant.PROPOSAL_COMMITTEE_DIRECTOR);
//提案委员会主任权限
Teacher_congress_institution teacherCongressInstitutionProposalCommittee = dao().fetch(Teacher_congress_institution.class, Cnd.where(Teacher_congress_institution::getCode, "=", "TEACHER_CONGRESS_INSTITUTION_PROPOSAL_COMMITTEE")
.and(Teacher_congress_institution::getSessionId, "=", session.getId()));
if (ObjectUtil.isNotEmpty(teacherCongressInstitutionProposalCommittee)) {
List<Teacher_congress_institution_user> teacherCongressInstitutionUsers = dao().query(Teacher_congress_institution_user.class, Cnd.where(Teacher_congress_institution_user::getSessionId, "=", session.getId())
.and(Teacher_congress_institution_user::getInstitutionId, "=", teacherCongressInstitutionProposalCommittee.getId())
.and(Teacher_congress_institution_user::getIdentity, "=", "主任")
);
if (ObjectUtil.isNotEmpty(teacherCongressInstitutionUsers)) {
for (Teacher_congress_institution_user teacherCongressInstitutionUser : teacherCongressInstitutionUsers) {
Sys_user_role sysUserRole = new Sys_user_role();
sysUserRole.setTcSessionId(session.getId());
sysUserRole.setUserId(teacherCongressInstitutionUser.getUserId());
sysUserRole.setRoleId(committeeDoctorRole.getId());
dao().insert(sysUserRole);
} }
} }
} }
return newDelegate;
}).toList();
dao().insert(newDelegates);
//代表权限数据 sysRoleService.clearCache();
for (Teacher_congress_delegate newDelegate : newDelegates) { sysUserService.clearCache();
Sys_user_role sysUserRole = new Sys_user_role();
sysUserRole.setTcSessionId(session.getId());
sysUserRole.setUserId(newDelegate.getUserId());
sysUserRole.setRoleId(newDelegate.getRoleId());
sysUserRole.setTcDelegationId(newDelegate.getDelegationId());
dao().insert(sysUserRole);
} }
Sys_role committeeDoctorRole = sysRoleService.getByCode(RoleConstant.PROPOSAL_COMMITTEE_DIRECTOR);
//提案委员会主任权限
Teacher_congress_institution teacherCongressInstitutionProposalCommittee = dao().fetch(Teacher_congress_institution.class, Cnd.where(Teacher_congress_institution::getCode, "=", "TEACHER_CONGRESS_INSTITUTION_PROPOSAL_COMMITTEE")
.and(Teacher_congress_institution::getSessionId, "=", session.getId()));
if (ObjectUtil.isNotEmpty(teacherCongressInstitutionProposalCommittee)) {
List<Teacher_congress_institution_user> teacherCongressInstitutionUsers = dao().query(Teacher_congress_institution_user.class, Cnd.where(Teacher_congress_institution_user::getSessionId, "=", session.getId())
.and(Teacher_congress_institution_user::getInstitutionId, "=", teacherCongressInstitutionProposalCommittee.getId())
.and(Teacher_congress_institution_user::getIdentity, "=", "主任")
);
if (ObjectUtil.isNotEmpty(teacherCongressInstitutionUsers)) {
for (Teacher_congress_institution_user teacherCongressInstitutionUser : teacherCongressInstitutionUsers) {
Sys_user_role sysUserRole = new Sys_user_role();
sysUserRole.setTcSessionId(session.getId());
sysUserRole.setUserId(teacherCongressInstitutionUser.getUserId());
sysUserRole.setRoleId(committeeDoctorRole.getId());
dao().insert(sysUserRole);
}
}
}
sysRoleService.clearCache();
sysUserService.clearCache();
} }
@Override @Override
+21 -18
View File
@@ -67,15 +67,15 @@ layout("/layouts/v4/baseLayout.html"){
} }
.apps-header { .apps-header {
padding: 0 0 20px 0; padding: 0 0 10px 0;
border-bottom: 1px solid #eee; border-bottom: 1px solid #eee;
margin-bottom: 20px; margin-bottom: 10px;
} }
.apps-search-container { .apps-search-container {
display: flex; display: flex;
align-items: center; align-items: center;
margin-bottom: 20px; /*margin-bottom: 20px;*/
} }
.apps-search { .apps-search {
@@ -103,13 +103,16 @@ layout("/layouts/v4/baseLayout.html"){
} }
.apps-filter { .apps-filter {
margin-top: 20px; margin-top: 10px;
display: flex;
align-items: flex-end;
} }
.apps-filter-title { .apps-filter-title {
color: #666; color: #666;
font-size: 14px; font-size: 14px;
margin-bottom: 5px; margin-bottom: 5px;
margin-right: 5px;
} }
.apps-filter-tags { .apps-filter-tags {
@@ -356,20 +359,20 @@ layout("/layouts/v4/baseLayout.html"){
</div> </div>
<!-- 字母过滤 --> <!-- 字母过滤 -->
<!-- <div class="apps-filter">--> <div class="apps-filter">
<!-- <div class="apps-filter-title">首字母:</div>--> <div class="apps-filter-title">首字母:</div>
<!-- <div class="apps-filter-tags alphabet-filter">--> <div class="apps-filter-tags alphabet-filter">
<!-- <div :class="['filter-tag', activeAlphabet === '' ? 'active' : '']" @click="changeAlphabet('')">全部</div>--> <div :class="['filter-tag', activeAlphabet === '' ? 'active' : '']" @click="changeAlphabet('')">全部</div>
<!-- <div--> <div
<!-- v-for="letter in alphabets"--> v-for="letter in alphabets"
<!-- :key="letter"--> :key="letter"
<!-- :class="['alphabet-item', activeAlphabet === letter ? 'active' : '']"--> :class="['alphabet-item', activeAlphabet === letter ? 'active' : '']"
<!-- @click="changeAlphabet(letter)"--> @click="changeAlphabet(letter)"
<!-- >--> >
<!-- {{ letter }}--> {{ letter }}
<!-- </div>--> </div>
<!-- </div>--> </div>
<!-- </div>--> </div>
</div> </div>
<!-- 应用网格 --> <!-- 应用网格 -->
@@ -71,7 +71,7 @@
<script src="https://vxeui.com/umd/xe-utils@3.5.30/dist/xe-utils.umd.min.js"></script> <script src="https://vxeui.com/umd/xe-utils@3.5.30/dist/xe-utils.umd.min.js"></script>
<script src="https://vxeui.com/umd/vxe-pc-ui@3.1.25/lib/index.umd.min.js"></script> <script src="https://vxeui.com/umd/vxe-pc-ui@3.1.25/lib/index.umd.min.js"></script>
<script src="https://vxeui.com/umd/vxe-table@3.9.0/lib/index.umd.min.js"></script> <script src="https://vxeui.com/umd/vxe-table@3.9.0/lib/index.umd.min.js"></script>
l
<!-- 引入 form-create 和 designer --> <!-- 引入 form-create 和 designer -->
<script src="${base!}/assets/platform/plugins/form-create/form-create.min.js"></script> <script src="${base!}/assets/platform/plugins/form-create/form-create.min.js"></script>
<script src="${base!}/assets/platform/plugins/form-create/index.umd.js"></script> <script src="${base!}/assets/platform/plugins/form-create/index.umd.js"></script>
@@ -80,7 +80,7 @@
<script src="${base!}/assets/platform/plugins/swiper/swiper-bundle.js"></script> <script src="${base!}/assets/platform/plugins/swiper/swiper-bundle.js"></script>
<link rel="stylesheet" href="${base!}/assets/platform/plugins/swiper/swiper-bundle.min.css"></link> <link rel="stylesheet" href="${base!}/assets/platform/plugins/swiper/swiper-bundle.min.css"></link>
<!-- <script src="${base!}/assets/platform/plugins/snaker/SnakerflowDesigner.umd.min.js"></script>--> <!--<script src="${base!}/assets/platform/plugins/snaker/SnakerflowDesigner.umd.js"></script>-->
<script src="${base!}/components/plugins/sysDict/DictData.js"></script> <script src="${base!}/components/plugins/sysDict/DictData.js"></script>
<script src="${base!}/assets/platform/js/util/commonUtil.js"></script> <script src="${base!}/assets/platform/js/util/commonUtil.js"></script>
@@ -351,6 +351,16 @@
Vue.prototype.$auth = commonUtil.authService() Vue.prototype.$auth = commonUtil.authService()
Vue.prototype.$axios = commonUtil.axiosService() Vue.prototype.$axios = commonUtil.axiosService()
Vue.prototype.$downLoad = commonUtil.downLoadService Vue.prototype.$downLoad = commonUtil.downLoadService
Vue.prototype.$processStatusMap = {
10: {text: "进行中", class: "doing"},
20: {text: "已完成", class: "finished"},
30: {text: "已撤回", class: "withdraw"},
40: {text: "强行终止", class: "interrupt"},
45: {text: "已拒绝", class: "reject"},
50: {text: "挂起", class: "pending"},
99: {text: "已废弃", class: "abandon"}
}
</script> </script>
<!--vue全局组件--> <!--vue全局组件-->
@@ -676,7 +686,7 @@
</a> </a>
</div> </div>
</header> </header>
<div style="height: 45px"></div> <div style="height: 64px"></div>
<main class="v4-content"> <main class="v4-content">
<!-- 页面内容区域 --> <!-- 页面内容区域 -->
@@ -108,6 +108,7 @@ const user = {
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
<!--#include("/layouts/pagination.html"){}#-->
</div> </div>
</div> </div>
</div> </div>
+23 -20
View File
@@ -63,15 +63,15 @@ layout("/layouts/v4/baseLayout.html"){
} }
.apps-header { .apps-header {
padding: 0 0 20px 0; padding: 0 0 10px 0;
border-bottom: 1px solid #eee; border-bottom: 1px solid #eee;
margin-bottom: 20px; margin-bottom: 10px;
} }
.apps-search-container { .apps-search-container {
display: flex; display: flex;
align-items: center; align-items: center;
margin-bottom: 20px; /*margin-bottom: 20px;*/
} }
.apps-search { .apps-search {
@@ -99,13 +99,16 @@ layout("/layouts/v4/baseLayout.html"){
} }
.apps-filter { .apps-filter {
margin-top: 20px; margin-top: 10px;
display: flex;
align-items: flex-end;
} }
.apps-filter-title { .apps-filter-title {
color: #666; color: #666;
font-size: 14px; font-size: 14px;
margin-bottom: 5px; margin-bottom: 5px;
margin-right: 5px;
} }
.apps-filter-tags { .apps-filter-tags {
@@ -351,22 +354,22 @@ layout("/layouts/v4/baseLayout.html"){
</div> </div>
<!-- 字母过滤 --> <!-- 字母过滤 -->
<!-- <div class="apps-filter">--> <div class="apps-filter">
<!-- <div class="apps-filter-title">首字母:</div>--> <div class="apps-filter-title">首字母:</div>
<!-- <div class="apps-filter-tags alphabet-filter">--> <div class="apps-filter-tags alphabet-filter">
<!-- <div :class="['filter-tag', activeAlphabet === '' ? 'active' : '']" @click="changeAlphabet('')">--> <div :class="['filter-tag', activeAlphabet === '' ? 'active' : '']" @click="changeAlphabet('')">
<!-- 全部--> 全部
<!-- </div>--> </div>
<!-- <div--> <div
<!-- v-for="letter in alphabets"--> v-for="letter in alphabets"
<!-- :key="letter"--> :key="letter"
<!-- :class="['alphabet-item', activeAlphabet === letter ? 'active' : '']"--> :class="['alphabet-item', activeAlphabet === letter ? 'active' : '']"
<!-- @click="changeAlphabet(letter)"--> @click="changeAlphabet(letter)"
<!-- >--> >
<!-- {{ letter }}--> {{ letter }}
<!-- </div>--> </div>
<!-- </div>--> </div>
<!-- </div>--> </div>
</div> </div>
<!-- 应用网格 --> <!-- 应用网格 -->
@@ -39,14 +39,18 @@
'assigneeText', 'assigneeText',
'assigneeMode', 'assigneeMode',
'buttonConfig', 'buttonConfig',
'enableNextOperator' 'enableNextOperator',
'h5form'
]" ]"
> >
<!-- <template v-slot:form-item-task-form="{model,field}">--> <template v-slot:form-item-task-form="{model,field}">
<!-- <el-form-item label="form">--> <el-form-item label="pc跳转地址">
<!-- --> <el-input placeholder="请输入pc跳转地址" clearable v-model="model[field]"></el-input>
<!-- </el-form-item>--> </el-form-item>
<!-- </template>--> <el-form-item label="h5跳转地址">
<el-input placeholder="请输入h5跳转地址" clearable v-model="model['h5form']"></el-input>
</el-form-item>
</template>
<template v-slot:form-item-task-assignee="{model,field}"> <template v-slot:form-item-task-assignee="{model,field}">
<assignee-form :model="model" :field="field" :start_node_next_node_ids="startNodeNextNodeIds"></assignee-form> <assignee-form :model="model" :field="field" :start_node_next_node_ids="startNodeNextNodeIds"></assignee-form>
@@ -59,6 +59,10 @@
</head> </head>
<body> <body>
<div id="app" v-cloak> <div id="app" v-cloak>
<van-notice-bar
left-icon="volume-o"
text="请选择完文件后,一次性上传。"
></van-notice-bar>
<h1>文件上传</h1> <h1>文件上传</h1>
<van-uploader <van-uploader
v-model="fileList" v-model="fileList"
@@ -1,35 +1,101 @@
<!--# <!--#
layout("/layouts/platform.html"){ layout("/layouts/platform.html"){
#--> #-->
<style></style> <style scoped>
.custom-tree {
background: transparent;
padding: 8px;
}
/* 节点行高调整 */
.custom-tree .el-tree-node {
margin: 2px 0;
border-radius: 6px;
transition: all 0.2s ease;
}
/* 选中状态 */
.custom-tree .el-tree-node.is-current > .el-tree-node__content {
background: #e8f4ff;
border-left: 3px solid #409eff;
}
/* 节点内容区域 */
.custom-tree .el-tree-node__content {
height: 36px;
line-height: 36px;
padding: 0 8px;
border-radius: 6px;
transition: all 0.2s ease;
}
/* 自定义节点内容 */
.custom-tree-node {
display: flex;
align-items: center;
width: 100%;
gap: 8px;
}
/* 文件夹图标颜色优化 */
.el-icon-folder {
color: #909399;
}
.el-icon-folder-opened {
color: #409eff;
}
/* 展开时图标旋转动画 */
.custom-tree .el-tree-node__expand-icon {
transition: transform 0.3s ease;
}
.custom-tree .el-tree-node__expand-icon.expanded {
transform: rotate(90deg);
}
/* 节点标签 */
.node-label {
flex: 1;
font-size: 13px;
color: #303133;
font-weight: 500;
}
/* 禁用展开图标(当无子节点时) */
.custom-tree .el-tree-node__expand-icon.is-leaf {
color: transparent;
cursor: default;
}
</style>
<div id="app" v-cloak> <div id="app" v-cloak>
<el-row type="flex" :gutter="20" style="height: calc(100vh - 126px)"> <el-row type="flex" :gutter="20" style="height: calc(100vh - 126px)">
<el-col :span="5"> <el-col :span="5">
<el-card shadow="never"> <el-card shadow="never">
<el-input placeholder="输入关键字进行查找" v-model="filterText" clearable></el-input> <el-input placeholder="输入关键字进行查找" v-model="filterText" clearable></el-input>
<div style="max-height: calc(100vh - 200px); overflow-y: auto"> <div style="max-height: calc(100vh - 200px); overflow-y: auto">
<el-tree <el-tree
:data="treeData" :data="treeData"
ref="treeRef" ref="treeRef"
:expand-on-click-node="false" :expand-on-click-node="false"
:props="{ :props="{ children: 'children', label: 'name' }"
children: 'children', node-key="id"
label: 'name' default-expand-all
}" @node-click="treeNodeClick"
node-key="id" :filter-node-method="filterNode"
default-expand-all highlight-current
@node-click="treeNodeClick" class="custom-tree"
:filter-node-method="filterNode" >
highlight-current <template slot-scope="{ node, data }">
> <span class="custom-tree-node">
<template slot-scope="{ node, data }"> <i class="el-icon-folder-opened" v-if="node.level===1"></i>
<span class="el-tree-node__label"> <i class="el-icon-folder" v-else></i>
<i class="el-icon-folder-opened" v-if="node.level===1"></i> <span class="node-label">{{ node.label }}</span>
<i class="el-icon-folder" v-else></i> </span>
{{node.label}} </template>
</span> </el-tree>
</template>
</el-tree>
</div> </div>
</el-card> </el-card>
</el-col> </el-col>
@@ -1,5 +1,5 @@
const UNIT_MANAGE_TEMPLATE = { const UNIT_MANAGE_TEMPLATE = {
template: ` template: /*language=HTML*/ `
<div> <div>
<el-card shadow="never" style="border: 1px solid var(--border-color-lighter);"> <el-card shadow="never" style="border: 1px solid var(--border-color-lighter);">
<el-row :gutter="10" type="flex"> <el-row :gutter="10" type="flex">
@@ -30,10 +30,7 @@ const UNIT_MANAGE_TEMPLATE = {
<el-dialog title="设置单位" :visible.sync="dialogVisible" :close-on-click-modal="false" width="40%" top="2%"> <el-dialog title="设置单位" :visible.sync="dialogVisible" :close-on-click-modal="false" width="40%" top="2%">
<el-form :model="formData" ref="form" :rules="formRules" size="small" label-width="80px"> <el-form :model="formData" ref="form" :rules="formRules" size="small" label-width="80px">
<el-form-item v-if="formData.id === '' || formData.id === null || currentNode === 1" prop="parentId" label="上级单位" label-width="80px"> <el-form-item label="上级单位">
<el-cascader :props="props" :options="options" v-model="parentUnit" placeholder="请选择上次单位,不选择则为顶级" style="width: 100%"></el-cascader>
</el-form-item>
<el-form-item v-else label="上级单位">
<el-input maxlength="100" disabled :value="currentData?.name" type="text"></el-input> <el-input maxlength="100" disabled :value="currentData?.name" type="text"></el-input>
</el-form-item> </el-form-item>
<el-form-item prop="name" label="单位名称"> <el-form-item prop="name" label="单位名称">
@@ -47,10 +44,20 @@ const UNIT_MANAGE_TEMPLATE = {
</el-form-item> </el-form-item>
<el-form-item prop="unitLevel" label="单位等级"> <el-form-item prop="unitLevel" label="单位等级">
<el-select v-model="formData.unitLevel" placeholder="请输入单位等级" style="width: 100%"> <el-select v-model="formData.unitLevel" placeholder="请输入单位等级" style="width: 100%">
<el-option v-if="unitLevel === 1" label="一级单位" :value="1"></el-option>
<el-option v-if="unitLevel === 2" label="二级单位" :value="2"></el-option> <el-option v-if="unitLevel === 2" label="二级单位" :value="2"></el-option>
<el-option v-if="unitLevel === 3" label="三级单位" :value="3"></el-option> <el-option v-if="unitLevel === 3" label="三级单位" :value="3"></el-option>
<el-option v-if="unitLevel === 4" label="四级单位" :value="4"></el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item prop="unionId" label="所属工会">
<el-select v-model="formData.unionId" placeholder="请选择所属工会" style="width: 100%">
<el-option :key="item.id" :label="item.name" :value="item.id"
v-for="item in unions"></el-option>
</el-select>
</el-form-item>
<!-- <el-form-item prop="address" label="单位地址">--> <!-- <el-form-item prop="address" label="单位地址">-->
<!-- <el-input maxlength="100" placeholder="请输入单位地址" v-model="formData.address" auto-complete="off" tabindex="5" type="text"></el-input>--> <!-- <el-input maxlength="100" placeholder="请输入单位地址" v-model="formData.address" auto-complete="off" tabindex="5" type="text"></el-input>-->
<!-- </el-form-item>--> <!-- </el-form-item>-->
@@ -88,6 +95,7 @@ const UNIT_MANAGE_TEMPLATE = {
required: true required: true
} }
}, },
store,
data() { data() {
return { return {
pageForm: { pageForm: {
@@ -107,7 +115,7 @@ const UNIT_MANAGE_TEMPLATE = {
formRules: { formRules: {
name: [{ required: true, message: "必填", trigger: "blur" }], name: [{ required: true, message: "必填", trigger: "blur" }],
unitcode: [{ required: true, message: "必填", trigger: "blur" }], unitcode: [{ required: true, message: "必填", trigger: "blur" }],
unitLevel: [{ required: true, message: "必填", trigger: "blur" }], unitLevel: [{ required: false, message: "必填", trigger: "blur" }],
email: [ email: [
{ required: false, message: "单位邮箱", trigger: "blur" }, { required: false, message: "单位邮箱", trigger: "blur" },
{ type: "email", message: "请输入正确的邮箱地址", trigger: ["blur", "change"] } { type: "email", message: "请输入正确的邮箱地址", trigger: ["blur", "change"] }
@@ -115,24 +123,8 @@ const UNIT_MANAGE_TEMPLATE = {
}, },
options: [], options: [],
parentUnit: [], parentUnit: [],
props: {
lazy: true, unions: [],
checkStrictly: true,
multiple: false,
lazyLoad: function (node, resolve) {
var url = base + "/platform/sys/unit/cascaderData"
$.post(
url,
{ pid: node.value },
function (data) {
if (data.code === 0) {
resolve(data.data)
}
},
"json"
)
}
}
} }
}, },
computed: {}, computed: {},
@@ -148,26 +140,29 @@ const UNIT_MANAGE_TEMPLATE = {
this.options = [] this.options = []
}, },
doHandle() { doHandle() {
const self = this this.$confirm("确定要提交吗?", "提示", {
const url = this.formData.id ? "/platform/sys/unit/editDo" : "/platform/sys/unit/addDo" confirmButtonText: "确定",
this.$refs["form"].validate(async function (valid) { cancelButtonText: "取消",
if (valid) { type: "warning"
if (!self.formData.id) { }).then(() => {
self.formData.parentId = self.parentUnit[self.parentUnit.length - 1] || "" const self = this
const url = this.formData.id ? "/platform/sys/unit/editDo" : "/platform/sys/unit/addDo"
this.$refs["form"].validate(async function (valid) {
if (valid) {
if (self.currentNode) {
self.formData.parentId = self.currentData.id
}
const resp = await self.$axios.post(url, self.formData)
if (resp.code === 0) {
self.$message.success(resp.msg)
self.doSearch()
self.dialogVisible = false
self.$emit("refresh", null)
} else {
self.$message.warning(resp.msg)
}
} }
if (self.currentNode !== 1) { })
self.formData.parentId = self.currentData.id
}
const resp = await self.$axios.post(url, self.formData)
if (resp.code === 0) {
self.$message.success(resp.msg)
self.doSearch()
self.dialogVisible = false
self.$emit("refresh", null)
} else {
self.$message.warning(resp.msg)
}
}
}) })
}, },
async openEdit(id) { async openEdit(id) {
@@ -216,7 +211,13 @@ const UNIT_MANAGE_TEMPLATE = {
}) })
} }
}, },
created() { async created() {
this.pageData() this.pageData()
if (this.$auth.hasRoleOr('SYSADMIN, SCHOOL_UNION_ADMIN')) {
this.unions = await this.$businessTool.listUnion()
} else {
this.unions = await this.$businessTool.listUnion(this.store.state.user.union.id)
}
} }
} }
@@ -212,6 +212,7 @@ layout("/layouts/platform.html"){
message: '提交成功!' message: '提交成功!'
}) })
this.doSearch() this.doSearch()
this.getApplyMoney()
this.$refs.guava.index() this.$refs.guava.index()
} }
}) })
@@ -8,7 +8,7 @@ layout("/layouts/platform.html"){
<el-form :model="formData" :rules="formRules" ref="formRef" class="flow-task-form"> <el-form :model="formData" :rules="formRules" ref="formRef" class="flow-task-form">
<el-descriptions :column="2" border> <el-descriptions :column="2" border>
<el-descriptions-item label="申报人姓名">{{formData.userName}}</el-descriptions-item> <el-descriptions-item label="申报人姓名">{{formData.userName}}</el-descriptions-item>
<el-descriptions-item label="申报时间">{{formData.applyDate}}</el-descriptions-item> <el-descriptions-item label="申报时间">{{$moment(formData.applyDate).format('YYYY-MM-DD')}}</el-descriptions-item>
<el-descriptions-item label="经费项目"> <el-descriptions-item label="经费项目">
<el-form-item <el-form-item
prop="activityMatter" label="经费项目"> prop="activityMatter" label="经费项目">
@@ -88,6 +88,9 @@ layout("/layouts/platform.html"){
<enum-tag :value="row.instanceState" name="ProcessInstanceStateEnum" label_key="message" <enum-tag :value="row.instanceState" name="ProcessInstanceStateEnum" label_key="message"
size="small"></enum-tag> size="small"></enum-tag>
</template> </template>
<template v-slot="{row}" v-else-if="column.prop==='applyDate'">
{{ $moment(row.applyDate).format('YYYY-MM-DD') }}
</template>
</el-table-column> </el-table-column>
<el-table-column align="center" fixed="right" header-align="center" label="操作" <el-table-column align="center" fixed="right" header-align="center" label="操作"
width="300px"> width="300px">
@@ -35,7 +35,7 @@ layout("/layouts/platform.html"){
</el-option> </el-option>
</el-select> </el-select>
</search-item> </search-item>
<search-item label="协会" <search-item label="所属协会"
v-if="!pageForm.outlayManageSource||pageForm.outlayManageSource==='ACTIVITY_BUDGET_TYPE_THREE'"> v-if="!pageForm.outlayManageSource||pageForm.outlayManageSource==='ACTIVITY_BUDGET_TYPE_THREE'">
<el-select clearable <el-select clearable
placeholder="请选择协会" placeholder="请选择协会"
@@ -23,7 +23,7 @@ const ACTIVITY_BUDGET_INFO = {
<el-descriptions-item label="申报预算金额(元)">{{viewData.declareTotalBudgetMoney}} <el-descriptions-item label="申报预算金额(元)">{{viewData.declareTotalBudgetMoney}}
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item label="最终预算金额(元)">{{viewData.totalBudgetMoney}}</el-descriptions-item> <el-descriptions-item label="最终预算金额(元)">{{viewData.totalBudgetMoney}}</el-descriptions-item>
<el-descriptions-item label="申报时间">{{viewData.applyDate}}</el-descriptions-item> <el-descriptions-item label="申报时间">{{$moment(viewData.applyDate).format('YYYY-MM-DD')}}</el-descriptions-item>
<el-descriptions-item v-if="viewData.isSchoolBudget" label="校工会预算">{{viewData.activityMatterTwo}} <el-descriptions-item v-if="viewData.isSchoolBudget" label="校工会预算">{{viewData.activityMatterTwo}}
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item v-if="!viewData.isSchoolBudget"></el-descriptions-item> <el-descriptions-item v-if="!viewData.isSchoolBudget"></el-descriptions-item>
@@ -34,6 +34,16 @@ layout("/layouts/platform.html"){
</el-option> </el-option>
</el-select> </el-select>
</search-item> </search-item>
<search-item label="所属协会"
v-if="!pageForm.outlayManageSource||pageForm.outlayManageSource==='ACTIVITY_BUDGET_TYPE_THREE'">
<el-select v-model="pageForm.clubId" filterable
clearable
placeholder="请选择所属工会" style="width: 100%;">
<el-option v-for="item in clubOption" :label="item.clubName"
:value="item.id">
</el-option>
</el-select>
</search-item>
<search-item label="预算条目"> <search-item label="预算条目">
<dict-select v-model="pageForm.budgetReimburseType" <dict-select v-model="pageForm.budgetReimburseType"
code="ACTIVITY_BUDGET_REIMBURSE_TYPE"></dict-select> code="ACTIVITY_BUDGET_REIMBURSE_TYPE"></dict-select>
@@ -225,6 +235,7 @@ layout("/layouts/platform.html"){
this.budgetReimburseTypeOption = await this.$businessTool.getDictOptions("ACTIVITY_BUDGET_REIMBURSE_TYPE") this.budgetReimburseTypeOption = await this.$businessTool.getDictOptions("ACTIVITY_BUDGET_REIMBURSE_TYPE")
this.budgetTypeOption.unshift({name: "全部类型", code: ""}) this.budgetTypeOption.unshift({name: "全部类型", code: ""})
this.unionList = await this.$businessTool.listUnion() this.unionList = await this.$businessTool.listUnion()
this.clubOption = await this.$businessTool.listClub()
this.pageData() this.pageData()
} }
}) })
@@ -34,6 +34,16 @@ layout("/layouts/platform.html"){
</el-option> </el-option>
</el-select> </el-select>
</search-item> </search-item>
<search-item label="所属协会"
v-if="!pageForm.outlayManageSource||pageForm.outlayManageSource==='ACTIVITY_BUDGET_TYPE_THREE'">
<el-select v-model="pageForm.clubId" filterable
clearable
placeholder="请选择所属工会" style="width: 100%;">
<el-option v-for="item in clubOption" :label="item.clubName"
:value="item.id">
</el-option>
</el-select>
</search-item>
<search-item label="预算条目"> <search-item label="预算条目">
<dict-select v-model="pageForm.budgetReimburseType" <dict-select v-model="pageForm.budgetReimburseType"
code="ACTIVITY_BUDGET_REIMBURSE_TYPE"></dict-select> code="ACTIVITY_BUDGET_REIMBURSE_TYPE"></dict-select>
@@ -225,6 +235,7 @@ layout("/layouts/platform.html"){
this.budgetReimburseTypeOption = await this.$businessTool.getDictOptions("ACTIVITY_BUDGET_REIMBURSE_TYPE") this.budgetReimburseTypeOption = await this.$businessTool.getDictOptions("ACTIVITY_BUDGET_REIMBURSE_TYPE")
this.budgetTypeOption.unshift({name: "全部类型", code: ""}) this.budgetTypeOption.unshift({name: "全部类型", code: ""})
this.unionList = await this.$businessTool.listUnion() this.unionList = await this.$businessTool.listUnion()
this.clubOption = await this.$businessTool.listClub()
this.pageData() this.pageData()
} }
}) })
@@ -75,7 +75,7 @@ layout("/layouts/platform.html"){
</el-form> </el-form>
<el-row type="flex" justify="end"> <el-row type="flex" justify="end">
<el-button @click="$refs.guava.index()" size="small">取消</el-button> <el-button @click="$refs.guava.index()" size="small">取消</el-button>
<el-button @click="handleTaskAction(6)" size="small" type="info">退回到提案</el-button> <el-button @click="handleTaskAction(6)" size="small" type="info">退回到发起</el-button>
<el-button @click="handleTaskAction(20)" size="small" type="danger">不同意</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-button @click="handleTaskAction(1)" size="small" type="primary">同意</el-button>
</el-row> </el-row>
@@ -28,9 +28,9 @@ const PROPOSAL_INFO = {
<dict-tag :options="dict.type.PROPOSAL_CASE_FILING_RESULT" <dict-tag :options="dict.type.PROPOSAL_CASE_FILING_RESULT"
:value="viewData.caseFilingResult"></dict-tag> :value="viewData.caseFilingResult"></dict-tag>
</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>-->
<el-descriptions-item label="提案案由" :span="3"> <el-descriptions-item label="提案案由" :span="3">
<div class="text-left" v-html="viewData.brief"></div> <div class="text-left" v-html="viewData.brief"></div>
</el-descriptions-item> </el-descriptions-item>
@@ -337,7 +337,9 @@ layout("/layouts/platform.html"){
}) })
}, },
listSession() { listSession() {
this.$axios.post("/platform/proposal/common/listSession").then((res) => { this.$axios.post("/platform/proposal/common/listSession", {
orderBy: "asc"
}).then((res) => {
if (res.code === 0) { if (res.code === 0) {
this.sessionOptions = res.data this.sessionOptions = res.data
if (this.sessionOptions) { if (this.sessionOptions) {
@@ -140,7 +140,7 @@ layout("/layouts/platform.html"){
<!--#include("../../common/info.js"){}#--> <!--#include("../../common/info.js"){}#-->
new Vue({ new Vue({
el: "#app", el: "#app",
dicts: ["PROPOSAL_TYPE", "PROPOSAL_CASE_FILING_RESULT"], dicts: ["PROPOSAL_TYPE", "PROPOSAL_CASE_FILING_RESULT", "PROPOSAL_CASE_FILING_TYPE"],
store, store,
mixins: [initTableMixins], mixins: [initTableMixins],
components: { components: {
@@ -128,29 +128,36 @@ layout("/layouts/platform.html"){
</el-row> </el-row>
<el-row :gutter="20" type="flex"> <el-row :gutter="20" type="flex">
<el-col :span="12">
<el-form-item label="提案编号" prop="code"
:rules="[{required:true,message:'请输入提案编号',trigger:'blur'}]">
<el-input maxlength="100" placeholder="提案编号" v-model="formData.code"></el-input>
</el-form-item>
</el-col>
<el-col :span="12"> <el-col :span="12">
<el-form-item label="提案名称" prop="name" <el-form-item label="提案名称" prop="name"
:rules="[{required:true,message:'请输入提案名称',trigger:'blur'}]"> :rules="[{required:true,message:'请输入提案名称',trigger:'blur'}]">
<el-input maxlength="100" placeholder="提案名称" v-model="formData.name"></el-input> <el-input maxlength="100" placeholder="提案名称" v-model="formData.name"></el-input>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12">
<el-form-item label="提案方式" prop="source">
<el-input :value="dict.type.PROPOSAL_SOURCE.find(v=>v.code === formData.source)?.name"
disabled></el-input>
</el-form-item>
</el-col>
</el-row> </el-row>
<el-row :gutter="20" type="flex"> <el-row :gutter="20" type="flex">
<el-col :span="12"> <el-col :span="12">
<el-form-item label="提案类别" prop="typeId"> <el-form-item label="提案方式" prop="source">
<el-select v-model="formData.typeId" style="width: 100%"> <el-input :value="dict.type.PROPOSAL_SOURCE.find(v=>v.code === formData.source)?.name"
<el-option :key="item.code" :label="item.name" :value="item.id" disabled></el-input>
v-for="item in typeOptions"></el-option> </el-form-item>
</el-select> </el-col>
</el-form-item>
</el-col> <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-row>
<!-- <el-form-item label="提案摘要" prop="excerpt">--> <!-- <el-form-item label="提案摘要" prop="excerpt">-->
@@ -177,15 +184,15 @@ layout("/layouts/platform.html"){
<text-editor v-model="formData.measures" key="measures" <text-editor v-model="formData.measures" key="measures"
placeholder="建议措施"></text-editor> placeholder="建议措施"></text-editor>
</el-form-item> </el-form-item>
<!-- <el-form-item label="附件上传" prop="files">--> <el-form-item label="附件上传" prop="files">
<!-- <file-upload--> <file-upload
<!-- :value.sync="formData.files"--> :value.sync="formData.files"
<!-- :upload_number="5"--> :upload_number="5"
<!-- upload_result_category="array"--> upload_result_category="array"
<!-- upload_mode="drag"--> upload_mode="drag"
<!-- complete_result--> complete_result
<!-- ></file-upload>--> ></file-upload>
<!-- </el-form-item>--> </el-form-item>
</el-form> </el-form>
<el-row type="flex" justify="end"> <el-row type="flex" justify="end">
<el-button @click="$refs.guava.index()">取 消</el-button> <el-button @click="$refs.guava.index()">取 消</el-button>
@@ -231,6 +231,14 @@ layout("/layouts/platform.html"){
cancelButtonText: "取消", cancelButtonText: "取消",
type: "warning" type: "warning"
}).then(() => { }).then(() => {
// 是否有协办单位
let tf_helpunitreply;
if (this.formData.tf_slaveUnitIds && this.formData.tf_slaveUnitIds.length > 0) {
tf_helpunitreply = 'HAS_HELP_UNIT'
} else {
tf_helpunitreply = 'NO_HELP_UNIT'
}
const loading = createLoading('提交中') const loading = createLoading('提交中')
this.$axios.post("/flow/common/executeTask", { this.$axios.post("/flow/common/executeTask", {
data: JSON.stringify({ data: JSON.stringify({
@@ -239,6 +247,7 @@ layout("/layouts/platform.html"){
tf_masterUnitName: this.formData.tf_masterUnitId ? this.underTakeOptions.find(v => v.id === this.formData.tf_masterUnitId)?.name : null, tf_masterUnitName: this.formData.tf_masterUnitId ? this.underTakeOptions.find(v => v.id === this.formData.tf_masterUnitId)?.name : null,
tf_slaveUnitNames: this.formData.tf_slaveUnitIds.map(v => this.underTakeOptions.find(v2 => v2.id === v)?.name), tf_slaveUnitNames: this.formData.tf_slaveUnitIds.map(v => this.underTakeOptions.find(v2 => v2.id === v)?.name),
tf_slaveUnitNameStr: this.formData.tf_slaveUnitIds.map(v => this.underTakeOptions.find(v2 => v2.id === v)?.name).join(','), tf_slaveUnitNameStr: this.formData.tf_slaveUnitIds.map(v => this.underTakeOptions.find(v2 => v2.id === v)?.name).join(','),
tf_helpunitreply: tf_helpunitreply
}) })
}).then((res) => { }).then((res) => {
if (res.code === 0) { if (res.code === 0) {
@@ -92,17 +92,6 @@ layout("/layouts/platform.html"){
:rules="[{required:true,message:'必填',trigger:['change','blur']}]"> :rules="[{required:true,message:'必填',trigger:['change','blur']}]">
<user-opinion-textarea v-model="formData.tf_opinion"></user-opinion-textarea> <user-opinion-textarea v-model="formData.tf_opinion"></user-opinion-textarea>
</el-form-item> </el-form-item>
<template v-if="['SATISFIED','FAIRLY_SATISFIED'].includes(formData.tf_feedback)">
<el-form-item label="通讯地址" prop="tf_address" :rules="[{required:true,message:'必填',trigger:['change','blur']}]">
<el-input v-model="formData.tf_address" placeholder="请输入通讯地址" clearable></el-input>
</el-form-item>
<el-form-item label="联系电话" prop="tf_phone" :rules="[{required:true,message:'必填',trigger:['change','blur']}]">
<el-input v-model="formData.tf_phone" placeholder="请输入联系电话" clearable></el-input>
</el-form-item>
<el-form-item label="邮政编码" prop="tf_postcode" :rules="[{required:true,message:'必填',trigger:['change','blur']}]">
<el-input v-model="formData.tf_postcode" placeholder="请输入邮政编码" clearable></el-input>
</el-form-item>
</template>
</el-form> </el-form>
<el-row type="flex" justify="end"> <el-row type="flex" justify="end">
<el-button @click="$refs.guava.index()" size="small">取消</el-button> <el-button @click="$refs.guava.index()" size="small">取消</el-button>
@@ -231,7 +220,6 @@ layout("/layouts/platform.html"){
if (this.sessionOptions) { if (this.sessionOptions) {
this.$set(this.pageForm, "sessionId", this.sessionOptions[0].id) this.$set(this.pageForm, "sessionId", this.sessionOptions[0].id)
this.pageData() this.pageData()
this.listDelegation()
} }
} }
}) })
@@ -42,6 +42,9 @@ layout("/layouts/platform.html"){
<template v-else-if="column.prop === 'merge'" scope="{row}"> <template v-else-if="column.prop === 'merge'" scope="{row}">
<el-tag v-if="row.merge" size="small"></el-tag> <el-tag v-if="row.merge" size="small"></el-tag>
</template> </template>
<template v-else-if="column.prop === 'taskName'" scope="{row}">
<span>{{ (row.startTaskId) ? row.taskName : '待提交' }}</span>
</template>
<template v-else-if="column.prop === 'instanceState'" scope="{row}"> <template v-else-if="column.prop === 'instanceState'" scope="{row}">
<enum-tag :value="row.instanceState" name="ProcessInstanceStateEnum" label_key="message" <enum-tag :value="row.instanceState" name="ProcessInstanceStateEnum" label_key="message"
size="small"></enum-tag> size="small"></enum-tag>
@@ -137,6 +137,7 @@ layout("/layouts/platform.html"){
{label: "提案类别", prop: "typeName"}, {label: "提案类别", prop: "typeName"},
{label: "是否并案", prop: "merge"}, {label: "是否并案", prop: "merge"},
{label: "当前节点", prop: "curTaskName"}, {label: "当前节点", prop: "curTaskName"},
{label: "审核人", prop: "auditUser"},
{label: "流程状态", prop: "instanceState"} {label: "流程状态", prop: "instanceState"}
], ],
pageForm: { pageForm: {
@@ -260,6 +260,7 @@ layout("/layouts/platform.html"){
{label: "承办单位", prop: "underTakeName"}, {label: "承办单位", prop: "underTakeName"},
{label: "承办类型", prop: "underTakeIsMaster"}, {label: "承办类型", prop: "underTakeIsMaster"},
{label: "当前节点", prop: "curTaskName"}, {label: "当前节点", prop: "curTaskName"},
{label: "审核人", prop: "auditUser"},
{label: "流程状态", prop: "instanceState"} {label: "流程状态", prop: "instanceState"}
], ],
pageForm: { pageForm: {
@@ -1,6 +1,13 @@
<!--# <!--#
layout("/layouts/platform.html"){ layout("/layouts/platform.html"){
#--> #-->
<style>
.write-dialog .el-dialog__body {
padding: 0;
}
</style>
<div id="app" v-cloak> <div id="app" v-cloak>
<guava ref="guava"> <guava ref="guava">
<el-card shadow="never"> <el-card shadow="never">
@@ -219,8 +226,13 @@ layout("/layouts/platform.html"){
<div style="max-height: 75vh;overflow-y: auto"> <div style="max-height: 75vh;overflow-y: auto">
<formal-write ref="formalWriteRef" :is_read="isRead" :user_id="userId" <formal-write ref="formalWriteRef" :is_read="isRead" :user_id="userId"
:session_id="pageForm.sessionId" :session_id="pageForm.sessionId"
:dialog="true"
@refresh="writeDialog=false;doSearch()"></formal-write> @refresh="writeDialog=false;doSearch()"></formal-write>
</div> </div>
<div slot="footer" class="dialog-footer">
<el-button @click="$refs.formalWriteRef.onSave()">保存草稿</el-button>
<el-button type="primary" @click="$refs.formalWriteRef.onSubmit()">提交信息</el-button>
</div>
</el-dialog> </el-dialog>
</div> </div>
@@ -339,7 +351,16 @@ layout("/layouts/platform.html"){
} }
}) })
</script> </script>
<style>
.write-dialog .el-dialog__title {
font-size: 22px; /* 调整为您需要的大小 */
font-weight: 500;
}
.write-dialog .el-dialog__body {
padding-top: 0px;
}
</style>
<!--# <!--#
} }
@@ -1,6 +1,6 @@
const write = { const write = {
template: /*language=HTML*/ ` template: /*language=HTML*/ `
<div class="container-x1"> <div class="container-x1" style="padding: 0">
<div class="form-container"> <div class="form-container">
<header class="header-x"> <header class="header-x">
@@ -32,7 +32,7 @@ const write = {
<div class="info-content"> <div class="info-content">
<i class="fa fa-info-circle info-icon"></i> <i class="fa fa-info-circle info-icon"></i>
<div class="info-text"> <div class="info-text">
<h3 class="info-title">推选信息</h3> <h2 class="info-title" style="font-size: 18px;">推选信息</h2>
<p class="info-desc">您已被预选为{{ sessionName }}代表</p> <p class="info-desc">您已被预选为{{ sessionName }}代表</p>
<div class="info-details"> <div class="info-details">
<p>推选单位{{ formData.unionName }}</p> <p>推选单位{{ formData.unionName }}</p>
@@ -58,141 +58,133 @@ const write = {
:disabled="(formData && !['53ff0c2a-ba93-45e9-a9fd-db51cdab3080','97b0846b-22c6-4d34-9002-a6b67d592944'].includes(formData.taskKey)) || is_read" :disabled="(formData && !['53ff0c2a-ba93-45e9-a9fd-db51cdab3080','97b0846b-22c6-4d34-9002-a6b67d592944'].includes(formData.taskKey)) || is_read"
> >
<div class="form-section"> <div class="form-section">
<h3 class="section-title">基本信息</h3> <h2 class="section-title">基本信息</h3>
<div class="form-grid"> <div class="form-grid custom-grid">
<el-row :gutter="20"> <div class="grid-item">
<el-col :span="12"> <el-form-item label="姓名" prop="userName">
<el-form-item label="姓名" prop="userName"> <el-input v-model="formData.userName" readonly></el-input>
<el-input v-model="formData.userName" readonly></el-input> </el-form-item>
</el-form-item> </div>
</el-col> <div class="grid-item">
<el-col :span="12"> <el-form-item label="工号" prop="loginName">
<el-form-item label="工号" prop="loginName"> <el-input v-model="formData.loginName" readonly></el-input>
<el-input v-model="formData.loginName" readonly></el-input> </el-form-item>
</el-form-item> </div>
</el-col> <div class="grid-item">
<el-col :span="12"> <el-form-item label="性别" prop="sex">
<el-form-item label="性别" prop="sex"> <el-radio-group v-model="formData.sex" size="small">
<el-radio-group v-model="formData.sex" size="small"> <el-radio border label="男"></el-radio>
<el-radio border label=""></el-radio> <el-radio border label=""></el-radio>
<el-radio border label="女"></el-radio> </el-radio-group>
</el-radio-group> </el-form-item>
</el-form-item> </div>
</el-col> <div class="grid-item">
<el-col :span="12"> <el-form-item label="出生年月" prop="birthday">
<el-form-item label="出生年月" prop="birthday"> <el-date-picker
<el-date-picker v-model="formData.birthday"
v-model="formData.birthday" type="date"
type="date" placeholder="选择日期"
placeholder="选择日期" value-format="yyyy-MM-dd"
value-format="yyyy-MM-dd" style="width: 100%"
style="width: 100%" ></el-date-picker>
></el-date-picker> </el-form-item>
</el-form-item> </div>
</el-col> <div class="grid-item">
<el-col :span="12"> <el-form-item label="民族" prop="nation">
<el-form-item label="民族" prop="nation"> <dict-select v-model="formData.nation" style="width: 100%"
<dict-select v-model="formData.nation" style="width: 100%" placeholder="请选择民族"
placeholder="请选择民族" code="USER_NATION"></dict-select>
code="USER_NATION"></dict-select> </el-form-item>
</el-form-item> </div>
</el-col> <div class="grid-item">
<el-col :span="12"> <el-form-item label="政治面貌" prop="political">
<el-form-item label="政治面貌" prop="political"> <el-input maxlength="100" placeholder="政治面貌"
<el-input maxlength="100" placeholder="政治面貌" v-model="formData.political"></el-input>
v-model="formData.political"></el-input> </el-form-item>
</el-form-item> </div>
</el-col> <div class="grid-item">
<el-col :span="12"> <el-form-item label="所属工会">
<el-form-item label="所属工会"> <el-input
<el-input v-model="formData.unionName"
v-model="formData.unionName" readonly
readonly placeholder="请输入所属工会"
placeholder="请输入所属工会" clearable
clearable ></el-input>
></el-input> </el-form-item>
</el-form-item> </div>
</el-col> <div class="grid-item">
<el-col :span="12"> <el-form-item label="所属单位">
<el-form-item label="所属单位"> <el-input
<el-input v-model="formData.unitName"
v-model="formData.unitName" readonly
readonly placeholder="请输入所属单位"
placeholder="请输入所属单位" clearable
clearable ></el-input>
></el-input> </el-form-item>
</el-form-item> </div>
</el-col> <div class="grid-item">
<el-col :span="12"> <el-form-item label="职称" prop="professionalTitle">
<el-form-item label="职称" prop="professionalTitle"> <dict-select v-model="formData.professionalTitle" style="width: 100%"
<dict-select v-model="formData.professionalTitle" style="width: 100%" placeholder="请选择职称"
placeholder="请选择职称" code="technical_title_level"></dict-select>
code="technical_title_level"></dict-select> </el-form-item>
</el-form-item> </div>
</el-col> <div class="grid-item">
<el-col :span="12"> <el-form-item label="是否聘用制" prop="employ">
<el-form-item label="是否聘用制" prop="employ"> <el-radio-group v-model="formData.employ" size="small">
<el-radio-group v-model="formData.employ" size="small"> <el-radio border :label="true"></el-radio>
<el-radio border :label="true"></el-radio> <el-radio border :label="false"></el-radio>
<el-radio border :label="false"></el-radio> </el-radio-group>
</el-radio-group> </el-form-item>
</el-form-item> </div>
</el-col> <div class="grid-item">
<el-col :span="12"> <el-form-item label="是否高级职称" prop="seniorTeacher">
<el-form-item label="是否高级职称" prop="seniorTeacher"> <el-radio-group v-model="formData.seniorTeacher" size="small">
<el-radio-group v-model="formData.seniorTeacher" size="small"> <el-radio border :label="true"></el-radio>
<el-radio border :label="true"></el-radio> <el-radio border :label="false"></el-radio>
<el-radio border :label="false"></el-radio> </el-radio-group>
</el-radio-group> </el-form-item>
</el-form-item> </div>
<div class="grid-item">
</el-col> <el-form-item label="是否中级职称及以下" prop="intermediateBelow">
<el-col :span="12"> <el-radio-group v-model="formData.intermediateBelow" size="small">
<el-form-item label="是否中级职称及以下" prop="intermediateBelow"> <el-radio border :label="true"></el-radio>
<el-radio-group v-model="formData.intermediateBelow" size="small"> <el-radio border :label="false"></el-radio>
<el-radio border :label="true"></el-radio> </el-radio-group>
<el-radio border :label="false"></el-radio> </el-form-item>
</el-radio-group> </div>
</el-form-item> <div class="grid-item">
</el-col> <el-form-item label="是否干部" prop="cadre">
<el-col :span="12"> <el-radio-group v-model="formData.cadre" size="small">
<el-form-item label="是否干部" prop="cadre"> <el-radio border :label="true"></el-radio>
<el-radio-group v-model="formData.cadre" size="small"> <el-radio border :label="false"></el-radio>
<el-radio border :label="true"></el-radio> </el-radio-group>
<el-radio border :label="false"></el-radio> </el-form-item>
</el-radio-group> </div>
</el-form-item> <div class="grid-item">
</el-col> <el-form-item label="是否工人" prop="worker">
<el-col :span="12"> <el-radio-group v-model="formData.worker" size="small">
<el-form-item label="是否工人" prop="worker"> <el-radio border :label="true"></el-radio>
<el-radio-group v-model="formData.worker" size="small"> <el-radio border :label="false"></el-radio>
<el-radio border :label="true"></el-radio> </el-radio-group>
<el-radio border :label="false"></el-radio> </el-form-item>
</el-radio-group> </div>
</el-form-item> <div class="grid-item">
</el-col> <el-form-item label="校级领导" prop="schoolLeader">
<el-radio-group v-model="formData.schoolLeader" size="small">
<el-col :span="12"> <el-radio border :label="true"></el-radio>
<el-form-item label="校级领导" prop="schoolLeader"> <el-radio border :label="false"></el-radio>
<el-radio-group v-model="formData.schoolLeader" size="small"> </el-radio-group>
<el-radio border :label="true"></el-radio> </el-form-item>
<el-radio border :label="false"></el-radio> </div>
</el-radio-group> <div class="grid-item">
</el-form-item> <el-form-item label="中层领导" prop="middleLevelLeader">
</el-col> <el-radio-group v-model="formData.middleLevelLeader" size="small">
<el-radio border :label="true"></el-radio>
<el-col :span="12"> <el-radio border :label="false"></el-radio>
<el-form-item label="中层领导" prop="middleLevelLeader"> </el-radio-group>
<el-radio-group v-model="formData.middleLevelLeader" size="small"> </el-form-item>
<el-radio border :label="true"></el-radio> </div>
<el-radio border :label="false"></el-radio>
</el-radio-group>
</el-form-item>
</el-col>
</el-row>
</div> </div>
<div class="form-grid"> <div class="form-grid">
@@ -206,7 +198,7 @@ const write = {
</div> </div>
</div> </div>
<div v-if="formData && ['53ff0c2a-ba93-45e9-a9fd-db51cdab3080','97b0846b-22c6-4d34-9002-a6b67d592944'].includes(formData.taskKey)" <div v-if="!dialog && formData && ['53ff0c2a-ba93-45e9-a9fd-db51cdab3080','97b0846b-22c6-4d34-9002-a6b67d592944'].includes(formData.taskKey)"
class="form-actions"> class="form-actions">
<el-button @click="onSave">保存草稿</el-button> <el-button @click="onSave">保存草稿</el-button>
<el-button type="primary" @click="onSubmit">提交信息</el-button> <el-button type="primary" @click="onSubmit">提交信息</el-button>
@@ -270,7 +262,12 @@ const write = {
type: Boolean, type: Boolean,
required: false, required: false,
default: false default: false
} },
dialog: {
type: Boolean,
required: false,
default: null
},
}, },
data() { data() {
return { return {
@@ -453,7 +450,12 @@ const write = {
justify-content: space-between; justify-content: space-between;
align-items: center; align-items: center;
background-color: white; background-color: white;
margin-bottom: 20px; margin-bottom: 1px;
}
::v-deep .el-tabs__item {
font-size: 18px;/* 填写信息 */
font-weight: 500;
} }
.header-x .header-left { .header-x .header-left {
@@ -544,6 +546,7 @@ const write = {
background-color: white; background-color: white;
border-radius: 8px; border-radius: 8px;
padding: 32px; padding: 32px;
padding-top: 20px;
margin-bottom: 20px; margin-bottom: 20px;
} }
@@ -552,6 +555,7 @@ const write = {
background-color: #ebf5ff; background-color: #ebf5ff;
padding: 16px; padding: 16px;
margin-bottom: 32px; margin-bottom: 32px;
margin-top: 10px;
} }
.info-box ::v-deep .info-content { .info-box ::v-deep .info-content {
@@ -572,6 +576,7 @@ const write = {
.info-box .info-content .info-text ::v-deep .info-title { .info-box .info-content .info-text ::v-deep .info-title {
font-weight: 600; font-weight: 600;
margin-bottom: 8px; margin-bottom: 8px;
font-size: 18px; /* 推选信息没用 */
} }
.info-box .info-content .info-text ::v-deep .info-desc { .info-box .info-content .info-text ::v-deep .info-desc {
@@ -594,7 +599,7 @@ const write = {
} }
.form-section ::v-deep .section-title { .form-section ::v-deep .section-title {
font-size: 18px; font-size: 18px;/* 基本信息没用 */
font-weight: 500; font-weight: 500;
margin-bottom: 16px; margin-bottom: 16px;
} }
@@ -628,6 +633,19 @@ const write = {
::v-deep .hidden { ::v-deep .hidden {
display: none !important; display: none !important;
} }
::v-deep .custom-grid {
display: flex;
flex-wrap: wrap;
gap: 16px;
margin: 0 -8px 16px;
}
::v-deep .grid-item {
flex: 1 1 calc(50% - 16px);
min-width: 200px; /* 防止在窄屏过度压缩 */
padding: 0 8px;
}
` `
} }
@@ -142,8 +142,13 @@ layout("/layouts/platform.html"){
<div style="max-height: 75vh;overflow-y: auto"> <div style="max-height: 75vh;overflow-y: auto">
<formal-write ref="formalWriteRef" :is_read="isRead" :user_id="userId" <formal-write ref="formalWriteRef" :is_read="isRead" :user_id="userId"
:session_id="pageForm.sessionId" :session_id="pageForm.sessionId"
:dialog="true"
@refresh="writeDialog=false;doSearch()"></formal-write> @refresh="writeDialog=false;doSearch()"></formal-write>
</div> </div>
<div slot="footer" class="dialog-footer">
<el-button @click="$refs.formalWriteRef.onSave()">保存草稿</el-button>
<el-button type="primary" @click="$refs.formalWriteRef.onSubmit()">提交信息</el-button>
</div>
</el-dialog> </el-dialog>
@@ -27,9 +27,9 @@ const PROPOSAL_INFO = {
<dict-tag :options="dict.type.PROPOSAL_CASE_FILING_RESULT" <dict-tag :options="dict.type.PROPOSAL_CASE_FILING_RESULT"
:value="viewData.caseFilingResult"></dict-tag> :value="viewData.caseFilingResult"></dict-tag>
</van-cell> </van-cell>
<van-cell title="调研情况" class="direction-column-cell"> <!--<van-cell title="调研情况" class="direction-column-cell">
<div v-html="viewData.researchFindings"></div> <div v-html="viewData.researchFindings"></div>
</van-cell> </van-cell>-->
<van-cell title="提案案由" class="direction-column-cell"> <van-cell title="提案案由" class="direction-column-cell">
<div v-html="viewData.brief"></div> <div v-html="viewData.brief"></div>
</van-cell> </van-cell>
@@ -25,7 +25,7 @@ layout("/layouts/platform_h5.html"){
<table-column label="提案类别">{{row.typeName}}</table-column> <table-column label="提案类别">{{row.typeName}}</table-column>
<table-column label="提案人">{{row.createUserName}}</table-column> <table-column label="提案人">{{row.createUserName}}</table-column>
<table-column label="代表团">{{row.delegationName}}</table-column> <table-column label="代表团">{{row.delegationName}}</table-column>
<table-column label="当前节点">{{row.taskName}}</table-column> <table-column label="当前节点">{{ (row.startTaskId) ? row.taskName : '待提交' }}</table-column>
</template> </template>
<template #actions="{index,row}"> <template #actions="{index,row}">
<div class="action-btn" @click="onView(row)"> <div class="action-btn" @click="onView(row)">
@@ -54,7 +54,7 @@ layout("/layouts/platform_h5.html"){
<div class="action-btn" v-if="!pageForm.approval && $auth.hasRoleOr('SYSADMIN,PROPOSAL_UNIT_LEADER')" <div class="action-btn" v-if="!pageForm.approval && $auth.hasRoleOr('SYSADMIN,PROPOSAL_UNIT_LEADER')"
@click="openTransfer(row)"> @click="openTransfer(row)">
<i class="fa fa-arrow-right"></i> <i class="fa fa-arrow-right"></i>
<span></span> <span></span>
</div> </div>
</template> </template>
</table-list> </table-list>
@@ -270,7 +270,7 @@ layout("/layouts/platform_h5.html"){
</van-cell-group> </van-cell-group>
<van-cell-group title="提案内容" class="form-group"> <van-cell-group title="提案内容" class="form-group">
<van-field <!--<van-field
v-model="formData.researchFindings" v-model="formData.researchFindings"
name="researchFindings" name="researchFindings"
label="调研情况" label="调研情况"
@@ -280,7 +280,7 @@ layout("/layouts/platform_h5.html"){
placeholder="请输入调研情况" placeholder="请输入调研情况"
:rules="[{ required: true, message: '请填写调研情况' }]" :rules="[{ required: true, message: '请填写调研情况' }]"
required required
></van-field> ></van-field>-->
<van-field <van-field
v-model="formData.brief" v-model="formData.brief"
@@ -308,7 +308,7 @@ layout("/layouts/platform_h5.html"){
<!-- 附件上传 --> <!-- 附件上传 -->
<van-cell-group title="附件上传" class="form-group"> <van-cell-group title="附件上传" class="form-group">
<van-field label="附件" name="files" required class="direction-column-field"> <van-field label="附件" name="files" class="direction-column-field">
<h5-file-upload <h5-file-upload
slot="input" slot="input"
:value.sync="formData.files" :value.sync="formData.files"
@@ -177,13 +177,12 @@ const todo = {
// 处理任务 // 处理任务
onView(task) { onView(task) {
const {taskId, taskKey, instanceId, businessNo, formKey} = task; const {taskId, taskKey, instanceId, businessNo, formKey, h5FormKey} = task;
this.$toast("暂未开通从当前地址点击查看!"); if (!h5FormKey) {
return;
if (!formKey) {
this.$toast("当前流程没有配置地址"); this.$toast("当前流程没有配置地址");
return; return;
} }
this.$pjaxReplace(h5FormKey + "?taskId=" + taskId + "bizId=" + businessNo + "taskKey=" + taskKey)
}, },
// 获取空状态文本 // 获取空状态文本