StoreOrder.php 15 KB

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