Ver Fonte

'230900-9'

zory há 1 semana atrás
pai
commit
437ea9d803

+ 93 - 1
app/controller/api/Home.php

@@ -3,13 +3,16 @@
 namespace app\controller\api;
 
 use app\extra\basic\Base;
+use app\extra\dyLife\Crypt;
 use app\extra\dyLife\data\BaseData;
+use app\extra\tools\UploadExtend;
 use app\middleware\AuthMiddleware;
 use app\model\saas\SaasGoods;
 use app\model\saas\SaasStore;
 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;
 use Webman\RedisQueue\Redis;
@@ -22,7 +25,7 @@ class Home extends Base
     /**
      * @var array|string[]
      */
-    protected array $noNeedLogin = ["getHomeData","getLicense"];
+    protected array $noNeedLogin = ["getHomeData","getLicense","payBtnMobile"];
 
     #[GetMapping("data")]
     public function getHomeData(Request $request): Response
@@ -56,4 +59,93 @@ class Home extends Base
         }
     }
 
+
+    /**
+     * 三级城市信息
+     * @param Request $request
+     * @return Response
+     */
+    #[GetMapping("city")]
+    public function getCityJson(Request $request): Response
+    {
+        try {
+            $data = json_decode(file_get_contents(base_path()."/city.json"),true);
+            return successTrans("success.data",$data);
+        } catch (\Throwable $throwable) {
+            return error($throwable->getMessage());
+        }
+    }
+
+
+    /**
+     * 生服组件解密手机号码
+     * @param Request $request
+     * @return Response
+     */
+    #[PostMapping("mobile")]
+    public function payBtnMobile(Request $request): Response
+    {
+        try {
+            $param = $request->all();
+            $mobile = [];
+            if (!empty($param['code'])) {
+                $sessionKey = (new Crypt)->config($this->getDyConfig())->token()->getSessionKey($param['code']);
+                if (!empty($sessionKey)) {
+                    $mobileStr = $this->decrypt2code($param['encryptedData'], $sessionKey['session_key'],$param['iv']);
+                    if (!empty($mobileStr)) $mobile = json_decode($mobileStr,true);
+                }
+            }
+            if (empty($mobile)) return error("获取失败");
+            return successTrans("success.data",['mobile' => $mobile['purePhoneNumber']]);
+        } catch (\Throwable $throwable) {
+            return error($throwable->getMessage());
+        }
+    }
+
+    /**
+     * 解密微信用户手机号等加密数据
+     *
+     * @param string $encrypted_data Base64 编码的密文
+     * @param string $session_key    Base64 编码的会话密钥
+     * @param string $iv             Base64 编码的初始向量
+     * @return string 解密后的原始字符串(通常为 JSON)
+     * @throws Exception
+     */
+    protected function decrypt2code($encrypted_data, $session_key, $iv)
+    {
+        // 1. Base64 解码
+        $data = base64_decode($encrypted_data, true);
+        $key  = base64_decode($session_key, true);
+        $iv   = base64_decode($iv, true);
+
+        if ($data === false || $key === false || $iv === false) {
+            throw new \Exception('Base64 解码失败');
+        }
+
+        // 2. 根据密钥长度选择 AES 算法
+        $key_len = strlen($key);
+        switch ($key_len) {
+            case 16:
+                $method = 'AES-128-CBC';
+                break;
+            case 24:
+                $method = 'AES-192-CBC';
+                break;
+            case 32:
+                $method = 'AES-256-CBC';
+                break;
+            default:
+                throw new \Exception("无效的密钥长度: {$key_len} 字节");
+        }
+
+        // 3. 解密(OPENSSL_RAW_DATA 表示返回二进制数据,不进行 Base64 编码)
+        $decrypted = openssl_decrypt($data, $method, $key, OPENSSL_RAW_DATA, $iv);
+
+        if ($decrypted === false) {
+            throw new \Exception('解密失败: ' . openssl_error_string());
+        }
+
+        return $decrypted;
+    }
+
 }

+ 3 - 4
app/controller/api/Order.php

@@ -38,11 +38,10 @@ class Order extends Base
             if (!empty($param['size'])) {
                 $param['pageSize'] = $param['size'];
             }
-            if ($param['status'] > 0) {
-                $param['status'] = $param['status'] - 1;
-            }
             $param['openid'] = $request->user['openid'];
-            $data = $this->service->setModel()->getList($param);
+            $data = $this->service->setModel()->getList($param,['product' => function($query){
+                $query->field("product_id,product_name");
+            }]);
             return successTrans("success.data",pageFormat($data));
         } catch (\Throwable $th) {
             return error($th->getMessage());

+ 78 - 10
app/controller/api/Service.php

@@ -3,6 +3,7 @@
 namespace app\controller\api;
 
 use app\extra\basic\Base;
+use app\extra\tools\UploadExtend;
 use app\middleware\AuthMiddleware;
 use app\model\saas\SaasChatMsg;
 use app\model\saas\SaasChatStore;
@@ -68,9 +69,18 @@ class Service extends Base
             $store = (new SaasStore)->where("poi_id",$param['poi'])->findOrEmpty();
             if ($store->isEmpty()) return error("店铺不存在");
             $chatStore = (new SaasChatStore)->where(['poi_id'=> $store['poi_id'],"openid" => $request->user['openid']])->findOrEmpty();
+            // 获取最新的10条聊天记录
+            $msg = (new SaasChatMsg)->where(['openid' => $request->user['openid'],'poi_id' => $store['poi_id']])->append(['avatar','time'])->withAttr(['avatar' => function(){
+                return "https://washmy.oss-cn-guangzhou.aliyuncs.com/storage/20260511/23627b2cb8f73a8a90b95c31d726e6ecad0cbb9a.png";
+            },'time' => function($resp,$data){
+                return strtotime($data['create_at']) * 1000;
+            }])->order("id","desc")->paginate([
+                "list_rows" => 10,
+                "page"      => 1
+            ]);
             // 获取在线客服
             $service = (new SystemUser)->where("store_id",$param['poi'])->where("type",3)->where("is_line",1)->findOrEmpty();
-            if ($service->isEmpty()) return $this->encode("ok",['store' => $store,'code' => 3]); // 无客服在线
+            if ($service->isEmpty()) return $this->encode("ok",['store' => $store,'code' => 3,'sendId' => $request->user['openid'],'msg' => pageFormatMsg($msg),"serviceId" => 0]); // 无客服在线
             if ($chatStore->isEmpty()) {
                 $chatStore->insertGetId([
                     "poi_id"    => $store['poi_id'],
@@ -79,15 +89,6 @@ class Service extends Base
                     "service_id"    => $service['id']
                 ]);
             }
-            // 获取最新的10条聊天记录
-            $msg = (new SaasChatMsg)->where(['openid' => $request->user['openid'],'poi_id' => $store['poi_id']])->append(['avatar','time'])->withAttr(['avatar' => function(){
-                return "https://washmy.oss-cn-guangzhou.aliyuncs.com/storage/20260511/23627b2cb8f73a8a90b95c31d726e6ecad0cbb9a.png";
-            },'time' => function($resp,$data){
-                return strtotime($data['create_at']) * 1000;
-            }])->order("id","desc")->paginate([
-                "list_rows" => 10,
-                "page"      => 1
-            ]);
             return $this->encode("ok",['store' => $store,'code' => 1,'sendId' => $request->user['openid'],'msg' => pageFormatMsg($msg),"serviceId" => $service['id']]); // 客服在线
         } catch (\Throwable $throwable) {
             return error($throwable->getMessage());
@@ -155,6 +156,9 @@ class Service extends Base
                 "openid"  => $request->user['openid'],
                 "service_id"  => $param['sendId'],
                 "create_at"  => formatTime(time()),
+                "user"  => [
+                    "nickname" => $request->user['nickname']
+                ]
             ]);
             return successTrans("success.data");
         } catch (\Throwable $throwable) {
@@ -162,4 +166,68 @@ class Service extends Base
             return error($throwable->getMessage());
         }
     }
+
+    /**
+     * 发送图片消息
+     * @param Request $request
+     * @return Response
+     */
+    #[PostMapping("send/img")]
+    public function sendImgMsg(Request $request): Response
+    {
+        try {
+            $resp = UploadExtend::uploadFile();
+            if (!isset($resp[0]['url'])) return error("发送失败");
+            $param = $this->_valid([
+                "groupId.require"   => trans("empty.require"),
+                "type.require"      => trans("empty.require"),
+                "sendId.require"    => trans("empty.require"),
+            ],"post");
+            if (!is_array($param)) return error($param);
+            $param['content'] = $resp[0]['url'];
+            $state = (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" => $param['sendId'],
+            ]);
+            $api = new Api('http://127.0.0.1:3232', config('plugin.webman.push.app.app_key'),config('plugin.webman.push.app.app_secret'));
+            $api->trigger("service-{$param['sendId']}","message",[
+                "type"  =>  $param['type'],
+                "time"  =>  time() * 1000,
+                "msgId" => time(),
+                "content"   => is_array($param['content'])?json_encode($param['content']):$param['content'],
+                "source" => 1,
+                "avatar"    => "https://washmy.oss-cn-guangzhou.aliyuncs.com/storage/20260511/23627b2cb8f73a8a90b95c31d726e6ecad0cbb9a.png",
+                "poi_id"    => $param['groupId'],
+                "openid"  => $request->user['openid'],
+                "service_id"  => $param['sendId'],
+                "create_at"  => formatTime(time()),
+                "user"  => [
+                    "nickname" => $request->user['nickname']
+                ]
+            ]);
+            return successTrans("success.data",['path' => $param['content']],200);
+        } catch (\Throwable $throwable) {
+            echo $throwable->getMessage()."\n";
+            return error($throwable->getMessage());
+        }
+    }
+
+    #[PostMapping("send/address")]
+    public function setOrderAddress(Request $request): Response
+    {
+        try {
+            $param = $request->all();
+            print_r($param);
+
+            return success("提交成功");
+        } catch (\Throwable $throwable) {
+            echo $throwable->getMessage()."\n";
+            return error($throwable->getMessage());
+        }
+    }
 }

+ 50 - 0
app/controller/merchant/Order.php

@@ -0,0 +1,50 @@
+<?php
+
+namespace app\controller\merchant;
+
+use app\extra\basic\Base;
+use app\middleware\AuthMiddleware;
+use app\service\saas\GoodsService;
+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("/api/merchant/order"),Middleware(AuthMiddleware::class)]
+class Order extends Base
+{
+
+
+    #[Inject]
+    protected OrderService $service;
+
+    #[Inject]
+    protected GoodsService $goodsService;
+
+    #[GetMapping('list')]
+    public function getOrderList(Request $request): Response
+    {
+        try {
+            $param = $request->all();
+            $param['poi_id'] = $request->user['store_id'];
+            $productType = $this->goodsService->productType();
+            $data = $this->service->setModel()->getList($param,['product' => function($query) use($productType){
+                $query->field("product_id,product_name,product_type")->append(['types'])->withAttr(['types' => function($query,$resp) use($productType){
+                    $productTypeArr = [];
+                    foreach ($productType as $val) {
+                        $productTypeArr[$val['key']] = $val['name'];
+                    }
+                    return $productTypeArr[$resp['product_type']]??'';
+                }]);
+            }]);
+            return successTrans("success.data",pageFormat($data),200);
+        } catch (\Throwable $throwable) {
+            return error($throwable->getMessage());
+        }
+    }
+
+}

+ 5 - 5
app/controller/service/Service.php

@@ -95,7 +95,7 @@ class Service extends Base
                 "openid"    => $param['openid'],
                 "content"   => is_array($param['content'])?json_encode($param['content']):$param['content'],
                 "type"      => $param['type'],
-                "msgId"     => time(),
+                "msgId"     => md5($param['openid'].time()),
                 "poi_id"    => $param['groupId'],
                 "service_id" => $request->user['id'],
             ]);
@@ -103,7 +103,7 @@ class Service extends Base
             $api->trigger("user-{$param['openid']}","message",[
                 "type"  =>  $param['type'],
                 "time"  =>  time() * 1000,
-                "msgId" => time(),
+                "msgId" => md5($param['openid'].time()),
                 "content"   => is_array($param['content'])?json_encode($param['content']):$param['content'],
                 "source" => 2,
                 "avatar"    => "https://washmy.oss-cn-guangzhou.aliyuncs.com/storage/20260511/23627b2cb8f73a8a90b95c31d726e6ecad0cbb9a.png",
@@ -120,7 +120,7 @@ class Service extends Base
 
 
     #[PostMapping('send/price')]
-    public function sendPriceData(Request $request)
+    public function sendPriceData(Request $request): Response
     {
         try {
             $param = $this->_valid([
@@ -132,7 +132,7 @@ class Service extends Base
             ],"post");
             if (!is_array($param)) return error($param);
             $orderSn = CodeExtend::uniqidDate(18,"P");
-            $msgId = time();
+            $msgId = md5($param['openid'].time());
             $priceState = (new SaasOrderPrice)->insertGetId([
                 "openid"        => $param['openid'],
                 "poi_id"        => $param['groupId'],
@@ -166,7 +166,7 @@ class Service extends Base
             $api->trigger("user-{$param['openid']}","message",[
                 "type"  =>  $param['type'],
                 "time"  =>  time() * 1000,
-                "msgId" => time(),
+                "msgId" => $msgId,
                 "content"   => json_encode($msgData),
                 "source" => 2,
                 "avatar"    => "https://washmy.oss-cn-guangzhou.aliyuncs.com/storage/20260511/23627b2cb8f73a8a90b95c31d726e6ecad0cbb9a.png",

+ 11 - 0
app/extra/tools/UploadExtend.php

@@ -4,6 +4,17 @@ namespace app\extra\tools;
 
 use app\service\system\UploadService;
 
+use Tinywan\Storage\Storage;
+
+/**
+ * @see Storage
+ * @mixin Storage
+ *
+ * @method static array uploadFile(array $config = [])  上传文件
+ * @method static array uploadBase64(string $base64, string $extension = 'png') 上传Base64文件
+ * @method static array uploadServerFile(string $file_path)  上传服务端文件
+ */
+
 class UploadExtend
 {
     /**

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

@@ -27,7 +27,8 @@ class OrderService extends Service
     {
         $filter = [];
         !empty($param['openid']) && $filter[] = ["openid", '=', $param['openid']];
-        !empty($param['status']) && $filter[] = ["status", '=', $param['status']];
+        !empty($param['poi_id']) && $filter[] = ["poi_id", '=', $param['poi_id']];
+        !empty($param['status']) && $filter[] = ["status", '=', ($param['status']-1)];
         !empty($param['type']) && $filter[] = ["type", '=', $param['type']];
         !empty($param['name']) && $filter[] = ["poi_name", 'like', "%{$param['name']}%"];
         return $filter;

Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
city.json


Alguns ficheiros não foram mostrados porque muitos ficheiros mudaram neste diff