CollectorService.php 29 KB

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