xiejun
2023-09-22 e2e76076861f0019d127c03273f111a2dcda5913
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/UniversalInterfaceImpl.java
@@ -17,6 +17,7 @@
import com.vci.ubcs.code.util.ClientBusinessObject;
import com.vci.ubcs.code.util.gennerAttrMapUtil;
import com.vci.ubcs.code.vo.pagemodel.*;
import com.vci.ubcs.code.vo.webserviceModel.applybz.*;
import com.vci.ubcs.code.vo.webserviceModel.person.*;
import com.vci.ubcs.code.vo.webserviceModel.apply.*;
import com.vci.ubcs.code.vo.webserviceModel.attrmap.*;
@@ -53,12 +54,20 @@
import com.vci.ubcs.system.vo.DeptVO;
import com.vci.ubcs.system.vo.RoleVO;
import lombok.extern.slf4j.Slf4j;
import org.springblade.core.log.exception.ServiceException;
import org.springblade.core.secure.utils.AuthUtil;
import org.springblade.core.tool.api.R;
import org.springblade.core.tool.utils.Func;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import javax.annotation.Resource;
import javax.jws.WebMethod;
import javax.servlet.http.HttpServletRequest;
import javax.xml.ws.WebServiceContext;
import javax.xml.ws.handler.MessageContext;
import java.util.*;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.atomic.AtomicBoolean;
@@ -74,20 +83,25 @@
@Slf4j
@VciWebservice(path = "/universalInterface")
public class UniversalInterfaceImpl<IDockingLogeServiceing> implements UniversalInterfaceI {
   @Value("${code.universalinterface.checkSystemConfig:true}")
   public boolean CODE_CHECKCONFIG;
   @Autowired(required = false)
   private AttributeMapConfig attributeMapConfig;
   /***
    * 人员相关配置服务
    */
   @Autowired(required = false)
   private PersonAndDeptConfig personAndDeptConfig;
   /**
    * 缓存服务
    */
   //@Autowired
   //private RedisService redisService;
   /**
    * 主题库分类的服务
    */
@@ -127,7 +141,6 @@
   /**
    * 密级的服务
    */
   @Resource
   private MdmIOService mdmIOService;
@@ -142,12 +155,43 @@
    */
   @Resource
   private IDockingLogeService dockingLogeService;
   @Resource
   private IPasswordFreeLoginService passwordFreeLoginService;
   private  static String separator="##VCI##";
   private  String errorid="0";
   private String msg="成功";
   private  String objerrorCode="0";
   private String objerrorMsg="成功";
   private final ThreadLocal<HttpServletRequest> threadLocal = new ThreadLocal<>();
   @Resource
   private WebServiceContext webServiceContext;
   @Override
   public void setThreadLocal(ThreadLocal<HttpServletRequest> requestThreadLocal){
      this.threadLocal.set(requestThreadLocal.get());
      requestThreadLocal.remove();
   }
   @WebMethod
   private HttpServletRequest getRequest() {
      //rest请求方式获取request
      HttpServletRequest request = this.threadLocal.get();
      if(Func.isEmpty(request)){
         try {
            // webservice请求方式获取HttpServletRequest对象
            request = (HttpServletRequest)webServiceContext.getMessageContext().get(MessageContext.SERVLET_REQUEST);
         }catch (Exception e){
            throw new ServiceException("获取httpServletRequest失败,原因:"+e.getMessage());
         }
      }else {
         this.threadLocal.remove();
      }
      return request;
   }
   /***
    * 申请编码接口
    * @param data 传递的数据参数
@@ -190,9 +234,11 @@
         ClassfysVO classfysVO = interParameterVO.getData().getClassifys();
         systemId = interParameterVO.getData().getSystemId();
         UserVO userVo = interParameterVO.getData().getUser();
         //免密登录申请token,request中添加用户信息
         passwordFreeLoginService.pwdFreeLoginByBoolean(userVo.getUserName(),this.getRequest());
         AuthUtil.getUser();
         List<ClassfyVO> classVOList = classfysVO.getClassify();
         InterParameterVO finalInterParameterVO = interParameterVO;
         //这是账号信息
         SessionInfo sessionInfo = new SessionInfo();
         sessionInfo.setUserId(userVo.getUserName());
@@ -341,8 +387,6 @@
      //调用集团申请接口申请集团码
      return resultStr;
   }
   /****
    * 人员数据同步
@@ -616,6 +660,7 @@
      return resultOrgData;
   }
   /****
    * 部门数据同步
    * @param orgData
@@ -882,6 +927,7 @@
      }
      return resultOrgData;
   }
   /***
    * 统一更新接口(更改状态,更改属性信息)接口
    * @param data
@@ -926,6 +972,8 @@
         ClassfysVO classfysVO = interParameterVO.getData().getClassifys();
         systemId = interParameterVO.getData().getSystemId();
         UserVO userVo = interParameterVO.getData().getUser();
         //免密登录申请token,request中添加用户信息
         passwordFreeLoginService.pwdFreeLoginByBoolean(userVo.getUserName(),this.getRequest());
         List<ClassfyVO> classVOList = classfysVO.getClassify();
         InterParameterVO finalInterParameterVO = interParameterVO;
         //这是账号信息
@@ -1097,6 +1145,8 @@
         }
         QueryData queryData=queryClassifyVO.getData();
         UserVO userVo=queryData.getUser();
         //免密登录申请token,request中添加用户信息
         passwordFreeLoginService.pwdFreeLoginByBoolean(userVo.getUserName(),this.getRequest());
         systemId=queryData.getSystemId();
         QueryLibraryVO libraryVO= queryData.getLibrary();
         String libId= libraryVO.getId();
@@ -1255,6 +1305,8 @@
         CondtionsVO condtionsVO=dataCondtionsVO.getCondtions();
         systemId=condtionsVO.getSystemId();
         UserVO userVo=condtionsVO.getUser();
         //免密登录申请token,request中添加用户信息
         passwordFreeLoginService.pwdFreeLoginByBoolean(userVo.getUserName(),this.getRequest());
         CondtionVO condtionVO= condtionsVO.getCondtion();
         SessionInfo sessionInfo = new SessionInfo();
         sessionInfo.setUserId(userVo.getUserName());
@@ -1431,11 +1483,8 @@
      return resultStr;
   }
   @Override
   public String queryClassifyRule(String data, String dataType) throws Throwable {
      boolean issucess=false;
      String resultStr = "";
      String errorid="0";
@@ -1471,6 +1520,8 @@
         }
         QueryData queryData=queryClassifyVO.getData();
         UserVO userVo=queryData.getUser();
         //免密登录申请token,request中添加用户信息
         passwordFreeLoginService.pwdFreeLoginByBoolean(userVo.getUserName(),this.getRequest());
         systemId=queryData.getSystemId();
         QueryLibraryVO libraryVO= queryData.getLibrary();
         String libId= libraryVO.getId();
@@ -1781,10 +1832,10 @@
                           }
                           log.info(libId);
                        }else if(secType.equals("codelevelsec")) {//层级码段
                           int level = codeBasicSecVO.getCodeLevelValue();
                           CodeClassifyVO levelCodeClassifyVO = new CodeClassifyVO();
                           CodeClassifyFullInfoBO classifyFullInfoBO = this.classifyService.getClassifyFullInfo(codeClassifyDO.getOid());
                           if(codeBasicSecVO.getCodeLevelType().equals("code_level_special")){//指定层级
                              int level = codeBasicSecVO.getCodeLevelValue();
                              List<CodeClassifyVO> classifyVOS = classifyFullInfoBO.getParentClassifyVOs().stream().sorted(((o1, o2) -> o2.getDataLevel().compareTo(o1.getDataLevel()))).collect(Collectors.toList());
                              if (classifyVOS.size() >= level && level > 0) {
                                 levelCodeClassifyVO = classifyVOS.get(level - 1);
@@ -1884,10 +1935,230 @@
   }
   /***
    * 标准化生成接口
    * @param data 数据信息
    * @param dataType 数据格式类型
    * @return
    */
   public String applyCodeForBZ(String data,String dataType){
      String resultStr = "";
      log.info("方法->applyCodeForBZ start");
      final String[] errorid = {"0"};
      msg="成功";
      objerrorCode="0";
      objerrorMsg="成功";
      log.info("申请编码的数据参数:->"+data);
      log.info("申请编码的数据类型:->"+dataType);
      String systemId="";
      List<XMLResultClassfyVO> resultClassfyVOList = new ArrayList<>();
      LinkedList<XMLResultDataObjectDetailDO> resultDataObjectDetailDOs = new LinkedList<>();
      try {
         ClassfyBZVO classfyBZVO = null;
         if (StringUtils.isBlank(data)) {
            errorid[0] = "101";
            throw new Throwable("接口参数:dataString 传递为空");
         }
         ApplyBZParamVO applyBZParamVO = new ApplyBZParamVO();
         //如果dataType是xml则,通过xml序列化成对象形式,如果是json则通过json转换成对象格式
         try {
            if ("xml".equals(dataType)) {
               XStream xStream = new XStream(new DomDriver());
               xStream.processAnnotations(RootDataVO.class);
               xStream.autodetectAnnotations(true);
               ApplyBZVO rootDataVO = (ApplyBZVO) xStream.fromXML(data);
               applyBZParamVO.setData(rootDataVO);
            } else {
               applyBZParamVO = JSONObject.toJavaObject(JSONObject.parseObject(data), ApplyBZParamVO.class);
            }
         } catch (Throwable e) {
            errorid[0] = "101";
            throw new Throwable("接口参数:传入数据参数解析失败");
         }
         classfyBZVO = applyBZParamVO.getData().getClassify();
         systemId = applyBZParamVO.getData().getSystemId();
         UserVO userVo = applyBZParamVO.getData().getUser();
         //免密登录申请token,request中添加用户信息
         passwordFreeLoginService.pwdFreeLoginByBoolean(userVo.getUserName(), this.getRequest());
         AuthUtil.getUser();
         //这是账号信息
         SessionInfo sessionInfo = new SessionInfo();
         sessionInfo.setUserId(userVo.getUserName());
         sessionInfo.setUserName(userVo.getTrueName());
         sessionInfo.setIp(userVo.getIp());
         VciBaseUtil.setCurrentUserSessionInfo(sessionInfo);
//         List<XMLResultDataObjectDetailDO> allResultDataObjectDetailDOS=new ArrayList<>();
         String finalSystemId = systemId;
         String libray="";
         boolean isCodeOrGroupCode=false;
         try {
            libray = classfyBZVO.getLibrary();
            CodeClassifyVO codeClassifyVO = getClassfy(classfyBZVO,libray);
            log.info("end:分类查询完毕");
            //获取分类模板信息
            if(codeClassifyVO==null || StringUtils.isBlank(codeClassifyVO.getOid())){
               objerrorCode="100";
               throw  new  Throwable ("根据传输的分类,未获取到分类信息");
            }
            String operation="";
            if(CODE_CHECKCONFIG) {
               //校验是否配置
               DockingSystemConfig dockingSystemConfig=null;
               dockingSystemConfig=checkIspass(finalSystemId, SysIntegrationDataFlowTypeEnum.ACCEPT.getValue(), sysIntegrationPushTypeEnum.ACCPET_APPCODE.getValue(),codeClassifyVO.getOid());
               if(dockingSystemConfig==null){
                  errorid[0] ="101";
                  throw new Throwable("系统标识为【"+ finalSystemId +"】,集成分类为【"+codeClassifyVO.getName()+"】以上分类,"+sysIntegrationPushTypeEnum.ACCPET_APPCODE.getText()+"接口配置已停用或者未配置,请联系编码管理员!");
               }
               isCodeOrGroupCode="true".equals(dockingSystemConfig.getIsGroupCodeFlag())?true:false;
            }
            CodeClassifyTemplateVO templateVO = engineService.getUsedTemplateByClassifyOid(codeClassifyVO.getOid());
            if(templateVO==null||StringUtils.isBlank(templateVO.getOid())){
               objerrorCode="1";
               throw  new  Throwable ("根据传输的分类,未获取MDM系统中对应模板");
            }
            log.info("end:模板查询完毕");
            ApplyBZDatasVO applyDatasVO = classfyBZVO.getObjects();
            DataObjectVO dataObjectVO = new DataObjectVO();
            List<CodeClassifyTemplateAttrVO> attrVOS = templateVO.getAttributes().stream().filter(s -> !DEFAULT_SYNC_ATTR_LIST.contains(s.getId()) && VciBaseUtil.getBoolean(s.getFormDisplayFlag())
            ).collect(Collectors.toList());
            //this.getConfigDatas(finalSystemId, libray, applyDatasVO, attrVOS, dataObjectVO);
            log.info("end:数据组织完毕");
            //规则的主键需要去获取
            CodeClassifyFullInfoBO classifyFullInfo = classifyService.getClassifyFullInfo(codeClassifyVO.getOid());
            if(classifyFullInfo==null ||classifyFullInfo.getCurrentClassifyVO()==null || StringUtils.isBlank(classifyFullInfo.getCurrentClassifyVO().getOid())){
               objerrorCode="1";
               log.info("classifyFullInfo:"+"根据传输的分类,未获取分类相关信息");
               throw  new  Throwable ("根据传输的分类,未获取分类相关信息");
            }
            CodeRuleVO ruleVO = engineService.getCodeRuleByClassifyFullInfo(classifyFullInfo);
            if(ruleVO==null||StringUtils.isBlank(ruleVO.getOid())){
               objerrorCode="102";
               throw  new  Throwable ("根据传输的分类,未获取MDM系统中对应规则");
            }
            log.info("end:规则获取完毕");
            //List<CodeOrderSecDTO> codeOrderSecDTOList = getRuleCodeOrderSecDTOs(ruleVO,classifyFullInfo);
            log.info("end:码段获取完毕");
            CodeOrderDTO orderDTO = new CodeOrderDTO();
            orderDTO.setCodeClassifyOid(codeClassifyVO.getOid());//分类主键
            //orderDTO.setSecDTOList(codeOrderSecDTOList);//分类码段
            mdmIOService.batchSyncApplyCode(orderDTO, dataObjectVO, resultDataObjectDetailDOs,isCodeOrGroupCode);
            //allResultDataObjectDetailDOS.add(resultDataObjectDetailDOs);
            log.info("end:申请获取完毕");
         } catch (Throwable e) {
            List<ApplyBZDataVO> applyDataVOList = classfyBZVO.getObjects().getObject();
            objerrorCode = "1";
            if (!CollectionUtils.isEmpty(applyDataVOList)) {
               applyDataVOList.stream().forEach(applyDataVO -> {
                  XMLResultDataObjectDetailDO xmlResultDataObjectDetailDO = new XMLResultDataObjectDetailDO();
                  xmlResultDataObjectDetailDO.setCode("");
                  xmlResultDataObjectDetailDO.setId(applyDataVO.getId());
                  xmlResultDataObjectDetailDO.setErrorid(objerrorCode);
                  xmlResultDataObjectDetailDO.setMsg("编码申请失败:" + e.getMessage());
                  resultDataObjectDetailDOs.add(xmlResultDataObjectDetailDO);
               });
            } else {
               XMLResultDataObjectDetailDO xmlResultDataObjectDetailDO = new XMLResultDataObjectDetailDO();
               xmlResultDataObjectDetailDO.setCode("");
               xmlResultDataObjectDetailDO.setId("");
               xmlResultDataObjectDetailDO.setErrorid(objerrorCode);
               xmlResultDataObjectDetailDO.setMsg("编码申请失败:" + e.getMessage());
               resultDataObjectDetailDOs.add(xmlResultDataObjectDetailDO);
            }
            e.printStackTrace();
         } finally {
            XMLResultClassfyVO resultClassfyVO = new XMLResultClassfyVO();
            resultClassfyVO.setClassCode(classfyBZVO.getClassCode());
            resultClassfyVO.setLibrary(classfyBZVO.getLibrary());
            resultClassfyVO.setFullclsfNamePath(classfyBZVO.getFullclsfNamePath());
            resultClassfyVO.setObjects(resultDataObjectDetailDOs);
            resultClassfyVOList.add(resultClassfyVO);
         }
         XMLResultSystemVO xmlResultSystemVO = new XMLResultSystemVO();
         xmlResultSystemVO.setClassifys(resultClassfyVOList);
         xmlResultSystemVO.setMsg(msg);
         xmlResultSystemVO.setErrorid(errorid[0]);
         resultStr = transferResultXMl(xmlResultSystemVO, dataType);
      }catch (Throwable e){
         e.printStackTrace();
         msg="申请编码失败:"+e.getMessage();
      }finally {
         XMLResultSystemVO xmlResultSystemVO=new XMLResultSystemVO();
         xmlResultSystemVO.setClassifys(resultClassfyVOList);
         xmlResultSystemVO.setMsg(msg);
         xmlResultSystemVO.setErrorid(errorid[0]);
         resultStr= transferResultXMl(xmlResultSystemVO,dataType);
         final boolean[] issucess = {true};
         if(!errorid[0].equals("0")) {
            issucess[0] = false;
         }else {
            if(!CollectionUtils.isEmpty(resultClassfyVOList)) {
               resultClassfyVOList.stream().forEach(xMLResultClassfyVO -> {
                  xMLResultClassfyVO.getObjects().stream().forEach(objec -> {
                     if (!(objec.getErrorid().equals("0") || objec.getErrorid().equals("204"))) {
                        issucess[0] = false;
                        msg=objec.getMsg();
                     }
                  });
               });
            }
         }
         try {
            //记录日志
            this.saveLogs(systemId, systemId, data, resultStr, issucess[0], msg, "applyCodeForBZ");
         }catch (Throwable e){
            e.printStackTrace();
         }
      }
      log.info("返回参数:"+resultStr);
      //调用集团申请接口申请集团码
      return resultStr;
   }
   /***
    * 查询校验分类信息
    * @param classfyVO
    */
   private  CodeClassifyVO getClassfy(ClassfyVO classfyVO,String libray) throws Throwable{
      CodeClassifyVO classifyVO = new CodeClassifyVO();
      try {
         String classCode = classfyVO.getClassCode();
         String className = classfyVO.getFullclsfNamePath();
         //根据分类代号查询分类信息
         if (StringUtils.isNotBlank(classfyVO.getClassCode())) {
            Map<String, String> conditionMap = new HashMap<>();
            List<CodeClassify> codeClassifyList = classifyService.selectByWrapper(Wrappers.<CodeClassify>query().lambda().eq(CodeClassify::getId, classCode));
            final CodeClassify[] newCodeClassify = {new CodeClassify()};
            if (!CollectionUtils.isEmpty(codeClassifyList)) {
               codeClassifyList.stream().forEach(codeClassify -> {
                  CodeClassifyVO codeClassifyVO=  classifyService.getTopClassifyVO(codeClassify.getOid());
                  if(codeClassifyVO.getId().equals(libray)){
                     newCodeClassify[0] =codeClassify;
                  }
               });
               classifyVO = new CodeClassifyVO();
               BeanUtilForVCI.copyPropertiesIgnoreCase(newCodeClassify[0], classifyVO);
               //将DTO转换为DO
               if(StringUtils.isBlank(classifyVO.getOid())){
                  throw new  Throwable("申请编码的分类:【"+classCode+"】不属于库节点【"+libray+"】,请检查参数分类节点/库节点信息是否匹配");
               }
            }else{
               throw new  Throwable("根据分类代号未查询到相应的分类信息");
            }
         } else {
            classifyVO = classifyService.getObjectByClsfNamePath(className.replace(separator, "/"));
            if(StringUtils.isBlank(classifyVO.getOid())){
               throw new  Throwable("根据分类名称路径未查询到相应的分类信息");
            }
         }
      }catch (Throwable e){
         objerrorCode="100";
         throw    new  Throwable("获取分类信息失败:"+e.getMessage());
      }
      return classifyVO;
   }
   /***
    * 查询校验分类信息
    * @param classfyVO
    */
   private  CodeClassifyVO getClassfy(ClassfyBZVO classfyVO,String libray) throws Throwable{
      CodeClassifyVO classifyVO = new CodeClassifyVO();
      try {
         String classCode = classfyVO.getClassCode();
@@ -1939,6 +2210,21 @@
      });
      return clientBusinessObjectList;
   }
   private List<CodeOrderSecDTO> getRuleCodeOrderSecDTOsBZ(CodeRuleVO ruleVO,CodeClassifyFullInfoBO classifyFullInfo){
      List<CodeBasicSecVO>  codeBasicSecVOS= ruleVO.getSecVOList();
      List<CodeOrderSecDTO> codeOrderSecDTOList=new ArrayList<>();
      Map<String,String> errorMap=new HashMap<>();
      for(CodeBasicSecVO codeBasicSecVO: codeBasicSecVOS) {
         String sectype = codeBasicSecVO.getSecType();
         String classifySecOid= codeBasicSecVO.getOid();
         String message="";
      }
      return codeOrderSecDTOList;
   }
   /***
    * 根据穿入的参数信息校验码段规则
    */
@@ -1948,7 +2234,7 @@
      SectionVOList.stream().forEach(SectionVO->{
         sectionVOMap.put(SectionVO.getName(),SectionVO.getValue());
      });
      Map<String,CodeClassifyVO> codeClassifyVOMap= classifyFullInfo.getParentClassifyVOs().stream().collect(Collectors.toMap(s -> s.getId(), t -> t,(o1, o2)->o2));
      //Map<String,CodeClassifyVO> codeClassifyVOMap= classifyFullInfo.getParentClassifyVOs().stream().collect(Collectors.toMap(s -> s.getId(), t -> t,(o1, o2)->o2));
      List<CodeOrderSecDTO> codeOrderSecDTOList=new ArrayList<>();
      Map<String,String> errorMap=new HashMap<>();
      for(CodeBasicSecVO codeBasicSecVO: codeBasicSecVOS) {
@@ -2234,7 +2520,8 @@
      if(StringUtils.isNotBlank(classOid)){
         queryWrapper.in(DockingSystemConfig::getClassifyOid,classOid);
      }
      List<DockingSystemConfig> dockingSystemConfigList=   dockingSystemConfigList=dockingSystemConfigService.list(queryWrapper);
      List<DockingSystemConfig> dockingSystemConfigList=new ArrayList<>();
      dockingSystemConfigList=   dockingSystemConfigList=dockingSystemConfigService.list(queryWrapper);
      if(!CollectionUtils.isEmpty(dockingSystemConfigList)){
       return   dockingSystemConfigList.get(0);
      }else{
@@ -2242,6 +2529,10 @@
            return checkIspass(systemId, type, operationType, codeClassifyVO.getParentCodeClassifyOid());
         }
      }
      return dockingSystemConfigList.get(0);
      if(dockingSystemConfigList.size()>0){
         return dockingSystemConfigList.get(0);
      }else{
         return   new DockingSystemConfig();
      }
   }
}