model('operation_log'); $operationLogObj->write_log('delivery_modify@ome',$delivery_id,"发货通知单推送仓库开始"); $original_data = kernel::single('ome_event_data_delivery')->generate($delivery_id); if (empty($original_data)){ return true; } $consoleDlyLib = kernel::single('console_delivery'); $consoleDlyLib->update_sync_status($delivery_id, 'send'); //根据仓库识别是否门店仓还是电商仓 $store_id = kernel::single('ome_branch')->isStoreBranch($original_data['branch_id']); if($store_id){ $channel_type = 'store'; $channel_id = $store_id; }else{ $wms_id = kernel::single('ome_branch')->getWmsIdById($original_data['branch_id']); list($rs, $rsData) = self::_get_electron_logi_no($wms_id,$original_data); if(!$rs) { $consoleDlyLib->update_sync_status($delivery_id, 'send_fail', $rsData['msg']); return true; } $channel_type = 'wms'; $channel_id = $wms_id; } $dlyTriggerLib = kernel::single('ome_event_trigger_delivery'); $result = $dlyTriggerLib->create($channel_type,$channel_id,$original_data,false); if($result['rsp'] == 'fail'){ $msg = "失败. 原因:".$result['msg']; }else{ $msg ="成功."; if (isset($result['data']['wms_order_code'])) { $dlyExtObj = app::get('console')->model('delivery_extension'); $ext_data['delivery_bn'] = $original_data['outer_delivery_bn']; $ext_data['original_delivery_bn'] = $result['data']['wms_order_code']; $dlyExtObj->create($ext_data); } kernel::single('ome_wms')->notify($original_data['outer_delivery_bn']); } if(isset($result['msg_id'])){ $msg .=" msg_id:".$result['msg_id']; } if ($result['rsp'] != 'running') { $consoleDlyLib->update_sync_status($delivery_id, $result['rsp'] == 'succ' ? 'send_succ' : 'send_fail'); } $operationLogObj->write_log('delivery_modify@ome',$delivery_id,"推送结果:".$msg); } static public function isAutoNoticeWms($delivery_id) { $orderId = app::get('ome')->model('delivery')->getOrderIdByDeliveryId($delivery_id); $orderMdl = app::get('ome')->model('orders'); $order = $orderMdl->db_dump(['order_id' => $orderId], 'order_id,source_status,createway,shop_type'); if (!$order) { return false; } if($order['shop_type'] == 'luban' && $order['createway'] == 'matrix'){ if (!in_array($order['source_status'], array('SELLER_READY_GOODS', 'SELLER_CONSIGNED_PART', 'TRADE_FINISHED', 'WAIT_BUYER_CONFIRM_GOODS'))) { app::get('ome')->model('delivery')->update(['sync_status'=>'6'], ['delivery_id'=>$delivery_id]); return false; } } return true; } public function sendAgain($arrDeliveryId) { //设置发起二次推送的时效 $syncTime = 30 * 86400; $startTime = time() - $syncTime; //list $dlyArr = app::get('ome')->model('delivery')->getList('delivery_id,sync_send_succ_times,create_time', ['delivery_id'=>$arrDeliveryId, 'status'=>['ready','progress']]); $arrDly = array_column($dlyArr, null, 'delivery_id'); foreach ($arrDeliveryId as $id) { if($arrDly[$id]) { if($arrDly[$id]['create_time'] < $startTime) { app::get('ome')->model('operation_log')->write_log('delivery_modify@ome',$id,"发货单创建超过7天不再自动发起"); continue; } if(self::isAutoNoticeWms($id)) { app::get('ome')->model('operation_log')->write_log('delivery_modify@ome',$id,"二次自动推送发起"); self::notification($id); } else { $time = time() + 3600; $task = array( 'obj_id' => $id, 'obj_type' => 'delivery_send_again', 'exec_time' => $time, ); app::get('ome')->model('misc_task')->saveMiscTask($task); app::get('ome')->model('operation_log')->write_log('delivery_modify@ome',$id,"二次自动推送因订单尚未备货故延时发起:".date('Y-m-d H:i', $time)); } continue; } app::get('ome')->model('operation_log')->write_log('delivery_modify@ome',$id,"二次自动推送因状态变更不发起"); } } static public function cancel($params, $sync = false){ $dly_id = $params['delivery_id']; $data = array(); $data['outer_delivery_id'] = $dly_id; $data['outer_delivery_bn'] = $params['delivery_bn']; $error_msg = ''; $dlyObj = app::get('ome')->model("delivery"); $branchObj = app::get('ome')->model("branch"); //根据仓库识别是否门店仓还是电商仓 $store_id = kernel::single('ome_branch')->isStoreBranch($params['branch_id']); if($store_id){ $channel_type = 'store'; $channel_id = $store_id; }else{ //$branch =$branchObj->getList('branch_bn',array('branch_id'=>$params['branch_id']),0,1); $branch =$branchObj->db->selectrow("SELECT branch_bn,owner_code FROM sdb_ome_branch WHERE branch_id=".$params['branch_id']); $data['branch_bn'] =$branch['branch_bn']; $data['owner_code'] =$branch['owner_code']; $dlyExtObj = app::get('console')->model('delivery_extension'); $dlyExtInfo = $dlyExtObj->dump(array('delivery_bn'=>$params['delivery_bn']),'original_delivery_bn'); $data['original_delivery_bn'] = $dlyExtInfo['original_delivery_bn']; $deliveryInfo = $dlyObj->dump(array('delivery_id'=>$dly_id), 'delivery_id,sync_status,wms_channel_id'); $data['sync_status'] = $deliveryInfo['sync_status']; $data['wms_channel_id'] = $deliveryInfo['wms_channel_id']; if(isset($params['wms_id'])){ $wms_id = $params['wms_id']; }else{ $branchLib = kernel::single('ome_branch'); $wms_id = $branchLib->getWmsIdById($params['branch_id']); } $channel_type = 'wms'; $channel_id = $wms_id; } //订单号 店铺 $deliveryOrderObj = app::get('ome')->model('delivery_order'); $dly_order = $deliveryOrderObj->dump(array('delivery_id'=>$dly_id),'order_id'); $order_id = $dly_order['order_id']; $orderObj = app::get('ome')->model('orders'); $order_detail = $orderObj->dump($order_id, 'order_bn,shop_type,shop_id'); $data['shop_type'] = $order_detail['shop_type']; $data['order_bn'] = $order_detail['order_bn']; $shopObj = app::get('ome')->model('shop'); $shopInfo = $shopObj->dump($order_detail['shop_id'],'shop_bn,name'); $data['shop_code'] = isset($shopInfo['shop_bn']) ? $shopInfo['shop_bn'] : ''; $dlyTriggerLib = kernel::single('ome_event_trigger_delivery'); $rs = $dlyTriggerLib->cancel($channel_type,$channel_id,$data,$sync); if ($rs['rsp'] == 'succ'){ if(!$store_id && $rs['data']){ !is_array($rs['data']) && $rs['data'] = @json_decode($rs['data'],true); if ($rs['data']['response']['message'] == 'Picked'){ kernel::single('ome_delivery_freeze')->add($dly_id); } } //取消合单标识 $label_code = 'SOMS_COMBINE_ORDER'; $combineLabel = kernel::single('ome_bill_label')->getBillLabelInfo($dly_id, 'ome_delivery', $label_code); if ($combineLabel) { $labelAll = app::get('omeauto')->model('order_labels')->getList('*', ['label_code' => $label_code]); if ($labelAll) { $labelAll = array_column($labelAll, 'label_id'); kernel::single('ome_bill_label')->delLabelFromBillId($dly_id, $labelAll, 'ome_delivery', $error_msg); $deliveryOrderList = app::get('ome')->model('delivery_order')->getList('order_id', ['delivery_id' => $dly_id]); foreach ($deliveryOrderList as $val) { kernel::single('ome_bill_label')->delLabelFromBillId($val['order_id'], $labelAll, 'order', $error_msg); } } } } else { kernel::single('console_delivery')->update_sync_status($dly_id, 'cancel_fail', $rs['msg']); } return $rs; } static public function cut($params){ $dly = app::get('ome')->model('delivery')->db_dump(['logi_no'=>$params['logi_no']]); if(empty($dly)) { return ['rsp'=>'fail', 'msg'=>'未找到物流单:'.$params['logi_no'].'的发货单']; } $dly_id = $dly['delivery_id']; $data = array(); $data['outer_delivery_id'] = $dly_id; $data['outer_delivery_bn'] = $dly['delivery_bn']; $data['branch_id'] = $dly['branch_id']; $dlyObj = app::get('ome')->model("delivery"); $branchObj = app::get('ome')->model("branch"); //根据仓库识别是否门店仓还是电商仓 $store_id = kernel::single('ome_branch')->isStoreBranch($dly['branch_id']); if($store_id){ return ['rsp'=>'succ', 'msg'=>'门店无拦截']; }else{ //$branch =$branchObj->getList('branch_bn',array('branch_id'=>$params['branch_id']),0,1); $branch =$branchObj->db->selectrow("SELECT branch_bn FROM sdb_ome_branch WHERE branch_id=".$dly['branch_id']); $data['branch_bn'] =$branch['branch_bn']; $dlyExtObj = app::get('console')->model('delivery_extension'); $dlyExtInfo = $dlyExtObj->dump(array('delivery_bn'=>$dly['delivery_bn']),'original_delivery_bn'); $data['original_delivery_bn'] = $dlyExtInfo['original_delivery_bn']; $branchLib = kernel::single('ome_branch'); $wms_id = $branchLib->getWmsIdById($dly['branch_id']); $channel_type = 'wms'; $channel_id = $wms_id; } $wmsMdl = app::get('wmsmgr')->model('wms'); $wms = $wmsMdl->dump($wms_id, 'channel_id,crop_config,node_type'); if (isset($wms['crop_config']['saleorder_callback']) && $wms['crop_config']['saleorder_callback'] == '0') { return ['rsp'=>'succ', 'msg'=>'配送拦截未开启']; } $dlyTriggerLib = kernel::single('ome_event_trigger_delivery'); $rs = $dlyTriggerLib->cut($channel_type,$channel_id,$data); if($rs['msg'] == '接口方法不存在' || strpos($rs['msg'], '重复请求') !== false) { $rs['rsp'] = 'succ'; } return $rs; } static public function pause($params, $sync = false){ $dly_id = $params['delivery_id']; $data['outer_delivery_bn'] = $params['delivery_bn']; //根据仓库识别是否门店仓还是电商仓 $store_id = kernel::single('ome_branch')->isStoreBranch($params['branch_id']); if($store_id){ $channel_type = 'store'; $channel_id = $store_id; }else{ if(isset($params['wms_id'])){ $wms_id = $params['wms_id']; }else{ $branchLib = kernel::single('ome_branch'); $wms_id = $branchLib->getWmsIdById($params['branch_id']); } $channel_type = 'wms'; $channel_id = $wms_id; } $dlyTriggerLib = kernel::single('ome_event_trigger_delivery'); return $dlyTriggerLib->pause($channel_type,$channel_id,$data,$sync); } static public function renew($params, $sync = false){ $dly_id = $params['delivery_id']; $data['outer_delivery_bn'] = $params['delivery_bn']; $dlyExtObj = app::get('console')->model('delivery_extension'); $dlyExtInfo = $dlyExtObj->dump(array('delivery_bn'=>$params['delivery_bn']),'original_delivery_bn'); //根据仓库识别是否门店仓还是电商仓 $store_id = kernel::single('ome_branch')->isStoreBranch($params['branch_id']); if($store_id){ $channel_type = 'store'; $channel_id = $store_id; }else{ if(isset($params['wms_id'])){ $wms_id = $params['wms_id']; }else{ $branchLib = kernel::single('ome_branch'); $wms_id = $branchLib->getWmsIdById($params['branch_id']); } $channel_type = 'wms'; $channel_id = $wms_id; } $dlyTriggerLib = kernel::single('ome_event_trigger_delivery'); return $dlyTriggerLib->renew($channel_type,$channel_id,$data,$sync); } /** * 查询发货单状态 * * @return void * @author **/ public function searchDelivery($delivery_id) { $delivery = app::get('ome')->model('delivery')->db_dump($delivery_id); return self::search($delivery); } static public function search($params, $sync = false){ $dly_id = $params['delivery_id']; $dlyExtObj = app::get('console')->model('delivery_extension'); $dlyExtInfo = $dlyExtObj->dump(array('delivery_bn'=>$params['delivery_bn']),'original_delivery_bn'); $data = array( 'delivery_bn'=>$params['delivery_bn'], 'out_order_code'=>$dlyExtInfo['original_delivery_bn'], 'obj_id' => $params['obj_id'], ); $branchLib = kernel::single('ome_branch'); if(isset($params['wms_id'])){ $wms_id = $params['wms_id']; }else{ $wms_id = $branchLib->getWmsIdById($params['branch_id']); } //订单号 店铺 $deliveryOrderObj = app::get('ome')->model('delivery_order'); $dly_order = $deliveryOrderObj->dump(array('delivery_id'=>$dly_id),'order_id'); $order_id = $dly_order['order_id']; $orderObj = app::get('ome')->model('orders'); $order_detail = $orderObj->dump($order_id, 'order_bn,shop_type,shop_id'); $shopObj = app::get('ome')->model('shop'); $shopInfo = $shopObj->dump($order_detail['shop_id'],'shop_type,shop_bn,name'); $data['shop_type'] = $shopInfo['shop_type']; $data['shop_code'] = isset($shopInfo['shop_bn']) ? $shopInfo['shop_bn'] : ''; $data['branch_bn'] = $branchLib->getBranchBnById($params['branch_id']); return kernel::single('erpapi_router_request')->set('wms',$wms_id)->delivery_search($data); } static public function _get_electron_logi_no($wms_id,&$original_data){ //获取目前支持获取WMS 目前只支持科捷和伊藤忠 境宴和360 $node_type = array('ilc','kejie','cnss','sku360','mixture', 'qimen'); $channel_adapter = app::get('channel')->model('channel'); $is_jitx = kernel::single('ome_order_bool_type')->isJITX($original_data['order_bool_type']); $is_jdlvmi = kernel::single('ome_order_bool_type')->isJDLVMI($original_data['order_bool_type']); $wms_detail = $channel_adapter->dump(array('channel_id'=>$wms_id,'node_id|noequal'=>''),'config'); $wms_detail['config'] = $wms_detail['config'] ? @unserialize($wms_detail['config']) : []; if($original_data['shop_type'] == '360buy' && $is_jdlvmi){ return [true, ['msg'=>'不需要获取']]; } if ($is_jitx) { $is_logi_no = true; // 唯品会合单强制获取一次物流单号,用于更新父发货单和订单上的物流单号为同一个 if ($original_data['is_vop_merge'] && in_array($wms_detail['node_type'],$node_type)) { $original_data['logi_no'] = ''; } } if (kernel::single('ome_security_router',$original_data['shop_type'])->is_encrypt($original_data,'delivery') && is_array($wms_detail['config']['need_encrypt_logistics']) && $wms_detail['config']['need_encrypt_logistics'][$original_data['shop_type']] ) { if (!$original_data['logi_no']) { $dlyCorpObj = app::get('ome')->model('dly_corp'); $dlyCorp = $dlyCorpObj->dump($original_data['logi_id'], 'channel_id'); app::get('ome')->model('dly_corp_channel')->getChannel($dlyCorp, array($original_data)); if (!$dlyCorp['channel_id']) { return [false, ['msg'=>'没有电子面单来源']]; } $waybill = kernel::single('ome_event_trigger_logistics_electron')->directGetWaybill($original_data['delivery_id'], $dlyCorp['channel_id']); if ($waybill['succ']) { $original_data['logi_no'] = $waybill['succ'][0]['logi_no']; } } if($original_data['logi_no']) { foreach($original_data['consignee'] as $k => $v) { if(kernel::single('ome_security_hash')->get_code() == substr($v, -5)) { $original_data['consignee'][$k] = kernel::single('ome_view_helper2')->modifier_ciphertext($v, 'order', $k); } } $waybillExMdl = app::get('logisticsmanager')->model('waybill_extend'); $waybill = app::get('logisticsmanager')->model('waybill')->db_dump(array ('waybill_number' => $original_data['logi_no']), 'id'); if (!$waybill) { return [false, ['msg'=>'电子面单查询失败']]; } $original_data['waybill_extend'] = $waybillExMdl->db_dump(array ('waybill_id' => $waybill['id'])); } else { return [false, ['msg'=>'电子面单获取失败']]; } return [true, ['msg'=>'电子面单获取成功']]; } if($original_data['logi_no'] && $is_jitx){ $waybillExMdl = app::get('logisticsmanager')->model('waybill_extend'); // 判断大头笔 $waybill = app::get('logisticsmanager')->model('waybill')->dump(array ('waybill_number' => $original_data['logi_no'])); if (!$waybill) { return [false, ['msg'=>'大头笔获取失败']]; } $waybillEx = $waybillExMdl->dump(array ('waybill_id' => $waybill['id'])); if (!$waybillEx) { $corp = app::get('ome')->model('dly_corp')->dump($original_data['logi_id'], 'channel_id'); $data = kernel::single('erpapi_router_request')->set('logistics', $corp['channel_id'])->electron_waybillExtend($original_data); if ($data) { $waybillEx = array ( 'waybill_id' => $waybill['id'], 'position_no' => $data['position_no'], 'json_packet' => $data['json_packet'], ); $waybillExMdl->save($waybillEx); } } } return [true, ['msg'=>'处理完成']]; } static public function cancelYJDF($orderId, $bmIds) { $rows = app::get('ome')->model('delivery_items_detail') ->getList('delivery_id', array('order_id'=>$orderId,'product_id'=>$bmIds)); if(empty($rows)){ return array(false, '没有发货单'); } $dly = app::get('ome')->model('delivery')->getList('delivery_id,delivery_bn,branch_id', array('delivery_id'=>array_map('current', $rows), 'process'=>'true','parent_id'=>'0')); if(empty($dly)) { return array(false, '没有已发货的发货单'); } $wmsType = array(); foreach ($dly as $v) { if(!isset($wmsType[$v['branch_id']])) { $wmsType[$v['branch_id']] = kernel::single('ome_branch')->getNodetypBybranchId($v['branch_id']); $wmsType[$v['branch_id']] || $wmsType[$v['branch_id']] = ''; } if($wmsType[$v['branch_id']] == 'yjdf') { ome_delivery_notice::cancel($v, false); } } } /** * [京东云交易]通知提前发货 * * @param int $delivery_id * @return boolean */ static public function notification($delivery_id, &$error_msg=null) { $deliveryObj = app::get('ome')->model('delivery'); $branchLib = kernel::single('ome_branch'); //发货单信息 $deliveryInfo = $deliveryObj->dump(array('delivery_id'=>$delivery_id), 'delivery_id,delivery_bn,branch_id,wms_channel_id'); if(empty($deliveryInfo)){ $error_msg = '没有发货单信息'; return false; } if(!self::isAutoNoticeWms($delivery_id)) { $error_msg = '订单未备货,不能推送'; return false; } //branch_bn $branch_bn = $branchLib->getBranchBnById($deliveryInfo['branch_id']); //channel_id $channel_id = $branchLib->getWmsIdById($deliveryInfo['branch_id']); //params $params = array( 'delivery_id' => $deliveryInfo['delivery_id'], 'delivery_bn' => $deliveryInfo['delivery_bn'], 'branch_id' => $deliveryInfo['branch_id'], 'branch_bn' => $branch_bn, 'wms_channel_id' => $deliveryInfo['wms_channel_id'], ); //request $result = kernel::single('erpapi_router_request')->set('wms', $channel_id)->delivery_makedly($params); return $result; } static public function notify($delivery_id) { $deliveryMdl = app::get('ome')->model('delivery'); $deliverys = $deliveryMdl->db_dump(array('delivery_id'=>$delivery_id),'branch_id,delivery_bn,status,shop_id,shop_type,wms_status,delivery_time,sync_status'); if(empty($deliverys)) return true; $deliveryOrderModel = app::get('ome')->model('delivery_order'); $deliveryorder = $deliveryOrderModel->getList('order_id',array('delivery_id'=>$delivery_id)); $orderIds =array_map('current',$deliveryorder); $orderMdl = app::get('ome')->model('orders'); $orders = $orderMdl->getlist('order_bn,shop_id,order_bool_type',array('order_id'=>$orderIds,'createway'=>'matrix','order_bool_type'=>ome_order_bool_type::__JDLVMI_CODE)); if(empty($orders)) return true; $status_value = ome_wms::$wms_status; $status = $deliverys['status']; if($deliverys['wms_status']=='0' && in_array($deliverys['sync_status'],array('0','1'))){ // $status = 'unsync'; } $status_value = $status_value[$status]; if(!$status_value) return true; if($deliverys['wms_status'] == end($status_value)) return true; //等于最后一个就不回写了 if($deliverys['wms_status']!='0'){ $key = array_search($deliverys['wms_status'], $status_value);//截取已经回写状态位 if($key){ $status_value = array_slice($status_value, $key+1); } } foreach($orders as $v){ $order_bool_type = $v['order_bool_type']; $is_jdlvmi = kernel::single('ome_order_bool_type')->isJDLVMI($order_bool_type); if(!$is_jdlvmi) continue; $time = time(); foreach($status_value as $sv){ $sdf = array( 'order_bn' => $v['order_bn'], 'status' => $sv, 'branch_id' => $deliverys['branch_id'], 'delivery_time' =>$deliverys['delivery_time'], 'operatetime' =>$time, ); $time=$time+5; $rs = kernel::single('erpapi_router_request')->set('shop',$deliverys['shop_id'])->delivery_notify($sdf); if($rs['rsp'] == 'succ'){ $deliveryMdl->db->exec("UPDATE sdb_ome_delivery set wms_status='".$sv."' WHERE delivery_id=".$delivery_id.""); } } } } /** * 需要判断如果是合单都付尾款才可以通知 * */ static public function notify_presale($order_id, &$error_msg=null){ $branchLib = kernel::single('ome_branch'); $orderObj = app::get('ome')->model('orders'); $orders = $orderObj->dump(array('order_id'=>$order_id,'pay_status'=>'1','process_status'=>'splited','order_type'=>'presale'), 'order_id,order_bn,payed,total_amount,paytime'); $logMdl = app::get('ome')->model('operation_log'); if (!$orders) return false; $delivery_list = self::getDeliveryByorderId($order_id); if(empty($delivery_list)){ $error_msg = '没有可操作的发货单'; return false; } $isPrepayed = kernel::single('ome_bill_label_delivery')->isPrepayed($order_id); if(!$isPrepayed){ return true; } //delivery foreach($delivery_list as $delivery) { $branch_id = $delivery['branch_id']; $wms_id = $branchLib->getWmsIdById($branch_id); //wms_id if(empty($wms_id)){ continue; } $delivery_id = $delivery['delivery_id']; //没有提前推送的不打 $isPrepackage = kernel::single('ome_bill_label_delivery')->isPrepackage($delivery_id); if(!$isPrepackage){ continue; } //branch_bn $branch_bn = $branchLib->getBranchBnById($branch_id); //request $data = array( 'delivery_bn' => $delivery['delivery_bn'], 'delivery_id' => $delivery['delivery_id'], 'branch_bn' => $branch_bn, 'order_bn' => $orders['order_bn'], //订单号 'payed' => $orders['payed'], //已付金额 'total_amount' => $orders['total_amount'], //订单总额 'paytime' => ($orders['paytime'] ? $orders['paytime'] : time()), //付款时间 ); $dlyTriggerLib = kernel::single('ome_event_trigger_delivery'); $rs = $dlyTriggerLib->notify($wms_id, $data); $logMdl->write_log('delivery_modify@ome',$delivery_id,"预售订单付尾款推送"); } return true; } static function getDeliveryByorderId($order_id){ $deliveryOrderModel = app::get('ome')->model('delivery_order'); $deliveryorder = $deliveryOrderModel->getList('delivery_id',array('order_id'=>$order_id)); $deliveryIds =array_map('current',$deliveryorder); $SQL= "SELECT d.delivery_id,d.delivery_bn,d.branch_id FROM sdb_ome_delivery as d WHERE d.delivery_id in(".implode(',',$deliveryIds).") AND d.parent_id=0 AND d.status in('succ','ready','progress')"; $delivery_list = $deliveryOrderModel->db->select($SQL); if ($delivery_list){ $delivery_ids = array(); foreach($delivery_list as $v){ $delivery_ids[] = $v['delivery_id']; } return $delivery_list; }else{ return array(); } } }