PostersHelper.php 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411
  1. <?php
  2. /*
  3. * @Description: 海报管理、号卡海报
  4. * @Version: *
  5. * @Autor: lexuan
  6. * @Date: 2024-11-25 10:14:33
  7. * @LastEditors: lexuan
  8. * @LastEditTime: 2024-11-25 10:14:33
  9. */
  10. namespace App\DataApiNew\Helper;
  11. use App\DataApiNew\Models\Posters;
  12. use App\Models\Pages;
  13. use App\Models\SpoutExport;
  14. use App\Models\SpoutImport;
  15. use App\DataApiNew\Models\AdminUsers;
  16. use App\DataApiNew\Models\Packages;
  17. use App\DataApiNew\Models\PostersQrcode;
  18. use Illuminate\Http\Request;
  19. use Intervention\Image\ImageManager;
  20. use Intervention\Image\Typography\FontFactory;
  21. use SimpleSoftwareIO\QrCode\Facades\QrCode;
  22. use Vinkla\Hashids\Facades\Hashids;
  23. class PostersHelper
  24. {
  25. // 查询条件
  26. public function whens($query, $request)
  27. {
  28. return $query
  29. ->when($request->filled('id'), fn ($q) => $q->where('id', $request->id))
  30. ->when($request->filled('type'), fn ($q) => $q->where('type', $request->type));
  31. }
  32. // 查询列表
  33. public function select(Request $request)
  34. {
  35. $page = new Pages($request, Posters::query());
  36. $page->before(function ($query) use ($request) {
  37. $query->select(Posters::$selectFields);
  38. return $this->whens($query, $request);
  39. });
  40. $result = $page->paginate();
  41. return $result;
  42. }
  43. // 导出
  44. public function export(Request $request)
  45. {
  46. $query = Posters::select(Posters::$selectFields);
  47. $query = $this->whens($query, $request);
  48. $query->orderBy('created_at', 'desc');
  49. $header = [
  50. '权重' => 'weight',
  51. ];
  52. $getEnValue = $this->getEnValue();
  53. $excel = new SpoutExport($header);
  54. $excel->setData($query->get());
  55. $result = $excel->setEnum($getEnValue)->spoutToExcel('excel_out');
  56. return $result ? success($result['url']) : error();
  57. }
  58. // 导入
  59. public function import(Request $request)
  60. {
  61. $header = [
  62. '权重' => 'weight',
  63. ];
  64. $getEnValue = $this->getEnValue();
  65. $SpoutImport = new SpoutImport($header);
  66. $dataList = $SpoutImport->setRequest($request)->getExcelData();
  67. return $dataList;
  68. }
  69. // 获取枚举值
  70. public function getEnValue()
  71. {
  72. $data = [
  73. 'open_status' => [
  74. 0 => "待开卡",
  75. 1 => "开卡中",
  76. ]
  77. ];
  78. return $data;
  79. }
  80. // 查询一条
  81. public function find(Request $request)
  82. {
  83. $request->validate([
  84. 'id' => 'required|integer',
  85. ]);
  86. $result = Posters::where(['id' => $request->id])->select(Posters::$selectFields)->first();
  87. return success($result);
  88. }
  89. // 添加
  90. public function insert(Request $request)
  91. {
  92. $request->validate([
  93. 'name' => 'required',
  94. ]);
  95. sys_log($request, '添加海报', '海报日志');
  96. $result = Posters::create($request->all());
  97. if ($result) {
  98. return success();
  99. } else {
  100. return error();
  101. }
  102. }
  103. // 修改
  104. public function update(Request $request)
  105. {
  106. $request->validate([
  107. 'id' => 'required|integer',
  108. ]);
  109. sys_log($request, '修改海报', '海报日志');
  110. $result = Posters::where(['id' => $request->id])->update($request->all());
  111. if ($result) {
  112. return success();
  113. } else {
  114. return error();
  115. }
  116. }
  117. // 删除
  118. public function delete(Request $request)
  119. {
  120. $request->validate([
  121. 'ids' => 'required',
  122. ]);
  123. sys_log($request, '删除海报', '海报日志');
  124. $id_str = $request->ids;
  125. $arr = explode(",", $id_str);
  126. // 查询是否存在子数据
  127. // $count = Shop::whereIn('tm_id',$arr)->count();
  128. // if($count > 0){
  129. // return ['code'=>0,'msg'=>"存在子数据,禁止删除"];
  130. // }
  131. $result = Posters::whereIn('id', $arr)->delete();
  132. if ($result) {
  133. return success();
  134. } else {
  135. return error();
  136. }
  137. }
  138. // 创建代理招募海报
  139. public function createUserPoster(Request $request)
  140. {
  141. $request->validate([
  142. 'poster_id' => 'required',
  143. ]);
  144. sys_log($request, '创建分销员招募海报', '海报日志');
  145. $user_id = auth()->id();
  146. $poster_id = $request->poster_id;
  147. $h5_url = "http://saler.test/h5/#/pages/distributorsRegister/distributorsRegister"; // H5招募链接
  148. $qr_path = public_path('poster/temp_qrcode/'); // 二维码路径
  149. $qr_file_name = 'temp_posterqr_user_' . $user_id . time() . mt_rand(1000, 9999) . '.jpg'; // 二维码文件名
  150. $path = 'poster/user_poster/' . $user_id . '/'; // 海报保存相对路径
  151. $fxuser_path = public_path($path); // 海报保存全路径
  152. $fxuser_file_name = 'user_poster_' . $user_id . $poster_id . '.jpg'; // 海报保存文件名
  153. $qr_size = 170; //二维码大小
  154. $qr_left = 186;
  155. $qr_top = 430;
  156. $share_code_size = 28;
  157. $share_code_left = 162;
  158. $share_code_top = 664;
  159. $userInfo = AdminUsers::select([
  160. 'id',
  161. 'share_code', // 邀请码
  162. 'default_yj_type', // 合伙人默认抽成类型 0不启用 1比例 2金额
  163. 'default_yj_a', // 合伙人默认抽成金额
  164. 'default_yj_p', // 合伙人默认抽成比例
  165. 'default_iot_yj_type', // 默认设备抽成类型 1比例 2金额
  166. 'default_iot_yj_p', // 默认设备抽成比例
  167. 'default_kd_yj_type', // 默认宽带抽成类型 1比例 2金额
  168. 'default_kd_yj_p', // 默认宽带抽成比例
  169. 'default_kd_yj_a', // 默认宽带抽成金额
  170. ])->where('id', $user_id)->first();
  171. if (!$userInfo) {
  172. return ['code' => 0, 'msg' => "用户信息不存在"];
  173. }
  174. $urlParams = http_build_query($userInfo->toArray());
  175. $url = $h5_url . '?poster_key=' . encrypt($urlParams);
  176. $url = PostersQrcode::setUrl($url); // 记录url
  177. $poster_info = Posters::select(['id', 'img'])->where('id', $poster_id)->first();
  178. // 生成二维码
  179. UtilsHelper::ensureDirectoryExists($qr_path);
  180. QrCode::format('png')->size($qr_size)->margin(1)->generate($url, $qr_path . $qr_file_name);
  181. // 选择引擎
  182. $manager = ImageManager::gd();
  183. // 加载网路背景图
  184. $templateImage = $manager->read(file_get_contents($poster_info->img));
  185. // 合并图片
  186. $templateImage->place($qr_path . $qr_file_name, 'top-left', $qr_left, $qr_top);
  187. // 添加邀请码
  188. $templateImage->text("邀请码:$userInfo->share_code", $share_code_left, $share_code_top, function (FontFactory $font) use ($share_code_size) {
  189. $font->filename(public_path('poster/ttf/思源黑体SOURCEHANSANSCN-BOLD.OTF')); // 指定字体文件的路径
  190. $font->size($share_code_size); // 设置文本大小,单位是像素
  191. $font->color("#fff"); // 设置文本颜色
  192. });
  193. // 保存
  194. UtilsHelper::ensureDirectoryExists($fxuser_path); // 检查路径是否存在
  195. $templateImage->save($fxuser_path . $fxuser_file_name);
  196. unlink($qr_path . $qr_file_name); // 删除临时二维码
  197. $TencentCosHelper = new TencentCosHelper();
  198. $result = $TencentCosHelper->uploadFiles($fxuser_path . $fxuser_file_name, "cos_file/" . $path . $fxuser_file_name);
  199. if ($result['code'] != 1) {
  200. return ['code' => 0, 'msg' => "海报生成失败"];
  201. }
  202. unlink($fxuser_path . $fxuser_file_name);
  203. return ['code' => 1, 'msg' => "success", 'data' => $result['data']['path'], 'url' => $url];
  204. }
  205. // 创建号卡小店海报
  206. public function createShopPoster(Request $request)
  207. {
  208. $request->validate([
  209. 'poster_id' => 'required',
  210. ]);
  211. sys_log($request, '创建号卡小店海报', '海报日志');
  212. $user_id = auth()->id();
  213. $poster_id = $request->poster_id;
  214. $qr_code_size = $request->input('qr_code_size', 250); //二维码尺寸
  215. $qr_code_left = $request->input('qr_code_left', 148); //二维码左边距
  216. $qr_code_top = $request->input('qr_code_top', 455); //二维码上边距
  217. $avatar_size = $request->input('avatar_size', 100); //头像尺寸
  218. $avatar_left = $request->input('avatar_left', 130); //头像左边距
  219. $avatar_top = $request->input('avatar_top', 303); //头像上边距
  220. $mini_text_size = $request->input('mini_text_size', 20); //小文字尺寸
  221. $mini_text_left = $request->input('mini_text_left', 74); //小文字左边距
  222. $mini_text_top = $request->input('mini_text_top', 618); //小文字上边距
  223. $mini_text_color = $request->input('mini_text_color', '#fff'); //小文字颜色
  224. $h5_url = "http://saler.test/h5/#/pages/portableWifi/portableWifi/"; // 号卡小店链接
  225. $qr_path = public_path('poster/temp_qrcode/'); // 二维码路径
  226. $qr_file_name = 'temp_poster_shop_' . $user_id . time() . mt_rand(1000, 9999) . '.jpg'; // 二维码文件名
  227. $path = 'poster/_smallshop_poster/' . $user_id . '/'; // 海报保存相对路径
  228. $fxuser_path = public_path($path); // 海报保存路径
  229. $fxuser_file_name = 'iotgoods_smallshop_poster_' . $user_id . $poster_id . '.jpg'; // 海报保存文件名
  230. $user_info = AdminUsers::select(['id', 'small_shop_image'])->where('id', $user_id)->first();
  231. $url = $h5_url . "?user_key=" . Hashids::encode($user_info->id);
  232. $poster_info = Posters::select(['id', 'img'])->where('id', $poster_id)->first();
  233. // 生成二维码并保存为图片
  234. UtilsHelper::ensureDirectoryExists($qr_path);
  235. QrCode::format('png')->size($qr_code_size)->margin(1)
  236. ->generate($url, $qr_path . $qr_file_name);
  237. // 选择引擎
  238. $manager = ImageManager::gd();
  239. // 加载网路背景图
  240. $templateImage = $manager->read(file_get_contents($poster_info->img));
  241. // 合并图片
  242. $templateImage->place($qr_path . $qr_file_name, 'top-left', $qr_code_left, $qr_code_top);
  243. // 获取小店头像
  244. if (empty($user_info->small_shop_image) || !UtilsHelper::remoteFileExists($user_info->small_shop_image)) {
  245. $small_shop_image = "http://saler.test/cos_file/small_shop_image/small_shop_image.png";
  246. } else {
  247. $small_shop_image = $user_info->small_shop_image;
  248. }
  249. $filename = basename($small_shop_image); // 获取文件名
  250. $savePath = public_path("poster/temp_small_shop/") . $filename;
  251. UtilsHelper::ensureDirectoryExists(public_path("poster/temp_small_shop/"));
  252. if (!UtilsHelper::downloadImage($small_shop_image, $savePath)) {
  253. return ['code' => 0, 'msg' => "海报生成失败"];
  254. }
  255. UtilsHelper::z_image2circle($savePath, $savePath);
  256. $smallShopImage = $manager->read($savePath);
  257. $smallShopImage->resize($avatar_size, $avatar_size); // 缩放
  258. $templateImage->place($smallShopImage, 'top-left', $avatar_left, $avatar_top);
  259. $templateImage->text(UtilsHelper::truncateString("我的小店"), $mini_text_left, $mini_text_top, function (FontFactory $font) use ($mini_text_size, $mini_text_color) {
  260. $font->filename(public_path('poster/ttf/思源黑体SOURCEHANSANSCN-REGULAR.OTF')); // 指定字体文件的路径
  261. $font->size($mini_text_size); // 设置文本大小,单位是像素
  262. $font->color($mini_text_color); // 设置文本颜色
  263. });
  264. // 保存
  265. UtilsHelper::ensureDirectoryExists($fxuser_path); // 检查路径是否存在
  266. $templateImage->save($fxuser_path . $fxuser_file_name,);
  267. unlink($savePath); // 删除临时海报头像
  268. unlink($qr_path . $qr_file_name); // 删除临时二维码
  269. $TencentCosHelper = new TencentCosHelper();
  270. $result = $TencentCosHelper->uploadFiles($fxuser_path . $fxuser_file_name, "cos_file/" . $path . $fxuser_file_name);
  271. if ($result['code'] != 1) {
  272. return ['code' => 0, 'msg' => "海报生成失败"];
  273. }
  274. unlink($fxuser_path . $fxuser_file_name);
  275. return ['code' => 1, 'msg' => "success", 'data' => $result['data']['path'], 'url' => $url];
  276. }
  277. // 创建号卡套餐海报
  278. public function createPackagePoster(Request $request)
  279. {
  280. $request->validate([
  281. 'poster_id' => 'required',
  282. 'package_id' => 'required',
  283. ]);
  284. sys_log($request, '创建号卡套餐海报', '海报日志');
  285. $user_id = auth()->id();
  286. $poster_id = $request->poster_id;
  287. $package_id = $request->package_id;
  288. $package_image_size = $request->input('package_image_size', 340); //主图尺寸
  289. $package_image_left = $request->input('package_image_left', 104); //主图左边距
  290. $package_image_top = $request->input('package_image_top', 172); //主图上边距
  291. $qr_code_size = $request->input('qr_code_size', 124); //二维码尺寸
  292. $qr_code_left = $request->input('qr_code_left', 344); //二维码左边距
  293. $qr_code_top = $request->input('qr_code_top', 668); //二维码上边距
  294. // $title_size = $request->input('title_size', 30); //标题字体大小
  295. // $title_left = $request->input('title_left', 74); //标题左边距
  296. // $title_top = $request->input('title_top', 576); //标题上边距
  297. // $title_color = $request->input('title_color', '#fff'); //标题颜色
  298. $mini_text_size = $request->input('mini_text_size', 20); //小文字字体大小
  299. $mini_text_left = $request->input('mini_text_left', 74); //小文字左边距
  300. $mini_text_top = $request->input('mini_text_top', 618); //小文字上边距
  301. $mini_text_color = $request->input('mini_text_color', '#fff'); //小文字颜色
  302. $h5_url = "http://saler.test/shareStore/#/pages/index/productDetails/productDetails"; // H5招募链接
  303. $qr_path = public_path('poster/temp_qrcode/'); // 二维码路径
  304. $qr_file_name = 'temp_poster_package_' . $user_id . time() . mt_rand(1000, 9999) . '.jpg'; // 二维码文件名
  305. $path = 'poster/package_poster/' . $user_id . '/'; // 海报保存相对路径
  306. $fxuser_path = public_path($path); // 海报保存路径
  307. $fxuser_file_name = 'package_poster_' . $user_id . $poster_id . $package_id . '.jpg'; // 海报保存文件名
  308. $urlParams = http_build_query([
  309. 'user_key' => Hashids::encode($user_id),
  310. 'package_key' => Hashids::encode($package_id),
  311. ]);
  312. $url = $h5_url . "?" . $urlParams; // 分享链接
  313. $packageInfo = Packages::select(['id', 'image', 'mini_text'])->where('id', $package_id)->first();
  314. if(empty($packageInfo)){
  315. return error("套餐不存在");
  316. }
  317. $poster_info = Posters::select(['id', 'img'])->where('id', $poster_id)->first();
  318. // 生成二维码并保存为图片
  319. UtilsHelper::ensureDirectoryExists($qr_path);
  320. QrCode::format('png')->size($qr_code_size)->margin(1)->generate($url, $qr_path . $qr_file_name);
  321. // 选择引擎
  322. $manager = ImageManager::gd();
  323. // 加载网路背景图
  324. $templateImage = $manager->read(file_get_contents($poster_info->img));
  325. // 合并二维码
  326. $templateImage->place($qr_path . $qr_file_name, 'top-left', $qr_code_left, $qr_code_top);
  327. // 加载套餐图
  328. $packageImage = $manager->read(file_get_contents($packageInfo->image));
  329. // 缩放套餐图
  330. $packageImage->scale($package_image_size);
  331. // 合并套餐图
  332. $templateImage->place($packageImage, 'top-left', $package_image_left, $package_image_top);
  333. // 合并文字
  334. $templateImage->text(UtilsHelper::truncateString($packageInfo->mini_text), $mini_text_left, $mini_text_top, function (FontFactory $font) use ($mini_text_size, $mini_text_color) {
  335. $font->filename(public_path('poster/ttf/思源黑体SOURCEHANSANSCN-REGULAR.OTF')); // 指定字体文件的路径
  336. $font->size($mini_text_size); // 设置文本大小,单位是像素
  337. $font->color($mini_text_color); // 设置文本颜色
  338. });
  339. // 保存
  340. UtilsHelper::ensureDirectoryExists($fxuser_path); // 检查路径是否存在
  341. $templateImage->save($fxuser_path . $fxuser_file_name,);
  342. unlink($qr_path . $qr_file_name); // 删除临时二维码
  343. $TencentCosHelper = new TencentCosHelper();
  344. $result = $TencentCosHelper->uploadFiles($fxuser_path . $fxuser_file_name, "cos_file/" . $path . $fxuser_file_name);
  345. if ($result['code'] != 1) {
  346. return ['code' => 0, 'msg' => "海报生成失败"];
  347. }
  348. unlink($fxuser_path . $fxuser_file_name);
  349. return ['code' => 1, 'msg' => "success", 'data' => $result['data']['path'], 'url' => $url];
  350. }
  351. }