* @version $Id: Z */ class console_delivery_kepler { /** * Obj对象 */ private $__deliveryObj = null; private $__packageObj = null; private $__operLogObj = null; /** * 初始化 */ public function __construct() { //Obj $this->__deliveryObj = app::get('ome')->model('delivery'); $this->__packageObj = app::get('ome')->model('delivery_package'); $this->__operLogObj = app::get('ome')->model('operation_log'); } /** * [重试发货]京东取消父单后,使用Queue队列进行子订单DELIVERY发货 * @todo:防止京东同分同秒推送DELIVERY、ACCEPT状态; * * @param int $cursor_id * @param array $params * @param string $error_msg * @return boolean */ public function responseChildJdOrder(&$cursor_id, $params, &$error_msg=null) { //data $sdfdata = $params['sdfdata']; $delivery_id = intval($sdfdata['delivery_id']); $delivery_bn = $sdfdata['delivery_bn']; $package_bn = $sdfdata['package_bn']; $status = strtolower($sdfdata['status']); $node_id = $sdfdata['node_id']; //[防止并发]延迟2秒执行 sleep(2); //check if($status != 'delivery'){ return false; } if(empty($node_id)){ $error_msg = '没有获取到node_id'; return false; } //datalist $packageList = $this->__packageObj->getList('package_id,status', array('delivery_id'=>$delivery_id, 'package_bn'=>$package_bn)); if(empty($packageList)){ $error_msg = '没有获取到京东订单信息(package_bn:'. $package_bn .',delivery_id:'. $delivery_id .')'; return false; } $isResponse = false; foreach ($packageList as $key => $val) { if(strtolower($val['status']) == 'accept'){ $isResponse = true; break; } } //重试请求WMS京东订单发货 if($isResponse){ unset($sdfdata['sign'], $sdfdata['app_id'], $sdfdata['from_node_id'], $sdfdata['node_id'], $sdfdata['task'], $sdfdata['msg_id'], $sdfdata['certi_id']); //response $result = kernel::single('erpapi_router_response')->set_node_id($node_id)->set_api_name('wms.delivery.status_update')->dispatch($sdfdata); //log if($result['rsp'] == 'fail'){ $this->__operLogObj->write_log('delivery_modify@ome', $delivery_id, '京东订单号['. $package_bn .']重试子单发货并取消父单失败('. $result['msg'] .')'); }else{ $this->__operLogObj->write_log('delivery_modify@ome', $delivery_id, '京东订单号['. $package_bn .']重试子单发货并取消父单'); } } return false; } /** * 拉取接收京东云交易的发货同步日志 * * @param string $delivery_bn * @param array $keplerOrders 京东云交易订单 * @param string $error_msg * @return array */ public function getResponseJdDly($delivery_bn, $keplerOrders, &$error_msg=null) { $apiLogObj = app::get('ome')->model('api_log'); //check if(empty($delivery_bn) || empty($keplerOrders)){ $error_msg = '发货单:'. $delivery_bn .',没有发货单信息'; return false; } //重试推送京东订单号API发货记录 $base_filter = array('status'=>'fail', 'api_type'=>'response', 'original_bn'=>$delivery_bn); $logList = $apiLogObj->getList('*', $base_filter); if(empty($logList)){ $error_msg = '发货单:'. $delivery_bn .',没有respone发货记录'; return false; } //logList $responeList = array(); foreach ($logList as $logKey => $logVal) { $log_id = $logVal['log_id']; //fail if($logVal['status'] != 'fail'){ continue; } //日志标题 $log_name = '发货单['. $delivery_bn .']DELIVERY'; if(strpos($logVal['task_name'], $log_name) === false){ continue; } //日志详细 $apiLogInfo = $apiLogObj->dump($log_id); if(empty($apiLogInfo)){ continue; } $message = $apiLogInfo['msg']; $tempData = explode('
', $message); $log_str = $tempData[0]; $log_str = str_replace('接收参数:', '', $log_str); if(empty($log_str)){ $error_msg = '发货单:'. $delivery_bn .',没有API接收参数...'; return false; } //转换成数组 eval("\$tempData = ".$log_str.'; '); //check if(!is_array($tempData)){ $error_msg = '发货单:'. $delivery_bn .',API接收参数不是数组...'; return false; } if(!in_array($tempData['status'], array('DELIVERY'))){ continue; } $orderId = trim($tempData['orderId']); if(empty($keplerOrders[$orderId])){ continue; } //response数据 $responeList[$orderId] = $tempData; //@todo:现在只需要推送一次发货即可 return $responeList; } //return if(empty($responeList)){ return false; }else{ return $responeList; } } /** * 强制修复发货单 * * @param int $delivery_id * @param string $error_msg * @return bool */ public function repairDelivery($delivery_id, &$error_msg=null) { $dlyOrderMdl = app::get('ome')->model('delivery_order'); $channelObj = app::get('channel')->model('channel'); $branchLib = kernel::single('ome_branch'); $syncProductLib = kernel::single('ome_sync_product'); $freeLib = kernel::single('console_stock_freeze'); //delivery $deliveryInfo = $this->__deliveryObj->dump(array('delivery_id'=>$delivery_id), '*'); if(empty($deliveryInfo)){ $error_msg = '发货单不存在'; return false; } $delivery_bn = $deliveryInfo['delivery_bn']; //check if(!in_array($deliveryInfo['status'], array('ready', 'progress'))){ $error_msg = '发货单状态不正确,不能操作'; return false; } //关联订单order_id $dlyOrderInfo = $dlyOrderMdl->dump(array('delivery_id'=>$delivery_id), '*'); $order_id = $dlyOrderInfo['order_id']; //wms $wms_id = $branchLib->getWmsIdById($deliveryInfo['branch_id']); if(empty($wms_id)){ $error_msg = '没有wms仓库信息'; return false; } $channelInfo = $channelObj->dump(array('channel_id'=>$wms_id), '*'); if(empty($channelInfo)){ $error_msg = '没有wms第三方仓储信息'; return false; } $node_id = $channelInfo['node_id']; //京东云交易订单明细 $packageStatus = array(); $packageList = $this->__packageObj->getList('*', array('delivery_id'=>$delivery_id)); if(empty($packageList)){ $error_msg = '京东云交易订单不存在'; return false; } $keplerOrders = array(); foreach ($packageList as $key => $val) { $package_bn = $val['package_bn']; $product_id = $val['product_id']; $status = strtolower($val['status']); //status if($status == 'cancel'){ $packageStatus['cancel'][$product_id] = $package_bn; }elseif($status == 'delivery'){ $packageStatus['delivery'][$product_id] = $package_bn; //已发货的京东订单号 $keplerOrders[$package_bn] = $package_bn; //注销,防止更新拆分数量 unset($packageStatus['cancel'][$product_id]); }else{ $packageStatus['other'][$product_id] = $package_bn; } } //check if($packageStatus['other']){ $error_msg = '京东云交易订单状态不允许修复。'; return false; }elseif(empty($packageStatus['delivery']) || empty($packageStatus['cancel'])){ $error_msg = '京东云交易订单状态不允许修复!'; return false; } //获取已发货的京东订单号API发货记录 $error_msg = ''; $responseList = $this->getResponseJdDly($delivery_bn, $keplerOrders, $error_msg); if(empty($responseList)){ $error_msg = '拉取京东云交易发货消息失败:'.$error_msg; return false; } //已发货的商品 $productIds = array_keys($packageStatus['delivery']); //已取消的商品 $cancelProductIds = array_keys($packageStatus['cancel']); //除了已发货的商品,其它都删除掉 //删除发货单明细 $delSql = "DELETE FROM sdb_ome_delivery_items WHERE delivery_id=". $delivery_id. " AND product_id NOT IN(". implode(',', $productIds) .")"; $result = $this->__deliveryObj->db->exec($delSql); if(!$result){ $error_msg = '订单号:'. $order_bn .',删除发货单明细失败'; return false; } //删除发货单主信息 $delSql = "DELETE FROM sdb_ome_delivery_items_detail WHERE delivery_id=". $delivery_id. " AND product_id NOT IN(". implode(',', $productIds) .")"; $result = $this->__deliveryObj->db->exec($delSql); if(!$result){ $error_msg = '订单号:'. $order_bn .',删除发货单详细记录失败'; return false; } //更新订单明细拆分数量 $updateSql = "UPDATE sdb_ome_order_items SET split_num=0 WHERE order_id=". $order_id ." AND product_id IN(". implode(',', $cancelProductIds) .")"; $result = $this->__deliveryObj->db->exec($updateSql); //更新订单确认状态 $updateSql = "UPDATE sdb_ome_orders SET process_status='splitting' WHERE order_id=". $order_id; $result = $this->__deliveryObj->db->exec($updateSql); //库存 foreach($cancelProductIds as $key => $product_id) { //释放库存--重置商品的冻结库存 $syncProductLib->reset_freeze($product_id); //释放库存--重置预占流水记录 $result = $freeLib->reset_stock_freeze($product_id); } //[重试发货]推送京东订单发货API日志 foreach ($responseList as $responseKey => $responseVal) { $result = kernel::single('erpapi_router_response')->set_node_id($node_id)->set_api_name('wms.delivery.status_update')->dispatch($responseVal); if($result['rsp'] != 'succ'){ $error_msg = '发货单号:'. $delivery_bn .',重试发货失败'; return false; } } //log $this->__operLogObj->write_log('delivery_modify@ome', $delivery_id, '手工强制修复发货单成功'); return true; } }