buli
2023-07-11 80a3f59e2d3df07805bc67e329300b8de90a5b3a
force-app/main/default/classes/MetaDataUtility.cls
@@ -1,32 +1,29 @@
public without sharing class MetaDataUtility {
    public static List<Metadata.LayoutSection> GetRecordTypePageLayout(string record_type_id,string objectType){
        Map<string,object> mso = null;
    public static List<Metadata.LayoutSection> GetRecordTypePageLayout(string record_type_id, string objectType) {
        Map<string, object> mso = null;
        System.debug('rerord 6' + record_type_id + ':' + objectType);
        string layout_name = GetRecordTypePageLayoutName(record_type_id,objectType,UserInfo.getProfileId());
        string layout_name = GetRecordTypePageLayoutName(record_type_id, objectType, UserInfo.getProfileId());
        System.debug('layout 8' + layout_name);
        List<Metadata.LayoutSection>  temp =  GetLayoutSections(objectType,layout_name);
        List<Metadata.LayoutSection>  layoutSectionList = new List<Metadata.LayoutSection>();
        for(Metadata.LayoutSection section : temp){
        List<Metadata.LayoutSection> temp = GetLayoutSections(objectType, layout_name);
        List<Metadata.LayoutSection> layoutSectionList = new List<Metadata.LayoutSection>();
        for (Metadata.LayoutSection section : temp) {
            boolean a = false;
            for( Metadata.LayoutColumn c: section.layoutColumns){
            for (Metadata.LayoutColumn c : section.layoutColumns) {
                //system.debug(c);
                if(c.layoutItems != null && c.layoutItems.size() > 0 ){
                if (c.layoutItems != null && c.layoutItems.size() > 0) {
                    a = true;
                }
            }
            if(a){
            layoutSectionList.add(section);
            if (a) {
                layoutSectionList.add(section);
            }
        }
        return layoutSectionList;
    }
    /*[{
            "attributes": {
            "attributes": {
                "type": "Layout",
                "url": "/services/data/v53.0/tooling/sobjects/Layout/00h10000009iAb5AAE"
            },
@@ -35,25 +32,24 @@
            "TableEnumOrId": "01I10000000er3hEAA",
            "LayoutType": "Standard"
        }]
     */
    public static string GetTableOrEnumId(string objectType){
        Map<string,object> mso = null;
     */
    public static string GetTableOrEnumId(string objectType) {
        Map<string, object> mso = null;
        string resp = null;
        string table_or_enum_id = objectType;
        if(objectType.endsWith('__c')){
            resp = ToolingQuery('SELECT id,DeveloperName from CustomObject where DeveloperName =\''+objectType.replace('__c', '')+'\'');
            if(resp == null){
        if (objectType.endsWith('__c')) {
            resp = ToolingQuery('SELECT id,DeveloperName from CustomObject where DeveloperName =\'' + objectType.replace('__c', '') + '\'');
            if (resp == null) {
                system.debug('resp is not ok');
                return null;
            }else{
                mso = (Map<string,object>)Json.deserializeUntyped(resp);
                if(integer.valueOf(mso.get('size')) > 0){
                    table_or_enum_id =  string.valueOf(((Map<string,object>)(((List<object>)mso.get('records'))[0])).get('Id'));
                }else{
            } else {
                mso = (Map<string, object>) Json.deserializeUntyped(resp);
                if (integer.valueOf(mso.get('size')) > 0) {
                    table_or_enum_id = string.valueOf(((Map<string, object>) (((List<object>) mso.get('records'))[0])).get('Id'));
                } else {
                    system.debug('no records');
                   return null;
                    return null;
                }
            }
        }
@@ -61,125 +57,120 @@
        return table_or_enum_id;
    }
    public static List<object> GetAllPageLayout(string objectType){
    public static List<object> GetAllPageLayout(string objectType) {
        string resp = null;
        Map<string,object> mso = null;
        string table_or_enum_id =  GetTableOrEnumId(objectType);
        if(string.isBlank(table_or_enum_id)){
        Map<string, object> mso = null;
        string table_or_enum_id = GetTableOrEnumId(objectType);
        if (string.isBlank(table_or_enum_id)) {
            return new List<object>();
        }
        resp = ToolingQuery('SELECT id,name,TableEnumOrId,LayoutType  FROM Layout where TableEnumOrId = \''+table_or_enum_id+'\'');
        if(resp == null){
            system.debug('Layout where TableEnumOrId='+table_or_enum_id+' is null');
        resp = ToolingQuery('SELECT id,name,TableEnumOrId,LayoutType  FROM Layout where TableEnumOrId = \'' + table_or_enum_id + '\'');
        if (resp == null) {
            system.debug('Layout where TableEnumOrId=' + table_or_enum_id + ' is null');
            return null;
        }else{
            mso = (Map<string,object>)Json.deserializeUntyped(resp);
            if(integer.valueOf(mso.get('size')) > 0){
                return (List<object>)mso.get('records');
            }else{
        } else {
            mso = (Map<string, object>) Json.deserializeUntyped(resp);
            if (integer.valueOf(mso.get('size')) > 0) {
                return (List<object>) mso.get('records');
            } else {
                system.debug('no records');
                return new List<object>();
            }
        }
    }
    public static string GetRecordTypePageLayoutName(string record_type_id,string objectType, string profile_id){
      System.debug('objectType 92' + objectType);
    public static string GetRecordTypePageLayoutName(string record_type_id, string objectType, string profile_id) {
        System.debug('objectType 92' + objectType);
        System.debug('profile 93 ' + profile_id);
        if(!string.isBlank(objectType)){
            List<sobject> lso = [SELECT Id, Name, DeveloperName, SobjectType, IsActive, Description, BusinessProcessId FROM RecordType where SobjectType = :objectType];
            if(lso.size()==0){
                return string.valueOf(((Map<string,object>)(GetAllPageLayout(objectType)[0])).get('Name'));
        if (!string.isBlank(objectType)) {
            List<sobject> lso = [
                SELECT Id, Name, DeveloperName, SobjectType, IsActive, Description, BusinessProcessId
                FROM RecordType
                WHERE SobjectType = :objectType
            ];
            if (lso.size() == 0) {
                return string.valueOf(((Map<string, object>) (GetAllPageLayout(objectType)[0])).get('Name'));
            }
        }
        // 01210000000QfWdAAK
        string query = 'SELECT Layout.Name, Layout.TableEnumOrId, ProfileId, Profile.Name, RecordTypeId FROM ProfileLayout where id!=null ';
        if(!string.isBlank(record_type_id)){
            query += ' and RecordTypeId = \''+record_type_id+'\'';
        if (!string.isBlank(record_type_id)) {
            query += ' and RecordTypeId = \'' + record_type_id + '\'';
        }
        if(!string.isBlank(objectType)){
            query += ' and TableEnumOrId = \''+ GetTableOrEnumId(objectType) +'\'';
        if (!string.isBlank(objectType)) {
            query += ' and TableEnumOrId = \'' + GetTableOrEnumId(objectType) + '\'';
        }
        if(!string.isBlank(profile_id)){
            query += ' and ProfileId = \''+profile_id+'\'';
        if (!string.isBlank(profile_id)) {
            query += ' and ProfileId = \'' + profile_id + '\'';
        }
        query += ' order by LastModifiedDate desc ';
        system.debug('query='+query);
        system.debug('query=' + query);
        string s = ToolingQuery(query);
        if(string.isBlank(s)){
        if (string.isBlank(s)) {
            system.debug('s is blank');
            return null;
        }else{
            Map<string,object> mso = (Map<string,object>)JSON.deserializeUntyped(s);
        } else {
            Map<string, object> mso = (Map<string, object>) JSON.deserializeUntyped(s);
            System.debug('mso 122' + mso);
            if(integer.valueOf(mso.get('size')) > 0){
                List<object> records = ((List<object>)mso.get('records'));
                mso = (Map<string,object>)(records[0]);
                return string.valueOf(((Map<string,object>)(mso.get('Layout'))).get('Name'));
            }else{
            if (integer.valueOf(mso.get('size')) > 0) {
                List<object> records = ((List<object>) mso.get('records'));
                mso = (Map<string, object>) (records[0]);
                return string.valueOf(((Map<string, object>) (mso.get('Layout'))).get('Name'));
            } else {
                return null;
            }
        }
    }
    public static string ToolingQuery(string query){
        system.debug('query='+query);
        String baseURL = 'callout:SF_Rest_API/services/data/v41.0/tooling/query?q='+ query.replace(' ', '+');
    public static string ToolingQuery(string query) {
        system.debug('query=' + query);
        String baseURL = 'callout:SF_Rest_API/services/data/v41.0/tooling/query?q=' + query.replace(' ', '+');
        HttpResponse resp = null;
        HttpRequest req = new HttpRequest();
        HttpRequest req = new HttpRequest();
        req.setMethod('GET');
        //req.setHeader('Authorization', 'Bearer ' + UserInfo.getsessionid());
        //req.setEndpoint(baseURL);
        req.setEndpoint(baseURL);
        Http client = new Http();
        //req.setHeader('Authorization', 'Bearer ' + UserInfo.getsessionid());
        //req.setEndpoint(baseURL);
        req.setEndpoint(baseURL);
        Http client = new Http();
        resp = client.send(req);
        system.debug(resp.getStatus());
        system.debug(resp.getStatusCode());
        if(resp.getStatus() == 'OK'){
        if (resp.getStatus() == 'OK') {
            string s = resp.getBody();
            system.debug(resp.getBody());
           return s;
        }else{
            system.debug('status is not ok,error:'+resp.getBody());
            return s;
        } else {
            system.debug('status is not ok,error:' + resp.getBody());
            return null;
        }
    }
    public static List<Metadata.LayoutSection> GetLayoutSections(string object_name, string layout_name){
        List<String> componentNameList = new List<String>{object_name+'-'+layout_name};
    public static List<Metadata.LayoutSection> GetLayoutSections(string object_name, string layout_name) {
        List<String> componentNameList = new List<String>{ object_name + '-' + layout_name };
        //通过Metadata.Operations.retrieve获取metadata
        //Metadata.Layout -> Metadata.LayoutSection -> Metadata.LayoutColumn objects -> Metadata.LayoutItem objects
        System.debug('componentNameList 171: ' + componentNameList);
        List<Metadata.Metadata> componentList = Metadata.Operations.retrieve(Metadata.MetadataType.Layout, componentNameList);
        System.debug('componentList 173 ' + componentList);
        if(componentList?.size() > 0){
        if (componentList?.size() > 0) {
            Metadata.Layout layout = (Metadata.Layout) componentList.get(0);
            List<Metadata.LayoutSection> layoutSectionList = layout.layoutSections;
            return layoutSectionList;
        }
        else{
        } else {
            return null;
        }
    }
}
}