www.maiwd.cn // +---------------------------------------------------------------------- namespace app\api\controller\wdsxh\goods; use addons\wdsxh\library\Wxapp; use app\admin\model\wdsxh\mall\Logistics; use app\api\model\wdsxh\goods\FreightRules; use app\api\model\wdsxh\goods\Refund; use app\api\model\wdsxh\mall\Cart; use app\api\model\wdsxh\mall\OrderItem; use app\api\model\wdsxh\user\Wechat; use app\common\controller\Api; use think\Db; use Exception; use think\exception\PDOException; use think\exception\ValidateException; use think\Log; class Order extends Api { protected $noNeedLogin = ['postage','payResult']; protected $noNeedRight = ['*']; protected $model = null; protected $rulesModel = null; protected $refundModel = null; public function _initialize() { parent::_initialize(); $this->model = new \app\api\model\wdsxh\goods\Order(); $this->rulesModel = new FreightRules(); $this->refundModel = new Refund(); } /** * Desc 创建订单 * Create on 2024/3/14 08:38 * Create by @小趴菜 */ public function create(){ if(!$this->request->isPost()) { $this->error('请求类型错误'); } $param = $this->request->post(); $buy_now = isset($param['buy_now']) ? $param['buy_now'] : 1; //查询用户id $user_id = $this->auth->id; $wechat_id = (new Wechat())->where('user_id',$user_id)->value('id'); $param['wechat_id'] = $wechat_id;//用户id $delivery_method = isset($param['delivery_method']) ? $param['delivery_method'] : 1; if ($delivery_method == 1 && empty($param['address_id'])) { $this->error('请选择地址'); } if (isset($param['address_id']) && !empty($param['address_id'])) { //查询用户收货地址 $address = (new \app\api\model\wdsxh\goods\Address())->where('id',$param['address_id'])->find(); $param['real_name'] = $address['name'];//用户名称 $param['user_phone'] = $address['tel'];//手机号 $param['user_address'] = $address['address'];//详细地址 } if ($buy_now == 1) { $goods_price = (new \app\api\model\wdsxh\goods\Goods())->where('id',$param['goods_id'])->value('price'); if ($param['delivery_method'] == 1) { //查询商品价格 $pay_price_number = bcmul($goods_price,$param['number'],2); //计算邮费 $postage = $this->rulesModel ->where('min','<=',$pay_price_number) ->where('max','>=',$pay_price_number) ->value('price'); //如果不在配送范围之内,邮费将会返回0 if (!$postage){ $postage = 0; } } else { $postage = 0; } $param['number'] = isset($param['number']) ? $param['number'] : 1; $param['goods_price'] = $goods_price; $param['pay_postage'] = $postage;//支付邮费 $param['pay_price'] = bcmul($goods_price,$param['number'],2) + $postage;//实际支付金额 $param['total_price'] = $param['pay_price'];//订单总价 $param['order_no'] = wdsxh_create_order();//订单号 $param['refund_status'] = 1; $param['paid'] = 1; $param['createtime'] = time(); $param['delivery_method'] = $delivery_method; $result = false; Db::startTrans(); try { $result = $this->model->allowField(true)->save($param); $order_id = $this->model->id; // 获取刚添加数据的ID Db::commit(); } catch (ValidateException|PDOException|Exception $e) { Db::rollback(); $this->error($e->getMessage()); } if(false === $result){ $this->error($this->model->getError()); } $this->success('提交成功', ['order_id' => $order_id]); // 返回刚添加数据的ID } else {//购物车 $goods_id_array = explode(',',$param['goods_id']); $cartModel = new Cart(); $cartList = $cartModel->where('goods_id','in',$goods_id_array) ->where('wechat_id',$wechat_id) ->select(); if (empty($cartList)) { $this->error('购物车数据不存在'); } if (count($goods_id_array) != count($cartList)) { $this->error('购物车数量不对'); } $all_goods_total_price = 0;//排除运费,商品总价格 $order_item_data = array(); foreach ($cartList as $v) { $goodsObj = (new \app\api\model\wdsxh\goods\Goods())->where('id',$v['goods_id'])->find(); $pay_price = bcmul($goodsObj['price'],$v['goods_num'],2); $all_goods_total_price = $all_goods_total_price + $pay_price; $order_item_data[] = array( 'goods_id'=>$v['goods_id'], 'goods_num'=>$v['goods_num'], 'goods_name'=>$goodsObj['name'], 'goods_image'=>$goodsObj['image'], 'goods_price'=>$goodsObj['price'], 'pay_price'=>$pay_price, ); } if ($param['delivery_method'] == 1) { //计算邮费 $postage = $this->rulesModel ->where('min','<=',$all_goods_total_price) ->where('max','>=',$all_goods_total_price) ->value('price'); //如果不在配送范围之内,邮费将会返回0 if (!$postage){ $postage = 0; } } else { $postage = 0; } $param['number'] = $cartModel->where('goods_id','in',$goods_id_array) ->where('wechat_id',$wechat_id) ->sum('goods_num'); $param['goods_price'] = $all_goods_total_price; $param['pay_postage'] = $postage;//支付邮费 $param['pay_price'] = $all_goods_total_price + $postage;//实际支付金额 $param['total_price'] = $param['pay_price'];//订单总价 $param['order_no'] = wdsxh_create_order();//订单号 $param['refund_status'] = 1; $param['paid'] = 1; $param['createtime'] = time(); $param['delivery_method'] = $delivery_method; $result = false; Db::startTrans(); try { $result = $this->model->allowField(true)->save($param); $order_id = $this->model->id; // 获取刚添加数据的ID // 使用 array_map 给每个元素追加 order_id $order_item_data = array_map(function($item) use ($order_id) { $item['order_id'] = $order_id; return $item; }, $order_item_data); (new OrderItem())->saveAll($order_item_data); $cartModel->where('goods_id','in',$goods_id_array) ->where('wechat_id',$wechat_id)->delete(); Db::commit(); } catch (ValidateException|PDOException|Exception $e) { Db::rollback(); $this->error($e->getMessage()); } if(false === $result){ $this->error($this->model->getError()); } $this->success('提交成功', ['order_id' => $order_id]); // 返回刚添加数据的ID } } /** * Desc 订单列表 * Create on 2024/3/13 16:23 * Create by @小趴菜 */ public function index(){ $param = $this->request->param(); $user_id = $this->auth->id; $page = isset($param['page']) ? $param['page'] : ''; $limit = isset($param['limit']) ? $param['limit'] : 10; $where = []; //状态:1=待付款,2=待发货,3=待收货,5=支付失败,4=已完成,6=已取消,-1=退款中,-2=已退款 if(isset($param['state']) && !empty($param['state'])) { $where['state'] = array('eq',$param['state']); } $wechat_id = (new Wechat())->where('user_id',$user_id)->value('id'); $where['refund_status'] = array('eq',1); $where['wechat_id'] = array('eq',$wechat_id); $total = $this->model->where($where)->count(); $data = $this->model ->where($where) ->field('id,order_no,state,pay_price,number,trade_no,buy_now, delivery_method') ->page($page,$limit) ->order('createtime desc') ->select(); $orderItemModel = new OrderItem(); foreach ($data as $row){ if ($row['buy_now'] == '1') { $goods = $this->model ->alias('mall_order') ->join('wdsxh_mall_goods goods','goods.id = mall_order.goods_id') ->where('mall_order.wechat_id',$wechat_id) ->where('mall_order.id',$row['id']) ->field('goods.id,goods.image,goods.name') ->select(); } else { $goods = $orderItemModel ->alias('order_item') ->join('wdsxh_mall_goods goods','goods.id = order_item.goods_id') ->where('order_item.order_id',$row['id']) ->field('goods.id,goods.image,goods.name') ->select(); foreach ($goods as &$vv) { $vv->image = wdsxh_full_url($vv->image); } } $row->goods = $goods; $row->hidden(['buy_now']); } $this->success('请求成功',['total' => $total,'data' => $data]); } /** * Desc 计算邮费 * Create on 2024/3/15 13:55 * Create by @小趴菜 */ public function postage(){ $param = $this->request->param(); $where_query = array(); if (isset($param['address_id']) && !empty($param['address_id'])) { $address_id = $param['address_id']; $address = (new \app\api\model\wdsxh\goods\Address())->where('id',$address_id)->value('address'); // 正则表达式匹配省、直辖市、自治区、特别行政区 preg_match('/^(.*?(省|自治区|市|香港|澳门))/u', $address, $matches); if (!empty($matches)) { $province = $matches[0]; // 截取到的省、直辖市、自治区、特别行政区 $where_query[] = ['exp',Db::raw("FIND_IN_SET('$province',open_area)")]; } } $postage = $this->rulesModel ->where('min','<=',$param['pay_price']) ->where('max','>=',$param['pay_price']) ->where($where_query) ->value('price'); if (!$postage){ $postage = 0; } $this->success('请求成功',['price' =>$postage]); } /** * Desc 订单详情 * Create on 2024/3/15 14:22 * Create by @小趴菜 */ public function details(){ if(!$this->request->isGet()) { $this->error('请求类型错误'); } $order_no = $this->request->get('order_no'); $id = $this->request->get('id'); if (!$order_no && !$id) { $this->error('参数错误'); } if ($id) { $where['id'] = array('eq',$id); } if ($order_no) { $where['order_no'] = array('eq',$order_no); } $row = $this->model ->where($where) ->field('id,order_no,real_name,user_phone, user_address,total_price, pay_postage,state,refund_status, number, trade_no, buy_now, delivery_method,pick_up_code') ->find(); if (!$row) { $this->error('订单不存在'); } $orderItemModel = new OrderItem(); if ($row['buy_now'] == '1') { $goods = $this->model ->alias('mall_order') ->join('wdsxh_mall_goods goods','goods.id = mall_order.goods_id') ->where('mall_order.id',$row['id']) ->field('goods.image,goods.name,mall_order.goods_price,number goods_num') ->select(); } else { $goods = $orderItemModel ->alias('order_item') ->join('wdsxh_mall_goods goods','goods.id = order_item.goods_id') ->where('order_item.order_id',$row['id']) ->field('goods.image,goods.name,order_item.goods_price,goods_num') ->select(); foreach ($goods as &$vv) { $vv->image = wdsxh_full_url($vv->image); } } $row->goods = $goods; unset($row['buy_now']); $row['refund_reason'] = (new Refund())->where('order_id',$row['id'])->value('refund_reason'); if ($row['delivery_method'] == 1) { unset($row['pick_up_code']); } else { unset($row['real_name']); unset($row['real_name']); unset($row['real_name']); if (!in_array($row['state'],['2','3','4'])) { unset($row['pick_up_code']); } } $this->success('请求成功',$row); } /** * Desc 订单预支付 * Create on 2024/3/15 16:23 * Create by @小趴菜 */ public function prepare_pay() { $channel = $this->request->header('channel'); $param = $this->request->param(); $user_id = $this->auth->id; $wechat_id = (new Wechat())->where('user_id',$user_id)->value('id'); $openid = wdsxh_get_openid($wechat_id,$channel); $orderObj = $this->model ->where('id',$param['order_id']) ->field('order_no,pay_price') ->find(); if (!$orderObj) { $this->error('订单不存在'); } $order_no = wdsxh_create_order(); $orderObj->order_no = $order_no; $orderObj->save(); try{ //微信小程序支付 if ($channel == 1){ $data=\addons\wdsxh\library\Wxapp::unify('商城商品购买',$orderObj->order_no,$orderObj->pay_price,$openid,request()->domain().'/api/wdsxh/goods/order/payresult'); } else { $data=\addons\wdsxh\library\Wxapp::unify_wxofficial('商城商品购买',$orderObj->order_no,$orderObj->pay_price,$openid,request()->domain().'/api/wdsxh/goods/order/payresult'); } }catch (\think\Exception $e){ $this->error($e->getMessage()); } $this->success('success',$data); } /** * Desc 订单支付回调 * Create on 2024/3/15 17:40 * Create by @小趴菜 */ public function payResult(){ $pay=Wxapp::getPay(); $response = $pay->handlePaidNotify(function($message, $fail){ Log::record($message['out_trade_no'],'logeuas'); $order =$this->model->where('order_no',$message['out_trade_no'])->find(); if (!$order || $order->state == '2') { return true; } if ($order['delivery_method'] == 2) { // 生成唯一的6位随机数字 do { $pickUpCode = mt_rand(100000, 999999); // 生成6位随机数 $exists = $this->model->where('pick_up_code', $pickUpCode)->count(); // 检查数据库中是否已存在该pick_up_code } while ($exists > 0); // 如果该pick_up_code已经存在,重新生成 $order->pick_up_code = $pickUpCode; } Db::startTrans(); try { $order->pay_time = time(); $order->state = '2'; $order->paid = '2'; $order->trade_no = $message['transaction_id']; $order->save(); Db::commit(); } catch (\think\Exception $e) { Db::rollback(); $this->error($e->getMessage()); } return true; }); $response->send(); } /** * Desc 确认收货 * Create on 2024/3/15 17:48 * Create by @小趴菜 */ public function sing(){ $param = $this->request->param(); Db::startTrans(); try{ $this->model->allowField(true) ->where('id',$param['id']) ->update([ 'state' => 4, 'complete_time'=>time(), ]); (new Logistics())->allowField(true) ->where('order_id',$param['id']) ->update([ 'receive_time' => time(), ]); // 提交事务 Db::commit(); } catch (\Exception $e) { // 回滚事务 Db::rollback(); $this->error($e->getMessage()); } $this->success('确认收货成功'); } /** * Desc 申请退款 * Create on 2024/3/18 11:59 * Create by @小趴菜 */ public function refund(){ $param = $this->request->param(); $user_id = $this->auth->id; //查询用户wechat_id $wechat_id = (new Wechat())->where('user_id',$user_id)->value('id'); $refundObj = (new Refund())->where('order_id',$param['order_id'])->where('wechat_id',$wechat_id)->find(); if ($refundObj){ $this->error('你已提交退款申请,请勿重复提交,请等待管理员同意退款申请'); } $orderModel = (new \app\api\model\wdsxh\goods\Order())->where('id', $param['order_id'])->find(); $refund_reason = '退款原因:' . $param['refund_reason'] . ',' . '退款详情:' . $param['refund_content']; if ($orderModel['state'] == '2') { $refundSn=wdsxh_create_order(); $res=\addons\wdsxh\library\Wxapp::payRefund($orderModel['order_no'],$refundSn,$orderModel['pay_price'],array('refund_desc'=>'退款')); if($res && $res['return_code'] == 'SUCCESS' && $res['result_code'] == 'SUCCESS'){ Db::startTrans(); try { (new \app\api\model\wdsxh\goods\Order()) ->where('id', $param['order_id']) ->update([ 'state' =>'-2', 'refund_status' => '5', 'complete_time'=>time(), ]); $result = (new \app\admin\model\wdsxh\mall\Refund())->insert([ 'order_id' => $orderModel['id'],//订单id 'refund_price' => $orderModel['pay_price'],//退款金额 'refund_reason' => $refund_reason,//退款用户说明 'state' => $orderModel['state'],//退款前状态 'wechat_id' => $wechat_id,//用户id 'createtime' => time(),//创建时间 'refund_time' => time(),//退款时间 ]); Db::commit(); } catch (ValidateException|PDOException|Exception $e) { Db::rollback(); $this->error($e->getMessage()); } if(false === $result){ $this->error($this->model->getError()); } $this->success('退款成功'); }else{ $this->error('退款失败,错误信息:'.$res['err_code_des']); } } $result = false; Db::startTrans(); try { (new \app\api\model\wdsxh\goods\Order()) ->where('id', $param['order_id']) ->update([ 'state' =>'-1', 'refund_status' => '2', ]); $result = (new \app\admin\model\wdsxh\mall\Refund())->insert([ 'order_id' => $orderModel['id'],//订单id 'refund_price' => $orderModel['pay_price'],//退款金额 'refund_reason' => $refund_reason,//退款用户说明 'state' => $orderModel['state'],//退款前状态 'wechat_id' => $wechat_id,//用户id 'createtime' => time(),//创建时间 'refund_time' => time(),//退款时间 ]); Db::commit(); } catch (ValidateException|PDOException|Exception $e) { Db::rollback(); $this->error($e->getMessage()); } if(false === $result){ $this->error($this->model->getError()); } $this->success('提交成功'); } /** * Desc 添加快递单号 * Create on 2024/3/18 15:46 * Create by @小趴菜 */ public function receipt(){ $param = $this->request->param(); Db::startTrans(); try{ (new \app\admin\model\wdsxh\mall\Refund())->allowField(true) ->where('order_id',$param['order_id']) ->update([ 'refund_express_no' =>$param['refund_express_no'],//快递单号 'add_express_no_time' => time(),//添加单号时间 ]); (new \app\api\model\wdsxh\goods\Order())->allowField(true) ->where('id', $param['order_id']) ->update([ 'refund_status' => '4', ]); // 提交事务 Db::commit(); } catch (\Exception $e) { // 回滚事务 Db::rollback(); $this->error($e->getMessage()); } $this->success('请求成功'); } /** * Desc 退款列表 * Create on 2024/3/13 16:23 * Create by @小趴菜 */ public function refund_index(){ $param = $this->request->param(); $user_id = $this->auth->id; $page = isset($param['page']) ? $param['page'] : ''; $limit = isset($param['limit']) ? $param['limit'] : 10; $where = []; //退款状态:1=未退款,2=申请中,3=待退货,4=退款中,5=已退款' if(isset($param['refund_status']) && !empty($param['refund_status'])) { $where['order.refund_status'] = array('not in',1); $where['order.refund_status'] = array('eq',$param['refund_status']); } $wechat_id = (new Wechat())->where('user_id',$user_id)->value('id'); $where['order.wechat_id'] = array('eq',$wechat_id); $total =(new Refund()) ->alias('refund') ->join('wdsxh_mall_order order','order.id = refund.order_id') ->where($where)->count(); $data = (new Refund()) ->alias('refund') ->join('wdsxh_mall_order order','order.id = refund.order_id') ->where($where) ->field('order.id,order.order_no,order.goods_id,order.refund_status,order.pay_price,order.number, buy_now') ->page($page,$limit) ->order('order.createtime desc') ->select(); $orderItemModel = new OrderItem(); foreach ($data as $row){ if ($row['buy_now'] == '1') { $goods = $this->model ->alias('mall_order') ->join('wdsxh_mall_goods goods','goods.id = mall_order.goods_id') ->where('mall_order.wechat_id',$wechat_id) ->where('mall_order.id',$row['id']) ->field('goods.id,goods.image,goods.name') ->select(); } else { $goods = $orderItemModel ->alias('order_item') ->join('wdsxh_mall_goods goods','goods.id = order_item.goods_id') ->where('order_item.order_id',$row['id']) ->field('goods.id,goods.image,goods.name') ->select(); foreach ($goods as &$vv) { $vv->image = wdsxh_full_url($vv->image); } } $row->goods = $goods; $row->hidden(['buy_now']); } $this->success('请求成功',['total' => $total,'data' => $data]); } /** * Desc 取消退款 * Create on 2024/3/20 15:50 * Create by @小趴菜 */ public function cancel_refund(){ $param = $this->request->post(); $row = $this->refundModel->where('order_id',$param['id'])->find(); Db::startTrans(); try{ $params['refund_status'] = 1; $params['state'] = $row['state']; (new \app\admin\model\wdsxh\mall\Order())->allowField(true)->where('id',$row['order_id'])->update($params); $row->delete(); // 提交事务 Db::commit(); } catch (\Exception $e) { // 回滚事务 Db::rollback(); $this->error($e->getMessage()); } $this->success('取消成功'); } /** * Desc 取消订单 * Create on 2024/4/10 14:19 * Create by @小趴菜 */ public function del_order(){ if(!$this->request->isPost()) { $this->error('请求类型错误'); } $param = $this->request->post(); $user_id = $this->auth->id; $wechat_id = (new Wechat())->where('user_id',$user_id)->value('id'); $orderObj = $this->model->where('wechat_id',$wechat_id)->where('id',$param['order_id'])->find(); if (!$orderObj) { $this->error('订单不存在'); } if ($orderObj['state'] != '1') { $this->error('订单不是待付款,无法删除'); } Db::startTrans(); try{ $orderObj->delete(); (new OrderItem())->allowField(true)->where('order_id',$param['order_id'])->delete(); // 提交事务 Db::commit(); } catch (ValidateException|PDOException|\think\Exception $e) { // 回滚事务 Db::rollback(); $this->error($e->getMessage()); } $this->success('取消成功'); } }