2026-06-03 01:43:55 +03:30
|
|
|
@page
|
|
|
|
|
@model JobsMedical.Web.Pages.Admin.IndexModel
|
|
|
|
|
@{
|
|
|
|
|
ViewData["Title"] = "مدیریت — صف آگهیها";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
<div class="page-head">
|
|
|
|
|
<div class="container">
|
2026-06-03 08:18:19 +03:30
|
|
|
<h1>پنل مدیریت — جمعآوری و صف آگهیها</h1>
|
2026-06-03 01:43:55 +03:30
|
|
|
<p class="muted">
|
2026-06-03 08:18:19 +03:30
|
|
|
آگهیهای جمعآوریشده از منابع را بررسی، ساختارمند و منتشر کن.
|
|
|
|
|
(@JalaliDate.ToPersianDigits(Model.Queue.Count.ToString()) در صف،
|
|
|
|
|
@JalaliDate.ToPersianDigits(Model.Flagged.Count.ToString()) پرچمخورده)
|
2026-06-03 06:31:15 +03:30
|
|
|
· <a asp-page="/Admin/Facilities">تأیید مراکز درمانی</a>
|
2026-06-03 17:41:02 +03:30
|
|
|
· <a asp-page="/Admin/Settings">تنظیمات جمعآوری و AI</a>
|
2026-06-03 01:43:55 +03:30
|
|
|
</p>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
<div class="container section">
|
2026-06-03 08:18:19 +03:30
|
|
|
@if (Model.IngestMessage is not null)
|
|
|
|
|
{
|
|
|
|
|
<div class="alert alert-success">✓ @Model.IngestMessage</div>
|
|
|
|
|
}
|
|
|
|
|
|
2026-06-03 01:43:55 +03:30
|
|
|
<div class="layout-2">
|
|
|
|
|
<aside class="card card-pad filter-card">
|
2026-06-03 08:18:19 +03:30
|
|
|
<h3>موتور جمعآوری</h3>
|
|
|
|
|
<p class="muted" style="font-size:13px;">منابع متصل:</p>
|
|
|
|
|
<ul style="margin:0 0 12px; padding-inline-start:18px; font-size:13.5px;">
|
|
|
|
|
@foreach (var src in Model.Sources)
|
|
|
|
|
{
|
|
|
|
|
<li>@src.Name —
|
|
|
|
|
@if (src.Enabled) { <span style="color:var(--primary-dark);">فعال</span> }
|
|
|
|
|
else { <span class="muted">غیرفعال (نیازمند تنظیمات)</span> }
|
|
|
|
|
</li>
|
|
|
|
|
}
|
|
|
|
|
</ul>
|
|
|
|
|
<form method="post">
|
|
|
|
|
<button type="submit" asp-page-handler="RunIngestion" class="btn btn-accent btn-block">اجرای جمعآوری اکنون</button>
|
|
|
|
|
</form>
|
|
|
|
|
<p class="muted" style="font-size:11px; margin:8px 0 0;">
|
|
|
|
|
موتور: واکشی ← حذف تکراری ← تجزیه ← اعتبارسنجی ← صف بررسی.
|
|
|
|
|
</p>
|
|
|
|
|
|
|
|
|
|
<hr style="border:none; border-top:1px solid var(--line); margin:16px 0;" />
|
|
|
|
|
|
|
|
|
|
<h3>افزودن دستی</h3>
|
2026-06-03 01:43:55 +03:30
|
|
|
<form method="post">
|
|
|
|
|
<div class="filter-group">
|
2026-06-03 08:18:19 +03:30
|
|
|
<label>منبع</label>
|
2026-06-03 01:43:55 +03:30
|
|
|
<input type="text" name="SourceChannel" placeholder="مثلاً کانال شیفت تهران" />
|
|
|
|
|
</div>
|
|
|
|
|
<div class="filter-group">
|
|
|
|
|
<label>متن آگهی</label>
|
2026-06-03 08:18:19 +03:30
|
|
|
<textarea name="RawText" rows="5" placeholder="متن کپیشده را بچسبان..."></textarea>
|
2026-06-03 01:43:55 +03:30
|
|
|
</div>
|
2026-06-03 08:18:19 +03:30
|
|
|
<button type="submit" asp-page-handler="Add" class="btn btn-outline btn-block">افزودن به صف</button>
|
2026-06-03 01:43:55 +03:30
|
|
|
</form>
|
|
|
|
|
<p class="muted" style="font-size:12px; margin-bottom:0;">
|
|
|
|
|
منتشرشده: @JalaliDate.ToPersianDigits(Model.PublishedShifts.ToString()) شیفت،
|
|
|
|
|
@JalaliDate.ToPersianDigits(Model.PublishedJobs.ToString()) استخدام
|
|
|
|
|
</p>
|
|
|
|
|
</aside>
|
|
|
|
|
|
|
|
|
|
<div>
|
2026-06-03 08:18:19 +03:30
|
|
|
<h2 style="font-size:20px; margin-top:0;">صف بررسی</h2>
|
2026-06-03 01:43:55 +03:30
|
|
|
@if (Model.Queue.Count == 0)
|
|
|
|
|
{
|
2026-06-03 08:18:19 +03:30
|
|
|
<div class="card empty-state">صف خالی است. «اجرای جمعآوری» را بزن یا آگهی اضافه کن.</div>
|
2026-06-03 01:43:55 +03:30
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
foreach (var r in Model.Queue)
|
|
|
|
|
{
|
2026-06-03 08:18:19 +03:30
|
|
|
<partial name="_RawListingRow" model="r" />
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@if (Model.Flagged.Count > 0)
|
|
|
|
|
{
|
|
|
|
|
<h2 style="font-size:20px; margin-top:28px;">پرچمخورده (ناقص/مشکوک)</h2>
|
|
|
|
|
<p class="muted" style="font-size:13px;">اعتبارسنجی اینها را کامل ندانست؛ در صورت صحت میتوانی منتشرشان کنی.</p>
|
|
|
|
|
foreach (var r in Model.Flagged)
|
|
|
|
|
{
|
|
|
|
|
<partial name="_RawListingRow" model="r" />
|
2026-06-03 01:43:55 +03:30
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|