CollectorService.php 30 KB

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