parentClass = $parentClass; $combine_select = app::get('ome')->getConf('ome.combine.select'); //不自动合单 或者 系统自动审单_加载的插件组 if ($combine_select == '1' || $this->parentClass == 'combine') { $this->_plugins = array('split','checksplitgift', 'routernum', 'pay', 'flag', 'logi', 'branch', 'store', 'abnormal', 'oversold', 'tbgift', 'crm', 'tax', 'arrived','reclogi', 'refundstatus'); } else { $this->_plugins = array('split','checksplitgift', 'routernum', 'pay', 'flag', 'logi', 'member', 'ordermulti', 'ordersingle', 'branch', 'store', 'abnormal', 'oversold', 'tbgift', 'shopcombine', 'crm', 'tax', 'arrived','reclogi', 'refundstatus'); } if (self::getCnf('chkProduct') == 'Y') { $this->_plugins[] = 'product'; } } /** * 订单合并处理 * * @param Array $group 订单组 * @return Mixed * @author hzjsq (2011/3/28) */ public function process($group) { if (!is_array($group) || empty($group)) { return null; } $this->_instanceItemObjectFrom = 'process'; //初始化订单组结构 $this->_instanceItemObject($group); //获取审单规则用到的所有订单分组 $orderFilters = $this->_getAutoOrderFilter(); foreach ($this->_group as $key => $order) { foreach ($orderFilters as $filter) { // 门店现货走系统默认 if ($order->getO2oPick() && !$filter->getDefault()){ continue; } if ($filter->vaild($order)) { //加入订单 $filter->addItem($order); break; } } } //按发组类型开始审单 $result = array('total' => 0, 'succ' => 0, 'fail' => 0); foreach ($orderFilters as $orderGroup) { $ret = $orderGroup->process($this->parentClass); $result['total'] += $ret['total']; $result['succ'] += $ret['succ']; $result['fail'] += $ret['fail']; } return $result; } /** * 订单分派处理 * * @param Array $group 订单组 * @return Mixed * @author hzjsq (2011/3/28) */ public function dispatch($group) { if (!is_array($group) || empty($group)) { return []; } $this->_instanceItemObjectFrom = 'dispatch'; //初始化订单组结构 $this->_instanceItemObject($group); //获取审单规则用到的所有订单分组 $orderFilters = $this->_getAutoOrderFilter(); foreach ($this->_group as $key => $order) { foreach ($orderFilters as $filter) { if ($filter->vaild($order)) { return $filter->getConfig(); break; } } } return []; } /** * 获取所有可用的审单相关订单分组 * * @param void * @return mixed */ private function _getAutoOrderFilter() { $types = kernel::single('omeauto_auto_type')->getAutoOrderTypes(); //[兼容]设置了"虚拟商品拆单规则",则优先使用虚拟拆单规则 $sql = "SELECT sid FROM `sdb_omeauto_order_split` WHERE split_type='virtualsku'"; $splitInfo = kernel::database()->selectrow($sql); if($splitInfo && $types) { foreach($types as $key => $type) { if(empty($type['confirm_config'])){ continue; } //虚拟拆单 $configInfo = unserialize($type['confirm_config']); if($configInfo['split_id'] == $splitInfo['sid']){ unset($types[$key]); array_unshift($types, $type); } } } //设置已配置分组 $filters = array(); foreach ((array) $types as $type) { //生效时间范围 $now_time = time(); $confirm_config = unserialize($type['confirm_config']); if($confirm_config['confirmStartTime'] && $confirm_config['confirmEndTime']){ if($now_time < $confirm_config['confirmStartTime']){ continue; //当前时间小于开始审单时间 } if($now_time > $confirm_config['confirmEndTime']){ continue; //当前时间大于结束审单时间 } } //排除时间范围 if($confirm_config['excludeStartTime'] && $confirm_config['excludeEndTime']){ if($confirm_config['excludeStartTime']<$now_time && $confirm_config['excludeEndTime']>$now_time){ continue; //当前时间在排除审单时间范围内 } } //[注销]获取的审单config字段 unset($type['confirm_config']); $filter = new omeauto_auto_group(); $filter->setConfig($type); $filters[] = $filter; } //增加缺省订单分组 $filter = new omeauto_auto_group(); $filter->setDefault(); $filters[] = $filter; //返回订单组 return $filters; } /** * 生成订单结构 * * @param Array $group * @retun void */ private function _instanceItemObject($group) { //准备数据 $ids = $this->_mergeGroup($group); $rows = app::get(self::__ORDER_APP)->model('orders')->getList('*', array('order_id' => $ids, 'process_status' => array('unconfirmed', 'confirmed', 'splitting', 'remain_cancel'))); if (!$rows) { return; } $orders = []; foreach ($rows as $order) { //[标识]是否系统自动审单 if ($this->parentClass == 'combine') { $order['is_sys_auto_combine'] = true; } // 检测京东订单是否有微信支付先用后付的单据 $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(); } $isAuto = ($order['pay_status'] == '1' || $order['is_cod'] == 'true' || $use_before_payed || $this->_instanceItemObjectFrom == 'branch' || $this->_instanceItemObjectFrom == 'dispatch') && !in_array($order['status'], array('finish', 'dead')) && in_array($order['order_type'], kernel::single('ome_order_func')->get_normal_order_type()) && $order['is_fail'] == 'false'; if ($isAuto) { $orders[$order['order_id']] = $order; } } $ids = array_keys($orders); $now = time(); $objectsFilter = array( 'order_id' => $ids, 'is_sh_ship' => 'false', ); //[预售订单]是否开启hold单(默认开启) $isPresaleHold = true; $presaleHoldSet = app::get('ome')->getConf('ome.order.presale.hold'); if($presaleHoldSet == 'false'){ $isPresaleHold = false; } //[预售订单]hold单时限发货(天猫平台会传estimate_con_time预售发货时间) if ($this->_instanceItemObjectFrom == 'process' && $isPresaleHold) { $objectsFilter['estimate_con_time|sthan'] = $now; $this->_rewriteMiscTask($ids, $now); } $objects = app::get(self::__ORDER_APP)->model('order_objects')->getList('*', $objectsFilter); foreach ($objects as $object) { // addon json转array $object['addon'] = @json_decode($object['addon'], 1); if (!$object['addon']) { $object['addon'] = []; } $orders[$object['order_id']]['objects'][$object['obj_id']] = $object; } //增加物流升级服务 $orderExt = app::get(self::__ORDER_APP)->model('order_extend')->getList('order_id,cpup_service,extend_field',array('order_id'=>$ids)); if ($orderExt) { foreach ($orderExt as $ext) { $orders[$ext['order_id']]['cpup_service'] = $ext['cpup_service']; $orders[$ext['order_id']]['extend_field'] = $ext['extend_field'] ? json_decode($ext['extend_field'], 1) : []; } } //查询订单标签信息 $billLabels = app::get('ome')->model('bill_label')->getList('bill_id,label_id', array('bill_type' => 'order', 'bill_id' => $ids)); if ($billLabels) { foreach ($billLabels as $label) { $orderId = $label['bill_id']; if (!isset($orders[$orderId]['labels'])) { $orders[$orderId]['labels'] = array(); } $orders[$orderId]['labels'][] = array('label_id' => $label['label_id']); } } $items = app::get(self::__ORDER_APP)->model('order_items')->getList('*', array( 'order_id' => $ids, 'obj_id' => array_column($objects, 'obj_id'), 'delete' => 'false', 'filter_sql' => '(split_num < nums)')); foreach ($items as $item) { if ($orders[$item['order_id']]['objects'][$item['obj_id']]) { $item['original_num'] = $item['nums']; $orders[$item['order_id']]['objects'][$item['obj_id']]['items'][$item['item_id']] = $item; } } //过滤掉没有明细的订单 foreach ($orders as $order_id => $order) { if ($order['objects']) { foreach ($order['objects'] as $ik => $item) { if (empty($item['items'])) { unset($orders[$order_id]['objects'][$ik]); } } } if (empty($orders[$order_id]['objects'])) { unset($orders[$order_id]); } } if (empty($orders)) { return; } //生成对像 foreach ($group as $item) { $gOrder = array(); $isO2oPick = false; foreach ($item['orders'] as $orderId) { if ($orders[$orderId]) { $gOrder[$orderId] = $orders[$orderId]; $isO2oPick = $isO2oPick && kernel::single('ome_order_bool_type')->isO2opick($orders[$orderId]['order_bool_type']); } } $this->_group[$item['hash']] = new omeauto_auto_group_item($gOrder); if ($isO2oPick === true) { $this->_group[$item['hash']]->setO2oPick(true); } } unset($rows); unset($order); } protected function _rewriteMiscTask($ids, $now) { $objectsFilter = array( 'order_id' => $ids, 'estimate_con_time|than' => $now, ); $objects = app::get(self::__ORDER_APP)->model('order_objects')->getList('order_id,estimate_con_time', $objectsFilter); $orders = array(); foreach ($objects as $object) { if ($object['estimate_con_time']) { if (!$orders[$object['order_id']] || $orders[$object['order_id']] > $object['estimate_con_time']) { $orders[$object['order_id']] = $object['estimate_con_time']; } } } $maxHoldTime = kernel::single('omeauto_auto_hold')->getMaxHoldTime(); foreach ($orders as $orderId => $time) { app::get(self::__ORDER_APP)->model('orders')->update(array('timing_confirm' => $time), array('order_id' => $orderId)); if ($time == $maxHoldTime) { continue; } app::get('ome')->model('operation_log')->write_log('order_edit@ome', $orderId, "订单延时定时审单记录写入成功:" . date('Y-m-d H:i:s', $time)); $task = array( 'obj_id' => $orderId, 'obj_type' => 'timing_confirm_order', 'exec_time' => $time, ); app::get('ome')->model('misc_task')->saveMiscTask($task); } } /** * 得到订单组结构 * * @param Array $group * @retun void */ public function getItemObject($group) { $this->_instanceItemObjectFrom = 'branch'; $this->_instanceItemObject($group); return $this->_group; } /** * 获取所有订单ID * * @param Array $group 要处理的订单组结构 * @return Array */ private function _mergeGroup($group) { $ids = array(); foreach ($group as $item) { $ids = array_merge($ids, $item['orders']); } return $ids; } /** * 通过插件名获取插件类并返回 * * @param String $plugName 插件名 * @return Object */ private function &_instancePlugin($plugName) { $fullPluginName = sprintf('omeauto_auto_plugin_%s', $plugName); $fix = md5(strtolower($fullPluginName)); if (!isset(self::$_plugObjects[$fix])) { $obj = new $fullPluginName(); if ($obj instanceof omeauto_auto_plugin_interface) { self::$_plugObjects[$fix] = $obj; } } return self::$_plugObjects[$fix]; } /** * 获取配置中的指定变量名 * * @param String $name 参数名 * @return Mixed */ public static function getCnf($name) { if (empty(self::$cnf)) { self::$cnf = kernel::single('omeauto_config_setting')->getAutoCnf(); } if (isset(self::$cnf[$name])) { return self::$cnf[$name]; } else { return ''; } } /** * 获取缓存时间 * * @param void * @return integer */ private function _getBufferTime() { return time() - self::getCnf('bufferTime') * 60; } /** * 获取所有可操作的订单组 * * @param Integer $bufferTime 缓冲时间 * @return Array */ public function getBufferGroup($filter = array()) { $bufferTime = $this->_getBufferTime(); /* //区分分销类型,生成不同的HASH。生成一下直销订单 hash kernel::database()->exec("UPDATE sdb_ome_orders SET order_combine_hash=MD5(CONCAT(IFNULL(member_id,order_id),'-',shop_id,'-',ship_name,'-',ship_mobile,'-',ship_area,'-',ship_addr,'-',is_cod)), order_combine_idx= CRC32(CONCAT(IFNULL(member_id,order_id),'-',shop_id,'-',ship_name,'-',ship_mobile,'-',ship_area,'-',ship_addr,'-',is_cod)) WHERE op_id IS NULL AND group_id IS NULL AND ((shop_type<>'shopex_b2b' AND shop_type<>'dangdang' AND shop_type<>'taobao' AND shop_type<>'amazon') or shop_type is null)"); //当当订单如果是货到付款不合并 kernel::database()->exec("UPDATE sdb_ome_orders SET order_combine_hash=MD5(CONCAT(IFNULL(member_id,order_id),'-',shop_id,'-',ship_name,'-',ship_mobile,'-',ship_area,'-',ship_addr,'-',IF(is_cod='true',order_id,is_cod),'-',ship_tel,'-',shop_type)), order_combine_idx= CRC32(CONCAT(IFNULL(member_id,order_id),'-',shop_id,'-',ship_name,'-',ship_mobile,'-',ship_area,'-',ship_addr,'-',is_cod,'-',ship_tel,'-',shop_type)) WHERE op_id IS NULL AND group_id IS NULL AND shop_type='dangdang'"); //亚马逊如果是非自发货订单不合并 kernel::database()->exec("UPDATE sdb_ome_orders SET order_combine_hash=MD5(CONCAT(IFNULL(member_id,order_id),'-',shop_id,'-',ship_name,'-',ship_mobile,'-',ship_area,'-',ship_addr,'-',IF(self_delivery='false',order_id,self_delivery),'-',ship_tel,'-',shop_type)), order_combine_idx= CRC32(CONCAT(IFNULL(member_id,order_id),'-',shop_id,'-',ship_name,'-',ship_mobile,'-',ship_area,'-',ship_addr,'-',is_cod,'-',ship_tel,'-',shop_type)) WHERE op_id IS NULL AND group_id IS NULL AND shop_type='amazon'"); //淘宝代销订单不合并 kernel::database()->exec("UPDATE sdb_ome_orders SET order_combine_hash=MD5(CONCAT(IFNULL(member_id,order_id),'-',shop_id,'-',ship_name,'-',ship_mobile,'-',ship_area,'-',ship_addr,'-',IF(order_source='tbdx',order_id,order_source),'-',ship_tel,'-',shop_type)), order_combine_idx= CRC32(CONCAT(IFNULL(member_id,order_id),'-',shop_id,'-',ship_name,'-',ship_mobile,'-',ship_area,'-',ship_addr,'-',is_cod,'-',ship_tel,'-',shop_type)) WHERE op_id IS NULL AND group_id IS NULL AND shop_type='taobao'"); //生成一下分销订单 hash kernel::database()->exec("UPDATE sdb_ome_orders SET order_combine_hash=MD5(CONCAT(IFNULL(member_id,order_id),'-',shop_id,'-',ship_name,'-',ship_mobile,'-',ship_area,'-',ship_addr,'-',is_cod,'-',ship_tel,'-',shop_type)), order_combine_idx= CRC32(CONCAT(IFNULL(member_id,order_id),'-',shop_id,'-',ship_name,'-',ship_mobile,'-',ship_area,'-',ship_addr,'-',is_cod,'-',ship_tel,'-',shop_type)) WHERE op_id IS NULL AND group_id IS NULL AND shop_type='shopex_b2b'"); */ $bufferFilter = $this->_getBufferFilter(); $bufferFilter['timing_confirm|sthan'] = time(); if ($filter['shop_id'] && $filter['shop_id'] != 'all') { $bufferFilter['shop_id'] = $filter['shop_id']; } //订单类型 if ($filter['order_type'] && $filter['order_type'] != 'all') { $bufferFilter['order_type'] = $filter['order_type']; } // //获取所有可处理订单 // $this->bufferOrder = app::get(self::__ORDER_APP)->model('orders')->getList('order_id, order_combine_hash, order_combine_idx, pay_status, is_cod, createtime, paytime', $bufferFilter, 0, 1500, 'createtime ASC'); //获取所有可处理订单 $cols = 'order_id, order_combine_hash, order_combine_idx, pay_status, is_cod, createtime, paytime,step_trade_status'; $subquery = "SELECT `order_id` FROM `sdb_ome_orders` WHERE " . app::get(self::__ORDER_APP)->model('orders')->_filter($bufferFilter) . " ORDER BY `paytime` ASC LIMIT 0, 5000"; $orderSql = "SELECT " . $cols . " FROM `sdb_ome_orders` INNER JOIN (" . $subquery . ") `tmp_orders` USING (`order_id`)"; $this->bufferOrder = kernel::database()->select($orderSql); $orderGroup = array(); if ($this->bufferOrder) { //整合数据, 合成订单组 foreach ($this->bufferOrder as $key => $row) { $idx = sprintf('%s||%s', $row['order_combine_hash'], $row['order_combine_idx']); $combine_select = app::get('ome')->getConf('ome.combine.select'); if($combine_select !== '0'){ $idx .= '||' . $row['order_id']; //未开启自动合并订单 } $orderGroup[$idx]['orders'][$key] = $row['order_id']; $orderGroup[$idx]['cnt'] += 1; } //合并订单条数限制 $orderGroup = $this->_restrictCombineLimit($orderGroup); //去除无效数据 foreach ($orderGroup as $key => $group) { if ($this->vaildBufferGroup($group['orders'], $bufferTime)) { $orderGroup[$key]['orders'] = join(',', $group['orders']); } else { unset($orderGroup[$key]); } } } return $orderGroup; } /** * 根据订单ID返回与buffer group相同的订单数据结构 * @param 订单ID $orders * @return 订单信息 array */ public function getOrderGroup($ids) { $orders = app::get(self::__ORDER_APP)->model('orders')->getList('order_id, order_combine_hash, order_combine_idx, pay_status, is_cod, createtime, createtime as paytime', array('order_id' => $ids)); $orderGroup = array(); if ($orders) { //整合数据, 合成订单组 foreach ($orders as $key => $row) { $idx = sprintf('%s||%s', $row['order_combine_hash'], $row['order_combine_idx']); $orderGroup[$idx]['orders'][$key] = $row['order_id']; $orderGroup[$idx]['cnt'] += 1; } //去除无效数据 foreach ($orderGroup as $key => $group) { $orderGroup[$key]['orders'] = join(',', $group['orders']); } } return $orderGroup; } /** * 检查订单组是否有效 * * @param Array $orders 订单组 * @param Integer $bufferTime 缓存时间 * @return Boolean */ private function vaildBufferGroup($orders, $bufferTime) { $gOrder = array(); foreach ($orders as $idx => $ordersId) { $gOrder[$ordersId] = $this->bufferOrder[$idx]; } $gObj = new omeauto_auto_group_item($gOrder); return $gObj->vaildBufferGroup($bufferTime); } /** * 获取缓冲池中订单的过滤条件 * * @author hzjsq (2011/3/24) * @param void * @return Array */ private function _getBufferFilter() { if(kernel::single('ome_order_func')->checkPresaleOrder()){ return array('order_confirm_filter' => '(op_id IS NULL AND group_id IS NULL AND ((is_cod=\'true\' and pay_status=\'0\') or (pay_status in(\'3\') AND step_trade_status in(\'FRONT_PAID_FINAL_NOPAID\')) or pay_status in (\'1\',\'4\')))', 'status' => 'active', 'ship_status' => '0', 'f_ship_status' => '0', 'confirm' => 'N', 'abnormal' => 'false', 'is_auto' => 'false', 'is_fail' => 'false', 'pause' => 'false', 'order_type|in' => kernel::single('ome_order_func')->get_normal_order_type()); }else{ return array('order_confirm_filter' => '(op_id IS NULL AND group_id IS NULL AND ((is_cod=\'true\' and pay_status=\'0\') or pay_status in (\'1\')))', 'status' => 'active', 'ship_status' => '0', 'f_ship_status' => '0', 'confirm' => 'N', 'abnormal' => 'false', 'is_auto' => 'false', 'is_fail' => 'false', 'pause' => 'false', 'order_type|in' => kernel::single('ome_order_func')->get_normal_order_type()); } } /** * 通过输入的错误标志显示获取对应的错误信息 * * @param Integer $status 错误标志 * @prams Array $order 订单信息 * @return Array */ public function fetchAlertMsg($staus, $order) { if ($staus == 0) { return array(); } $result = array(); foreach ($this->_plugins as $plug) { $obj = $this->_instancePlugin($plug); if (is_object($obj)) { $_msg = $obj->getMsgFlag(); if (($staus & $_msg) > 0) { $result[] = $obj->getAlertMsg($order); } } } $mResult = array(); $mark = kernel::single('omeauto_auto_group_mark'); $mResult = $mark->fetchAlertMsg($staus, $order); $result = array_merge($result, $mResult); return $result; } /** * 获取各种状态的标志位及对应信息 * * @param Void * @return Array */ public function getErrorFlags() { $result = array(); foreach ($this->_plugins as $plug) { $obj = $this->_instancePlugin($plug); if (is_object($obj)) { $_msg = $obj->getMsgFlag(); $result[$_msg] = $obj->getTitle(); } } return $result; } /** * 转换订单格式 * * @param array $o订单数组 * @return array */ private function convertOrderFormat($o) { $orderExtMdl = app::get('ome')->model('order_extend'); //数据格式转换 $difftime = kernel::single('ome_func')->toTimeDiff(time(), $o['createtime']); $o['difftime'] = $difftime['d'] . '天' . $difftime['h'] . '小时' . $difftime['m'] . '分'; $markShowMethod = app::get('ome')->getConf('ome.order.mark'); if ($markShowMethod == 'all') { $o['mark_text'] = $this->_formatMemo(unserialize($o['mark_text'])); $o['custom_mark'] = $this->_formatMemo(unserialize($o['custom_mark'])); } else { $mark_text = unserialize($o['mark_text']); $mark_text = is_array($mark_text) ? array_pop($mark_text) : []; $custom_mark = unserialize($o['custom_mark']); $custom_mark = is_array($custom_mark) ? array_pop($custom_mark) : []; $o['mark_text'] = $mark_text['op_content']; $o['custom_mark'] = $custom_mark['op_content']; } //淘宝订单是否优惠赠品 if ($o['shop_type'] == 'taobao' && $o['abnormal_status'] > 0 && (($o['abnormal_status'] & ome_preprocess_const::__HASGIFT_CODE) == ome_preprocess_const::__HASGIFT_CODE)) { $tbgiftOrderItemsObj = app::get('ome')->model('tbgift_order_items'); $tmp_tbgifts = $tbgiftOrderItemsObj->getList('*', array('order_id' => $o['order_id']), 0, -1); $o['tbgifts'] = $tmp_tbgifts; $o['has_tbgifts'] = 1; } $o['items'] = app::get(self::__ORDER_APP)->model('orders')->getItemBranchStore($o['order_id']); // 汇总本订单已出现过库存的仓库ID(branch_store 的 key) // 非拆单页面:只有当所有商品都有足够库存时,门店仓才可用 $hasStoreBranch = array(); if (!empty($o['items']['goods']) && is_array($o['items']['goods'])) { foreach ($o['items']['goods'] as $objId => $object) { if (empty($object['order_items']) || !is_array($object['order_items'])) continue; foreach ($object['order_items'] as $pid => $product) { if (!empty($product['branch_store']) && is_array($product['branch_store'])) { foreach ($product['branch_store'] as $bid => $availableStock) { $requiredQty = $product['nums']; // 订单需要的数量 // 判断库存是否足够 if (intval($availableStock) >= $requiredQty) { // 库存足够,标记门店仓为可用 $hasStoreBranch[(int)$bid] = true; } else { // 库存不足,如果该门店仓已经被标记为可用,则移除 if (isset($hasStoreBranch[(int)$bid])) { unset($hasStoreBranch[(int)$bid]); } } } } } } } $o['has_store_branch'] = array_keys($hasStoreBranch); //地区数据转换 $consignee['area'] = $o['ship_area']; $consignee['addr'] = $o['ship_addr']; $consignee['name'] = $o['ship_name']; $consignee['mobile'] = $o['ship_mobile']; $consignee['hash'] = md5(join('-', $consignee)); $consignee['telephone'] = $o['ship_tel']; $consignee['r_time'] = $o['r_time']; $consignee['email'] = $o['ship_email']; $consignee['zip'] = $o['ship_zip']; $o['consignee'] = $consignee; //读取店铺名称 $shop = app::get(self::__ORDER_APP)->model('shop')->getList('name', array('shop_id' => $o['shop_id']), 0, 1); $o['shop_name'] = $shop[0]['name']; if ($o['member_id']) { $member = app::get(self::__ORDER_APP)->model('members')->getList('uname', array('member_id' => $o['member_id']), 0, 1); $o['member_name'] = $member[0]['uname']; } else { $o['member_name'] = '无用户'; } $o['identifier'] = kernel::single('ome_order_bool_type')->getBoolTypeIdentifier($o['order_bool_type'], $o['shop_type'], true, $o['order_id']); //[拆单]合线 $basicMaterialExtObj = app::get('material')->model('basic_material_ext'); $salesMaterialExtObj = app::get('material')->model('sales_material_ext'); //转换数据 addon foreach ($o['items'] as $type => $item) { foreach ($item as $objId => $object) { foreach ($object['order_items'] as $pid => $product) { $o['items'][$type][$objId]['order_items'][$pid]['bn'] = preg_replace('/^:::/is', '', $o['items'][$type][$objId]['order_items'][$pid]['bn']); $o['items'][$type][$objId]['order_items'][$pid]['max_left_nums'] = $product['left_nums']; if ($o['items'][$type][$objId]['order_items'][$pid]['bn'] == '___') { $o['items'][$type][$objId]['order_items'][$pid]['bn'] = '-'; } if (empty($product['addon'])) { $o['items'][$type][$objId]['order_items'][$pid]['addon'] = '-'; } else { $spec = ''; $tmp = unserialize($product['addon']); if ($tmp) { foreach ($tmp['product_attr'] as $value) { $spec .= sprintf("%s:%s", $value['label'], $value['value']); } $o['items'][$type][$objId]['order_items'][$pid]['addon'] = $spec; } } $pinfo = $basicMaterialExtObj->dump($product['product_id'], 'weight'); $o['items'][$type][$objId]['order_items'][$pid]['weight'] = $pinfo['weight']; } if ($object['obj_type'] == 'pkg') { $pkgGood = $salesMaterialExtObj->dump(array('sm_id' => $object['goods_id']), 'weight'); if ($pkgGood) { $o['items'][$type][$objId]['weight'] = $pkgGood['weight']; } $o['items'][$type][$objId]['max_left_nums'] = $object['left_nums']; } if ($object['obj_type'] == 'lkb') { $lkbGood = $salesMaterialExtObj->dump(array('sm_id' => $object['goods_id']), 'weight'); if ($lkbGood) { $o['items'][$type][$objId]['weight'] = $lkbGood['weight']; } $o['items'][$type][$objId]['max_left_nums'] = $object['left_nums']; } } } //order_extend $fields = 'cpup_service,order_id,promise_service'; $orderExt = $orderExtMdl->db_dump($o['order_id']); $o['cpup_service'] = explode(',', $orderExt['cpup_service']); $o['promise_service'] = $orderExt['promise_service']; return $o; } /** * 获取订单无用户信息情况下的过渡条件 * * @param Array $order * @return Array */ public function _getNullMemberFilter($order) { $filter = array(); $memberidconf = intval(app::get('ome')->getConf('ome.combine.memberidconf')); $memberidconf = $memberidconf == '1' ? '1' : '0'; if ($memberidconf == '0') { $filter['order_id'] = $order['order_id']; } else { $filter = $this->_getAddrFilter($order); } return $filter; } /** * 获取地址一致的过渡条件 * * @param Array $order * @return Array */ public function _getAddrFilter($order) { $filter = array(); $combine_conf = app::get('ome')->getConf('ome.combine.addressconf'); $ship_address = intval($combine_conf['ship_address']) == '1' ? '1' : '0'; $mobile = intval($combine_conf['mobile']) == '1' ? '1' : '0'; if ($ship_address == '0') { $filter['ship_name'] = $order['ship_name']; $filter['ship_area'] = $order['ship_area']; $filter['ship_addr'] = $order['ship_addr']; if($order['shop_type'] == 'taobao' && strpos($order['ship_name'], '>>') !== false) { unset($filter['ship_addr']); } $filter['no_encrypt'] = true; } if ($mobile == '0') { $filter['ship_mobile'] = $order['ship_mobile']; $filter['no_encrypt'] = true; } return $filter; } private function _getCombineConf(&$combine_member_id, &$combine_shop_id) { if (strval(app::get('ome')->getConf('ome.combine.member_id')) == '0') { $combine_member_id = false; } if (strval(app::get('ome')->getConf('ome.combine.shop_id')) == '0') { $combine_shop_id = false; } } /** * 获取相关可以合并订单 * * @param Array $order 订单内容 * @return Array */ public function fetchCombineOrder($order) { //初始化变量 $ids = array(); $orders = array(); $combine_member_id = true; $combine_shop_id = true; //统一查询收获相关信息,以免抛进来的不一致 $order = app::get(self::__ORDER_APP)->model('orders')->getList('*', array('order_id' => $order['order_id'])); $order = $order[0]; $orderHash = $order['order_combine_hash']; $orderIdx = $order['order_combine_idx']; //新增合单逻辑 $this->_getCombineConf($combine_member_id, $combine_shop_id); //基础过滤条件[增加部分发货、部分退货 可继续审单 $filter = array('ship_status' => array(0, 2, 3), 'process_status' => array('unconfirmed', 'confirmed', 'splitting'), 'status' => 'active', 'order_bn|noequal' => '0', 'is_cod' => $order['is_cod']); if ($order['shop_type'] == 'shopex_b2b') { //分销单,对支持跨店合的参数无视,直接内置规则处理 if ($combine_member_id) { //需判断同一用户,因分销没有实际客户信息,以无用户信息方式处理 if (empty($order['member_id'])) { $filter['order_id'] = $order['order_id']; } else { $filter['member_id'] = $order['member_id']; $filter['shop_id'] = $order['shop_id']; $filter = array_merge($filter, $this->_getNullMemberFilter($order)); } } else { //检查是否导入订单 if (empty($order['member_id'])) { //如是导入的无用户订单,则无法判定前端销售的实际店铺,只取出当前订单 $filter['order_id'] = $order['order_id']; } else { //有用户名,可确认前端销售的实际店铺 $filter['member_id'] = $order['member_id']; $filter['shop_id'] = $order['shop_id']; //判定地址一致 $filter = array_merge($filter, $this->_getAddrFilter($order)); } } } else if ($order['shop_type'] == 'dangdang' && $order['is_cod'] == 'true') { //当当,且是货到付款不合并 $filter['order_id'] = $order['order_id']; } else if (($order['shop_type'] == 'amazon') && $order['self_delivery'] == 'false') { //如果店铺类型是亚马逊,且不是自发货的不合并 $filter['order_id'] = $order['order_id']; } else if ($order['shop_type'] == 'aikucun') { //爱库存不可合并 $filter['order_id'] = $order['order_id']; } else if ($order['shop_type'] == 'taobao' && $order['order_source'] == 'tbdx') { //淘宝代销订单不合并 823修改淘代销走B2B逻辑 //$filter['order_id'] = $order['order_id']; if ($combine_member_id) { //需判断同一用户,因分销没有实际客户信息,以无用户信息方式处理 if (empty($order['member_id'])) { $filter['order_id'] = $order['order_id']; } else { $filter['member_id'] = $order['member_id']; $filter['shop_id'] = $order['shop_id']; $filter = array_merge($filter, $this->_getNullMemberFilter($order)); } } else { //检查是否导入订单 if (empty($order['member_id'])) { //如是导入的无用户订单,则无法判定前端销售的实际店铺,只取出当前订单 $filter['order_id'] = $order['order_id']; } else { //有用户名,可确认前端销售的实际店铺 $filter['member_id'] = $order['member_id']; $filter['shop_id'] = $order['shop_id']; //判定地址一致 $filter = array_merge($filter, $this->_getAddrFilter($order)); } } } else if (($order['shop_type'] == 'taobao' && (kernel::single('ome_order_bool_type')->isCnService($order['order_bool_type']) || $order['order_source'] == 'maochao') ) || $order['order_type'] == 'vopczc') { $filter['order_id'] = $order['order_id']; } else { //直销单 if ($combine_member_id) { if (empty($order['member_id'])) { //以无用户信息方式处理 $filter = array_merge($filter, $this->_getNullMemberFilter($order)); } else { //有用户名 $filter['member_id'] = $order['member_id']; } } else { //判定地址 $filter = array_merge($filter, $this->_getAddrFilter($order)); } if ($combine_shop_id) { $filter['shop_id'] = $order['shop_id']; } if ($order['shop_type'] == 'vop') { $filter['order_combine_hash'] = $orderHash; } if ($order['shop_type'] == '360buy') { // 是否集运,如果是集运,不能和非集运的合单 $jyInfo = kernel::single('ome_bill_label')->getBillLabelInfo($order['order_id'], 'order', 'SOMS_GNJY'); if ($jyInfo) { $filter['order_combine_hash'] = $orderHash; } } //排除b2b单否则如果相同地址的单子由普通订单点入时,会显示出b2b单在可合并中 $filter['filter_sql'] = "(shop_type IS NOT NULL AND order_source<>'tbdx' and shop_type<>'shopex_b2b' and (is_cod='false' or (shop_type<>'dangdang' AND is_cod='true')) and (self_delivery='true' or (shop_type<>'amazon' and self_delivery='false')) OR shop_type IS NULL)"; //京东厂直 if ($order['shop_type'] == 'jd' && kernel::single('ome_bill_label')->getBillLabelInfo($order['order_id'], 'order', kernel::single('ome_bill_label')->isSomsGxd())) { $filter['order_id'] = $order['order_id'];//工小达 未接合单 } } //[开启拆单]部分拆分-部分发货-部分退货的订单 不允许合单 if ($order['process_status'] == 'splitting' && $order['ship_status'] == '3') { $filter['order_id'] = $order['order_id']; }elseif($order['betc_id'] && $order['cos_id']){ //分销一件代发订单,不允许合单 $filter['order_id'] = $order['order_id']; } //获取相关订单 $row = app::get(self::__ORDER_APP)->model('orders')->getList('*', $filter); if (!empty($order['member_id'])) { if ($order['shop_type'] == 'shopex_b2b') { $tmp = array(); } else if ($order['shop_type'] == 'dangdang' && $order['is_cod'] == 'true') { $tmp = array(); } else if ($order['shop_type'] == 'amazon' && $order['self_delivery'] == 'false') { $tmp = array(); } else if ($order['shop_type'] == 'aikucun') { $tmp = array(); } else if ($order['shop_type'] == 'taobao' && ($order['order_source'] == 'tbdx' || $order['order_source'] == 'maochao')) { $tmp = array(); } elseif ($order['shop_type'] == 'vop') { $tmp = array(); } elseif ($order['shop_type'] == '360buy' && kernel::single('ome_bill_label')->getBillLabelInfo($order['order_id'], 'order', 'SOMS_GNJY')) { // 如果是集运,不能和非集运的合单 $tmp = array(); } elseif ($order['shop_type'] == 'jd' && kernel::single('ome_bill_label')->getBillLabelInfo($order['order_id'], 'order', kernel::single('ome_bill_label')->isSomsGxd())) { // 京东厂直 工小达 未接合单 $tmp = array(); } else { #拆单_增加确认状态('splitting')与发货状态(ship_status=2)部分发货条件 $tmp_filter = array('member_id' => $order['member_id'], 'shop_id' => $order['shop_id'], 'status' => 'active', 'process_status' => array('unconfirmed', 'confirmed', 'splitting'), 'ship_status' => array(0, 2), 'f_ship_status' => '0', 'order_bn|noequal' => '0', 'is_cod' => $order['is_cod']); $tmp = app::get(self::__ORDER_APP)->model('orders')->getList('*', $tmp_filter); $row = array_merge($row, $tmp); unset($tmp); } } foreach ((array) $row as $o) { if (!in_array($o['order_id'], $ids)) { if ($o['order_combine_idx'] == $orderIdx && $o['order_combine_hash'] == $orderHash) { $o['isCombine'] = true; } else { $o['isCombine'] = false; } $o['is_encrypt'] = kernel::single('ome_security_router',$o['shop_type'])->show_encrypt($o,'order'); $orders[$o['order_id']] = $this->convertOrderFormat($o); $ids[] = $o['order_id']; } } unset($row); return $orders; } /** * 获该用户除指定用户外的所有订单数 * * @param Integer $memberId 会员编号 * @param Integer $shopId 店铺ID * @return Integer */ public function getCombineMemberCount($memberId, $shopId) { $row = app::get(self::__ORDER_APP)->model('orders')->count(array('member_id' => $memberId, 'shop_id' => $shopId, 'status' => 'active', 'process_status' => array('unconfirmed', 'confirmed'), 'ship_status' => '0', 'f_ship_status' => '0', 'order_bn|noequal' => '0')); return $row; } /** * 获取备注及留言的显示格式信息 * * @param Arrar $input 输入的内容 * @return String */ private function _formatMemo($input) { $result = ''; if (is_array($input)) { foreach ($input as $memo) { $result .= sprintf("%s\n", $memo['op_content']); } } return $result; } /** * 生成发货单 * * @param Array $orders 订单数组 * @return Boolean * @param $splitting_product 拆分的商品列表 */ public function mkDelivery($orderIds, $consignee, $corpId, $splitting_product = array(), &$errmsg, $split_auto = array()) { $orderIds = is_array($orderIds) ? $orderIds : [$orderIds]; if($corpId == 'auto') { $corp = ['corp_id'=>'auto']; } else { $corp = app::get('ome')->model('dly_corp')->dump($corpId, 'corp_id, name, type, is_cod, weight'); } $rows = app::get(self::__ORDER_APP)->model('orders')->getList('*', array('order_id' => $orderIds)); $shop_group = array(); $createway_group = array(); foreach ($rows as $order) { $shop_group[$order['shop_id']] = $order['shop_id']; $createway_group[$order['createway']] = $order['createway']; if(kernel::single('ome_order_bool_type')->isJDLVMI($order['order_bool_type'])){ $order_id_arr[$order['order_id']] = $order['order_id']; } } if($order_id_arr){ $extends = array(); $extendData = app::get('ome')->model('order_extend')->getList('presale_pay_status,order_id,platform_logi_no', array('order_id'=>$order_id_arr)); foreach($extendData as $ev) { $extends[$ev['order_id']] = $ev; } } $is_check_channel = false; foreach ($rows as $order) { // 验证发货数据 if ($order['createway'] != 'matrix' && $order['order_source'] != 'platformexchange' && kernel::single('ome_security_router', $order['shop_type'])->is_encrypt(array('consignee' => $consignee), 'order')) { //补发订单是原平台订单的加密收货人信息 if(in_array($order['order_type'], array('bufa'))){ //--不需要检查收货信息 }else{ $errmsg = '收货信息异常,请重新编辑'; return false; } } if(empty($order['ship_addr'])) { $errmsg = '收货地址不能为空'; return false; } // 京东/拼多多店铺订单不能和其他平台订单合并 if (count($orderIds) > 1 && in_array($order['shop_type'], array('360buy', 'pinduoduo')) && $order['createway'] == 'matrix' && (count($shop_group) > 1 || count($createway_group) > 1)) { $errmsg = '京东/拼多多订单线上线下不能合并'; return false; } if (count($orderIds) > 1 && (in_array($order['shop_type'], array('aikucun', 'yangsc')) || !kernel::single('ome_branch')->isCanMerge($consignee['branch_id']))) { $errmsg = '订单不能合单'; return false; } if($order['pay_status']=='3' && !kernel::single('ome_order_func')->checkPresaleOrder()){ $errmsg = '部分支付不可以审单'; return false; } $is_part_split = false; if($order['process_status'] == 'splitting') $is_part_split = true; // 得物品牌直发不支持合单 if (count($orderIds) > 1 && strtolower($order['shop_type']) == 'dewu' && kernel::single('ome_order_bool_type')->isDWBrand($order['order_bool_type'])) { $errmsg = '得物品牌直发订单不能合单'; return false; } // 得物品牌直发不支持拆单 if ($is_part_split && strtolower($order['shop_type']) == 'dewu' && kernel::single('ome_order_bool_type')->isDWBrand($order['order_bool_type'])) { $errmsg = '得物品牌直发订单不能拆单'; return false; } if (!in_array($order['order_type'], kernel::single('ome_order_func')->get_normal_order_type())) { $errmsg = kernel::single('ome_order_func')->get_order_type($order['order_type']) . '不能生成发货单'; return false; } if($order['source_status'] == 'TRADE_CLOSED') { $errmsg = '订单平台已取消,不能生成发货单'; return false; } if($order['shop_type'] == 'luban' && $order['createway'] == 'matrix' && in_array($order['source_status'], array('WAIT_SELLER_SEND_GOODS')) ){ $errmsg = '抖音订单尚在风控,未进入备货中'; return false; } // HOLD单 if ($order['is_delivery'] == 'N'){ $errmsg = '订单审核中,暂不能发货'; return false; } $orders[$order['order_id']] = $order; //[抖音平台]订单标识 if(in_array($order['shop_type'], array('luban'))){ $is_check_channel = true; } // 判读是否是指定仓 if (kernel::single('ome_order_bool_type')->isJDLVMI($order['order_bool_type']) ) { if(empty($consignee['waybillCode']) || !isset($consignee['waybillCode'])){ $consignee['waybillCode'] = $extends[$order['order_id']]['platform_logi_no']; } // // 不允许合单 if (count($rows) >= 2) { return false; } $store_code = app::get('ome')->model('order_objects')->db_dump(array ('order_id' => $order['order_id']), 'store_code'); if ($store_code['store_code']) { $branch_relation = app::get('ome')->model('branch_relation')->db_dump(array ( 'relation_branch_bn' => $store_code['store_code'], 'type' => 'jdlvmi', )); if ($branch_relation['branch_id'] != $consignee['branch_id']) { return false; } } } } $objects = app::get(self::__ORDER_APP)->model('order_objects')->getList('*', array('order_id' => $orderIds, 'is_sh_ship' => 'false')); foreach ($objects as $object) { $object['addon'] = @json_decode($object['addon'], 1); if (!$object['addon']) { $object['addon'] = []; } $orders[$object['order_id']]['objects'][$object['obj_id']] = $object; } //[拆单]订单明细条件 $filter_sql = array(' nums > sendnum'); //是否是拆的订单 if ($splitting_product && count($orderIds) == 1) { $type_filter = array(); foreach ($splitting_product as $item_type => $product) { foreach ($product as $product_id => $nums) { $type_filter[] = ' (product_id="' . $product_id . '" and item_type="' . $item_type . '" ) '; } } if ($type_filter) { $filter_sql[] = '(' . implode(' OR ', $type_filter) . ')'; //过滤删除的商品 } } $filter = array( 'order_id' => $orderIds, 'obj_id' => array_column($objects, 'obj_id'), 'delete' => 'false', 'filter_sql' => implode(' AND ', $filter_sql), ); $items = app::get(self::__ORDER_APP)->model('order_items')->getList('*', $filter); foreach ($items as $item) { $obj_ids[] = $item['obj_id']; } $objects = app::get(self::__ORDER_APP)->model('order_objects')->getList('*', array('obj_id' => $obj_ids)); foreach ($objects as $ok => $object) { $object['addon'] = @json_decode($object['addon'], 1); if (!$object['addon']) { $object['addon'] = []; } $tmp_objects[$object['obj_id']] = $object; } //重组数据 $orderSplitLib = kernel::single('ome_order_split'); $orders = $orderSplitLib->format_mkDelivery($orders, $tmp_objects, $items, $splitting_product); // 过滤掉没有明细的订单 foreach ($orders as $order_id => $order) { foreach ($order['objects'] as $ok => $object) { if (empty($object['items'])) { unset($orders[$order_id]['objects'][$ok]); } else { #nums变成可拆分数量 split_num需要重置为0 foreach ($object['items'] as $ik => $iv) { $orders[$order_id]['objects'][$ok]['items'][$ik]['split_num'] = 0; //震坤行不支持按行拆分 if ($rows[0]['shop_type'] == 'zkh') { if ($iv['nums'] > 0 && $iv['original_num'] != $iv['nums']) { $errmsg = '震坤行订单不支持按数量拆分订单!'; return false; } } } // 判断行明细是否有退款 if ($object['pay_status'] == '5') { $errmsg = $object['bn'].' '.'已退款不能审核'; return false; } } } if (empty($orders[$order_id]['objects'])) { unset($orders[$order_id]); } if($orders[$order_id]) { list($rs, $rsData) = kernel::single('ome_order_refund')->checkRefundStatus($orders[$order_id]); if($rs) { $errmsg = '检查退款失败:'.$rsData['msg']; return false; } } } unset($rows); //没有可操作的有效订单(例如:订单没有商品明细) if (empty($orders)) { $errmsg = '没有可操作的有效订单或库存不足'; return false; } //[抖音平台]关联京东云交易渠道ID if($is_check_channel){ $branchLib = kernel::single('ome_branch'); $wms_type = $branchLib->getNodetypBybranchId($consignee['branch_id']); if($wms_type == 'yjdf'){ $orderLib = kernel::single('ome_order'); $error_msg = ''; $orders = $orderLib->getOrderProductChannelId($orders, $error_msg); if(!$orders){ $errmsg = '错误:'.$error_msg; return false; } } } list($rs, $rsData) = kernel::single('material_basic_material_stock_freeze')->deleteOrderBranchFreeze(array_column($orders, 'order_id')); if(!$rs) { $errmsg = '错误:'.$rsData['msg']; return false; } $group = new omeauto_auto_group_item($orders); if ($group->canMkDelivery()) { if (!empty($corp)) { $branchId = $consignee['branch_id']; #菜鸟的智选物流,会返回物流单号 $waybill_arr = explode(',', $consignee['waybillCode']); $group->setWaybillCode($waybill_arr[0]); $group->setSubWaybillCode(array_slice($waybill_arr, 1)); unset($consignee['branch_id'], $consignee['waybillCode']); $errmsg = '库存不足,生成发货单失败'; foreach ($orders as $o_k => $o_v) { if ($o_v['shop_type'] == 'kuaishou') { kernel::single('omeauto_auto_plugin_checksplitgift')->process($group); $groupStatus = $group->getStatus(); if ($groupStatus['opt'] == omeauto_auto_group_item::__OPT_HOLD) { $errmsg = '仅赠品不能生成发货单'; return false; } } } if ($split_auto['split_id'] && kernel::single('ome_order_split')->get_delivery_seting()) { $confirmRoles = array( 'inlet_class' => 'split', 'corp' => $corp, 'branch_id' => $branchId, 'split_id' => $split_auto['split_id'], 'source' => $split_auto['source'], ); $rs = $this->_splitDeliveryOne($group, $confirmRoles, $orders, $consignee); } else { if($branchId == 'auto') { $confirmRoles = array( 'inlet_class' => 'ordertaking', 'corp' => $corp, 'branch_id' => $branchId, ); $rs = $this->_splitDeliveryOne($group, $confirmRoles, $orders, $consignee); } else { $group->setBranchId($branchId); $group->setDlyCorp($corp); $rs = $group->mkDelivery($consignee); } } if ($rs['rsp'] == 'fail') { $errmsg = $rs['msg'] ? $rs['msg'] : '审单操作失败:'.$errmsg; return false; } return true; } } else { $errmsg = '该订单不满足条件'; return false; } } protected function _splitDeliveryOne($sourceGroup, $sourceConfirmRoles, $arrOrder, $consignee) { $group = $sourceGroup; $confirmRoles = $sourceConfirmRoles; $group->updateOrderInfo($arrOrder); if($confirmRoles['branch_id'] == 'auto') { kernel::single('omeauto_auto_plugin_branch')->process($group,$confirmRoles); $groupStatus = $group->getStatus(); if ($groupStatus['opt'] == omeauto_auto_group_item::__OPT_HOLD) { $msg = '智选仓库失败'; return array('rsp'=>'fail', 'msg'=>$msg); } $pluginSplit = kernel::single('omeauto_auto_plugin_split'); $pluginSplit->process($group, $confirmRoles); $groupStatus = $group->getStatus(); if ($groupStatus['opt'] == omeauto_auto_group_item::__OPT_HOLD) { $msg = '拆分商品失败'; return array('rsp' => 'fail', 'msg' => $msg); } kernel::single('omeauto_auto_plugin_store')->process($group,$confirmRoles); $groupStatus = $group->getStatus(); if ($groupStatus['opt'] == omeauto_auto_group_item::__OPT_HOLD) { $msg = '验证仓库库存失败'; return array('rsp'=>'fail', 'msg'=>$msg); } kernel::single('omeauto_auto_plugin_logi')->process($group,$confirmRoles); $groupStatus = $group->getStatus(); if ($groupStatus['opt'] == omeauto_auto_group_item::__OPT_HOLD) { return array('rsp'=>'fail', 'msg'=>'智选物流失败'); } kernel::single('omeauto_auto_plugin_arrived')->process($group,$confirmRoles); $groupStatus = $group->getStatus(); if ($groupStatus['opt'] == omeauto_auto_group_item::__OPT_HOLD) { return array('rsp'=>'fail', 'msg'=>'物流公司不到'); } } else { $group->setBranchId($confirmRoles['branch_id']); $group->setDlyCorp($confirmRoles['corp']); $pluginSplit = kernel::single('omeauto_auto_plugin_split'); $pluginSplit->process($group, $confirmRoles); $groupStatus = $group->getStatus(); if ($groupStatus['opt'] == omeauto_auto_group_item::__OPT_HOLD) { $msg = '拆分商品失败'; return array('rsp' => 'fail', 'msg' => $msg); } } $msg = '拆单成功'; $rs = $group->mkDelivery($consignee); $deliveryOrder = $group->getOrders(); foreach ($arrOrder as $k => $order) { foreach ($order['objects'] as $ok => $object) { foreach ($object['items'] as $ik => $ival) { $deliveryOrderItems = $deliveryOrder[$k]['objects'][$ok]['items'][$ik]; if ($deliveryOrderItems) { $ival['split_num'] += $deliveryOrderItems['nums']; if ($ival['nums'] > $ival['split_num']) { $arrOrder[$k]['objects'][$ok]['items'][$ik]['split_num'] = $ival['split_num']; } else { unset($arrOrder[$k]['objects'][$ok]['items'][$ik]); } } } if (empty($arrOrder[$k]['objects'][$ok]['items'])) { unset($arrOrder[$k]['objects'][$ok]); } } if (empty($arrOrder[$k]['objects'])) { unset($arrOrder[$k]); } } if (empty($arrOrder)) { return array('rsp' => 'succ'); } return $this->_splitDeliveryOne($sourceGroup, $sourceConfirmRoles, $arrOrder, $consignee); } public function getStatus($order) { $plugin = array('pay' => array(), 'flag' => array(), 'logi' => array(), 'member' => array(), 'ordermulti' => array(), 'branch' => array(), 'store' => array(), 'oversold' => array(), 'tbgift' => array(), 'shopcombine' => array(), 'crm' => array(), 'tax' => array(), 'arrived' => array()); $statusList = array(); foreach ($plugin as $p => $h) { $pInstance = $this->_instancePlugin($p); //$status = $order['auto_status'] & $pInstance->getMsgFlag(); $status = $pInstance->getStatus($order['auto_status'], $order); if ($status > 0) { $msg = $pInstance->getAlertMsg($order); $msg['msg'] = str_replace(array('', '', '
'), '', $msg['msg']); $statusList[] = $msg; } } return $statusList; } /** * 获该用户除指定用户外的所有订单数 * * @param Integer $memberId 会员编号 * @param Integer $shopId 店铺ID * @return Integer */ public function getCombineShopMemberCount($orders) { /* *新增合单逻辑 */ $combine_member_id = true; $combine_shop_id = true; $this->_getCombineConf($combine_member_id, $combine_shop_id); $filter = array('status' => 'active', 'process_status' => array('unconfirmed', 'confirmed'), 'ship_status' => '0', 'f_ship_status' => '0', 'order_bn|noequal' => '0', 'is_cod' => $orders['is_cod']); if ($orders['shop_type'] == 'shopex_b2b') { //分销单,对支持跨店合的参数无视,直接内置规则处理 if ($combine_member_id) { //需判断同一用户,因分销没有实际客户信息,以无用户信息方式处理 if (empty($orders['member_id'])) { $filter['order_id'] = $orders['order_id']; } else { $filter['member_id'] = $orders['member_id']; $filter['shop_id'] = $orders['shop_id']; $filter = array_merge($filter, $this->_getNullMemberFilter($orders)); } } else { //检查是否导入订单 if (empty($orders['member_id'])) { //如是导入的无用户订单,则无法判定前端销售的实际店铺,只取出当前订单 $filter['order_id'] = $orders['order_id']; } else { //有用户名,可确认前端销售的实际店铺 $filter['member_id'] = $orders['member_id']; $filter['shop_id'] = $orders['shop_id']; //判定地址一致 $filter = array_merge($filter, $this->_getAddrFilter($orders)); } } } else if ($orders['shop_type'] == 'dangdang' && $orders['is_cod'] == 'true') { $filter['order_id'] = $orders['order_id']; } else if ($orders['shop_type'] == 'amazon' && $orders['self_delivery'] == 'false') { $filter['order_id'] = $orders['order_id']; } else if ($orders['shop_type'] == 'aikucun') { $filter['order_id'] = $orders['order_id']; } else if ($orders['shop_type'] == 'taobao' && $orders['order_source'] == 'tbdx') { //823修改淘分销走b2b流程 //$filter['order_id'] = $orders['order_id']; if ($combine_member_id) { //需判断同一用户,因分销没有实际客户信息,以无用户信息方式处理 if (empty($orders['member_id'])) { $filter['order_id'] = $orders['order_id']; } else { $filter['member_id'] = $orders['member_id']; $filter['shop_id'] = $orders['shop_id']; $filter = array_merge($filter, $this->_getNullMemberFilter($orders)); } } else { //检查是否导入订单 if (empty($orders['member_id'])) { //如是导入的无用户订单,则无法判定前端销售的实际店铺,只取出当前订单 $filter['order_id'] = $orders['order_id']; } else { //有用户名,可确认前端销售的实际店铺 $filter['member_id'] = $orders['member_id']; $filter['shop_id'] = $orders['shop_id']; //判定地址一致 $filter = array_merge($filter, $this->_getAddrFilter($orders)); } } } else { //直销单 if ($combine_member_id) { if (empty($orders['member_id'])) { //以无用户信息方式处理 $filter = array_merge($filter, $this->_getNullMemberFilter($orders)); } else { //有用户名 $filter['member_id'] = $orders['member_id']; $filter = array_merge($filter, $this->_getAddrFilter($orders)); } } else { //判定地址 $filter = array_merge($filter, $this->_getAddrFilter($orders)); } if ($combine_shop_id) { $filter['shop_id'] = $orders['shop_id']; } $filter['filter_sql'] = "(shop_type IS NOT NULL AND order_source<>'tbdx' and shop_type<>'shopex_b2b' and (is_cod='false' or (shop_type<>'dangdang' AND is_cod='true')) and (self_delivery='true' or (shop_type<>'amazon' and self_delivery='false')) OR shop_type IS NULL)"; } if (!isset($orders['shipping_name']) && !isset($orders['store_code']) && !isset($orders['cpup_service'])) { $row = app::get(self::__ORDER_APP)->model('orders')->count($filter); }else{ $filter['shipping'] = $orders['shipping_name']; $orderIds = app::get(self::__ORDER_APP)->model('orders')->getList('order_id',$filter); $orderIds = array_column($orderIds,'order_id'); $objOrderIds = app::get(self::__ORDER_APP)->model('order_objects')->getList('order_id',array('order_id'=>$orderIds,'store_code'=>$orders['store_code'])); $objOrderIds = array_column($objOrderIds,'order_id'); $row = app::get(self::__ORDER_APP)->model('order_extend')->count(array('order_id'=>$objOrderIds,'cpup_service'=>$orders['cpup_service'])); } return $row; } /** * 合并订单条数限制 * @todo:如果合单条数大于配置的限制合单条数,会被拆分成多个分组 * * @param array $orderGroup * @return array */ public function _restrictCombineLimit($orderGroup) { //[获取配置]合并订单条数限制 $combine_select = app::get('ome')->getConf('ome.combine.select'); $combine_merge_limit = app::get('ome')->getConf('ome.combine.merge.limit'); $combine_merge_limit = intval($combine_merge_limit); if($combine_select !== '0'){ $combine_merge_limit = 0; //未开启自动合并订单 } //没有限制合单条数,直接返回 if($combine_merge_limit <= 0){ return $orderGroup; } //group $retOrderGroup = array(); foreach ($orderGroup as $key => $group) { if(count($group['orders']) <= $combine_merge_limit) { continue; } //注销原分组数据 unset($orderGroup[$key]); list($combine_hash, $combine_idx) = explode('||', $key); //重新组织分组数据 $groupNum = 0; $groupPage = 1; foreach ($group['orders'] as $order_key => $order_id) { //分页 if($groupNum >= $combine_merge_limit){ //todo:当可合并订单 大于 配置的合并条数限制,需要多次合并时:本次只会合并一次 //break; $groupNum = 0; $groupPage++; } $groupNum++; //$newGroupKey = $key . $groupPage; $newGroupKey = sprintf('%s||%s', $combine_hash.'-'.$groupPage, $combine_idx . $groupPage); $orderGroup[$newGroupKey]['orders'][$order_key] = $order_id; $orderGroup[$newGroupKey]['cnt'] += 1; } } return $orderGroup; } }