alias('uc')->field($fields)->field($fields) ->join('goods_batch_area_relation sku','uc.price_id=sku.id') ->join('goods_batch spu','sku.batch_id=spu.batch_id') ->join('goods g','g.goods_id=spu.goods_id') ->join('manufacturer m','m.id=g.manufacturer_id')->order($order) ->where('user_id',$user_data['user_id'])->select(); //校验 $available_goods = []; $inavailable_goods = []; if ($data && is_array($data)){ foreach ($data as $key=>$value){ //限购 $data[$key]['is_limit'] = 0; //$data[$key]['limit_info'] = ''; //限购逻辑:优势+限购周期+限购量 if ($value['supplier_id']!=10006 &&isset($value['max_purchase'])&&isset($value['max_purchase_period'])&&$value['max_purchase']&&$value['max_purchase_period']){ $data[$key]['is_limit'] = 1; $data[$key]['limit_info'] = $value['max_purchase_period'].'天内限购'.$value['max_purchase'].$value['unit']; } $errmsg = ''; if ($value['status']!=1){ $errmsg .= '商品状态异常!'; } if ($value['batch_status']!=1){ $errmsg .= '药品已下架'; } if ($value['is_online_sale']==1){ $errmsg .= '非网售药品,请联系客服!'; } if ($value['is_onshelf']==0){ $errmsg .= '已下架!'; } if ($value['is_delete']==1){ $errmsg .= 'sku is deleted!'; } //采购权限暂不校验 //库存 if ($value['stock_num']<$value['num'] || $value['stock_num']<=0){ $errmsg .= '库存不足'; } $tmp_data = $data[$key]; if (empty($tmp_data['pc_thumb'])){ $tmp_data['pc_thumb'] = $tmp_data['app_thumb']?:self::APP_DEFAULT_IMG_URL; } if($tmp_data['pc_thumb'] == 'www.hyey.cn'){ $tmp_data['pc_thumb'] = self::APP_DEFAULT_IMG_URL; } $tmp_data['can_select'] = 1; $tmp_data['total_price'] = ceil($tmp_data['price']*$tmp_data['num']*100)/100;//金额保留两位小数 if ($errmsg){ $tmp_data['can_select'] = 0; $tmp_data['warn_info'] = $errmsg; $inavailable_goods[] = $tmp_data; }else{ $available_goods[] = $tmp_data; } } } $res = []; $res['errcode'] = 200; $res['errmsg'] = 'SUCCESS'; $res['data'] = ['available_goods'=>$available_goods,'inavailable_goods'=>$inavailable_goods]; return $res; } public function addGoods($user_data,$param){ $price_id = $param['gba_id']; //立即购买 $add_type = false; if (isset($param['add_type']) && $param['add_type']=='buy'){ $add_type = true; } if (isset($param['goods_number'])){ $param['goods_number'] = (int)$param['goods_number']; if ($param['goods_number']<0){ throw new Exception('数量不能为负!',-100); } } $fields = 'g.name,g.goods_id,g.max_purchase_period,g.max_purchase,g.unit,g.pc_thumb,g.pc_gallery,g.sketch,g.drug_form,g.spec_desc,g.pc_content,g.show_price,g.country_code,'; $fields .= 'spu.stock_num,spu.batch_id,spu.batch_type,spu.retail_num,spu.batch_number,spu.retail_flag,spu.entirety_num,spu.term_validity,spu.supplier_sn,spu.supplier_id,'; $fields .= 'm.name as manufacturer_name,'; $fields .= 'sku.price as unit_price,sku.price_type,sku.new_price,sku.discount_price,sku.discount_num,sku.discount_start_time,sku.discount_end_time'; $add_data = Db::name('goods_batch_area_relation')->alias('sku')->field($fields) ->join('goods_batch spu','sku.batch_id=spu.batch_id') ->join('goods g','spu.goods_id=g.goods_id') ->join('manufacturer m','m.id=g.manufacturer_id') ->where('sku.id',$price_id)->find(); //价格处理 $date_now = time(); $sale_pack_num = $add_data['retail_flag']==0?$add_data['retail_num']:$add_data['entirety_num']; //活动价 if ( $add_data['supplier_id']!=10006 && isset($add_data['discount_price']) && ((!$add_data['discount_start_time'] && !$add_data['discount_end_time']) || ($add_data['discount_start_time']<$date_now && $add_data['discount_end_time']>$date_now)) && ($add_data['discount_num']>=$sale_pack_num || $add_data['discount_num']==0)){ if ($add_data['discount_price']*10000){ $add_data['unit_price'] = $add_data['discount_price']; } //$add_data['stock_num'] = $add_data['discount_num']; } //新人价 if ($user_data['is_new_user']==1){ if ( $add_data['supplier_id']!=10006 && isset($add_data['new_price']) && ((!$add_data['discount_start_time'] && !$add_data['discount_end_time']) || ($add_data['discount_start_time']<$date_now && $add_data['discount_end_time']>$date_now)) && ($add_data['discount_num']>=$sale_pack_num || $add_data['discount_num']==0)){ if ($add_data['new_price']*10000){ $add_data['unit_price'] = $add_data['new_price']; } //$add_data['stock_num'] = $add_data['discount_num']; } } //库存校验 自营+流通 if ($param['goods_number'] > $add_data['stock_num']){ throw new Exception('库存不足',-156); } if ($add_data){ $tmp = []; $tmp['user_id'] = $user_data['user_id']; $tmp['price_type'] = $add_data['price_type']; $tmp['price_id'] = $price_id; $exist_in_cart = [];//用于下文校验购物车中是否已存在where判断 $exist_in_cart[] = ['user_id','=',$user_data['user_id']]; $exist_in_cart[] = ['price_type','=',$add_data['price_type']]; $exist_in_cart[] = ['price_id','=',$price_id]; $tmp['batch_id'] = $add_data['batch_id']; $tmp['unit_price'] = $add_data['unit_price']; $tmp['goods_number'] = $param['goods_number']; $date_time = date('Y-m-d H:i:s'); $tmp['create_time'] = $date_time; $tmp['update_time'] = $date_time; $tmp['type'] = ''; //流通 if ($add_data['supplier_id']==10006){ $price = Db::name('hy_data')->where('sn',$add_data['supplier_sn'])->limit(1)->value('price'); if ($price){ $extend_price_rate = $user_data['extend_price_rate']??1.05; $tmp['unit_price'] = ceil($price*$extend_price_rate*100)/100; $tmp['batch_id'] = $add_data['supplier_sn'];//兼容pc-此处存储extend_goods_id即supplier_sn $extend_data = []; $extend_data['name'] = $add_data['name']; $extend_data['unit'] = $add_data['unit']; $extend_data['price'] = $add_data['unit_price']; $extend_data['sketch'] = $add_data['sketch']; $extend_data['gallery'] = $add_data['pc_gallery']; $extend_data['can_show'] = 1; $extend_data['batch_id_plat'] = $add_data['batch_id']??'';//冗余存储当前batch_id(已入库) $extend_data['drug_form'] = $add_data['drug_form']; $extend_data['spec_desc'] = $add_data['spec_desc']; $extend_data['stock_num'] = $add_data['stock_num']; $extend_data['pc_content'] = $add_data['pc_content']; $extend_data['retail_flag'] = $add_data['retail_flag']; $extend_data['batch_number'] = $add_data['retail_num']; $extend_data['country_code'] = $add_data['country_code']; $extend_data['retail_num'] = $add_data['retail_num']; $extend_data['entirety_num'] = $add_data['entirety_num']; $extend_data['term_validity'] = $add_data['term_validity']; $extend_data['extend_goods_id'] = $add_data['supplier_sn']; $extend_data['manufacturer_name'] = $add_data['manufacturer_name']; $extend_data['show_price_int'] = (int)$add_data['show_price']; $extend_data['show_price_float'] = explode('.',$add_data['show_price'])[1]; $extend_data_json = json_encode($extend_data,JSON_UNESCAPED_UNICODE); $tmp['type'] = 'extend'; $tmp['extend_data'] = $extend_data_json; }else{ throw new Exception('商品已下架!',-504); } } $exist = Db::name('user_cart')->field('id as uc_id,goods_number,user_id,price_id')->where($exist_in_cart)->find(); //自营商品控销权限 if (isset($add_data['batch_type']) && $add_data['batch_type']==2 && $add_data['supplier_id']!=10006){ $cart_num_now = $exist['goods_number']??0; $check_array = $this->checkPurchaseAuth($user_data['user_id'],$add_data['goods_id']); if ($check_array['errcode']!==200){ throw new Exception($check_array['errmsg'],$check_array['errcode']); } } //限购-自营商品 if ($add_data['supplier_id']!=10006 && $add_data['max_purchase_period'] && $add_data['max_purchase']){ $cart_num_now = $exist['goods_number']??0; $to_add_now = $param['goods_number']??0; $check_array = $this->checkMaxPurchase($user_data['user_id'],$add_data,$cart_num_now,$to_add_now); if ($check_array['errcode']!==200){ throw new Exception($check_array['errmsg'],$check_array['errcode']); } } if ($exist){ $uc_id = $exist['uc_id']; //非立即购买情况下,进行累加;立即购买情况下直接更新为当前提交数量 if (!$add_type){ $tmp['goods_number'] += $exist['goods_number']; } $tmp['id'] = $uc_id; //首次加入购物车时间不更新 unset($tmp['create_time']); Db::name('user_cart')->update($tmp); }else{ $uc_id = Db::name('user_cart')->insertGetId($tmp); } if ($uc_id){ $res = []; $res['errcode'] = 200; $res['errmsg'] = 'SUCCESS'; $res['uc_id'] = $uc_id; return $res; }else{ throw new Exception('系统异常',-506); } }else{ throw new Exception('商品已下架',-505); } } /** * 采购权-控销 */ public function checkPurchaseAuth($user_id,$goods_id){ $where = []; $where[] = ['goods_id','=',$goods_id]; $where[] = ['user_id','=',$user_id]; $where[] = ['status','=',1]; $res = []; $goods_limit_check = Db::name('goods_limit_relation')->where($where)->find(); if ($goods_limit_check){ switch ($goods_limit_check['status']){ case 0: $res['errcode'] = 500; $res['errmsg'] = '采购权申请中,等待审核通过后购买!'; break; case 1: $res['errcode'] = 200; $res['errmsg'] = '采购权已通过!'; break; case 2: $res['errcode'] = 700; $res['errmsg'] = '采购权申请未通过!请咨询客服!'; } }else{ $res['errcode'] = -1; $res['errmsg'] = '当前商品为控销商品,尚未未申请采购权!'; } return $res; } /** * 限购处理 * @param $user_id Int 用户id * @param $goods_data array 限购商品数据 * @param $cart_num_now Int 购物车商品数量 * @return array */ public function checkMaxPurchase($user_id,$goods_data,$cart_num_now=0,$to_add_now=0){ //判断药品是否设了购买数量设置,未限制的max_purchase_period为0,不进入该处理过程 $res_result = []; if ($goods_data['max_purchase_period']){ $day_limit = $goods_data['max_purchase_period']; $limit_time = date("Y-m-d H:i:s",strtotime("- $day_limit days"));//截止至当前时间的该时间周期内 $_where = []; $_where[] = ['oi.user_id','=',$user_id]; $_where[] = ['oi.status','in',[0,1,6,7]]; $_where[] = ['oi.create_time','>',$limit_time]; $_where[] = ['og.goods_id','=',$goods_data['goods_id']]; //上述时间周期内已购买商品数量总和 $bought_goods_num = Db::name("order_info")->alias("oi")->join("order_goods og","oi.order_id = og.order_id")->where($_where)->sum("og.goods_number"); //可采购数量待处理; 标准 $can_buy_num = $goods_info['max_purchase'] - $bought_goods_num;(该值(负数、0、正数 )+ 包装数量) if ($goods_data['max_purchase'] <= $bought_goods_num){ $res_result['errcode'] = -1; $res_result['errmsg'] = "限购商品,最近限购周期内已达最大采购量";//购物车中处理成失效商品? }else{ $can_put_in_cart_num = $goods_data['max_purchase'] - $bought_goods_num - $cart_num_now-$to_add_now; if ($can_put_in_cart_num>=0){ //不阻断,允许继续加入购物车 $res_result['errcode'] = 200; $res_result['errmsg'] = 'SUCCESS'; }else{ //阻断 $res_result['errcode'] = 500; $res_result['errmsg'] = '限购商品,已达到最大可购买量'; //$res_result['errmsg'] = '限购商品,'.$day_limit.'天内限购'.$goods_data['max_purchase'].$goods_data['unit'].',最近'.$day_limit.'天内已购'.$bought_goods_num.$goods_data['unit'].',当前最多可继续加入购物车'.$can_put_in_cart_num.$goods_data['unit']; } } }else{ $res_result['errcode'] = 200; $res_result['errmsg'] = 'SUCCESS'; } return $res_result; } }