Files
OMS/app/ome/lib/iostocksales.php
2026-01-04 19:08:31 +08:00

724 lines
33 KiB
PHP

<?php
/**
* Copyright 2012-2026 ShopeX (https://www.shopex.cn)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
class ome_iostocksales {
/**
* 存储出入库、销售记录
* @access public
* @param String $data 出入库、销售记录
* @param String $msg 消息
* @return boolean 成功or失败
*/
public function iostock_set($data,$io,&$msg,$type=null)
{
$allow_commit = false;
$iostock_instance = kernel::single('ome_iostock');
if ( method_exists($iostock_instance, 'set') ){
//存储出入库记录
// $iostock_data = $data['iostock'];
$type = $type ? $type : constant('ome_iostock::LIBRARY_SOLD');
$iostock_bn = $iostock_instance->get_iostock_bn($type);
if ( $iostock_instance->set($iostock_bn, $data, $type, $iostock_msg, $io) ){
// $rs = $this->data_to_sale($data, $iostock_data, $iostock_bn, $io);
// $allow_commit = $rs['allow_commit'];
// $sales_msg = $rs['msg'];
return true;
}
}
// if ($allow_commit == true){
// return true;
// }else{
// $msg = $iostock_msg ? '出入库错误:' . implode(',', $iostock_msg) : '';
// $msg .= $sales_msg ? ($msg ? "\n" : '') . '销售单生成失败:' . implode(',', $sales_msg) : '';
// $msg .= $msg ? '' : '出入库或销售单操作失败';
// return false;
// }
$msg = '出入库失败:' . implode(',', $iostock_msg);
return false;
}
/**
* 合并发货单按付款金额贡献度分摊物流费
*
* @return void
* @author
* */
private function _share_delivery_cost($order_id, $delivery)
{
$delivery_cost_actual = $delivery['delivery_cost_actual'];
$dOrderMdl = app::get('ome')->model('delivery_order');
$delivery_order = $dOrderMdl->getList('*', array ('delivery_id' => $delivery['delivery_id']));
$filterOrderId = array (0);
foreach ($delivery_order as $value) {
$filterOrderId[] = $value['order_id'];
}
$orderMdl = app::get('ome')->model('orders');
$orderList = $orderMdl->getList('order_id,payed', array ('order_id' => $filterOrderId));
$payedAmount = 0;
foreach ($orderList as $value) {
$payedAmount += $value['payed'];
}
$cpp = $delivery_cost_actual > 0 ? bcdiv($delivery_cost_actual, $payedAmount, 5) : 0;
$i = 1; $c = count($orderList);
foreach ($orderList as $value) {
if ($i == $c) {
$costs[$value['order_id']] = $delivery_cost_actual;
} else {
$costs[$value['order_id']] = bcmul($value['payed'], $cpp, 2);
$delivery_cost_actual -= $costs[$value['order_id']];
}
$i++;
}
return $costs[$order_id];
}
//方法已弃用(请不要使用)
/**
* sale_set
* @param mixed $data 数据
* @param mixed $msg msg
* @return mixed 返回值
*/
public function sale_set($data, &$msg) {
if (!$data) {
$msg = '销售单生成失败:缺少销售数据';
return false;
}
$deliveryMdl = app::get('ome')->model('delivery');
$dItemDetailMdl = app::get('ome')->model('delivery_items_detail');
$iostockMdl = app::get('ome')->model('iostock');
$sales_instance = kernel::single('ome_sales');
if ( method_exists($sales_instance, 'set') ) {
// 按订单生成销售单
foreach($data as $sale) {
$sale['delivery_cost_actual'] = 0;
// 获取订单对应的所有出入库明细
$deliveryList = $deliveryMdl->getDeliversByOrderId($sale['order_id']);
if (!$deliveryList) {
$msg = '销售单生成失败:订单未生成相关发货单';
return false;
}
$filterDeliveryId = array (0);
// 物流成本均摊
foreach ((array) $deliveryList as $delivery) {
if ($delivery['is_bind'] == 'true') {
$sale['delivery_cost_actual'] += $this->_share_delivery_cost($sale['order_id'],$delivery);
} else {
$sale['delivery_cost_actual'] += $delivery['delivery_cost_actual'];
}
$filterDeliveryId[] = $delivery['delivery_id'];
}
// 组织数据
$iostockList = array ();
foreach ($iostockMdl->getList('iostock_id,iostock_bn,type_id,original_bn,original_id,original_item_id,bn,unit_cost,inventory_cost', array ('original_id' => $filterDeliveryId, 'type_id' => constant('ome_iostock::LIBRARY_SOLD'))) as $iostock) {
$iostockList[$iostock['original_item_id']] = $iostock;
}
$dItemDetailList = array ();
foreach ($dItemDetailMdl->getList('*', array ('delivery_id' => $filterDeliveryId)) as $detail) {
$dItemDetailList[$detail['order_id']][$detail['order_obj_id']][$detail['order_item_id']]['inventory_cost'] += $iostockList[$detail['item_detail_id']]['inventory_cost'];
$dItemDetailList[$detail['order_id']][$detail['order_obj_id']][$detail['order_item_id']]['iostock_id'] = $iostockList[$detail['item_detail_id']]['iostock_id'];
$dItemDetailList[$detail['order_id']][$detail['order_obj_id']][$detail['order_item_id']]['iostock_bn'] = $iostockList[$detail['item_detail_id']]['iostock_bn'];
}
// 成本
foreach ($sale['sales_items'] as $si_key => $si_value) {
if (!$si_value['order_item_id']) { // 捆绑/礼包
$inventory_cost = 0;
foreach ($dItemDetailList[$sale['order_id']][$si_value['obj_id']] as $did_value) {
$inventory_cost += $did_value['inventory_cost'];
$si_value['iostock_id'] = $did_value['iostock_id'];
!$sale['iostock_bn'] && $sale['iostock_bn'] = $did_value['iostock_bn'];
}
$si_value['cost_amount'] = $inventory_cost;
$si_value['cost'] = bcdiv($si_value['cost_amount'], $si_value['nums'], 2);
$si_value['gross_sales'] = bcsub($si_value['sales_amount'], $si_value['cost_amount'], 2);
$si_value['gross_sales_rate'] = bcdiv($si_value['gross_sales'], $si_value['sales_amount'], 4) * 100;
} else { // 普通商品
$si_value['iostock_id'] = $dItemDetailList[$sale['order_id']][$si_value['obj_id']][$si_value['order_item_id']]['iostock_id'];
$si_value['cost_amount'] = $dItemDetailList[$sale['order_id']][$si_value['obj_id']][$si_value['order_item_id']]['inventory_cost'];
$si_value['cost'] = bcdiv($si_value['cost_amount'], $si_value['nums'], 2);
$si_value['gross_sales'] = bcsub($si_value['sales_amount'], $si_value['cost_amount'], 2);
$si_value['gross_sales_rate'] = bcdiv($si_value['gross_sales'], $si_value['sales_amount'], 4) * 100;
!$sale['iostock_bn'] && $sale['iostock_bn'] = $dItemDetailList[$sale['order_id']][$si_value['obj_id']][$si_value['order_item_id']]['iostock_bn'];
}
$sale['sales_items'][$si_key] = $si_value;
}
// 销售单号
$sale['sale_bn'] = $sales_instance->get_salse_bn();
if ( !$sales_instance->set($sale, $sales_msg) ){
$msg = '销售单生成失败:' . implode(',', $sales_msg);
return false;
}
}
return true;
}
$msg = '销售单生成SET方法不存在';
return false;
}
/**
* 存储出入库、销售记录
* @access public
* @param String $data 出入库、销售记录
* @param String $msg 消息
* @return boolean 成功or失败
*/
public function set($data,$io,&$msg,$type=null)
{
//拆单配置
$orderSplitLib = kernel::single('ome_order_split');
$split_seting = $orderSplitLib->get_delivery_seting();
$allow_commit = false;
// kernel::database()->beginTransaction();
$iostock_instance = kernel::single('ome_iostock');
$sales_instance = kernel::single('ome_sales');
if ( method_exists($iostock_instance, 'set') ){
//存储出入库记录
$iostock_data = $data['iostock'];
if(!$type){
eval('$type='.get_class($iostock_instance).'::LIBRARY_SOLD;');
}
$iostock_bn = $iostock_instance->get_iostock_bn($type);
if ( $iostock_instance->set($iostock_bn, $iostock_data, $type, $iostock_msg, $io) ){
if ( method_exists($sales_instance, 'set') )
{
if ($data['sales']['sales_items']){
//[拆单]过滤部分拆分OR部分发货时,不存储销售记录
$get_order_id = intval($data['sales']['order_id']);
$get_delivery_id = intval($data['sales']['delivery_id']);
if(!empty($split_seting)){
if($data['split_type'] && $get_order_id){
$allow_commit = $orderSplitLib->check_order_all_delivery($get_order_id, $get_delivery_id);
}
//[拆单]获取订单对应所有iostock出入库单
$order_delivery_iostock_data = $orderSplitLib->get_delivery_iostock_data($iostock_data);
//多个发货单累加物流成本
$delivery_cost_actual = $orderSplitLib->count_delivery_cost_actual($get_order_id);
if($delivery_cost_actual)
{
$sales_data['delivery_cost_actual'] = $delivery_cost_actual;
}
}else{
//防止_拆单多个发货单后_未发货就关闭“拆单功能”_出现生成多个发货单的错误
$allow_commit = $orderSplitLib->check_order_all_delivery($get_order_id, $get_delivery_id);
}
if(!$allow_commit)
{
//存储销售记录
$branch_id = '';
if ($data['sales']['sales_items']){
foreach ($data['sales']['sales_items'] as $k=>$v)
{
//[拆单]多个发货单时_iostock_id为NULL重新获取
if(!empty($iostock_data[$v['item_detail_id']]['iostock_id']))
{
$v['iostock_id'] = $iostock_data[$v['item_detail_id']]['iostock_id'];
}else{
$v['iostock_id'] = $order_delivery_iostock_data[$v['item_detail_id']]['iostock_id'];
}
$data['sales']['sales_items'][$k] = $v;
}
}
$data['sales']['iostock_bn'] = $iostock_bn;
$sales_data = $data['sales'];
$sale_bn = $sales_instance->get_salse_bn();
$sales_data['sale_bn'] = $sale_bn;
if ( $sales_instance->set($sales_data, $sales_msg) ){
$allow_commit = true;
}
}
} else{
foreach($data['sales'] as $k=>$v){
//[拆单]过滤部分拆分OR部分发货时,不存储销售记录
$get_order_id = intval($v['order_id']);
$get_delivery_id = intval($v['delivery_id']);
if(!empty($split_seting))
{
if($data['split_type'] && $get_order_id)
{
$allow_commit = $orderSplitLib->check_order_all_delivery($get_order_id, $get_delivery_id);
if($allow_commit)
{
continue;
}
}
//获取订单对应所有iostock出入库单
$order_delivery_iostock_data = $orderSplitLib->get_delivery_iostock_data($iostock_data);
//多个发货单累加物流成本
$delivery_cost_actual = $orderSplitLib->count_delivery_cost_actual($get_order_id);
if($delivery_cost_actual)
{
$data['sales'][$k]['delivery_cost_actual'] = $delivery_cost_actual;
}
}else{
//防止_拆单多个发货单后未发货就关闭“拆单功能”_出现生成多个发货单的错误
$allow_commit = $orderSplitLib->check_order_all_delivery($get_order_id, $get_delivery_id);
if($allow_commit)
{
continue;
}
}
//存储销售记录
$branch_id = '';
if ($data['sales'][$k]['sales_items']){
foreach ($data['sales'][$k]['sales_items'] as $kk=>$vv)
{
//[拆单]多个发货单时_iostock_id为NULL重新获取
if(!empty($iostock_data[$vv['item_detail_id']]['iostock_id']))
{
$vv['iostock_id'] = $iostock_data[$vv['item_detail_id']]['iostock_id'];
}else {
$vv['iostock_id'] = $order_delivery_iostock_data[$vv['item_detail_id']]['iostock_id'];
}
$data['sales'][$k]['sales_items'][$kk] = $vv;
}
}
$data['sales'][$k]['iostock_bn'] = $iostock_bn;
$sale_bn = $sales_instance->get_salse_bn();
$data['sales'][$k]['sale_bn'] = $sale_bn;
if ( $sales_instance->set($data['sales'][$k], $sales_msg) ){
$allow_commit = true;
}
}
}
}
//更新销售单上的成本单价和成本金额等字段
kernel::single('tgstockcost_instance_router')->set_sales_iostock_cost($io,$iostock_data);
}
}
if ($allow_commit == true){
// kernel::database()->commit();
return true;
}else{
// kernel::database()->rollBack();
$msg['instock'] = $iostock_msg;
$msg['sales'] = $sales_msg;
return false;
}
}
/**
* 组织出库数据
* @access public
* @param String $delivery_id 发货单ID
* @return sdf 出库数据
*/
public function get_iostock_data($delivery_id){
$delivery_items_detailObj = app::get('ome')->model('delivery_items_detail');
//发货单信息
$sql = 'SELECT `branch_id`,`delivery_bn`,`op_name`,`delivery_time`,`is_cod` FROM `sdb_ome_delivery` WHERE `delivery_id`=\''.$delivery_id.'\'';
$delivery_detail = $delivery_items_detailObj->db->selectrow($sql);
$delivery_items_detail = $delivery_items_detailObj->getList('*', array('delivery_id'=>$delivery_id), 0, -1);
$iostock_data = array();
if ($delivery_items_detail){
foreach ($delivery_items_detail as $k=>$v){
$iostock_data[$v['item_detail_id']] = array(
'order_id' => $v['order_id'],
'branch_id' => $delivery_detail['branch_id'],
'original_bn' => $delivery_detail['delivery_bn'],
'original_id' => $delivery_id,
'original_item_id' => $v['item_detail_id'],
'supplier_id' => '',
'bn' => $v['bn'],
'iostock_price' => $v['price'],
'nums' => $v['number'],
'cost_tax' => '',
'oper' => $delivery_detail['op_name'],
'create_time' => $delivery_detail['delivery_time'],
'operator' => $delivery_detail['op_name'],
'settle_method' => '',
'settle_status' => '0',
'settle_operator' => '',
'settle_time' => '',
'settle_num' => '',
'settlement_bn' => '',
'settlement_money' => '0',
'memo' => '',
);
}
}
unset($delivery_detail,$delivery_items_detail);
return $iostock_data;
}
///////////////////////////////////////////////////////////
/**
* 重写 组织销售单数据
* @access public
* @param Array $delivery_id 发货单ID
* @return sales_data 销售单数据
* */
public function get_sales_data($delivery_id,$deliverytime = false){
$order_original_data = array();
$sales_data = array();
$deliveryObj = app::get('ome')->model('delivery');
$orderIds = $deliveryObj->getOrderIdsByDeliveryIds(array($delivery_id));
$ome_original_dataLib = kernel::single('ome_sales_original_data');
$ome_sales_dataLib = kernel::single('ome_sales_data');
foreach ($orderIds as $key => $orderId){
$order_original_data = $ome_original_dataLib->init($orderId);
if($order_original_data){
$sales_data[$orderId] = $ome_sales_dataLib->generate($order_original_data,$delivery_id);
if(!$sales_data[$orderId]){
return false;
}
}else{
return false;
}
unset($order_original_data);
}
//平摊预估物流运费,主要处理订单合并发货以及多包裹单的运费问题
$ome_sales_logistics_feeLib = kernel::single('ome_sales_logistics_fee');
$ome_sales_logistics_feeLib->calculate($orderIds,$sales_data);
return $sales_data;
}
public function get_sales_delivery_data($deliveryId, $salesData = array()) {
$deliveryObj = app::get('ome')->model('delivery');
$deliveryDetail = $deliveryObj->db_dump(array('delivery_id'=>$deliveryId),'process');
$delivery_items_detailObj = app::get('ome')->model('delivery_items_detail');
$delivery_items_detail = $delivery_items_detailObj->getList('*', array('delivery_id'=>$deliveryId), 0, -1);
if(empty($salesData)) {
$salesData = $this->get_sales_data($deliveryId);
}
$productId = array();
foreach ($delivery_items_detail as $item) {
$productId[] = $item['product_id'];
}
$productGoods = kernel::single('ome_goods_product')->getProductGoods($productId);
$arrOrder = $this->order;
$itemSalePrice = kernel::single('ome_sales_price')->getItemProductSalePrice($salesData, $arrOrder, $productGoods);
$salesDeliveryData = array();
foreach ($delivery_items_detail as $val) {
$tmpSaleDeliveryData = array();
$tmpSaleDeliveryData['delivery_id'] = $val['delivery_id'];
$tmpSaleDeliveryData['delivery_item_id'] = $val['delivery_item_id'];
$tmpSaleDeliveryData['order_id'] = $val['order_id'];
$tmpSaleDeliveryData['order_obj_id'] = $val['order_obj_id'];
$tmpSaleDeliveryData['order_item_id'] = $val['order_item_id'];
$tmpSaleDeliveryData['item_type'] = $val['item_type'];
$tmpSaleDeliveryData['shop_id'] = $arrOrder[$val['order_id']]['shop_id'];
$tmpSaleDeliveryData['branch_id'] = $salesData[$val['order_id']]['branch_id'];
$tmpSaleDeliveryData['pay_time'] = $arrOrder[$val['order_id']]['paytime'];
$tmpSaleDeliveryData['delivery_time'] = $salesData[$val['order_id']]['ship_time'];
$tmpSaleDeliveryData['product_id'] = $val['product_id'];
$tmpSaleDeliveryData['cat_id'] = $productGoods[$val['product_id']]['goods']['cat_id'];
$tmpSaleDeliveryData['type_id'] = $productGoods[$val['product_id']]['goods']['type_id'];
$tmpSaleDeliveryData['brand_id'] = $productGoods[$val['product_id']]['goods']['brand_id'];
$tmpSaleDeliveryData['bn'] = $val['bn'];
$tmpSaleDeliveryData['name'] = $productGoods[$val['product_id']]['name'];
$tmpSaleDeliveryData['nums'] = $val['number'];
$tmpItemSalePrice = $itemSalePrice[$val['order_item_id']];
$tmpSaleDeliveryData['spec_name'] = $tmpItemSalePrice['spec_name'];
if($val['number'] == $tmpItemSalePrice['number']){
$tmpSaleDeliveryData['price'] = $tmpItemSalePrice['price'];
$tmpSaleDeliveryData['pmt_price'] = $tmpItemSalePrice['pmt_price'];
$tmpSaleDeliveryData['sale_price'] = $tmpItemSalePrice['sale_price'];
$tmpSaleDeliveryData['apportion_pmt'] = $tmpItemSalePrice['apportion_pmt'];
$tmpSaleDeliveryData['sales_amount'] = $tmpItemSalePrice['sales_amount'];
} else {
$sendNum = $arrOrder[$val['order_id']]['order_objects'][$val['order_obj_id']]['order_items'][$val['order_item_id']]['sendnum'];
if($deliveryDetail['process'] == 'true') {
$sendNum -= $val['number'];
}
if(($val['number'] + $sendNum) == $tmpItemSalePrice['number']) {
$tmpSaleDeliveryData['pmt_price'] = bcsub($tmpItemSalePrice['pmt_price'],
bcmul($sendNum/$tmpItemSalePrice['number'], $tmpItemSalePrice['pmt_price'], 2), 2);
$tmpSaleDeliveryData['sale_price'] = bcsub($tmpItemSalePrice['sale_price'],
bcmul($sendNum/$tmpItemSalePrice['number'], $tmpItemSalePrice['sale_price'], 2), 2);
$tmpSaleDeliveryData['apportion_pmt'] = bcsub($tmpItemSalePrice['apportion_pmt'],
bcmul($sendNum/$tmpItemSalePrice['number'], $tmpItemSalePrice['apportion_pmt'], 2), 2);
$tmpSaleDeliveryData['price'] = bcdiv(
bcadd($tmpSaleDeliveryData['sale_price'], $tmpSaleDeliveryData['pmt_price'], 2),
$val['number'], 2);;
$tmpSaleDeliveryData['sales_amount'] = bcsub($tmpSaleDeliveryData['sale_price'], $tmpSaleDeliveryData['apportion_pmt'], 2);
} else {
$tmpSaleDeliveryData['pmt_price'] = bcmul($tmpItemSalePrice['pmt_price'],
$val['number']/$tmpItemSalePrice['number'], 2);
$tmpSaleDeliveryData['sale_price'] = bcmul($tmpItemSalePrice['sale_price'],
$val['number']/$tmpItemSalePrice['number'], 2);
$tmpSaleDeliveryData['apportion_pmt'] = bcmul($tmpItemSalePrice['apportion_pmt'],
$val['number']/$tmpItemSalePrice['number'], 2);
$tmpSaleDeliveryData['price'] = bcdiv(
bcadd($tmpSaleDeliveryData['sale_price'], $tmpSaleDeliveryData['pmt_price'], 2),
$val['number'], 2);;
$tmpSaleDeliveryData['sales_amount'] = bcsub($tmpSaleDeliveryData['sale_price'], $tmpSaleDeliveryData['apportion_pmt'], 2);
}
}
$salesDeliveryData[] = $tmpSaleDeliveryData;
}
return $salesDeliveryData;
}
#订单修改
/**
* order_update_sales_delivery
* @param mixed $deliveryId ID
* @param mixed $orderId ID
* @return mixed 返回值
*/
public function order_update_sales_delivery($deliveryId, $orderId) {
$salesDeliveryData = $this->get_sales_delivery_data($deliveryId);
$saleDeliveryModel = app::get('sales')->model('delivery_order_item');
foreach ($salesDeliveryData as $val) {
if($val['order_id'] == $orderId) {
$upData = array();
$upData['price'] = $val['price'];
$upData['pmt_price'] = $val['pmt_price'];
$upData['sale_price'] = $val['sale_price'];
$upData['apportion_pmt'] = $val['apportion_pmt'];
$upData['sales_amount'] = $val['sales_amount'];
$saleDeliveryModel->update($upData, array('delivery_id'=>$val['delivery_id'], 'order_item_id'=>$val['order_item_id']));
}
}
}
/**
* [拆单]判断订单是否已全部发货
*
* @param int $order_id
* @param int $delivery_id
* @return boolean
*/
public function check_order_all_delivery($order_id, $delivery_id)
{
//订单"部分拆分"不生成销售单
$sql = "SELECT process_status FROM sdb_ome_orders WHERE order_id='".$order_id."'";
$row = kernel::database()->selectrow($sql);
if($row['process_status'] == 'splitting')
{
return true;
}
//判断——订单所属发货单是否全部发货 process!='true'
$sql = "SELECT dord.delivery_id, d.delivery_bn, d.process, d.status FROM sdb_ome_delivery_order AS dord
LEFT JOIN sdb_ome_delivery AS d ON(dord.delivery_id=d.delivery_id)
WHERE dord.order_id='".$order_id."' AND d.delivery_id!='".$delivery_id."' AND d.process!='true'
AND (d.parent_id=0 OR d.is_bind='true') AND d.disabled='false' AND d.status NOT IN('failed','cancel','back','return_back')";
$row = kernel::database()->selectrow($sql);
if(!empty($row))
{
return true;
}
return false;
}
/**
* [拆单]余单撤消后_生成销售单
*
* @param Array $data 订单号ID
* @param number $io 默认0出库
* @param string $type
* @return boolean|unknown
*/
public function add_to_sales($data, $io=0, $type=null)
{
$iostock_instance = kernel::service('ome.iostock');
if (method_exists($iostock_instance, 'set') == false){
return false;
}
//存储出入库记录
$iostock_data = $data['iostock'];
if(!$type) {
eval('$type='.get_class($iostock_instance).'::LIBRARY_SOLD;');
}
$iostock_bn = $iostock_instance->get_iostock_bn($type);
$rs = $this->data_to_sale($data, $iostock_data, $iostock_bn, $io);
$allow_commit = $rs['allow_commit'];
return $allow_commit;
}
/**
* [拆单]获取订单对应所有iostock出入库单
*
* @param Array $iostock_data 出入库单
* @return Array
*/
public function get_delivery_iostock_data($iostock_data)
{
$order_ids = $delivery_ids = array();
foreach ($iostock_data as $key => $val)
{
$order_ids[$val['order_id']] = $val['order_id'];
}
$in_order_id = implode(',', $order_ids);
//获取订单对应所有发货单delivery_id
$sql = "SELECT dord.delivery_id FROM sdb_ome_delivery_order AS dord LEFT JOIN sdb_ome_delivery AS d ON(dord.delivery_id=d.delivery_id)
WHERE dord.order_id in(".$in_order_id.") AND (d.parent_id=0 OR d.is_bind='true') AND d.disabled='false'
AND d.status NOT IN('failed','cancel','back','return_back')";
$temp_data = kernel::database()->select($sql);
foreach ($temp_data as $key => $val)
{
$delivery_ids[] = $val['delivery_id'];
}
//读取出库记录
$result = array();
$ioObj = app::get('ome')->model('iostock');
$field = 'iostock_id, iostock_bn, type_id, branch_id, original_bn, original_id, original_item_id, bn';
$temp_data = $ioObj->getList($field, array('original_id'=>$delivery_ids, 'type_id'=>3));
foreach ($temp_data as $key => $val)
{
$result[$val['original_item_id']] = $val;
}
return $result;
}
/**
* [拆单]多个发货单累加物流成本
*
* @param Array $order_id 出入库单
* @return boolean|number
*/
public function count_delivery_cost_actual($order_id)
{
$oDelivery = app::get('ome')->model('delivery');
$delivery_ids = $temp_data = array();
//获取订单对应所有发货单delivery_id
$sql = "SELECT dord.delivery_id FROM sdb_ome_delivery_order AS dord LEFT JOIN sdb_ome_delivery AS d ON(dord.delivery_id=d.delivery_id)
WHERE dord.order_id='".$order_id."' AND (d.parent_id=0 OR d.is_bind='true') AND d.disabled='false'
AND d.status NOT IN('failed','cancel','back','return_back')";
$temp_data = kernel::database()->select($sql);
//[无拆单]订单只有一个发货单,直接返回false
if(count($temp_data) < 2){
return false;
}
foreach ($temp_data as $key => $val)
{
$delivery_ids[] = $val['delivery_id'];
}
//累加物流成本
$dly_data = $oDelivery->getList('delivery_id, delivery_cost_actual, parent_id, is_bind', array('delivery_id'=>$delivery_ids));
$delivery_cost_actual = 0;
foreach ($dly_data as $key => $val)
{
//[合并发货单]重新计算物流运费
if($val['is_bind'] == 'true'){
$val['delivery_cost_actual'] = $this->compute_delivery_cost_actual($order_id, $val['delivery_id'], $val['delivery_cost_actual']);
}
$delivery_cost_actual += floatval($val['delivery_cost_actual']);
}
return $delivery_cost_actual;
}
/**
* [拆单]合并发货单_平摊预估物流运费
*
* @param Array $order_id
* @param Array $delivery_id
* @param Array
*/
public function compute_delivery_cost_actual($order_id, $delivery_id, $delivery_cost_actual)
{
$oOrders = app::get('ome')->model('orders');
$oDelivery = app::get('ome')->model('delivery');
$orderIds = $oDelivery->getOrderIdsByDeliveryIds(array($delivery_id));
$sales_data = $temp_data = array();
$temp_data = $oOrders->getList('order_id, payed', array('order_id'=>$orderIds));
foreach ($temp_data as $key => $val)
{
$val['delivery_cost_actual'] = $delivery_cost_actual;
$sales_data[$val['order_id']] = $val;
}
//平摊预估物流运费,主要处理订单合并发货以及多包裹单的运费问题
$ome_sales_logistics_feeLib = kernel::single('ome_sales_logistics_fee');
$ome_sales_logistics_feeLib->calculate($orderIds,$sales_data);
return $sales_data[$order_id]['delivery_cost_actual'];//返回所查订单的平摊物流费用
}
}