You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

432 lines
22 KiB

  1. <?php
  2. /**
  3. * Function Description:驴妈妈对应的接口
  4. * Function Name: ApiForLvmama
  5. * @return ${TYPE_HINT}
  6. * ${THROWS_DOC}
  7. *
  8. * @author 娄梦宁
  9. */
  10. namespace console\controllers;
  11. use backend\modules\api\models\LvmamaPushInfo;
  12. use backend\modules\api\models\OperaProduct;
  13. use backend\modules\api\models\OperaProductRun;
  14. use backend\modules\api\models\OrderRefundLvmama;
  15. use backend\modules\api\models\OutsideTicket;
  16. use backend\modules\api\util\Util;
  17. use common\models\Utils;
  18. use yii\base\Exception;
  19. use yii\web\Controller;
  20. use Yii;
  21. class LvmamaController extends Controller
  22. {
  23. public $enableCsrfValidation = false;
  24. public function actionIndex()
  25. {
  26. print_r('HELLO');
  27. }
  28. /**
  29. * Function Description:批量产品/商品信息接口
  30. * Function Name: actionGetProdList
  31. *
  32. *
  33. * @author 娄梦宁
  34. */
  35. public function actionGetProdList()
  36. {
  37. set_time_limit(0);
  38. $util = new Util();
  39. $opera_prod = new OperaProduct();
  40. $outside_ticket = new OutsideTicket();
  41. //请求参数构建
  42. $time = time();
  43. $appKey = $util->getAppKey();
  44. $timestamp = $time;
  45. $sign = $util::SingForLvmama($time);
  46. $currentPage = 1;
  47. $url = $util->getBaseUrl() . '/ticketProd/productInfoListByPage' . "?appKey=" . $appKey . "&messageFormat=json&timestamp=" . $timestamp . "&sign=" . $sign . "&currentPage=" . $currentPage;
  48. $result = Utils::httpRequest($url);
  49. $prod_list = json_decode($result, true);
  50. //查出opera_prod表中所有的主code(即驴妈妈的productId)
  51. $code_arr = $opera_prod->getCodeArr();
  52. $code_arr_son = $opera_prod->getCodeArrSon();
  53. for ($currentPage = 1; $currentPage <= $prod_list['totalPage']; $currentPage++) {
  54. if ($currentPage == 1) {//分页的循环
  55. $tmp_arr = $prod_list;
  56. } else {
  57. $url = $util->getBaseUrl() . '/ticketProd/productInfoListByPage' . "?appKey=" . $appKey . "&messageFormat=json&timestamp=" . $timestamp . "&sign=" . $sign . "&currentPage=" . $currentPage;
  58. $result = Utils::httpRequest($url);
  59. $tmp_arr = json_decode($result, true);
  60. }
  61. foreach ($tmp_arr['productList'] as $val) {
  62. if (array_key_exists($val['productId'], $code_arr)) {//产品已经存在
  63. //if ($val['productStatus'] == true) {//当前产品在驴妈妈上架
  64. $tmp_prod_name = $util::doCdada($val['productName']);
  65. $remark = '';
  66. if (isset($val['bookingInfo'])) {
  67. foreach ($val['bookingInfo'] as $book) {
  68. $remark .= $util::doCdada($book);
  69. }
  70. }
  71. $remark .= $util::doCdada($val['goodsList'][0]['importentPoint']);
  72. $is_refund = $val['goodsList'][0]['rules'][0]['isChange'];
  73. $refund_limit_day = 1;
  74. $refund_limit_time = '23:00';
  75. if ($is_refund == 1 && isset($val['goodsList'][0]['rules'][0]['aheadTime'])) {//可以退款就同步退款规则
  76. $limit_day_time = $util::countRefundTime($val['goodsList'][0]['rules'][0]['aheadTime']);
  77. $refund_limit_day = $limit_day_time['day'];
  78. $refund_limit_time = $limit_day_time['time'];
  79. }
  80. $tmp_prod_code = $val['productId'];
  81. // if (array_key_exists($val['productId'], $code_arr)) {//产品已经存在
  82. $upt_main = $opera_prod->uptLvmamaProdDetail($tmp_prod_code, $tmp_prod_name, $remark, $refund_limit_day, $refund_limit_time, $is_refund);
  83. $parent_id = $code_arr[$val['productId']]['prod_id'];
  84. // } else {
  85. // $upt_main = $opera_prod->istLvmamaProdMain($tmp_prod_code, $tmp_prod_name, $remark, $refund_limit_day, $refund_limit_time, $is_refund);
  86. // $parent_id = $upt_main['prod_id'];
  87. // }
  88. if ($upt_main['code'] != 0) {
  89. file_put_contents(__DIR__ . '/../log/lvmama/' . date("Y-m-d") . '.log', date("Y-m-d H:i:s") . $upt_main['msg'] . $val['prod_code'] . " 批量定时更新产品出错" . PHP_EOL, FILE_APPEND);
  90. continue;
  91. }
  92. foreach ($val['goodsList'] as $goods) {//循环添加子产品
  93. if ($goods['status'] == true) {
  94. $prod_name_son = $util::doCdada($goods['goodsName']);
  95. $prod_code_son = $goods['goodsId'];
  96. if (array_key_exists($prod_code_son, $code_arr_son)) {//商品已经存在
  97. $son_prod = $opera_prod->uptLvmamaProdSon($prod_code_son, $prod_name_son, $remark, $refund_limit_day, $refund_limit_time, $is_refund, $parent_id);
  98. } else {
  99. $son_prod = $opera_prod->insLvmamaProdSon($parent_id, $prod_name_son, $prod_code_son, $refund_limit_day, $refund_limit_time, $is_refund);
  100. }
  101. if ($son_prod['code'] != 0) {
  102. file_put_contents(__DIR__ . '/../log/lvmama/' . date("Y-m-d") . '.log', date("Y-m-d H:i:s") . $son_prod['msg'] . $prod_code_son . " 批量定时添加子门票产品出错" . PHP_EOL, FILE_APPEND);
  103. continue;
  104. }
  105. } else {//商品下架
  106. $outside_ticket->cancelGoods($val['productId'], $goods['goodsId']);
  107. }
  108. }
  109. // } else {//产品下架
  110. // $opera_prod->cancelProductByCode($val['productId']);
  111. // }
  112. }
  113. }
  114. }
  115. }
  116. /**
  117. * Function Description:批量价格、库存信息
  118. * Function Name: actionGetProdPriceList
  119. *
  120. *
  121. * @author 娄梦宁
  122. */
  123. public function actionGetProdPriceList()
  124. {
  125. set_time_limit(0);
  126. $util = new Util();
  127. $opera_prod = new OperaProduct();
  128. $outside_ticket = new OutsideTicket();
  129. //请求参数构建
  130. $time = time();
  131. $appKey = $util->getAppKey();
  132. $timestamp = $time;
  133. $sign = $util::SingForLvmama($time);
  134. $currentPage = 1;
  135. $beginDate = date('Y-m-d');
  136. $endDate = date('Y-m-d', strtotime('+ 30 day'));
  137. $url = $util->getBaseUrl() . '/ticketProd/productPriceListByPage' . "?appKey=" . $appKey . "&messageFormat=json&timestamp=" . $timestamp . "&sign=" . $sign .
  138. "&currentPage=" . $currentPage . "&beginDate=" . $beginDate . "&endDate=" . $endDate;
  139. $prod_list = Utils::httpRequest($url);
  140. //查出opera_prod表中所有的code(即驴妈妈的productId)
  141. $code_arr = $opera_prod->getCodeArr();
  142. //循环所有页数,每次结果插入outside_ticket
  143. $prod_list = json_decode($prod_list, true);
  144. for ($currentPage = 1; $currentPage <= $prod_list['totalPage']; $currentPage++) {
  145. if ($currentPage == 1) {
  146. $tmp_arr = $prod_list;
  147. } else {
  148. $url = $util->getBaseUrl() . '/ticketProd/productPriceListByPage' . "?appKey=" . $appKey . "&messageFormat=json&timestamp=" . $timestamp . "&sign=" . $sign .
  149. "&currentPage=" . $currentPage . "&beginDate=" . $beginDate . "&endDate=" . $endDate;
  150. $tmp_arr = Utils::httpRequest($url);
  151. $tmp_arr = json_decode($tmp_arr, true);
  152. }
  153. foreach ($tmp_arr['priceList'] as $val) {
  154. //////////////////这层逻辑先不管
  155. // if (array_key_exists($val['productId'], $code_arr)) {//如果产品在opera_prod表中,即在售
  156. // }
  157. // else {//加一层逻辑,获取到的产品都加到opera_prod表中,(前提是驴妈妈接口反馈都是有效数据)
  158. // //添加主产品
  159. // $prod_id = $val['productId'];
  160. // $prod_info = $this->GetProdById($prod_id);
  161. // try {
  162. // $prod_name = $util::doCdada($prod_info['productList'][0]['productName']);
  163. // //$remark = $util::doCdada($prod_info['productList'][0]['introdution']);暂不需要简介
  164. // $remark = '';
  165. // foreach ($prod_info['productList'][0]['bookinginfo'] as $book) {
  166. // $remark .= $util::doCdada($book);
  167. // }
  168. // } catch (Exception $e) {
  169. // file_put_contents(__DIR__ . '/../log/lvmama/' . date("Y-m-d") . '.log', date("Y-m-d H:i:s") . $prod_id . " 添加产品获取详情出错" . PHP_EOL, FILE_APPEND);
  170. // continue;
  171. // }
  172. // $main_prod_id = $opera_prod->istLvmamaProdMain($prod_id, $prod_name, $remark);
  173. // if ($main_prod_id['code'] != 0) {
  174. // file_put_contents(__DIR__ . '/../log/lvmama/' . date("Y-m-d") . '.log', date("Y-m-d H:i:s") . $main_prod_id['msg'] . $prod_id . " 添加主门票产品出错" . PHP_EOL, FILE_APPEND);
  175. // continue;
  176. // }
  177. // foreach ($val['goodsList']['goods'] as $goods) {//循环添加子产品
  178. // $parent_id_son = $main_prod_id['prod_id'];
  179. // $prod_name_son = $util::doCdada($goods['goodsName']);
  180. // $prod_code_son = $goods['goodsId'];
  181. // $son_prod = $opera_prod->insLvmamaProdSon($parent_id_son, $prod_name_son, $prod_code_son);
  182. // if ($son_prod['code'] != 0) {
  183. // file_put_contents(__DIR__ . '/../log/lvmama/' . date("Y-m-d") . '.log', date("Y-m-d H:i:s") . $son_prod['msg'] . $prod_code_son . " 添加子门票产品出错" . PHP_EOL, FILE_APPEND);
  184. // continue;
  185. // }
  186. // }
  187. // $code_arr = $opera_prod->getCodeArr();
  188. // }
  189. if ($val['productStatus'] == true) {//产品上线中
  190. foreach ($val['goodsList']['goods'] as $v) {//循环prod下的商品,
  191. if ($v['goodsOnLine'] == true) {//商品上线中
  192. if (!empty($v['prices'])) {
  193. foreach ($v['prices']['price'] as $value) {//循环不同的价格日历
  194. $tmp_prod_code = $val['productId'];
  195. $tmp_prod_name = $code_arr[$tmp_prod_code]['prod_name'];
  196. $tmp_ticket_code = $v['goodsId'];
  197. $tmp_ticket_date = $value['date'];
  198. $tmp_ticket_name = $util::doCdada($v['goodsName']);
  199. $tmp_ticket_num = $value['stock'] == -1 ? 9999 : $value['stock'];
  200. $tmp_ticket_price = $value['b2bPrice'];
  201. $tmp_agent_price = $value['sellPrice'];
  202. $tmp_cs_prod_id = $code_arr[$tmp_prod_code]['prod_id'];
  203. $tmp_insert = $outside_ticket->InsertData($tmp_prod_code, $tmp_prod_name, $tmp_ticket_code, $tmp_ticket_date, $tmp_ticket_name,
  204. $tmp_ticket_num, $tmp_ticket_price, $tmp_agent_price, $tmp_cs_prod_id);
  205. if (!$tmp_insert) {
  206. file_put_contents(__DIR__ . '/../log/lvmama/' . date("Y-m-d") . '.log', date("Y-m-d H:i:s") . $tmp_prod_code . $tmp_prod_name . $tmp_ticket_date
  207. . "批量接口插入更新失败" . PHP_EOL, FILE_APPEND);
  208. }
  209. }
  210. }
  211. } else {//商品已下线
  212. $outside_ticket->cancelGoods($val['productId'], $v['goodsId']);
  213. }
  214. }
  215. } else {//产品已下线
  216. $opera_prod->cancelProductByCode($val['productId']);
  217. }
  218. }
  219. }
  220. }
  221. /**
  222. * Function Description:通过id获取产品信息
  223. * Function Name: actionGetProdById
  224. *
  225. *
  226. * @author 娄梦宁
  227. */
  228. public function GetProdById($productIds)
  229. {
  230. $util = new Util();
  231. //请求参数构建
  232. $time = time();
  233. $appKey = $util->getAppKey();
  234. $timestamp = $time;
  235. $sign = $util::SingForLvmama($time);
  236. $url = $util->getBaseUrl() . '/ticketProd/productInfoList' . "?appKey=" . $appKey . "&messageFormat=json&timestamp=" . $timestamp . "&sign=" . $sign . "&productIds=" . $productIds;
  237. $result = Utils::httpRequest($url);
  238. return json_decode($result, true);
  239. }
  240. /**
  241. * Function Description:定时任务通过id同步产品信息
  242. * Function Name: actionGetProdById
  243. *
  244. *
  245. * @author 娄梦宁
  246. */
  247. public function actionUptProdById()
  248. {
  249. set_time_limit(0);
  250. $opera_prod = new OperaProduct();
  251. $util = new Util();
  252. //获取驴妈妈渠道下所有产品id
  253. $prod_arr = $opera_prod->getIdForLvmama();
  254. foreach ($prod_arr as $val) {//循环处理各产品
  255. // if ($val['productStatus'] == true) {//产品在驴妈妈上架
  256. $prod_info = $this->GetProdById($val['prod_code']);
  257. try {
  258. $prod_name = $util::doCdada($prod_info['productList'][0]['productName']);
  259. $remark = '';
  260. foreach ($prod_info['productList'][0]['bookingInfo'] as $book) {
  261. $remark .= $util::doCdada($book);
  262. }
  263. } catch (Exception $e) {
  264. file_put_contents(__DIR__ . '/../log/lvmama/' . date("Y-m-d") . '.log', date("Y-m-d H:i:s") . $val['prod_code'] . " 定时更新产品id获取详情出错" . PHP_EOL, FILE_APPEND);
  265. continue;
  266. }
  267. $main_prod_id = $opera_prod->uptLvmamaProdMain($val['prod_code'], $prod_name, $remark);
  268. $goodsArr=explode(',',$prod_info['productList'][0]['goodsIds']);
  269. foreach($goodsArr as $goodsId){
  270. $this->UptGoodById($goodsId,$val['prod_code']);
  271. }
  272. if ($main_prod_id['code'] != 0) {
  273. file_put_contents(__DIR__ . '/../log/lvmama/' . date("Y-m-d") . '.log', date("Y-m-d H:i:s") . $main_prod_id['msg'] . $val['prod_code'] . " 定时更新产品id出错" . PHP_EOL, FILE_APPEND);
  274. continue;
  275. }
  276. // } else {//产品在驴妈妈下架
  277. // $opera_prod->cancelProductByCode($val['productId']);
  278. // }
  279. }
  280. $this->UptOperaRun();
  281. }
  282. /**
  283. * Function Description:通过id获取商品信息
  284. * Function Name: actionGetGoodById
  285. *
  286. *
  287. * @author 娄梦宁
  288. */
  289. public function GetGoodById($goodsIds)
  290. {
  291. $util = new Util();
  292. //请求参数构建
  293. $time = time();
  294. $appKey = $util->getAppKey();
  295. $timestamp = $time;
  296. $sign = $util::SingForLvmama($time);
  297. $url = $util->getBaseUrl() . '/ticketProd/goodInfoList' . "?appKey=" . $appKey . "&messageFormat=json&timestamp=" . $timestamp . "&sign=" . $sign . "&goodsIds=" . $goodsIds;
  298. $result = Utils::httpRequest($url);
  299. return json_decode($result, true);
  300. }
  301. /**
  302. * Function Description:定时任务通过id同步商品信息
  303. * Function Name: actionGetProdById
  304. *
  305. *
  306. * @author 娄梦宁
  307. */
  308. public function UptGoodById($goodsId,$prod_id)
  309. {
  310. $opera_prod = new OperaProduct();
  311. $outside_ticket = new OutsideTicket();
  312. $util = new Util();
  313. //获取驴妈妈渠道下所有子产品code
  314. $prod_info = $this->GetGoodById($goodsId);
  315. $code_arr_son = $opera_prod->getCodeArrSon();
  316. if(array_key_exists($goodsId, $code_arr_son)){
  317. if ($prod_info['goodsList'][0]['status'] == true) {//商品在驴妈妈上架则更新信息
  318. try {
  319. $prod_name = $util::doCdada($prod_info['goodsList'][0]['goodsName']);
  320. $remark = $util::doCdada($prod_info['goodsList'][0]['importentPoint']);
  321. $is_refund = $prod_info['goodsList'][0]['rules'][0]['isChange'];
  322. $refund_limit_day = 1;
  323. $refund_limit_time = '23:00';
  324. if ($is_refund == 1 && isset($prod_info['goodsList'][0]['rules'][0]['aheadTime'])) {//可以退款就同步退款规则
  325. $limit_day_time = $util::countRefundTime($prod_info['goodsList'][0]['rules'][0]['aheadTime']);
  326. $refund_limit_day = $limit_day_time['day'];
  327. $refund_limit_time = $limit_day_time['time'];
  328. }
  329. } catch (Exception $e) {
  330. file_put_contents(__DIR__ . '/../log/lvmama/' . date("Y-m-d") . '.log', date("Y-m-d H:i:s") . $goodsId . " 定时更新产品id获取详情出错" . PHP_EOL, FILE_APPEND);
  331. }
  332. $main_prod_id = $opera_prod->uptLvmamaProdSon($goodsId, $prod_name, $remark, $refund_limit_day, $refund_limit_time, $is_refund);
  333. if ($main_prod_id['code'] != 0) {
  334. file_put_contents(__DIR__ . '/../log/lvmama/' . date("Y-m-d") . '.log', date("Y-m-d H:i:s") . $main_prod_id['msg'] . $goodsId . " 定时更新产品id出错" . PHP_EOL, FILE_APPEND);
  335. }
  336. //同步两天后价格日历信息
  337. $this->GetGoodPriceList($goodsId);
  338. } else {//商品在驴妈妈下架
  339. $outside_ticket->cancelGoods($prod_id, $goodsId);
  340. }
  341. }
  342. }
  343. /**
  344. * Function Description:按 ID 获取价格库存接口
  345. * Function Name: actionGetGoodPriceList
  346. *
  347. *
  348. * @author 娄梦宁
  349. */
  350. public function GetGoodPriceList($goodsIds)
  351. {
  352. $util = new Util();
  353. $outside_ticket = new OutsideTicket();
  354. $opera_prod = new OperaProduct();
  355. //请求参数构建
  356. $time = time();
  357. $appKey = $util->getAppKey();
  358. $timestamp = $time;
  359. $beginDate = date('Y-m-d');
  360. $endDate = date('Y-m-d', strtotime('+ 30 day'));
  361. $sign = $util::SingForLvmama($time);
  362. $url = $util->getBaseUrl() . '/ticketProd/goodPriceList' . "?appKey=" . $appKey . "&messageFormat=json&timestamp=" . $timestamp . "&sign=" . $sign . "&goodsIds=" . $goodsIds . "&beginDate=" . $beginDate . "&endDate=" . $endDate;
  363. $result = Utils::httpRequest($url);
  364. $result = json_decode($result, true);
  365. //查出opera_prod表中所有的code(即驴妈妈的productId)
  366. $code_arr = $opera_prod->getCodeArr();
  367. if ($result['state']['code'] != 1000) {
  368. file_put_contents(__DIR__ . '/../log/lvmama/' . date("Y-m-d") . '.log', date("Y-m-d H:i:s") . '按 ID 获取价格库存接口接口访问失败 ' . $result['state']['solution'] . PHP_EOL, FILE_APPEND);
  369. }
  370. foreach ($result['priceList'] as $val) {
  371. if ($val['productStatus'] == true) {
  372. foreach ($val['goodsList']['goods'] as $v) {
  373. if ($v['goodsOnLine'] == true) {
  374. if ($v['prices']['price']) {
  375. foreach ($v['prices']['price'] as $value) {
  376. $tmp_prod_code = $val['productId'];
  377. $tmp_prod_name = $code_arr[$tmp_prod_code]['prod_name'];
  378. $tmp_ticket_code = $v['goodsId'];
  379. $tmp_ticket_date = $value['date'];
  380. $tmp_ticket_name = $util::doCdada($v['goodsName']);
  381. $tmp_ticket_num = $value['stock'] == -1 ? 9999 : $value['stock'];
  382. $tmp_ticket_price = $value['b2bPrice'];
  383. $tmp_agent_price = $value['sellPrice'];
  384. $tmp_cs_prod_id = $code_arr[$tmp_prod_code]['prod_id'];
  385. $tmp_insert = $outside_ticket->InsertData($tmp_prod_code, $tmp_prod_name, $tmp_ticket_code, $tmp_ticket_date, $tmp_ticket_name,
  386. $tmp_ticket_num, $tmp_ticket_price, $tmp_agent_price, $tmp_cs_prod_id);
  387. if (!$tmp_insert) {
  388. file_put_contents(__DIR__ . '/../log/lvmama/' . date("Y-m-d") . '.log', date("Y-m-d H:i:s") . $tmp_prod_code . $tmp_prod_name . $tmp_ticket_date
  389. . "单产品插入更新失败" . PHP_EOL, FILE_APPEND);
  390. }
  391. }
  392. }
  393. } else {//商品下架在此处理
  394. $outside_ticket->cancelGoods($val['productId'], $v['goodsId']);
  395. }
  396. }
  397. } else {//产品下架在此处理
  398. $opera_prod->cancelProductByCode($val['productId']);
  399. }
  400. }
  401. }
  402. /**
  403. * Function Description:定时任务将outside_ticket同步到opera_product_run
  404. * Function Name: actionUptOperaRun
  405. *
  406. *
  407. * @author 娄梦宁
  408. */
  409. public function UptOperaRun()
  410. {
  411. $opera_prod_run = new OperaProductRun();
  412. $result = $opera_prod_run->uptRun();
  413. if ($result == 2) {
  414. file_put_contents(__DIR__ . '/../log/lvmama/' . date("Y-m-d") . '.log', date("Y-m-d H:i:s") . '定时任务将outside_ticket同步到opera_product_run 报错 ' . PHP_EOL, FILE_APPEND);
  415. }
  416. }
  417. }