OrderService.php 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239
  1. <?php
  2. namespace app\common\service;
  3. use app\common\model\GoodsCart;
  4. use app\common\model\GoodsSku;
  5. use app\common\model\User;
  6. use app\common\validate\KillService;
  7. class OrderService extends BaseService {
  8. /** @var User */
  9. protected $user;
  10. protected $coupon_use;
  11. protected $coupon_id;
  12. /** @var 1直接购买2购物车买 */
  13. protected $frm;
  14. protected $goods=[];
  15. protected $cartSkuIds=null;
  16. protected $submit=false;
  17. protected $clearCart=false;
  18. /**
  19. * @param User $user
  20. */
  21. public function setUser(User $user)
  22. {
  23. $this->user = $user;
  24. }
  25. /**
  26. * @param $cartSkuIds
  27. */
  28. public function setCartSkuIds($cartSkuIds): void
  29. {
  30. $this->cartSkuIds = $cartSkuIds;
  31. }
  32. /**
  33. * @param bool $submit
  34. */
  35. public function setSubmit(bool $submit): void
  36. {
  37. $this->submit = $submit;
  38. }
  39. /**
  40. * @param bool $clearCart
  41. */
  42. public function setClearCart(bool $clearCart): void
  43. {
  44. $this->clearCart = $clearCart;
  45. }
  46. /**
  47. * @return bool
  48. */
  49. public function isClearCart(): bool
  50. {
  51. return $this->clearCart;
  52. }
  53. /**
  54. * @return bool
  55. */
  56. public function isSubmit(): bool
  57. {
  58. return $this->submit;
  59. }
  60. /**
  61. * @return User
  62. */
  63. public function getUser(): User
  64. {
  65. return $this->user;
  66. }
  67. /**
  68. * @param array $goods
  69. */
  70. public function setGoods(array $goods): void
  71. {
  72. $this->goods = $goods;
  73. }
  74. /**
  75. * @param mixed $frm
  76. */
  77. public function setFrm($frm): void
  78. {
  79. $this->frm = $frm;
  80. }
  81. /**
  82. * @param mixed $coupon_use
  83. */
  84. public function setCouponUse($coupon_use): void
  85. {
  86. $this->coupon_use = $coupon_use;
  87. }
  88. /**
  89. * @param mixed $coupon_id
  90. */
  91. public function setCouponId($coupon_id): void
  92. {
  93. $this->coupon_id = $coupon_id;
  94. }
  95. /**
  96. * @return array
  97. */
  98. public function getGoods()
  99. {
  100. if($this->frm==1) {
  101. $goods=$this->goods;
  102. $newGoods=[];
  103. foreach ($goods as $sku_id=>$info){
  104. $sku=GoodsSku::with(['goods'])->find($sku_id);
  105. if(!$sku||!$sku->goods){
  106. $this->error('规格或商品不存在');
  107. }
  108. $temp=[];
  109. $temp['num']=$info['num'];
  110. $temp['num_install']=$info['num_install'];
  111. $temp['sku']=$sku;
  112. $temp['goods']=$sku->goods;
  113. $temp['goods_id']=$sku['goods_id'];
  114. $temp['goods_sku_id']=$sku['id'];
  115. $newGoods[]=$temp;
  116. }
  117. return $newGoods;
  118. }else{
  119. $map=[];
  120. if(!is_null($this->cartSkuIds)){
  121. if(is_array($this->cartSkuIds) && empty($this->cartSkuIds)){
  122. return [];
  123. }else{
  124. $map['goods_sku_id']=['in',$this->cartSkuIds];
  125. }
  126. }
  127. return $this->getUser()->cart()
  128. ->where($map)
  129. ->with(['goods','sku'])
  130. ->select()->toArray();
  131. }
  132. }
  133. public function calculate(){
  134. $info=[
  135. 'amount_total'=>0,
  136. 'amount_pay'=>0,
  137. 'amount_coupon'=>0,
  138. 'amount_coupon_kill'=>0,
  139. 'amount_install'=>0,
  140. 'amount_discount'=>0,
  141. 'num'=>0,
  142. 'num_install'=>0,
  143. 'goods'=>[]
  144. ];
  145. $user=$this->getUser();
  146. $info['goods']=$this->getGoods();
  147. #提交订单操作
  148. $skuIds=[];
  149. if($this->isSubmit()) {
  150. foreach ($info['goods'] as $goods) {
  151. $sku = GoodsSku::lock(true)->find($goods['sku']['id']);
  152. $sku['num_sell']=$sku['num_sell']+$goods['num'];
  153. if($sku['num_sell']>$sku['num_stock']){
  154. $this->error('库存不足');
  155. }
  156. $sku->save();
  157. $skuIds[]=$goods['sku']['id'];
  158. }
  159. }
  160. $info['num']=array_sum(array_column($info['goods'],'num'));
  161. $info['num_install']=array_sum(array_column($info['goods'],'num_install'));
  162. $injectCoupon=false;
  163. foreach ($info['goods'] as &$goods){
  164. list($amountReal,$amountKill,$amountOrigin)=$this->getAmount($goods['sku'],$goods['goods']);
  165. $goods['amount_pay']=0;
  166. $goods['amount_coupon']=0;
  167. $goods['amount_goods']=$goods['amount_goods_real']=bcmul($amountReal,$goods['num']);
  168. $goods['amount_total']=bcmul($amountOrigin,$goods['num']);
  169. $goods['amount_coupon_kill']=bcmul($amountKill,$goods['num']);
  170. $goods['amount_install']=InstallService::getFee([$goods['sku']['id']=>$goods]);
  171. if(!empty($this->coupon_use) && !$injectCoupon){
  172. $coupon=$user->coupon()->lock($this->isSubmit())->findOrFail($this->coupon_id);
  173. if($coupon->canUse($goods['amount_goods'],$goods['goods_id'])){
  174. $couponAmount=$coupon['amount'];
  175. $goods['coupon_id']=$coupon['id'];
  176. $goods['amount_coupon']=$couponAmount;
  177. $goods['amount_goods_real']=bcadd($goods['amount_goods_real'],-$couponAmount);
  178. if($this->isSubmit()){
  179. $coupon->setUse();
  180. }
  181. $injectCoupon=true;
  182. }
  183. }
  184. $goods['amount_total']=bcadd($goods['amount_total'],$goods['amount_install']);
  185. $goods['amount_pay']=bcAddAll($goods['amount_goods_real'],$goods['amount_install']);
  186. $info['amount_pay']=bcadd($info['amount_pay'],$goods['amount_pay']);
  187. $info['amount_total']=bcadd($info['amount_total'],$goods['amount_total']);
  188. $info['amount_coupon']=bcadd($info['amount_coupon'],$goods['amount_coupon']);
  189. $info['amount_coupon_kill']=bcadd($info['amount_coupon_kill'],$goods['amount_coupon_kill']);
  190. $info['amount_install']=bcadd($info['amount_install'],$goods['amount_install']);
  191. }
  192. if($this->coupon_use && !$injectCoupon){
  193. $this->error('优惠券不符合使用规则');
  194. }
  195. $info['amount_discount']=bcAddAll($info['amount_discount'],$info['amount_coupon'],$info['amount_coupon_kill']);
  196. #删除购物车
  197. if($this->isClearCart()){
  198. $this->getUser()
  199. ->cart()
  200. ->whereIn('goods_sku_id',$skuIds)
  201. ->delete();
  202. }
  203. return $info;
  204. }
  205. protected function getAmount($sku,$goods){
  206. $amountArr=[0,0,$sku['amount']];
  207. if(KillService::open() && $goods['is_kill']){
  208. $amountArr[0]=$sku['amount_kill'];
  209. $amountArr[1]=bcsub($sku['amount'],$sku['amount_kill']);
  210. }else{
  211. $amountArr[0]=$sku['amount'];
  212. }
  213. return $amountArr;
  214. }
  215. }