|
|
@@ -0,0 +1,228 @@
|
|
|
+<?php
|
|
|
+namespace tw\async\tasks;
|
|
|
+
|
|
|
+use app\admin\model\system\SystemAttachment;
|
|
|
+use app\models\routine\RoutineCode;
|
|
|
+use crmeb\services\upload\Upload;
|
|
|
+use app\models\routine\RoutineQrcode;
|
|
|
+use crmeb\services\UtilService;
|
|
|
+use think\facade\Log;
|
|
|
+use app\models\user\User;
|
|
|
+
|
|
|
+/**
|
|
|
+ * 和用户相关的异步任务,采用 AsyncClass 的执行方法
|
|
|
+ */
|
|
|
+class UserTaskClass {
|
|
|
+ const QINIU_PATH = 'user_share_qrcode'; // 海报保存在七牛目录的子路径
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 生成用户分享海报
|
|
|
+ * @param $uid
|
|
|
+ * @param $postId : 数据库配置的海报背景 ID
|
|
|
+ * @param $is_promoter
|
|
|
+ * @return string
|
|
|
+ */
|
|
|
+ public static function generate_user_poster_filename($uid, $posterId, $is_promoter=true) : string
|
|
|
+ {
|
|
|
+ return $uid . '_' . $is_promoter . '_' . $posterId . '_user_routine_poster.jpg';
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 生成用户分享二维码文件名
|
|
|
+ * @param $uid
|
|
|
+ * @param $is_promoter
|
|
|
+ * @return string
|
|
|
+ */
|
|
|
+ public static function generate_user_share_qrcode_filename($uid, $is_promoter=true) : string
|
|
|
+ {
|
|
|
+ return $uid . '_' . $is_promoter . '_user_routine.jpg';
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 生成用户海报
|
|
|
+ * @param $user
|
|
|
+ * @param $siteSsl
|
|
|
+ * @param $type
|
|
|
+ * @return array: [bool, str] : 表示是否成功,错误描述
|
|
|
+ */
|
|
|
+ public static function generate_user_poster(int $uid, bool $siteSsl=true, int $type=1) : array
|
|
|
+ {
|
|
|
+ $rootPath = app()->getRootPath();
|
|
|
+ try {
|
|
|
+ $resRoutine = true;//小程序
|
|
|
+ $resWap = true;//公众号
|
|
|
+ $siteUrl = sys_config('site_url');
|
|
|
+ // 配置的海报背景模板
|
|
|
+ $routineSpreadBanner = sys_data('routine_spread_banner');
|
|
|
+ if (!count($routineSpreadBanner)) {
|
|
|
+ $err = '暂无海报';
|
|
|
+ Log::error($err);
|
|
|
+ return [false, $err];
|
|
|
+ }
|
|
|
+ $user = User::getUserInfo($uid);
|
|
|
+ if (!$user) {
|
|
|
+ $err = '用户不存在';
|
|
|
+ Log::error($err);
|
|
|
+ return [false, $err];
|
|
|
+ }
|
|
|
+ $is_promoter = $user['is_promoter'] ?? 0;
|
|
|
+ if (!$is_promoter) {
|
|
|
+ return [false, '没有推广权限'];
|
|
|
+ }
|
|
|
+
|
|
|
+ if ($type == 1) {
|
|
|
+ // 直接获取用户海报
|
|
|
+ foreach ($routineSpreadBanner as &$item) {
|
|
|
+ $item['namep'] = self::generate_user_poster_filename($user['uid'], $item['id'], $user['is_promoter']);
|
|
|
+ }
|
|
|
+ $posters = SystemAttachment::whereIn('name', array_column($routineSpreadBanner, 'namep'))->field('name, att_dir')->select()->toArray();
|
|
|
+ if (count($posters)) {
|
|
|
+ foreach ($routineSpreadBanner as $key => &$item) {
|
|
|
+ foreach ($posters as $poster) {
|
|
|
+ if ($item['namep'] == $poster['name']) {
|
|
|
+ $item['poster'] = $poster['att_dir'];
|
|
|
+ }
|
|
|
+ }
|
|
|
+ unset($item['namep']);
|
|
|
+ if (!isset($item['poster'])) {
|
|
|
+ unset($routineSpreadBanner[$key]);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ $routineSpreadBanner = array_values($routineSpreadBanner);
|
|
|
+ if (count($routineSpreadBanner) > 0) {
|
|
|
+ return [true, $routineSpreadBanner];
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ //小程序个人分享二维码文件名
|
|
|
+ $name = self::generate_user_share_qrcode_filename($user['uid'], $user['is_promoter']);
|
|
|
+ $imageInfo = SystemAttachment::getInfo($name, 'name');
|
|
|
+ //检测远程文件是否存在
|
|
|
+ // 20210722 注释掉,太卡
|
|
|
+ if (isset($imageInfo['att_dir']) &&
|
|
|
+ strstr($imageInfo['att_dir'], 'http') !== false &&
|
|
|
+ curl_file_exist($imageInfo['att_dir']) === false) {
|
|
|
+ $imageInfo = null;
|
|
|
+ SystemAttachment::where(['name' => $name])->delete();
|
|
|
+ }
|
|
|
+ if (!$imageInfo) { // 数据库中无记录
|
|
|
+ $res = RoutineCode::getShareCode($user['uid'], 'spread', '', '');
|
|
|
+ if (!$res) {
|
|
|
+ return [false, '二维码生成失败'];
|
|
|
+ }
|
|
|
+ $uploadType = (int)sys_config('upload_type', UPLOAD_FS);
|
|
|
+ $upload = new Upload($uploadType, [
|
|
|
+ 'accessKey' => sys_config('accessKey'),
|
|
|
+ 'secretKey' => sys_config('secretKey'),
|
|
|
+ 'uploadUrl' => sys_config('uploadUrl'),
|
|
|
+ 'storageName' => sys_config('storage_name'),
|
|
|
+ 'storageRegion' => sys_config('storage_region'),
|
|
|
+ ]);
|
|
|
+ // 上传分享二维码 [ qiniu 添加一个子路径]
|
|
|
+ $remoteName = $uploadType == UPLOAD_QINIU ? self::QINIU_PATH . '/' . $name : $name;
|
|
|
+ $uploadRes = $upload->to('routine/spread/code')->validate()->stream($res['res'], $remoteName);
|
|
|
+ if ($uploadRes === false) {
|
|
|
+ $err = $upload->getError();
|
|
|
+ Log::error("upload error:" . $err);
|
|
|
+ return [false, $err];
|
|
|
+ }
|
|
|
+ $upload->delete($name);
|
|
|
+ $imageInfo = $upload->getUploadInfo();
|
|
|
+ // 20210919 为了能小程序下载,这个函数上传的图片全部使用 https
|
|
|
+ $httpsUrl = set_http_type($imageInfo['dir']);
|
|
|
+ $imageInfo['image_type'] = $uploadType;
|
|
|
+ SystemAttachment::attachmentAdd(basename($imageInfo['name']), $imageInfo['size'], $imageInfo['type'], $httpsUrl, $httpsUrl, 1, $imageInfo['image_type'], $imageInfo['time'], 2);
|
|
|
+ RoutineQrcode::setRoutineQrcodeFind($res['id'], ['status' => 1, 'url_time' => time(), 'qrcode_url' => $imageInfo['dir']]);
|
|
|
+ $urlCode = $imageInfo['dir'];
|
|
|
+ } else {
|
|
|
+ $urlCode = $imageInfo['att_dir'];
|
|
|
+ }
|
|
|
+
|
|
|
+ if ($imageInfo['image_type'] == UPLOAD_FS) {
|
|
|
+ $urlCode = $siteUrl . $urlCode;
|
|
|
+ }
|
|
|
+ $siteUrlHttps = set_http_type($siteUrl, $siteSsl ? 0 : 1);
|
|
|
+ $filelink = [
|
|
|
+ 'Bold' => 'public/static' . DS . 'font' . DS . 'Alibaba-PuHuiTi-Regular.otf',
|
|
|
+ 'Normal' => 'public/static' . DS . 'font' . DS . 'Alibaba-PuHuiTi-Regular.otf',
|
|
|
+ ];
|
|
|
+ if (!file_exists($filelink['Bold'])) {
|
|
|
+ $err = '缺少字体文件Bold';
|
|
|
+ Log::error($err);
|
|
|
+ return [false, $err];
|
|
|
+ }
|
|
|
+ if (!file_exists($filelink['Normal'])) {
|
|
|
+ $err = '缺少字体文件Normal';
|
|
|
+ Log::error($err);
|
|
|
+ return [false, $err];
|
|
|
+ }
|
|
|
+ foreach ($routineSpreadBanner as $key => &$item) {
|
|
|
+ $posterInfo = '海报生成失败';
|
|
|
+ $config = array(
|
|
|
+ 'image' => array(
|
|
|
+ array(
|
|
|
+ 'url' => $urlCode, //二维码资源
|
|
|
+ 'stream' => 0,
|
|
|
+ 'left' => 114,
|
|
|
+ 'top' => 790,
|
|
|
+ 'right' => 0,
|
|
|
+ 'bottom' => 0,
|
|
|
+ 'width' => 120,
|
|
|
+ 'height' => 120,
|
|
|
+ 'opacity' => 100
|
|
|
+ )
|
|
|
+ ),
|
|
|
+ 'text' => array(
|
|
|
+ array(
|
|
|
+ 'text' => $user['nickname'],
|
|
|
+ 'left' => 250,
|
|
|
+ 'top' => 840,
|
|
|
+ 'fontPath' => $rootPath . $filelink['Bold'], //字体文件
|
|
|
+ 'fontSize' => 16, //字号
|
|
|
+ 'fontColor' => '40,40,40', //字体颜色
|
|
|
+ 'angle' => 0,
|
|
|
+ ),
|
|
|
+ array(
|
|
|
+ 'text' => '邀请您加入' . sys_config('site_name'),
|
|
|
+ 'left' => 250,
|
|
|
+ 'top' => 880,
|
|
|
+ 'fontPath' => $rootPath . $filelink['Normal'], //字体文件
|
|
|
+ 'fontSize' => 16, //字号
|
|
|
+ 'fontColor' => '40,40,40', //字体颜色
|
|
|
+ 'angle' => 0,
|
|
|
+ )
|
|
|
+ ),
|
|
|
+ 'background' => $item['pic'],
|
|
|
+ 'name' => self::QINIU_PATH . '/' . self::generate_user_poster_filename($user['uid'], $item['id'], $user['is_promoter']),
|
|
|
+ );
|
|
|
+ $resRoutine = $resRoutine && $posterInfo = UtilService::setSharePoster($config, 'routine/spread/poster');
|
|
|
+ if (!is_array($posterInfo)) {
|
|
|
+ Log::error($posterInfo);
|
|
|
+ return [false, $posterInfo];
|
|
|
+ }
|
|
|
+ // 20210919 为了能小程序下载,这个函数上传的图片全部使用 https
|
|
|
+ $httpsUrl = set_http_type($posterInfo['dir']);
|
|
|
+ SystemAttachment::attachmentAdd(basename($posterInfo['name']), $posterInfo['size'], $posterInfo['type'], $httpsUrl, $httpsUrl, 1, $posterInfo['image_type'], $posterInfo['time'], 2);
|
|
|
+ if ($resRoutine) {
|
|
|
+ if ($posterInfo['image_type'] == UPLOAD_FS)
|
|
|
+ $item['poster'] = $siteUrlHttps . $posterInfo['dir'];
|
|
|
+ else
|
|
|
+ $item['poster'] = set_http_type($posterInfo['dir'], $siteSsl ? 0 : 1);
|
|
|
+ $item['poster'] = str_replace('\\', '/', $item['poster']);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } else if ($type == 2) {
|
|
|
+ Log::error(__FUNCTION__ . ' bad parameter type=2');
|
|
|
+ }
|
|
|
+ if ($resRoutine && $resWap) {
|
|
|
+ return [true, $routineSpreadBanner];
|
|
|
+ } else {
|
|
|
+ return [false, '生成图片失败'];
|
|
|
+ }
|
|
|
+ } catch (\Exception $e) {
|
|
|
+ Log::error('生成图片时,系统错误:' . $e->getMessage());
|
|
|
+ return [false, '生成图片时,系统错误:' . $e->getMessage()];
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|