feat: 品牌工作室迁移完成

This commit is contained in:
2026-08-19 18:04:39 +08:00
parent d38d48a147
commit 19bbd61436
15 changed files with 1512 additions and 283 deletions
@@ -18,6 +18,7 @@ import org.nutz.mvc.annotation.Param;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import java.util.ArrayList;
import java.util.List;
@IocBean
@@ -34,6 +35,11 @@ public class BrandStudioApplicationController {
return Result.success(leaderHonorVO);
}
@At("/members")
public Result listMemberCandidates(String unionId, String keyword) {
return Result.success(applicationService.listMemberCandidates(unionId, keyword));
}
@At("/page")
public Result page(@Valid BrandStudioApplicationPageDTO dto) {
return Result.success(applicationService.page(dto));
@@ -45,7 +51,7 @@ public class BrandStudioApplicationController {
return Result.success(applicationVO);
}
@At
@At("")
public Result save(@Param("..") @Valid BrandStudioApplicationCreateDTO dto) {
applicationService.save(dto);
return Result.success();
@@ -59,7 +65,23 @@ public class BrandStudioApplicationController {
@At("/delete")
public Result delete(@Param("..") NutMap request) {
applicationService.delete((List<String>) request.get("data"));
List<String> ids = new ArrayList<>();
Object data = request.get("data");
if (data instanceof List<?>) {
((List<?>) data).forEach(item -> ids.add(String.valueOf(item)));
} else if (data != null) {
ids.add(String.valueOf(data));
}
Object id = request.get("id");
if (id != null) {
ids.add(String.valueOf(id));
}
request.forEach((key, value) -> {
if (key != null && String.valueOf(key).startsWith("data[") && value != null) {
ids.add(String.valueOf(value));
}
});
applicationService.delete(ids);
return Result.success();
}
@@ -50,6 +50,11 @@ public class BrandApplicationAuditDTO {
*/
private String bpmTaskApprovalType;
/**
* 流程提交类型
*/
private Integer submitType;
/**
* 下一个任务接收人
*/
@@ -1,6 +1,8 @@
package com.budwk.app.zhgh.brand.domain.dto;
import lombok.Data;
import org.nutz.json.Json;
import org.nutz.lang.Strings;
import javax.validation.Valid;
import javax.validation.constraints.*;
@@ -137,4 +139,16 @@ public class BrandStudioApplicationCreateDTO {
@NotEmpty(message = "至少需要1位成员")
@Valid
private List<BrandStudioMemberCreateDTO> brandStudioMembers;
/**
* 工作室成员列表 JSON
*/
private String brandStudioMembersJson;
public void setBrandStudioMembersJson(String brandStudioMembersJson) {
this.brandStudioMembersJson = brandStudioMembersJson;
if (Strings.isNotBlank(brandStudioMembersJson)) {
this.brandStudioMembers = Json.fromJsonAsList(BrandStudioMemberCreateDTO.class, brandStudioMembersJson);
}
}
}
@@ -134,6 +134,11 @@ public class BrandStudioApplicationPageDTO extends PageForm {
*/
private Integer processStatus;
/**
* 是否已审核
*/
private Boolean audit = false;
@Override
public Integer getPageNumber() {
Integer pageNumber = super.getPageNumber();
@@ -1,6 +1,8 @@
package com.budwk.app.zhgh.brand.domain.dto;
import lombok.Data;
import org.nutz.json.Json;
import org.nutz.lang.Strings;
import java.util.List;
@@ -67,6 +69,11 @@ public class BrandStudioApplicationUpdateDTO {
*/
private Integer status;
/**
* 发起任务ID
*/
private String startTaskId;
/**
* 归档
*/
@@ -107,6 +114,30 @@ public class BrandStudioApplicationUpdateDTO {
* */
private List<BrandStudioMemberCreateDTO> brandStudioMembers;
/**
* 添加的成员 JSON
*/
private String brandStudioMembersJson;
public void setBrandStudioMembersJson(String brandStudioMembersJson) {
this.brandStudioMembersJson = brandStudioMembersJson;
if (Strings.isNotBlank(brandStudioMembersJson)) {
this.brandStudioMembers = Json.fromJsonAsList(BrandStudioMemberCreateDTO.class, brandStudioMembersJson);
}
}
private List<BrandStudioHonorCreateDTO> brandStudioHonors;
/**
* 添加的荣誉 JSON
*/
private String brandStudioHonorsJson;
public void setBrandStudioHonorsJson(String brandStudioHonorsJson) {
this.brandStudioHonorsJson = brandStudioHonorsJson;
if (Strings.isNotBlank(brandStudioHonorsJson)) {
this.brandStudioHonors = Json.fromJsonAsList(BrandStudioHonorCreateDTO.class, brandStudioHonorsJson);
}
}
}
@@ -85,6 +85,56 @@ public class BrandStudioApplicationVO implements Serializable {
*/
private Integer status;
/**
* 流程实例ID
*/
private Long instanceId;
/**
* 流程业务编号
*/
private String businessNo;
/**
* 流程状态
*/
private Integer instanceState;
/**
* 流程定义ID
*/
private String instanceProcessDefineId;
/**
* 当前任务ID
*/
private String taskId;
/**
* 当前任务标识
*/
private String taskKey;
/**
* 当前任务名称
*/
private String taskName;
/**
* 当前任务状态
*/
private Integer taskState;
/**
* 是否可以撤回
*/
private Boolean canRevoke;
/**
* 发起任务ID
*/
private String startTaskId;
/**
* 归档
*/
@@ -156,6 +156,51 @@ public class BrandStudioApplyFlowVO implements Serializable {
private String processTaskReason;
/**
* 流程任务状态
*/
private Integer taskState;
/**
* 当前任务ID
*/
private String taskId;
/**
* 当前任务标识
*/
private String taskKey;
/**
* 当前任务名称
*/
private String taskName;
/**
* 当前节点
*/
private String curTaskName;
/**
* 审核时间
*/
private Date finishTime;
/**
* 是否可以撤回
*/
private Boolean canRevoke;
/**
* 流程状态
*/
private Integer instanceState;
/**
* 流程定义ID
*/
private String instanceProcessDefineId;
private String processTaskNode;
@@ -12,6 +12,7 @@ import com.budwk.app.zhgh.brand.models.BrandStudioApplication;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import java.util.List;
import org.nutz.lang.util.NutMap;
public interface BrandStudioApplicationService extends BaseService<BrandStudioApplication> {
@@ -43,6 +44,8 @@ public interface BrandStudioApplicationService extends BaseService<BrandStudioAp
List<LeaderHonorGroupVO> queryLeaderHonor();
List<NutMap> listMemberCandidates(String unionId, String keyword);
Pagination<BrandStudioApplicationHonorVO> summaryPage(@Valid BrandStudioApplicationPageDTO pageDTO);
List<BrandStudioApplicationHonorVO> getHonorDetailById(String id);
@@ -1,17 +1,18 @@
package com.budwk.app.zhgh.brand.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.lang.Dict;
import cn.hutool.core.util.StrUtil;
import com.budwk.app.base.constant.RoleConstant;
import com.budwk.app.base.service.impl.BaseServiceImpl;
import com.budwk.app.bpm.enums.BpmProcessInstanceStatusEnum;
import com.budwk.app.bpm.enums.BpmTaskApprovalTypeEnum;
import com.budwk.app.bpm.models.BpmProcessInstance;
import com.budwk.app.bpm.service.BpmService;
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.enums.ProcessInstanceStateEnum;
import com.budwk.app.flow.enums.ProcessSubmitTypeEnum;
import com.budwk.app.flow.service.FlowCommonService;
import com.budwk.app.sys.models.Sys_union;
import com.budwk.app.sys.models.Sys_user;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.web.controllers.open.commons.service.CommonService;
import com.budwk.app.zhgh.brand.convert.BrandApplicationFlowConvert;
import com.budwk.app.zhgh.brand.domain.dto.BrandApplicationAuditDTO;
import com.budwk.app.zhgh.brand.domain.dto.BrandApplicationRecallDTO;
@@ -28,7 +29,6 @@ import org.nutz.dao.Dao;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.ioc.loader.annotation.Inject;
import java.util.HashMap;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
@@ -38,10 +38,10 @@ import java.util.stream.Collectors;
public class BrandApplicationFlowServiceImpl extends BaseServiceImpl<BrandApplicationFlow> implements BrandApplicationFlowService {
@Inject
private BpmService bpmService;
private FlowCommonService flowCommonService;
@Inject
private CommonService commonService;
private FlowEngine flowEngine;
public BrandApplicationFlowServiceImpl(Dao dao) {
super(dao);
@@ -92,56 +92,68 @@ public class BrandApplicationFlowServiceImpl extends BaseServiceImpl<BrandApplic
if (StrUtil.isBlank(taskId)) {
throw new RuntimeException("流程任务ID不能为空");
}
BpmTaskApprovalTypeEnum approvalTypeEnum = getBpmTaskApprovalTypeEnum(dto);
HashMap<String, Object> variables = new HashMap<>(BeanUtil.beanToMap(dto));
variables.put("bpmTaskApprovalType", approvalTypeEnum.name());
variables.put("approvalOpinion", dto.getRemark());
bpmService.completeTask(taskId, approvalTypeEnum, variables, getAssignments(dto, approvalTypeEnum));
ApplicationFlowStatusEnum statusEnum = getFlowStatusEnum(dto);
Dict args = Dict.create();
args.putAll(BeanUtil.beanToMap(dto));
args.set(FlowConst.PROCESS_TASK_ID_KEY, Long.valueOf(taskId));
args.set(FlowConst.APPROVAL_COMMENT, dto.getRemark());
args.set("tf_remark", dto.getRemark());
args.set(FlowConst.SUBMIT_TYPE, getProcessSubmitType(statusEnum));
flowCommonService.executeTask(args);
BpmProcessInstance instance = dao().fetch(BpmProcessInstance.class, Cnd.where("processInstanceBusinessId", "=", applicationId));
if (approvalTypeEnum == BpmTaskApprovalTypeEnum.REJECT) {
ProcessInstance instance = dao().fetch(ProcessInstance.class, Cnd.where("businessNo", "=", applicationId));
if (statusEnum == ApplicationFlowStatusEnum.REJECT) {
dao().update(BrandStudioApplication.class,
Chain.make("status", BrandApplicationStatusEnums.REJECT.getCode()),
Cnd.where("id", "=", applicationId));
} else if (approvalTypeEnum == BpmTaskApprovalTypeEnum.BACK || approvalTypeEnum == BpmTaskApprovalTypeEnum.BACK_OTHER_NODE) {
} else if (statusEnum == ApplicationFlowStatusEnum.RECALL) {
dao().update(BrandStudioApplication.class,
Chain.make("status", BrandApplicationStatusEnums.IN_REVIEW.getCode()),
Chain.make("status", BrandApplicationStatusEnums.DRAFT.getCode()),
Cnd.where("id", "=", applicationId));
} else if (instance != null && BpmProcessInstanceStatusEnum.COMPLETED.name().equals(instance.getProcessInstanceStatus())) {
} else if (instance != null && ProcessInstanceStateEnum.FINISHED.getCode().equals(instance.getState())) {
dao().update(BrandStudioApplication.class,
Chain.make("status", BrandApplicationStatusEnums.PASSED.getCode()),
Cnd.where("id", "=", applicationId));
}
}
private List<String> getAssignments(BrandApplicationAuditDTO dto, BpmTaskApprovalTypeEnum approvalTypeEnum) {
if (dto.getAssignments() != null && !dto.getAssignments().isEmpty()) {
return dto.getAssignments();
private ApplicationFlowStatusEnum getFlowStatusEnum(BrandApplicationAuditDTO dto) {
if (ProcessSubmitTypeEnum.AGREE.getCode().equals(dto.getSubmitType())) {
return ApplicationFlowStatusEnum.PASSED;
}
if (approvalTypeEnum == BpmTaskApprovalTypeEnum.PASS) {
String approvalLoginName = commonService.findUserLoginNameByRoleCode(RoleConstant.SCHOOL_UNION_ADMIN);
if (StrUtil.isBlank(approvalLoginName)) {
throw new RuntimeException("校工会未配置审批人,请联系管理员");
}
return List.of(approvalLoginName);
if (ProcessSubmitTypeEnum.REJECT.getCode().equals(dto.getSubmitType())) {
return ApplicationFlowStatusEnum.REJECT;
}
return null;
}
private BpmTaskApprovalTypeEnum getBpmTaskApprovalTypeEnum(BrandApplicationAuditDTO dto) {
if (StrUtil.isNotBlank(dto.getBpmTaskApprovalType())) {
return BpmTaskApprovalTypeEnum.valueOf(dto.getBpmTaskApprovalType());
if (ProcessSubmitTypeEnum.ROLLBACK_TO_OPERATOR.getCode().equals(dto.getSubmitType())) {
return ApplicationFlowStatusEnum.RECALL;
}
if (StrUtil.equalsIgnoreCase(dto.getBpmTaskApprovalType(), "PASS")) {
return ApplicationFlowStatusEnum.PASSED;
}
if (StrUtil.equalsIgnoreCase(dto.getBpmTaskApprovalType(), "REJECT")) {
return ApplicationFlowStatusEnum.REJECT;
}
if (StrUtil.equalsIgnoreCase(dto.getBpmTaskApprovalType(), "BACK")
|| StrUtil.equalsIgnoreCase(dto.getBpmTaskApprovalType(), "BACK_OTHER_NODE")) {
return ApplicationFlowStatusEnum.RECALL;
}
if (dto.getStatus() == null) {
throw new RuntimeException("任务审批类型错误,请传入正确的任务审批类型。");
}
ApplicationFlowStatusEnum statusEnum = ApplicationFlowStatusEnum.getStatusEnumByValue(dto.getStatus());
if (statusEnum == null) {
throw new RuntimeException("任务审批类型错误,请传入正确的任务审批类型。");
}
return statusEnum;
}
private Integer getProcessSubmitType(ApplicationFlowStatusEnum statusEnum) {
if (statusEnum == ApplicationFlowStatusEnum.PASSED) {
return BpmTaskApprovalTypeEnum.PASS;
return ProcessSubmitTypeEnum.AGREE.getCode();
} else if (statusEnum == ApplicationFlowStatusEnum.REJECT) {
return BpmTaskApprovalTypeEnum.REJECT;
return ProcessSubmitTypeEnum.REJECT.getCode();
} else if (statusEnum == ApplicationFlowStatusEnum.RECALL) {
return BpmTaskApprovalTypeEnum.BACK;
return ProcessSubmitTypeEnum.ROLLBACK_TO_OPERATOR.getCode();
}
throw new RuntimeException("任务审批类型错误,请传入正确的任务审批类型。");
}
@@ -208,16 +220,17 @@ public class BrandApplicationFlowServiceImpl extends BaseServiceImpl<BrandApplic
public void recall(BrandApplicationRecallDTO dto) {
String taskId = StrUtil.blankToDefault(dto.getProcessInstanceTaskId(), dto.getFlowId());
if (StrUtil.isNotBlank(taskId)) {
bpmService.revokeTask(taskId);
flowCommonService.revokeTask(Long.valueOf(taskId));
dao().update(BrandStudioApplication.class,
Chain.make("status", BrandApplicationStatusEnums.IN_REVIEW.getCode()),
Chain.make("status", BrandApplicationStatusEnums.DRAFT.getCode()),
Cnd.where("id", "=", dto.getApplicationId()));
flowEngine.processInstanceService().deleteProcessInstanceByBusinessKey(dto.getApplicationId());
return;
}
bpmService.revokeApply(dto.getApplicationId());
dao().update(BrandStudioApplication.class,
Chain.make("status", BrandApplicationStatusEnums.DRAFT.getCode()),
Cnd.where("id", "=", dto.getApplicationId()));
flowEngine.processInstanceService().deleteProcessInstanceByBusinessKey(dto.getApplicationId());
}
public void recallOld(BrandApplicationRecallDTO dto) {
@@ -1,18 +1,22 @@
package com.budwk.app.zhgh.brand.service.impl;
import cn.hutool.core.util.StrUtil;
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.service.impl.BaseServiceImpl;
import com.budwk.app.bpm.enums.BpmProcessTaskStatusEnum;
import com.budwk.app.bpm.service.BpmService;
import cn.hutool.core.lang.Dict;
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.enums.ProcessTaskStateEnum;
import com.budwk.app.flow.service.FlowCommonService;
import com.budwk.app.sys.models.Sys_union;
import com.budwk.app.sys.models.Sys_unit;
import com.budwk.app.sys.models.Sys_user;
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.brand.convert.BrandStudioApplicationConvert;
import com.budwk.app.zhgh.brand.convert.BrandStudioHonorConvert;
import com.budwk.app.zhgh.brand.convert.BrandStudioMemberConvert;
@@ -30,8 +34,10 @@ import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.dao.util.cri.SqlExpressionGroup;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.util.NutMap;
import javax.servlet.http.HttpServletResponse;
import java.util.*;
@@ -49,10 +55,9 @@ public class BrandStudioApplicationServiceImpl extends BaseServiceImpl<BrandStud
private BrandApplicationFlowService flowService;
@Inject
private BpmService bpmService;
private FlowEngine flowEngine;
@Inject
private CommonService commonService;
private FlowCommonService flowCommonService;
public BrandStudioApplicationServiceImpl(Dao dao) {
super(dao);
@@ -63,28 +68,44 @@ public class BrandStudioApplicationServiceImpl extends BaseServiceImpl<BrandStud
public Pagination<BrandStudioApplicationVO> page(BrandStudioApplicationPageDTO pageDTO) {
String userId = SecurityUtil.getUserId();
Cnd cnd = Cnd.where("delFlag", "=", false);
Sql sql = Sqls.create("""
select bsa.*,
ins.id as instanceId,
ins.businessNo,
ins.state as instanceState,
ins.processDefineId as instanceProcessDefineId,
task.id as taskId,
task.taskName as taskKey,
task.displayName as taskName,
task.taskState,
if((select taskName from wf_process_task tt where tt.id = task.taskParentId) = 'startTask', 1, 0) as canRevoke,
(select max(id) from wf_process_task where processInstanceId = ins.id and taskName = 'startTask' and taskState in (10,20)) as startTaskId
from brand_studio_application bsa
left join wf_process_instance ins on ins.businessNo = bsa.id
left join wf_process_task task on task.processInstanceId = ins.id and task.taskState = 10
$condition
""");
Cnd cnd = Cnd.where("bsa.delFlag", "=", false);
/// 2. 先写“普通筛选”这一整组
if (StrUtil.isNotBlank(pageDTO.getName())) {
cnd.and("name", "like", "%" + pageDTO.getName() + "%");
cnd.and("bsa.name", "like", "%" + pageDTO.getName() + "%");
}
if (StrUtil.isNotBlank(userId)) {
cnd.and("createdBy", "=", userId);
cnd.and("bsa.createdBy", "=", userId);
}
if (StrUtil.isNotBlank(pageDTO.getCreateYear())) {
cnd.and("createYear", "=", pageDTO.getCreateYear());
cnd.and("bsa.createYear", "=", pageDTO.getCreateYear());
}
if (pageDTO.getStatus() != null) {
cnd.and("status", "=", pageDTO.getStatus());
cnd.and("bsa.status", "=", pageDTO.getStatus());
}
if (StrUtil.isNotBlank(pageDTO.getLeadPeople())) {
cnd.and("leadPeople", "like", "%" + pageDTO.getLeadPeople() + "%");
cnd.and("bsa.leadPeople", "like", "%" + pageDTO.getLeadPeople() + "%");
}
cnd.desc("createYear");
cnd.desc("createdAt");
Pagination<BrandStudioApplication> page = listPage(pageDTO.getPageNumber(), pageDTO.getPageSize(), BrandStudioApplication.class, cnd);
List<BrandStudioApplicationVO> list = BrandStudioApplicationConvert.convertList(page.getList());
return new Pagination<>(page.getPageNo(), page.getPageSize(), page.getTotalCount(), list);
cnd.desc("bsa.createYear");
cnd.desc("bsa.createdAt");
sql.setCondition(cnd);
return listPageVO(pageDTO, sql, BrandStudioApplicationVO.class);
}
private Sys_user getCheckedUserDetail() {
@@ -147,16 +168,22 @@ public class BrandStudioApplicationServiceImpl extends BaseServiceImpl<BrandStud
if (application == null) {
throw new RuntimeException("提交申请失败");
}
String approvalLoginName = commonService.findUserLoginNameByRoleCode(RoleConstant.BRANCH_UNION_CHAIRMAN, Cnd.where(Sys_user_role::getUnionId, "=", application.getUnionId()));
if (StrUtil.isBlank(approvalLoginName)) {
throw new RuntimeException("分工会未配置审批人,请联系管理员");
}
try {
HashMap<String, Object> variables = new HashMap<>();
variables.put("applicationId", application.getId());
variables.put("status", BrandApplicationStatusEnums.IN_REVIEW.getCode());
variables.put("userId", user.getId());
bpmService.startSubmitProcessInstance(BpmProcessConstant.BRAND_STUDIO.name(), application.getName(), application.getId(), List.of(approvalLoginName), variables);
Dict args = Dict.create();
args.set(FlowConst.SUBMIT_TYPE, ProcessSubmitTypeEnum.APPLY.getCode());
args.set(FlowConst.FORM_DATA, application);
args.set("applicationId", application.getId());
args.set("status", BrandApplicationStatusEnums.IN_REVIEW.getCode());
args.set("userId", user.getId());
// 启动老工作流流程实例,复用 wf_process_define 中的 BRAND_STUDIO 流程定义
ProcessInstance instance = flowEngine.startProcessInstanceByKey("BRAND_STUDIO", application.getId(), SecurityUtil.getUserId(), args);
// 自动完成第一个申请任务
List<ProcessTask> doingTaskList = flowEngine.processTaskService().getDoingTaskList(instance.getId(), null);
for (ProcessTask task : doingTaskList) {
flowEngine.executeProcessTask(task.getId(), SecurityUtil.getUserId(), args);
}
updateApplicationStatusToFail(application.getId(), true);
} catch (RuntimeException e) {
updateApplicationStatusToFail(application.getId(), false);
@@ -203,11 +230,32 @@ public class BrandStudioApplicationServiceImpl extends BaseServiceImpl<BrandStud
/// 再插入新的成员信息
insertBatchBrandStudioMember(dto.getBrandStudioMembers(), dto.getId());
if (statusByCode == BrandApplicationStatusEnums.CREATING) {
/// 提交审核的话会记录在审核流表中
submitAudit(fetch(dto.getId()), getCheckedUserDetail());
if (StrUtil.isNotBlank(dto.getStartTaskId())) {
submitAgain(fetch(dto.getId()), dto.getStartTaskId(), getCheckedUserDetail());
} else {
/// 提交审核的话会记录在审核流表中
submitAudit(fetch(dto.getId()), getCheckedUserDetail());
}
}
}
private void submitAgain(BrandStudioApplication application, String taskId, Sys_user user) {
if (application == null) {
throw new RuntimeException("提交申请失败");
}
Dict args = Dict.create();
args.set(FlowConst.PROCESS_TASK_ID_KEY, Long.valueOf(taskId));
args.set(FlowConst.SUBMIT_TYPE, ProcessSubmitTypeEnum.RE_APPLY.getCode());
args.set(FlowConst.FORM_DATA, application);
args.set("applicationId", application.getId());
args.set("status", BrandApplicationStatusEnums.IN_REVIEW.getCode());
args.set("userId", user.getId());
flowCommonService.executeTask(args);
dao().update(BrandStudioApplication.class,
Chain.make("status", BrandApplicationStatusEnums.IN_REVIEW.getCode()),
Cnd.where("id", "=", application.getId()));
}
@Override
public void updateMemberOrHonor(BrandStudioApplicationUpdateDTO dto) {
dao().update(BrandStudioApplication.class, Chain.make("memberNum", dto.getMemberNum()), Cnd.where("id", "=", dto.getId()));
@@ -228,10 +276,16 @@ public class BrandStudioApplicationServiceImpl extends BaseServiceImpl<BrandStud
@Override
public void delete(List<String> ids) {
if (ids == null || ids.isEmpty()) {
throw new RuntimeException("请选择要删除的数据");
}
String userId = SecurityUtil.getUserId();
SqlExpressionGroup userGroup = new SqlExpressionGroup();
userGroup.or("userId", "=", userId);
userGroup.or("createdBy", "=", userId);
List<String> validIds = dao().query(BrandStudioApplication.class, Cnd.where("id", "in", ids)
.and("userId", "=", userId)
.and(userGroup)
.and("delFlag", "=", false))
.stream().map(BrandStudioApplication::getId).collect(toList());
@@ -244,6 +298,7 @@ public class BrandStudioApplicationServiceImpl extends BaseServiceImpl<BrandStud
dao().update(BrandStudioApplication.class, Chain.make("delFlag", true), Cnd.where("id", "in", validIds));
((BrandStudioMemberServiceImpl) studioMemberService).deleteByApplicationIds(validIds);
flowService.deleteByApplicationIds(validIds);
validIds.forEach(id -> flowEngine.processInstanceService().deleteProcessInstanceByBusinessKey(id));
}
@Override
@@ -287,12 +342,51 @@ public class BrandStudioApplicationServiceImpl extends BaseServiceImpl<BrandStud
Integer age = list.get(0).getAge();
List<String> honorNames = list.stream()
.map(LeaderHonorVO::getHonorName)
.filter(StrUtil::isNotBlank)
.distinct()
.collect(Collectors.toList());
return new LeaderHonorGroupVO(emplid, userName, age, honorNames);
})
.collect(Collectors.toList());
}
@Override
public List<NutMap> listMemberCandidates(String unionId, String keyword) {
Sql sql = Sqls.create("""
select id,
id as userId,
loginname as emplid,
loginname,
username as name,
username,
date_format(birthday, '%Y-%m') as birthdate,
academicDegree as grade,
professionalTitle as professional,
unitName as deptName,
unitName,
unionId
from vw_user
$condition
""");
Cnd cnd = Cnd.NEW();
boolean isAdmin = AuthUtil.hasRoleOr(RoleConstant.SYSADMIN.name(), RoleConstant.SCHOOL_UNION_ADMIN.name());
if (isAdmin) {
cnd.andEX("unionId", "=", unionId);
} else {
cnd.and("unionId", "=", SecurityUtil.getUnionId());
}
if (StrUtil.isNotBlank(keyword)) {
SqlExpressionGroup group = new SqlExpressionGroup();
group.orLike("loginname", keyword, true);
group.orLike("username", keyword, true);
cnd.and(group);
}
cnd.asc("loginname");
sql.setCondition(cnd);
Pagination pagination = listPageMap(1, 50, sql);
return pagination.getList();
}
@Override
public BrandStudioApplicationVO getDetailById(String id) {
BrandStudioApplication entity = fetch(id);
@@ -312,7 +406,21 @@ public class BrandStudioApplicationServiceImpl extends BaseServiceImpl<BrandStud
applicationVO.setBrandStudioHonors(honorVOS);
}
/// 查询当前工作流待审核 ID
ProcessInstance instance = dao().fetch(ProcessInstance.class, Cnd.where("businessNo", "=", id).desc("createdAt"));
if (instance != null) {
applicationVO.setInstanceId(instance.getId());
applicationVO.setBusinessNo(instance.getBusinessNo());
applicationVO.setInstanceState(instance.getState());
applicationVO.setInstanceProcessDefineId(String.valueOf(instance.getProcessDefineId()));
ProcessTask startTask = dao().fetch(ProcessTask.class, Cnd.where("processInstanceId", "=", instance.getId())
.and("taskName", "=", "startTask")
.and("taskState", "=", ProcessTaskStateEnum.DOING.getCode())
.desc("id"));
if (startTask != null) {
applicationVO.setStartTaskId(String.valueOf(startTask.getId()));
}
}
return applicationVO;
}
@@ -334,18 +442,45 @@ public class BrandStudioApplicationServiceImpl extends BaseServiceImpl<BrandStud
@Override
public Pagination<BrandStudioApplyFlowVO> flowAuditPage(BrandStudioApplicationPageDTO dto) {
Sql sql = Sqls.create("""
select bsa.*, inst.id as processInstanceId, inst.processInstanceNodeName as processTaskNode,
task.id as flowId, task.id as processInstanceTaskId, task.taskStatus as processTaskReason,
task.createdOn as processTaskStartTime, task.endOn as processTaskEndTime
from brand_studio_application bsa
inner join bpm_process_instance inst on bsa.id = inst.processInstanceBusinessId
inner join bpm_process_task task on inst.id = task.processInstanceId and task.delFlag = 0
inner join bpm_process_define def on inst.processDefineId = def.id and def.code = 'BRAND_STUDIO'
where bsa.delFlag = 0
select bsa.*, inst.id as processInstanceId, inst.state as instanceState,
inst.processDefineId as instanceProcessDefineId,
task.id as taskId, task.id as flowId, task.id as processInstanceTaskId,
task.taskName as taskKey, task.displayName as taskName, task.displayName as processTaskNode,
task.taskState, task.finishTime,
ifnull(group_concat(distinct nextTask.displayName), '结束') as curTaskName,
if(revokeTask.id is not null, 1, 0) as canRevoke,
case task.taskState
when 10 then 'ACTIVE'
when 20 then 'COMPLETE'
when 30 then 'WITHDRAW'
when 40 then 'INTERRUPT'
when 50 then 'PENDING'
when 60 then 'TRANSFER'
when 99 then 'ABANDON'
else cast(task.taskState as char)
end as processTaskReason,
from_unixtime(task.createdAt / 1000) as processTaskStartTime,
task.finishTime as processTaskEndTime
from wf_process_task task
left join wf_process_instance inst on inst.id = task.processInstanceId
left join brand_studio_application bsa on bsa.id = inst.businessNo
left join wf_process_task_actor taskActor on taskActor.processTaskId = task.id
left join wf_process_task nextTask on nextTask.processInstanceId = inst.id and nextTask.taskState = 10
left join wf_process_task revokeTask on revokeTask.processInstanceId = inst.id and revokeTask.taskParentId = task.id and revokeTask.taskState = 10
inner join wf_process_define def on inst.processDefineId = def.id and def.name = 'BRAND_STUDIO'
$condition
order by task.createdOn desc
order by task.createdAt desc
""");
Cnd cnd = Cnd.NEW();
Cnd cnd = Cnd.where("bsa.delFlag", "=", 0);
cnd.and("taskActor.actorId", "in", List.of(SecurityUtil.getUserId()));
cnd.and("task.taskName", "!=", "startTask");
if (AuthUtil.hasRoleOr(RoleConstant.SYSADMIN.name(), RoleConstant.SCHOOL_UNION_ADMIN.name(),
RoleConstant.SCHOOL_UNION_CHAIRMAN.name(), RoleConstant.SCHOOL_UNION_VICE_CHAIRMAN.name())) {
cnd.and("task.displayName", "like", "%校工会%");
} else if (AuthUtil.hasRoleOr(RoleConstant.BRANCH_UNION_ADMIN.name(), RoleConstant.BRANCH_UNION_CHAIRMAN.name(),
RoleConstant.BRANCH_UNION_VICE_CHAIRMAN.name(), RoleConstant.BRANCH_UNION_OPERATOR.name())) {
cnd.and("task.displayName", "like", "%分工会%");
}
if (StrUtil.isNotBlank(dto.getName())) {
cnd.and("bsa.name", "like", "%" + dto.getName() + "%");
}
@@ -355,37 +490,44 @@ public class BrandStudioApplicationServiceImpl extends BaseServiceImpl<BrandStud
if (StrUtil.isNotBlank(dto.getLeadPeople())) {
cnd.and("bsa.leadPeople", "like", "%" + dto.getLeadPeople() + "%");
}
if (Boolean.TRUE.equals(dto.getAudit())) {
cnd.and("task.taskState", "in", List.of(ProcessTaskStateEnum.FINISHED.getCode(), ProcessTaskStateEnum.INTERRUPT.getCode()));
} else {
cnd.and("task.taskState", "=", ProcessTaskStateEnum.DOING.getCode());
cnd.and("bsa.status", "=", BrandApplicationStatusEnums.IN_REVIEW.getCode());
}
if (dto.getProcessStatus() != null) {
cnd.and("task.taskStatus", "=", getProcessTaskStatus(dto.getProcessStatus()));
cnd.and("task.taskState", "=", getProcessTaskStatus(dto.getProcessStatus()));
}
if (dto.getStatus() != null) {
cnd.and("bsa.status", "=", dto.getStatus());
}
cnd.groupBy("task.id");
sql.setCondition(cnd);
return listPageVO(dto, sql, BrandStudioApplyFlowVO.class);
}
private String getProcessTaskStatus(Integer processStatus) {
private Integer getProcessTaskStatus(Integer processStatus) {
if (Objects.equals(processStatus, 1)) {
return BpmProcessTaskStatusEnum.ACTIVE.name();
return ProcessTaskStateEnum.DOING.getCode();
}
if (Objects.equals(processStatus, 5)) {
return BpmProcessTaskStatusEnum.COMPLETE.name();
return ProcessTaskStateEnum.FINISHED.getCode();
}
return String.valueOf(processStatus);
return processStatus;
}
@Override
public Pagination<BrandStudioApplicationHonorVO> summaryPage(BrandStudioApplicationPageDTO pageDTO) {
Sql sql = Sqls.create("""
select bsa.*, bsh.id as honorId, bsh.honorName, bsh.honorGrade, bsh.requireYear, bsh.honorCategory
select bsa.*, group_concat(bsh.honorName order by bsh.requireYear desc separator ',') as honorName
from brand_studio_application bsa
left join brand_studio_honor bsh on bsa.id = bsh.applicationId and bsh.delFlag = 0
where bsa.delFlag = 0
$condition
group by bsa.id
order by bsa.createYear desc, bsa.createdAt desc
""");
Cnd cnd = Cnd.NEW();
Cnd cnd = Cnd.where("bsa.delFlag", "=", 0);
if (StrUtil.isNotBlank(pageDTO.getName())) {
cnd.and("bsa.name", "like", "%" + pageDTO.getName() + "%");
}
@@ -420,18 +562,23 @@ public class BrandStudioApplicationServiceImpl extends BaseServiceImpl<BrandStud
private List<LeaderHonorVO> selectLeaderHonor() {
Sql sql = Sqls.create("""
select su.id,
su.loginname as emplid,
su.username as userName,
su.unitId as deptid,
su.unitId,
su.birthday,
su.professionalTitle as honorName,
u.unionId as unionId
from sys_user su
left join sys_unit u on su.unitId = u.id
where su.delFlag = 0
and su.disabled = 0
select h.id,
u.loginname as emplid,
h.userName,
timestampdiff(year, u.birthday, curdate()) as age,
h.unitId as deptid,
h.unionId,
h.unitName as deptName,
year(h.grantDate) as year,
prize.name as honorName,
h.prize as honorCode
from honor h
left join vw_user u on h.userId = u.id
left join honor_basic_settings prize on prize.id = h.prize
left join honor_basic_settings type on type.id = h.honorType
where h.userId is not null
and prize.name is not null
and (type.queryTypeCode = 'HONOR_SINGLE' or type.name = '个人荣誉')
""");
return listVO(sql, LeaderHonorVO.class);
}