Bladeren bron

新增自动归档功能

kuaifan 5 jaren geleden
bovenliggende
commit
a7bbbab94c

+ 7 - 1
app/Http/Controllers/Api/ProjectController.php

@@ -1719,6 +1719,7 @@ class ProjectController extends Controller
                                     'id' => $task['id'],
                                     'title' => $task['title'],
                                     'operator' => $user['username'],
+                                    'action' => 'attention',
                                 ])
                             ]);
                         }
@@ -1754,6 +1755,7 @@ class ProjectController extends Controller
                                     'id' => $task['id'],
                                     'title' => $task['title'],
                                     'operator' => $user['username'],
+                                    'action' => 'unattention',
                                 ])
                             ]);
                         }
@@ -1836,12 +1838,16 @@ class ProjectController extends Controller
             if (count($lists['lists']) == 0) {
                 return Base::retError('no lists');
             }
+            $array = [];
             foreach ($lists['lists'] AS $key => $item) {
                 $item = array_merge($item, Users::username2basic($item['username']));
                 $item['other'] = Base::string2array($item['other'], ['type' => '']);
-                $lists['lists'][$key] = $item;
+                if (!in_array($item['other']['action'], ['attention', 'unattention'])) {
+                    $array[] = $item;
+                }
                 $pushlid = $item['id'];
             }
+            $lists['lists'] = $array;
             if ($pushlid != $task['pushlid']) {
                 DB::table('project_task')->where('id', $taskid)->update([
                     'pushlid' => $pushlid

+ 10 - 2
app/Http/Controllers/Api/SystemController.php

@@ -28,7 +28,7 @@ class SystemController extends Controller
      *
      * @apiParam {String} type
      * - get: 获取(默认)
-     * - save: 保存设置(参数:logo、github、reg)
+     * - save: 保存设置(参数:logo、github、reg、callav、autoArchived、archivedDay
      */
     public function setting()
     {
@@ -48,11 +48,19 @@ class SystemController extends Controller
             }
             $all = Request::input();
             foreach ($all AS $key => $value) {
-                if (!in_array($key, ['logo', 'github', 'reg'])) {
+                if (!in_array($key, ['logo', 'github', 'reg', 'callav', 'autoArchived', 'archivedDay'])) {
                     unset($all[$key]);
                 }
             }
             $all['logo'] = is_array($all['logo']) ? $all['logo'][0]['path'] : $all['logo'];
+            $all['archivedDay'] = intval($all['archivedDay']);
+            if ($all['autoArchived'] == 'open') {
+                if ($all['archivedDay'] <= 0) {
+                    return Base::retError(['自动归档时间不可小于%天!', 1]);
+                } elseif ($all['archivedDay'] > 100) {
+                    return Base::retError(['自动归档时间不可大于%天!', 100]);
+                }
+            }
             $setting = Base::setting('system', Base::newTrim($all));
         } else {
             $setting = Base::setting('system');

+ 11 - 1
app/Http/Controllers/Api/UsersController.php

@@ -313,6 +313,7 @@ class UsersController extends Controller
      * @apiParam {Object} [sorts]               排序方式,格式:{key:'', order:''}
      * - key: username|id(默认)
      * - order: asc|desc
+     * @apiParam {String} [username]            指定获取某个成员(返回对象)
      * @apiParam {Number} [firstchart]          是否获取首字母,1:获取
      * @apiParam {Number} [page]                当前页,默认:1
      * @apiParam {Number} [pagesize]            每页显示数量,默认:10,最大:100
@@ -326,6 +327,12 @@ class UsersController extends Controller
             $user = $user['data'];
         }
         //
+        $username = trim(Request::input('username'));
+        $whereArray = [];
+        if ($username) {
+            $whereArray[] = ['username', '=', $username];
+        }
+        //
         $orderBy = '`id` DESC';
         $sorts = Base::json2array(Request::input('sorts'));
         if (in_array($sorts['order'], ['asc', 'desc'])) {
@@ -336,7 +343,7 @@ class UsersController extends Controller
             }
         }
         //
-        $lists = DB::table('users')->select(['id', 'identity', 'username', 'nickname', 'userimg', 'profession', 'regdate'])->orderByRaw($orderBy)->paginate(Min(Max(Base::nullShow(Request::input('pagesize'), 10), 1), 100));
+        $lists = DB::table('users')->where($whereArray)->select(['id', 'identity', 'username', 'nickname', 'userimg', 'profession', 'regdate'])->orderByRaw($orderBy)->paginate(Min(Max(Base::nullShow(Request::input('pagesize'), 10), 1), 100));
         $lists = Base::getPageList($lists);
         if ($lists['total'] == 0) {
             return Base::retError('未找到任何相关的团队成员');
@@ -346,6 +353,9 @@ class UsersController extends Controller
             $lists['lists'][$key]['userimg'] = Users::userimg($item['userimg']);
             $lists['lists'][$key]['firstchart'] = Base::getFirstCharter($item['username']);
         }
+        if ($username) {
+            return Base::retSuccess('success', $lists['lists'][0]);
+        }
         return Base::retSuccess('success', $lists);
     }
 

+ 29 - 0
app/Jobs/Timer/SystemCronJob.php

@@ -0,0 +1,29 @@
+<?php
+
+namespace App\Jobs\Timer;
+
+use App\Tasks\AutoArchivedTask;
+use Hhxsv5\LaravelS\Swoole\Task\Task;
+use Hhxsv5\LaravelS\Swoole\Timer\CronJob;
+
+class SystemCronJob extends CronJob
+{
+    protected $i = 0;
+
+    public function interval()
+    {
+        return 60000;    // 每60秒运行一次
+    }
+
+    public function isImmediate()
+    {
+        return true;    // 是否立即执行第一次,false则等待间隔时间后执行第一次
+    }
+
+    public function run()
+    {
+        $this->i++;
+        $autoArchivedTask = new AutoArchivedTask();
+        Task::deliver($autoArchivedTask);
+    }
+}

+ 17 - 0
app/Module/Chat.php

@@ -210,4 +210,21 @@ class Chat
         if (!is_array($array['body']) || empty($array['body'])) $array['body'] = ['_' => time()];
         return $array;
     }
+
+    /**
+     * 获取跟任务有关系的(在线)用户(关注的、在项目里的、负责人、创建者)
+     * @param $taskId
+     * @return array
+     */
+    public static function getTaskUsers($taskId)
+    {
+        $tmpLists = Project::taskSomeUsers($taskId);
+        if (empty($tmpLists)) {
+            return [];
+        }
+        //
+        return Base::DBC2A(DB::table('ws')->select(['fd', 'username', 'channel'])->where([
+            ['update', '>', time() - 600],
+        ])->whereIn('username', array_values(array_unique($tmpLists)))->get());
+    }
 }

+ 28 - 0
app/Module/Project.php

@@ -73,4 +73,32 @@ class Project
         array_multisort($inOrder, SORT_ASC, $taskLists);
         return $taskLists;
     }
+
+    /**
+     * 获取跟任务有关系的用户(关注的、在项目里的、负责人、创建者)
+     * @param $taskId
+     * @return array
+     */
+    public static function taskSomeUsers($taskId)
+    {
+        $taskDeatil = Base::DBC2A(DB::table('project_task')->select(['follower', 'createuser', 'username', 'projectid'])->where('id', $taskId)->first());
+        if (empty($taskDeatil)) {
+            return [];
+        }
+        //关注的用户
+        $userArray = Base::string2array($taskDeatil['follower']);
+        //创建者
+        $userArray[] = $taskDeatil['createuser'];
+        //负责人
+        $userArray[] = $taskDeatil['username'];
+        //在项目里的用户
+        if ($taskDeatil['projectid'] > 0) {
+            $tempLists = Base::DBC2A(DB::table('project_users')->select(['username'])->where(['projectid' => $taskDeatil['projectid'], 'type' => '成员' ])->get());
+            foreach ($tempLists AS $item) {
+                $userArray[] = $item['username'];
+            }
+        }
+        //
+        return $userArray;
+    }
 }

+ 3 - 32
app/Services/WebSocketService.php

@@ -6,6 +6,7 @@ namespace App\Services;
 
 use App\Module\Base;
 use App\Module\Chat;
+use App\Module\Project;
 use App\Module\Users;
 use App\Tasks\ChromeExtendTask;
 use App\Tasks\PushTask;
@@ -276,7 +277,7 @@ class WebSocketService implements WebSocketHandlerInterface
                 if ($data['body']['type'] === 'taskA') {
                     $taskId = intval(Base::val($data['body'], 'taskDetail.id'));
                     if ($taskId > 0) {
-                        $userLists = $this->getTaskUsers($taskId);
+                        $userLists = Chat::getTaskUsers($taskId);
                     } else {
                         $userLists = $this->getTeamUsers();
                     }
@@ -438,7 +439,7 @@ class WebSocketService implements WebSocketHandlerInterface
     }
 
     /**
-     * 获取团队用户
+     * 获取团队所有在线用户
      * @return array|string
      */
     private function getTeamUsers()
@@ -447,34 +448,4 @@ class WebSocketService implements WebSocketHandlerInterface
             ['update', '>', time() - 600],
         ])->get());
     }
-
-    /**
-     * 获取跟任务有关系的用户(关注的、在项目里的、负责人、创建者)
-     * @param $taskId
-     * @return array
-     */
-    private function getTaskUsers($taskId)
-    {
-        $taskDeatil = Base::DBC2A(DB::table('project_task')->select(['follower', 'createuser', 'username', 'projectid'])->where('id', $taskId)->first());
-        if (empty($taskDeatil)) {
-            return [];
-        }
-        //关注的用户
-        $userArray = Base::string2array($taskDeatil['follower']);
-        //创建者
-        $userArray[] = $taskDeatil['createuser'];
-        //负责人
-        $userArray[] = $taskDeatil['username'];
-        //在项目里的用户
-        if ($taskDeatil['projectid'] > 0) {
-            $tempLists = Base::DBC2A(DB::table('project_users')->select(['username'])->where(['projectid' => $taskDeatil['projectid'], 'type' => '成员' ])->get());
-            foreach ($tempLists AS $item) {
-                $userArray[] = $item['username'];
-            }
-        }
-        //
-        return Base::DBC2A(DB::table('ws')->select(['fd', 'username', 'channel'])->where([
-            ['update', '>', time() - 600],
-        ])->whereIn('username', array_values(array_unique($userArray)))->get());
-    }
 }

+ 102 - 0
app/Tasks/AutoArchivedTask.php

@@ -0,0 +1,102 @@
+<?php
+namespace App\Tasks;
+
+@error_reporting(E_ALL & ~E_NOTICE);
+
+use App\Module\Base;
+use App\Module\Chat;
+use DB;
+use Hhxsv5\LaravelS\Swoole\Task\Task;
+
+/**
+ * 完成的任务自动归档
+ * Class AutoArchivedTask
+ * @package App\Tasks
+ */
+class AutoArchivedTask extends Task
+{
+
+    public function __construct()
+    {
+        //
+    }
+
+    public function handle()
+    {
+        $setting = Base::setting('system');
+        if ($setting['autoArchived'] === 'open') {
+            $archivedDay = intval($setting['archivedDay']);
+            if ($archivedDay > 0) {
+                $time = time();
+                $archivedDay = min(100, $archivedDay);
+                $archivedTime = $time - ($archivedDay * 86400);
+                //获取已完成未归档的任务
+                DB::transaction(function () use ($time, $archivedTime) {
+                    $taskLists = Base::DBC2A(DB::table('project_task')->where([
+                        ['delete', '=', 0],
+                        ['archiveddate', '=', 0],
+                        ['complete', '=', 1],
+                        ['completedate', '<=', $archivedTime],
+                    ])->take(100)->get());
+                    if ($taskLists) {
+                        $idArray = [];
+                        $logArray = [];
+                        $pushLists = [];
+                        $upArray = [
+                            'archived' => 1,
+                            'archiveddate' => $time,
+                        ];
+                        foreach ($taskLists AS $taskDetail) {
+                            $idArray[] = $taskDetail['id'];
+                            $logArray[] = [
+                                'type' => '日志',
+                                'projectid' => $taskDetail['projectid'],
+                                'taskid' => $taskDetail['id'],
+                                'username' => $taskDetail['username'],
+                                'detail' => '任务归档【自动】',
+                                'indate' => $time,
+                                'other' => Base::array2string([
+                                    'type' => 'task',
+                                    'id' => $taskDetail['id'],
+                                    'title' => $taskDetail['title'],
+                                ])
+                            ];
+                            $userLists = Chat::getTaskUsers($taskDetail['id']);
+                            if ($userLists) {
+                                foreach ($userLists as $user) {
+                                    $pushLists[] = [
+                                        'fd' => $user['fd'],
+                                        'msg' => [
+                                            'messageType' => 'user',
+                                            'username' => '::system',
+                                            'target' => $user['username'],
+                                            'time' => $time,
+                                            'body' => [
+                                                'act' => 'archived',
+                                                'type' => 'taskA',
+                                                'taskDetail' => array_merge($taskDetail, $upArray),
+                                            ]
+                                        ]
+                                    ];
+                                }
+                            }
+                        }
+                        if ($idArray) {
+                            DB::table('project_task')->whereIn('id', $idArray)->where([
+                                ['archiveddate', '=', 0],
+                                ['complete', '=', 1],
+                            ])->update($upArray);
+                        }
+                        if ($logArray) {
+                            DB::table('project_log')->insert($logArray);
+                        }
+                        if ($pushLists) {
+                            $pushTask = new PushTask($pushLists);
+                            Task::deliver($pushTask);
+                        }
+                    }
+                });
+            }
+        }
+    }
+}

+ 2 - 1
config/laravels.php

@@ -35,13 +35,14 @@ return [
         //],
     ],
     'timer'                    => [
-        'enable'        => env('LARAVELS_TIMER', false),
+        'enable'        => env('LARAVELS_TIMER', true),
         'jobs'          => [
             // Enable LaravelScheduleJob to run `php artisan schedule:run` every 1 minute, replace Linux Crontab
             //\Hhxsv5\LaravelS\Illuminate\LaravelScheduleJob::class,
             // Two ways to configure parameters:
             // [\App\Jobs\XxxCronJob::class, [1000, true]], // Pass in parameters when registering
             // \App\Jobs\XxxCronJob::class, // Override the corresponding method to return the configuration
+            \App\Jobs\Timer\SystemCronJob::class
         ],
         'max_wait_time' => 5,
     ],

+ 27 - 1
resources/assets/js/main/components/WHeader.vue

@@ -43,7 +43,7 @@
             </div>
         </div>
         <WDrawer v-model="systemDrawerShow" maxWidth="640" :title="$L('系统设置')">
-            <Form ref="formSystem" :model="formSystem" :label-width="100">
+            <Form ref="formSystem" :model="formSystem" :label-width="120">
                 <FormItem :label="$L('首页Logo')" prop="userimg">
                     <ImgUpload v-model="formSystem.logo" :num="1"></ImgUpload>
                     <span style="color:#777">{{$L('建议尺寸:%', '300x52')}}</span>
@@ -66,6 +66,18 @@
                         <Radio label="close">{{$L('关闭')}}</Radio>
                     </RadioGroup>
                 </FormItem>
+                <FormItem :label="$L('完成自动归档')" prop="autoArchived">
+                    <RadioGroup :value="formSystem.autoArchived" @on-change="formArchived">
+                        <Radio label="open">{{$L('开启')}}</Radio>
+                        <Radio label="close">{{$L('关闭')}}</Radio>
+                    </RadioGroup>
+                    <Tooltip v-if="formSystem.autoArchived=='open'" class="setting-auto-day" placement="right">
+                        <Input v-model="formSystem.archivedDay" type="number">
+                            <span slot="append">{{$L('天')}}</span>
+                        </Input>
+                        <div slot="content">{{$L('任务完成 % 天后自动归档。', formSystem.archivedDay)}}</div>
+                    </Tooltip>
+                </FormItem>
                 <FormItem>
                     <Button :loading="loadIng > 0" type="primary" @click="handleSubmit('formSystem')">{{$L('提交')}}</Button>
                     <Button :loading="loadIng > 0" @click="handleReset('formSystem')" style="margin-left: 8px">{{$L('重置')}}</Button>
@@ -250,6 +262,13 @@
             }
         }
     }
+    .setting-auto-day {
+        display: block;
+        width: 110px;
+        margin-top: 12px;
+        line-height: 32px;
+        margin-bottom: -10px;
+    }
     .setting-bg {
         margin-top: 6px;
         margin-bottom: -24px;
@@ -304,6 +323,8 @@
                     github: 'show',
                     reg: 'open',
                     callav: 'open',
+                    autoArchived: 'close',
+                    archivedDay: 7,
                 },
 
                 formDatum: {
@@ -452,6 +473,8 @@
                             this.formSystem.github = this.formSystem.github || 'show';
                             this.formSystem.reg = this.formSystem.reg || 'open';
                             this.formSystem.callav = this.formSystem.callav || 'open';
+                            this.formSystem.autoArchived = this.formSystem.autoArchived || 'close';
+                            this.formSystem.archivedDay = this.formSystem.archivedDay || 7;
                             if (save) {
                                 this.$Message.success(this.$L('修改成功'));
                             }
@@ -536,6 +559,9 @@
             },
             handleReset(name) {
                 this.$refs[name].resetFields();
+            },
+            formArchived(value) {
+                this.formSystem = { ...this.formSystem, autoArchived: value };
             }
         },
     }

+ 20 - 1
resources/assets/js/main/components/chat/Index.vue

@@ -844,6 +844,11 @@
             resCall();
             this.getSetting();
             //
+            window.onChatOpenUserName = (username) => {
+                this.$emit("on-open-notice", username);
+                this.clickDialog(username, true);
+            }
+            //
             if (this.openWindow) {
                 $A.WSOB.connection();
                 if (!this.openAlready) {
@@ -1247,10 +1252,24 @@
                 }
             },
 
-            clickDialog(username) {
+            clickDialog(username, autoPush = false) {
                 let lists = this.dialogLists.filter((item) => {return item.username == username});
                 if (lists.length > 0) {
                     this.openDialog(lists[0]);
+                } else if (autoPush === true) {
+                    $A.aAjax({
+                        url: 'users/team/lists',
+                        data: {
+                            username: username,
+                        },
+                        success: (res) => {
+                            if (res.ret === 1 && $A.isPlainObject(res.data)) {
+                                this.$nextTick(() => {
+                                    typeof this.dialogTarget.username === "undefined" && this.openDialog(res.data, true)
+                                });
+                            }
+                        }
+                    });
                 }
             },
 

+ 7 - 2
resources/assets/js/main/components/project/task/detail/detail.vue

@@ -36,7 +36,7 @@
                     </li>
                     <li class="text-status detail-icon">
                         <span>{{$L('任务状态:')}}</span>
-                        <em v-if="detail.complete" class="complete">{{$L('已完成')}}</em>
+                        <em v-if="detail.complete" class="complete">{{$L('已完成')}}<span class="completedate">({{$A.formatDate("Y-m-d H:i", detail.completedate)}})</span></em>
                         <em v-else class="unfinished">{{$L('未完成')}}</em>
                     </li>
                 </ul>
@@ -102,7 +102,7 @@
                     <div slot="content">
                         <div style="width:280px">
                             {{$L('选择关注人')}}
-                            <UserInput :multiple="true" :transfer="false" v-model="detail.attentionLists" :placeholder="$L('输入关键词搜索')" style="margin:5px 0 3px"></UserInput>
+                            <UserInput :projectid="detail.projectid" :multiple="true" :transfer="false" v-model="detail.attentionLists" :placeholder="$L('输入关键词搜索')" style="margin:5px 0 3px"></UserInput>
                             <Button :loading="!!loadData.attention" :disabled="!detail.attentionLists" class="btn" type="primary" style="text-align:center;width:72px;height:28px;font-size:13px" @click="handleTask('attention')">确 定</Button>
                         </div>
                     </div>
@@ -756,6 +756,11 @@
                             }
                             &.complete {
                                 color: #666666;
+                                .completedate {
+                                    font-size: 12px;
+                                    padding-left: 4px;
+                                    opacity: 0.6;
+                                }
                             }
                             &.overdue {
                                 color: #ff0000;

+ 1 - 1
resources/assets/js/main/main.js

@@ -421,7 +421,7 @@ import '../../sass/main.scss';
                                 other: item.other
                             };
                             res.data.follower.forEach((username) => {
-                                if (username != msgData.username) {
+                                if (username != msgData.username && username != $A.getUserName()) {
                                     $A.WSOB.sendTo('user', username, msgData, 'special');
                                 }
                             });

+ 2 - 2
resources/assets/js/main/pages/docs.vue

@@ -161,7 +161,7 @@
                     .docs-header {
                         display: flex;
                         align-items: center;
-                        margin: 6px 24px 12px;
+                        margin: 6px 24px 0;
                         padding: 12px 0;
                         border-bottom: 1px solid #eeeeee;
                         .docs-h1 {
@@ -182,7 +182,7 @@
                     }
                     .docs-section {
                         flex: 1;
-                        margin: 0 26px;
+                        padding: 12px 26px;
                         overflow: auto;
                         transform: translateZ(0);
                         .none {

+ 32 - 4
resources/assets/js/main/pages/docs/edit.vue

@@ -11,12 +11,15 @@
                 <div class="header-menu" @click="handleClick('view')"><Icon type="md-eye" /></div>-->
                 <div class="header-menu" @click="handleClick('history')"><Icon type="md-time" /></div>
                 <Poptip class="header-menu synch">
-                    <Icon type="md-contacts" :title="$L('正在协作会员')"/><em v-if="synchUsers.length > 0">{{synchUsers.length}}</em>
+                    <div class="synch-container">
+                        <Icon type="md-contacts" :title="$L('正在协作会员')"/><em v-if="synchUsers.length > 0">{{synchUsers.length}}</em>
+                    </div>
                     <ul class="synch-lists" slot="content">
                         <li class="title">{{$L('正在协作会员')}}:</li>
-                        <li v-for="item in synchUsersS">
+                        <li v-for="(item, key) in synchUsersS" :key="key" @click="handleSynch(item.username)">
                             <img class="synch-userimg" :src="item.userimg"/>
                             <user-view class="synch-username" placement="right" :username="item.username"/>
+                            <span v-if="item.username==userInfo.username" class="synch-self">{{$L('自己')}}</span>
                         </li>
                     </ul>
                 </Poptip>
@@ -158,8 +161,13 @@
                         font-size: 16px;
                     }
                     &.synch {
-                        em {
-                            padding-left: 2px;
+                        .synch-container {
+                            width: 50px;
+                            height: 38px;
+                            line-height: 38px;
+                            em {
+                                padding-left: 2px;
+                            }
                         }
                     }
                     &:hover,
@@ -185,6 +193,17 @@
                                 height: 24px;
                                 border-radius: 50%;
                             }
+                            .synch-self {
+                                padding: 1px 3px;
+                                margin-left: 5px;
+                                height: 18px;
+                                line-height: 16px;
+                                background-color: #FF5722;
+                                color: #ffffff;
+                                font-size: 12px;
+                                border-radius: 3px;
+                                transform: scale(0.95);
+                            }
                             .synch-username {
                                 padding-left: 8px;
                                 font-size: 14px;
@@ -551,6 +570,15 @@
                 }
             },
 
+            handleSynch(username) {
+                if (username == this.userInfo.username) {
+                    return;
+                }
+                if (typeof window.onChatOpenUserName === "function") {
+                    window.onChatOpenUserName(username);
+                }
+            },
+
             handleClick(act) {
                 switch (act) {
                     case "back":

+ 1 - 1
resources/assets/js/main/pages/project.vue

@@ -68,7 +68,7 @@
                 </li>
             </ul>
             <!-- 分页 -->
-            <Page v-if="listTotal > 0" class="pageBox" :total="listTotal" :current="listPage" :disabled="loadIng > 0" @on-change="setPage" @on-page-size-change="setPageSize" :page-size-opts="[10,20,30,50,100]" placement="top" show-elevator show-sizer show-total></Page>
+            <Page v-if="listTotal > 0" class="pageBox" :total="listTotal" :current="listPage" :disabled="loadIng > 0" @on-change="setPage" @on-page-size-change="setPageSize" :page-size-opts="[10,20,30,50,100]" placement="top" transfer show-elevator show-sizer show-total></Page>
         </w-content>
 
         <Modal

+ 3 - 0
resources/lang/en/general.js

@@ -424,4 +424,7 @@ export default {
     "MD编辑器": "Markdown Cell",
     "更新提示": "Update",
     "团队成员(%)更新了内容,<br/>更新时间:%。<br/><br/>点击【确定】加载最新内容。": "Team members (%) updated content, <br/> update time: %. <br/><br/> click \"ok\" to load the latest content.",
+    "完成自动归档": "Auto archiving",
+    "天": "Day",
+    "任务完成 % 天后自动归档。": "Tasks are automatically archived % days after completion.",
 }

+ 2 - 0
resources/lang/en/general.php

@@ -121,4 +121,6 @@ return [
     "[语音通话]" => "[Voice call]",
     "[视频通话]" => "[Video call]",
     "发送内容长度已超出最大限制!" => "The content length has exceeded the maximum limit!",
+    "自动归档时间不可小于%天!" => "Automatic filing time can not be less than % days!",
+    "自动归档时间不可大于%天!" => "The automatic filing time cannot be more than % days!",
 ];