jh-admin/addon/store/model/cashier/CashierOrderCreate.php

827 lines
36 KiB
PHP

<?php
/**
* SaaSMall商城系统 - 团队十年电商经验汇集巨献!
* =========================================================
* Copy right 2019-2029 上海牛之云网络科技有限公司, 保留所有权利。
* ----------------------------------------------
* 官方网址: https://www.gobuysaas.com
* =========================================================
*/
namespace addon\store\model\cashier;
use addon\store\model\goods\Goods;
use addon\store\model\member\MemberOnceCard;
use addon\store\model\order\OrderCommonCreate;
use addon\store\model\stock\Stock;
use app\model\system\Pay;
use app\model\web\Config as ConfigModel;
/**
* 挂单
*
* @author Administrator
*
*/
class CashierOrderCreate extends OrderCommonCreate
{
/**
* 订单创建
* @param unknown $data
*/
public function create($calculate_data)
{
$calculate_data = $this->calculate($calculate_data);
if ($calculate_data[ 'code' ] < 0)
return $calculate_data;
if (isset($calculate_data[ 'code' ]) && $calculate_data[ 'code' ] < 0)
return $calculate_data;
$check_error = $this->checkError();
if ($check_error[ 'code' ] < 0) {
return $check_error;
}
$calculate_data = $calculate_data[ 'data' ];
model('store_cashier_order')->startTrans();
try {
$member_id = $calculate_data[ 'member_id' ] ?? 0;
$pay = new Pay();
$out_trade_no = $pay->createOutTradeNo($member_id);
$site_id = $calculate_data[ 'site_id' ];
$order_no = $this->createOrderNo($site_id, $member_id);
$site_info = $calculate_data[ 'site_info' ];
$site_type = $site_info[ 'site_type' ];
$order_name = $calculate_data[ 'order_name' ] ?? '';
$member_info = $calculate_data[ 'member_info' ] ?? [];
$nickname = $member_info[ 'nickname' ] ?? '';//会员昵称
$headimg = $member_info[ 'headimg' ] ?? '';
$mobile = $member_info['mobile'] ?? '';
$nickname = !empty($nickname) ? $nickname : $mobile;
$goods_list = $calculate_data[ 'goods_list' ] ?? [];
$pay_money = $calculate_data[ 'pay_money' ] ?? 0;
$order_status = 'topay';//订单状态
$store_id = $calculate_data[ 'store_id' ] ?? 0;
$store_info = $calculate_data[ 'store_info' ] ?? [];
$store_name = $store_info[ 'store_name' ] ?? '';
$goods_id_array = array_unique(array_column($goods_list, 'goods_id'));
$goods_ids = ',' . implode(',', $goods_id_array) . ',';
$extend = $calculate_data[ 'extend' ] ?? [];
$order_type = $calculate_data[ 'order_type' ];
$cashier_type = $calculate_data[ 'cashier_type' ];
$sell_time = $calculate_data[ 'create_time' ] ?? 0;
if ($sell_time == 0) {
$sell_time = time();
} else {
$sell_time = strtotime($sell_time);
}
$operator = $calculate_data['operator'] ?? [];
$operator_id = $operator['uid'] ?? 0;
$operator_name = $operator['username'] ?? '';
//创建订单
$data_order = [
'order_no' => $order_no,
'site_id' => $site_id,
'site_name' => $site_info[ 'site_name' ],
'order_name' => $order_name,
'out_trade_no' => $out_trade_no,
'status' => $order_status,
'member_id' => $member_id,
'nickname' => $nickname,
'headimg' => $headimg,
'mobile' => $mobile,
'pay_money' => $calculate_data[ 'pay_money' ],
'goods_money' => $calculate_data[ 'goods_money' ],
'real_goods_money' => $calculate_data[ 'real_goods_money' ],
'order_money' => $calculate_data[ 'order_money' ],
'store_id' => $store_id,
'store_name' => $store_name,
'goods_ids' => $goods_ids,
'create_time' => time(),
'sell_time' => $sell_time,
'order_type' => $order_type,
'remark' => $calculate_data[ 'remark' ] ?? '',
'cashier_type' => $cashier_type,
'site_type' => $calculate_data[ 'app_module' ] ?? '',
'operator_id' => $operator_id,
'operator_name' => $operator_name,
];
switch($order_type){
case 'goods':
$is_can_refund = 1;
break;
case 'card':
$is_can_refund = 1;
break;
case 'recharge':
$is_can_refund = 0;
break;
}
$data_order['is_can_refund'] = $is_can_refund ?? 0;
//店铺优惠
$discount_money = $calculate_data['coupon_money'] ?? 0;
//抵扣金额
$balance_money = $calculate_data['balance_money'] ?? 0;
$point_money = $calculate_data['point_money'] ?? 0;
$hongbao_money = $calculate_data['hongbao_money'] ?? 0;
$offset_money = $calculate_data['offset_money'] ?? 0;
// $offset_money = $balance_money + $point_money + $hongbao_money;
$order_pay_data = array(
'total_balance' => $calculate_data['total_balance'] ?? 0,//总余额
'point' => $calculate_data['point'] ?? 0,
'point_money' => $calculate_data['point_money'] ?? 0,
'coupon_id' => $calculate_data['coupon_id'] ?? 0,
'coupon_money' => $calculate_data['coupon_money'] ?? 0,
'hongbao_money' => $calculate_data['hongbao_money'] ?? 0,
'hongbao_id' => $calculate_data['hongbao_id'] ?? '',
'discount_money' => $discount_money,
'offset_money' => $offset_money,
);
$data_order = array_merge($data_order, $order_pay_data);
$order_id = model('store_cashier_order')->add($data_order);
$calculate_data[ 'order_no' ] = $order_no;
$calculate_data[ 'out_trade_no' ] = $out_trade_no;
$order_goods_id_map = [];
$can_refund_num = 0;
$store_stock_model = new Stock();
foreach ($goods_list as $goods_k => $goods_info) {
$card_item_id = $goods_info[ 'card_item_id' ] ?? 0;
//订单项目表
$data_order_goods = [
'order_id' => $order_id,
'site_id' => $site_id,
'member_id' => $member_id,
'goods_id' => $goods_info[ 'goods_id' ],
'sku_id' => $goods_info[ 'sku_id' ],
'goods_name' => $goods_info[ 'goods_name' ],
'goods_image' => $goods_info[ 'goods_image' ],
'spec_name' => $goods_info[ 'spec_name' ],
'price' => $goods_info[ 'price' ],
'num' => $goods_info[ 'num' ],
'goods_money' => $goods_info[ 'goods_money' ],
'card_item_id' => $card_item_id,
'trade_type' => $goods_info[ 'trade_type' ],
'store_id' => $store_id,
'extend' => json_encode($extend),
'real_goods_money' => $goods_info['real_goods_money'],
];
$item_is_can_refund = 0;
if($is_can_refund){
if($card_item_id == 0) {
switch ($goods_info['trade_type']) {
case '':
$item_is_can_refund = 1;
break;
case 'oncecard':
$item_is_can_refund = 1;
break;
case 'service':
$item_is_can_refund = 1;
break;
}
}
}
if($item_is_can_refund){
$can_refund_num++;
}
$data_order_goods['is_can_refund'] = $item_is_can_refund ?? 0;
//扣除销售库存
if($order_type == 'goods'){
if(empty($goods_info['trade_type'])){
$sku_name = $goods_info[ 'goods_name' ].$goods_info[ 'spec_name' ];
$stock_params = $data_order_goods;
$stock_params['sku_name'] = $sku_name;
$stock_result = $store_stock_model->decSaleStock($stock_params);
if($stock_result['code'] < 0){
model('store_cashier_order')->rollback();
return $stock_result;
}
}
}
$order_goods_id = model('store_cashier_order_goods')->add($data_order_goods);
$goods_list[$goods_k]['order_goods_id'] = $order_goods_id;
$order_goods_id_map[$goods_k] = $order_goods_id;
}
//轮询订单项的退款
if($can_refund_num == 0){
model('store_cashier_order')->update(['is_can_refund' => 0], [['order_id', '=', $order_id]]);
}
$calculate_data[ 'order_id' ] = $order_id;
$calculate_data['order_goods_id_map'] = $order_goods_id_map;
//赠品项
$reward_goods_list = $calculate_data['reward_goods_list'] ?? [];
foreach($reward_goods_list as $k => $v){
//订单项目表
$reward_order_goods_data = [
'order_id' => $order_id,
'site_id' => $site_id,
'member_id' => $member_id,
'goods_id' => $v[ 'goods_id' ],
'sku_id' => $v[ 'sku_id' ],
'goods_name' => $v[ 'goods_name' ],
'goods_image' => $v[ 'goods_image' ],
'spec_name' => $v[ 'spec_name' ],
'price' => $v[ 'price' ],
'num' => $v[ 'num' ],
'goods_money' => $v[ 'goods_money' ],
'card_item_id' => 0,
'trade_type' => $v[ 'trade_type' ],
'store_id' => $store_id,
'extend' => json_encode([]),
'real_goods_money' => $v['real_goods_money'],
'is_can_refund' => 0,
'is_gift' => 1
];
$refund_order_goods_id = model('store_cashier_order_goods')->add($reward_order_goods_data);
//扣除销售库存
if(empty($v['trade_type'])){
$sku_name = $v[ 'goods_name' ].$v[ 'spec_name' ];
$stock_params = $reward_order_goods_data;
$stock_params['sku_name'] = $sku_name;
$stock_result = $store_stock_model->decSaleStock($stock_params);
if($stock_result['code'] < 0){
//赠品库存不足也无所谓
}
}
}
//现在扣除余额
$cashier_pay_model = new CashierOrderPay();
$offset_result = $cashier_pay_model->deductOffset($calculate_data);
if($offset_result['code'] < 0){
model('store_cashier_order')->rollback();
return $offset_result;
}
//创建奖励
$reward_result = $cashier_pay_model->rewardAction($calculate_data);
if ($reward_result['code'] < 0) {
model('store_cashier_order')->rollback();
return $reward_result;
}
model('store_cashier_order')->commit();
$res = [
'order_id' => $order_id,
'out_trade_no' => $out_trade_no
];
// 生成整体付费支付单据
$pay->addPay($calculate_data[ 'site_id' ], $out_trade_no, $this->pay_type, $order_name, $order_name, $pay_money, '', 'CashierOrderPayNotify', '');
return $this->success($res);
} catch (\Exception $e) {
model('store_cashier_order')->rollback();
return $this->error('', $e->getMessage() . $e->getFile() . $e->getLine());
}
}
/**
* 订单创建
* @param unknown $data
*/
// public function create($data)
// {
// //查询出会员相关信息
// $calculate_data = $this->calculate($data);
// if ($calculate_data[ 'code' ] < 0)
// return $calculate_data;
//
// $result = parent::create($calculate_data[ 'data' ]);
// //订单创建成功
// if ($result[ 'code' ] >= 0) {
//
// }
// return $result;
//
// }
/**
* 订单计算
* @param $data
* @return mixed
*/
public function calculate($data)
{
$type = $data[ 'type' ] ?? '';
$data['site_type'] = $data['app_module'];
$data = $this->initStore($data);//初始化仓库门店
// $data = $this->initMemberAddress($data); //初始化地址
$member_id = $data[ 'member_id' ] ?? 0;
$data = $this->initSiteData($data); //初始化站点信息
// $data = $this->initPointConfig($data);//初始化消费返积分倍率
// $data = $this->initGrowthConfig($data);//初始化消费返成长值倍率
if ($member_id > 0) {
$data = $this->initMemberAccount($data); //初始化会员账户
$data = $this->initMemberLevel($data);//初始化会员卡权益
}
//商品列表信息
$calculate_result = $this->getItemList($data);
if ($calculate_result[ 'code' ] < 0) {
return $calculate_result;
}
//抵扣优惠计算
$calculate = $calculate_result['data'];
$cashier_calculate_model = new CashierOrderCalculate();
$calculate_result = $cashier_calculate_model->promotionCalculate($calculate);
if ($calculate_result[ 'code' ] < 0) {
return $calculate_result;
}
return $calculate_result;
}
/**
* 购买项列表
* @param $data
* @return mixed
*/
public function getItemList($data)
{
$type = $data[ 'type' ];
$order_name = '';
$goods_list = [];
$data_result = event('CashierCalculate', $data, true);
if(empty($data_result)){
switch ( $type ) {
case 'level'://会员卡
$data[ 'order_type' ] = 'level';
$goods_money = 0;
$sku_array = $data[ 'sku_array' ];
$sku_ids = array_column($sku_array, 'member_level_id');
$sku_data_array = array_column($sku_array, null, 'member_level_id');
$member_level_condition = array (
[ 'level_id', 'in', $sku_ids ]
);
$member_level_list = model('member_level')->getList($member_level_condition);
if (!empty($member_level_list)) {
foreach ($member_level_list as $k => $v) {
$payment_rules = empty($v[ 'payment_rules' ]) ? [] : json_decode($v[ 'payment_rules' ], true);
if (!empty($payment_rules)) {
$item_sku_id = $v[ 'level_id' ];
$sku_item = $sku_data_array[ $v[ 'level_id' ] ];
$spec = $sku_item[ 'spec' ];
$price = $payment_rules[ $spec ];
$num = 1;
$item_goods_money = $price * $num;
$goods_money += $item_goods_money;
switch ( $spec ) {
case 'month':
$spec_name = '月';
break;
case 'quarter':
$spec_name = '季';
break;
case 'year':
$spec_name = '年';
break;
}
$order_name = string_split($order_name, ',', $v[ 'level_name' ]);
$goods_list[] = array (
'goods_id' => $item_sku_id,
'sku_id' => $spec,
'price' => $price,
'num' => $num,
'goods_money' => $item_goods_money,
'goods_name' => $v[ 'level_name' ],
'goods_image' => '',
'spec_name' => $spec_name ?? '',
'trade_type' => 'level'
);
}
}
}
$data[ 'goods_money' ] = $goods_money;
$order_money = $goods_money;
$pay_money = $goods_money;
$data[ 'goods_list' ] = $goods_list;
$data[ 'order_name' ] = $order_name;
$data[ 'order_money' ] = $order_money;
$data[ 'pay_money' ] = $pay_money;
break;
case 'goods':
$data[ 'order_type' ] = 'goods';
//处理产品数据
$sku_array = $data[ 'sku_array' ] ?? [];
//消费分为产品和买单(暂)
$product_id_array = [];
$money_array = [];//买单
foreach ($sku_array as $k => $v) {
$sku_id = $v[ 'sku_id' ] ?? 0;
if ($sku_id > 0) {
$product_id_array[] = $v;
}
$money = $v[ 'money' ] ?? 0;
if ($money > 0) {
$money_array[] = $money;
}
}
$data[ 'product_array' ] = $product_id_array;
$calculate_result = $this->toCalculate($data);
if ($calculate_result[ 'code' ] < 0) {
return $calculate_result;
}
$data = $calculate_result[ 'data' ];
//money_array
$data[ 'money_array' ] = $money_array;
$calculate_result = $this->moneyCalculate($data);
if ($calculate_result[ 'code' ] < 0) {
return $calculate_result;
}
$goods_list = $calculate_result['data']['goods_list'] ?? [];
if(empty($goods_list))
return $this->error([], '缺少必填参数商品数据');
$data = $calculate_result[ 'data' ];
break;
case 'card'://卡项
$data[ 'order_type' ] = 'card';
$shop_goods_list_result = $this->cardCalculate($data);
if ($shop_goods_list_result[ 'code' ] < 0) {
return $shop_goods_list_result;
}
$data = $shop_goods_list_result[ 'data' ];
break;
}
}else{
$data = $data_result['data'];
}
return $this->success($data);
}
/**
* 待付款订单
* @param $data
* @return mixed
*/
public function orderPayment($data)
{
$data[ 'is_payment' ] = true;
$calculate_data = $this->calculate($data);
if ($calculate_data[ 'code' ] < 0)
return $calculate_data;
return $calculate_data;
}
/**
* 个性化计算
* @param $data
* @return mixed
*/
public function toCalculate($data)
{
$product_array = $data[ 'product_array' ] ?? [];
if (!empty($product_array)) {
$shop_goods_list_result = $this->getShopGoodsList($data);
if ($shop_goods_list_result[ 'code' ] < 0) {
return $shop_goods_list_result;
}
$data = $shop_goods_list_result[ 'data' ];
//商品部分的计算
$data = $this->goodsCalculate($data);
//卡项抵消
$delivery_money = $data[ 'delivery_money' ] ?? 0;
$real_goods_money = $data[ 'real_goods_money' ] ?? $data[ 'goods_money' ];
$order_money = $real_goods_money + $delivery_money;
$pay_money = $order_money;
$data[ 'pay_money' ] = $pay_money;
//总结计算
$data[ 'order_money' ] = $order_money;
}
return $this->success($data);
}
/**
* 卡项
* @param $data
*/
public function cardCalculate($data)
{
$store_id = $data[ 'store_id' ];
$sku_array = $data[ 'sku_array' ];
$sku_ids = array_column($sku_array, 'sku_id');
$sku_num_array = array_column($sku_array, 'num', 'sku_id');
// $sku_ids = $data['sku_ids'];//sku_id数组weight
$site_id = $data[ 'site_id' ];
$field = 'gs.site_id,gs.goods_id,gs.sku_id,gs.goods_name,gs.sku_name,gs.spec_name,gs.introduction,g.goods_image,gsd.stock,gs.price,gs.discount_price,gs.line_price,
g.is_dec_stock,g.one_fenxiao_switch,g.one_fenxiao_way,g.one_fenxiao_commission,g.one_fenxiao_remark,g.two_fenxiao_switch,g.two_fenxiao_way,g.two_fenxiao_commission,
g.two_fenxiao_remark,g.promotion_type,g.fenxiao_bind,g.fenxiao_qualification,g.fenxiao_withdraw_step,
g.is_virtual,g.support_trade_type,g.action_type,g.action_link,g.delivery_type,g.delivery_unity_price,g.delivery_template_data,g.delivery_template_id,
g.delivery_calc_type,g.virtual_verify_id,
g.refund_mode,g.min_buy,g.max_buy,gs.weight,gs.volume,g.promotion_id,g.manjian_id,
gs.is_consume_discount,gs.member_price,gs.discount_config,gs.discount_method,gs.card_discount_method,
g.goods_type,g.is_need_yuyue,g.yuyue_need_pay,g.service_length,(gsd.sale_num + gsd.virtual_sale) as sale_num';
$alias = 'gs';
$join = [
[ 'goods g', 'g.goods_id = gs.goods_id', 'inner' ],
[ 'goods_sku_data gsd', 'gsd.sku_id = gs.sku_id', 'inner' ],
];
$goods_condition = [
[ 'gs.is_delete', '=', 0 ],
// [ 'gs.goods_state', '=', 1 ],
[ 'gs.sku_id', 'in', $sku_ids ],
[ 'gs.site_id', '=', $site_id ]
];
$goods_list = model('goods_sku')->getList($goods_condition, $field, '', $alias, $join);
$order_name = '';
$goods_num = 0;
foreach ($goods_list as $k => $v) {
$sku_id = $v[ 'sku_id' ];
$order_name = string_split($order_name, ',', $v[ 'goods_name' ]);
$item_num = $sku_num_array[ $sku_id ] ?? 1;
$goods_num += $item_num;
$goods_info = $v;
$is_virtual = $is_virtual ?? $v[ 'is_virtual' ];
$action_type = $v[ 'action_type' ];
$goods_info[ 'trade_type' ] = $action_type;//业务类型
$goods_info[ 'num' ] = $item_num;
$goods_list[ $k ] = $goods_info;
}
$data[ 'goods_list' ] = $goods_list;
$data[ 'order_name' ] = $order_name;
$data[ 'goods_num' ] = $goods_num;
$goods_list = $data[ 'goods_list' ];
//具备某个参数(控制是否是单品活动)
//计算订单总额 ,订单总优惠 ,
$goods_money = 0;
$real_goods_money = 0;
foreach ($goods_list as $k => $v) {
// 计算单价 可能情况 (折扣价 会员价)
$goods_item = $v;
//商品类主体中应该封装一个函数用于获取商品价格(可能还会有关联会员价 满减 折扣....)
$price = moneyFormat($goods_item[ 'price' ]);// 我也不确定会用哪个价格 大概率是用销售价(字段名称不太合法)
$member_price_result = $this->memberPrice($v, $data);
if ($member_price_result[ 'code' ] >= 0) {
$price = $member_price_result[ 'data' ];
$goods_item[ 'is_member_price' ] = true;
}
$goods_item[ 'price' ] = $price;
$num = $goods_item[ 'num' ];//购买数量
$item_goods_money = $price * $num;//商品总额()
$min_buy = $goods_item[ 'min_buy' ];
$max_buy = $goods_item[ 'max_buy' ];
if ($min_buy > 0 && $min_buy > $num) {
$this->setError('GOODS_LESS_MIN_NUM');
}
if ($max_buy > 0 && $max_buy < $num) {
$this->setError('GOODS_OUT_MAX_NUM');
}
$goods_money += $item_goods_money;
$item_real_goods_money = $item_goods_money;
$real_goods_money += $item_real_goods_money;
$goods_item[ 'goods_money' ] = $item_goods_money;
$goods_item[ 'real_goods_money' ] = $item_real_goods_money;
$goods_list[ $k ] = $goods_item;
}
$data[ 'goods_list' ] = $goods_list;
$data[ 'goods_money' ] = $goods_money;
$data[ 'real_goods_money' ] = $real_goods_money;
$delivery_money = $data[ 'delivery_money' ] ?? 0;
$order_money = $real_goods_money + $delivery_money;
$pay_money = $order_money;
//总结计算
$data[ 'order_money' ] = $order_money;
$data[ 'pay_money' ] = $pay_money;
return $this->success($data);
}
/**
* 买单计算
* @param $data
*/
public function moneyCalculate($data)
{
$money_array = $data[ 'money_array' ];
if (!empty($money_array)) {
$goods_money = $data[ 'goods_money' ] ?? 0;
$order_name = $data[ 'order_name' ] ?? '';
$order_money = $data[ 'order_money' ] ?? 0;
$pay_money = $data[ 'pay_money' ] ?? 0;
$goods_list = $data['goods_list'] ?? [];
// 收银订单默认图片
$defaultImg = (new ConfigModel())->getDefaultImg($data['site_id'])['data']['value'];
$goods_image = $defaultImg['cashier'] ?? 'upload/cashier/cashier-order-money.png';
// $goods_image = 'upload/cashier/cashier-order-money.png';
foreach ($money_array as $k => $v) {
$num = 1;
$item_price = $v;
if($item_price > 0){
$item_goods_money = $item_price * $num;
$item_order_name = $item_goods_money . '元买单';
$goods_list[] = array (
'goods_id' => 0,
'sku_id' => 0,
'price' => $item_price,
'num' => 1,
'goods_money' => $item_goods_money,
'goods_name' => $item_order_name,
'goods_image' => $goods_image,
'spec_name' => '',
'trade_type' => 'money',
'real_goods_money' => $item_goods_money
);
$goods_money += $item_goods_money;
$order_money += $order_money;
$pay_money += $pay_money;
$order_name = string_split($order_name, ',', $item_order_name);
}
}
$data[ 'goods_money' ] = $goods_money;
$data[ 'real_goods_money' ] = $goods_money;
$data[ 'goods_list' ] = $goods_list;
$data[ 'order_name' ] = $order_name;
$data[ 'order_money' ] = $goods_money;
$data[ 'pay_money' ] = $goods_money;
}
return $this->success($data);
}
public function goodsCalculate($data)
{
$site_id = $data[ 'site_id' ];
$goods_list = $data[ 'goods_list' ];
$fans_id = $data[ 'fans_id' ] ?? 0;
$sku_array = $data[ 'product_array' ];
//具备某个参数(控制是否是单品活动)
//计算订单总额 ,订单总优惠 ,
$goods_money = 0;
$real_goods_money = 0;
foreach ($goods_list as $k => $v) {
// 计算单价 可能情况 (折扣价 会员价)
$goods_item = $v;
$sku_id = $v[ 'sku_id' ];
//商品类主体中应该封装一个函数用于获取商品价格(可能还会有关联会员价 满减 折扣....)
$price = moneyFormat($goods_item[ 'price' ]);// 我也不确定会用哪个价格 大概率是用销售价(字段名称不太合法)
$member_price_result = $this->memberPrice($v, $data);
if ($member_price_result[ 'code' ] >= 0) {
$price = $member_price_result[ 'data' ];
$goods_item[ 'is_member_price' ] = true;
}
$num = $goods_item[ 'num' ];//购买数量
$item_goods_money = $price * $num;//商品总额()
$goods_item[ 'price' ] = $price;
$goods_item[ 'goods_money' ] = $item_goods_money;
$goods_item[ 'fans_id' ] = $fans_id;
$goods_item[ 'site_id' ] = $site_id;
$min_buy = $goods_item[ 'min_buy' ];
$max_buy = $goods_item[ 'max_buy' ];
if ($min_buy > 0 && $min_buy > $num)
$this->setError('GOODS_LESS_MIN_NUM');
if ($max_buy > 0 && $max_buy < $num)
$this->setError('GOODS_OUT_MAX_NUM');
$item_real_goods_money = $goods_item[ 'goods_money' ];
$goods_item[ 'real_goods_money' ] = $item_real_goods_money;
//卡项
$goods_item = $this->itemCardCalculate($goods_item, $data);
if (empty($goods_item)) {
unset($goods_list[ $k ]);
} else {
$item_goods_money = $goods_item[ 'goods_money' ];
$item_real_goods_money = $goods_item[ 'real_goods_money' ];
}
$goods_money += $item_goods_money;
$real_goods_money += $item_real_goods_money;
$goods_item[ 'real_goods_money' ] = $item_real_goods_money;
$goods_list[ $k ] = $goods_item;
}
$data[ 'goods_list' ] = $goods_list;
$data[ 'goods_money' ] = $goods_money;
$data[ 'real_goods_money' ] = $real_goods_money;
return $data;
}
/**
* 商品卡项抵扣(抵扣会将商品单价视为0)
* @param $goods_item
* @param $card_item
*/
public function itemCardCalculate($goods_item, $data)
{
$card_item_id = $goods_item[ 'card_item_id' ] ?? 0;
$member_id = $data[ 'member_id' ];
$sku_id = $goods_item[ 'sku_id' ];
if ($card_item_id > 0) {
$num = $goods_item[ 'num' ];
$member_oncecard_model = new MemberOnceCard();
$card_item_params = array (
'member_id' => $member_id,
'sku_id' => $sku_id,
'item_id' => $card_item_id
);
$item_card_result = $member_oncecard_model->getUseCardNum($card_item_params);
if ($item_card_result[ 'code' ] < 0) {
return [];
}
$item_card_data = $item_card_result[ 'data' ];
$card_item_info = $item_card_data[ 'card_item_info' ];
$card_info = $item_card_data[ 'card_info' ];
$goods_item[ 'card_item_info' ] = $card_item_info;
$goods_item[ 'card_info' ] = $card_info;
$card_num = $item_card_data[ 'card_num' ];
$goods_item[ 'card_num' ] = $card_num;
if ($card_num > 0) {
if ($num > $card_num) {
$num = $card_num;
}
}
$goods_item[ 'num' ] = $num;
$price = 0;
$goods_money = $price * $num;
$goods_item[ 'price' ] = $price;
$goods_item[ 'goods_money' ] = $goods_money;
$goods_item[ 'real_goods_money' ] = $goods_money;
}
return $goods_item;
}
/**
* 获取立即购买商品信息
* @param $data
* @return array
*/
public function getShopGoodsList($data)
{
$store_id = $data[ 'store_id' ];
$sku_array = $data[ 'product_array' ];
// $sku_array = $data[ 'sku_array' ];
$sku_ids = array_column($sku_array, 'sku_id');
$sku_num_array = array_column($sku_array, 'num', 'sku_id');
$sku_data = array_column($sku_array, null, 'sku_id');
$data[ 'sku_data' ] = $sku_data;
// $sku_ids = $data['sku_ids'];//sku_id数组weight
$site_id = $data[ 'site_id' ];
$field = 'gs.site_id,gs.goods_id,gs.sku_id,gs.goods_name,gs.sku_name,gs.spec_name,gs.introduction,g.goods_image,gsd.stock,gs.price,gs.discount_price,gs.line_price,
g.is_dec_stock,g.one_fenxiao_switch,g.one_fenxiao_way,g.one_fenxiao_commission,g.one_fenxiao_remark,g.two_fenxiao_switch,g.two_fenxiao_way,g.two_fenxiao_commission,
g.two_fenxiao_remark,g.promotion_type,g.fenxiao_bind,g.fenxiao_qualification,g.fenxiao_withdraw_step,
g.is_virtual,g.support_trade_type,g.action_type,g.action_link,g.delivery_type,g.delivery_unity_price,g.delivery_template_data,g.delivery_template_id,
g.delivery_calc_type,g.virtual_verify_id,
g.refund_mode,g.min_buy,g.max_buy,gs.weight,gs.volume,g.promotion_id,g.manjian_id,
gs.is_consume_discount,gs.member_price,gs.discount_config,gs.discount_method,gs.card_discount_method,
g.goods_type,g.is_need_yuyue,g.yuyue_need_pay,g.service_length,osgs.stock,osgs.sale_stock,(gsd.sale_num + gsd.virtual_sale) as sale_num';
$alias = 'gs';
$join = [
[ 'goods g', 'g.goods_id = gs.goods_id', 'inner' ],
[ 'goods_sku_data gsd', 'gsd.sku_id = gs.sku_id', 'inner' ],
[
'store_store_goods_sku_data osgs',
'osgs.sku_id = gs.sku_id and (osgs.store_id is null or osgs.store_id = ' . $store_id . ')',
'left'
]
];
$goods_condition = [
[ 'gs.is_delete', '=', 0 ],
// [ 'gs.goods_state', '=', 1 ],
[ 'gs.sku_id', 'in', $sku_ids ],
[ 'gs.site_id', '=', $site_id ]
];
$temp_goods_list = model('goods_sku')->getList($goods_condition, $field, '', $alias, $join);
if (empty($temp_goods_list)) {
return $this->error([], '不存在的商品!');
}
$column_goods_list = array_column($temp_goods_list, null, 'sku_id');
$order_name = '';
$goods_num = 0;
$goods_list = [];
//分配关联商品数据
foreach ($sku_array as $k => $v) {
$sku_id = $v[ 'sku_id' ];
$goods_info = $column_goods_list[ $sku_id ];
$order_name = string_split($order_name, ',', $goods_info[ 'goods_name' ]);
$item_num = $v[ 'num' ] ?? 1;
$goods_info[ 'card_item_id' ] = $v[ 'card_item_id' ] ?? 0;
$goods_num += $item_num;
// $item_stock = $v['sale_stock'] ?? 0;
// $goods_info['stock'] = $item_stock;
$is_virtual = $is_virtual ?? $goods_info[ 'is_virtual' ];
$action_type = $goods_info[ 'action_type' ];
$goods_info[ 'trade_type' ] = $action_type;//业务类型
$goods_info[ 'num' ] = $item_num;
$goods_list[ $k ] = $goods_info;
}
$data[ 'goods_list' ] = $goods_list;
$data[ 'order_name' ] = $order_name;
$data[ 'goods_num' ] = $goods_num;
return $this->success($data);
}
public function memberPrice($goods_item, $calculate_data)
{
$member_level_info = $calculate_data[ 'member_level_info' ] ?? [];
$promotion_type = $goods_item[ 'promotion_type' ] ?? '';
$source = $calculate_data[ 'source' ] ?? '';
//这里要判断如果准备享受活动的话这里就不要计算会员价了(不打算参与活动的话需要传递source)
if ($promotion_type != 'discount') {
// if (!empty($source)) {
$goods_model = new Goods();
$goods_member_price_result = $goods_model->memberPriceCalculate($goods_item, $member_level_info);
return $goods_member_price_result;
// }
}
return $this->error();
}
}