| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304 |
- <?php
- namespace app\api\controller\v1;
- use app\common\model\ShopGoodsModel;
- use app\common\model\ShopOrderModel;
- use app\common\model\UserAddressModel as UserAddress;
- use app\common\service\ShopGoodsService;
- use app\Request;
- use think\facade\Db;
- use think\Response;
- /**
- * 商城订单 by wes
- * Class ShopOrder
- * @package app\api\controller\v1
- */
- class ShopOrder
- {
- /**
- * 订单列表
- */
- public function orderList(Request $request)
- {
- try {
- return api_succ_return(['msg' => '获取成功', 'data' => ShopOrderModel::list($request->only(['status', 'order_type']), $request->only(['page', 'limit']), $request->uid)]);
- } catch (\Exception $e) {
- return api_error_return('获取失败' . $e->getMessage());
- }
- }
- /**
- * 订单详情
- */
- public function orderDetail(Request $request): Response
- {
- try {
- return api_succ_return(['msg' => '获取成功', 'data' => ShopOrderModel::details($request->only(['order_sn']), $request->uid)]);
- } catch (\Exception $e) {
- return api_error_return('获取失败' . $e->getMessage());
- }
- }
- /**
- * 下单商品详情
- */
- public function buyDetail(Request $request)
- {
- $buy_goods = $request->post('buy_goods');
- $address = $request->post('address_id');
- if (empty($buy_goods)) {
- return api_error_return('参数错误');
- }
- try {
- $buy_goods = json_decode(html_entity_decode($buy_goods), true);
- if (empty($buy_goods)) {
- return api_error_return('商品参数错误,请返回刷新重新下单');
- }
- foreach ($buy_goods as $k => $v) {
- $goodsInfo = ShopGoodsModel::where(['goods_sn' => $v['goods_sn']])->field('goods_type')->find();
- if (!$goodsInfo) {
- return api_error_return('下单失败,请返回刷新列表');
- }
- }
- if (empty($address)) {
- //用户默认收货地址
- $address = UserAddress::where(['uid' => $request->uid, 'is_default' => 1])->field('id,province,city,county,name,mobile,remark,is_default,mergename')->findOrEmpty()->toArray();
- } else {
- $address = UserAddress::where(['uid' => $request->uid, 'id' => $address])->field('id,province,city,county,name,mobile,remark,is_default,mergename')->findOrEmpty()->toArray();
- }
- // if (!$address){
- // return api_error_return('地址获取失败');
- // }
- $data = ShopOrderModel::buyDetails($buy_goods, $address);
- if (empty($data)) {
- return api_error_return('获取失败');
- }
- $cur_xzmoney = Db::name('system_config')->where('name', 'xz_cur_money')->where('group', 'xzconfig')->value('value');
- foreach ($data['details'] as $key => $val) {
- foreach ($val['goods'] as $k1 => $v1) {
- $goods_name = $v1['goods_name'];
- $goods_name = str_replace(' ', '', $goods_name);
- if (strlen($goods_name) > 20) {
- $goods_name = substr($goods_name, 0, 19);
- }
- // $data['details'][$key]['goods'][$k1]['goods_name'] = mb_convert_encoding($goods_name, 'UTF-8', 'UTF-8');
- // $data['details'][$key]['goods'][$k1]['goods_name'] = '云德商品购买';
- if ($v1['goods_type'] == 5) {
- $data['details'][$key]['goods'][$k1]['price'] = getXzPirceWithPrice($cur_xzmoney, $data['details'][$key]['goods'][$k1]['price']);
- $data['details'][$key]['goods'][$k1]['total_fee'] = getXzPirceWithPrice($cur_xzmoney, $data['details'][$key]['goods'][$k1]['total_fee']);
- }
- }
- }
- // if ($order_type == 5){
- //
- // foreach ($data['details'] as $key=>$val){
- //// ['total_price'] = getXzPirceWithPrice($cur_xzmoney, $data['total_price']);
- // $data['details'][$key]['total_price']= getXzPirceWithPrice($cur_xzmoney, $val['total_price']);
- // $data['details'][$key]['payment']= getXzPirceWithPrice($cur_xzmoney, $val['payment']);
- //
- // }
- //
- // $data['total']['count_payment'] = getXzPirceWithPrice($cur_xzmoney, $data['total']['count_payment']);
- //
- // }
- return api_succ_return(['msg' => '获取成功', 'data' => ['address' => (object)$address, 'buyDetail' => $data['details'], 'total' => $data['total']]]);
- } catch (\Exception $e) {
- return api_error_return($e->getMessage());
- }
- }
- /**
- * 商城下单购买商品
- * @param Request $request
- * @return Response
- * @throws \think\db\exception\DataNotFoundException
- * @throws \think\db\exception\DbException
- * @throws \think\db\exception\ModelNotFoundException
- */
- public function createOrder(Request $request)
- {
- $addressId = $request->post('address', '');
- $remark = $request->post('order_remark', '');
- $payType = $request->post('pay_type', 0);
- $payType = $payType == 3 ? $payType : 99; // 因收银台功能过滤支付方式
- // 购买商品参数
- $buyGoods = json_decode(html_entity_decode($request->post('buy_goods', '')), true);
- if ($request->user['status'] == 0) {
- return api_error_return('用户被禁用');
- }
- if ($request->user['is_reward'] == 0) {
- return api_error_return('用户已被禁止交易');
- }
- // 重复提交拦截
- $cacheKeyLock = "caches:orders:createLock:{$request->uid}";
- try {
- $orderGoods = [];
- $order_type = 1; // 1 买商品送积分 2积分兑换 3任务包兑换券 4提货券 5 星钻兑换
- foreach ($buyGoods as $k => $v) {
- $goodsSn = isset($v['goods_sn'])? trim($v['goods_sn']) : 0;
- $specId = isset($v['spec_id'])? trim($v['spec_id']) : 0;
- $orderGoods["{$goodsSn}_{$specId}"][] = $v;
- $num = isset($v['num']) ? intval($v['num']) : 0;
- if ($num < 1) {
- return api_error_return("请先选择商品数量哦");
- }
- $goodsInfo = ShopGoodsService::make()->getCacheInfo($v['goods_sn']);
- if (!$goodsInfo) {
- return api_error_return('商品参数错误或已下架,请返回刷新列表');
- }
- if ($goodsInfo['goods_type'] == 2) {
- return api_error_return('福袋商品不能购买');
- }
- if ($goodsInfo['restrictions_num'] > 0) {
- $count = Db::name('shop_order_goods')
- ->alias('og')
- ->leftJoin('shop_order o', 'o.order_id = og.order_id')
- ->where('o.status', 'in', [1, 2, 4])
- ->where('og.uid', $request->uid)
- ->count('og.og_id');
- if ($count > $goodsInfo['restrictions_num']) {
- return api_error_return('超过限购');
- }
- if ($v['num'] + $count > $goodsInfo['restrictions_num']) {
- return api_error_return('超过限购数量,还可购买:' . ($goodsInfo['restrictions_num'] - $count) . '件');
- }
- }
- }
- if (!$userAddress = UserAddress::getAddressIdDetails((int)$addressId)) {
- return api_error_return('获取收货地址失败');
- }
- if ($userAddress['uid'] != $request->user['id']) {
- return api_error_return('收货地址信息异常');
- }
- if (empty($buy_goods)) {
- return api_error_return('参数错误2');
- }
- foreach ($buy_goods as $key => $value) {
- $result[$value['goods_sn'] . '_' . $value['spec_id']][] = $value;
- }
- if (!ShopOrderModel::checkStock($result)) {
- return api_error_return('下单失败,所选商品含有库存不足的商品');
- }
- try {
- $data = ShopOrderModel::buyDetails($buy_goods, $userAddress);
- $supplier_name = $data['details'][0]['supplier_name'];
- $paymoney = $data['total']['count_payment'];
- $count = Db::name('shop_order')->where('user_id', $request->uid)->where('order_type', 1)->where('status', 0)->whereTime('created_time', '-2 hours')->count();
- if ($count > 20) {
- return api_error_return('未支付的订单太多,创建失败');
- }
- // 订单处理数据
- $orderData = [
- 'order' => $result,
- 'address' => $userAddress,
- 'cls' => 0,
- 'cart_ids' => 0,
- 'pay_type' => $payType,
- 'order_remark' => $remark,
- 'order_type' => $order_type,
- 'supplier_name' => $supplier_name
- ];
- $flag = ShopOrderModel::createOrder($orderData, $request->uid, $request->user, $data, $request->post('cart_id', ''));
- if (!$flag) {
- return api_error_return('下单失败');
- }
- return api_succ_return(['msg' => '下单成功', 'data' => ['order_ids' => $flag['data']]]);
- } catch (\Exception $e) {
- return api_error_return('下单失败 ' . $e->getMessage());
- }
- } catch (\Exception $e) {
- return api_error_return($e->getMessage());
- }
- }
- /**
- * 取消订单
- */
- public function cancelOrder(Request $request): Response
- {
- if (empty($request->only(['order_sn']))) {
- return api_error_return('订单号不能为空');
- }
- Db::startTrans();
- try {
- ShopOrderModel::cancelOrder($request->only(['order_sn']), $request->uid);
- Db::commit();
- } catch (\Exception $e) {
- Db::rollback();
- return api_error_return('取消失败' . $e->getMessage());
- }
- return api_succ_return('取消成功');
- }
- /**
- * 确认订单
- */
- public function receiveOrder(Request $request): Response
- {
- if (empty($request->only(['order_sn']))) {
- return api_error_return('订单号不能为空');
- }
- Db::startTrans();
- try {
- ShopOrderModel::receiveOrder($request->only(['order_sn']), $request->uid);
- Db::commit();
- } catch (\Exception $e) {
- Db::rollback();
- return api_error_return('确认失败' . $e->getMessage());
- }
- return api_succ_return('确认成功');
- }
- }
|