CollectorService.php 29 KB

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