Files
OMS/app/wms/lib/event/trigger/logistics/electron.php
2025-12-28 23:13:25 +08:00

323 lines
13 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.
*/
class wms_event_trigger_logistics_electron {
private $logIdentifier = '';
//缓存池方式获取电子面单
/**
* bufferGetWaybill
* @param mixed $channelId ID
* @return mixed 返回值
*/
public function bufferGetWaybill($channelId) {
return kernel::single('erpapi_router_request')->set('logistics', $channelId)->electron_bufferRequest(null);
}
//获取缓存池里的电子面单 $allDlyOrBill 为发货单主表或补打单主表信息
/**
* 获取BufferWaybill
* @param mixed $allDlyOrBill allDlyOrBill
* @param mixed $channelId ID
* @param mixed $bill bill
* @return mixed 返回结果
*/
public function getBufferWaybill($allDlyOrBill, $channelId, $bill = false) {
$arrDlyOrBill = array();
foreach($allDlyOrBill as $dlyOrBill) {
if (!$this->isExistLogino($dlyOrBill['logi_no'], $channelId)) {
$arrDlyOrBill[] = $dlyOrBill;
}
}
$num = count($arrDlyOrBill);
$wFilter = array(
'channel_id' => $channelId,
'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($channelId);
sleep(1);
$iWhile--;
} else {
$iWhile = 0;
}
} while ($iWhile);
$wbKey = 0;
$notGetWaybill = array();
$getWaybill = array();
$gwbKey = $bill ? 'b_id' : 'delivery_id';
$db = kernel::database();
foreach($arrDlyOrBill as $dlyOrBill) {
if($arrWaybill[$wbKey]) {
$db->beginTransaction();
$ret = $this->_dealBufferWaybill($arrWaybill[$wbKey], $dlyOrBill, $bill);
if(!$ret) {
$notGetWaybill[$dlyOrBill[$gwbKey]] = $arrWaybill[$wbKey]['waybill_number'];
$db->rollBack();
} else {
$getWaybill[$dlyOrBill[$gwbKey]] = $arrWaybill[$wbKey]['waybill_number'];
$db->commit();
}
$wbKey++;
} else {
$notGetWaybill[$dlyOrBill[$gwbKey]] = false;
}
}
return array($getWaybill, $notGetWaybill);
}
private function _dealBufferWaybill($waybill, $dlyOrBill, $bill) {
$dlyBillObj = app::get('wms')->model('delivery_bill');
$ret = app::get('logisticsmanager')->model('waybill')->update(array('status'=>1), array('id'=>$waybill['id']));
if($ret !== 1) {
return false;
}
if($bill) {
//$ret = app::get('ome')->model('delivery_bill')->update(array('logi_no' => $waybill['waybill_number']), array('log_id' => $dlyOrBill['log_id']));
$ret = $dlyBillObj->update(array('logi_no'=>$waybill['waybill_number']), array('b_id'=>$dlyOrBill['b_id'],'delivery_id'=>$dlyOrBill['delivery_id'],'type'=>2));
} else {
$dlyBillObj->db->exec("update sdb_wms_delivery_bill set logi_no='".$waybill['waybill_number']."' where delivery_id =".$dlyOrBill['delivery_id']." and type = 1 and (logi_no is null or logi_no ='')");
$ret = $dlyBillObj->db->affect_row();
if($ret > 0){
//电子面单获取后顺便请求ome模块更新物流单号
$wms_id = kernel::single('ome_branch')->getWmsIdById($dlyOrBill['branch_id']);
$tmp_data = array(
'delivery_bn' => $dlyOrBill['outer_delivery_bn'],
'logi_no' => $waybill['waybill_number'],
'action' => 'addLogiNo',
);
$res = kernel::single('wms_event_trigger_delivery')->doUpdate($wms_id, $tmp_data, true);
}
}
if($ret !== 1) {
return false;
}
$opLogObj = app::get('ome')->model('operation_log');
$logMsg = "成功:". $waybill['waybill_number'];
$logMsg = $this->_getWriteLogMsg($logMsg, $dlyOrBill['b_id']);
$ret = $opLogObj->write_log('delivery_expre@wms', $dlyOrBill['delivery_id'], $logMsg);
if(!$ret) {
return false;
}
return true;
}
/**
* isExistLogino
* @param mixed $logiNo logiNo
* @param mixed $channelId ID
* @return mixed 返回值
*/
public function isExistLogino($logiNo, $channelId) {
if($logiNo) {
$filter = array('channel_id' => $channelId, 'waybill_number' => $logiNo);
$count = app::get('logisticsmanager')->model('waybill')->count($filter);
return $count > 0 ? true : false;
}
return false;
}
//直连请求获取电子面单
/**
* directGetWaybill
* @param mixed $deliveryId ID
* @param mixed $channelId ID
* @param mixed $billId ID
* @return mixed 返回值
*/
public function directGetWaybill($deliveryId, $channelId, $billId = '') {
$arrDeliveryId = explode(';', $deliveryId);
if($billId) {
$arrBillId = explode(';', $billId);
if(count($arrDeliveryId) > 1) {
return array('dealResult'=>1, 'doFail' => count($arrBillId), 'doSucc' => 0);
}
}
$directRet = array('succ'=>[], 'fail'=>[]);
$channel = app::get('logisticsmanager')->model('channel')->dump(array('channel_id'=>$channelId));
$param = kernel::single('wms_event_trigger_logistics_data_electron_router')
->setChannel($channel)
->directDealParam($arrDeliveryId, $arrBillId);
if($param['succ']) {
foreach($param['succ'] as $succ) {
$directRet['succ'][] = $succ;
}
}
if($param['fail']) {
foreach($param['fail'] as $succ) {
$directRet['fail'][] = $succ;
}
}
if($param['sdf']) {
$back = kernel::single('erpapi_router_request')->set('logistics', $channel['channel_id'])->electron_directRequest($param['sdf']);
$this->logIdentifier = $param['sdf']['primary_bn'];
$backRet = $this->directCallback($back, $param['need_request_id'], $channel);
if ($backRet['succ']) {
foreach ($backRet['succ'] as $val) {
$directRet['succ'][] = $val;
}
}
if ($backRet['fail']) {
foreach ($backRet['fail'] as $val) {
$directRet['fail'][] = $val;
}
}
}
$directRet['doFail'] = count($directRet['fail']);
$directRet['doSucc'] = count($directRet['succ']);
$directRet['dealResult'] = 1;
return $directRet;
}
/**
* directCallback
* @param mixed $result result
* @param mixed $needRequestId ID
* @param mixed $channel channel
* @return mixed 返回值
*/
public function directCallback($result, $needRequestId, $channel) {
$waybillCodeArr = array();
if($result && is_array($result)) {
$db = kernel::database();
foreach ($result as $val) {
$dlyBn = $billId = '';
kernel::single('wms_event_trigger_logistics_data_electron_common')->checkChildRqOrdNo($val['delivery_bn'], $dlyBn, $billId);
$retData = array();
$retData['delivery_id'] = $val['delivery_id'];
if($billId) {
$retData['b_id'] = $billId;
$val['b_id'] = $billId;
$retData['delivery_bn'] = $dlyBn;
} else {
$retData['delivery_bn'] = $val['delivery_bn'];
}
if($val['succ']) {
$db->beginTransaction();
$retData['logi_no'] = $val['logi_no'];
$ret = $this->_dealDirectResult($val, $channel);
if ($ret) {
$db->commit();
$waybillCodeArr['succ'][] = $retData;
} else {
$db->rollBack();
$retData['msg'] = '保存失败:运单号`'.$val['logi_no'].'`可能已被占用';
$waybillCodeArr['fail'][] = $retData;
}
} elseif($val['succ'] === false) {
// $logMsg = $this->_getWriteLogMsg("失败:" . $val['msg'], $billId);
// app::get('ome')->model('operation_log')->write_log('delivery_expre@wms', $val['delivery_id'], $logMsg);
$retData['msg'] = $val['msg'];
$waybillCodeArr['fail'][] = $retData;
}
}
} elseif(!empty($needRequestId)) {
$msg = $result ? $result : '请求没有返回结果';
foreach ($needRequestId as $val) {
$waybillCodeArr['fail'][] = array(
'request_id' => $val,
'msg' => $msg."(请求日志标识:" . $this->logIdentifier .")"
);
}
}
//记录失败请求运单号日志
if (isset($waybillCodeArr['fail'])) {
$filter['delivery_id'] = array_merge(array_column($waybillCodeArr['fail'],'request_id'),array_column($waybillCodeArr['fail'],'delivery_id'));
$logMsg = current($waybillCodeArr['fail'])['msg'];
app::get('ome')->model('operation_log')->batch_write_log('delivery_expre@wms', $filter, $logMsg,time());
}
return $waybillCodeArr;
}
private function _dealDirectResult($params, $channel) {
$params['logi_no'] = trim($params['logi_no']);
$billObj = app::get('wms')->model('delivery_bill');
$deliveryObj = app::get('wms')->model('delivery');
if($params['b_id']) {
$ret = $billObj->update(array('logi_no' => $params['logi_no']), array('delivery_id' => $params['delivery_id'],'b_id'=>$params['b_id']));
} else {
$ret = $billObj->update(array('logi_no' => $params['logi_no']), array('delivery_id' => $params['delivery_id'],'type'=>'1'));
if($ret){
//信息变更更新到oms
$delivery = $deliveryObj->dump(array('delivery_id'=>$params['delivery_id']),'branch_id,outer_delivery_bn');
$wms_id = kernel::single('ome_branch')->getWmsIdById($delivery['branch_id']);
$tmp_data = array(
'delivery_bn' =>$delivery['outer_delivery_bn'],
'logi_no' => $params['logi_no'],
'action' => 'addLogiNo',
);
kernel::single('wms_event_trigger_delivery')->doUpdate($wms_id, $tmp_data, true);
}
}
if (!$ret) {
return false;
}
$logMsg = $this->_getWriteLogMsg("成功:". $params['logi_no'], $params['b_id']);
$ret = app::get('ome')->model('operation_log')->write_log('delivery_expre@wms', $params['delivery_id'], $logMsg);
if (!$ret) {
return false;
}
return true;
}
private function _getWriteLogMsg($logMsg, $billId) {
$curr_op_name = kernel::single('desktop_user')->get_name();
$curr_op_name = $curr_op_name ? $curr_op_name : kernel::single('desktop_user')->get_login_name();
$bnFlag = $this->logIdentifier ? "(请求日志标识:" . $this->logIdentifier .")" : "";
$child = $billId ? '子包裹' . $billId : '';
$logMsg = $curr_op_name."分派," . $child . "获取运单号" . $logMsg . $bnFlag;
return $logMsg;
}
//获取大头笔
public function getWaybillExtend($arrDelivery, $channelId, $arrBill = array()) {
if(count($arrDelivery) > 1 && count($arrBill) > 1) {
return false;
}
$channel = app::get('logisticsmanager')->model('channel')->dump(array('channel_id'=>$channelId));
$param = kernel::single('wms_event_trigger_logistics_data_electron_router')
->setChannel($channel)
->waybillExtendDealParam($arrDelivery, $arrBill);
$notGetWaybillExtend = array();
if($param['sdf']) {
foreach($param['sdf'] as $val) {
$ret = kernel::single('erpapi_router_request')->set('logistics', $channel['channel_id'])->electron_waybillExtend($val);
if($ret['rsp'] == 'fail') {
$notGetWaybillExtend[$val['delivery']['delivery_id']] =$val['delivery']['delivery_bn'];
}
}
if(!empty($arrBill) && empty($notGetWaybillExtend)) {
$param = kernel::single('wms_event_trigger_logistics_data_electron_router')
->setChannel($channel)
->waybillExtendDealParam($arrDelivery);
}
}
if($param['bill_extend_fail']) {
$delivery = $arrDelivery[0];
$notGetWaybillExtend = array($delivery['delivery_id'] => $delivery['delivery_bn']);
}
return $notGetWaybillExtend;
}
}