Files
CompanyProject/金壶/ydyd_service/application/common/service/UserCartService.php
2024-09-27 01:32:49 +08:00

340 lines
16 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
namespace app\common\service;
use think\Db;
use think\Exception;
class UserCartService{
const APP_DEFAULT_IMG_URL = 'ydyd-develop-file.oss-cn-hangzhou.aliyuncs.com/pc_shop_pic_url_1588925532218.jpg';
public function getAll($user_data){
$order = [];
$order['uc.update_time'] = 'desc';
$order['uc.id'] = 'desc';
$fields = 'uc.id,g.name,m.name as manufacturer_name,g.pc_thumb,g.spec_desc,g.unit,uc.unit_price as price,uc.user_id,uc.price_id,';
$fields .= 'sku.batch_id,spu.goods_id,spu.retail_flag,spu.retail_num,spu.entirety_num,spu.batch_type,';
$fields .= 'spu.term_validity,spu.supplier_user_id,spu.supplier_id,spu.supplier_sn,spu.batch_number,spu.batch_status,';
$fields .= 'uc.goods_number as num,1 as can_select,';
$fields .= 'spu.stock_num,g.status,g.is_online_sale,spu.batch_status,sku.is_onshelf,sku.is_delete,';//下文校验字段
//限购字段
$fields .= 'g.max_purchase,g.max_purchase_period,g.unit';
$data = Db::name('user_cart')->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;
}
}