123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312 |
- <?php
- namespace app\common\service;
- use app\common\model\Admin;
- use app\common\model\Goods;
- use app\common\model\GoodsCart;
- use app\common\model\GoodsSku;
- use app\common\model\User;
- use app\common\validate\KillService;
- use think\Collection;
- class OrderService extends BaseService {
- /** @var User */
- protected $user;
- protected $coupon_use;
- protected $coupon_id;
- /** @var 1直接购买2购物车买 */
- protected $frm;
- protected $goods=[];
- protected $cartSkuIds=null;
- protected $submit=false;
- protected $clearCart=false;
- /**
- * @param User $user
- */
- public function setUser(User $user)
- {
- $this->user = $user;
- }
- /**
- * @param $cartSkuIds
- */
- public function setCartSkuIds($cartSkuIds): void
- {
- $this->cartSkuIds = $cartSkuIds;
- }
- /**
- * @param bool $submit
- */
- public function setSubmit(bool $submit): void
- {
- $this->submit = $submit;
- }
- /**
- * @param bool $clearCart
- */
- public function setClearCart(bool $clearCart): void
- {
- $this->clearCart = $clearCart;
- }
- /**
- * @return bool
- */
- public function isClearCart(): bool
- {
- return $this->clearCart;
- }
- /**
- * @return bool
- */
- public function isSubmit(): bool
- {
- return $this->submit;
- }
- /**
- * @return User
- */
- public function getUser(): User
- {
- return $this->user;
- }
- /**
- * @param array $goods
- */
- public function setGoods(array $goods): void
- {
- $this->goods = $goods;
- }
- /**
- * @param mixed $frm
- */
- public function setFrm($frm): void
- {
- $this->frm = $frm;
- }
- /**
- * @param mixed $coupon_use
- */
- public function setCouponUse($coupon_use): void
- {
- $this->coupon_use = $coupon_use;
- }
- /**
- * @param mixed $coupon_id
- */
- public function setCouponId($coupon_id): void
- {
- $this->coupon_id = $coupon_id;
- }
- /**
- * @return Collection
- */
- public function getGoods()
- {
- $goods=$this->goods;
- if($this->frm==1) {
- $newGoods=[];
- foreach ($goods as $sku_id=>$info){
- $sku=GoodsSku::with(['goods'])->find($sku_id);
- if(!$sku||!$sku->goods){
- $this->error('规格或商品不存在');
- }
- $temp=[];
- $temp['num']=$info['num'];
- $temp['num_install']=$info['num_install'];
- $temp['sku']=$sku;
- $temp['goods']=$sku->goods;
- $temp['goods_id']=$sku['goods_id'];
- $temp['goods_sku_id']=$sku['id'];
- $newGoods[]=$temp;
- }
- return collection($newGoods);
- }else{
- $map=[];
- if(!is_null($this->cartSkuIds)){
- if(is_array($this->cartSkuIds) && empty($this->cartSkuIds)){
- return collection([]);
- }else{
- $map['goods_sku_id']=['in',$this->cartSkuIds];
- }
- }
- foreach ($this->goods as $skuId=>$numArr){
- $this->getUser()->cart()->where('goods_sku_id',$skuId)->update([
- 'num'=>$numArr['num'],
- 'num_install'=>$numArr['num_install'],
- ]);
- }
- return $this->getUser()->cart()
- ->where($map)
- ->with(['goods','sku'])
- ->select();
- }
- }
- public function calculate(){
- $info=[
- 'amount_total'=>0,
- 'amount_pay'=>0,
- 'amount_coupon'=>0,
- //'amount_goods'=>0,
- //'amount_goods_real'=>0,
- 'amount_coupon_kill'=>0,
- 'amount_coupon_level'=>0,
- 'amount_install'=>0,
- 'amount_discount'=>0,
- 'amount_cmn'=>0,
- 'coupon'=>[],
- ];
- $user=$this->getUser();
- $info['goods']=$this->getGoods();
- $killOpen=KillService::open();
- #提交订单操作
- $skuIds=[];
- if($this->isSubmit()) {
- foreach ($info['goods'] as $key=>$goods) {
- $sku = GoodsSku::lock(true)->find($goods['sku']['id']);
- $num=$goods['num'];
- $stock='num_stock';
- $goods['is_kill']=0;
- if($killOpen && $sku->goods()->value('is_kill')){
- $stock='num_stock_kill';
- $goods['is_kill']=1;
- }
- if($num>$sku[$stock]){
- $this->error('库存不足');
- }
- try {
- $sku->goods()->setInc('num_sell',$goods['num']);
- $sku->setDec($stock,$goods['num']);
- $sku->setInc('num_sell',$goods['num']);
- }catch (\Exception $e){
- $this->error('库存不足');
- }
- $sku->save();
- $skuIds[]=$goods['sku']['id'];
- $info['goods']->offsetSet($key,$goods);
- }
- }
- $info['num']=array_sum(array_column($info['goods']->toArray(),'num'));
- $info['num_install']=array_sum(array_column($info['goods']->toArray(),'num_install'));
- $injectCoupon=false;
- foreach ($info['goods'] as $key=>&$goods){
- if(!$goods['sku']||!$goods['goods']){
- $this->del($goods,'规格或商品不存在');
- continue;
- }
- if($goods['goods']['status']!=Goods::STATUS_NORMAL){
- $this->del($goods,"商品[{$goods['goods']['name']}]已下架");
- continue;
- }
- list($amountReal,$couponKill)=$this->getAmount($goods['sku'],$goods['goods'],$goods['num']);
- $goods['amount_pay']=0;
- $goods['amount_coupon']=0;
- $goods['amount_goods']=$amountReal;
- $goods['amount_goods_real']=$amountReal;
- $goods['amount_total']=$amountReal;
- $goods['amount_coupon_kill']=$couponKill;
- $goods['amount_install']=InstallService::getFee([$goods['sku']['id']=>$goods]);
- if(!empty($this->coupon_use) && !$injectCoupon){
- $coupon=$user->coupon()->lock($this->isSubmit())->findOrFail($this->coupon_id);
- if($coupon->checkCanUse($goods['amount_goods'],$goods['goods_id'])){
- $couponAmount=$coupon['amount'];
- $goods['coupon_id']=$coupon['id'];
- $goods['amount_coupon']=$couponAmount;
- $goods['amount_goods_real']=bcadd($goods['amount_goods_real'],-$couponAmount);
- if($this->isSubmit()){
- $coupon->setUse();
- }
- $injectCoupon=true;
- }
- }
- $goods['amount_coupon_level']=$this->getUser()->getLevelDiscount($goods['amount_goods_real']);
- $goods['amount_goods_real']=bcsub($goods['amount_goods_real'],$goods['amount_coupon_level']);
- $goods['amount_total']=bcadd($goods['amount_total'],$goods['amount_install']);
- $goods['amount_pay']=bcAddAll($goods['amount_goods_real'],$goods['amount_install']);
- $goods['amount_discount']=bcAddAll($goods['amount_coupon'],$goods['amount_coupon_kill'],$goods['amount_coupon_level']);
- $goods['amount_cmn']=Admin::getCmn($goods['amount_pay']);
- $info['amount_pay']=bcadd($info['amount_pay'],$goods['amount_pay']);
- $info['amount_total']=bcadd($info['amount_total'],$goods['amount_total']);
- $info['amount_coupon']=bcadd($info['amount_coupon'],$goods['amount_coupon']);
- $info['amount_coupon_kill']=bcadd($info['amount_coupon_kill'],$goods['amount_coupon_kill']);
- $info['amount_coupon_level']=bcadd($info['amount_coupon_level'],$goods['amount_coupon_level']);
- $info['amount_install']=bcadd($info['amount_install'],$goods['amount_install']);
- $info['amount_discount']=bcadd($info['amount_discount'],$goods['amount_discount']);
- $info['amount_cmn']=bcadd($info['amount_cmn'],$goods['amount_cmn']);
- $info['goods']->offsetSet($key,$goods);
- }
- if($this->coupon_use && !$injectCoupon){
- $this->error('优惠券不符合使用规则');
- }
- if(!$this->isSubmit()){
- $coupon=$user->coupon()->canUse()->select();
- $fitCoupon=[];
- foreach ($info['goods'] as $good){
- foreach ($coupon as $oneCoupon){
- if($oneCoupon->checkCanUse($good['amount_goods']??0,$good['goods_id'])){
- $fitCoupon[$oneCoupon['id']]=$oneCoupon;
- }
- }
- }
- $info['coupon']=array_values($fitCoupon);
- }
- #等级折扣金额
- //$info['amount_coupon_level']=$this->getUser()->getLevelDiscount($info['amount_goods_real']);
- //$info['amount_pay']=bcsub($info['amount_pay'],$info['amount_coupon_level']);
- //$info['amount_discount']=bcAddAll($info['amount_discount'],$info['amount_coupon'],$info['amount_coupon_kill'],$info['amount_coupon_level']);
- #删除购物车
- if($this->isClearCart()){
- $this->getUser()
- ->cart()
- ->whereIn('goods_sku_id',$skuIds)
- ->delete();
- }
- return $info;
- }
- /**
- * @param $sku GoodsSku
- */
- public static function getAmount($sku,$goods,$num){
- #价格,秒杀优惠金额
- $amount=$sku->calcAmount($num,'amount_ladder');
- $amountKill=$sku->calcAmount($num,'amount_kill_ladder');
- if(KillService::open() && $goods['is_kill']){
- return [$amountKill,bcsub($amount,$amountKill)];
- }else{
- return [$amount,0];
- }
- }
- protected function del($goods,$msg){
- if($this->frm==2){
- $this->getUser()->cart()->where('goods_id',$goods['goods_id'])->where('goods_sku_id',$goods['goods_sku_id'])->delete();
- }else{
- $this->error($msg);
- }
- }
- }
|