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); } }