0, 'log' => array());
private $orderWeight;
/**
* 符合自动仓库规则
*
* @var array
*/
private $_autobranch = array();
#指定仓无需判库存
private $confirmBranch = false;
#仓库指定物流
private $branchIdCorpId = array();
#合单队列订单
private $combineOrderId = array();
#拆单队列订单
private $splitOrderId = array();
#是否跑拆单
private $isProcessSplit = false;
#仓库分组情况
private $branchGroup = array();
//自动发货标识
private $_isAutoDelivery = false;
//拆分不生成发货单
private $splitNotDly = false;
//门店现货订单
private $isO2oPick = false;
//分销一件代发
private $_is_shopyjdf = false;
#菜鸟的智选物流会返回物流单号
public function setWaybillCode($waybillCode)
{
$this->status['change']['waybillCode'] = $waybillCode;
}
public function getWaybillCode()
{
return $this->status['change']['waybillCode'];
}
/**
* 析构
*
* @param Array $orders 订单组数据
* @return void
*/
public function __construct($orders)
{
$this->original_orders = $orders;
$this->orders = $orders;
$this->orderNums = count($orders);
}
/**
* 获取原始订单内容
*
* @param void
* @return Array
*/
public function getOriginalOrders()
{
return $this->original_orders;
}
/**
* 获取原始订单内容
*
* @param void
* @return Array
*/
public function setOriginalOrders($orders)
{
$this->original_orders=$orders;
}
/**
* 获取订单内容
*
* @param void
* @return Array
*/
public function &getOrders()
{
return $this->orders;
}
/**
* 获取送货地址
*
* @param void
* @return String
*/
public function getShipArea()
{
foreach ($this->orders as $key => $order) {
return $order['ship_area'];
break;
}
}
//获取shop_id
public function getShopId()
{
foreach ($this->orders as $key => $order) {
return $order['shop_id'];
break;
}
}
/**
* 识别是否全渠道订单
*
* @param void
* @return String
*/
public function isOmnichannel()
{
foreach ($this->orders as $key => $order) {
if ($order['omnichannel'] == 1) {
return true;
} else {
return false;
}
break;
}
}
/**
* 获取订单包含的门店信息
*
* @param void
* @return String
*/
public function getStoreInfo()
{
$orderExtendObj = app::get('ome')->model("order_extend");
foreach ($this->orders as $key => $order) {
$storeInfo = $orderExtendObj->dump(array('order_id' => $order['order_id']), 'store_dly_type,store_bn');
return $storeInfo;
break;
}
}
/**
* 设置是否是门店仓
*
* @param void
* @return String
*/
public function setStoreBranch()
{
$this->isStoreBranch = true;
}
/**
* 是否是门店仓
*
* @param void
* @return String
*/
public function isStoreBranch()
{
return $this->isStoreBranch;
}
/**
* 设置门店现货
*
* @param $isO2oPick
*
* @return void
*/
public function setO2oPick($isO2oPick)
{
$this->isO2oPick = $isO2oPick;
}
/**
* 获取门店现货标识
* @return bool
*/
public function getO2oPick()
{
return $this->isO2oPick;
}
/**
* 设置门店的履约方式
*
* @param $type 类型 o2o_pickup 门店自提 o2o_ship 门店配送
* @return String
*/
public function setStoreDlyType($type)
{
$this->storeDlyType = $type;
}
/**
* 获取门店的履约方式
*
* @param void
* @return String
*/
public function getStoreDlyType()
{
return $this->storeDlyType;
}
/**
* 获取订单条数
*
* @param void
* @return Integer
*/
public function getOrderNum()
{
if (empty($this->orders)) {
return 0;
} else {
return count($this->orders);
}
}
/**
* 获取指定字段的值的健的分布
*
* @param String $field 字段名称
* @return array
*/
public function getGroupByField($field)
{
$result = array();
foreach ($this->orders as $order) {
$result[$order[$field]][] = $order['order_id'];
}
return $result;
}
public function updateOrderInfo($arrOrder)
{
$this->orders = $arrOrder;
}
public function setConfirmBranch($bool)
{
$this->confirmBranch = $bool;
}
public function getConfirmBranch()
{
return $this->confirmBranch;
}
public function setBranchIdCorpId($branchIdCorpId)
{
$this->branchIdCorpId = $branchIdCorpId;
}
public function getBranchIdCorpId()
{
return $this->branchIdCorpId;
}
public function setCombineOrderId($arrOrderId)
{
$this->combineOrderId = $arrOrderId;
}
public function setSplitOrderId($arrOrderId)
{
$this->splitOrderId = $arrOrderId;
}
public function setProcessSplit($split = 'split')
{
$this->isProcessSplit = $split;
}
public function getProcessSplit()
{
return $this->isProcessSplit;
}
public function setBranchGroup($branchGroup)
{
$this->branchGroup = $branchGroup;
}
public function getBranchGroup()
{
return $this->branchGroup;
}
/**
* 设置物流公司
*
* @param Array $corp 物流公司信息
* @return void
*/
public function setDlyCorp($corp)
{
$this->status['change']['dlyCorp'] = $corp;
}
/**
* 得到物流公司
*
* @param Array $corp 物流公司信息
* @return void
*/
public function getDlyCorp()
{
return $this->status['change']['dlyCorp'];
}
public function setSubWaybillCode($subWaybillCodeArr)
{
$this->status['change']['subWaybillCode'] = $subWaybillCodeArr;
}
public function getSubWaybillCode()
{
return $this->status['change']['subWaybillCode'];
}
/**
* 设置仓库规则
*
* @return void
* @author
*/
public function setAutoBranch($autobranch)
{
$this->_autobranch = $autobranch;
}
/**
* 得到仓库规则
*
* @return void
* @author
*/
public function getAutoBranch()
{
return $this->_autobranch;
}
/**
* 设置仓库
*
* @param Integer $branchId
* @return void
*/
public function setBranchId($branchId)
{
$this->status['change']['branchId'] = $branchId;
}
/**
* 获取已经设定的仓库编号
*
* @param void
* @return Integer
*/
public function getBranchId()
{
return $this->status['change']['branchId'];
}
public function setDeliveryStatus($deliveryStatus)
{
$this->status['change']['deliveryStatus'] = $deliveryStatus;
}
public function getDeliveryStatus()
{
return $this->status['change']['deliveryStatus'];
}
/**
* 设置指定订单的提示状态
*
* @param Integer $oId 订单ID
* @param Integer $status 要设置的订单提示状态
* @return void
*/
public function setOrderStatus($oId, $status)
{
if ($oId == '*') {
foreach ($this->orders as $oid => $order) {
$this->setOrderStatus($oid, $status);
}
} else {
if ($this->orders[$oId]['pay_status'] == 0) {
return;
}
if (isset($this->orderStatus[$oId])) {
$this->orderStatus[$oId] = $this->orderStatus[$oId] | $status;
} else {
$this->orderStatus[$oId] = $status;
}
}
}
/**
* 设置指定插件的检查结果
*
* @param Integer $optStatus 检查结果
* @param String $plugFix 插件名
* @return void
*/
public function setStatus($optStatus, $plugFix, $msg='')
{
//$optStatus = intval($optStatus);
$this->status['opt'] = $this->status['opt'] > $optStatus ? $this->status['opt'] : $optStatus;
$this->status['log'][] = array('plug' => $plugFix, 'result' => $optStatus, 'msg'=>$msg);
}
//设置拆分不生成发货单
public function setSplitNotDly($bool) {
$this->splitNotDly = $bool;
}
/**
* 验证状态
*
* @return void
* @author
**/
public function validStatus()
{
return $this->status['opt'] != self::__OPT_ALLOW ? false : true;
}
public function getStatus()
{
return $this->status;
}
/**
* 检查订单组内容是否有效
*
* @param Array $orders 订单组
* @return Boolean
*/
public function vaild($config)
{
$autoDelivery = $config['autoConfirm'];
if (($this->status['opt'] == self::__OPT_ALLOW || empty($this->status['opt'])) && ($autoDelivery == '1')) {
if ($this->combineOrderId) {
foreach ($this->combineOrderId as $orderId) {
if ($this->orders[$orderId]) {
unset($this->orders[$orderId]);
}
}
}
if ($this->splitOrderId) {
if (!$this->isProcessSplit) {
foreach ($this->splitOrderId as $orderId) {
if ($this->orders[$orderId]) {
unset($this->orders[$orderId]);
}
}
}
}
if (empty($this->orders)) {
return false;
}
return true;
} else {
$this->setSplitOrderId(array());
$this->setCombineOrderId(array());
return false;
}
}
/**
* 检查是否有效的缓存订单组内容
*
* @param Array $orders 订单组s
* @return Boolean
*/
public function vaildBufferGroup($bufferTime)
{
$payStatus = $this->getGroupByField('pay_status');
$codStatus = $this->getGroupByField('is_cod');
if(kernel::single('ome_order_func')->checkPresaleOrder()){
//多是未支付,且不为货到付款,返回 false
if (count($payStatus) == 1 && (isset($payStatus[0]) || isset($payStatus[2]) ) && !isset($codStatus['true'])) {
return false;
}
if(count($payStatus) == 1 && isset($payStatus[3]) && !isset($codStatus['true'])){
foreach ($payStatus as $pay => $ordes) {
foreach ($ordes as $orderId) {
if ($this->orders[$orderId]['step_trade_status'] !='FRONT_PAID_FINAL_NOPAID') {
return false;
}else{
return true;
}
}
}
}
}else{
//多是未支付,且不为货到付款,返回 false
if (count($payStatus) == 1 && (isset($payStatus[0]) || isset($payStatus[2]) || isset($payStatus[3])) && !isset($codStatus['true'])) {
return false;
}
}
//检查时间,正确应为 cod 为 createtime, 非 cod 为 支付时间,目前没有支付时间,暂用 createtime 判断
if (!isset($codStatus['true'])) {
//款到发货,需有一个已付款订单的支付时间已大于缓冲时间
foreach ($payStatus as $pay => $ordes) {
if ($pay == 1 || $pay == 4 || $pay == 5) {
foreach ($ordes as $orderId) {
if ($this->orders[$orderId]['paytime'] < $bufferTime) {
return true;
}
}
}
}
} else {
//货到付款,需有一个订单创建时间已经过缓冲时间
foreach ($this->orders as $order) {
if ($order['createtime'] < $bufferTime) {
return true;
}
}
}
return false;
}
/**
* 对当前结果进行处理
*
* @param void
* @return boolean
*/
public function process($config)
{
if ($this->vaild($config)) {
$bgData = $this->getBranchGroup();
if($this->splitNotDly) {
foreach ($this->orders as $order) {
$return = $this->_processSplitNotDly($config, $order);
}
} elseif ($bgData) {
$return = $this->_processBranchGroupConfirm($config);
} else {
$return = $this->_processConfirm($config);
}
//虚拟商品拆单后自动完成发货
$auto_dly = $this->isAutoDelivery();
if($return && $auto_dly){
$queueObj = app::get('base')->model('queue');
foreach ($this->orders as $order)
{
$order_id = $order['order_id'];
$order_bn = $order['order_bn'];
//[队列]生成发货单,自动完成发货
$queueData = array(
'queue_title' => '订单号['. $order_bn .']虚拟货品自动完成发货',
'start_time' => time(),
'params' => array(
'sdfdata' => array('order_id'=>$order_id, 'order_bn'=>$order_bn),
'app' => 'ome', //随便写,不用此参数
'mdl' => 'orders' //随便写,不用此参数
),
'worker'=>'ome_order.auto_delivery',
);
$queueObj->save($queueData);
}
}
} else {
$return = $this->_processDispatch($config);
}
if ($this->combineOrderId) {
kernel::single('ome_batch_log')->combineAgain($this->combineOrderId);
}
if ($this->splitOrderId) {
kernel::single('ome_batch_log')->split($this->splitOrderId);
}
return $return;
}
private function _processSplitNotDly($config, $order) {
list($rs, $msg) = kernel::single('ome_order_platform_split')->dealOrderObjects($order, $split_status);
if(!$rs) {
$logMsg = sprintf('订单拆分失败:%s,审单规则:%s(%s),仓库规则:%s(%s)', $msg, $config['confirmName'], $config['confirmId'], (string) $this->_autobranch['name'], $this->_autobranch['tid'] ? $this->_autobranch['tid'] : '-');
app::get('ome')->model('operation_log')->write_log('order_confirm@ome', $order['order_id'], $logMsg);
return false;
}
$sdf = array(
'order_id' => $order['order_id'],
'confirm' => 'Y',
'dispatch_time' => time(),
);
$dispacthUser = omeauto_auto_dispatch::getAutoDispatchUser($this);
if ($dispacthUser['group_id']) {
$sdf['group_id'] = $dispacthUser['group_id'];
$sdf['op_id'] = $dispacthUser['op_id'];
}
if ($split_status == 'splited') {
$cTxt = '确认';
} else {
$cTxt = '部分确认';
}
$orderObj = app::get('ome')->model('orders');
$orderObj->save($sdf);
$curOpInfo = kernel::single('ome_func')->getDesktopUser();
$logMsg = sprintf('订单%s,操作员:%s,审单规则:%s(%s),仓库规则:%s(%s)', $cTxt, $curOpInfo['op_name'], $config['confirmName'], $config['confirmId'], (string) $this->_autobranch['name'], $this->_autobranch['tid'] ? $this->_autobranch['tid'] : '-');
app::get('ome')->model('operation_log')->write_log('order_confirm@ome', $order['order_id'], $logMsg);
return true;
}
private function _processBranchGroupConfirm($config)
{
$bgData = $this->getBranchGroup();
$bgData = current($bgData);
$orders = $this->orders;
foreach ($bgData['branch_product'] as $bId => $bmNum) {
$this->setBranchId($bId);
if ($bgData['branch_corp'][$bId]) {
$corp = array('corp_id' => $bgData['branch_corp'][$bId]);
$this->setDlyCorp($corp);
}
$tmpOrders = array();
foreach ($orders as $orderId => $order) {
foreach ($order['objects'] as $objId => $object) {
foreach ($object['items'] as $itemId => $item) {
$bpNum = $bmNum[$item['product_id']];
if ($bpNum < 1) {
continue;
}
if ($item['nums'] < 1 || $item['delete'] != 'false') {
unset($orders[$orderId]['objects'][$objId]['items'][$itemId]);
continue;
}
if (!$tmpOrders[$orderId]) {
$tmpOrders[$orderId] = $order;
unset($tmpOrders[$orderId]['objects']);
}
if (!$tmpOrders[$orderId]['objects'][$objId]) {
$tmpOrders[$orderId]['objects'][$objId] = $object;
unset($tmpOrders[$orderId]['objects'][$objId]['items']);
}
if ($bpNum < $item['nums']) {
$orders[$orderId]['objects'][$objId]['items'][$itemId]['nums'] -= $bpNum;
$num = $bpNum;
$bmNum[$item['product_id']] = 0;
} else {
$bmNum[$item['product_id']] -= $item['nums'];
$num = $item['nums'];
unset($orders[$orderId]['objects'][$objId]['items'][$itemId]);
}
$item['nums'] = $num;
$tmpOrders[$orderId]['objects'][$objId]['items'][$itemId] = $item;
}
if (empty($orders[$orderId]['objects'][$objId]['items'])) {
unset($orders[$orderId]['objects'][$objId]);
}
}
if (empty($orders[$orderId]['objects'])) {
unset($orders[$orderId]);
}
}
if (empty($tmpOrders)) {
continue;
}
$this->updateOrderInfo($tmpOrders);
$this->_processConfirm($config);
}
return true;
}
private function _processConfirm($config)
{
$curOpInfo = kernel::single('ome_func')->getDesktopUser();
$systemUser = omeauto_auto_dispatch::getSystemUser();
$deliveryInfos = $this->fetchDeliveryFormat();
$ids = array();
$deliveryObj = app::get('ome')->model("delivery");
$orderObj = app::get('ome')->model("orders");
$oOperation_log = app::get('ome')->model('operation_log');
$deliveryid_nums = count($deliveryInfos);
#本次发货单数量,如果大于1,就是属于合单的,合单的发货单,不能传物流单号,因为物流单号表字段唯一,会导致生成单据只能保存进一个子发货单
if ($deliveryid_nums > 1) {
$waybillCode = null;
$subWaybillCode = null;
} else {
$waybillCode = $this->getWaybillCode();
$subWaybillCode = $this->getSubWaybillCode();
}
$orderBranch = [];
$shop_types = [];
$orderIds = [];
foreach ($deliveryInfos as $orderId => $deliveryInfo) {
if ($orderId && $orderId > 0) {
$order_items = $deliveryInfo['order_items'];
$deliveryInfo['delivery_waybillCode'] = $waybillCode; #菜鸟的智选物流会返回物流单号
$deliveryInfo['delivery_sub_waybillCode'] = $subWaybillCode;
unset($deliveryInfo['order_items']);
$split_status = '';
$result = $deliveryObj->addDelivery($orderId, $deliveryInfo, array(), $order_items, $split_status);
if ($result['rsp'] == 'succ') {
$orderBranch[$orderId] = $deliveryInfo['branch_id'];
$deliveryid = $result['data'];
$ids[] = $deliveryid;
$shop_types[] = $deliveryInfo['shop_type'];
$orderIds[] = $orderId;
//更新订单信息
$sdf = array(
'order_id' => $orderId,
'process_status' => $split_status ? $split_status : 'splited',
'confirm' => 'Y',
'dispatch_time' => time(),
'op_id' => $systemUser['op_id'],
'logi_no' => $this->getWaybillCode() ? $this->getWaybillCode() : '', #菜鸟智选物流,会返回物流单号,保存到订单上
'group_id' => $systemUser['group_id'],
'splited_num_upset_sql' => 'IF(`splited_num` IS NULL, 1, `splited_num` + 1)',
'auto_status' => '0',
);
if ($sdf['process_status'] == 'splited') {
$dispacthUser = omeauto_auto_dispatch::getAutoDispatchUser($this);
if ($dispacthUser['group_id']) {
$sdf['group_id'] = $dispacthUser['group_id'];
$sdf['op_id'] = $dispacthUser['op_id'];
}
$cTxt = '确认';
} else {
$cTxt = '部分确认';
}
$orderObj->save($sdf);
$opInfo = kernel::single('ome_func')->get_system();
if ($this->isStoreBranch) {
$logMsg = "订单" . $cTxt . ",操作员:" . $curOpInfo['op_name'];
} else {
$logMsg = sprintf('订单%s,操作员:%s,审单规则:%s(%s),仓库规则:%s(%s)', $cTxt, $curOpInfo['op_name'], $config['confirmName'], $config['confirmId'], (string) $this->_autobranch['name'], $this->_autobranch['tid'] ? $this->_autobranch['tid'] : '-');
}
$get_dly_bn = $deliveryObj->getList('delivery_id, delivery_bn', array('delivery_id' => $deliveryid), 0, 1);
$get_dly_bn = $get_dly_bn[0];
$logMsg .= sprintf('(发货单号:%s)', $deliveryid, $get_dly_bn['delivery_bn']);
$oOperation_log->write_log('order_confirm@ome', $orderId, $logMsg, null, $opInfo);
unset($logMsg);
//标记当前门店履约订单已分派
if ($this->isStoreBranch) {
kernel::single('ome_o2o_performance_orders')->updateProcessStatus($orderId, 'confirm');
}
// 全链路审单/通知配货回流
kernel::single('ome_event_trigger_shop_order')->order_message_produce(array($orderId),['check','to_wms']);
} elseif ($result['rsp'] == 'fail') {
if (!in_array($result['msg'], array('明细已经生成发货单'))) {
if ($this->isProcessSplit) {
if (!in_array($orderId, $this->splitOrderId)) {
$this->splitOrderId[] = $orderId;
}
} else {
if (!in_array($orderId, $this->combineOrderId)) {
$this->combineOrderId[] = $orderId;
}
}
}
$oOperation_log->write_log('order_confirm@ome',$orderId,'路由失败:' . $result['msg']);
app::get('ome')->model('order_extend')->addRouterNum($orderId);
}
}
}
//如果物流公司是当当物流不可以合并发货单
$dly_corp = app::get(omeauto_auto_combine::__ORDER_APP)->model('dly_corp')->dump(array('corp_id' => $this->status['change']['dlyCorp']['corp_id']), 'type');
$combine_select = app::get('ome')->getConf('ome.combine.select');
$_isCombine = true;
// if (in_array('vop',$shop_types) && $_SERVER['SERVER_NAME'] !='crocs.erp.taoex.com') {
// $_isCombine = false;
// }
if ($dly_corp['type'] == 'DANGDANG' || $dly_corp['type'] == 'AMAZON' || $combine_select == '1'
|| !kernel::single('ome_branch')->isCanMerge($this->getBranchId())) {
$_isCombine = false;
}
//分销一件代发的店铺,不允许合单
if($this->_is_shopyjdf === true){
$_isCombine = false;
}
$waybillCode = $this->getWaybillCode();
//合并发货单
if (!empty($ids) && count($ids) > 1 && $_isCombine) {
//多个订单合并审核,合并发货单
$newdly_id = $deliveryObj->merge($ids, array('logi_no' => $this->getWaybillCode(), 'logi_id' => $this->status['change']['dlyCorp']['corp_id'], 'logi_name' => $this->status['change']['dlyCorp']['name']));
//标识合单
kernel::single('ome_bill_label')->markBillLabel($newdly_id, '', 'SOMS_COMBINE_ORDER', 'ome_delivery');
foreach ($orderIds as $order_id) {
kernel::single('ome_bill_label')->markBillLabel($order_id, '', 'SOMS_COMBINE_ORDER', 'order', $err, 0);
}
//发货单通知单推送仓库
ome_delivery_notice::create($newdly_id);
if ($waybillCode) {
$deliveryObj->db->exec("UPDATE sdb_ome_delivery SET logi_no='" . $waybillCode . "' WHERE delivery_id=" . $newdly_id);
}
} else {
//发货单通知单推送仓库
foreach ($ids as $newdly_id) {
ome_delivery_notice::create($newdly_id);
if ($waybillCode) {
$deliveryObj->db->exec("UPDATE sdb_ome_delivery SET logi_no='" . $waybillCode . "' WHERE delivery_id=" . $newdly_id);
}
}
}
// todo maxiaochen 得物品牌直发 请求接单接口,如果检测到有取消的发货单,则先调用发货仓修改接口
$this->_dewu_afterAddDelivery($orderBranch);
$return = true;
return $return;
}
private function _processDispatch($config)
{
$curOpInfo = kernel::single('ome_func')->getDesktopUser();
//需要重新获取分组规则,所以将拆单插件更改的明细重置回来
$this->updateOrderInfo($this->original_orders);
$dispacthUser = omeauto_auto_dispatch::getAutoDispatchUser($this);
$orderIds = array_keys($this->orders);
$orderObj = app::get('ome')->model("orders");
$oOperation_log = app::get('ome')->model('operation_log');
foreach ($this->orders as $order) {
// 检测京东订单是否有微信支付先用后付的单据
$use_before_payed = false;
if ($order['shop_type'] == '360buy') {
$labelCode = kernel::single('ome_bill_label')->getLabelFromOrder($order['order_id']);
$labelCode = array_column($labelCode, 'label_code');
$use_before_payed = kernel::single('ome_order')->canDeliveryFromBillLabel($labelCode);
}
if ($order['pay_status'] == '1' || $order['pay_status'] == '4' || $order['pay_status'] == '5' || $order['is_cod'] == 'true' || $use_before_payed) {
$sdf = array('order_id' => $order['order_id']);
$isSplit = false;
$modelItems = app::get('ome')->model('order_items');
$itemFilter = array('order_id' => $order['order_id'], 'split_num|than' => 0, 'disable' => 'false');
if ($modelItems->db_dump($itemFilter, 'item_id')) {
$isSplit = true;
}
if (isset($this->orderStatus[$order['order_id']])) {
$processStatus = $isSplit ? 'splitting' : 'unconfirmed';
$sdf['op_id'] = (int)$dispacthUser['op_id'];
$sdf['group_id'] = (int)$dispacthUser['group_id'];
$sdf['confirm'] = $processStatus == 'unconfirmed' ? 'N' : 'Y';
$sdf['process_status'] = $processStatus;
$sdf['dispatch_time'] = time();
$sdf['auto_status'] = $this->orderStatus[$order['order_id']];
} else {
$sdf['op_id'] = (int)$dispacthUser['op_id'];
$sdf['group_id'] = (int)$dispacthUser['group_id'];
$sdf['dispatch_time'] = time();
$sdf['confirm'] = 'Y';
$sdf['process_status'] = $isSplit ? 'splitting' : 'confirmed';
}
if ($sdf['order_id'] && $sdf['order_id'] > 0) {
// $orderObj->save($sdf);
$affect_row = $orderObj->update($sdf, array('order_id' => $sdf['order_id'], 'process_status|noequal' => 'splited'));
if ($affect_row) {
$opInfo = kernel::single('ome_func')->get_system();
$usersObj = app::get('desktop')->model('users');
$groupsObj = app::get('ome')->model('groups');
$confirm_opname = $usersObj->dump($dispacthUser['op_id'], 'name');
$confirm_opgroup = $groupsObj->dump($dispacthUser['group_id'], 'name');
$logMsg = sprintf('订单自动审单未通过,审单规则:%s(%s),仓库规则:%s(%s),详情见
%s', $config['confirmName'] . '' . var_export($config, 1) . 'order_id:' . var_export($orderIds, 1) . '', $config['confirmId'], (string) $this->_autobranch['name'], $this->_autobranch['tid'] ? $this->_autobranch['tid'] : '-', json_encode($this->status['log'], JSON_UNESCAPED_UNICODE)) . "
";
$logMsg .= "操作员:" . $curOpInfo['op_name'] . "获取订单,订单自动分派给确认组:" . $confirm_opgroup['name'] . ",确认人:" . ($confirm_opname ? $confirm_opname['name'] : '-');
$oOperation_log->write_log('order_dispatch@ome', $sdf['order_id'], $logMsg, null, $opInfo);
unset($logMsg);
kernel::single('ome_order_branch')->preSelect($sdf['order_id']);
}
}
}
}
$return = false;
return $return;
}
/**
* 获取发货单数据格式
*
* @param void
* @return Array
*/
private function fetchDeliveryFormat($consignee = null)
{
$result = array();
$this->delivery_group || $this->delivery_group = $this->getDeliveryGroup();
$this->sms_gorup || $this->sms_gorup = $this->getSendSmsGroup();
foreach ($this->orders as $order) {
//[抖音平台]获取本次拆单使用的渠道ID
$channel_id = $order['channel_id'];
//delivery
$delivery = array('branch_id' => $this->getBranchId(),
'logi_id' => $this->status['change']['dlyCorp']['corp_id'],
'delivery_group' => $this->delivery_group,
'sms_group' => $this->sms_gorup,
'consignee' => ($consignee ? $consignee : $this->getConsignee($order)),
'delivery' => $this->getDeliveryStatus(),
'delivery_items' => array(),
'wms_channel_id' => $channel_id, //WMS渠道ID
);
foreach ($order['objects'] as $obj) {
foreach ($obj['items'] as $item) {
if ($item['delete'] == 'false') {
if ($delivery['delivery_items'][$item['product_id']]) {
$delivery['delivery_items'][$item['product_id']]['number'] += $item['nums'];
} else {
$delivery['delivery_items'][$item['product_id']] = array(
'item_type' => $item['item_type'],
'product_id' => $item['product_id'],
'shop_product_id' => $item['shop_product_id'],
'bn' => $item['bn'],
'number' => $item['nums'],
'product_name' => $item['name'],
'spec_info' => $item['addon'],
);
}
$delivery['order_items'][] = array(
'item_id' => $item['item_id'],
'product_id' => $item['product_id'],
'number' => $item['nums'],
'bn' => $item['bn'],
'product_name' => $item['name'],
'oid' => $obj['oid'],
's_type' => $obj['s_type'],
'obj_id' => $obj['obj_id'],
);
}
}
}
$result[$order['order_id']] = $delivery;
//分销一件代发订单
if($order['betc_id'] && $order['cos_id']){
$this->_is_shopyjdf = true;
}
}
return $result;
}
/**
* 获取发货单分组
*/
public function getDeliveryGroup()
{
$this->initFilters();
foreach ((array) self::$_orderGroups as $tId => $filter) {
if ($filter->vaild($this)) {
return $tId;
}
}
return null;
}
/**
* 检查涉及仓库选择的订单分组对像是否已经存在
*
* @param void
* @return void
*/
private function initFilters()
{
if (self::$_orderGroups === null) {
$filters = kernel::single('omeauto_auto_type')->getDeliveryGroupTypes();
self::$_orderGroups = array();
if ($filters) {
foreach ($filters as $config) {
$filter = new omeauto_auto_group();
$filter->setConfig($config);
self::$_orderGroups[$config['tid']] = $filter;
}
}
}
}
/**
* 获取短信发送分组
*
* @param void
* @return void
* @author
**/
public function getSendSmsGroup()
{
$this->initSmsFilters();
foreach ((array) self::$_smsGroups as $tId => $filter) {
if ($filter->vaild($this)) {
return $tId;
}
}
return null;
}
/**
* 检查涉短信发送分组
*
* @param void
* @return void
*/
private function initSmsFilters()
{
if (self::$_smsGroups === null) {
$filters = kernel::single('omeauto_auto_type')->getAutoSendSmsTypes();
self::$_smsGroups = array();
if ($filters) {
foreach ($filters as $config) {
$filter = new omeauto_auto_group();
$filter->setConfig($config);
self::$_smsGroups[$config['tid']] = $filter;
}
}
}
}
/**
* 获取发货地址信息
*
* @param Array $order 订单数据
* @return Array
*/
private function getConsignee($orders)
{
return array(
'name' => $orders['ship_name'],
'r_time' => $orders['ship_time'],
'mobile' => $orders['ship_mobile'],
'zip' => $orders['ship_zip'],
'area' => $orders['ship_area'],
'telephone' => $orders['ship_tel'],
'email' => $orders['ship_email'],
'addr' => $orders['ship_addr'],
);
}
/**
* 检查是否能生成发货单
*
* @param Void
* @return Boolean
*/
public function canMkDelivery()
{
foreach ($this->orders as $order) {
//增加防并发机制,防止由于操作问题导致的1订单生成2相同发货单的问题
$_inner_key = sprintf("confirm_order_%s", $order['order_id']);
$aData = cachecore::fetch($_inner_key);
if ($aData === false) {
cachecore::store($_inner_key, 'confirmed', 5);
} else {
return false;
}
#增加 splitting、ship_status in('0', '2')
if ($order['status'] != 'active' || $order['pause'] != 'false' || $order['abnormal'] != 'false' || !in_array($order['process_status'], array('unconfirmed', 'confirmed', 'splitting')) || !in_array($order['ship_status'], array('0', '2', '3'))) {
return false; #开启拆单_部分发货、部分退货可继续拆分
}
// 检测京东订单是否有微信支付先用后付的单据
$use_before_payed = false;
if ($order['shop_type'] == '360buy') {
$labelCode = kernel::single('ome_bill_label')->getLabelFromOrder($order['order_id']);
$labelCode = array_column($labelCode, 'label_code');
$use_before_payed = kernel::single('ome_order')->canDeliveryFromBillLabel($labelCode);
}
if($order['pay_status'] == '3' && $order['step_trade_status']== 'FRONT_PAID_FINAL_NOPAID'){
$use_before_payed = kernel::single('ome_order_func')->checkPresaleOrder();
}
if (!$use_before_payed && $order['is_cod'] == 'false' && !in_array($order['pay_status'], array('1', '4', '5'))) {
return false;
}
# [拆单]检查是否还可生成发货单
$oOrder = app::get('ome')->model('orders');
$canSplit = false;
$item_list = $oOrder->getItemBranchStore($order['order_id']);
foreach ((array) $item_list as $il) {
foreach ((array) $il as $var) {
foreach ((array) $var['order_items'] as $v) {
if ($v['left_nums'] > 0) {
$canSplit = true;
}
}
}
}
if ($canSplit == false) {
return false;
}
}
return true;
}
/**
* 生成发货单位
*
* @param Array $consignee 收件人信息
* @return boolean
*/
public function mkDelivery($consignee)
{
$split_status = '';
$returnTxt = array('rsp' => 'succ');
$oOperation_log = app::get('ome')->model('operation_log');
$orderObj = app::get('ome')->model("orders");
$opInfo = kernel::single('ome_func')->getDesktopUser();
$user_id = $opInfo['op_id'];
if($this->splitNotDly) {
foreach ($this->orders as $order) {
list($rs, $msg) = kernel::single('ome_order_platform_split')->dealOrderObjects($order, $split_status);
$log_msg = $split_status == 'splited' ? '订单确认' : '订单部分确认';
if ($consignee['confirmFrom']) {
$log_msg .= '[' . $consignee['confirmFrom'] . ']';
}
if($rs) {
$sdf = array(
'order_id' => $order['order_id'],
'confirm' => 'Y',
'dispatch_time' => time(),
'op_id' => $user_id,
);
$orderObj->save($sdf);
} else {
$log_msg .= '失败:'.$msg;
$returnTxt = ['rsp'=>'fail', 'msg'=>$msg];
}
$oOperation_log->write_log('order_confirm@ome', $order['order_id'], $log_msg);
}
return $returnTxt;
}
if (isset($consignee['memo'])) {
$remark = $consignee['memo'];
unset($consignee['memo']);
} else {
$remark = '';
}
$oper_source = '';
if (isset($consignee['oper_source'])) {
$oper_source = $consignee['oper_source'];
unset($consignee['oper_source']);
}
$deliveryInfos = $this->fetchDeliveryFormat($consignee);
$ids = array();
$deliveryObj = app::get('ome')->model("delivery");
$branchLib = kernel::single('ome_branch');
//此处要增加判断
$deliveryid_nums = count($deliveryInfos);
#本次发货单数量,如果大于1,就是属于合单的,合单的发货单,不能传物流单号,因为物流单号表字段唯一,会导致生成单据只能保存进一个子发货单
if ($deliveryid_nums > 1) {
$delivery_waybillCode = null;
$deliverySubWaybillCode = null;
} else {
$delivery_waybillCode = $this->getWaybillCode();
$deliverySubWaybillCode = $this->getSubWaybillCode();
}
$orderBranch = [];
$orderIds = [];
foreach ($deliveryInfos as $orderId => $deliveryInfo) {
if ($orderId && $orderId > 0) {
$deliveryInfo['memo'] = $remark;
$deliveryInfo['delivery_waybillCode'] = $delivery_waybillCode; #菜鸟的智选物流会返回物流单号
$deliveryInfo['delivery_sub_waybillCode'] = $deliverySubWaybillCode;
$order_items = $deliveryInfo['order_items'];
unset($deliveryInfo['order_items']);
$result = $deliveryObj->addDelivery($orderId, $deliveryInfo, array(), $order_items, $split_status);
if ($result['rsp'] == 'succ') {
$delivery_id = $result['data'];
$ids[] = $delivery_id;
$orderIds[] = $orderId;
$orderBranch[$orderId] = $deliveryInfo['branch_id'];
//更新订单信息
$sdf = array(
'order_id' => $orderId,
'process_status' => $split_status, //addDelivery()中引用值
'confirm' => 'Y',
'dispatch_time' => time(),
'op_id' => $user_id,
'logi_no' => $this->getWaybillCode() ? $this->getWaybillCode() : '', #菜鸟智选物流,会返回物流单号,保存到订单上
'splited_num_upset_sql' => 'IF(`splited_num` IS NULL, 1, `splited_num` + 1)',
);
$orderObj->save($sdf);
//订单部分确认加入发货单号
$log_msg = $split_status == 'splited' ? '订单确认' : '订单部分确认';
if ($consignee['confirmFrom']) {
$log_msg .= '[' . $consignee['confirmFrom'] . ']';
}
$get_dly_bn = $deliveryObj->getList('delivery_id, delivery_bn', array('delivery_id' => $delivery_id), 0, 1);
$get_dly_bn = $get_dly_bn[0];
$log_msg .= $oper_source . '(发货单号:'
. $get_dly_bn['delivery_bn'] . ')';
$oOperation_log->write_log('order_confirm@ome', $orderId, $log_msg, null, $opInfo);
//标记当前门店履约订单已分派
$store_id = $branchLib->isStoreBranch($deliveryInfo['branch_id']);
if ($store_id) {
kernel::single('ome_o2o_performance_orders')->updateProcessStatus($orderId, 'confirm');
}
// 全链路审单/通知配货回流
kernel::single('ome_event_trigger_shop_order')->order_message_produce(array($orderId),['check','to_wms']);
} elseif ($result['rsp'] == 'fail') {
$returnTxt = array('rsp' => 'fail', 'msg' => $result['msg']);
}
}
}
//如果物流公司是当当物流不可以合并发货单
$dly_corp = app::get(omeauto_auto_combine::__ORDER_APP)->model('dly_corp')->dump(array('corp_id' => $this->status['change']['dlyCorp']['corp_id']), 'type');
$combine_select = app::get('ome')->getConf('ome.combine.select');
$_isCombine = true;
if ($dly_corp['type'] == 'DANGDANG' || $dly_corp['type'] == 'AMAZON' || $combine_select == '1') {
$_isCombine = false;
}
$waybillCode = $this->getWaybillCode();
//合并发货单
if (!empty($ids) && count($ids) > 1 && $_isCombine) {
//多个订单合并审核,合并发货单
$newdly_id = $deliveryObj->merge($ids, array('logi_no' => $this->getWaybillCode(), 'logi_id' => $this->status['change']['dlyCorp']['corp_id'], 'logi_name' => $this->status['change']['dlyCorp']['name'], 'memo' => $remark));
//更新运单号
if ($waybillCode) {
$deliveryObj->db->exec("UPDATE sdb_ome_delivery SET logi_no='" . $waybillCode . "' WHERE delivery_id=" . $newdly_id);
}
//标识合单
kernel::single('ome_bill_label')->markBillLabel($newdly_id, '', 'SOMS_COMBINE_ORDER', 'ome_delivery');
foreach ($orderIds as $order_id) {
kernel::single('ome_bill_label')->markBillLabel($order_id, '', 'SOMS_COMBINE_ORDER', 'order', $err, 0);
}
//发货单通知单推送仓库
ome_delivery_notice::create($newdly_id);
} else {
//发货单通知单推送仓库
foreach ($ids as $newdly_id) {
if ($waybillCode) {
//更新运单号
$deliveryObj->db->exec("UPDATE sdb_ome_delivery SET logi_no='" . $waybillCode . "' WHERE delivery_id=" . $newdly_id);
}
ome_delivery_notice::create($newdly_id);
}
}
// todo maxiaochen 得物品牌直发 请求接单接口,如果检测到有取消的发货单,则先调用发货仓修改接口
$this->_dewu_afterAddDelivery($orderBranch);
return $returnTxt;
}
/**
* 获取订单重量
*
* @param Array $order 订单信息
* @return
*/
public function getWeight()
{
if (isset($this->orderWeight)) {
//订单分组使用的是整个重量,拆单取的是拆出来的重量
if (!$this->isProcessSplit) {
return $this->orderWeight;
}
}
$weight = 0;
foreach ($this->orders as $key => $order) {
$order_weight = app::get('ome')->model('orders')->getOrderWeight($order['order_id']);
if ($order_weight == 0) {
$weight = 0;
break;
} else {
$weight += $order_weight;
}
}
$this->orderWeight = $weight;
return $weight;
}
/**
* 获取店铺类型
*
* @param void
* @return String
*/
public function getShopType()
{
foreach ($this->orders as $key => $order) {
return $order['shop_type'];
break;
}
}
#智选物流订单数据
public function get_order_data()
{
#本次所有的合并订单
$combine_order_ids = array_keys($this->orders);
$data = array('main_order_bn' => $this->orders[$combine_order_ids[0]]['order_bn'], 'main_ship_area' => $this->getShipArea(), 'combine_order_ids' => $combine_order_ids); #任取一个合并订单id,做主单order_bn3
return $data;
}
/**
* 设置自动发货
*
* @return String
*/
public function setAutoDelivery()
{
$this->_isAutoDelivery = true;
}
/**
* 是否自动发货
*
* @return String
*/
public function isAutoDelivery()
{
return $this->_isAutoDelivery;
}
// 先调用发货仓修改接口,再去调用接单接口
public function _dewu_afterAddDelivery($orderBranch = [])
{
if (!$orderBranch) {
return true;
}
$order_id_arr = array_keys($orderBranch);
$orderMdl = app::get('ome')->model('orders');
$orderExtMdl = app::get('ome')->model('order_extend');
$branchMdl = app::get('ome')->model('branch');
$oAddressMdl = app::get('ome')->model('return_address');
$orderList = $orderMdl->getList('order_id,order_bool_type,shop_type,shop_id,order_bn', ['order_id|in'=>$order_id_arr, 'shop_type'=>'dewu']);
if (!$orderList) {
return true;
}
$branchList = $branchMdl->getList('branch_id, branch_bn, name', ['skip_permission'=>false, 'branch_id|in'=>array_values($orderBranch)]);
$branchList = array_column($branchList, null, 'branch_id');
$dewuBrandList = $oAddressMdl->getList('branch_bn, contact_id', ['shop_type'=>'dewu']);
$dewuBrandList = array_column($dewuBrandList, null, 'branch_bn');
$orderExtList = $orderExtMdl->getList('extend_field,order_id,platform_logi_no', ['order_id|in'=>$order_id_arr]);
$orderExtList = array_column($orderExtList, null, 'order_id');
foreach ($orderExtList as $ok => $ov) {
if ($ov['extend_field'] && is_string($ov['extend_field'])) {
$ov['extend_field'] = json_decode($ov['extend_field'], 1);
$orderExtList[$ok] = $ov;
}
}
foreach ($orderList as $k => $v) {
if (!kernel::single('ome_order_bool_type')->isDWBrand($v['order_bool_type'])) {
continue;
}
if ($orderExtList[$v['order_id']]['extend_field']['performance_type'] != '3') {
continue;
}
if (!$dewuBrandList[$branchList[$orderBranch[$v['order_id']]]['branch_bn']]) {
continue;
}
$addressInfo = $dewuBrandList[$branchList[$orderBranch[$v['order_id']]]['branch_bn']];
if (!$orderExtList[$v['order_id']]['platform_logi_no']) {
// 接单,虽然接口返回物流单号和承运商,但是不保存,打印发货单的时候统一获取
$res = kernel::single('erpapi_router_request')->set('shop', $v['shop_id'])->order_acceptOrder($v['order_bn'], $addressInfo['contact_id']);
} else {
// 更新仓库
$res = kernel::single('erpapi_router_request')->set('shop', $v['shop_id'])->delivery_changeDeliveryWarehouse($v['order_bn'], $addressInfo['contact_id'], 1);
}
}
return true;
}
}