ArticleController.php 47 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327
  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * User: Administrator
  5. * Date: 2019/4/17 0017
  6. * Time: 16:27
  7. */
  8. namespace App\Http\Controllers\Admin;
  9. use App\Exports\BasicExport;
  10. use App\Http\Controllers\Controller;
  11. use App\Http\Logics\Admin\ArticleLogic;
  12. use App\Http\Models\Article;
  13. use App\Http\Models\ArticleLinkNotice;
  14. use App\Http\Models\ArticleNote;
  15. use App\Http\Models\ArticleSiteKeep;
  16. use App\Http\Models\ArticleSocial;
  17. use App\Http\Models\Role;
  18. use App\Http\Models\Site;
  19. use App\Http\Models\SiteEnterprise;
  20. use App\Http\Models\SiteInfo;
  21. use App\Http\Models\User;
  22. use App\Http\Requests\Article\ArticleRequest;
  23. use App\Http\Requests\Article\ArticleTranslateRequest;
  24. use App\Http\Traits\HasSites;
  25. use Illuminate\Database\Eloquent\Builder;
  26. use Illuminate\Http\Request;
  27. use Illuminate\Support\Facades\Auth;
  28. use GuzzleHttp\Client;
  29. use GuzzleHttp\Pool;
  30. use GuzzleHttp\Psr7\Response;
  31. use App\Http\Requests\Article\ArticleSyncRequest;
  32. use Illuminate\Support\Facades\DB;
  33. use Illuminate\Support\Facades\Log;
  34. use Illuminate\Contracts\View\Factory;
  35. use Illuminate\Http\JsonResponse;
  36. use Illuminate\View\View;
  37. /**
  38. * 软文控制器
  39. * Class ArticleController
  40. * @package App\Http\Controllers\Admin
  41. */
  42. class ArticleController extends Controller
  43. {
  44. use HasSites;
  45. protected $logic;
  46. const STATUS = [
  47. 1 => '待翻译',
  48. 2 => '翻译中',
  49. 3 => '待审核',
  50. 4 => '审核不通过',
  51. 5 => '审核通过',
  52. ];
  53. public function __construct(ArticleLogic $logic)
  54. {
  55. $this->logic = $logic;
  56. }
  57. /**
  58. * 新的谷歌翻译接口
  59. */
  60. /**
  61. * 新的谷歌翻译接口
  62. */
  63. public function NewTranslate(Request $request)
  64. {
  65. $article_id = $request->input('id');
  66. $article_detail = Article::query()->where('id','=',$article_id)->first();
  67. /************阿里云翻译****************/
  68. try {
  69. $data =[
  70. 'SourceText'=>$article_detail->content,
  71. ];
  72. $re = $this->send_post('http://ali.six543.cn', $data);
  73. $result = json_decode($re, true);
  74. if($result['Code']=='200'){
  75. //$article_detail->update($result['Data']['Translated']);
  76. Article::query()->where('id', $article_id)->update(['translate_content' => $result['Data']['Translated']??'']);
  77. return response()->json(['message' => '翻译成功'], 200);
  78. }
  79. else{
  80. return response()->json(['message' => 'error'], 400);
  81. }
  82. } catch (\Throwable $exception) {
  83. return response()->json(['message' => 'error'], 400);
  84. }
  85. /************阿里云翻译****************/
  86. /*********原谷歌翻译**************/
  87. // $data =[
  88. // 'q'=>$article_detail->content,
  89. // 'source'=>"zh-CN",
  90. // 'target'=>'en',
  91. // 'format'=>'text/html'
  92. // ];
  93. // $data = json_encode($data);
  94. //
  95. // // $contentt = str_replace("<P>","",$article_detail->content);
  96. // // $contentt = str_replace("<p>","",$contentt);
  97. // // $contentt = str_replace("</P>","",$contentt);
  98. // // $contentt = str_replace("</p>","",$contentt);
  99. // // $contentt = str_replace("<strong>","",$contentt);
  100. // // $contentt = str_replace("</strong>","",$contentt);
  101. // //$contentt = strip_tags($article_detail->content, '<p></p>');
  102. // $contentt = $article_detail->content;
  103. // $client = new Client;
  104. // $response = $client->post('https://translation.googleapis.com/language/translate/v2?key=AIzaSyBdtoXa-hBytAZq9KNCfuZJxBwHzYRed0M', [
  105. // 'form_params' => [
  106. // 'q'=>$contentt,
  107. // 'source'=>"zh-CN",
  108. // 'target'=>'en',
  109. // 'format'=>'html'
  110. // ],
  111. // ]);
  112. // $result = json_decode($response->getBody()->getContents(), true);
  113. // $data_de['translate_content'] = $result['data']['translations'][0]['translatedText'] ?? '';
  114. // var_dump($data_de['translate_content']);
  115. // die;
  116. // if(!empty($data_de['translate_content'])){
  117. // //$data_de['translate_content'] = str_replace("< ","<",$data_de['translate_content']);
  118. // $article_detail->update($data_de);
  119. // return response()->json(['message' => '翻译成功'], 200);
  120. // }else{
  121. // return response()->json(['message' => 'error'], 400);
  122. // }
  123. /*********原谷歌翻译**************/
  124. }
  125. function send_post($url, $data) {
  126. // 1. 初始化一个cURL会话
  127. $ch = curl_init();
  128. // 2. 设置请求选项, 包括具体的url
  129. curl_setopt($ch, CURLOPT_URL, $url);
  130. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  131. // 设置请求为post类型
  132. curl_setopt($ch, CURLOPT_POST, 1);
  133. // 添加post数据到请求中
  134. curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
  135. //启用时会将头文件的信息作为数据流输出
  136. curl_setopt($ch, CURLOPT_HEADER, 0);
  137. // 3. 执行一个cURL会话并且获取相关回复
  138. $response = curl_exec($ch);
  139. // 4. 释放cURL句柄,关闭一个cURL会话
  140. curl_close($ch);
  141. //打印返回值
  142. return $response;
  143. }
  144. /**
  145. * 首页
  146. * @param Request $request
  147. * @return Factory|JsonResponse|View
  148. */
  149. public function index(Request $request)
  150. {
  151. if (!$request->ajax()) {
  152. return view('admin/article/index');
  153. }
  154. $userSite = $this->hasUserOneSite();
  155. $idaa = $userSite->id;
  156. $siteTitle = $request->input('site_title');
  157. $beApplicable = $request->input('be_applicable');
  158. if (isset($beApplicable)) {
  159. $condition[] = ['be_applicable', '=', $beApplicable];
  160. $condition[] = ['site_id', '=', $idaa];
  161. }
  162. $status = $request->input('status');
  163. if (!empty($status) && $status != 7) {
  164. $condition[] = ['status', '=', $status];
  165. }
  166. $beApplicable = $request->input('beApplicable');
  167. if (isset($beApplicable)) {
  168. $condition[] = ['be_applicable', '=', $beApplicable];
  169. $condition[] = ['site_id', '=', $idaa];
  170. }
  171. $builder = Article::query()->scopes(['user'])->whereHas('site', function (Builder $builder) use ($siteTitle, $status) {
  172. if ($siteTitle) {
  173. $builder->where('cn_title', 'like', '%' . $siteTitle . '%');
  174. }
  175. if ($status == 7) {
  176. $builder->where('status', $status);
  177. }
  178. })->with(['translator']);
  179. if ($siteId = $request->input('siteId')) {
  180. $condition[] = ['site_id', '=', $siteId];
  181. }
  182. if ($keyword = $request->input('keyword')) {
  183. $condition[] = ['title', 'like', '%' . $keyword . '%'];
  184. }
  185. $articles = $builder->where($condition ?? [])->orderByDesc('id')
  186. ->paginate($request->input('pageSize') ?? TABLE_PAGE_SIZE);
  187. $items = $articles->items();
  188. array_walk($items, function ($item) {
  189. $item->status_title = $item->status_with_css;
  190. $item->site_title = $item->site->cn_title ?? '';
  191. $item->translator_name = $item->translator->username ?? '';
  192. $item->be_applicable = $item->check_status_with_css;
  193. if (!empty($item->publish_at)) {
  194. $item->publish_at = date('Y-m-d', strtotime($item->publish_at));
  195. }
  196. });
  197. return response()->json([
  198. 'rows' => $items,
  199. 'total' => $articles->total()
  200. ]);
  201. }
  202. /**
  203. * 项目管理详情中的软文列表
  204. * @param Request $request
  205. * @param $id
  206. * @return Factory|JsonResponse|View
  207. */
  208. public function siteArticles(Request $request, $id)
  209. {
  210. if (!$request->ajax()) {
  211. $start = date('Y-m-01 00:00:00');
  212. $end = date('Y-m-t 23:59:59');
  213. $siteInFo = SiteInfo::query()->where('site_id', $id)->first();
  214. $count = Article::query()->where('site_id', $id)->where('be_applicable', 1)->count();
  215. $site = Site::query()->where('id', $id)->first();
  216. $pendingUpgrade = Article::query()->where('site_id', $id)->where('be_applicable', 1)->whereNull('publish_at')->count() ?? 0;
  217. $thisMonthUpgrade = Article::query()->where('site_id', $id)->whereBetween('publish_at', [$start, $end])->count() ?? 0;
  218. return view('admin/article/site_article', [
  219. 'siteId' => $id,
  220. 'siteInFo' => $siteInFo,
  221. 'count' => $count,
  222. 'pendingUpgrade' => $pendingUpgrade,
  223. 'thisMonthUpgrade' => $thisMonthUpgrade,
  224. 'site' => $site,
  225. ]);
  226. }
  227. $builder = Article::query()->with(['site', 'translator']);
  228. $sortName = $request->input('sortName');
  229. $sortOrder = $request->input('sortOrder');
  230. if (!empty($sortName) && !empty($sortOrder)) {
  231. $builder->orderBy($sortName, $sortOrder);
  232. }
  233. $condition[] = ['site_id', '=', $id];
  234. $condition[] = ['be_applicable', '=', 1];
  235. if ($status = $request->input('status')) {
  236. $condition[] = ['status', '=', $status];
  237. }
  238. if ($keyword = $request->input('keyword')) {
  239. $condition[] = ['title', 'like', '%' . $keyword . '%'];
  240. }
  241. $articles = $builder->where($condition ?? [])->orderByDesc('id')
  242. ->paginate($request->input('pageSize') ?? TABLE_PAGE_SIZE);
  243. $items = $articles->items();
  244. array_walk($items, function ($item) {
  245. $item->status_title = $item->status_with_css;
  246. $item->site_title = $item->site->cn_title ?? '';
  247. $item->translator_name = $item->translator->username ?? '';
  248. });
  249. return response()->json([
  250. 'rows' => $items,
  251. 'total' => $articles->total()
  252. ]);
  253. }
  254. /**
  255. * 保存软文每月更新数
  256. * @param Request $request
  257. * @return JsonResponse
  258. */
  259. public function articlesUpdatesPerMonth(Request $request)
  260. {
  261. $siteId = $request->input('siteId');
  262. $articlesUpdatesPerMonth = $request->input('articlesUpdatesPerMonth') ?? 4;
  263. $renewalQuantity = $request->input('article_renewal_quantity') ?? 0;
  264. Site::query()->where('id', $siteId)->update(['articles_updates_per_month' => $articlesUpdatesPerMonth, 'article_renewal_quantity' => $renewalQuantity]);
  265. return response()->json(['message' => '操作成功']);
  266. }
  267. /**
  268. * 文章详情
  269. * @param Request $request
  270. * @param $id
  271. * @return Factory|View
  272. */
  273. public function detail(Request $request, $id)
  274. {
  275. $article = Article::query()->find($id);
  276. if ($article) {
  277. $site = Site::query()->select(['id', 'cn_title', 'en_title', 'domain'])->where(['id' => $article->site_id])->first();
  278. $siteEnterprise = SiteEnterprise::query()->select(['brand'])->where(['site_id' => $article->site_id])->first();
  279. }
  280. return view('admin/article/detail', [
  281. 'data' => $article,
  282. 'referer' => $request->input('referer'),
  283. 'site' => $site ?? null,
  284. 'siteEnterprise' => $siteEnterprise ?? null
  285. ]);
  286. }
  287. /**
  288. * 文章添加保存
  289. * @param ArticleRequest $request
  290. * @param $id
  291. * @return Factory|JsonResponse|View
  292. */
  293. public function save(ArticleRequest $request, $id)
  294. {
  295. if (!$request->ajax()) {
  296. if ($id > 0) {
  297. $article = Article::query()->where(['id' => $id])->first();
  298. } else { //添加 [选中默认的站点]
  299. if ($siteId = $request->input('siteId')) {
  300. $siteKeep = (object)['site_id' => $siteId];
  301. } else {
  302. $siteKeep = ArticleSiteKeep::query()->where(['user_id' => Auth::id()])->first();
  303. }
  304. }
  305. $insider = User::query()->select(['id', 'username', 'nickname'])->find(Article::INSIDER);
  306. $translators = Role::getUsers(Role::TYPE_ARTICLE_PART);
  307. if ($insider) {
  308. $translators->prepend($insider);
  309. }
  310. return view('admin/article/save', [
  311. 'data' => $article ?? null,
  312. 'sites' => $this->userSites(),
  313. 'translators' => $translators,
  314. 'siteKeep' => $siteKeep ?? null
  315. ]);
  316. }
  317. $validated = $request->validated();
  318. if ($validated['translator_id'] != Article::INSIDER && empty($validated['content'])) {
  319. return response()->json(['message' => '正文不能为空'], 400);
  320. }
  321. if (!empty($validated['translate_content'])) {
  322. $validated['translate_content'] = del_domain_from_src($validated['translate_content']);
  323. }
  324. if (empty($validated['thumb'])) {
  325. $siteInfo = SiteInfo::query()->select(['is_upload_thumb'])->where(['site_id' => $validated['site_id']])->first();
  326. if (!empty($siteInfo->is_upload_thumb)) {
  327. return response()->json(['message' => '缩略图站点设置必填 不能为空'], 400);
  328. }
  329. }
  330. return $this->logic->save($validated, $id);
  331. }
  332. /**
  333. * 文章同步
  334. * @param ArticleSyncRequest $request
  335. * @param $id
  336. * @return Factory|JsonResponse|View
  337. */
  338. public function sync(ArticleSyncRequest $request, $id)
  339. {
  340. $site = Site::query()->where(['id' => $id])->first();
  341. if (!$site) return response()->json(['message' => '站点信息不存在'], 400);
  342. if (!$request->ajax()) {
  343. $taskUrls = [sprintf('%scontent/getOptsByJson', $site->api_url), sprintf('%scontent/getTplsByJson', $site->api_url)];
  344. $client = new Client([
  345. 'verify' => false,
  346. 'timeout' => 100,
  347. ]); //并发请求链接地址
  348. $requests = function () use ($client, $taskUrls) {
  349. foreach ($taskUrls as $item) {
  350. if (empty($item))
  351. continue;
  352. yield new \GuzzleHttp\Psr7\Request('GET', $item);
  353. }
  354. };
  355. $rejected = false; // 默认没有被拒绝
  356. $result = [];
  357. $pool = new Pool($client, $requests(), [
  358. 'concurrency' => 2, //同时并发抓取几个
  359. 'fulfilled' => function (Response $response, $index) use (&$result) {
  360. $temp = $response->getBody()->getContents();
  361. $temp = trim($temp, "\xEF\xBB\xBF");
  362. $result[$index] = json_decode($temp, true);
  363. },
  364. 'rejected' => function (\Throwable $throwable, $index) use (&$rejected, &$site) {
  365. Log::error(var_export($throwable->getMessage(), 1));
  366. // Log::error(sprintf('%scontent/getOptsByJson', $site->api_url));
  367. // Log::error(sprintf('%scontent/getTplsByJson', $site->api_url));
  368. $rejected = true; //接口错误
  369. },
  370. ]);
  371. $promise = $pool->promise();
  372. $promise->wait();
  373. if ($rejected) { //如果接口错误提示
  374. return view('admin/errors/tips', [
  375. 'tips' => 'api接口异常(请检查项目概况-基本信息-api地址是否填写正确',
  376. 'closeBtn' => 1
  377. ]);
  378. }
  379. return view('admin/article/sync', [
  380. // 'remoteContent' => array_values($content),
  381. 'remoteContent' => array_values($result[0]),
  382. // 'removeTemplate' => $template,
  383. 'removeTemplate' => $result[1],
  384. 'articles' => Article::query()->whereIn('id', $request->input('articleIds'))->select(['id', 'title'])->get(),
  385. 'siteId' => $id
  386. ]);
  387. }
  388. $server = $site->server;
  389. if (empty($server)) return response()->json(['message' => '站点服务器信息不存在'], 400);
  390. return $this->logic->sync($request->validated(), $site, $server);
  391. }
  392. /**
  393. * 文章认领
  394. * @param $id
  395. * @return JsonResponse
  396. */
  397. public function claim($id)
  398. {
  399. $article = Article::query()->where(['id' => $id])->first();
  400. if (!$article) {
  401. return response()->json(['message' => '文章信息不存在'], 400);
  402. }
  403. if ($article->translator_id) {
  404. return response()->json(['message' => '此文章已被认领'], 400);
  405. }
  406. if ($article->status != 1) {
  407. return response()->json(['message' => '此文章不属于待翻译状态'], 400);
  408. }
  409. if (Auth::id() != Article::IS_EXPIRED) {
  410. if (Article::query()->where(['translator_id' => Auth::id()])
  411. ->whereIn('status', [Article::STATUS_TRANSLATING, Article::STATUS_FAILED])->count() >= 10) {
  412. return response()->json(['message' => '一个用户最多只有10个翻译文章'], 400);
  413. }
  414. }
  415. $article->status = Article::STATUS_TRANSLATING;
  416. $article->translator_id = Auth::id();
  417. $article->expired_at = date('Y-m-d H:i:s', strtotime('+1 day'));
  418. $article->save();
  419. return response()->json(['message' => '操作成功']);
  420. }
  421. /**
  422. * 我要翻译
  423. * @param ArticleTranslateRequest $request
  424. * @param $id
  425. * @return Factory|JsonResponse|View
  426. */
  427. public function translate(ArticleTranslateRequest $request, $id)
  428. {
  429. if (!$request->ajax()) {
  430. $article = Article::query()->where(['id' => $id])->first();
  431. return view('admin/article/hall_translate', [
  432. 'data' => $article,
  433. 'site' => Site::query()->select(['cn_title', 'en_title', 'domain'])->find($article->site_id),
  434. 'siteEnterprise' => SiteEnterprise::query()->select(['brand'])->find($article->site_id)
  435. ]);
  436. }
  437. $article = Article::query()->where(['id' => $id])->first();
  438. if (!$article) return response()->json(['message' => '文章信息不存在'], 400);
  439. $validated = $request->validated();
  440. if ($request->input('admin')) {
  441. if (empty($validated['thumb'])) {
  442. $siteInfo = SiteInfo::query()->select(['is_upload_thumb'])->where(['site_id' => $article->site_id])->first();
  443. if (!empty($siteInfo->is_upload_thumb)) {
  444. return response()->json(['message' => '缩略图站点设置必填 不能为空'], 400);
  445. }
  446. }
  447. if (!$validated['translate_title2']) {
  448. $str = preg_replace("/[^a-zA-Z0-9\s]/", "", $validated['translate_title']);
  449. $validated['translate_title2'] = strtolower(preg_replace("/\s+/", "-", $str));
  450. }
  451. } else {
  452. unset($validated['translate_title2'], $validated['thumb']);
  453. }
  454. $validated['translate_words'] = word_count($validated['translate_title']) + word_count($validated['translate_content']);
  455. $validated['translate_content'] = del_domain_from_src($validated['translate_content']);
  456. $validated['translate_submit_at'] = date('Y-m-d H:i:s');
  457. $article->update($validated);
  458. return response()->json(['message' => '操作成功']);
  459. }
  460. /**
  461. * 批量审核通过
  462. * @param Request $request
  463. * @return JsonResponse
  464. */
  465. public function batchPass(Request $request)
  466. {
  467. $user = Auth::user();
  468. $passScore = $request->input('passScore') ?? 0;
  469. $ids = $request->input('ids');
  470. Article::query()->whereIn('id', $ids)->where(['status' => Article::STATUS_AUDITING])->update([
  471. 'status' => Article::STATUS_PASSED,
  472. 'audit_at' => date('Y-m-d H:i:s'),
  473. 'auditor_id' => $user->id,
  474. 'auditor_name' => $user->nickname,
  475. 'pass_score' => $passScore
  476. ]);
  477. return response()->json(['message' => '操作成功']);
  478. }
  479. /**
  480. * 批量审核不通过
  481. * @param Request $request
  482. * @return JsonResponse
  483. */
  484. public function batchNoPass(Request $request)
  485. {
  486. $ids = $request->input('ids');
  487. Article::query()->whereIn('id', $ids)->where(['status' => Article::STATUS_AUDITING])->update([
  488. 'status' => Article::STATUS_FAILED,
  489. 'fail_reason' => $request->input('fail_reason')
  490. ]);
  491. return response()->json(['message' => '操作成功']);
  492. }
  493. /**
  494. * 释放任务
  495. * @param $id
  496. * @return JsonResponse
  497. */
  498. public function release($id)
  499. {
  500. $article = Article::query()->where(['id' => $id])->first();
  501. if (!$article) return response()->json(['message' => '文章信息不存在'], 400);
  502. if (!in_array($article->status, [Article::STATUS_TRANSLATING, Article::STATUS_FAILED])) {
  503. return response()->json(['message' => '此文章不属于翻译中或审核失败状态'], 400);
  504. }
  505. $article->update([
  506. 'status' => 1,// 待翻译
  507. 'translator_id' => 0,
  508. 'translate_title' => $article->init_tran_title,
  509. 'translate_words' => word_count($article->init_tran_content) + word_count($article->init_tran_title),
  510. 'translate_content' => $article->init_tran_content,
  511. 'expired_at' => null
  512. ]);
  513. return response()->json(['message' => '操作成功']);
  514. }
  515. //软文注意事项
  516. public function notice(Request $request)
  517. {
  518. if (!$request->ajax()) {
  519. $data = ArticleLinkNotice::query()->where(['type' => 'article'])->first();
  520. return view('admin/article/notice', [
  521. 'data' => $data ?? ''
  522. ]);
  523. }
  524. ArticleLinkNotice::query()->where(['type' => 'article'])->update([
  525. 'content' => $request->input('content')
  526. ]);
  527. return response()->json(['message' => '操作成功']);
  528. }
  529. /**
  530. * 任务大厅
  531. * @param Request $request
  532. * @return Factory|JsonResponse|View
  533. */
  534. public function hall(Request $request)
  535. {
  536. if (!$request->ajax()) {
  537. Article::query()->whereIn('status', [Article::STATUS_TRANSLATING])
  538. ->where([['expired_at', '<', date('Y-m-d H:i:s')]])->update([
  539. 'translator_id' => 0,
  540. 'expired_at' => null,
  541. 'status' => Article::STATUS_PENDING
  542. ]); //检测是否有翻译中且已过期的 将其释放任务
  543. // $haveNotSettle = Article::query()->where(['translator_id' => Auth::id()])->where('status', 5)->get();
  544. // $settleHistory = Article::query()->where(['translator_id' => Auth::id()])->where('status', 6)->get()->groupBy('audit_at');
  545. return view('admin/article/hall', [
  546. 'notice' => ArticleLinkNotice::query()->where(['type' => 'article'])->first(),
  547. // 'settleHistory' => $settleHistory,
  548. // 'haveNotSettle'=>$haveNotSettle
  549. ]);
  550. }
  551. $builder = Article::query()->where('be_applicable', 1)->with(['site', 'translator']);
  552. if ($status = $request->input('status') ?? 1) {
  553. $condition[] = ['status', '=', $status];
  554. }
  555. if ($status != Article::STATUS_PENDING) { //任务大厅可以看到未分配的文章
  556. $condition[] = ['translator_id', '=', Auth::id()];
  557. }
  558. if ($keyword = $request->input('keyword')) {
  559. $builder->where(function (Builder $query) use ($keyword) {
  560. $query->where('title', 'like', '%' . $keyword . '%');
  561. $query->orWhere('id', 'like', $keyword);
  562. });
  563. }
  564. $articles = $builder->where($condition ?? [])->orderByDesc('id')
  565. ->paginate($request->input('pageSize') ?? TABLE_PAGE_SIZE);
  566. $items = $articles->items();
  567. array_walk($items, function ($item) {
  568. $item->status_title = $item->status_with_css;
  569. $item->site_title = $item->site->cn_title ?? '';
  570. $item->translator_name = $item->translator->username ?? '';
  571. });
  572. return response()->json([
  573. 'rows' => $items,
  574. 'total' => $articles->total()
  575. ]);
  576. }
  577. //任务大厅详情
  578. public function hallDetail($articleId)
  579. {
  580. $article = Article::query()->where(['id' => $articleId])->first();
  581. if (!$article) {
  582. return abort(404, '数据不存在');
  583. }
  584. return view('admin/article/hall_detail', [
  585. 'data' => $article,
  586. 'site' => Site::query()->select(['cn_title', 'en_title', 'domain'])->find($article->site_id),
  587. 'siteEnterprise' => SiteEnterprise::query()->select(['brand'])->find($article->site_id),
  588. 'siteInfo' => SiteInfo::query()->selectRaw('article_pt_remark')->where(['site_id' => $article->site_id])->first()
  589. ]);
  590. }
  591. //批量删除
  592. public function batchDelete(Request $request)
  593. {
  594. $ids = $request->input('ids');
  595. Article::destroy($ids);
  596. return response()->json(['message' => '操作成功']);
  597. }
  598. //批量更新发布时间
  599. public function batchPublished(Request $request)
  600. {
  601. $ids = $request->input('ids');
  602. Article::query()->whereIn('id', $ids)->update([
  603. 'publish_at' => date('Y-m-d H:i:s')
  604. ]);
  605. return response()->json(['message' => '操作成功']);
  606. }
  607. //批量更新状态
  608. public function batchUpdate(Request $request)
  609. {
  610. $ids = $request->input('ids');
  611. Article::query()->whereIn('id', $ids)->update([
  612. 'status' => 1,
  613. ]);
  614. return response()->json(['message' => '操作成功']);
  615. }
  616. //推送消息至app
  617. public function pushMessage(Request $request)
  618. {
  619. $siteId = $request->input('siteId');
  620. DB::table('articles_notice')->insert(['site_id' => $siteId]);
  621. return response()->json(['message' => '操作成功']);
  622. }
  623. /**
  624. * 任务结算列表
  625. * @param Request $request
  626. * @return \Illuminate\Contracts\View\Factory|\Illuminate\Http\JsonResponse|\Illuminate\View\View
  627. */
  628. public function calc(Request $request)
  629. {
  630. if (!$request->ajax()) {
  631. return view('admin/article/calc');
  632. }
  633. $builder = Article::query()->where(['status' => Article::STATUS_PASSED]);
  634. if ($startAt = $request->input('start_at')) {
  635. $builder->whereDate('created_at', '>', $startAt);
  636. }
  637. if ($endAt = $request->input('end_at')) {
  638. $builder->whereDate('created_at', '<', $endAt);
  639. }
  640. // 注意 group_concat长度限制
  641. $data = $builder->whereHas('translator', function (Builder $query) use ($request) {
  642. if ($username = $request->input('username')) {
  643. $query->where('username', 'like', '%' . $username . '%');
  644. }
  645. })->selectRaw('SUM(translate_words) AS totalWords,translator_id,GROUP_CONCAT(id) as article_ids,GROUP_CONCAT(id) as article_ids')
  646. ->groupBy('translator_id')->paginate($request->input('pageSize') ?? TABLE_PAGE_SIZE);
  647. $items = $data->items();
  648. array_walk($items, function ($item) {
  649. $item->article_ids = explode(',', $item->article_ids);
  650. $scoreList = Article::query()->selectRaw('id,pass_score')->whereIn('id', $item->article_ids)
  651. ->whereNotNull('pass_score')->get();
  652. $totalScore = 0;
  653. foreach ($scoreList as $score) {
  654. $totalScore += $score->pass_score;
  655. }
  656. $item->avgScore = $scoreList->count() < 1 ? 0 : ($totalScore / $scoreList->count());
  657. $item->amount = $this->logic->amountRule($item->totalWords);
  658. $item->username = $item->translator->username ?? '';
  659. unset($item->translator);
  660. });
  661. return response()->json([
  662. 'rows' => $items,
  663. 'total' => $data->total()
  664. ]);
  665. }
  666. // 结算历史
  667. public function calcHistory(Request $request)
  668. {
  669. if (!$request->ajax()) {
  670. return view('/admin/article/calc_history');
  671. }
  672. $condition = [['status', '=', 6]];
  673. if ($start_at = $request->input('start_at')) {
  674. $condition[] = ['audit_at', '>=', $start_at];
  675. }
  676. if ($end_at = $request->input('end_at')) {
  677. $condition[] = ['audit_at', '<=', $end_at];
  678. }
  679. if ($keyword = $request->input('keyword')) {
  680. $condition[] = ['title', 'like', '%' . $keyword . '%'];
  681. }
  682. $data = Article::query()->with(['translator'])->where($condition)->paginate($request->input('pageSize') ?? TABLE_PAGE_SIZE);
  683. $items = $data->items();
  684. $totalAmount = 0;
  685. array_walk($items, function ($item) use (&$totalAmount) {
  686. $item->amount = $item->settle_amount;
  687. $item->username = $item->translator->username ?? '';
  688. $totalAmount = bcadd($totalAmount, $item->settle_amount, 2);
  689. });
  690. return response()->json([
  691. 'rows' => $items,
  692. 'total' => $data->total(),
  693. 'totalAmount' => $totalAmount
  694. ]);
  695. }
  696. /***
  697. * 有道翻译自动翻译
  698. * @param Request $request
  699. * @return \Illuminate\Http\JsonResponse
  700. */
  701. public function autoTranslate(Request $request)
  702. {
  703. $ids = $request->input('ids');
  704. $articles = Article::query()->where(['status' => 1])
  705. ->whereIn('id', $ids)->get();
  706. return $this->logic->autoTranslate($articles);
  707. }
  708. /**
  709. * 文章结算
  710. * @param Request $request
  711. * @return \Illuminate\Http\JsonResponse
  712. */
  713. public function settle(Request $request)
  714. {
  715. $records = Article::query()->whereIn('id', $request->input('ids'))->get();
  716. $settleAt = date('Y-m-d H:i:s');
  717. foreach ($records as $record) {
  718. $record->update([
  719. 'status' => Article::STATUS_CALC, //已结算
  720. 'settle_amount' => $this->logic->amountRule($record->translate_words),
  721. 'settle_at' => $settleAt
  722. ]);
  723. }
  724. return response()->json(['message' => '操作成功']);
  725. }
  726. //好像没用了
  727. public function syncSocial(Request $request)
  728. {
  729. $article = Article::query()->whereIn('id', $request->input('ids'))->first();
  730. $date = date('Y-m-d H:i:s');
  731. $update = ['article_id' => $article->id];
  732. if ($this->logic->linkedIn($article->translate_content)) {
  733. $update['linked_sync_at'] = $date;
  734. }
  735. ArticleSocial::query()->updateOrCreate(['article_id' => $article->id], $update);
  736. return response()->json(['message' => '操作成功']);
  737. }
  738. //项目管理中下的软文管理 保存
  739. public function saveInfo(Request $request)
  740. {
  741. $article_custom_audit = $request->input('article_custom_audit') == 'true' ? 1 : 0;
  742. $is_upload_thumb = $request->input('is_upload_thumb') == 'true' ? 1 : 0;
  743. $article_remark = $request->input('article_remark');
  744. $article_pt_remark = $request->input('article_pt_remark');
  745. $article_need_num = $request->input('article_need_num');
  746. $outside_update_platform = $request->input('outside_update_platform');
  747. $siteId = $request->input('siteId');
  748. if (!$siteId) {
  749. return response()->json(['message' => '参数错误'], 400);
  750. }
  751. $data = [
  752. 'site_id' => $siteId,
  753. 'is_upload_thumb' => $is_upload_thumb,
  754. 'article_custom_audit' => $article_custom_audit,
  755. 'article_remark' => $article_remark,
  756. 'outside_update_platform' => $outside_update_platform,
  757. 'article_pt_remark' => $article_pt_remark,
  758. 'article_need_num' => $article_need_num,
  759. ];
  760. $info = SiteInfo::query()->where(['site_id' => $siteId])->first();
  761. if ($info) {
  762. $info->update($data);
  763. } else {
  764. SiteInfo::query()->create($data);
  765. }
  766. return response()->json(['message' => '操作成功']);
  767. }
  768. //软文任务审核
  769. public function auditWord(Request $request)
  770. {
  771. if (!$request->ajax()) {
  772. return view('admin/article/audit_word');
  773. }
  774. $builder = Article::query()->where(['status' => Article::STATUS_PASSED]);
  775. if ($startAt = $request->input('start_at')) {
  776. $builder->whereDate('created_at', '>', $startAt);
  777. }
  778. if ($endAt = $request->input('end_at')) {
  779. $builder->whereDate('created_at', '<', $endAt);
  780. }
  781. // 注意 group_concat长度限制
  782. $data = $builder->whereHas('auditor', function (Builder $query) use ($request) {
  783. if ($username = $request->input('username')) {
  784. $query->where('username', 'like', '%' . $username . '%');
  785. }
  786. })->selectRaw('SUM(translate_words) AS totalWords')
  787. ->groupBy('auditor_id')->paginate($request->input('pageSize') ?? TABLE_PAGE_SIZE);
  788. $items = $data->items();
  789. return response()->json([
  790. 'rows' => $items,
  791. 'total' => $data->total()
  792. ]);
  793. }
  794. //近三月趋势图
  795. public function trend()
  796. {
  797. $auditData = $queryData = $xAxis = [];
  798. for ($i = 1; $i <= 3; $i++) {
  799. $xAxis[] = date('Y年m月', strtotime('first day of - ' . $i . 'month'));
  800. $beginAt = date('Y-m-01 00:00:00', strtotime('first day of - ' . $i . 'month'));
  801. $endAt = date('Y-m-t 23:59:59', strtotime('first day of - ' . $i . 'month'));
  802. $queryData[] = Article::query()->where([['created_at', '>=', $beginAt], ['created_at', '<=', $endAt]])->count();
  803. $auditData[] = Article::query()->where([['audit_at', '>=', $beginAt], ['audit_at', '<=', $endAt]])->count();
  804. }
  805. $data = [
  806. 'xAxis' => $xAxis,
  807. 'queryData' => $queryData,
  808. 'auditData' => $auditData,
  809. ];
  810. return view('admin.article.trend', [
  811. 'line' => $data
  812. ]);
  813. }
  814. //特殊软文 有撰写人员的
  815. public function spec(Request $request)
  816. {
  817. if (!$request->ajax()) {
  818. return view('admin/article/spec');
  819. }
  820. $records = Site::query()->withCount('articles')->with(['users'])->where(['spec_article' => 1])
  821. ->paginate($request->input('pageSize') ?? TABLE_PAGE_SIZE);
  822. $result = [];
  823. foreach ($records as $record) {
  824. $result[] = [
  825. 'cn_title' => $record->cn_title,
  826. 'domain' => $record->domain,
  827. 'status_title' => Site::STATUS_MAP[$record->status] ?? '',
  828. 'article_goal' => $record->article_goal,
  829. 'articles_count' => $record->articles_count,
  830. 'editor' => implode(',', $record->users->where('role_id', Role::TYPE_PROPAGANDA)->pluck('nickname')->toArray())
  831. ];
  832. }
  833. return response()->json([
  834. 'rows' => $result,
  835. 'total' => $records->total()
  836. ]);
  837. }
  838. //软文备注
  839. public function siteArticlesNote(Request $request, $siteId)
  840. {
  841. if (!$request->ajax()) {
  842. $note = ArticleNote::query()->where(['site_id' => $siteId])->first();
  843. return view('admin.article.note', [
  844. 'siteId' => $siteId,
  845. 'data' => $note,
  846. ]);
  847. }
  848. $content = $request->input('content');
  849. $note = ArticleNote::query()->where(['site_id' => $siteId])->first();
  850. if ($note) {
  851. $note->update(['content' => $content]);
  852. } else {
  853. ArticleNote::query()->create([
  854. 'site_id' => $siteId,
  855. 'content' => $content,
  856. ]);
  857. }
  858. return response()->json(['message' => '操作成功']);
  859. }
  860. //软文查找
  861. public function siteArticlesFind(Request $request, $id)
  862. {
  863. if (!$request->ajax()) {
  864. $siteInFo = SiteInfo::query()->where('site_id', $id)->first();
  865. $mobile = DB::table('site_mobile')->where('site_id', $id)->value('mobile') ?? '';
  866. return view('admin/article/find', [
  867. 'siteId' => $id,
  868. 'siteInFo' => $siteInFo,
  869. 'mobile' => $mobile
  870. ]);
  871. }
  872. $builder = Article::query()->with(['translator']);
  873. $condition[] = ['site_id', '=', $id];
  874. $beApplicable = $request->input('beApplicable');
  875. if (isset($beApplicable)) {
  876. $condition[] = ['be_applicable', '=', $beApplicable];
  877. }
  878. $status = $request->input('status');
  879. if (isset($status)) {
  880. $condition[] = ['status', '=', $status];
  881. }
  882. $title = $request->input('title');
  883. if (!empty($title)) {
  884. $condition[] = ['title', 'like', $title . '%'];
  885. }
  886. $userList = User::query()->where('status', 1)->pluck('nickname', 'id') ?? [];
  887. $articles = $builder->where($condition ?? [])->orderByDesc('id')
  888. ->paginate($request->input('pageSize') ?? TABLE_PAGE_SIZE);
  889. $items = $articles->items();
  890. array_walk($items, function ($item) use ($userList) {
  891. $item->translator_name = $item->translator->username ?? '';
  892. $item->check = $item->check_status_with_css;
  893. $item->status_title = $item->status_with_css;
  894. $item->reviewer = $userList[$item->reviewer_id] ?? '';
  895. });
  896. return response()->json([
  897. 'rows' => $items,
  898. 'total' => $articles->total()
  899. ]);
  900. }
  901. //批量适用
  902. public function batchBeApplicable(Request $request, $siteId)
  903. {
  904. $ids = $request->input('ids');
  905. $type = $request->input('type');
  906. Article::query()->where('site_id', $siteId)
  907. ->whereIn('id', $ids)
  908. ->update(['be_applicable' => $type, 'reviewer_id' => Auth::id()]);
  909. return response()->json(['message' => '操作成功']);
  910. }
  911. //待定
  912. public function toBeDetermined(Request $request, $siteId)
  913. {
  914. $id = $request->input('id');
  915. $type = $request->input('type');
  916. Article::query()->where('site_id', $siteId)
  917. ->where('id', $id)
  918. ->update(['be_applicable' => $type, 'reviewer_id' => Auth::id()]);
  919. return response()->json(['message' => '操作成功']);
  920. }
  921. public function notApplicableWherefore(Request $request, $siteId)
  922. {
  923. $id = $request->input('id');
  924. $notBeApplicableInfo = $request->input('notBeApplicableInfo');
  925. Article::query()->where('site_id', $siteId)
  926. ->where('id', $id)
  927. ->update(['not_be_applicable_info' => $notBeApplicableInfo, 'reviewer_id' => Auth::id()]);
  928. return response()->json(['message' => '操作成功']);
  929. }
  930. //任务大厅结算历史
  931. public function hallCalcHistory(Request $request)
  932. {
  933. if (!$request->ajax()) {
  934. return view('admin/article/hall_calc_history');
  935. }
  936. $condition = [['translator_id', '=', Auth::id()], ['status', '=', 6]];
  937. if ($start_at = $request->input('start_at')) {
  938. $condition[] = ['audit_at', '>=', $start_at];
  939. }
  940. if ($end_at = $request->input('end_at')) {
  941. $condition[] = ['audit_at', '<=', $end_at];
  942. }
  943. if ($keyword = $request->input('keyword')) {
  944. $condition[] = ['title', 'like', '%' . $keyword . '%'];
  945. }
  946. $data = Article::query()->with(['translator'])->where($condition)->paginate($request->input('pageSize') ?? TABLE_PAGE_SIZE);
  947. $items = $data->items();
  948. $totalAmount = 0;
  949. array_walk($items, function ($item) use (&$totalAmount) {
  950. $item->amount = $item->settle_amount;
  951. $item->username = $item->translator->username ?? '';
  952. });
  953. return response()->json([
  954. 'rows' => $items,
  955. 'total' => $data->total(),
  956. 'totalAmount' => $totalAmount
  957. ]);
  958. }
  959. //项目详情-软文概述
  960. public function siteArticlesOverview(Request $request, $id)
  961. {
  962. if (!$request->ajax()) {
  963. list($siteInfo, $data, $result, $scope) = $this->softArticleSummaryStatistics($id);
  964. return view('admin/article/articles_overview', [
  965. 'data' => $data,
  966. 'siteId' => $siteInfo->id,
  967. 'result' => $result,
  968. 'scope' => $scope
  969. ]);
  970. }
  971. }
  972. //软文概况
  973. public function articleOverview(Request $request)
  974. {
  975. if (!$request->ajax()) {
  976. $userSite = $this->hasUserOneSite();
  977. if (!$userSite) {
  978. return view('admin/errors/tips', [
  979. 'tips' => '站点信息不存在'
  980. ]);
  981. }
  982. list($siteInfo, $data, $result, $scope) = $this->softArticleSummaryStatistics($userSite->id);
  983. return view('admin/article/article_overview', [
  984. 'data' => $data,
  985. 'siteId' => $siteInfo->id,
  986. 'result' => $result,
  987. 'scope' => $scope
  988. ]);
  989. }
  990. }
  991. public function softArticleSummaryStatistics($siteId)
  992. {
  993. $siteIno = Site::query()->where('id', $siteId)->first();
  994. $published = Article::query()->where('site_id', $siteIno->id)->whereNotNull('publish_at')->count() ?? 0;
  995. $unpublished = Article::query()->where('site_id', $siteIno->id)->whereNull('publish_at')->count() ?? 0;
  996. $thisMonth = Article::query()
  997. ->whereBetween('publish_at', [date('Y-m-01 00:00:00'), date('Y-m-t 23:59:59')])
  998. ->where('site_id', $siteIno->id)->whereNotNull('publish_at')->count() ?? 0;
  999. $pending = Article::query()->where('site_id', $siteIno->id)
  1000. ->where('be_applicable', 0)
  1001. ->whereNull('publish_at')->count() ?? 0;
  1002. $needToPublish = $siteIno->articles_updates_per_month ?? 0 - $published;
  1003. if ($needToPublish < 0) {
  1004. $needToPublish = 0;
  1005. }
  1006. $data = [
  1007. 'xAxis' => $list = [
  1008. '合同数', '实际需发布软文数', '软文扣除数', '已发布数', '未发数', '本月需发数', '本月已发数', '待审核数'
  1009. ],
  1010. 'yAxis' => $list1 = [
  1011. $siteIno->article_goal, $siteIno->article_goal - $siteIno->article_difference, $siteIno->article_difference, $published, $unpublished, $needToPublish, $thisMonth, $pending
  1012. ]
  1013. ];
  1014. $info = DB::table('site_articles_info')->where('site_id', $siteIno->id)->first();
  1015. $authUser = auth()->user();
  1016. if ($authUser->is_super || in_array($authUser->role_id, [Role::TYPE_MANAGE_LEADER])) {
  1017. $scope = true;
  1018. } else {
  1019. $scope = false;
  1020. }
  1021. $result = [
  1022. 'optimizeDataScopeList1' => json_decode($info->content_one ?? '', true) ?? [],
  1023. 'optimizeDataScopeList2' => json_decode($info->content_two ?? '', true) ?? [],
  1024. 'memo' => json_decode($info->memo ?? '', true) ?? [],
  1025. ];
  1026. return [$siteIno, $data, $result, $scope];
  1027. }
  1028. //保存软文概述
  1029. public function saveSoftArticleOverview(Request $request, $siteId)
  1030. {
  1031. $dataList1 = $request->input('dataList1') ?? [];
  1032. $dataList2 = $request->input('dataList2') ?? [];
  1033. $insertData['site_id'] = $siteId;
  1034. if (!empty($dataList1)) {
  1035. $insertData['content_one'] = \GuzzleHttp\json_encode($dataList1);
  1036. }
  1037. if (!empty($dataList2)) {
  1038. $insertData['content_two'] = \GuzzleHttp\json_encode($dataList2);
  1039. }
  1040. DB::table('site_articles_info')->where('site_id', $siteId)->delete();
  1041. DB::table('site_articles_info')->insert($insertData);
  1042. return response()->json(['message' => '操作成功']);
  1043. }
  1044. //中文文章
  1045. public function chineseArticle(Request $request)
  1046. {
  1047. $userSite = $this->hasUserOneSite();
  1048. if (!$userSite) {
  1049. return view('admin/errors/tips', [
  1050. 'tips' => '站点信息不存在'
  1051. ]);
  1052. }
  1053. $id = $userSite->id;
  1054. $siteIno = Site::query()->with(['users'])->where('id', $id)->first();
  1055. if (!$request->ajax()) {
  1056. return view('admin/article/chinese_article', [
  1057. 'siteId' => $siteIno->id,
  1058. ]);
  1059. }
  1060. }
  1061. //英文文章
  1062. public function englishArticle(Request $request)
  1063. {
  1064. $userSite = $this->hasUserOneSite();
  1065. if (!$userSite) {
  1066. return view('admin/errors/tips', [
  1067. 'tips' => '站点信息不存在'
  1068. ]);
  1069. }
  1070. $id = $userSite->id;
  1071. $siteIno = Site::query()->with(['users'])->where('id', $id)->first();
  1072. if (!$request->ajax()) {
  1073. return view('admin/article/english_article', [
  1074. 'siteId' => $siteIno->id,
  1075. ]);
  1076. }
  1077. }
  1078. //导出
  1079. public function export(Request $request, $siteId)
  1080. {
  1081. $article = Article::query();
  1082. $ids = $request->input('ids');
  1083. if ($ids) {
  1084. $id = explode(',', $ids);
  1085. $article->whereIn('id', $id);
  1086. }
  1087. $list = $article->where('site_id', $siteId)
  1088. ->orderBy('id', 'desc')
  1089. ->select('id', 'status', 'publish_at', 'title', 'content', 'translate_title', 'translate_content', 'created_at', 'be_applicable')->get();
  1090. $dataList = [];
  1091. foreach ($list as $item) {
  1092. $beApplicable = '待定';
  1093. if ($item->be_applicable == 1) {
  1094. $beApplicable = '适用';
  1095. }
  1096. if ($item->be_applicable == 2) {
  1097. $beApplicable = '不适用';
  1098. }
  1099. $data = [
  1100. 'id' => $item->id,
  1101. 'be_applicable' => $beApplicable,
  1102. 'status' => self::STATUS[$item->status],
  1103. 'created_at' => $item->created_at,
  1104. 'publish_at' => $item->publish_at,
  1105. 'title' => $item->title,
  1106. 'content' => str_replace('&nbsp;', '', strip_tags($item->content)),
  1107. 'translate_title' => $item->translate_title,
  1108. 'translate_content' => str_replace('&nbsp;', '', strip_tags($item->translate_content)),
  1109. ];
  1110. $dataList[] = $data;
  1111. }
  1112. array_unshift($dataList, ['编号', '客户审核状态', '翻译状态', '创建时间', '发布时间', '中文标题', '中文内容', '英文标题', '英文内容']);
  1113. return (new BasicExport($dataList))->download(sprintf('软文列表%s.xls', date('YmdHis')));
  1114. }
  1115. public function pushMobileMessage(Request $request)
  1116. {
  1117. $mobile = $request->input('mobile');
  1118. $type = $request->input('type');
  1119. if (empty($mobile)) {
  1120. return response()->json(['message' => '请填写手机号'], 400);
  1121. }
  1122. if (!preg_match("/^1[3456789]\d{9}$/", $mobile)) {
  1123. return response()->json(['message' => '手机号输入有误'], 400);
  1124. }
  1125. $siteId = $request->input('siteId');
  1126. $info = DB::table('site_mobile')->where('site_id', $siteId)->first();
  1127. if (empty($info)) {
  1128. DB::table('site_mobile')->insert(['site_id' => $siteId, 'mobile' => $mobile]);
  1129. }
  1130. DB::table('site_mobile')->where('site_id', $siteId)->update(['mobile' => $mobile]);
  1131. //1软文审核 2月报推送
  1132. if ($type == 1) {
  1133. $tpl = 'SMS_217408472';
  1134. } else {
  1135. $tpl = 'SMS_217438615';
  1136. }
  1137. try {
  1138. $url = 'http://translate.api.yinqingli.net/openapi/Msg/Msg';
  1139. $data = [
  1140. 'mobile' => $mobile,
  1141. 'tpl' => $tpl,
  1142. ];
  1143. $client = new Client();
  1144. $response = $client->post($url, [
  1145. 'form_params' => $data,
  1146. ]);
  1147. $result = $response->getBody()->getContents();
  1148. return response()->json(['message' => '操作成功']);
  1149. } catch (\Throwable $exception) {
  1150. return response()->json(['message' => 'error'], 400);
  1151. }
  1152. }
  1153. }