Files
OMS/app/ome/lib/event/trigger/shop/delivery.php
2025-12-28 23:13:25 +08:00

674 lines
28 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.
*/
/**
* 发货单请求
*
* @category
* @package
* @author chenping<chenping@shopex.cn>
* @version $Id: Z
*/
class ome_event_trigger_shop_delivery
{
protected function _getDelivery($delivery_id){
$deliveryFilter = array('delivery_id'=>$delivery_id,'parent_id'=>'0');
$deliveryModel = app::get('ome')->model('delivery');
$deliveryinfo = $deliveryModel->db_dump($deliveryFilter);
if (!$deliveryinfo) return array();
// 回写节点
if($deliveryinfo['process'] != 'true') {
$rb = app::get('ome')->getConf('ome.delivery.back_node');
if ($rb == 'check') {
if($deliveryinfo['verify'] != 'true') return array();
} elseif ($rb == 'print') {
if ( $deliveryinfo['expre_status'] != 'true' ) return array();
} else {
return array();
}
}
$shipmentLogModel = app::get('ome')->model('shipment_log');
$deliverySuccOrderBn = $shipmentLogModel->getList('orderBn', array('deliveryCode'=>$deliveryinfo['logi_no'], 'status'=>'succ'));
$deliveryinfo['dly_succ_order'] = array_column($deliverySuccOrderBn, 'orderBn');
// 发货单对应的订单
$deliveryOrderModel = app::get('ome')->model('delivery_order');
$deliveryOrderList = $deliveryOrderModel->getList('order_id',array('delivery_id'=>$delivery_id));
$order_ids = array();
foreach ($deliveryOrderList as $key => $value) {
$order_ids[] = $value['order_id'];
}
$orderModel = app::get('ome')->model('orders');
$orderList = $orderModel->getList('*',array('order_id'=>$order_ids));
$deliveryinfo['orders'] = $orderList;
$deliveryinfo['delivery_order'] = $deliveryOrderList;
return $deliveryinfo;
}
public function delivery_confirm_send_fromsub($delivery_id) {
$delivery = app::get('ome')->model('delivery')->dump(array('delivery_id'=>$delivery_id),'parent_id');
$did = $delivery['parent_id'] ? : $delivery_id;
return $this->delivery_confirm_send($did);
}
/**
* 通过发货单信息回打发货状态(发货调用)
*
* @return bool
* @author
**/
public function delivery_confirm_send($delivery_id)
{
$deliveryModel = app::get('ome')->model('delivery');
$delivery = $this->_getDelivery($delivery_id);
if (empty($delivery['logi_no'])) return ['rsp'=>'fail', 'msg'=>'运单号为空'];
if ($delivery['is_bind'] == 'true') { // 合单
$children_delivery_id = array();
$childrednDeliveryList = $deliveryModel->getList('*',array('parent_id'=>$delivery['delivery_id']));
foreach ($childrednDeliveryList as $c_key => $c_delivery) {
$childrednDeliveryList[$c_key]['status'] = $delivery['status'];
$childrednDeliveryList[$c_key]['logi_id'] = $delivery['logi_id'];
$childrednDeliveryList[$c_key]['logi_name'] = $delivery['logi_name'];
$childrednDeliveryList[$c_key]['logi_no'] = $delivery['logi_no'];
$childrednDeliveryList[$c_key]['delivery_cost_actual'] = $delivery['delivery_cost_actual'];
$children_delivery_id[] = $c_delivery['delivery_id'];
}
// 发货单对应的订单
$delivery_orders = array();
$deliveryOrderModel = app::get('ome')->model('delivery_order');
$deliveryOrderList = $deliveryOrderModel->getList('*',array('delivery_id'=>$children_delivery_id));
foreach ($deliveryOrderList as $key => $value) {
$delivery_orders[$value['delivery_id']] = &$orderList[$value['order_id']];
}
$orderModel = app::get('ome')->model('orders');
$rows = $orderModel->getList('*',array('order_id'=>array_keys($orderList)));
foreach ($rows as $key => $value) {
$orderList[$value['order_id']] = $value;
}
foreach ($childrednDeliveryList as $c_delivery) {
if(in_array($delivery_orders[$c_delivery['delivery_id']]['order_bn'], $delivery['dly_succ_order'])) {
continue;
}
$this->_process_retry($c_delivery,$childrednDeliveryList,$delivery_orders);
}
} else {
// 发货单对应的订单
$order = current($delivery['orders']);
$order_id = $order['order_id'];
if(in_array($order['order_bn'], $delivery['dly_succ_order'])) {
return ['rsp'=>'fail', 'msg'=>'已经回写过了'];
}
// 发货单对应的订单
$delivery_orders = [0];
$deliveryOrderModel = app::get('ome')->model('delivery_order');
$deliveryOrderList = $deliveryOrderModel->getList('*',array('order_id'=>$order_id));
foreach ($deliveryOrderList as $key => $value) {
$delivery_orders[$value['delivery_id']] = &$orderList[$value['order_id']];
}
$orderModel = app::get('ome')->model('orders');
$rows = $orderModel->getList('*',array('order_id'=>array_keys($orderList)));
foreach ($rows as $key => $value) {
$orderList[$value['order_id']] = $value;
}
$deliveryList = $deliveryModel->getList('*',array('delivery_id'=>array_keys($delivery_orders)));
$this->_process_retry($delivery,$deliveryList,$delivery_orders);
}
return true;
}
/**
* 通过发货单ID回打发货状态(回打失败重试)
*
* @param Array $orderids
* @return void
* @author
**/
public function delivery_confirm_retry($orderids)
{
if (!$orderids) return false;
$orderModel = app::get('ome')->model('orders');
$returnObj = app::get('ome')->model('return_product');
//orders
$rows = $orderModel->getList('*',array('order_id'=>$orderids));
$orderList = array();
foreach ($rows as $row) {
$orderList[$row['order_id']] = $row;
}
$deliveryOrderModel = app::get('ome')->model('delivery_order');
$deliveryOrderList = $deliveryOrderModel->getList('*',array('order_id'=>$orderids));
if (!$deliveryOrderList) return false;
//获取售后列表
$returnList = $returnObj->getList('return_id,order_id', array('order_id'=>$orderids));
if($returnList){
$returnList = array_column($returnList, null, 'order_id');
}
//delivery_orders
$delivery_orders = array();
foreach ($deliveryOrderList as $key => $value)
{
$order_id = $value['order_id'];
//过滤已经有售后单的订单
if($returnList[$order_id]){
//continue;
}
$delivery_orders[$value['delivery_id']] = $orderList[$value['order_id']];
}
//check
if(empty($delivery_orders)){
return false;
}
$deliveryModel = app::get('ome')->model('delivery');
$deliveryList = $deliveryModel->getList('*',array('delivery_id'=>array_keys($delivery_orders),'process'=>'true','parent_id'=>'0'));
foreach ($deliveryList as $delivery)
{
$delivery_id = $delivery['delivery_id'];
//订单信息
$order_bn = $delivery_orders[$delivery_id]['order_bn'];
if($order_bn && $delivery['logi_no']){
//前端回写日志
$sql = "SELECT log_id,status FROM sdb_ome_shipment_log WHERE orderBn='". $order_bn ."' AND deliveryCode='". $delivery['logi_no'] ."'";
$shipmentInfo = $deliveryModel->db->selectrow($sql);
if($shipmentInfo['status'] == 'succ'){
//[拆单发货]发货单是回写成功状态,则跳过
continue;
}elseif($shipmentInfo){
//删除前端回写日志(不能删除失败的记录,否则重试未请求,失败记录也被删除掉了)
//$deliveryModel->db->exec("DELETE FROM sdb_ome_shipment_log WHERE log_id='". $shipmentInfo['log_id'] ."'");
}
}
kernel::single('ome_event_trigger_logistics_electron')->delivery($delivery['delivery_id']);
if ($delivery['is_bind'] == 'true') {
$childrednDeliveryList = $deliveryModel->getList('*',array('parent_id'=>$delivery['delivery_id']));
foreach ($childrednDeliveryList as $c_key => $c_delivery) {
$childrednDeliveryList[$c_key]['status'] = $delivery['status'];
$childrednDeliveryList[$c_key]['logi_id'] = $delivery['logi_id'];
$childrednDeliveryList[$c_key]['logi_name'] = $delivery['logi_name'];
$childrednDeliveryList[$c_key]['logi_no'] = $delivery['logi_no'];
$childrednDeliveryList[$c_key]['delivery_cost_actual'] = $delivery['delivery_cost_actual'];
}
foreach ($childrednDeliveryList as $c_delivery) {
$this->_process_retry($c_delivery,$childrednDeliveryList,$delivery_orders,true);
}
} else {
$this->_process_retry($delivery,$deliveryList,$delivery_orders,true);
}
}
return true;
}
private function _process_retry($curDelivery,$deliveryList,$delivery_orders,$retry=false)
{
$sdf = kernel::single('ome_event_trigger_shop_data_delivery_router')
->set_shop_id($curDelivery['shop_id'])
->init($deliveryList,$delivery_orders)
->get_sdf($curDelivery['delivery_id']);
if (!$sdf) return;
if ($retry) kernel::single('erpapi_router_request')->set('shop',$curDelivery['shop_id'])->delivery_add($sdf);
kernel::single('erpapi_router_request')->set('shop',$curDelivery['shop_id'])->delivery_logistics_update($sdf);
kernel::single('erpapi_router_request')->set('shop',$curDelivery['shop_id'])->delivery_confirm($sdf);
//是否安装了应用
if(app::get('dchain')->is_installed()) {
//[翱象系统]同步仓库作业信息
$aoxiangLib = kernel::single('dchain_aoxiang');
$isAoxiang = $aoxiangLib->isSignedShop($curDelivery['shop_id'], $curDelivery['shop_type']);
//get config
$aoxiangConfig = $aoxiangLib->getAoxiangSyncConfig($curDelivery['shop_id']);
//只要店铺签约就推送发货单给翱象
if($isAoxiang && $aoxiangConfig['sync_delivery'] != 'false'){
//task队列任务
if (defined('SAAS_COMBINE_MQ') && SAAS_COMBINE_MQ == 'true') {
//sdfdata
$sdfdata = array(
'uniqid' => sprintf('aoxiang_sync_delivery_%s', $curDelivery['delivery_id']),
'shop_id' => $curDelivery['shop_id'],
'delivery_id' => $curDelivery['delivery_id'],
'delivery_bn' => $curDelivery['delivery_bn'],
'process_status' => 'confirm', //accept仓库接单,confirm确认出库
'task_type' => 'aoxiangdelivery',
);
//MQ4服务器执行
taskmgr_func::multiQueue($GLOBALS['_MQ_API_CONFIG'],'TG_API_EXCHANGE','TG_API_QUEUE','tg.sys.api.*', $sdfdata);
}else{
//queue队列任务
$queueMdl = app::get('base')->model('queue');
//自动确认翱象发货单队列任务
$sdfData = array(
'shop_id' => $curDelivery['shop_id'],
'shop_type' => $curDelivery['shop_type'],
'delivery_id' => $curDelivery['delivery_id'],
'delivery_bn' => $curDelivery['delivery_bn'],
'process_status' => 'confirm', //accept仓库接单,confirm确认出库
);
$queueData = array(
'queue_title' => '自动同步翱象发货单状态队列任务',
'start_time' => time(),
'params' => array(
'sdfdata' => $sdfData,
'app' => 'dchain',
'mdl' => 'aoxiang_delivery',
),
'worker'=> 'dchain_delivery.syncAoxiangDelivery',
);
$queueMdl->save($queueData);
}
}
}
}
/**
* 发货单状态变更
*
* @return void
* @author
**/
public function delivery_process_update($deliveryids)
{
$deliveryModel = app::get('ome')->model('delivery');
$rows = $deliveryModel->getList('shop_id,delivery_bn,delivery_id,status,is_bind,logi_id',array('delivery_id'=>$deliveryids));
if (!$rows) return;
$deliveryList = array();
foreach ($rows as $row) {
$deliveryList[$row['delivery_id']] = $row;
}
$deliveryOrderModel = app::get('ome')->model('delivery_order');
$rows = $deliveryOrderModel->getList('*',array('delivery_id'=>$deliveryids));
if (!$rows) return;
$delivery_order = array();
foreach ($rows as $row) {
$delivery_order[$row['order_id']] = $row['delivery_id'];
}
$orderModel = app::get('ome')->model('orders');
$rows = $orderModel->getList('order_id,order_bn,shop_id',array('order_id'=>array_keys($delivery_order)));
if (!$rows) return;
$orderList = array();
foreach ($rows as $row) {
$orderList[$row['order_id']] = $row;
}
foreach ($delivery_order as $order_id => $delivery_id) {
$delivery = $deliveryList[$delivery_id]; $order = $orderList[$order_id];
if ($delivery['is_bind'] == 'true') {
$c_delivery_order = $deliveryOrderModel->getList('*',array('order_id'=>$order_id));
$c_deliveryIds = array();
foreach ($c_delivery_order as $k=>$v) {
$c_deliveryIds[] = $v['delivery_id'];
}
$childDelivery = $deliveryModel->getList('delivery_id,delivery_bn,shop_id',array('delivery_id'=>$c_deliveryIds, 'parent_id'=>$delivery_id),0,1);
$sdf = array(
'delivery_bn' => $childDelivery[0]['delivery_bn'],
'status' => $delivery['status'],
'orderinfo' => array('order_bn'=>$order['order_bn'])
);
kernel::single('erpapi_router_request')->set('shop',$childDelivery[0]['shop_id'])->delivery_deliveryprocess_update($sdf);
} else {
$sdf = array(
'delivery_bn' => $delivery['delivery_bn'],
'status' => $delivery['status'],
'orderinfo' => array('order_bn'=>$order['order_bn'])
);
kernel::single('erpapi_router_request')->set('shop',$delivery['shop_id'])->delivery_deliveryprocess_update($sdf);
}
}
}
/**
* 发货单添加
*
* @return void
* @author
**/
public function delivery_add($delivery_id)
{
$deliveryModel = app::get('ome')->model('delivery');
$deliveryList = $deliveryModel->getList('*',array('delivery_id'=>$delivery_id));
if (!$deliveryList) return;
$delivery = $deliveryList[0];
// 发货单对应的订单
$deliveryOrderModel = app::get('ome')->model('delivery_order');
$deliveryOrderList = $deliveryOrderModel->getList('delivery_id,order_id',array('delivery_id'=>$delivery_id));
$order_ids = array(); $delivery_orders = array();
foreach ($deliveryOrderList as $key => $value) {
$order_ids[] = $value['order_id'];
$delivery_orders[$value['delivery_id']] = &$orderList[$value['order_id']];
}
$orderModel = app::get('ome')->model('orders');
$rows = $orderModel->getList('*',array('order_id'=>$order_ids));
foreach ($rows as $key => $value) {
$orderList[$value['order_id']] = $value;
}
$sdf = kernel::single('ome_event_trigger_shop_data_delivery_router')
->set_shop_id($delivery['shop_id'])
->init($deliveryList,$delivery_orders)
->get_add_delivery_sdf($delivery['delivery_id']);
//通知平台创建发货单
if($sdf){
kernel::single('erpapi_router_request')->set('shop',$delivery['shop_id'])->delivery_add($sdf);
}
//是否安装了应用
if(app::get('dchain')->is_installed()) {
//[翱象系统]同步发货单作业信息
$aoxiangLib = kernel::single('dchain_aoxiang');
$isAoxiang = $aoxiangLib->isSignedShop($delivery['shop_id'], $delivery['shop_type']);
//get config
$aoxiangConfig = $aoxiangLib->getAoxiangSyncConfig($delivery['shop_id']);
//只要店铺签约就推送发货单给翱象
if($isAoxiang && $aoxiangConfig['sync_delivery'] != 'false'){
//task任务队列
if (defined('SAAS_COMBINE_MQ') && SAAS_COMBINE_MQ == 'true') {
//sdfdata
$sdfdata = array(
'uniqid' => sprintf('aoxiang_sync_delivery_%s', $delivery['delivery_id']),
'shop_id' => $delivery['shop_id'],
'delivery_id' => $delivery['delivery_id'],
'delivery_bn' => $delivery['delivery_bn'],
'process_status' => 'accept', //accept仓库接单,confirm确认出库
'task_type' => 'aoxiangdelivery',
);
//MQ4服务器执行
taskmgr_func::multiQueue($GLOBALS['_MQ_API_CONFIG'],'TG_API_EXCHANGE','TG_API_QUEUE','tg.sys.api.*', $sdfdata);
}else{
//queue队列
$queueMdl = app::get('base')->model('queue');
//自动同步翱象发货单队列任务
$sdfData = array(
'shop_id' => $delivery['shop_id'],
'shop_type' => $delivery['shop_type'],
'delivery_id' => $delivery['delivery_id'],
'delivery_bn' => $delivery['delivery_bn'],
'process_status' => 'accept', //accept仓库接单,confirm确认出库
);
$queueData = array(
'queue_title' => '自动同步翱象发货单队列任务',
'start_time' => time(),
'params' => array(
'sdfdata' => $sdfData,
'app' => 'dchain',
'mdl' => 'aoxiang_delivery',
),
'worker'=> 'dchain_delivery.addAoxiangDelivery',
);
$queueMdl->save($queueData);
}
}
}
return true;
}
/**
* 发货单状态变更
*
* @return void
* @author
**/
public function delivery_logistics_update($deliveryids)
{
$deliveryModel = app::get('ome')->model('delivery');
$rows = $deliveryModel->getList('shop_id,delivery_bn,delivery_id,status,is_bind,logi_id,logi_name,logi_no',array('delivery_id'=>$deliveryids));
if (!$rows) return;
$deliveryList = array();
$corpIds = array();
foreach ($rows as $row) {
$deliveryList[$row['delivery_id']] = $row;
$corpIds[] = $row['logi_id'];
}
$corpModel = app::get('ome')->model('dly_corp');
$rows = $corpModel->getList('type,corp_id',array('corp_id'=>$corpIds));
$corps = array();
foreach ($rows as $row) {
$corps[$row['corp_id']] = $row['type'];
}
unset($rows);
$deliveryOrderModel = app::get('ome')->model('delivery_order');
$rows = $deliveryOrderModel->getList('*',array('delivery_id'=>$deliveryids));
if (!$rows) return;
$delivery_order = array();
foreach ($rows as $row) {
$delivery_order[$row['order_id']] = $row['delivery_id'];
}
$orderModel = app::get('ome')->model('orders');
$rows = $orderModel->getList('order_id,order_bn,shop_id',array('order_id'=>array_keys($delivery_order)));
if (!$rows) return;
$orderList = array();
foreach ($rows as $row) {
$orderList[$row['order_id']] = $row;
}
foreach ($delivery_order as $order_id => $delivery_id) {
$delivery = $deliveryList[$delivery_id]; $order = $orderList[$order_id];
if ($delivery['is_bind'] == 'true') {
$c_delivery_order = $deliveryOrderModel->getList('*',array('order_id'=>$order_id));
$c_deliveryIds = array();
foreach ($c_delivery_order as $k=>$v) {
$c_deliveryIds[] = $v['delivery_id'];
}
$childDelivery = $deliveryModel->getList('delivery_id,delivery_bn,shop_id',array('delivery_id'=>$c_deliveryIds, 'parent_id'=>$delivery_id),0,1);
foreach ($childDelivery as $child){
$sdf = array(
'delivery_bn' => $child['delivery_bn'],
'orderinfo' => array('order_bn'=>$order['order_bn']),
'logi_type' => $corps[$delivery['logi_id']],
'logi_name' => $delivery['logi_name'],
'logi_no' => $delivery['logi_no'],
);
kernel::single('erpapi_router_request')->set('shop',$child[0]['shop_id'])->delivery_logistics_update($sdf);
}
} else {
$sdf = array(
'delivery_bn' => $delivery['delivery_bn'],
'orderinfo' => array('order_bn'=>$order['order_bn']),
'logi_type' => $corps[$delivery['logi_id']],
'logi_name' => $delivery['logi_name'],
'logi_no' => $delivery['logi_no'],
);
kernel::single('erpapi_router_request')->set('shop',$delivery['shop_id'])->delivery_logistics_update($sdf);
}
}
}
public function printThirdBill($printDly){
$branchBn = '';
foreach ($printDly as $shopId => $arrDly) {
if(!$branchBn) {
$tmp = current($arrDly);
$branchId = $tmp['branch_id'];
$branchR = app::get('ome')->model('branch_relation')->db_dump(array('branch_id'=>$branchId, 'type'=>'vopczc'));
if($branchR['relation_branch_bn']) {
$branchBn = $branchR['relation_branch_bn'];
} else {
$branch = app::get('ome')->model('branch')->db_dump(array('branch_id'=>$branchId), 'branch_bn');
$branchBn = $branch['branch_bn'];
}
}
$rs = kernel::single('erpapi_router_request')->set('shop', $shopId)->delivery_printThirdBill($arrDly, $branchBn);
if($rs['rsp'] == 'succ') {
$updateData = array(
'process_status' => '1',
'print_status'=>'7',
);
app::get('wms')->model('delivery')->update($updateData, array('delivery_id'=>array_keys($arrDly), 'status'=>array('0')));
$write_log = array();
foreach ($arrDly as $d){
$logMsg ='打印三单' ;
app::get('ome')->model('operation_log')->write_log('delivery_expre@wms', $d['delivery_id'], $logMsg);
}
}
}
}
public function getDeliveryInfo($branchId, $arrDly) {
$branchR = app::get('ome')->model('branch_relation')->db_dump(array('branch_id'=>$branchId, 'type'=>'vopczc'));
if($branchR['relation_branch_bn']) {
$branchBn = $branchR['relation_branch_bn'];
} else {
$branch = app::get('ome')->model('branch')->db_dump(array('branch_id'=>$branchId), 'branch_bn');
$branchBn = $branch['branch_bn'];
}
$primaryBn = uniqid('od');
$write_log = array();
$wms_deliveryObj = app::get('wms')->model('delivery');
$orderDly = array();
foreach ($arrDly as $d){
$write_log[$d['delivery_id']] = array(
'obj_id' => $d['delivery_id'],
'obj_name' => $d['delivery_bn'],
'operation' => 'delivery_getwaybill@ome',
'memo' => "获取运单号请求({$primaryBn})",
);
$order_ids = $wms_deliveryObj->getOrderIdByDeliveryId($d['delivery_id']);
$order_ids = current($order_ids);
$orderDly[$order_ids][] = $d['delivery_id'];
}
$arrOrder = app::get('ome')->model('orders')->getList('order_id, shop_id, order_bn', array('order_id'=>array_keys($orderDly)));
$shopOrder = array();
$bnId = array();
foreach ($arrOrder as $val) {
$shopOrder[$val['shop_id']][] = $val['order_bn'];
$bnId[$val['order_bn']] = $val['order_id'];
}
$billModel = app::get('wms')->model('delivery_bill');
$return = array();
foreach ($shopOrder as $shopId => $arrOrderBn) {
$sdf = array(
'order_bn' => $arrOrderBn,
'branch_bn' => $branchBn,
'primary_bn' => $primaryBn
);
$rs = kernel::single('erpapi_router_request')->set('shop', $shopId)->delivery_getDeliveryInfo($sdf);
if($rs['data']) {
$orderWaybill = $rs['data'];
$allWaybill = array();
foreach ($orderWaybill as $val) {
foreach ($val['delivery_list'] as $v) {
$allWaybill[] = $v['delivery_no'];
}
}
$hasDly = $billModel->getList('logi_no', array('logi_no'=>$allWaybill));
$hasWaybill = array();
foreach ($hasDly as $v) {
$hasWaybill[] = $v['logi_no'];
}
foreach ($orderWaybill as $val) {
$tmpDly = $orderDly[$bnId[$val['order_bn']]];
foreach ($val['delivery_list'] as $v) {
if(in_array($v['delivery_no'], $hasWaybill)){
continue;
}
foreach ($tmpDly as $k => $dlyId) {
$ret = $billModel->update(array('logi_no' => $v['delivery_no']), array('delivery_id' => $dlyId,'type'=>'1'));
unset($tmpDly[$k]);
if($ret) {
$return[$dlyId] = true;
$delivery = $arrDly[$dlyId];
$logiNo = $v['delivery_no'];
$logMsg ='获取物流单号:' . $logiNo;
app::get('ome')->model('operation_log')->write_log('delivery_expre@wms', $dlyId, $logMsg);
}
}
}
}
}
}
return $return;
}
}