mirror of
https://gitee.com/ShopeX/OMS
synced 2026-03-23 10:55:34 +08:00
724 lines
33 KiB
PHP
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'];//返回所查订单的平摊物流费用
|
|
}
|
|
} |