dataforge/filling/
generators.rs

1//! 通用数据生成器模块
2//! 提供各种类型数据的生成方法,供不同数据库填充器使用
3
4use std::collections::HashMap;
5use librarys::random_letters;
6use serde_json::Value;
7use crate::error::Result;
8// 使用 data-forge 的核心生成能力
9use crate::generation::DataForge;
10use crate::db::schema::{TableSchema, FieldSchema, DataType, FieldGeneratorType};
11// 导入需要的生成器模块
12use crate::generators::{number, datetime, internet};
13
14
15/// 通用数据生成器
16pub struct GenericDataGenerator;
17
18impl GenericDataGenerator {
19    /// 根据表结构生成数据
20    pub fn generate_data_by_schema(schema: &TableSchema, count: usize) -> Result<Vec<HashMap<String, Value>>> {
21        let mut data = Vec::with_capacity(count);
22        // 使用 data-forge 的核心生成能力
23        let forge = DataForge::new(crate::generation::Language::ZhCN);
24        
25        for _ in 1..=count {
26            let mut row = HashMap::new();
27            
28            for field in &schema.fields {
29                let value = Self::generate_value_for_field(&forge, field)?;
30                row.insert(field.name.clone(), value);
31            }
32            
33            data.push(row);
34        }
35        
36        Ok(data)
37    }
38    
39    /// 根据字段类型和生成器类型生成值 - 复用 data-forge 的核心生成能力
40    fn generate_value_for_field(forge: &DataForge, field: &FieldSchema) -> Result<Value> {
41        // 首先检查是否有指定的生成器类型
42        if let Some(generator_type) = &field.generator_type {
43            return Self::generate_value_by_generator_type(forge, field, generator_type);
44        }
45        
46        // 如果没有指定生成器类型,则根据数据类型自动生成
47        match &field.data_type {
48            DataType::String { max_length } => {
49                let max_len = max_length.unwrap_or(255) as usize;
50                let len = std::cmp::min(10, max_len);
51                // 复用 data-forge 的随机字符串生成能力
52                Ok(Value::String(random_letters(len)))
53            },
54            DataType::Integer { .. } => {
55                // 复用 data-forge 的数字生成能力
56                Ok(forge.generate("random_int").unwrap_or_else(|| {
57                    Value::Number(serde_json::Number::from(crate::generators::random_int(0, 1000000)))
58                }))
59            },
60            DataType::Float { .. } => {
61                // 复用 data-forge 的浮点数生成能力
62                Ok(forge.generate("random_float").unwrap_or_else(|| {
63                    Value::Number(serde_json::Number::from_f64(crate::generators::random_float(0.0, 1000.0)).unwrap())
64                }))
65            },
66            DataType::Boolean => {
67                // 复用 data-forge 的布尔值生成能力
68                Ok(forge.generate("random_bool").unwrap_or_else(|| {
69                    Value::Bool(crate::generators::random_bool())
70                }))
71            },
72            DataType::DateTime { .. } => {
73                // 复用 data-forge 的日期时间生成能力
74                Ok(forge.generate("datetime_now").unwrap_or_else(|| {
75                    Value::String(crate::generators::datetime::iso8601())
76                }))
77            },
78            DataType::Date { .. } => {
79                // 复用 data-forge 的日期生成能力
80                Ok(forge.generate("date_now").unwrap_or_else(|| {
81                    Value::String(crate::generators::datetime::date_iso())
82                }))
83            },
84            DataType::Email => {
85                // 复用 data-forge 的邮箱生成能力
86                Ok(forge.generate("email").unwrap_or_else(|| {
87                    Value::String(crate::generators::internet::email())
88                }))
89            },
90            DataType::Phone { .. } => {
91                // 复用 data-forge 的电话号码生成能力
92                Ok(forge.generate("phone_cn").unwrap_or_else(|| {
93                    Value::String(crate::generators::number::phone_number_cn())
94                }))
95            },
96            DataType::Url => {
97                // 复用 data-forge 的URL生成能力
98                Ok(forge.generate("url").unwrap_or_else(|| {
99                    Value::String(crate::generators::internet::url())
100                }))
101            },
102            DataType::Uuid => {
103                // 复用 data-forge 的UUID生成能力
104                Ok(forge.generate("uuid_v4").unwrap_or_else(|| {
105                    Value::String(crate::generators::uuid_v4())
106                }))
107            },
108            _ => {
109                // 默认生成字符串值
110                Ok(Value::String(random_letters(10)))
111            }
112        }
113    }
114    
115    /// 根据指定的生成器类型生成值
116    fn generate_value_by_generator_type(forge: &DataForge, field: &FieldSchema, generator_type: &FieldGeneratorType) -> Result<Value> {
117        match generator_type {
118            FieldGeneratorType::Default => {
119                // 使用默认生成逻辑
120                Self::generate_value_for_field(forge, field)
121            },
122            FieldGeneratorType::Custom(generator_name) => {
123                // 使用自定义生成器
124                Ok(forge.generate(generator_name).unwrap_or_else(|| {
125                    Value::String(format!("custom_{}", generator_name))
126                }))
127            },
128            FieldGeneratorType::RandomString => {
129                let len = match &field.data_type {
130                    DataType::String { max_length } => max_length.unwrap_or(10),
131                    _ => 10,
132                };
133                Ok(Value::String(random_letters(len as usize)))
134            },
135            FieldGeneratorType::RandomInteger => {
136                Ok(Value::Number(serde_json::Number::from(crate::generators::random_int(0, 1000000))))
137            },
138            FieldGeneratorType::RandomFloat => {
139                Ok(Value::Number(serde_json::Number::from_f64(crate::generators::random_float(0.0, 1000.0)).unwrap()))
140            },
141            FieldGeneratorType::RandomBoolean => {
142                Ok(Value::Bool(crate::generators::random_bool()))
143            },
144            FieldGeneratorType::CurrentTimestamp => {
145                Ok(Value::String(crate::generators::datetime::iso8601()))
146            },
147            FieldGeneratorType::RandomDate => {
148                Ok(Value::String(crate::generators::datetime::date_iso()))
149            },
150            FieldGeneratorType::RandomDateTime => {
151                Ok(Value::String(crate::generators::datetime::iso8601()))
152            },
153            FieldGeneratorType::RandomEmail => {
154                Ok(Value::String(crate::generators::internet::email()))
155            },
156            FieldGeneratorType::RandomPhone => {
157                Ok(Value::String(crate::generators::number::phone_number_cn()))
158            },
159            FieldGeneratorType::RandomUrl => {
160                Ok(Value::String(crate::generators::internet::url()))
161            },
162            FieldGeneratorType::Uuid => {
163                Ok(Value::String(crate::generators::uuid_v4()))
164            },
165            FieldGeneratorType::Name => {
166                // 根据语言设置生成相应语言的姓名
167                match forge.language() {
168                    crate::generation::Language::ZhCN => {
169                        Ok(Value::String(crate::generators::name::zh_cn_fullname()))
170                    },
171                    crate::generation::Language::EnUS => {
172                        Ok(Value::String(crate::generators::name::en_us_fullname()))
173                    },
174                    crate::generation::Language::JaJP => {
175                        Ok(Value::String(crate::generators::name::ja_jp_fullname()))
176                    },
177                }
178            },
179            FieldGeneratorType::CompanyName => {
180                Ok(Value::String(format!("Company {}", crate::generators::random_int(1, 1000))))
181            },
182            FieldGeneratorType::Address => {
183                // 根据语言设置生成相应语言的地址
184                match forge.language() {
185                    crate::generation::Language::ZhCN => {
186                        Ok(Value::String(format!("{}市{}区{}街道{}", 
187                            crate::generators::address::zh_city(), 
188                            crate::generators::address::zh_city(), 
189                            crate::generators::random_int(1, 100),
190                            crate::generators::random_int(1, 1000))))
191                    },
192                    crate::generation::Language::EnUS => {
193                        Ok(Value::String(format!("{} Street {}, {}, {}", 
194                            crate::generators::address::us_city(),
195                            crate::generators::random_int(1, 1000),
196                            crate::generators::address::us_city(),
197                            crate::generators::address::us_state())))
198                    },
199                    crate::generation::Language::JaJP => {
200                        Ok(Value::String(format!("{}{}{}丁目{}", 
201                            crate::generators::address::us_city(),  // 使用us_city作为替代
202                            crate::generators::address::us_city(),  // 使用us_city作为替代
203                            crate::generators::random_int(1, 20),
204                            crate::generators::random_int(1, 20))))
205                    },
206                }
207            },
208            FieldGeneratorType::ProductName => {
209                let products = ["Laptop", "Smartphone", "Tablet", "Watch", "Headphones", "Speaker"];
210                let product = products[crate::generators::random_int(0, products.len() as i32 - 1) as usize];
211                Ok(Value::String(format!("{} {}", product, crate::generators::random_int(1, 1000))))
212            },
213            FieldGeneratorType::OrderStatus => {
214                let statuses = ["Pending", "Processing", "Shipped", "Delivered", "Cancelled"];
215                let status = statuses[crate::generators::random_int(0, statuses.len() as i32 - 1) as usize];
216                Ok(Value::String(status.to_string()))
217            },
218        }
219    }
220}
221
222#[cfg(test)]
223mod tests {
224    use super::*;
225    use crate::db::schema::{FieldConstraints, DataType};
226
227    #[test]
228    fn test_person_field_generation_by_type() {
229        // 创建一个人员表结构,基于字段类型而不是字段名
230        let schema = TableSchema {
231            name: "employees".to_string(),
232            fields: vec![
233                FieldSchema {
234                    name: "id".to_string(),
235                    data_type: DataType::Integer { min: None, max: None },
236                    constraints: FieldConstraints {
237                        nullable: false,
238                        unique: true,
239                        default: None,
240                        pattern: None,
241                        min: None,
242                        max: None,
243                    },
244                    description: None,
245                    generator_config: None,
246                    generator_type: None,
247                },
248                FieldSchema {
249                    name: "full_name".to_string(),
250                    data_type: DataType::String { max_length: Some(100) },
251                    constraints: FieldConstraints {
252                        nullable: false,
253                        unique: false,
254                        default: None,
255                        pattern: None,
256                        min: None,
257                        max: None,
258                    },
259                    description: None,
260                    generator_config: None,
261                    generator_type: None,
262                },
263                FieldSchema {
264                    name: "birth_date".to_string(),
265                    data_type: DataType::Date { format: None },
266                    constraints: FieldConstraints {
267                        nullable: false,
268                        unique: false,
269                        default: None,
270                        pattern: None,
271                        min: None,
272                        max: None,
273                    },
274                    description: None,
275                    generator_config: None,
276                    generator_type: None,
277                },
278                FieldSchema {
279                    name: "email_addr".to_string(),
280                    data_type: DataType::Email,
281                    constraints: FieldConstraints {
282                        nullable: false,
283                        unique: true,
284                        default: None,
285                        pattern: None,
286                        min: None,
287                        max: None,
288                    },
289                    description: None,
290                    generator_config: None,
291                    generator_type: None,
292                },
293            ],
294            primary_key: Some(vec!["id".to_string()]),
295            indexes: vec![],
296            description: None,
297        };
298
299        // 生成数据
300        let data = generate_person_data(&schema, 1).unwrap();
301        assert_eq!(data.len(), 1);
302        
303        let row = &data[0];
304        assert!(row.contains_key("id"));
305        assert!(row.contains_key("full_name"));
306        assert!(row.contains_key("birth_date"));
307        assert!(row.contains_key("email_addr"));
308        
309        // 验证值类型正确
310        assert!(row.get("id").unwrap().is_number());
311        assert!(row.get("full_name").unwrap().is_string());
312        assert!(row.get("birth_date").unwrap().is_string());
313        assert!(row.get("email_addr").unwrap().is_string());
314    }
315
316    #[test]
317    fn test_product_field_generation_by_type() {
318        // 创建一个产品表结构,基于字段类型而不是字段名
319        let schema = TableSchema {
320            name: "products".to_string(),
321            fields: vec![
322                FieldSchema {
323                    name: "product_identifier".to_string(),
324                    data_type: DataType::Integer { min: None, max: None },
325                    constraints: FieldConstraints {
326                        nullable: false,
327                        unique: true,
328                        default: None,
329                        pattern: None,
330                        min: None,
331                        max: None,
332                    },
333                    description: None,
334                    generator_config: None,
335                    generator_type: None,
336                },
337                FieldSchema {
338                    name: "product_title".to_string(),
339                    data_type: DataType::String { max_length: Some(100) },
340                    constraints: FieldConstraints {
341                        nullable: false,
342                        unique: false,
343                        default: None,
344                        pattern: None,
345                        min: None,
346                        max: None,
347                    },
348                    description: None,
349                    generator_config: None,
350                    generator_type: None,
351                },
352                FieldSchema {
353                    name: "unit_price".to_string(),
354                    data_type: DataType::Float { min: None, max: None, precision: None },
355                    constraints: FieldConstraints {
356                        nullable: false,
357                        unique: false,
358                        default: None,
359                        pattern: None,
360                        min: None,
361                        max: None,
362                    },
363                    description: None,
364                    generator_config: None,
365                    generator_type: None,
366                },
367            ],
368            primary_key: Some(vec!["product_identifier".to_string()]),
369            indexes: vec![],
370            description: None,
371        };
372
373        // 生成数据
374        let data = generate_product_data(&schema, 1).unwrap();
375        assert_eq!(data.len(), 1);
376        
377        let row = &data[0];
378        assert!(row.contains_key("product_identifier"));
379        assert!(row.contains_key("product_title"));
380        assert!(row.contains_key("unit_price"));
381        
382        // 验证值类型正确
383        assert!(row.get("product_identifier").unwrap().is_number());
384        assert!(row.get("product_title").unwrap().is_string());
385        assert!(row.get("unit_price").unwrap().is_number());
386    }
387
388    #[test]
389    fn test_table_type_detection() {
390        // 创建一个人员表结构
391        let person_schema = TableSchema {
392            name: "users".to_string(),
393            fields: vec![
394                FieldSchema {
395                    name: "user_id".to_string(),
396                    data_type: DataType::Integer { min: None, max: None },
397                    constraints: FieldConstraints::default(),
398                    description: None,
399                    generator_config: None,
400                    generator_type: None,
401                },
402                FieldSchema {
403                    name: "email_address".to_string(),
404                    data_type: DataType::Email,
405                    constraints: FieldConstraints::default(),
406                    description: None,
407                    generator_config: None,
408                    generator_type: None,
409                },
410            ],
411            primary_key: Some(vec!["user_id".to_string()]),
412            indexes: vec![],
413            description: None,
414        };
415
416        // 创建一个产品表结构
417        let product_schema = TableSchema {
418            name: "items".to_string(),
419            fields: vec![
420                FieldSchema {
421                    name: "item_id".to_string(),
422                    data_type: DataType::Integer { min: None, max: None },
423                    constraints: FieldConstraints::default(),
424                    description: None,
425                    generator_config: None,
426                    generator_type: None,
427                },
428                FieldSchema {
429                    name: "item_name".to_string(),
430                    data_type: DataType::String { max_length: Some(100) },
431                    constraints: FieldConstraints::default(),
432                    description: None,
433                    generator_config: None,
434                    generator_type: None,
435                },
436                FieldSchema {
437                    name: "item_price".to_string(),
438                    data_type: DataType::Float { min: None, max: None, precision: None },
439                    constraints: FieldConstraints::default(),
440                    description: None,
441                    generator_config: None,
442                    generator_type: None,
443                },
444            ],
445            primary_key: Some(vec!["item_id".to_string()]),
446            indexes: vec![],
447            description: None,
448        };
449
450        // 测试类型检测
451        assert!(is_person_table(&person_schema));
452        assert!(is_product_table(&product_schema));
453    }
454
455    #[test]
456    fn test_field_type_based_generation() {
457        // 创建一个混合类型的表结构来测试完全基于字段类型的生成
458        let schema = TableSchema {
459            name: "mixed_table".to_string(),
460            fields: vec![
461                FieldSchema {
462                    name: "any_integer_field".to_string(),
463                    data_type: DataType::Integer { min: Some(0), max: Some(100) },
464                    constraints: FieldConstraints::default(),
465                    description: None,
466                    generator_config: None,
467                    generator_type: None,
468                },
469                FieldSchema {
470                    name: "any_float_field".to_string(),
471                    data_type: DataType::Float { min: Some(0.0), max: Some(100.0), precision: None },
472                    constraints: FieldConstraints::default(),
473                    description: None,
474                    generator_config: None,
475                    generator_type: None,
476                },
477                FieldSchema {
478                    name: "any_string_field".to_string(),
479                    data_type: DataType::String { max_length: Some(50) },
480                    constraints: FieldConstraints::default(),
481                    description: None,
482                    generator_config: None,
483                    generator_type: None,
484                },
485                FieldSchema {
486                    name: "any_email_field".to_string(),
487                    data_type: DataType::Email,
488                    constraints: FieldConstraints::default(),
489                    description: None,
490                    generator_config: None,
491                    generator_type: None,
492                },
493                FieldSchema {
494                    name: "any_phone_field".to_string(),
495                    data_type: DataType::Phone { country: None },
496                    constraints: FieldConstraints::default(),
497                    description: None,
498                    generator_config: None,
499                    generator_type: None,
500                },
501                FieldSchema {
502                    name: "any_date_field".to_string(),
503                    data_type: DataType::Date { format: None },
504                    constraints: FieldConstraints::default(),
505                    description: None,
506                    generator_config: None,
507                    generator_type: None,
508                },
509                FieldSchema {
510                    name: "any_datetime_field".to_string(),
511                    data_type: DataType::DateTime { format: None },
512                    constraints: FieldConstraints::default(),
513                    description: None,
514                    generator_config: None,
515                    generator_type: None,
516                },
517                FieldSchema {
518                    name: "any_boolean_field".to_string(),
519                    data_type: DataType::Boolean,
520                    constraints: FieldConstraints::default(),
521                    description: None,
522                    generator_config: None,
523                    generator_type: None,
524                },
525            ],
526            primary_key: Some(vec!["any_integer_field".to_string()]),
527            indexes: vec![],
528            description: None,
529        };
530
531        // 生成数据
532        let data = GenericDataGenerator::generate_data_by_schema(&schema, 1).unwrap();
533        assert_eq!(data.len(), 1);
534        
535        let row = &data[0];
536        assert!(row.contains_key("any_integer_field"));
537        assert!(row.contains_key("any_float_field"));
538        assert!(row.contains_key("any_string_field"));
539        assert!(row.contains_key("any_email_field"));
540        assert!(row.contains_key("any_phone_field"));
541        assert!(row.contains_key("any_date_field"));
542        assert!(row.contains_key("any_datetime_field"));
543        assert!(row.contains_key("any_boolean_field"));
544        
545        // 验证值类型正确
546        assert!(row.get("any_integer_field").unwrap().is_number());
547        assert!(row.get("any_float_field").unwrap().is_number());
548        assert!(row.get("any_string_field").unwrap().is_string());
549        assert!(row.get("any_email_field").unwrap().is_string());
550        assert!(row.get("any_phone_field").unwrap().is_string());
551        assert!(row.get("any_date_field").unwrap().is_string());
552        assert!(row.get("any_datetime_field").unwrap().is_string());
553        assert!(row.get("any_boolean_field").unwrap().is_boolean());
554    }
555
556    /// 检查表是否为人员表 - 更多基于字段类型
557    fn is_person_table(schema: &TableSchema) -> bool {
558        let name_field_count = schema.fields.iter().filter(|field| {
559            field.name.contains("name") || field.name.contains("first") || field.name.contains("last") ||
560                field.name.contains("user") || field.name.contains("employee")
561        }).count();
562
563        let type_field_count = schema.fields.iter().filter(|field| {
564            matches!(field.data_type, DataType::Email | DataType::Phone { .. })
565        }).count();
566
567        name_field_count > 1 || type_field_count > 0
568    }
569
570    /// 检查表是否为产品表 - 更多基于字段类型
571    fn is_product_table(schema: &TableSchema) -> bool {
572        let name_field_count = schema.fields.iter().filter(|field| {
573            field.name.contains("name") || field.name.contains("title") || field.name.contains("sku")
574        }).count();
575
576        let price_field_count = schema.fields.iter().filter(|field| {
577            field.name.contains("price") || field.name.contains("cost")
578        }).count();
579
580        let type_field_count = schema.fields.iter().filter(|field| {
581            matches!(field.data_type, DataType::Float { .. } | DataType::Integer { .. }) &&
582                (field.name.contains("price") || field.name.contains("cost") || field.name.contains("stock"))
583        }).count();
584
585        name_field_count > 0 || price_field_count > 0 || type_field_count > 0
586    }
587
588    /// 检查表是否为订单表 - 更多基于字段类型
589    fn is_order_table(schema: &TableSchema) -> bool {
590        let id_field_count = schema.fields.iter().filter(|field| {
591            field.name.contains("order") || field.name.contains("customer")
592        }).count();
593
594        let amount_field_count = schema.fields.iter().filter(|field| {
595            field.name.contains("amount") || field.name.contains("total")
596        }).count();
597
598        let type_field_count = schema.fields.iter().filter(|field| {
599            matches!(field.data_type, DataType::Float { .. } | DataType::Integer { .. }) &&
600                (field.name.contains("amount") || field.name.contains("total") || field.name.contains("quantity"))
601        }).count();
602
603        id_field_count > 0 || amount_field_count > 0 || type_field_count > 0
604    }
605
606    /// 检查表是否为公司表 - 更多基于字段类型
607    fn is_company_table(schema: &TableSchema) -> bool {
608        let name_field_count = schema.fields.iter().filter(|field| {
609            field.name.contains("company") || field.name.contains("industry")
610        }).count();
611
612        let employee_field_count = schema.fields.iter().filter(|field| {
613            field.name.contains("employee") || field.name.contains("founded")
614        }).count();
615
616        name_field_count > 0 || employee_field_count > 0
617    }
618
619    /// 检查表是否为地址表 - 更多基于字段类型
620    fn is_address_table(schema: &TableSchema) -> bool {
621        let address_field_count = schema.fields.iter().filter(|field| {
622            field.name.contains("address") || field.name.contains("street") || field.name.contains("city") ||
623                field.name.contains("province") || field.name.contains("state") || field.name.contains("postal") ||
624                field.name.contains("zip")
625        }).count();
626
627        let type_field_count = schema.fields.iter().filter(|field| {
628            matches!(field.data_type, DataType::Phone { .. }) && field.name.contains("phone")
629        }).count();
630
631        address_field_count > 1 || type_field_count > 0
632    }
633
634    /// 检查表是否为事件表 - 更多基于字段类型
635    fn is_event_table(schema: &TableSchema) -> bool {
636        let name_field_count = schema.fields.iter().filter(|field| {
637            field.name.contains("event") || field.name.contains("name") || field.name.contains("title")
638        }).count();
639
640        let type_field_count = schema.fields.iter().filter(|field| {
641            field.name.contains("type") || field.name.contains("description")
642        }).count();
643
644        let time_field_count = schema.fields.iter().filter(|field| {
645            matches!(field.data_type, DataType::DateTime { .. } | DataType::Date { .. }) &&
646                (field.name.contains("timestamp") || field.name.contains("date"))
647        }).count();
648
649        name_field_count > 0 || type_field_count > 0 || time_field_count > 0
650    }
651
652    /// 生成产品数据 - 基于表结构
653    pub fn generate_product_data(schema: &TableSchema, count: usize) -> Result<Vec<HashMap<String, Value>>> {
654        let forge = DataForge::new(crate::generation::Language::ZhCN);
655        let mut data = Vec::with_capacity(count);
656        for i in 1..=count {
657            let mut row = HashMap::new();
658
659            for field in &schema.fields {
660                let value = generate_product_field_value(&forge, field, i)?;
661                row.insert(field.name.clone(), value);
662            }
663
664            data.push(row);
665        }
666        Ok(data)
667    }
668
669    /// 生成产品相关字段的值 - 基于字段类型和生成器类型
670    fn generate_product_field_value(forge: &DataForge, field: &FieldSchema, index: usize) -> Result<Value> {
671        // 首先检查是否有指定的生成器类型
672        if let Some(generator_type) = &field.generator_type {
673            return GenericDataGenerator::generate_value_by_generator_type(forge, field, generator_type);
674        }
675
676        // 如果没有指定生成器类型,则根据字段名和数据类型生成
677        match &field.data_type {
678            DataType::String { max_length } => {
679                let max_len = max_length.unwrap_or(255) as usize;
680                if field.name.contains("name") || field.name.contains("title") || field.name.contains("product") {
681                    let products = ["Laptop", "Smartphone", "Tablet", "Watch", "Headphones", "Speaker"];
682                    let product = products[number::random_int(0, products.len() as i32 - 1) as usize];
683                    Ok(Value::String(format!("{} {}", product, index)))
684                } else if field.name.contains("description") {
685                    Ok(Value::String(format!("Description for product {}", index)))
686                } else if field.name.contains("sku") {
687                    Ok(Value::String(format!("SKU-{:06}", index)))
688                } else {
689                    // 通用字符串
690                    let len = std::cmp::min(10, max_len);
691                    Ok(Value::String(random_letters(len)))
692                }
693            },
694            DataType::Integer { min, max } => {
695                let min_val = min.unwrap_or(0);
696                let max_val = max.unwrap_or(1000000);
697                if field.name.contains("stock") {
698                    Ok(Value::Number(serde_json::Number::from(number::random_int(0, 1000))))
699                } else {
700                    // 通用整数
701                    Ok(Value::Number(serde_json::Number::from(number::random_int(min_val as i32, max_val as i32))))
702                }
703            },
704            DataType::Float { .. } => {
705                if field.name.contains("price") || field.name.contains("cost") {
706                    Ok(Value::Number(serde_json::Number::from_f64(number::random_float(10.0, 1000.0)).unwrap()))
707                } else {
708                    Ok(Value::Number(serde_json::Number::from_f64(number::random_float(0.0, 100.0)).unwrap()))
709                }
710            },
711            DataType::Boolean => {
712                Ok(Value::Bool(rand::random()))
713            },
714            DataType::DateTime { .. } | DataType::Date { .. } => {
715                Ok(Value::String(datetime::iso8601()))
716            },
717            _ => {
718                // 默认生成字符串值
719                Ok(Value::String(random_letters(10)))
720            }
721        }
722    }
723
724    /// 生成人员数据(员工、用户等)- 基于表结构
725    pub fn generate_person_data(schema: &TableSchema, count: usize) -> Result<Vec<HashMap<String, Value>>> {
726        // 使用 data-forge 的核心生成能力
727        let forge = DataForge::new(crate::generation::Language::ZhCN);
728
729        let mut data = Vec::with_capacity(count);
730        for i in 1..=count {
731            let mut row = HashMap::new();
732
733            for field in &schema.fields {
734                let value = generate_person_field_value(&forge, field, i)?;
735                row.insert(field.name.clone(), value);
736            }
737
738            data.push(row);
739        }
740        Ok(data)
741    }
742
743    /// 生成人员相关字段的值 - 基于字段类型和生成器类型
744    fn generate_person_field_value(forge: &DataForge, field: &FieldSchema, _index: usize) -> Result<Value> {
745        // 首先检查是否有指定的生成器类型
746        if let Some(generator_type) = &field.generator_type {
747            return GenericDataGenerator::generate_value_by_generator_type(forge, field, generator_type);
748        }
749
750        // 如果没有指定生成器类型,则根据字段名和数据类型生成
751        match &field.data_type {
752            DataType::String { max_length } => {
753                let max_len = max_length.unwrap_or(255) as usize;
754                if field.name.contains("name") || field.name.contains("user") || field.name.contains("employee") {
755                    // 根据语言设置生成相应语言的姓名
756                    match forge.language() {
757                        crate::generation::Language::ZhCN => {
758                            Ok(Value::String(crate::generators::name::zh_cn_fullname()))
759                        },
760                        crate::generation::Language::EnUS => {
761                            Ok(Value::String(crate::generators::name::en_us_fullname()))
762                        },
763                        crate::generation::Language::JaJP => {
764                            Ok(Value::String(crate::generators::name::ja_jp_fullname()))
765                        },
766                    }
767                } else if field.name.contains("email") {
768                    Ok(Value::String(crate::generators::internet::email()))
769                } else if field.name.contains("phone") {
770                    Ok(Value::String(crate::generators::number::phone_number_cn()))
771                } else {
772                    // 通用字符串
773                    let len = std::cmp::min(10, max_len);
774                    Ok(Value::String(random_letters(len)))
775                }
776            },
777            DataType::Integer { min, max } => {
778                let min_val = min.unwrap_or(0);
779                let max_val = max.unwrap_or(1000000);
780                if field.name.contains("age") {
781                    Ok(Value::Number(serde_json::Number::from(number::random_int(18, 65))))
782                } else if field.name.contains("salary") || field.name.contains("wage") {
783                    Ok(Value::Number(serde_json::Number::from(number::random_int(3000, 50000))))
784                } else {
785                    // 通用整数
786                    Ok(Value::Number(serde_json::Number::from(number::random_int(min_val as i32, max_val as i32))))
787                }
788            },
789            DataType::Float { .. } => {
790                if field.name.contains("salary") || field.name.contains("wage") {
791                    Ok(Value::Number(serde_json::Number::from_f64(number::random_float(3000.0, 50000.0)).unwrap()))
792                } else {
793                    Ok(Value::Number(serde_json::Number::from_f64(number::random_float(0.0, 100.0)).unwrap()))
794                }
795            },
796            DataType::Boolean => {
797                Ok(Value::Bool(rand::random()))
798            },
799            DataType::DateTime { .. } | DataType::Date { .. } => {
800                if field.name.contains("birth") {
801                    Ok(Value::String(datetime::birthday()))
802                } else {
803                    Ok(Value::String(datetime::iso8601()))
804                }
805            },
806            DataType::Email => {
807                Ok(Value::String(crate::generators::internet::email()))
808            },
809            DataType::Phone { .. } => {
810                Ok(Value::String(crate::generators::number::phone_number_cn()))
811            },
812            _ => {
813                // 默认生成字符串值
814                Ok(Value::String(random_letters(10)))
815            }
816        }
817    }
818
819}