2950 行
125 KiB
PHP
可执行文件
2950 行
125 KiB
PHP
可执行文件
<?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="/", "img src="" . $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);
|
||
}
|
||
} |