vr-shopxo-source/application/service/OrderSplitService.php

201 lines
7.7 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<?php
// +----------------------------------------------------------------------
// | ShopXO 国内领先企业级B2C免费开源电商系统
// +----------------------------------------------------------------------
// | Copyright (c) 2011~2019 http://shopxo.net All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: Devil
// +----------------------------------------------------------------------
namespace app\service;
use think\Db;
use app\service\WarehouseService;
/**
* 订单拆分服务层
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @date 2020-07-18
* @desc description
*/
class OrderSplitService
{
/**
* 订单拆分入口
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @date 2020-07-18
* @desc description
* @param [array] $params [输入参数]
*/
public static function Run($params = [])
{
// 请求参数
$p = [
[
'checked_type' => 'empty',
'key_name' => 'goods',
'error_msg' => '商品为空',
],
[
'checked_type' => 'is_array',
'key_name' => 'goods',
'error_msg' => '商品有误',
],
];
$ret = ParamsChecked($params, $p);
if($ret !== true)
{
return DataReturn($ret, -1);
}
// 商品仓库集合
$data = self::GoodsWarehouseAggregate($params['goods']);
return DataReturn('操作成功', 0, $data);
}
/**
* 商品仓库集合
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @date 2020-07-18
* @desc description
* @param [array] $data [商品数据]
*/
public static function GoodsWarehouseAggregate($data)
{
// 仓库组扩展展示数据
// name 名称
// price 金额
// type 类型0减少, 1增加
// tips 提示信息
// business 业务类型(内容格式不限)
// ext 扩展数据(内容格式不限)
// $extension_data = [
// [
// 'name' => '感恩节9折',
// 'price' => 23,
// 'type' => 0,
// 'tips' => '-¥23元',
// 'business' => null,
// 'ext' => null,
// ],
// ];
// 数据分组
$result = [];
foreach($data as $v)
{
// 不存在规格则使用默认
$spec = empty($v['spec']) ? [['type' => '默认规格','value' => 'default']] : $v['spec'];
// 获取商品库存
$where = [
'wgs.goods_id' => $v['goods_id'],
'wgs.md5_key' => md5(implode('', array_column($spec, 'value'))),
'wg.is_enable' => 1,
'w.is_enable' => 1,
'w.is_delete_time' => 0,
];
$field = 'distinct w.id,w.name,w.alias,w.lng,w.lat,w.province,w.city,w.county,w.address,wgs.inventory,w.is_default,w.level';
$warehouse = Db::name('WarehouseGoodsSpec')->alias('wgs')->join(['__WAREHOUSE_GOODS__'=>'wg'], 'wgs.warehouse_id=wg.warehouse_id')->join(['__WAREHOUSE__'=>'w'], 'wg.warehouse_id=w.id')->where($where)->field($field)->order('w.level desc,w.is_default desc,wgs.inventory desc')->select();
// 默认仓库
$warehouse_default = [];
// 商品仓库分组
if(!empty($warehouse))
{
foreach($warehouse as $w)
{
// 是否还存在未分配的数量
if($v['stock'] > 0)
{
// 赋值数据
$temp_v = $v;
// 购买数量计算
if($temp_v['stock'] > $w['inventory'])
{
$temp_v['stock'] = $w['inventory'];
}
// 总价计算
$temp_v['total_price'] = $temp_v['price']*$temp_v['stock'];
// 减除数量
$v['stock'] -= $w['inventory'];
// 是否第一次赋值
if(!array_key_exists($w['id'], $result))
{
// 仓库
$warehouse_handle = WarehouseService::DataHandle([$w]);
$result[$w['id']] = $warehouse_handle[0];
$result[$w['id']]['extension_data'] = [
[
'name' => '感恩节9折',
'price' => 23,
'type' => 0,
'tips' => '-¥23元',
'business' => null,
'ext' => null,
],
];
$result[$w['id']]['goods_items'] = [];
unset($result[$w['id']]['is_default'], $result[$w['id']]['level'], $result[$w['id']]['inventory']);
// 订单基础信息
$result[$w['id']]['items_total_price'] = 0;
$result[$w['id']]['items_stock_total'] = 0;
}
// 商品归属到仓库下
$result[$w['id']]['goods_items'] = array_merge($result[$w['id']]['goods_items'], [$temp_v]);
// 基础信息
$result[$w['id']]['items_total_price'] += $temp_v['total_price'];
$result[$w['id']]['items_stock_total'] += $temp_v['stock'];
} else {
break;
}
}
} else {
// 未获取到仓库则使用默认仓库
if(empty($warehouse_default))
{
$warehouse_default = Db::name('Warehouse')->where(['is_default'=>1, 'is_enable'=>1, 'is_delete_time'=>0])->field('id,name,alias,lng,lat,province,city,county,address')->find();
}
if(!empty($warehouse_default))
{
if(!array_key_exists($warehouse_default['id'], $result))
{
// 仓库
$warehouse_handle = WarehouseService::DataHandle([$warehouse_default]);
$result[$warehouse_default['id']] = $warehouse_handle[0];
$result[$warehouse_default['id']]['extension_data'] = [];
$result[$warehouse_default['id']]['goods_items'] = [];
// 订单基础信息
$result[$warehouse_default['id']]['items_total_price'] = 0;
$result[$warehouse_default['id']]['items_stock_total'] = 0;
}
// 商品归属到仓库下
$result[$warehouse_default['id']]['goods_items'][] = $v;
// 基础信息
$result[$warehouse_default['id']]['items_total_price'] += $temp_v['total_price'];
$result[$warehouse_default['id']]['items_stock_total'] += $temp_v['stock'];
}
}
}
return array_values($result);
}
}
?>