文件
mashangyoujiu/Application/SmallProgramApi/Controller/SpikeController.class.php

2950 行
125 KiB
PHP
可执行文件

此文件含有模棱两可的 Unicode 字符

此文件含有可能会与其他字符混淆的 Unicode 字符。 如果您是想特意这样的,可以安全地忽略该警告。 使用 Escape 按钮显示他们。

<?php
namespace SmallProgramApi\Controller;
use Api\Controller\CostCalculationController;
use Common\Model\RetailSpikeOrderViewModel;
use Common\Model\RetailSpikeViewModel;
use LittleGift\Business\Goods;
use LittleGift\Business\Order;
//[1.8.68]
class SpikeController extends BaseController
{
/**
* 判断门店id
*/
public function _initialize()
{
parent::_initialize();
if (!self::$store_id || self::$store_id == 0) {
$res = array('status' => 0, 'msg' => '缺少必要的store_id参数');
$this->ajaxReturn($res);
}
}
/**
* 获取秒杀活动
* @param array $res
*/
public function getAllSpikeList()
{
// 实例化模型
$RSVModel = new RetailSpikeViewModel();
$map = array(
'RetailSpike.storeid' => self::$store_id,
'RetailSpike.active_status' => 1,
'RetailSpike.active_endtime' => array('gt', time()),
'RetailGoods.status' => 0,
'RetailGoods.online_state' => 1
);
$field = array('id', 'name', 'sku_id', 'spike_price', 'sell_number', 'goods_name', 'online_price', 'goods_img_id');
// 查询拼团活动
$all_spike_list = $RSVModel->getSelect($map, $field);
if (!$all_spike_list) {
$res = array('status' => 0, 'msg' => '暂无秒杀活动');
$this->ajaxReturn($res);
}
// 处理数据
foreach ($all_spike_list as &$val) {
$val['spike_price'] = $val['spike_price'] ? floatval($val['spike_price']) : 0;
$val['online_price'] = $val['online_price'] ? floatval($val['online_price']) : 0;
// 商品图片
$val['image'] = $this->getGoodsImage($val['goods_img_id']);
}
// 首页图片
$retailStoreXcxConfigModel = D('RetailStoreXcxConfig'); // 实例化模型
$image = $retailStoreXcxConfigModel->getFind(array($retailStoreXcxConfigModel::STORE_ID => self::$store_id), array($retailStoreXcxConfigModel::XCX_SECKILL_COVER, $retailStoreXcxConfigModel::XCX_SECKILL_COVER_ID));
$show_image = $this->getGoodsImage($image[$retailStoreXcxConfigModel::XCX_SECKILL_COVER_ID], $image[$retailStoreXcxConfigModel::XCX_SECKILL_COVER]);
$res = array('status' => 1, 'all_spike_list' => $all_spike_list, 'show_image' => $show_image);
$this->ajaxReturn($res);
}
/**
* 获取秒杀活动详情
* @param int $spike_id 拼团活动id
* @return array $res
*/
public function getSpikeDetails()
{
// 判断门店id
if (!self::$store_id || self::$store_id == 0) {
$res = array('status' => 0, 'msg' => '缺少必要的store_id参数');
$this->ajaxReturn($res);
}
$res = array();
// 接收数据
$platform_type = self::$merchant['platform_type'];
$spike_id = I('post.spike_id');
if (!$spike_id) {
$res = array('status' => 0, 'msg' => '缺少必要的spike_id参数');
$this->ajaxReturn($res);
}
// 秒杀查询条件
$RSVModel = D('RetailSpikeView'); // 实例化模型
$ImageGallery = new \Common\Model\ImageGalleryModel();
$map = array(
'RetailSpike.id' => $spike_id,
'RetailSpike.storeid' => self::$store_id,
'RetailSpike.active_status' => 1,
'RetailSpike.active_endtime' => array('gt', time()),
'RetailGoods.status' => 0,
'RetailGoods.online_state' => 1
);
$field = array('id',
'gid',
'sku_id',
'name',
'stock',
'spike_price',
'limit_num',
'limit_state',
'sell_number',
'start_time',
'end_time',
'goods_name',
'online_price',
'details',
'company',
'goods_img_id',
'send_type',
'delivery_template_id',
'rise_num',
'video_id',
);
if ($platform_type == 2) {
//第三方平台
$field[] = 'third_goods_code';
}
// 查询拼团活动
$spike_data = $RSVModel->getFind($map, $field);
if (!$spike_data) {
$res = array('status' => 0, 'msg' => '该活动存在异常,请联系商家');
$this->ajaxReturn($res);
}
$spike_data['rise_num'] = $spike_data['rise_num'] ? floatval($spike_data['rise_num']) : 0;
// 判断规格
$sku_id = $spike_data['sku_id'] && $spike_data['sku_id'] != 0 ? $spike_data['sku_id'] : 0;
if ($sku_id != 0) {
$RSGModel = D('RetailSkuGoods'); // 实例化模型
// 查询条件
$map2 = array(
$RSGModel::ID => $sku_id,
$RSGModel::STORE_ID => self::$store_id,
$RSGModel::GOODS_ID => $spike_data['gid'],
$RSGModel::STATUS => 1,
$RSGModel::STATE => 0,
);
$field = array($RSGModel::ID, $RSGModel::SKU_ID_LIST, $RSGModel::ONLINE_PRICE);
if ($platform_type == 2) {
//第三平台
$field[] = 'third_goods_code';
}
// 查询条件
$goods_sku = $RSGModel->getFind($map2, $field);
if (!$goods_sku) {
$res = array('status' => 0, 'msg' => '该活动商品规格存在异常,请联系商家');
$this->ajaxReturn($res);
}
// 处理数据
$spike_data['online_price'] = $goods_sku[$RSGModel::ONLINE_PRICE];
// 处理规格名称
$SLModel = D('RetailSkuList'); // 实例化模型
$sku_name = $SLModel->getFindField(array($SLModel::ID => array('in', $goods_sku[$RSGModel::SKU_ID_LIST])), $SLModel::NAME, true);
$spike_data['name'] = $spike_data['name'] . '(' . implode(',', $sku_name) . ')';
}
// 判断金额
if (floatval($spike_data['spike_price']) <= 0 || floatval($spike_data['spike_price']) <= 0) {
$res = array('status' => 0, 'msg' => '该活动商品存在异常,请联系商家');
$this->ajaxReturn($res);
} else {
$spike_data['spike_price'] = floatval($spike_data['spike_price']);
$spike_data['online_price'] = floatval($spike_data['online_price']);
}
// 获取待支付的数量
if (self::$merchant['platform_type'] == 2) {
if (!empty($sku_id)) {
//规格
$third_goods_code = $goods_sku['third_goods_code'];
} else {
$third_goods_code = $spike_data['third_goods_code'];
}
$ThirdGoodsClass = new Goods();
$thirdResult = $ThirdGoodsClass->goodsNumQuery([
'merchant_id' => self::$merchant_id,
'type' => 2,
'code_arr' => [$third_goods_code],
'Customer_Codes' => self::$store['third_code']
]);
if ($thirdResult['status'] == 1 && !empty($thirdResult['data'])) {
$third_goods_num = $thirdResult['data'][0];
if ($third_goods_num <= 0) {
$spike_data['stock'] = 0;
//下架活动
$ThirdGoodsClass->activityOff([
'id' => $spike_id,
'type' => 1
]);
} else if ($third_goods_num < $spike_data['stock']) {
$spike_data['stock'] = $third_goods_num;
}
} else {
$spike_data['stock'] = 0;
}
} else {
$str = 'retail_spike_' . $spike_id . '_' . $sku_id . '_*';
$wait_num = $this->getWaitNum($str);
$spike_data['stock'] = round($spike_data['stock'] - $wait_num) > 0 ? round($spike_data['stock'] - $wait_num) : 0;
}
// 处理数据
$spike_data['video_url'] = $ImageGallery->getFieldPath(['id' => $spike_data['video_id']]);
$spike_data['startTime'] = date('Y-m-d H:i:s', $spike_data['start_time']);
$spike_data['endTime'] = date('Y-m-d H:i:s', $spike_data['end_time']);
// 商品图片
$spike_data['goods_image'] = $this->getGoodsImage($spike_data['goods_img_id']);
// 判断商品详情
if ($spike_data['details']) {
$spike_data['details'] = str_replace("img src=&quot;/", "img src=&quot;" . $this->REQUEST_URL . '/', $spike_data['details']);
$spike_data['details'] = str_replace('img src="/', 'img src="' . $this->REQUEST_URL . '/', $spike_data['details']);
$spike_data['details'] = str_replace("style=''", "", $spike_data['details']);
$spike_data['details'] = str_replace('style=""', "", $spike_data['details']);
$spike_data['details'] = str_replace('src="/Uploads/', 'src="' . $this->REQUEST_URL . '/Uploads/', $spike_data['details']);
}
// 商品轮播图
$RGBModel = D('RetailGoodsBanner'); // 实例化模型
$banner = array();
$goods_banner = $RGBModel->getSelect(array($RGBModel::GOODS_ID => $spike_data['gid']), array($RGBModel::IMAGE, $RGBModel::IMAGE_ID));
if ($goods_banner) {
// 处理图片
foreach ($goods_banner as &$val) {
$image = $this->getGoodsImage($val[$RGBModel::IMAGE_ID], $val[$RGBModel::IMAGE]);
array_push($banner, $image);
}
} else {
// 无商品轮播图
$banner = array();
array_push($banner, $spike_data['goods_image']);
}
// 返回值
$res['delivery_set'] = $this->handleDelivery($spike_data['send_type']);
if ($res['delivery_set'][2]['data'] == 1) {
$res['delivery_rule'] = $this->handleDeliveryRule($spike_data['delivery_template_id']);
} else {
$res['delivery_rule'] = false;
}
$map3 = array(
'RetailBillOrder.pay_state' => 1,
'RetailBillOrder.refund_status' => 0,
'RetailBillOrder.type' => 1,
'RetailBillOrder.uid' => self::$uid,
'RetailBillOrder.store_id' => self::$store_id,
'RetailBillOrder.merchant_id' => self::$merchant_id,
'RetailBillSpike.spike_id' => $spike_id,
'RetailBillSpike.state' => 1,
);
$RSOViewModel = D('RetailSpikeOrderView'); // 实例化模型(订单视图模型)
$count = $RSOViewModel->getSum($map3, 'buy_number');
if ($spike_data['limit_num']) {
$spike_data['limit_num'] = strval(round($spike_data['limit_num'] - $count));
}
//免配送费门槛金额
$delivery_cost = self::$store['delivery_cost'];
$delivery_status = self::$store['delivery_status'];
$res['status'] = 1;
$res['banner'] = $banner;
$res['time'] = time();
$res['spike_data'] = $spike_data;
$res['delivery_cost'] = $delivery_cost;
$res['delivery_status'] = $delivery_status;
$this->ajaxReturn($res);
}
/**
* 获取购买数据
* @param int $spike_id 活动id
* @param int $buy_number 购买数量
* @return array $res
*/
public function getBuyData()
{
if (empty(self::$uid)) {
$res['status'] = -1;
$res['msg'] = '用户未登录';
$this->ajaxReturn($res);
}
// 接收数据
$spike_id = I('post.spike_id');
$buy_number = I('post.buy_number');
// 判断接受参数
if (!$spike_id || !$buy_number) {
$res = array('status' => 0, 'msg' => '参数缺失');
$this->ajaxReturn($res);
}
// 秒杀查询条件
$RSVModel = D('RetailSpikeView'); // 实例化模型
$map = array(
'RetailSpike.id' => $spike_id,
'RetailSpike.storeid' => self::$store_id,
'RetailSpike.active_status' => 1,
'RetailSpike.active_starttime' => array('elt', time()),
'RetailSpike.active_endtime' => array('gt', time()),
'RetailGoods.status' => 0,
'RetailGoods.online_state' => 1
);
$field = array(
'id',
'gid',
'sku_id',
'name',
'stock',
'spike_price',
'sell_number',
'end_time',
'send_type',
'goods_name',
'online_price',
'company',
'goods_img_id'
);
// 查询秒杀活动
$buy_data = $RSVModel->getFind($map, $field);
if (!$buy_data) {
$res = array('status' => 0, 'msg' => '该活动存在异常,请联系商家');
$this->ajaxReturn($res);
}
// 判断规格
if ($buy_data['sku_id']) {
$RSGModel = D('RetailSkuGoods'); // 实例化模型
// 查询条件
$map2 = array(
$RSGModel::ID => $buy_data['sku_id'],
$RSGModel::STORE_ID => self::$store_id,
$RSGModel::GOODS_ID => $buy_data['gid'],
$RSGModel::STATUS => 1,
$RSGModel::STATE => 0,
);
$field = array($RSGModel::ID, $RSGModel::SKU_ID_LIST, $RSGModel::ONLINE_PRICE, $RSGModel::GOODS_IMG_ID);
// 查询条件
$goods_sku = $RSGModel->getFind($map2, $field);
if (!$goods_sku) {
$res = array('status' => 0, 'msg' => '该活动商品规格存在异常,请联系商家');
$this->ajaxReturn($res);
}
// 处理数据
$buy_data['online_price'] = $goods_sku[$RSGModel::ONLINE_PRICE];
$buy_data['goods_img_id'] = $goods_sku[$RSGModel::GOODS_IMG_ID];
// 处理规格名称
$SLModel = D('RetailSkuList'); // 实例化模型
$sku_name = $SLModel->getFindField(array($SLModel::ID => array('in', $goods_sku[$RSGModel::SKU_ID_LIST])), $SLModel::NAME, true);
$buy_data['name'] = $buy_data['name'] . '(' . implode(',', $sku_name) . ')';
}
// 处理数据
if (!$buy_data['spike_price'] || floatval($buy_data['spike_price']) <= 0) { // 判断金额
$res = array('status' => 0, 'msg' => '该商品价格存在异常,请联系商家');
$this->ajaxReturn($res);
} else {
$buy_data['spike_price'] = floatval($buy_data['spike_price']);
}
$buy_data['all_money'] = floatval(round($buy_data['spike_price'] * $buy_number, 2)); // 计算金额
$buy_data['image'] = $this->getGoodsImage($buy_data['goods_img_id']);
// 返回值
$send_type = explode(',', $buy_data['send_type']);
if (in_array('1', $send_type) && (in_array('2', $send_type || in_array('3', $send_type)))) {
//自提配送都开启
$buy_data['send_type'] = 0;
} else if (in_array('2', $send_type)) {
//配送
$buy_data['send_type'] = 2;
} else if (in_array('3', $send_type)) {
//快递发货
$buy_data['send_type'] = 2;
}
$SmallProgramModel = D('RetailSmallProgramUser');
$res['status'] = 1;
$res['buy_data'] = $buy_data;
$res['link_name'] = self::$user[$SmallProgramModel::LINK_NAME];
$res['mobile_phone'] = self::$user[$SmallProgramModel::MOBILE_PHONE];
$res['storeSet'] = $this->getStoreSet_v1(); //基本设置
$res['address'] = $this->getDefaultAddress_v1(); //默认地址
$res['vip_info'] = $this->getVipInfo();
$res['template_list'] = A('SmallProgramApi/Pay')->getTemplateInfo(); //小程序模板推送
$this->ajaxReturn($res);
}
/**
* 秒杀下单
* @param int $spike_id 活动id
* @param int $buy_number 购买数量
* @param int $pay_type 支付类型
* @param int $pickup_type 配送方式 1.自提 2.配送
* @param int $address_id 地址id
* @param string $user_name 提货人
* @param int $user_phone 手机号
* @return array $res
*/
public function placeOrder()
{
$RPOModel = D('RetailPayOrder'); // 订单模型(pay_order)
$time = time();
$cr = array();
// 接受数据
$spike_id = I('post.spike_id');
$buy_number = I('post.buy_number');
$pay_type = I('post.pay_type');
$pickup_type = I('post.pickup_type');
$address_id = I('post.address_id');
$user_name = I('post.user_name');
$user_phone = I('post.user_phone');
$remark = I('post.remark');
$delivery_fee = I('post.delivery_fee'); // 配送费
if (empty(self::$uid)) {
$res['status'] = -1;
$res['msg'] = '用户未登录';
$this->ajaxReturn($res);
}
// 判断参数
if (!$spike_id || !$buy_number || !$pay_type || !$pickup_type) {
$res = array('status' => 0, 'msg' => '参数缺失');
$this->ajaxReturn($res);
}
// 判断自提配送
switch ($pickup_type) {
case 1:
// 判断自提人
if (!$user_name) {
$res = array('status' => 0, 'msg' => '请填写提货人姓名');
$this->ajaxReturn($res);
}
// 判断手机号
if (!$user_phone) {
$res = array('status' => 0, 'msg' => '请填写手机号');
$this->ajaxReturn($res);
}
break;
case 2:
// 判断地址id
if (!$address_id) {
$res = array('status' => 0, 'msg' => '请选择收货地址');
$this->ajaxReturn($res);
}
$RAModel = D('RetailAddress'); // 实例化用户地址模型
$result = $this->getLngLatAndFee($address_id);
if ($result['status'] == 0) {
$this->ajaxReturn($result);
}
// 判断配送费
if (floatval($delivery_fee) != floatval($result['fee'])) {
$res = array('status' => 0, 'msg' => '商家更新配送费,请重新下单');
$this->ajaxReturn($res);
}
$address = $result['address'];
$user_name = $address[$RAModel::NAME];
$user_phone = $address[$RAModel::PHONE];
$user_address = $address[$RAModel::ADDRESS];
break;
default:
$res = array('status' => 0, 'msg' => '未知的配送方式');
$this->ajaxReturn($res);
}
// 秒杀查询条件
$RSVModel = D('RetailSpikeView'); // 实例化模型
$map = array(
'RetailSpike.id' => $spike_id,
'RetailSpike.storeid' => self::$store_id,
'RetailSpike.active_status' => 1,
'RetailSpike.active_starttime' => array('elt', time()),
'RetailSpike.active_endtime' => array('gt', time()),
'RetailGoods.status' => 0,
'RetailGoods.online_state' => 1
);
$field = array(
'id', 'gid', 'sku_id', 'stock', 'spike_price', 'limit_state', 'limit_num', 'online_price',
'goods_name', 'goods_class_id', 'purchase_price', 'attribute_state', 'shop_mem_status',
'shop_mem_price', 'plus_mem_status', 'plus_price', 'goods_img_id', 'integral_mem_status', 'integral'
);
// 查询秒杀活动
$spike_data = $RSVModel->getFind($map, $field);
if (!$spike_data) {
$res = array('status' => 0, 'msg' => '该活动存在异常,请联系商家');
$this->ajaxReturn($res);
}
// 判断规格
if ($spike_data['sku_id']) {
// 实例化模型
$RSGModel = D('RetailSkuGoods');
// 查询条件
$map2 = array(
$RSGModel::ID => $spike_data['sku_id'],
$RSGModel::STORE_ID => self::$store_id,
$RSGModel::GOODS_ID => $spike_data['gid'],
$RSGModel::STATUS => 1,
$RSGModel::STATE => 0,
);
// 查询条件
$goods_sku = $RSGModel->getFind($map2);
if (!$goods_sku) {
$res = array('status' => 0, 'msg' => '该活动商品规格存在异常,请联系商家');
return $res;
}
// 处理规格名称
$SLModel = D('RetailSkuList'); // 实例化模型
$sku_name = $SLModel->getFindField(array($SLModel::ID => array('in', $goods_sku[$RSGModel::SKU_ID_LIST])), $SLModel::NAME, true);
$goods_sku['name'] = implode(',', $sku_name);
// 处理数据
$spike_data['purchase_price'] = $goods_sku[$RSGModel::PURCHASE_PRICE];
$spike_data['shop_mem_price'] = $goods_sku[$RSGModel::SHOP_MEM_PRICE];
$spike_data['shop_mem_price'] = $goods_sku[$RSGModel::PLUS_PRICE];
}
// 统计用户购买数量
$RSOViewModel = D('RetailSpikeOrderView'); // 实例化模型(订单视图模型)
$map3 = array(
'RetailBillOrder.pay_state' => 1,
'RetailBillOrder.refund_status' => 0,
'RetailBillOrder.type' => 1,
'RetailBillOrder.uid' => self::$uid,
'RetailBillOrder.store_id' => self::$store_id,
'RetailBillOrder.merchant_id' => self::$merchant_id,
'RetailBillSpike.spike_id' => $spike_id,
'RetailBillSpike.state' => 1,
);
$count = $RSOViewModel->getSum($map3, 'buy_number');
// 判断限购
if ($count && intval($spike_data['limit_num']) > 0) {
if (($count + $buy_number) > intval($spike_data['limit_num'])) {
$res = array(
'status' => 0,
'msg' => '已超过限购数量'
);
$this->ajaxReturn($res);
}
}
// 判断金额
if (!$spike_data['spike_price'] || floatval($spike_data['spike_price']) <= 0) {
$res = array('status' => 0, 'msg' => '该活动商品存在异常,请联系商家');
$this->ajaxReturn($res);
}
// 计算金额
if ($pickup_type == 2) { // 配送
$money = floatval(round($spike_data['spike_price'] * $buy_number, 2) + $delivery_fee);
} else { // 自提
$money = floatval(round($spike_data['spike_price'] * $buy_number, 2));
}
// 判断库存
if ($buy_number > floatval($spike_data['stock'])) {
$res = array('status' => 0, 'msg' => '商品库存不足');
$this->ajaxReturn($res);
}
// 获取用户信息
$vip_info = $this->getVipInfo();
switch ($pay_type) {
case 1: // 会员卡支付
// 判断会员卡
if (!$vip_info) {
$res = array('status' => 0, 'msg' => '请先绑定会员');
$this->ajaxReturn($res);
}
// 判断余额
if (!$vip_info['balance'] || floatval($vip_info['balance']) < $money) {
$res = array('status' => 0, 'msg' => '余额不足,请先充值');
$this->ajaxReturn($res);
}
break;
case 2: // 微信支付
$RPSModel = D('RetailPaySet'); // 支付设置模型
$config_result = $RPSModel->getFindMerchantConfig(self::$merchant_id, 3);
if ($config_result['status'] != 1) {
$res = array('status' => 0, 'msg' => $config_result['msg'] ? $config_result['msg'] : '暂无可用的支付模式');
$this->ajaxReturn($res);
}
$cr['m_pay_type'] = $config_result['m_pay_type'];
break;
default:
$res = array('status' => 0, 'msg' => '支付方式错误');
$this->ajaxReturn($res);
}
// 下单信息(pay_order)
$cr[$RPOModel::ORDER_TYPE] = 1;
$cr[$RPOModel::PAY_TYPE] = $pay_type == 1 ? 6 : 4;
$cr[$RPOModel::TRADE_AMOUNT] = $money;
$cr[$RPOModel::STORE_ID] = self::$store_id;
$cr[$RPOModel::MERCHANT_ID] = self::$merchant_id;
$cr[$RPOModel::ORDER_STATE] = 'WAIT_BUYER_PAY';
$cr[$RPOModel::ADD_TIME] = $time;
$cr[$RPOModel::VID] = $vip_info ? $vip_info['vid'] : 0;
$cr[$RPOModel::UID] = self::$uid;
// bill下单(bill_order)
$RBOModel = D('RetailBillOrder'); // 实例化模型(bill_order)
$cr2 = array(
$RBOModel::ALL_MONEY => $cr[$RPOModel::TRADE_AMOUNT],
$RBOModel::PAY_STATE => 0,
$RBOModel::PAY_TYPE => $pay_type == 1 ? 5 : 6,
$RBOModel::REFUND_STATUS => 0,
$RBOModel::TYPE => 1,
$RBOModel::ORDER_TYPE => 1,
$RBOModel::ADD_TIME => $time,
$RBOModel::VID => $cr[$RPOModel::VID],
$RBOModel::STORE_ID => self::$store_id,
$RBOModel::MERCHANT_ID => self::$merchant_id,
$RBOModel::UID => self::$uid,
$RBOModel::PAY_MONEY => $cr[$RPOModel::TRADE_AMOUNT]
);
$add_result2 = $RBOModel->addBillOrder($cr2);
if (!$add_result2) {
$res = array('status' => 0, 'msg' => '下单失败');
$this->ajaxReturn($res);
}
// bill下单(bill_online)
$RBOnModel = D('RetailBillOnline'); // 实例化模型(bill_online)
$cr3 = array(
$RBOnModel::BILL_ID => $add_result2[$RBOModel::ID],
$RBOnModel::PICKUP_TYPE => $pickup_type,
$RBOnModel::USER_NAME => $user_name,
$RBOnModel::USER_PHONE => $user_phone,
$RBOnModel::USER_ADDRESS => $user_address ? $user_address : '',
$RBOnModel::DELIVERY_FEE => $delivery_fee,
$RBOnModel::ORDER_GENRE => 3,
$RBOnModel::REMARK => $remark,
);
$add_result3 = $RBOnModel->addOrder($cr3);
if (!$add_result3) {
$res = array('status' => 0, 'msg' => '下单失败');
$this->ajaxReturn($res);
}
// bill 下单(bill_discount)
if ($vip_info) { // 判断是否为会员
// 获取会员类型
$vip_type = A('PayApi/Recharge')->getVipType($vip_info['vid']);
// 获取商户会员设置
$RVCModel = D('RetailVipConfig');
$field2 = array(
$RVCModel::PERCENT_STATE, $RVCModel::PERCENT, $RVCModel::PLUS_PERCENT_STATE, $RVCModel::PLUS_PERCENT,
$RVCModel::GOODS_INTEGRAL_STATE, $RVCModel::GOODS_INTEGRAL_PLUS_STATE, $RVCModel::GOODS_INTEGRAL_MULTIPLE,
);
// 商户会员设置
$vip_config = $RVCModel->getFind(array($RVCModel::MERCHANT_ID => self::$merchant_id), $field2);
// 商户开启消费送积分
if ($vip_config && $vip_config[$RVCModel::PERCENT_STATE] == 1 && $vip_config[$RVCModel::PERCENT] > 0) {
// plus是普通比例的倍数
$rate = $vip_type == 3 && $vip_config[$RVCModel::PLUS_PERCENT_STATE] == 1 && $vip_config[$RVCModel::PLUS_PERCENT] ? $vip_config[$RVCModel::PLUS_PERCENT] : 1;
// 判断商品送积分,商品单送,与整单送
if ($spike_data['integral_mem_status'] == 1 && $spike_data['integral'] > 0) {
// 商品单送
$integral = intval($spike_data['integral'] * $buy_number * $rate);
} else {
// 整单送
$integral = intval(($money - $delivery_fee) * $vip_config[$RVCModel::PERCENT] * $rate);
}
}
}
$RBDModel = D('RetailBillDiscount'); // 实例化模型(bill_discount)
$cr4 = array(
$RBDModel::BILL_ID => $add_result2[$RBOModel::ID],
$RBDModel::GET_INTEGRAL => $vip_info['vid'] && $integral ? $integral : 0,
);
$add_result4 = $RBDModel->addOrder($cr4);
if (!$add_result4) {
$res = array('status' => 0, 'msg' => '下单失败');
$this->ajaxReturn($res);
}
// bill 下单(bill_spike)
$RBSModel = D('RetailBillSpike'); // 拼团关联订单模型
$cr5 = array(
$RBSModel::BILL_ID => $add_result2[$RBOModel::ID],
$RBSModel::SPIKE_ID => $spike_id,
$RBSModel::BUY_NUMBER => $buy_number,
$RBSModel::STATE => 0,
);
$add_result5 = $RBSModel->addOrder($cr5);
if (!$add_result5) {
$res = array('status' => 0, 'msg' => '下单失败');
$this->ajaxReturn($res);
}
// 生成销售记录(sell)
$RSModel = D('RetailSell'); // 销售记录模型
$cr6 = array(
$RSModel::BILL_ID => $add_result2[$RBOModel::ID],
$RSModel::GOODS_ID => $spike_data['gid'],
$RSModel::PAY_TYPE => $cr2[$RBOModel::PAY_TYPE],
$RSModel::PRICE => $spike_data['spike_price'],
$RSModel::NUM => $buy_number,
$RSModel::ALL_MONEY => $money,
$RSModel::ADD_TIME => $time,
$RSModel::TYPE => 1,
$RSModel::STORE_ID => self::$store_id,
$RSModel::MERCHANT_ID => self::$merchant_id,
$RSModel::GOODS_CLASS_ID => $spike_data['goods_class_id'],
$RSModel::GOODS_NAME => $spike_data['goods_name'],
$RSModel::PRICING_METHOD => $spike_data['pricing_method'],
$RSModel::PURCHASE_PRICE => $spike_data['purchase_price'],
$RSModel::ORIGINAL_PRICE => $spike_data['online_price'],
$RSModel::GOODS_IMG_ID => $spike_data['goods_img_id'],
$RSModel::ATTRIBUTE_STATE => $spike_data['attribute_state'],
$RSModel::SELL_TYPE => 1,
$RSModel::GOODS_TYPE => 1,
$RSModel::VID => $cr[$RPOModel::VID],
$RSModel::VIP_PRICE => $spike_data['shop_mem_status'] == 1 && $spike_data['shop_mem_price'] ? $spike_data['shop_mem_price'] : 0,
$RSModel::PLUS_VIP_PRICE => $spike_data['plus_mem_status'] == 1 && $spike_data['plus_price'] ? $spike_data['plus_price'] : 0,
$RSModel::UID => self::$uid,
$RSModel::SELL_NUMBER => $goods_sku['sku_num'] ? $goods_sku['sku_num'] * $buy_number : $buy_number,
$RSModel::PAY_STATE => 0,
$RSModel::GET_INTEGRAL => $cr4[$RBDModel::GET_INTEGRAL],
);
if ($goods_sku) {
$cr6[$RSModel::SKU_JSON_INFO] = json_encode($goods_sku);
}
$add_result6 = $RSModel->addOrder($cr6);
if (!$add_result6) {
$res = array('status' => 0, 'msg' => '下单失败');
$this->ajaxReturn($res);
}
// pay_order下单
$cr[$RPOModel::BILL_ID] = $add_result2[$RBOModel::ID];
$add_result = $RPOModel->addPayOrder($cr);
if (!$add_result) {
$res = array('status' => 0, 'msg' => '下单失败');
}
if ($pay_type == 2) { // 微信支付
$notify_url = $this->REQUEST_URL . '/index.php/SmallProgramApi/WxPay/spike_notify_url';
$notify_func = "PayApi/ActivityOrder/spikeOrderContinentPay";
$wei_xin_result = A('SmallProgramApi/Pay')->getWxPayData_v1($add_result, $notify_url, $notify_func);
if ($wei_xin_result['status'] == 0) {
$this->ajaxReturn($wei_xin_result);
}
$res['pay_data'] = $wei_xin_result;
}
$res['status'] = 1;
$res['bill_id'] = $add_result2[$RBOModel::ID];
$this->ajaxReturn($res);
}
/**
* 秒杀下单
* @param int $spike_id 活动id
* @param int $buy_number 购买数量
* @param int $pay_type 支付类型
* @param int $pickup_type 配送方式 1.自提 2.配送
* @param int $address_id 地址id
* @param string $user_name 提货人
* @param int $user_phone 手机号
* @return array $res
*/
public function placeOrder_v1()
{
// 接受数据
$spike_id = I('post.spike_id');
$buy_number = I('post.buy_number');
$pay_type = I('post.pay_type');
$pickup_type = I('post.pickup_type');
$address_id = I('post.address_id');
$user_name = I('post.user_name');
$user_phone = I('post.user_phone');
$remark = I('post.remark');
$delivery_fee = I('post.delivery_fee'); // 配送费
$form_id = I('post.formId');//用户点击事件id
$time = time();
$cr = array();
if (empty(self::$uid)) {
$res['status'] = -1;
$res['msg'] = '用户未登录';
$this->ajaxReturn($res);
}
// 判断参数
if (!$spike_id || !$buy_number || !$pay_type || !$pickup_type) {
$res = array('status' => 0, 'msg' => '参数缺失');
$this->ajaxReturn($res);
}
$ver = $this->verifyPlaceOrder();
if (!$ver) {
$this->ajaxReturn(array('status' => 0, 'msg' => '当前时间未在商家营业时间内'));
}
// 判断自提配送
switch ($pickup_type) {
case 1:
// 判断自提人
if (!$user_name) {
$res = array('status' => 0, 'msg' => '请填写提货人姓名');
$this->ajaxReturn($res);
}
// 判断手机号
if (!$user_phone) {
$res = array('status' => 0, 'msg' => '请填写手机号');
$this->ajaxReturn($res);
}
break;
case 2:
// 判断地址id
if (!$address_id) {
$res = array('status' => 0, 'msg' => '请选择收货地址');
$this->ajaxReturn($res);
}
$RAModel = D('RetailAddress'); // 实例化用户地址模型
$result = $this->getLngLatAndFee($address_id);
if ($result['status'] == 0) {
$this->ajaxReturn($result);
}
// 判断配送费
if (floatval($delivery_fee) != floatval($result['fee'])) {
$res = array('status' => 0, 'msg' => '商家更新配送费,请重新下单');
$this->ajaxReturn($res);
}
$address = $result['address'];
$user_name = $address[$RAModel::NAME];
$user_phone = $address[$RAModel::PHONE];
$user_address = $address[$RAModel::ADDRESS];
break;
default:
$res = array('status' => 0, 'msg' => '未知的配送方式');
$this->ajaxReturn($res);
}
// 秒杀查询条件
$RSVModel = D('RetailSpikeView'); // 实例化模型
$map = array(
'RetailSpike.id' => $spike_id,
'RetailSpike.storeid' => self::$store_id,
'RetailSpike.active_status' => 1,
'RetailSpike.active_starttime' => array('elt', time()),
'RetailSpike.active_endtime' => array('gt', time()),
'RetailGoods.status' => 0,
'RetailGoods.online_state' => 1
);
$field = array(
'id', 'gid', 'sku_id', 'stock', 'spike_price', 'limit_state', 'limit_num', 'online_price',
'goods_name', 'goods_class_id', 'purchase_price', 'attribute_state', 'shop_mem_status',
'shop_mem_price', 'plus_mem_status', 'plus_price', 'goods_img_id', 'integral_mem_status', 'integral'
);
// 查询秒杀活动
$spike_data = $RSVModel->getFind($map, $field);
if (!$spike_data) {
$res = array('status' => 0, 'msg' => '该活动存在异常,请联系商家');
$this->ajaxReturn($res);
}
// 判断规格
$sku_id = $spike_data['sku_id'] && $spike_data['sku_id'] != 0 ? $spike_data['sku_id'] : 0;
if ($sku_id != 0) {
// 实例化模型
$RSGModel = D('RetailSkuGoods');
// 查询条件
$map2 = array(
$RSGModel::ID => $spike_data['sku_id'],
$RSGModel::STORE_ID => self::$store_id,
$RSGModel::GOODS_ID => $spike_data['gid'],
$RSGModel::STATUS => 1,
$RSGModel::STATE => 0,
);
// 查询条件
$goods_sku = $RSGModel->getFind($map2);
if (!$goods_sku) {
$res = array('status' => 0, 'msg' => '该活动商品规格存在异常,请联系商家');
return $res;
}
// 处理规格名称
$SLModel = D('RetailSkuList'); // 实例化模型
$sku_name = $SLModel->getFindField(array($SLModel::ID => array('in', $goods_sku[$RSGModel::SKU_ID_LIST])), $SLModel::NAME, true);
$goods_sku['name'] = implode(',', $sku_name);
// 处理数据
$spike_data['purchase_price'] = $goods_sku[$RSGModel::PURCHASE_PRICE];
$spike_data['shop_mem_price'] = $goods_sku[$RSGModel::SHOP_MEM_PRICE];
$spike_data['shop_mem_price'] = $goods_sku[$RSGModel::PLUS_PRICE];
}
// 统计用户购买数量
$RSOViewModel = D('RetailSpikeOrderView'); // 实例化模型(订单视图模型)
$map3 = array(
'RetailBillOrder.pay_state' => 1,
'RetailBillOrder.refund_status' => 0,
'RetailBillOrder.type' => 1,
'RetailBillOrder.uid' => self::$uid,
'RetailBillOrder.store_id' => self::$store_id,
'RetailBillOrder.merchant_id' => self::$merchant_id,
'RetailBillSpike.spike_id' => $spike_id,
'RetailBillSpike.state' => 1,
);
$count = $RSOViewModel->getSum($map3, 'buy_number');
// 判断限购
if ($count && intval($spike_data['limit_num']) > 0) {
if (($count + $buy_number) > intval($spike_data['limit_num'])) {
$res = array(
'status' => 0,
'msg' => '已超过限购数量'
);
$this->ajaxReturn($res);
}
}
// 判断金额
if (!$spike_data['spike_price'] || floatval($spike_data['spike_price']) <= 0) {
$res = array('status' => 0, 'msg' => '该活动商品存在异常,请联系商家');
$this->ajaxReturn($res);
}
// 计算金额
if ($pickup_type == 2) { // 配送
$money = floatval(round($spike_data['spike_price'] * $buy_number, 2) + $delivery_fee);
} else { // 自提
$money = floatval(round($spike_data['spike_price'] * $buy_number, 2));
}
$ApiRedis = new \Addons\Api\RedisController();
// 移除当前用户已取消支付的订单
$str = 'retail_spike_' . $spike_id . '_' . $sku_id . '_' . self::$uid . '_*';
$ApiRedis::$redis->delete($ApiRedis::$redis->keys($str));
// 获取待支付的库存
$str2 = 'retail_spike_' . $spike_id . '_' . $sku_id . '_*';
$wait_num = $this->getWaitNum($str2);
// 下单,判断当前库存,与待支付的库存
if (round($spike_data['stock'] - $wait_num - $buy_number) < 0) {
$res = array('status' => 0, 'msg' => '活动库存不足');
$this->ajaxReturn($res);
}
// 获取用户信息
$vip_info = $this->getVipInfo();
switch ($pay_type) {
case 1: // 会员卡支付
// 判断会员卡
if (!$vip_info) {
$res = array('status' => 0, 'msg' => '请先绑定会员');
$this->ajaxReturn($res);
}
// 判断余额
if (!$vip_info['balance'] || floatval($vip_info['balance']) < $money) {
$res = array('status' => 0, 'msg' => '余额不足,请先充值');
$this->ajaxReturn($res);
}
break;
case 2: // 微信支付
$RPSModel = D('RetailPaySet'); // 支付设置模型
$config_result = $RPSModel->getFindMerchantConfig(self::$merchant_id, 3);
if ($config_result['status'] != 1) {
$res = array('status' => 0, 'msg' => $config_result['msg'] ? $config_result['msg'] : '暂无可用的支付模式');
$this->ajaxReturn($res);
}
$cr['m_pay_type'] = $config_result['m_pay_type'];
break;
default:
$res = array('status' => 0, 'msg' => '支付方式错误');
$this->ajaxReturn($res);
}
$RPOModel = D('RetailPayOrder'); // 订单模型(pay_order)
// 下单信息(pay_order)
$cr[$RPOModel::ORDER_TYPE] = 1;
$cr[$RPOModel::PAY_TYPE] = $pay_type == 1 ? 6 : 4;
$cr[$RPOModel::TRADE_AMOUNT] = $money;
$cr[$RPOModel::STORE_ID] = self::$store_id;
$cr[$RPOModel::MERCHANT_ID] = self::$merchant_id;
$cr[$RPOModel::ORDER_STATE] = 'WAIT_BUYER_PAY';
$cr[$RPOModel::ADD_TIME] = $time;
$cr[$RPOModel::VID] = $vip_info ? $vip_info['vid'] : 0;
$cr[$RPOModel::UID] = self::$uid;
// bill下单(bill_order)
$RBOModel = D('RetailBillOrder'); // 实例化模型(bill_order)
$cr2 = array(
$RBOModel::ALL_MONEY => $cr[$RPOModel::TRADE_AMOUNT],
$RBOModel::PAY_STATE => 0,
$RBOModel::PAY_TYPE => $pay_type == 1 ? 5 : 6,
$RBOModel::REFUND_STATUS => 0,
$RBOModel::TYPE => 1,
$RBOModel::ORDER_TYPE => 1,
$RBOModel::ADD_TIME => $time,
$RBOModel::VID => $cr[$RPOModel::VID],
$RBOModel::STORE_ID => self::$store_id,
$RBOModel::MERCHANT_ID => self::$merchant_id,
$RBOModel::UID => self::$uid,
$RBOModel::PAY_MONEY => $cr[$RPOModel::TRADE_AMOUNT],
$RBOModel::AMOUNT_RECEIVED => $cr[$RPOModel::TRADE_AMOUNT],//实收金额
);
$add_result2 = $RBOModel->addBillOrder($cr2);
if (!$add_result2) {
$res = array('status' => 0, 'msg' => '下单失败');
$this->ajaxReturn($res);
}
// bill下单(bill_online)
$RBOnModel = D('RetailBillOnline'); // 实例化模型(bill_online)
$cr3 = array(
$RBOnModel::BILL_ID => $add_result2[$RBOModel::ID],
$RBOnModel::PICKUP_TYPE => $pickup_type,
$RBOnModel::USER_NAME => $user_name,
$RBOnModel::USER_PHONE => $user_phone,
$RBOnModel::USER_ADDRESS => $user_address ? $user_address : '',
$RBOnModel::DELIVERY_FEE => $delivery_fee,
$RBOnModel::ORDER_GENRE => 3,
$RBOnModel::REMARK => $remark,
);
if (!empty($form_id)) {
$cr3[$RBOnModel::FORM_ID] = $form_id;
}
$add_result3 = $RBOnModel->addOrder($cr3);
if (!$add_result3) {
$res = array('status' => 0, 'msg' => '下单失败');
$this->ajaxReturn($res);
}
// 判断是否为会员
if ($vip_info) {
// 获取会员类型
$vip_type = A('PayApi/Recharge')->getVipType($vip_info['vid']);
// 获取商户会员设置
$RVCModel = D('RetailVipConfig');
$field2 = array(
$RVCModel::PERCENT_STATE, $RVCModel::PERCENT, $RVCModel::PLUS_PERCENT_STATE, $RVCModel::PLUS_PERCENT,
$RVCModel::GOODS_INTEGRAL_STATE, $RVCModel::GOODS_INTEGRAL_PLUS_STATE, $RVCModel::GOODS_INTEGRAL_MULTIPLE,
);
// 商户会员设置
$vip_config = $RVCModel->getFind(array($RVCModel::MERCHANT_ID => self::$merchant_id), $field2);
// 商户开启消费送积分
if ($vip_config && $vip_config[$RVCModel::PERCENT_STATE] == 1 && $vip_config[$RVCModel::PERCENT] > 0) {
// plus是普通比例的倍数
$rate = $vip_type == 3 && $vip_config[$RVCModel::PLUS_PERCENT_STATE] == 1 && $vip_config[$RVCModel::PLUS_PERCENT] ? $vip_config[$RVCModel::PLUS_PERCENT] : 1;
// 判断商品送积分,商品单送,与整单送
if ($spike_data['integral_mem_status'] == 1 && $spike_data['integral'] > 0) {
// 商品单送
$integral = intval($spike_data['integral'] * $buy_number * $rate);
} else {
// 整单送
$integral = intval(($money - $delivery_fee) * $vip_config[$RVCModel::PERCENT] * $rate);
}
}
}
// bill 下单(bill_discount)
$RBDModel = D('RetailBillDiscount'); // 实例化模型(bill_discount)
$cr4 = array(
$RBDModel::BILL_ID => $add_result2[$RBOModel::ID],
$RBDModel::GET_INTEGRAL => $vip_info['vid'] && $integral ? $integral : 0,
);
$add_result4 = $RBDModel->addOrder($cr4);
if (!$add_result4) {
$res = array('status' => 0, 'msg' => '下单失败');
$this->ajaxReturn($res);
}
// bill 下单(bill_spike)
$RBSModel = D('RetailBillSpike'); // 拼团关联订单模型
$cr5 = array(
$RBSModel::BILL_ID => $add_result2[$RBOModel::ID],
$RBSModel::SPIKE_ID => $spike_id,
$RBSModel::BUY_NUMBER => $buy_number,
$RBSModel::STATE => 0,
);
$add_result5 = $RBSModel->addOrder($cr5);
if (!$add_result5) {
$res = array('status' => 0, 'msg' => '下单失败');
$this->ajaxReturn($res);
}
// 生成销售记录(sell)
$RSModel = D('RetailSell'); // 销售记录模型
$cr6 = array(
$RSModel::BILL_ID => $add_result2[$RBOModel::ID],
$RSModel::GOODS_ID => $spike_data['gid'],
$RSModel::PAY_TYPE => $cr2[$RBOModel::PAY_TYPE],
$RSModel::PRICE => $spike_data['spike_price'],
$RSModel::NUM => $buy_number,
$RSModel::ALL_MONEY => $money,
$RSModel::ADD_TIME => $time,
$RSModel::TYPE => 1,
$RSModel::STORE_ID => self::$store_id,
$RSModel::MERCHANT_ID => self::$merchant_id,
$RSModel::GOODS_CLASS_ID => $spike_data['goods_class_id'],
$RSModel::GOODS_NAME => $spike_data['goods_name'],
$RSModel::PRICING_METHOD => $spike_data['pricing_method'],
$RSModel::PURCHASE_PRICE => $spike_data['purchase_price'],
$RSModel::ORIGINAL_PRICE => $spike_data['online_price'],
$RSModel::GOODS_IMG_ID => $spike_data['goods_img_id'],
$RSModel::ATTRIBUTE_STATE => $spike_data['attribute_state'],
$RSModel::SELL_TYPE => 1,
$RSModel::GOODS_TYPE => 1,
$RSModel::VID => $cr[$RPOModel::VID],
$RSModel::VIP_PRICE => $spike_data['shop_mem_status'] == 1 && $spike_data['shop_mem_price'] ? $spike_data['shop_mem_price'] : 0,
$RSModel::PLUS_VIP_PRICE => $spike_data['plus_mem_status'] == 1 && $spike_data['plus_price'] ? $spike_data['plus_price'] : 0,
$RSModel::UID => self::$uid,
$RSModel::SELL_NUMBER => $goods_sku['sku_num'] ? $goods_sku['sku_num'] * $buy_number : $buy_number,
$RSModel::PAY_STATE => 0,
$RSModel::GET_INTEGRAL => $cr4[$RBDModel::GET_INTEGRAL],
);
if ($goods_sku) {
$cr6[$RSModel::SKU_JSON_INFO] = json_encode($goods_sku);
}
$add_result6 = $RSModel->addOrder($cr6);
if (!$add_result6) {
$res = array('status' => 0, 'msg' => '下单失败');
$this->ajaxReturn($res);
}
// pay_order下单
$cr[$RPOModel::BILL_ID] = $add_result2[$RBOModel::ID];
$add_result = $RPOModel->addPayOrder($cr);
if (!$add_result) {
$res = array('status' => 0, 'msg' => '下单失败');
$this->ajaxReturn($res);
}
if ($pay_type == 2) { // 微信支付
$notify_url = $this->REQUEST_URL . '/index.php/SmallProgramApi/WxPay/spike_notify_url';
$notify_func = "PayApi/ActivityOrder/spikeOrderContinentPay";
$wei_xin_result = A('SmallProgramApi/Pay')->getWxPayData_v1($add_result, $notify_url, $notify_func);
if ($wei_xin_result['status'] == 0) {
$this->ajaxReturn($wei_xin_result);
}
$res['pay_data'] = $wei_xin_result;
}
// 下单成功,创建redis订单
$key = 'retail_spike_' . $spike_id . '_' . $sku_id . '_' . self::$uid . '_' . $add_result2[$RBOModel::ID];
$val_arr = array(
'bill_id' => $add_result2[$RBOModel::ID],
'num' => $buy_number,
'expiration_time' => time() + 602,
'key' => $key
);
// 添加redis记录
$set_result = $ApiRedis::$redis->setex($key, 602, json_encode($val_arr));
// 判断
if (!$set_result) {
$res = array('status' => 0, 'msg' => '下单失败');
$this->ajaxReturn($res);
}
// 二次获取待支付的数量
$wait_num2 = $this->getWaitNum($str2);
// 获取现有库存
$Spike = D('RetailSpike');
$act_num = $Spike->getFindField(array($Spike::ID => $spike_id), $Spike::STOCK);
// 二次判断库存
if (floatval($wait_num2) > floatval($act_num)) {
// 超出库存,移除当前订单
$ApiRedis::$redis->delete($key);
$res = array('status' => 0, 'msg' => '活动库存不足,下单失败');
$this->ajaxReturn($res);
}
// 下单成功
$res['status'] = 1;
$res['bill_id'] = $add_result2[$RBOModel::ID];
$res['order_no'] = $add_result2[$RBOModel::ORDER_NO];
$this->ajaxReturn($res);
}
/**
* 会员卡支付
* @param int $order_id 订单id
* @param string $password 会员密码
* @return array $res
*/
public function vipPay()
{
// 判断订单id
$bill_id = I('post.bill_id');
$password = I('post.password');
if (!$bill_id || !$password) {
$res = array('status' => 0, 'msg' => '参数缺失');
$this->ajaxReturn($res);
}
// 查询订单
$BillModel = D('RetailBillOrder');
$map = array(
'b.' . $BillModel::ID => $bill_id,
'b.' . $BillModel::STORE_ID => self::$store_id,
'b.' . $BillModel::MERCHANT_ID => self::$merchant_id,
'b.' . $BillModel::PAY_STATE => 0,
'b.' . $BillModel::TYPE => 1,
'b.' . $BillModel::PAY_TYPE => 5,
'o.order_genre' => 3
);
$bill_order = $BillModel->getFindSpike($map);
if (!$bill_order) {
$res = array('status' => 0, 'msg' => '支付出现异常,请联系商家');
$this->ajaxReturn($res);
}
// 余额支付
$pay_result = A('PayApi/VipPay')->pay($bill_order[$BillModel::ID], 4, 2, $password);
if ($pay_result['status'] == 0) {
$this->ajaxReturn($pay_result);
}
// 修改bill
$update_order = A('PayApi/ActivityOrder')->paySuccess($bill_order[$BillModel::ID]);
if ($update_order['status'] == 0) {
$this->ajaxReturn($update_order);
}
// 修改秒杀状态
$res = A('PayApi/Spike')->updateOrder($bill_id);
$this->ajaxReturn($res);
}
/**
* 会员卡支付
* @param int $order_id 订单id
* @param string $password 会员密码
* @return array $res
*/
public function vipPay_v1()
{
// 判断订单id
$bill_id = I('post.bill_id');
$password = I('post.password');
if (!$bill_id || !$password) {
$res = array('status' => 0, 'msg' => '参数缺失');
$this->ajaxReturn($res);
}
// 查询订单
$BillModel = D('RetailBillOrder');
$map = array(
'b.' . $BillModel::ID => $bill_id,
'b.' . $BillModel::STORE_ID => self::$store_id,
'b.' . $BillModel::MERCHANT_ID => self::$merchant_id,
'b.' . $BillModel::PAY_STATE => 0,
'b.' . $BillModel::TYPE => 1,
'b.' . $BillModel::PAY_TYPE => 5,
'o.order_genre' => 3
);
$bill_order = $BillModel->getFindSpike($map);
if (!$bill_order) {
$res = array('status' => 0, 'msg' => '支付出现异常,请联系商家');
$this->ajaxReturn($res);
}
// 查询规格id
$Spike = D('RetailSpike');
$sku_id = $Spike->getFindField(array($Spike::ID => $bill_order['spike_id']), $Spike::SKU_ID);
$sku_id = $sku_id && $sku_id != 0 ? $sku_id : 0;
// 查询redis数据库订单是否过期
$ApiRedis = new \Addons\Api\RedisController();
$key = 'retail_spike_' . $bill_order['spike_id'] . '_' . $sku_id . '_' . self::$uid . '_' . $bill_id;
// 判断可以是否过期
$redis_key = $ApiRedis::$redis->exists($key);
if (!$redis_key) {
// 订单超时
$res = array('status' => 0, 'msg' => '支付超时,请重新下单');
$this->ajaxReturn($res);
}
// 余额支付
$pay_result = A('PayApi/VipPay')->pay($bill_order[$BillModel::ID], 4, 2, $password);
if ($pay_result['status'] == 0) {
$this->ajaxReturn($pay_result);
}
// 修改bill
$update_order = A('PayApi/ActivityOrder')->paySuccess($bill_order[$BillModel::ID]);
if ($update_order['status'] == 0) {
$this->ajaxReturn($update_order);
}
// 修改秒杀状态
$res = A('PayApi/Spike')->updateOrder($bill_id);
$this->ajaxReturn($res);
}
/**
* 微信支付查询订单是否成功
* @param int $bill_id
* @return array $res
*/
public function queryOrder()
{
// 判断订单id
$bill_id = I('post.bill_id');
if (!$bill_id) {
$res = array('status' => 0, 'msg' => '参数缺失');
$this->ajaxReturn($res);
}
// 查询订单
$BillModel = D('RetailBillOrder');
$map = array(
$BillModel::ID => $bill_id,
$BillModel::STORE_ID => self::$store_id,
$BillModel::MERCHANT_ID => self::$merchant_id,
$BillModel::PAY_STATE => 1,
$BillModel::TYPE => 1,
);
$bill_order = $BillModel->getFind($map);
if ($bill_order) {
$res = array('status' => 1, 'msg' => '支付成功');
} else {
$res = array('status' => 0, 'msg' => '正在支付');
}
$this->ajaxReturn($res);
}
/**
* 获取秒杀用户订单
* @return array $res
*/
public function getUserSpikeOrder()
{
// 查询订单
$RSOViewModel = D('RetailSpikeOrderView');
$map = array(
'RetailBillOrder.pay_state' => 1,
'RetailBillOrder.type' => 1,
'RetailBillOrder.uid' => self::$uid,
'RetailBillOrder.merchant_id' => self::$merchant_id,
'RetailBillOrder.store_id' => self::$store_id,
'RetailBillOrder.order_type' => 1,
'RetailBillOnline.order_genre' => 3
);
$field = array(
'id',
'all_money',
'order_no',
'add_time',
'delivery_fee',
'status',
'eval_status',
'remind_state',
'refund_status',
'pickup_type',
'pick_code',
'delivery_type',
'delivery_record_id',
'delivery_fee',
'remark',
'spike_id',
'state',
'buy_number',
'remark',
);
$user_spike = $RSOViewModel->getSelect($map, $field);
if (!$user_spike) {
$res = array('status' => 0, 'msg' => '暂无秒杀订单');
$this->ajaxReturn($res);
}
// 处理数据
$RSVModel = D('RetailSpikeView');
$RSLModel = D('RetailSkuList');
$RSGoodsModel = D('RetailSkuGoods');
$RDCModel = D('RetailDaClerk');
$RUOModel = D('RetailUuOrder');
$field2 = array('id', 'gid', 'sku_id', 'spike_price', 'name', 'goods_name', 'goods_img_id');
foreach ($user_spike as &$val) {
if ($val['state'] == 1 && $val['pickup_type'] == 2 && $val['status'] == 1 && $val['remind_state'] != 1) {
// 秒杀成功,未发货,提醒发货
$val['status_s'] = '秒杀成功';
$val['key_id'] = 1;
} else if ($val['state'] == 1 && $val['pickup_type'] == 2 && $val['status'] == 1 && $val['remind_state'] == 1) {
// 秒杀失败,未发货,已提醒发货
$val['status_s'] = '秒杀成功';
$val['key_id'] = 2;
} else if ($val['state'] == 1 && $val['pickup_type'] == 2 && $val['status'] == 2) {
// 秒杀成功,已发货
$val['status_s'] = '秒杀成功';
$val['key_id'] = 3;
} else if ($val['state'] == 1 && $val['pickup_type'] == 2 && $val['status'] == 3 && $val['eval_status'] != 1) {
// 秒杀成功,已收货,未评价
$val['status_s'] = '秒杀成功';
$val['key_id'] = 4;
} else if ($val['state'] == 1 && $val['pickup_type'] == 2 && $val['status'] == 3 && $val['eval_status'] == 1) {
// 秒杀成功,已收货,已评价
$val['status_s'] = '秒杀成功';
$val['key_id'] = 5;
} else if ($val['state'] == 1 && $val['pickup_type'] == 1 && $val['status'] == 1) {
// 秒杀成功,未提货
$val['status_s'] = '秒杀成功';
$val['key_id'] = 7;
} else if ($val['state'] == 1 && $val['pickup_type'] == 1 && $val['status'] == 3 && $val['eval_status'] != 1) {
// 秒杀成功,已提货,未评价
$val['status_s'] = '秒杀成功';
$val['key_id'] = 8;
} else if ($val['state'] == 1 && $val['pickup_type'] == 1 && $val['status'] == 3 && $val['eval_status'] == 1) {
// 秒杀成功,以提货,已评价
$val['status_s'] = '秒杀成功';
$val['key_id'] = 9;
} else if ($val['state'] == 0 && $val['refund_status'] == 1) {
// 秒杀失败,待退款
$val['status_s'] = '秒杀失败';
$val['key_id'] = 10;
} else if ($val['state'] == 0 && $val['refund_status'] == 2) {
// 秒杀失败,已退款
$val['status_s'] = '秒杀失败';
$val['key_id'] = 11;
}
$val['add_time'] = date('Y-m-d H:i:s', $val['add_time']);
// 查询活动
$spike = $RSVModel->getFind(array('RetailSpike.id' => $val['spike_id'], 'RetailSpike.storeid' => self::$store_id), $field2);
if (!$spike) {
$res = array('status' => 0, 'msg' => '订单出现异常,请联系商家');
$this->ajaxReturn($res);
}
$val['spike_price'] = $spike['spike_price'];
$val['goods_name'] = $spike['goods_name'];
// 判断规格
if ($spike['sku_id'] && $spike['sku_id'] != 0) {
// 获取规格名称
$sku_goods = $RSGoodsModel->getFind(array($RSGoodsModel::ID => $spike['sku_id']), array($RSGoodsModel::SKU_ID_LIST, $RSGoodsModel::GOODS_IMG, $RSGoodsModel::GOODS_IMG_ID));
if ($sku_goods) {
// 规格名称
$sku_name = $RSLModel->getFindField(array($RSLModel::ID => array('in', $sku_goods[$RSGoodsModel::SKU_ID_LIST])), $RSLModel::NAME, true);
$val['sku_name'] = implode(',', $sku_name);
$val['image'] = $this->getGoodsImage($sku_goods[$RSGoodsModel::GOODS_IMG_ID], $sku_goods[$RSGoodsModel::GOODS_IMG]);
} else {
$val['sku_name'] = '';
$val['image'] = $this->getGoodsImage($spike['goods_img_id']);
}
} else {
$val['sku_name'] = '';
$val['image'] = $this->getGoodsImage($spike['goods_img_id']);
}
// 配送方式
if ($val['pickup_type'] == 2) {
// 判断达达、uu配送
if ($val['delivery_type'] == 2) { // 达达配送
$val['order_status'] = $RDCModel->getFindField(array($RDCModel::ID => $val['delivery_record_id']), $RDCModel::ORDER_STATUS);
}
if ($val['delivery_type'] == 3) { // uu配送
$state = $RUOModel->getFindField(array($RUOModel::ID => $val['delivery_record_id']), $RUOModel::STATE);
if ($state == 1) {
$val['order_status'] = 1;
} else if ($state == 3 || $state == 4) {
$val['order_status'] = 2;
} else if ($state == 5 || $state == 6) {
$val['order_status'] = 3;
}
$val['delivery_type'] = 2;
}
}
}
$res = array('status' => 1, 'user_spike' => $user_spike);
$this->ajaxReturn($res);
}
/**
* 秒杀订单展示
* @return array $res
*/
public function getSpikeOrderDetails()
{
// 接受数据
$bill_id = I('post.bill_id');
if (!$bill_id) {
$res = array('status' => 0, 'msg' => '参数缺失');
$this->ajaxReturn($res);
}
// 查询订单
$RSOViewModel = D('RetailSpikeOrderView');
$map = array(
'RetailBillOrder.id' => $bill_id,
'RetailBillOrder.pay_state' => 1,
'RetailBillOrder.type' => 1,
'RetailBillOrder.uid' => self::$uid,
'RetailBillOrder.merchant_id' => self::$merchant_id,
'RetailBillOrder.store_id' => self::$store_id,
'RetailBillOrder.order_type' => 1,
'RetailBillOnline.order_genre' => 3
);
$field = array(
'id',
'all_money',
'add_time',
'vid',
'order_no',
'status',
'pickup_type',
'user_name',
'user_phone',
'user_address',
'remark',
'spike_id',
'state',
'buy_number',
'delivery_type',
);
$spike_order = $RSOViewModel->getFind($map, $field);
if (!$spike_order) {
$res = array('status' => 0, 'msg' => '订单查询出现异常,请联系商家');
$this->ajaxReturn($res);
}
// 处理数据
$spike_order['add_time'] = date('Y-m-d H:i:s', $spike_order['add_time']);
// 查询活动,商品
$RSVModel = D('RetailSpikeView');
$field2 = array('spike_price', 'sku_id', 'goods_name', 'goods_img_id');
$spike = $RSVModel->getFind(array('RetailSpike.id' => $spike_order['spike_id'], 'RetailSpike.storeid' => self::$store_id), $field2);
if (!$spike) {
$res = array('status' => 0, 'msg' => '订单出现异常,请联系商家');
$this->ajaxReturn($res);
}
$spike_order['spike_price'] = $spike['spike_price'];
$spike_order['goods_name'] = $spike['goods_name'];
// 判断规格
if ($spike['sku_id'] && $spike['sku_id'] != 0) {
// 获取规格名称
$RSGoodsModel = D('RetailSkuGoods');
$sku_goods = $RSGoodsModel->getFind(array($RSGoodsModel::ID => $spike['sku_id']), array($RSGoodsModel::SKU_ID_LIST, $RSGoodsModel::GOODS_IMG, $RSGoodsModel::GOODS_IMG_ID));
if ($sku_goods) {
// 规格名称
$RSLModel = D('RetailSkuList');
$sku_name = $RSLModel->getFindField(array($RSLModel::ID => array('in', $sku_goods[$RSGoodsModel::SKU_ID_LIST])), $RSLModel::NAME, true);
$spike_order['sku_name'] = implode(',', $sku_name);
$spike_order['image'] = $this->getGoodsImage($sku_goods[$RSGoodsModel::GOODS_IMG_ID], $sku_goods[$RSGoodsModel::GOODS_IMG]);
} else {
$spike_order['sku_name'] = '';
$spike_order['image'] = $this->getGoodsImage($spike['goods_img_id']);
}
} else {
$spike_order['sku_name'] = '';
$spike_order['image'] = $this->getGoodsImage($spike['goods_img_id']);
}
$res = array('status' => 1, 'spike_order' => $spike_order);
$this->ajaxReturn($res);
}
/**
* 获取秒杀用户订单
* @return array $res
*/
public function getUserSpikeOrder_v1()
{
// 查询订单
$page = I('post.page') ? I('post.page') : 1;
$RSOViewModel = D('RetailSpikeOrderView');
$map = array(
'RetailBillOrder.pay_state' => 1,
'RetailBillOrder.type' => 1,
'RetailBillOrder.uid' => self::$uid,
'RetailBillOrder.merchant_id' => self::$merchant_id,
'RetailBillOrder.store_id' => self::$store_id,
'RetailBillOrder.order_type' => 1,
'RetailBillOnline.order_genre' => 3
);
$field = array(
'id',
'all_money',
'order_no',
'add_time',
'delivery_fee',
'status',
'eval_status',
'remind_state',
'refund_status',
'pickup_type',
'pick_code',
'delivery_type',
'delivery_record_id',
'delivery_fee',
'remark',
'spike_id',
'state',
'buy_number',
'remark',
);
$limit = 10;
$user_spike = $RSOViewModel->getSelect($map, $field, $page, $limit);
if (!$user_spike) {
$res = array(
'status' => 1,
'msg' => '暂无秒杀订单',
'data' => array(),
'limit' => $limit,
);
$this->ajaxReturn($res);
}
// 处理数据
$RSVModel = D('RetailSpikeView');
$RSLModel = D('RetailSkuList');
$RSGoodsModel = D('RetailSkuGoods');
$RDCModel = D('RetailDaClerk');
$RUOModel = D('RetailUuOrder');
$field2 = array('id', 'gid', 'sku_id', 'spike_price', 'name', 'goods_name', 'goods_img_id');
foreach ($user_spike as &$val) {
if ($val['state'] == 1 && $val['pickup_type'] == 2 && $val['status'] == 1 && $val['remind_state'] != 1) {
// 秒杀成功,未发货,提醒发货
$val['status_s'] = '秒杀成功';
$val['key_id'] = 1;
} else if ($val['state'] == 1 && $val['pickup_type'] == 2 && $val['status'] == 1 && $val['remind_state'] == 1) {
// 秒杀失败,未发货,已提醒发货
$val['status_s'] = '秒杀成功';
$val['key_id'] = 2;
} else if ($val['state'] == 1 && $val['pickup_type'] == 2 && $val['status'] == 2) {
// 秒杀成功,已发货
$val['status_s'] = '秒杀成功';
$val['key_id'] = 3;
} else if ($val['state'] == 1 && $val['pickup_type'] == 2 && $val['status'] == 3 && $val['eval_status'] != 1) {
// 秒杀成功,已收货,未评价
$val['status_s'] = '秒杀成功';
$val['key_id'] = 4;
} else if ($val['state'] == 1 && $val['pickup_type'] == 2 && $val['status'] == 3 && $val['eval_status'] == 1) {
// 秒杀成功,已收货,已评价
$val['status_s'] = '秒杀成功';
$val['key_id'] = 5;
} else if ($val['state'] == 1 && $val['pickup_type'] == 1 && $val['status'] == 1) {
// 秒杀成功,未提货
$val['status_s'] = '秒杀成功';
$val['key_id'] = 7;
} else if ($val['state'] == 1 && $val['pickup_type'] == 1 && $val['status'] == 3 && $val['eval_status'] != 1) {
// 秒杀成功,已提货,未评价
$val['status_s'] = '秒杀成功';
$val['key_id'] = 8;
} else if ($val['state'] == 1 && $val['pickup_type'] == 1 && $val['status'] == 3 && $val['eval_status'] == 1) {
// 秒杀成功,以提货,已评价
$val['status_s'] = '秒杀成功';
$val['key_id'] = 9;
} else if ($val['state'] == 0 && $val['refund_status'] == 1) {
// 秒杀失败,待退款
$val['status_s'] = '秒杀失败';
$val['key_id'] = 10;
} else if ($val['state'] == 0 && $val['refund_status'] == 2) {
// 秒杀失败,已退款
$val['status_s'] = '秒杀失败';
$val['key_id'] = 11;
}
$val['add_time'] = date('Y-m-d H:i:s', $val['add_time']);
// 查询活动
$spike = $RSVModel->getFind(array('RetailSpike.id' => $val['spike_id'], 'RetailSpike.storeid' => self::$store_id), $field2);
if (!$spike) {
$res = array('status' => 0, 'msg' => '订单出现异常,请联系商家');
$this->ajaxReturn($res);
}
$val['spike_price'] = $spike['spike_price'];
$val['goods_name'] = $spike['goods_name'];
// 判断规格
if ($spike['sku_id'] && $spike['sku_id'] != 0) {
// 获取规格名称
$sku_goods = $RSGoodsModel->getFind(array($RSGoodsModel::ID => $spike['sku_id']), array($RSGoodsModel::SKU_ID_LIST, $RSGoodsModel::GOODS_IMG, $RSGoodsModel::GOODS_IMG_ID));
if ($sku_goods) {
// 规格名称
$sku_name = $RSLModel->getFindField(array($RSLModel::ID => array('in', $sku_goods[$RSGoodsModel::SKU_ID_LIST])), $RSLModel::NAME, true);
$val['sku_name'] = implode(',', $sku_name);
$val['image'] = $this->getGoodsImage($sku_goods[$RSGoodsModel::GOODS_IMG_ID], $sku_goods[$RSGoodsModel::GOODS_IMG]);
} else {
$val['sku_name'] = '';
$val['image'] = $this->getGoodsImage($spike['goods_img_id']);
}
} else {
$val['sku_name'] = '';
$val['image'] = $this->getGoodsImage($spike['goods_img_id']);
}
// 配送方式
if ($val['pickup_type'] == 2) {
// 判断达达、uu配送
if ($val['delivery_type'] == 2) { // 达达配送
$val['order_status'] = $RDCModel->getFindField(array($RDCModel::ID => $val['delivery_record_id']), $RDCModel::ORDER_STATUS);
}
if ($val['delivery_type'] == 3) { // uu配送
$state = $RUOModel->getFindField(array($RUOModel::ID => $val['delivery_record_id']), $RUOModel::STATE);
if ($state == 1) {
$val['order_status'] = 1;
} else if ($state == 3 || $state == 4) {
$val['order_status'] = 2;
} else if ($state == 5 || $state == 6) {
$val['order_status'] = 3;
}
$val['delivery_type'] = 2;
}
}
}
$res = array(
'status' => 1,
'data' => $user_spike,
'limit' => $limit,
'msg' => '查询成功',
);
$this->ajaxReturn($res);
}
/*********************** 2020-03-30 快递发货下单 *******************************/
/**
* 2020-03-30 获取购买数据 快递发货
*/
public function getBuyData_v1()
{
if (empty(self::$uid)) {
$res['status'] = -1;
$res['msg'] = '用户未登录';
$this->ajaxReturn($res);
}
// 接收数据
$spike_id = I('post.spike_id');//秒杀活动ID
$buy_number = I('post.buy_number');//购买数量
// 判断接受参数
if (!$spike_id || !$buy_number) {
$res = array('status' => 0, 'msg' => '参数缺失');
$this->ajaxReturn($res);
}
// 秒杀查询条件
$RSVModel = D('RetailSpikeView'); // 实例化模型
$map = array(
'RetailSpike.id' => $spike_id,
'RetailSpike.storeid' => self::$store_id,
'RetailSpike.active_status' => 1,
'RetailSpike.active_starttime' => array('elt', time()),
'RetailSpike.active_endtime' => array('gt', time()),
'RetailGoods.status' => 0,
'RetailGoods.online_state' => 1
);
$field = array(
'id',
'gid',
'sku_id',
'name',
'stock',
'spike_price',
'sell_number',
'end_time',
'send_type',
'goods_name',
'online_price',
'company',
'goods_img_id'
);
// 查询秒杀活动
$buy_data = $RSVModel->getFind($map, $field);
if (!$buy_data) {
$res = array(
'status' => 0,
'msg' => '该活动存在异常,请联系商家',
);
$this->ajaxReturn($res);
}
// 判断规格
if ($buy_data['sku_id']) {
$RSGModel = D('RetailSkuGoods'); // 实例化模型
// 查询条件
$map2 = array(
$RSGModel::ID => $buy_data['sku_id'],
$RSGModel::STORE_ID => self::$store_id,
$RSGModel::GOODS_ID => $buy_data['gid'],
$RSGModel::STATUS => 1,
$RSGModel::STATE => 0,
);
$field = array($RSGModel::ID, $RSGModel::SKU_ID_LIST, $RSGModel::ONLINE_PRICE, $RSGModel::GOODS_IMG_ID);
// 查询条件
$goods_sku = $RSGModel->getFind($map2, $field);
if (!$goods_sku) {
$res = array('status' => 0, 'msg' => '该活动商品规格存在异常,请联系商家');
$this->ajaxReturn($res);
}
// 处理数据
$buy_data['online_price'] = $goods_sku[$RSGModel::ONLINE_PRICE];
$buy_data['goods_img_id'] = $goods_sku[$RSGModel::GOODS_IMG_ID];
// 处理规格名称
$SLModel = D('RetailSkuList'); // 实例化模型
$sku_name = $SLModel->getFindField(array($SLModel::ID => array('in', $goods_sku[$RSGModel::SKU_ID_LIST])), $SLModel::NAME, true);
$buy_data['name'] = $buy_data['name'] . '(' . implode(',', $sku_name) . ')';
}
// 处理数据
if (!$buy_data['spike_price'] || floatval($buy_data['spike_price']) <= 0) { // 判断金额
$res = array('status' => 0, 'msg' => '该商品价格存在异常,请联系商家');
$this->ajaxReturn($res);
} else {
$buy_data['spike_price'] = floatval($buy_data['spike_price']);
}
$buy_data['all_money'] = floatval(round($buy_data['spike_price'] * $buy_number, 2)); // 计算金额
$buy_data['image'] = $this->getGoodsImage($buy_data['goods_img_id']);
// 返回值
$SmallProgramModel = D('RetailSmallProgramUser');
$storeSet = $this->getStoreSet_v2();//门店基本设置
$delivery_set = $storeSet['delivery_set'];//配送设置
$send_type = explode(',', $buy_data['send_type']);
if (!in_array('1', $send_type)) {
//自提
$delivery_set[0] = 0;
}
if (!in_array('2', $send_type)) {
//配送
$delivery_set[1] = 0;
}
if (!in_array('3', $send_type)) {
//快递发货
$delivery_set[2] = 0;
}
//免配送费门槛金额
$delivery_cost = self::$store['delivery_cost'];
$delivery_status = self::$store['delivery_status'];
$res = array(
'status' => 1,
'msg' => '数据获取成功',
'data' => array(
'buy_data' => $buy_data,
'link_name' => self::$user[$SmallProgramModel::LINK_NAME],
'mobile_phone' => self::$user[$SmallProgramModel::MOBILE_PHONE],
'storeSet' => $storeSet, //基本设置
'address' => $this->getDefaultAddress_v1(), //默认地址
'vip_info' => $this->getVipInfo(),
'delivery_set' => $delivery_set,
),
'delivery_cost' => $delivery_cost,
'delivery_status' => $delivery_status
);
$this->ajaxReturn($res);
}
/**
* 2020-03-30 秒杀下单 快递发货
*/
public function placeOrder_v2()
{
if (empty(self::$uid)) {
$res['status'] = -1;
$res['msg'] = '用户未登录';
$this->ajaxReturn($res);
}
//验证参数列表及规则
$verifyItem = array(
'pickup_type' => array('in' => array(1, 2, 3), 'require_link' => array(
array('require_data' => 1, 'link_key' => array('user_name', 'user_phone', 'start_date')),
array('require_data' => 2, 'link_key' => array('address_id', 'start_date')),
array('require_data' => 3, 'link_key' => array('address_id')),
)),
'spike_id' => array('type' => 'number', 'min' => 1),
'buy_number' => array('type' => 'number', 'min' => 0),
'address_id' => array('type' => 'number', 'min' => 0, 'require' => false),
'user_name' => array('type' => 'name', 'require' => false),
'user_phone' => array('type' => 'mobile', 'require' => false),
'delivery_fee' => array('type' => 'money', 'min' => 0, 'require' => false),
'remark' => array('type' => 'string', 'maxLen' => 255, 'require' => false),
);
$post = I('post.');
$verify = verifyRequestParam($post, $verifyItem);//验证参数是否正确
if ($verify['error'] == 1) {
$result['status'] = 0;
$result['msg'] = $verify['key'] . $verify['message'];
$this->ajaxReturn($result);
}
$pickup_type = $post['pickup_type'];//配送方式 1自提 2同城配送 3快递发货
$spike_id = $post['spike_id']; //秒杀活动ID
$buy_number = $post['buy_number']; //购买数量
$address_id = $post['address_id']; //收货地址ID
$user_name = $post['user_name']; //自提姓名
$user_phone = $post['user_phone']; //自提手机号
$delivery_fee = $post['delivery_fee'];//配送费
$remark = $post['remark']; //备注
$start_date = $post['start_date'];//用户选择的配送或者自取时间
$time = time();
$ver = $this->verifyPlaceOrder();
if (!$ver) {
$this->ajaxReturn(array('status' => 0, 'msg' => '当前时间未在商家营业时间内'));
}
// 秒杀查询条件
$RSVModel = new RetailSpikeViewModel(); // 实例化模型
$map = array(
'RetailSpike.id' => $spike_id,
'RetailSpike.storeid' => self::$store_id,
'RetailSpike.active_status' => 1,
'RetailSpike.active_starttime' => array('elt', time()),
'RetailSpike.active_endtime' => array('gt', time()),
'RetailGoods.status' => 0,
'RetailGoods.online_state' => 1
);
$field = array(
'id',
'gid',
'sku_id',
'stock',
'spike_price',
'limit_state',
'limit_num',
'online_price',
'goods_name',
'goods_class_id',
'pricing_method',
'purchase_price',
'attribute_state',
'goods_img_id',
'integral_mem_status',
'integral',
'send_type',
'rise_num',
'weight_value',
'delivery_template_id',
'company'
);
// 查询秒杀活动
$spike_data = $RSVModel->getFind($map, $field);
if (!$spike_data) {
$res = array(
'status' => 0,
'msg' => '该活动存在异常,请联系商家',
);
$this->ajaxReturn($res);
}
if ($spike_data['rise_num'] != 0 && floatval($buy_number) < floatval($spike_data['rise_num'])) {
$res = array(
'status' => 0,
'msg' => "该秒杀商品起购量为{$spike_data['rise_num']}件",
);
$this->ajaxReturn($res);
}
// 判断规格
$sku_id = $spike_data['sku_id'] && $spike_data['sku_id'] != 0 ? $spike_data['sku_id'] : 0;
if ($sku_id != 0) {
// 实例化模型
$RSGModel = D('RetailSkuGoods');
// 查询条件
$map2 = array(
$RSGModel::ID => $spike_data['sku_id'],
$RSGModel::STORE_ID => self::$store_id,
$RSGModel::GOODS_ID => $spike_data['gid'],
$RSGModel::STATUS => 1,
$RSGModel::STATE => 0,
);
// 查询条件
$goods_sku = $RSGModel->getFind($map2);
if (!$goods_sku) {
$res = array('status' => 0, 'msg' => '该活动商品规格存在异常,请联系商家');
return $res;
}
// 处理规格名称
$SLModel = D('RetailSkuList'); // 实例化模型
$sku_name = $SLModel->getFindField(array('id' => array('in', $goods_sku['sku_id_list'])), 'name', true);
$goods_sku['name'] = implode(',', $sku_name);
// 处理数据
$spike_data['purchase_price'] = $goods_sku['purchase_price'];
$spike_data['online_price'] = $goods_sku['online_price'];
$spike_data['weight_value'] = $goods_sku['weight_value'];
}
// 统计用户购买数量
$RSOViewModel = new RetailSpikeOrderViewModel(); // 实例化模型(订单视图模型)
$map3 = array(
'RetailBillOrder.pay_state' => 1,
'RetailBillOrder.refund_status' => 0,
'RetailBillOrder.type' => 1,
'RetailBillOrder.uid' => self::$uid,
'RetailBillOrder.store_id' => self::$store_id,
'RetailBillOrder.merchant_id' => self::$merchant_id,
'RetailBillSpike.spike_id' => $spike_id,
'RetailBillSpike.state' => 1,
);
$count = $RSOViewModel->getSum($map3, 'buy_number');
// 判断限购
if ($count && intval($spike_data['limit_num']) > 0) {
if (($count + $buy_number) > intval($spike_data['limit_num'])) {
$res = array(
'status' => 0,
'msg' => '已超过限购数量'
);
$this->ajaxReturn($res);
}
}
// 判断金额
if (!$spike_data['spike_price'] || floatval($spike_data['spike_price']) <= 0) {
$res = array(
'status' => 0,
'msg' => '该活动商品存在异常,请联系商家'
);
$this->ajaxReturn($res);
}
$ApiRedis = new \Addons\Api\RedisController();
$wait_str = 'retail_spike_' . $spike_id . '_' . $sku_id . '_' . self::$uid . '_*';
$user_wait_buy = $this->getWaitNum($wait_str);// 获取用户在当前商品是否有待支付
if ($user_wait_buy > 0) {
$res = array(
'status' => 0,
'msg' => '您有一笔该活动的待支付订单,请先进行处理'
);
$this->ajaxReturn($res);
}
$other_wait_str = 'retail_spike_' . $spike_id . '_' . $sku_id . '_*';
$wait_num = $this->getWaitNum($other_wait_str);// 获取所有该活动待支付的数量
// 判断当前库存,与待支付的数量
if (round($spike_data['stock'] - $wait_num - $buy_number) < 0) {
$res = array(
'status' => 0,
'msg' => '活动库存不足'
);
$this->ajaxReturn($res);
}
$storeSet = $this->getStoreSet_v2();//获取门店配送设置
$delivery_set = $storeSet['delivery_set'];
$send_type = explode(',', $spike_data['send_type']);
if (!in_array('1', $send_type)) {
$delivery_set[0] = 0;
}
if (!in_array('2', $send_type)) {
$delivery_set[1] = 0;
}
if (!in_array('3', $send_type)) {
$delivery_set[2] = 0;
}
switch ($pickup_type) {
case '1':
//自提
if (!$delivery_set[0]) {
$res = array(
'status' => 0,
'msg' => '商家更新自提设置,请退出重试'
);
$this->ajaxReturn($res);
}
break;
case '2':
//同城配送
if (!$delivery_set[1]) {
$res = array(
'status' => 0,
'msg' => '商家更新配送设置,请退出重试'
);
$this->ajaxReturn($res);
}
$result = $this->getLngLatAndFee($address_id);
if ($result['status'] == 0) {
$this->ajaxReturn($result);
}
// 判断配送费
if (floatval($delivery_fee) != floatval($result['fee'])) {
$res = array(
'status' => 0,
'msg' => '商家更新配送费,请重新下单'
);
$this->ajaxReturn($res);
}
$address = $result['address'];
$user_name = $address['name'];
$user_phone = $address['phone'];
$user_address = $address['address'];
break;
case '3':
//快递发货
if ($delivery_set[2] != 1) {
$res['status'] = 0;
$res['msg'] = '商家快递发货设置有变动,请退出重试';
$this->ajaxReturn($res);
}
//计算配送费
$CostCalculation = new CostCalculationController();
$AddressModel = D('RetailAddress');
$addressInfo = $AddressModel->getUserAddress($address_id);
$user_name = $addressInfo['name'];
$user_phone = $addressInfo['phone'];
$user_address = $addressInfo['address'];
$province = $addressInfo['province'];
$city = $addressInfo['city'];
$area = $addressInfo['area'];
$goods = array(
array(
'num' => $buy_number,
'delivery_template_id' => $spike_data['delivery_template_id'],
'pricing_method' => $spike_data['pricing_method'],
'weight_value' => $spike_data['weight_value'],
)
);
$cost_fee = $CostCalculation->getFreight(json_encode($goods), self::$store_id, $province, $city, $area);
if ($cost_fee['status'] == 1) {
if ($cost_fee['delivery_fee'] != $delivery_fee) {
$res['status'] = 0;
$res['msg'] = '快递费有变动,请退出重试';
$this->ajaxReturn($res);
}
} else {
$this->ajaxReturn($cost_fee);
}
break;
}
// 计算金额
if ($pickup_type == 2 || $pickup_type == 3) {
// 配送、快递
$money = floatval(round($spike_data['spike_price'] * $buy_number, 2) + $delivery_fee);
} else { // 自提
$money = floatval(round($spike_data['spike_price'] * $buy_number, 2));
}
// 获取用户信息
$vip_info = $this->getVipInfo();
// bill下单(bill_order)
$RBOModel = D('RetailBillOrder'); // 实例化模型(bill_order)
$bill_item = array(
'all_money' => $money,
'pay_state' => 0,
'pay_type' => 0,
'refund_status' => 0,
'type' => 1,
'order_type' => 1,
'add_time' => $time,
'vid' => $vip_info ? $vip_info['vid'] : 0,
'store_id' => self::$store_id,
'merchant_id' => self::$merchant_id,
'uid' => self::$uid,
'pay_money' => $money,
'amount_received' => $money,//实收金额
);
$bill = $RBOModel->addBillOrder($bill_item);
if (!$bill) {
$res = array(
'status' => 0,
'msg' => '下单失败'
);
$this->ajaxReturn($res);
}
// (bill_online)
$RBOnModel = D('RetailBillOnline'); // 实例化模型(bill_online)
$online_item = array(
'bill_id' => $bill['id'],
'pickup_type' => $pickup_type,
'user_name' => $user_name,
'user_phone' => $user_phone,
'user_address' => $user_address ? $user_address : '',
'delivery_fee' => $delivery_fee,
'order_genre' => 3,
'remark' => $remark,
'user_select_time' => strtotime($start_date),//用户选择的时间
);
$online = $RBOnModel->addOrder($online_item);
if (!$online) {
$res = array(
'status' => 0,
'msg' => '下单失败'
);
$this->ajaxReturn($res);
}
// 判断是否为会员
if ($vip_info) {
// 获取会员类型
$vip_type = $vip_info['user_type']; //2plus会员
// 获取商户会员设置
$RVCModel = D('RetailVipConfig');
// 商户会员设置
$vip_config = $RVCModel->getFind(array($RVCModel::MERCHANT_ID => self::$merchant_id));
if ($vip_config) {
$give_state = true; //判断是否执行基于订单
if ($spike_data['integral_mem_status'] == 1 && $spike_data['integral'] > 0) {
$parameter = array(
'vip_type' => $vip_type,
'vip_config' => $vip_config,
'integral' => $spike_data['integral'],
'num' => $buy_number
);
$integral = $RVCModel->buy_goods_get_integral($parameter);
if ($integral > 0) {
$give_state = false;
}
}
if ($give_state) {
$parameter = array(
'vip_type' => $vip_type,
'vip_config' => $vip_config
);
$percent_state = $RVCModel->buy_integral_config($parameter);
if ($percent_state) {
if ($pickup_type == 2 || $pickup_type == 3) {
$parameter['all_money'] = $money - $delivery_fee;
} else {
$parameter['all_money'] = $money;
}
$integral = $RVCModel->buy_get_integral($parameter);
}
}
}
}
// bill_discount
$RBDModel = D('RetailBillDiscount'); // 实例化模型(bill_discount)
$discount_item = array(
'bill_id' => $bill['id'],
'get_integral' => $vip_info['vid'] && $integral ? $integral : 0,
);
$discount = $RBDModel->addOrder($discount_item);
if (!$discount) {
$res = array(
'status' => 0,
'msg' => '下单失败'
);
$this->ajaxReturn($res);
}
// bill_spike
$RBSModel = D('RetailBillSpike'); // 秒杀关联订单模型
$spike_item = array(
$RBSModel::BILL_ID => $bill['id'],
$RBSModel::SPIKE_ID => $spike_id,
$RBSModel::BUY_NUMBER => $buy_number,
$RBSModel::STATE => 0,
);
$spike = $RBSModel->addOrder($spike_item);
if (!$spike) {
$res = array(
'status' => 0,
'msg' => '下单失败'
);
$this->ajaxReturn($res);
}
// 生成销售记录(sell)
$SellModel = D('RetailSell'); // 销售记录模型
$sell_item = array(
'bill_id' => $bill['id'],
'goods_id' => $spike_data['gid'],
'pay_type' => 0,
'price' => $spike_data['spike_price'],
'num' => $buy_number,
'all_money' => $money,
'add_time' => $time,
'type' => 1,
'store_id' => self::$store_id,
'merchant_id' => self::$merchant_id,
'goods_class_id' => $spike_data['goods_class_id'],
'goods_name' => $spike_data['goods_name'],
'pricing_method' => $spike_data['pricing_method'],
'purchase_price' => $spike_data['purchase_price'],
'original_price' => $spike_data['online_price'],
'goods_img_id' => $spike_data['goods_img_id'],
'attribute_state' => $spike_data['attribute_state'],
'vid' => $bill['vid'],
'uid' => self::$uid,
'sell_number' => $goods_sku['sku_num'] ? $goods_sku['sku_num'] * $buy_number : $buy_number,
'pay_state' => 0,
'get_integral' => $discount_item['get_integral'],
'company' => $spike_data['company']
);
if ($goods_sku) {
$sell_item['sku_json_info'] = json_encode($goods_sku);
}
$sell = $SellModel->addOrder($sell_item);
if (!$sell) {
$res = array(
'status' => 0,
'msg' => '下单失败'
);
$this->ajaxReturn($res);
}
// 下单成功,创建redis订单
$key = 'retail_spike_' . $spike_id . '_' . $sku_id . '_' . self::$uid . '_' . $bill['id'];
$val_arr = array(
'bill_id' => $bill['id'],
'num' => $buy_number,
'expiration_time' => time() + 602,
'key' => $key
);
// 添加redis记录
$set_result = $ApiRedis::$redis->setex($key, 602, json_encode($val_arr));
if (!$set_result) {
$res = array(
'status' => 0,
'msg' => '下单失败'
);
$this->ajaxReturn($res);
}
// 二次获取待支付的数量
$wait_num = $this->getWaitNum($other_wait_str);
// 获取现有库存
$Spike = D('RetailSpike');
$act_num = $Spike->getFindField(array($Spike::ID => $spike_id), $Spike::STOCK);
// 二次判断库存
if (floatval($wait_num) > floatval($act_num)) {
// 超出库存,移除当前订单
$ApiRedis::$redis->delete($key);
$res = array(
'status' => 0,
'msg' => '活动库存不足,下单失败'
);
$this->ajaxReturn($res);
}
// 下单成功
if ($pickup_type == 1) {
$up = array(
'link_name' => $user_name,
'mobile_phone' => $user_phone,
);
D('RetailSmallProgramUser')->updateOrder(array('id' => self::$uid), $up);
}
$res['status'] = 1;
$res['msg'] = '下单成功';
$res['data'] = array(
'order_no' => $bill['order_no'],
'allMoney' => $money,
);
$this->ajaxReturn($res);
}
/**
* 2020-06-13 秒杀下单 快递发货 修改配送费
*/
public function placeOrder_v3()
{
if (empty(self::$uid) || self::$user['login_state'] != 1) {
$res['status'] = -1;
$res['msg'] = '用户未登录';
$this->ajaxReturn($res);
}
//验证参数列表及规则
$verifyItem = array(
'pickup_type' => array('in' => array(1, 2, 3), 'require_link' => array(
array('require_data' => 1, 'link_key' => array('user_name', 'user_phone', 'start_date')),
array('require_data' => 2, 'link_key' => array('address_id', 'start_date')),
array('require_data' => 3, 'link_key' => array('address_id')),
)),
'spike_id' => array('type' => 'number', 'min' => 1),
'buy_number' => array('type' => 'number', 'min' => 0),
'address_id' => array('type' => 'number', 'min' => 0, 'require' => false),
'user_name' => array('type' => 'name', 'require' => false),
'user_phone' => array('type' => 'mobile', 'require' => false),
'delivery_fee' => array('type' => 'money', 'min' => 0, 'require' => false),
'remark' => array('type' => 'string', 'maxLen' => 255, 'require' => false),
);
$platform_type = self::$merchant['platform_type'] ? self::$merchant['platform_type'] : 1;
$post = I('post.');
$verify = verifyRequestParam($post, $verifyItem);//验证参数是否正确
if ($verify['error'] == 1) {
$result['status'] = 0;
$result['msg'] = $verify['key'] . $verify['message'];
$this->ajaxReturn($result);
}
$pickup_type = $post['pickup_type'];//配送方式 1自提 2同城配送 3快递发货
$spike_id = $post['spike_id']; //秒杀活动ID
$buy_number = $post['buy_number']; //购买数量
$address_id = $post['address_id']; //收货地址ID
$user_name = $post['user_name']; //自提姓名
$user_phone = $post['user_phone']; //自提手机号
$delivery_fee = $post['delivery_fee'];//配送费
$remark = $post['remark']; //备注
$start_date = $post['start_date'];//用户选择的配送或者自取时间
$time = time();
$ver = $this->verifyPlaceOrder();
if (!$ver) {
$this->ajaxReturn(array('status' => 0, 'msg' => '当前时间未在商家营业时间内'));
}
// 秒杀查询条件
$RSVModel = new RetailSpikeViewModel(); // 实例化模型
$map = array(
'RetailSpike.id' => $spike_id,
'RetailSpike.storeid' => self::$store_id,
'RetailSpike.active_status' => 1,
'RetailSpike.active_starttime' => array('elt', time()),
'RetailSpike.active_endtime' => array('gt', time()),
'RetailGoods.status' => 0,
'RetailGoods.online_state' => 1
);
$field = array(
'id',
'gid',
'sku_id',
'stock',
'spike_price',
'limit_state',
'limit_num',
'online_price',
'goods_name',
'goods_class_id',
'pricing_method',
'purchase_price',
'attribute_state',
'goods_img_id',
'integral_mem_status',
'integral',
'send_type',
'rise_num',
'delivery_template_id',
'company',
'weight_value',
'serial_number_state'
);
if ($platform_type == 2) {
//第三方平台
$field[] = 'third_goods_code';
}
// 查询秒杀活动
$spike_data = $RSVModel->getFind($map, $field);
if (!$spike_data) {
$res = array(
'status' => 0,
'msg' => '该活动存在异常,请联系商家',
);
$this->ajaxReturn($res);
}
if ($spike_data['rise_num'] != 0 && floatval($buy_number) < floatval($spike_data['rise_num'])) {
$res = array(
'status' => 0,
'msg' => "该秒杀商品起购量为{$spike_data['rise_num']}件",
);
$this->ajaxReturn($res);
}
// 判断规格
$sku_id = $spike_data['sku_id'] && $spike_data['sku_id'] != 0 ? $spike_data['sku_id'] : 0;
if ($sku_id != 0) {
// 实例化模型
$RSGModel = D('RetailSkuGoods');
// 查询条件
$map2 = array(
$RSGModel::ID => $spike_data['sku_id'],
$RSGModel::STORE_ID => self::$store_id,
$RSGModel::GOODS_ID => $spike_data['gid'],
$RSGModel::STATUS => 1,
$RSGModel::STATE => 0,
);
// 查询条件
$goods_sku = $RSGModel->getFind($map2);
if (!$goods_sku) {
$res = array('status' => 0, 'msg' => '该活动商品规格存在异常,请联系商家');
return $res;
}
// 处理规格名称
$SLModel = D('RetailSkuList'); // 实例化模型
$sku_name = $SLModel->getFindField(array('id' => array('in', $goods_sku['sku_id_list'])), 'name', true);
$goods_sku['name'] = implode(',', $sku_name);
// 处理数据
$spike_data['purchase_price'] = $goods_sku['purchase_price'];
$spike_data['online_price'] = $goods_sku['online_price'];
$spike_data['weight_value'] = $goods_sku['weight_value'];
}
// 统计用户购买数量
$RSOViewModel = new RetailSpikeOrderViewModel(); // 实例化模型(订单视图模型)
$map3 = array(
'RetailBillOrder.pay_state' => 1,
'RetailBillOrder.refund_status' => 0,
'RetailBillOrder.type' => 1,
'RetailBillOrder.uid' => self::$uid,
'RetailBillOrder.store_id' => self::$store_id,
'RetailBillOrder.merchant_id' => self::$merchant_id,
'RetailBillSpike.spike_id' => $spike_id,
'RetailBillSpike.state' => 1,
);
$count = $RSOViewModel->getSum($map3, 'buy_number');
// 判断限购
if ($count && intval($spike_data['limit_num']) > 0) {
if (($count + $buy_number) > intval($spike_data['limit_num'])) {
$res = array(
'status' => 0,
'msg' => '已超过限购数量'
);
$this->ajaxReturn($res);
}
}
// 判断金额
if (!$spike_data['spike_price'] || floatval($spike_data['spike_price']) <= 0) {
$res = array(
'status' => 0,
'msg' => '该活动商品存在异常,请联系商家'
);
$this->ajaxReturn($res);
}
$ApiRedis = new \Addons\Api\RedisController();
$wait_str = 'retail_spike_' . $spike_id . '_' . $sku_id . '_' . self::$uid . '_*';
$user_wait_buy = $this->getWaitNum($wait_str);// 获取用户在当前商品是否有待支付
if ($user_wait_buy > 0) {
$res = array(
'status' => 0,
'msg' => '您有一笔该活动的待支付订单,请先进行处理'
);
$this->ajaxReturn($res);
}
if ($platform_type == 2) {
//第三方平台
if (!empty($sku_id)) {
$third_goods_code = $goods_sku['third_goods_code'];
} else {
$third_goods_code = $spike_data['third_goods_code'];
}
$ThirdGoodsClass = new Goods();
$thirdResult = $ThirdGoodsClass->goodsNumQuery([
'merchant_id' => self::$merchant_id,
'type' => 2,
'code_arr' => [$third_goods_code],
'Customer_Codes' => self::$store['third_code']
]);
if ($thirdResult['status'] == 1 && !empty($thirdResult['data'])) {
$goods_stock = $thirdResult['data'];
if ($goods_stock <= 0) {
$spike_data['stock'] = 0;
$ThirdGoodsClass->activityOff([
'id' => $spike_id,
'type' => 1
]);
} else if ($goods_stock < $spike_data['stock']) {
$spike_data['stock'] = $goods_stock;
}
} else {
$spike_data['stock'] = 0;
}
}
$other_wait_str = 'retail_spike_' . $spike_id . '_' . $sku_id . '_*';
$wait_num = $this->getWaitNum($other_wait_str);// 获取所有该活动待支付的数量
// 判断当前库存,与待支付的数量
if (round($spike_data['stock'] - $wait_num - $buy_number) < 0) {
$res = array(
'status' => 0,
'msg' => '活动库存不足'
);
$this->ajaxReturn($res);
}
$storeSet = $this->getStoreSet_v2();//获取门店配送设置
$delivery_set = $storeSet['delivery_set'];
$send_type = explode(',', $spike_data['send_type']);
if (!in_array('1', $send_type)) {
$delivery_set[0] = 0;
}
if (!in_array('2', $send_type)) {
$delivery_set[1] = 0;
}
if (!in_array('3', $send_type)) {
$delivery_set[2] = 0;
}
switch ($pickup_type) {
case '1':
//自提
if (!$delivery_set[0]) {
$res = array(
'status' => 0,
'msg' => '商家更新自提设置,请退出重试'
);
$this->ajaxReturn($res);
}
break;
case '2':
//同城配送
if (!$delivery_set[1]) {
$res = array(
'status' => 0,
'msg' => '商家更新配送设置,请退出重试'
);
$this->ajaxReturn($res);
}
$result = $this->getLngLatAndFee($address_id);
if ($result['status'] == 0) {
$this->ajaxReturn($result);
}
// 判断配送费
if (floatval($delivery_fee) != floatval($result['fee'])) {
$res = array(
'status' => 0,
'msg' => '商家更新配送费,请重新下单'
);
$this->ajaxReturn($res);
}
$address = $result['address'];
$user_name = $address['name'];
$user_phone = $address['phone'];
$user_address = $address['address'];
break;
case '3':
//快递发货
if ($delivery_set[2] != 1) {
$res['status'] = 0;
$res['msg'] = '商家快递发货设置有变动,请退出重试';
$this->ajaxReturn($res);
}
//计算配送费
$CostCalculation = new CostCalculationController();
$AddressModel = D('RetailAddress');
$addressInfo = $AddressModel->getUserAddress($address_id);
$user_name = $addressInfo['name'];
$user_phone = $addressInfo['phone'];
$user_address = $addressInfo['address'];
$province = $addressInfo['province'];
$city = $addressInfo['city'];
$area = $addressInfo['area'];
$goods = array(
array(
'num' => $buy_number,
'delivery_template_id' => $spike_data['delivery_template_id'],
'pricing_method' => $spike_data['pricing_method'],
'weight_value' => $spike_data['weight_value'],
)
);
$cost_fee = $CostCalculation->getFreight(json_encode($goods), self::$store_id, $province, $city, $area);
if ($cost_fee['status'] == 1) {
if ($cost_fee['delivery_fee'] != $delivery_fee) {
$res['status'] = 0;
$res['msg'] = '快递费有变动,请退出重试';
$this->ajaxReturn($res);
}
} else {
$this->ajaxReturn($cost_fee);
}
break;
}
//免配送费门槛金额
$delivery_cost = self::$store['delivery_cost'];
$delivery_status = self::$store['delivery_status'];
if ($delivery_status == 1 && intval(round($spike_data['spike_price'] * $buy_number, 2)) >= intval($delivery_cost)) {
$delivery_fee = 0;
}
// 计算金额
if ($pickup_type == 2 || $pickup_type == 3) {
// 配送、快递
$money = floatval(round($spike_data['spike_price'] * $buy_number, 2) + $delivery_fee);
} else { // 自提
$money = floatval(round($spike_data['spike_price'] * $buy_number, 2));
}
// 获取用户信息
$vip_info = $this->getVipInfo();
if (empty($vip_info) && $platform_type == 2) {
//Q3下单
$res = array(
'status' => 0,
'msg' => '请先绑定会员卡'
);
$this->ajaxReturn($res);
}
// bill下单(bill_order)
$RBOModel = D('RetailBillOrder'); // 实例化模型(bill_order)
$bill_item = array(
'all_money' => $money,
'pay_state' => 0,
'pay_type' => 0,
'refund_status' => 0,
'type' => 1,
'order_type' => 1,
'add_time' => $time,
'vid' => $vip_info ? $vip_info['vid'] : 0,
'store_id' => self::$store_id,
'merchant_id' => self::$merchant_id,
'uid' => self::$uid,
'pay_money' => $money,
'amount_received' => $money,//实收金额
);
$bill = $RBOModel->addBillOrder($bill_item);
if (!$bill) {
$res = array(
'status' => 0,
'msg' => '下单失败'
);
$this->ajaxReturn($res);
}
if ($platform_type == 2) {
//第三方平台
$third_order = [
'Customer_Code' => self::$store['third_code'],
'Member_Code' => $vip_info['card_num'],
'AreaName' => $user_address,
'Remark' => $remark,
'Swno' => $bill['order_no'],
'Details' => [
[
'third_goods_code' => $third_goods_code,
'num' => $buy_number,
'all_money' => $money,
'company'=>$spike_data['company']
]
]
];
$ThirdClass = new Order();
$thirdResult = $ThirdClass->orderInsert([
'merchant_id' => self::$merchant_id,
'third_order' => json_encode($third_order)
]);
if ($thirdResult['status'] == 0) {
$res['status'] = 0;
$res['msg'] = 'Q3 ERP平台订单下单失败' . $thirdResult['message'];
$this->ajaxReturn($res);
}
$RBOModel->updateOrder(['id' => $bill['id']], [
'third_order' => $thirdResult['data'],
'platform_type' => 2
]);
}
// (bill_online)
$RBOnModel = D('RetailBillOnline'); // 实例化模型(bill_online)
$online_item = array(
'bill_id' => $bill['id'],
'pickup_type' => $pickup_type,
'user_name' => $user_name,
'user_phone' => $user_phone,
'user_address' => $user_address ? $user_address : '',
'delivery_fee' => $delivery_fee,
'order_genre' => 3,
'remark' => $remark,
'user_select_time' => strtotime($start_date),//用户选择的时间
);
$online = $RBOnModel->addOrder($online_item);
if (!$online) {
$res = array(
'status' => 0,
'msg' => '下单失败'
);
$this->ajaxReturn($res);
}
// 判断是否为会员
if ($vip_info) {
// 获取会员类型
$vip_type = $vip_info['user_type']; //2plus会员
// 获取商户会员设置
$RVCModel = D('RetailVipConfig');
// 商户会员设置
$vip_config = $RVCModel->getFind(array($RVCModel::MERCHANT_ID => self::$merchant_id));
if ($vip_config) {
$give_state = true; //判断是否执行基于订单
if ($spike_data['integral_mem_status'] == 1 && $spike_data['integral'] > 0) {
$parameter = array(
'vip_type' => $vip_type,
'vip_config' => $vip_config,
'integral' => $spike_data['integral'],
'num' => $buy_number
);
$integral = $RVCModel->buy_goods_get_integral($parameter);
if ($integral > 0) {
$give_state = false;
}
}
if ($give_state) {
$parameter = array(
'vip_type' => $vip_type,
'vip_config' => $vip_config
);
$percent_state = $RVCModel->buy_integral_config($parameter);
if ($percent_state) {
if ($pickup_type == 2 || $pickup_type == 3) {
$parameter['all_money'] = $money - $delivery_fee;
} else {
$parameter['all_money'] = $money;
}
$integral = $RVCModel->buy_get_integral($parameter);
}
}
}
}
// bill_discount
$RBDModel = D('RetailBillDiscount'); // 实例化模型(bill_discount)
$discount_item = array(
'bill_id' => $bill['id'],
'get_integral' => $vip_info['vid'] && $integral ? $integral : 0,
);
$discount = $RBDModel->addOrder($discount_item);
if (!$discount) {
$res = array(
'status' => 0,
'msg' => '下单失败'
);
$this->ajaxReturn($res);
}
// bill_spike
$RBSModel = D('RetailBillSpike'); // 秒杀关联订单模型
$spike_item = array(
$RBSModel::BILL_ID => $bill['id'],
$RBSModel::SPIKE_ID => $spike_id,
$RBSModel::BUY_NUMBER => $buy_number,
$RBSModel::STATE => 0,
);
$spike = $RBSModel->addOrder($spike_item);
if (!$spike) {
$res = array(
'status' => 0,
'msg' => '下单失败'
);
$this->ajaxReturn($res);
}
// 生成销售记录(sell)
$SellModel = D('RetailSell'); // 销售记录模型
$sell_item = array(
'bill_id' => $bill['id'],
'goods_id' => $spike_data['gid'],
'pay_type' => 0,
'price' => $spike_data['spike_price'],
'num' => $buy_number,
'all_money' => $money,
'add_time' => $time,
'type' => 1,
'store_id' => self::$store_id,
'merchant_id' => self::$merchant_id,
'goods_class_id' => $spike_data['goods_class_id'],
'goods_name' => $spike_data['goods_name'],
'pricing_method' => $spike_data['pricing_method'],
'purchase_price' => $spike_data['purchase_price'],
'original_price' => $spike_data['online_price'],
'goods_img_id' => $spike_data['goods_img_id'],
'attribute_state' => $spike_data['attribute_state'],
'vid' => $bill['vid'],
'uid' => self::$uid,
'sell_number' => $goods_sku['sku_num'] ? $goods_sku['sku_num'] * $buy_number : $buy_number,
'pay_state' => 0,
'get_integral' => $discount_item['get_integral'],
'company' => $spike_data['company'],
'serial_number_state' => $spike_data['serial_number_state'] ? $spike_data['serial_number_state'] : 0,
);
if ($goods_sku) {
$sell_item['sku_id'] = $goods_sku['id'];
$sell_item['sku_json_info'] = json_encode($goods_sku);
}
$sell = $SellModel->addOrder($sell_item);
if (!$sell) {
$res = array(
'status' => 0,
'msg' => '下单失败'
);
$this->ajaxReturn($res);
}
// 下单成功,创建redis订单
$key = 'retail_spike_' . $spike_id . '_' . $sku_id . '_' . self::$uid . '_' . $bill['id'];
$val_arr = array(
'bill_id' => $bill['id'],
'num' => $buy_number,
'expiration_time' => time() + 602,
'key' => $key
);
// 添加redis记录
$set_result = $ApiRedis::$redis->setex($key, 602, json_encode($val_arr));
if (!$set_result) {
$res = array(
'status' => 0,
'msg' => '下单失败'
);
$this->ajaxReturn($res);
}
// 获取现有库存
// 二次获取待支付的数量
if ($platform_type != 2) {
$wait_num = $this->getWaitNum($other_wait_str);
$Spike = D('RetailSpike');
$act_num = $Spike->getFindField(array($Spike::ID => $spike_id), $Spike::STOCK);
// 二次判断库存
if (floatval($wait_num) > floatval($act_num)) {
// 超出库存,移除当前订单
$ApiRedis::$redis->delete($key);
$res = array(
'status' => 0,
'msg' => '活动库存不足,下单失败'
);
$this->ajaxReturn($res);
}
}
// 下单成功
if ($pickup_type == 1) {
$up = array(
'link_name' => $user_name,
'mobile_phone' => $user_phone,
);
D('RetailSmallProgramUser')->updateOrder(array('id' => self::$uid), $up);
}
$res['status'] = 1;
$res['msg'] = '下单成功';
$res['data'] = array(
'order_no' => $bill['order_no'],
'allMoney' => $money,
);
$this->ajaxReturn($res);
}
/**
* 获取秒杀用户订单
* @return array $res
*/
public function getUserSpikeOrder_v2()
{
// 查询订单
$page = I('post.page') ? I('post.page') : 1;
$RSOViewModel = D('RetailSpikeOrderView');
$map = array(
'RetailBillOrder.pay_state' => 1,
'RetailBillOrder.type' => 1,
'RetailBillOrder.uid' => self::$uid,
'RetailBillOrder.merchant_id' => self::$merchant_id,
'RetailBillOrder.store_id' => self::$store_id,
'RetailBillOrder.order_type' => 1,
'RetailBillOnline.order_genre' => 3
);
$field = array(
'id',
'all_money',
'order_no',
'add_time',
'delivery_fee',
'status',
'eval_status',
'remind_state',
'refund_status',
'pickup_type',
'pick_code',
'delivery_type',
'delivery_record_id',
'delivery_fee',
'remark',
'spike_id',
'state',
'buy_number',
'remark',
);
$limit = 10;
$user_spike = $RSOViewModel->getSelect($map, $field, $page, $limit);
if (!$user_spike) {
$res = array(
'status' => 1,
'msg' => '暂无秒杀订单',
'data' => array(),
'limit' => $limit,
);
$this->ajaxReturn($res);
}
// 处理数据
$SpikeModel = D('RetailSpike');
$SellModel = D('RetailSell');
$RDCModel = D('RetailDaClerk');
$RUOModel = D('RetailUuOrder');
foreach ($user_spike as &$val) {
switch ($val['state']) {
case '0':
$val['state_msg'] = '秒杀失败';
break;
case '1':
$val['state_msg'] = '秒杀成功';
break;
}
$map = array(
'id' => $val['spike_id'],
);
$val['act_name'] = $SpikeModel->getFindField($map, 'active_title');// 拼团活动名称
$map = array(
'bill_id' => $val['id'],
);
$sell = $SellModel->getFind($map, 'num,price,goods_name,goods_img_id,sku_json_info');// 商品销售数据
$val['price'] = $sell['price'];
$val['goods_img'] = $this->getGoodsImage($sell['goods_img_id']);//商品图片
if (!empty($sell['sku_json_info'])) {
//规格商品
$val['sku_name'] = json_decode($sell['sku_json_info'], true)['name'];
}
$val['goods_name'] = $sell['goods_name'];//商品名称
$val['num'] = $sell['num'];//购买数量
// 配送方式
if ($val['state'] == 1) {
switch ($val['status']) {
case '1':
//待发货、自提
if ($val['pickup_type'] == 1) {
$val['text'] = '待自提';
} else if ($val['pickup_type'] == 2 || $val['pickup_type'] == 3) {
$val['text'] = '待发货';
}
break;
case '2':
//待收货
if ($val['pickup_type'] == 2 || $val['pickup_type'] == 3) {
// 判断达达、uu配送
$val['text'] = '配送中';
if ($val['delivery_type'] == 2) {
// 达达配送
$order_status = $RDCModel->getFindField(array($RDCModel::ID => $val['delivery_record_id']), $RDCModel::ORDER_STATUS);
} else if ($val['delivery_type'] == 3) {
// uu配送
$state = $RUOModel->getFindField(array($RUOModel::ID => $val['delivery_record_id']), $RUOModel::STATE);
if ($state == 1) {
$order_status = 1;
} else if ($state == 3 || $state == 4) {
$order_status = 2;
} else if ($state == 5 || $state == 6) {
$order_status = 3;
}
$val['delivery_type'] = 2;
}
if ($order_status) {
$val['order_status'] = $order_status;//1骑手接单中 2骑手取货中 3骑手配送中
$statusArr = array(
'1' => '骑手接单中',
'2' => '骑手取货中',
'3' => '骑手配送中',
);
$val['text'] = $statusArr[$order_status];
}
} else {
$val['text'] = '待收货';
}
break;
case '3':
//收货
if ($val['eval_status']) {
$val['text'] = '已评价';
} else if ($val['pickup_type'] == 1) {
$val['text'] = '已自提';
} else if ($val['pickup_type'] == 1) {
$val['text'] = '已收货';
}
break;
}
}
}
$res = array(
'status' => 1,
'data' => $user_spike,
'limit' => $limit,
'msg' => '查询成功',
);
$this->ajaxReturn($res);
}
}