高章伟
2022-02-18 8b5f4c6c281cfa548f92de52c8021e37aa81901e
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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
public with sharing class LookupController {
 
    /*
    调用此公用页面的思路
    1.url需要传 对象名
    2.根据 对象名 去判断 检索的字段 limit 注意分页
    3.页面上根据对象名 去判断显示的内容
    4.需要修改的地方 请检索 PleaseJudge 即检索的字段? where ? 分页? 前台显示 ?
    5.对于后面所有调整 请在ModelLendingProduct__c 后面进行分支判断 ,不要修改 请在ModelLendingProduct__c的内容
      因为此自定义元数据 有很多标准对象没有 修改时请考虑 请在ModelLendingProduct__c 功能可以正常使用!
    */
 
    //页面循环遍历
    public List<LookUpLine> activities { get; set; }
 
    //参数值
    //模糊检索框
    public string SObjectName {get; set;}
 
    //定义 本次使用的  对象
    public List<SObject> results {get; set;}
 
    //模糊检索框
    public string searchString {get; set;}
 
    //分页用
    private integer totalRecs = 0;
    private integer OffsetSize = 0;
    private integer LimitSize {get; set;}
 
 
    //公用标题
    public String title {get; set;}
 
    //公用搜索名称
    public String searchLabel {get; set;}
 
    //初始化无参方法
    public LookupController() {
 
        // 筛选条件搜索框
        //SObjectName
        SObjectName = System.currentPageReference().getParameters().get('SObjectName');
 
        //模型出借型号
        searchString = System.currentPageReference().getParameters().get('searchLike');
 
        //暂定一个标题 未来改成公共的 请再此基础上增加判断
        //PleaseJudge 下次调用时,需判断
        if(SObjectName.equals('ModelLendingProduct__c')){
            title = '模型出借型号检索';
            LimitSize = 20;
            searchLabel = '型号or产品名称';
        }else{
            title = '请自定义内容';
            //自定义 10条
            LimitSize = 10;
            searchLabel = 'Name';
        }
 
 
        runSearch();
 
    }
 
    // 模糊检索方法 精琢技术 wql  20210401 start ----------------------------------
    public PageReference search() {
        runSearch();
        return null;
    }
 
    private void runSearch() {
        //检索数据
        results = performSearch(searchString);
        //动态拼接传递前台
        setActivities(results);
        System.debug('results:'+results);
        
    }
 
    private List<SObject> performSearch(string searchString) {
        
        String sql = soql(SObjectName,searchString);
        //考虑超50001 限制
        String totalSQL = sql + ' limit 2000 ';      
        String soql = sql;
        //按创建时间 倒序
            soql = soql + ' order by createdDate desc';
        
            soql = soql + ' limit ' + LimitSize;      
        System.debug(soql);
        
        // if (searchString != '' && searchString != null) {
        //     totalRecs = database.query(sql).size();
        //     OffsetSize= 0;
        // }else{
        //     //总条数
        //     totalRecs = database.query(sql).size();
            
        // }
        OffsetSize= 0;
        totalRecs = database.query(totalSQL).size();
        System.debug('totalRecs:' + totalRecs);
 
        return database.query(soql);
 
    }
    //自定义 soql
    public String soql (string SObjectName,string searchString){
        //定义sql  前半部分 -------------------------------------------------
        String soql = 'select id,name ';
 
        //检索字段集 
        //中间字段 
        String fieldList = ',Product__c,productName__c,ModelAndProductName__c,createdDate  ';
 
        //如果是查找 自定义元数据 则拼接查找字段 
        //PleaseJudge 下次调用时,需判断
        if(SObjectName.equals('ModelLendingProduct__c')){
            soql = soql + fieldList;
        }
        soql = soql + ' from '+ SObjectName;
 
        //用于区分 是否有筛选条件的 数据list
        if (searchString != '' && searchString != null){
            //PleaseJudge 下次调用时,需判断
            if(SObjectName.equals('ModelLendingProduct__c')){
                soql = soql +  ' where ModelAndProductName__c LIKE \'%' + searchString + '%\'' ;
            }else{
                soql = soql +  ' where name LIKE \'%' + searchString + '%\'';
            }
            
        }
            
        return soql;
 
    }
 
    //检索出的数据 动态构造 传递前台
    private void setActivities(List<SObject> results) {
        //动态赋值 传到前台遍历
        if(results.size()>0){
            activities = new List<LookUpLine>();
            for(Sobject s :results ){
                LookUpLine c = new LookUpLine(SObjectName, s);
                if(c!=null){
                    activities.add(c);
                }
                
            }
            
        }
    }
 
    // 模糊检索方法 精琢技术 wql  20210401 end ----------------------------------
 
    //分页 精琢技术 wql  20210401 start -------------------------------------------------
    public List<LookUpLine> getModelCode() {
        if (results == null) {
            results = new list<SObject> ();
            //用于区分 是否有筛选条件的 数据list satrt
 
            String soql2 = soql(SObjectName,searchString);
            //检索后应该重新给总条数赋值
            // if (searchString != '' && searchString != null) {
            //     totalRecs = database.query(soql2).size();
            // }else{
            //     //总条数
            //     //PleaseJudge 下次调用时,需判断
            //     totalRecs = database.query(soql2).size();
                
            // }
            //考虑超50001 限制
            String totalSQL = soql2 + ' limit 2000 ';   
            totalRecs = database.query(totalSQL).size();
            //用于区分 是否有筛选条件的 数据list end
            System.debug('totalRecs2:' + totalRecs);
            //遍历分页显示的list
            for (SObject pl : Database.Query(soql2+' LIMIT :LimitSize OFFSET :OffsetSize')) {
                    results.add(pl);
                }
            
        }
        //动态传值到前台
        setActivities(results);
        return activities;
    }
 
    //首页
    public PageReference FirstPage() {
        OffsetSize = 0;
        results = null;
        return null;
    }
    //上一页
    public PageReference previous() {
        OffsetSize = OffsetSize - LimitSize;
        results = null;
        return null;
    }
    //下一页
    public PageReference next() {
        OffsetSize = OffsetSize + LimitSize;
        results = null;
        return null;
    }
    //尾页
    public PageReference LastPage() {
        OffsetSize = totalrecs - math.mod(totalRecs, LimitSize);
        results = null;
        return null;
    }
    //disabled 样式 首页+上一页
    public boolean getprev() {
        if (OffsetSize > 0)
            return false;
        else
            return true;
    }
    //disabled 样式 尾页+下一页
    public boolean getnxt() {
        if ((OffsetSize + LimitSize) < totalRecs){
          System.debug('totalRecs2:'+totalRecs);
          System.debug('OffsetSize2:'+OffsetSize);
          System.debug('false1');
            return false;
        }else{
            System.debug('false2');
            return true;
        }
 
    }
    //获取页码
    public Integer getPageNumber() {
        
        //限制最多检索2000条时有问题
        integer osCount = 0;
        if(OffsetSize == 2000){
            osCount = OffsetSize / LimitSize;
        }else{
            osCount = OffsetSize / LimitSize + 1;
        }
 
        return osCount;
 
        //原逻辑
        //return OffsetSize / LimitSize + 1;
 
    }
    //获取总页数
    public Integer getTotalPages() {
        
        if (math.mod(totalRecs, LimitSize) > 0) {
            return totalRecs / LimitSize + 1;
        } else {
            return (totalRecs / LimitSize);
        }
    }
    //分页 精琢技术 wql  20210401 end -------------------------------------------------
    
    //发现 action的执行先后顺序有问题 使用actionFunction 强行将 分页按钮刷新的顺序排在最后 satrt
    public PageReference loadPage() {
        getprev();
        getnxt();
        getPageNumber();
        getTotalPages();
        
 
        return null;
    }
    //发现 action的执行先后顺序有问题 使用actionFunction 强行将 分页按钮刷新的顺序排在最后 end
 
    //封装类 自定义 字段 用于前台遍历
    public class LookUpLine {
        //标准id字段
        public Id Id { get; set; }
        //String 自定义字段
        public String  Lid{ get; set; }   
        public String  Name { get; set; }
        public String  LName { get; set; }
 
            //有参构造 
            //PleaseJudge 下次调用时,需判断
            public LookUpLine(String SObjectName,SObject so) {
                if(SObjectName.equals('ModelLendingProduct__c')){
                    this.Id = (Id)so.get('id');
                    this.Name =(String)so.get('name');
                    this.Lid =(String)so.get('Product__c');
                    this.LName =(String)so.get('productName__c');
 
                }else{
                    this.Id = (Id)so.get('id');
                    this.Name =(String)so.get('name');
                }
 
        }
 
    }
 
    
 
 
}