package com.vci.web.service.impl; import com.vci.client.common.providers.ClientServiceProvider; import com.vci.corba.common.PLException; import com.vci.corba.omd.etm.EnumItem; import com.vci.corba.omd.etm.EnumType; import com.vci.starter.web.annotation.log.VciUnLog; import com.vci.starter.web.enumpck.UserSecretEnum; import com.vci.starter.web.exception.VciBaseException; import com.vci.starter.web.pagemodel.DataGrid; import com.vci.starter.web.pagemodel.PageHelper; import com.vci.starter.web.util.VciBaseUtil; import com.vci.starter.web.util.VciDateUtil; import com.vci.web.constant.EnumIdConstant; import com.vci.web.pageModel.KeyValue; import com.vci.web.pageModel.OsEnumItemVO; import com.vci.web.pageModel.OsEnumVO; import com.vci.web.pageModel.OsStatusVO; import com.vci.web.service.OsEnumServiceI; import com.vci.web.service.OsLifeCycleServiceI; import com.vci.web.service.WebBoServiceI; import com.vci.web.util.PlatformClientUtil; import com.vci.web.util.WebUtil; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; import org.springframework.web.util.HtmlUtils; import java.util.*; import java.util.stream.Collectors; import static com.vci.web.constant.EnumIdConstant.LC_STATUS_SUBFIX; /** * 枚举服务--已经调用平台底层了,不再提供dao层 * @author weidy@2018-03-06 * */ @Service public class OsEnumServiceImpl implements OsEnumServiceI { /** * 平台调用客户端 */ //@Autowired private PlatformClientUtil platformClientUtil; /** * 生命周期 */ @Autowired private OsLifeCycleServiceI lifeCycleService; /** * 用户新增数据的时候可以查看的密级 */ public static final String MY_DATA_SECRET = "myDataSecret"; /** * 业务数据 */ @Autowired private WebBoServiceI boService; /** * 日志 */ private Logger logger = LoggerFactory.getLogger(getClass()); /** * 加载自身 */ @Autowired(required = false) @Lazy private OsEnumServiceI self; /** * 使用编号获取枚举明细 * @param enumCode 编号 * @return 明细 * @throws VciBaseException 调用服务端出错的时候会抛出异常 */ private List getEnumItemById(String enumCode) throws VciBaseException{ if(StringUtils.isBlank(enumCode)){ return null; } Map enumVOMap = self.selectAllEnumMap(); if(MY_DATA_SECRET.equalsIgnoreCase(enumCode)){ //当前用户 OsEnumVO enumVO = enumVOMap.getOrDefault(EnumIdConstant.DATASECRET_ENUMNAME, null); int userSecret = WebUtil.getInt(WebUtil.getCurrentUserSessionInfoNotException().getUserSecret()); List itemVOS = new ArrayList<>(); if(enumVO!=null && !CollectionUtils.isEmpty(enumVO.getItems())){ itemVOS = enumVO.getItems().stream().filter(item->WebUtil.getInt(item.getId()) <= userSecret).collect(Collectors.toList()); } return itemVOS; }else{ return enumVOMap.getOrDefault(enumCode.toLowerCase(),new OsEnumVO()).getItems(); } } /** * 获取枚举的内容 * @param enumCode 枚举的编号(英文名称) * @return key是英文值,value是中文文本 */ @Override public List getEnum(String enumCode) throws VciBaseException { if(StringUtils.isEmpty(enumCode)){ return null; } enumCode = HtmlUtils.htmlUnescape(enumCode); if(enumCode.endsWith(LC_STATUS_SUBFIX)){ List statusVOS = lifeCycleService.listStatusById(enumCode.replace(LC_STATUS_SUBFIX, "")); if(CollectionUtils.isEmpty(statusVOS)){ return new ArrayList<>(); } List keyValueList = new ArrayList<>(); statusVOS.stream().forEach(statusVO->{ KeyValue kv = new KeyValue(); kv.setKey(statusVO.getId()); kv.setValue(statusVO.getName()); kv.setAttributes(VciBaseUtil.objectToMap(statusVO)); keyValueList.add(kv); }); return keyValueList; } return enumItem2KV(getEnumItemById(enumCode)); } /** * 获取枚举的中文文本 * @param enumCode 枚举的编号(英文名称) * @param enumKey 枚举的英文值,区分大小写 */ @Override public String getValue(String enumCode, String enumKey) throws VciBaseException { List allKV = getEnum(enumCode); if(allKV.size()>0){ for(KeyValue kv : allKV){ if(kv.getKey().equalsIgnoreCase(enumKey)){ return kv.getValue(); } } } return ""; } /** * 获取枚举的英文值 * @param enumCode 枚举的编号(英文名称) * @param enumValue 枚举的中文文本,区分大小写 */ @Override public String getKey(String enumCode, String enumValue) throws VciBaseException { List allKV = getEnum(enumCode); if(allKV.size()>0){ for(KeyValue kv : allKV){ if(kv.getValue().equalsIgnoreCase(enumValue)){ return kv.getKey(); } } } return ""; } /** * 获取枚举的映射 * * @param enumCode 枚举的=编号 * @return 枚举的值映射 */ @Override public Map getEnumValueMap(String enumCode) throws VciBaseException { if(StringUtils.isBlank(enumCode)){ return null; } Map enumVOMap = self.selectAllEnumMap(); if(MY_DATA_SECRET.equalsIgnoreCase(enumCode)){ //当前用户 OsEnumVO enumVO = enumVOMap.getOrDefault(EnumIdConstant.DATASECRET_ENUMNAME, null); int userSecret = WebUtil.getInt(WebUtil.getCurrentUserSessionInfoNotException().getUserSecret()); Map itemVOMap = new HashMap<>(); if(enumVO!=null && !CollectionUtils.isEmpty(enumVO.getItemMaps())){ enumVO.getItemMaps().forEach((key,value)->{ if(WebUtil.getInt(key) <= userSecret){ itemVOMap.put(key,value); } }); } return itemVOMap; }else{ return enumVOMap.getOrDefault(enumCode.toLowerCase(),new OsEnumVO()).getItemMaps(); } } /** * 查询所有的枚举 * * @return 枚举的显示对象 */ @Override @VciUnLog public List selectAllEnum() { //后面两个参数居然完全没有作用 try { return enumDO2VOs(Arrays.stream(ClientServiceProvider.getOMDService().getEnumService().getEnumTypes("",1,1)).collect(Collectors.toList())); } catch (PLException vciError) { throw WebUtil.getVciBaseException(vciError); } } /** * 查询所有的枚举映射 * * @return key是枚举的英文名称 */ @Override @VciUnLog public Map selectAllEnumMap() { return Optional.ofNullable(self.selectAllEnum()).orElseGet(()->new ArrayList<>()).stream().collect(Collectors.toMap(s->s.getId().toLowerCase(),t->t,(o1,o2)->o1)); } /** * 枚举的数据对象转换为显示对象 * * @param enumItems 枚举的对象 * @return 显示对象 */ @Override public List enumDO2VOs(Collection enumItems) { List enumVOS = new ArrayList<>(); Optional.ofNullable(enumItems).orElseGet(()->new ArrayList<>()).stream().forEach(enumItem -> { OsEnumVO enumVO = enumDO2VO(enumItem); enumVOS.add(enumVO); }); return enumVOS; } /** * 枚举的数据对象转换为显示对象 * * @param enumItem 数据对象 * @return 显示对象 */ @Override public OsEnumVO enumDO2VO(EnumType enumItem) { OsEnumVO enumVO = new OsEnumVO(); if(enumItem!=null){ enumVO.setOid(enumItem.oid); enumVO.setCreator(enumItem.creator); enumVO.setLastModifier(enumItem.modifier); enumVO.setId(enumItem.name); enumVO.setName(enumItem.label); enumVO.setEnumValueDataType(enumItem.type); enumVO.setLength((int) enumItem.length); try { enumVO.setLastModifyTime(new Date(enumItem.createTime)); } catch (Exception e) { e.printStackTrace(); } try { enumVO.setCreateTime(new Date(enumItem.createTime)); } catch (Exception e) { e.printStackTrace(); } try { enumVO.setTs(VciDateUtil.str2Date(enumItem.ts,VciDateUtil.DateTimeMillFormat)); } catch (Exception e) { e.printStackTrace(); } List itemVOS = new ArrayList<>(); Map itemVOMap = new HashMap<>(); if(enumItem.items!=null && enumItem.items.length > 0){ for(int i = 0 ; i < enumItem.items.length ; i ++){ OsEnumItemVO enumItemVO = new OsEnumItemVO(); EnumItem enumChild = enumItem.items[i]; enumItemVO.setId(enumChild.value); enumItemVO.setName(enumChild.name); enumItemVO.setDescription(enumChild.description); itemVOS.add(enumItemVO); itemVOMap.put(enumChild.value,enumChild.name); } } enumVO.setItems(itemVOS); enumVO.setItemMaps(itemVOMap); } return enumVO; } /** * 枚举明细转换为KV * * @param enumItemVO 枚举明细显示对象 * @return KV */ @Override public List enumItem2KV(Collection enumItemVO) { List keyValueList = new ArrayList<>(); if(!CollectionUtils.isEmpty(enumItemVO)){ enumItemVO.forEach(itemVO->{ KeyValue keyValue = new KeyValue(); keyValue.setKey(itemVO.getId()); keyValue.setValue(itemVO.getName()); keyValueList.add(keyValue); }); } return keyValueList; } /** * 获取数据的密级,并且会用当前用户的密级再校验一下 * * @param oid 主键 * @param btmname 业务类型 * @return 数据的密级 */ @Override public List getDataEnum(String oid, String btmname) { VciBaseUtil.alertNotNull(oid,"业务数据的主键",btmname,"业务类型"); com.vci.client.bof.ClientBusinessObject cbo = boService.selectCBOByOid(oid, btmname); String secret = cbo.getAttributeValue("secretGrade"); //secret = DataSecretEnum.SECRET.getValue() + ""; if(StringUtils.isBlank(secret)){ return new ArrayList<>(); }else{ int dataSecret = VciBaseUtil.getInt(secret); List values = getEnum(EnumIdConstant.DATASECRET_ENUMNAME); Integer userSecret = VciBaseUtil.getCurrentUserSecret(); if(userSecret == null || userSecret < UserSecretEnum.NONE.getValue()){ userSecret = UserSecretEnum.NONE.getValue(); } if(CollectionUtils.isEmpty(values)){ return new ArrayList<>(); } Integer finalUserSecret = userSecret; return values.stream().filter(s-> { int thisDataSecret = VciBaseUtil.getInt(s.getKey()); if(dataSecret >= thisDataSecret && finalUserSecret >=thisDataSecret){ return true; } return false; }).collect(Collectors.toList()); } } /** * 批量添加内容 * * @param enumItemList 枚举的内容 */ @Override public void batchAddEnum(List enumItemList) { if(!CollectionUtils.isEmpty(enumItemList)){ enumItemList.stream().forEach(enumItem -> { try { ClientServiceProvider.getOMDService().getEnumService().addEnumType(enumItem); } catch (PLException e) { throw WebUtil.getVciBaseException(e); } }); } } /** * 批量修改内容 * * @param enumItemList 枚举的内容 */ @Override public void batchEditEnum(List enumItemList) { if(!CollectionUtils.isEmpty(enumItemList)){ enumItemList.stream().forEach(enumItem -> { try { // ServiceProvider.getOMDService().getEnumService().modifyEmItem(enumItem); ClientServiceProvider.getOMDService().getEnumService().modifyEnumType(enumItem); } catch (PLException e) { throw WebUtil.getVciBaseException(e); } }); } } /** * 使用编号获取枚举的名称 * * @param id 编号 * @return 枚举的中文名称 */ @Override public String getNameById(String id) { VciBaseUtil.alertNotNull(id,"枚举的英文编号"); Map enumVOMap = self.selectAllEnumMap(); if(!enumVOMap.containsKey(id.toLowerCase())){ throw new VciBaseException("枚举[{0}]在系统中不存在",new String[]{id}); } return enumVOMap.get(id.toLowerCase()).getName(); } /** * 使用枚举的英文名称集合获取对象 * * @param enumIdCollection 英文名称集合,不区分大小写 * @return 枚举的对象 */ @Override public List listEnumByIdCollection(Collection enumIdCollection) { Map enumVOMap = self.selectAllEnumMap(); List enumVOList = new ArrayList<>(); enumIdCollection.stream().forEach(enumId->{ if(enumVOMap.containsKey(enumId.toLowerCase())){ enumVOList.add(enumVOMap.get(enumId.toLowerCase())); } }); return enumVOList; } /** * 参照枚举的信息 * * @param conditionMap 查询条件 * @param pageHelper 分页 * @return 枚举的信息 */ @Override public DataGrid referDataGrid(Map conditionMap, PageHelper pageHelper) { DataGrid dataGrid = queryObjectServiceInfoBySql(conditionMap, pageHelper, "plenum",OsEnumVO.class,null); return dataGrid; } /** * 枚举选项列表 * * @param pkEnum 枚举的主键 * @return 枚举选项 */ @Override public DataGrid gridEnumItemByOid(String pkEnum) { if(StringUtils.isBlank(pkEnum)){ return new DataGrid<>("没有选择枚举"); } //先查询出来 OsEnumVO enumVO = self.selectAllEnumMap().values().stream().filter(s -> s.getOid().equalsIgnoreCase(pkEnum)).findFirst().orElseGet(() -> new OsEnumVO()); DataGrid dataGrid = new DataGrid<>(); if(enumVO!=null && enumVO.getItems()!=null){ dataGrid.setData(enumVO.getItems()); dataGrid.setTotal(enumVO.getItems().size()); } return dataGrid; } /** * 清除缓存 */ @Override public void clearCache() { } }