123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239 |
- <?php
- namespace app\common\service;
- use app\common\model\GoodsCart;
- use app\common\model\GoodsSku;
- use app\common\model\User;
- use app\common\validate\KillService;
- 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 array
- */
- public function getGoods()
- {
- if($this->frm==1) {
- $goods=$this->goods;
- $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 $newGoods;
- }else{
- $map=[];
- if(!is_null($this->cartSkuIds)){
- if(is_array($this->cartSkuIds) && empty($this->cartSkuIds)){
- return [];
- }else{
- $map['goods_sku_id']=['in',$this->cartSkuIds];
- }
- }
- return $this->getUser()->cart()
- ->where($map)
- ->with(['goods','sku'])
- ->select()->toArray();
- }
- }
- public function calculate(){
- $info=[
- 'amount_total'=>0,
- 'amount_pay'=>0,
- 'amount_coupon'=>0,
- 'amount_coupon_kill'=>0,
- 'amount_install'=>0,
- 'amount_discount'=>0,
- 'num'=>0,
- 'num_install'=>0,
- 'goods'=>[]
- ];
- $user=$this->getUser();
- $info['goods']=$this->getGoods();
- #提交订单操作
- $skuIds=[];
- if($this->isSubmit()) {
- foreach ($info['goods'] as $goods) {
- $sku = GoodsSku::lock(true)->find($goods['sku']['id']);
- $sku['num_sell']=$sku['num_sell']+$goods['num'];
- if($sku['num_sell']>$sku['num_stock']){
- $this->error('库存不足');
- }
- $sku->save();
- $skuIds[]=$goods['sku']['id'];
- }
- }
- $info['num']=array_sum(array_column($info['goods'],'num'));
- $info['num_install']=array_sum(array_column($info['goods'],'num_install'));
- $injectCoupon=false;
- foreach ($info['goods'] as &$goods){
- list($amountReal,$amountKill,$amountOrigin)=$this->getAmount($goods['sku'],$goods['goods']);
- $goods['amount_pay']=0;
- $goods['amount_coupon']=0;
- $goods['amount_goods']=$goods['amount_goods_real']=bcmul($amountReal,$goods['num']);
- $goods['amount_total']=bcmul($amountOrigin,$goods['num']);
- $goods['amount_coupon_kill']=bcmul($amountKill,$goods['num']);
- $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->canUse($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_total']=bcadd($goods['amount_total'],$goods['amount_install']);
- $goods['amount_pay']=bcAddAll($goods['amount_goods_real'],$goods['amount_install']);
- $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_install']=bcadd($info['amount_install'],$goods['amount_install']);
- }
- if($this->coupon_use && !$injectCoupon){
- $this->error('优惠券不符合使用规则');
- }
- $info['amount_discount']=bcAddAll($info['amount_discount'],$info['amount_coupon'],$info['amount_coupon_kill']);
- #删除购物车
- if($this->isClearCart()){
- $this->getUser()
- ->cart()
- ->whereIn('goods_sku_id',$skuIds)
- ->delete();
- }
- return $info;
- }
- protected function getAmount($sku,$goods){
- $amountArr=[0,0,$sku['amount']];
- if(KillService::open() && $goods['is_kill']){
- $amountArr[0]=$sku['amount_kill'];
- $amountArr[1]=bcsub($sku['amount'],$sku['amount_kill']);
- }else{
- $amountArr[0]=$sku['amount'];
- }
- return $amountArr;
- }
- }
|