Files
nobat724_front/lib/specialtyContent.js

144 lines
16 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// متن مقدمه و سوالات متداول صفحات فرود تخصص.
//
// دو الزام SEO اینجا با هم حل می‌شوند:
// ۱. رفع Thin Content — canonical درست، محتوای تکراری را غیرتکراری نمی‌کند.
// ۲. تنوع ساختاری — متن هر شهر/تخصص باید ساختار جمله‌بندی متفاوتی داشته باشد،
// نه یک قالب واحد با جای‌گذاری نام. برای همین از سه بلوکِ مستقل با گونه‌های
// متفاوت استفاده می‌شود که با هشِ (تخصص، شهر) انتخاب می‌شوند — خروجی پایدار
// (بین دو رندر تغییر نمی‌کند) ولی بین صفحات مختلف واگراست.
import { doctorTitle } from "@/helper";
function hash(...parts) {
const key = parts.join("|");
let value = 0;
for (let i = 0; i < key.length; i++) {
value = (value * 31 + key.charCodeAt(i)) >>> 0;
}
return value;
}
// seed همیشه unsigned گرفته می‌شود؛ با >> علامت‌دار، هش‌های بزرگ‌تر از 2^31 منفی
// می‌شدند و ایندکس منفی به undefined می‌رسید.
const pick = (variants, seed) => variants[(seed >>> 0) % variants.length];
// متن‌ها عمداً ریتم یکنواخت ندارند: بعضی جمله‌ها کوتاه و خبری‌اند و بعضی بلندتر.
// حرف‌های ربطِ قالبی («به همین دلیل»، «در نهایت»، «لازم به ذکر است») و ادعاهای
// تبلیغاتیِ بی‌پشتوانه کنار گذاشته شده‌اند؛ هر جمله به چیزی اشاره می‌کند که واقعاً
// روی همین صفحه هست: فیلدهای پروفایل، تقویم نوبت، محل‌های پذیرش، هزینه و لغو.
function openingVariants(specialty, city) {
return [
`پزشکان ${specialty} ${city} اینجا فهرست شده‌اند. هر کارت نام پزشک، درجهٔ تخصصی، محل پذیرش و اولین نوبت آزادش را نشان می‌دهد. اگر دنبال پزشک مشخصی هستید، کادر جست‌وجوی بالای صفحه نام پزشک و نام تخصص را با هم می‌گیرد. فیلترها هم هست: جنسیت پزشک، درجهٔ علمی، و اینکه فقط پزشکان دارای نوبت آزاد را ببینید.`,
`این فهرست متخصصان ${specialty} را در ${city} نشان می‌دهد. ترتیب نمایش تصادفی نیست؛ پزشکانی که هم‌اکنون نوبت خالی دارند بالاتر می‌آیند و بعد از آن امتیاز بیماران تعیین‌کننده است. روی هر کارت، تخصص و محل مطب پیداست، پس لازم نیست برای مقایسهٔ دو پزشک دو صفحه باز کنید. صفحه‌بندی هم دارد، پس فهرست بلند در یک صفحه فشرده نمی‌شود.`,
`برای پیدا کردن متخصص ${specialty} در ${city} از همین صفحه شروع کنید. کارت هر پزشک تخصص، محل پذیرش، امتیاز مراجعان و وضعیت نوبت‌دهی را کنار هم می‌گذارد. پزشکی که نوبت آزاد ندارد هم نمایش داده می‌شود، با برچسب مشخص، تا بدانید گزینه هست ولی فعلاً در دسترس نیست. فیلترها روی نشانی صفحه ثبت می‌شوند، پس لینک همین نما را می‌توانید نگه دارید.`,
`فهرست زیر پزشکان ${specialty} شهر ${city} است. آنچه در هر کارت می‌بینید از پروفایل خودِ پزشک می‌آید: درجهٔ تخصصی، محل یا محل‌های پذیرش، و امتیازی که بیماران قبلی ثبت کرده‌اند. برای دیدن ساعات کاری و تقویم نوبت، وارد پروفایل شوید. اگر ${specialty} زیرشاخه دارد، نوار بالای صفحه آن‌ها را نشان می‌دهد و می‌توانید فهرست را به یکی از زیرشاخه‌ها محدود کنید یا روی کل گروه بمانید.`,
`متخصص ${specialty} در ${city} کم نیست و همین انتخاب را سخت می‌کند. این صفحه اطلاعات همه را به یک شکل نشان می‌دهد تا مقایسه ممکن باشد: تخصص، محل مطب، امتیاز، و اینکه نزدیک‌ترین نوبت خالی کِی است. جست‌وجو با نام تخصص هم کار می‌کند، نه فقط نام پزشک؛ پزشکی که چند تخصص دارد با هر کدامشان پیدا می‌شود.`,
`اگر تازه دنبال پزشک ${specialty} در ${city} می‌گردید، از فهرست پایین شروع کنید. هر کارت خلاصه‌ای از پروفایل است و با یک کلیک به صفحهٔ کامل پزشک می‌رسید. آنجا محل‌های پذیرش، ساعات کاری هر محل و تقویم نوبت‌های خالی را می‌بینید. پزشکی که فعلاً نوبت‌دهی‌اش خاموش است هم در فهرست می‌ماند، فقط با برچسب مشخص.`,
];
}
function bodyVariants(specialty, city, doctorCount) {
const countPhrase =
doctorCount > 0
? `${doctorCount} پزشک ${specialty} در ${city} روی این سامانه پروفایل دارند`
: `فهرست پزشکان ${specialty} در ${city} در حال تکمیل است`;
return [
`${countPhrase}. کد نظام پزشکی هر پزشک روی پروفایلش درج شده و می‌توانید آن را جداگانه راستی‌آزمایی کنید. امتیازها از بیمارانی می‌آید که از همین سامانه نوبت گرفته‌اند، نه از نظرسنجی عمومی. پزشکی که هنوز نظری برایش ثبت نشده، امتیاز خالی نشان می‌دهد؛ عدد ساختگی جایگزینش نمی‌شود.`,
`${countPhrase} و اطلاعاتشان دوره‌ای بازبینی می‌شود. بخشی از این پزشکان بیش از یک محل پذیرش دارند: مطب شخصی و یک یا چند کلینیک. ساعات کاری هر محل جداست و هنگام رزرو خودتان انتخاب می‌کنید کجا مراجعه کنید. این را در تقویم نوبت هم می‌بینید، چون بازه‌های خالی هر محل فرق دارد.`,
`${countPhrase}. خدماتی که هر پزشک ارائه می‌دهد روی پروفایلش فهرست شده — از ویزیت ساده تا اقدام‌های تخصصی‌تر. هزینهٔ هر خدمت پیش از تأیید نهایی نوبت نمایش داده می‌شود، پس لازم نیست برای پرسیدن قیمت تماس بگیرید. اگر پزشک در کلینیک پذیرش داشته باشد، بیمه‌های طرف قرارداد آن مرکز روی صفحهٔ خودِ کلینیک آمده است.`,
`${countPhrase}. زیرتخصص‌ها هم جدا مشخص شده‌اند. اگر روی صفحهٔ یک گروه تخصصی هستید، پزشکانی که فقط در زیرشاخه‌های آن کار می‌کنند هم در همین فهرست می‌آیند؛ برای محدود کردن، از فهرست زیرتخصص‌های بالای صفحه استفاده کنید. پزشکی که چند زیرتخصص دارد، همه را روی پروفایلش نشان می‌دهد نه فقط یکی را.`,
`${countPhrase}. موقعیت مطب هر پزشک روی نقشه هم قابل دیدن است. اگر چند گزینه شبیه هم بودند، معمولاً همین فاصله و ساعت کاری تعیین‌کننده می‌شود. برای پزشکانی که در کلینیک پذیرش دارند، صفحهٔ خودِ کلینیک هم نشانی و شمارهٔ تماس را نشان می‌دهد و مسیر رسیدن روشن‌تر است.`,
];
}
function closingVariants(specialty, city) {
return [
`رزرو داخل پروفایل انجام می‌شود: تقویم نوبت‌های خالی را می‌بینید، یک بازه را انتخاب می‌کنید و تأییدیه پیامک می‌شود. اگر برنامه‌تان به هم خورد، لغو از بخش نوبت‌های من ممکن است و آن بازه بلافاصله برای بیمار دیگری آزاد می‌شود. سابقهٔ نوبت‌ها هم در همان حساب می‌ماند.`,
`نوبت‌گیری شبانه‌روزی است. لازم نیست منتظر ساعت اداری بمانید یا با منشی مطب تماس بگیرید. بعد از تأیید، نوبت در حساب کاربری‌تان ثبت می‌ماند و دفعهٔ بعد که به همان پزشک مراجعه کنید، کارتان کوتاه‌تر است. اگر پزشک چند محل پذیرش دارد، محلی که انتخاب کرده‌اید هم روی همان نوبت ثبت می‌شود.`,
`اگر تخصص موردنظرتان ${specialty} نبود، فهرست تخصص‌های ${city} رشته‌های دیگر را نشان می‌دهد و مسیر رزرو همه‌جا یکی است. برای شروع از سمت مرکز درمانی به‌جای پزشک هم صفحهٔ کلینیک‌های ${city} هست؛ آنجا پزشکان هر مرکز کنار هم آمده‌اند و از همان صفحه هم می‌شود نوبت گرفت.`,
`پیش از تأیید، هزینهٔ خدمتی که انتخاب کرده‌اید نمایش داده می‌شود. تأییدیه بلافاصله پیامک می‌گردد و شمارهٔ نوبت در حساب کاربری می‌ماند. لغو هم از همان‌جا انجام می‌شود. اگر پزشک برای خدمت خاصی مدت‌زمان متفاوتی تعریف کرده باشد، طول نوبت هم پیش از تأیید مشخص است.`,
`پزشکانی که در کلینیک پذیرش دارند از صفحهٔ همان کلینیک هم قابل رزروند. اگر ترجیح می‌دهید اول مرکز درمانی را انتخاب کنید و بعد پزشک را، فهرست کلینیک‌های ${city} نقطهٔ شروع دیگری است. نتیجهٔ رزرو در هر دو مسیر یکی است و تأییدیه به همان شکل پیامک می‌شود.`,
`یک نکتهٔ کاربردی: اگر پزشک بیش از یک محل پذیرش دارد، پیش از انتخاب بازه محل را تعیین کنید؛ نوبت‌های خالی هر محل جدا محاسبه می‌شود. تأییدیه پیامک می‌شود و لغو تا پیش از زمان نوبت امکان دارد. بازه‌ای که لغو کنید همان لحظه در فهرست نوبت‌های آزاد برمی‌گردد.`,
];
}
/** متن مقدمهٔ یکتا (۱۵۰–۳۰۰ کلمه) برای یک تخصص در یک شهر. */
export function buildSpecialtyIntro(specialtyName, cityName, doctorCount = 0) {
const seed = hash(specialtyName, cityName);
return [
pick(openingVariants(specialtyName, cityName), seed),
pick(bodyVariants(specialtyName, cityName, doctorCount), seed >>> 3),
pick(closingVariants(specialtyName, cityName), seed >>> 7),
].join(" ");
}
/** سوالات متداول صفحهٔ پزشک — منبع مشترک بلوک بصری و FAQPage schema. */
export function buildDoctorFaq(doctorName, specialtyName, cityName) {
const who = doctorTitle(doctorName);
return [
{
question: `چگونه از ${who} نوبت بگیرم؟`,
answer: `اول محل مراجعه را از همین صفحه انتخاب کنید، بعد از تقویم، تاریخ و ساعتی که خالی است. رزرو با تأیید شما قطعی می‌شود و پیامک تأییدیه می‌آید. نیازی به تماس تلفنی نیست.`,
},
...(specialtyName
? [
{
question: `تخصص ${who} چیست؟`,
answer: `${who} در حوزهٔ ${specialtyName} کار می‌کند. اگر تخصص دیگری هم داشته باشد، بالای همین صفحه کنار نامش آمده. خدماتی که ارائه می‌دهد پایین‌تر فهرست شده است.`,
},
]
: []),
...(cityName
? [
{
question: `مطب ${who} در کدام شهر است؟`,
answer: `در ${cityName}. نشانی دقیق و ساعات کاری در بخش موقعیت مکانی همین صفحه آمده و اگر بیش از یک محل پذیرش داشته باشد، هر کدام جداگانه با ساعت کاری خودش فهرست شده است.`,
},
]
: []),
{
question: `امکان لغو نوبت وجود دارد؟`,
answer: `بله، از بخش نوبت‌های من در حساب کاربری. هرچه زودتر لغو کنید آن بازه سریع‌تر آزاد می‌شود و بیمار دیگری می‌تواند رزروش کند.`,
},
];
}
/**
* سوالات متداول صفحهٔ تخصص — منبع مشترک بلوک بصری و FAQPage schema.
*
* روی دامنهٔ ریشه، cityName برابر «ایران» است؛ در جملهٔ سوال، نام برند طبیعی‌تر
* می‌نشیند («… در نوبت724 نوبت گرفت؟»). Title و متن مقدمه عمداً همان «ایران» را
* نگه می‌دارند، چون آنجا اشاره به گسترهٔ جغرافیایی است نه محل رزرو.
*/
export function buildSpecialtyFaq(
specialtyName,
cityName,
doctorCount = 0,
{ isRoot = false } = {}
) {
const place = isRoot ? "نوبت724" : cityName;
return [
{
question: `چطور می‌توان از متخصص ${specialtyName} در ${place} نوبت گرفت؟`,
answer: `از فهرست همین صفحه پزشک را انتخاب کنید و وارد پروفایلش شوید. آنجا تقویم نوبت‌های خالی را می‌بینید؛ یک بازه را بزنید و تأیید کنید. تأییدیه همان لحظه پیامک می‌شود. اگر پزشک چند محل پذیرش دارد، اول محل را انتخاب کنید چون نوبت‌های خالی هر محل جداست.`,
},
{
question: `چند پزشک ${specialtyName} در ${place} در دسترس است؟`,
answer:
doctorCount > 0
? `${doctorCount} پزشک ${specialtyName} در ${place} روی این سامانه پروفایل دارند. همهٔ آن‌ها لزوماً همیشه نوبت آزاد ندارند؛ کارت هر پزشک وضعیت نوبت‌دهی‌اش را نشان می‌دهد.`
: `هنوز پزشکی با تخصص ${specialtyName} در ${place} روی سامانه ثبت نشده. می‌توانید از فهرست تخصص‌ها حوزهٔ نزدیک‌تری را ببینید یا شهر دیگری را امتحان کنید.`,
},
{
question: `هزینهٔ ویزیت متخصص ${specialtyName} چقدر است؟`,
answer: `عدد ثابتی ندارد و به خدمتی که انتخاب می‌کنید، درجهٔ تخصصی پزشک و بیمه‌ای که دارید بستگی دارد. مبلغ پیش از تأیید نهایی روی همان صفحهٔ رزرو نمایش داده می‌شود، پس قبل از قطعی‌شدن نوبت می‌دانید چقدر است.`,
},
{
question: `اگر نتوانم در زمان نوبت مراجعه کنم چه کنم؟`,
answer: `از بخش نوبت‌های من در حساب کاربری‌تان نوبت را لغو کنید. هرچه زودتر لغو کنید، آن بازه سریع‌تر در فهرست نوبت‌های آزاد برمی‌گردد و بیمار دیگری می‌تواند رزروش کند.`,
},
];
}