_validate([ 'coupon_id|优惠券'=>['integer','requireIf:coupon_use,1'], 'form|商品'=>['require','array','min:1'], 'frm|来源'=>['require','in:1,2'], ]); $user=$this->auth->getUser(); $goods=$data['form']; $service=new OrderService(); $service->setUser($user); $service->setGoods($goods); $service->setFrm($data['frm']); $service->setCouponUse($data['coupon_use']??false); $service->setCouponId($data['coupon_id']??0); $info=$service->calculate(); $this->success('',$info); } /** * 提交订单 * @ApiMethod (POST) * @ApiParams (name=frm,description="来源1直接下单2购物车") * @ApiParams (name=form,description="key为规格id,对象:num购买数量,num_install安装数量,{1:{num:1,num_install:2}}") * @ApiParams (name=coupon_use,description=是否使用优惠券) * @ApiParams (name=coupon_id,description=优惠券id) * @ApiParams (name=remark,description=留言) * @ApiParams (name=address_id,description=收货地址id) * @ApiParams (name=is_tax,description=是1否0需要开票) * @ApiParams (name=tax,description=发票信息) * @ApiParams (name=tax.paper_type,description=1电子2纸质) * @ApiParams (name=tax.self_type,description=1专票2普票) * @ApiParams (name=tax.u_type,description=1个人2企业) * @ApiParams (name=tax.name,description=姓名1个人时候必须) * @ApiParams (name=tax.open_name,description=开户名称u_type2时候必须) * @ApiParams (name=tax.bank_name,description=开户行u_type2时候必须) * @ApiParams (name=tax.tax_no,description=税号u_type2时候必须) */ public function create(){ $data=$this->_validate([ 'coupon_id|优惠券'=>['integer','requireIf:coupon_use,1'], 'form|商品'=>['require','array','min:1'], 'frm|来源'=>['require','in:1,2'], 'remark|备注'=>['max:50'], 'address_id|收货地址'=>['require','integer','gt:0'], ]); $this->validateTax(); $user=$this->auth->getUser(); $address=$user->address()->find($data['address_id']); abortIf(!$address,'地址不存在'); $goods=$data['form']; $service=new OrderService(); $service->setUser($user); $service->setGoods($goods); $service->setFrm(1); $service->setSubmit(true); $service->setClearCart(true); $service->setCouponUse($data['coupon_use']??false); $service->setCouponId($data['coupon_id']??0); Db::startTrans(); $info=$service->calculate(); $order=new Order(); $order['user_id']=$user['id']; $order['order_no']=order_no(); $order['amount_total']=$info['amount_total']; $order['amount_pay']=$info['amount_pay']; $order['amount_install']=$info['amount_install']; $order['amount_coupon']=$info['amount_coupon']; $order['amount_coupon_kill']=$info['amount_coupon_kill']; $order['amount_coupon_level']=$info['amount_coupon_level']; $order['amount_discount']=$info['amount_discount']; $order['amount_cmn']=$info['amount_cmn']; $order['num']=$info['num']; $order['num_install']=$info['num_install']; $order['tax']=$data['tax']??null; $order->save(); $amount_profit=0; foreach ($info['goods'] as $everyGoods){ $orderInfo=OrderInfo::saveInfo($order,$everyGoods); $amount_profit=bcadd($amount_profit,$orderInfo['amount_profit']); } $order['amount_profit']=$amount_profit; $order['amount_profit_per']=bcmul(100,bcdiv($order['amount_profit'],$order['amount_pay'])); $order->save(); $order->address()->save($address->orderAddress()); Db::commit(); $this->success('',$this->orderDetail($order['id'])); } /** * 订单详情 * @ApiParams (name=id,description="订单ID") */ public function show(){ $data=$this->_validate([ 'id'=>['require'], ]); $user=$this->auth->getUser(); $this->success('',$this->orderDetail($data['id'])); } protected function orderDetail($orderId){ $order= Order::with(['info','info.refund','address','logistics','logistics.com'])->findOrFail($orderId); foreach ($order['info'] as $info){ $info->append(['goods','sku']); Refund::makeRefundConfig($info); } return $order; } /** * 取消订单 * @ApiParams (name=id,description="订单ID") */ public function cancel(){ $data=$this->_validate([ 'id'=>['require'], ]); $user=$this->auth->getUser(); $order=$user->orders()->findOrFail($data['id']); $order->allowCancel() && $order->makeCancel(); $this->success(); } /** * 用户订单列表 * @ApiParams (name=page,description=分页) * @ApiParams (name=limit,description=分页) * @ApiParams (name=status,description=状态) * @ApiReturnParams (name=is_evaled,description=是否已评价) */ public function users(){ $user=$this->auth->getUser(); $map=[]; $status=input('status'); if(is_numeric($status)){ $map['status']=$status; } if($this->taxApi){ $map['tax']=['neq','[]']; } $orders=$user->orders() ->where($map) ->with(['info']) ->order('id','desc') ->paginate(input('limit',15)); foreach ($orders as $order){ //$order['info']=$order->info()->with(['goodsBak'])->find(); $order->append(['is_evaled']); } $this->success('',$orders); } /** * 支付订单 * @ApiParams (name=id,description=订单ID) * @ApiParams (name=pay_type,description=支付方式1企业网银2微信3支付宝4银联5代付6线下支付) * @ApiReturnParams (name=qr,description=微信支付宝返回的二维码) * @ApiReturnParams (name=account_name,description=线下支付会返【账户名称】) * @ApiReturnParams (name=bank_no,description=线下支付会返【银行卡号】) * @ApiReturnParams (name=bank_name,description=线下支付会返【银行名称】) */ public function pay(){ $data=$this->_validate([ 'id'=>['require'], 'pay_type|支付方式'=>['require','in:'.implode(',',array_keys(Order::getPayTypes()))] ]); $user=$this->auth->getUser(); $order=Order::findOrFail($data['id']); if(!$order->is_wait_pay){ $this->error('非待支付状态无法支付'); } $data=$order->makePayInfo($data['pay_type']); $this->success('',$data); } /** * 申请售后 * @ApiParams (name=refund_type,description=1退款2退款退货3仅退货) * @ApiParams (name=num,description=退货数量) * @ApiParams (name=order_info_id,description=订单ID) * @ApiParams (name=refund_by,description=配置里的type里的key) * @ApiParams (name=reason1,description=配置里的reason里的key) * @ApiParams (name=reason2,description=原因2) * @ApiParams (name=amount,description=金额) */ public function refund(){ $data=$this->_validate([ 'order_info_id|订单'=>['require','integer','gt:0'], ]); $user=$this->auth->getUser(); Db::startTrans(); $orderInfo=$user->orderInfo()->lock(true)->findOrFail($data['order_info_id']); $order= Order::lock(true)->where('id',$orderInfo['order_id'])->find(); if(!$order){ Db::rollback(); $this->error('订单不存在'); } $order->allowRefund(); $refund=$orderInfo->refund; if($refund){ Db::rollback(); $this->error('您已提交,不能再次提交'); } $this->_validate([ 'refund_type|售后方式'=>['require','in:'.implode(',',array_filter(array_keys(Refund::getRefundTypes())))], 'num|数量'=>['require','integer','gt:0',"elt:{$orderInfo['num']}"], 'amount|金额'=>['require','float','gt:0',"elt:{$orderInfo['amount_pay']}"], 'reason2|原因'=>['require','max:100'], 'refund_by|退货方式'=>['require','integer','gt:0','in:'.implode(',',array_keys(Refund::getRefundBys()))], 'reason1|退款退货原因'=>['require','integer','gt:0','in:'.implode(',',array_keys(Refund::getReasons()))], ]); $newRefund=Refund::create([ 'user_id'=>$user->id, 'order_id'=>$orderInfo['order_id'], 'order_info_id'=>$orderInfo['id'], 'goods_id'=>$orderInfo['goods_id'], 'refund_type'=>$data['refund_type'], 'refund_by'=>$data['refund_by'], 'num'=>$data['num'], 'amount'=>$data['amount'], 'reason1'=>$data['reason1'], 'reason2'=>$data['reason2'], ]); $orderInfo['refund_id']=$newRefund['id']; $orderInfo->save(); #未发货直接退款取消 /* if($order->is_wait_send){ $newRefund['refund_type']=Refund::REFUND_TYPE_MONEY; $newRefund['amount']=$orderInfo['amount_pay']; $newRefund['num']=$orderInfo['num']; $newRefund->save(); $newRefund->makeAudit(1); }*/ Db::commit(); $this->success(); } /** * 取消售后 * @ApiParams (name=order_info_id,description=子订单ID) */ public function refund_cancel(){ $data=$this->_validate([ 'order_info_id'=>['require'], ]); $user=$this->auth->getUser(); $orderInfo=$user->orderInfo()->findOrFail($data['order_info_id']); $refund=$orderInfo->refund; if(!$refund){ $this->error('售后不存在'); } if(!$refund->allowCancel()){ $this->error('该售后不允许取消'); } $refund->makeCancel(); $this->success(); } /** * 确认收货 * @ApiParams (name=id,description=订单ID) */ public function commit(){ $data=$this->_validate([ 'id'=>['require','integer'], ]); $user=$this->auth->getUser(); $order=$user->orders()->findOrFail($data['id']); if(!$order->allowOver()){ $this->error('该订单不允许确认'); } $order->makeOver(); $this->success(); } /** * 上传(重新上传)打款凭证 * @ApiParams (name=id,description=订单ID) * @ApiParams (name=bank_no,description=银行卡号) * @ApiParams (name=bank_name,description=银行开户行) * @ApiParams (name=bank_username,description=银行持卡人姓名) * @ApiParams (name=image,description=凭证图片) */ public function po_complete(){ $user=$this->auth->getUser(); $data=$this->_validate([ 'id|订单'=>['require'], 'bank_no|银行卡号'=>['require'], 'bank_name|银行开户行'=>['require'], 'bank_username|银行持卡人姓名'=>['require'], 'image|凭证图片'=>['require'], ]); Db::startTrans(); $voucher=OrderVoucher::where('order_id',$data['id'])->lock(true)->find(); if($voucher && $voucher['status']==1){ Db::rollback(); $this->error('该凭证已通过无法再次提交'); } $order=$user->orders()->findOrFail($data['id']); if(!$order->is_wait_pay){ Db::rollback(); $this->error('该订单非待支付状态'); } $newData=\Yansongda\Supports\Arr::only($data,['bank_no','bank_name','bank_username','image']); $newData['status']=0; if($voucher){ $voucher->save($newData); }else{ $newData['order_id']=$data['id']; $newData['user_id']=$user['id']; $voucher=OrderVoucher::create($newData); } Db::commit(); $this->success('',$voucher); } /** * 售后列表 * @ApiParams (name=page,description=分页) * @ApiParams (name=limit,description=分页) * @ApiReturnParams (name=id,description=退款记录ID) * @ApiReturnParams (name=refund_status,description="退款状态10申请处理中20申请通过30申请驳回40已取消") * @ApiReturnParams (name=refund_type,description="退款退货类型1仅退款2退款退货3仅退货") * @ApiReturnParams (name=refund_by,description="退货方式") * @ApiReturnParams (name=reason1,description="退款退货原因") * @ApiReturnParams (name=reason2,description="退款退货原因") * @ApiReturnParams (name=num,description="退款退货数量") * @ApiReturnParams (name=amount,description="退款退货金额") * @ApiReturnParams (name=create_time,description="创建时间") * @ApiReturnParams (name=audit_remark,description="审核备注") * @ApiReturnParams (name=order_no,description="退款单号") * @ApiReturnParams (name=pay_status,description="退款状态1成功2失败") * @ApiReturnParams (name=pay_remark,description="支付备注") */ public function service_list(){ $user=$this->auth->getUser(); $list=$user->refund() ->order('id','desc') ->with(['order_info','orders']) ->paginate(input('limit',15)); $this->success('',$list); } /** * 订单物流查询 * @ApiParams (name=id,description=订单ID) * @ApiReturnParams (name=time,description="时间") * @ApiReturnParams (name=content,description="内容") */ public function logistics_order(){ $user=$this->auth->getUser(); $data=$this->_validate([ 'id'=>['require'], ]); $order=$user->orders()->findOrFail($data['id']); $logistics=$order->logistics; if(!$logistics){ $this->error('未上传物流信息'); } $info['logistics']=logistics() ->setNo($logistics['trans_no']) ->setLogistics($logistics->com) ->setPhone($order->address->mobile) ->query(); $this->success('',$info); } }