StoreOrder.php 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356
  1. <?php
  2. // +----------------------------------------------------------------------
  3. // | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
  4. // +----------------------------------------------------------------------
  5. // | Copyright (c) 2016~2022 https://www.crmeb.com All rights reserved.
  6. // +----------------------------------------------------------------------
  7. // | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
  8. // +----------------------------------------------------------------------
  9. // | Author: CRMEB Team <admin@crmeb.com>
  10. // +----------------------------------------------------------------------
  11. namespace app\controller\api\store\order;
  12. use app\common\model\user\User;
  13. use app\common\repositories\delivery\DeliveryOrderRepository;
  14. use app\common\repositories\store\order\StoreOrderCreateRepository;
  15. use app\common\repositories\store\order\StoreOrderReceiptRepository;
  16. use app\common\repositories\user\UserBillRepository;
  17. use app\common\repositories\user\UserRepository;
  18. use app\validate\api\UserReceiptValidate;
  19. use crmeb\basic\BaseController;
  20. use app\common\repositories\store\order\StoreCartRepository;
  21. use app\common\repositories\store\order\StoreGroupOrderRepository;
  22. use app\common\repositories\store\order\StoreOrderRepository;
  23. use app\common\repositories\store\product\ProductRepository;
  24. use crmeb\services\ExpressService;
  25. use crmeb\services\LockService;
  26. use think\App;
  27. use think\exception\ValidateException;
  28. /**
  29. * Class StoreOrder
  30. * @package app\controller\api\store\order
  31. * @author xaboy
  32. * @day 2020/6/10
  33. */
  34. class StoreOrder extends BaseController
  35. {
  36. /**
  37. * @var StoreOrderRepository
  38. */
  39. protected $repository;
  40. /**
  41. * StoreOrder constructor.
  42. * @param App $app
  43. * @param StoreOrderRepository $repository
  44. */
  45. public function __construct(App $app, StoreOrderRepository $repository)
  46. {
  47. parent::__construct($app);
  48. $this->repository = $repository;
  49. }
  50. public function v2CheckOrder(StoreCartRepository $cartRepository, StoreOrderCreateRepository $orderCreateRepository)
  51. {
  52. $cartId = (array)$this->request->param('cart_id', []);
  53. $addressId = (int)$this->request->param('address_id');
  54. $couponIds = (array)$this->request->param('use_coupon', []);
  55. $takes = (array)$this->request->param('takes', []);
  56. $useIntegral = (bool)$this->request->param('use_integral', false);
  57. $user = $this->request->userInfo();
  58. $uid = $user->uid;
  59. if (!($count = count($cartId)) || $count != count($cartRepository->validIntersection($cartId, $uid)))
  60. return app('json')->fail('数据无效');
  61. $orderInfo = $orderCreateRepository->v2CartIdByOrderInfo($user, $cartId, $takes, $couponIds, $useIntegral, $addressId);
  62. return app('json')->success($orderInfo);
  63. }
  64. public function v2CreateOrder(StoreCartRepository $cartRepository, StoreOrderCreateRepository $orderCreateRepository,ProductRepository $ProductRepository)
  65. {
  66. $cartId = (array)$this->request->param('cart_id', []);
  67. $addressId = (int)$this->request->param('address_id');
  68. $couponIds = (array)$this->request->param('use_coupon', []);
  69. $takes = (array)$this->request->param('takes', []);
  70. $useIntegral = (bool)$this->request->param('use_integral', false);
  71. $receipt_data = (array)$this->request->param('receipt_data', []);
  72. $extend = (array)$this->request->param('extend', []);
  73. $mark = (array)$this->request->param('mark', []);
  74. $payType = $this->request->param('pay_type');
  75. $is_percentage = (int)$this->request->param('is_percentage',0); //0.正常购买 1.百分比支付
  76. $post = (array)$this->request->param('post');
  77. $isPc = $payType === 'pc';
  78. if ($isPc) {
  79. $payType = 'balance';
  80. }
  81. if($is_percentage == 1){ //多个商品不能用百分比支付
  82. if(count($cartId) > 1){
  83. return app('json')->fail('参数错误');
  84. }
  85. //如果商品没设置支付百分比也不能选择百分比支付
  86. $cart_info = $cartRepository->findOrCreate(array('cart_id'=>$cartId[0]));
  87. $product_info = $ProductRepository->findOrCreate(array('product_id'=>$cart_info->product_id));
  88. if(empty($product_info->pay_percentage)){
  89. return app('json')->fail('该商品不支持百分比支付');
  90. }
  91. }
  92. if (!in_array($payType, StoreOrderRepository::PAY_TYPE, true))
  93. return app('json')->fail('请选择正确的支付方式');
  94. $validate = app()->make(UserReceiptValidate::class);
  95. foreach ($receipt_data as $receipt) {
  96. if (!is_array($receipt)) throw new ValidateException('发票信息有误');
  97. $validate->check($receipt);
  98. }
  99. $uid = $this->request->uid();
  100. if (!($count = count($cartId)) || $count != count($cartRepository->validIntersection($cartId, $uid)))
  101. return app('json')->fail('数据无效');
  102. // if (!$addressId)
  103. // return app('json')->fail('请选择地址');
  104. $groupOrder = app()->make(LockService::class)->exec('order.create', function () use ($orderCreateRepository, $receipt_data, $mark, $extend, $cartId, $payType, $takes, $couponIds, $useIntegral, $addressId, $post,$is_percentage) {
  105. return $orderCreateRepository->v2CreateOrder(array_search($payType, StoreOrderRepository::PAY_TYPE), $this->request->userInfo(), $cartId, $extend, $mark, $receipt_data, $takes, $couponIds, $useIntegral, $addressId, $post,$is_percentage);
  106. });
  107. if ($groupOrder['pay_price'] == 0) {
  108. $this->repository->paySuccess($groupOrder);
  109. return app('json')->status('success', '支付成功', ['order_id' => $groupOrder['group_order_id']]);
  110. }
  111. if ($isPc) {
  112. return app('json')->success(['order_id' => $groupOrder->group_order_id]);
  113. }
  114. try {
  115. return $this->repository->pay($payType, $this->request->userInfo(), $groupOrder, $this->request->param('return_url'), $this->request->isApp());
  116. } catch (\Exception $e) {
  117. return app('json')->status('error', $e->getMessage(), ['order_id' => $groupOrder->group_order_id]);
  118. }
  119. }
  120. /**
  121. * @return mixed
  122. * @throws \think\db\exception\DataNotFoundException
  123. * @throws \think\db\exception\DbException
  124. * @throws \think\db\exception\ModelNotFoundException
  125. * @author xaboy
  126. * @day 2020/6/10
  127. */
  128. public function lst()
  129. {
  130. [$page, $limit] = $this->getPage();
  131. $where['status'] = $this->request->param('status');
  132. $where['search'] = $this->request->param('store_name');
  133. $where['uid'] = $this->request->uid();
  134. $where['paid'] = 1;
  135. $where['is_user'] = 1;
  136. return app('json')->success($this->repository->getList($where, $page, $limit));
  137. }
  138. /**
  139. * @param $id
  140. * @return mixed
  141. * @author xaboy
  142. * @day 2020/6/10
  143. */
  144. public function detail($id)
  145. {
  146. $order = $this->repository->getDetail((int)$id, $this->request->uid());
  147. if (!$order)
  148. return app('json')->fail('订单不存在');
  149. if ($order->order_type == 1) {
  150. $order->append(['take', 'refund_status']);
  151. }
  152. return app('json')->success($order->toArray());
  153. }
  154. /**
  155. * @return mixed
  156. * @author xaboy
  157. * @day 2020/6/10
  158. */
  159. public function number()
  160. {
  161. return app('json')->success(['orderPrice' => $this->request->userInfo()->pay_price] + $this->repository->userOrderNumber($this->request->uid()));
  162. }
  163. /**
  164. * @param StoreGroupOrderRepository $groupOrderRepository
  165. * @return mixed
  166. * @author xaboy
  167. * @day 2020/6/10
  168. */
  169. public function groupOrderList(StoreGroupOrderRepository $groupOrderRepository)
  170. {
  171. [$page, $limit] = $this->getPage();
  172. $list = $groupOrderRepository->getList(['uid' => $this->request->uid(), 'paid' => 0], $page, $limit);
  173. return app('json')->success($list);
  174. }
  175. /**
  176. * @param $id
  177. * @param StoreGroupOrderRepository $groupOrderRepository
  178. * @return mixed
  179. * @author xaboy
  180. * @day 2020/6/10
  181. */
  182. public function groupOrderDetail($id, StoreGroupOrderRepository $groupOrderRepository)
  183. {
  184. $groupOrder = $groupOrderRepository->detail($this->request->uid(), (int)$id);
  185. if (!$groupOrder)
  186. return app('json')->fail('订单不存在');
  187. else
  188. return app('json')->success($groupOrder->append(['cancel_time', 'cancel_unix'])->toArray());
  189. }
  190. public function groupOrderStatus($id, StoreGroupOrderRepository $groupOrderRepository)
  191. {
  192. $groupOrder = $groupOrderRepository->status($this->request->uid(), intval($id));
  193. if (!$groupOrder)
  194. return app('json')->fail('订单不存在');
  195. if ($groupOrder->paid) $groupOrder->append(['give_coupon']);
  196. $activity_type = 0;
  197. $activity_id = 0;
  198. foreach ($groupOrder->orderList as $order) {
  199. $activity_type = max($order->activity_type, $activity_type);
  200. if ($order->activity_type == 4 && $groupOrder->paid) {
  201. $order->append(['orderProduct']);
  202. $activity_id = $order->orderProduct[0]['activity_id'];
  203. }
  204. }
  205. $groupOrder->activity_type = $activity_type;
  206. $groupOrder->activity_id = $activity_id;
  207. return app('json')->success($groupOrder->toArray());
  208. }
  209. /**
  210. * @param $id
  211. * @param StoreGroupOrderRepository $groupOrderRepository
  212. * @return mixed
  213. * @author xaboy
  214. * @day 2020/6/10
  215. */
  216. public function cancelGroupOrder($id, StoreGroupOrderRepository $groupOrderRepository)
  217. {
  218. $groupOrderRepository->cancel((int)$id, $this->request->uid());
  219. return app('json')->success('取消成功');
  220. }
  221. public function groupOrderPay($id, StoreGroupOrderRepository $groupOrderRepository)
  222. {
  223. //TODO 佣金结算,佣金退回,物流查询
  224. $type = $this->request->param('type');
  225. if (!in_array($type, StoreOrderRepository::PAY_TYPE))
  226. return app('json')->fail('请选择正确的支付方式');
  227. $groupOrder = $groupOrderRepository->detail($this->request->uid(), (int)$id, false);
  228. if (!$groupOrder)
  229. return app('json')->fail('订单不存在或已支付');
  230. $this->repository->changePayType($groupOrder, array_search($type, StoreOrderRepository::PAY_TYPE));
  231. if ($groupOrder['pay_price'] == 0) {
  232. $this->repository->paySuccess($groupOrder);
  233. return app('json')->status('success', '支付成功', ['order_id' => $groupOrder['group_order_id']]);
  234. }
  235. try {
  236. return $this->repository->pay($type, $this->request->userInfo(), $groupOrder, $this->request->param('return_url'), $this->request->isApp());
  237. } catch (\Exception $e) {
  238. return app('json')->status('error', $e->getMessage(), ['order_id' => $groupOrder->group_order_id]);
  239. }
  240. }
  241. public function take($id)
  242. {
  243. $this->repository->takeOrder($id, $this->request->userInfo());
  244. return app('json')->success('确认收货成功');
  245. }
  246. public function express($id)
  247. {
  248. $order = $this->repository->getWhere(['order_id' => $id, 'is_del' => 0]);
  249. if (!$order)
  250. return app('json')->fail('订单不存在');
  251. if (!$order->delivery_type || !$order->delivery_id)
  252. return app('json')->fail('订单未发货');
  253. $express = $this->repository->express($id,null);
  254. $order->append(['orderProduct']);
  255. return app('json')->success(compact('express', 'order'));
  256. }
  257. public function verifyCode($id)
  258. {
  259. $order = $this->repository->getWhere(['order_id' => $id, 'uid' => $this->request->uid(), 'is_del' => 0, 'order_type' => 1]);
  260. if (!$order)
  261. return app('json')->fail('订单状态有误');
  262. return app('json')->success(['qrcode' => $this->repository->wxQrcode($id, $order->verify_code)]);
  263. }
  264. public function del($id)
  265. {
  266. $this->repository->userDel($id, $this->request->uid());
  267. return app('json')->success('删除成功');
  268. }
  269. public function createReceipt($id)
  270. {
  271. $data = $this->request->params(['receipt_type' , 'receipt_title' , 'duty_paragraph', 'receipt_title_type', 'bank_name', 'bank_code', 'address','tel', 'email']);
  272. $order = $this->repository->getWhere(['order_id' => $id, 'uid' => $this->request->uid(), 'is_del' => 0]);
  273. if (!$order) return app('json')->fail('订单不属于您或不存在');
  274. app()->make(StoreOrderReceiptRepository::class)->add($data, $order);
  275. return app('json')->success('操作成功');
  276. }
  277. public function getOrderDelivery($id, DeliveryOrderRepository $orderRepository)
  278. {
  279. $res = $orderRepository->show($id, $this->request->uid());
  280. return app('json')->success($res);
  281. }
  282. /**
  283. * @param $id
  284. * @return mixed
  285. * @author xaboy
  286. * @day 2020/6/10
  287. */
  288. public function finalPayment(UserRepository $repository,User $user)
  289. {
  290. $payType = $this->request->param('pay_type');
  291. $id = $this->request->param('id');
  292. if(empty($payType) || empty($id)){
  293. return app('json')->fail('参数错误');
  294. }
  295. $order = $this->repository->getDetail((int)$id, $this->request->uid());
  296. if (!$order)
  297. return app('json')->fail('订单不存在');
  298. if ($order->status != 4 || $order->residue_percentage <= 0) {
  299. return app('json')->fail('订单信息有误');
  300. }
  301. $pay_money = sprintf('%.2f',$order->residue_percentage * $order->total_price / 100);
  302. if($pay_money <= 0){
  303. return app('json')->fail('支付金额不正确');
  304. }
  305. if($payType == 'balance'){
  306. if (!systemConfig('yue_pay_status'))
  307. throw new ValidateException('未开启余额支付');
  308. if ($user['now_money'] < $pay_money)
  309. throw new ValidateException('余额不足,请更换支付方式');
  310. $user->now_money = bcsub($user->now_money, $pay_money, 2);
  311. $user->save();
  312. $userBillRepository = app()->make(UserBillRepository::class);
  313. $userBillRepository->decBill($user['uid'], 'now_money', 'pay_product', [
  314. 'link_id' => $id,
  315. 'status' => 1,
  316. 'title' => '购买商品支付尾款',
  317. 'number' => $pay_money,
  318. 'mark' => '余额支付支付' . floatval($pay_money) . '元支付改订单尾款',
  319. 'balance' => $user->now_money
  320. ]);
  321. //更改订单状态
  322. $order->status = 0;
  323. $order->save();
  324. }
  325. return app('json')->success('支付成功');
  326. }
  327. }