Files
OMS/app/brush/lib/electron/abstract.php
2025-12-28 23:13:25 +08:00

522 lines
19 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?php
/**
* Copyright © ShopeX http://www.shopex.cn. All rights reserved.
* See LICENSE file for license details.
*/
/**
* @author ykm 2015-12-16
* @describe 电子面单请求前响应后数据处理
*/
abstract class brush_electron_abstract {
protected $preBn;
protected $requestTime;
protected $directRet;
public $channel;
public $delivery;
public $needRequestId;
public $deliveryBnKey;
/**
* 初始化
* @param mixed $params 参数
* @return mixed 返回值
*/
final public function init($params){
$this->requestTime = time();
$this->channel = $params['channel'];
$this->delivery = array();
$this->deliveryBnKey = array();
foreach($params['delivery'] as $dly) {
$this->delivery[] = $dly;
$this->deliveryBnKey[$dly['delivery_bn']] = $dly;
}
}
final protected function request($method, $sdf){
$method = 'electron_' . $method;
$ret = kernel::single('erpapi_router_request')->set('logistics', $this->channel['channel_id'])->$method($sdf);
return $ret;
}
/**
* isExistLogino
* @param mixed $delivery delivery
* @return mixed 返回值
*/
public function isExistLogino($delivery) {
if($delivery['logi_no']) {
$filter = array('channel_id' => $this->channel['channel_id'], 'waybill_number' => $delivery['logi_no']);
$count = app::get('logisticsmanager')->model('waybill')->count($filter);
return $count > 0 ? true : false;
}
return false;
}
private function _dealBufferWaybill($waybill, $delivery) {
$ret = app::get('logisticsmanager')->model('waybill')->update(array('status'=>1), array('id'=>$waybill['id']));
if($ret !== 1) {
return false;
}
$logMsg = $this->_getWriteLogMsg("成功:". $waybill['waybill_number']);
$extendFilter = array(
'logi_id' => $delivery['logi_id'],
'filter_sql' => ' (logi_no is null or logi_no = "") '
);
$ret = kernel::single('brush_logistics')->changeLogistics(array('logi_no' => $waybill['waybill_number']), $delivery['delivery_id'], $logMsg, $extendFilter);
if(!$ret) {
return false;
}
return true;
}
//获取缓存池里的电子面单
/**
* 获取BufferWaybill
* @return mixed 返回结果
*/
public function getBufferWaybill() {
$arrDelivery = array();
foreach($this->delivery as $delivery) {
if (!$this->isExistLogino($delivery)) {
$arrDelivery[] = $delivery;
}
}
$num = count($arrDelivery);
$wFilter = array(
'channel_id' => $this->channel['channel_id'],
'status' => 0
);
$objWaybill = app::get('logisticsmanager')->model('waybill');
$iWhile = 3;
do {
$arrWaybill = $objWaybill->getList('id, waybill_number', $wFilter, 0, $num, 'id asc');
if(count($arrWaybill) < $num) {
$this->bufferGetWaybill();
sleep(1);
$iWhile--;
} else {
$iWhile = 0;
}
} while ($iWhile);
$wbKey = 0;
$notGetWaybill = array();
$getWaybill = array();
$db = kernel::database();
$db->beginTransaction();
foreach($arrDelivery as $delivery) {
if($arrWaybill[$wbKey]) {
$db->exec('SAVEPOINT upBufferWaybill');
$ret = $this->_dealBufferWaybill($arrWaybill[$wbKey], $delivery);
if(!$ret) {
$notGetWaybill[$delivery['delivery_id']] = $delivery['delivery_bn'];
$db->exec('ROLLBACK TO SAVEPOINT upBufferWaybill');
} else {
$delivery['logi_no'] = $arrWaybill[$wbKey]['waybill_number'];
$getWaybill[$delivery['delivery_id']] = $delivery;
}
$wbKey++;
} else {
$notGetWaybill[$delivery['delivery_id']] = $delivery['delivery_bn'];
}
}
$db->commit();
#应对rds对事务处理漏掉sql的情况, 如rds修复可还原到上一版本
$gwDlyIds = array_keys($getWaybill);
$logiNOData = app::get('brush')->model('delivery')->getList('delivery_id,logi_no', array('delivery_id'=>$gwDlyIds));
foreach($logiNOData as $lndVal) {
if(empty($lndVal['logi_no'])) {
$notGetWaybill[$lndVal['delivery_id']] = $getWaybill[$lndVal['delivery_id']]['delivery_bn'];
unset($getWaybill[$lndVal['delivery_id']]);
}
}
return array($getWaybill, $notGetWaybill);
}
//缓存池方式获取电子面单
/**
* bufferGetWaybill
* @return mixed 返回值
*/
public function bufferGetWaybill() {
return $this->request('bufferRequest', null);
}
/**
* deliveryToSdf
* @param mixed $delivery delivery
* @return mixed 返回值
*/
public function deliveryToSdf($delivery) {//各自实现
$sdf = array();
$deliveryIds = array();
foreach($delivery as $dly) {
$deliveryIds[] = $dly['delivery_id'];
}
// 御城河
$order_bns = array();
if ($deliveryIds) {
$orders = $this->getDeliveryOrder($deliveryIds);
foreach ($orders as $order) {
foreach($order['order_info'] as $val) {
// if ($val['shop_type'] == 'taobao' && $val['createway'] == 'matrix')
$order_bns[] = $val['order_bn'];
}
}
}
$sdf['order_bns'] = $order_bns;
return $sdf;
}
private function _getWriteLogMsg($logMsg) {
$bnFlag = $this->preBn ? "(请求日志标识:" . $this->preBn . $this->requestTime .")" : "";
$logMsg = "获取电子面单运单号" . $logMsg . $bnFlag;
return $logMsg;
}
private function _dealDirectResult($params) {
$params['logi_no'] = trim($params['logi_no']);
$objWaybill = app::get('logisticsmanager')->model('waybill');
$arrWaybill = $objWaybill->dump(array('channel_id' => $this->channel['channel_id'], 'waybill_number' => $params['logi_no']),'id,status');
if (!$arrWaybill) {
$arrWaybill = array(
'waybill_number' => $params['logi_no'],
'channel_id' => $this->channel['channel_id'],
'logistics_code' => $this->channel['logistics_code'],
'status' => 1,
'create_time' => time(),
);
$ret = $objWaybill->insert($arrWaybill);
if (!$ret) {
return false;
}
} elseif ($arrWaybill['status'] == '2') {
$objWaybill->update(array('status'=>'1'),array('id'=>$arrWaybill['id']));
} elseif ($arrWaybill['status'] == '1') {
return false;
}
$logMsg = $this->_getWriteLogMsg("成功:". $params['logi_no']);
$ret = kernel::single('brush_logistics')->changeLogistics(array('logi_no' => $params['logi_no']), $params['delivery_id'], $logMsg);
if (!$ret) {
return false;
}
if(!$params['noWayBillExtend']) {
$waybillExtend = array(
'waybill_id' => $arrWaybill['id'],
'mailno_barcode' => $params['mailno_barcode'],
'qrcode' => $params['qrcode'],
'position' => $params['position'],
'position_no' => $params['position_no'],
'package_wdjc' => $params['package_wdjc'],
'package_wd' => $params['package_wd'],
'print_config' => $params['print_config'],
'json_packet' => $params['json_packet'],
);
$waybillExtendModel = app::get('logisticsmanager')->model('waybill_extend');
$filter = array('waybill_id' => $waybillExtend['waybill_id']);
if (!$waybillExtendModel->dump($filter)) {
$ret = $waybillExtendModel->insert($waybillExtend);
} else {
$ret = $waybillExtendModel->update($waybillExtend, $filter);
}
if (!$ret) {
return false;
}
}
return true;
}
/**
* directCallback
* @param mixed $result result
* @return mixed 返回值
*/
public function directCallback($result) {
$waybillCodeArr = array();
if($result && is_array($result)) {
$db = kernel::database();
$db->beginTransaction();
foreach ($result as $val) {
$retData = array();
$retData['delivery_id'] = $val['delivery_id'];
$retData['delivery_bn'] = $val['delivery_bn'];
if($val['succ']) {
$db->exec('SAVEPOINT brush_waybill');
$retData['logi_no'] = $val['logi_no'];
$ret = $this->_dealDirectResult($val);
if ($ret) {
$waybillCodeArr['succ'][] = $retData;
} else {
$db->exec('ROLLBACK TO SAVEPOINT brush_waybill');
$retData['msg'] = '保存失败';
$waybillCodeArr['fail'][] = $retData;
}
} elseif($val['succ'] === false) {
$logMsg = $this->_getWriteLogMsg("失败:" . $val['msg']);
app::get('ome')->model('operation_log')->write_log('delivery_brush_getwaybill@brush', $val['delivery_id'], $logMsg);
$retData['msg'] = $val['msg'];
$waybillCodeArr['fail'][] = $retData;
}
}
$db->commit();
} elseif(!empty($this->needRequestId)) {
$msg = $result ? $result : '请求没有返回结果';
foreach($this->needRequestId as $val) {
$waybillCodeArr['fail'][] = array(
'delivery_id' => $val,
'msg' => $msg
);
}
}
return $waybillCodeArr;
}
//直连请求获取电子面单
/**
* directGetWaybill
* @param mixed $delivery_id ID
* @return mixed 返回值
*/
public function directGetWaybill($delivery_id) {
if(empty($this->delivery)) {
return array(
'rsp' => 'fail',
'doSucc' => 0,
'succ' => array(),
'doFail' => count($delivery_id),
'fail' => array('msg' => '没有发货单')
);
}
$this->directRet = array();
foreach($this->delivery as $delivery) {
$hasDelivery[] = $delivery['delivery_id'];
if(!$this->checkLogisticsChannel($delivery['logi_id'])) {
$this->directRet['fail'][] = array(
'delivery_id' => $delivery['delivery_id'],
'delivery_bn' => $delivery['delivery_bn'],
'msg' => '物流公司已经切换,不能获取'
);
continue;
}
if (!empty($delivery['logi_no']) && $this->isExistLogino($delivery)) {
$this->directRet['succ'][] = array(
'logi_no' => $delivery['logi_no'],
'delivery_id' => $delivery['delivery_id'],
'delivery_bn' => $delivery['delivery_bn']
);
} else {
$delivery['shop'] = $this->getShop($delivery['shop_id']);
$orderList = $this->getDeliveryOrder($delivery['delivery_id']);
foreach ($orderList['order_info'] as $ov) {
$delivery['order_bns'][] = $ov['order_bn'];
}
$needRequest[] = $delivery;
$this->needRequestId[] = $delivery['delivery_id'];
}
}
$noDelivery = array_diff($delivery_id, $hasDelivery);
if($noDelivery) {
foreach($noDelivery as $val) {
$this->directRet['fail'][] = array(
'delivery_id' => $val,
'msg' => '没有该发货单'
);
}
}
if($needRequest) {
$sdf = $this->deliveryToSdf($needRequest);
$back = $this->request('directRequest', $sdf);
$backRet = $this->directCallback($back);
if($backRet['succ']) {
foreach($backRet['succ'] as $val) {
$this->directRet['succ'][] = $val;
}
}
if($backRet['fail']) {
foreach($backRet['fail'] as $val) {
$this->directRet['fail'][] = $val;
}
}
}
$this->directRet['rsp'] = count($this->directRet['fail']) ? 'fail' : 'succ';
$this->directRet['doSucc'] = count($this->directRet['succ']);
$this->directRet['doFail'] = count($this->directRet['fail']);
return $this->directRet;
}
function getChannelExtend(){
static $shop_address;
if(!empty($shop_address)) {
return $shop_address;
}
$extendObj = app::get('logisticsmanager')->model('channel_extend');
$shop_address = $extendObj->dump(array('channel_id'=>$this->channel['channel_id']),'shop_name,province,city,area,address_detail,seller_id,default_sender,mobile,tel,zip,shop_name');
return $shop_address;
}
//获取两条发货单明细
/**
* 获取DeliveryItems
* @param mixed $delivery_id ID
* @return mixed 返回结果
*/
public function getDeliveryItems($delivery_id)
{
static $deliveryItems = array(), $electronProductName = '';
if(empty($deliveryItems)) {
$electronProductName = trim(app::get('ome')->getConf('ome.electron.product.name'));
}
if(!$deliveryItems[$delivery_id]) {
$deliveryItems[$delivery_id] = app::get('brush')->model('delivery_items')->getList('*', array('delivery_id' => $delivery_id),0,2);
if($electronProductName) {
foreach($deliveryItems[$delivery_id] as &$val) {
$val['product_name'] = $electronProductName;
}
}
}
return $deliveryItems[$delivery_id];
}
//获取两条订单明细
/**
* 获取OrderItems
* @param mixed $order_id ID
* @return mixed 返回结果
*/
public function getOrderItems($order_id) {
static $orderItems = array(), $electronProductName = '';
if(empty($deliveryItems)) {
$electronProductName = trim(app::get('ome')->getConf('ome.electron.product.name'));
}
if (!$orderItems[$order_id]) {
$orderItems[$order_id] = app::get('ome')->model('order_items')->getList('*', array('order_id' => $order_id), 0, 2);
if($electronProductName) {
foreach($orderItems[$order_id] as &$val) {
$val['name'] = $electronProductName;
}
}
}
return $orderItems[$order_id];
}
private function setDeliveryOrder($delivery_id) {
$db = kernel::database();
$where = is_array($delivery_id) ? 'd.delivery_id in (' . (implode(',', $delivery_id)) . ')' : 'd.delivery_id = "' . $delivery_id .'"';
$field = 'o.order_id, o.order_bn, o.total_amount, o.shop_id, o.createway, o.shop_type, d.delivery_id';
$sql = 'select '. $field . ' from sdb_brush_delivery_order as d left join sdb_ome_orders as o using(order_id) where ' . $where;
$result = $db->select($sql);
$data = array();
foreach ($result as $k => $v) {
$data[$v['delivery_id']]['order_id'][] = $v['order_id'];
$data[$v['delivery_id']]['order_info'][$v['order_id']] = $v;
}
return $data;
}
/**
* 获取发货订单
* @param Int/Array $delivery_id 发货单ID
* @return 单条/多条
*/
public function getDeliveryOrder($delivery_id) {
static $deliveryOrder = array();
if(is_array($delivery_id)) {
$retArr = array();
foreach($delivery_id as $val) {
if($deliveryOrder[$val]) {
$retArr[$val] = $deliveryOrder[$val];
} else {
$needSet[] = $val;
}
}
if(!empty($needSet)) {
$data = $this->setDeliveryOrder($needSet);
foreach($needSet as $value) {
$deliveryOrder[$value] = $data[$value];
$retArr[$value] = $deliveryOrder[$value];
}
}
return $retArr;
}
if (!$deliveryOrder[$delivery_id]) {
$data = $this->setDeliveryOrder($delivery_id);
$deliveryOrder[$delivery_id] = $data[$delivery_id];
}
return $deliveryOrder[$delivery_id];
}
/**
* 获取物流公司信息
* @param Int $corp_id 物流公司ID
*/
public function getDlyCorp($corp_id) {
static $dlyCorp = array();
if (!$dlyCorp[$corp_id]) {
$dlyCorp[$corp_id] = app::get('ome')->model('dly_corp')->dump(array('corp_id' => $corp_id));
}
return $dlyCorp[$corp_id];
}
/**
* 获得店铺信息
* @param String $shop_id 店铺ID
*/
public function getShop($shop_id) {
static $shop = array();
if (!$shop[$shop_id]) {
$shop[$shop_id] = app::get('ome')->model('shop')->dump(array('shop_id' => $shop_id));
}
return $shop[$shop_id];
}
/**
* 获取订单总额
* @param Int $delivery_id 发货单ID
* @return 总额
*/
public function getOrderTotalAmount($delivery_id){
static $dTotalAmount = array();
if(!$dTotalAmount[$delivery_id]) {
$orderList = $this->getDeliveryOrder($delivery_id);
$totalAmount = 0;
foreach ($orderList['order_info'] as $k => $v) {
$totalAmount += $v['total_amount'];
}
$dTotalAmount[$delivery_id] = $totalAmount;
}
return $dTotalAmount[$delivery_id];
}
public function getGoods($bn) {
static $goods = array();
if(!$goods[$bn]) {
$goods[$bn] = app::get('ome')->model('goods')->getList('*', array('bn' => $bn));
}
return $goods[$bn];
}
#验证物流公司是否是该渠道的
protected function checkLogisticsChannel($logiId) {
static $channelLogistics = array();
if(empty($channelLogistics)) {
$arrLogistics = app::get('ome')->model('dly_corp')->getList('corp_id', array('channel_id'=>$this->channel['channel_id']));
foreach($arrLogistics as $val) {
$channelLogistics[] = $val['corp_id'];
}
}
if(in_array($logiId, $channelLogistics)) {
return true;
} else {
return false;
}
}
}