OrderSplitService.php 7.7 KB
Newer Older
D
devil 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
<?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);
        }

        // 商品仓库集合
57 58
        $data = self::GoodsWarehouseAggregate($params['goods']);
        return DataReturn('操作成功', 0, $data);
D
devil 已提交
59 60 61 62 63 64 65 66 67 68 69 70 71
    }

    /**
     * 商品仓库集合
     * @author  Devil
     * @blog    http://gong.gg/
     * @version 1.0.0
     * @date    2020-07-18
     * @desc    description
     * @param   [array]          $data [商品数据]
     */
    public static function GoodsWarehouseAggregate($data)
    {
72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90
        // 仓库组扩展展示数据
        // name 名称
        // price 金额
        // type 类型(0减少, 1增加)
        // tips 提示信息
        // business 业务类型(内容格式不限)
        // ext 扩展数据(内容格式不限)
        // $extension_data = [
            // [
            //     'name'       => '感恩节9折',
            //     'price'      => 23,
            //     'type'       => 0,
            //     'tips'       => '-¥23元',
            //     'business'   => null,
            //     'ext'        => null,
            // ],
        // ];

        // 数据分组
D
devil 已提交
91 92 93 94
        $result = [];
        foreach($data as $v)
        {
            // 不存在规格则使用默认
95
            $spec = empty($v['spec']) ? [['type' => '默认规格','value' => 'default']] : $v['spec'];
D
devil 已提交
96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118

            // 获取商品库存
            $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)
                    {
D
devil 已提交
119 120 121 122 123 124 125 126 127 128 129 130 131
                        // 赋值数据
                        $temp_v = $v;

                        // 购买数量计算
                        if($temp_v['stock'] > $w['inventory'])
                        {
                            $temp_v['stock'] = $w['inventory'];
                        }

                        // 总价计算
                        $temp_v['total_price'] = $temp_v['price']*$temp_v['stock'];

                        // 减除数量
D
devil 已提交
132 133 134 135 136
                        $v['stock'] -= $w['inventory'];

                        // 是否第一次赋值
                        if(!array_key_exists($w['id'], $result))
                        {
D
devil 已提交
137
                            // 仓库
D
devil 已提交
138 139
                            $warehouse_handle = WarehouseService::DataHandle([$w]);
                            $result[$w['id']] = $warehouse_handle[0];
140 141 142 143 144 145 146 147 148 149
                            $result[$w['id']]['extension_data'] = [
                                [
                                    'name'       => '感恩节9折',
                                    'price'      => 23,
                                    'type'       => 0,
                                    'tips'       => '-¥23元',
                                    'business'   => null,
                                    'ext'        => null,
                                ],
                            ];
D
devil 已提交
150 151
                            $result[$w['id']]['goods_items'] = [];
                            unset($result[$w['id']]['is_default'], $result[$w['id']]['level'], $result[$w['id']]['inventory']);
D
devil 已提交
152 153 154 155

                            // 订单基础信息
                            $result[$w['id']]['items_total_price'] = 0;
                            $result[$w['id']]['items_stock_total'] = 0;
D
devil 已提交
156 157 158
                        }

                        // 商品归属到仓库下
D
devil 已提交
159 160 161 162 163
                        $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'];
D
devil 已提交
164 165 166 167 168 169 170 171 172 173 174 175 176 177
                    } 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))
                    {
D
devil 已提交
178
                        // 仓库
D
devil 已提交
179 180
                        $warehouse_handle = WarehouseService::DataHandle([$warehouse_default]);
                        $result[$warehouse_default['id']] = $warehouse_handle[0];
181
                        $result[$warehouse_default['id']]['extension_data'] = [];
D
devil 已提交
182
                        $result[$warehouse_default['id']]['goods_items'] = [];
D
devil 已提交
183 184 185 186

                        // 订单基础信息
                        $result[$warehouse_default['id']]['items_total_price'] = 0;
                        $result[$warehouse_default['id']]['items_stock_total'] = 0;
D
devil 已提交
187 188 189 190
                    }

                    // 商品归属到仓库下
                    $result[$warehouse_default['id']]['goods_items'][] = $v;
D
devil 已提交
191 192 193 194

                    // 基础信息
                    $result[$warehouse_default['id']]['items_total_price'] += $temp_v['total_price'];
                    $result[$warehouse_default['id']]['items_stock_total'] += $temp_v['stock'];
D
devil 已提交
195 196 197 198 199 200 201
                }
            }
        }
        return array_values($result);
    }
}
?>