0, 'msg' => '缺少必要的store_id参数'); $this->ajaxReturn($res); } } /** * 获取拼团活动 * @return array $res */ public function getAllGroupList() { // 实例化模型 $StoreXcxConfig = D('RetailStoreXcxConfig'); $GroupViewModel = D('RetailGroupView'); // 查询活动 $map = array( 'RetailGroup.storeid' => self::$store_id, 'RetailGroup.merchantid' => self::$merchant_id, 'RetailGroup.acttype' => 1, 'RetailGroup.endtime' => array('gt', time()), 'RetailGoods.status' => 0, 'RetailGoods.online_state' => 1 ); $field = array('id', 'act_name', 'act_price', 'sell_number', 'online_price', 'goods_img_id', 'is_recommend', 'number'); // 查询拼团活动 $all_group_list = $GroupViewModel->getSelect($map, $field); if (!$all_group_list) { $res = array('status' => 0, 'msg' => '暂无拼团活动'); $this->ajaxReturn($res); } // 处理数据 foreach ($all_group_list as &$val) { $val['act_price'] = $val['act_price'] ? floatval($val['act_price']) : 0; $val['act_price'] = number_format($val['act_price'], 2); $val['online_price'] = $val['online_price'] ? floatval($val['online_price']) : 0; $val['online_price'] = number_format($val['online_price'], 2); // 商品图片 $val['image'] = $this->getGoodsImage($val['goods_img_id']); } // 首页图片 $i_map = array($StoreXcxConfig::STORE_ID => self::$store_id); $i_field = array($StoreXcxConfig::XCX_GROUP_COVER, $StoreXcxConfig::XCX_GROUP_COVER_ID); $image = $StoreXcxConfig->getFind($i_map, $i_field); $IGModel = D('ImageGallery'); $show_image = $IGModel->getImagePath($image[$StoreXcxConfig::XCX_GROUP_COVER_ID]); $res = array('status' => 1, 'all_group_list' => $all_group_list, 'show_image' => $show_image); $this->ajaxReturn($res); } /** * 获取拼团活动详情 * @param int $group_id 拼团活动id * @return array $res */ public function getGroupDetails2() { // 实例化模型 $GroupViewModel = D('RetailGroupView'); $res = array(); // 接收数据 $group_id = I('post.group_id'); if (!$group_id) { $res = array('status' => 0, 'msg' => '缺少必要的group_id参数'); $this->ajaxReturn($res); } // 拼团查询条件 $map = array( 'RetailGroup.id' => $group_id, 'RetailGroup.storeid' => self::$store_id, 'RetailGroup.merchantid' => self::$merchant_id, 'RetailGroup.acttype' => 1, 'RetailGroup.endtime' => array('gt', time()), 'RetailGoods.status' => 0, 'RetailGoods.online_state' => 1 ); $field = array( 'id', 'gid', 'group_sku_id', 'act_name', 'act_num', 'number', 'item', 'act_price', 'act_type', 'sell_number', 'start_time', 'end_time', 'goods_name', 'online_price', 'details', 'company', 'attribute_state', 'goods_img_id', 'send_type', 'delivery_template_id' ); // 查询拼团活动 $group_data = $GroupViewModel->getFind($map, $field); if (!$group_data) { $res = array('status' => 0, 'msg' => '该活动存在异常,请联系商家'); $this->ajaxReturn($res); } // 获取redis数据库记录 $str = 'retail_group_' . $group_data['id'] . '_*'; $wait_num = $this->getWaitNum($str); // 判断金额 if (floatval($group_data['act_price']) <= 0 || floatval($group_data['online_price']) <= 0) { $res = array('status' => 0, 'msg' => '该活动商品存在异常,请联系商家'); $this->ajaxReturn($res); } else { $group_data['act_price'] = floatval($group_data['act_price']); $group_data['online_price'] = floatval($group_data['online_price']); } // 处理数据 $group_data['startTime'] = date('Y-m-d H:i:s', $group_data['start_time']); $group_data['endTime'] = date('Y-m-d H:i:s', $group_data['end_time']); $group_data['act_num'] = round($group_data['act_num'] - $wait_num) > 0 ? round($group_data['act_num'] - $wait_num) : 0; $group_data['goods_num'] = A('Api/Inventory')->goods_num(2, self::$store_id, $group_data['gid']); $group_data['province'] = floatval(round($group_data['online_price'] - $group_data['act_price'], 2)); // 商品图片 $group_data['goods_image'] = $this->getGoodsImage($group_data['goods_img_id']); // 判断规格 if ($group_data['attribute_state'] && $group_data['attribute_state'] == 2) { // 判断活动规格 if (!$group_data['group_sku_id']) { $res = array('status' => 0, 'msg' => '该活动商品规格存在异常,请联系商家'); $this->ajaxReturn($res); } // 拼团活动规格 $sku_result = $this->getSkuGroup($group_data['gid'], $group_data['group_sku_id'], $group_data['id']); if ($sku_result['status'] == 0) { $this->ajaxReturn($sku_result); } else { $res['skuDetailList'] = $sku_result['group_sku']; } // 普通规格 $goods_sku = $this->getGoodsSku($group_data['gid']); $res['mySkuDetailList'] = $goods_sku['skuDetailList']; $res['skuList'] = $goods_sku['skuList']; } // 判断商品详情 if ($group_data['details']) { $group_data['details'] = str_replace("img src="/", "img src="" . $this->REQUEST_URL . '/', $group_data['details']); $group_data['details'] = str_replace('img src="/', 'img src="' . $this->REQUEST_URL . '/', $group_data['details']); $group_data['details'] = str_replace("style=''", "", $group_data['details']); $group_data['details'] = str_replace('style=""', "", $group_data['details']); $group_data['details'] = str_replace('src="/Uploads/', 'src="' . $this->REQUEST_URL . '/Uploads/', $group_data['details']); } // 商品轮播图 $retailGoodsBannerModel = D('RetailGoodsBanner'); $banner = array(); $b_map = array($retailGoodsBannerModel::GOODS_ID => $group_data['gid']); $b_field = array($retailGoodsBannerModel::IMAGE, $retailGoodsBannerModel::IMAGE_ID); $goods_banner = $retailGoodsBannerModel->getSelect($b_map, $b_field); if ($goods_banner) { // 处理图片 foreach ($goods_banner as &$val) { $image = $this->getGoodsImage($val[$retailGoodsBannerModel::IMAGE_ID], $val[$retailGoodsBannerModel::IMAGE]); array_push($banner, $image); } } else { // 无商品轮播图 $banner = array(); array_push($banner, $group_data['goods_image']); } // 返回值 $res['delivery_set'] = $this->handleDelivery($group_data['send_type']); if ($res['delivery_set'][2]['data'] == 1) { $res['delivery_rule'] = $this->handleDeliveryRule($group_data['delivery_template_id']); } else { $res['delivery_rule'] = false; } $res['status'] = 1; $res['details_data'] = $group_data; $res['banner'] = $banner; $this->ajaxReturn($res); } /** * 获取拼团活动详情 * @param int $group_id 拼团活动id * @return array $res */ public function getGroupDetails() { // 实例化模型 $GroupViewModel = D('RetailGroupView'); $res = array(); // 接收数据 $group_id = I('post.group_id'); if (!$group_id) { $res = array('status' => 0, 'msg' => '缺少必要的group_id参数'); $this->ajaxReturn($res); } // 拼团查询条件 $map = array( 'RetailGroup.id' => $group_id, 'RetailGroup.storeid' => self::$store_id, 'RetailGroup.merchantid' => self::$merchant_id, 'RetailGroup.acttype' => 1, 'RetailGroup.endtime' => array('gt', time()), 'RetailGoods.status' => 0, 'RetailGoods.online_state' => 1 ); $field = array( 'id', 'gid', 'group_sku_id', 'act_name', 'act_num', 'number', 'item', 'act_price', 'act_type', 'sell_number', 'start_time', 'end_time', 'goods_name', 'online_price', 'details', 'company', 'attribute_state', 'goods_img_id', 'send_type', 'delivery_template_id' ); // 查询拼团活动 $group_data = $GroupViewModel->getFind($map, $field); if (!$group_data) { $res = array('status' => 0, 'msg' => '该活动存在异常,请联系商家'); $this->ajaxReturn($res); } // 获取redis数据库记录 $str = 'retail_group_' . $group_data['id'] . '_*'; $wait_num = $this->getWaitNum($str); // 判断金额 if (floatval($group_data['act_price']) <= 0 || floatval($group_data['online_price']) <= 0) { $res = array('status' => 0, 'msg' => '该活动商品存在异常,请联系商家'); $this->ajaxReturn($res); } else { $group_data['act_price'] = floatval($group_data['act_price']); $group_data['online_price'] = floatval($group_data['online_price']); } // 处理数据 $group_data['startTime'] = date('Y-m-d H:i:s', $group_data['start_time']); $group_data['endTime'] = date('Y-m-d H:i:s', $group_data['end_time']); $group_data['act_num'] = round($group_data['act_num'] - $wait_num) > 0 ? round($group_data['act_num'] - $wait_num) : 0; $group_data['goods_num'] = A('Api/Inventory')->goods_num(2, self::$store_id, $group_data['gid']); $group_data['province'] = floatval(round($group_data['online_price'] - $group_data['act_price'], 2)); // 商品图片 $group_data['goods_image'] = $this->getGoodsImage($group_data['goods_img_id']); // 判断规格 if ($group_data['attribute_state'] && $group_data['attribute_state'] == 2) { // 判断活动规格 if (!$group_data['group_sku_id']) { $res = array('status' => 0, 'msg' => '该活动商品规格存在异常,请联系商家'); $this->ajaxReturn($res); } // 拼团活动规格 $sku_result = $this->getSkuGroup($group_data['gid'], $group_data['group_sku_id'], $group_data['id']); if ($sku_result['status'] == 0) { $this->ajaxReturn($sku_result); } else { $res['skuDetailList'] = $sku_result['group_sku']; } // 普通规格 $goods_sku = $this->getGoodsSku($group_data['gid']); $res['mySkuDetailList'] = $goods_sku['skuDetailList']; $res['skuList'] = $goods_sku['skuList']; } // 判断商品详情 if ($group_data['details']) { $group_data['details'] = str_replace("img src="/", "img src="" . $this->REQUEST_URL . '/', $group_data['details']); $group_data['details'] = str_replace('img src="/', 'img src="' . $this->REQUEST_URL . '/', $group_data['details']); $group_data['details'] = str_replace("style=''", "", $group_data['details']); $group_data['details'] = str_replace('style=""', "", $group_data['details']); $group_data['details'] = str_replace('src="/Uploads/', 'src="' . $this->REQUEST_URL . '/Uploads/', $group_data['details']); } // 商品轮播图 $retailGoodsBannerModel = D('RetailGoodsBanner'); $banner = array(); $b_map = array($retailGoodsBannerModel::GOODS_ID => $group_data['gid']); $b_field = array($retailGoodsBannerModel::IMAGE, $retailGoodsBannerModel::IMAGE_ID); $goods_banner = $retailGoodsBannerModel->getSelect($b_map, $b_field); if ($goods_banner) { // 处理图片 foreach ($goods_banner as &$val) { $image = $this->getGoodsImage($val[$retailGoodsBannerModel::IMAGE_ID], $val[$retailGoodsBannerModel::IMAGE]); array_push($banner, $image); } } else { // 无商品轮播图 $banner = array(); array_push($banner, $group_data['goods_image']); } // 返回值 $res['delivery_set'] = $this->handleDelivery($group_data['send_type']); if ($res['delivery_set'][2]['data'] == 1) { $res['delivery_rule'] = $this->handleDeliveryRule($group_data['delivery_template_id']); } else { $res['delivery_rule'] = false; } $res['status'] = 1; $res['details_data'] = $group_data; $res['banner'] = $banner; $this->ajaxReturn($res); } /** * 获取拼团活动详情 * @param int $group_id 拼团活动id 2020-4-20 * @return array $res */ public function getGroupDetails_v1() { // 实例化模型 $platform_type = self::$merchant['platform_type'];//商户平台类型 1默认系统 2微礼平台 $GroupViewModel = new RetailGroupViewModel(); $ImageGallery = new \Common\Model\ImageGalleryModel(); $res = array(); // 接收数据 $group_id = I('post.group_id'); if (!$group_id) { $res = array('status' => 0, 'msg' => '缺少必要的group_id参数'); $this->ajaxReturn($res); } // 拼团查询条件 $map = array( 'RetailGroup.id' => $group_id, 'RetailGroup.storeid' => self::$store_id, 'RetailGroup.merchantid' => self::$merchant_id, 'RetailGroup.acttype' => 1, 'RetailGroup.endtime' => array('gt', time()), 'RetailGoods.status' => 0, 'RetailGoods.online_state' => 1 ); $field = array( 'id', 'gid', 'group_sku_id', 'act_name', 'act_num', 'number', 'item', 'rise_num', 'act_price', 'act_type', 'sell_number', 'start_time', 'end_time', 'goods_name', 'online_price', 'details', 'company', 'attribute_state', 'goods_img_id', 'send_type', 'delivery_template_id', 'video_id' ); if ($platform_type == 2) { //第三方平台 $field[] = 'third_goods_code'; } // 查询拼团活动 $group_data = $GroupViewModel->getFind($map, $field); if (!$group_data) { $res = array('status' => 0, 'msg' => '该活动存在异常,请联系商家'); $this->ajaxReturn($res); } // 判断金额 if (floatval($group_data['act_price']) <= 0 || floatval($group_data['online_price']) <= 0) { $res = array('status' => 0, 'msg' => '该活动商品存在异常,请联系商家'); $this->ajaxReturn($res); } else { $group_data['act_price'] = floatval($group_data['act_price']); $group_data['online_price'] = floatval($group_data['online_price']); } // 获取redis数据库记录 if ($platform_type == 2) { //第三放平台 $wait_num = 0; } else { $str = 'retail_group_' . $group_data['id'] . '_*'; $wait_num = $this->getWaitNum($str); } // 处理数据 $group_data['video_url'] = $ImageGallery->getFieldPath(['id' => $group_data['video_id']]); $group_data['startTime'] = date('Y-m-d H:i:s', $group_data['start_time']); $group_data['endTime'] = date('Y-m-d H:i:s', $group_data['end_time']); $group_data['act_num'] = round($group_data['act_num'] - $wait_num) > 0 ? round($group_data['act_num'] - $wait_num) : 0; $group_data['province'] = floatval(round($group_data['online_price'] - $group_data['act_price'], 2)); $group_data['rise_num'] = $group_data['rise_num'] ? floatval($group_data['rise_num']) : 0; // 商品图片 $group_data['goods_image'] = $this->getGoodsImage($group_data['goods_img_id']); // 判断规格 if ($group_data['attribute_state'] && $group_data['attribute_state'] == 2) { // 判断活动规格 if (!$group_data['group_sku_id']) { $res = array('status' => 0, 'msg' => '该活动商品规格存在异常,请联系商家'); $this->ajaxReturn($res); } // 拼团活动规格 $sku_result = $this->getSkuGroup($group_data['gid'], $group_data['group_sku_id'], $group_data['id'], $platform_type); if ($sku_result['status'] == 0) { $this->ajaxReturn($sku_result); } else { $res['skuDetailList'] = $sku_result['group_sku']; } // 普通规格 $goods_sku = $this->getGoodsSku($group_data['gid'], null, $platform_type); $group_data['goods_num'] = $goods_sku['goods_num']; $res['mySkuDetailList'] = $goods_sku['skuDetailList']; $res['skuList'] = $goods_sku['skuList']; } else { if ($platform_type == 2) { //第三方平台 $ThirdGoodsClass = new Goods(); $thirdResult = $ThirdGoodsClass->goodsNumQuery([ 'merchant_id' => self::$merchant_id, 'type' => 2, 'code_arr' => [$group_data['third_goods_code']], 'Customer_Codes' => self::$store['third_code'] ]); if ($thirdResult['status'] == 1 && !empty($thirdResult['data'])) { $goods_stock = $thirdResult['data']; if ($goods_stock <= 0) { $group_data['act_num'] = 0; //取消活动 $ThirdGoodsClass->activityOff([ 'id' => $group_id, 'type' => 2 ]); } else if ($goods_stock < $group_data['act_num']) { $group_data['act_num'] = $goods_stock; } $group_data['goods_num'] = $goods_stock; } else { $group_data['act_num'] = 0; } } else { $group_data['goods_num'] = A('Api/Inventory')->goods_num(1, self::$store_id, $group_data['gid']); } } // 判断商品详情 if ($group_data['details']) { $group_data['details'] = str_replace("img src="/", "img src="" . $this->REQUEST_URL . '/', $group_data['details']); $group_data['details'] = str_replace('img src="/', 'img src="' . $this->REQUEST_URL . '/', $group_data['details']); $group_data['details'] = str_replace("style=''", "", $group_data['details']); $group_data['details'] = str_replace('style=""', "", $group_data['details']); $group_data['details'] = str_replace('src="/Uploads/', 'src="' . $this->REQUEST_URL . '/Uploads/', $group_data['details']); } // 商品轮播图 $retailGoodsBannerModel = D('RetailGoodsBanner'); $banner = array(); $b_map = array($retailGoodsBannerModel::GOODS_ID => $group_data['gid']); $b_field = array($retailGoodsBannerModel::IMAGE, $retailGoodsBannerModel::IMAGE_ID); $goods_banner = $retailGoodsBannerModel->getSelect($b_map, $b_field); if ($goods_banner) { // 处理图片 foreach ($goods_banner as &$val) { $image = $this->getGoodsImage($val[$retailGoodsBannerModel::IMAGE_ID], $val[$retailGoodsBannerModel::IMAGE]); array_push($banner, $image); } } else { // 无商品轮播图 $banner = array(); array_push($banner, $group_data['goods_image']); } // 返回值 $res['delivery_set'] = $this->handleDelivery($group_data['send_type']); if ($res['delivery_set'][2]['data'] == 1) { $res['delivery_rule'] = $this->handleDeliveryRule($group_data['delivery_template_id']); } else { $res['delivery_rule'] = false; } //免配送费门槛金额 $delivery_cost = self::$store['delivery_cost']; $delivery_status = self::$store['delivery_status']; $res['status'] = 1; $res['banner'] = $banner; $res['details_data'] = $group_data; $res['delivery_cost'] = $delivery_cost; $res['delivery_status'] = $delivery_status; $this->ajaxReturn($res); } /** * 获取拼团活动规格 * @param int $goods_id 商品id * @param string $sku_ids 规格id ,拼接 * @param int $group_id 拼团活动id * @param int $platform_type 商户平台类型 1默认系统 2微礼平台 * @return array $res */ protected function getSkuGroup($goods_id, $sku_ids, $group_id, $platform_type = 1) { // 实例化模型 $GSVModel = D('RetailGroupSkuView'); $RSLModel = D('RetailSkuList'); // 查询条件 $map = array( 'RetailSkuGoods.goods_id' => $goods_id, 'RetailSkuGoods.store_id' => self::$store_id, 'RetailSkuGoods.status' => 1, 'RetailSkuGoods.state' => 0, 'RetailSkuGroup.id' => array('in', $sku_ids) ); $field = array('id', 'sku_id', 'sku_id_list', 'online_price', 'goods_num', 'goods_img', 'goods_img_id', 'id', 'act_num', 'act_price'); if ($platform_type == 2) { $field[] = 'third_goods_code'; $code_arr = []; } // 查询规格 $group_sku = $GSVModel->getSelect($map, $field); if (!$group_sku) { $res = array('status' => 0, 'msg' => '该活动商品规格存在异常,请联系商家'); return $res; } // 处理数据 foreach ($group_sku as &$val) { // 获取redis数据库记录 if ($platform_type == 2) { $code_arr[$val['id']] = $val['third_goods_code']; $wait_num = 0; } else { $str = 'retail_group_' . $group_id . '_' . $val['id'] . '_*'; $wait_num = $this->getWaitNum($str); } $val['online_price'] = floatval($val['online_price']); $val['online_price'] = floatval($val['online_price']); $val['act_num'] = round($val['act_num'] - $wait_num) > 0 ? round($val['act_num'] - $wait_num) : 0; $val['act_price'] = floatval($val['act_price']); // 获取图片 $val['image'] = $this->getGoodsImage($val['goods_img_id'], $val['goods_img']); // 处理规格名称 $sku_name = $RSLModel->getFindField(array($RSLModel::ID => array('in', $val['sku_id_list'])), $RSLModel::NAME, true); $val['sku_name'] = implode(',', $sku_name); unset($str); unset($wait_num); } if ($platform_type == 2) { //第三方平台 $ThirdGoodsClass = new Goods(); $thirdResult = $ThirdGoodsClass->goodsNumQuery([ 'merchant_id' => self::$merchant_id, 'type' => 2, 'code_arr' => $code_arr, 'Customer_Codes' => self::$store['third_code'] ]); if ($thirdResult['status'] == 1 && !empty($thirdResult['data'])) { $goods_stock = $thirdResult['data']; $act_num = 0; foreach ($group_sku as &$val) { if (!empty($goods_stock[$val['id']])) { if ($goods_stock[$val['id']] <= 0) { $val['act_num'] = 0; } else if ($goods_stock[$val['id']] < $val['act_num']) { $val['act_num'] = $goods_stock[$val['id']]; } } else { $val['act_num'] = 0; } $act_num += $val['act_num']; } if ($act_num <= 0) { //取消活动 $ThirdGoodsClass->activityOff([ 'id' => $group_id, 'type' => 2 ]); } } else { foreach ($group_sku as &$val) { $val['act_num'] = 0; } //取消活动 $ThirdGoodsClass->activityOff([ 'id' => $group_id, 'type' => 2 ]); } } $res = array('status' => 1, 'group_sku' => $group_sku); return $res; } /** * 获取购买数据 * @param int $group_id 活动id * @param int $sku_id 规格id * @param int $buy_number 购买数量 * @return array $res */ public function getBuyData() { if (empty(self::$uid)) { $res['status'] = -1; $res['msg'] = '用户未登录'; $this->ajaxReturn($res); } // 实例化模型 $RGVModel = D('RetailGroupView'); $GSVModel = D('RetailGroupSkuView'); $RSLModel = D('RetailSkuList'); // 接收数据 $group_id = I('post.group_id'); $sku_id = I('post.sku_id'); $buy_number = I('post.buy_number'); // 判断接受参数 if (!$group_id || !$buy_number) { $res = array('status' => 0, 'msg' => '参数缺失'); $this->ajaxReturn($res); } // 拼团查询条件 $map = array( 'RetailGroup.id' => $group_id, 'RetailGroup.storeid' => self::$store_id, 'RetailGroup.merchantid' => self::$merchant_id, 'RetailGroup.acttype' => 1, 'RetailGroup.starttime' => array('elt', time()), 'RetailGroup.endtime' => array('gt', time()), 'RetailGoods.status' => 0, 'RetailGoods.online_state' => 1 ); // 拼团查询字段 if ($sku_id && $sku_id != 0) { $field = array('id', 'gid', 'act_name', 'send_type', 'company'); } else { $field = array('id', 'gid', 'act_name', 'act_price', 'send_type', 'company', 'goods_img_id'); } // 查询拼团活动 $buy_data = $RGVModel->getFind($map, $field); if (!$buy_data) { $res = array('status' => 0, 'msg' => '该活动存在异常,请联系商家'); $this->ajaxReturn($res); } // 查询规格 if ($sku_id && $sku_id != 0) { // 规格查询条件 $map2 = array( 'RetailSkuGoods.goods_id' => $buy_data['gid'], 'RetailSkuGoods.store_id' => self::$store_id, 'RetailSkuGoods.status' => 1, 'RetailSkuGoods.state' => 0, 'RetailSkuGroup.id' => $sku_id, ); $field2 = array('sku_id_list', 'goods_img', 'goods_img_id', 'act_price'); $group_sku = $GSVModel->getFind($map2, $field2); if (!$group_sku) { $res = array('status' => 0, 'msg' => '该活动规格存在异常,请联系商家'); $this->ajaxReturn($res); } // 合并数据 $buy_data['image'] = $this->getGoodsImage($group_sku['goods_img_id'], $group_sku['goods_img']); $buy_data['act_price'] = $group_sku['act_price']; // 规格名称 $sku_name = $RSLModel->getFindField(array($RSLModel::ID => array('in', $group_sku['sku_id_list'])), $RSLModel::NAME, true); $buy_data['sku_name'] = implode(',', $sku_name); } else { $buy_data['image'] = $this->getGoodsImage($buy_data['goods_img_id']); $buy_data['sku_name'] = '标配'; } // 判断金额 if (!$buy_data['act_price'] || floatval($buy_data['act_price']) <= 0) { $res = array('status' => 0, 'msg' => '该商品价格存在异常,请联系商家'); $this->ajaxReturn($res); } else { $buy_data['act_price'] = floatval($buy_data['act_price']); } // 处理数据 $buy_data['all_money'] = floatval(round($buy_data['act_price'] * $buy_number, 2)); // 返回值 $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 $group_id 活动id * @param int $sku_id 规格id * @param int $buy_number 购买数量 * @param int $pay_type 支付类型 * @param int $parent_id 团长id * @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(); // 接受数据 $group_id = I('post.group_id'); $sku_id = I('post.sku_id'); $buy_number = I('post.buy_number'); $pay_type = I('post.pay_type'); $parent_id = I('post.parent_id'); $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 (!$group_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); } $RGVModel = D('RetailGroupView'); // 拼团商品视图模型 // 活动查询条件 $map = array( 'RetailGroup.id' => $group_id, 'RetailGroup.storeid' => self::$store_id, 'RetailGroup.merchantid' => self::$merchant_id, 'RetailGroup.acttype' => 1, 'RetailGroup.starttime' => array('elt', $time), 'RetailGroup.endtime' => array('gt', $time), 'RetailGoods.status' => 0, 'RetailGoods.online_state' => 1 ); // 字段查询 if ($sku_id && $sku_id != 0) { $field = array('id', 'gid', 'number', 'day', 'hour', 'min', 'join_time', 'goods_name', 'goods_class_id', 'attribute_state', 'shop_mem_status', 'plus_mem_status', 'goods_img_id', 'integral_mem_status', 'integral', 'pricing_method',); } else { $field = array('id', 'gid', 'number', 'act_price', 'act_num', 'day', 'hour', 'min', 'join_time', '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', 'pricing_method',); } // 查询拼团活动 $group_data = $RGVModel->getFind($map, $field); if (!$group_data) { $res = array('status' => 0, 'msg' => '该活动存在异常,请联系商家'); $this->ajaxReturn($res); } // 判断参与次数 if ($group_data['join_time'] && $group_data['join_time'] != 0) { // 查询用户订单 $RGOViewModel = D('RetailGroupOrderView'); $map2 = 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, 'RetailBillGroup.group_id' => $group_id, 'RetailBillGroup.state' => array('in', array(1, 2)), ); $count = $RGOViewModel->getCount($map2); // 判断限购 if ($count && $count >= intval($group_data['join_time'])) { $res = array('status' => 0, 'msg' => '你已经达到限购数量,请选择其他商品'); $this->ajaxReturn($res); } } // 判断规格 if ($sku_id && $sku_id != 0) { $GSVModel = D('RetailGroupSkuView'); // 拼团规格视图模型 // 规格查询条件 $map3 = array( 'RetailSkuGoods.goods_id' => $group_data['gid'], 'RetailSkuGoods.store_id' => self::$store_id, 'RetailSkuGoods.status' => 1, 'RetailSkuGoods.state' => 0, 'RetailSkuGroup.id' => $sku_id, ); $field2 = array('sku_id', 'act_price', 'act_num', 'purchase_price', 'online_price', 'shop_mem_price', 'plus_price'); $group_sku = $GSVModel->getFind($map3, $field2); if (!$group_sku) { $res = array('status' => 0, 'msg' => '该活动规格存在异常,请联系商家'); $this->ajaxReturn($res); } $group_data['act_price'] = $group_sku['act_price']; $group_data['purchase_price'] = $group_sku['purchase_price']; $group_data['online_price'] = $group_sku['online_price']; $group_data['shop_mem_price'] = $group_sku['shop_mem_price']; $group_data['plus_price'] = $group_sku['plus_price']; $group_data['act_num'] = $group_sku['act_num']; // 获取商品原规格 $RSGModel = D('RetailSkuGoods'); $goods_sku = $RSGModel->getFind(array($RSGModel::ID => $group_sku['sku_id'])); } // 判断金额 if (!$group_data['act_price'] || floatval($group_data['act_price']) <= 0) { $res = array('status' => 0, 'msg' => '该活动商品存在异常,请联系商家'); $this->ajaxReturn($res); } // 计算金额 if ($pickup_type == 2) { // 配送 $money = floatval(round($group_data['act_price'] * $buy_number, 2) + $delivery_fee); } else { // 自提 $money = floatval(round($group_data['act_price'] * $buy_number, 2)); } // 判断库存 if ($buy_number > floatval($group_data['act_num'])) { $res = array('status' => 0, 'msg' => '商品库存不足'); $this->ajaxReturn($res); } // 获取用户信息 $vip_info = $this->getVipInfo(); switch ($pay_type) { case 1: // 会员卡支付 // 判断会员卡 if (!$vip_info['vid']) { $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); } $RBOModel = D('RetailBillOrder'); // 实例化模型(bill_order) // 判断开团,参团 if ($parent_id && intval($parent_id) != 0) { // 参团 $parent_result = $this->publicJudgeGroup($parent_id); if ($parent_result['status'] == 0) { $this->ajaxReturn($parent_result); } $end_time = $parent_result['end_time']; } else { // 开团 // 计算时间 $day = $group_data['day'] ? intval($group_data['day']) * 86400 : 0; $hour = $group_data['hour'] ? intval($group_data['hour']) * 3600 : 0; $min = $group_data['min'] ? intval($group_data['min']) * 60 : 0; $end_time = $time + $day + $hour + $min; } // 下单信息(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['vid'] ? $vip_info['vid'] : 0; $cr[$RPOModel::UID] = self::$uid; // bill下单(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, ); $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 => 2, $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 ($group_data['integral_mem_status'] == 1 && $group_data['integral'] > 0) { // 商品单送 $integral = intval($group_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_group) $RBGModel = D('RetailBillGroup'); // 拼团关联订单模型 $cr5 = array( $RBGModel::BILL_ID => $add_result2[$RBOModel::ID], $RBGModel::GROUP_ID => $group_id, $RBGModel::SKU_ID => $sku_id ? $sku_id : 0, $RBGModel::STATE => 1, $RBGModel::PARENT_ID => $parent_id && intval($parent_id) != 0 ? $parent_id : $add_result2[$RBOModel::ID], $RBGModel::BUY_NUMBER => $buy_number, $RBGModel::END_TIME => $end_time, ); $add_result5 = $RBGModel->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 => $group_data['gid'], $RSModel::PAY_TYPE => $cr2[$RBOModel::PAY_TYPE], $RSModel::PRICE => $group_data['act_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 => $group_data['goods_class_id'], $RSModel::GOODS_NAME => $group_data['goods_name'], $RSModel::PRICING_METHOD => $group_data['pricing_method'], $RSModel::PURCHASE_PRICE => $group_data['purchase_price'], $RSModel::ORIGINAL_PRICE => $group_data['online_price'], $RSModel::GOODS_IMG_ID => $group_data['goods_img_id'], $RSModel::ATTRIBUTE_STATE => $group_data['attribute_state'], $RSModel::SELL_TYPE => 1, $RSModel::GOODS_TYPE => 1, $RSModel::VID => $cr[$RPOModel::VID], $RSModel::VIP_PRICE => $group_data['shop_mem_status'] == 1 && $group_data['shop_mem_price'] ? $group_data['shop_mem_price'] : 0, $RSModel::PLUS_VIP_PRICE => $group_data['plus_mem_status'] == 1 && $group_data['plus_price'] ? $group_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/group_notify_url'; $notify_func = "PayApi/ActivityOrder/groupOrderContinentPay"; $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 $group_id 活动id * @param int $sku_id 规格id * @param int $buy_number 购买数量 * @param int $pay_type 支付类型 * @param int $parent_id 团长id * @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() { $RPOModel = D('RetailPayOrder'); // 订单表视图模型(pay_order) $time = time(); $cr = array(); // 接受数据 $group_id = I('post.group_id'); $sku_id = I('post.sku_id'); $buy_number = I('post.buy_number'); $pay_type = I('post.pay_type'); $parent_id = I('post.parent_id'); $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 if (empty(self::$uid)) { $res['status'] = -1; $res['msg'] = '用户未登录'; $this->ajaxReturn($res); } // 判断参数 if (!$group_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); } $RGVModel = D('RetailGroupView'); // 拼团商品视图模型 // 活动查询条件 $map = array( 'RetailGroup.id' => $group_id, 'RetailGroup.storeid' => self::$store_id, 'RetailGroup.merchantid' => self::$merchant_id, 'RetailGroup.acttype' => 1, 'RetailGroup.starttime' => array('elt', $time), 'RetailGroup.endtime' => array('gt', $time), 'RetailGoods.status' => 0, 'RetailGoods.online_state' => 1 ); // 字段查询 if ($sku_id && $sku_id != 0) { $field = array( 'id', 'gid', 'number', 'day', 'hour', 'min', 'join_time', 'goods_name', 'goods_class_id', 'attribute_state', 'shop_mem_status', 'plus_mem_status', 'goods_img_id', 'integral_mem_status', 'integral', 'pricing_method', ); } else { $field = array( 'id', 'gid', 'number', 'act_price', 'act_num', 'day', 'hour', 'min', 'join_time', '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', 'pricing_method', ); } // 查询拼团活动 $group_data = $RGVModel->getFind($map, $field); if (!$group_data) { $res = array('status' => 0, 'msg' => '该活动存在异常,请联系商家'); $this->ajaxReturn($res); } // 判断参与次数 if ($group_data['join_time'] && $group_data['join_time'] != 0) { // 查询用户订单 $RGOViewModel = D('RetailGroupOrderView'); $map2 = 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, 'RetailBillGroup.group_id' => $group_id, 'RetailBillGroup.state' => array('in', array(1, 2)), ); $count = $RGOViewModel->getCount($map2); // 判断限购 if ($count && $count >= intval($group_data['join_time'])) { $res = array('status' => 0, 'msg' => '你已经达到限购数量,请选择其他商品'); $this->ajaxReturn($res); } } // 判断规格 $sku_id = $sku_id && $sku_id != 0 ? $sku_id : 0; if ($sku_id != 0) { $GSVModel = D('RetailGroupSkuView'); // 拼团规格视图模型 // 规格查询条件 $map3 = array( 'RetailSkuGoods.goods_id' => $group_data['gid'], 'RetailSkuGoods.store_id' => self::$store_id, 'RetailSkuGoods.status' => 1, 'RetailSkuGoods.state' => 0, 'RetailSkuGroup.id' => $sku_id, ); $field2 = array( 'sku_id', 'act_price', 'act_num', 'purchase_price', 'online_price', 'shop_mem_price', 'plus_price' ); $group_sku = $GSVModel->getFind($map3, $field2); if (!$group_sku) { $res = array('status' => 0, 'msg' => '该活动规格存在异常,请联系商家'); $this->ajaxReturn($res); } $group_data['act_price'] = $group_sku['act_price']; $group_data['purchase_price'] = $group_sku['purchase_price']; $group_data['online_price'] = $group_sku['online_price']; $group_data['shop_mem_price'] = $group_sku['shop_mem_price']; $group_data['plus_price'] = $group_sku['plus_price']; $group_data['act_num'] = $group_sku['act_num']; // 获取商品原规格 $RSGModel = D('RetailSkuGoods'); $goods_sku = $RSGModel->getFind(array($RSGModel::ID => $group_sku['sku_id'])); } // 判断金额 if (!$group_data['act_price'] || floatval($group_data['act_price']) <= 0) { $res = array('status' => 0, 'msg' => '该活动商品存在异常,请联系商家'); $this->ajaxReturn($res); } // 计算金额 if ($pickup_type == 2) { // 配送 $money = floatval(round($group_data['act_price'] * $buy_number, 2) + $delivery_fee); } else { // 自提 $money = floatval(round($group_data['act_price'] * $buy_number, 2)); } $ApiRedis = new \Addons\Api\RedisController(); // 移除该用户当前购买商品的其他订单,无论是否下单成功 $str = 'retail_group_' . $group_id . '_' . $sku_id . '_' . self::$uid . '_*'; $ApiRedis::$redis->delete($ApiRedis::$redis->keys($str)); // 获取待支付库存 $str2 = 'retail_group_' . $group_id . '_' . $sku_id . '_*'; $wait_num = $this->getWaitNum($str2); // 判断库存 if (round($group_data['act_num'] - $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['vid']) { $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); } $RBOModel = D('RetailBillOrder'); // 实例化模型(bill_order) // 判断开团,参团 if ($parent_id && intval($parent_id) != 0) { // 参团 $parent_result = $this->publicJudgeGroup($parent_id); if ($parent_result['status'] == 0) { $this->ajaxReturn($parent_result); } $end_time = $parent_result['end_time']; } else { // 开团 // 计算时间 $day = $group_data['day'] ? intval($group_data['day']) * 86400 : 0; $hour = $group_data['hour'] ? intval($group_data['hour']) * 3600 : 0; $min = $group_data['min'] ? intval($group_data['min']) * 60 : 0; $end_time = $time + $day + $hour + $min; } // 下单信息(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['vid'] ? $vip_info['vid'] : 0; $cr[$RPOModel::UID] = self::$uid; // bill下单(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::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 => 2, $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 (!empty($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 ($group_data['integral_mem_status'] == 1 && $group_data['integral'] > 0) { // 商品单送 $integral = intval($group_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_group) $RBGModel = D('RetailBillGroup'); // 拼团关联订单模型 $cr5 = array( $RBGModel::BILL_ID => $add_result2[$RBOModel::ID], $RBGModel::GROUP_ID => $group_id, $RBGModel::SKU_ID => $sku_id ? $sku_id : 0, $RBGModel::STATE => 1, $RBGModel::PARENT_ID => $parent_id && intval($parent_id) != 0 ? $parent_id : $add_result2[$RBOModel::ID], $RBGModel::BUY_NUMBER => $buy_number, $RBGModel::END_TIME => $end_time, ); $add_result5 = $RBGModel->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 => $group_data['gid'], $RSModel::PAY_TYPE => $cr2[$RBOModel::PAY_TYPE], $RSModel::PRICE => $group_data['act_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 => $group_data['goods_class_id'], $RSModel::GOODS_NAME => $group_data['goods_name'], $RSModel::PRICING_METHOD => $group_data['pricing_method'], $RSModel::PURCHASE_PRICE => $group_data['purchase_price'], $RSModel::ORIGINAL_PRICE => $group_data['online_price'], $RSModel::GOODS_IMG_ID => $group_data['goods_img_id'], $RSModel::ATTRIBUTE_STATE => $group_data['attribute_state'], $RSModel::SELL_TYPE => 1, $RSModel::GOODS_TYPE => 1, $RSModel::VID => $cr[$RPOModel::VID], $RSModel::VIP_PRICE => $group_data['shop_mem_status'] == 1 && $group_data['shop_mem_price'] ? $group_data['shop_mem_price'] : 0, $RSModel::PLUS_VIP_PRICE => $group_data['plus_mem_status'] == 1 && $group_data['plus_price'] ? $group_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/group_notify_url'; $notify_func = "PayApi/ActivityOrder/groupOrderContinentPay"; $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_group_' . $group_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 ); // 添加 设置数据类型 $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); // 判断规格,获取现有现有库存 if ($sku_id && $sku_id != 0) { // 规格 $RSGModel = D('RetailSkuGroup'); $act_num = $RSGModel->getFindField(array($RSGModel::ID => $sku_id), $RSGModel::ACT_NUM); } else { // 非规格 $RGModel = D('RetailGroup'); $act_num = $RGModel->getFindField(array($RGModel::ID => $group_id), $RGModel::ACT_NUM); } // 再次对比 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' => 2 ); $bill_order = $BillModel->getFindGroup($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($res); } // 判断拼团状态 $result = A('PayApi/Group')->updateGroupState($bill_order['group_id'], $bill_order['parent_id'], self::$store_id); if ($result['status'] == 0) { $res = $result; } else { $res = array('status' => 1, 'msg' => '支付成功'); } $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' => 2 ); $bill_order = $BillModel->getFindGroup($map); if (!$bill_order) { $res = array('status' => 0, 'msg' => '订单异常,请重新下单'); $this->ajaxReturn($res); } // 查询redis数据库订单是否过期 $sku_id = $bill_order['sku_id'] && $bill_order['sku_id'] != 0 ? $bill_order['sku_id'] : 0; $ApiRedis = new \Addons\Api\RedisController(); $key = 'retail_group_' . $bill_order['group_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); } // 判断拼团状态 $result = A('PayApi/Group')->updateGroupState($bill_order['group_id'], $bill_order['parent_id'], self::$store_id); if ($result['status'] == 0) { $res = $result; } else { $res = array('status' => 1, 'msg' => '支付成功'); } $this->ajaxReturn($res); } /** * 查询,修改拼团状态 * $param int $group_id 活动id * @param int $parent_id * @return array $res */ public function updateGroupState($group_id, $parent_id) { // 查询活动(拼团人数) $RGModel = D('RetailGroup'); $number = $RGModel->getFindField(array($RGModel::ID => $group_id), $RGModel::NUMBER); if (!$number) { $res = array('status' => 0, 'msg' => '拼团出现异常,请联系商家'); return $res; } // 查询订单 $RGOViewModel = D('RetailGroupOrderView'); $map = array( 'RetailBillOrder.pay_state' => 1, 'RetailBillGroup.parent_id' => $parent_id, 'RetailBillGroup.state' => 1 ); $ids = $RGOViewModel->getSelect($map, array('id')); if (!$ids) { $res = array('status' => 0, 'msg' => '拼团查询出现异常,请联系商家'); return $res; } $ids = array_column($ids, 'id'); // 处理数据 $RBGModel = D('RetailBillGroup'); if (intval(count($ids)) == intval($number)) { // 拼团成功 $save_result = $RBGModel->updateOrder(array($RBGModel::BILL_ID => array('in', $ids), $RBGModel::STATE => 1), array($RBGModel::STATE => 2)); if ($save_result) { $res = array('status' => 1, 'msg' => '拼团成功'); } else { $res = array('status' => 0, 'msg' => '拼团出现异常,请联系商家'); } } else if (intval(count($ids)) > intval($number)) { // 拼团人数超出 $RBGModel->updateOrder(array($RBGModel::BILL_ID => array('in', $ids), $RBGModel::STATE => 1), array($RBGModel::STATE => 3)); $res = array('status' => 0, 'msg' => '拼团出现异常,请联系商家'); } else { $res = array('status' => 2, 'msg' => '拼团中'); } return $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); } /** * 获取拼团页面展示数据 * @param int $bill_id 订单id * @param array $res */ public function getShowGroup() { // 判断订单id $bill_id = I('post.bill_id'); if (!$bill_id) { $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 => 1, 'b.' . $BillModel::TYPE => 1, 'o.order_genre' => 2, 'g.state' => array('in', array(1, 2, 3)) ); $bill_order = $BillModel->getFindGroup($map); if (!$bill_order) { $res = array('status' => 0, 'msg' => '订单出现异常,请联系商家退款'); $this->ajaxReturn($res); } if ($bill_order['state'] == 3) { $res = array('status' => 0, 'msg' => '拼团失败'); $this->ajaxReturn($res); } // 处理数据 $bill_order['end_date'] = $bill_order['end_time'] * 1000; // 拼团查询条件 $RGVModel = D('RetailGroupView'); $map2 = array( 'RetailGroup.id' => $bill_order['group_id'], 'RetailGroup.storeid' => self::$store_id, 'RetailGroup.merchantid' => self::$merchant_id, // 'RetailGroup.acttype' => 1, 'RetailGroup.starttime' => array('elt', time()), // 'RetailGroup.endtime' => array('gt', time()), // 'RetailGoods.status' => 0, // 'RetailGoods.online_state' => 1 ); // 拼团查询字段 if ($bill_order['sku_id'] && $bill_order['sku_id'] != 0) { $field = array('id', 'gid', 'act_name', 'number', 'goods_name', 'act_type', 'end_time', 'online_state', 'status'); } else { $field = array('id', 'gid', 'act_name', 'act_price', 'number', 'goods_name', 'online_price', 'goods_img_id', 'act_type', 'end_time', 'online_state', 'status'); } // 查询拼团活动 $group_data = $RGVModel->getFind($map2, $field); if (!$group_data) { $res = array('status' => 0, 'msg' => '该活动存在异常,请联系商家'); $this->ajaxReturn($res); } if ($bill_order['uid'] != self::$uid && $group_data['act_type'] != 1) { $res = array('status' => 0, 'msg' => '该活动已关闭'); $this->ajaxReturn($res); } if ($bill_order['uid'] != self::$uid && $group_data['end_time'] < time()) { $res = array('status' => 0, 'msg' => '该活动已关闭'); $this->ajaxReturn($res); } if ($bill_order['uid'] != self::$uid && ($group_data['online_state'] != 1 || $group_data['status'] != 0)) { $res = array('status' => 0, 'msg' => '该活动已关闭'); $this->ajaxReturn($res); } // 查询规格 if ($bill_order['sku_id'] && $bill_order['sku_id'] != 0) { // 规格查询条件 $GSVModel = D('RetailGroupSkuView'); $map3 = array( 'RetailSkuGoods.goods_id' => $group_data['gid'], 'RetailSkuGoods.store_id' => self::$store_id, 'RetailSkuGoods.status' => 1, 'RetailSkuGoods.state' => 0, 'RetailSkuGroup.id' => $bill_order['sku_id'], ); $field2 = array('sku_id_list', 'goods_img', 'goods_img_id', 'act_price', 'online_price'); $group_sku = $GSVModel->getFind($map3, $field2); if (!$group_sku) { $res = array('status' => 0, 'msg' => '该活动规格存在异常,请联系商家'); $this->ajaxReturn($res); } // 合并数据 $group_data['image'] = $this->getGoodsImage($group_sku['goods_img_id'], $group_sku['goods_img']); $group_data['act_price'] = $group_sku['act_price']; $group_data['online_price'] = $group_sku['online_price']; // 规格名称 $RSLModel = D('RetailSkuList'); // 规格模型 $sku_name = $RSLModel->getFindField(array($RSLModel::ID => array('in', $group_sku['sku_id_list'])), $RSLModel::NAME, true); $group_data['sku_name'] = implode(',', $sku_name); } else { $group_data['image'] = $this->getGoodsImage($group_data['goods_img_id']); $group_data['sku_name'] = '标配'; } $group_data['province'] = round($group_data['online_price'] - $group_data['act_price'], 2); // 成员查询 $map4 = array( 'b.' . $BillModel::STORE_ID => self::$store_id, 'b.' . $BillModel::MERCHANT_ID => self::$merchant_id, 'b.' . $BillModel::ORDER_TYPE => 1, 'b.' . $BillModel::PAY_STATE => 1, 'b.' . $BillModel::TYPE => 1, 'o.order_genre' => 2, 'g.parent_id' => $bill_order['parent_id'], ); $field3 = array('b.id', 'b.uid', 'g.parent_id'); $group_user = $BillModel->getSelectGroup($map4, $field3); if (!$group_user) { $res = array('status' => 0, 'msg' => '拼团出现异常,请联系商家'); $this->ajaxReturn($res); } // 处理数据 $RSPUserModel = D('RetailSmallProgramUser'); // 小程序用户模型 foreach ($group_user as &$val) { $val['avatar'] = $RSPUserModel->getFindField(array($RSPUserModel::ID => $val['uid']), $RSPUserModel::AVATAR); } if ($bill_order['state'] == 2 && intval(count($group_user)) < intval($group_data['number'])) { // 拼团成功 ,人数未满 for ($i = 0; $i < (intval($group_data['number']) - intval(count($group_user))); $i++) { array_push($group_user, array('avatar' => $this->REQUEST_URL . '/Public/images/xcx_default_avatar.png')); } } $res = array( 'status' => 1, 'bill_order' => $bill_order, 'group_data' => $group_data, 'group_user' => $group_user, 'join_number' => count($group_user), 'number_s' => $group_data['number'] - count($group_user) ); $this->ajaxReturn($res); } /** * 获取用户拼团订单 * @param int $type 类型 1.所有 2.拼团中 3.拼团成功 3.拼团失败 * @return array $res */ public function getUserGroupOrder() { // 接收数据 $type = I('post.type') ? I('post.type') : 1; // 修改订单状态 A('PayApi/Group')->updateOrderState(self::$store_id, self::$merchant_id); // 查询订单 $RGOViewModel = D('RetailGroupOrderView'); $map = array( 'RetailBillOrder.uid' => self::$uid, 'RetailBillOrder.store_id' => self::$store_id, 'RetailBillOrder.pay_state' => 1, 'RetailBillOrder.type' => 1, 'RetailBillOnline.order_genre' => 2 ); // 判断类型 switch ($type) { case 1: $map['RetailBillGroup.state'] = array('in', array(1, 2, 3)); break; case 2: $map['RetailBillGroup.state'] = 1; break; case 3: $map['RetailBillGroup.state'] = 2; break; case 4: $map['RetailBillGroup.state'] = 3; break; default: $map['RetailBillGroup.state'] = array('in', array(1, 2, 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', 'group_id', 'sku_id', 'parent_id', 'state', 'end_time', 'buy_number', 'remark', ); $user_group = $RGOViewModel->getSelect($map, $field); if (!$user_group) { $res = array('status' => 0, 'msg' => '暂无拼团订单'); $this->ajaxReturn($res); } // 处理数据 $RSLModel = D('RetailSkuList'); $RGVModel = D('RetailGroupView'); $GSVModel = D('RetailGroupSkuView'); $RDCModel = D('RetailDaClerk'); $RUOModel = D('RetailUuOrder'); foreach ($user_group as &$val) { $val['add_time'] = date('Y-m-d H:i:s', $val['add_time']); $val['endDate'] = date('Y-m-d H:i:s', $val['end_time']); if ($val['state'] == 1) { // 拼团中 $val['status_g'] = '拼团中'; $val['key_id'] = 1; } else if ($val['state'] == 2 && $val['status'] == 1 && $val['remind_state'] != 1 && $val['pickup_type'] == 2) { // 拼团成功,未发货,未提醒发货 $val['status_g'] = '拼团成功'; $val['key_id'] = 2; } else if ($val['state'] == 2 && $val['status'] == 1 && $val['remind_state'] == 1 && $val['pickup_type'] == 2) { // 拼团成功,未发货,已提醒发货 $val['status_g'] = '拼团成功'; $val['key_id'] = 3; } else if ($val['state'] == 2 && $val['status'] == 2 && $val['pickup_type'] == 2) { // 拼团成功,已发货 $val['status_g'] = '拼团成功'; $val['key_id'] = 4; } else if ($val['state'] == 2 && $val['status'] == 3 && $val['eval_status'] != 1 && $val['pickup_type'] == 2) { // 拼团成功,已收货,未评价 $val['status_g'] = '拼团成功'; $val['key_id'] = 5; } else if ($val['state'] == 2 && $val['status'] == 3 && $val['eval_status'] == 1 && $val['pickup_type'] == 2) { // 拼团成功,已收货,已评价 $val['status_g'] = '拼团成功'; $val['key_id'] = 6; } else if ($val['state'] == 2 && $val['pickup_type'] == 1 && $val['status'] == 1) { // 拼团成功,待自提 $val['status_g'] = '拼团成功'; $val['key_id'] = 7; } else if ($val['state'] == 2 && $val['pickup_type'] == 1 && $val['status'] == 3 && $val['eval_status'] != 1) { // 拼团成功,已自提,未评价 $val['status_g'] = '拼团成功'; $val['key_id'] = 8; } else if ($val['state'] == 2 && $val['pickup_type'] == 1 && $val['status'] == 3 && $val['eval_status'] == 1) { // 拼团成功,已自提,已评价 $val['status_g'] = '拼团成功'; $val['key_id'] = 9; } else if ($val['state'] == 3 && $val['refund_status'] == 1) { // 拼团失败,待退款 $val['status_g'] = '拼团失败'; $val['key_id'] = 10; } else if ($val['state'] == 3 && $val['refund_status'] == 2) { // 拼团失败,已退款 $val['status_g'] = '拼团失败'; $val['key_id'] = 11; } // 获取活动 $map2 = array( 'RetailGroup.id' => $val['group_id'], 'RetailGroup.storeid' => self::$store_id, 'RetailGroup.merchantid' => self::$merchant_id, ); // 拼团查询字段 if ($val['sku_id'] && $val['sku_id'] != 0) { $field2 = array('id', 'gid', 'act_name',); } else { $field2 = array('id', 'gid', 'act_name', 'act_price', 'goods_name', 'goods_img_id'); } // 查询拼团活动 $group_data = $RGVModel->getFind($map2, $field2); if (!$group_data) { $res = array('status' => 0, 'msg' => '活动出现异常,请联系商家'); $this->ajaxReturn($res); } // 处理数据 $val['act_name'] = $group_data['act_name']; $val['goods_name'] = $group_data['goods_name']; // 查询规格 if ($val['sku_id'] && $val['sku_id'] != 0) { // 规格查询条件 $map3 = array( 'RetailSkuGoods.goods_id' => $group_data['gid'], 'RetailSkuGoods.store_id' => self::$store_id, 'RetailSkuGoods.status' => 1, 'RetailSkuGoods.state' => 0, 'RetailSkuGroup.id' => $val['sku_id'], ); $field3 = array('sku_id_list', 'goods_img', 'goods_img_id', 'act_price'); $group_sku = $GSVModel->getFind($map3, $field3); if (!$group_sku) { $res = array('status' => 0, 'msg' => '订单出现异常,请联系商家'); $this->ajaxReturn($res); } // 处理数据 $val['image'] = $this->getGoodsImage($group_sku['goods_img_id'], $group_sku['goods_img']); $val['act_price'] = $group_sku['act_price']; // 规格名称 $sku_name = $RSLModel->getFindField(array($RSLModel::ID => array('in', $group_sku['sku_id_list'])), $RSLModel::NAME, true); $val['sku_name'] = implode(',', $sku_name); } else { $val['image'] = $this->getGoodsImage($group_data['goods_img_id']); $val['act_price'] = $group_data['act_price']; $val['sku_name'] = '标配'; } // 配送方式 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_group' => $user_group); $this->ajaxReturn($res); } /** * 获取正在拼团的订单 * @param int $group_id * @return array $res */ public function getAllGroupOrder() { // 接收数据 $group_id = I('post.group_id'); if (!$group_id) { $res = array('status' => 0, 'msg' => '参数缺失'); $this->ajaxReturn($res); } // 修改订单状态 A('PayApi/Group')->updateOrderState(self::$store_id, self::$merchant_id); // 查询活动参团人数 $RGModel = D('RetailGroup'); $group_number = $RGModel->getFindField(array($RGModel::ID => $group_id), $RGModel::NUMBER); if (!$group_number) { $res = array('status' => 0, 'msg' => '活动存在异常,请联系商家'); $this->ajaxReturn($res); } // 查询正在拼团订单 $RBOModel = D('RetailBillOrder'); $map = array( 'b.' . $RBOModel::STORE_ID => self::$store_id, 'b.' . $RBOModel::MERCHANT_ID => self::$merchant_id, 'b.' . $RBOModel::PAY_STATE => 1, 'b.' . $RBOModel::TYPE => 1, 'b.' . $RBOModel::UID => array('neq', self::$uid), 'o.order_genre' => 2, 'g.group_id' => $group_id, 'g.state' => 1 ); $field = array('b.id', 'g.parent_id', 'x.nickname', 'x.avatar'); $group_order = $RBOModel->getUserSelectGroup($map, $field, $RBOModel::ID . ' asc', 'g.parent_id'); if (!$group_order) { $res = array('status' => 0, 'msg' => '暂无正在拼团订单'); $this->ajaxReturn($res); } // 处理数据 foreach ($group_order as &$val) { $map1 = $map; $map1['g.parent_id'] = $val['parent_id']; $val['count'] = $RBOModel->countGroupUser($map1); $val['lack_number'] = $group_number - $val['count']; unset($map1); } $res = array('status' => 1, 'group_order' => $group_order, 'count' => count($group_order)); $this->ajaxReturn($res); } /** * 确认参团,判断拼团状态 * @param int $parent_id * @return array $res */ public function judgeGroup() { // 接受参数 $parent_id = I('post.parent_id'); if (!$parent_id) { $res = array('status' => 0, 'msg' => '参数缺失'); $this->ajaxReturn($res); } $res = $this->publicJudgeGroup($parent_id); $this->ajaxReturn($res); } /** * 判断团长,用户 * @param int $parent_id * @return array $res */ protected function publicJudgeGroup($parent_id) { // 查询团长订单 $RBOModel = D('RetailBillOrder'); // bill_order表模型 $map = array( 'b.' . $RBOModel::ID => $parent_id, 'b.' . $RBOModel::STORE_ID => self::$store_id, 'b.' . $RBOModel::MERCHANT_ID => self::$merchant_id, 'b.' . $RBOModel::ORDER_TYPE => 1, 'b.' . $RBOModel::PAY_STATE => 1, 'b.' . $RBOModel::TYPE => 1, 'o.order_genre' => 2, 'g.parent_id' => $parent_id ); $find_order = $RBOModel->getFindGroup($map); // 判断订单 if (!$find_order) { $res = array('status' => 0, 'msg' => '该订单存在异常,请联系商家'); return $res; } // 判断拼团状态 if ($find_order['state'] != 1) { $res = array('status' => 0, 'msg' => '该团购已无法参加'); return $res; } // 判断时间 if ($find_order['end_time'] <= time()) { $res = array('status' => 0, 'msg' => '该团购已经截止'); return $res; } // 查询活动 $RGViewModel = D('RetailGroupView'); // 查询活动 $map2 = array( 'RetailGroup.id' => $find_order['group_id'], 'RetailGroup.storeid' => self::$store_id, 'RetailGroup.merchantid' => self::$merchant_id, 'RetailGroup.acttype' => 1, 'RetailGroup.starttime' => array('elt', time()), 'RetailGroup.endtime' => array('gt', time()), 'RetailGoods.status' => 0, 'RetailGoods.online_state' => 1 ); // 查询拼团活动 $group_info = $RGViewModel->getFind($map2, array('id', 'number', 'item', 'join_time')); if (!$group_info) { $res = array('status' => 0, 'msg' => '该活动已结束'); return $res; } // 二次判断人数 $map3 = array( 'b.' . $RBOModel::STORE_ID => self::$store_id, 'b.' . $RBOModel::MERCHANT_ID => self::$merchant_id, 'b.' . $RBOModel::ORDER_TYPE => 1, 'b.' . $RBOModel::PAY_STATE => 1, 'b.' . $RBOModel::TYPE => 1, 'o.order_genre' => 2, 'g.parent_id' => $parent_id ); $count = $RBOModel->countGroupUser($map3); // 判断人数 if (!$count) { $res = array('status' => 0, 'msg' => '该团购存在异常,请联系商家'); return $res; } if (intval($count) >= intval($group_info['number'])) { $res = array('status' => 0, 'msg' => '人数已满足,无法参加'); return $res; } // 判断用户是否参加 $map4 = array( 'b.' . $RBOModel::STORE_ID => self::$store_id, 'b.' . $RBOModel::MERCHANT_ID => self::$merchant_id, 'b.' . $RBOModel::ORDER_TYPE => 1, 'b.' . $RBOModel::PAY_STATE => 1, 'b.' . $RBOModel::TYPE => 1, 'b.' . $RBOModel::UID => self::$uid, 'o.order_genre' => 2, 'g.parent_id' => $parent_id ); $find_order2 = $RBOModel->getFindGroup($map4); if ($find_order2) { $res = array('status' => 0, 'msg' => '已经参加过该团购,无法重复参加'); } else { $res = array('status' => 1, 'msg' => '可以参加', 'end_time' => $find_order['end_time']); } return $res; } /** * 玩法详情,获取图片 * @return array $res */ public function getRulesDetailsImg() { $res['status'] = 1; $res['img'] = $this->REQUEST_URL . '/Public/images/xcx/groupRulesImg.jpg'; $this->ajaxReturn($res); } /** * 2019-12-29 * 获取用户拼团订单 分页版 * $type 类型 1.所有 2.拼团中 3.拼团成功 3.拼团失败 */ public function getUserGroupOrder_v1() { // 接收数据 $type = I('post.type') ? I('post.type') : 1; $page = I('post.page') ? I('post.page') : 1;//分页 // 修改订单状态 A('PayApi/Group')->updateOrderState(self::$store_id, self::$merchant_id); // 查询订单 $RGOViewModel = D('RetailGroupOrderView'); $map = array( 'RetailBillOrder.uid' => self::$uid, 'RetailBillOrder.store_id' => self::$store_id, 'RetailBillOrder.pay_state' => 1, 'RetailBillOrder.type' => 1, 'RetailBillOnline.order_genre' => 2, 'RetailBillOrder.order_type' => 1 ); // 判断类型 switch ($type) { case 1: $map['RetailBillGroup.state'] = array('in', array(1, 2, 3)); break; case 2: $map['RetailBillGroup.state'] = 1; break; case 3: $map['RetailBillGroup.state'] = 2; break; case 4: $map['RetailBillGroup.state'] = 3; break; default: $map['RetailBillGroup.state'] = array('in', array(1, 2, 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', 'group_id', 'sku_id', 'parent_id', 'state', 'end_time', 'buy_number', 'remark', ); $limit = 10; $user_group = $RGOViewModel->getSelect($map, $field, $page, $limit); if (!$user_group) { $res = array( 'status' => 1, 'msg' => '暂无拼团订单', 'data' => array(), 'limit' => $limit, ); $this->ajaxReturn($res); } // 处理数据 $RSLModel = D('RetailSkuList'); $RGVModel = D('RetailGroupView'); $GSVModel = D('RetailGroupSkuView'); $RDCModel = D('RetailDaClerk'); $RUOModel = D('RetailUuOrder'); foreach ($user_group as &$val) { $val['add_time'] = date('Y-m-d H:i:s', $val['add_time']); $val['endDate'] = date('Y-m-d H:i:s', $val['end_time']); if ($val['state'] == 1) { // 拼团中 $val['status_g'] = '拼团中'; $val['key_id'] = 1; } else if ($val['state'] == 2 && $val['status'] == 1 && $val['remind_state'] != 1 && $val['pickup_type'] == 2) { // 拼团成功,未发货,未提醒发货 $val['status_g'] = '拼团成功'; $val['key_id'] = 2; } else if ($val['state'] == 2 && $val['status'] == 1 && $val['remind_state'] == 1 && $val['pickup_type'] == 2) { // 拼团成功,未发货,已提醒发货 $val['status_g'] = '拼团成功'; $val['key_id'] = 3; } else if ($val['state'] == 2 && $val['status'] == 2 && $val['pickup_type'] == 2) { // 拼团成功,已发货 $val['status_g'] = '拼团成功'; $val['key_id'] = 4; } else if ($val['state'] == 2 && $val['status'] == 3 && $val['eval_status'] != 1 && $val['pickup_type'] == 2) { // 拼团成功,已收货,未评价 $val['status_g'] = '拼团成功'; $val['key_id'] = 5; } else if ($val['state'] == 2 && $val['status'] == 3 && $val['eval_status'] == 1 && $val['pickup_type'] == 2) { // 拼团成功,已收货,已评价 $val['status_g'] = '拼团成功'; $val['key_id'] = 6; } else if ($val['state'] == 2 && $val['pickup_type'] == 1 && $val['status'] == 1) { // 拼团成功,待自提 $val['status_g'] = '拼团成功'; $val['key_id'] = 7; } else if ($val['state'] == 2 && $val['pickup_type'] == 1 && $val['status'] == 3 && $val['eval_status'] != 1) { // 拼团成功,已自提,未评价 $val['status_g'] = '拼团成功'; $val['key_id'] = 8; } else if ($val['state'] == 2 && $val['pickup_type'] == 1 && $val['status'] == 3 && $val['eval_status'] == 1) { // 拼团成功,已自提,已评价 $val['status_g'] = '拼团成功'; $val['key_id'] = 9; } else if ($val['state'] == 3 && $val['refund_status'] == 1) { // 拼团失败,待退款 $val['status_g'] = '拼团失败'; $val['key_id'] = 10; } else if ($val['state'] == 3 && $val['refund_status'] == 2) { // 拼团失败,已退款 $val['status_g'] = '拼团失败'; $val['key_id'] = 11; } // 获取活动 $map2 = array( 'RetailGroup.id' => $val['group_id'], 'RetailGroup.storeid' => self::$store_id, 'RetailGroup.merchantid' => self::$merchant_id, ); // 拼团查询字段 if ($val['sku_id'] && $val['sku_id'] != 0) { $field2 = array('id', 'gid', 'act_name',); } else { $field2 = array('id', 'gid', 'act_name', 'act_price', 'goods_name', 'goods_img_id'); } // 查询拼团活动 $group_data = $RGVModel->getFind($map2, $field2); if (!$group_data) { $res = array('status' => 0, 'msg' => '活动出现异常,请联系商家'); $this->ajaxReturn($res); } // 处理数据 $val['act_name'] = $group_data['act_name']; $val['goods_name'] = $group_data['goods_name']; // 查询规格 if ($val['sku_id'] && $val['sku_id'] != 0) { // 规格查询条件 $map3 = array( 'RetailSkuGoods.goods_id' => $group_data['gid'], 'RetailSkuGoods.store_id' => self::$store_id, 'RetailSkuGoods.status' => 1, 'RetailSkuGoods.state' => 0, 'RetailSkuGroup.id' => $val['sku_id'], ); $field3 = array('sku_id_list', 'goods_img', 'goods_img_id', 'act_price'); $group_sku = $GSVModel->getFind($map3, $field3); if (!$group_sku) { $res = array('status' => 0, 'msg' => '订单出现异常,请联系商家'); $this->ajaxReturn($res); } // 处理数据 $val['image'] = $this->getGoodsImage($group_sku['goods_img_id'], $group_sku['goods_img']); $val['act_price'] = $group_sku['act_price']; // 规格名称 $sku_name = $RSLModel->getFindField(array($RSLModel::ID => array('in', $group_sku['sku_id_list'])), $RSLModel::NAME, true); $val['sku_name'] = implode(',', $sku_name); } else { $val['image'] = $this->getGoodsImage($group_data['goods_img_id']); $val['act_price'] = $group_data['act_price']; $val['sku_name'] = '标配'; } // 配送方式 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_group, 'msg' => '查询成功', 'limit' => $limit, ); $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); } // 实例化模型 $RGVModel = new RetailGroupViewModel(); $GSVModel = new RetailGroupSkuViewModel(); $RSLModel = new RetailSkuListModel(); // 接收数据 $group_id = I('post.group_id'); $sku_id = I('post.sku_id'); $buy_number = I('post.buy_number'); // 判断接受参数 if (!$group_id || !$buy_number) { $res = array('status' => 0, 'msg' => '参数缺失'); $this->ajaxReturn($res); } // 拼团查询条件 $map = array( 'RetailGroup.id' => $group_id, 'RetailGroup.storeid' => self::$store_id, 'RetailGroup.merchantid' => self::$merchant_id, 'RetailGroup.acttype' => 1, 'RetailGroup.starttime' => array('elt', time()), 'RetailGroup.endtime' => array('gt', time()), 'RetailGoods.status' => 0, 'RetailGoods.online_state' => 1 ); // 拼团查询字段 if ($sku_id && $sku_id != 0) { $field = array( 'id', 'gid', 'act_name', 'send_type', 'company', 'day', 'hour', 'min', ); } else { $field = array( 'id', 'gid', 'act_name', 'act_price', 'send_type', 'company', 'goods_img_id', 'day', 'hour', 'min', ); } // 查询拼团活动 $buy_data = $RGVModel->getFind($map, $field); if (!$buy_data) { $res = array('status' => 0, 'msg' => '该活动存在异常,请联系商家'); $this->ajaxReturn($res); } //计算成团结束时间与下单时间差 $buy_data['difference_time'] = $buy_data['day'] * 86400 + $buy_data['hour'] * 3600 + $buy_data['min'] * 60; // unset($buy_data['day']); // unset($buy_data['hour']); // unset($buy_data['min']); // 查询规格 if ($sku_id && $sku_id != 0) { // 规格查询条件 $map2 = array( 'RetailSkuGoods.goods_id' => $buy_data['gid'], 'RetailSkuGoods.store_id' => self::$store_id, 'RetailSkuGoods.status' => 1, 'RetailSkuGoods.state' => 0, 'RetailSkuGroup.id' => $sku_id, ); $field2 = array('sku_id_list', 'goods_img', 'goods_img_id', 'act_price'); $group_sku = $GSVModel->getFind($map2, $field2); if (!$group_sku) { $res = array('status' => 0, 'msg' => '该活动规格存在异常,请联系商家'); $this->ajaxReturn($res); } // 合并数据 $buy_data['image'] = $this->getGoodsImage($group_sku['goods_img_id'], $group_sku['goods_img']); $buy_data['act_price'] = $group_sku['act_price']; // 规格名称 $sku_name = $RSLModel->getFindField(array($RSLModel::ID => array('in', $group_sku['sku_id_list'])), $RSLModel::NAME, true); $buy_data['sku_name'] = implode(',', $sku_name); } else { $buy_data['image'] = $this->getGoodsImage($buy_data['goods_img_id']); $buy_data['sku_name'] = '标配'; } // 判断金额 if (!$buy_data['act_price'] || floatval($buy_data['act_price']) <= 0) { $res = array('status' => 0, 'msg' => '该商品价格存在异常,请联系商家'); $this->ajaxReturn($res); } else { $buy_data['act_price'] = floatval($buy_data['act_price']); } // 处理数据 $buy_data['all_money'] = floatval(round($buy_data['act_price'] * $buy_number, 2)); // 返回值 $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')), )), 'group_id' => array('type' => 'number', 'min' => 1), 'sku_id' => array('type' => 'number', 'min' => 0, 'require' => false), 'buy_number' => array('type' => 'number', 'min' => 0), 'parent_id' => array('type' => 'number', 'min' => 0, 'require' => false), '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), 'start_date' => array('type' => 'string', 'maxLen' => 20, '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']; $group_id = $post['group_id']; $sku_id = $post['sku_id']; $buy_number = $post['buy_number']; $parent_id = $post['parent_id']; $address_id = $post['address_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' => '当前时间未在商家营业时间内')); } $GroupViewModel = new RetailGroupViewModel(); // 拼团商品视图模型 // 活动查询条件 $map = array( 'RetailGroup.id' => $group_id, 'RetailGroup.storeid' => self::$store_id, 'RetailGroup.merchantid' => self::$merchant_id, 'RetailGroup.acttype' => 1, 'RetailGroup.starttime' => array('elt', $time), 'RetailGroup.endtime' => array('gt', $time), 'RetailGoods.status' => 0, 'RetailGoods.online_state' => 1 ); // 字段查询 if ($sku_id && $sku_id != 0) { $field = array( 'id', 'gid', 'number', 'day', 'hour', 'min', 'join_time', 'goods_name', 'goods_class_id', 'attribute_state', 'goods_img_id', 'integral_mem_status', 'integral', 'send_type', 'delivery_template_id', 'rise_num', 'pricing_method', 'company', 'weight_value', ); } else { $field = array( 'id', 'gid', 'number', 'act_price', 'act_num', 'day', 'hour', 'min', 'join_time', 'online_price', 'goods_name', 'goods_class_id', 'purchase_price', 'attribute_state', 'goods_img_id', 'integral_mem_status', 'integral', 'send_type', 'delivery_template_id', 'rise_num', 'pricing_method', 'company', 'weight_value', ); } // 查询拼团活动 $group_data = $GroupViewModel->getFind($map, $field); if (!$group_data) { $res = array( 'status' => 0, 'msg' => '该活动存在异常,请联系商家' ); $this->ajaxReturn($res); } if ($group_data['rise_num'] != 0 && floatval($buy_number) < floatval($group_data['rise_num'])) { $res = array( 'status' => 0, 'msg' => "该秒杀商品起购量为{$group_data['rise_num']}件", ); $this->ajaxReturn($res); } // 判断参与次数 if ($group_data['join_time'] && $group_data['join_time'] != 0) { // 查询用户订单 $RGOViewModel = new RetailGroupOrderViewModel(); $map2 = 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, 'RetailBillGroup.group_id' => $group_id, 'RetailBillGroup.state' => array('in', array(1, 2)), ); $count = $RGOViewModel->getCount($map2); // 判断限购 if ($count && $count >= intval($group_data['join_time'])) { $res = array( 'status' => 0, 'msg' => '你已经达到限购数量,请选择其他商品' ); $this->ajaxReturn($res); } } // 判断规格 $sku_id = $sku_id && $sku_id != 0 ? $sku_id : 0; if ($sku_id != 0) { $GSVModel = new RetailGroupSkuViewModel(); // 拼团规格视图模型 // 规格查询条件 $map3 = array( 'RetailSkuGoods.goods_id' => $group_data['gid'], 'RetailSkuGoods.store_id' => self::$store_id, 'RetailSkuGoods.status' => 1, 'RetailSkuGoods.state' => 0, 'RetailSkuGroup.id' => $sku_id, ); $field2 = array( 'sku_id', 'act_price', 'act_num', 'purchase_price', 'online_price', 'weight_value', ); $group_sku = $GSVModel->getFind($map3, $field2); if (!$group_sku) { $res = array( 'status' => 0, 'msg' => '该活动规格存在异常,请联系商家' ); $this->ajaxReturn($res); } $group_data['act_price'] = $group_sku['act_price']; $group_data['purchase_price'] = $group_sku['purchase_price']; $group_data['online_price'] = $group_sku['online_price']; $group_data['act_num'] = $group_sku['act_num']; // 获取商品原规格 $RSGModel = D('RetailSkuGoods'); $goods_sku = $RSGModel->getFind(array($RSGModel::ID => $group_sku['sku_id'])); } // 判断金额 if (!$group_data['act_price'] || floatval($group_data['act_price']) <= 0) { $res = array( 'status' => 0, 'msg' => '该活动商品存在异常,请联系商家' ); $this->ajaxReturn($res); } $ApiRedis = new \Addons\Api\RedisController(); $wait_str = 'retail_group_' . $group_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_group_' . $group_id . '_' . $sku_id . '_*'; $wait_num = $this->getWaitNum($other_wait_str); // 判断库存 if (round($group_data['act_num'] - $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(',', $group_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' => $group_data['delivery_template_id'], 'pricing_method' => $group_data['pricing_method'], 'weight_value' => $group_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($group_data['act_price'] * $buy_number, 2) + $delivery_fee); } else { // 自提 $money = floatval(round($group_data['act_price'] * $buy_number, 2)); } $vip_info = $this->getVipInfo();// 获取会员信息 // 判断开团,参团 if ($parent_id && intval($parent_id) != 0) { // 参团 $parent_result = $this->publicJudgeGroup($parent_id); if ($parent_result['status'] == 0) { $this->ajaxReturn($parent_result); } $end_time = $parent_result['end_time']; } else { // 开团 // 计算时间 $day = $group_data['day'] ? intval($group_data['day']) * 86400 : 0; $hour = $group_data['hour'] ? intval($group_data['hour']) * 3600 : 0; $min = $group_data['min'] ? intval($group_data['min']) * 60 : 0; $end_time = $time + $day + $hour + $min; } //bill下单 $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' => 2, 'remark' => $remark, 'user_select_time' => strtotime($start_date),//用户选择的时间 ); $online = $RBOnModel->addOrder($online_item); if (!$online) { $res = array( 'status' => 0, 'msg' => '下单失败' ); $this->ajaxReturn($res); } // 判断是否为会员 if (!empty($vip_info)) { // 获取会员类型 $vip_type = A('PayApi/Recharge')->getVipType($vip_info['vid']); // 获取商户会员设置 $RVCModel = D('RetailVipConfig'); // 商户会员设置 $vip_config = $RVCModel->getFind(array($RVCModel::MERCHANT_ID => self::$merchant_id)); if ($vip_config) { $give_state = true; //判断是否执行基于订单 if ($group_data['integral_mem_status'] == 1 && !empty($group_data['integral']) && $group_data['integral'] > 0) { $parameter = array( 'vip_type' => $vip_type, 'vip_config' => $vip_config, 'integral' => $group_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_group $RBGModel = D('RetailBillGroup'); // 拼团关联订单模型 $group_item = array( $RBGModel::BILL_ID => $bill['id'], $RBGModel::GROUP_ID => $group_id, $RBGModel::SKU_ID => $sku_id ? $sku_id : 0, $RBGModel::STATE => 1, $RBGModel::PARENT_ID => $parent_id && intval($parent_id) != 0 ? $parent_id : $bill['id'], $RBGModel::BUY_NUMBER => $buy_number, $RBGModel::END_TIME => $end_time, ); $group = $RBGModel->addOrder($group_item); if (!$group) { $res = array( 'status' => 0, 'msg' => '下单失败' ); $this->ajaxReturn($res); } // 生成销售记录(sell) $SellModel = D('RetailSell'); // 销售记录模型 $sell_item = array( 'bill_id' => $bill['id'], 'goods_id' => $group_data['gid'], 'pay_type' => 0, 'price' => $group_data['act_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' => $group_data['goods_class_id'], 'goods_name' => $group_data['goods_name'], 'pricing_method' => $group_data['pricing_method'], 'purchase_price' => $group_data['purchase_price'], 'original_price' => $group_data['online_price'], 'goods_img_id' => $group_data['goods_img_id'], 'attribute_state' => $group_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' => $group_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_group_' . $group_id . '_' . $sku_id . '_' . self::$uid . '_' . $bill['id']; $val_arr = array( 'bill_id' => $bill['id'], 'num' => $buy_number, 'expiration_time' => time() + 602, 'key' => $key ); // 添加 设置数据类型 $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); // 判断规格,获取现有现有库存 if ($sku_id && $sku_id != 0) { // 规格 $RSGModel = D('RetailSkuGroup'); $act_num = $RSGModel->getFindField(array($RSGModel::ID => $sku_id), $RSGModel::ACT_NUM); } else { // 非规格 $RGModel = D('RetailGroup'); $act_num = $RGModel->getFindField(array($RGModel::ID => $group_id), $RGModel::ACT_NUM); } // 再次对比 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')), )), 'group_id' => array('type' => 'number', 'min' => 1), 'sku_id' => array('type' => 'number', 'min' => 0, 'require' => false), 'buy_number' => array('type' => 'number', 'min' => 0), 'parent_id' => array('type' => 'number', 'min' => 0, 'require' => false), '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), 'start_date' => array('type' => 'string', 'maxLen' => 20, 'require' => false), ); $platform_type = self::$merchant['platform_type']; //商户平台类型 1默认系统 2微礼平台 $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']; $group_id = $post['group_id']; $sku_id = $post['sku_id']; $buy_number = $post['buy_number']; $parent_id = $post['parent_id']; $address_id = $post['address_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' => '当前时间未在商家营业时间内')); } $GroupViewModel = new RetailGroupViewModel(); // 拼团商品视图模型 // 活动查询条件 $map = array( 'RetailGroup.id' => $group_id, 'RetailGroup.storeid' => self::$store_id, 'RetailGroup.merchantid' => self::$merchant_id, 'RetailGroup.acttype' => 1, 'RetailGroup.starttime' => array('elt', $time), 'RetailGroup.endtime' => array('gt', $time), 'RetailGoods.status' => 0, 'RetailGoods.online_state' => 1 ); // 字段查询 if ($sku_id && $sku_id != 0) { $field = array( 'id', 'gid', 'number', 'day', 'hour', 'min', 'join_time', 'goods_name', 'goods_class_id', 'attribute_state', 'goods_img_id', 'integral_mem_status', 'integral', 'send_type', 'delivery_template_id', 'rise_num', 'pricing_method', 'company', 'weight_value', 'serial_number_state', ); } else { $field = array( 'id', 'gid', 'number', 'act_price', 'act_num', 'day', 'hour', 'min', 'join_time', 'online_price', 'goods_name', 'goods_class_id', 'purchase_price', 'attribute_state', 'goods_img_id', 'integral_mem_status', 'integral', 'send_type', 'delivery_template_id', 'rise_num', 'pricing_method', 'company', 'weight_value', 'serial_number_state', ); if ($platform_type == 2) { //第三方平台 $field[] = 'third_goods_code'; } } // 查询拼团活动 $group_data = $GroupViewModel->getFind($map, $field); if (!$group_data) { $res = array( 'status' => 0, 'msg' => '该活动存在异常,请联系商家' ); $this->ajaxReturn($res); } if ($group_data['rise_num'] != 0 && floatval($buy_number) < floatval($group_data['rise_num'])) { $res = array( 'status' => 0, 'msg' => "该拼团商品起购量为{$group_data['rise_num']}件", ); $this->ajaxReturn($res); } // 判断参与次数 if ($group_data['join_time'] && $group_data['join_time'] != 0) { // 查询用户订单 $RGOViewModel = D('RetailGroupOrderView'); $map2 = 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, 'RetailBillGroup.group_id' => $group_id, 'RetailBillGroup.state' => array('in', array(1, 2)), ); $count = $RGOViewModel->getCount($map2); // 判断限购 if ($count && $count >= intval($group_data['join_time'])) { $res = array( 'status' => 0, 'msg' => '你已经达到限购数量,请选择其他商品' ); $this->ajaxReturn($res); } } // 判断规格 $sku_id = $sku_id && $sku_id != 0 ? $sku_id : 0; if ($sku_id != 0) { $GSVModel = new RetailGroupSkuViewModel(); // 拼团规格视图模型 // 规格查询条件 $map3 = array( 'RetailSkuGoods.goods_id' => $group_data['gid'], 'RetailSkuGoods.store_id' => self::$store_id, 'RetailSkuGoods.status' => 1, 'RetailSkuGoods.state' => 0, 'RetailSkuGroup.id' => $sku_id, ); $field2 = array( 'sku_id', 'act_price', 'act_num', 'purchase_price', 'online_price', 'weight_value', ); if ($platform_type == 2) { //第三方平台 $field2[] = 'third_goods_code'; } $group_sku = $GSVModel->getFind($map3, $field2); if (!$group_sku) { $res = array( 'status' => 0, 'msg' => '该活动规格存在异常,请联系商家' ); $this->ajaxReturn($res); } $group_data['act_price'] = $group_sku['act_price']; $group_data['purchase_price'] = $group_sku['purchase_price']; $group_data['online_price'] = $group_sku['online_price']; $group_data['act_num'] = $group_sku['act_num']; $group_data['weight_value'] = $group_sku['weight_value']; // 获取商品原规格 $RSGModel = D('RetailSkuGoods'); $goods_sku = $RSGModel->getFind(array($RSGModel::ID => $group_sku['sku_id'])); } // 判断金额 if (!$group_data['act_price'] || floatval($group_data['act_price']) <= 0) { $res = array( 'status' => 0, 'msg' => '该活动商品存在异常,请联系商家' ); $this->ajaxReturn($res); } $ApiRedis = new \Addons\Api\RedisController(); $wait_str = 'retail_group_' . $group_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 = $group_sku['third_goods_code']; } else { $third_goods_code = $group_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) { $group_data['act_num'] = 0; $ThirdGoodsClass->activityOff([ 'id' => $group_id, 'type' => 2 ]); } else if ($goods_stock < $group_data['act_num']) { $group_data['act_num'] = $goods_stock; } } else { $group_data['act_num'] = 0; } } // 获取待支付库存 $other_wait_str = 'retail_group_' . $group_id . '_' . $sku_id . '_*'; $wait_num = $this->getWaitNum($other_wait_str); // 判断库存 if (round($group_data['act_num'] - $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(',', $group_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' => $group_data['delivery_template_id'], 'pricing_method' => $group_data['pricing_method'], 'weight_value' => $group_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($group_data['spike_price'] * $buy_number, 2)) >= intval($delivery_cost)) { $delivery_fee = 0; } // 计算金额 if ($pickup_type == 2 || $pickup_type == 3) { // 配送、快递 $money = floatval(round($group_data['act_price'] * $buy_number, 2) + $delivery_fee); } else { // 自提 $money = floatval(round($group_data['act_price'] * $buy_number, 2)); } $vip_info = $this->getVipInfo();// 获取会员信息 if (empty($vip_info) && $platform_type == 2) { $res = array( 'status' => 0, 'msg' => '请先绑定会员卡' ); $this->ajaxReturn($res); } // 判断开团,参团 if ($parent_id && intval($parent_id) != 0) { // 参团 $parent_result = $this->publicJudgeGroup($parent_id); if ($parent_result['status'] == 0) { $this->ajaxReturn($parent_result); } $end_time = $parent_result['end_time']; } else { // 开团 // 计算时间 $day = $group_data['day'] ? intval($group_data['day']) * 86400 : 0; $hour = $group_data['hour'] ? intval($group_data['hour']) * 3600 : 0; $min = $group_data['min'] ? intval($group_data['min']) * 60 : 0; $end_time = $time + $day + $hour + $min; } //bill下单 $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' => $group_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' => 2, 'remark' => $remark, 'user_select_time' => strtotime($start_date),//用户选择的时间 ); $online = $RBOnModel->addOrder($online_item); if (!$online) { $res = array( 'status' => 0, 'msg' => '下单失败' ); $this->ajaxReturn($res); } // 判断是否为会员 if (!empty($vip_info)) { // 获取会员类型 $vip_type = A('PayApi/Recharge')->getVipType($vip_info['vid']); // 获取商户会员设置 $RVCModel = D('RetailVipConfig'); // 商户会员设置 $vip_config = $RVCModel->getFind(array($RVCModel::MERCHANT_ID => self::$merchant_id)); if ($vip_config) { $give_state = true; //判断是否执行基于订单 if ($group_data['integral_mem_status'] == 1 && !empty($group_data['integral']) && $group_data['integral'] > 0) { $parameter = array( 'vip_type' => $vip_type, 'vip_config' => $vip_config, 'integral' => $group_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_group $RBGModel = D('RetailBillGroup'); // 拼团关联订单模型 $group_item = array( $RBGModel::BILL_ID => $bill['id'], $RBGModel::GROUP_ID => $group_id, $RBGModel::SKU_ID => $sku_id ? $sku_id : 0, $RBGModel::STATE => 1, $RBGModel::PARENT_ID => $parent_id && intval($parent_id) != 0 ? $parent_id : $bill['id'], $RBGModel::BUY_NUMBER => $buy_number, $RBGModel::END_TIME => $end_time, ); $group = $RBGModel->addOrder($group_item); if (!$group) { $res = array( 'status' => 0, 'msg' => '下单失败' ); $this->ajaxReturn($res); } // 生成销售记录(sell) $SellModel = D('RetailSell'); // 销售记录模型 $sell_item = array( 'bill_id' => $bill['id'], 'goods_id' => $group_data['gid'], 'pay_type' => 0, 'price' => $group_data['act_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' => $group_data['goods_class_id'], 'goods_name' => $group_data['goods_name'], 'pricing_method' => $group_data['pricing_method'], 'purchase_price' => $group_data['purchase_price'], 'original_price' => $group_data['online_price'], 'goods_img_id' => $group_data['goods_img_id'], 'attribute_state' => $group_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' => $group_data['company'], 'serial_number_state' => $group_data['serial_number_state'] ? $group_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_group_' . $group_id . '_' . $sku_id . '_' . self::$uid . '_' . $bill['id']; $val_arr = array( 'bill_id' => $bill['id'], 'num' => $buy_number, 'expiration_time' => time() + 602, 'key' => $key ); // 添加 设置数据类型 $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); // 判断规格,获取现有现有库存 if ($sku_id && $sku_id != 0) { // 规格 $RSGModel = D('RetailSkuGroup'); $act_num = $RSGModel->getFindField(array($RSGModel::ID => $sku_id), $RSGModel::ACT_NUM); } else { // 非规格 $RGModel = D('RetailGroup'); $act_num = $RGModel->getFindField(array($RGModel::ID => $group_id), $RGModel::ACT_NUM); } // 再次对比 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-03-31 获取用户拼团订单列表 */ public function getUserGroupOrder_v2() { // 接收数据 $type = I('post.type') ? I('post.type') : 1;//类型 1.所有 2.拼团中 3.拼团成功 3.拼团失败 $page = I('post.page') ? I('post.page') : 1;//分页 // 修改订单状态 A('PayApi/Group')->updateOrderState(self::$store_id, self::$merchant_id); // 查询订单 $OrderViewModel = D('RetailGroupOrderView'); $map = array( 'RetailBillOrder.uid' => self::$uid, 'RetailBillOrder.store_id' => self::$store_id, 'RetailBillOrder.pay_state' => 1, 'RetailBillOrder.type' => 1, 'RetailBillOnline.order_genre' => 2, 'RetailBillOrder.order_type' => 1 ); // 判断类型 $typeArr = array( '1' => array('in', array(1, 2, 3)), '2' => 1, '3' => 2, '4' => 3, ); $map['RetailBillGroup.state'] = $typeArr[$type]; $fields = 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', 'group_id', 'sku_id', 'parent_id', 'state', 'end_time', 'remark', ); $limit = 10; $groupList = $OrderViewModel->getSelect($map, $fields, $page, $limit); if (!$groupList) { $res = array( 'status' => 1, 'msg' => '暂无拼团订单', 'data' => array(), 'limit' => $limit, ); $this->ajaxReturn($res); } // 处理数据 $GroupModel = D('RetailGroup'); $SellModel = D('RetailSell'); $RDCModel = D('RetailDaClerk'); $RUOModel = D('RetailUuOrder'); foreach ($groupList as &$val) { $val['add_time'] = date('Y-m-d H:i:s', $val['add_time']); $val['endDate'] = date('Y-m-d H:i:s', $val['end_time']); switch ($val['state']) { case '1': $val['state_msg'] = '拼团中'; break; case '2': $val['state_msg'] = '拼团成功'; break; case '3': $val['state_msg'] = '拼团失败'; break; } $map = array( 'id' => $val['group_id'], ); $val['act_name'] = $GroupModel->getFindField($map, 'actname');// 拼团活动名称 $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'] == 2) { 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' => $groupList, 'msg' => '查询成功', 'limit' => $limit, ); $this->ajaxReturn($res); } }