+
+
نتایج جمعآوری
+
← صف بررسی — همهی آگهیهای جمعآوریشده و وضعیت هرکدام.
+
+
+
+
+
+ @Html.Raw(Pill("all", "همه", Model.Counts.Values.Sum()))
+ @Html.Raw(Pill("new", "در صف", C(JobsMedical.Web.Models.RawListingStatus.New)))
+ @Html.Raw(Pill("flagged", "پرچمخورده", C(JobsMedical.Web.Models.RawListingStatus.Flagged)))
+ @Html.Raw(Pill("published", "منتشرشده", C(JobsMedical.Web.Models.RawListingStatus.Normalized)))
+ @Html.Raw(Pill("discarded", "ردشده/اسپم", C(JobsMedical.Web.Models.RawListingStatus.Discarded)))
+
+
+
@P(Model.Total) نتیجه (نمایش حداکثر ۲۰۰ مورد اخیر).
+
+ @if (Model.Items.Count == 0)
+ {
+
موردی با این فیلتر نیست.
+ }
+ else
+ {
+ foreach (var r in Model.Items)
+ {
+ var (cls, label) = r.Status switch
+ {
+ JobsMedical.Web.Models.RawListingStatus.New => ("badge-day", "در صف"),
+ JobsMedical.Web.Models.RawListingStatus.Flagged => ("badge-type", "پرچمخورده"),
+ JobsMedical.Web.Models.RawListingStatus.Normalized => ("badge-verified", "منتشر شد"),
+ _ => ("badge-gender", "رد شد"),
+ };
+
+
+ @r.SourceChannel
+
+ @label
+ اطمینان @P(r.Confidence)٪
+ @JalaliDate.ToLongDate(DateOnly.FromDateTime(r.FetchedAt))
+
+
+
@(r.RawText.Length > 320 ? r.RawText.Substring(0,320) + "…" : r.RawText)
+ @if (!string.IsNullOrEmpty(r.ValidationNotes)) {
⚠ @r.ValidationNotes
}
+ @if (r.Status == JobsMedical.Web.Models.RawListingStatus.New || r.Status == JobsMedical.Web.Models.RawListingStatus.Flagged)
+ {
+
بررسی و انتشار ←
+ }
+ else if (r.LinkedShiftId is int sid)
+ {
+
مشاهده آگهی منتشرشده
+ }
+
+ }
+ }
+
diff --git a/src/JobsMedical.Web/Pages/Admin/Ingested.cshtml.cs b/src/JobsMedical.Web/Pages/Admin/Ingested.cshtml.cs
new file mode 100644
index 0000000..1cb0c05
--- /dev/null
+++ b/src/JobsMedical.Web/Pages/Admin/Ingested.cshtml.cs
@@ -0,0 +1,46 @@
+using JobsMedical.Web.Data;
+using JobsMedical.Web.Models;
+using Microsoft.AspNetCore.Authorization;
+using Microsoft.AspNetCore.Mvc;
+using Microsoft.AspNetCore.Mvc.RazorPages;
+using Microsoft.EntityFrameworkCore;
+
+namespace JobsMedical.Web.Pages.Admin;
+
+///