Parcourir la source

0817-0219-h02

Zory il y a 1 mois
Parent
commit
1dccd734df

+ 36 - 1
app/controller/v2/Auth.php

@@ -33,13 +33,43 @@ class Auth extends Base
             $data = $this->model->where("openid",$request->user['openid'])->field("openid,nickname,avatar,mobile")->findOrEmpty();
             if ($data->isEmpty()) return errorTrans("error.data");
             if (empty($data['avatar'])) $data['avatar'] = sConf("service.logo");
-            $data['mobile'] = hide_mobile($data['mobile']);
+            $data['mobile'] = $data['mobile']?hide_mobile($data['mobile']):'-';
             return success("ok",$data->toArray());
         } catch (\Throwable $th) {
             return error($th->getMessage());
         }
     }
 
+
+    /**
+     * 完善昵称
+     * @param Request $request
+     * @return Response
+     */
+    #[PostMapping("nick")]
+    public function loginNick(Request $request): Response
+    {
+        try {
+            $param = $this->_valid([
+                "avatar.require"        => trans("empty.require"),
+                "nickname.require"      => trans("empty.require"),
+            ],$request->method());
+            if (!is_array($param)) return error($param);
+            $userInfo = [
+                "nickname"  => $param['nickname']?removeEmoji2($param['nickname']):'-',
+                "avatar"    => $param['avatar']
+            ];
+            $map = ["openid" => $request->user['openid']];
+            $user = $this->model->where($map)->findOrEmpty();
+            if ($user->isEmpty()) return error("更新数据失败");
+            $state = $user->save($userInfo);
+            if (!$state) return error("授权获取失败");
+            return success("ok");
+        } catch (\Throwable $th) {
+            return error($th->getMessage());
+        }
+    }
+
     /**
      * 手机号码
      * @param Request $request
@@ -65,11 +95,16 @@ class Auth extends Base
                 $mobileStr = $data['purePhoneNumber'];
             }
             if (empty($mobileStr)) return error("授权信息获取失败");
+            $mobile = $this->decrypt2code(sConf('wechat.min_private_key'), $mobileStr);
             $map = ["openid" => $sessionKey['openid']];
             $user = $this->model->where($map)->findOrEmpty();
             if ($user->isEmpty()) {
                 $map["create_ip"] = $request->getRealIp();
+                $map["mobile"] = $mobile['purePhoneNumber'];
                 $user->insertGetId($map);
+            } else {
+                $user->mobile = $mobile['purePhoneNumber'];
+                $user->save();
             }
             $userAuth = get_object_vars(AuthFacade::guard("user")->login(['openid' => $sessionKey['openid']]));
             return success("ok",$userAuth);

+ 218 - 0
app/controller/v2/Chat.php

@@ -0,0 +1,218 @@
+<?php
+
+namespace app\controller\v2;
+
+use app\extra\basic\Base;
+use app\middleware\AuthMiddleware;
+use app\model\saas\SaasChatMsg;
+use app\model\saas\SaasService;
+use app\model\saas\SaasStore;
+use app\model\saas\SaasUserOpen;
+use app\service\saas\ChatStoreService;
+use DI\Attribute\Inject;
+use LinFly\Annotation\Attributes\Route\Controller;
+use LinFly\Annotation\Attributes\Route\GetMapping;
+use LinFly\Annotation\Attributes\Route\Middleware;
+use LinFly\Annotation\Attributes\Route\PostMapping;
+use support\Request;
+use support\Response;
+
+
+#[Controller("/v2/chat"),Middleware(AuthMiddleware::class)]
+class Chat extends Base
+{
+
+    #[Inject]
+    protected ChatStoreService $service;
+
+
+    /**
+     * 获取客服列表-已聊过的
+     * @param Request $request
+     * @return Response
+     */
+    #[GetMapping("list")]
+    public function getServiceList(Request $request): Response
+    {
+        try {
+            $param = $request->all();
+            if (!empty($param['size'])) {
+                $param['pageSize'] = $param['size'];
+            }
+            $param['openid'] = $request->user['openid'];
+            $list = $this->service->setModel()->getList($param,null,true,['last','avatar'],['last' => function($data,$resp) use($param){
+                $last = (new SaasChatMsg)->where(['poi_id' => $resp['poi_id'],'openid' => $param['openid'],'is_user' => 0])->order("create_at desc")->field("content,create_at,type")->findOrEmpty();
+                if ($last->isEmpty()) {
+                    return ['type' => "text","content"=>"-",'num' => 0,"create_at"=> formatTime(date("Y-m-d H:i:s",time()))];
+                }
+                return ["content"=> str_cut_ellipsis($last['content'],12),'num' => 0,"create_at"=> formatTime($last['create_at']),'type' => $last['type']];
+            },'avatar' => function(){
+                return sConf("service.logo");
+            }]);
+            $user = (new SaasUserOpen)->where(['openid' => $param['openid']])->findOrEmpty();
+            if ($user->isEmpty()) return error("数据错误");
+            $userState = 1;
+            if (empty($user['avatar'])) {
+                $userState = 0;
+            }
+            return successTrans("success.data",['data' => pageFormat($list),'user' => $userState]);
+        } catch (\Throwable $throwable) {
+            return error($throwable->getMessage());
+        }
+    }
+
+    /**
+     * 获取基础客服消息
+     */
+    #[GetMapping("service")]
+    public function getChatStore(Request $request): Response
+    {
+        try {
+            $param = $this->_valid([
+                "poi.require"   => "参数错误",
+                "size.require"  => "参数错误",
+                "page.require"  => "参数错误",
+            ],$request->method());
+            if (!is_array($param)) return error($param);
+            $store = (new SaasStore)->where("poi_id",$param['poi'])->findOrEmpty();
+            if ($store->isEmpty()) return error("店铺不存在");
+            $userAvatar = $request->user['avatar'];
+            // 获取最新的10条聊天记录
+            $msg = (new SaasChatMsg)->where(['openid' => $request->user['openid'],'poi_id' => $store['poi_id']])
+                ->append(['time','userType','msgType'])
+                ->withAttr(['time' => function($resp,$data){
+                    return strtotime($data['create_at']) * 1000;
+                },'userType' => function($resp,$data){
+                    if ($data['source'] == 1) {
+                        return "self";
+                    } else {
+                        return "friend";
+                    }
+                },'msgType' => function($resp,$data){
+                    return $data['type'];
+                }])
+                ->order("id","desc")
+                ->paginate([
+                    "list_rows" => $param['size'],
+                    "page"      => 1
+                ]);
+            $serviceAvatar = sConf("service.logo");
+            $star = (new SaasService)->where("poi_id",$param['poi'])->with(['quick'])->findOrEmpty();
+            return success("ok",[
+                "avatar"    => $userAvatar,
+                "userId"    => md5($request->user['openid']),
+                "msg"       => $msg,
+                "service"   => $serviceAvatar,
+                "store"     => [
+                    "shopName" => $store['poi_name'],
+                    "shopId"   => $store['poi_id'],
+                ],
+                "quick"     => $star
+            ]);
+        } catch (\Throwable $throwable) {
+            return error($throwable->getMessage());
+        }
+    }
+
+    /**
+     * 历史聊天列表
+     * @param Request $request
+     * @return Response
+     */
+    #[GetMapping("msg")]
+    public function getMsgList(Request $request): Response
+    {
+        try {
+            $param = $this->_valid([
+                "poi.require"   => "参数错误",
+                "size.require"  => "参数错误",
+                "page.require"  => "参数错误",
+            ],$request->method());
+            if (!is_array($param)) return error($param);
+            $store = (new SaasStore)->where("poi_id",$param['poi'])->findOrEmpty();
+            if ($store->isEmpty()) return error("店铺不存在");
+            $msg = (new SaasChatMsg)->where(['openid' => $request->user['openid'],'poi_id' => $store['poi_id']])
+            ->append(['time','userType','msgType'])
+            ->withAttr(['time' => function($resp,$data){
+                return strtotime($data['create_at']) * 1000;
+            },'userType' => function($resp,$data){
+                if ($data['source'] == 1) {
+                    return "self";
+                } else {
+                    return "friend";
+                }
+            },'msgType' => function($resp,$data){
+                return $data['type'];
+            }])
+            ->order("id","desc")
+            ->paginate([
+                "list_rows" => $param['size'],
+                "page"      => $param['page']
+            ]);
+            return success("ok",['data' => $msg]);
+        } catch (\Throwable $throwable) {
+            return error($throwable->getMessage());
+        }
+    }
+
+    /**
+     * 转人工
+     * @return Response|void
+     */
+    public function checkServiceUser()
+    {
+        try {
+
+        } catch (\Throwable $throwable) {
+            return error($throwable->getMessage());
+        }
+    }
+
+    /**
+     * 发送文字消息
+     * @param Request $request
+     * @return Response
+     */
+    #[PostMapping("text")]
+    public function sendTextMsg(Request $request): Response
+    {
+        try {
+            $param = $this->_valid([
+                "content.require"   => trans("empty.require"),
+                "groupId.require"   => trans("empty.require"),
+                "type.require"      => trans("empty.require")
+            ],"post");
+            if (!is_array($param)) return error($param);
+            (new SaasChatMsg)->insertGetId([
+                "source"    => 1,
+                "openid"    => $request->user['openid'],
+                "content"   => is_array($param['content'])?json_encode($param['content']):$param['content'],
+                "type"      => $param['type'],
+                "msgId"     => time(),
+                "poi_id"    => $param['groupId'],
+                "service_id" => '', // 客服ID
+            ]);
+            // 推送消息
+
+        } catch (\Throwable $throwable) {
+            return error($throwable->getMessage());
+        }
+    }
+
+
+    /**
+     * 发送图片消息
+     * @param Request $request
+     * @return Response
+     */
+    #[PostMapping("image")]
+    public function sendImageMsg(Request $request): Response
+    {
+        try {
+
+        } catch (\Throwable $throwable) {
+            return error($throwable->getMessage());
+        }
+    }
+
+}

+ 17 - 0
app/controller/v2/Goods.php

@@ -5,6 +5,7 @@ namespace app\controller\v2;
 use app\extra\basic\Base;
 use app\middleware\AuthMiddleware;
 use app\model\saas\SaasGoods;
+use app\model\saas\SaasUserOpen;
 use DI\Attribute\Inject;
 use LinFly\Annotation\Attributes\Route\Controller;
 use LinFly\Annotation\Attributes\Route\GetMapping;
@@ -60,4 +61,20 @@ class Goods extends Base
         }
     }
 
+    #[GetMapping("check")]
+    public function checkGoodsUser (Request $request): Response
+    {
+        try {
+            $user = (new SaasUserOpen)->where(['openid' => $request->user['openid']])->findOrEmpty();
+            if ($user->isEmpty()) return error("数据错误");
+            $userState = 1;
+            if (empty($user['avatar'])) {
+                $userState = 0;
+            }
+            return success("ok",['user' => $userState]);
+        } catch (\Throwable $throwable) {
+            return error($throwable->getMessage());
+        }
+    }
+
 }

+ 80 - 0
app/controller/v2/Order.php

@@ -0,0 +1,80 @@
+<?php
+
+namespace app\controller\v2;
+
+use app\extra\basic\Base;
+use app\middleware\AuthMiddleware;
+use app\model\saas\SaasOrder;
+use app\model\saas\SaasOrderItem;
+use app\model\saas\SaasUserOpen;
+use app\service\saas\OrderService;
+use DI\Attribute\Inject;
+use LinFly\Annotation\Attributes\Route\Controller;
+use LinFly\Annotation\Attributes\Route\GetMapping;
+use LinFly\Annotation\Attributes\Route\Middleware;
+use support\Request;
+use support\Response;
+
+
+#[Controller("/v2/order"),Middleware(AuthMiddleware::class)]
+class Order extends Base
+{
+
+    #[Inject]
+    protected SaasOrder $model;
+
+    #[Inject]
+    protected OrderService $service;
+
+    #[GetMapping('list')]
+    public function getDataList(Request $request): Response
+    {
+        try {
+            $param = $request->all();
+            if (!empty($param['size'])) {
+                $param['pageSize'] = $param['size'];
+            }
+            if (empty($param['status'])) {
+                $param['statusGt'] = 1;
+            }
+            $param['openid'] = $request->user['openid'];
+            $data = $this->service->setModel()->getList($param,['product' => function($query){
+                $query->field("product_id,product_name,price");
+            },'poi' => function($query){
+                $query->field("poi_id,poi_name");
+            }]);
+            return successTrans("success.data",pageFormat($data));
+        } catch (\Throwable $th) {
+            return error($th->getMessage());
+        }
+    }
+
+    #[GetMapping('detail')]
+    public function getDataDetail(Request $request): Response
+    {
+        try {
+            $param = $this->_valid([
+                "order.require"     => trans("empty.require"),
+                "option.default"    => ""
+            ],$request->method());
+            if (!is_array($param)) return error($param);
+            $order = $this->model->where("out_order_no",$param['order'])->with(['product','poi'])->append(['refund_num'])->withAttr(['refund_num' => function($data,$next){
+                return (new SaasOrderItem)->where(['order_sn' => $next['order_sn'],'status' => 2])->count();
+            }])->findOrEmpty();
+            if ($order->isEmpty()) return errorTrans("empty.data");
+            $order['end_time'] = timeDiff(strtotime("+30 minutes",strtotime($order['create_at'])),time());
+            $order['mobile'] = $order['mobile']?hide_mobile($order['mobile']):'-';
+            $user = (new SaasUserOpen)->where(['openid' => $request->user['openid']])->findOrEmpty();
+            if ($user->isEmpty()) return error("数据错误");
+            $userState = 1;
+            if (empty($user['avatar'])) {
+                $userState = 0;
+            }
+            $order['user'] = $userState;
+            return $this->encode("ok",$order->toArray());
+        } catch (\Throwable $th) {
+            return error($th->getMessage());
+        }
+    }
+
+}

+ 2 - 1
app/functions.php

@@ -734,7 +734,8 @@ if(! function_exists('removeEmoji2'))
     function removeEmoji2(string $str): string
     {
         // 匹配绝大部分emoji Unicode区间
-        $pattern = '/[\x{1F600}-\x{1F64F}\x{1F300}-\x{1F5FF}\x{1F680}-\x{1F6FF}\x{1F1E0}-\x{1F1FF}\x{2600}-\x{26FF}\x{2700}-\x{27BF}\xFE00-\xFE0F\x{1F900}-\x{1F9FF}]/u';
+//        $pattern = '/[\x{1F600}-\x{1F64F}\x{1F300}-\x{1F5FF}\x{1F680}-\x{1F6FF}\x{1F1E0}-\x{1F1FF}\x{2600}-\x{26FF}\x{2700}-\x{27BF}\xFE00-\xFE0F\x{1F900}-\x{1F9FF}]/u';
+        $pattern = "/[^\p{L}\p{N}\s]/u";
         return preg_replace($pattern, '', $str);
     }
 }

+ 1 - 0
app/service/saas/OrderService.php

@@ -32,6 +32,7 @@ class OrderService extends Service
         !empty($param['poi']) && $filter[] = ["poi_id", '=', $param['poi']];
         !empty($param['error']) && $filter[] = ["is_error", '=', $param['error']];
         !empty($param['status']) && $filter[] = ["status", '=', ($param['status']-1)];
+        !empty($param['statusGt']) && $filter[] = ["status", '>', ($param['statusGt']-1)];
         !empty($param['express_status']) && $filter[] = ["express_status", '=', $param['express_status']];
         !empty($param['statusIn']) && $filter[] = ["status", 'in', $param['statusIn']];
         !empty($param['type']) && $filter[] = ["type", '=', $param['type']];