Skip to main content

br_addon/
tables.rs

1use br_db::Db;
2use br_fields::Field;
3use json::{array, object, JsonValue};
4use std::collections::HashMap;
5
6#[allow(clippy::too_many_arguments)]
7#[cfg(any(
8    feature = "sqlite",
9    feature = "mssql",
10    feature = "mysql",
11    feature = "pgsql"
12))]
13pub struct Tables {
14    /// 主数据表名称
15    main_table: String,
16    /// 数据库
17    db: Db,
18    /// 记录总数量
19    total: f64,
20    /// 字段数据
21    fields: Vec<JsonValue>,
22    /// 连表查询
23    join_params: Vec<Vec<String>>,
24    /// 字段值集合
25    fields_keys: Vec<String>,
26    /// 联表字段
27    join_fields: Vec<String>,
28    /// 隐藏字段
29    hide_fields: Vec<String>,
30    /// 显示字段
31    show_fields: Vec<String>,
32    /// 合计字段
33    total_fields: Vec<String>,
34    /// 数据
35    data: JsonValue,
36    /// 页数
37    page: usize,
38    /// 总页数
39    pages: i64,
40    /// 每页数量
41    limit: usize,
42    /// 搜索内容
43    search: String,
44    /// 搜索字段
45    search_fields: Vec<String>,
46    /// 搜索框名称
47    search_name: String,
48    /// 可以编辑字段
49    edit_fields: Vec<String>,
50    /// 排序
51    /// array![array!["id",false]]
52    order: JsonValue,
53    /// 过滤条件
54    /// array![array!["id","=","*"]]
55    where_and: JsonValue,
56    /// 过滤条件
57    /// array![array!["id","=","*"]]
58    where_or: JsonValue,
59    /// 过滤字段
60    filter_fields: Vec<String>,
61    /// 表单关联字段
62    table_fields: Vec<String>,
63    /// 表单关联多选字段
64    table_multiple_fields: Vec<String>,
65    /// 树形关联字段
66    tree_fields: Vec<String>,
67    /// JSON字段
68    json_fields: Vec<String>,
69    /// 地图字段
70    location_fields: Vec<String>,
71    /// 显示的主键
72    primary_key: String,
73    /// 选中值
74    value: Vec<String>,
75    version: usize,
76    /// 树形pid
77    pid_id: String,
78}
79impl Tables {
80    pub fn params_table(mut params: JsonValue) -> JsonValue {
81        params["page"] = br_fields::int::Int::new(false, "page", "页数", 10, 1)
82            .example(1.into())
83            .field();
84        params["limit"] = br_fields::int::Int::new(false, "limit", "行数", 10, 10)
85            .example(10.into())
86            .field();
87        params["order"] = br_fields::text::Array::new(false, "order", "排序", array![]).field();
88        params["search"] = br_fields::str::Str::new(false, "search", "搜索", 200, "")
89            .example("".into())
90            .field();
91        params["where_or"] = br_fields::text::Array::new(false, "where_or", "查询条件", array![])
92            .example(array![])
93            .field();
94        params["where_and"] = br_fields::text::Array::new(false, "where_and", "查询条件", array![])
95            .example(array![])
96            .field();
97        params["params"] =
98            br_fields::text::Object::new(false, "params", "关联数据参数", object! {})
99                .describe("如果是表单就是表单里的其他字段")
100                .example(object! {})
101                .field();
102        params
103    }
104    pub fn params_table_tree(mut params: JsonValue) -> JsonValue {
105        params["pid"] = br_fields::str::Str::new(false, "pid", "上级ID", 50, "")
106            .example("".into())
107            .field();
108        Tables::params_table_select(params)
109    }
110    pub fn params_table_select(mut params: JsonValue) -> JsonValue {
111        params["value"] = br_fields::text::Array::new(false, "value", "已选中值", array![]).field();
112        params["primary_key"] =
113            br_fields::str::Str::new(false, "primary_key", "显示内容的字段", 50, "id").field();
114        Tables::params_table(params)
115    }
116    pub fn params_table_select_tree(mut params: JsonValue) -> JsonValue {
117        params["pid"] = br_fields::str::Str::new(false, "pid", "上级ID", 20, "")
118            .example("".into())
119            .field();
120        params["value"] = br_fields::text::Array::new(false, "value", "已选中值", array![]).field();
121        Tables::params_table(params)
122    }
123    pub fn new(db: Db) -> Self {
124        Self {
125            main_table: "".to_string(),
126            db,
127            total: 0.0,
128            fields: vec![],
129            join_params: vec![],
130            fields_keys: vec![],
131            data: array![],
132            page: 1,
133            pages: 0,
134            limit: 10,
135            search: "".to_string(),
136            search_fields: vec![],
137            search_name: "".to_string(),
138            edit_fields: vec![],
139            order: array![],
140            where_and: array![],
141            where_or: array![],
142            filter_fields: vec![],
143            table_fields: vec![],
144            table_multiple_fields: vec![],
145            tree_fields: vec![],
146            json_fields: vec![],
147            location_fields: vec![],
148            primary_key: "".to_string(),
149            value: vec![],
150            version: 0,
151            join_fields: vec![],
152            hide_fields: vec![],
153            show_fields: vec![],
154            total_fields: vec![],
155            pid_id: "".to_string(),
156        }
157    }
158    pub fn set_version(&mut self, version: usize) -> &mut Self {
159        self.version = version;
160        self
161    }
162    pub fn main_table_fields(
163        &mut self,
164        table: &str,
165        fields: JsonValue,
166        hide_fields: Vec<&str>,
167        show_fields: Vec<&str>,
168    ) -> &mut Self {
169        self.main_table = table.to_string();
170        self.hide_fields = hide_fields.iter().map(|s| s.to_string()).collect();
171        self.show_fields = show_fields.iter().map(|s| s.to_string()).collect();
172        self.fields = fields
173            .entries()
174            .map(|(_, x)| x.clone())
175            .collect::<Vec<JsonValue>>();
176        self
177    }
178    pub fn join_fields(&mut self, table: &str, mut fields: JsonValue, index: isize) -> &mut Self {
179        for (field, item) in fields.entries_mut() {
180            if self.main_table != table {
181                item["field"] = format!("{table}_{field}").into();
182                item["field_table"] = table.into();
183                item["field_table_field"] = field.into();
184            }
185
186            match index {
187                x if x > -1 => {
188                    // 插入
189                    self.fields.insert(x as usize, item.clone());
190                }
191                _ => {
192                    // 尾部添加
193                    self.fields.push(item.clone());
194                }
195            }
196            self.join_fields.push(format!("{table}.{field}"));
197        }
198        self
199    }
200    pub fn fields(&mut self, fields: JsonValue) -> &mut Self {
201        self.fields = fields
202            .entries()
203            .map(|(_, x)| x.clone())
204            .collect::<Vec<JsonValue>>();
205        self
206    }
207    pub fn hide_fields(&mut self, hide_fields: Vec<&str>) -> &mut Self {
208        self.hide_fields = hide_fields.iter().map(|s| s.to_string()).collect();
209        self
210    }
211    pub fn show_fields(&mut self, show_fields: Vec<&str>) -> &mut Self {
212        self.show_fields = show_fields.iter().map(|s| s.to_string()).collect();
213        self
214    }
215    pub fn total_fields(&mut self, fields: Vec<&str>) -> &mut Self {
216        self.total_fields = fields.iter().map(|s| s.to_string()).collect();
217        self
218    }
219    fn set_fields(&mut self, field: &str, mode: &str) {
220        match mode {
221            "table" => self.table_fields.push(field.to_string()),
222            "table_multiple" => {
223                self.table_multiple_fields.push(field.to_string());
224                self.json_fields.push(field.to_string());
225            }
226            "tree" => self.tree_fields.push(field.to_string()),
227            "object" | "array" | "polygon" => self.json_fields.push(field.to_string()),
228            "location" => self.location_fields.push(field.to_string()),
229            _ => {}
230        }
231    }
232    pub fn join_table(
233        &mut self,
234        main_table: &str,
235        main_field: &str,
236        join_table: &str,
237        join_field: &str,
238    ) -> &mut Self {
239        self.join_params.push(vec![
240            main_table.to_string(),
241            main_field.to_string(),
242            join_table.to_string(),
243            join_field.to_string(),
244        ]);
245        self
246    }
247    pub fn main_select_fields(&mut self, table: &str, mut show_fields: Vec<&str>) -> &mut Self {
248        self.main_table = table.to_string();
249        show_fields.insert(0, "id");
250        self.fields_keys = show_fields.into_iter().map(|x| x.to_string()).collect();
251        self.search_fields = self.fields_keys.clone();
252        self
253    }
254
255    pub fn edit_fields(&mut self, fields: Vec<&str>) -> &mut Self {
256        self.edit_fields = fields.iter().map(|s| s.to_string()).collect();
257        self
258    }
259    pub fn search_fields(&mut self, fields: Vec<&str>) -> &mut Self {
260        let mut search_name = vec![];
261        let all_fields = self
262            .fields
263            .iter()
264            .map(|x| (x["field"].to_string(), x.clone()))
265            .collect::<HashMap<String, JsonValue>>();
266        for key in fields.clone() {
267            if let Some(field_info) = all_fields.get(key) {
268                self.search_fields.push(key.to_string());
269                search_name.push(field_info["title"].to_string());
270            }
271        }
272        self.search_name = search_name.join("/");
273        self
274    }
275    /// 条件过滤
276    pub fn filter_fields(&mut self, fields: Vec<&str>) -> &mut Self {
277        let all_fields = self
278            .fields
279            .iter()
280            .map(|x| (x["field"].to_string(), x.clone()))
281            .collect::<HashMap<String, JsonValue>>();
282        for key in fields.clone() {
283            if all_fields.contains_key(key) {
284                self.filter_fields.push(key.to_string());
285            }
286        }
287        self
288    }
289    /// 请求参数
290    pub fn params(&mut self, request: JsonValue) -> &mut Self {
291        if request.has_key("page") {
292            self.page = request["page"].as_usize().unwrap_or(1);
293        }
294        if request.has_key("limit") {
295            self.limit = request["limit"].as_usize().unwrap_or(10);
296        }
297        if request.has_key("where_and") {
298            self.where_and = request["where_and"].clone();
299        }
300        if request.has_key("where_or") {
301            self.where_or = request["where_or"].clone();
302        }
303
304        if request.has_key("pid") {
305            self.pid_id = request["pid"].as_str().unwrap_or("").to_string();
306        }
307
308        if request.has_key("order") {
309            for item in request["order"].members() {
310                let _ = self.order.push(item.clone());
311            }
312        }
313        if request.has_key("search") {
314            self.search = request["search"].to_string();
315        }
316        if request.has_key("primary_key") {
317            self.primary_key = request["primary_key"].to_string();
318        }
319        if request.has_key("value") {
320            self.value = request["value"]
321                .members()
322                .map(|x| x.as_str().unwrap_or("").to_string())
323                .filter(|x| !x.is_empty())
324                .collect();
325        }
326        self
327    }
328
329    fn db_search(&mut self) {
330        if !self.search.is_empty() {
331            let mut all_fields = object! {};
332            let _ = self
333                .fields
334                .iter()
335                .map(|x| all_fields.insert(x["field"].as_str().unwrap_or_default(), x.clone()))
336                .collect::<Vec<_>>();
337
338            let mut t = vec![];
339            for value in self.search_fields.clone() {
340                let field = all_fields[value.as_str()].clone();
341                if field.has_key("field_table") {
342                    t.push(format!(
343                        "{}.{}",
344                        field["field_table"].clone(),
345                        field["field_table_field"].clone()
346                    ));
347                } else {
348                    t.push(value);
349                }
350            }
351            self.db
352                .where_and(&t.join("|"), "like", format!("%{}%", self.search).into());
353        }
354    }
355    fn db_where(&mut self) {
356        let mut all_fields = object! {};
357        let _ = self
358            .fields
359            .iter()
360            .map(|x| all_fields.insert(x["field"].as_str().unwrap_or_default(), x.clone()))
361            .collect::<Vec<_>>();
362
363        for value in self.where_or.members() {
364            let field = all_fields[value[0].to_string()].clone();
365            if field.has_key("field_table") {
366                self.db.where_or(
367                    format!(
368                        "{}.{}",
369                        field["field_table"].clone(),
370                        field["field_table_field"].clone()
371                    )
372                    .as_str(),
373                    value[1].as_str().unwrap_or("="),
374                    value[2].clone(),
375                );
376            } else {
377                self.db.where_or(
378                    value[0].as_str().unwrap_or_default(),
379                    value[1].as_str().unwrap_or("="),
380                    value[2].clone(),
381                );
382            }
383        }
384        for value in self.where_and.members() {
385            let field = all_fields[value[0].to_string()].clone();
386            if field.has_key("field_table") {
387                self.db.where_and(
388                    format!(
389                        "{}.{}",
390                        field["field_table"].clone(),
391                        field["field_table_field"].clone()
392                    )
393                    .as_str(),
394                    value[1].as_str().unwrap_or("="),
395                    value[2].clone(),
396                );
397            } else {
398                self.db.where_and(
399                    value[0].as_str().unwrap_or_default(),
400                    value[1].as_str().unwrap_or("="),
401                    value[2].clone(),
402                );
403            }
404        }
405    }
406    fn db_order(&mut self) {
407        let mut all_fields = object! {};
408        let _ = self
409            .fields
410            .iter()
411            .map(|x| all_fields.insert(x["field"].as_str().unwrap_or_default(), x.clone()))
412            .collect::<Vec<_>>();
413
414        for item in self.order.members() {
415            let field = all_fields[item[0].to_string()].clone();
416            if field.has_key("field_table") {
417                self.db.order(
418                    format!(
419                        "{}.{}",
420                        field["field_table"].clone(),
421                        field["field_table_field"].clone()
422                    )
423                    .as_str(),
424                    item[1].as_bool().unwrap_or(false),
425                );
426            } else {
427                self.db.order(
428                    format!("{}.{}", self.main_table, item[0]).as_str(),
429                    item[1].as_bool().unwrap_or(false),
430                );
431            }
432        }
433    }
434    fn db_fields(&mut self) {
435        let mut all_fields = object! {};
436        let _ = self
437            .fields
438            .iter()
439            .map(|x| all_fields.insert(x["field"].as_str().unwrap_or_default(), x.clone()))
440            .collect::<Vec<_>>();
441
442        if !self.hide_fields.is_empty() {
443            for field in self.hide_fields.clone() {
444                if all_fields.has_key(&field) {
445                    all_fields.remove(&field);
446                    continue;
447                }
448            }
449        }
450
451        if !self.show_fields.is_empty() {
452            self.show_fields.insert(0, "id".to_string());
453            let mut f = object! {};
454            for field in self.show_fields.clone() {
455                if all_fields.has_key(&field) {
456                    let _ = f.insert(&field.clone(), all_fields[field].clone());
457                }
458            }
459            all_fields = f;
460        }
461
462        for (field, item) in all_fields.entries() {
463            let mode = item["mode"].to_string();
464            self.set_fields(field, mode.as_str());
465        }
466
467        self.fields = all_fields
468            .entries()
469            .map(|(_, x)| x.clone())
470            .collect::<Vec<JsonValue>>();
471
472        if !self.fields_keys.is_empty() {
473            self.db.field(self.fields_keys.join(",").as_str());
474        }
475        if !self.json_fields.is_empty() {
476            self.db.json(self.json_fields.join(",").as_str());
477        }
478        if !self.location_fields.is_empty() {
479            self.db.location(self.location_fields.join(",").as_str());
480        }
481    }
482    fn db_join(&mut self) {
483        if !self.join_fields.is_empty() {
484            self.db
485                .join_fields(self.join_fields.iter().map(|x| x.as_str()).collect());
486        }
487        for item in self.join_params.iter() {
488            self.db.join(&item[0], &item[1], &item[2], &item[3]);
489        }
490    }
491    fn db_total(&mut self) {
492        self.total = self.db.clone().count().as_f64().unwrap_or(0.0);
493        self.pages = (self.total / (self.limit as f64)).ceil() as i64;
494    }
495    fn db_table(&mut self) {
496        let mut all_fields = object! {};
497        let _ = self
498            .fields
499            .iter()
500            .map(|x| {
501                let _ = all_fields.insert(x["field"].as_str().unwrap_or_default(), x.clone());
502            })
503            .collect::<Vec<_>>();
504
505        let mut table_data = object! {};
506        for item in self.data.members_mut() {
507            for field in self.table_fields.iter() {
508                let key = item[field].as_str().unwrap_or("");
509                if key.is_empty() {
510                    continue;
511                }
512                let field_info = all_fields[field].clone();
513
514                if !table_data.has_key(field) {
515                    table_data[field] = object! {};
516                }
517                if !table_data[field].has_key(key) {
518                    let mut info = field_info.clone();
519                    let _ = info["fields"].push("id");
520                    let fields_k = info["fields"]
521                        .members()
522                        .map(|x| x.as_str().unwrap_or_default())
523                        .collect::<Vec<&str>>();
524                    let mut find = self
525                        .db
526                        .table(info["table"].as_str().unwrap_or_default())
527                        .where_and("id", "=", key.into())
528                        .field(&fields_k.join(","))
529                        .find();
530                    let id = find["id"].to_string();
531                    find.remove("id");
532                    let label = find
533                        .entries()
534                        .map(|(_, v)| v.to_string())
535                        .collect::<Vec<String>>();
536                    table_data[field][key] = object! {
537                                value: id.clone(),
538                                label:label.join(" | ").clone(),
539                    };
540                }
541                item[field] = table_data[field][key].clone();
542            }
543            for field in self.tree_fields.iter() {
544                let key = item[field].as_str().unwrap_or("");
545                if key.is_empty() {
546                    continue;
547                }
548                let field_info = all_fields[field].clone();
549                if !table_data.has_key(field) {
550                    table_data[field] = object! {};
551                }
552                if !table_data[field].has_key(key) {
553                    let mut info = field_info.clone();
554                    let pid_field = info["pid_field"].clone().to_string();
555                    let _ = info["fields"].push("id");
556                    let _ = info["fields"].push(pid_field.clone());
557                    let fields_k = info["fields"]
558                        .members()
559                        .map(|x| x.as_str().unwrap_or_default())
560                        .collect::<Vec<&str>>();
561                    let mut find = self
562                        .db
563                        .table(info["table"].as_str().unwrap_or_default())
564                        .where_and("id", "=", key.into())
565                        .field(&fields_k.join(","))
566                        .find();
567                    let mut pid = find[pid_field.clone()].to_string();
568                    let mut name_list = vec![];
569                    let id = find["id"].to_string();
570                    find.remove("id");
571                    find.remove(&pid_field);
572                    let label = find
573                        .entries()
574                        .map(|(_, v)| v.to_string())
575                        .collect::<Vec<String>>();
576                    name_list.push(label.join(" | ").clone());
577                    loop {
578                        if pid.is_empty() {
579                            break;
580                        }
581                        let mut t = self
582                            .db
583                            .table(info["table"].as_str().unwrap_or_default())
584                            .where_and("id", "=", pid.clone().into())
585                            .field(&fields_k.join(","))
586                            .find();
587                        pid = t[pid_field.clone()].to_string();
588                        t.remove("id");
589                        t.remove(&pid_field);
590                        let label = t
591                            .entries()
592                            .map(|(_, v)| v.to_string())
593                            .collect::<Vec<String>>();
594                        name_list.push(label.join(" | ").clone());
595                    }
596                    name_list.reverse();
597                    table_data[field][key] = object! {
598                            value: id.clone(),
599                            label:name_list.join("/").clone(),
600                    };
601                }
602                item[field] = table_data[field][key].clone();
603            }
604            for field in self.table_multiple_fields.iter() {
605                let ids = item[field].clone();
606                if !ids.is_array() || ids.is_empty() {
607                    item[field] = array![];
608                    continue;
609                }
610                let field_info = all_fields[field].clone();
611                if !table_data.has_key(field) {
612                    table_data[field] = object! {};
613                }
614                let mut result = array![];
615                for id_val in ids.members() {
616                    let key = id_val.as_str().unwrap_or("");
617                    if key.is_empty() {
618                        continue;
619                    }
620                    if !table_data[field].has_key(key) {
621                        let mut info = field_info.clone();
622                        let _ = info["fields"].push("id");
623                        let fields_k = info["fields"]
624                            .members()
625                            .map(|x| x.as_str().unwrap_or_default())
626                            .collect::<Vec<&str>>();
627                        let mut find = self
628                            .db
629                            .table(info["table"].as_str().unwrap_or_default())
630                            .where_and("id", "=", key.into())
631                            .field(&fields_k.join(","))
632                            .find();
633                        let id = find["id"].to_string();
634                        find.remove("id");
635                        let label = find
636                            .entries()
637                            .map(|(_, v)| v.to_string())
638                            .collect::<Vec<String>>();
639                        table_data[field][key] = object! {
640                            value: id.clone(),
641                            label: label.join(" | ").clone(),
642                        };
643                    }
644                    let _ = result.push(table_data[field][key].clone());
645                }
646                item[field] = result;
647            }
648        }
649    }
650    fn db_table_tree(&mut self, pid_field: &str) {
651        let mut all_fields = object! {};
652        let _ = self
653            .fields
654            .iter()
655            .map(|x| {
656                let _ = all_fields.insert(x["field"].as_str().unwrap_or_default(), x.clone());
657            })
658            .collect::<Vec<_>>();
659
660        let mut table_data = object! {};
661        for item in self.data.members_mut() {
662            let find = self
663                .db
664                .table(&self.main_table)
665                .where_and(pid_field, "=", item["id"].clone())
666                .count();
667            if find.is_empty() {
668                item["isLeaf"] = true.into();
669            }
670
671            for field in self.table_fields.iter() {
672                let key = item[field].as_str().unwrap_or("");
673                if key.is_empty() {
674                    continue;
675                }
676                let field_info = all_fields[field].clone();
677
678                if !table_data.has_key(field) {
679                    table_data[field] = object! {};
680                }
681                if !table_data[field].has_key(key) {
682                    let mut info = field_info.clone();
683                    let _ = info["fields"].push("id");
684                    let fields_k = info["fields"]
685                        .members()
686                        .map(|x| x.as_str().unwrap_or_default())
687                        .collect::<Vec<&str>>();
688                    let mut find = self
689                        .db
690                        .table(info["table"].as_str().unwrap_or_default())
691                        .where_and("id", "=", key.into())
692                        .field(&fields_k.join(","))
693                        .find();
694                    let id = find["id"].to_string();
695                    find.remove("id");
696                    let label = find
697                        .entries()
698                        .map(|(_, v)| v.to_string())
699                        .collect::<Vec<String>>();
700                    table_data[field][key] = object! {
701                                value: id.clone(),
702                                label:label.join(" | ").clone(),
703                    };
704                }
705                item[field] = table_data[field][key].clone();
706            }
707            for field in self.tree_fields.iter() {
708                let key = item[field].as_str().unwrap_or("");
709                if key.is_empty() {
710                    continue;
711                }
712                let field_info = all_fields[field].clone();
713                if !table_data.has_key(field) {
714                    table_data[field] = object! {};
715                }
716                if !table_data[field].has_key(key) {
717                    let mut info = field_info.clone();
718                    let pid_field = info["pid_field"].clone().to_string();
719                    let _ = info["fields"].push("id");
720                    let _ = info["fields"].push(pid_field.clone());
721                    let fields_k = info["fields"]
722                        .members()
723                        .map(|x| x.as_str().unwrap_or_default())
724                        .collect::<Vec<&str>>();
725                    let mut find = self
726                        .db
727                        .table(info["table"].as_str().unwrap_or_default())
728                        .where_and("id", "=", key.into())
729                        .field(&fields_k.join(","))
730                        .find();
731                    let mut pid = find[pid_field.clone()].to_string();
732                    let mut name_list = vec![];
733                    let id = find["id"].to_string();
734                    find.remove("id");
735                    find.remove(&pid_field);
736                    let label = find
737                        .entries()
738                        .map(|(_, v)| v.to_string())
739                        .collect::<Vec<String>>();
740                    name_list.push(label.join(" | ").clone());
741                    loop {
742                        if pid.is_empty() {
743                            break;
744                        }
745                        let mut t = self
746                            .db
747                            .table(info["table"].as_str().unwrap_or_default())
748                            .where_and("id", "=", pid.clone().into())
749                            .field(&fields_k.join(","))
750                            .find();
751                        pid = t[pid_field.clone()].to_string();
752                        t.remove("id");
753                        t.remove(&pid_field);
754                        let label = t
755                            .entries()
756                            .map(|(_, v)| v.to_string())
757                            .collect::<Vec<String>>();
758                        name_list.push(label.join(" | ").clone());
759                    }
760                    name_list.reverse();
761                    table_data[field][key] = object! {
762                            value: id.clone(),
763                            label:name_list.join("/").clone(),
764                    };
765                }
766                item[field] = table_data[field][key].clone();
767            }
768            for field in self.table_multiple_fields.iter() {
769                let ids = item[field].clone();
770                if !ids.is_array() || ids.is_empty() {
771                    item[field] = array![];
772                    continue;
773                }
774                let field_info = all_fields[field].clone();
775                if !table_data.has_key(field) {
776                    table_data[field] = object! {};
777                }
778                let mut result = array![];
779                for id_val in ids.members() {
780                    let key = id_val.as_str().unwrap_or("");
781                    if key.is_empty() {
782                        continue;
783                    }
784                    if !table_data[field].has_key(key) {
785                        let mut info = field_info.clone();
786                        let _ = info["fields"].push("id");
787                        let fields_k = info["fields"]
788                            .members()
789                            .map(|x| x.as_str().unwrap_or_default())
790                            .collect::<Vec<&str>>();
791                        let mut find = self
792                            .db
793                            .table(info["table"].as_str().unwrap_or_default())
794                            .where_and("id", "=", key.into())
795                            .field(&fields_k.join(","))
796                            .find();
797                        let id = find["id"].to_string();
798                        find.remove("id");
799                        let label = find
800                            .entries()
801                            .map(|(_, v)| v.to_string())
802                            .collect::<Vec<String>>();
803                        table_data[field][key] = object! {
804                            value: id.clone(),
805                            label: label.join(" | ").clone(),
806                        };
807                    }
808                    let _ = result.push(table_data[field][key].clone());
809                }
810                item[field] = result;
811            }
812        }
813    }
814    fn columns(&mut self) -> JsonValue {
815        let mut all_fields = object! {};
816        let _ = self
817            .fields
818            .iter()
819            .map(|x| {
820                let _ = all_fields.insert(x["field"].as_str().unwrap_or_default(), x.clone());
821            })
822            .collect::<Vec<_>>();
823
824        let sort_field = self
825            .order
826            .members()
827            .map(|x| (x[0].to_string(), x[1].as_bool().unwrap_or(false)))
828            .collect::<HashMap<String, bool>>();
829        for (_, item) in all_fields.entries_mut() {
830            item["name"] = item["field"].clone();
831            item["align"] = "center".into();
832            item["label"] = item["title"].clone();
833            item["version"] = self.version.into();
834
835            if item["field"].as_str().unwrap_or("") != "id" {
836                if self.version == 0 {
837                    item["sortable"] = true.into();
838                } else {
839                    item["sortable"] = object! {
840                        "sorter"=>false,
841                        "sortDirections"=>array!["ascend","descend"],
842                        "defaultSortOrder"=>"",
843                        "sortOrder"=>""
844                    };
845                    if sort_field.contains_key(item["field"].to_string().as_str()) {
846                        item["sortable"]["sortOrder"] =
847                            if *sort_field.get(&item["field"].to_string()).unwrap_or(&false) {
848                                "descend"
849                            } else {
850                                "ascend"
851                            }
852                            .into();
853                    }
854                }
855            }
856            item["dataIndex"] = item["field"].clone();
857            item["slotName"] = item["field"].clone();
858            item["titleSlotName"] = item["field"].clone();
859            match item["mode"].as_str().unwrap_or_default() {
860                "string" | "text" => {
861                    item["ellipsis"] = true.into();
862                    item["tooltip"] = true.into();
863                }
864                "key" => {
865                    item["width"] = 280.into();
866                    item["ellipsis"] = true.into();
867                }
868                _ => {}
869            }
870        }
871        all_fields
872    }
873    pub fn get_table(&mut self) -> JsonValue {
874        self.db.table(&self.main_table);
875        self.db_fields();
876        self.db_search();
877        self.db_where();
878        self.db_join();
879        self.db_total();
880        self.db_order();
881        self.db.page(self.page as i32, self.limit as i32);
882
883        self.data = self.db.select();
884        self.db_table();
885
886        object! {
887            "pages"=>self.pages,
888            "total"=>self.total,
889            "data"=>self.data.clone(),
890            "columns"=>self.columns(),
891            "filter_fields"=>self.filter_fields.clone(),
892            "search_name"=>self.search_name.clone(),
893            "total_fields"=>self.total_fields.clone(),
894            "btn_all"=>array![],
895            "btn_api"=>array![],
896            "btn_ids"=>array![]
897        }
898    }
899    pub fn get_table_menu(&mut self, label_field: &str) -> JsonValue {
900        self.db.table(&self.main_table);
901        self.db_fields();
902        self.db_search();
903        self.db_where();
904        self.db_join();
905        self.db_total();
906        self.db_order();
907        self.db.page(self.page as i32, self.limit as i32);
908
909        self.data = self.db.select();
910        self.db_table();
911
912        object! {
913            "pages"=>self.pages,
914            "total"=>self.total,
915            "data"=>self.data.clone(),
916            "columns"=>self.columns(),
917            "filter_fields"=>self.filter_fields.clone(),
918            "search_name"=>self.search_name.clone(),
919            "total_fields"=>self.total_fields.clone(),
920            "btn_all"=>array![],
921            "btn_api"=>array![],
922            "btn_ids"=>array![],
923            "label_field"=>label_field
924        }
925    }
926
927    pub fn get_tree(&mut self, pid_field: &str) -> JsonValue {
928        self.db.table(&self.main_table);
929        self.set_version(1);
930        self.db
931            .where_and(pid_field, "=", self.pid_id.clone().into());
932        self.db_fields();
933        self.db_search();
934        self.db_where();
935        self.db_join();
936        self.db_total();
937        self.db_order();
938        if self.pid_id.is_empty() {
939            self.db.page(self.page as i32, self.limit as i32);
940        } else {
941            self.db.page(1, 1000);
942        }
943
944        self.data = self.db.select();
945        self.db_table_tree(pid_field);
946
947        object! {
948            "pages"=>self.pages,
949            "total"=>self.total,
950            "data"=>self.data.clone(),
951            "columns"=>self.columns(),
952            "filter_fields"=>self.filter_fields.clone(),
953            "search_name"=>self.search_name.clone(),
954            "total_fields"=>self.total_fields.clone(),
955            "btn_all"=>array![],
956            "btn_api"=>array![],
957            "btn_ids"=>array![]
958        }
959    }
960    pub fn get_table_edit(&mut self) -> JsonValue {
961        self.db.table(&self.main_table);
962        self.db_fields();
963        self.db_search();
964        self.db_where();
965        self.db_total();
966        self.db_order();
967        self.db.page(self.page as i32, self.limit as i32);
968        self.db_join();
969        self.data = self.db.select();
970
971        object! {
972            "pages"=>self.pages,
973            "total"=>self.total,
974            "data"=>self.data.clone(),
975            "columns"=>self.columns(),
976            "edit_fields"=>self.edit_fields.clone(),
977        }
978    }
979    pub fn get_table_select(&mut self) -> JsonValue {
980        self.db.table(&self.main_table);
981        if !self.primary_key.eq("id") {
982            self.fields_keys.remove(0);
983        }
984        if !self.value.is_empty() && self.search.is_empty() {
985            let _ = self
986                .where_or
987                .push(array![self.primary_key.clone(), "in", self.value.clone()]);
988            let _ = self
989                .where_or
990                .push(array![self.primary_key.clone(), "isnot", "NULL"]);
991            let _ = self.order.push(array![
992                format!(
993                    "{} in ('{}')",
994                    self.primary_key.clone(),
995                    self.value.join("','")
996                ),
997                true
998            ]);
999        }
1000        self.db_fields();
1001        self.db_search();
1002        self.db_where();
1003        self.db_join();
1004        self.db_total();
1005        self.db_order();
1006        self.db.page(self.page as i32, self.limit as i32);
1007
1008        let mut list = self.db.select();
1009
1010        for item in list.members_mut() {
1011            let value = item[self.primary_key.clone()].clone();
1012            if self.primary_key.eq("id") {
1013                item.remove(&self.primary_key.clone());
1014            }
1015            let label = item
1016                .entries()
1017                .map(|(_, v)| v.to_string())
1018                .collect::<Vec<String>>();
1019            let _ = self.data.push(object! {
1020                value: value,
1021                label: label.join(" | ").clone(),
1022            });
1023        }
1024
1025        object! {
1026            "pages"=>self.pages,
1027            "total"=>self.total,
1028            "data"=>self.data.clone(),
1029        }
1030    }
1031    pub fn get_table_select_tree(&mut self, pid_field: &str, label_field: &str) -> JsonValue {
1032        self.fields_keys.push(pid_field.to_string());
1033        self.db.table(&self.main_table);
1034        self.db
1035            .where_and(pid_field, "=", self.pid_id.clone().into());
1036
1037        self.db_fields();
1038        self.db_search();
1039        self.db_where();
1040        self.db_join();
1041        self.db_order();
1042        self.db.page(1, 1000);
1043
1044        self.data = self.db.select();
1045
1046        for item in self.data.members_mut() {
1047            let children = self
1048                .db
1049                .table(&self.main_table)
1050                .where_and(pid_field, "=", item["id"].clone())
1051                .count();
1052            if children.is_empty() {
1053                item["lazy"] = false.into();
1054                item["isLeaf"] = true.into();
1055            } else {
1056                item["lazy"] = true.into();
1057            }
1058        }
1059
1060        if self.pid_id.is_empty() {
1061            for id in self.value.clone() {
1062                let mut list = vec![];
1063                let mut find = self
1064                    .db
1065                    .table(&self.main_table)
1066                    .where_and("id", "=", id.into())
1067                    .field(self.fields_keys.join(",").as_str())
1068                    .find();
1069                loop {
1070                    let pid = find[pid_field].to_string();
1071                    if pid.is_empty() {
1072                        break;
1073                    }
1074                    find = self
1075                        .db
1076                        .table(&self.main_table)
1077                        .where_and("id", "=", pid.into())
1078                        .field(self.fields_keys.join(",").as_str())
1079                        .find();
1080                    list.insert(0, find.clone());
1081                }
1082                let data = &mut self.data.clone();
1083                self.tree_data(data, list.into(), 0, pid_field);
1084                self.data = data.clone();
1085            }
1086        }
1087        object! {
1088            "data"=> self.data.clone(),
1089            "label_field"=>label_field.to_string(),
1090            "pid_field"=>pid_field.to_string(),
1091        }
1092    }
1093    fn tree_data(&mut self, data: &mut JsonValue, list: JsonValue, index: usize, pid_field: &str) {
1094        let id = list[index]["id"].clone();
1095        for item in data.members_mut() {
1096            let children = self
1097                .db
1098                .table(&self.main_table)
1099                .where_and(pid_field, "=", item["id"].clone())
1100                .field(self.fields_keys.join(",").as_str())
1101                .select();
1102            if children.is_empty() {
1103                item["isLeaf"] = true.into();
1104            }
1105            if id == item["id"] && !children.is_empty() {
1106                item["children"] = children;
1107                self.tree_data(&mut item["children"], list.clone(), index + 1, pid_field);
1108            }
1109        }
1110    }
1111}