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
@@ -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;
@@ -125,13 +126,6 @@ public class ActivityDeclareMineController {
"""); """);
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 (AuthUtil.hasRole(RoleConstant.BRANCH_UNION_CHAIRMAN.name())) {
cnd.and("info.unionId", "=", SecurityUtil.getUnionId());
} else {
cnd.and("info.userId", "=", SecurityUtil.getUserId());
}
}
if (StrUtil.isAllBlank(pageParam.getPageOrderName(), pageParam.getPageOrderBy())) { if (StrUtil.isAllBlank(pageParam.getPageOrderName(), pageParam.getPageOrderBy())) {
cnd.desc("info.applyTime"); cnd.desc("info.applyTime");
} else { } else {
@@ -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);
ProcessTask parentProcessTask = dao.fetch(ProcessTask.class, task.getTaskParentId());
if ("committee".equals(parentProcessTask.getTaskName())) {
ProcessInstance instance = dao.fetch(ProcessInstance.class, task.getProcessInstanceId()); ProcessInstance instance = dao.fetch(ProcessInstance.class, task.getProcessInstanceId());
String businessNo = instance.getBusinessNo(); String businessNo = instance.getBusinessNo();
dao.clear(ProposalReplyUnit.class, Cnd.where(ProposalReplyUnit::getProposalId, "=", businessNo)); 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();
} }
//教代会届次 //教代会届次
if (Lang.isNotEmpty(searchParam.getSessionIds())) {
cnd.and("info.sessionId", "in", searchParam.getSessionIds());
} else {
cnd.andEX("info.sessionId", "=", searchParam.getSessionId()); 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,9 +210,11 @@ 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);
if (Lang.isNotEmpty(seconders)) {
list.get(i).put("secondedUserNames", seconders.stream().map(v -> v.getString("userName")).collect(Collectors.joining(","))); list.get(i).put("secondedUserNames", seconders.stream().map(v -> v.getString("userName")).collect(Collectors.joining(",")));
} }
} }
}
List<ExcelExportEntity> exportEntities = new ArrayList<>(); List<ExcelExportEntity> exportEntities = new ArrayList<>();
exportEntities.add(new ExcelExportEntity("序号", "index", 10)); exportEntities.add(new ExcelExportEntity("序号", "index", 10));
@@ -67,12 +67,13 @@ public class TeacherCongressSessionServiceImpl extends BaseServiceImpl<Teacher_c
session.setFullName("" + session.getJ() + "" + session.getC()); session.setFullName("" + session.getJ() + "" + session.getC());
insert(session); insert(session);
// 继承上届信息
if (isExtend) {
//代表团角色ID //代表团角色ID
Sys_role delegationHeadRole = sysRoleService.getByCode(RoleConstant.TEACHER_CONGRESS_DELEGATION_HEAD); Sys_role delegationHeadRole = sysRoleService.getByCode(RoleConstant.TEACHER_CONGRESS_DELEGATION_HEAD);
Sys_role delegationViceHeadRole = sysRoleService.getByCode(RoleConstant.TEACHER_CONGRESS_VICE_DELEGATION_HEAD); Sys_role delegationViceHeadRole = sysRoleService.getByCode(RoleConstant.TEACHER_CONGRESS_VICE_DELEGATION_HEAD);
Sys_role delegationContactRole = sysRoleService.getByCode(RoleConstant.TEACHER_CONGRESS_DELEGATION_CONTACT); Sys_role delegationContactRole = sysRoleService.getByCode(RoleConstant.TEACHER_CONGRESS_DELEGATION_CONTACT);
// 继承上届信息
//查询本届上次的信息 //查询本届上次的信息
int c_num = Convert.chineseToNumber(session.getC().replaceAll("", "")); int c_num = Convert.chineseToNumber(session.getC().replaceAll("", ""));
if (c_num == 1) return; if (c_num == 1) return;
@@ -236,6 +237,7 @@ public class TeacherCongressSessionServiceImpl extends BaseServiceImpl<Teacher_c
sysRoleService.clearCache(); sysRoleService.clearCache();
sysUserService.clearCache(); sysUserService.clearCache();
} }
}
@Override @Override
@Aop(TransAop.READ_COMMITTED) @Aop(TransAop.READ_COMMITTED)
+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,7 +1,75 @@
<!--# <!--#
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">
@@ -12,21 +80,19 @@ layout("/layouts/platform.html"){
: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',
label: 'name'
}"
node-key="id" node-key="id"
default-expand-all default-expand-all
@node-click="treeNodeClick" @node-click="treeNodeClick"
:filter-node-method="filterNode" :filter-node-method="filterNode"
highlight-current highlight-current
class="custom-tree"
> >
<template slot-scope="{ node, data }"> <template slot-scope="{ node, data }">
<span class="el-tree-node__label"> <span class="custom-tree-node">
<i class="el-icon-folder-opened" v-if="node.level===1"></i> <i class="el-icon-folder-opened" v-if="node.level===1"></i>
<i class="el-icon-folder" v-else></i> <i class="el-icon-folder" v-else></i>
{{node.label}} <span class="node-label">{{ node.label }}</span>
</span> </span>
</template> </template>
</el-tree> </el-tree>
@@ -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,14 +140,16 @@ const UNIT_MANAGE_TEMPLATE = {
this.options = [] this.options = []
}, },
doHandle() { doHandle() {
this.$confirm("确定要提交吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
const self = this const self = this
const url = this.formData.id ? "/platform/sys/unit/editDo" : "/platform/sys/unit/addDo" const url = this.formData.id ? "/platform/sys/unit/editDo" : "/platform/sys/unit/addDo"
this.$refs["form"].validate(async function (valid) { this.$refs["form"].validate(async function (valid) {
if (valid) { if (valid) {
if (!self.formData.id) { if (self.currentNode) {
self.formData.parentId = self.parentUnit[self.parentUnit.length - 1] || ""
}
if (self.currentNode !== 1) {
self.formData.parentId = self.currentData.id self.formData.parentId = self.currentData.id
} }
const resp = await self.$axios.post(url, self.formData) const resp = await self.$axios.post(url, self.formData)
@@ -169,6 +163,7 @@ const UNIT_MANAGE_TEMPLATE = {
} }
} }
}) })
})
}, },
async openEdit(id) { async openEdit(id) {
console.log(this.currentData) console.log(this.currentData)
@@ -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,21 +128,28 @@ 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-row>
<el-row :gutter="20" type="flex">
<el-col :span="12"> <el-col :span="12">
<el-form-item label="提案方式" prop="source"> <el-form-item label="提案方式" prop="source">
<el-input :value="dict.type.PROPOSAL_SOURCE.find(v=>v.code === formData.source)?.name" <el-input :value="dict.type.PROPOSAL_SOURCE.find(v=>v.code === formData.source)?.name"
disabled></el-input> disabled></el-input>
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row>
<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="typeId">
<el-select v-model="formData.typeId" style="width: 100%"> <el-select v-model="formData.typeId" style="width: 100%">
@@ -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,28 +58,27 @@ 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>
</el-col> </div>
<el-col :span="12"> <div class="grid-item">
<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>
</el-col> </div>
<el-col :span="12"> <div class="grid-item">
<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>
</el-col> </div>
<el-col :span="12"> <div class="grid-item">
<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"
@@ -89,21 +88,21 @@ const write = {
style="width: 100%" style="width: 100%"
></el-date-picker> ></el-date-picker>
</el-form-item> </el-form-item>
</el-col> </div>
<el-col :span="12"> <div class="grid-item">
<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>
</el-col> </div>
<el-col :span="12"> <div class="grid-item">
<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>
</el-col> </div>
<el-col :span="12"> <div class="grid-item">
<el-form-item label="所属工会"> <el-form-item label="所属工会">
<el-input <el-input
v-model="formData.unionName" v-model="formData.unionName"
@@ -112,8 +111,8 @@ const write = {
clearable clearable
></el-input> ></el-input>
</el-form-item> </el-form-item>
</el-col> </div>
<el-col :span="12"> <div class="grid-item">
<el-form-item label="所属单位"> <el-form-item label="所属单位">
<el-input <el-input
v-model="formData.unitName" v-model="formData.unitName"
@@ -122,77 +121,70 @@ const write = {
clearable clearable
></el-input> ></el-input>
</el-form-item> </el-form-item>
</el-col> </div>
<el-col :span="12"> <div class="grid-item">
<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>
</el-col> </div>
<el-col :span="12"> <div class="grid-item">
<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>
</el-col> </div>
<el-col :span="12"> <div class="grid-item">
<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>
</el-col> <div class="grid-item">
<el-col :span="12">
<el-form-item label="是否中级职称及以下" prop="intermediateBelow"> <el-form-item label="是否中级职称及以下" prop="intermediateBelow">
<el-radio-group v-model="formData.intermediateBelow" size="small"> <el-radio-group v-model="formData.intermediateBelow" 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>
</el-col> </div>
<el-col :span="12"> <div class="grid-item">
<el-form-item label="是否干部" prop="cadre"> <el-form-item label="是否干部" prop="cadre">
<el-radio-group v-model="formData.cadre" size="small"> <el-radio-group v-model="formData.cadre" 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>
</el-col> </div>
<el-col :span="12"> <div class="grid-item">
<el-form-item label="是否工人" prop="worker"> <el-form-item label="是否工人" prop="worker">
<el-radio-group v-model="formData.worker" size="small"> <el-radio-group v-model="formData.worker" 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>
</el-col> </div>
<div class="grid-item">
<el-col :span="12">
<el-form-item label="校级领导" prop="schoolLeader"> <el-form-item label="校级领导" prop="schoolLeader">
<el-radio-group v-model="formData.schoolLeader" size="small"> <el-radio-group v-model="formData.schoolLeader" 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>
</el-col> </div>
<div class="grid-item">
<el-col :span="12">
<el-form-item label="中层领导" prop="middleLevelLeader"> <el-form-item label="中层领导" prop="middleLevelLeader">
<el-radio-group v-model="formData.middleLevelLeader" size="small"> <el-radio-group v-model="formData.middleLevelLeader" 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>
</el-col> </div>
</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)
}, },
// 获取空状态文本 // 获取空状态文本