소스 검색

0727-0140-h01

Zory 1 주 전
부모
커밋
9e7dfdfbba

+ 1 - 0
app/controller/api/Solution.php

@@ -104,6 +104,7 @@ class Solution extends Base
                             "poi_id"        => $goods['poi_id'],
                             "img"           => $goodsImg[0]['url'],
                             "sku_name"      => $cp_extra['name'],
+                            "scene"         => $cp_extra['scene']??'',
                             "mobile"        => $msgData['phone_num']??'',
                             "pay_money"     => $msgData['total_amount']??0,
                         ]);

+ 59 - 0
app/controller/merchant/Tasks.php

@@ -0,0 +1,59 @@
+<?php
+
+namespace app\controller\merchant;
+
+use app\extra\basic\Base;
+use app\middleware\AuthMiddleware;
+use app\model\system\SystemExport;
+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;
+
+
+#[Controller("/api/tasks"),Middleware(AuthMiddleware::class)]
+class Tasks extends Base
+{
+
+
+    #[GetMapping('list')]
+    public function getTaskList(Request $request): Response
+    {
+        try {
+            $param = $request->get();
+            $mode = (new SystemExport);
+            if ($request->user['is_super'] == 0) {
+                $mode = $mode->where("uuid",$request->user['id']);
+            }
+            $list = $mode->order("create_at","desc")->select()->toArray();
+            return successTrans(100010,$list,200);
+        } catch (\Throwable $throwable) {
+            return error($throwable->getMessage());
+        }
+    }
+
+    #[PostMapping('export')]
+    public function exportOrder(Request $request): Response
+    {
+        try {
+            $param = $request->all();
+            $param['poi_id'] = $request->user['store_id'];
+            $logId = (new SystemExport)->insertGetId([
+                "uuid"      => $request->user['id'],
+                "name"      => $param['fileName'],
+                "params"    => json_encode($param),
+            ]);
+            Redis::send("export-order",[
+                "logId"     => $logId,
+                "param"     => $param,
+            ]);
+            return success("任务发起成功,请留意任务台状态并下载",[],200);
+        } catch (\Throwable $throwable) {
+            return error($throwable->getMessage());
+        }
+    }
+
+}

+ 1 - 1
app/controller/notify/Life.php

@@ -66,7 +66,7 @@ class Life extends Base
             $content = json_decode($data['content'],true);
             switch ($data['event']) {
                 case "life_product_status_change": // 商品状态变化
-                    if ($content['status'] == "GOODS_OFFLINE") { // 商品下架
+                    if (in_array($content['status'],['GOODS_OFFLINE','GOODS_BAN','GOODS_DELETE'])) { // 商品下架
                         (new SaasGoods)->where("goods_id",$content['product_id'])->update(['status' => 3]);
                     }
                     break;

+ 216 - 0
app/extra/tools/SceneData.php

@@ -0,0 +1,216 @@
+<?php
+
+namespace app\extra\tools;
+
+class SceneData
+{
+
+    /**
+     * 场景值
+     * @var array
+     */
+    protected array $data = [
+        // ==================== 抖音场景值 ====================
+        // 固定入口 021-
+        '021001' => '我的-更多-小程序',
+        '021002' => '全局扫一扫',
+        '021003' => '我的-收藏 tab 入口',
+        '021008' => '业务固定入口',
+        '021009' => '小程序跳转小程序',
+        '021010' => '小程序返回小程序',
+        '021013' => '我的订单',
+        '021014' => '发布页-添加小程序',
+        '021017' => '发布页-已添加的小程序',
+        '021018' => '发布页-添加团购组件',
+        '021020' => '小程序在系统桌面的快捷方式',
+        '021027' => '钱包-其他服务',
+        '021028' => '钱包-银行卡管理',
+        '021031' => '福利中心-banner',
+        '021036' => '个人主页-小程序模块-banner位',
+        '021037' => '电影-立即购票',
+        '021039' => '抖音-钱包-福利专区',
+        '021045' => '金币游戏',
+
+        // 搜索入口 022-
+        '022001' => '综合搜索-小程序入口',
+        '022002' => '搜索-阿拉丁卡片',
+        '022003' => '搜索-西瓜视频小程序内容-作者头像',
+        '022004' => '推荐tab-搜索(综搜)-商品卡坑位',
+        '022005' => '搜索-相关背景',
+        '022006' => '搜索-商品列表搜索-进入店铺',
+
+        // 内容入口 023-
+        '023001' => '视频页-左下角小程序链接',
+        '023002' => '视频页-评论区顶部',
+        '023003' => '企业号主页',
+        '023004' => '话题页-小程序卡片',
+        '023005' => 'POI详情页',
+        '023006' => '视频页-左下角影视综艺链接',
+        '023009' => '直播间-主播侧-预览',
+        '023010' => '直播间-用户侧-右下角小程序卡片',
+        '023012' => '直播间-用户侧-底部互动玩法',
+        '023014' => '视频页-左下角小说链接',
+        '023015' => '视频-搜索页-底bar-相关阅读',
+        '023016' => '视频页-左下角影视综艺链接-小程序卡片形式',
+        '023020' => '视频页-左下角POI-弹起小程序六分屏',
+        '023028' => '城市POI相关入口',
+        '023029' => '同城-地图模式',
+        '023030' => '关注页挂件',
+        '023040' => '小程序异形卡-订阅卡',
+
+        // 分享 024-
+        '024001' => '群聊会话内底部action_bar进入小程序',
+        '024002' => '微信对话',
+        '024003' => '微信朋友圈',
+        '024004' => 'QQ对话',
+        '024005' => 'QQ空间',
+        '024007' => '免流服务toast提示',
+        '024008' => '口令分享',
+        '024010' => '群公告',
+        '024012' => '小程序zlink回流',
+
+        // 广告 025-
+        '025001' => '广告',
+
+        // 运营位置 026-
+        '026001' => '搜索页-banner',
+        '026002' => '话题页-小程序文字链接',
+        '026003' => '推送消息-push',
+        '026004' => '消息-消息通知',
+        '026006' => '企业号-消息对话框',
+        '026007' => '我的-banner',
+
+        // 电商 027-
+        '027001' => '商品种草页',
+        '027002' => '个人主页-橱窗',
+        '027003' => '橱窗-商品卡片',
+        '027004' => '直播间-购物车-商品列表',
+        '027005' => '直播间-购物车卡片',
+        '027006' => '订单列表页',
+        '027007' => '抖音商城-我的订单-足迹-进入店铺',
+        '027008' => '售后页-进入店铺',
+        '027010' => '直播间-小房子组件',
+        '027012' => '店铺官方页',
+        '027013' => '抖音商城-品牌馆-商品卡',
+
+        // ==================== 抖音极速版场景值 ====================
+        // 固定入口 101-
+        '101001' => '设置页面入口',
+        '101002' => '扫一扫',
+        '101003' => '个人页-小程序入口',
+        '101008' => '业务固定入口-活动',
+        '101009' => '小程序跳转小程序',
+        '101010' => '小程序返回小程序',
+        '101020' => '桌面快捷方式-图标',
+        '101036' => '首页侧边栏',
+
+        // 搜索入口 102-
+        '102005' => '综合搜索-热点-相关事件',
+
+        // 内容入口 103-
+        '103001' => '搜索视频-小程序锚点入口',
+        '103003' => '抖音个人页-小程序入口',
+        '103010' => '直播间-榜单',
+        '103021' => '同城频道顶部推荐位',
+        '103040' => '小程序异形卡-订阅卡',
+
+        // 分享 104-
+        '104001' => '私信分享',
+        '104007' => '小程序分享回流页',
+
+        // 广告 105-
+        '105001' => '抖音极速版信息流广告投放',
+
+        // 运营位置 108-
+        '108013' => '订单综合入口',
+        '108014' => '发布页锚点入口-最近使用',
+
+        // ==================== 今日头条场景值 ====================
+        // 固定入口 011-
+        '011002' => '搜索中间页-上方推荐',
+        '011004' => '小程序中心-最近使用',
+        '011005' => '小程序中心-收藏',
+        '011006' => '小程序中心-发现',
+        '011007' => '扫一扫',
+        '011008' => '业务固定入口',
+        '011009' => '小程序跳转小程序',
+        '011010' => '小程序返回小程序',
+        '011014' => '我的-发现 12 宫格',
+        '011018' => '音频入口浮窗',
+        '011019' => '音频入口通知栏',
+        '011020' => '小程序桌面快捷方式',
+        '011021' => '我的-订单入口',
+
+        // 搜索入口 012-
+        '012001' => '小程序卡片搜索结果,直接搜索名字出来的结果',
+        '012002' => '小程序中心搜索结果',
+        '012003' => '搜索阿拉丁',
+        '012004' => '自然搜索结果',
+        '012005' => '搜索出 feed 中小程序内部文章',
+
+        // 内容入口 013-
+        '013001' => '分享的微头条',
+        '013002' => '小视频详情页入口-右侧 icon 样式',
+        '013003' => '小视频详情页入口-左侧链接样式',
+        '013005' => '文章详情页入口',
+        '013007' => '话题详情页入口',
+        '013008' => '头条号个人主页入口',
+        '013010' => '发布的微头条',
+        '013013' => '推荐-feed 流小程序卡片',
+
+        // 分享 014-
+        '014001' => '微信对话',
+        '014002' => '微信朋友圈',
+        '014003' => 'QQ 对话',
+        '014004' => 'Qzone',
+        '014005' => '钉钉',
+        '014006' => '系统分享',
+        '014007' => '复制链接',
+        '014009' => '口令分享',
+
+        // 推广或其他入口 015-
+        '015001' => '本地频道-频道顶部 widget',
+        '015002' => '钱包入口',
+
+        // 广告 016-
+        '016001' => '小程序广告入口',
+
+        // 消息触达 017-
+        '017001' => 'app 的推送',
+        '017002' => '系统消息通知',
+        '017003' => '客服能力;开发者与用户沟通',
+        '017004' => '短信链接跳转小程序',
+
+        // ==================== 今日头条极速版场景值 ====================
+        // 固定入口 061-
+        '061001' => '搜索页固定入口-上方最近使用',
+        '061002' => '搜索页固定入口-上方推荐',
+        '061003' => '搜索页固定入口-下方推荐',
+        '061004' => '我的-小程序列表最近使用',
+        '061008' => '业务固定入口',
+        '061009' => '小程序跳转小程序',
+        '061010' => '小程序返回小程序',
+        '061020' => '小程序桌面快捷方式',
+        '061021' => '我的-订单入口',
+
+        // 搜索入口 062-
+        '062001' => '自然搜索结果,直接搜索名字出来的结果',
+        '062002' => '小程序列表搜索结果 -> 小程序盒子搜索结果',
+        '062003' => '搜索阿拉丁',
+        '062004' => '站外搜索跳小程序',
+
+        // 内容入口 063-
+        '063012' => '生活频道-小程序卡片',
+        '063013' => 'feed 流小程序卡片',
+
+        // 推广或其他 065-
+        '065001' => '频道顶部 widget',
+        '065002' => '钱包入口',
+        '065003' => '任务页-banner',
+    ];
+
+    public function getScene($key = null)
+    {
+        return $this->data[$key]??'未知';
+    }
+}

+ 7 - 0
app/model/saas/SaasOrder.php

@@ -3,6 +3,7 @@
 namespace app\model\saas;
 
 use app\extra\basic\Model;
+use app\extra\tools\SceneData;
 use think\model\relation\HasOne;
 
 
@@ -50,6 +51,12 @@ class SaasOrder extends Model
      */
     public bool $timestamps = false;
 
+
+    public function getSceneAttr($value)
+    {
+        return (new SceneData)->getScene($value);
+    }
+
     public function product(): HasOne
     {
         return $this->hasOne(SaasGoods::class,"product_id","product_id");

+ 47 - 0
app/model/system/SystemExport.php

@@ -0,0 +1,47 @@
+<?php
+
+namespace app\model\system;
+
+use app\extra\basic\Model;
+
+
+/**
+ * @property integer $id (主键)
+ * @property integer $uuid 
+ * @property string $name 
+ * @property string $down_url 下载地址
+ * @property integer $status 0进行中1已完成
+ * @property mixed $create_at
+ */
+class SystemExport extends Model
+{
+    /**
+     * The connection name for the model.
+     *
+     * @var string|null
+     */
+    protected $connection = 'mysql';
+    
+    /**
+     * The table associated with the model.
+     *
+     * @var string
+     */
+    protected string $table = "system_export";
+    
+    /**
+     * The primary key associated with the table.
+     *
+     * @var string
+     */
+    protected string $primaryKey = "id";
+    
+    /**
+     * Indicates if the model should be timestamped.
+     *
+     * @var bool
+     */
+    public bool $timestamps = false;
+
+
+}

+ 97 - 0
app/queue/redis/slow/ExportOrder.php

@@ -0,0 +1,97 @@
+<?php
+
+namespace app\queue\redis\slow;
+
+use app\model\saas\SaasOrder;
+use app\model\system\SystemExport;
+use app\service\saas\OrderService;
+use PhpOffice\PhpSpreadsheet\Spreadsheet;
+use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
+use Webman\RedisQueue\Consumer;
+
+class ExportOrder implements Consumer
+{
+
+    /**
+     * 订单导出
+     * 更新云打印件
+     * @var string
+     */
+    public string $queue = "export-order";
+
+    /**
+     * 连接配置
+     * @var string
+     */
+    public string $connection = "default";
+
+    protected array $status = [
+        "0" => "待支付",
+        "1" => "待使用",
+        "2" => "已完成",
+        "3" => "已退款",
+        "4" => "退款中",
+        "5" => "已关闭",
+        "6" => "部分退款",
+    ];
+
+    protected array $express = [
+        "0" => "待订单完成",
+        "1" => "待发货",
+        "2" => "已发货",
+        "3" => "已签收",
+    ];
+
+    public function consume($data): bool
+    {
+        if(empty($data['logId'])) return true;
+        $spreadsheet = new Spreadsheet();
+        $title = ['店铺名称','下单人昵称','订单编号','订单状态','发货状态', '收件人', '手机号码', '收货地址', '创建时间'];
+        $sheet = $spreadsheet->getActiveSheet();
+        $titCol = 'A';
+        foreach ($title as $key => $value) {
+            // 单元格内容写入
+            $sheet->setCellValue($titCol . '1', $value);
+            $titCol++;
+        }
+        $row = 2; // 从第二行开始
+        $searchKey = (new OrderService)->searchFilter($data['param']);
+        $orderData = (new SaasOrder)->where($searchKey)->with(['address','poi','user'])->select();
+        if ($orderData->isEmpty()) {
+            (new SystemExport)->where("id",$data['logId'])->update(['status' => 2]);
+            return true;
+        }
+        foreach ($orderData as $item) {
+            $dataCol = 'A';
+            $address = "-";
+            if (!empty($item['address'])) {
+                $address = $item['address']['city_text'].$item['address']['address'];
+            }
+            $newData = [
+                "shop"      => $item['poi']['poi_name']??'-', // 店铺名称
+                "nickname"  => $item['user']['nickname']??'-', // 下单人昵称
+                "order"     => $item['order_sn']??'-', // 订单编号
+                "status"    => $this->status[$item['status']], // 订单状态
+                "express"   => $this->express[$item['express_status']], // 订单状态
+                "user"      => $item['address']['nickname']??'-',
+                "mobile"    => $item['address']['mobile']??'-',
+                "address"   => $address,
+                "create_at" => $item['create_at'],
+            ];
+            foreach ($newData as $value) {
+                $sheet->setCellValue($dataCol . $row, ' '.$value);
+                $dataCol++;
+            }
+            $row++;
+        }
+        $write = new Xlsx($spreadsheet);
+        $pathName = public_path().DIRECTORY_SEPARATOR."download".DIRECTORY_SEPARATOR.$data['param']['fileName'];
+        (new SystemExport)->where("id",$data['logId'])->update([
+            "down_url"  => "https://tran.jsshuita.cn/download/".$data['param']['fileName'],
+            "status"    => 1
+        ]);
+        $write->save($pathName);
+        return true;
+    }
+
+}

+ 28 - 0
app/queue/redis/slow/ImportOrder.php

@@ -0,0 +1,28 @@
+<?php
+
+namespace app\queue\redis\slow;
+
+use Webman\RedisQueue\Consumer;
+
+class ImportOrder implements Consumer
+{
+
+    /**
+     * 订单导入发货
+     * 更新云打印件
+     * @var string
+     */
+    public string $queue = "import-order";
+
+    /**
+     * 连接配置
+     * @var string
+     */
+    public string $connection = "default";
+
+    public function consume($data): bool
+    {
+        return true;
+    }
+
+}

+ 2 - 0
app/service/saas/GoodsService.php

@@ -46,6 +46,8 @@ class GoodsService extends Service
         !empty($param['status']) && $filter[] = ["status", '=', ($param['status']-1)];
         !empty($param['exstatus']) && $filter[] = ["status", '=', ($param['exstatus']-1)];
         !empty($param['poi_id']) && $filter[] = ["poi_id", '=', $param['poi_id']];
+        !empty($param['product_id']) && $filter[] = ["product_id", 'like', "%{$param['product_id']}%"];
+        !empty($param['goods_id']) && $filter[] = ["goods_id", 'like', "%{$param['goods_id']}%"];
         !empty($param['name']) && $filter[] = ["product_name", 'like', "%{$param['name']}%"];
         return $filter;
     }