|
|
|
|
@ -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<string>
|
|
|
|
|
*/
|
|
|
|
|
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;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|