19626
2023-09-09 e14d6d0619330cad423f06493e3aa2371faa2a8f
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
global with sharing class Xin_SearchVisitorPlace {
    public List<Account> results {get; private set;}
    public Boolean getIsOverLimit() {
        if (results != null && results.size() > 50) {
            return true;
        }
        return false;
    }
 
    public Xin_SearchVisitorPlace () {
        this.results = new List<Account>();
    }
 
    public void search() {
        // 検索条件を用意
        String query = System.currentPageReference().getParameters().get('q');
        String reporterState = System.currentPageReference().getParameters().get('r');
        if (query == null || query == '') {
            return;
        }
        system.debug('reporterState=' + reporterState);
        this.search(query, reporterState);
    }
 
    /**
     * Xin_SearchVisitorPlaceRest などから呼び出す
     */
    public void search(String query, String reporterState) {
        List<String> qwords = new List<String>();
        List<String> qwordstmp = query.split(' ');
        String nameCondition = '';
        for (String qword : qwordstmp) {
            if (String.isBlank(qword) == false) {
                qwords.add('%' + String.escapeSingleQuotes(qword.replaceAll('%', '')) + '%');
                nameCondition += ' Name_for_Daily_Report_text__c like \'' + qwords[qwords.size() - 1] + '\' and';
            }
        }
        
        if(qwords.size() < 2 && query.length() < 3) {
            return;
        }
 
        // 検索
//        this.results = [select id, Name from Account where Name like :nameCondition and Parent.Parent.RecordType.DeveloperName = 'HP' and Is_Active__c <> '無効' and Parent.Parent.Is_Active__c <> '無効' order by Name limit 30];
        String queryString = 'select Id, Name, Department_Class__c, Department_Class__r.Name, Hospital__c, Hospital__r.Name from Account where' + nameCondition + ' Hospital__r.RecordType.DeveloperName = \'HP\' and Is_Active__c <> \'無効\' order by Name limit 51';
        system.debug('queryString=' + queryString);
        Map<Id, Account> accMap = new Map<Id, Account>((List<Account>) Database.query(queryString));
        if (accMap.size() <= 50) {
            // さらに省単位のデータを検索
            Map<Id, Account> stateDepartmentMap = selectDepartByHospitalState(nameCondition, reporterState, 51 - accMap.size());
            if (stateDepartmentMap.size() > 0) {
                for (Id accId : stateDepartmentMap.keySet()) {
                    if (!accMap.containsKey(accId)) {
                        accMap.put(accId, stateDepartmentMap.get(accId));
                    }
                }
            }
        }
        this.results = accMap.values();                         // values()の場合、順序わからないです
        this.results.sort();                                    // order by Name
        //this.results = Database.Query('select id, Name from Account where Name like ' + nameCondition + ' AND Id NOT IN (select AccountId From AccountShare where UserOrGroupId = \'00510000000gaBh\' and RowCause = \'ImplicitParent\' ) order by Name limit 30');
    }
    // 省単位 or 全国の診療科を検索,最初の50件
    public Map<Id, Account> selectDepartByHospitalState(String nameCondition, String reporterState, Integer limitCnt) {
        User loginUser = [Select Id, State_Hospital__c, Job_Category__c from User where Id =: UserInfo.getUserId()];
        String queryString = 'select Id, Name, Department_Class__c, Department_Class__r.Name, Hospital__c, Hospital__r.Name from Account where' + nameCondition + ' Hospital__r.RecordType.DeveloperName = \'HP\' and Is_Active__c <> \'無効\'';
        if (loginUser.Job_Category__c == 'GI市场'
                || loginUser.Job_Category__c == 'SP市场'
                || loginUser.Job_Category__c == '服务本部'
                || loginUser.Job_Category__c == '培训'
        ) {
            // 全国範囲、なにもしない
        } else {
            // 省単位の条件追加
            system.debug('selectDepartByHospitalState reporterState=' + reporterState);
            queryString += ' and Parent.Parent.State_Master__r.Name = :reporterState';
        }
        queryString += ' order by Name limit :limitCnt';
        system.debug('selectDepartByHospitalState queryString=' + queryString);
        return new Map<Id, Account>((List<Account>) Database.query(queryString));
    }
}