This commit is contained in:
2025-08-29 16:19:13 +08:00
parent aa6c9c7f8e
commit 67082d07bd
58 changed files with 2501 additions and 1091 deletions
@@ -1,12 +1,12 @@
package com.budwk.app.zhgh.dayofficework.evaluation.controller;
import cn.dev33.satoken.annotation.SaCheckLogin;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.lang.tree.Tree;
import cn.hutool.core.lang.tree.TreeNode;
import cn.hutool.core.lang.tree.TreeUtil;
import cn.hutool.core.util.StrUtil;
import com.budwk.app.base.annotation.SLog;
import com.budwk.app.base.param.PageForm;
import com.budwk.app.base.result.Result;
@@ -150,4 +150,12 @@ public class EvaluateActivityController {
return Result.success();
}
@At
@SaCheckLogin
@ApiOperation("根据年查询荣誉申请事项")
public Result listEvaluateActivityByYear(Integer year) {
List<EvaluateActivity> list = dao.query(EvaluateActivity.class, Cnd.NEW().andEX(EvaluateActivity::getYear,"=",year));
return Result.success(list);
}
}
@@ -1,16 +1,18 @@
package com.budwk.app.zhgh.dayofficework.evaluation.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.hutool.core.util.StrUtil;
import cn.hutool.core.lang.Dict;
import com.budwk.app.base.annotation.SLog;
import com.budwk.app.base.constant.BpmProcessConstant;
import com.budwk.app.base.constant.RoleConstant;
import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.param.PageForm;
import com.budwk.app.base.result.Result;
import com.budwk.app.bpm.service.BpmService;
import com.budwk.app.sys.models.Sys_user_role;
import com.budwk.app.web.controllers.open.commons.service.CommonService;
import com.budwk.app.flow.constant.FlowConst;
import com.budwk.app.flow.engine.FlowEngine;
import com.budwk.app.flow.entity.ProcessInstance;
import com.budwk.app.flow.entity.ProcessTask;
import com.budwk.app.flow.enums.ProcessSubmitTypeEnum;
import com.budwk.app.flow.service.FlowCommonService;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.zhgh.dayofficework.evaluation.models.EvaluateApply;
import com.budwk.app.zhgh.dayofficework.evaluation.service.EvaluateActivityService;
import com.budwk.app.zhgh.dayofficework.evaluation.service.EvaluateService;
@@ -45,9 +47,9 @@ public class EvaluateApplyController {
@Inject
private EvaluateService evaluateService;
@Inject
private BpmService bpmService;
private FlowEngine flowEngine;
@Inject
private CommonService commonService;
private FlowCommonService flowCommonService;
@At("")
@Ok("beetl:/platform/zhgh/dayofficework/evaluation/apply/index.html")
@@ -96,12 +98,25 @@ public class EvaluateApplyController {
@At
@SaCheckPermission("evaluation.apply")
@ApiOperation("保存")
@Aop(TransAop.READ_COMMITTED)
@SLog(tag = "评优评先申请", msg = "保存申请")
public Result save(@Param("evaluateApply") EvaluateApply evaluateApply) {
public Result save(@Param("data") EvaluateApply evaluateApply) {
evaluateApply.setApplyDateTime(new Date());
evaluateService.insertOrUpdate(evaluateApply);
bpmService.startSaveProcessInstance(BpmProcessConstant.PERSON_EVALUATE.name(), evaluateApply.getUserName() + "的申请", evaluateApply.getId(), null);
return Result.success();
}
@At
@SaCheckPermission("evaluation.apply")
@ApiOperation("重新提交申请")
@Aop(TransAop.READ_COMMITTED)
@SLog( tag = "评优评先申请", msg = "重新提交申请")
public Result submitAgain(@Param("data") EvaluateApply evaluateApply, @Param("taskId") Long taskId) {
evaluateService.insertOrUpdate(evaluateApply);
Dict dict = Dict.create();
dict.set(FlowConst.PROCESS_TASK_ID_KEY, taskId);
dict.set(FlowConst.SUBMIT_TYPE, ProcessSubmitTypeEnum.RE_APPLY.getCode());
flowCommonService.executeTask(dict);
return Result.success();
}
@@ -110,15 +125,21 @@ public class EvaluateApplyController {
@ApiOperation("提交")
@Aop(TransAop.READ_COMMITTED)
@SLog(tag = "评优评先申请", msg = "提交申请")
public Result submit(@Param("evaluateApply") EvaluateApply evaluateApply) {
public Result submit(@Param("data") EvaluateApply evaluateApply) {
evaluateApply.setApplyDateTime(new Date());
evaluateService.insertOrUpdate(evaluateApply);
//查询分工会审批人工号
String branchUnionApprovalLoginName = commonService.findUserLoginNameByRoleCode(RoleConstant.BRANCH_UNION_CHAIRMAN, Cnd.where(Sys_user_role::getUnionId, "=", evaluateApply.getUnionId()));
if (StrUtil.isBlank(branchUnionApprovalLoginName)) {
return Result.error("分工会未配置审批人,请联系校工会!");
// 开启流程实例
Dict args = Dict.create();
args.set(FlowConst.SUBMIT_TYPE, ProcessSubmitTypeEnum.APPLY.getCode());
args.set(FlowConst.FORM_DATA, evaluateApply);
ProcessInstance instance = flowEngine.startProcessInstanceByKey("PYPX", evaluateApply.getId(), SecurityUtil.getUserId(), args);
// 自动完成第一个申请任务
List<ProcessTask> doingTaskList = flowEngine.processTaskService().getDoingTaskList(instance.getId(), null);
for (ProcessTask task : doingTaskList) {
flowEngine.executeProcessTask(task.getId(), SecurityUtil.getUserId(), args);
}
bpmService.startSubmitProcessInstance(BpmProcessConstant.PERSON_EVALUATE.name(), evaluateApply.getUserName() + "的申请", evaluateApply.getId(), List.of(branchUnionApprovalLoginName), null);
return Result.success();
}
@@ -1,44 +1,29 @@
package com.budwk.app.zhgh.dayofficework.evaluation.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.StrUtil;
import com.budwk.app.base.annotation.SLog;
import com.budwk.app.base.constant.RoleConstant;
import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.result.Result;
import com.budwk.app.base.utils.PageUtil;
import com.budwk.app.bpm.enums.BpmProcessTaskStatusEnum;
import com.budwk.app.bpm.enums.BpmTaskApprovalTypeEnum;
import com.budwk.app.bpm.param.BpmTaskApprovalParam;
import com.budwk.app.bpm.service.BpmService;
import com.budwk.app.sys.models.Sys_user_role;
import com.budwk.app.web.commons.auth.utils.AuthUtil;
import com.budwk.app.flow.enums.ProcessTaskStateEnum;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.web.controllers.open.commons.service.CommonService;
import com.budwk.app.zhgh.dayofficework.evaluation.models.EvaluateApply;
import com.budwk.app.zhgh.dayofficework.evaluation.service.EvaluateService;
import com.budwk.app.zhgh.dayofficework.evaluation.vo.EvaluateApplyPageVO;
import com.budwk.app.zhgh.dayofficework.evaluation.vo.EvaluatePageForm;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.nutz.aop.interceptor.ioc.TransAop;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.dao.util.cri.Static;
import org.nutz.ioc.aop.Aop;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import org.nutz.mvc.annotation.Param;
import javax.validation.Valid;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
@IocBean
@At("/platform/evaluate/branchUnionApproval")
@@ -65,87 +50,63 @@ public class EvaluateBranchUnionApprovalController {
@SaCheckPermission("evaluation.branchUnionApproval")
@ApiOperation("数据列表")
@Ok("json")
public Result pageData(@Valid EvaluatePageForm pageForm, boolean approval){
public Result pageData(@Valid EvaluatePageForm pageForm, Boolean approval){
Sql sql = Sqls.create("""
SELECT
info.*,
ea.name AS evaluateName,
hb.name AS honorName,
bs.name as honorTypeName,
inst.id processInstanceId,
inst.processInstanceNodeId,
inst.processInstanceNodeName,
inst.processInstanceTaskIds,
inst.processInstanceStatus,
task.id processInstanceTaskId,
task.taskStatus processInstanceTaskStatus,
COUNT(nt.id) OVER (PARTITION BY task.id) > 0 AS nextTaskIsComplete
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,
IFNULL(GROUP_CONCAT(DISTINCT nt.displayName),'结束') curTaskName,
IF(rt.id IS NOT NULL, 1, 0) AS canRevoke
FROM
bpm_process_task task
INNER JOIN bpm_process_node_define nd ON nd.id = task.processTaskNodeId
INNER JOIN bpm_process_instance inst ON inst.id = task.processInstanceId
INNER JOIN evaluate_apply info ON info.id = inst.processInstanceBusinessId
wf_process_task t
LEFT JOIN wf_process_instance ins ON ins.id = t.processInstanceId
LEFT JOIN evaluate_apply info ON info.id = ins.businessNo
LEFT JOIN evaluate_activity ea ON ea.id = info.evaluateId
LEFT JOIN honor_basic_settings hb ON hb.id = info.honorId
LEFT JOIN honor_basic_settings bs ON bs.id = info.honorTypeId
LEFT JOIN bpm_process_task nt ON nt.prevTaskId = task.id AND nt.taskStatus = 'COMPLETE'
LEFT JOIN wf_process_task_actor ta ON ta.processTaskId = t.id
LEFT JOIN wf_process_task nt ON nt.processInstanceId = ins.id AND nt.taskState = 10
LEFT JOIN wf_process_task rt ON rt.processInstanceId = ins.id AND rt.taskParentId = t.id AND rt.taskState = 10
$condition
""");
Cnd cnd = Cnd.NEW();
if(!AuthUtil.hasRole(RoleConstant.SYSADMIN.name())){
cnd.and(new Static("JSON_CONTAINS( task.assignments, '\"%s\"' )".formatted(SecurityUtil.getUserLoginname())));
cnd.and("t.taskName", "=", "3bdaa29d-e5eb-4e3e-b7f1-14d03bedd078");
cnd.and("ta.actorId", "in", List.of(SecurityUtil.getUserId()));
if (approval) {
cnd.and("t.taskState", "in", List.of(ProcessTaskStateEnum.FINISHED.getCode(), ProcessTaskStateEnum.WITHDRAW.getCode(), ProcessTaskStateEnum.INTERRUPT.getCode()));
} else {
cnd.and("t.taskState", "=", ProcessTaskStateEnum.DOING.getCode());
}
cnd.and("nd.nodeCode","=",20);
if(approval){
cnd.and("task.taskStatus","=", BpmProcessTaskStatusEnum.COMPLETE);
}else{
cnd.and("task.taskStatus","=",BpmProcessTaskStatusEnum.ACTIVE);
if (StrUtil.isAllNotEmpty(pageForm.getSearchName(), pageForm.getSearchKeyword())) {
cnd.where().andLike(pageForm.getSearchName(), pageForm.getSearchKeyword());
}
cnd.andEX("eva.year", "=", pageForm.getYear());
cnd.and(Cnd.likeEX("info.userName", pageForm.getUserName()));
cnd.and(Cnd.likeEX("info.loginName", pageForm.getLoginName()));
cnd.andEX("info.unionId","=",pageForm.getUnionId());
cnd.andEX("info.unitId","=",pageForm.getUnitId());
cnd.andEX("YEAR(info.applyDateTime)", "=", pageForm.getYear());
cnd.groupBy("t.id");
if(StrUtil.isAllBlank(pageForm.getPageOrderName(),pageForm.getPageOrderBy())){
cnd.desc("info.applyDateTime");
cnd.desc("t.createdAt").desc("info.applyDateTime");
}else{
cnd.orderBy(pageForm.getPageOrderName(), PageUtil.getOrder(pageForm.getPageOrderBy()));
}
sql.setCondition(cnd);
Pagination<EvaluateApplyPageVO> pageVO = evaluateService.listPageVO(pageForm, sql, EvaluateApplyPageVO.class);
return Result.success(pageVO);
}
@At
@SaCheckPermission("evaluation.branchUnionApproval")
@ApiOperation("审核")
@SLog(tag = "评优评先分工会审核", msg = "分工会审核")
@Aop(TransAop.READ_COMMITTED)
public Result approval(@Valid @Param("approval") BpmTaskApprovalParam approvalParam){
approvalParam.getBpmTaskApprovalTypeEnum();
Map<String, Object> variables = BeanUtil.beanToMap(approvalParam);
EvaluateApply evaluateApply = evaluateService.fetch(approvalParam.getProcessInstanceBusinessId());
List<String> assignments = new ArrayList<>();
if(approvalParam.getBpmTaskApprovalTypeEnum().equals(BpmTaskApprovalTypeEnum.PASS)){
String schoolUnionApprovalLoginName = commonService.findUserLoginNameByRoleCode(RoleConstant.SCHOOL_UNION_ADMIN, Cnd.where(Sys_user_role::getUnionId, "=", evaluateApply.getUnionId()));
assignments.add(schoolUnionApprovalLoginName);
}
bpmService.completeTask(approvalParam.getProcessInstanceTaskId(), approvalParam.getBpmTaskApprovalTypeEnum(), variables, assignments);
return Result.success();
}
@At
@SaCheckPermission("evaluation.branchUnionApproval")
@ApiOperation("撤回")
@SLog(tag = "评优评先分工会审核", msg = "撤回")
@Aop(TransAop.READ_COMMITTED)
public Result revoke(@Valid String taskId){
bpmService.revokeTask(taskId);
return Result.success();
Pagination pagination = evaluateService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql);
return Result.success(pagination);
}
}
@@ -7,7 +7,6 @@ import com.budwk.app.base.result.Result;
import com.budwk.app.bpm.service.BpmService;
import com.budwk.app.zhgh.dayofficework.evaluation.models.EvaluateApply;
import com.budwk.app.zhgh.dayofficework.evaluation.service.EvaluateService;
import com.budwk.app.zhgh.dayofficework.evaluation.vo.EvaluateApplyVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.nutz.ioc.loader.annotation.Inject;
@@ -33,8 +32,6 @@ public class EvaluateCommonController {
@SaCheckPermission("evaluation")
public Result info(@Valid String id){
EvaluateApply evaluateApply = evaluateService.fetch(id);
EvaluateApplyVO vo = BeanUtil.copyProperties(evaluateApply, EvaluateApplyVO.class);
vo.setNodeTasks(bpmService.getNodeTasks(BpmProcessConstant.PERSON_EVALUATE, id));
return Result.success(vo);
return Result.success(evaluateApply);
}
}
@@ -2,23 +2,18 @@ package com.budwk.app.zhgh.dayofficework.evaluation.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import com.budwk.app.base.annotation.SLog;
import com.budwk.app.base.constant.RoleConstant;
import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.param.PageForm;
import com.budwk.app.base.result.Result;
import com.budwk.app.bpm.service.BpmService;
import com.budwk.app.web.commons.auth.utils.AuthUtil;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.zhgh.dayofficework.evaluation.service.EvaluateService;
import com.budwk.app.zhgh.dayofficework.evaluation.vo.EvaluateApplyPageVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.nutz.aop.interceptor.ioc.TransAop;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.ioc.aop.Aop;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.mvc.annotation.At;
@@ -48,66 +43,56 @@ public class EvaluateMineController {
@At
@SaCheckPermission("evaluation.mine")
public Result pageData(@Valid PageForm pageForm, Integer year) {
Sql sql = Sqls.create("""
SELECT
info.*,
ea.name AS evaluateName,
hb.name AS honorName,
bs.name as honorTypeName,
inst.processInstanceNodeId,
inst.processInstanceNodeCode,
inst.processInstanceNodeName,
inst.processInstanceTaskIds,
inst.processInstanceStatus,
nd.nodeType AS processInstanceTaskNodeType,
(
SELECT
count( 1 ) > 0
FROM
bpm_process_task
WHERE
prevTaskId = ( SELECT id FROM bpm_process_task WHERE processInstanceId = inst.id AND processTaskNodeCode IN ( 10, 40, 70 ) ORDER BY createdAt DESC LIMIT 1 )
AND taskStatus = 'COMPELTE'
) AS nextTaskIsComplete
info.*,
ea.name AS evaluateName,
hb.name AS honorName,
bs.name as honorTypeName,
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
evaluate_apply info
LEFT JOIN evaluate_activity ea ON ea.id = info.evaluateId
LEFT JOIN honor_basic_settings hb ON hb.id = info.honorId
LEFT JOIN honor_basic_settings bs ON bs.id = info.honorTypeId
LEFT JOIN bpm_process_instance inst ON inst.processInstanceBusinessId = info.id
LEFT JOIN bpm_process_node_define nd ON nd.id = inst.processInstanceNodeId
evaluate_apply info
LEFT JOIN evaluate_activity ea ON ea.id = info.evaluateId
LEFT JOIN honor_basic_settings hb ON hb.id = info.honorId
LEFT JOIN honor_basic_settings bs ON bs.id = info.honorTypeId
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();
if (!AuthUtil.hasRole(RoleConstant.SYSADMIN.name())) {
cnd.and("info.loginName", "=", SecurityUtil.getUserLoginname());
}
cnd.andEX("ea.year", "=", year);
cnd.groupBy("info.id");
cnd.andEX("YEAR(info.year)", "=", year);
cnd.and("info.loginName", "=", SecurityUtil.getUserLoginname());
sql.setCondition(cnd);
Pagination<EvaluateApplyPageVO> pageVO = evaluateService.listPageVO(pageForm, sql, EvaluateApplyPageVO.class);
return Result.success(pageVO);
Pagination pagination = evaluateService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql);
return Result.success(pagination);
}
@At
@SaCheckPermission("evaluation.mine")
@ApiOperation("删除")
@Aop(TransAop.READ_COMMITTED)
@SLog(tag = "评优评先申请", msg = "删除申请")
public Result delete(@Valid String id) {
evaluateService.delete(id);
bpmService.deleteInstance(id);
return Result.success();
}
@At
@SaCheckPermission("evaluation.mine")
@ApiOperation("撤回")
@Aop(TransAop.READ_COMMITTED)
@SLog(tag = "评优评先申请", msg = "撤回申请")
public Result revokeApply(@Valid String id) {
bpmService.revokeApply(id);
return Result.success();
}
}
@@ -8,17 +8,15 @@ import com.budwk.app.base.constant.RoleConstant;
import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.result.Result;
import com.budwk.app.base.utils.PageUtil;
import com.budwk.app.bpm.enums.BpmProcessTaskStatusEnum;
import com.budwk.app.bpm.enums.BpmTaskApprovalTypeEnum;
import com.budwk.app.bpm.param.BpmTaskApprovalParam;
import com.budwk.app.bpm.service.BpmService;
import com.budwk.app.flow.enums.ProcessTaskStateEnum;
import com.budwk.app.sys.models.Sys_user_role;
import com.budwk.app.web.commons.auth.utils.AuthUtil;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.web.controllers.open.commons.service.CommonService;
import com.budwk.app.zhgh.dayofficework.evaluation.models.EvaluateApply;
import com.budwk.app.zhgh.dayofficework.evaluation.service.EvaluateService;
import com.budwk.app.zhgh.dayofficework.evaluation.vo.EvaluateApplyPageVO;
import com.budwk.app.zhgh.dayofficework.evaluation.vo.EvaluatePageForm;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
@@ -27,7 +25,6 @@ import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.dao.util.cri.Static;
import org.nutz.ioc.aop.Aop;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
@@ -65,59 +62,65 @@ public class EvaluateSchoolUnionApprovalController {
@SaCheckPermission("evaluation.schoolUnionApproval")
@ApiOperation("数据列表")
@Ok("json")
public Result pageData(@Valid EvaluatePageForm pageForm, boolean approval){
public Result pageData(@Valid EvaluatePageForm pageForm, Boolean approval){
Sql sql = Sqls.create("""
SELECT
info.*,
ea.name AS evaluateName,
hb.name AS honorName,
bs.name as honorTypeName,
inst.id processInstanceId,
inst.processInstanceNodeId,
inst.processInstanceNodeName,
inst.processInstanceTaskIds,
inst.processInstanceStatus,
task.id processInstanceTaskId,
task.taskStatus processInstanceTaskStatus,
COUNT(nt.id) OVER (PARTITION BY task.id) > 0 AS nextTaskIsComplete
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,
IFNULL(GROUP_CONCAT(DISTINCT nt.displayName),'结束') curTaskName,
IF(rt.id IS NOT NULL, 1, 0) AS canRevoke
FROM
bpm_process_task task
INNER JOIN bpm_process_node_define nd ON nd.id = task.processTaskNodeId
INNER JOIN bpm_process_instance inst ON inst.id = task.processInstanceId
INNER JOIN evaluate_apply info ON info.id = inst.processInstanceBusinessId
wf_process_task t
LEFT JOIN wf_process_instance ins ON ins.id = t.processInstanceId
LEFT JOIN evaluate_apply info ON info.id = ins.businessNo
LEFT JOIN evaluate_activity ea ON ea.id = info.evaluateId
LEFT JOIN honor_basic_settings hb ON hb.id = info.honorId
LEFT JOIN honor_basic_settings bs ON bs.id = info.honorTypeId
LEFT JOIN bpm_process_task nt ON nt.prevTaskId = task.id AND nt.taskStatus = 'COMPLETE'
LEFT JOIN wf_process_task_actor ta ON ta.processTaskId = t.id
LEFT JOIN wf_process_task nt ON nt.processInstanceId = ins.id AND nt.taskState = 10
LEFT JOIN wf_process_task rt ON rt.processInstanceId = ins.id AND rt.taskParentId = t.id AND rt.taskState = 10
$condition
""");
Cnd cnd = Cnd.NEW();
if(!AuthUtil.hasRole(RoleConstant.SYSADMIN.name())){
cnd.and(new Static("JSON_CONTAINS( task.assignments, '\"%s\"' )".formatted(SecurityUtil.getUserLoginname())));
}
cnd.and("nd.nodeCode","=",50);
if(approval){
cnd.and("task.taskStatus","=", BpmProcessTaskStatusEnum.COMPLETE);
}else{
cnd.and("task.taskStatus","=",BpmProcessTaskStatusEnum.ACTIVE);
}
cnd.andEX("eva.year", "=", pageForm.getYear());
cnd.and(Cnd.likeEX("info.userName", pageForm.getUserName()));
cnd.and(Cnd.likeEX("info.loginName", pageForm.getLoginName()));
cnd.and("t.taskName", "=", "3c158aca-89ef-4188-bbc3-e8db201f02a1");
cnd.and("ta.actorId", "in", List.of(SecurityUtil.getUserId()));
cnd.andEX("info.unionId","=",pageForm.getUnionId());
cnd.andEX("info.unitId","=",pageForm.getUnitId());
if (approval) {
cnd.and("t.taskState", "in", List.of(ProcessTaskStateEnum.FINISHED.getCode(), ProcessTaskStateEnum.WITHDRAW.getCode(), ProcessTaskStateEnum.INTERRUPT.getCode()));
} else {
cnd.and("t.taskState", "=", ProcessTaskStateEnum.DOING.getCode());
}
if (StrUtil.isAllNotEmpty(pageForm.getSearchName(), pageForm.getSearchKeyword())) {
cnd.where().andLike(pageForm.getSearchName(), pageForm.getSearchKeyword());
}
cnd.andEX("YEAR(info.applyDateTime)", "=", pageForm.getYear());
cnd.groupBy("t.id");
if(StrUtil.isAllBlank(pageForm.getPageOrderName(),pageForm.getPageOrderBy())){
cnd.desc("info.applyDateTime");
cnd.desc("t.createdAt").desc("info.applyDateTime");
}else{
cnd.orderBy(pageForm.getPageOrderName(), PageUtil.getOrder(pageForm.getPageOrderBy()));
}
sql.setCondition(cnd);
Pagination<EvaluateApplyPageVO> pageVO = evaluateService.listPageVO(pageForm, sql, EvaluateApplyPageVO.class);
return Result.success(pageVO);
Pagination pagination = evaluateService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql);
return Result.success(pagination);
}
@At
@@ -5,23 +5,19 @@ import cn.afterturn.easypoi.excel.entity.ExportParams;
import cn.afterturn.easypoi.excel.entity.enmus.ExcelType;
import cn.afterturn.easypoi.excel.entity.params.ExcelExportEntity;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.hutool.core.util.StrUtil;
import com.budwk.app.base.annotation.SLog;
import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.result.Result;
import com.budwk.app.base.service.BaseService;
import com.budwk.app.base.utils.CommonDownloadUtil;
import com.budwk.app.base.utils.PageUtil;
import com.budwk.app.bpm.service.BpmService;
import com.budwk.app.flow.engine.FlowEngine;
import com.budwk.app.zhgh.dayofficework.evaluation.models.EvaluateActivity;
import com.budwk.app.zhgh.dayofficework.evaluation.service.EvaluateService;
import com.budwk.app.zhgh.dayofficework.evaluation.vo.EvaluateApplyPageVO;
import com.budwk.app.zhgh.dayofficework.evaluation.vo.EvaluatePageForm;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.apache.poi.ss.usermodel.Workbook;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
@@ -47,7 +43,7 @@ public class EvaluateSummaryController {
@Inject
private EvaluateService evaluateService;
@Inject
private BpmService bpmService;
private FlowEngine flowEngine;
@At("")
@Ok("beetl:/platform/zhgh/dayofficework/evaluation/summary/index.html")
@@ -60,69 +56,18 @@ public class EvaluateSummaryController {
@SaCheckPermission("evaluation.summary")
@ApiOperation("获取评优评先活动列表")
public Result pageData(@Valid EvaluatePageForm pageForm) {
Sql sql = Sqls.create("""
SELECT
info.*,
eva.name as evaluateName,
hb.name AS honorName,
bs.name as honorTypeName,
ins.processInstanceNodeName
FROM
evaluate_apply info
LEFT JOIN evaluate_activity eva ON eva.id = info.evaluateId
LEFT JOIN honor_basic_settings hb ON hb.id = info.honorId
LEFT JOIN honor_basic_settings bs ON bs.id = info.honorTypeId
LEFT JOIN bpm_process_instance ins ON ins.processInstanceBusinessId = info.id
$condition
""");
Cnd cnd = Cnd.NEW();
cnd.andEX("eva.year", "=", pageForm.getYear());
cnd.and(Cnd.likeEX("eva.id", pageForm.getEvaluateId()));
cnd.and(Cnd.likeEX("ea.userName", pageForm.getUserName()));
cnd.and(Cnd.likeEX("info.loginName", pageForm.getLoginName()));
cnd.andEX("info.unitId", "=", pageForm.getUnitId());
cnd.andEX("info.unionId", "=", pageForm.getUnionId());
if(StrUtil.isAllBlank(pageForm.getPageOrderName(),pageForm.getPageOrderBy())){
cnd.desc("info.applyDateTime");
}else{
cnd.orderBy(pageForm.getPageOrderName(), PageUtil.getOrder(pageForm.getPageOrderBy()));
}
sql.setCondition(cnd);
Pagination<EvaluateApplyPageVO> pageVO = evaluateService.listPageVO(pageForm, sql, EvaluateApplyPageVO.class);
return Result.success(pageVO);
Sql sql = evaluateService.getSummarySql(pageForm);
Pagination pagination = evaluateService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql);
return Result.success(pagination);
}
@At
@Ok("void")
@SaCheckPermission("evaluation.summary")
@ApiOperation("导出评优评先活动列表")
public void exportExcel(@Valid EvaluatePageForm pageForm,HttpServletResponse response) {
Sql sql = Sqls.create("""
SELECT
info.userName,
info.loginName,
info.sex,
info.unitName,
eva.`name` as evaluateName,
hb.name AS honorName,
bs.name as honorTypeName
FROM
evaluate_apply info
LEFT JOIN evaluate_activity eva ON eva.id = info.evaluateId
LEFT JOIN honor_basic_settings hb ON hb.id = info.honorId
LEFT JOIN honor_basic_settings bs ON bs.id = info.honorTypeId
$condition
""");
Cnd cnd = Cnd.NEW();
cnd.andEX("eva.year", "=", pageForm.getYear());
cnd.and(Cnd.likeEX("eva.id", pageForm.getEvaluateId()));
cnd.and(Cnd.likeEX("ea.userName", pageForm.getUserName()));
cnd.and(Cnd.likeEX("info.loginName", pageForm.getLoginName()));
cnd.andEX("info.unitId", "=", pageForm.getUnitId());
cnd.andEX("info.unionId", "=", pageForm.getUnionId());
sql.setCondition(cnd);
public void exportExcel(@Valid EvaluatePageForm pageForm, HttpServletResponse response) {
EvaluateActivity activity = evaluateService.dao().fetch(EvaluateActivity.class, pageForm.getEvaluateId());
Sql sql = evaluateService.getSummarySql(pageForm);
List<NutMap> list = baseService.listMap(sql);
for (int i = 0; i < list.size(); i++) {
list.get(i).put("序号", (i + 1));
@@ -143,7 +88,7 @@ public class EvaluateSummaryController {
ExportParams exportParams = new ExportParams();
exportParams.setType(ExcelType.XSSF);
Workbook workbook = ExcelExportUtil.exportExcel(exportParams, exportEntities, list);
CommonDownloadUtil.download("评优评先人员列表.xlsx", workbook, response);
CommonDownloadUtil.download(activity.getName() + "人员列表.xlsx", workbook, response);
} catch (Exception ignored) {
}
}
@@ -154,7 +99,7 @@ public class EvaluateSummaryController {
@SLog(tag = "评优评先活查询统计", msg = "删除")
public Result delete(@Valid String id) {
evaluateService.delete(id);
bpmService.deleteInstance(id);
flowEngine.processInstanceService().deleteProcessInstanceByBusinessKey(id);
return Result.success();
}
@@ -2,6 +2,12 @@ package com.budwk.app.zhgh.dayofficework.evaluation.service;
import com.budwk.app.base.service.BaseService;
import com.budwk.app.zhgh.dayofficework.evaluation.models.EvaluateApply;
import com.budwk.app.zhgh.dayofficework.evaluation.vo.EvaluatePageForm;
import org.nutz.dao.sql.Sql;
public interface EvaluateService extends BaseService<EvaluateApply> {
Sql getSummarySql(EvaluatePageForm pageForm);
}
@@ -1,9 +1,16 @@
package com.budwk.app.zhgh.dayofficework.evaluation.service.impl;
import cn.hutool.core.util.StrUtil;
import com.budwk.app.base.service.impl.BaseServiceImpl;
import com.budwk.app.base.utils.PageUtil;
import com.budwk.app.flow.enums.ProcessTaskStateEnum;
import com.budwk.app.zhgh.dayofficework.evaluation.models.EvaluateApply;
import com.budwk.app.zhgh.dayofficework.evaluation.service.EvaluateService;
import com.budwk.app.zhgh.dayofficework.evaluation.vo.EvaluatePageForm;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.ioc.loader.annotation.IocBean;
@IocBean(args = {"refer:dao"})
@@ -11,4 +18,58 @@ public class EvaluateServiceImpl extends BaseServiceImpl<EvaluateApply> implemen
public EvaluateServiceImpl(Dao dao) {
super(dao);
}
@Override
public Sql getSummarySql(EvaluatePageForm pageForm) {
Sql sql = Sqls.create("""
SELECT
info.*,
ea.name AS evaluateName,
hb.name AS honorName,
bs.name as honorTypeName,
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
evaluate_apply info
LEFT JOIN evaluate_activity ea ON ea.id = info.evaluateId
LEFT JOIN honor_basic_settings hb ON hb.id = info.honorId
LEFT JOIN honor_basic_settings bs ON bs.id = info.honorTypeId
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();
cnd.andEX("YEAR(info.year)", "=", pageForm.getYear());
cnd.andEX("info.evaluateId", "=", pageForm.getEvaluateId());
cnd.and("ins.state", "=", ProcessTaskStateEnum.FINISHED.getCode());
cnd.andEX("info.unitId", "=", pageForm.getUnitId());
cnd.andEX("info.unionId", "=", pageForm.getUnionId());
if (StrUtil.isAllNotEmpty(pageForm.getSearchName(), pageForm.getSearchKeyword())) {
cnd.where().andLike(pageForm.getSearchName(), pageForm.getSearchKeyword());
}
if (StrUtil.isAllBlank(pageForm.getPageOrderName(), pageForm.getPageOrderBy())) {
cnd.desc("t.createdAt").desc("info.applyDateTime");
} else {
cnd.orderBy(pageForm.getPageOrderName(), PageUtil.getOrder(pageForm.getPageOrderBy()));
}
sql.setCondition(cnd);
return sql;
}
}
@@ -1,65 +0,0 @@
package com.budwk.app.zhgh.dayofficework.evaluation.vo;
import com.budwk.app.bpm.vo.BpmTaskApprovalVo;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.Date;
@EqualsAndHashCode(callSuper = true)
@Data
public class EvaluateApplyPageVO extends BpmTaskApprovalVo {
private String id;
private String evaluateId;
private String honorId;
private String honorTypeId;
private String loginName;
private String userName;
private Integer age;
private String sex;
private String nation;
private String political;
private String education;
private String technicalTitle;
private String governmentPosition;
private String historyHonor;
private String briefDeeds;
private String unitName;
private String unitId;
private String unionName;
private String unionId;
private String clubName;
private String clubId;
private Date applyDateTime;
private Boolean isClub;
private String evaluateName;
private String honorName;
private String honorTypeName;
}
@@ -1,18 +0,0 @@
package com.budwk.app.zhgh.dayofficework.evaluation.vo;
import com.budwk.app.bpm.vo.BpmTaskApprovalRecordVo;
import com.budwk.app.zhgh.dayofficework.evaluation.models.EvaluateApply;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.List;
@EqualsAndHashCode(callSuper = true)
@Data
public class EvaluateApplyVO extends EvaluateApply {
@ApiModelProperty("节点审批记录")
private List<BpmTaskApprovalRecordVo> nodeTasks;
}
@@ -28,6 +28,7 @@ import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import org.nutz.mvc.annotation.Param;
import javax.validation.Valid;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
@@ -226,9 +227,10 @@ public class ExecutiveCommitteeDelegationOnePushController {
@At
@SaCheckPermission("executiveCommittee.delegationOnePush")
@SLog( tag = "执委会推选-团长推选委员", msg = "删除推选的人")
public Result doDelete(String id) {
ExecutiveCommitteeConfig config = dao.fetch(ExecutiveCommitteeConfig.class, Cnd.NEW());
@SLog(tag = "执委会推选-团长推选委员", msg = "删除推选的人")
public Result doDelete(@Valid String id, @Valid String teacherMeetId) {
ExecutiveCommitteeConfig config = dao.fetch(ExecutiveCommitteeConfig.class,
Cnd.where("teacherMeetId", "=", teacherMeetId));
if (ObjectUtil.isEmpty(config)) {
return Result.error("请先配置基础信息");
}
@@ -16,7 +16,6 @@ import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.ioc.aop.Aop;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.Strings;
@@ -25,6 +24,7 @@ import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import org.nutz.mvc.annotation.Param;
import javax.validation.Valid;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
@@ -146,7 +146,7 @@ public class ExecutiveCommitteeDelegationTwoPushController {
@At
@SaCheckPermission("executiveCommittee.delegationTwoPush")
@ApiOperation("推选委员")
@SLog(type = "executiveCommitteePreparatoryGroupPush", tag = "执委会推选-团长二次推选", msg = "推选委员")
@SLog(tag = "执委会推选-团长二次推选", msg = "推选委员")
public Result addOnePush(@Param("userValue") String[] userValue,
String teacherMeetId) {
try {
@@ -177,7 +177,7 @@ public class ExecutiveCommitteeDelegationTwoPushController {
List<Teacher_congress_delegate> dbList = dao.query(Teacher_congress_delegate.class,
Cnd.where(Teacher_congress_delegate::getSessionId, "=", teacherMeetId)
.andEX(Teacher_congress_delegate::getUserId, "in", userValue));
.andEX(Teacher_congress_delegate::getUserId, "in", userValue));
List<ExecutiveCommitteeTwoPush> list = new ArrayList<>();
for (String id : userValue) {
Teacher_congress_delegate jdhDb = dbList.stream().filter(v -> v.getUserId().equals(id)).findFirst().orElse(null);
@@ -205,9 +205,10 @@ public class ExecutiveCommitteeDelegationTwoPushController {
@At
@ApiOperation("删除推选人员")
@SaCheckPermission("executiveCommittee.delegationTwoPush")
@SLog(type = "executiveCommitteePreparatoryGroupPush", tag = "执委会推选-团长二次推选", msg = "删除推选人员")
public Result doDelete( String id) {
ExecutiveCommitteeConfig config = dao.fetch(ExecutiveCommitteeConfig.class, Cnd.NEW());
@SLog(tag = "执委会推选-团长二次推选", msg = "删除推选人员")
public Result doDelete(@Valid String id, @Valid String teacherMeetId) {
ExecutiveCommitteeConfig config = dao.fetch(ExecutiveCommitteeConfig.class,
Cnd.where("teacherMeetId", "=", teacherMeetId));
if (ObjectUtil.isEmpty(config)) {
return Result.error("请先配置基础信息");
}
@@ -27,6 +27,7 @@ import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import org.nutz.mvc.annotation.Param;
import javax.validation.Valid;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
@@ -125,7 +126,7 @@ public class ExecutiveCommitteePushController {
@At
@SaCheckPermission("executiveCommittee.preparatoryGroupPush")
@SLog(type = "executiveCommitteePreparatoryGroupPush", tag = "执委会推选-筹备组推选", msg = "推选委员")
@SLog(tag = "执委会推选-筹备组推选", msg = "推选委员")
public Result addOnePush(@Param("userValue") String[] userValue,
String teacherMeetId) {
try {
@@ -150,11 +151,11 @@ public class ExecutiveCommitteePushController {
}
Sql sql = Sqls.create("""
SELECT
t1.*
FROM
teacher_congress_delegate t1
$condition
SELECT
t1.*
FROM
teacher_congress_delegate t1
$condition
""");
Cnd cnd = Cnd.NEW();
cnd.and("t1.sessionId", "=", teacherMeetId);
@@ -191,9 +192,10 @@ public class ExecutiveCommitteePushController {
@At
@SaCheckPermission("executiveCommittee.preparatoryGroupPush")
@SLog(type = "executiveCommitteePreparatoryGroupPush", tag = "执委会推选-筹备组推选", msg = "删除推选的人")
public Result doDelete(String id) {
ExecutiveCommitteeConfig config = dao.fetch(ExecutiveCommitteeConfig.class, Cnd.NEW());
@SLog(tag = "执委会推选-筹备组推选", msg = "删除推选的人")
public Result doDelete(@Valid String id, @Valid String teacherMeetId) {
ExecutiveCommitteeConfig config = dao.fetch(ExecutiveCommitteeConfig.class,
Cnd.where("teacherMeetId", "=", teacherMeetId));
if (ObjectUtil.isEmpty(config)) {
return Result.error("请先配置基础信息");
}
@@ -217,5 +219,4 @@ public class ExecutiveCommitteePushController {
}
}
@@ -13,17 +13,17 @@ import com.budwk.app.flow.engine.FlowEngine;
import com.budwk.app.flow.entity.ProcessInstance;
import com.budwk.app.flow.entity.ProcessTask;
import com.budwk.app.flow.enums.ProcessSubmitTypeEnum;
import com.budwk.app.sys.models.Sys_user;
import com.budwk.app.sys.views.View_user;
import com.budwk.app.flow.service.FlowCommonService;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.zhgh.enrollmentRegistration.model.EnrollmentRegistration;
import com.budwk.app.zhgh.outlay.activityBudget.models.ActivityBudget;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.nutz.aop.interceptor.ioc.TransAop;
import org.nutz.dao.Cnd;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.ioc.aop.Aop;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.util.NutMap;
@@ -51,6 +51,9 @@ public class EnrollmentRegistrationApplyController {
@Inject
private FlowEngine flowEngine;
@Inject
private FlowCommonService flowCommonService;
@At("/index")
@Ok("beetl:/platform/zhgh/enrollmentRegistration/apply/index.html")
@@ -81,35 +84,34 @@ public class EnrollmentRegistrationApplyController {
@At
@SaCheckPermission("enrollmentRegistration.apply")
@ApiOperation("保存申请")
@SLog(type = "enrollmentRegistrationApply", tag = "子女入学管理-子女入学登记", msg = "保存子女入学登记")
@SLog( tag = "子女入学管理-子女入学登记", msg = "保存子女入学登记")
public Result save(@Param("data") EnrollmentRegistration enrollmentRegistration) {
View_user user = baseService.dao().fetch(View_user.class, Cnd.where("id", "=", SecurityUtil.getUserId()));
enrollmentRegistration.setUserId(SecurityUtil.getUserId());
enrollmentRegistration.setLoginName(SecurityUtil.getUserLoginname());
enrollmentRegistration.setUserName(SecurityUtil.getUserUsername());
enrollmentRegistration.setUnitId(SecurityUtil.getUnitId());
enrollmentRegistration.setUnitName(user.getUnitName());
enrollmentRegistration.setUnionId(SecurityUtil.getUnionId());
enrollmentRegistration.setUnionName(user.getUnionName());
enrollmentRegistration.setApplyTime(DateUtil.now());
baseService.insertOrUpdate(enrollmentRegistration);
return Result.success();
}
@At
@SaCheckPermission("enrollmentRegistration.apply")
@ApiOperation("重新提交申请")
@Aop(TransAop.READ_COMMITTED)
@SLog( tag = "子女入学管理-子女入学登记", msg = "重新提交申请")
public Result submitAgain(@Param("data") EnrollmentRegistration enrollmentRegistration, @Param("taskId") Long taskId) {
baseService.insertOrUpdate(enrollmentRegistration);
Dict dict = Dict.create();
dict.set(FlowConst.PROCESS_TASK_ID_KEY, taskId);
dict.set(FlowConst.SUBMIT_TYPE, ProcessSubmitTypeEnum.RE_APPLY.getCode());
flowCommonService.executeTask(dict);
return Result.success();
}
@At
@SaCheckPermission("enrollmentRegistration.apply")
@ApiOperation("提交申请")
@SLog(type = "enrollmentRegistrationApply", tag = "子女入学管理-子女入学登记", msg = "提交子女入学登记")
@SLog( tag = "子女入学管理-子女入学登记", msg = "提交子女入学登记")
public Result submit(@Param("data") EnrollmentRegistration enrollmentRegistration) {
if (StrUtil.isBlank(enrollmentRegistration.getId())) {
View_user user = baseService.dao().fetch(View_user.class, Cnd.where("id", "=", SecurityUtil.getUserId()));
enrollmentRegistration.setUserId(SecurityUtil.getUserId());
enrollmentRegistration.setLoginName(SecurityUtil.getUserLoginname());
enrollmentRegistration.setUserName(SecurityUtil.getUserUsername());
enrollmentRegistration.setUnitId(SecurityUtil.getUnitId());
enrollmentRegistration.setUnitName(user.getUnitName());
enrollmentRegistration.setUnionId(SecurityUtil.getUnionId());
enrollmentRegistration.setUnionName(user.getUnionName());
enrollmentRegistration.setApplyTime(DateUtil.now());
}
baseService.insertOrUpdate(enrollmentRegistration);
@@ -1,17 +1,21 @@
package com.budwk.app.zhgh.enrollmentRegistration.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import com.budwk.app.base.annotation.SLog;
import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.param.PageForm;
import com.budwk.app.base.result.Result;
import com.budwk.app.base.service.BaseService;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.zhgh.enrollmentRegistration.model.EnrollmentRegistration;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.nutz.aop.interceptor.ioc.TransAop;
import org.nutz.dao.Cnd;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.ioc.aop.Aop;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.mvc.annotation.At;
@@ -33,7 +37,6 @@ public class EnrollmentRegistrationApplyListController {
private BaseService baseService;
@At("/index")
@Ok("beetl:/platform/zhgh/enrollmentRegistration/applyList/index.html")
@SaCheckPermission("enrollmentRegistration.applyList")
@@ -81,6 +84,14 @@ public class EnrollmentRegistrationApplyListController {
return Result.success(pagination);
}
@At
@ApiOperation("删除子女入学信息")
@Aop(TransAop.READ_COMMITTED)
@SaCheckPermission("enrollmentRegistration.applyList")
@SLog(tag = "子女入学-我的填报", msg = "删除id: ${args[0]}")
public Result doDelete(String id) {
baseService.dao().delete(EnrollmentRegistration.class, id);
return Result.success();
}
}
@@ -63,7 +63,7 @@ public class EnrollmentRegistrationPlanController {
@ApiOperation("提交登记计划")
@SaCheckPermission("enrollmentRegistration.plan")
@Aop(TransAop.READ_COMMITTED)
@SLog(type = "outlayReimburseApply", tag = "子女入学管理-登记计划", msg = "提交登记计划")
@SLog( tag = "子女入学管理-登记计划", msg = "提交登记计划")
public Result onSubmit(@Param("data") EnrollmentRegistrationPlan enrollmentRegistrationPlan) {
baseService.insertOrUpdate(enrollmentRegistrationPlan);
@@ -34,6 +34,11 @@ public class EnrollmentRegistration extends BaseModel implements Serializable {
@Comment("登记类型(字典)")
private String registrationType;
@Column
@ColDefine(type = ColType.VARCHAR,width = 32)
@Comment("登记类型计划Id")
private String registrationTypeId;
@Column
@ColDefine(type = ColType.VARCHAR,width = 30)
@Comment("监护人(教工)姓名")
@@ -84,6 +89,11 @@ public class EnrollmentRegistration extends BaseModel implements Serializable {
@Comment("子女姓名")
private String childrenName;
@Column
@ColDefine(type = ColType.VARCHAR,width = 30)
@Comment("出身年月")
private String childrenBirthday;
@Column
@ColDefine(type = ColType.VARCHAR,width = 30)
@Comment("性别")
@@ -3,11 +3,15 @@ package com.budwk.app.zhgh.outlay.activityBudget.conteoller;
import cn.dev33.satoken.annotation.SaCheckLogin;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.lang.Dict;
import com.alibaba.excel.EasyExcel;
import com.budwk.app.base.annotation.SLog;
import com.budwk.app.base.constant.RoleConstant;
import com.budwk.app.base.result.Result;
import com.budwk.app.base.utils.CommonDownloadUtil;
import com.budwk.app.flow.constant.FlowConst;
import com.budwk.app.flow.enums.ProcessSubmitTypeEnum;
import com.budwk.app.flow.service.FlowCommonService;
import com.budwk.app.sys.models.Sys_role;
import com.budwk.app.sys.models.Sys_user_role;
import com.budwk.app.sys.services.SysRoleService;
@@ -15,15 +19,12 @@ import com.budwk.app.web.commons.auth.utils.AuthUtil;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.zhgh.club.model.SysClub;
import com.budwk.app.zhgh.club.service.SysClubService;
import com.budwk.app.zhgh.democratic.suggestionBox.models.SuggestionBox;
import com.budwk.app.zhgh.integral.controller.IntegralManageController;
import com.budwk.app.zhgh.outlay.activityBudget.models.ActivityBudget;
import com.budwk.app.zhgh.outlay.activityBudget.service.ActivityBudgetService;
import com.budwk.app.zhgh.outlay.activityBudget.template.ActivityBudgetTemp;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.IOUtils;
import org.nutz.aop.interceptor.ioc.TransAop;
import org.nutz.dao.Cnd;
import org.nutz.dao.Sqls;
@@ -38,8 +39,6 @@ import org.nutz.mvc.annotation.Param;
import javax.servlet.http.HttpServletResponse;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;
@@ -64,6 +63,9 @@ public class ActivityBudgetApplyController {
@Inject
private SysRoleService sysRoleService;
@Inject
private FlowCommonService flowCommonService;
@At("")
@Ok("beetl:/platform/zhgh/outlay/activityBudget/apply/index.html")
@@ -77,17 +79,32 @@ public class ActivityBudgetApplyController {
@ApiOperation("提交年度预算申报")
@SaCheckPermission("activity.budget.apply")
@Aop(TransAop.READ_COMMITTED)
@SLog(type = "activityBudgetApply", tag = "年度预算申报-预算申报", msg = "提交年度预算申报")
@SLog( tag = "年度预算申报-预算申报", msg = "提交年度预算申报")
public Result submit(@Param("data") ActivityBudget activityBudget) {
activityBudget.setApplyDate(DateUtil.now());
return activityBudgetService.submit(activityBudget);
}
@At
@SaCheckPermission("activity.budget.apply")
@ApiOperation("重新提交申请")
@Aop(TransAop.READ_COMMITTED)
@SLog( tag = "年度预算申报-预算申报", msg = "重新提交申请")
public Result submitAgain(@Param("data") ActivityBudget activityBudget, @Param("taskId") Long taskId) {
activityBudgetService.insertOrUpdate(activityBudget);
Dict dict = Dict.create();
dict.set(FlowConst.PROCESS_TASK_ID_KEY, taskId);
dict.set(FlowConst.SUBMIT_TYPE, ProcessSubmitTypeEnum.RE_APPLY.getCode());
flowCommonService.executeTask(dict);
return Result.success();
}
@At
@SaCheckPermission("activity.budget.apply")
@ApiOperation("保存申请")
@SLog(type = "activityBudgetApply", tag = "年度预算申报-预算申报", msg = "保存年度预算申报")
@SLog( tag = "年度预算申报-预算申报", msg = "保存年度预算申报")
public Result save(@Param("data") ActivityBudget activityBudget) {
activityBudget.setUserId(SecurityUtil.getUserId());
activityBudget.setLoginName(SecurityUtil.getUserLoginname());
@@ -8,20 +8,15 @@ import com.budwk.app.base.annotation.SLog;
import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.param.PageForm;
import com.budwk.app.base.result.Result;
import com.budwk.app.flow.entity.ProcessInstance;
import com.budwk.app.flow.entity.ProcessTask;
import com.budwk.app.zhgh.outlay.activityBudget.models.ActivityBudget;
import com.budwk.app.zhgh.outlay.activityBudget.models.ActivityBudgetDetails;
import com.budwk.app.zhgh.outlay.activityBudget.service.ActivityBudgetService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.checkerframework.checker.units.qual.C;
import org.nutz.aop.interceptor.ioc.TransAop;
import org.nutz.dao.Cnd;
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;
@@ -58,11 +53,6 @@ public class ActivityBudgetApplyListController {
public void index() {
}
@At("/view")
@Ok("beetl:/platform/zhgh/outlay/activityBudget/view/index.html")
@SaCheckPermission("activity.budget.applyList")
public void view() {
}
@At
@ApiOperation("分页查询")
@@ -78,17 +68,11 @@ public class ActivityBudgetApplyListController {
@ApiOperation("批量删除申报数据")
@SaCheckPermission("activity.budget.applyList")
@Aop(TransAop.READ_COMMITTED)
@SLog(type = "activityBudgetApplyList", tag = "年度预算申报-我的申报", msg = "删除了${ids.length}条数据,${ids}")
@SLog( tag = "年度预算申报-我的申报", msg = "删除了${ids.length}条数据,${ids}")
public Result batchDelete(@Param("ids[]") @Valid String[] ids) {
if (ObjectUtil.isNotEmpty(ids)) {
activityBudgetService.clear(Cnd.where("id", "in", ids));
activityBudgetService.dao().clear(ActivityBudgetDetails.class, Cnd.where("budgetId", "in", ids));
List<ProcessInstance> instanceList = activityBudgetService.dao().query(ProcessInstance.class, Cnd.where(ProcessInstance::getBusinessNo, "in", ids));
if (ObjectUtil.isNotEmpty(instanceList)) {
List<Long> instanceIds = instanceList.stream().map(ProcessInstance::getId).toList();
activityBudgetService.dao().clear(ProcessTask.class, Cnd.where(ProcessTask::getProcessInstanceId, "in", instanceIds));
activityBudgetService.dao().clear(ProcessInstance.class, Cnd.where(ProcessInstance::getBusinessNo, "in", ids));
}
}
return Result.success();
}
@@ -97,22 +81,17 @@ public class ActivityBudgetApplyListController {
@ApiOperation("删除一条申报数据")
@SaCheckPermission("activity.budget.applyList")
@Aop(TransAop.READ_COMMITTED)
@SLog(type = "activityBudgetApplyList", tag = "年度预算申报-我的申报", msg = "删除了一条条数据,${id}")
@SLog( tag = "年度预算申报-我的申报", msg = "删除了一条条数据,${id}")
public Result doDelete(String id) {
activityBudgetService.dao().delete(ActivityBudget.class, id);
activityBudgetService.dao().clear(ActivityBudgetDetails.class, Cnd.where("budgetId", "=", id));
ProcessInstance instance = activityBudgetService.dao().fetch(ProcessInstance.class, Cnd.where(ProcessInstance::getBusinessNo, "=", id));
if (ObjectUtil.isNotEmpty(instance)) {
activityBudgetService.dao().clear(ProcessTask.class, Cnd.where(ProcessTask::getProcessInstanceId, "=", instance.getId()));
activityBudgetService.dao().delete(ProcessInstance.class, instance.getId());
}
return Result.success();
}
@At
@ApiOperation("提交申报数据")
@SaCheckPermission("activity.budget.applyList")
@SLog(type = "activityBudgetApplyList", tag = "年度预算申报-我的申报", msg = "提交了${ids.length}条数据,${ids}")
@SLog( tag = "年度预算申报-我的申报", msg = "提交了${ids.length}条数据,${ids}")
public Result batchSubmit(@Valid @Param("ids[]") String[] ids) {
List<ActivityBudget> budgetList = activityBudgetService.query(Cnd.where("id", "in", ids));
List<ActivityBudget> budgets = budgetList.stream().filter(a ->
@@ -0,0 +1,159 @@
package com.budwk.app.zhgh.outlay.outlayManage.club.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.hutool.core.date.DateUtil;
import com.budwk.app.base.annotation.SLog;
import com.budwk.app.base.constant.RoleConstant;
import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.param.PageForm;
import com.budwk.app.base.result.Result;
import com.budwk.app.base.service.BaseService;
import com.budwk.app.flow.enums.ProcessInstanceStateEnum;
import com.budwk.app.sys.models.Sys_role;
import com.budwk.app.sys.models.Sys_user_role;
import com.budwk.app.sys.services.SysRoleService;
import com.budwk.app.web.commons.auth.utils.AuthUtil;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.zhgh.club.model.SysClub;
import com.budwk.app.zhgh.outlay.outlayManage.club.model.OutlayManageClub;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.nutz.dao.Cnd;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.util.NutMap;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
/**
* @author zhf
* @date 2025/8/28 11:36
* @description
*/
@IocBean
@At("/platform/outlay/outlayManage/clubManage")
@Ok("json:full")
@Slf4j
@Api(tags = "分工会经费预算管理")
public class OutlayManageClubController {
@Inject
private BaseService baseService;
@Inject
private SysRoleService sysRoleService;
@At("")
@Ok("beetl:/platform/zhgh/outlay/outlayManage/club/manage/index.html")
@SaCheckPermission("outlay.outlayManage.club.manage")
public void index() {
}
@At
@ApiOperation("分页查询")
@SaCheckPermission("outlay.outlayManage.club.manage")
public Result pageData(PageForm pageForm, Integer year) {
Cnd cnd = Cnd.NEW();
Sql sql = Sqls.create("""
SELECT * FROM `outlay_manage_club` $condition
""");
cnd.andEX("year", "=", year);
if (!AuthUtil.hasRoleOr(RoleConstant.SYSADMIN.name(), RoleConstant.SCHOOL_UNION_ADMIN.name())) {
Sys_role sysRole = sysRoleService.getByCode(RoleConstant.CLUB_PRESIDENT);
List<Sys_user_role> userRoles = baseService.dao().query(Sys_user_role.class, Cnd.where("userId", "=", SecurityUtil.getUserId()).and("roleId", "=", sysRole.getId()));
List<String> myClubId = userRoles.stream().map(Sys_user_role::getClubId).toList();
cnd.andEX("clubId", "in", myClubId);
}
cnd.asc("clubCode");
sql.setCondition(cnd);
Pagination pagination = baseService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql);
return Result.success(pagination);
}
@At
@ApiOperation("修改预算")
@SaCheckPermission("outlay.outlayManage.club.manage")
@SLog(tag = "分工会预算分配", msg = "修改了预算分配的金额:${args[0]},id:${args[1]}")
public Result doSubmit(String totalQuota, String id) {
OutlayManageClub outlayManageClub = baseService.dao().fetch(OutlayManageClub.class, id);
outlayManageClub.setTotalQuota(new BigDecimal(totalQuota));
baseService.updateIgnoreNull(outlayManageClub);
return Result.success();
}
@At
@ApiOperation("查看是否分配")
@SaCheckPermission("outlay.outlayManage.club.manage")
public Result getIsAllocationOutlay(Integer year) {
int count = baseService.dao().count(OutlayManageClub.class, Cnd.where("year", "=", year));
return Result.success(count);
}
@At
@ApiOperation("重置预算")
@SaCheckPermission("outlay.outlayManage.club.manage")
@SLog(tag = "协会预算分配", msg = "重置了预算分配的金额:${args[0]}")
public Result resetOutlay(Integer year) {
int count = baseService.dao().clear(OutlayManageClub.class, Cnd.where("year", "=", year));
return Result.success(count);
}
@At
@ApiOperation("下发预算")
@SaCheckPermission("outlay.outlayManage.club.manage")
@SLog(tag = "协会预算分配", msg = "根据申报的金额修改本年的预算预算")
public Result issuedOutlay() {
Sql sql = Sqls.create("""
SELECT
ab.clubId,
ab.totalBudgetMoney
FROM
activity_budget ab
LEFT JOIN wf_process_instance wpi ON wpi.businessNo = ab.id
WHERE
YEAR(ab.applyDate) = @year
AND ab.outlayManageSource = 'ACTIVITY_BUDGET_TYPE_THREE'
AND ab.isSchoolBudget =0
AND wpi.state = 20
""").setParam("year", DateUtil.thisYear());
List<NutMap> budgetList = baseService.listMap(sql);
Sql sqlClub = Sqls.create("""
SELECT
c.*
FROM
`sys_club` c
LEFT JOIN wf_process_instance inst ON inst.businessNo = c.id
WHERE
inst.state = @state
""").setParam("state", ProcessInstanceStateEnum.FINISHED.getCode());
List<SysClub> clubList = baseService.listVO(sqlClub, SysClub.class);
List<OutlayManageClub> insertUnionList = new ArrayList<>();
clubList.forEach(v -> {
BigDecimal totalBudgetMoney = budgetList.stream()
.filter(budget -> budget.getString("clubId").equals(v.getId()))
.map(budget -> new BigDecimal(budget.getString("totalBudgetMoney"))) // 提取 money 属性
.reduce(BigDecimal.ZERO, BigDecimal::add);
OutlayManageClub outlayManageClub = new OutlayManageClub();
outlayManageClub.setYear(DateUtil.thisYear());
outlayManageClub.setClubName(v.getClubName());
outlayManageClub.setClubCode(v.getClubCode());
outlayManageClub.setClubId(v.getId());
outlayManageClub.setTotalQuota(totalBudgetMoney);
insertUnionList.add(outlayManageClub);
});
baseService.insert(insertUnionList);
return Result.success();
}
}
@@ -0,0 +1,127 @@
package com.budwk.app.zhgh.outlay.outlayManage.club.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import com.budwk.app.base.annotation.SLog;
import com.budwk.app.base.constant.RoleConstant;
import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.param.PageForm;
import com.budwk.app.base.result.Result;
import com.budwk.app.base.service.BaseService;
import com.budwk.app.base.utils.PageUtil;
import com.budwk.app.sys.models.Sys_role;
import com.budwk.app.sys.models.Sys_user_role;
import com.budwk.app.sys.services.SysRoleService;
import com.budwk.app.web.commons.auth.utils.AuthUtil;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.zhgh.outlay.outlayManage.model.OutlayUseDetail;
import com.budwk.app.zhgh.outlay.outlayManage.service.OutlayUseDetailService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.nutz.aop.interceptor.ioc.TransAop;
import org.nutz.dao.Cnd;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.ioc.aop.Aop;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.Strings;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import java.util.List;
/**
* @author zhf
* @date 2025/8/28 13:56
* @description
*/
@IocBean
@At("/platform/outlay/outlayManage/clubUseDetail")
@Ok("json:full")
@Slf4j
@Api(tags = "协会预算使用明细")
public class OutlayManageClubUseDetailController {
@Inject
private BaseService baseService;
@Inject
private SysRoleService sysRoleService;
@Inject
private OutlayUseDetailService outlayUseDetailService;
@At("")
@Ok("beetl:/platform/zhgh/outlay/outlayManage/club/useDetail/index.html")
@SaCheckPermission("outlay.outlayManage.club.useDetail")
public void index() {
}
@At
@ApiOperation("分页查询")
@SaCheckPermission("outlay.outlayManage.club.useDetail")
public Result pageData(PageForm pageForm,
Integer year,
String clubId) {
Sql sql = Sqls.create("""
select * from outlay_manage_club $condition
""");
Cnd cnd = Cnd.NEW();
cnd.and("totalQuota", "IS NOT", null);
cnd.and("year", "=", year);
if (AuthUtil.hasRoleOr(RoleConstant.SYSADMIN.name(), RoleConstant.SCHOOL_UNION_ADMIN.name())) {
cnd.andEX("clubId", "=", clubId);
} else {
Sys_role sysRole = sysRoleService.getByCode(RoleConstant.CLUB_PRESIDENT);
List<Sys_user_role> userRoles = baseService.dao().query(Sys_user_role.class, Cnd.where("userId", "=", SecurityUtil.getUserId()).and("roleId", "=", sysRole.getId()));
List<String> myClubId = userRoles.stream().map(Sys_user_role::getClubId).toList();
cnd.andEX("clubId", "in", myClubId);
}
if (Strings.isNotBlank(pageForm.getPageOrderBy()) && Strings.isNotBlank(pageForm.getPageOrderName())) {
cnd.orderBy(pageForm.getPageOrderName(), PageUtil.getOrder(pageForm.getPageOrderBy()));
} else {
cnd.asc("clubCode");
}
sql.setCondition(cnd);
Pagination pagination = baseService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql);
return Result.success(pagination);
}
@At
@ApiOperation("某个协会预算使用详情")
@SaCheckPermission("outlay.outlayManage.club.useDetail")
public Result detailInfo(PageForm pageForm, String outlayManageId) {
Sql sql = Sqls.create("""
select * from outlay_use_detail where outlayManageId=@outlayManageId
""").setParam("outlayManageId", outlayManageId);
Pagination pagination = baseService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql);
return Result.success(pagination);
}
@At
@ApiOperation("删除协会预算详情")
@Aop(TransAop.READ_COMMITTED)
@SaCheckPermission("outlay.outlayManage.club.useDetail")
@SLog(tag = "协会预算使用详情", msg = "删除了协会预算使用详情:${args[0]}")
public Result doDeleteDetail(String id) {
outlayUseDetailService.doDeleteDetail(id,"club");
return Result.success();
}
@At
@ApiOperation("编辑协会预算详情")
@Aop(TransAop.READ_COMMITTED)
@SaCheckPermission("outlay.outlayManage.club.useDetail")
@SLog(tag = "协会预算使用详情", msg = "编辑了协会预算使用详情:${args[0]}")
public Result doEditDetail(OutlayUseDetail outlayUseDetail) {
outlayUseDetailService.doEditDetail(outlayUseDetail,"club");
return Result.success();
}
}
@@ -0,0 +1,62 @@
package com.budwk.app.zhgh.outlay.outlayManage.club.model;
import com.budwk.app.base.model.BaseModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.nutz.dao.entity.annotation.*;
import java.io.Serializable;
import java.math.BigDecimal;
/**
* @author zhf
* @date 2025/8/28 11:34
* @description
*/
@Data
@EqualsAndHashCode(callSuper = true)
@Table("outlay_manage_club")
@TableMeta("{'mysql-charset':'utf8mb4'}")
@Comment("协会经费管理")
public class OutlayManageClub extends BaseModel implements Serializable {
@Column
@Name
@Comment("id")
@ColDefine(type = ColType.VARCHAR, width = 32)
@Prev(els = {@EL("uuid()")})
private String id;
@Column
@Comment("年份")
@ColDefine(type = ColType.INT)
private Integer year;
@Column
@Comment("总额度")
@Default("0")
@ColDefine(customType = "decimal(10,2)")
private BigDecimal totalQuota;
@Column
@Comment("已使用额度")
@Default("0")
@ColDefine(customType = "decimal(10,2)")
private BigDecimal usedQuota;
@Column
@Comment("协会ID")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String clubId;
@Column
@Comment("协会名称")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String clubName;
@Column
@Comment("协会code")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String clubCode;
}
@@ -12,15 +12,13 @@ import com.budwk.app.flow.engine.FlowEngine;
import com.budwk.app.flow.entity.ProcessInstance;
import com.budwk.app.flow.entity.ProcessTask;
import com.budwk.app.flow.enums.ProcessSubmitTypeEnum;
import com.budwk.app.sys.views.View_user;
import com.budwk.app.flow.service.FlowCommonService;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.zhgh.outlay.activityBudget.models.ActivityBudget;
import com.budwk.app.zhgh.outlay.outlayReimburse.model.OutlayReimburse;
import com.budwk.app.zhgh.outlay.outlayReimburse.service.OutlayReimburseApplyService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.nutz.aop.interceptor.ioc.TransAop;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.ioc.aop.Aop;
import org.nutz.ioc.loader.annotation.Inject;
@@ -29,7 +27,6 @@ import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import org.nutz.mvc.annotation.Param;
import javax.swing.*;
import java.util.List;
/**
@@ -53,6 +50,9 @@ public class OutlayReimburseApplyController {
@Inject
private FlowEngine flowEngine;
@Inject
private FlowCommonService flowCommonService;
@At("/index")
@Ok("beetl:/platform/zhgh/outlay/outlayReimburse/apply/index.html")
@SaCheckPermission("outlay.reimburse.apply")
@@ -85,20 +85,11 @@ public class OutlayReimburseApplyController {
@At
@ApiOperation("提交报销申请")
@SaCheckPermission("activity.budget.apply")
@SaCheckPermission("activity.reimburse.apply")
@Aop(TransAop.READ_COMMITTED)
@SLog(type = "outlayReimburseApply", tag = "费用报销管理-报销申请", msg = "提交年度预算申报")
@SLog( tag = "费用报销管理-报销申请", msg = "提交年度预算申报")
public Result submit(@Param("data") OutlayReimburse outlayReimburse) {
//添加预算详情表
if (StrUtil.isBlank(outlayReimburse.getId())){
View_user user = dao.fetch(View_user.class, Cnd.where("id", "=", SecurityUtil.getUserId()));
outlayReimburse.setUserId(SecurityUtil.getUserId());
outlayReimburse.setUserName(SecurityUtil.getUserUsername());
outlayReimburse.setLoginName(SecurityUtil.getUserLoginname());
outlayReimburse.setUnitId(SecurityUtil.getUnitId());
outlayReimburse.setUnitName(user.getUnitName());
outlayReimburse.setUnionId(SecurityUtil.getUnionId());
outlayReimburse.setUnionName(user.getUnionName());
outlayReimburse.setApplyTime(DateUtil.now());
}
outlayReimburseApplyService.insertOrUpdate(outlayReimburse);
@@ -117,20 +108,27 @@ public class OutlayReimburseApplyController {
return Result.success();
}
@At
@SaCheckPermission("activity.reimburse.apply")
@ApiOperation("重新提交申请")
@Aop(TransAop.READ_COMMITTED)
@SLog( tag = "费用报销管理-报销申请", msg = "重新提交申请")
public Result submitAgain(@Param("data") OutlayReimburse outlayReimburse, @Param("taskId") Long taskId) {
outlayReimburseApplyService.insertOrUpdate(outlayReimburse);
Dict dict = Dict.create();
dict.set(FlowConst.PROCESS_TASK_ID_KEY, taskId);
dict.set(FlowConst.SUBMIT_TYPE, ProcessSubmitTypeEnum.RE_APPLY.getCode());
flowCommonService.executeTask(dict);
return Result.success();
}
@At
@SaCheckPermission("outlay.reimburse.apply")
@ApiOperation("保存申请")
@SLog(type = "outlayReimburseApply", tag = "费用报销管理-报销申请", msg = "保存年度预算申报")
@SLog( tag = "费用报销管理-报销申请", msg = "保存年度预算申报")
public Result save(@Param("data") OutlayReimburse outlayReimburse) {
View_user user = dao.fetch(View_user.class, Cnd.where("id", "=", SecurityUtil.getUserId()));
outlayReimburse.setUserId(SecurityUtil.getUserId());
outlayReimburse.setUserName(SecurityUtil.getUserUsername());
outlayReimburse.setLoginName(SecurityUtil.getUserLoginname());
outlayReimburse.setUnitId(SecurityUtil.getUnitId());
outlayReimburse.setUnitName(user.getUnitName());
outlayReimburse.setUnionId(SecurityUtil.getUnionId());
outlayReimburse.setUnionName(user.getUnionName());
outlayReimburse.setApplyTime(DateUtil.now());
outlayReimburseApplyService.insertOrUpdate(outlayReimburse);
return Result.success();
@@ -0,0 +1,118 @@
package com.budwk.app.zhgh.outlay.outlayReimburse.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.hutool.core.util.StrUtil;
import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.param.PageForm;
import com.budwk.app.base.result.Result;
import com.budwk.app.base.service.BaseService;
import com.budwk.app.base.utils.PageUtil;
import com.budwk.app.flow.enums.ProcessTaskStateEnum;
import com.budwk.app.sys.services.SysDictService;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.nutz.dao.Cnd;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.util.NutMap;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import java.util.List;
/**
* @author zhf
* @date 2025/8/19 16:50
* @description 分工会主席审核
*/
@IocBean
@Ok("json:full")
@Slf4j
@Api(tags = "费用报销管理-协会审核")
@At("/platform/outlay/reimburse/clubAudit")
public class OutlayReimburseClubAuditController {
@Inject
private BaseService baseService;
@Inject
private SysDictService sysDictService;
@At("/index")
@Ok("beetl:/platform/zhgh/outlay/outlayReimburse/clubAudit/index.html")
@SaCheckPermission("outlay.reimburse.clubAudit")
public void index() {
}
@At
@ApiOperation("分页查询")
@SaCheckPermission("outlay.reimburse.clubAudit")
public Result pageData(PageForm pageForm,
Integer year,
Boolean approval,
String outlayManageSource) {
Sql sql = Sqls.create("""
SELECT
info.*,
YEAR(info.applyTime) year,
ins.id AS instanceId,
ins.businessNo,
ins.state instanceState,
ins.variable instanceVariale,
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,
IFNULL(GROUP_CONCAT(DISTINCT nt.displayName),'结束') curTaskName,
IF(rt.id IS NOT NULL, 1, 0) AS canRevoke
FROM
wf_process_task t
LEFT JOIN wf_process_instance ins ON ins.id = t.processInstanceId
LEFT JOIN outlay_reimburse info ON info.id = ins.businessNo
LEFT JOIN wf_process_task_actor ta ON ta.processTaskId = t.id
LEFT JOIN wf_process_task nt ON nt.processInstanceId = ins.id AND nt.taskState = 10
LEFT JOIN wf_process_task rt ON rt.processInstanceId = ins.id AND rt.taskParentId = t.id AND rt.taskState = 10
$condition
""");
Cnd cnd = Cnd.NEW();
cnd.and("t.taskName", "=", "68a9af7f-f532-4866-aa09-24f0f802389f");
cnd.and("ta.actorId", "in", List.of(SecurityUtil.getUserId()));
cnd.andEX("info.outlayManageSource", "=", outlayManageSource);
if (approval) {
cnd.and("t.taskState", "in", List.of(ProcessTaskStateEnum.FINISHED.getCode(), ProcessTaskStateEnum.WITHDRAW.getCode(), ProcessTaskStateEnum.INTERRUPT.getCode()));
} else {
cnd.and("t.taskState", "=", ProcessTaskStateEnum.DOING.getCode());
}
if (StrUtil.isAllNotEmpty(pageForm.getSearchName(), pageForm.getSearchKeyword())) {
cnd.where().andLike(pageForm.getSearchName(), pageForm.getSearchKeyword());
}
cnd.andEX("YEAR(info.applyTime)", "=", year);
cnd.groupBy("t.id");
if (StrUtil.isAllBlank(pageForm.getPageOrderName(), pageForm.getPageOrderBy())) {
cnd.desc("t.createdAt").desc("info.applyTime");
} else {
cnd.orderBy(pageForm.getPageOrderName(), PageUtil.getOrder(pageForm.getPageOrderBy()));
}
sql.setCondition(cnd);
Pagination<NutMap> pageVO = baseService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql);
return Result.success(pageVO);
}
}
@@ -54,7 +54,6 @@ public class OutlayReimburseUnionAuditController {
@SaCheckPermission("outlay.reimburse.unionAudit")
public Result pageData(PageForm pageForm,
Integer year,
String clubId,
Boolean approval,
String outlayManageSource) {
Sql sql = Sqls.create("""
@@ -10,6 +10,7 @@ import com.budwk.app.flow.engine.core.Execution;
import com.budwk.app.flow.engine.core.ServiceContext;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.zhgh.outlay.activityBudget.models.ActivityBudget;
import com.budwk.app.zhgh.outlay.outlayManage.club.model.OutlayManageClub;
import com.budwk.app.zhgh.outlay.outlayManage.model.OutlayUseDetail;
import com.budwk.app.zhgh.outlay.outlayManage.school.model.OutlayManageSchool;
import com.budwk.app.zhgh.outlay.outlayManage.union.model.OutlayManageUnion;
@@ -88,6 +89,23 @@ public class OutlayReimburseSchoolZxAuditPostInterceptor implements FlowIntercep
detail.setOutlayManageId(manageUnion.getId());
dao.insert(detail);
}
}else if (outlayReimburse.getOutlayManageSource().equals("ACTIVITY_BUDGET_TYPE_THREE")){
// 更新分工会活动经费表
OutlayManageClub manageClub = dao.fetch(OutlayManageClub.class,
Cnd.where("year", "=", DateUtil.thisYear())
.and("clubId", "=", outlayReimburse.getClubId()));
if (ObjectUtil.isEmpty(manageClub)) {
throw new BaseException("该年份没有设置金额!");
}
if (manageClub.getTotalQuota().subtract(manageClub.getUsedQuota()).compareTo(outlayReimburse.getMoney()) < 0) {
throw new BaseException("剩余配额不足!剩余:" + manageClub.getTotalQuota().subtract(manageClub.getUsedQuota()));
}
manageClub.setUsedQuota(manageClub.getUsedQuota().add(outlayReimburse.getMoney()));
dao.updateIgnoreNull(manageClub);
//添加使用记录到经费管理表
detail.setOutlayManageId(manageClub.getId());
dao.insert(detail);
}
}
@@ -74,6 +74,11 @@ public class OutlayReimburse extends BaseModel implements Serializable {
@ColDefine(type = ColType.VARCHAR, width = 32)
private String clubId;
@Column
@Comment("社团名称")
@ColDefine(type = ColType.VARCHAR, width = 50)
private String clubName;
@Column
@Comment("报销经费来源")
@ColDefine(type = ColType.VARCHAR, width = 32)
@@ -3,10 +3,15 @@ package com.budwk.app.zhgh.outlay.outlayReimburse.service.impl;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.budwk.app.base.constant.RoleConstant;
import com.budwk.app.base.result.Result;
import com.budwk.app.base.service.impl.BaseServiceImpl;
import com.budwk.app.sys.models.Sys_role;
import com.budwk.app.sys.models.Sys_user_role;
import com.budwk.app.sys.services.SysRoleService;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.zhgh.outlay.activityBudget.models.ActivityBudget;
import com.budwk.app.zhgh.outlay.outlayManage.club.model.OutlayManageClub;
import com.budwk.app.zhgh.outlay.outlayManage.school.model.OutlayManageSchool;
import com.budwk.app.zhgh.outlay.outlayManage.union.model.OutlayManageUnion;
import com.budwk.app.zhgh.outlay.outlayReimburse.model.OutlayReimburse;
@@ -15,6 +20,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.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.util.NutMap;
@@ -33,6 +39,9 @@ public class OutlayReimburseApplyServiceImpl extends BaseServiceImpl<OutlayReimb
super(dao);
}
@Inject
private SysRoleService sysRoleService;
@Override
public NutMap getBudgetMoneyOrActivity(String outlayManageSource, String clubId, String unionId, String id) {
@@ -114,14 +123,20 @@ public class OutlayReimburseApplyServiceImpl extends BaseServiceImpl<OutlayReimb
.and("unionId", "=", StrUtil.isNotBlank(unionId) ? unionId : SecurityUtil.getUnionId()));
map.put("budgetMoney", ObjectUtil.isNotEmpty(union) ? union.getTotalQuota().subtract(union.getUsedQuota()) : 0);
} else if (outlayManageSource.equals("ACTIVITY_BUDGET_TYPE_THREE")) {
Sys_role sysRole = sysRoleService.getByCode(RoleConstant.CLUB_PRESIDENT);
List<Sys_user_role> userRoles = dao().query(Sys_user_role.class, Cnd.where("userId", "=", SecurityUtil.getUserId()).and("roleId", "=", sysRole.getId()));
List<String> myClubId = userRoles.stream().map(Sys_user_role::getClubId).toList();
OutlayManageClub club = dao().fetch(OutlayManageClub.class, Cnd.where("year", "=", DateUtil.thisYear())
.and("clubId", "in", StrUtil.isNotBlank(clubId) ? List.of(clubId) : myClubId));
map.put("budgetMoney", ObjectUtil.isNotEmpty(club) ? club.getTotalQuota().subtract(club.getUsedQuota()) : 0);
}
map.put("activityList", canBudgetList);
return map;
}
@Override
public BigDecimal getBxMoneyByActivityId(String budgetId,Boolean isSchoolBudget) {
public BigDecimal getBxMoneyByActivityId(String budgetId, Boolean isSchoolBudget) {
Sql sql = Sqls.create("""
SELECT
rei.money
@@ -133,9 +148,9 @@ public class OutlayReimburseApplyServiceImpl extends BaseServiceImpl<OutlayReimb
AND ins.state = 20
""").setParam("budgetId", budgetId);
Cnd cnd = Cnd.NEW();
if (isSchoolBudget!=null){
cnd.and("isSchoolBudget", "=", isSchoolBudget);
}
if (isSchoolBudget != null) {
cnd.and("isSchoolBudget", "=", isSchoolBudget);
}
List<NutMap> reiList = listMap(sql);
@@ -159,7 +174,7 @@ public class OutlayReimburseApplyServiceImpl extends BaseServiceImpl<OutlayReimb
if (budget.getIsRepeatReimburse()) {
//1.查询已经报销了的总金额
if (budget.getIsSchoolBudget()) {
BigDecimal bXMoney = getBxMoneyByActivityId(budgetId,budget.getIsSchoolBudget());
BigDecimal bXMoney = getBxMoneyByActivityId(budgetId, budget.getIsSchoolBudget());
//如果是分工会进来并且报销的活动是校会预算
// 1. 计算本次加上之前的报销总金额
BigDecimal totalReimbursement = bXMoney.add(moneyBig);
@@ -170,7 +185,7 @@ public class OutlayReimburseApplyServiceImpl extends BaseServiceImpl<OutlayReimb
return Result.success();
}
} else {
BigDecimal bXMoney = getBxMoneyByActivityId(budgetId,budget.getIsSchoolBudget());
BigDecimal bXMoney = getBxMoneyByActivityId(budgetId, budget.getIsSchoolBudget());
//如果是自己的项目就能超20%
//1.算出现在还能报销多少钱
BigDecimal twentyPercent = budget.getTotalBudgetMoney().multiply(new BigDecimal("20")).divide(new BigDecimal("100"), 2, BigDecimal.ROUND_HALF_UP);
@@ -203,7 +218,7 @@ public class OutlayReimburseApplyServiceImpl extends BaseServiceImpl<OutlayReimb
//如果报销的项目是可以重复报销的
if (budget.getIsRepeatReimburse()) {
//这个预算已经报销了多少钱
BigDecimal totalMoney = getBxMoneyByActivityId(budgetId,null);
BigDecimal totalMoney = getBxMoneyByActivityId(budgetId, null);
//查出这个活动有没有跟其他预算关联,如果跟其他预算关联了,代表当前这条预算是分工会也能报校工会也能报,
// schoolBudgetId字段不为空就代表这条预算是使用的校工会的金额
List<ActivityBudget> budgetList = dao().query(ActivityBudget.class,
@@ -257,18 +272,27 @@ public class OutlayReimburseApplyServiceImpl extends BaseServiceImpl<OutlayReimb
}
}
}else if ("ACTIVITY_BUDGET_TYPE_THREE".equals(outlayManageSource)) {
//如果进来的是协会
OutlayManageClub outlayManageClub = dao().fetch(OutlayManageClub.class, Cnd.where("year", "=", DateUtil.thisYear())
.and("clubId", "=", clubId));
if (ObjectUtil.isEmpty(outlayManageClub)) {
return Result.error("该年份没有设置金额!");
}
if (outlayManageClub.getTotalQuota().subtract(outlayManageClub.getUsedQuota()).compareTo(moneyBig) < 0) {
return Result.error("剩余配额不足!剩余:" + outlayManageClub.getTotalQuota().subtract(outlayManageClub.getUsedQuota()));
} else {
return Result.success();
}
}
return null;
return Result.error("经费查询错误!");
}
@Override
public NutMap findOne(String id) {
return null;
}
}
@@ -210,9 +210,12 @@ layout("/layouts/platform.html"){
honorChange(val) {
const secondList = this.honorOptions.map((item) => item.children).flat()
const honor = secondList.find((o) => o.id === val)
this.selectHonor = this.honorOptions.find((o) => o.id === honor.parentId)
this.$set(this.formData, "honorTypeId", this.selectHonor.id)
this.$set(this.formData, "honorId", honor.id)
if (honor){
this.selectHonor = this.honorOptions.find((o) => o.id === honor.parentId)
this.$set(this.formData, "honorTypeId", this.selectHonor.id)
this.$set(this.formData, "honorId", honor.id)
}
},
doSave() {},
doSubmit() {
@@ -233,9 +236,8 @@ layout("/layouts/platform.html"){
openAdd() {
this.stepActive = 0
this.dialogVisible = true
this.$nextTick(() => {
this.$refs.formRef.resetFields()
})
this.formData={}
this.$refs.formRef.clearValidate()
this.$axios.post("/platform/evaluate/activity/initQuotaAllocations").then((res) => {
if (res.code === 0) {
this.$set(this.formData, "quotaAllocations", res.data)
@@ -1,111 +1,117 @@
const apply_component = {
template: /*language=HTML*/ `
<el-dialog title="填写申请" :visible.sync="dialogVisible" width="70%" top="50px" class="ele-dialog-form">
<el-card shadow="never">
<snaker-start slot="header" label="荣誉申报" define_key="PYPX"></snaker-start>
<el-form :model="formData" ref="formRef" :rules="formRules" label-width="120px">
<template v-if="this.formData.honorType == '个人荣誉'">
<el-row :gutter="20">
<el-col :span="12">
<el-form-item prop="userName" label="姓名">
<el-input :value="formData.userName" disabled></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item prop="loginName" label="工号">
<el-input :value="formData.loginName" disabled></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item prop="birthday" label="出生日期">
<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 prop="sex" label="性别" disabled>
<el-input v-model="formData.sex" disabled></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item prop="unitName" label="所属单位">
<el-input :value="formData.unitName" disabled></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item prop="unionName" label="所属分工会">
<el-input :value="formData.unionName" disabled></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="民族" prop="nation">
<dict-select style="width: 100%" placeholder="请选择民族" v-model="formData.nation" code="USER_NATION"></dict-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item prop="political" label="政治面貌">
<dict-select
style="width: 100%"
placeholder="请选择政治面貌"
v-model="formData.political"
code="POLITICAL_STATUS"
></dict-select>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item prop="education" label="学历">
<dict-select style="width: 100%" placeholder="请选择学历" v-model="formData.education" code="USER_EDUCATION"></dict-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item prop="technicalTitle" label="技术职称">
<el-input v-model="formData.technicalTitle" placeholder="填写技术职称" max="50"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item prop="governmentPosition" label="党政职务">
<el-input v-model="formData.governmentPosition" placeholder="填写党政职务" max="50"></el-input>
</el-form-item>
</el-col>
</el-row>
<template v-if="formData.honorTypeName == '个人荣誉'">
<el-row :gutter="20">
<el-col :span="12">
<el-form-item prop="userName" label="姓名">
<el-input :value="formData.userName" disabled></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item prop="loginName" label="工号">
<el-input :value="formData.loginName" disabled></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item prop="birthday" label="出生日期">
<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 prop="sex" label="性别" disabled>
<el-input v-model="formData.sex" disabled></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item prop="unitName" label="所属单位">
<el-input :value="formData.unitName" disabled></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item prop="unionName" label="所属分工会">
<el-input :value="formData.unionName" disabled></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="民族" prop="nation">
<dict-select style="width: 100%" placeholder="请选择民族" v-model="formData.nation"
code="USER_NATION"></dict-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item prop="political" label="政治面貌">
<dict-select
style="width: 100%"
placeholder="请选择政治面貌"
v-model="formData.political"
code="POLITICAL_STATUS"
></dict-select>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item prop="education" label="学历">
<dict-select style="width: 100%" placeholder="请选择学历" v-model="formData.education"
code="USER_EDUCATION"></dict-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item prop="technicalTitle" label="技术职称">
<el-input v-model="formData.technicalTitle" placeholder="填写技术职称"
max="50"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item prop="governmentPosition" label="党政职务">
<el-input v-model="formData.governmentPosition" placeholder="填写党政职务"
max="50"></el-input>
</el-form-item>
</el-col>
</el-row>
</template>
<template v-else>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item prop="unionName" label="申报工会">
<el-input :value="formData.unionName" placeholder="请输入申报工会"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="工会主席" prop="unionLeader">
<el-input placeholder="请填写工会主席" v-model="formData.unionLeader"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="会员人数" prop="memberNumber">
<el-input-number v-model="formData.memberNumber" :min="0"
placeholder="请填写会员人数"
:max="2000" style="width: 100%"></el-input-number>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item prop="unionName" label="申报工会">
<el-input :value="formData.unionName" placeholder="请输入申报工会"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="工会主席" prop="unionLeader">
<el-input placeholder="请填写工会主席" v-model="formData.unionLeader"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="会员人数" prop="memberNumber">
<el-input-number v-model="formData.memberNumber" :min="0"
placeholder="请填写会员人数"
:max="2000" style="width: 100%"></el-input-number>
</el-form-item>
</el-col>
</el-row>
</template>
<el-row :gutter="20">
<el-col :span="24">
<el-form-item label="曾获何种奖励" prop="historyHonor">
<el-input v-model="formData.historyHonor" type="textarea" rows="8" maxlength="5000"
show-word-limit></el-input>
show-word-limit></el-input>
</el-form-item>
</el-col>
</el-row>
@@ -113,77 +119,74 @@ const apply_component = {
<el-col :span="24">
<el-form-item label="简要事迹(主要成绩)" prop="briefDeeds">
<el-input v-model="formData.briefDeeds" type="textarea" rows="8" maxlength="5000"
show-word-limit></el-input>
show-word-limit></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="24">
<el-form-item label="附件" prop="files">
<file-upload :value.sync="formData.files" upload_result_category="array" :upload_number="5" complete_result></file-upload>
<file-upload :value.sync="formData.files" upload_result_category="array" :upload_number="5"
complete_result></file-upload>
</el-form-item>
</el-col>
</el-row>
</el-form>
<div slot="footer">
<el-button @click="dialogVisible = false">取消</el-button>
<el-button type="primary" plain @click="save">保存</el-button>
<el-button type="primary" @click="submit">提交</el-button>
</div>
</el-dialog>
<el-row type="flex" justify="end" style="margin-top: 20px;">
<el-button type="primary" plain @click="onSave">保存</el-button>
<el-button type="primary" @click="onSubmit" v-if="!taskId" class="ml15">提交</el-button>
<el-button type="primary" @click="onFinishTask" class="ml15" v-else>提交</el-button>
</el-row>
</el-card>
`,
store,
data() {
return {
dialogVisible: false,
taskId: "",
formData: {},
formRules: {
loginName: [{ required: true, message: "必填", trigger: ["change", "blur"] }],
userName: [{ required: true, message: "必填", trigger: ["change", "blur"] }],
unitName: [{ required: true, message: "必填", trigger: ["change", "blur"] }],
unionName: [{ required: true, message: "必填", trigger: ["change", "blur"] }],
birthday: [{ required: true, message: "必填", trigger: ["change", "blur"] }],
sex: [{ required: true, message: "必填", trigger: ["change", "blur"] }],
nation: [{ required: true, message: "必填", trigger: ["change", "blur"] }],
political: [{ required: true, message: "必填", trigger: ["change", "blur"] }],
education: [{ required: true, message: "必填", trigger: ["change", "blur"] }],
technicalTitle: [{ required: true, message: "必填", trigger: ["change", "blur"] }],
governmentPosition: [{ required: true, message: "必填", trigger: ["change", "blur"] }],
briefDeeds: [{ required: true, message: "必填", trigger: ["change", "blur"] }],
historyHonor: [{ required: true, message: "必填", trigger: ["change", "blur"] }],
unionLeader: [{ required: true, message: "必填", trigger: ["change", "blur"] }],
memberNumber: [{ required: true, message: "必填", trigger: ["change", "blur"] }],
loginName: [{required: true, message: "必填", trigger: ["change", "blur"]}],
userName: [{required: true, message: "必填", trigger: ["change", "blur"]}],
unitName: [{required: true, message: "必填", trigger: ["change", "blur"]}],
unionName: [{required: true, message: "必填", trigger: ["change", "blur"]}],
birthday: [{required: true, message: "必填", trigger: ["change", "blur"]}],
sex: [{required: true, message: "必填", trigger: ["change", "blur"]}],
nation: [{required: true, message: "必填", trigger: ["change", "blur"]}],
political: [{required: true, message: "必填", trigger: ["change", "blur"]}],
education: [{required: true, message: "必填", trigger: ["change", "blur"]}],
technicalTitle: [{required: true, message: "必填", trigger: ["change", "blur"]}],
governmentPosition: [{required: true, message: "必填", trigger: ["change", "blur"]}],
briefDeeds: [{required: true, message: "必填", trigger: ["change", "blur"]}],
historyHonor: [{required: true, message: "必填", trigger: ["change", "blur"]}],
unionLeader: [{required: true, message: "必填", trigger: ["change", "blur"]}],
memberNumber: [{required: true, message: "必填", trigger: ["change", "blur"]}],
}
}
},
methods: {
onOpenEdit(id) {
this.dialogVisible = true
this.$nextTick(() => {
this.$axios.post("/platform/evaluate/apply/info", { id }).then((res) => {
if (res.code === 0) {
this.formData = res.data
}
})
onOpenEdit(row) {
this.taskId = row.taskId
this.$axios.post("/platform/evaluate/apply/info", {id: row.id}).then((res) => {
if (res.code === 0) {
this.formData = res.data
}
})
},
onOpen(activity) {
this.dialogVisible = true
this.$nextTick(() => {
this.initForm()
this.$set(this.formData, "evaluateId", activity.id)
this.$set(this.formData, "honorTypeId", activity.honorTypeId)
this.$set(this.formData, "honorType", activity.honorType)
this.$set(this.formData, "honorId", activity.honorId)
this.initForm()
this.$set(this.formData, "evaluateId", activity.id)
this.$set(this.formData, "honorTypeId", activity.honorTypeId)
this.$set(this.formData, "honorTypeName", activity.honorTypeName)
this.$set(this.formData, "honorId", activity.honorId)
if (activity.honorType.includes('集体')) {
this.getCollectiveInfo()
}
})
if (activity.honorTypeName.includes('集体')) {
this.getCollectiveInfo()
}
},
getCollectiveInfo() {
this.$axios.post("/platform/honor/basic/settings/getUnionInfo", { id: this.$store.state.user.union.id }).then((res) => {
this.$axios.post("/platform/honor/basic/settings/getUnionInfo", {id: this.$store.state.user.union.id}).then((res) => {
if (res.code === 0) {
this.formData.memberNumber = res.data.memberNumber
this.formData.unionLeader = res.data.username
@@ -191,41 +194,67 @@ const apply_component = {
}
})
},
save() {
this.$confirm("保存后可在我的申请里面再次编辑,您确定要保存吗?", "提示", { type: "warning" }).then(() => {
this.$axios
.post("/platform/evaluate/apply/save", {
evaluateApply: JSON.stringify(this.formData)
})
.then((res) => {
if (res.code === 0) {
this.$message.success("保存成功")
this.dialogVisible = false
this.$emit("refresh", null)
this.$store.dispatch("pjaxRoute", "/platform/evaluate/mine")
// 保存
onSave() {
this.$confirm("您确定保存吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.$axios.post('/platform/evaluate/apply/save', {data: JSON.stringify(this.formData)}).then(res => {
if (res.code === 0) {
this.$message.success("保存成功")
if (this.formData.id) {
this.$emit('refresh')
} else {
window.location.href = '/platform/evaluate/mine'
}
})
}
})
})
},
submit() {
this.$refs.formRef.validate((valid) => {
if (valid) {
this.$axios
.post("/platform/evaluate/apply/submit", {
evaluateApply: JSON.stringify(this.formData)
})
.then((res) => {
if (res.code === 0) {
this.$message.success("提交成功")
this.dialogVisible = false
this.$emit("refresh", null)
this.$store.dispatch("pjaxRoute", "/platform/evaluate/mine")
}
})
}
onSubmit() {
this.$confirm("您确定要提交吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.$axios.post('/platform/evaluate/apply/submit', {
data: JSON.stringify(this.formData),
taskId: this.taskId
}).then(res => {
if (res.code === 0) {
this.$message.success("提交成功")
if (this.formData.id) {
this.$emit('refresh')
} else {
window.location.href = '/platform/evaluate/mine'
}
}
})
})
},
onFinishTask() {
this.$confirm("您确定要提交吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.$axios.post('/platform/evaluate/apply/submitAgain', {
data: JSON.stringify(this.formData),
taskId: this.taskId
}).then(res => {
if (res.code === 0) {
this.$message.success("提交成功")
if (this.formData.id) {
this.$emit('refresh')
} else {
window.location.href = '/platform/evaluate/mine'
}
}
})
})
},
initForm() {
const user = this.$store.state.user
this.$set(this.formData, "userName", user.username)
@@ -3,35 +3,43 @@ layout("/layouts/platform.html"){
#-->
<div id="app" v-cloak>
<el-card shadow="never">
<search @search="doSearch">
<search-item label="年度:">
<el-date-picker v-model="pageForm.year" type="year" value-format="yyyy" placeholder="选择年度" style="width: 100%"></el-date-picker>
</search-item>
</search>
</el-card>
<el-card shadow="never">
<table-tool>
<template slot="tool"></template>
</table-tool>
<el-table :data="tableData" @sort-change="pageOrder">
<el-table-column type="index" width="50px" label="序号" :index="indexMethod"></el-table-column>
<el-table-column prop="year" label="年份"></el-table-column>
<el-table-column prop="name" label="名称"></el-table-column>
<el-table-column prop="startTime" label="开始时间"></el-table-column>
<el-table-column prop="endTime" label="结束时间"></el-table-column>
<el-table-column prop="honorName" label="类型"></el-table-column>
<el-table-column prop="honorTypeName" label="荣誉类型"></el-table-column>
<el-table-column label="操作" width="200px">
<template slot-scope="{row}">
<el-button size="mini" type="primary" @click="openView(row)">查看</el-button>
<el-button size="mini" type="primary" @click="openApply(row)">申请</el-button>
</template>
</el-table-column>
</el-table>
</el-card>
<guava ref="guava">
<template>
<el-card shadow="never">
<search @search="doSearch">
<search-item label="年度:">
<el-date-picker v-model="pageForm.year" type="year" value-format="yyyy" placeholder="选择年度"
style="width: 100%"></el-date-picker>
</search-item>
</search>
</el-card>
<el-card shadow="never">
<table-tool>
<template slot="tool"></template>
</table-tool>
<el-table :data="tableData" @sort-change="pageOrder">
<el-table-column type="index" width="50px" label="序号" :index="indexMethod"></el-table-column>
<el-table-column prop="year" label="年份"></el-table-column>
<el-table-column prop="name" label="名称"></el-table-column>
<el-table-column prop="startTime" label="开始时间"></el-table-column>
<el-table-column prop="endTime" label="结束时间"></el-table-column>
<el-table-column prop="honorName" label="类型"></el-table-column>
<el-table-column prop="honorTypeName" label="荣誉类型"></el-table-column>
<el-table-column label="操作" width="200px">
<template slot-scope="{row}">
<el-button size="mini" type="primary" @click="openView(row)">查看</el-button>
<el-button size="mini" type="primary" @click="openApply(row)">申请</el-button>
</template>
</el-table-column>
</el-table>
</el-card>
</template>
<apply_form ref="applyFormRef" @refresh=""></apply_form>
<template #edit>
<apply_form ref="applyFormRef" @refresh=""></apply_form>
</template>
</guava>
</div>
<script>
@@ -46,22 +54,21 @@ layout("/layouts/platform.html"){
},
data() {
return {
dialogVisible: false
}
},
methods: {
openView(row) {},
openView(row) {
},
openApply(row) {
$.post("/platform/evaluate/apply/valid", { id: row.id }).then((res) => {
$.post("/platform/evaluate/apply/valid", {id: row.id}).then((res) => {
if (res.code === 0) {
const { msg, data } = res
const {msg, data} = res
if (!data) {
this.$message.warning(msg)
return
}
//可以申请
this.dialogVisible = true
this.$nextTick(() => {
this.$refs.guava.edit(()=>{
this.$refs.applyFormRef.onOpen(row)
})
}
@@ -7,24 +7,22 @@ layout("/layouts/platform.html"){
<el-card shadow="never">
<search @search="doSearch">
<search-item label="年度">
<el-date-picker v-model="pageForm.year" type="year" value-format="yyyy" placeholder="选择年度"></el-date-picker>
<el-date-picker v-model="pageForm.year" type="year" value-format="yyyy"
placeholder="选择年度"></el-date-picker>
</search-item>
<search-item label="姓名:">
<el-input placeholder="请输入姓名查询" clearable v-model="pageForm.userName"></el-input>
</search-item>
<search-item label="工号:">
<el-input placeholder="请输入工号查询" clearable v-model="pageForm.loginName"></el-input>
</search-item>
<search-item label="所属工会:">
<el-select v-model="pageForm.unionId" placeholder="请选择所属工会" filterable clearable style="width: 100%">
<el-option v-for="item in unionList" :key="item.id" :label="item.name" :value="item.id"></el-option>
</el-select>
</search-item>
<search-item label="所属单位:">
<el-select v-model="pageForm.unitId" placeholder="请选择所属单位" filterable clearable style="width: 100%">
<el-option v-for="item in unitList" :key="item.id" :label="item.name" :value="item.id"></el-option>
</el-select>
<search-item label="申请人">
<el-input @keyup.enter.native="doSearch" clearable
placeholder="请输入内容"
v-model="pageForm.searchKeyword">
<el-select placeholder="查询类型" slot="prepend"
style="width: 100px;"
v-model="pageForm.searchName">
<el-option label="姓名" value="info.userName"></el-option>
<el-option label="工号" value="info.loginName"></el-option>
</el-select>
</el-input>
</search-item>
</search>
</el-card>
@@ -44,20 +42,19 @@ layout("/layouts/platform.html"){
<el-table-column prop="unionName" label="分工会"></el-table-column>
<el-table-column prop="applyDateTime" label="申请时间"></el-table-column>
<el-table-column prop="honorName" label="类型" show-overflow-tooltip></el-table-column>
<el-table-column label="当前节点" prop="processInstanceNodeName" show-overflow-tooltip></el-table-column>
<el-table-column label="操作" width="300px">
<el-table-column prop="taskName" label="当前节点"></el-table-column>
<el-table-column prop="instanceState" label="流程状态">
<template v-slot="{row}">
<enum-tag :value="row.instanceState" name="ProcessInstanceStateEnum" label_key="message"
size="small"></enum-tag>
</template>
</el-table-column>
<el-table-column label="操作" fixed="right" width="300px">
<template slot-scope="{row}">
<el-button @click="openView(row)" size="mini" type="primary">查看</el-button>
<el-button v-if="row.processInstanceTaskStatus==='ACTIVE'" @click="openApproval(row)" size="mini" type="primary">
审核
<el-button v-if="row.taskState === 10" @click="openAudit(row)" size="mini" type="primary">审核
</el-button>
<el-button
v-if="row.processInstanceTaskStatus==='COMPLETE' && !row.nextTaskIsComplete"
@click="openRevoke(row.processInstanceTaskId)"
size="mini"
type="danger"
>
撤回
<el-button v-if="row.canRevoke" @click="onRevoke(row)" size="mini" type="danger">撤回
</el-button>
</template>
</el-table-column>
@@ -65,25 +62,32 @@ layout("/layouts/platform.html"){
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
<template #public>
<info ref="infoRef"></info>
<div v-if="showApprovalForm">
<div class="process-title">{{formData.processInstanceNodeName}}</div>
<el-form :model="formData" ref="approvalFormRef" label-position="left" label-width="80px">
<el-form-item label="审核意见" prop="approvalOpinion" :rules="[{required:true,message:'必填',trigger:['change','blur']}]">
<user-opinion-textarea v-model="formData.approvalOpinion"></user-opinion-textarea>
</el-form-item>
<el-form-item label="电子签名" prop="approvalSignature" :rules="[{required:false,message:'必填',trigger:['change','blur']}]">
<pc-signature v-model="formData.approvalSignature"></pc-signature>
</el-form-item>
</el-form>
<el-row type="flex" justify="end">
<el-button plain @click="$refs.guava.index()">取消</el-button>
<el-button type="danger" @click="doApproval('BACK')">退回重新申请</el-button>
<el-button type="danger" @click="doApproval('REJECT')">拒绝申请</el-button>
<el-button type="primary" @click="doApproval('PASS')">同意申请</el-button>
</el-row>
</div>
<template #edit>
<info ref="infoRef">
<div v-if="showApprovalForm">
<div class="process-title">
{{formData.taskName}}
</div>
<el-form :model="formData" ref="formRef" :rules="formRules" label-width="0" label-suffix=""
class="flow-task-form">
<el-form-item label="审批意见" prop="tf_opinion"
:rules="[{required:true,message:'必填',trigger:['change','blur']}]">
<user-opinion-textarea v-model="formData.tf_opinion"></user-opinion-textarea>
</el-form-item>
<!--:rules="[{required:true,message:'必填',trigger:['change','blur']}]"-->
<el-form-item label="签字" prop="tf_userSign"
>
<pc-signature v-model="formData.tf_userSign"></pc-signature>
</el-form-item>
</el-form>
<el-row type="flex" justify="end">
<el-button @click="$refs.guava.index()" size="small">取消</el-button>
<el-button @click="handleTaskAction(6)" size="small" type="info">退回到发起人</el-button>
<el-button @click="handleTaskAction(2)" size="small" type="danger">拒绝申请</el-button>
<el-button @click="handleTaskAction(1)" size="small" type="primary">同意申请</el-button>
</el-row>
</div>
</info>
</template>
</guava>
</div>
@@ -102,10 +106,7 @@ layout("/layouts/platform.html"){
return {
pageForm: {
approval: false,
unionId: "",
unitId: "",
year: null,
searchKeyword: ""
searchName: "info.userName"
},
unionList: [],
unitList: [],
@@ -114,54 +115,61 @@ layout("/layouts/platform.html"){
},
methods: {
openView(row) {
this.$refs.guava.public(() => {
this.$refs.infoRef.onOpen(row.id)
this.$refs.guava.edit(() => {
this.$refs.infoRef.onOpen(row)
this.showApprovalForm = false
})
},
openApproval(row) {
this.$refs.guava.public(() => {
this.$refs.infoRef.onOpen(row.id)
this.formData = row.approvalParam
openAudit(row) {
this.$refs.guava.edit(() => {
this.showApprovalForm = true
this.formData = {
processTaskId: row.taskId,
taskName: row.curTaskName
}
this.$refs.infoRef.onOpen(row)
})
},
doApproval(approvalType) {
this.formData.bpmTaskApprovalType = approvalType
this.$refs.approvalFormRef.validate((valid) => {
handleTaskAction(val) {
this.$refs.formRef.validate((valid) => {
if (valid) {
this.$axios
.post(loc() + "/approval", {
approval: JSON.stringify(this.formData)
})
.then((res) => {
this.$confirm("您确定要提交吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.$axios.post("/flow/common/executeTask", {
data: JSON.stringify({
...this.formData,
submitType: val
})
}).then((res) => {
if (res.code === 0) {
this.$refs.guava.index()
this.$message.success(res.msg)
this.doSearch()
}
})
})
}
})
},
openRevoke(taskId) {
onRevoke(row) {
this.$confirm("您确定要撤回吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "info"
}).then(() => {
this.$axios.post(loc() + "/revoke", { taskId }).then((res) => {
this.$axios.post("/flow/common/revokeTask", {taskId: row.taskId}).then((res) => {
if (res.code === 0) {
this.$message.success(res.msg)
this.doSearch()
}
})
})
}
},
},
async created() {
this.unitList = await this.$businessTool.listUnit()
this.unionList = await this.$businessTool.listUnion()
this.pageData()
}
})
@@ -1,99 +1,125 @@
const info = {
template: /*language=HTML*/ `
<div>
<div>
<div class="process-title">
申请信息
<div class="process-title">
申请信息
<el-link type="primary" @click="openChart">点击查看流程图</el-link>
</div>
<el-descriptions :column="3" border>
<template v-if="!this.viewData.memberNumber">
<el-descriptions-item label="姓名">{{viewData.userName}}</el-descriptions-item>
<el-descriptions-item label="工号">{{viewData.loginName}}</el-descriptions-item>
<el-descriptions-item label="性别">{{viewData.sex}}</el-descriptions-item>
<el-descriptions-item label="出生年月">{{viewData.birthday}}</el-descriptions-item>
<el-descriptions-item label="民族">{{viewData.nation}}</el-descriptions-item>
<el-descriptions-item label="政治面貌">{{viewData.political}}</el-descriptions-item>
<el-descriptions-item label="学历">{{viewData.education}}</el-descriptions-item>
<el-descriptions-item label="技术职称">{{viewData.technicalTitle}}</el-descriptions-item>
<el-descriptions-item label="党政职务">{{viewData.governmentPosition}}</el-descriptions-item>
</template>
<el-descriptions-item label="工会" :span="1.5">{{viewData.unionName}}</el-descriptions-item>
<el-descriptions-item label="单位" :span="1.5">{{viewData.unitName}}</el-descriptions-item>
<template v-if="this.viewData.memberNumber">
<el-descriptions-item label="工会主席" :span="1.5">{{viewData.unionLeader}}</el-descriptions-item>
<el-descriptions-item label="会员人数" :span="1.5">{{viewData.memberNumber}}</el-descriptions-item>
</template>
<el-descriptions-item label="曾获何种荣誉称号" :span="3">
<div style="white-space: pre-line">
{{viewData.historyHonor}}
</div>
</el-descriptions-item>
<el-descriptions-item label="简要事迹(主要成绩)" :span="3">
<div style="white-space: pre-line">{{viewData.briefDeeds}}</div>
</el-descriptions-item>
<el-descriptions-item label="附件">
<file-preview :files="viewData.files" complete_result></file-preview>
</el-descriptions-item>
</el-descriptions>
<template v-for="(task,index) in doneTasks">
<div class="task-panel mt10">
<div class="task-panel-header">{{ task.displayName }}</div>
<el-descriptions border class="flow-task-form" :column="3" :key="task.id"
v-if="task.ext.isFirstTaskNode">
<el-descriptions-item label="申请用户">{{ task.ext.initiatorName
}}({{task.ext.initiatorAccount}})
</el-descriptions-item>
<el-descriptions-item label="申请时间">{{ task.finishTime }}</el-descriptions-item>
<el-descriptions-item label="办理结果">
<dict-tag :options="dict.type.PROCESS_TASK_SUBMIT_TYPE"
:value="task.ext.submitType"></dict-tag>
</el-descriptions-item>
</el-descriptions>
<el-descriptions border class="flow-task-form" :column="3" :key="task.id" v-else>
<el-descriptions-item label="办理用户">{{ task.taskFormData.userName
}}({{task.taskFormData.loginName}})
</el-descriptions-item>
<el-descriptions-item label="办理时间">{{ task.finishTime }}</el-descriptions-item>
<el-descriptions-item label="办理结果">
<dict-tag :options="dict.type.PROCESS_TASK_SUBMIT_TYPE"
:value="task.ext.submitType"></dict-tag>
</el-descriptions-item>
<el-descriptions-item label="办理意见" v-if="!task.ext.isFirstTaskNode" :span="3">
{{
task.taskFormData.opinion
}}
</el-descriptions-item>
<el-descriptions-item label="签字" v-if="!task.ext.isFirstTaskNode" :span="3">
<el-image :src="task.ext.tf_userSign" fit="cover" style="height: 60px"
v-if="task.ext.tf_userSign"></el-image>
</el-descriptions-item>
</el-descriptions>
</div>
<el-descriptions border>
<template v-if="!this.viewData.memberNumber">
<el-descriptions-item label="姓名">{{viewData.userName}}</el-descriptions-item>
<el-descriptions-item label="工号">{{viewData.loginName}}</el-descriptions-item>
<el-descriptions-item label="性别">{{viewData.sex}}</el-descriptions-item>
<el-descriptions-item label="出生年月">{{viewData.birthday}}</el-descriptions-item>
<el-descriptions-item label="民族">{{viewData.nation}}</el-descriptions-item>
<el-descriptions-item label="政治面貌">{{viewData.political}}</el-descriptions-item>
<el-descriptions-item label="学历">{{viewData.education}}</el-descriptions-item>
<el-descriptions-item label="技术职称">{{viewData.technicalTitle}}</el-descriptions-item>
<el-descriptions-item label="党政职务">{{viewData.governmentPosition}}</el-descriptions-item>
</template>
<el-descriptions-item label="工会" :span="1.5">{{viewData.unionName}}</el-descriptions-item>
<el-descriptions-item label="单位" :span="1.5">{{viewData.unitName}}</el-descriptions-item>
<template v-if="this.viewData.memberNumber">
<el-descriptions-item label="工会主席" :span="1.5">{{viewData.unionLeader}}</el-descriptions-item>
<el-descriptions-item label="会员人数" :span="1.5">{{viewData.memberNumber}}</el-descriptions-item>
</template>
<el-descriptions-item label="曾获何种荣誉称号" :span="3">{{viewData.historyHonor}}</el-descriptions-item>
<el-descriptions-item label="简要事迹(主要成绩)" :span="3">{{viewData.briefDeeds}}</el-descriptions-item>
<el-descriptions-item label="附件">
<file-preview :files="viewData.files" complete_result></file-preview>
</el-descriptions-item>
</el-descriptions>
</div>
<div>
<div v-for="nodeTask in viewData.nodeTasks" :key="nodeTask.id">
<div class="process-title">
{{nodeTask.nodeName}}
</div>
<div v-if="nodeTask.nodeCode === 20">
<el-descriptions :column="3" border v-for="task in nodeTask.tasks" :key="task.id">
<el-descriptions-item label="审核人">{{ task.actualOwnerLoginName + '-' + task.actualOwnerUserName }}</el-descriptions-item>
<el-descriptions-item label="审核时间">{{ task.endOn }}</el-descriptions-item>
<el-descriptions-item label="审核结果">
<div v-if="task.extVariable">
<el-tag type="success" size="mini" v-if="task.extVariable.bpmTaskApprovalType === 'PASS'">同意</el-tag>
<el-tag type="danger" size="mini" v-if="task.extVariable.bpmTaskApprovalType === 'BACK'">退回重新填写</el-tag>
<el-tag type="danger" size="mini" v-if="task.extVariable.bpmTaskApprovalType === 'REJECT'">拒绝</el-tag>
</div>
</el-descriptions-item>
<el-descriptions-item label="审核意见" :span="3">{{ task.extVariable.approvalOpinion}}</el-descriptions-item>
<el-descriptions-item label="签字" :span="3">
<el-image :src="task.extVariable.approvalSignature"
v-if="task.extVariable && task.extVariable.approvalSignature"
class="signature-image"></el-image>
</el-descriptions-item>
</el-descriptions>
</div>
<div v-if="nodeTask.nodeCode === 50">
<el-descriptions :column="3" border v-for="task in nodeTask.tasks" :key="task.id">
<el-descriptions-item label="审核人">{{ task.actualOwnerLoginName + '-' + task.actualOwnerUserName }}</el-descriptions-item>
<el-descriptions-item label="审核时间">{{ task.endOn }}</el-descriptions-item>
<el-descriptions-item label="审核结果">
<div v-if="task.extVariable">
<el-tag type="success" size="mini" v-if="task.extVariable.bpmTaskApprovalType === 'PASS'">同意</el-tag>
<el-tag type="danger" size="mini" v-if="task.extVariable.bpmTaskApprovalType === 'BACK'">退回重新填写</el-tag>
<el-tag type="danger" size="mini" v-if="task.extVariable.bpmTaskApprovalType === 'REJECT'">拒绝</el-tag>
</div>
</el-descriptions-item>
<el-descriptions-item label="审核意见" :span="3">{{ task.extVariable.approvalOpinion}}</el-descriptions-item>
<el-descriptions-item label="签字" :span="3">
<el-image :src="task.extVariable.approvalSignature"
v-if="task.extVariable && task.extVariable.approvalSignature"
class="signature-image"></el-image>
</el-descriptions-item>
</el-descriptions>
</div>
</div>
</div>
</template>
<slot></slot>
<snaker-chart ref="snakerChartRef"></snaker-chart>
</div>
`,
dicts: ["PROCESS_TASK_SUBMIT_TYPE"],
data() {
return {
viewData: {}
viewData: {},
row: {},
doneTasks: []
}
},
methods: {
onOpen(id) {
this.$axios.post("/platform/evaluate/common/info", { id }).then((res) => {
// 打开
onOpen(row) {
this.row = row
this.getInfo()
this.getDoneTasks()
},
// 获取申请信息
getInfo() {
this.$axios.post("/platform/evaluate/common/info", {id: this.row.id}).then((res) => {
if (res.code === 0) {
this.viewData = res.data
}
})
},
// 获取已办任务审批记录
getDoneTasks() {
this.$axios.post("/flow/common/doneTasks", {bizId: this.row.id}).then((res) => {
if (res.code === 0) {
this.doneTasks = res.data
}
})
},
// 查看流程图
openChart() {
this.$refs.snakerChartRef.onOpenFull(this.row.instanceProcessDefineId, this.row.instanceId)
}
}
}
@@ -7,7 +7,8 @@ layout("/layouts/platform.html"){
<el-card shadow="never">
<search @search="doSearch">
<search-item label="年度">
<el-date-picker v-model="pageForm.year" type="year" placeholder="选择年度" value-format="yyyy"></el-date-picker>
<el-date-picker v-model="pageForm.year" type="year" placeholder="选择年度"
value-format="yyyy"></el-date-picker>
</search-item>
</search>
</el-card>
@@ -22,23 +23,28 @@ layout("/layouts/platform.html"){
<el-table-column prop="unionName" label="分工会"></el-table-column>
<el-table-column prop="applyDateTime" label="申请时间"></el-table-column>
<el-table-column prop="honorName" label="类型" show-overflow-tooltip></el-table-column>
<el-table-column label="当前节点" prop="processInstanceNodeName" show-overflow-tooltip></el-table-column>
<el-table-column label="操作" width="300px">
<el-table-column prop="taskName" label="当前节点"></el-table-column>
<el-table-column prop="instanceState" label="流程状态">
<template v-slot="{row}">
<enum-tag :value="row.instanceState" name="ProcessInstanceStateEnum" label_key="message"
size="small"></enum-tag>
</template>
</el-table-column>
<el-table-column label="操作" fixed="right" width="300px">
<template slot-scope="{row}">
<el-button size="mini" type="primary" @click="openView(row)">查看</el-button>
<el-button v-if="[10,40,70].includes(row.processInstanceNodeCode)" size="mini" type="primary" @click="openEdit(row)">
<el-button @click="openView(row)" size="mini" type="primary">
查看
</el-button>
<el-button @click="openEdit(row)" size="mini" type="primary"
v-if="row.taskKey === 'startTask' || !row.instanceId">
编辑
</el-button>
<el-button
v-if="[20].includes(row.processInstanceNodeCode) && !row.nextTaskIsComplete"
size="mini"
type="danger"
@click="openRevoke(row)"
>
撤销
<el-button v-if="row.canRevoke" @click="onRevoke(row)" size="mini" type="danger">撤回
</el-button>
<el-button @click="doDelete(row.id)" size="mini" type="danger"
v-if="row.taskKey === 'startTask' || !row.instanceId">
删除
</el-button>
<!-- <el-button size="mini" type="primary" @click="exportApplyDocx(row.id)">导出</el-button>-->
<el-button v-if="[10].includes(row.processInstanceNodeCode)" size="mini" type="danger" @click="doDelete(row)">删除</el-button>
</template>
</el-table-column>
</el-table>
@@ -47,13 +53,15 @@ layout("/layouts/platform.html"){
<template #public>
<info ref="infoRef"></info>
</template>
<template #edit>
<apply_form ref="applyFormRef" @refresh="refresh"></apply_form>
</template>
</guava>
<apply_form ref="applyFormRef" @refresh="doSearch"></apply_form>
</div>
<script>
<!--#include('../apply/apply.js'){}#-->
<!--#include("../common/info.js"){}#-->
<!--#include("../apply/apply.js"){}#-->
new Vue({
el: "#app",
@@ -67,6 +75,38 @@ layout("/layouts/platform.html"){
return {}
},
methods: {
refresh() {
this.$refs.guava.index()
this.pageData()
},
onRevoke(row) {
this.$confirm("您确定要撤回吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.$axios.post("/flow/common/revokeTask", {taskId: row.startTaskId}).then((res) => {
if (res.code === 0) {
this.$message.success(res.msg)
this.pageData()
}
})
})
},
doDelete(id) {
this.$confirm("您确定要撤回吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.$axios.post("/platform/evaluate/mine/delete", {id}).then((res) => {
if (res.code === 0) {
this.$message.success(res.msg)
this.pageData()
}
})
})
},
openView(row) {
this.$refs.guava.public(() => {
this.$refs.infoRef.onOpen(row.id)
@@ -74,32 +114,10 @@ layout("/layouts/platform.html"){
})
},
openEdit(row) {
this.$refs.applyFormRef.onOpenEdit(row.id)
},
openRevoke(row) {
this.$confirm("您确定要撤销申请吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.$axios.post("/platform/evaluate/mine/revokeApply", { id: row.id }).then((resp) => {
this.$message.success(resp.msg)
this.doSearch()
})
this.$refs.guava.edit(() => {
this.$refs.applyFormRef.onOpenEdit(row)
})
},
async doDelete(row) {
const confirm = await this.$confirm("您确定要删除吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
})
if (confirm === "confirm") {
const resp = await this.$axios.post("/platform/evaluate/mine/delete", { id: row.id })
this.$message.success(resp.msg)
this.doSearch()
}
}
},
created() {
this.pageData()
@@ -9,11 +9,17 @@ layout("/layouts/platform.html"){
<search-item label="年度">
<el-date-picker v-model="pageForm.year" type="year" value-format="yyyy" placeholder="选择年度"></el-date-picker>
</search-item>
<search-item label="姓名:">
<el-input placeholder="请输入姓名查询" clearable v-model="pageForm.userName"></el-input>
</search-item>
<search-item label="工号:">
<el-input placeholder="请输入工号查询" clearable v-model="pageForm.loginName"></el-input>
<search-item label="申请人">
<el-input @keyup.enter.native="doSearch" clearable
placeholder="请输入内容"
v-model="pageForm.searchKeyword">
<el-select placeholder="查询类型" slot="prepend"
style="width: 100px;"
v-model="pageForm.searchName">
<el-option label="姓名" value="info.userName"></el-option>
<el-option label="工号" value="info.loginName"></el-option>
</el-select>
</el-input>
</search-item>
<search-item label="所属工会:">
<el-select v-model="pageForm.unionId" placeholder="请选择所属工会" filterable clearable style="width: 100%">
@@ -42,22 +48,21 @@ layout("/layouts/platform.html"){
<el-table-column prop="loginName" label="工号"></el-table-column>
<el-table-column prop="unitName" label="单位"></el-table-column>
<el-table-column prop="unionName" label="分工会"></el-table-column>
<el-table-column prop="applyDateTime" label="申请时间"></el-table-column>
<el-table-column prop="honorName" label="类型" show-overflow-tooltip></el-table-column>
<el-table-column label="当前节点" prop="processInstanceNodeName" show-overflow-tooltip></el-table-column>
<el-table-column label="操作" width="300px">
<el-table-column prop="applyDateTime" label="申请时间"></el-table-column>
<el-table-column prop="taskName" label="当前节点"></el-table-column>
<el-table-column prop="instanceState" label="流程状态">
<template v-slot="{row}">
<enum-tag :value="row.instanceState" name="ProcessInstanceStateEnum" label_key="message"
size="small"></enum-tag>
</template>
</el-table-column>
<el-table-column label="操作" fixed="right" width="300px">
<template slot-scope="{row}">
<el-button @click="openView(row)" size="mini" type="primary">查看</el-button>
<el-button v-if="row.processInstanceTaskStatus==='ACTIVE'" @click="openApproval(row)" size="mini" type="primary">
审核
<el-button v-if="row.taskState === 10" @click="openAudit(row)" size="mini" type="primary">审核
</el-button>
<el-button
v-if="row.processInstanceTaskStatus==='COMPLETE' && !row.nextTaskIsComplete"
@click="openRevoke(row.processInstanceTaskId)"
size="mini"
type="danger"
>
撤回
<el-button v-if="row.canRevoke" @click="onRevoke(row)" size="mini" type="danger">撤回
</el-button>
</template>
</el-table-column>
@@ -65,25 +70,32 @@ layout("/layouts/platform.html"){
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
<template #public>
<info ref="infoRef"></info>
<div v-if="showApprovalForm">
<div class="process-title">{{formData.processInstanceNodeName}}</div>
<el-form :model="formData" ref="approvalFormRef" label-position="left" label-width="80px">
<el-form-item label="审核意见" prop="approvalOpinion" :rules="[{required:true,message:'必填',trigger:['change','blur']}]">
<user-opinion-textarea v-model="formData.approvalOpinion"></user-opinion-textarea>
</el-form-item>
<el-form-item label="电子签名" prop="approvalSignature" :rules="[{required:false,message:'必填',trigger:['change','blur']}]">
<pc-signature v-model="formData.approvalSignature"></pc-signature>
</el-form-item>
</el-form>
<el-row type="flex" justify="end">
<el-button plain @click="$refs.guava.index()">取消</el-button>
<el-button type="danger" @click="doApproval('BACK')">退回重新申请</el-button>
<el-button type="danger" @click="doApproval('REJECT')">拒绝申请</el-button>
<el-button type="primary" @click="doApproval('PASS')">同意申请</el-button>
</el-row>
</div>
<template #edit>
<info ref="infoRef">
<div v-if="showApprovalForm">
<div class="process-title">
{{formData.taskName}}
</div>
<el-form :model="formData" ref="formRef" :rules="formRules" label-width="0" label-suffix=""
class="flow-task-form">
<el-form-item label="审批意见" prop="tf_opinion"
:rules="[{required:true,message:'必填',trigger:['change','blur']}]">
<user-opinion-textarea v-model="formData.tf_opinion"></user-opinion-textarea>
</el-form-item>
<!--:rules="[{required:true,message:'必填',trigger:['change','blur']}]"-->
<el-form-item label="签字" prop="tf_userSign"
>
<pc-signature v-model="formData.tf_userSign"></pc-signature>
</el-form-item>
</el-form>
<el-row type="flex" justify="end">
<el-button @click="$refs.guava.index()" size="small">取消</el-button>
<el-button @click="handleTaskAction(6)" size="small" type="info">退回到发起人</el-button>
<el-button @click="handleTaskAction(2)" size="small" type="danger">拒绝申请</el-button>
<el-button @click="handleTaskAction(1)" size="small" type="primary">同意申请</el-button>
</el-row>
</div>
</info>
</template>
</guava>
</div>
@@ -114,50 +126,58 @@ layout("/layouts/platform.html"){
},
methods: {
openView(row) {
this.$refs.guava.public(() => {
this.$refs.infoRef.onOpen(row.id)
this.$refs.guava.edit(() => {
this.$refs.infoRef.onOpen(row)
this.showApprovalForm = false
})
},
openApproval(row) {
this.$refs.guava.public(() => {
this.$refs.infoRef.onOpen(row.id)
this.formData = row.approvalParam
openAudit(row) {
this.$refs.guava.edit(() => {
this.$refs.infoRef.onOpen(row)
this.formData = {
processTaskId: row.taskId,
taskName: row.curTaskName
}
this.showApprovalForm = true
})
},
doApproval(approvalType) {
this.formData.bpmTaskApprovalType = approvalType
this.$refs.approvalFormRef.validate((valid) => {
handleTaskAction(val) {
this.$refs.formRef.validate((valid) => {
if (valid) {
this.$axios
.post(loc() + "/approval", {
approval: JSON.stringify(this.formData)
})
.then((res) => {
this.$confirm("您确定要提交吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.$axios.post("/flow/common/executeTask", {
data: JSON.stringify({
...this.formData,
submitType: val
})
}).then((res) => {
if (res.code === 0) {
this.$refs.guava.index()
this.$message.success(res.msg)
this.doSearch()
}
})
})
}
})
},
openRevoke(taskId) {
})},
onRevoke(row) {
this.$confirm("您确定要撤回吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "info"
}).then(() => {
this.$axios.post(loc() + "/revoke", { taskId }).then((res) => {
this.$axios.post("/flow/common/revokeTask", {taskId: row.taskId}).then((res) => {
if (res.code === 0) {
this.$message.success(res.msg)
this.doSearch()
}
})
})
}
},
},
async created() {
this.unitList = await this.$businessTool.listUnit()
@@ -8,30 +8,47 @@ layout("/layouts/platform.html"){
<search @search="doSearch">
<search-item label="年度:">
<el-date-picker
placeholder="选择年度"
type="year"
style="width: 100%"
v-model="pageForm.year"
value-format="yyyy"
placeholder="选择年度"
type="year"
style="width: 100%"
v-model="pageForm.year"
value-format="yyyy"
></el-date-picker>
</search-item>
<search-item label="姓名:">
<el-input placeholder="请输入姓名查询" clearable v-model="pageForm.userName"></el-input>
</search-item>
<search-item label="工号:">
<el-input placeholder="请输入工号查询" clearable v-model="pageForm.loginName"></el-input>
<search-item label="申请人">
<el-input @keyup.enter.native="doSearch" clearable
placeholder="请输入内容"
v-model="pageForm.searchKeyword">
<el-select placeholder="查询类型" slot="prepend"
style="width: 100px;"
v-model="pageForm.searchName">
<el-option label="姓名" value="info.userName"></el-option>
<el-option label="工号" value="info.loginName"></el-option>
</el-select>
</el-input>
</search-item>
<!-- <search-item label="名称:">-->
<!-- <el-input placeholder="请输入评优评先名称查询" clearable v-model="pageForm.evaluateName"></el-input>-->
<!-- </search-item>-->
<search-item label="评优评先事项:">
<el-select v-model="pageForm.evaluateId" placeholder="请选择评优评先事项" filterable clearable
style="width: 100%">
<el-option v-for="item in evaluateList" :key="item.id" :label="item.name"
:value="item.id"></el-option>
</el-select>
</search-item>
<search-item label="所属工会:">
<el-select v-model="pageForm.unionId" placeholder="请选择所属工会" filterable clearable style="width: 100%">
<el-option v-for="item in unionList" :key="item.id" :label="item.name" :value="item.id"></el-option>
<el-select v-model="pageForm.unionId" placeholder="请选择所属工会" filterable clearable
style="width: 100%">
<el-option v-for="item in unionList" :key="item.id" :label="item.name"
:value="item.id"></el-option>
</el-select>
</search-item>
<search-item label="所属单位:">
<el-select v-model="pageForm.unitId" placeholder="请选择所属单位" filterable clearable style="width: 100%">
<el-option v-for="item in unitList" :key="item.id" :label="item.name" :value="item.id"></el-option>
<el-select v-model="pageForm.unitId" placeholder="请选择所属单位" filterable clearable
style="width: 100%">
<el-option v-for="item in unitList" :key="item.id" :label="item.name"
:value="item.id"></el-option>
</el-select>
</search-item>
</search>
@@ -50,11 +67,11 @@ layout("/layouts/platform.html"){
<el-table-column prop="applyDateTime" label="申请时间"></el-table-column>
<el-table-column prop="honorName" label="类型" show-overflow-tooltip></el-table-column>
<!-- <el-table-column prop="honorTypeName" label="荣誉类型"></el-table-column>-->
<el-table-column prop="processInstanceNodeName" label="审核状态"></el-table-column>
<el-table-column label="操作" width="300px" fixed="right">
<template slot-scope="{row}">
<el-button size="mini" type="primary" @click="openView(row)">查看</el-button>
<el-button size="mini" type="danger" @click="doDelete(row)" v-if="$auth.hasPermission('evaluation.summary.delete')">
<el-button size="mini" type="danger" @click="doDelete(row)"
v-if="$auth.hasRoleOr(['SYSADMIN'])">
删除
</el-button>
<!--<el-button size="mini" type="primary" @click="">导出登记表</el-button>-->
@@ -63,7 +80,7 @@ layout("/layouts/platform.html"){
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
<template #public>
<template #view>
<info ref="infoRef"></info>
</template>
</guava>
@@ -79,13 +96,18 @@ layout("/layouts/platform.html"){
},
data() {
return {
pageForm: {
year: new Date().getFullYear() + "",
searchName: "info.userName"
},
unionList: [],
unitList: []
unitList: [],
evaluateList: [],
}
},
methods: {
openView(row) {
this.$refs.guava.public(() => {
this.$refs.guava.view(() => {
this.$refs.infoRef.onOpen(row.id)
})
},
@@ -99,15 +121,21 @@ layout("/layouts/platform.html"){
type: "warning"
})
if (confirm === "confirm") {
const resp = await this.$axios.post("/platform/evaluate/summary/delete", { id: row.id })
const resp = await this.$axios.post("/platform/evaluate/summary/delete", {id: row.id})
this.$message.success(resp.msg)
this.doSearch()
}
}
},
listEvaluate() {
this.$axios.get("/platform/evaluate/activity/listEvaluateActivityByYear", {year: this.pageForm.year}).then(resp => {
this.evaluateList = resp.data
})
},
},
async created() {
this.unitList = await this.$businessTool.listUnit()
this.unionList = await this.$businessTool.listUnion()
this.listEvaluate()
this.pageData()
}
})
@@ -37,8 +37,10 @@ layout("/layouts/platform.html"){
</el-select>
</search-item>
<search-item label="所属工会">
<el-select clearable filterable placeholder="所属工会" style="width: 100%" v-model="pageForm.unionId">
<el-option :key="item.id" :label="item.name" :value="item.id" v-for="item in unionOptions"></el-option>
<el-select clearable filterable placeholder="所属工会" style="width: 100%"
v-model="pageForm.unionId">
<el-option :key="item.id" :label="item.name" :value="item.id"
v-for="item in unionOptions"></el-option>
</el-select>
</search-item>
</search>
@@ -141,7 +143,10 @@ layout("/layouts/platform.html"){
cancelButtonText: '取消',
type: 'warning'
}).then(async () => {
const resp = await this.$axios.post('/platform/executiveCommittee/delegationOnePush/doDelete', {id: row.id})
const resp = await this.$axios.post('/platform/executiveCommittee/delegationOnePush/doDelete', {
id: row.id,
teacherMeetId: this.pageForm.teacherMeetId
})
if (resp.code === 0) {
this.doSearch()
this.$message.success(resp.msg)
@@ -183,6 +188,7 @@ layout("/layouts/platform.html"){
display: flex;
flex-direction: column;
}
.pushFormDialog .el-transfer-panel__list.is-filterable {
flex: 1;
}
@@ -12,6 +12,7 @@ const DELEGATION_ONE_PUSH_FORMAL_DIALOG = {
ref="transfer"
v-model="userValue"
:data="userData"
filter-placeholder="请按姓名模糊搜索"
:filter-method="filterMethod"
:props="{key: 'userId',label: 'name'}"
:right-default-checked="rightChecked"
@@ -15,8 +15,8 @@ layout("/layouts/platform.html"){
placeholder="查询"
style="width: 100px;"
>
<el-option label="工号" value="t1.loginName"></el-option>
<el-option label="姓名" value="t1.userName"></el-option>
<el-option label="工号" value="t2.loginName"></el-option>
<el-option label="姓名" value="t2.userName"></el-option>
</el-select>
</el-input>
</search-item>
@@ -37,8 +37,10 @@ layout("/layouts/platform.html"){
</el-select>
</search-item>
<search-item label="所属工会">
<el-select clearable filterable placeholder="所属工会" style="width: 100%" v-model="pageForm.unionId">
<el-option :key="item.id" :label="item.name" :value="item.id" v-for="item in unionOptions"></el-option>
<el-select clearable filterable placeholder="所属工会" style="width: 100%"
v-model="pageForm.unionId">
<el-option :key="item.id" :label="item.name" :value="item.id"
v-for="item in unionOptions"></el-option>
</el-select>
</search-item>
</search>
@@ -99,7 +101,7 @@ layout("/layouts/platform.html"){
return {
pageDataUrl: "/platform/executiveCommittee/delegationTwoPush/pageData",
pageForm: {
searchName: 't1.userName',
searchName: 't2.userName',
teacherMeetId: null,
unionId: null
},
@@ -141,7 +143,10 @@ layout("/layouts/platform.html"){
cancelButtonText: '取消',
type: 'warning'
}).then(async () => {
const resp = await this.$axios.post('/platform/executiveCommittee/delegationTwoPush/doDelete', {id: row.id})
const resp = await this.$axios.post('/platform/executiveCommittee/delegationTwoPush/doDelete', {
id: row.id,
teacherMeetId: this.pageForm.teacherMeetId
})
if (resp.code === 0) {
this.doSearch()
this.$message.success(resp.msg)
@@ -183,6 +188,7 @@ layout("/layouts/platform.html"){
display: flex;
flex-direction: column;
}
.pushFormDialog .el-transfer-panel__list.is-filterable {
flex: 1;
}
@@ -12,6 +12,7 @@ const DELEGATION_TWO_PUSH_FORMAL_DIALOG = {
ref="transfer"
v-model="userValue"
:data="userData"
filter-placeholder="请按姓名模糊搜索"
:filter-method="filterMethod"
:props="{key: 'userId',label: 'name'}"
:right-default-checked="rightChecked"
@@ -5,9 +5,22 @@ layout("/layouts/platform.html"){
<div id="app" v-cloak>
<guava ref="guava">
<el-card shadow="never">
<search @search="doSearch">
<search @search="fetchConfig">
<search-item label="教代会届次">
<el-select
v-model="pageForm.sessionId"
filterable
placeholder="请选择教代会"
style="width:100%;"
@change="fetchConfig"
>
<el-option
v-for="item in teacherMeets"
:key="item.id"
:label="item.fullName"
:value="item.id"
></el-option>
</el-select>
</search-item>
</search>
</el-card>
@@ -18,14 +31,15 @@ layout("/layouts/platform.html"){
<el-input-number v-model="formData.prepareGroupQuotaCount" placeholder="请填写筹备组推荐名额数"
style="width: 100%"></el-input-number>
</el-form-item>
<el-form-item prop="committeeQuotaCount" label="委员会预选人数">
<el-input-number v-model="formData.committeeQuotaCount"
placeholder="请填写委员会预选人数" style="width: 100%"></el-input-number>
</el-form-item>
<el-form-item prop="delegationQuotaCount" label="代表团推荐总数">
<el-input-number v-model="formData.delegationQuotaCount"
placeholder="请填写代表团推荐名额总数" style="width: 100%"></el-input-number>
</el-form-item>
<el-form-item prop="committeeQuotaCount" label="委员会预选人数">
<el-input-number v-model="formData.committeeQuotaCount"
placeholder="请填写委员会预选人数" style="width: 100%"></el-input-number>
</el-form-item>
<el-form-item prop="firstTime" label="第一次预选时间">
<el-date-picker
v-model="formData.firstTime"
@@ -94,7 +108,7 @@ layout("/layouts/platform.html"){
mixins: [initTableMixins],
data() {
return {
openJdhList:[],
teacherMeets:[],
pageForm: {
sessionId: ''
},
@@ -123,14 +137,15 @@ layout("/layouts/platform.html"){
getAllJdh() {
this.$axios.post("/platform/teacherCongress/common/listSession", {}).then(resp => {
if (resp.code === 0) {
this.openJdhList = resp.data
if (this.openJdhList.length > 0) {
this.pageForm.sessionId = this.openJdhList[0].id
this.teacherMeets = resp.data
if (this.teacherMeets && this.teacherMeets.length > 0) {
this.$set(this.pageForm, 'sessionId', this.teacherMeets[0].id)
this.fetchConfig()
}
}
})
},
onHandle() {
this.$refs['form'].validate(async (valid) => {
if (valid) {
@@ -14,8 +14,8 @@ layout("/layouts/platform.html"){
placeholder="查询"
style="width: 100px;"
>
<el-option label="工号" value="t1.loginName"></el-option>
<el-option label="姓名" value="t1.userName"></el-option>
<el-option label="工号" value="op.loginName"></el-option>
<el-option label="姓名" value="op.userName"></el-option>
</el-select>
</el-input>
</search-item>
@@ -130,7 +130,7 @@ layout("/layouts/platform.html"){
return {
pageDataUrl: "/platform/executiveCommittee/executiveCommitteeMember/pageData",
pageForm: {
searchName: 't1.userName',
searchName: 'op.userName',
},
teacherMeets: [],
unionOptions: [],
@@ -156,7 +156,10 @@ layout("/layouts/platform.html"){
cancelButtonText: '取消',
type: 'warning'
}).then(async () => {
const resp = await this.$axios.post('/platform/executiveCommittee/delegationOnePush/doDelete', {id: row.id})
const resp = await this.$axios.post('/platform/executiveCommittee/preparatoryGroupPush/doDelete', {
id: row.id,
teacherMeetId: this.pageForm.teacherMeetId
})
if (resp.code === 0) {
this.doSearch()
this.$message.success(resp.msg)
@@ -197,6 +200,7 @@ layout("/layouts/platform.html"){
display: flex;
flex-direction: column;
}
.pushFormDialog .el-transfer-panel__list.is-filterable {
flex: 1;
}
@@ -12,6 +12,7 @@ const PUSH_FORMAL_DIALOG = {
ref="transfer"
v-model="userValue"
:data="userData"
filter-placeholder="请按姓名模糊搜索"
:filter-method="filterMethod"
:props="{key: 'userId',label: 'name'}"
:right-default-checked="rightChecked"
@@ -82,6 +82,18 @@ layout("/layouts/platform.html"){
</el-input>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="子女出生年月">
<el-form-item prop="childrenBirthday"
:rules="[{required:true,message:'必填',trigger:['change','blur']}]">
<el-date-picker
v-model="formData.childrenBirthday"
type="date"
placeholder="请选择子女出生年月"
style="width: 100%;"
value-format="yyyy-MM-dd">
</el-date-picker>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="现就读学校">
<el-form-item prop="childrenCurrentSchool"
@@ -111,6 +123,8 @@ layout("/layouts/platform.html"){
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="备注">
<el-form-item prop="note"
:rules="[{required:true,message:'必填',trigger:['change','blur']}]">
@@ -118,7 +132,6 @@ layout("/layouts/platform.html"){
maxlength="50"></el-input>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item></el-descriptions-item>
<el-descriptions-item label="户口簿照片" :span="2">
<el-form-item prop="huKouFiles"
:rules="[{required:true,message:'必填',trigger:['change','blur']}]">
@@ -171,8 +184,50 @@ layout("/layouts/platform.html"){
}
})
},
validateBirthday() {
if (!this.formData.registrationType) {
return "请选择登记类型"
}
if (!this.formData.childrenBirthday) {
return "请选择子女出生年月"
}
const childrenBirthday = new Date(this.formData.childrenBirthday);
if (isNaN(childrenBirthday.getTime())) {
return "出生日期格式无效";
}
const registrationType = this.registrationTypeOption.find(item => item.registrationType === this.formData.registrationType)
if (registrationType.greaterThanBirthday) {
const greaterThanBirthday = new Date(registrationType.greaterThanBirthday);
if (isNaN(greaterThanBirthday.getTime())) {
return "限制日期格式无效";
}
if (childrenBirthday < greaterThanBirthday) {
return "出生日期不能小于" + registrationType.greaterThanBirthday;
}
}
if (registrationType.lessThanBirthday) {
const lessThanBirthday = new Date(registrationType.lessThanBirthday);
if (isNaN(lessThanBirthday.getTime())) {
return "限制日期格式无效";
}
if (childrenBirthday > lessThanBirthday) {
return "出生日期不能大于" + registrationType.lessThanBirthday;
}
}
return null; // 表示通过
},
// 保存
onSave() {
const msg = this.validateBirthday()
if ( msg){
this.$message.warning(msg)
return
}
this.getIsRepeatByIdCard().then(flag => {
if (flag) {
@@ -194,6 +249,11 @@ layout("/layouts/platform.html"){
},
// 提交
onSubmit() {
const msg = this.validateBirthday()
if ( msg){
this.$message.warning(msg)
return
}
this.getIsRepeatByIdCard().then(flag => {
if (flag) {
@@ -218,6 +278,11 @@ layout("/layouts/platform.html"){
},
onFinishTask() {
const msg = this.validateBirthday()
if ( msg){
this.$message.warning(msg)
return
}
this.getIsRepeatByIdCard().then(flag => {
if (flag) {
@@ -227,11 +292,9 @@ layout("/layouts/platform.html"){
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.$axios.post('/flow/common/executeTask', {
data: JSON.stringify({
processTaskId: GetQueryString("taskId"),
submitType: 5
})
this.$axios.post('/platform/enrollmentRegistration/apply/submitAgain', {
data: JSON.stringify(this.formData),
taskId: GetQueryString("taskId")
}).then(res => {
if (res.code === 0) {
this.$message.success("提交成功")
@@ -243,7 +306,7 @@ layout("/layouts/platform.html"){
})
},
async getIsRepeatByIdCard() {
if (!this.formData.childrenIdCard){
if (!this.formData.childrenIdCard) {
this.$message.error("请填写子女身份证号码")
return
}
@@ -273,11 +336,16 @@ layout("/layouts/platform.html"){
this.formData = data
})
} else {
const {id, username, loginname, mobile, union, unit} = this.$store.state.user
this.formData = {
userName: this.$store.state.user.username,
loginName: this.$store.state.user.loginname,
unitName: this.$store.state.user.unit.name,
mobile: this.$store.state.user.mobile,
userId: id,
userName: username,
loginName: loginname,
unitName: unit.name,
unitId: unit.id,
unionName: union.name,
unionId: union.id,
mobile: mobile,
}
}
@@ -62,10 +62,15 @@ layout("/layouts/platform.html"){
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
<template #view>
<enrollment-registration-info ref="enrollmentRegistrationInfo">
</enrollment-registration-info>
</template>
</guava>
</div>
<script>
<!--#include('../info.js'){}#-->
new Vue({
el: "#app",
store,
@@ -79,9 +84,14 @@ layout("/layouts/platform.html"){
}
}
},
components: {},
components: {
"enrollment-registration-info": ENROLLMENT_REGISTRATION_INFO
},
methods: {
openView(row) {
this.$refs.guava.view(() => {
this.$refs.enrollmentRegistrationInfo.onOpen(row)
})
},
openEdit(row) {
window.location.href = '/platform/enrollmentRegistration/apply/index?taskId=' + (row.startTaskId || '') + "&bizId=" + row.id
@@ -101,6 +111,18 @@ layout("/layouts/platform.html"){
})
},
doDelete(id) {
this.$confirm("您确定要删除吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.$axios.post("/platform/enrollmentRegistration/applyList/doDelete", {id: id}).then((res) => {
if (res.code === 0) {
this.$message.success(res.msg)
this.pageData()
}
})
})
}
},
async created() {
@@ -28,6 +28,9 @@ const ENROLLMENT_REGISTRATION_INFO = {
<el-descriptions-item label="身份证号">
{{viewData.childrenIdCard}}
</el-descriptions-item>
<el-descriptions-item label="子女出生日期" >
{{viewData.childrenBirthday}}
</el-descriptions-item>
<el-descriptions-item label="现就读学校">
{{viewData.childrenCurrentSchool}}
</el-descriptions-item>
@@ -38,10 +41,10 @@ const ENROLLMENT_REGISTRATION_INFO = {
<el-descriptions-item label="子女户口所在地">
{{viewData.childrenHuKouAddress}}
</el-descriptions-item>
<el-descriptions-item label="备注" :span="2">
{{viewData.note}}
</el-descriptions-item>
<el-descriptions-item></el-descriptions-item>
<el-descriptions-item :span="3" label="户口簿照片">
<file-preview :files="viewData.huKouFiles" complete_result></file-preview>
</el-descriptions-item>
@@ -53,7 +53,7 @@ layout("/layouts/platform.html"){
</guava>
<el-dialog :visible.sync="dialogVisible" title="创建计划" width="40%">
<el-form :model="formData" :rules="formRules" ref="formRef" label-width="150px">
<el-form :model="formData" :rules="formRules" ref="formRef" label-width="170px">
<el-row :gutter="10">
<el-col :span="12">
<el-form-item
@@ -312,11 +312,9 @@ layout("/layouts/platform.html"){
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.$axios.post('/flow/common/executeTask', {
data: JSON.stringify({
processTaskId: GetQueryString("taskId"),
submitType: 5
})
this.$axios.post('/platform/activity/budget/apply/submitAgain', {
data: JSON.stringify(this.formData),
taskId: GetQueryString("taskId")
}).then(res => {
if (res.code === 0) {
this.$message.success("提交成功")
@@ -223,7 +223,7 @@ layout("/layouts/platform.html"){
async created() {
this.budgetTypeOption = await this.$businessTool.getDictOptions("ACTIVITY_BUDGET_TYPE")
this.budgetTypeOption.unshift({name: "全部类型", code: ""})
// this.clubOption = await getClubsByRole()
this.clubOption = await this.$businessTool.listCLubByRole()
this.unionList = await this.$businessTool.listUnion()
this.getApplyMoney()
this.pageData()
@@ -1,110 +0,0 @@
<div id="suggestion-box-view">
<el-descriptions :column="3" border>
<el-descriptions-item label="申报人">{{viewData.userName}}</el-descriptions-item>
<el-descriptions-item label="工号">{{viewData.loginName}}</el-descriptions-item>
<el-descriptions-item label="联系方式">{{viewData.mobile}}</el-descriptions-item>
<el-descriptions-item label="预算类型">
<dict-tag :options="budgetTypeOption"
:value="viewData.outlayManageSource"></dict-tag>
</el-descriptions-item>
<el-descriptions-item label="申报(承办)单位">{{viewData.helpUnitName}}</el-descriptions-item>
<el-descriptions-item label="活动项目">{{viewData.activityMatter}}</el-descriptions-item>
<el-descriptions-item label="活动时间">{{viewData.activityDate}}</el-descriptions-item>
<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 :span="2"></el-descriptions-item>
<el-descriptions-item label="活动内容(如训练、装备等)" :span="3">
<div v-html="viewData.activityContent"></div>
</el-descriptions-item>
</el-descriptions>
<template v-for="task in doneTasks">
<div class="task-panel mt10">
<div class="task-panel-header">{{ task.displayName }}</div>
<el-descriptions border class="flow-task-form" :column="3" :key="task.id" v-if="task.ext.isFirstTaskNode">
<el-descriptions-item label="申请用户">{{ task.ext.initiatorName }}({{task.ext.initiatorAccount}})
</el-descriptions-item>
<el-descriptions-item label="申请时间">{{ task.finishTime }}</el-descriptions-item>
<el-descriptions-item label="办理结果">
<dict-tag :options="dict.type.PROCESS_TASK_SUBMIT_TYPE" :value="task.ext.submitType"></dict-tag>
</el-descriptions-item>
</el-descriptions>
<el-descriptions border class="flow-task-form" :column="3" :key="task.id" v-else>
<el-descriptions-item label="办理用户">{{ task.taskFormData.userName
}}({{task.taskFormData.loginName}})
</el-descriptions-item>
<el-descriptions-item label="办理时间">{{ task.finishTime }}</el-descriptions-item>
<el-descriptions-item label="办理结果">
<dict-tag :options="dict.type.PROCESS_TASK_SUBMIT_TYPE" :value="task.ext.submitType"></dict-tag>
</el-descriptions-item>
<el-descriptions-item label="审核金额">
{{task.ext.tf_totalBudgetMoney}}
</el-descriptions-item>
<el-descriptions-item :span="2"></el-descriptions-item>
<el-descriptions-item label="办理意见" v-if="!task.ext.isFirstTaskNode">{{ task.taskFormData.opinion
}}
</el-descriptions-item>
</el-descriptions>
</div>
</template>
</div>
<script>
new Vue({
el: "#suggestion-box-view",
store,
dicts: ["PROCESS_TASK_SUBMIT_TYPE"],
data() {
return {
businessId: GetQueryString("businessId"),
instanceId: GetQueryString("instanceId"),
viewData: {},
doneTasks: [],
budgetTypeOption: []
}
},
methods: {
info() {
this.$axios.post("/platform/activity/budget/applyList/findOne", {id: this.businessId}).then((res) => {
if (res.code === 0) {
this.viewData = res.data
}
})
},
getDoneTasks() {
this.$axios.post("/flow/common/doneTasks", {instanceId: this.instanceId}).then((res) => {
if (res.code === 0) {
this.doneTasks = res.data
}
})
}
},
created() {
this.$businessTool.getDictOptions("ACTIVITY_BUDGET_TYPE").then(resp => {
this.budgetTypeOption = resp
})
this.info()
this.getDoneTasks()
}
})
</script>
<style>
.task-panel {
background: white;
border-radius: 4px;
overflow: hidden;
}
.task-panel-header {
background: rgb(250, 250, 250);
border: 1px solid rgb(228, 231, 237);
border-bottom: none;
padding: 12px 16px;
display: flex;
justify-content: space-between;
align-items: center;
}
</style>
@@ -0,0 +1,182 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
</style>
<div class="platform" id="app" v-cloak>
<guava ref="guava">
<template>
<el-card shadow="never">
<search @search="doSearch">
<search-item label="年度">
<el-date-picker
@change="doSearch"
placeholder="选择年度"
style="width: 100%" type="year"
v-model="pageForm.year"
:clearable="false"
value-format="yyyy">
</el-date-picker>
</search-item>
</search>
</el-card>
<el-card shadow="never" class="mt10">
<table-tool label="预算分配">
<template v-if="pageForm.year===$moment().format('YYYY')">
<el-button @click="issuedOutlay" size="small" type="primary" v-if="!isAllocation">年度分配
</el-button>
<el-button type="danger" size="small" @click="resetOutlay" v-else>
分配重置
</el-button>
</template>
</table-tool>
<el-table :data="tableData" style="width: 100%" row-key="id"
v-loading="tableLoading" :size="tableSize" class="vi-table">
<el-table-column align="center" header-align="center" type="index"
:index="indexMethod" label="序号"
width="80px"></el-table-column>
<el-table-column
show-overflow-tooltip
align="center"
header-align="center"
v-for="column in tableColumns"
:label="column.label"
:prop="column.prop"
:sortable="column.sortable"
:width="column.width"
min-width="50"
>
<template v-if="column.prop=='totalQuota'" v-slot="{row}">
<el-input v-if="row.edit" maxlength="8" min="0" type="number"
style="width: 70%"
size="small"
onKeypress="return (/[\d]/.test(String.fromCharCode(event.keyCode)))"
v-model="row.totalQuota2" placeholder="填写总额度">
<template slot="append"></template>
</el-input>
<div v-else>
<span v-if="!row.totalQuota">暂未分配</span>
<span v-else><i>{{row.totalQuota}}</i></span>
</div>
</template>
</el-table-column>
<el-table-column align="center" header-align="center" label="操作"
fixed="right" width="200">
<template slot-scope="{row}">
<div v-if="row.edit">
<el-button type="success" icon="el-icon-check" size="mini"
@click="doSubmit(row)"
circle></el-button>
<el-button type="danger" icon="el-icon-close" size="mini"
@click="$set(row,'edit',false)"
circle></el-button>
</div>
<el-button v-else size="mini" type="primary"
@click="$set(row,'edit',true);$set(row,'totalQuota2',row.totalQuota);">
编辑
</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</template>
</guava>
</div>
<script>
const vue = new Vue({
el: '#app',
store,
mixins: [initTableMixins],
data() {
return {
tableColumns: [
{prop: 'year', label: '年度'},
{prop: 'clubName', label: '协会名称'},
{prop: 'totalQuota', label: '预算费用'},
],
pageForm: {
year: this.$moment().format("YYYY")
},
isAllocation: false
}
},
components: {},
methods: {
doSubmit(row) {
this.$confirm('您确定要提交此条记录吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
this.$axios.post("/platform/outlay/outlayManage/clubManage/doSubmit", {
id: row.id,
totalQuota: row.totalQuota2
}).then((resp) => {
if (resp.code === 0) {
row.edit = false
this.doSearch()
this.$message.success("编辑成功");
}
})
})
},
resetOutlay() {
this.$confirm('您确定要重置今年的记录吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
this.$axios.post("/platform/outlay/outlayManage/clubManage/resetOutlay", {
year: this.pageForm.year
}).then((resp) => {
if (resp.code === 0) {
this.doSearch()
this.getIsAllocation()
this.$message.success("操作成功");
}
})
})
},
issuedOutlay() {
this.$confirm('您确定要下发今年的记录吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
this.$axios.post("/platform/outlay/outlayManage/clubManage/issuedOutlay", {
year: this.pageForm.year
}).then((resp) => {
if (resp.code === 0) {
this.doSearch()
this.getIsAllocation()
this.$message.success("操作成功");
}
})
})
},
getIsAllocation() {
this.$axios.post("/platform/outlay/outlayManage/clubManage/getIsAllocationOutlay", {
year: this.pageForm.year
}).then((resp) => {
if (resp.code === 0) {
this.isAllocation = (resp.data > 0)
}
})
}
},
async created() {
this.getIsAllocation()
this.pageData()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,101 @@
<!--#include("../../common/editDetailDialog.js"){}#-->
let OUTLAY_MANAGE_CLUB_USE_DETAIL_INFO = {
/*language=HTML*/
template: `
<div>
<template>
<table-tool label="预算详情列表"></table-tool>
<el-table :data="tableData" style="width: 100%" row-key="id"
v-loading="tableLoading" :size="tableSize" class="vi-table">
<el-table-column align="center" header-align="center" type="index"
:index="indexMethod" label="序号"
width="80px"></el-table-column>
<el-table-column label="活动名称" prop="projectName" header-align="center"
align="center"></el-table-column>
<el-table-column label="活动时间" prop="activityTime"
header-align="center"
align="center"></el-table-column>
<el-table-column label="活动人数" prop="activityNumber"
header-align="center"
align="center"></el-table-column>
<el-table-column label="活动费用" prop="adjustMoney"
header-align="center"
align="center"></el-table-column>
<el-table-column label="审核人" prop="adjustUserName" header-align="center"
align="center"></el-table-column>
<el-table-column label="事由" prop="adjustReason" header-align="center"
show-overflow-tooltip
align="center"></el-table-column>
<el-table-column align="center" header-align="center" label="操作"
fixed="right" width="200">
<template slot-scope="{row}">
<el-button size="mini" type="primary" @click="openEdit(row)"
:disabled="!['superadmin'].includes($store.state.user.loginname)"
>编辑
</el-button>
<el-button size="mini" type="danger" @click="doDelete(row)"
:disabled="!['superadmin'].includes($store.state.user.loginname)"
>删除
</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</template>
<template>
<outlay-manage-edit-detail-dialog ref="editDetailDialog" @search="search"></outlay-manage-edit-detail-dialog>
</template>
</div>
`,
store,
mixins: [initTableMixins],
data() {
return {
rowData: {},
}
},
components: {
'outlay-manage-edit-detail-dialog': OUTLAY_MANAGE_EDIT_DETAIL_DIALOG
},
methods: {
search(){
this.doSearch()
this.$emit("search")
},
openEdit(row) {
this.$refs.editDetailDialog.open(row,"/platform/outlay/outlayManage/clubUseDetail/doEditDetail")
},
doDelete(row) {
this.$confirm("确定要删除该详情吗?", "提示", {type: "warning"}).then(async () => {
this.$set(row, "loading", true)
const resp = await this.$axios.post("/platform/outlay/outlayManage/clubUseDetail/doDeleteDetail", {id: row.id})
if (resp.code === 0) {
this.doSearch()
this.$emit("search")
this.$message.success(resp.msg)
} else {
this.$message.error(resp.msg)
}
})
},
pageData() {
this.$axios.post("/platform/outlay/outlayManage/clubUseDetail/detailInfo", this.pageForm).then((resp) => {
this.tableLoading = false
if (resp.code === 0) {
this.tableData = resp.data.list
this.pageForm.totalCount = resp.data.totalCount
}
})
},
open(row) {
this.tableLoading = true
this.rowData = row
this.pageForm.outlayManageId = row.id
this.pageData()
}
}
}
@@ -0,0 +1,125 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
</style>
<div class="platform" id="app" v-cloak>
<guava ref="guava">
<template>
<el-card shadow="never">
<search @search="doSearch">
<search-item label="年度">
<el-date-picker
@change="doSearch"
placeholder="选择年度"
style="width: 100%" type="year"
v-model="pageForm.year"
:clearable="false"
value-format="yyyy">
</el-date-picker>
</search-item>
<search-item label="所属协会" v-if="$auth.hasRoleOr(['SYSADMIN', 'SCHOOL_UNION_ADMIN'])">
<el-select clearable
placeholder="请选择协会"
style="width: 100%;" v-model="pageForm.clubId">
<el-option
:key="item.id"
:label="item.clubName"
:value="item.id"
v-for="item in clubOption">
</el-option>
</el-select>
</search-item>
</search>
</el-card>
<el-card shadow="never" class="mt10">
<table-tool label="预算使用情况">
</table-tool>
<el-table :data="tableData" style="width: 100%" row-key="id"
v-loading="tableLoading" :size="tableSize" class="vi-table">
<el-table-column align="center" header-align="center" type="index"
:index="indexMethod" label="序号"
width="80px"></el-table-column>
<el-table-column
show-overflow-tooltip
align="center"
header-align="center"
v-for="column in tableColumns"
:label="column.label"
:prop="column.prop"
:sortable="column.sortable"
:width="column.width"
min-width="50"
>
<template v-slot="{row}" v-if="column.prop=='surplusQuota'">
<span v-if="!row.totalQuota">{{row.totalQuota}}元</span>
<span v-else>{{(row.totalQuota-row.usedQuota).toFixed(2)}}</span>
</template>
</el-table-column>
<el-table-column align="center" header-align="center" label="操作"
fixed="right" width="150">
<template slot-scope="{row}">
<el-button size="mini" type="primary" @click="openView(row)">使用详情</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</template>
<template #view>
<outlay-manage-club-use-detail-info ref="detailInfo" @search="doSearch"></outlay-manage-club-use-detail-info>
</template>
</guava>
</div>
<script>
<!--#include("detailInfo.js"){}#-->
const vue = new Vue({
el: '#app',
store,
mixins: [initTableMixins],
data() {
return {
tableColumns: [
{prop: 'year', label: '年度'},
{prop: 'clubName', label: '协会名称'},
{prop: 'clubCode', label: '协会编码'},
{prop: 'totalQuota', label: '分配总额度(元)'},
{prop: 'usedQuota', label: '已使用额度(元)'},
{prop: 'surplusQuota', label: '剩余额度(元)'},
],
pageForm: {
year: this.$moment().format("YYYY")
},
clubOption: []
}
},
components: {
"outlay-manage-club-use-detail-info": OUTLAY_MANAGE_CLUB_USE_DETAIL_INFO
},
methods: {
openView(row) {
this.$refs.guava.view(() => {
this.$refs.detailInfo.open(row)
})
},
},
async created() {
this.clubOption = await this.$businessTool.listCLubByRole()
this.pageData()
}
})
</script>
<!--#
}
#-->
@@ -30,14 +30,15 @@ layout("/layouts/platform.html"){
v-if="['ACTIVITY_BUDGET_TYPE_THREE'].includes(formData.outlayManageSource)">
<el-form-item label="所属协会" prop="clubId"
:rules="[{required:true,message:'必填',trigger:['change','blur']}]">
<el-select v-model="formData.clubId" @change="getBudgetMoneyOrActivity"
style="width: 100%"
placeholder="请选择所属协会">
<el-select clearable
placeholder="请选择协会"
style="width: 100%;" v-model="formData.clubId"
@change="getBudgetMoneyOrActivity();clubChange()">
<el-option
v-for="item in clubList"
:key="item.clubid"
:key="item.id"
:label="item.clubName"
:value="item.clubid">
:value="item.id"
v-for="item in clubOption">
</el-option>
</el-select>
</el-form-item>
@@ -115,9 +116,8 @@ layout("/layouts/platform.html"){
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="签字" :span="2">
<!-- :rules="[{required:true,message:'必填',trigger:['change','blur']}]"-->
<el-form-item label="签字" prop="userSign"
>
<!-- :rules="[{required:true,message:'必填',trigger:['change','blur']}]"-->
<el-form-item label="签字" prop="userSign">
<pc-signature v-model="formData.userSign"></pc-signature>
</el-form-item>
</el-descriptions-item>
@@ -142,7 +142,7 @@ layout("/layouts/platform.html"){
taskId: GetQueryString("taskId"),
formData: {},
budgetTypeOption: [],
clubList: [],
clubOption: [],
activityList: [],
moneyPlaceholder: "请输入金额",
budgetMoney: 0,
@@ -198,11 +198,9 @@ layout("/layouts/platform.html"){
}).then(() => {
this.$axios.post("/platform/outlay/reimburse/apply/bxAddValidate", this.formData).then(res => {
if (res.code === 0) {
this.$axios.post('/flow/common/executeTask', {
data: JSON.stringify({
processTaskId: GetQueryString("taskId"),
submitType: 5
})
this.$axios.post('/platform/outlay/reimburse/apply/submitAgain', {
data: JSON.stringify(this.formData),
taskId: GetQueryString("taskId")
}).then(res => {
if (res.code === 0) {
this.$message.success("提交成功")
@@ -219,6 +217,8 @@ layout("/layouts/platform.html"){
return
}
this.$set(this.formData, "budgetId", null)
this.$set(this.formData, "clubId", null)
this.$set(this.formData, "clubName", null)
await this.getBudgetMoneyOrActivity()
if (val === "ACTIVITY_BUDGET_TYPE_TWO") {
this.$set(this.formData, "unionId", this.$store.state.user.union.id)
@@ -340,17 +340,31 @@ layout("/layouts/platform.html"){
}
})
} else {
const {id, username, loginname, mobile, union, unit} = this.$store.state.user
this.formData = {
userName: this.$store.state.user.username,
loginName: this.$store.state.user.loginname,
mobile: this.$store.state.user.mobile,
userId: id,
userName: username,
loginName: loginname,
unitName: unit.name,
unitId: unit.id,
unionName: union.name,
unionId: union.id,
mobile: mobile,
}
}
},
clubChange() {
if (this.formData.clubId) {
const club = this.clubOption.find(v => v.id === this.formData.clubId)
this.$set(this.formData, 'clubName', club.clubName)
} else {
this.$set(this.formData, 'clubName', null)
}
}
},
async created() {
this.init()
this.clubOption = await this.$businessTool.listCLubByRole()
}
})
</script>
@@ -0,0 +1,199 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app">
<guava ref="guava">
<el-card shadow="never">
<search @search="doSearch">
<search-item label="年度">
<el-date-picker
@change="doSearch"
placeholder="选择年"
style="width: 100%"
type="year"
v-model="pageForm.year"
value-format="yyyy">
</el-date-picker>
</search-item>
<search-item label="经办人">
<el-input @keyup.enter.native="doSearch" clearable
placeholder="请输入内容"
v-model="pageForm.searchKeyword">
<el-select placeholder="查询类型" slot="prepend"
style="width: 100px;"
v-model="pageForm.searchName">
<el-option label="姓名" value="info.userName"></el-option>
<el-option label="工号" value="info.loginName"></el-option>
</el-select>
</el-input>
</search-item>
</search>
</el-card>
<el-card shadow="never">
<table-tool label="申请列表">
<el-radio-group v-model="pageForm.approval" size="small" @change="doSearch">
<el-radio-button :label="true">已审核</el-radio-button>
<el-radio-button :label="false">未审核</el-radio-button>
</el-radio-group>
</table-tool>
<el-table :data="tableData" @sort-change="pageOrder" style="width: 100%">
<el-table-column type="index" width="50px" label="序号" :index="indexMethod"></el-table-column>
<el-table-column prop="loginName" label="经办人工号"></el-table-column>
<el-table-column prop="userName" label="姓名"></el-table-column>
<el-table-column prop="outlayManageSource" label="活动类型">
<template v-slot="{row}">
<dict-tag :options="budgetTypeOption"
:value="row.outlayManageSource"></dict-tag>
</template>
</el-table-column>
<el-table-column prop="activityMatter" label="活动事项"></el-table-column>
<el-table-column prop="helpUnitName" label="申报单位">
<template v-slot="{row}">
<span v-if="['ACTIVITY_BUDGET_TYPE_ONE'].includes(row.outlayManageSource)">校工会</span>
<span v-if="['ACTIVITY_BUDGET_TYPE_TWO'].includes(row.outlayManageSource)">{{row.unionName}}</span>
<span v-if="['ACTIVITY_BUDGET_TYPE_THREE','ACTIVITY_BUDGET_TYPE_FOUR'].includes(row.outlayManageSource)">{{row.clubName}}</span>
</template>
</el-table-column>
<el-table-column prop="money" label="金额"></el-table-column>
<el-table-column prop="applyTime" label="申报时间"></el-table-column>
<el-table-column prop="taskName" label="当前节点"></el-table-column>
<el-table-column prop="instanceState" label="流程状态">
<template v-slot="{row}">
<enum-tag :value="row.instanceState" name="ProcessInstanceStateEnum" label_key="message"
size="small"></enum-tag>
</template>
</el-table-column>
<el-table-column label="操作" fixed="right" width="300px">
<template slot-scope="{row}">
<el-button @click="openView(row)" size="mini" type="primary">查看</el-button>
<el-button v-if="row.taskState === 10" @click="openAudit(row)" size="mini" type="primary">审核
</el-button>
<el-button v-if="row.canRevoke" @click="onRevoke(row)" size="mini" type="danger">撤回
</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
<template #edit>
<outlay-reimburse-info ref="outlayReimburseInfo">
<div v-if="showApprovalForm">
<div class="process-title">
{{formData.taskName}}
</div>
<el-form :model="formData" ref="formRef" :rules="formRules" label-width="0" label-suffix=""
class="flow-task-form">
<el-form-item label="审批意见" prop="tf_opinion"
:rules="[{required:true,message:'必填',trigger:['change','blur']}]">
<user-opinion-textarea v-model="formData.tf_opinion"></user-opinion-textarea>
</el-form-item>
<!--:rules="[{required:true,message:'必填',trigger:['change','blur']}]"-->
<el-form-item label="签字" prop="tf_userSign"
>
<pc-signature v-model="formData.tf_userSign"></pc-signature>
</el-form-item>
</el-form>
<el-row type="flex" justify="end">
<el-button @click="$refs.guava.index()" size="small">取消</el-button>
<el-button @click="handleTaskAction(6)" size="small" type="info">退回到发起人</el-button>
<el-button @click="handleTaskAction(2)" size="small" type="danger">拒绝申请</el-button>
<el-button @click="handleTaskAction(1)" size="small" type="primary">同意申请</el-button>
</el-row>
</div>
</outlay-reimburse-info>
</template>
</guava>
</div>
<script>
<!--#include('../info.js'){}#-->
new Vue({
el: "#app",
store,
mixins: [initTableMixins],
data() {
return {
pageDataUrl: "/platform/outlay/reimburse/clubAudit/pageData",
budgetTypeOption: [],
unionOptions: [],
pageForm: {
year: moment().format("YYYY"),
approval: false,
searchName: "info.userName",
},
showApprovalForm: false
}
},
components: {
"outlay-reimburse-info": OUTLAY_REIMBURSE_INFO
},
methods: {
openView(row) {
this.$refs.guava.edit(() => {
this.showApprovalForm = false
this.$refs.outlayReimburseInfo.onOpen(row)
})
},
handleTaskAction(val) {
this.$refs.formRef.validate((valid) => {
if (valid) {
this.$confirm("您确定要提交吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.$axios.post("/flow/common/executeTask", {
data: JSON.stringify({
...this.formData,
submitType: val
})
}).then((res) => {
if (res.code === 0) {
this.$refs.guava.index()
this.$message.success(res.msg)
this.doSearch()
}
})
})
}
})
},
onRevoke(row) {
this.$confirm("您确定要撤回吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "info"
}).then(() => {
this.$axios.post("/flow/common/revokeTask", {taskId: row.taskId}).then((res) => {
if (res.code === 0) {
this.$message.success(res.msg)
this.doSearch()
}
})
})
},
openAudit(row) {
this.$refs.guava.edit(() => {
this.showApprovalForm = true
this.formData = {
processTaskId: row.taskId,
taskName: row.curTaskName
}
this.$refs.outlayReimburseInfo.onOpen(row)
})
},
},
async created() {
this.budgetTypeOption = await this.$businessTool.getDictOptions("ACTIVITY_BUDGET_TYPE")
this.pageData()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,199 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app">
<guava ref="guava">
<el-card shadow="never">
<search @search="doSearch">
<search-item label="年度">
<el-date-picker
@change="doSearch"
placeholder="选择年"
style="width: 100%"
type="year"
v-model="pageForm.year"
value-format="yyyy">
</el-date-picker>
</search-item>
<search-item label="经办人">
<el-input @keyup.enter.native="doSearch" clearable
placeholder="请输入内容"
v-model="pageForm.searchKeyword">
<el-select placeholder="查询类型" slot="prepend"
style="width: 100px;"
v-model="pageForm.searchName">
<el-option label="姓名" value="info.userName"></el-option>
<el-option label="工号" value="info.loginName"></el-option>
</el-select>
</el-input>
</search-item>
</search>
</el-card>
<el-card shadow="never">
<table-tool label="申请列表">
<el-radio-group v-model="pageForm.approval" size="small" @change="doSearch">
<el-radio-button :label="true">已审核</el-radio-button>
<el-radio-button :label="false">未审核</el-radio-button>
</el-radio-group>
</table-tool>
<el-table :data="tableData" @sort-change="pageOrder" style="width: 100%">
<el-table-column type="index" width="50px" label="序号" :index="indexMethod"></el-table-column>
<el-table-column prop="loginName" label="经办人工号"></el-table-column>
<el-table-column prop="userName" label="姓名"></el-table-column>
<el-table-column prop="outlayManageSource" label="活动类型">
<template v-slot="{row}">
<dict-tag :options="budgetTypeOption"
:value="row.outlayManageSource"></dict-tag>
</template>
</el-table-column>
<el-table-column prop="activityMatter" label="活动事项"></el-table-column>
<el-table-column prop="helpUnitName" label="申报单位">
<template v-slot="{row}">
<span v-if="['ACTIVITY_BUDGET_TYPE_ONE'].includes(row.outlayManageSource)">校工会</span>
<span v-if="['ACTIVITY_BUDGET_TYPE_TWO'].includes(row.outlayManageSource)">{{row.unionName}}</span>
<span v-if="['ACTIVITY_BUDGET_TYPE_THREE','ACTIVITY_BUDGET_TYPE_FOUR'].includes(row.outlayManageSource)">{{row.clubName}}</span>
</template>
</el-table-column>
<el-table-column prop="money" label="金额"></el-table-column>
<el-table-column prop="applyTime" label="申报时间"></el-table-column>
<el-table-column prop="taskName" label="当前节点"></el-table-column>
<el-table-column prop="instanceState" label="流程状态">
<template v-slot="{row}">
<enum-tag :value="row.instanceState" name="ProcessInstanceStateEnum" label_key="message"
size="small"></enum-tag>
</template>
</el-table-column>
<el-table-column label="操作" fixed="right" width="300px">
<template slot-scope="{row}">
<el-button @click="openView(row)" size="mini" type="primary">查看</el-button>
<el-button v-if="row.taskState === 10" @click="openAudit(row)" size="mini" type="primary">审核
</el-button>
<el-button v-if="row.canRevoke" @click="onRevoke(row)" size="mini" type="danger">撤回
</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
<template #edit>
<outlay-reimburse-info ref="outlayReimburseInfo">
<div v-if="showApprovalForm">
<div class="process-title">
{{formData.taskName}}
</div>
<el-form :model="formData" ref="formRef" :rules="formRules" label-width="0" label-suffix=""
class="flow-task-form">
<el-form-item label="审批意见" prop="tf_opinion"
:rules="[{required:true,message:'必填',trigger:['change','blur']}]">
<user-opinion-textarea v-model="formData.tf_opinion"></user-opinion-textarea>
</el-form-item>
<!--:rules="[{required:true,message:'必填',trigger:['change','blur']}]"-->
<el-form-item label="签字" prop="tf_userSign"
>
<pc-signature v-model="formData.tf_userSign"></pc-signature>
</el-form-item>
</el-form>
<el-row type="flex" justify="end">
<el-button @click="$refs.guava.index()" size="small">取消</el-button>
<el-button @click="handleTaskAction(6)" size="small" type="info">退回到发起人</el-button>
<el-button @click="handleTaskAction(2)" size="small" type="danger">拒绝申请</el-button>
<el-button @click="handleTaskAction(1)" size="small" type="primary">同意申请</el-button>
</el-row>
</div>
</outlay-reimburse-info>
</template>
</guava>
</div>
<script>
<!--#include('../info.js'){}#-->
new Vue({
el: "#app",
store,
mixins: [initTableMixins],
data() {
return {
pageDataUrl: "/platform/outlay/reimburse/clubZxAudit/pageData",
budgetTypeOption: [],
unionOptions: [],
pageForm: {
year: moment().format("YYYY"),
approval: false,
searchName: "info.userName",
},
showApprovalForm: false
}
},
components: {
"outlay-reimburse-info": OUTLAY_REIMBURSE_INFO
},
methods: {
openView(row) {
this.$refs.guava.edit(() => {
this.showApprovalForm = false
this.$refs.outlayReimburseInfo.onOpen(row)
})
},
handleTaskAction(val) {
this.$refs.formRef.validate((valid) => {
if (valid) {
this.$confirm("您确定要提交吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.$axios.post("/flow/common/executeTask", {
data: JSON.stringify({
...this.formData,
submitType: val
})
}).then((res) => {
if (res.code === 0) {
this.$refs.guava.index()
this.$message.success(res.msg)
this.doSearch()
}
})
})
}
})
},
onRevoke(row) {
this.$confirm("您确定要撤回吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "info"
}).then(() => {
this.$axios.post("/flow/common/revokeTask", {taskId: row.taskId}).then((res) => {
if (res.code === 0) {
this.$message.success(res.msg)
this.doSearch()
}
})
})
},
openAudit(row) {
this.$refs.guava.edit(() => {
this.showApprovalForm = true
this.formData = {
processTaskId: row.taskId,
taskName: row.curTaskName
}
this.$refs.outlayReimburseInfo.onOpen(row)
})
},
},
async created() {
this.budgetTypeOption = await this.$businessTool.getDictOptions("ACTIVITY_BUDGET_TYPE")
this.pageData()
}
})
</script>
<!--#
}
#-->