ShopOrder.php 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304
  1. <?php
  2. namespace app\api\controller\v1;
  3. use app\common\model\ShopGoodsModel;
  4. use app\common\model\ShopOrderModel;
  5. use app\common\model\UserAddressModel as UserAddress;
  6. use app\common\service\ShopGoodsService;
  7. use app\Request;
  8. use think\facade\Db;
  9. use think\Response;
  10. /**
  11. * 商城订单 by wes
  12. * Class ShopOrder
  13. * @package app\api\controller\v1
  14. */
  15. class ShopOrder
  16. {
  17. /**
  18. * 订单列表
  19. */
  20. public function orderList(Request $request)
  21. {
  22. try {
  23. return api_succ_return(['msg' => '获取成功', 'data' => ShopOrderModel::list($request->only(['status', 'order_type']), $request->only(['page', 'limit']), $request->uid)]);
  24. } catch (\Exception $e) {
  25. return api_error_return('获取失败' . $e->getMessage());
  26. }
  27. }
  28. /**
  29. * 订单详情
  30. */
  31. public function orderDetail(Request $request): Response
  32. {
  33. try {
  34. return api_succ_return(['msg' => '获取成功', 'data' => ShopOrderModel::details($request->only(['order_sn']), $request->uid)]);
  35. } catch (\Exception $e) {
  36. return api_error_return('获取失败' . $e->getMessage());
  37. }
  38. }
  39. /**
  40. * 下单商品详情
  41. */
  42. public function buyDetail(Request $request)
  43. {
  44. $buy_goods = $request->post('buy_goods');
  45. $address = $request->post('address_id');
  46. if (empty($buy_goods)) {
  47. return api_error_return('参数错误');
  48. }
  49. try {
  50. $buy_goods = json_decode(html_entity_decode($buy_goods), true);
  51. if (empty($buy_goods)) {
  52. return api_error_return('商品参数错误,请返回刷新重新下单');
  53. }
  54. foreach ($buy_goods as $k => $v) {
  55. $goodsInfo = ShopGoodsModel::where(['goods_sn' => $v['goods_sn']])->field('goods_type')->find();
  56. if (!$goodsInfo) {
  57. return api_error_return('下单失败,请返回刷新列表');
  58. }
  59. }
  60. if (empty($address)) {
  61. //用户默认收货地址
  62. $address = UserAddress::where(['uid' => $request->uid, 'is_default' => 1])->field('id,province,city,county,name,mobile,remark,is_default,mergename')->findOrEmpty()->toArray();
  63. } else {
  64. $address = UserAddress::where(['uid' => $request->uid, 'id' => $address])->field('id,province,city,county,name,mobile,remark,is_default,mergename')->findOrEmpty()->toArray();
  65. }
  66. // if (!$address){
  67. // return api_error_return('地址获取失败');
  68. // }
  69. $data = ShopOrderModel::buyDetails($buy_goods, $address);
  70. if (empty($data)) {
  71. return api_error_return('获取失败');
  72. }
  73. $cur_xzmoney = Db::name('system_config')->where('name', 'xz_cur_money')->where('group', 'xzconfig')->value('value');
  74. foreach ($data['details'] as $key => $val) {
  75. foreach ($val['goods'] as $k1 => $v1) {
  76. $goods_name = $v1['goods_name'];
  77. $goods_name = str_replace(' ', '', $goods_name);
  78. if (strlen($goods_name) > 20) {
  79. $goods_name = substr($goods_name, 0, 19);
  80. }
  81. // $data['details'][$key]['goods'][$k1]['goods_name'] = mb_convert_encoding($goods_name, 'UTF-8', 'UTF-8');
  82. // $data['details'][$key]['goods'][$k1]['goods_name'] = '云德商品购买';
  83. if ($v1['goods_type'] == 5) {
  84. $data['details'][$key]['goods'][$k1]['price'] = getXzPirceWithPrice($cur_xzmoney, $data['details'][$key]['goods'][$k1]['price']);
  85. $data['details'][$key]['goods'][$k1]['total_fee'] = getXzPirceWithPrice($cur_xzmoney, $data['details'][$key]['goods'][$k1]['total_fee']);
  86. }
  87. }
  88. }
  89. // if ($order_type == 5){
  90. //
  91. // foreach ($data['details'] as $key=>$val){
  92. //// ['total_price'] = getXzPirceWithPrice($cur_xzmoney, $data['total_price']);
  93. // $data['details'][$key]['total_price']= getXzPirceWithPrice($cur_xzmoney, $val['total_price']);
  94. // $data['details'][$key]['payment']= getXzPirceWithPrice($cur_xzmoney, $val['payment']);
  95. //
  96. // }
  97. //
  98. // $data['total']['count_payment'] = getXzPirceWithPrice($cur_xzmoney, $data['total']['count_payment']);
  99. //
  100. // }
  101. return api_succ_return(['msg' => '获取成功', 'data' => ['address' => (object)$address, 'buyDetail' => $data['details'], 'total' => $data['total']]]);
  102. } catch (\Exception $e) {
  103. return api_error_return($e->getMessage());
  104. }
  105. }
  106. /**
  107. * 商城下单购买商品
  108. * @param Request $request
  109. * @return Response
  110. * @throws \think\db\exception\DataNotFoundException
  111. * @throws \think\db\exception\DbException
  112. * @throws \think\db\exception\ModelNotFoundException
  113. */
  114. public function createOrder(Request $request)
  115. {
  116. $addressId = $request->post('address', '');
  117. $remark = $request->post('order_remark', '');
  118. $payType = $request->post('pay_type', 0);
  119. $payType = $payType == 3 ? $payType : 99; // 因收银台功能过滤支付方式
  120. // 购买商品参数
  121. $buyGoods = json_decode(html_entity_decode($request->post('buy_goods', '')), true);
  122. if ($request->user['status'] == 0) {
  123. return api_error_return('用户被禁用');
  124. }
  125. if ($request->user['is_reward'] == 0) {
  126. return api_error_return('用户已被禁止交易');
  127. }
  128. // 重复提交拦截
  129. $cacheKeyLock = "caches:orders:createLock:{$request->uid}";
  130. try {
  131. $orderGoods = [];
  132. $order_type = 1; // 1 买商品送积分 2积分兑换 3任务包兑换券 4提货券 5 星钻兑换
  133. foreach ($buyGoods as $k => $v) {
  134. $goodsSn = isset($v['goods_sn'])? trim($v['goods_sn']) : 0;
  135. $specId = isset($v['spec_id'])? trim($v['spec_id']) : 0;
  136. $orderGoods["{$goodsSn}_{$specId}"][] = $v;
  137. $num = isset($v['num']) ? intval($v['num']) : 0;
  138. if ($num < 1) {
  139. return api_error_return("请先选择商品数量哦");
  140. }
  141. $goodsInfo = ShopGoodsService::make()->getCacheInfo($v['goods_sn']);
  142. if (!$goodsInfo) {
  143. return api_error_return('商品参数错误或已下架,请返回刷新列表');
  144. }
  145. if ($goodsInfo['goods_type'] == 2) {
  146. return api_error_return('福袋商品不能购买');
  147. }
  148. if ($goodsInfo['restrictions_num'] > 0) {
  149. $count = Db::name('shop_order_goods')
  150. ->alias('og')
  151. ->leftJoin('shop_order o', 'o.order_id = og.order_id')
  152. ->where('o.status', 'in', [1, 2, 4])
  153. ->where('og.uid', $request->uid)
  154. ->count('og.og_id');
  155. if ($count > $goodsInfo['restrictions_num']) {
  156. return api_error_return('超过限购');
  157. }
  158. if ($v['num'] + $count > $goodsInfo['restrictions_num']) {
  159. return api_error_return('超过限购数量,还可购买:' . ($goodsInfo['restrictions_num'] - $count) . '件');
  160. }
  161. }
  162. }
  163. if (!$userAddress = UserAddress::getAddressIdDetails((int)$addressId)) {
  164. return api_error_return('获取收货地址失败');
  165. }
  166. if ($userAddress['uid'] != $request->user['id']) {
  167. return api_error_return('收货地址信息异常');
  168. }
  169. if (empty($buy_goods)) {
  170. return api_error_return('参数错误2');
  171. }
  172. foreach ($buy_goods as $key => $value) {
  173. $result[$value['goods_sn'] . '_' . $value['spec_id']][] = $value;
  174. }
  175. if (!ShopOrderModel::checkStock($result)) {
  176. return api_error_return('下单失败,所选商品含有库存不足的商品');
  177. }
  178. try {
  179. $data = ShopOrderModel::buyDetails($buy_goods, $userAddress);
  180. $supplier_name = $data['details'][0]['supplier_name'];
  181. $paymoney = $data['total']['count_payment'];
  182. $count = Db::name('shop_order')->where('user_id', $request->uid)->where('order_type', 1)->where('status', 0)->whereTime('created_time', '-2 hours')->count();
  183. if ($count > 20) {
  184. return api_error_return('未支付的订单太多,创建失败');
  185. }
  186. // 订单处理数据
  187. $orderData = [
  188. 'order' => $result,
  189. 'address' => $userAddress,
  190. 'cls' => 0,
  191. 'cart_ids' => 0,
  192. 'pay_type' => $payType,
  193. 'order_remark' => $remark,
  194. 'order_type' => $order_type,
  195. 'supplier_name' => $supplier_name
  196. ];
  197. $flag = ShopOrderModel::createOrder($orderData, $request->uid, $request->user, $data, $request->post('cart_id', ''));
  198. if (!$flag) {
  199. return api_error_return('下单失败');
  200. }
  201. return api_succ_return(['msg' => '下单成功', 'data' => ['order_ids' => $flag['data']]]);
  202. } catch (\Exception $e) {
  203. return api_error_return('下单失败 ' . $e->getMessage());
  204. }
  205. } catch (\Exception $e) {
  206. return api_error_return($e->getMessage());
  207. }
  208. }
  209. /**
  210. * 取消订单
  211. */
  212. public function cancelOrder(Request $request): Response
  213. {
  214. if (empty($request->only(['order_sn']))) {
  215. return api_error_return('订单号不能为空');
  216. }
  217. Db::startTrans();
  218. try {
  219. ShopOrderModel::cancelOrder($request->only(['order_sn']), $request->uid);
  220. Db::commit();
  221. } catch (\Exception $e) {
  222. Db::rollback();
  223. return api_error_return('取消失败' . $e->getMessage());
  224. }
  225. return api_succ_return('取消成功');
  226. }
  227. /**
  228. * 确认订单
  229. */
  230. public function receiveOrder(Request $request): Response
  231. {
  232. if (empty($request->only(['order_sn']))) {
  233. return api_error_return('订单号不能为空');
  234. }
  235. Db::startTrans();
  236. try {
  237. ShopOrderModel::receiveOrder($request->only(['order_sn']), $request->uid);
  238. Db::commit();
  239. } catch (\Exception $e) {
  240. Db::rollback();
  241. return api_error_return('确认失败' . $e->getMessage());
  242. }
  243. return api_succ_return('确认成功');
  244. }
  245. }