diff --git a/app/Services/TestData/SupplyDemandTestDataGenerator.php b/app/Services/TestData/SupplyDemandTestDataGenerator.php index 2f00268..b86b433 100644 --- a/app/Services/TestData/SupplyDemandTestDataGenerator.php +++ b/app/Services/TestData/SupplyDemandTestDataGenerator.php @@ -13,6 +13,9 @@ use Illuminate\Support\Arr; use Illuminate\Support\Carbon; use Illuminate\Support\Facades\DB; +/** + * 供需模块测试数据生成器 + */ class SupplyDemandTestDataGenerator { /** @@ -51,10 +54,10 @@ class SupplyDemandTestDataGenerator $supplyDemand = new SupplyDemand(); $supplyDemand->user_id = $publisher->id; - $supplyDemand->title = $faker->sentence(4); + $supplyDemand->title = $this->generateTechBusinessTitle($faker); $supplyDemand->type = $faker->randomElement([1, 2]); - $supplyDemand->content = $faker->paragraphs($faker->numberBetween(1, 3), true); - $supplyDemand->tag = implode(',', $faker->randomElements(['采购', '合作', '招聘', '渠道', '推广', '技术', '投资'], $faker->numberBetween(1, 3))); + $supplyDemand->content = $this->generateContentFromTitle($supplyDemand->title, $supplyDemand->type, $faker); + $supplyDemand->tag = implode(',', $this->generateTagsFromTitle($supplyDemand->title, $faker)); $supplyDemand->wechat = 'wx_' . $faker->bothify('??####'); $supplyDemand->mobile = $faker->phoneNumber(); $supplyDemand->email = $faker->safeEmail(); @@ -176,6 +179,88 @@ class SupplyDemandTestDataGenerator } }); } + + /** + * 生成科技/商业取向的标题 + */ + private function generateTechBusinessTitle($faker): string + { + $regions = ['华东', '华南', '华北', '西南', '中原', '长三角', '珠三角']; + $industries = ['制造', '零售', '医药', '教育', '金融', '能源', '物流', '政企']; + $materials = ['光刻胶', '硅片', 'CMP 抛光液', '陶瓷基板']; + $domains = ['电商推荐', '客服质检', '金融风控', '工业检测', '内容审核']; + $countries = ['新加坡', '印度尼西亚', '阿联酋', '沙特', '巴西', '墨西哥']; + + $templates = [ + 'SaaS 渠道分销伙伴招募(' . $faker->randomElement($regions) . ')', + '云计算成本优化服务对接(' . $faker->randomElement($industries) . '行业)', + 'AI 数据标注外包合作(' . $faker->randomElement($domains) . ')', + '跨境电商供应链合作(' . $faker->randomElement($countries) . '仓)', + '半导体材料采购需求(' . $faker->randomElement($materials) . ')', + '新能源充电桩 OEM/ODM 代工合作', + '企业私有化部署 DevOps 顾问服务', + '工业物联网传感器批量采购', + '大模型微调服务(' . $faker->randomElement($domains) . ')', + '移动端 SDK 联合推广与结算', + '本地化运营团队招募(' . $faker->randomElement($regions) . ')', + '出海广告投放合作(' . $faker->randomElement($countries) . ')', + '数据中台建设项目外包', + '企业安全渗透测试服务对接', + ]; + + return $faker->randomElement($templates); + } + + /** + * 基于标题生成结构化内容,围绕标题展开 + * @param int $type 1=供应 2=需求 + */ + private function generateContentFromTitle(string $title, int $type, $faker): string + { + $timeframeWeeks = $faker->numberBetween(2, 12); + $budget = $faker->randomElement(['5万-10万', '10万-30万', '30万-80万', '80万以上', '按效果结算']); + $scale = $faker->randomElement(['小规模试点', '区域级铺开', '全国推广', '跨境协同']); + $partner = $faker->randomElement(['渠道商', 'ISV', '系统集成商', '服务外包商', '硬件厂商', '联合营销伙伴']); + $kpi = $faker->randomElement(['留存率', '转化率', '交付周期', '单点成本', '渠道覆盖']); + + $roleLine = $type === 1 + ? '供给能力:我们可提供成熟方案/产品/产能,支持灵活对接与深度合作。' + : '需求说明:我们需要优质方案/资源/产能,期待高效、稳定的交付能力。'; + + $sections = [ + "【项目标题】{$title}", + '项目背景:' . $faker->realText($faker->numberBetween(40, 80)), + $roleLine, + '合作模式:' . $faker->randomElement(['佣金', '代理', '分销', '联合投放', '项目外包', '里程碑结算']), + "目标指标:重点关注{$kpi},预计{$timeframeWeeks}周达到{$scale}阶段性目标。", + "预算与周期:预算 {$budget},计划周期 {$timeframeWeeks} 周。", + "适配伙伴:优先 {$partner},具备行业交付经验者加分。", + '补充信息:' . $faker->realText($faker->numberBetween(40, 80)), + ]; + + return implode("\n", $sections); + } + + /** + * 根据标题提取/生成标签 + * @return array + */ + private function generateTagsFromTitle(string $title, $faker): array + { + $dictionary = ['AI', 'SaaS', '云计算', '大模型', '供应链', '半导体', '新能源', '跨境电商', '营销', '渠道', 'OEM', 'ODM', '物联网', '安全', '出海', '数据中台', 'DevOps']; + $matched = []; + foreach ($dictionary as $keyword) { + if (mb_stripos($title, $keyword) !== false) { + $matched[] = $keyword; + } + } + $extra = $faker->randomElements($dictionary, $faker->numberBetween(0, 2)); + $tags = array_values(array_unique(array_merge($matched, $extra))); + if (empty($tags)) { + $tags = $faker->randomElements($dictionary, $faker->numberBetween(1, 3)); + } + return $tags; + } }