| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233 |
- <?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 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 = '暂无海报';
- errlog($err);
- return [false, $err];
- }
- $user = User::getUserInfo($uid);
- if (!$user) {
- $err = '用户不存在';
- errlog($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();
- errlog("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';
- errlog($err);
- return [false, $err];
- }
- if (!file_exists($filelink['Normal'])) {
- $err = '缺少字体文件Normal';
- errlog($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)) {
- errlog($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) {
- errlog(__FUNCTION__ . ' bad parameter type=2');
- }
- if ($resRoutine && $resWap) {
- return [true, $routineSpreadBanner];
- } else {
- return [false, '生成图片失败'];
- }
- } catch (\Exception $e) {
- errlog('生成图片时,系统错误:' . $e->getMessage());
- return [false, '生成图片时,系统错误:' . $e->getMessage()];
- }
- }
- }
|