OrderService.php 8.1 KB

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