CollectorService.php 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832
  1. <?php
  2. namespace App\JsonRpc;
  3. use App\Amqp\Producer\GatherProducer;
  4. use App\Model\ArticleData;
  5. use App\Model\OldModel\Article as OldArticle;
  6. use App\Model\OldModel\ArticleData as OldArticleData;
  7. use App\Model\OldModel\Category;
  8. use App\Model\Article;
  9. use App\Model\Rule;
  10. use App\Model\Web;
  11. use Hyperf\Amqp\Producer;
  12. use Hyperf\Context\ApplicationContext as ContextApplicationContext;
  13. use Hyperf\DbConnection\Db;
  14. use Hyperf\Di\Annotation\Inject;
  15. use Hyperf\RpcServer\Annotation\RpcService;
  16. use App\Tools\Result;
  17. use QL\QueryList;
  18. use Swoole\Coroutine;
  19. use App\Service\GatherQueueService;
  20. use function Hyperf\Support\retry;
  21. #[RpcService(name: "CollectorService", protocol: "jsonrpc-http", server: "jsonrpc-http")]
  22. class CollectorService implements CollectorServiceInterface
  23. {
  24. #[Inject]
  25. protected GatherQueueService $Gservice;
  26. /**
  27. * 添加网站
  28. * @param array $data
  29. * @return array|mixed
  30. */
  31. public function addWeb(array $data): array
  32. {
  33. $where = [
  34. 'name' => $data['name']
  35. ];
  36. $isweb = Web::where($where)->first();
  37. if(empty($isweb)){
  38. date_default_timezone_set('Asia/Shanghai');
  39. $web = Web::insert($data);
  40. }else{
  41. return Result::error('此网站已存在,不可重复添加!');
  42. }
  43. if(empty($web)){
  44. return Result::error('添加失败');
  45. }
  46. return Result::success('添加成功');
  47. }
  48. /**
  49. * 获取并搜索网站
  50. * @param array $data
  51. * @return array|mixed
  52. */
  53. public function getWeb(array $data): array
  54. {
  55. if(isset($data['keyWord'])){
  56. $where = [
  57. ['name','like','%'.$data['keyWord'].'%']
  58. ];
  59. $rep = Web::where($where)->limit($data['pageSize'])->orderBy("created_at","desc")->offset(($data['page']-1)*$data['pageSize'])->get();
  60. $count = Web::where($where)->count();
  61. if($count==0){
  62. return Result::error('未查找到相关网站!');
  63. }
  64. }else{
  65. $rep = Web::limit($data['pageSize'])->orderBy("created_at","desc")->offset(($data['page']-1)*$data['pageSize'])->get();
  66. $count = Web::count();
  67. }
  68. $data = [
  69. 'rep' => $rep->toArray(),
  70. 'count' => $count
  71. ];
  72. if(empty($rep)){
  73. return Result::error('您还未添加网站,请先去添加!');
  74. }
  75. return Result::success($data);
  76. }
  77. /**
  78. * 修改网站
  79. * @param array $data
  80. * @return array|mixed
  81. */
  82. public function upWeb(array $data): array
  83. {
  84. $web = Web::where('id',$data['id'])->first();
  85. if(empty($web)){
  86. return Result::error('请输入正确的网站id!');
  87. }else{
  88. date_default_timezone_set('Asia/Shanghai');
  89. $id = Web::where('id',$data['id'])->update($data);
  90. if(empty($id)){
  91. return Result::error('无法修改!');
  92. }
  93. }
  94. return Result::success($id);
  95. }
  96. /**
  97. * 删除网站
  98. * @param array $data
  99. * @return array|mixed
  100. */
  101. public function delWeb(array $data): array
  102. {
  103. $web = Web::where('id',$data['id'])->first();
  104. if(empty($web)){
  105. return Result::error('请输入正确的网站id!');
  106. }else{
  107. $where = [
  108. ['web_id','=',$data['id']]
  109. ];
  110. //判断此网站下是否规则任务
  111. $rule = Rule::where($where)->get();
  112. if(empty($rule)){
  113. //若没有直接删除网站
  114. $result['web'] = Web::where('id',$data['id'])->delete();
  115. }else{
  116. //若有,判断规则任务是否有已执行的
  117. $rule = Rule::where($where)->where('status',2)->get();
  118. // return Result::success($rule);
  119. if(!empty($rule->toArray())){
  120. //若有已执行的任务规则,不可删除网站
  121. return Result::error('该网站已有成功执行的任务规则,不可删除!');
  122. }else{
  123. try {
  124. Db::beginTransaction();
  125. //若无已执行的任务规则,删除网站及相应的未执行的规则任务
  126. $result['web'] = Web::where('id',$data['id'])->delete();
  127. $result['rule'] = Rule::where($where)->delete();
  128. Db::commit();
  129. } catch(\Throwable $ex){
  130. Db::rollBack();
  131. var_dump($ex->getMessage());
  132. return Result::error("删除失败",0);
  133. }
  134. }
  135. }
  136. }
  137. return Result::success($result);
  138. }
  139. /**
  140. * 添加任务规则
  141. * @param array $data
  142. * @return array|mixed
  143. */
  144. public function addRule(array $data): array
  145. {
  146. $web = Web::where('id',$data['web_id'])->get();
  147. if(empty($web->toArray())){
  148. return Result::error('请输入正确的网站id!');
  149. }else{
  150. $rulename = Rule::where('name',$data['name'])->get();
  151. //查找是否存在规则名称重复的
  152. if(empty($rulename->toArray())){
  153. //(若是多类型参数一起传过来则根据类型,只获取对应类型需要的参数)
  154. switch($data['type']){
  155. case 1:
  156. $rule = [
  157. 'name' => $data['name'],
  158. 'web_id' => $data['web_id'],
  159. 'first_url' => $data['first_url'],
  160. 'second_start' => $data['second_start'],
  161. 'second_num' => $data['second_num'],
  162. 'second_end' => $data['second_end'],
  163. 'end_pagenum' => $data['end_pagenum'],
  164. 'start' => $data['start'],
  165. 'title' => $data['title'],
  166. 'content' => $data['content']
  167. ];
  168. // var_dump("============1============");
  169. break;
  170. case 2:
  171. $rule = [
  172. 'name' => $data['name'],
  173. 'web_id' => $data['web_id'],
  174. 'first_url' => $data['first_url'],
  175. 'parameter' => $data['parameter'],
  176. 'start' => $data['start'],
  177. 'title' => $data['title'],
  178. 'content' => $data['content']
  179. ];
  180. // var_dump("============2============");
  181. break;
  182. default:
  183. $rule = [
  184. 'name' => $data['name'],
  185. 'web_id' => $data['web_id'],
  186. 'diy_rule' => $data['diy_rule']
  187. ];
  188. // var_dump("============3============");
  189. break;
  190. }
  191. if(!empty($data['source']) && $data['type'] != 3){
  192. $rule ['source'] = $data['source'];
  193. }
  194. if(isset($data['writer_class']) && $data['type'] != 3){
  195. $rule ['writer_class'] = $data['writer_class'];
  196. }
  197. if(isset($data['writer']) && $data['type'] != 3){
  198. $rule ['writer'] = $data['writer'];
  199. }
  200. date_default_timezone_set('Asia/Shanghai');
  201. //若不存在,根据网站类型添加到不行类型的规则表中
  202. $result = Rule::insertGetId($rule);
  203. }else{
  204. return Result::error('此任务已存在!');
  205. }
  206. }
  207. return Result::success($result);
  208. }
  209. /**
  210. * 获取并搜索规则任务
  211. * @param array $data
  212. * @return array|mixed
  213. */
  214. public function getRule(array $data): array
  215. {
  216. $where = [];
  217. if(isset($data['web_id'])){
  218. $web = Web::where('id',$data['web_id'])->get();
  219. if(empty($web->toArray())){
  220. return Result::error('请输入正确的网站id!');
  221. }else{
  222. //若是根据网站跳转到的规则任务则存到$where数组中
  223. $where = [
  224. ['web_id','=', $data['web_id']]
  225. ];
  226. }
  227. }
  228. if(isset($data['keyWord'])){
  229. //若存在搜索词,则存到条件数组$where中
  230. $where = [
  231. ['name','like','%'.$data['keyWord'].'%']
  232. ];
  233. }
  234. if(empty($where)){
  235. $rep = Rule::withCount(relations:'arts')->limit($data['pageSize'])->orderBy("created_at","desc")->offset(($data['page']-1)*$data['pageSize'])->get();
  236. }else{
  237. $rep = Rule::withCount(relations:'arts')->where($where)->limit($data['pageSize'])->orderBy("created_at","desc")->offset(($data['page']-1)*$data['pageSize'])->get();
  238. }
  239. $count = Rule::where($where)->count();
  240. if($count==0){
  241. return Result::error('暂无相关规则任务!');
  242. }
  243. $data = [
  244. 'rep' => $rep->toArray(),
  245. 'count' => $count
  246. ];
  247. return Result::success($data);
  248. }
  249. /**
  250. * 获取某个任务规则
  251. * @param array $data
  252. * @return array|mixed
  253. */
  254. public function getOneRule(array $data): array
  255. {
  256. $result = Rule::where('id',$data['id'])->first();
  257. if(empty($result)){
  258. return Result::error('请输入正确的规则任务id!');
  259. }else{
  260. return Result::success($result);
  261. }
  262. }
  263. /**
  264. * 修改规则任务
  265. * @param array $data
  266. * @return array|mixed
  267. */
  268. public function upRule(array $data): array
  269. {
  270. $rule = Rule::where('id',$data['id'])->select('id')->first();
  271. unset($data['type']);
  272. if(empty($rule)){
  273. return Result::error('请输入正确的规则任务id!');
  274. }else{
  275. $rulename = Rule::where('id','!=',$rule['id'])->where('name',$data['name'])->select('name')->first();
  276. if(empty($rulename)){
  277. $result = Rule::where('id',$data['id'])->update($data);
  278. }else{
  279. return Result::error('已存在此任务规则名称!');
  280. }
  281. }
  282. return Result::success($result);
  283. }
  284. /**
  285. * 删除规则任务
  286. * @param array $data
  287. * @return array
  288. */
  289. public function delRule(array $data): array
  290. {
  291. $where = ['id' => $data['rule_id']];
  292. $rule = Rule::where($where)->first();
  293. if(empty($rule)){
  294. return Result::error('请输入正确的规则任务id!');
  295. }else{
  296. //查找是否存在已导入的文章
  297. $art_num = Article::where('rule_id',$data['rule_id'])->where('state',1)->count();
  298. if($art_num==0){
  299. //查找是否存在已采集但是未导入的文章
  300. $colart_num = Article::where('rule_id',$data['rule_id'])->where('state',0)->count();
  301. if($colart_num==0){
  302. $result['rule'] = Rule::where($where)->delete();
  303. }else{
  304. try {
  305. Db::beginTransaction();
  306. //若有已采集但未导入的文章,删除规则任务及相应的未导入的文章
  307. $result['rule'] = Rule::where($where)->delete();
  308. $result['art'] = Article::where('rule_id',$data['rule_id'])->delete();
  309. Db::commit();
  310. } catch(\Throwable $ex){
  311. Db::rollBack();
  312. var_dump($ex->getMessage());
  313. return Result::error("删除失败",0);
  314. }
  315. }
  316. }else{
  317. return Result::error('此规则任务下的文章已导入,不可删除!');
  318. }
  319. }
  320. return Result::success($result);
  321. }
  322. /**
  323. * 开始采集
  324. * @param array $data
  325. * @return array
  326. */
  327. public function sendCrawler(array $data): array
  328. {
  329. var_dump("接收到的数据:",$data);
  330. $message = new GatherProducer($data);
  331. $producer = ContextApplicationContext::getContainer()->get(Producer::class);
  332. $a = $producer->produce($message);
  333. var_dump("生产者:",$a);
  334. // $result = $this->Gservice->push($data,rand(5,20));
  335. return Result::success([]);
  336. }
  337. /**
  338. * @param array $data
  339. * @return array
  340. */
  341. public function goCrawler(array $data): array
  342. {
  343. //通过规则id 查询规则类型
  344. $where = [
  345. 'rule.id'=>$data['id']
  346. ];
  347. $info = Rule::where($where)->leftJoin('web','rule.web_id','web.id')
  348. ->select("rule.*","web.name as web_name","web.url as web_url","web.type as web_type")
  349. ->first();
  350. $info = $info->toArray();
  351. switch ($info['web_type']){
  352. case 1:
  353. var_dump("===========规则采集======",$info);
  354. Rule::where(['id'=>$data['id']])->update(['status'=>1]);
  355. $data['copyfrom'] = $info['web_name'];
  356. $data['author'] = $info['writer'];;
  357. $data['first_url'] = $info['first_url'];
  358. $data['second_start'] = $info['second_start'];
  359. $data['second_num'] = $info['second_num'];
  360. $data['second_end'] = $info['second_end'];
  361. $data['end_pagenum']= $info['end_pagenum'];
  362. $data['rule_id']= $data['id'];
  363. $data['admin_user_id']= $data['admin_user_id'];
  364. // $data['newUrlStr'] =
  365. $urlList = $this->addUrlArr($data);
  366. if($urlList){
  367. foreach ($urlList as $val){
  368. // var_dump("单列表地址:",$val);
  369. $this->ruleCollection($val,$data);
  370. }
  371. }
  372. Rule::where(['id'=>$data['id']])->update(['status'=>2]);
  373. break;
  374. case 2:
  375. Rule::where(['id'=>$data['id']])->update(['status'=>1]);
  376. $wecUrl = $info['first_url'];//'https://www.ndcpa.gov.cn/queryList';
  377. $parames = json_decode($info['parameter'],true);
  378. // var_dump($parames);die;
  379. $parames['webSiteCode'] = [trim($parames['webSiteCode'], "[]")]; //['jbkzzx'];//
  380. $parames['channelCode'] = [trim($parames['channelCode'], "[]")]; // ['c100008'];//
  381. $other = [
  382. 'web_url'=>$info['web_url'],
  383. 'copyfrom'=>$info['web_name'],
  384. 'admin_user_id'=>$data['admin_user_id'],
  385. 'rule_id'=>$data['id'],
  386. 'writer'=>$info['writer'],
  387. ];
  388. var_dump("=======开始接口采集====",$parames);
  389. // die;
  390. $this->foreachCurl($wecUrl,$parames,$other);
  391. Rule::where(['id'=>$data['id']])->update(['status'=>2]);
  392. }
  393. return Result::success([]);
  394. }
  395. /**
  396. * 把可采集的列表页连接 打包成一个大数组
  397. * @return void
  398. */
  399. public function addUrlArr($data)
  400. {
  401. $arrList = [];
  402. array_push($arrList,$data['first_url']);
  403. $exit = false;
  404. $i = 0;
  405. while(!$exit){
  406. $i++;
  407. $url = $data['second_start'].$i.$data['second_end'];
  408. $respon1 = Result::pageExists($url);
  409. // var_dump("采集地址:",$respon1,$url);
  410. // Coroutine::sleep(2);
  411. if ($i==intval($data['end_pagenum'])-1) {
  412. $exit = true;
  413. // Coroutine::exit(); // 退出循环
  414. }else{
  415. array_push($arrList,$url);
  416. }
  417. }
  418. return $arrList;
  419. }
  420. /**
  421. * 按照规则采集数据
  422. * @return void
  423. */
  424. public function ruleCollection($url,$data)
  425. {
  426. // var_dump("采集参数:",$data);
  427. $list = QueryList::get($url);
  428. $dataList = $list->rules([
  429. 'title' => ['a', 'text'],
  430. 'link' => ['a', 'href'],
  431. ])->range('.list1 li')->query()->getData();
  432. // var_dump("采集的内容:",$dataList);
  433. // var_dump("====",$dataList);die;
  434. $firstUrlArr = explode("/", $url);
  435. array_pop($firstUrlArr);
  436. $firstUrlArr = implode('/',$firstUrlArr);
  437. $dataList = $dataList->toArray();
  438. if($dataList){
  439. foreach ($dataList as $tiem){
  440. $newUrl = substr($tiem['link'], 1);
  441. $newUrlStr = $firstUrlArr.$newUrl;
  442. $detailContent = QueryList::get($newUrlStr);
  443. $detailData = $detailContent->rules([
  444. 'title'=>['h1','text'],
  445. 'content'=>['.TRS_UEDITOR','html'],
  446. ])->range(".news-details")->query()->getData();
  447. $detailData = $detailData->toArray();
  448. // var_dump("内容详情:",$detailData,$newUrlStr);
  449. if($detailData){
  450. foreach ($detailData as $val){
  451. // var_dump("进没进foreach:",$newUrlStr,$val);
  452. $data['fromurl'] = $newUrlStr;
  453. $data['title'] = $val['title'];
  454. $data['content'] = $val['content'];
  455. $data['newUrlStr'] = $newUrlStr;
  456. $data['source'] = '';
  457. $data['introduce'] = $val['title']??'';
  458. $data['keyword'] = $val['title']??'';
  459. $data['copyfrom'] = $data['copyfrom'];
  460. $data['source'] = $data['source']??$data['copyfrom'];
  461. $data['admin_user_id'] = $data['admin_user_id']??'';
  462. $data['rule_id'] = $data['rule_id']??'';
  463. // $data['copyfrom'] = $data['copyfrom'];
  464. // var_dump("要插入的数据:",$data);
  465. $this->insertArticleData($data);
  466. }
  467. }
  468. }
  469. //
  470. }
  471. }
  472. /**
  473. * 插入数据
  474. * @param $data
  475. * @return void
  476. */
  477. public function insertArticleData($data=[])
  478. {
  479. if($data){
  480. Db::beginTransaction();
  481. try{
  482. $articleInfo = Article::where(['title'=>$data['title']])->first();
  483. // var_dump("获取详情:",$articleInfo,$data);
  484. if(empty($articleInfo)){
  485. $insertData = [];
  486. $insertData['fromurl'] =$data['newUrlStr'];
  487. $insertData['oldtitle'] =$data['title'];
  488. $insertData['title'] = $data['title'];
  489. $insertData['copyfrom'] = $data['copyfrom'];
  490. $insertData['author'] = $data['author'];
  491. $insertData['introduce'] = $data['title'];
  492. $insertData['keyword'] = $data['title'];
  493. $insertData['source'] = isset($data['source']) && $data['source']!=''? $data['source']:$data['copyfrom'];
  494. $insertData['admin_user_id'] = $data['admin_user_id'];
  495. $insertData['rule_id'] = $data['rule_id'];
  496. // var_dump("插入Article:",$insertData);
  497. $article_id = Article::insertGetId($insertData);
  498. $insertDataDetail = [];
  499. $insertDataDetail['article_id'] = $article_id;
  500. $insertDataDetail['content'] = $data['content'];
  501. // var_dump("插入ArticleData:",$insertDataDetail);
  502. ArticleData::insertGetId($insertDataDetail);
  503. // Coroutine::sleep(2);
  504. // var_dump("插入成功一次:",$article_id,$insertDataDetail);
  505. }
  506. Db::commit();
  507. }catch (\Exception $e){
  508. Db::rollBack();
  509. var_dump("插入失败:",$e->getMessage());
  510. }
  511. }else{
  512. var_dump("没有数据可以插入:");
  513. }
  514. }
  515. /**
  516. * 分页采集
  517. * @return void
  518. */
  519. public function foreachCurl($wecUrl,$parames,$other,&$page=1)
  520. {
  521. $options = [
  522. CURLOPT_HEADER => true, // 如果想包含头部信息在响应中,可以设置为true
  523. CURLOPT_TIMEOUT => 30 // 设置请求超时时间为30秒
  524. ];
  525. $result = Result::http_post($wecUrl,$parames,$options);
  526. $result = json_decode($result['response'],true);
  527. // var_dump("获取数据:",$result);
  528. if($result['data'] && $result['data']['results']){
  529. $dataList = $result['data']['results'];
  530. // var_dump("取数据结构体:",$dataList);
  531. foreach ($dataList as $val){
  532. // var_dump("进入循环插入:",$val);
  533. $newUrlStr = json_decode($val['source']['urls'],true);
  534. $newUrlStr = $other['web_url'].$newUrlStr['common'];
  535. // var_dump("来源地址:",$newUrlStr);
  536. $insertData = [
  537. 'newUrlStr'=>$newUrlStr,
  538. 'title'=>$val['source']['title']??'',
  539. 'source'=>$val['source']['contentSource']??'',
  540. 'copyfrom'=>$other['copyfrom']??'',
  541. 'content'=>$val['source']['content']['content']??'',
  542. 'admin_user_id'=>$other['admin_user_id']??'',
  543. 'rule_id'=>$other['rule_id']??'',
  544. 'author'=>$other['writer']??''
  545. ];
  546. // var_dump("调用插入数据方法,组装数据:",$insertData);
  547. $this->insertArticleData($insertData);
  548. }
  549. }
  550. $pages = intval($parames['current']);
  551. $pages = $pages+1;
  552. $parames['current'] = $pages;
  553. $twoResult = Result::http_post($wecUrl,$parames,$options);
  554. if($result['data'] && $result['data']['results'] && count($result['data']['results'])>0){
  555. // var_dump("分页测试:",$parames,$parames['current']);
  556. $this->foreachCurl($wecUrl,$parames,$other,$pages);
  557. }
  558. // var_dump("正确的数据:",$result);
  559. }
  560. /**
  561. * 获取并搜索资讯
  562. * @param array $data
  563. * @return array
  564. */
  565. public function getInfo(array $data): array
  566. {
  567. $where = [
  568. ['rule_id','=',$data['rule_id']]
  569. ];
  570. //若存在条件参数都存到where数组
  571. if(isset($data['title'])){
  572. $where[] = ['title','like','%'.$data['title'].'%'];
  573. }
  574. if(isset($data['source'])){
  575. $art_source = Article::where($where)->get();
  576. if(!empty($art_source->toArray())){
  577. $where[] = ['source','=',$data['source']];
  578. }
  579. }
  580. if(isset($data['state'])){
  581. $where[] = ['state','=',$data['state']];
  582. }
  583. //跨库查询栏目导航及采集的新闻
  584. $info = Article::query()
  585. ->where($where)
  586. ->with('category')
  587. ->orderBy("article.id","desc")
  588. ->limit($data['pageSize'])
  589. ->offset(($data['page']-1)*$data['pageSize'])->get();
  590. $count = Article::where($where)->count();
  591. if($count == 0){
  592. return Result::error('暂无资讯');
  593. }
  594. $data = [
  595. 'rep' => $info->toArray(),
  596. 'count' => $count
  597. ];
  598. return Result::success($data);
  599. }
  600. /**
  601. * 获取某个资讯
  602. * @param array $data
  603. * @return array
  604. */
  605. public function getOneInfo(array $data): array
  606. {
  607. $where = ['id' => $data['art_id']];
  608. $inf = Article::where($where)->first();
  609. if($inf==null){
  610. return Result::error('请输入正确的资讯id!');
  611. }
  612. $info = Article::where($where)
  613. ->leftJoin('article_data','article_id','id')
  614. ->select('article.*','article_data.content')
  615. ->first();
  616. if($inf['catid']!=null){
  617. $category = Category::where(['id'=>$info['catid']])->select('name')->first();
  618. $info['category'] = $category['name'];
  619. }
  620. return Result::success($info);
  621. }
  622. /**
  623. * 修改资讯
  624. * @param array $data
  625. * @return array
  626. */
  627. public function upInfo(array $data): array
  628. {
  629. $id = $data['art_id'];
  630. $content = $data['content'];
  631. unset($data['art_id']);
  632. //去掉此元素
  633. unset($data['content']);
  634. //去掉此元素
  635. $info = Article::where('id',$id)->first();
  636. if($info==null){
  637. return Result::error('请输入正确的文章id!');
  638. }
  639. if($info['state']==1){
  640. return Result::error('此文章已导入 ,不可编辑!');
  641. }else{
  642. Db::beginTransaction();
  643. try{
  644. $info = Article::where('id',$id)->update($data);
  645. $art_data = ArticleData::where('article_id',$id)->update(['content'=>$content]);
  646. Db::commit();
  647. } catch(\Throwable $ex){
  648. Db::rollBack();
  649. var_dump($ex->getMessage());
  650. return Result::error("修改失败",0);
  651. }
  652. $data = [
  653. 'info' => $info,
  654. 'art_data' => $art_data
  655. ];
  656. return Result::success($data);
  657. }
  658. }
  659. /**
  660. * 删除资讯
  661. * @param array $data
  662. * @return array
  663. */
  664. public function delInfo(array $data): array
  665. {
  666. $id = $data['art_id'];
  667. $info = Article::where('id',$id)->first();
  668. if($info==null){
  669. return Result::error('请输入正确的文章id!');
  670. }
  671. if($info['state']==1){
  672. return Result::error('此文章已导入,不可删除!');
  673. }else{
  674. Db::beginTransaction();
  675. try{
  676. $delinfo = Article::where('id',$id)->delete();
  677. $deldata = ArticleData::where('article_id',$id)->delete();
  678. Db::commit();
  679. } catch(\Throwable $ex){
  680. Db::rollBack();
  681. var_dump($ex->getMessage());
  682. return Result::error("删除失败",0);
  683. }
  684. }
  685. $data = [
  686. 'delinfo' => $delinfo,
  687. 'deldata' => $deldata
  688. ];
  689. return Result::success($data);
  690. }
  691. /**
  692. * 关联导航池
  693. * @param array $data
  694. * @return array
  695. */
  696. public function addCatid(array $data): array
  697. {
  698. $id = $data['rule_id'];
  699. $art = Article::where('rule_id',$id)->select('id')->count();
  700. if($art==0){
  701. return Result::error('还未采集,请采集');
  702. }else{
  703. $info = Article::where('rule_id',$id)->where('state',0)->select('id')->get();
  704. if(empty($info->toArray())){
  705. return Result::error('所有文章都已导入,不可修改关联的导航池!');
  706. }else{
  707. //查找此规则任务下的文章是否已经有导入的文章
  708. $article = Article::where('rule_id',$id)->where('state',1)->select('id')->get();
  709. if(!empty($article->toArray())){
  710. //若有已导入的文章则直接复制之前已导入的导航池
  711. $catid = Article::whereIn('id',$article)->select('catid')->first();
  712. //若未导入的文章已经复制之前的导航,则无需修改
  713. $art_catid = Article::whereIn('id',$info)->whereNull('catid')->count();
  714. if($art_catid>0){
  715. $result = Article::whereIn('id',$info)->update(['catid'=>$catid['catid']]);
  716. }else{
  717. $result = ['已全部关联导航,无需再次关联!'];
  718. }
  719. }else{
  720. //若不存在已导入的文章则判断是否存在导航id
  721. if(isset($data['catid'])){
  722. //若存在直接使用此导航id
  723. $result = Article::whereIn('id',$info)->update(['catid'=>$data['catid']]);
  724. }else{
  725. //若不存在则返回所有导航栏目
  726. $result = Category::select('id','name')->get();
  727. }
  728. }
  729. }
  730. }
  731. //查找此规则任务下的文章是否都已经导入
  732. return Result::success($result);
  733. }
  734. /**
  735. * 导入文章
  736. * @param array $data
  737. * @return array
  738. */
  739. public function addArt(array $data): array
  740. {
  741. // var_dump("======@@@====");
  742. $where = [
  743. 'rule_id' => $data['rule_id'],
  744. 'state' => 0
  745. ];
  746. //获取某个规则任务下的已采集未导入的文章及文章详情
  747. $arts_id = Article::where($where)->wherenotNull('catid')->orderBy('id')->select('id')->get();
  748. $arts = Article::where($where)->wherenotNull('catid')->select('title','catid','level','introduce','keyword','author','copyfrom','fromurl','hits','islink','imgurl','admin_user_id','is_original')->orderBy('id')->get()->toArray();
  749. $arts_data = ArticleData::whereIn('article_id',$arts_id)->select('content')->orderBy('article_id')->get()->toArray();
  750. // var_dump($article_data);
  751. $data = [
  752. 'articles' => $arts,
  753. 'art_content' => $arts_data
  754. ];
  755. Db::beginTransaction();
  756. try{
  757. $oldart = OldArticle::insert($arts);
  758. $oldart_data = OldArticleData::insert($arts_data);
  759. $upstate_art = Article::where($where)->wherenotNull('catid')->update(['state' => 1]);
  760. Db::commit();
  761. } catch(\Throwable $ex){
  762. Db::rollBack();
  763. var_dump($ex->getMessage());
  764. return Result::error($ex->getMessage(),0);
  765. }
  766. return Result::success($data);
  767. }
  768. }