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.taskState,
t.formKey,
t.h5FormKey,
t.createdAt,
t.finishTime,
t.variable,
@@ -92,6 +93,7 @@ public class FlowTodoCenterController {
t.displayName AS taskName,
t.taskState,
t.formKey,
t.h5FormKey,
t.createdAt,
t.finishTime,
t.variable,
@@ -140,7 +142,9 @@ public class FlowTodoCenterController {
ins.createdAt,
ins.variable ->> '$.instanceName' AS instanceName,
GROUP_CONCAT(DISTINCT t.displayName) as taskName,
cat.`name` categoryName
cat.`name` categoryName,
t.formKey,
t.h5FormKey
FROM
wf_process_instance ins
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.createdAt,
ins.variable ->> '$.instanceName' AS instanceName,
cat.`name` categoryName
cat.`name` categoryName
FROM
wf_process_instance ins
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 h5form;
@Override
public void exec(Execution execution) {
// 执行任务节点自定义执行逻辑
@@ -21,6 +21,7 @@ public interface NodeParser {
String EXPR_KEY = "expr"; // 表达式key
String HANDLE_CLASS_KEY = "handleClass"; // 表达式处理类
String FORM_KEY = "form"; // 表单标识
String H5_FORM_KEY = "h5form"; // 表单标识
String ASSIGNEE_KEY = "assignee"; // 参与人
String ASSIGNMENT_HANDLE_KEY = "assignmentHandler"; // 参与人处理类
String TASK_TYPE_KEY = "taskType"; // 任务类型(主办/协办)
@@ -29,6 +29,7 @@ public class TaskParser extends AbstractNodeParser {
TaskModel taskModel = (TaskModel)nodeModel;
Dict properties = lfNode.getProperties();
taskModel.setForm(properties.getStr(FORM_KEY));
taskModel.setH5form(properties.getStr(H5_FORM_KEY));
taskModel.setAssignee(properties.getStr(ASSIGNEE_KEY));
taskModel.setAssignmentHandler(properties.getStr(ASSIGNMENT_HANDLE_KEY));
taskModel.setTaskType(ProcessTaskTypeEnum.codeOf(properties.get(TASK_TYPE_KEY)));
@@ -66,6 +66,10 @@ public class ProcessTask extends BaseModel {
@Column
private String formKey;
@Comment("h5任务处理表单KEY")
@Column
private String h5FormKey;
@Comment("父任务ID")
@Column
private Long taskParentId;
@@ -2,6 +2,7 @@ package com.budwk.app.flow.service;
import cn.hutool.core.lang.Dict;
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.engine.FlowEngine;
import com.budwk.app.flow.enums.ProcessSubmitTypeEnum;
@@ -52,6 +53,10 @@ public class FlowCommonService {
} else if (ObjectUtil.equals(submitType, ProcessSubmitTypeEnum.ROLLBACK_TO_OPERATOR.getCode())) {
// 退回发起人
flowEngine.executeAndJumpToFirstTaskNode(processTaskId, operator, args);
// 退回发起人发送订阅消息,执行相关操作
FlowJumpToFirstTaskNodePublisher.broadcast(processTaskId);
} else if (ObjectUtil.equals(submitType, ProcessSubmitTypeEnum.COUNTERSIGN_DISAGREE.getCode())) {
// 会签不同意,追加不同意标识
args.put(FlowConst.COUNTERSIGN_DISAGREE_FLAG, 1);
@@ -174,6 +174,7 @@ public class ProcessTaskServiceImpl extends BaseServiceImpl<ProcessTask> impleme
processTask.setTaskState(ProcessTaskStateEnum.DOING.getCode());
processTask.setTaskType(taskModel.getTaskType().getCode());
processTask.setFormKey(taskModel.getForm());
processTask.setH5FormKey(taskModel.getH5form());
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();
// 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) {
try {
if ("root".equals(parentId)) {
parentId = "";
parentId = "0";
}
unit.setCreatedBy(SecurityUtil.getUserId());
unit.setUnitType("用户自建");
@@ -60,6 +60,7 @@ public class SysV4ServController {
cnd.where().andLike("t.disPlayName", keyword);
}
cnd.andEX("t.category", "=", categoryId);
cnd.andEX("t.pinyinName", "=", letter);
sql.setCondition(cnd);
List<NutMap> list = sysMenuService.listMap(sql);
return Result.success(list);
@@ -30,7 +30,7 @@ public class CspProcessor extends AbstractProcessor {
"style-src * 'unsafe-inline' data:; " +
"img-src 'self' data: https:; " +
"font-src * data: https:; " +
"connect-src 'self' https:; " +
"connect-src 'self' https: webpack:; " +
"frame-ancestors 'self'; " +
"object-src 'self';";
@@ -37,6 +37,7 @@ import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.dao.util.cri.SqlExpressionGroup;
import org.nutz.ioc.aop.Aop;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
@@ -65,232 +66,225 @@ import java.util.*;
@At("/platform/activityDeclare/mine")
public class ActivityDeclareMineController {
@Inject
private Dao dao;
@Inject
private FlowEngine flowEngine;
@Inject
private SysOfficeTemplateUtil sysOfficeTemplateUtil;
@Inject
private ActivityDeclareService activityDeclareService;
@Inject
private Dao dao;
@Inject
private FlowEngine flowEngine;
@Inject
private SysOfficeTemplateUtil sysOfficeTemplateUtil;
@Inject
private ActivityDeclareService activityDeclareService;
@At("")
@SaCheckPermission("activityDeclare.mine")
@Ok("beetl:/platform/zhgh/activity/declarereimbursement/declare/mine/index.html")
public void index() {
}
@At("")
@SaCheckPermission("activityDeclare.mine")
@Ok("beetl:/platform/zhgh/activity/declarereimbursement/declare/mine/index.html")
public void index() {
}
@At
@ApiOperation("活动申报,我的申请列表")
@SaCheckPermission("activityDeclare.mine")
public Result pageData(CommonPageParam pageParam) {
Sql sql = Sqls.create("""
SELECT
info.id,
info.userName,
info.mobile,
info.loginName,
info.applyTime,
info.activityName,
info.activityAddress,
info.planStartTime,
info.planEndTime,
info.declareUnitName,
info.activityType,
info.activityContent,
info.activityNumber,
ins.id AS instanceId,
ins.businessNo,
ins.state instanceState,
ins.variable instanceVariable,
ins.processDefineId instanceProcessDefineId,
t.id taskId,
t.taskName AS taskKey,
t.displayName taskName,
t.taskType,
t.performType taskPerformType,
t.taskState,
t.finishTime,
t.taskParentId,
t.variable taskVariable,
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
FROM
activity_declare_info info
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_actor ta ON ta.processTaskId = t.id
$condition
""");
Cnd cnd = Cnd.NEW();
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())) {
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
@ApiOperation("活动申报,我的申请列表")
@SaCheckPermission("activityDeclare.mine")
public Result pageData(CommonPageParam pageParam) {
Sql sql = Sqls.create("""
SELECT
info.id,
info.userName,
info.mobile,
info.loginName,
info.applyTime,
info.activityName,
info.activityAddress,
info.planStartTime,
info.planEndTime,
info.declareUnitName,
info.activityType,
info.activityContent,
info.activityNumber,
ins.id AS instanceId,
ins.businessNo,
ins.state instanceState,
ins.variable instanceVariable,
ins.processDefineId instanceProcessDefineId,
t.id taskId,
t.taskName AS taskKey,
t.displayName taskName,
t.taskType,
t.performType taskPerformType,
t.taskState,
t.finishTime,
t.taskParentId,
t.variable taskVariable,
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
FROM
activity_declare_info info
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_actor ta ON ta.processTaskId = t.id
$condition
""");
Cnd cnd = Cnd.NEW();
pageParam.buildSearch(cnd, "info.");
if (StrUtil.isAllBlank(pageParam.getPageOrderName(), pageParam.getPageOrderBy())) {
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
@ApiOperation("活动申报,查看活动申报")
@SaCheckPermission("activityDeclare")
public Result findOne(@Valid String id) {
ActivityDeclareInfo info = dao.fetch(ActivityDeclareInfo.class, id);
return Result.success().addData(info);
}
@At
@ApiOperation("活动申报,查看活动申报")
@SaCheckPermission("activityDeclare")
public Result findOne(@Valid String id) {
ActivityDeclareInfo info = dao.fetch(ActivityDeclareInfo.class, id);
return Result.success().addData(info);
}
@At
@ApiOperation("删除活动申报")
@Aop(TransAop.READ_COMMITTED)
@SaCheckPermission("activityDeclare.mine")
@SLog(tag = "活动申报", msg = "删除活动申报id: ${args[0]}")
public Result onDelete(@Valid String id) {
dao.clear(ActivityDeclareInfo.class, Cnd.where("id", "=", id));
// 删除流程相关
flowEngine.processInstanceService().deleteProcessInstanceByBusinessKey(id);
@At
@ApiOperation("删除活动申报")
@Aop(TransAop.READ_COMMITTED)
@SaCheckPermission("activityDeclare.mine")
@SLog(tag = "活动申报", msg = "删除活动申报id: ${args[0]}")
public Result onDelete(@Valid String id) {
dao.clear(ActivityDeclareInfo.class, Cnd.where("id", "=", id));
// 删除流程相关
flowEngine.processInstanceService().deleteProcessInstanceByBusinessKey(id);
// 如果有报销的流程,也一并删除
ActivityReimbursementInfo reimbursementInfo = dao.fetch(ActivityReimbursementInfo.class, Cnd.where("declareId", "=", id));
if (Lang.isNotEmpty(reimbursementInfo)) {
dao.clear(ActivityReimbursementInfo.class, Cnd.where("id", "=", reimbursementInfo.getId()));
// 删除流程相关
flowEngine.processInstanceService().deleteProcessInstanceByBusinessKey(reimbursementInfo.getId());
}
return Result.success();
}
// 如果有报销的流程,也一并删除
ActivityReimbursementInfo reimbursementInfo = dao.fetch(ActivityReimbursementInfo.class, Cnd.where("declareId", "=", id));
if (Lang.isNotEmpty(reimbursementInfo)) {
dao.clear(ActivityReimbursementInfo.class, Cnd.where("id", "=", reimbursementInfo.getId()));
// 删除流程相关
flowEngine.processInstanceService().deleteProcessInstanceByBusinessKey(reimbursementInfo.getId());
}
return Result.success();
}
@At
@Ok("void")
@SaCheckPermission("activityDeclare.mine")
@SLog(tag = "活动申报", msg = "导出活动申报表")
public void doExportDeclare(@Valid String id, HttpServletResponse response) {
HashMap<String, Object> docData = new HashMap<>();
@At
@Ok("void")
@SaCheckPermission("activityDeclare.mine")
@SLog(tag = "活动申报", msg = "导出活动申报表")
public void doExportDeclare(@Valid String id, HttpServletResponse response) {
HashMap<String, Object> docData = new HashMap<>();
Sql sql = Sqls.create("""
SELECT
info.*,
ins.id AS instanceId
FROM
`activity_declare_info` info
LEFT JOIN wf_process_instance ins ON ins.businessNo = info.id
WHERE
ins.state = 20 AND info.id = @id
""").setParam("id", id);
sql.setCallback(Sqls.callback.map());
dao.execute(sql);
NutMap info = (NutMap) sql.getResult();
Sql sql = Sqls.create("""
SELECT
info.*,
ins.id AS instanceId
FROM
`activity_declare_info` info
LEFT JOIN wf_process_instance ins ON ins.businessNo = info.id
WHERE
ins.state = 20 AND info.id = @id
""").setParam("id", id);
sql.setCallback(Sqls.callback.map());
dao.execute(sql);
NutMap info = (NutMap) sql.getResult();
String activityContent = info.getString("activityContent");
info.put("activityContent", sysOfficeTemplateUtil.convertRichTextToDocText(activityContent));
String activityContent = info.getString("activityContent");
info.put("activityContent", sysOfficeTemplateUtil.convertRichTextToDocText(activityContent));
docData.put("schoolName", Globals.AppName);
docData.put("info", info);
docData.put("schoolName", Globals.AppName);
docData.put("info", info);
List<ProcessTaskVO> doneTaskVos = new ArrayList<>();
List<ProcessTask> doneTaskList = flowEngine.processTaskService().getDoneTaskList(info.getLong("instanceId"), null);
for (ProcessTask doneTask : doneTaskList) {
ProcessTaskVO taskVO = flowEngine.processTaskService().findById(doneTask.getId());
doneTaskVos.add(taskVO);
}
List<ProcessTaskVO> doneTaskVos = new ArrayList<>();
List<ProcessTask> doneTaskList = flowEngine.processTaskService().getDoneTaskList(info.getLong("instanceId"), null);
for (ProcessTask doneTask : doneTaskList) {
ProcessTaskVO taskVO = flowEngine.processTaskService().findById(doneTask.getId());
doneTaskVos.add(taskVO);
}
// 分工会审核
doneTaskVos.stream().filter(task -> "分工会审核".equals(task.getDisplayName()))
.max(Comparator.comparing(ProcessTaskVO::getCreatedAt))
.ifPresent(v -> {
Dict taskFormData = v.getTaskFormData();
HashMap<String, Object> approval = new HashMap<>();
// 分工会审核
doneTaskVos.stream().filter(task -> "分工会审核".equals(task.getDisplayName()))
.max(Comparator.comparing(ProcessTaskVO::getCreatedAt))
.ifPresent(v -> {
Dict taskFormData = v.getTaskFormData();
HashMap<String, Object> approval = new HashMap<>();
approval.put("date", DateUtil.format(v.getFinishTime(), "yyyy年MM月dd日"));
approval.put("user", taskFormData.getStr("tf_userName"));
if (StrUtil.isNotBlank(taskFormData.getStr("tf_sign"))) {
approval.put("sign", sysOfficeTemplateUtil.createPictureRenderData(taskFormData.getStr("tf_sign")));
}
approval.put("opinion", taskFormData.getStr("tf_opinion"));
docData.put("fgh", approval);
});
approval.put("date", DateUtil.format(v.getFinishTime(), "yyyy年MM月dd日"));
approval.put("user", taskFormData.getStr("tf_userName"));
if (StrUtil.isNotBlank(taskFormData.getStr("tf_sign"))) {
approval.put("sign", sysOfficeTemplateUtil.createPictureRenderData(taskFormData.getStr("tf_sign")));
}
approval.put("opinion", taskFormData.getStr("tf_opinion"));
docData.put("fgh", approval);
});
// 协会负责人审核
doneTaskVos.stream().filter(task -> "协会负责人审核".equals(task.getDisplayName()))
.max(Comparator.comparing(ProcessTaskVO::getCreatedAt))
.ifPresent(v -> {
Dict taskFormData = v.getTaskFormData();
HashMap<String, Object> approval = new HashMap<>();
// 协会负责人审核
doneTaskVos.stream().filter(task -> "协会负责人审核".equals(task.getDisplayName()))
.max(Comparator.comparing(ProcessTaskVO::getCreatedAt))
.ifPresent(v -> {
Dict taskFormData = v.getTaskFormData();
HashMap<String, Object> approval = new HashMap<>();
approval.put("date", DateUtil.format(v.getFinishTime(), "yyyy年MM月dd日"));
approval.put("user", taskFormData.getStr("tf_userName"));
if (StrUtil.isNotBlank(taskFormData.getStr("tf_sign"))) {
approval.put("sign", sysOfficeTemplateUtil.createPictureRenderData(taskFormData.getStr("tf_sign")));
}
approval.put("opinion", taskFormData.getStr("tf_opinion"));
docData.put("xh", approval);
});
approval.put("date", DateUtil.format(v.getFinishTime(), "yyyy年MM月dd日"));
approval.put("user", taskFormData.getStr("tf_userName"));
if (StrUtil.isNotBlank(taskFormData.getStr("tf_sign"))) {
approval.put("sign", sysOfficeTemplateUtil.createPictureRenderData(taskFormData.getStr("tf_sign")));
}
approval.put("opinion", taskFormData.getStr("tf_opinion"));
docData.put("xh", approval);
});
// 校工会负责人审核
doneTaskVos.stream().filter(task -> "校工会负责人审核".equals(task.getDisplayName()))
.max(Comparator.comparing(ProcessTaskVO::getCreatedAt))
.ifPresent(v -> {
Dict taskFormData = v.getTaskFormData();
HashMap<String, Object> approval = new HashMap<>();
// 校工会负责人审核
doneTaskVos.stream().filter(task -> "校工会负责人审核".equals(task.getDisplayName()))
.max(Comparator.comparing(ProcessTaskVO::getCreatedAt))
.ifPresent(v -> {
Dict taskFormData = v.getTaskFormData();
HashMap<String, Object> approval = new HashMap<>();
approval.put("date", DateUtil.format(v.getFinishTime(), "yyyy年MM月dd日"));
approval.put("user", taskFormData.getStr("tf_userName"));
if (StrUtil.isNotBlank(taskFormData.getStr("tf_sign"))) {
approval.put("sign", sysOfficeTemplateUtil.createPictureRenderData(taskFormData.getStr("tf_sign")));
}
approval.put("opinion", taskFormData.getStr("tf_opinion"));
docData.put("xfzr", approval);
});
approval.put("date", DateUtil.format(v.getFinishTime(), "yyyy年MM月dd日"));
approval.put("user", taskFormData.getStr("tf_userName"));
if (StrUtil.isNotBlank(taskFormData.getStr("tf_sign"))) {
approval.put("sign", sysOfficeTemplateUtil.createPictureRenderData(taskFormData.getStr("tf_sign")));
}
approval.put("opinion", taskFormData.getStr("tf_opinion"));
docData.put("xfzr", approval);
});
// 校工会主席审核
doneTaskVos.stream().filter(task -> "校工会主席审核".equals(task.getDisplayName()))
.max(Comparator.comparing(ProcessTaskVO::getCreatedAt))
.ifPresent(v -> {
Dict taskFormData = v.getTaskFormData();
HashMap<String, Object> approval = new HashMap<>();
// 校工会主席审核
doneTaskVos.stream().filter(task -> "校工会主席审核".equals(task.getDisplayName()))
.max(Comparator.comparing(ProcessTaskVO::getCreatedAt))
.ifPresent(v -> {
Dict taskFormData = v.getTaskFormData();
HashMap<String, Object> approval = new HashMap<>();
approval.put("date", DateUtil.format(v.getFinishTime(), "yyyy年MM月dd日"));
approval.put("user", taskFormData.getStr("tf_userName"));
if (StrUtil.isNotBlank(taskFormData.getStr("tf_sign"))) {
approval.put("sign", sysOfficeTemplateUtil.createPictureRenderData(taskFormData.getStr("tf_sign")));
}
approval.put("opinion", taskFormData.getStr("tf_opinion"));
docData.put("xzx", approval);
});
approval.put("date", DateUtil.format(v.getFinishTime(), "yyyy年MM月dd日"));
approval.put("user", taskFormData.getStr("tf_userName"));
if (StrUtil.isNotBlank(taskFormData.getStr("tf_sign"))) {
approval.put("sign", sysOfficeTemplateUtil.createPictureRenderData(taskFormData.getStr("tf_sign")));
}
approval.put("opinion", taskFormData.getStr("tf_opinion"));
docData.put("xzx", approval);
});
String budgetsStr = info.getString("budgets");
List<ActivityBudgetVO> list = JSONUtil.parseArray(budgetsStr).toList(ActivityBudgetVO.class);
for (int i = 0; i < list.size(); i++) {
list.get(i).setRanking(i + 1);
}
docData.put("budgets", list);
String budgetsStr = info.getString("budgets");
List<ActivityBudgetVO> list = JSONUtil.parseArray(budgetsStr).toList(ActivityBudgetVO.class);
for (int i = 0; i < list.size(); i++) {
list.get(i).setRanking(i + 1);
}
docData.put("budgets", list);
LoopRowTableRenderPolicy policy = new LoopRowTableRenderPolicy();
Configure config = Configure.builder()
.bind("budgets", policy)
.build();
LoopRowTableRenderPolicy policy = new LoopRowTableRenderPolicy();
Configure config = Configure.builder()
.bind("budgets", policy)
.build();
String fileName = Globals.AppName + "" + info.getString("activityName") + "】申报表.docx";
String fileName = Globals.AppName + "" + info.getString("activityName") + "】申报表.docx";
try (ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream()) {
XWPFTemplate.compile(sysOfficeTemplateUtil.getTemplate("activity_declare"), config).render(docData).writeAndClose(byteArrayOutputStream);
CommonDownloadUtil.download(fileName, byteArrayOutputStream.toByteArray(), response);
} catch (IOException e) {
log.error("活动申报表导出失败,id:{},错误信息:{}", id, e.getMessage());
}
}
try (ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream()) {
XWPFTemplate.compile(sysOfficeTemplateUtil.getTemplate("activity_declare"), config).render(docData).writeAndClose(byteArrayOutputStream);
CommonDownloadUtil.download(fileName, byteArrayOutputStream.toByteArray(), response);
} catch (IOException e) {
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())) {
cnd.and(prefix + "declareUnitName", "<>", ActivityDeclareReimbursement.SCHOOL_UNION.name());
SqlExpressionGroup group = new SqlExpressionGroup();
if (AuthUtil.hasRoleOr(RoleConstant.BRANCH_UNION_CHAIRMAN.name(),
RoleConstant.BRANCH_UNION_ADMIN.name(),
RoleConstant.BRANCH_UNION_OPERATOR.name())) {
cnd.and(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());
group.or(prefix + "unionid", "=", SecurityUtil.getUnionId());
}
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 {
cnd.andEX(prefix + "unionId", "=", this.getUnionId());
cnd.andEX(prefix + "clubId", "=", this.getClubId());
@@ -91,6 +91,7 @@ public class ActivityBudgetSchoolAuditController {
cnd.and("t.taskName", "=", "b6f29037-972d-4b97-8677-c3b3672ef0dc");
// cnd.and("ta.actorId", "in", List.of(SecurityUtil.getUserId()));
cnd.andEX("info.unionId", "=", unionId);
cnd.andEX("info.clubId", "=", clubId);
cnd.andEX("info.outlayManageSource", "=", outlayManageSource);
cnd.andEX("info.budgetReimburseType", "=", budgetReimburseType);
@@ -91,6 +91,7 @@ public class ActivityBudgetSchoolPrincipalController {
cnd.and("t.taskName", "=", "0b6aea8c-9d24-4d6d-b10b-4c930c919093");
cnd.and("ta.actorId", "in", List.of(SecurityUtil.getUserId()));
cnd.andEX("info.unionId", "=", unionId);
cnd.andEX("info.clubId", "=", clubId);
cnd.andEX("info.outlayManageSource", "=", outlayManageSource);
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.SaCheckPermission;
import cn.hutool.core.util.StrUtil;
import com.budwk.app.base.result.Result;
import com.budwk.app.zhgh.democratic.proposal.models.ProposalConfig;
import com.budwk.app.zhgh.democratic.proposal.models.ProposalType;
@@ -49,8 +50,11 @@ public class ProposalCommonController {
@At
@SaCheckLogin
@ApiOperation("查询全部的教代会")
public Result listSession() {
List<Teacher_congress_session> list = dao.query(Teacher_congress_session.class, Cnd.NEW().desc("startDate"));
public Result listSession(String orderBy) {
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);
}
@@ -89,7 +89,13 @@ public class ProposalSeniorBasicController {
@ApiOperation(value = "提案内容修改")
@Aop(TransAop.READ_COMMITTED)
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();
}
@@ -93,7 +93,8 @@ public class ProposalSchoolLeaderApprovalController {
t.taskParentId,
t.variable taskVariable,
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
wf_process_task t
LEFT JOIN wf_process_instance ins ON ins.id = t.processInstanceId
@@ -104,7 +104,8 @@ public class ProposalUnderTakeReplyController {
t.variable->>'$.underTakeName' AS underTakeName,
IF(JSON_EXTRACT(t.variable, '$.underTakeIsMaster') = true, 1, 0) AS underTakeIsMaster,
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
wf_process_task t
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.zhgh.democratic.proposal.models.ProposalReplyUnit;
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.Dao;
import org.nutz.ioc.aop.Aop;
import java.util.List;
@@ -22,7 +24,9 @@ import java.util.List;
* 提案主办单位处理人
*/
public class ProposalMasterUnitAssignmentHandler implements AssignmentHandler {
@Override
@Aop(TransAop.READ_COMMITTED)
public List<String> assign(TaskModel model, Execution execution) {
Dao dao = ServiceContext.find(Dao.class);
SysRoleService sysRoleService = ServiceContext.find(SysRoleService.class);
@@ -42,7 +46,8 @@ public class ProposalMasterUnitAssignmentHandler implements AssignmentHandler {
// 如果没有 认为是需要重新答复 从记录表里取值
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) {
throw new BaseException("系统异常");
}
@@ -26,9 +26,13 @@ public class ProposalCaseTaskRevokeEventListener implements ProcessEventListener
if (event.getEventType() == ProcessEventTypeEnum.PROCESS_TASK_REVOKE) {
Long taskId = event.getSourceId();
ProcessTask task = dao.fetch(ProcessTask.class, taskId);
ProcessInstance instance = dao.fetch(ProcessInstance.class, task.getProcessInstanceId());
String businessNo = instance.getBusinessNo();
dao.clear(ProposalReplyUnit.class, Cnd.where(ProposalReplyUnit::getProposalId, "=", businessNo));
ProcessTask parentProcessTask = dao.fetch(ProcessTask.class, task.getTaskParentId());
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 org.nutz.dao.Cnd;
import org.nutz.dao.util.cri.SqlExpressionGroup;
import org.nutz.lang.Lang;
@EqualsAndHashCode(callSuper = true)
@Data
@@ -58,6 +59,8 @@ public class ProposalQueryComprehensiveParam extends PageForm {
@ApiModelProperty(name = "通用关键字")
private String commonKeyword;
@ApiModelProperty(name = "搜索关键字")
private String createUserKeyword;
/**
@@ -71,7 +74,12 @@ public class ProposalQueryComprehensiveParam extends PageForm {
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())) {
cnd.where().andLike("info.name", searchParam.getName());
@@ -93,6 +101,14 @@ public class ProposalQueryComprehensiveParam extends PageForm {
if (StrUtil.isNotBlank(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());
// 提案人单位
@@ -36,6 +36,7 @@ import org.nutz.dao.sql.Sql;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.json.Json;
import org.nutz.lang.Lang;
import org.nutz.lang.util.NutMap;
import javax.servlet.http.HttpServletResponse;
@@ -209,7 +210,9 @@ public class ProposalExportServiceImpl extends BaseServiceImpl<ProposalInfo> imp
if (inviteTask != null) {
NutMap variable = Json.fromJson(NutMap.class, inviteTask.getVariable());
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());
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);
// 继承上届信息
//查询本届上次的信息
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 (isExtend) {
//代表团角色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 (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 + ""));
//机构及机构人员数据
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);
if (ObjectUtil.isEmpty(lastSession)) return;
//从代表团入手
List<Teacher_congress_delegation> lastDelegations = dao().query(Teacher_congress_delegation.class, Cnd.where("sessionId", "=", lastSession.getId()));
for (Teacher_congress_delegation lastDelegation : lastDelegations) {
//代表团继承
Teacher_congress_delegation newDelegation = BeanUtil.copyProperties(lastDelegation, Teacher_congress_delegation.class);
newDelegation.setId(null);
newDelegation.setSessionId(session.getId());
dao().insert(newDelegation);
//机构及机构人员数据
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<Sys_user_role> lastHeadUserRoles = dao().query(Sys_user_role.class, Cnd.where(Sys_user_role::getTcDelegationId, "=", lastDelegation.getId())
.and(Sys_user_role::getRoleId, "=", delegationHeadRole.getId()));
for (Sys_user_role lastHeadUser : lastHeadUserRoles) {
Sys_user_role newHeadUser = BeanUtil.copyProperties(lastHeadUser, Sys_user_role.class);
newHeadUser.setTcDelegationId(newDelegation.getId());
newHeadUser.setTcSessionId(session.getId());
dao().insert(newHeadUser);
}
//副团长角色权限继承
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> lastDelegations = dao().query(Teacher_congress_delegation.class, Cnd.where("sessionId", "=", lastSession.getId()));
for (Teacher_congress_delegation lastDelegation : lastDelegations) {
//代表团继承
Teacher_congress_delegation newDelegation = BeanUtil.copyProperties(lastDelegation, Teacher_congress_delegation.class);
newDelegation.setId(null);
newDelegation.setSessionId(session.getId());
dao().insert(newDelegation);
//组成分工会
List<Teacher_congress_delegation_union> lastDelegationUnions = dao().query(Teacher_congress_delegation_union.class, Cnd.where(Teacher_congress_delegation_union::getDelegationId, "=", lastDelegation.getId()));
List<Teacher_congress_delegation_union> newDelegationUnions = lastDelegationUnions.stream().map(lastDelegationUnion -> {
Teacher_congress_delegation_union newDelegationUnion = BeanUtil.copyProperties(lastDelegationUnion, Teacher_congress_delegation_union.class);
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());
}
//团长角色权限继承
List<Sys_user_role> lastHeadUserRoles = dao().query(Sys_user_role.class, Cnd.where(Sys_user_role::getTcDelegationId, "=", lastDelegation.getId())
.and(Sys_user_role::getRoleId, "=", delegationHeadRole.getId()));
for (Sys_user_role lastHeadUser : lastHeadUserRoles) {
Sys_user_role newHeadUser = BeanUtil.copyProperties(lastHeadUser, Sys_user_role.class);
newHeadUser.setTcDelegationId(newDelegation.getId());
newHeadUser.setTcSessionId(session.getId());
dao().insert(newHeadUser);
}
//副团长角色权限继承
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);
}
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());
//组成分工会
List<Teacher_congress_delegation_union> lastDelegationUnions = dao().query(Teacher_congress_delegation_union.class, Cnd.where(Teacher_congress_delegation_union::getDelegationId, "=", lastDelegation.getId()));
List<Teacher_congress_delegation_union> newDelegationUnions = lastDelegationUnions.stream().map(lastDelegationUnion -> {
Teacher_congress_delegation_union newDelegationUnion = BeanUtil.copyProperties(lastDelegationUnion, Teacher_congress_delegation_union.class);
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);
//代表权限数据
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);
sysRoleService.clearCache();
sysUserService.clearCache();
}
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
+21 -18
View File
@@ -67,15 +67,15 @@ layout("/layouts/v4/baseLayout.html"){
}
.apps-header {
padding: 0 0 20px 0;
padding: 0 0 10px 0;
border-bottom: 1px solid #eee;
margin-bottom: 20px;
margin-bottom: 10px;
}
.apps-search-container {
display: flex;
align-items: center;
margin-bottom: 20px;
/*margin-bottom: 20px;*/
}
.apps-search {
@@ -103,13 +103,16 @@ layout("/layouts/v4/baseLayout.html"){
}
.apps-filter {
margin-top: 20px;
margin-top: 10px;
display: flex;
align-items: flex-end;
}
.apps-filter-title {
color: #666;
font-size: 14px;
margin-bottom: 5px;
margin-right: 5px;
}
.apps-filter-tags {
@@ -356,20 +359,20 @@ layout("/layouts/v4/baseLayout.html"){
</div>
<!-- 字母过滤 -->
<!-- <div class="apps-filter">-->
<!-- <div class="apps-filter-title">首字母:</div>-->
<!-- <div class="apps-filter-tags alphabet-filter">-->
<!-- <div :class="['filter-tag', activeAlphabet === '' ? 'active' : '']" @click="changeAlphabet('')">全部</div>-->
<!-- <div-->
<!-- v-for="letter in alphabets"-->
<!-- :key="letter"-->
<!-- :class="['alphabet-item', activeAlphabet === letter ? 'active' : '']"-->
<!-- @click="changeAlphabet(letter)"-->
<!-- >-->
<!-- {{ letter }}-->
<!-- </div>-->
<!-- </div>-->
<!-- </div>-->
<div class="apps-filter">
<div class="apps-filter-title">首字母:</div>
<div class="apps-filter-tags alphabet-filter">
<div :class="['filter-tag', activeAlphabet === '' ? 'active' : '']" @click="changeAlphabet('')">全部</div>
<div
v-for="letter in alphabets"
:key="letter"
:class="['alphabet-item', activeAlphabet === letter ? 'active' : '']"
@click="changeAlphabet(letter)"
>
{{ letter }}
</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/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>
l
<!-- 引入 form-create 和 designer -->
<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>
@@ -80,7 +80,7 @@
<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>
<!-- <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!}/assets/platform/js/util/commonUtil.js"></script>
@@ -351,6 +351,16 @@
Vue.prototype.$auth = commonUtil.authService()
Vue.prototype.$axios = commonUtil.axiosService()
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>
<!--vue全局组件-->
@@ -676,7 +686,7 @@
</a>
</div>
</header>
<div style="height: 45px"></div>
<div style="height: 64px"></div>
<main class="v4-content">
<!-- 页面内容区域 -->
@@ -108,6 +108,7 @@ const user = {
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</div>
</div>
</div>
+23 -20
View File
@@ -63,15 +63,15 @@ layout("/layouts/v4/baseLayout.html"){
}
.apps-header {
padding: 0 0 20px 0;
padding: 0 0 10px 0;
border-bottom: 1px solid #eee;
margin-bottom: 20px;
margin-bottom: 10px;
}
.apps-search-container {
display: flex;
align-items: center;
margin-bottom: 20px;
/*margin-bottom: 20px;*/
}
.apps-search {
@@ -99,13 +99,16 @@ layout("/layouts/v4/baseLayout.html"){
}
.apps-filter {
margin-top: 20px;
margin-top: 10px;
display: flex;
align-items: flex-end;
}
.apps-filter-title {
color: #666;
font-size: 14px;
margin-bottom: 5px;
margin-right: 5px;
}
.apps-filter-tags {
@@ -351,22 +354,22 @@ layout("/layouts/v4/baseLayout.html"){
</div>
<!-- 字母过滤 -->
<!-- <div class="apps-filter">-->
<!-- <div class="apps-filter-title">首字母:</div>-->
<!-- <div class="apps-filter-tags alphabet-filter">-->
<!-- <div :class="['filter-tag', activeAlphabet === '' ? 'active' : '']" @click="changeAlphabet('')">-->
<!-- 全部-->
<!-- </div>-->
<!-- <div-->
<!-- v-for="letter in alphabets"-->
<!-- :key="letter"-->
<!-- :class="['alphabet-item', activeAlphabet === letter ? 'active' : '']"-->
<!-- @click="changeAlphabet(letter)"-->
<!-- >-->
<!-- {{ letter }}-->
<!-- </div>-->
<!-- </div>-->
<!-- </div>-->
<div class="apps-filter">
<div class="apps-filter-title">首字母:</div>
<div class="apps-filter-tags alphabet-filter">
<div :class="['filter-tag', activeAlphabet === '' ? 'active' : '']" @click="changeAlphabet('')">
全部
</div>
<div
v-for="letter in alphabets"
:key="letter"
:class="['alphabet-item', activeAlphabet === letter ? 'active' : '']"
@click="changeAlphabet(letter)"
>
{{ letter }}
</div>
</div>
</div>
</div>
<!-- 应用网格 -->
@@ -39,14 +39,18 @@
'assigneeText',
'assigneeMode',
'buttonConfig',
'enableNextOperator'
'enableNextOperator',
'h5form'
]"
>
<!-- <template v-slot:form-item-task-form="{model,field}">-->
<!-- <el-form-item label="form">-->
<!-- -->
<!-- </el-form-item>-->
<!-- </template>-->
<template v-slot:form-item-task-form="{model,field}">
<el-form-item label="pc跳转地址">
<el-input placeholder="请输入pc跳转地址" clearable v-model="model[field]"></el-input>
</el-form-item>
<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}">
<assignee-form :model="model" :field="field" :start_node_next_node_ids="startNodeNextNodeIds"></assignee-form>
@@ -59,6 +59,10 @@
</head>
<body>
<div id="app" v-cloak>
<van-notice-bar
left-icon="volume-o"
text="请选择完文件后,一次性上传。"
></van-notice-bar>
<h1>文件上传</h1>
<van-uploader
v-model="fileList"
@@ -1,35 +1,101 @@
<!--#
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>
<el-row type="flex" :gutter="20" style="height: calc(100vh - 126px)">
<el-col :span="5">
<el-card shadow="never">
<el-input placeholder="输入关键字进行查找" v-model="filterText" clearable></el-input>
<div style="max-height: calc(100vh - 200px); overflow-y: auto">
<el-tree
:data="treeData"
ref="treeRef"
:expand-on-click-node="false"
:props="{
children: 'children',
label: 'name'
}"
node-key="id"
default-expand-all
@node-click="treeNodeClick"
:filter-node-method="filterNode"
highlight-current
>
<template slot-scope="{ node, data }">
<span class="el-tree-node__label">
<i class="el-icon-folder-opened" v-if="node.level===1"></i>
<i class="el-icon-folder" v-else></i>
{{node.label}}
</span>
</template>
</el-tree>
<el-tree
:data="treeData"
ref="treeRef"
:expand-on-click-node="false"
:props="{ children: 'children', label: 'name' }"
node-key="id"
default-expand-all
@node-click="treeNodeClick"
:filter-node-method="filterNode"
highlight-current
class="custom-tree"
>
<template slot-scope="{ node, data }">
<span class="custom-tree-node">
<i class="el-icon-folder-opened" v-if="node.level===1"></i>
<i class="el-icon-folder" v-else></i>
<span class="node-label">{{ node.label }}</span>
</span>
</template>
</el-tree>
</div>
</el-card>
</el-col>
@@ -1,5 +1,5 @@
const UNIT_MANAGE_TEMPLATE = {
template: `
template: /*language=HTML*/ `
<div>
<el-card shadow="never" style="border: 1px solid var(--border-color-lighter);">
<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-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-cascader :props="props" :options="options" v-model="parentUnit" placeholder="请选择上次单位,不选择则为顶级" style="width: 100%"></el-cascader>
</el-form-item>
<el-form-item v-else label="上级单位">
<el-form-item label="上级单位">
<el-input maxlength="100" disabled :value="currentData?.name" type="text"></el-input>
</el-form-item>
<el-form-item prop="name" label="单位名称">
@@ -47,10 +44,20 @@ const UNIT_MANAGE_TEMPLATE = {
</el-form-item>
<el-form-item prop="unitLevel" label="单位等级">
<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 === 3" label="三级单位" :value="3"></el-option>
<el-option v-if="unitLevel === 4" label="四级单位" :value="4"></el-option>
</el-select>
</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-input maxlength="100" placeholder="请输入单位地址" v-model="formData.address" auto-complete="off" tabindex="5" type="text"></el-input>-->
<!-- </el-form-item>-->
@@ -88,6 +95,7 @@ const UNIT_MANAGE_TEMPLATE = {
required: true
}
},
store,
data() {
return {
pageForm: {
@@ -107,7 +115,7 @@ const UNIT_MANAGE_TEMPLATE = {
formRules: {
name: [{ required: true, message: "必填", trigger: "blur" }],
unitcode: [{ required: true, message: "必填", trigger: "blur" }],
unitLevel: [{ required: true, message: "必填", trigger: "blur" }],
unitLevel: [{ required: false, message: "必填", trigger: "blur" }],
email: [
{ required: false, message: "单位邮箱", trigger: "blur" },
{ type: "email", message: "请输入正确的邮箱地址", trigger: ["blur", "change"] }
@@ -115,24 +123,8 @@ const UNIT_MANAGE_TEMPLATE = {
},
options: [],
parentUnit: [],
props: {
lazy: true,
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"
)
}
}
unions: [],
}
},
computed: {},
@@ -148,26 +140,29 @@ const UNIT_MANAGE_TEMPLATE = {
this.options = []
},
doHandle() {
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.formData.id) {
self.formData.parentId = self.parentUnit[self.parentUnit.length - 1] || ""
this.$confirm("确定要提交吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
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) {
@@ -216,7 +211,13 @@ const UNIT_MANAGE_TEMPLATE = {
})
}
},
created() {
async created() {
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: '提交成功!'
})
this.doSearch()
this.getApplyMoney()
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-descriptions :column="2" border>
<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-form-item
prop="activityMatter" label="经费项目">
@@ -88,6 +88,9 @@ layout("/layouts/platform.html"){
<enum-tag :value="row.instanceState" name="ProcessInstanceStateEnum" label_key="message"
size="small"></enum-tag>
</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 align="center" fixed="right" header-align="center" label="操作"
width="300px">
@@ -35,7 +35,7 @@ layout("/layouts/platform.html"){
</el-option>
</el-select>
</search-item>
<search-item label="协会"
<search-item label="所属协会"
v-if="!pageForm.outlayManageSource||pageForm.outlayManageSource==='ACTIVITY_BUDGET_TYPE_THREE'">
<el-select clearable
placeholder="请选择协会"
@@ -23,7 +23,7 @@ const ACTIVITY_BUDGET_INFO = {
<el-descriptions-item label="申报预算金额(元)">{{viewData.declareTotalBudgetMoney}}
</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>
<el-descriptions-item v-if="!viewData.isSchoolBudget"></el-descriptions-item>
@@ -34,6 +34,16 @@ layout("/layouts/platform.html"){
</el-option>
</el-select>
</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="预算条目">
<dict-select v-model="pageForm.budgetReimburseType"
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.budgetTypeOption.unshift({name: "全部类型", code: ""})
this.unionList = await this.$businessTool.listUnion()
this.clubOption = await this.$businessTool.listClub()
this.pageData()
}
})
@@ -34,6 +34,16 @@ layout("/layouts/platform.html"){
</el-option>
</el-select>
</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="预算条目">
<dict-select v-model="pageForm.budgetReimburseType"
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.budgetTypeOption.unshift({name: "全部类型", code: ""})
this.unionList = await this.$businessTool.listUnion()
this.clubOption = await this.$businessTool.listClub()
this.pageData()
}
})
@@ -75,7 +75,7 @@ layout("/layouts/platform.html"){
</el-form>
<el-row type="flex" justify="end">
<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(1)" size="small" type="primary">同意</el-button>
</el-row>
@@ -28,9 +28,9 @@ const PROPOSAL_INFO = {
<dict-tag :options="dict.type.PROPOSAL_CASE_FILING_RESULT"
:value="viewData.caseFilingResult"></dict-tag>
</el-descriptions-item>
<el-descriptions-item label="调研情况" :span="3">
<!--<el-descriptions-item label="调研情况" :span="3">
<div class="text-left">{{viewData.researchFindings}}</div>
</el-descriptions-item>
</el-descriptions-item>-->
<el-descriptions-item label="提案案由" :span="3">
<div class="text-left" v-html="viewData.brief"></div>
</el-descriptions-item>
@@ -337,7 +337,9 @@ layout("/layouts/platform.html"){
})
},
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) {
this.sessionOptions = res.data
if (this.sessionOptions) {
@@ -140,7 +140,7 @@ layout("/layouts/platform.html"){
<!--#include("../../common/info.js"){}#-->
new Vue({
el: "#app",
dicts: ["PROPOSAL_TYPE", "PROPOSAL_CASE_FILING_RESULT"],
dicts: ["PROPOSAL_TYPE", "PROPOSAL_CASE_FILING_RESULT", "PROPOSAL_CASE_FILING_TYPE"],
store,
mixins: [initTableMixins],
components: {
@@ -128,29 +128,36 @@ layout("/layouts/platform.html"){
</el-row>
<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-form-item label="提案名称" prop="name"
:rules="[{required:true,message:'请输入提案名称',trigger:'blur'}]">
<el-input maxlength="100" placeholder="提案名称" v-model="formData.name"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="提案方式" prop="source">
<el-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 :gutter="20" type="flex">
<el-col :span="12">
<el-form-item label="提案类别" prop="typeId">
<el-select v-model="formData.typeId" style="width: 100%">
<el-option :key="item.code" :label="item.name" :value="item.id"
v-for="item in typeOptions"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-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-col :span="12">
<el-form-item label="提案类别" prop="typeId">
<el-select v-model="formData.typeId" style="width: 100%">
<el-option :key="item.code" :label="item.name" :value="item.id"
v-for="item in typeOptions"></el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
<!-- <el-form-item label="提案摘要" prop="excerpt">-->
@@ -177,15 +184,15 @@ layout("/layouts/platform.html"){
<text-editor v-model="formData.measures" key="measures"
placeholder="建议措施"></text-editor>
</el-form-item>
<!-- <el-form-item label="附件上传" prop="files">-->
<!-- <file-upload-->
<!-- :value.sync="formData.files"-->
<!-- :upload_number="5"-->
<!-- upload_result_category="array"-->
<!-- upload_mode="drag"-->
<!-- complete_result-->
<!-- ></file-upload>-->
<!-- </el-form-item>-->
<el-form-item label="附件上传" prop="files">
<file-upload
:value.sync="formData.files"
:upload_number="5"
upload_result_category="array"
upload_mode="drag"
complete_result
></file-upload>
</el-form-item>
</el-form>
<el-row type="flex" justify="end">
<el-button @click="$refs.guava.index()">取 消</el-button>
@@ -231,6 +231,14 @@ layout("/layouts/platform.html"){
cancelButtonText: "取消",
type: "warning"
}).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('提交中')
this.$axios.post("/flow/common/executeTask", {
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_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_helpunitreply: tf_helpunitreply
})
}).then((res) => {
if (res.code === 0) {
@@ -92,17 +92,6 @@ layout("/layouts/platform.html"){
:rules="[{required:true,message:'必填',trigger:['change','blur']}]">
<user-opinion-textarea v-model="formData.tf_opinion"></user-opinion-textarea>
</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-row type="flex" justify="end">
<el-button @click="$refs.guava.index()" size="small">取消</el-button>
@@ -231,7 +220,6 @@ layout("/layouts/platform.html"){
if (this.sessionOptions) {
this.$set(this.pageForm, "sessionId", this.sessionOptions[0].id)
this.pageData()
this.listDelegation()
}
}
})
@@ -42,6 +42,9 @@ layout("/layouts/platform.html"){
<template v-else-if="column.prop === 'merge'" scope="{row}">
<el-tag v-if="row.merge" size="small"></el-tag>
</template>
<template v-else-if="column.prop === 'taskName'" scope="{row}">
<span>{{ (row.startTaskId) ? row.taskName : '待提交' }}</span>
</template>
<template v-else-if="column.prop === 'instanceState'" scope="{row}">
<enum-tag :value="row.instanceState" name="ProcessInstanceStateEnum" label_key="message"
size="small"></enum-tag>
@@ -137,6 +137,7 @@ layout("/layouts/platform.html"){
{label: "提案类别", prop: "typeName"},
{label: "是否并案", prop: "merge"},
{label: "当前节点", prop: "curTaskName"},
{label: "审核人", prop: "auditUser"},
{label: "流程状态", prop: "instanceState"}
],
pageForm: {
@@ -260,6 +260,7 @@ layout("/layouts/platform.html"){
{label: "承办单位", prop: "underTakeName"},
{label: "承办类型", prop: "underTakeIsMaster"},
{label: "当前节点", prop: "curTaskName"},
{label: "审核人", prop: "auditUser"},
{label: "流程状态", prop: "instanceState"}
],
pageForm: {
@@ -1,6 +1,13 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
.write-dialog .el-dialog__body {
padding: 0;
}
</style>
<div id="app" v-cloak>
<guava ref="guava">
<el-card shadow="never">
@@ -219,8 +226,13 @@ layout("/layouts/platform.html"){
<div style="max-height: 75vh;overflow-y: auto">
<formal-write ref="formalWriteRef" :is_read="isRead" :user_id="userId"
:session_id="pageForm.sessionId"
:dialog="true"
@refresh="writeDialog=false;doSearch()"></formal-write>
</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>
</div>
@@ -339,7 +351,16 @@ layout("/layouts/platform.html"){
}
})
</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 = {
template: /*language=HTML*/ `
<div class="container-x1">
<div class="container-x1" style="padding: 0">
<div class="form-container">
<header class="header-x">
@@ -32,7 +32,7 @@ const write = {
<div class="info-content">
<i class="fa fa-info-circle info-icon"></i>
<div class="info-text">
<h3 class="info-title">推选信息</h3>
<h2 class="info-title" style="font-size: 18px;">推选信息</h2>
<p class="info-desc">您已被预选为{{ sessionName }}代表</p>
<div class="info-details">
<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"
>
<div class="form-section">
<h3 class="section-title">基本信息</h3>
<div class="form-grid">
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="姓名" prop="userName">
<el-input v-model="formData.userName" readonly></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="工号" prop="loginName">
<el-input v-model="formData.loginName" readonly></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="性别" prop="sex">
<el-radio-group v-model="formData.sex" size="small">
<el-radio border label=""></el-radio>
<el-radio border label="女"></el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="出生年月" prop="birthday">
<el-date-picker
v-model="formData.birthday"
type="date"
placeholder="选择日期"
value-format="yyyy-MM-dd"
style="width: 100%"
></el-date-picker>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="民族" prop="nation">
<dict-select v-model="formData.nation" style="width: 100%"
placeholder="请选择民族"
code="USER_NATION"></dict-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="政治面貌" prop="political">
<el-input maxlength="100" placeholder="政治面貌"
v-model="formData.political"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="所属工会">
<el-input
v-model="formData.unionName"
readonly
placeholder="请输入所属工会"
clearable
></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="所属单位">
<el-input
v-model="formData.unitName"
readonly
placeholder="请输入所属单位"
clearable
></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="职称" prop="professionalTitle">
<dict-select v-model="formData.professionalTitle" style="width: 100%"
placeholder="请选择职称"
code="technical_title_level"></dict-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="是否聘用制" prop="employ">
<el-radio-group v-model="formData.employ" size="small">
<el-radio border :label="true"></el-radio>
<el-radio border :label="false"></el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="是否高级职称" prop="seniorTeacher">
<el-radio-group v-model="formData.seniorTeacher" size="small">
<el-radio border :label="true"></el-radio>
<el-radio border :label="false"></el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="是否中级职称及以下" prop="intermediateBelow">
<el-radio-group v-model="formData.intermediateBelow" size="small">
<el-radio border :label="true"></el-radio>
<el-radio border :label="false"></el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="是否干部" prop="cadre">
<el-radio-group v-model="formData.cadre" size="small">
<el-radio border :label="true"></el-radio>
<el-radio border :label="false"></el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="是否工人" prop="worker">
<el-radio-group v-model="formData.worker" size="small">
<el-radio border :label="true"></el-radio>
<el-radio border :label="false"></el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="校级领导" prop="schoolLeader">
<el-radio-group v-model="formData.schoolLeader" size="small">
<el-radio border :label="true"></el-radio>
<el-radio border :label="false"></el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="中层领导" prop="middleLevelLeader">
<el-radio-group v-model="formData.middleLevelLeader" size="small">
<el-radio border :label="true"></el-radio>
<el-radio border :label="false"></el-radio>
</el-radio-group>
</el-form-item>
</el-col>
</el-row>
<h2 class="section-title">基本信息</h3>
<div class="form-grid custom-grid">
<div class="grid-item">
<el-form-item label="姓名" prop="userName">
<el-input v-model="formData.userName" readonly></el-input>
</el-form-item>
</div>
<div class="grid-item">
<el-form-item label="工号" prop="loginName">
<el-input v-model="formData.loginName" readonly></el-input>
</el-form-item>
</div>
<div class="grid-item">
<el-form-item label="性别" prop="sex">
<el-radio-group v-model="formData.sex" size="small">
<el-radio border label="男"></el-radio>
<el-radio border label=""></el-radio>
</el-radio-group>
</el-form-item>
</div>
<div class="grid-item">
<el-form-item label="出生年月" prop="birthday">
<el-date-picker
v-model="formData.birthday"
type="date"
placeholder="选择日期"
value-format="yyyy-MM-dd"
style="width: 100%"
></el-date-picker>
</el-form-item>
</div>
<div class="grid-item">
<el-form-item label="民族" prop="nation">
<dict-select v-model="formData.nation" style="width: 100%"
placeholder="请选择民族"
code="USER_NATION"></dict-select>
</el-form-item>
</div>
<div class="grid-item">
<el-form-item label="政治面貌" prop="political">
<el-input maxlength="100" placeholder="政治面貌"
v-model="formData.political"></el-input>
</el-form-item>
</div>
<div class="grid-item">
<el-form-item label="所属工会">
<el-input
v-model="formData.unionName"
readonly
placeholder="请输入所属工会"
clearable
></el-input>
</el-form-item>
</div>
<div class="grid-item">
<el-form-item label="所属单位">
<el-input
v-model="formData.unitName"
readonly
placeholder="请输入所属单位"
clearable
></el-input>
</el-form-item>
</div>
<div class="grid-item">
<el-form-item label="职称" prop="professionalTitle">
<dict-select v-model="formData.professionalTitle" style="width: 100%"
placeholder="请选择职称"
code="technical_title_level"></dict-select>
</el-form-item>
</div>
<div class="grid-item">
<el-form-item label="是否聘用制" prop="employ">
<el-radio-group v-model="formData.employ" size="small">
<el-radio border :label="true"></el-radio>
<el-radio border :label="false"></el-radio>
</el-radio-group>
</el-form-item>
</div>
<div class="grid-item">
<el-form-item label="是否高级职称" prop="seniorTeacher">
<el-radio-group v-model="formData.seniorTeacher" size="small">
<el-radio border :label="true"></el-radio>
<el-radio border :label="false"></el-radio>
</el-radio-group>
</el-form-item>
</div>
<div class="grid-item">
<el-form-item label="是否中级职称及以下" prop="intermediateBelow">
<el-radio-group v-model="formData.intermediateBelow" size="small">
<el-radio border :label="true"></el-radio>
<el-radio border :label="false"></el-radio>
</el-radio-group>
</el-form-item>
</div>
<div class="grid-item">
<el-form-item label="是否干部" prop="cadre">
<el-radio-group v-model="formData.cadre" size="small">
<el-radio border :label="true"></el-radio>
<el-radio border :label="false"></el-radio>
</el-radio-group>
</el-form-item>
</div>
<div class="grid-item">
<el-form-item label="是否工人" prop="worker">
<el-radio-group v-model="formData.worker" size="small">
<el-radio border :label="true"></el-radio>
<el-radio border :label="false"></el-radio>
</el-radio-group>
</el-form-item>
</div>
<div class="grid-item">
<el-form-item label="校级领导" prop="schoolLeader">
<el-radio-group v-model="formData.schoolLeader" size="small">
<el-radio border :label="true"></el-radio>
<el-radio border :label="false"></el-radio>
</el-radio-group>
</el-form-item>
</div>
<div class="grid-item">
<el-form-item label="中层领导" prop="middleLevelLeader">
<el-radio-group v-model="formData.middleLevelLeader" size="small">
<el-radio border :label="true"></el-radio>
<el-radio border :label="false"></el-radio>
</el-radio-group>
</el-form-item>
</div>
</div>
<div class="form-grid">
@@ -206,7 +198,7 @@ const write = {
</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">
<el-button @click="onSave">保存草稿</el-button>
<el-button type="primary" @click="onSubmit">提交信息</el-button>
@@ -270,7 +262,12 @@ const write = {
type: Boolean,
required: false,
default: false
}
},
dialog: {
type: Boolean,
required: false,
default: null
},
},
data() {
return {
@@ -453,7 +450,12 @@ const write = {
justify-content: space-between;
align-items: center;
background-color: white;
margin-bottom: 20px;
margin-bottom: 1px;
}
::v-deep .el-tabs__item {
font-size: 18px;/* 填写信息 */
font-weight: 500;
}
.header-x .header-left {
@@ -544,6 +546,7 @@ const write = {
background-color: white;
border-radius: 8px;
padding: 32px;
padding-top: 20px;
margin-bottom: 20px;
}
@@ -552,6 +555,7 @@ const write = {
background-color: #ebf5ff;
padding: 16px;
margin-bottom: 32px;
margin-top: 10px;
}
.info-box ::v-deep .info-content {
@@ -572,6 +576,7 @@ const write = {
.info-box .info-content .info-text ::v-deep .info-title {
font-weight: 600;
margin-bottom: 8px;
font-size: 18px; /* 推选信息没用 */
}
.info-box .info-content .info-text ::v-deep .info-desc {
@@ -594,7 +599,7 @@ const write = {
}
.form-section ::v-deep .section-title {
font-size: 18px;
font-size: 18px;/* 基本信息没用 */
font-weight: 500;
margin-bottom: 16px;
}
@@ -628,6 +633,19 @@ const write = {
::v-deep .hidden {
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">
<formal-write ref="formalWriteRef" :is_read="isRead" :user_id="userId"
:session_id="pageForm.sessionId"
:dialog="true"
@refresh="writeDialog=false;doSearch()"></formal-write>
</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>
@@ -27,9 +27,9 @@ const PROPOSAL_INFO = {
<dict-tag :options="dict.type.PROPOSAL_CASE_FILING_RESULT"
:value="viewData.caseFilingResult"></dict-tag>
</van-cell>
<van-cell title="调研情况" class="direction-column-cell">
<!--<van-cell title="调研情况" class="direction-column-cell">
<div v-html="viewData.researchFindings"></div>
</van-cell>
</van-cell>-->
<van-cell title="提案案由" class="direction-column-cell">
<div v-html="viewData.brief"></div>
</van-cell>
@@ -25,7 +25,7 @@ layout("/layouts/platform_h5.html"){
<table-column label="提案类别">{{row.typeName}}</table-column>
<table-column label="提案人">{{row.createUserName}}</table-column>
<table-column label="代表团">{{row.delegationName}}</table-column>
<table-column label="当前节点">{{row.taskName}}</table-column>
<table-column label="当前节点">{{ (row.startTaskId) ? row.taskName : '待提交' }}</table-column>
</template>
<template #actions="{index,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')"
@click="openTransfer(row)">
<i class="fa fa-arrow-right"></i>
<span></span>
<span></span>
</div>
</template>
</table-list>
@@ -270,7 +270,7 @@ layout("/layouts/platform_h5.html"){
</van-cell-group>
<van-cell-group title="提案内容" class="form-group">
<van-field
<!--<van-field
v-model="formData.researchFindings"
name="researchFindings"
label="调研情况"
@@ -280,7 +280,7 @@ layout("/layouts/platform_h5.html"){
placeholder="请输入调研情况"
:rules="[{ required: true, message: '请填写调研情况' }]"
required
></van-field>
></van-field>-->
<van-field
v-model="formData.brief"
@@ -308,7 +308,7 @@ layout("/layouts/platform_h5.html"){
<!-- 附件上传 -->
<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
slot="input"
:value.sync="formData.files"
@@ -177,13 +177,12 @@ const todo = {
// 处理任务
onView(task) {
const {taskId, taskKey, instanceId, businessNo, formKey} = task;
this.$toast("暂未开通从当前地址点击查看!");
return;
if (!formKey) {
const {taskId, taskKey, instanceId, businessNo, formKey, h5FormKey} = task;
if (!h5FormKey) {
this.$toast("当前流程没有配置地址");
return;
}
this.$pjaxReplace(h5FormKey + "?taskId=" + taskId + "bizId=" + businessNo + "taskKey=" + taskKey)
},
// 获取空状态文本