Task.php 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469
  1. <?php namespace Seller\Api;
  2. use Dever;
  3. use Dever\Helper\Redis;
  4. use Dever\Helper\Str;
  5. use Dever\Helper\Cmd;
  6. use Dever\Helper\Date;
  7. ini_set("memory_limit", -1);
  8. class Task
  9. {
  10. # 每个商户一个进程,暂时不做
  11. public function act()
  12. {
  13. $seller = Dever::db('info', 'seller')->select(array('status' => 1));
  14. if ($seller) {
  15. foreach ($seller as $k => $v) {
  16. }
  17. }
  18. }
  19. public function cron()
  20. {
  21. while(1) {
  22. try {
  23. # 获取当前执行的进程数量
  24. $num = $this->getNum();
  25. if ($num >= 500) {
  26. # 等会儿再执行
  27. sleep(30);
  28. }
  29. $data = Redis::pop('submit_' . DEVER_PROJECT);
  30. if ($data) {
  31. $this->popen($data);
  32. }
  33. } catch (\Exception $e) {
  34. $this->redis = false;
  35. }
  36. };
  37. }
  38. # 将数据推到子进程处理
  39. private function popen($order)
  40. {
  41. //$command = 'php /www/'.DEVER_PROJECT.'/src/dai/seller/index.php \'{"l":"task.run","order":"'.Str::encode($order).'"}\'';
  42. //Cmd::shell($command);
  43. Cmd::run('task.run', array('order' => Str::encode($order)), 'seller');
  44. }
  45. # 获取当前执行的子进程数量
  46. private function getNum()
  47. {
  48. $command = 'ps -ef | grep task.run | grep -v grep | wc -l';
  49. $num = exec($command);
  50. return $num;
  51. }
  52. public function run()
  53. {
  54. $order = Str::decode(Dever::input('order'));
  55. $info = Dever::db('order', 'seller')->find($order);
  56. if ($info) {
  57. Dever::load('order', 'seller')->handle($info);
  58. }
  59. }
  60. # 每日整理订单数据
  61. //public function order_commit(){}
  62. public function order()
  63. {
  64. # 获取昨天的时间
  65. $time = \Dever\Helper\Date::day();
  66. $where['cdate'] = array('<', $time[0]);
  67. $where['status'] = array('>=', 10);
  68. $order = Dever::db('order', 'seller')->select($where);
  69. foreach ($order as $k => $v) {
  70. if ($v['finish_date'] > 0) {
  71. $id = $v['id'];
  72. unset($v['id']);
  73. $info = Dever::db('order_log1', 'seller')->find(array('order_num' => $v['order_num']));
  74. if (!$info) {
  75. $info = Dever::db('order_log1', 'seller')->insert($v);
  76. if ($info) {
  77. Dever::db('order', 'seller')->delete($id);
  78. }
  79. }
  80. }
  81. }
  82. $order = Dever::db('order_log2', 'seller')->select($where);
  83. foreach ($order as $k => $v) {
  84. if ($v['finish_date'] > 0) {
  85. $id = $v['id'];
  86. unset($v['id']);
  87. $info = Dever::db('order_log3', 'seller')->insert($v);
  88. if ($info) {
  89. Dever::db('order_log2', 'seller')->delete($id);
  90. }
  91. }
  92. }
  93. $this->cash();
  94. }
  95. # 统计
  96. public function stat()
  97. {
  98. $day = Dever::input('day');
  99. if ($day) {
  100. $time = \Dever\Helper\Date::day($day);
  101. } else {
  102. # 获取昨天的时间
  103. $time = \Dever\Helper\Date::day(1);
  104. }
  105. $where['cdate'] = array('>=', $time[0]);
  106. $where['cdate#'] = array('<=', $time[1]);
  107. $order = Dever::db('order_log1', 'seller')->select($where);
  108. $order_error = Dever::db('order_log3', 'seller')->select($where);
  109. $data = array();
  110. $default = array
  111. (
  112. 'total_num' => 0,
  113. 'success_num' => 0,
  114. 'error_num' => 0,
  115. 'total_cash' => 0,
  116. 'success_cash' => 0,
  117. 'error_cash' => 0,
  118. 'seller_actual_cash' => 0,
  119. 'channel_actual_cash' => 0,
  120. 'profit_cash' => 0,
  121. 'data' => array(),
  122. );
  123. foreach ($order as $k => $v) {
  124. # 整理这一天成功的和失败的
  125. $day = \Dever\Helper\Date::mktime(date('Y-m-d 00:00:00', $v['cdate']));
  126. $this->statItem($data, $day, '_1', $default, $v);
  127. $this->statItem($data, $day, 'seller_' . $v['seller_id'], $default, $v, $v['channel_id']);
  128. if ($v['channel_id']) {
  129. $this->statItem($data, $day, 'channel_' . $v['channel_id'], $default, $v, $v['seller_id']);
  130. }
  131. }
  132. foreach ($order_error as $k => $v) {
  133. # 整理这一天成功的和失败的
  134. $day = \Dever\Helper\Date::mktime(date('Y-m-d 00:00:00', $v['cdate']));
  135. $this->statItem($data, $day, '_1', $default, $v);
  136. $this->statItem($data, $day, 'seller_' . $v['seller_id'], $default, $v, $v['channel_id']);
  137. if ($v['channel_id']) {
  138. $this->statItem($data, $day, 'channel_' . $v['channel_id'], $default, $v, $v['seller_id']);
  139. }
  140. }
  141. if ($data) {
  142. foreach ($data as $k => $v) {
  143. foreach ($v as $k1 => $v1) {
  144. $v1['data'] = Dever::json_encode($v1['data']);
  145. $k1 = explode('_', $k1);
  146. $w = array();
  147. $w['day'] = $k;
  148. $table = 'order_stat';
  149. if ($k1[0]) {
  150. $w[$k1[0] . '_id'] = $k1[1];
  151. $table .= '_' . $k1[0];
  152. }
  153. $info = Dever::db($table, 'seller')->find($w);
  154. if ($info) {
  155. Dever::db($table, 'seller')->update($info['id'], $v1);
  156. } else {
  157. $v1 = array_merge($v1, $w);
  158. Dever::db($table, 'seller')->insert($v1);
  159. }
  160. }
  161. }
  162. }
  163. }
  164. public function statItem(&$data, $day, $mid, $default, $v, $rid = false)
  165. {
  166. if (!isset($data[$day][$mid])) {
  167. $data[$day][$mid] = $default;
  168. }
  169. if ($rid) {
  170. if (!isset($data[$day][$mid]['data'][$rid])) {
  171. $data[$day][$mid]['data'][$rid] = $default;
  172. }
  173. }
  174. $data[$day][$mid]['total_num'] += $v['num'];
  175. $data[$day][$mid]['total_cash'] += $v['cash'];
  176. if ($rid) {
  177. $data[$day][$mid]['data'][$rid]['total_num'] += $v['num'];
  178. $data[$day][$mid]['data'][$rid]['total_cash'] += $v['cash'];
  179. }
  180. if ($v['status'] == 10) {
  181. $data[$day][$mid]['success_num'] += $v['num'];
  182. $data[$day][$mid]['success_cash'] += $v['cash'];
  183. $data[$day][$mid]['seller_actual_cash'] += $v['price'];
  184. $data[$day][$mid]['channel_actual_cash'] += $v['buy_price'];
  185. $data[$day][$mid]['profit_cash'] += ($v['price']-$v['buy_price']);
  186. if ($rid) {
  187. $data[$day][$mid]['data'][$rid]['success_num'] += $v['num'];
  188. $data[$day][$mid]['data'][$rid]['success_cash'] += $v['cash'];
  189. $data[$day][$mid]['data'][$rid]['seller_actual_cash'] += $v['price'];
  190. $data[$day][$mid]['data'][$rid]['channel_actual_cash'] += $v['buy_price'];
  191. $data[$day][$mid]['data'][$rid]['profit_cash'] += ($v['price']-$v['buy_price']);
  192. }
  193. } elseif ($v['status'] == 11) {
  194. $data[$day][$mid]['error_num'] += $v['num'];
  195. $data[$day][$mid]['error_cash'] += $v['cash'];
  196. if ($rid) {
  197. $data[$day][$mid]['data'][$rid]['error_num'] += $v['num'];
  198. $data[$day][$mid]['data'][$rid]['error_cash'] += $v['cash'];
  199. }
  200. }
  201. }
  202. # 每小时统计一次正确的商户余额
  203. public function yue()
  204. {
  205. $this->cash();
  206. return;
  207. $where['status'] = 1;
  208. $seller = Dever::db('info', 'seller')->load($where);
  209. foreach ($seller as $k => $v) {
  210. $data = Dever::db('log1', 'seller')->select(array('seller_id' => $v['id']), array('col' => 'sum(cash)'));
  211. if ($data && isset($data[0]['sum'])) {
  212. //$sum = $data[0]['sum'] - $v['credit'];
  213. $sum = $data[0]['sum'];
  214. //Dever::db('info', 'seller')->update($v['id'], array('cash' => $sum));
  215. }
  216. }
  217. }
  218. # 每5分钟跑一次回调
  219. public function callback()
  220. {
  221. $where['status'] = array('>=', 10);
  222. $where['seller_callback_num'] = array('<=', 5);
  223. $where['seller_callback_date'] = array('<=', time() + 300);
  224. $where['finish_date'] = $where['seller_callback_date'];
  225. $where['seller_callback'] = array('!=', 'ok');
  226. $order = Dever::db('order', 'seller')->select($where);
  227. foreach ($order as $k => $v) {
  228. $msg = '';
  229. if ($v['status'] == 10) {
  230. $msg = 'ok';
  231. } elseif ($v['status'] == 11) {
  232. $msg = 'error';
  233. }
  234. if ($msg) {
  235. Dever::load('order', 'seller')->notify($v, $msg);
  236. }
  237. }
  238. $order = Dever::db('order_log2', 'seller')->select($where);
  239. foreach ($order as $k => $v) {
  240. $msg = '';
  241. if ($v['status'] == 10) {
  242. $msg = 'ok';
  243. } elseif ($v['status'] == 11) {
  244. $msg = 'error';
  245. }
  246. if ($msg) {
  247. Dever::load('order_log2', 'seller')->notify($v, $msg, array(), 5, 1, 'order_log2');
  248. }
  249. }
  250. }
  251. # 每5分钟跑一次处理中
  252. public function chuli()
  253. {
  254. $where['status'] = 1;
  255. $where['cdate'] = array('<=', time() - 1800);
  256. $order = Dever::db('order', 'seller')->select($where);
  257. $test = Dever::input('test');
  258. if ($test == 1) {
  259. print_r($order);die;
  260. }
  261. foreach ($order as $k => $v) {
  262. Dever::load('order', 'seller')->handle($v);
  263. }
  264. }
  265. # 插入测试数据
  266. public function test()
  267. {
  268. return;
  269. $where = array();
  270. //$where['id'] = '65c345d7d46ba46b32041d32';
  271. $where['status'] = 10;
  272. $set = array();
  273. //$where['sku_id'] = 18;
  274. //$set['limit'] = 10;
  275. //$set['order'] = 'total desc';
  276. //$set['col'] = 'id,cash,seller_id';
  277. //$set['group'] = 'cash';
  278. //$set['col'] = 'sum(cash)';
  279. //$info = Dever::db('order_log1', 'seller')->count($where, $set);
  280. //print_r($info);die;
  281. $order = Dever::db('order', 'seller')->select([]);
  282. foreach ($order as $k => $v) {
  283. //$v['cdate'] = time();
  284. //unset($v['id']);
  285. $id = Dever::db('order_log1', 'seller')->insert($v);
  286. print_r($id);die;
  287. }
  288. $this->test();
  289. }
  290. # 历史数据整理
  291. public function history_order()
  292. {
  293. $time = '2024-02-15 00:00:00';
  294. $time = Date::mktime($time);
  295. $where['cdate'] = array('>=', $time);
  296. $order = Dever::db('order_bak', 'seller')->load($where);
  297. foreach ($order as $k => $v) {
  298. $order_log = Dever::db('order_log1', 'seller')->find(array('order_num' => $v['order_num']));
  299. if (!$order_log) {
  300. Dever::db('order_log1', 'seller')->insert($v);
  301. }
  302. }
  303. }
  304. # 将备份订单迁移回来
  305. public function remove_bak()
  306. {
  307. # 迁移2个月前的数据
  308. list($start, $end) = Date::month(2);
  309. $where['status'] = 10;
  310. $order = Dever::db('order_bak', 'seller')->load($where);
  311. $test = Dever::input('test');
  312. if ($order) {
  313. foreach ($order as $k => $v) {
  314. if ($test == 1) {
  315. $v['cdate_string'] = date('Y-m-d', $v['cdate']);
  316. print_r($v);die;
  317. }
  318. $id = $v['id'];
  319. unset($v['id']);
  320. $info = Dever::db('order_log1', 'seller')->find(array('order_num' => $v['order_num']));
  321. //$info = false;
  322. if (!$info) {
  323. $info = Dever::db('order_log1', 'seller')->insert($v);
  324. }
  325. if ($info) {
  326. Dever::db('order_log1', 'seller')->delete($id);
  327. }
  328. }
  329. }
  330. }
  331. # 将历史订单迁移到备份中
  332. public function bak()
  333. {
  334. # 迁移2个月前的数据
  335. list($start, $end) = Date::month(2);
  336. $where['cdate'] = array('<=', $end);
  337. $where['status'] = 11;
  338. $set['order'] = 'id desc';
  339. $order = Dever::db('order_log3', 'seller')->load($where, $set);
  340. $test = Dever::input('test');
  341. if ($order) {
  342. foreach ($order as $k => $v) {
  343. if ($test == 1) {
  344. $v['cdate_string'] = date('Y-m-d', $v['cdate']);
  345. print_r($v);die;
  346. }
  347. $id = $v['id'];
  348. unset($v['id']);
  349. $info = Dever::db('order_bak', 'seller')->find(array('order_num' => $v['order_num']));
  350. //$info = false;
  351. if (!$info) {
  352. $info = Dever::db('order_bak', 'seller')->insert($v);
  353. }
  354. if ($info) {
  355. Dever::db('order_log3', 'seller')->delete($id);
  356. }
  357. }
  358. }
  359. }
  360. # 迁移失败订单
  361. public function fail()
  362. {
  363. $where['status'] = 11;
  364. $set['order'] = 'id asc';
  365. $set['limit'] = '0,100000';
  366. $order = Dever::db('order_log3', 'seller')->load($where, $set);
  367. if ($order) {
  368. foreach ($order as $k => $v) {
  369. $id = $v['id'];
  370. unset($v['id']);
  371. //$info = Dever::db('order_log3', 'seller')->find(array('order_num' => $v['order_num']));
  372. $info = false;
  373. if (!$info) {
  374. $info = Dever::db('order_log1', 'seller')->insert($v);
  375. }
  376. if ($info) {
  377. Dever::db('order_log3', 'seller')->delete($id);
  378. }
  379. }
  380. }
  381. }
  382. public function yes()
  383. {
  384. $where['status'] = 10;
  385. $order = Dever::db('order_log1', 'seller')->select($where);
  386. foreach ($order as $k => $v) {
  387. if ($v['channel_callback']) {
  388. $temp = Dever::json_decode($v['channel_callback']);
  389. if (isset($temp['official_order_num'])) {
  390. $up['official_order_num'] = $temp['official_order_num'];
  391. }
  392. if (isset($temp['voucher'])) {
  393. $up['official_order_num'] = $temp['voucher'];
  394. }
  395. if (isset($up) && $up) {
  396. Dever::db('order_log1', 'seller')->update($v['id'], $up);
  397. }
  398. }
  399. }
  400. }
  401. # 计算正确的余额
  402. public function cash()
  403. {
  404. $where['status'] = array('!=', 11);
  405. $order = Dever::db('order', 'seller')->select($where);
  406. $num = array();
  407. foreach ($order as $k => $v) {
  408. if (!isset($num[$v['seller_id']])) {
  409. $num[$v['seller_id']] = 0;
  410. }
  411. $num[$v['seller_id']] += $v['num'] * $v['price'];
  412. }
  413. $order = Dever::db('order_log1', 'seller')->select($where);
  414. foreach ($order as $k => $v) {
  415. if (!isset($num[$v['seller_id']])) {
  416. $num[$v['seller_id']] = 0;
  417. }
  418. $num[$v['seller_id']] += $v['num'] * $v['price'];
  419. }
  420. $order = Dever::db('order_bak', 'seller')->select($where);
  421. foreach ($order as $k => $v) {
  422. if (!isset($num[$v['seller_id']])) {
  423. $num[$v['seller_id']] = 0;
  424. }
  425. $num[$v['seller_id']] += $v['num'] * $v['price'];
  426. }
  427. foreach ($num as $k => $v) {
  428. $seller = Dever::db('info', 'seller')->find($k);
  429. $up['cash'] = $seller['p_cash'] - $v;
  430. $data = Dever::db('log1', 'seller')->select(array('seller_id' => $k, 'type' => 2));
  431. if ($data) {
  432. $s = 0;
  433. foreach ($data as $k1 => $v1) {
  434. $s += $v1['cash'];
  435. }
  436. $up['cash'] += $s;
  437. }
  438. Dever::db('info', 'seller')->update($k, $up);
  439. }
  440. }
  441. }