123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469 |
- <?php namespace Seller\Api;
- use Dever;
- use Dever\Helper\Redis;
- use Dever\Helper\Str;
- use Dever\Helper\Cmd;
- use Dever\Helper\Date;
- ini_set("memory_limit", -1);
- class Task
- {
- # 每个商户一个进程,暂时不做
- public function act()
- {
- $seller = Dever::db('info', 'seller')->select(array('status' => 1));
- if ($seller) {
- foreach ($seller as $k => $v) {
- }
- }
- }
- public function cron()
- {
- while(1) {
- try {
- # 获取当前执行的进程数量
- $num = $this->getNum();
- if ($num >= 500) {
- # 等会儿再执行
- sleep(30);
- }
- $data = Redis::pop('submit_' . DEVER_PROJECT);
- if ($data) {
- $this->popen($data);
- }
- } catch (\Exception $e) {
- $this->redis = false;
- }
- };
- }
- # 将数据推到子进程处理
- private function popen($order)
- {
- //$command = 'php /www/'.DEVER_PROJECT.'/src/dai/seller/index.php \'{"l":"task.run","order":"'.Str::encode($order).'"}\'';
- //Cmd::shell($command);
- Cmd::run('task.run', array('order' => Str::encode($order)), 'seller');
- }
- # 获取当前执行的子进程数量
- private function getNum()
- {
- $command = 'ps -ef | grep task.run | grep -v grep | wc -l';
- $num = exec($command);
- return $num;
- }
- public function run()
- {
- $order = Str::decode(Dever::input('order'));
- $info = Dever::db('order', 'seller')->find($order);
- if ($info) {
- Dever::load('order', 'seller')->handle($info);
- }
- }
- # 每日整理订单数据
- //public function order_commit(){}
- public function order()
- {
- # 获取昨天的时间
- $time = \Dever\Helper\Date::day();
- $where['cdate'] = array('<', $time[0]);
- $where['status'] = array('>=', 10);
- $order = Dever::db('order', 'seller')->select($where);
- foreach ($order as $k => $v) {
- if ($v['finish_date'] > 0) {
- $id = $v['id'];
- unset($v['id']);
- $info = Dever::db('order_log1', 'seller')->find(array('order_num' => $v['order_num']));
- if (!$info) {
- $info = Dever::db('order_log1', 'seller')->insert($v);
- if ($info) {
- Dever::db('order', 'seller')->delete($id);
- }
- }
- }
- }
- $order = Dever::db('order_log2', 'seller')->select($where);
- foreach ($order as $k => $v) {
- if ($v['finish_date'] > 0) {
- $id = $v['id'];
- unset($v['id']);
- $info = Dever::db('order_log3', 'seller')->insert($v);
- if ($info) {
- Dever::db('order_log2', 'seller')->delete($id);
- }
- }
- }
- $this->cash();
- }
- # 统计
- public function stat()
- {
- $day = Dever::input('day');
- if ($day) {
- $time = \Dever\Helper\Date::day($day);
- } else {
- # 获取昨天的时间
- $time = \Dever\Helper\Date::day(1);
- }
-
- $where['cdate'] = array('>=', $time[0]);
- $where['cdate#'] = array('<=', $time[1]);
- $order = Dever::db('order_log1', 'seller')->select($where);
- $order_error = Dever::db('order_log3', 'seller')->select($where);
- $data = array();
- $default = array
- (
- 'total_num' => 0,
- 'success_num' => 0,
- 'error_num' => 0,
- 'total_cash' => 0,
- 'success_cash' => 0,
- 'error_cash' => 0,
- 'seller_actual_cash' => 0,
- 'channel_actual_cash' => 0,
- 'profit_cash' => 0,
- 'data' => array(),
- );
- foreach ($order as $k => $v) {
- # 整理这一天成功的和失败的
- $day = \Dever\Helper\Date::mktime(date('Y-m-d 00:00:00', $v['cdate']));
- $this->statItem($data, $day, '_1', $default, $v);
- $this->statItem($data, $day, 'seller_' . $v['seller_id'], $default, $v, $v['channel_id']);
- if ($v['channel_id']) {
- $this->statItem($data, $day, 'channel_' . $v['channel_id'], $default, $v, $v['seller_id']);
- }
- }
- foreach ($order_error as $k => $v) {
- # 整理这一天成功的和失败的
- $day = \Dever\Helper\Date::mktime(date('Y-m-d 00:00:00', $v['cdate']));
- $this->statItem($data, $day, '_1', $default, $v);
- $this->statItem($data, $day, 'seller_' . $v['seller_id'], $default, $v, $v['channel_id']);
- if ($v['channel_id']) {
- $this->statItem($data, $day, 'channel_' . $v['channel_id'], $default, $v, $v['seller_id']);
- }
- }
- if ($data) {
- foreach ($data as $k => $v) {
- foreach ($v as $k1 => $v1) {
- $v1['data'] = Dever::json_encode($v1['data']);
- $k1 = explode('_', $k1);
- $w = array();
- $w['day'] = $k;
- $table = 'order_stat';
- if ($k1[0]) {
- $w[$k1[0] . '_id'] = $k1[1];
- $table .= '_' . $k1[0];
- }
- $info = Dever::db($table, 'seller')->find($w);
- if ($info) {
- Dever::db($table, 'seller')->update($info['id'], $v1);
- } else {
- $v1 = array_merge($v1, $w);
- Dever::db($table, 'seller')->insert($v1);
- }
- }
- }
- }
- }
- public function statItem(&$data, $day, $mid, $default, $v, $rid = false)
- {
- if (!isset($data[$day][$mid])) {
- $data[$day][$mid] = $default;
- }
- if ($rid) {
- if (!isset($data[$day][$mid]['data'][$rid])) {
- $data[$day][$mid]['data'][$rid] = $default;
- }
- }
-
- $data[$day][$mid]['total_num'] += $v['num'];
- $data[$day][$mid]['total_cash'] += $v['cash'];
- if ($rid) {
- $data[$day][$mid]['data'][$rid]['total_num'] += $v['num'];
- $data[$day][$mid]['data'][$rid]['total_cash'] += $v['cash'];
- }
- if ($v['status'] == 10) {
- $data[$day][$mid]['success_num'] += $v['num'];
- $data[$day][$mid]['success_cash'] += $v['cash'];
- $data[$day][$mid]['seller_actual_cash'] += $v['price'];
- $data[$day][$mid]['channel_actual_cash'] += $v['buy_price'];
- $data[$day][$mid]['profit_cash'] += ($v['price']-$v['buy_price']);
- if ($rid) {
- $data[$day][$mid]['data'][$rid]['success_num'] += $v['num'];
- $data[$day][$mid]['data'][$rid]['success_cash'] += $v['cash'];
- $data[$day][$mid]['data'][$rid]['seller_actual_cash'] += $v['price'];
- $data[$day][$mid]['data'][$rid]['channel_actual_cash'] += $v['buy_price'];
- $data[$day][$mid]['data'][$rid]['profit_cash'] += ($v['price']-$v['buy_price']);
- }
- } elseif ($v['status'] == 11) {
- $data[$day][$mid]['error_num'] += $v['num'];
- $data[$day][$mid]['error_cash'] += $v['cash'];
- if ($rid) {
- $data[$day][$mid]['data'][$rid]['error_num'] += $v['num'];
- $data[$day][$mid]['data'][$rid]['error_cash'] += $v['cash'];
- }
- }
- }
- # 每小时统计一次正确的商户余额
- public function yue()
- {
- $this->cash();
- return;
- $where['status'] = 1;
- $seller = Dever::db('info', 'seller')->load($where);
- foreach ($seller as $k => $v) {
- $data = Dever::db('log1', 'seller')->select(array('seller_id' => $v['id']), array('col' => 'sum(cash)'));
- if ($data && isset($data[0]['sum'])) {
- //$sum = $data[0]['sum'] - $v['credit'];
- $sum = $data[0]['sum'];
- //Dever::db('info', 'seller')->update($v['id'], array('cash' => $sum));
- }
- }
- }
- # 每5分钟跑一次回调
- public function callback()
- {
- $where['status'] = array('>=', 10);
- $where['seller_callback_num'] = array('<=', 5);
- $where['seller_callback_date'] = array('<=', time() + 300);
- $where['finish_date'] = $where['seller_callback_date'];
- $where['seller_callback'] = array('!=', 'ok');
- $order = Dever::db('order', 'seller')->select($where);
- foreach ($order as $k => $v) {
- $msg = '';
- if ($v['status'] == 10) {
- $msg = 'ok';
- } elseif ($v['status'] == 11) {
- $msg = 'error';
- }
- if ($msg) {
- Dever::load('order', 'seller')->notify($v, $msg);
- }
- }
- $order = Dever::db('order_log2', 'seller')->select($where);
- foreach ($order as $k => $v) {
- $msg = '';
- if ($v['status'] == 10) {
- $msg = 'ok';
- } elseif ($v['status'] == 11) {
- $msg = 'error';
- }
- if ($msg) {
- Dever::load('order_log2', 'seller')->notify($v, $msg, array(), 5, 1, 'order_log2');
- }
- }
- }
- # 每5分钟跑一次处理中
- public function chuli()
- {
- $where['status'] = 1;
- $where['cdate'] = array('<=', time() - 1800);
- $order = Dever::db('order', 'seller')->select($where);
- $test = Dever::input('test');
- if ($test == 1) {
- print_r($order);die;
- }
- foreach ($order as $k => $v) {
- Dever::load('order', 'seller')->handle($v);
- }
- }
- # 插入测试数据
- public function test()
- {
- return;
- $where = array();
- //$where['id'] = '65c345d7d46ba46b32041d32';
- $where['status'] = 10;
- $set = array();
- //$where['sku_id'] = 18;
- //$set['limit'] = 10;
- //$set['order'] = 'total desc';
- //$set['col'] = 'id,cash,seller_id';
- //$set['group'] = 'cash';
- //$set['col'] = 'sum(cash)';
- //$info = Dever::db('order_log1', 'seller')->count($where, $set);
- //print_r($info);die;
- $order = Dever::db('order', 'seller')->select([]);
- foreach ($order as $k => $v) {
- //$v['cdate'] = time();
- //unset($v['id']);
- $id = Dever::db('order_log1', 'seller')->insert($v);
- print_r($id);die;
- }
- $this->test();
- }
- # 历史数据整理
- public function history_order()
- {
- $time = '2024-02-15 00:00:00';
- $time = Date::mktime($time);
- $where['cdate'] = array('>=', $time);
- $order = Dever::db('order_bak', 'seller')->load($where);
- foreach ($order as $k => $v) {
- $order_log = Dever::db('order_log1', 'seller')->find(array('order_num' => $v['order_num']));
- if (!$order_log) {
- Dever::db('order_log1', 'seller')->insert($v);
- }
- }
- }
- # 将备份订单迁移回来
- public function remove_bak()
- {
- # 迁移2个月前的数据
- list($start, $end) = Date::month(2);
- $where['status'] = 10;
- $order = Dever::db('order_bak', 'seller')->load($where);
- $test = Dever::input('test');
- if ($order) {
- foreach ($order as $k => $v) {
- if ($test == 1) {
- $v['cdate_string'] = date('Y-m-d', $v['cdate']);
- print_r($v);die;
- }
- $id = $v['id'];
- unset($v['id']);
- $info = Dever::db('order_log1', 'seller')->find(array('order_num' => $v['order_num']));
- //$info = false;
- if (!$info) {
- $info = Dever::db('order_log1', 'seller')->insert($v);
- }
- if ($info) {
- Dever::db('order_log1', 'seller')->delete($id);
- }
- }
- }
- }
- # 将历史订单迁移到备份中
- public function bak()
- {
- # 迁移2个月前的数据
- list($start, $end) = Date::month(2);
- $where['cdate'] = array('<=', $end);
- $where['status'] = 11;
- $set['order'] = 'id desc';
- $order = Dever::db('order_log3', 'seller')->load($where, $set);
- $test = Dever::input('test');
- if ($order) {
- foreach ($order as $k => $v) {
- if ($test == 1) {
- $v['cdate_string'] = date('Y-m-d', $v['cdate']);
- print_r($v);die;
- }
- $id = $v['id'];
- unset($v['id']);
- $info = Dever::db('order_bak', 'seller')->find(array('order_num' => $v['order_num']));
- //$info = false;
- if (!$info) {
- $info = Dever::db('order_bak', 'seller')->insert($v);
- }
- if ($info) {
- Dever::db('order_log3', 'seller')->delete($id);
- }
- }
- }
- }
- # 迁移失败订单
- public function fail()
- {
- $where['status'] = 11;
- $set['order'] = 'id asc';
- $set['limit'] = '0,100000';
- $order = Dever::db('order_log3', 'seller')->load($where, $set);
- if ($order) {
- foreach ($order as $k => $v) {
- $id = $v['id'];
- unset($v['id']);
- //$info = Dever::db('order_log3', 'seller')->find(array('order_num' => $v['order_num']));
- $info = false;
- if (!$info) {
- $info = Dever::db('order_log1', 'seller')->insert($v);
- }
- if ($info) {
- Dever::db('order_log3', 'seller')->delete($id);
- }
- }
- }
- }
- public function yes()
- {
- $where['status'] = 10;
- $order = Dever::db('order_log1', 'seller')->select($where);
- foreach ($order as $k => $v) {
- if ($v['channel_callback']) {
- $temp = Dever::json_decode($v['channel_callback']);
- if (isset($temp['official_order_num'])) {
- $up['official_order_num'] = $temp['official_order_num'];
- }
- if (isset($temp['voucher'])) {
- $up['official_order_num'] = $temp['voucher'];
- }
- if (isset($up) && $up) {
- Dever::db('order_log1', 'seller')->update($v['id'], $up);
- }
- }
- }
- }
- # 计算正确的余额
- public function cash()
- {
- $where['status'] = array('!=', 11);
- $order = Dever::db('order', 'seller')->select($where);
- $num = array();
- foreach ($order as $k => $v) {
- if (!isset($num[$v['seller_id']])) {
- $num[$v['seller_id']] = 0;
- }
- $num[$v['seller_id']] += $v['num'] * $v['price'];
- }
-
- $order = Dever::db('order_log1', 'seller')->select($where);
- foreach ($order as $k => $v) {
- if (!isset($num[$v['seller_id']])) {
- $num[$v['seller_id']] = 0;
- }
- $num[$v['seller_id']] += $v['num'] * $v['price'];
- }
-
- $order = Dever::db('order_bak', 'seller')->select($where);
- foreach ($order as $k => $v) {
- if (!isset($num[$v['seller_id']])) {
- $num[$v['seller_id']] = 0;
- }
- $num[$v['seller_id']] += $v['num'] * $v['price'];
- }
- foreach ($num as $k => $v) {
- $seller = Dever::db('info', 'seller')->find($k);
- $up['cash'] = $seller['p_cash'] - $v;
- $data = Dever::db('log1', 'seller')->select(array('seller_id' => $k, 'type' => 2));
- if ($data) {
- $s = 0;
- foreach ($data as $k1 => $v1) {
- $s += $v1['cash'];
- }
- $up['cash'] += $s;
- }
- Dever::db('info', 'seller')->update($k, $up);
- }
- }
- }
|