diff --git a/visa/visa-api/src/main/java/cn/axzo/nanopart/visa/api/enums/VisaButtonTypeEnum.java b/visa/visa-api/src/main/java/cn/axzo/nanopart/visa/api/enums/VisaButtonTypeEnum.java index d4e8c5b6..72167f85 100644 --- a/visa/visa-api/src/main/java/cn/axzo/nanopart/visa/api/enums/VisaButtonTypeEnum.java +++ b/visa/visa-api/src/main/java/cn/axzo/nanopart/visa/api/enums/VisaButtonTypeEnum.java @@ -35,6 +35,7 @@ public enum VisaButtonTypeEnum { APPROVAL_RECORD("approval_record", "查看审批记录"), TO_HANDLE("to_handle", "去处理"), PRINT("print", "打印"), + DETAIL("detail", "详情"), ; @@ -42,10 +43,11 @@ public enum VisaButtonTypeEnum { private String desc; + //分页列表页Map,key:角色+单据状态,value:功能权限的按钮列表 private static Map> bizTypeBtnMap = Maps.newHashMap(); static { - // 发起人不同状态按钮权限 + // 发起人不同状态按钮权限-详情页 bizTypeBtnMap.put(VisaConfirmBizTypeEnum.CREATE.name() + VisaStatusEnum.TO_REPORT.name(), Sets.newHashSet(UPDATE, DELETE)); bizTypeBtnMap.put(VisaConfirmBizTypeEnum.CREATE.name() + VisaStatusEnum.REPORT_FROM_APPROVE.name(), Sets.newHashSet(UPDATE, FORBID)); bizTypeBtnMap.put(VisaConfirmBizTypeEnum.CREATE.name() + VisaStatusEnum.DECIDING.name(), Sets.newHashSet(UPDATE, EXECUTE, TO_APPROVE, FORBID, CHAT_GROUP_RECORD,PRINT)); @@ -55,7 +57,7 @@ public enum VisaButtonTypeEnum { bizTypeBtnMap.put(VisaConfirmBizTypeEnum.CREATE.name() + VisaStatusEnum.COMPLETED.name(), Sets.newHashSet(UPLOAD_FILE, CHAT_GROUP_RECORD, APPROVAL_RECORD,PRINT)); bizTypeBtnMap.put(VisaConfirmBizTypeEnum.CREATE.name() + VisaStatusEnum.FORBIDED.name(), Sets.newHashSet(CHAT_GROUP_RECORD, APPROVAL_RECORD)); - // 决策人不同状态按钮权限 + // 决策人不同状态按钮权限-详情页 bizTypeBtnMap.put(VisaConfirmBizTypeEnum.CONFIRM.name() + VisaStatusEnum.DECIDING.name(), Sets.newHashSet(UPDATE, CHAT_GROUP_RECORD,PRINT)); bizTypeBtnMap.put(VisaConfirmBizTypeEnum.CONFIRM.name() + VisaStatusEnum.DECIDING_FROM_APPROVE.name(), Sets.newHashSet(UPDATE, CHAT_GROUP_RECORD,PRINT)); bizTypeBtnMap.put(VisaConfirmBizTypeEnum.CONFIRM.name() + VisaStatusEnum.EXECUTING.name(), Sets.newHashSet(UPDATE, CHAT_GROUP_RECORD,PRINT)); @@ -63,10 +65,10 @@ public enum VisaButtonTypeEnum { bizTypeBtnMap.put(VisaConfirmBizTypeEnum.CONFIRM.name() + VisaStatusEnum.COMPLETED.name(), Sets.newHashSet(UPLOAD_FILE, CHAT_GROUP_RECORD, APPROVAL_RECORD,PRINT)); bizTypeBtnMap.put(VisaConfirmBizTypeEnum.CONFIRM.name() + VisaStatusEnum.FORBIDED.name(), Sets.newHashSet(CHAT_GROUP_RECORD, APPROVAL_RECORD)); - //审核人不同状态按钮权限 + //审核人不同状态按钮权限-详情页 bizTypeBtnMap.put(VisaConfirmBizTypeEnum.APPROVE.name() + VisaStatusEnum.APPROVING.name(), Sets.newHashSet(TO_HANDLE, CHAT_GROUP_RECORD,PRINT)); - //其他不同状态按钮权限 + //其他不同状态按钮权限-详情页 bizTypeBtnMap.put(VisaConfirmBizTypeEnum.OTHER.name() + VisaStatusEnum.DECIDING.name(), Sets.newHashSet(PRINT, CHAT_GROUP_RECORD)); bizTypeBtnMap.put(VisaConfirmBizTypeEnum.OTHER.name() + VisaStatusEnum.DECIDING_FROM_APPROVE.name(), Sets.newHashSet(PRINT, CHAT_GROUP_RECORD)); bizTypeBtnMap.put(VisaConfirmBizTypeEnum.OTHER.name() + VisaStatusEnum.EXECUTING.name(), Sets.newHashSet(PRINT, CHAT_GROUP_RECORD)); @@ -75,6 +77,44 @@ public enum VisaButtonTypeEnum { bizTypeBtnMap.put(VisaConfirmBizTypeEnum.OTHER.name() + VisaStatusEnum.FORBIDED.name(), Sets.newHashSet(CHAT_GROUP_RECORD, APPROVAL_RECORD)); //[打印]按钮是通过OMS统一配置,故此处不处理 + + + } + + //分页列表页Map,key:角色+单据状态,value:功能权限的按钮列表 + private static Map> bizTypeBtnMapWhenPage = Maps.newHashMap(); + + static { + // 发起人不同状态按钮权限-分页列表页 + bizTypeBtnMapWhenPage.put(VisaConfirmBizTypeEnum.CREATE.name() + VisaStatusEnum.TO_REPORT.name(), Sets.newHashSet(DETAIL, UPDATE)); + bizTypeBtnMapWhenPage.put(VisaConfirmBizTypeEnum.CREATE.name() + VisaStatusEnum.REPORT_FROM_APPROVE.name(), Sets.newHashSet(DETAIL, UPDATE)); + bizTypeBtnMapWhenPage.put(VisaConfirmBizTypeEnum.CREATE.name() + VisaStatusEnum.DECIDING.name(), Sets.newHashSet(DETAIL, UPDATE)); + bizTypeBtnMapWhenPage.put(VisaConfirmBizTypeEnum.CREATE.name() + VisaStatusEnum.DECIDING_FROM_APPROVE.name(), Sets.newHashSet(DETAIL, UPDATE)); + bizTypeBtnMapWhenPage.put(VisaConfirmBizTypeEnum.CREATE.name() + VisaStatusEnum.EXECUTING.name(), Sets.newHashSet(DETAIL, UPDATE)); + bizTypeBtnMapWhenPage.put(VisaConfirmBizTypeEnum.CREATE.name() + VisaStatusEnum.APPROVING.name(), Sets.newHashSet(DETAIL)); + bizTypeBtnMapWhenPage.put(VisaConfirmBizTypeEnum.CREATE.name() + VisaStatusEnum.COMPLETED.name(), Sets.newHashSet(DETAIL)); + bizTypeBtnMapWhenPage.put(VisaConfirmBizTypeEnum.CREATE.name() + VisaStatusEnum.FORBIDED.name(), Sets.newHashSet(DETAIL)); + + + // 确认人不同状态按钮权限-分页列表页 + bizTypeBtnMapWhenPage.put(VisaConfirmBizTypeEnum.CONFIRM.name() + VisaStatusEnum.TO_REPORT.name(), Sets.newHashSet(DETAIL)); + bizTypeBtnMapWhenPage.put(VisaConfirmBizTypeEnum.CONFIRM.name() + VisaStatusEnum.REPORT_FROM_APPROVE.name(), Sets.newHashSet(DETAIL)); + bizTypeBtnMapWhenPage.put(VisaConfirmBizTypeEnum.CONFIRM.name() + VisaStatusEnum.DECIDING.name(), Sets.newHashSet(DETAIL, UPDATE)); + bizTypeBtnMapWhenPage.put(VisaConfirmBizTypeEnum.CONFIRM.name() + VisaStatusEnum.DECIDING_FROM_APPROVE.name(), Sets.newHashSet(DETAIL, UPDATE)); + bizTypeBtnMapWhenPage.put(VisaConfirmBizTypeEnum.CONFIRM.name() + VisaStatusEnum.EXECUTING.name(), Sets.newHashSet(DETAIL, UPDATE)); + bizTypeBtnMapWhenPage.put(VisaConfirmBizTypeEnum.CONFIRM.name() + VisaStatusEnum.APPROVING.name(), Sets.newHashSet(DETAIL)); + bizTypeBtnMapWhenPage.put(VisaConfirmBizTypeEnum.CONFIRM.name() + VisaStatusEnum.COMPLETED.name(), Sets.newHashSet(DETAIL)); + bizTypeBtnMapWhenPage.put(VisaConfirmBizTypeEnum.CONFIRM.name() + VisaStatusEnum.FORBIDED.name(), Sets.newHashSet(DETAIL)); + + // 其他人不同状态按钮权限-分页列表页 + bizTypeBtnMapWhenPage.put(VisaConfirmBizTypeEnum.OTHER.name() + VisaStatusEnum.TO_REPORT.name(), Sets.newHashSet(DETAIL)); + bizTypeBtnMapWhenPage.put(VisaConfirmBizTypeEnum.OTHER.name() + VisaStatusEnum.REPORT_FROM_APPROVE.name(), Sets.newHashSet(DETAIL)); + bizTypeBtnMapWhenPage.put(VisaConfirmBizTypeEnum.OTHER.name() + VisaStatusEnum.DECIDING.name(), Sets.newHashSet(DETAIL)); + bizTypeBtnMapWhenPage.put(VisaConfirmBizTypeEnum.OTHER.name() + VisaStatusEnum.DECIDING_FROM_APPROVE.name(), Sets.newHashSet(DETAIL)); + bizTypeBtnMapWhenPage.put(VisaConfirmBizTypeEnum.OTHER.name() + VisaStatusEnum.EXECUTING.name(), Sets.newHashSet(DETAIL)); + bizTypeBtnMapWhenPage.put(VisaConfirmBizTypeEnum.OTHER.name() + VisaStatusEnum.APPROVING.name(), Sets.newHashSet(DETAIL, APPROVAL_RECORD)); + bizTypeBtnMapWhenPage.put(VisaConfirmBizTypeEnum.OTHER.name() + VisaStatusEnum.COMPLETED.name(), Sets.newHashSet(DETAIL)); + bizTypeBtnMapWhenPage.put(VisaConfirmBizTypeEnum.OTHER.name() + VisaStatusEnum.FORBIDED.name(), Sets.newHashSet(DETAIL)); } /** @@ -117,6 +157,32 @@ public enum VisaButtonTypeEnum { } } + /** + * 根据角色与单据状态获取按钮权限 + */ + public static Set fetchBtnsByBizTypeAndStatusWhenPage(Set bizTypeSet, VisaStatusEnum status) { + if (Objects.isNull(bizTypeSet) || Objects.isNull(status)) { + return Sets.newHashSet(); + } + + Set returnBtnSet = Sets.newHashSet(); + + bizTypeSet.stream().filter(Objects::nonNull).forEach(item -> { + switch (item) { + case CREATE: + case CONFIRM: + case OTHER: + case APPROVE: + Set buttonTypeEnumSet = bizTypeBtnMapWhenPage.get(item.name() + status.name()); + returnBtnSet.addAll(CollectionUtils.isNotEmpty(buttonTypeEnumSet) ? buttonTypeEnumSet : Sets.newHashSet()); + break; + default: + throw new ServiceException("单据确认业务类型不匹配"); + } + }); + return returnBtnSet; + } + public static Set all() { return Sets.newHashSet(VisaButtonTypeEnum.values()); } diff --git a/visa/visa-server/src/main/java/cn/axzo/nanopart/visa/server/service/VisaHelper.java b/visa/visa-server/src/main/java/cn/axzo/nanopart/visa/server/service/VisaHelper.java index 2ec8da54..d0338ae3 100644 --- a/visa/visa-server/src/main/java/cn/axzo/nanopart/visa/server/service/VisaHelper.java +++ b/visa/visa-server/src/main/java/cn/axzo/nanopart/visa/server/service/VisaHelper.java @@ -1,9 +1,11 @@ package cn.axzo.nanopart.visa.server.service; +import cn.axzo.nanopart.visa.api.enums.VisaButtonTypeEnum; import cn.axzo.nanopart.visa.api.enums.VisaConfirmBizTypeEnum; import cn.axzo.nanopart.visa.api.enums.VisaStatusEnum; import cn.axzo.nanopart.visa.api.request.ChangeStatusRequest; import cn.axzo.nanopart.visa.api.response.VisaDetailByIdResponse; +import cn.axzo.nanopart.visa.server.domain.ChangeRecord; import cn.axzo.nanopart.visa.server.domain.ChangeRecordConfirm; import cn.axzo.nanopart.visa.server.dto.VisaAddLogContext; import cn.axzo.nanopart.visa.server.dto.VisaConfirmDto; @@ -13,6 +15,7 @@ import cn.axzo.nanopart.visa.server.rpc.DrawingMajorGateway; import cn.axzo.nanopart.visa.server.utils.Constants; import cn.axzo.thor.client.model.DrawingMajorResp; import com.alibaba.fastjson.JSONArray; +import com.google.common.collect.Maps; import com.google.common.collect.Sets; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections.CollectionUtils; @@ -27,6 +30,7 @@ import java.util.List; import java.util.Map; import java.util.Objects; import java.util.Set; +import java.util.function.Function; import java.util.stream.Collectors; /** @@ -155,7 +159,17 @@ public class VisaHelper { /** * 查询单据与当前人的角色:[发起人|确认人|其他用户] */ - public Map> fetchConfirmBizTypes(Collection visaIds, Long personId, Long ouId, Long workspaceId) { + public Map> fetchConfirmBizTypes(Collection visaList, Long personId, Long ouId, Long workspaceId) { + + if (CollectionUtils.isEmpty(visaList)) { + return Collections.emptyMap(); + } + List visaIds = visaList.stream().filter(item -> Objects.nonNull(item.getId())) + .map(ChangeRecord::getId).collect(Collectors.toList()); + if (CollectionUtils.isEmpty(visaIds)) { + return Collections.emptyMap(); + } + List confirmList = changeRecordConfirmService.findByCondition(VisaConfirmDto.builder() .visaIds(visaIds) .personId(personId) @@ -172,4 +186,33 @@ public class VisaHelper { return visaBizTypeMap; } + + /** + * 获取按钮集合 + * 确认人与发起人的不同的单据状态,按钮列表不相同 + */ + public Map> fetchBtnsByCondition(Collection visaList, Long personId, Long ouId, Long workspaceId) { + if (CollectionUtils.isEmpty(visaList)) { + return Collections.emptyMap(); + } + Map visaIdMap = visaList.stream() + .filter(item -> Objects.nonNull(item.getId())) + .collect(Collectors.toMap(ChangeRecord::getId, Function.identity(), (x, y) -> x)); + Map> visaIdBizTypeMap = fetchConfirmBizTypes(visaList, personId, ouId, workspaceId); + if (Objects.isNull(visaIdBizTypeMap) || visaIdBizTypeMap.isEmpty()) { + return Collections.emptyMap(); + } + Map> returnMap = Maps.newHashMap(); + + visaIdBizTypeMap.entrySet().stream().forEach(entry -> { + Long key = entry.getKey(); + Set value = entry.getValue(); + + ChangeRecord changeRecord = visaIdMap.get(key); + if (Objects.nonNull(changeRecord) && Objects.nonNull(changeRecord.getStatus())) { + returnMap.put(key, VisaButtonTypeEnum.fetchBtnsByBizTypeAndStatusWhenPage(value, changeRecord.getStatus())); + } + }); + return returnMap; + } }