mirror of
https://github.com/kuaifan/dootask.git
synced 2026-06-25 00:32:13 +00:00
- composer: framework ^13.0、php ^8.3、laravel-s ~3.8.0、predis ^2.3、 phpunit ^11.5、tinker ^3、excel ^3.1.69、captcha ^3.5、avatar ^6.5、 ldaprecord-laravel ^4、pinyin ^5.3、notify 锁 ~1.28.0; 移除 fideloper/proxy、fruitcake/laravel-cors、facade/ignition、 laravel/sail、madnest/madzipper、手动钉的 symfony/mailer; symfony/console 锁 ^7.4(LaravelS Portal 与 console 8 的 configure(): void 类型断言不兼容) - $dates 移除:AbstractModel 改 getCasts() 合并默认 datetime 列, 3 个子模型改 $casts - Carbon 3:4 处 diffInSeconds 补 absolute 参数并取整 - LdapRecord v4:config use_ssl/use_tls→use_tls/use_starttls(env 变量名不变), LdapUser::$objectClasses 补类型声明 - Madzipper→原生 ZipArchive(Base::zipAddFiles,4 处调用) - pinyin v5 静态 API(Base::getFirstCharter/cn2pinyin) - laravolt/avatar 6.5:PatchedAvatar 修上游纵向对齐 bug (intervention 4.1.3 枚举无 middle),avatar 响应改 response()->file() - TrustProxies 改框架内置基类,CORS 改 Illuminate\Http\Middleware\HandleCors - Symfony Console 8 兼容:ManticoreSyncLock::handleSignal 新签名, pcntl 回调解耦 - 非 Swoole 运行时守卫:AbstractTask::task / PushTask::push / AbstractData(swoole table),artisan/测试上下文不再炸 Target class [swoole] does not exist - Laravel 11+ change() 丢修饰符:2023_12_07 与 2025_08_10 迁移重申 nullable/default/comment(修复 fresh 安装) - Setting/Ihttp 缺键访问加 ?? 守卫(PHP 8 警告在测试中转异常) - phpunit.xml 迁移 11 schema;UserImportParseTest 改为自建部门数据 验证:8.4 容器内 migrate:fresh --seed 213 全过;php artisan test 145 passed/1 skipped;LaravelS(Swoole 6.2.1) /health 200、登录、 token 认证、WebSocket 握手、Task 投递、头像、图片裁剪冒烟全过 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
92 lines
3.6 KiB
PHP
92 lines
3.6 KiB
PHP
<?php
|
||
|
||
namespace App\Tasks;
|
||
|
||
use App\Models\ProjectFlow;
|
||
use App\Models\ProjectFlowItem;
|
||
use App\Models\ProjectTask;
|
||
use App\Models\ProjectTaskUser;
|
||
use Carbon\Carbon;
|
||
|
||
/**
|
||
* 任务重复周期
|
||
*/
|
||
class LoopTask extends AbstractTask
|
||
{
|
||
public function __construct()
|
||
{
|
||
parent::__construct();
|
||
}
|
||
|
||
public function start()
|
||
{
|
||
ProjectTask::whereBetween('loop_at', [
|
||
Carbon::now()->subMinutes(10),
|
||
Carbon::now()
|
||
])->chunkById(100, function ($list) {
|
||
/** @var ProjectTask $item */
|
||
foreach ($list as $item) {
|
||
if ($item->parent_id > 0) {
|
||
// 如果是子任务则不处理
|
||
continue;
|
||
}
|
||
try {
|
||
$task = $item->copyTask();
|
||
// 工作流
|
||
$projectFlow = ProjectFlow::whereProjectId($task->project_id)->orderByDesc('id')->first();
|
||
if ($projectFlow) {
|
||
$projectFlowItem = ProjectFlowItem::whereFlowId($projectFlow->id)->orderBy('sort')->get();
|
||
// 赋一个开始状态
|
||
foreach ($projectFlowItem as $flowItem) {
|
||
if ($flowItem->status == 'start') {
|
||
$task->flow_item_id = $flowItem->id;
|
||
$task->flow_item_name = $flowItem->status . "|" . $flowItem->name . "|" . $flowItem->color;
|
||
if ($flowItem->userids) {
|
||
$userids = array_values(array_unique($flowItem->userids));
|
||
foreach ($userids as $uid) {
|
||
ProjectTaskUser::updateInsert([
|
||
'task_id' => $task->id,
|
||
'userid' => $uid,
|
||
], [
|
||
'project_id' => $task->project_id,
|
||
'task_pid' => $task->id,
|
||
'owner' => 1,
|
||
]);
|
||
}
|
||
}
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
// 新任务时间、周期
|
||
if ($task->start_at) {
|
||
$diffSecond = (int)Carbon::parse($task->start_at)->diffInSeconds(Carbon::parse($task->end_at), true);
|
||
$task->start_at = Carbon::parse($task->loop_at);
|
||
$task->end_at = $task->start_at->clone()->addSeconds($diffSecond);
|
||
}
|
||
// 处理子任务
|
||
$item->copySubTasks($task, [
|
||
'reset_complete' => true,
|
||
'sync_time' => true,
|
||
]);
|
||
//
|
||
$task->refreshLoop(true);
|
||
$task->addLog("创建任务来自周期任务ID:{$item->id}", [], $task->userid);
|
||
// 清空旧周期
|
||
$item->loop = '';
|
||
$item->loop_at = null;
|
||
$item->save();
|
||
$item->addLog("已创建新的周期任务ID:{$task->id},此任务关闭周期", [], $task->userid);
|
||
} catch (\Throwable $e) {
|
||
$item->addLog("生成重复任务失败:" . $e->getMessage(), [], $item->userid);
|
||
}
|
||
}
|
||
});
|
||
}
|
||
|
||
public function end()
|
||
{
|
||
|
||
}
|
||
}
|