setName('xQueue:MaSuDaAfterSalesOrdeRelated')->setDescription('[ 码速达 - 售后任务 ] 自动同步关联售后订单并尝试锁卡'); } /** * @param Input $input * @param Output $output * @throws \think\admin\Exception */ protected function execute(Input $input, Output $output) { ini_set('memory_limit', '1024M'); $merchants = MerchantService::instance()->db()->where(['other_status' => 1])->whereLike('other_param', '%"maSuDa_afterSales_status":"1"%')->select()->toArray(); if (!$merchants) $this->setQueueSuccess("未找到需要处理的商家"); $merchant_num = count($merchants); $count_sum = 0; $total_sum = 0; $afterSalesOrderService = AfterSalesOrderService::instance(); $channelService = ChannelService::instance(); $LockCardService = LockCardService::instance(); foreach ($merchants as $merchant) { $request = []; $other_param = json_decode($merchant['other_param'], true); $mid = $merchant['id']; if (!is_array($other_param)) { $this->setQueueProgress(" 该商家配置错误,请检查", 0); continue; } if (!$other_param['autoCardSoftware'] || $other_param['autoCardSoftware'] != 2) { $this->setQueueProgress(" 该商家暂不支持码速达,请检查", 0); continue; } $where = [ 'status' => 1, 'order_id' => null, 'mid' => $mid ]; list($count, $total) = [0, $afterSalesOrderService->db()->where($where)->whereNull('infodata')->count()]; $total_sum += $total; // var_dump($total);die; #1.同步更新订单,如果没找到关联订单则更新status为6, $afterSalesOrderService->db()->where($where)->whereNull('infodata')->chunk(100, function (Collection $data) use (&$count, &$count_sum, $total, $afterSalesOrderService, $request, $merchant, $channelService, $LockCardService, $other_param) { foreach ($data->toArray() as $vo) { // var_dump($vo);die; $count++; $count_sum++; $order = $this->getOrderInfo('', $vo['merchant_order_id'], $vo['mid']); if (!$order) { $up_data = [ 'status' => '6' ]; $field = ['merchant_order_id' => $vo['merchant_order_id']]; $afterSalesOrderService->db()->where($field)->update($up_data); // if($other_param['']) // $up_notes = $this->tradeUpdate($vo,$request,3); #备注 $this->setQueueProgress(" {$vo['merchant_order_id']} 不存在我们系统中", $count / $total * 100); } else { $channelInfo = $channelService->get($order['cid']); $up_data = []; $up_data['order_id'] = $order['order_id']; $up_data['pid'] = $order['pid']; $up_data['cid'] = $order['cid']; $up_data['product_key'] = $order['product_key']; $response = json_decode($order['response'], true); if ($channelInfo['suoka_status'] == 1) { if (isset($response['kami'])) { $suoka = $channelService->call('lockCard', $order['cid'], $order); if ($suoka !== 'ok' && $suoka !== 'old_ok') { $suoka = $channelService->call('lockCard', $order['cid'], $order); } if ($suoka == 'ok' || $suoka == 'old_ok') { $spRefund = $this->refundsp($vo, $request); if ($spRefund == 'true') { $request['sub_code'] = $merchant['sub_code']; $caozuo_refunf = $this->refundtk($vo, $request); if ($caozuo_refunf != 'error') { $this->setQueueProgress("售后订单 {$vo['refund_id']} 已经自动退款处理", $count / $total * 100); } else { // Log::write('queue', 'taobao_sh', $caozuo_refunf);#写入到日志里 $this->setQueueProgress("售后订单 {$vo['refund_id']} 已经完成审批,自动退款失败", $count / $total * 100); } } else { // Log::write('queue', 'taobao_sh', $spRefund);#写入到日志里 $this->setQueueProgress("售后订单 {$vo['refund_id']} 已经自动锁卡,审批失败", $count / $total * 100); } } else { $up_data['status'] = '8'; Log::write('queue', 'taobao_sk', $order['order_id'] . '锁卡失败');#写入到日志里 $this->setQueueProgress("售后订单 {$vo['refund_id']} 锁卡失败", $count / $total * 100); } } } elseif ($channelInfo['suoka_status'] == 2) { if (isset($response['kami'])) { $cardno = $response['kami']['cardno']; $cardpwd = $response['kami']['cardpwd']; $expire_time = $response['kami']['expired']; $suoka = $LockCardService->call('suoka', $order['cid'], $cardno, $cardpwd, $order['pid'], $order['cash']); if ($suoka == 'ok' || $suoka == 'old_ok') { // $KamiService = KamiService::instance(); // $submitKami = $KamiService->upKami($cardno, $cardpwd, $order['cash'],$expire_time); // if(!$submitKami){ // Log::write('queue', 'submitkami', $order['order_id'].'提交数据库失败');#写入到日志里 // } $spRefund = $this->refundsp($vo, $request); if ($spRefund == 'error') { $spRefund = $this->refundsp($vo, $request); if ($spRefund == 'error') { $spRefund = $this->refundsp($vo, $request); } } if ($spRefund == 'true') { $request['sub_code'] = $merchant['sub_code']; $caozuo_refunf = $this->refundtk($vo, $request, 0); if ($caozuo_refunf != 'error') { $up_data['status'] = '4'; // $this->setQueueProgress("售后订单 {$vo['refund_id']} 已经自动退款处理", $count / $total * 100); } else { // Log::write('queue', 'taobao_sh', $caozuo_refunf);#写入到日志里 $up_data['status'] = '4'; // $this->setQueueProgress("售后订单 {$vo['refund_id']} 已经完成审批,自动退款失败", $count / $total * 100); } } else { $up_data['status'] = '7'; // $this->setQueueProgress("售后订单 {$vo['refund_id']} 已经自动锁卡,审批失败", $count / $total * 100); } } elseif ($suoka == 'use_error') { // // $up_notes = $this->tradeUpdate($vo,$request,1); // if($up_notes == 'ok'){ // $up_data['status'] = '7'; // $this->setQueueProgress("售后订单 {$vo['refund_id']} 已使用,已修改备注", $count / $total * 100); // }else{ $up_data['status'] = '8'; Log::write('queue', 'taobao_bz', $order['order_id'] . '已使用');#写入到日志里 // $this->setQueueProgress("售后订单 {$vo['refund_id']} 已使用,修改备注失败", $count / $total * 100); // } } else { // $up_notes = $this->tradeUpdate($vo,$request,2); // if($up_notes == 'ok'){ // $up_data['status'] = '8'; // $this->setQueueProgress("售后订单 {$vo['refund_id']} 锁卡失败,已修改备注", $count / $total * 100); // }else{ $up_data['status'] = '8'; Log::write('queue', 'taobao_bz', $order['order_id'] . '已使用');#写入到日志里 // $this->setQueueProgress("售后订单 {$vo['refund_id']} 锁卡失败,修改备注失败", $count / $total * 100); // } Log::write('queue', 'taobao_sk', $order['order_id'] . '锁卡失败');#写入到日志里 // $this->setQueueProgress("售后订单 {$vo['refund_id']} 锁卡失败", $count / $total * 100); } } } else { $up_data['status'] = '8'; } $field = ['merchant_order_id' => $vo['merchant_order_id']]; $afterSalesOrderService->db()->where($field)->update($up_data); } } }); } $this->setQueueSuccess("共找到 {$merchant_num} 个商户需要处理,总共找到 {$total_sum} 个,同步关联 {$count_sum} 个订单完成!"); } public function getOrderInfo($order_id,$merchant_order_id,$mid) { $orderService = OrderService::instance(); $order = $orderService->get($order_id, $merchant_order_id, $mid); if (!$order) { $orderLastweekHistoryService = OrderLastweekHistoryService::instance(); $order = $orderLastweekHistoryService->get($order_id, $merchant_order_id, $mid); } if (!$order) { $orderLastHistoryService = OrderLastHistoryService::instance(); $order = $orderLastHistoryService->get($order_id, $merchant_order_id, $mid); } if (!$order) { $orderTwoHistoryService = OrderTwoHistoryService::instance(); $order = $orderTwoHistoryService->get($order_id, $merchant_order_id, $mid); } if (!$order) { $orderHistoryService = OrderHistoryService::instance(); $order = $orderHistoryService->get($order_id, $merchant_order_id, $mid); } return $order; } public function tradeUpdate($vo,$request,$beizhu = 1) { $request['merchant_order_id'] = $vo['merchant_order_id']; if($beizhu == 1){ $request['beizhu'] = "卡密已使用,请操作拒绝退款,并上传退款凭证--Reapi系统自动化"; }elseif($beizhu == 2){ $request['beizhu'] = "卡密锁卡失败,请人工介入操作,核实拒绝退款,并上传拒绝退款凭证--Reapi系统自动化"; }elseif ($beizhu == 3){ $request['beizhu'] = "此订单不存在中控系统中,可能属于早期订单,请人工核实处理--Reapi系统自动化"; } $request['flag'] = "1"; $request['reset'] = "false"; // $request['access_token'] = $merchant['access_token']; $response = Coretb::taobaosdk('tradeUpdate', $request); $json = json_encode($response); $array = json_decode($json, true); if (isset($array['Trade']['tid']) && $array['Trade']['tid'] == $vo['merchant_order_id']) { return 'ok'; } else { return 'error'; } } public function refundsp($vo,$request) { $request['caozuo_name'] = '系统自动处理'; $request['refundId'] = $vo['refund_id']; $request['phase'] = $vo['refund_phase']; $RefundVersion = json_decode($vo['infodata'],true); $RefundVersion = $RefundVersion['refund_version']; $request['RefundVersion'] = $RefundVersion; $request['RefundMsg'] = '未使用,同意退款';#默认同意 $request['RefundStatus'] = 'true'; // $request['access_token'] = $merchant['access_token']; $response = Coretb::taobaosdk('refundSp', $request); $json = json_encode($response); $array = json_decode($json, true); if($array['is_success'] == 'true'){ return 'true'; }else{ Log::write('queue', 'taobao_sp', $array);#写入到日志里 return 'error'; } #判断响应是否成功 } public function refundtk($vo,$request,$num = 0) { $RefundVersion = $this->refundget($vo,$request); if($RefundVersion != 'error'){ $cash = $vo['refund_fee'] * 100; $request['refund_infos'] = $vo['refund_id'].'|'.$cash.'|'.$RefundVersion .'|'.$vo['refund_phase']; $response = Coretb::taobaosdk('refundAgree', $request); $json = json_encode($response); $array = json_decode($json, true); if(isset($array['sub_msg']) ){ if(str_contains($array['sub_msg'], "未审核状态")){ while ($num<1) { $num++; sleep(3); return $this->refundtk($vo,$request,$num,); } } } if (isset($array['succ'])) { if(isset($array['message']) && $array['message']=='操作成功'){ return 'ok'; }else{ Log::write('queue', 'taobao_tk', $array);#写入到日志里 return 'error'; } } else { Log::write('queue', 'taobao_tk', $array);#写入到日志里 return 'error'; } }else { Log::write('queue', 'taobao_tk', $RefundVersion);#写入到日志里 return 'error'; } } public function refundget($vo,$request) { if(isset($request['sub_code'])){ unset($request['sub_code']); } $request['refundId'] = $vo['refund_id']; // $request['access_token'] = $merchant['access_token']; $response = Coretb::taobaosdk('refundInfo', $request); $json = json_encode($response); $array = json_decode($json, true); if (isset($array['refund'])) { $array = $array['refund']; $RefundVersion = $array['refund_version']; return $RefundVersion; } else { return 'error'; } } #判断响应是否成功 // #以下为成功,自动切换子账号审批退款 // $request1['agentId'] = '34615444'; // $request1['agentkey'] = '2e59a0c00b4fafd9ae46bedced6eccc3'; // $request1['sub_code'] = $merchant['sub_code']; // $request['refund_infos'] = $vo['refund_id'].'|'.$cash, // //// $req->setCode($request['sub_code']); //// $req->setRefundInfos("退款订单号|按分金额|退款时间戳|退款状态"); // $req->setRefundInfos($request['refund_infos']); // $req->setIgnoreCode("true"); // return $c->execute($req, $request['sub_code']); // $response1 = Coretb::taobaosdk('refundAgree', $request); #尝试发起锁卡,如果锁卡成功自动退款 #锁卡失败不处理等待rpa机器人自动化处理。 }