生娃计算器加分阶段细题:只算任意一段也有 12~14 题,最多 15 题(v9)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
deploy
2026-11-04 06:16:11 +00:00
parent c801282ef7
commit 557a73edef

View File

@@ -24,6 +24,11 @@
· 新增 4 题,档次跟答案走(G() 项,不再跟路线):唐筛还是无创 DNA(screen → 筛查项)、满月百天要不要办(party → 孕妇照、报喜喜糖、新生儿摄影、满月酒、百天照、百天宴)、
宝宝用品怎么置办(gear → 待产包、推车、婴儿床、安全座椅、衣服玩具等 17 项)、给娃买哪些保险(ins → 各阶段医保和商业险);默认都按路线档次,旧账单数字不变;
· 全选阶段时题序:算哪一段 → 城市 → 头胎二胎 → 医院 → 唐筛/无创 → 顺产剖宫产 → 月子 → 满月百天 → 喂养 → 宝宝用品 → 谁带 → 上学 → 课外班 → 保险 → 月收入,共 15 题;v7 备份 /tmp/huafei-before-v8.html。
⑨ v9(2026-11-04,用户:只算一段时才 8 道、太少,要 12~15 道):
· 新增 21 道分阶段细题(QS 里带 p 的),每题都改对应账单项(G() 档次跟答案走):孕期 营养品/课程运动/妈妈用品/去医院交通,分娩 陪护/脐带血/新生儿基因筛查,
月子 产后修复/催乳/抚触游泳(医院题也问月子,管 42 天复查),0~3 岁 纸尿裤洗护/辅食/自费疫苗,看病去哪(0~18 岁),上学接送,假期安排、出去玩、吃穿、电子产品、零花钱、生日;
· 一次最多 15 题(QMAX):选的阶段多、题超了就先去掉 p 小的细题,去掉的按路线默认;只算任意一段都有 12~14 题,全选仍是 v8 那 15 题;
· 细题默认按路线档次(脐带血只富养默认存,接送跟上学路线),默认作答时账单与 v8 一致;v8 备份 /tmp/huafei-before-v9.html。
存储 localStorage「mmbox.huafei.v5」(兼容读取 v4)。推荐工具走 ../_shared/tools.js;自成一页:不引 app.js;
返回走 history.back 或相对路径 ../../ 并带回 search + hash。v4 备份 /tmp/huafei5/huafei-v4-before-v5.html。 -->
<style>
@@ -302,6 +307,12 @@ h1 .mk{background:linear-gradient(transparent 64%,rgba(24,160,88,.24) 0)}
<symbol id="o-recycle" viewBox="0 0 24 24"><path d="M7 19H4.5l2.6-4.5M7.1 14.5 5.5 17M10 5.5l2-3.5 2.6 4.5M14.6 6.5 12 6M19.5 14.5 17 19h-5M12 19l2 2M5.5 11 4 8.5M18 9.5l1.5 2.5"/></symbol>
<symbol id="o-cart" viewBox="0 0 24 24"><path d="M3 4h2.5l2 11h10.5l2-8H6.3M9 20h.01M17 20h.01"/></symbol>
<symbol id="o-umb" viewBox="0 0 24 24"><path d="M3 12a9 9 0 0 1 18 0zM12 12v6.5a2 2 0 0 0 4 0M12 3v-.5"/></symbol>
<symbol id="o-bus" viewBox="0 0 24 24"><path d="M6 17V6a2 2 0 0 1 2-2h8a2 2 0 0 1 2 2v11zM6 11h12M6 17v2.5M18 17v2.5M9 14.5h.01M15 14.5h.01"/></symbol>
<symbol id="o-car" viewBox="0 0 24 24"><path d="M4 16v-3l2-5h12l2 5v3zM4 16v2.5M20 16v2.5M4 13h16M8 15h.01M16 15h.01"/></symbol>
<symbol id="o-plane" viewBox="0 0 24 24"><path d="M3 13.5 21 6l-4.5 13-4-5.5zM12.5 13.5 21 6M12.5 13.5V19l2-3"/></symbol>
<symbol id="o-syringe" viewBox="0 0 24 24"><path d="m17 3 4 4M19 5l-3 3M16 8l-9 9-3 1 1-3 9-9zM10 8l6 6M8 13l2 2"/></symbol>
<symbol id="o-bowl" viewBox="0 0 24 24"><path d="M3 11h18a9 9 0 0 1-18 0zM8 20h8M9 7c0-1.5 1-1.5 1-3M13 7c0-1.5 1-1.5 1-3"/></symbol>
<symbol id="o-coin" viewBox="0 0 24 24"><path d="M12 21a9 9 0 1 0 0-18 9 9 0 0 0 0 18zM9 8l3 4 3-4M12 12v5M9.5 12.5h5M9.5 15h5"/></symbol>
<symbol id="o-bldg2" viewBox="0 0 24 24"><path d="M3 21h18M5 21V10h6v11M11 21V6h8v15M14 9.5h2M14 13h2M14 16.5h2M7.5 13.5h1M7.5 17h1"/></symbol>
<symbol id="o-house" viewBox="0 0 24 24"><path d="M3.5 11L12 4l8.5 7M6 9.5V20h12V9.5"/><path d="M10 20v-5h4v5"/></symbol>
<symbol id="o-tree" viewBox="0 0 24 24"><path d="M2.5 13L8 8.5l5.5 4.5M4.5 11.5V20h7v-8.5"/><path d="M17.5 20v-5M17.5 4.5c-2.2 0-3.5 2.5-3.5 5 0 2.8 1.6 4.5 3.5 4.5s3.5-1.7 3.5-4.5c0-2.5-1.3-5-3.5-5zM2 20h20"/></symbol>
@@ -433,18 +444,56 @@ h1 .mk{background:linear-gradient(transparent 64%,rgba(24,160,88,.24) 0)}
['普通地级市', '三四线城市', 'house'], ['县城及乡镇', '县城、镇上', 'tree']] },
{ k: 'kid', h: '这是第几个宝宝?', s: '老大的东西能接着用', if: function (st) { return has(st, [0, 1, 2, 3, 4]); }, o: [
['头胎', '推车、衣服、玩具都要新添置', 'one'], ['二胎及以上', '大件和衣物能复用一部分', 'layers']] },
{ k: 'hosp', h: '打算在哪类医院产检、生娃?', s: '产检和分娩的费用,主要看医院', if: function (st) { return has(st, [0, 1]); }, o: [
{ k: 'hosp', h: '打算在哪类医院产检、生娃?', s: '产检、分娩和产后复查,主要看医院', if: function (st) { return has(st, [0, 1, 2]); }, o: [
['公立医院普通门诊', '建档产检、普通病房,医保能报', 'hosp'], ['公立医院特需', '特需门诊、单间病房,自费多一些', 'star'],
['私立妇产医院', '产检分娩套餐、VIP 病房', 'gem']] },
{ k: 'screen', h: '唐筛还是无创 DNA?', s: '查胎儿染色体的那一项,价格差好几倍', if: function (st) { return has(st, [0]); }, o: [
['唐氏筛查', '常规抽血筛查,几百元', 'heart'], ['无创 DNA(NIPT)', '准确率更高,一两千元', 'dna'],
['无创 DNA 加强版', '多查几种染色体异常', 'gem']] },
{ k: 'pnut', h: '孕期营养品怎么补?', s: '叶酸、DHA、钙铁、孕妇奶粉', p: 5, if: function (st) { return has(st, [0]); }, o: [
['只补必需的', '叶酸、钙铁按医生说的吃', 'sprout'],
['常规几样都补', 'DHA、钙铁维生素,喝点孕妇奶粉', 'drop'],
['进口全套', '进口营养品,孕妇奶粉天天喝', 'gem']] },
{ k: 'pclass', h: '孕期要上课、做运动吗?', s: '孕妇学校、孕期瑜伽、产前私教', p: 3, if: function (st) { return has(st, [0]); }, o: [
['医院孕妇学校', '免费为主,在家自己练', 'book'],
['报个瑜伽或课程', '孕期瑜伽、分娩课', 'music'],
['请私教', '一对一孕期私教和产前课', 'star']] },
{ k: 'momgear', h: '妈妈自己的用品呢?', s: '孕妇装、孕妇枕、哺乳内衣、吸奶器这些', p: 4, if: function (st) { return has(st, [0, 2]); }, o: [
['够用就行', '宽松旧衣先穿着,少买几件', 'recycle'],
['舒服实用', '买几套孕妇装,吸奶器选好用的', 'cart'],
['买好的', '大牌孕妇装、护肤、电动吸奶器', 'gem']] },
{ k: 'ptrans', h: '去医院产检、生娃怎么去?', s: '十来次产检加上住院,路费也不少', p: 2, if: function (st) { return has(st, [0, 1]); }, o: [
['公交地铁', '能坐公交就不打车', 'bus'],
['打车为主', '孕晚期基本都打车', 'car'],
['专车或自驾', '停车费、专车都算上', 'gem']] },
{ k: 'birth', h: '预计顺产还是剖宫产?', s: '剖宫产手术费更高、要多住几天', d: 2, if: function (st) { return has(st, [1]); }, o: [
['顺产', '一般住院 2~3 天,可选无痛', 'heart'], ['剖宫产', '一般住院 4~6 天,手术和麻醉另算', 'med'],
['还不确定', '按顺产估,再留一点剖宫产的差价', 'ask']] },
{ k: 'stay', h: '住院谁来陪护?', s: '陪护床、护工按天算', p: 3, if: function (st) { return has(st, [1]); }, o: [
['家里人陪', '租个陪护床就行', 'family'],
['请个护工', '白天晚上有人搭把手', 'nurse'],
['一对一护工', '专人照顾妈妈和宝宝', 'star']] },
{ k: 'cord', h: '脐带血要存吗?', s: '自体库一次交费,之后每年还有保管费', p: 4, if: function (st) { return has(st, [1]); }, o: [
['不存', '大多数家庭的选择', 'heart'],
['存自体库', '给宝宝留一份,2 万元左右', 'dna']] },
{ k: 'nbs', h: '新生儿筛查要加项吗?', s: '足跟血、听力是常规,基因筛查要另交钱', p: 1, d: 0, if: function (st) { return has(st, [1]); }, o: [
['只做常规', '足跟血和听力筛查', 'heart'],
['加做基因筛查', '多查一些遗传病,一两千元', 'dna']] },
{ k: 'yuezi', h: '月子打算怎么坐?', s: '坐月子是生娃前后最大的一笔', if: function (st) { return has(st, [2]); }, o: [
['家里人照顾', '家人做月子餐、帮带宝宝', 'family'], ['请月嫂到家', '26 天住家月嫂', 'nurse'],
['住月子中心', '28 天,吃住护理都包', 'bldg2']] },
{ k: 'recov', h: '产后修复打算怎么做?', s: '盆底、腹直肌,越早做越好', p: 5, if: function (st) { return has(st, [2]); }, o: [
['医院盆底康复', '医保能报一部分', 'hosp'],
['修复机构疗程', '盆底、腹直肌一起做', 'star'],
['修复加私教塑形', '一对一,做全套', 'gem']] },
{ k: 'cuiru', h: '涨奶、堵奶怎么办?', s: '催乳、通乳按次收费', p: 3, if: function (st) { return has(st, [2]); }, o: [
['自己和家人揉', '实在不行再找人', 'family'],
['请催乳师几次', '涨奶、堵奶时上门', 'nurse'],
['包个通乳套餐', '整个月子随叫随到', 'star']] },
{ k: 'swim', h: '宝宝抚触、游泳要去吗?', s: '新生儿抚触、婴儿游泳馆', p: 2, if: function (st) { return has(st, [2]); }, o: [
['在家自己做', '跟着视频学抚触', 'house'],
['偶尔去游几次', '游泳馆按次买', 'drop'],
['办卡定期去', '抚触、游泳、按摩办卡', 'star']] },
{ k: 'party', h: '满月、百天这些要办吗?', s: '孕妇照、满月酒、百天照,仪式感也是一笔', if: function (st) { return has(st, [0, 1, 2, 3]); }, o: [
['简单过', '自己拍拍照,家里吃顿饭', 'heart'], ['请亲友聚一聚', '拍套写真,摆几桌', 'cake'],
['办得隆重', '棚拍写真,满月、百天都办宴', 'camera']] },
@@ -453,19 +502,69 @@ h1 .mk{background:linear-gradient(transparent 64%,rgba(24,160,88,.24) 0)}
{ k: 'gear', h: '宝宝用品怎么置办?', s: '待产包、推车、婴儿床、衣服玩具,档次差得多', if: function (st) { return has(st, [0, 1, 3, 4]); }, o: [
['能省则省', '亲戚送的、二手的接着用', 'recycle'], ['实用为主', '国产好牌子,够用就好', 'cart'],
['一步到位', '大牌、颜值高的直接买', 'gem']] },
{ k: 'diaper', h: '纸尿裤和洗护用哪种?', s: '要用到两三岁,一天好几片', p: 4, if: function (st) { return has(st, [3, 4]); }, o: [
['平价国产', '性价比高的牌子', 'cart'],
['国产大牌', '好用不红屁屁', 'star'],
['进口大牌', '日本、欧洲进口', 'globe']] },
{ k: 'food', h: '辅食和零食怎么准备?', s: '6 个月加辅食,之后吃得越来越多', p: 3, if: function (st) { return has(st, [3, 4]); }, o: [
['家里自己做', '米粉、菜泥自己蒸', 'house'],
['自己做加买点', '买米粉、果泥、宝宝零食', 'bowl'],
['买有机进口', '有机辅食、进口零食', 'gem']] },
{ k: 'vac', h: '自费疫苗打不打?', s: '免费疫苗之外,还有 13 价、五联、流感、手足口', p: 5, if: function (st) { return has(st, [3, 4]); }, o: [
['只打必要的', '免费的打齐,偶尔补一针', 'shield2'],
['挑几针打', '13 价、五联、流感这些', 'syringe'],
['能打的都打', '自费疫苗全打', 'gem']] },
{ k: 'care', h: '0~3 岁,白天谁带娃?', s: '产假结束后的安排,差别很大', if: function (st) { return has(st, [3, 4, 5]); }, o: [
['老人或自己带', '给老人一点补贴,3 岁上幼儿园', 'family'], ['家里带,2 岁上托班', '第 3 年交托班费', 'flag'],
['请育儿嫂', '住家或白班阿姨,带到上幼儿园', 'nurse'], ['1 岁半上托育园', '全日托,按月费算', 'school']] },
{ k: 'doc', h: '娃生病了一般去哪看?', s: '儿保体检、看病拿药,一年好几回', p: 4, if: function (st) { return has(st, [3, 4, 5, 6, 7, 8]); }, o: [
['公立医院儿科', '排队久一点,医保能报', 'hosp'],
['公立加特需门诊', '着急就挂特需', 'star'],
['私立儿科', '不用排队,费用自付', 'gem']] },
{ k: 'school', h: '上学打算走哪条路?', s: '幼儿园到高中,学费差距最大的一项', if: function (st) { return has(st, [5, 6, 7, 8]); }, o: [
['公立为主', '普惠园 + 就近公立学校', 'book'], ['民办私立', '民办园 + 民办中小学', 'cap'], ['国际学校', '双语园 + 国际学校', 'globe']] },
{ k: 'commute', h: '上学怎么接送?', s: '幼儿园到初中,天天都要跑', p: 2, if: function (st) { return has(st, [5, 6, 7]); }, o: [
['家人接送', '走路、电动车或公交', 'family'],
['校车或公交', '按学期交校车费', 'bus'],
['专车或校车', '专人接送、私校校车', 'car']] },
{ k: 'extra', h: '早教和课外班呢?', s: '早教、兴趣班、补习,一路算下去', if: function (st) { return has(st, [3, 4, 5, 6, 7, 8]); }, o: [
['顺其自然', '以玩为主,偶尔报一门', 'sprout'], ['适度报几门', '一两门兴趣 + 必要补习', 'music'], ['拼一把', '早教、兴趣、补习一个不落', 'rocket']] },
{ k: 'camp', h: '寒暑假怎么安排?', s: '托管班、夏令营、研学、游学', p: 3, if: function (st) { return has(st, [6, 7, 8]); }, o: [
['在家或托管班', '报个假期托管班', 'house'],
['夏令营和研学', '每年报一两个', 'flag'],
['海外游学', '出国研学营', 'globe']] },
{ k: 'trip', h: '一家人多久出去玩一次?', s: '游乐场、亲子游、家庭旅行', p: 3, if: function (st) { return has(st, [4, 5, 6, 7, 8]); }, o: [
['周边转转', '公园、游乐场为主', 'tree'],
['每年一两次旅行', '国内亲子游', 'car'],
['常出国玩', '每年出境游', 'plane']] },
{ k: 'cloth', h: '平时吃穿用度呢?', s: '吃饭、衣服鞋子,一年下来是大头', p: 2, if: function (st) { return has(st, [5, 6, 7, 8]); }, o: [
['朴素过日子', '吃饱穿暖,不讲牌子', 'house'],
['舒服体面', '常买新衣,吃得好一点', 'cart'],
['挑好的买', '有机食材、品牌童装', 'gem']] },
{ k: 'digi', h: '平板、手机、电脑买什么档?', s: '学习机、手表,到手机电脑', p: 2, if: function (st) { return has(st, [6, 7, 8]); }, o: [
['够用就行', '平价学习机、旧手机', 'recycle'],
['主流品牌', '学习平板、主流手机电脑', 'cart'],
['都买最新款', '一出新款就换', 'gem']] },
{ k: 'pocket', h: '零花钱给多少?', s: '从小学一直给到高中', p: 1, if: function (st) { return has(st, [6, 7, 8]); }, o: [
['少给一点', '一周几块到几十', 'coin'],
['跟同学差不多', '不多不少', 'cart'],
['宽裕些', '想买就买', 'gem']] },
{ k: 'gift', h: '生日和节日怎么过?', s: '生日礼物、节日、拍照', p: 1, if: function (st) { return has(st, [4, 5, 6, 7]); }, o: [
['简单过', '家里吃顿饭、买个蛋糕', 'cake'],
['用心准备', '礼物、拍照每年都有', 'star'],
['办派对', '生日派对、大礼物', 'gem']] },
{ k: 'ins', h: '给娃买哪些保险?', s: '从出生一直交到 18 岁,差别不小', if: function (st) { return has(st, [3, 4, 5, 6, 7, 8]); }, o: [
['只上少儿医保', '每年几百元,看病能报', 'shield2'], ['医保加商业医疗险', '再补一份百万医疗、意外险', 'umb'],
['高端医疗加重疾险', '私立医院能直付,重疾也保上', 'gem']] },
{ k: 'inc', type: 'income', h: '你家每月收入大概多少?', s: '填了能看看这张账单相当于你家几年的收入' }
];
var QK = {}; QS.forEach(function (q) { QK[q.k] = q; });
/* v9:带 p 的是分阶段细题,默认跟路线档次(量力 0 / 从容 1 / 富养 2);脐带血只有富养默认存,接送跟上学路线走 */
var TIER_DEF = { cord: [0, 0, 1], commute: [0, 0, 2] };
ROUTES.forEach(function (R, i) {
QS.forEach(function (q) { if (q.p && q.d == null && R.def[q.k] == null) R.def[q.k] = TIER_DEF[q.k] ? TIER_DEF[q.k][i] : i; });
});
var QMAX = 15; // 一次最多 15 题;超了先去掉 p 小的细题(同 p 去后面的),去掉的按默认算
var CITY_S = ['一线城市', '新一线/省会', '地级市', '县城乡镇'];
/* ================= 费用表(单位:元,2025~2026 国内常见公开行情;基准 = 新一线及省会) =================
@@ -501,14 +600,14 @@ h1 .mk{background:linear-gradient(transparent 64%,rgba(24,160,88,.24) 0)}
D('hosp', '四维彩超', [[300, 600], [500, 1000], [800, 2000]], 'm'),
D('hosp', '糖耐量和血液检查', [[300, 600], [500, 1000], [800, 1500]], 'm'),
D('hosp', '胎心监护', [[200, 500], [400, 800], [800, 1500]], 'm'),
I('孕妇奶粉', [0, 600], [1200, 2400], [2400, 4800], 'g'),
I('叶酸、DHA、钙铁维生素', [500, 1200], [1500, 3000], [3000, 6000], 'g'),
I('孕妇装和孕妇内衣', [600, 1500], [1500, 3500], [4000, 10000], 'g'),
I('防辐射服、托腹带', [150, 400], [400, 800], [800, 2000], 'g'),
I('妊娠油和孕期护肤', [100, 300], [400, 1000], [1500, 4000], 'g'),
I('孕妇枕、孕妇鞋', [150, 400], [300, 800], [800, 2000], 'g'),
I(['孕妇学校(免费为主)', '孕期瑜伽和课程', '孕期私教和产前课程'], [0, 200], [1000, 3000], [5000, 12000], 's'),
I('产检交通和打车', [500, 1500], [1500, 3000], [3000, 6000], 's'),
G('pnut', '孕妇奶粉', [0, 600], [1200, 2400], [2400, 4800], 'g'),
G('pnut', '叶酸、DHA、钙铁维生素', [500, 1200], [1500, 3000], [3000, 6000], 'g'),
G('momgear', '孕妇装和孕妇内衣', [600, 1500], [1500, 3500], [4000, 10000], 'g'),
G('momgear', '防辐射服、托腹带', [150, 400], [400, 800], [800, 2000], 'g'),
G('momgear', '妊娠油和孕期护肤', [100, 300], [400, 1000], [1500, 4000], 'g'),
G('momgear', '孕妇枕、孕妇鞋', [150, 400], [300, 800], [800, 2000], 'g'),
G('pclass', ['孕妇学校(免费为主)', '孕期瑜伽和课程', '孕期私教和产前课程'], [0, 200], [1000, 3000], [5000, 12000], 's'),
G('ptrans', '产检交通和打车', [500, 1500], [1500, 3000], [3000, 6000], 's'),
G('party', ['孕妇照(自己拍为主)', '孕妇写真', '孕妇写真(棚拍)'], [0, 300], [1000, 3000], [3000, 8000], 's'),
G('gear', '待产包', [500, 1200], [1200, 2500], [2500, 5000], 'g', 0.6)
],
@@ -520,14 +619,15 @@ h1 .mk{background:linear-gradient(transparent 64%,rgba(24,160,88,.24) 0)}
function (s) { return s.birth === 1 ? [[500, 1200], [800, 1500], [1000, 3000]][s.hosp] : [[1000, 2500], [2000, 4000], [3000, 8000]][s.hosp]; }, 'm'),
F(function (s) { return ['病房床位', '单间升级', 'VIP 套房升级'][s.hosp] + (s.birth === 1 ? '(多住几天)' : ''); },
function (s) { return sc3([[300, 800], [2000, 5000], [5000, 15000]][s.hosp], [1, 1.6, 1.2][s.birth]); }, 'm'),
I('陪护床和护工', [300, 800], [1000, 2500], [2000, 5000], 's'),
G('stay', '陪护床和护工', [300, 800], [1000, 2500], [2000, 5000], 's'),
D('hosp', '新生儿筛查(听力、足跟血)', [[300, 800], [500, 1200], [1500, 3000]], 'm'),
F('新生儿基因筛查(加做)', function (s) { return s.nbs ? [1000, 2500] : [0, 0]; }, 'm'),
G('gear', '新生儿尿片、衣服、包被', [200, 500], [400, 800], [800, 1500], 'g'),
I('产妇用品(产褥垫、收腹带)', [200, 500], [400, 800], [800, 1500], 'g'),
F(function (s) { return ['住院餐', '住院营养餐', '院内营养月子餐'][s.hosp]; }, function (s) { return sc3([[300, 800], [800, 1500], [2000, 4000]][s.hosp], [1, 1.6, 1.2][s.birth]); }, 's'),
I('脐带血存储', [0, 0], [0, 0], [15000, 25000], '0'),
F('脐带血存储(自体库)', function (s) { return s.cord ? [15000, 25000] : [0, 0]; }, '0'),
G('party', '报喜红包和喜糖', [500, 1500], [1000, 3000], [3000, 8000], 'g'),
I('家属交通和餐费', [300, 800], [500, 1500], [1000, 3000], 's'),
G('ptrans', '家属交通和餐费', [300, 800], [500, 1500], [1000, 3000], 's'),
F('生育保险报销(预估)', function (s) { return sc3([[-5000, -2500], [-4500, -2000], [-2500, -500]][s.hosp], [1, 1.4, 1.1][s.birth]); }, 'm')
],
// ③ 坐月子
@@ -535,14 +635,14 @@ h1 .mk{background:linear-gradient(transparent 64%,rgba(24,160,88,.24) 0)}
F(function (s) { return ['月子餐食材(家人做)', '住家月嫂 26 天', s.T === 2 ? '高端月子中心 28 天' : '月子中心 28 天'][s.yuezi]; },
function (s) { return YUEZI[s.yuezi][s.T]; }, 's'),
F('月子餐食材和营养汤', function (s) { return s.yuezi === 1 ? [[1500, 3000], [2000, 4000], [3000, 6000]][s.T] : [0, 0]; }, 'g'),
F('催乳和通乳', function (s) { return s.feed === 2 ? [0, 0] : [[0, 500], [800, 2000], [2000, 5000]][s.T]; }, 's'),
F('吸奶器和储奶袋', function (s) { return s.feed === 2 ? [0, 0] : [[300, 800], [800, 2000], [2000, 4000]][s.T]; }, 'g', 0.5),
F('哺乳内衣和防溢乳垫', function (s) { return s.feed === 2 ? [0, 0] : [[200, 500], [400, 900], [800, 2000]][s.T]; }, 'g'),
I('产妇卫生巾和月子服', [300, 700], [500, 1200], [1000, 2500], 'g'),
I(['产后盆底康复(医院)', '产后修复疗程', '产后修复和私教塑形'], [500, 1500], [3000, 6000], [10000, 25000], 's'),
I('产后 42 天复查', [200, 500], [400, 1000], [1000, 3000], 'm'),
I('宝宝 42 天体检', [200, 500], [300, 800], [800, 2000], 'm'),
I('新生儿抚触和游泳', [0, 300], [600, 1500], [2000, 5000], 's'),
F('催乳和通乳', function (s) { return s.feed === 2 ? [0, 0] : [[0, 500], [800, 2000], [2000, 5000]][s.cuiru]; }, 's'),
F('吸奶器和储奶袋', function (s) { return s.feed === 2 ? [0, 0] : [[300, 800], [800, 2000], [2000, 4000]][s.momgear]; }, 'g', 0.5),
F('哺乳内衣和防溢乳垫', function (s) { return s.feed === 2 ? [0, 0] : [[200, 500], [400, 900], [800, 2000]][s.momgear]; }, 'g'),
G('momgear', '产妇卫生巾和月子服', [300, 700], [500, 1200], [1000, 2500], 'g'),
G('recov', ['产后盆底康复(医院)', '产后修复疗程', '产后修复和私教塑形'], [500, 1500], [3000, 6000], [10000, 25000], 's'),
G('hosp', '产后 42 天复查', [200, 500], [400, 1000], [1000, 3000], 'm'),
G('hosp', '宝宝 42 天体检', [200, 500], [300, 800], [800, 2000], 'm'),
G('swim', '新生儿抚触和游泳', [0, 300], [600, 1500], [2000, 5000], 's'),
G('party', '新生儿摄影', [0, 500], [1000, 3000], [3000, 8000], 's'),
G('party', ['满月家宴和喜糖', '满月酒和喜糖', '满月宴和回礼'], [2000, 6000], [5000, 15000], [15000, 40000], 'g')
],
@@ -550,14 +650,14 @@ h1 .mk{background:linear-gradient(transparent 64%,rgba(24,160,88,.24) 0)}
[
F(function (s) { return ['国产奶粉', '国产高端奶粉', '进口有机奶粉'][s.T] + ['(偶尔补充)', '(混合喂养)', '(全奶粉喂养)'][s.feed]; },
function (s) { return sc3(MILK1[s.T], MILK_F[s.feed]); }, 'g'),
I('米粉和辅食', [800, 1500], [1500, 3000], [3000, 6000], 'g'),
G('food', '米粉和辅食', [800, 1500], [1500, 3000], [3000, 6000], 'g'),
G('gear', '奶瓶和奶嘴', [200, 400], [400, 800], [800, 1500], 'g'),
G('gear', '温奶器、消毒器', [200, 400], [400, 900], [1000, 2500], 'g', 0.5),
G('gear', '辅食机、加湿器等小家电', [300, 800], [800, 2000], [2000, 5000], 'g', 0.6),
I('纸尿裤', [2000, 3200], [3200, 4800], [4800, 7200], 'g'),
I('湿巾和棉柔巾', [400, 700], [600, 1000], [1000, 1800], 'g'),
I('隔尿垫和口水巾', [100, 250], [200, 400], [400, 800], 'g'),
I('洗护用品和护臀膏', [300, 600], [600, 1200], [1500, 3000], 'g'),
G('diaper', '纸尿裤', [2000, 3200], [3200, 4800], [4800, 7200], 'g'),
G('diaper', '湿巾和棉柔巾', [400, 700], [600, 1000], [1000, 1800], 'g'),
G('diaper', '隔尿垫和口水巾', [100, 250], [200, 400], [400, 800], 'g'),
G('diaper', '洗护用品和护臀膏', [300, 600], [600, 1200], [1500, 3000], 'g'),
G('gear', '婴儿床和床品', [600, 1500], [1500, 3500], [5000, 12000], 'g', 0.4),
G('gear', '推车', [300, 800], [1500, 3500], [4000, 9000], 'g', 0.4),
G('gear', '安全座椅', [400, 900], [1200, 2500], [3000, 6000], 'g', 0.5),
@@ -566,9 +666,9 @@ h1 .mk{background:linear-gradient(transparent 64%,rgba(24,160,88,.24) 0)}
G('gear', '包被和睡袋', [150, 400], [400, 800], [1000, 2500], 'g', 0.6),
G('gear', '玩具和绘本', [400, 1000], [1000, 2500], [3000, 8000], 'g', 0.7),
D('extra', ['亲子游戏(在家)', '亲子早教体验课', '亲子早教年卡'], [[0, 500], [2000, 5000], [10000, 20000]], 's'),
I(['自费疫苗(少量)', '自费疫苗(13 价、五联等)', '自费疫苗全打'], [500, 2000], [4000, 6000], [6000, 9000], '0'),
I(['儿保体检', '儿保体检', '私立儿科体检'], [200, 500], [500, 1200], [2000, 5000], 'm'),
I(['看病和医药', '看病和医药', '私立儿科看病'], [600, 2000], [1500, 3000], [4000, 10000], 'm'),
G('vac', ['自费疫苗(少量)', '自费疫苗(13 价、五联等)', '自费疫苗全打'], [500, 2000], [4000, 6000], [6000, 9000], '0'),
G('doc', ['儿保体检', '儿保体检', '私立儿科体检'], [200, 500], [500, 1200], [2000, 5000], 'm'),
G('doc', ['看病和医药', '看病和医药', '私立儿科看病'], [600, 2000], [1500, 3000], [4000, 10000], 'm'),
G('ins', ['少儿医保', '少儿医保和医疗险', '高端医疗险和重疾险'], [400, 600], [800, 2000], [8000, 15000], '0'),
G('party', '百天照、周岁照', [0, 600], [1000, 3000], [3000, 8000], 's'),
G('party', ['百天、周岁家宴', '百天宴、周岁宴', '百天宴、周岁宴'], [1000, 4000], [4000, 10000], [10000, 30000], 'g'),
@@ -578,22 +678,22 @@ h1 .mk{background:linear-gradient(transparent 64%,rgba(24,160,88,.24) 0)}
// ⑤ 1~3 岁(f1 = 属于 1~2 岁那一年的比例,用来算 2 岁累计)
[
F(function (s) { return ['国产奶粉', '国产高端奶粉', '进口高端奶粉'][s.T]; }, function (s) { return sc3([[3000, 6000], [6000, 10000], [12000, 18000]][s.T], [0.7, 0.85, 1][s.feed]); }, 'g'),
I('纸尿裤和拉拉裤', [2000, 3500], [3000, 5000], [4500, 7000], 'g'),
I('湿巾和洗护用品', [600, 1200], [1000, 2000], [2000, 4000], 'g'),
I('辅食、水果和零食', [4000, 8000], [6000, 12000], [12000, 24000], 'g'),
G('diaper', '纸尿裤和拉拉裤', [2000, 3500], [3000, 5000], [4500, 7000], 'g'),
G('diaper', '湿巾和洗护用品', [600, 1200], [1000, 2000], [2000, 4000], 'g'),
G('food', '辅食、水果和零食', [4000, 8000], [6000, 12000], [12000, 24000], 'g'),
G('gear', '餐椅和儿童餐具', [200, 500], [500, 1200], [1500, 3500], 'g', 0.5),
G('gear', '衣服鞋袜', [2000, 4000], [4000, 8000], [10000, 20000], 'g', 0.8),
G('gear', '玩具和积木', [800, 2000], [2000, 5000], [6000, 15000], 'g', 0.8),
I('绘本', [300, 800], [800, 2000], [2000, 5000], 'g', 0.8),
G('gear', '滑板车、平衡车', [200, 500], [500, 1200], [1500, 4000], 'g', 0.6),
G('gear', '防撞角、护栏等安全用品', [100, 300], [300, 800], [800, 2000], 'g', 0.5),
I(['自费疫苗(流感等)', '自费疫苗', '自费疫苗全打'], [300, 800], [1500, 3000], [3000, 5000], '0'),
I(['儿保体检', '儿保体检', '私立儿科体检'], [300, 600], [600, 1500], [3000, 8000], 'm'),
I(['看病和医药', '看病和医药', '私立儿科看病'], [1000, 3000], [2000, 5000], [6000, 15000], 'm'),
G('vac', ['自费疫苗(流感等)', '自费疫苗', '自费疫苗全打'], [300, 800], [1500, 3000], [3000, 5000], '0'),
G('doc', ['儿保体检', '儿保体检', '私立儿科体检'], [300, 600], [600, 1500], [3000, 8000], 'm'),
G('doc', ['看病和医药', '看病和医药', '私立儿科看病'], [1000, 3000], [2000, 5000], [6000, 15000], 'm'),
G('ins', ['少儿医保', '少儿医保和医疗险', '高端医疗险和重疾险'], [800, 1200], [1600, 4000], [16000, 30000], '0'),
D('extra', ['绘本和遛娃', '早教班(每周 1~2 节)', '早教和游泳、音乐等兴趣班'], [[500, 2000], [8000, 16000], [25000, 50000]], 's'),
I('游乐场和亲子游', [1000, 3000], [4000, 8000], [15000, 30000], '0'),
I('理发、照片和生日', [500, 1500], [1500, 4000], [4000, 10000], 's'),
G('trip', '游乐场和亲子游', [1000, 3000], [4000, 8000], [15000, 30000], '0'),
G('gift', '理发、照片和生日', [500, 1500], [1500, 4000], [4000, 10000], 's'),
{ g: 'care', n: function (s) { return ['老人帮带补贴(2 年)', '老人帮带和 2 岁托班', '育儿嫂工资(2 年)', '托育园(1 岁半起)'][s.care]; },
fy: function (s) {
if (s.care === 0) return [SUB, SUB];
@@ -609,17 +709,17 @@ h1 .mk{background:linear-gradient(transparent 64%,rgba(24,160,88,.24) 0)}
I('入园用品和被褥', [300, 800], [800, 1500], [1500, 3000], 'g'),
I('园服', [300, 800], [800, 1500], [1500, 3000], 'g'),
I('园内活动和材料费', [500, 1500], [1500, 3000], [3000, 8000], 's'),
D('school', ['接送交通', '校车', '校车'], [[1000, 3000], [6000, 12000], [12000, 24000]], 's'),
D('commute', ['家人接送', '校车或公交', '专车或校车'], [[1000, 3000], [6000, 12000], [12000, 24000]], 's'),
D('extra', ['美术或音乐(偶尔)', '美术或音乐兴趣班', '钢琴、美术、舞蹈'], [[1500, 4000], [8000, 16000], [25000, 50000]], 's'),
D('extra', ['户外玩耍', '游泳或轮滑', '游泳、马术、网球'], [[0, 1000], [6000, 12000], [20000, 40000]], 's'),
D('extra', ['英语绘本和动画', '英语启蒙班', '外教英语'], [[300, 800], [6000, 12000], [20000, 40000]], 's'),
I('日常饮食和零食', [9000, 18000], [18000, 30000], [36000, 72000], 'g'),
I('衣服鞋袜', [3000, 6000], [6000, 12000], [15000, 30000], 'g'),
G('cloth', '日常饮食和零食', [9000, 18000], [18000, 30000], [36000, 72000], 'g'),
G('cloth', '衣服鞋袜', [3000, 6000], [6000, 12000], [15000, 30000], 'g'),
I('玩具和绘本', [2000, 4000], [4000, 8000], [10000, 20000], 'g'),
I(['看病和医药', '看病和医药', '私立儿科看病'], [2000, 4000], [4000, 8000], [12000, 25000], 'm'),
G('doc', ['看病和医药', '看病和医药', '私立儿科看病'], [2000, 4000], [4000, 8000], [12000, 25000], 'm'),
G('ins', ['少儿医保', '少儿医保和医疗险', '高端医疗险和重疾险'], [1200, 1800], [2400, 6000], [24000, 45000], '0'),
I(['周边游玩', '每年一两次旅行', '出境亲子游'], [3000, 8000], [12000, 24000], [45000, 90000], '0'),
I('生日和节日礼物', [600, 1500], [1500, 4000], [5000, 12000], 'g'),
G('trip', ['周边游玩', '每年一两次旅行', '出境亲子游'], [3000, 8000], [12000, 24000], [45000, 90000], '0'),
G('gift', '生日和节日礼物', [600, 1500], [1500, 4000], [5000, 12000], 'g'),
I('理发和日用品', [300, 800], [800, 1500], [1500, 3000], 's'),
{ g: 'care', n: function (s) { return s.care === 2 ? '住家阿姨(3 年)' : '老人接送补贴'; },
fv: function (s) { return s.care === 2 ? [120000, 200000] : [6000, 18000]; }, k: 's' }
@@ -632,21 +732,21 @@ h1 .mk{background:linear-gradient(transparent 64%,rgba(24,160,88,.24) 0)}
I('书包和学习桌椅', [800, 2000], [2000, 4000], [4000, 10000], 'g'),
D('school', ['午餐', '餐费', '餐费'], [[9000, 15000], [15000, 24000], [24000, 40000]], 's'),
D('school', ['课后托管和延时服务', '课后托管', ''], [[3000, 8000], [2000, 5000], [0, 0]], 's'),
D('school', ['上下学交通', '校车', '校车'], [[2000, 6000], [8000, 15000], [15000, 30000]], 's'),
D('commute', ['上下学交通', '校车或公交', '专车或校车'], [[2000, 6000], [8000, 15000], [15000, 30000]], 's'),
D('extra', ['学科辅导(偶尔)', '学科辅导(语数英)', '学科一对一辅导'], [[3000, 10000], [30000, 60000], [80000, 160000]], 's'),
D('extra', ['美术或音乐', '美术、音乐兴趣班', '钢琴、美术、舞蹈'], [[3000, 8000], [15000, 30000], [50000, 100000]], 's'),
D('extra', ['跳绳、游泳', '游泳、球类', '网球、马术、击剑'], [[2000, 6000], [12000, 24000], [40000, 80000]], 's'),
D('extra', ['', '编程或英语', '编程、竞赛和外教'], [[0, 0], [5000, 12000], [30000, 60000]], 's'),
I(['假期托管班', '夏令营和研学', '海外游学和研学营'], [1000, 4000], [10000, 24000], [50000, 120000], '0'),
I('平板、手表、学习机', [1500, 3000], [3000, 6000], [8000, 15000], 'g'),
I('日常饮食', [24000, 36000], [36000, 60000], [72000, 120000], 'g'),
I('衣服鞋袜', [6000, 12000], [12000, 24000], [30000, 60000], 'g'),
I('零花钱', [1000, 3000], [3000, 8000], [8000, 20000], '0'),
I(['看病和医药', '看病和医药', '私立医疗'], [3000, 6000], [6000, 12000], [20000, 40000], 'm'),
G('camp', ['假期托管班', '夏令营和研学', '海外游学和研学营'], [1000, 4000], [10000, 24000], [50000, 120000], '0'),
G('digi', '平板、手表、学习机', [1500, 3000], [3000, 6000], [8000, 15000], 'g'),
G('cloth', '日常饮食', [24000, 36000], [36000, 60000], [72000, 120000], 'g'),
G('cloth', '衣服鞋袜', [6000, 12000], [12000, 24000], [30000, 60000], 'g'),
G('pocket', '零花钱', [1000, 3000], [3000, 8000], [8000, 20000], '0'),
G('doc', ['看病和医药', '看病和医药', '私立医疗'], [3000, 6000], [6000, 12000], [20000, 40000], 'm'),
I('近视防控和看牙', [1000, 3000], [3000, 8000], [10000, 25000], 'm'),
G('ins', ['少儿医保', '少儿医保和医疗险', '高端医疗险和重疾险'], [2400, 3600], [4800, 12000], [48000, 90000], '0'),
I(['假期游玩', '家庭旅行', '出境家庭游'], [5000, 12000], [20000, 40000], [80000, 160000], '0'),
I('生日和节日', [1200, 3000], [3000, 8000], [10000, 24000], 'g')
G('trip', ['假期游玩', '家庭旅行', '出境家庭游'], [5000, 12000], [20000, 40000], [80000, 160000], '0'),
G('gift', '生日和节日', [1200, 3000], [3000, 8000], [10000, 24000], 'g')
],
// ⑧ 初中 12~15 岁
[
@@ -654,20 +754,20 @@ h1 .mk{background:linear-gradient(transparent 64%,rgba(24,160,88,.24) 0)}
I('校服', [400, 1000], [800, 1500], [1500, 3000], 'g'),
I('课本、教辅和文具', [2000, 4000], [3000, 6000], [5000, 10000], 'g'),
D('school', ['午餐或住宿', '住宿和伙食', '住宿、伙食和活动'], [[6000, 12000], [12000, 24000], [24000, 45000]], 's'),
D('school', ['上下学交通', '校车或交通', '校车'], [[1000, 3000], [3000, 8000], [8000, 15000]], 's'),
D('commute', ['上下学交通', '校车或公交', '专车或校车'], [[1000, 3000], [3000, 8000], [8000, 15000]], 's'),
D('extra', ['必要的补习', '学科补习', '学科一对一补习'], [[6000, 18000], [36000, 72000], [100000, 200000]], 's'),
D('extra', ['', '艺术或体育特长', '艺术、体育特长和竞赛'], [[0, 0], [8000, 18000], [30000, 60000]], 's'),
D('extra', ['中考体育(自己练)', '中考体育训练', '中考体育私教'], [[0, 1000], [2000, 5000], [5000, 10000]], 's'),
I(['假期游玩', '研学和夏令营', '海外游学'], [1000, 4000], [8000, 18000], [30000, 80000], '0'),
I('手机和电脑', [2000, 4000], [4000, 8000], [10000, 20000], 'g'),
I('日常饮食', [15000, 24000], [24000, 36000], [45000, 75000], 'g'),
I('衣服鞋子', [4000, 8000], [8000, 15000], [20000, 40000], 'g'),
I('零花钱', [1500, 4000], [4000, 9000], [10000, 25000], '0'),
I(['看病和医药', '看病和医药', '私立医疗'], [1500, 3000], [3000, 6000], [10000, 20000], 'm'),
G('camp', ['假期游玩', '研学和夏令营', '海外游学'], [1000, 4000], [8000, 18000], [30000, 80000], '0'),
G('digi', '手机和电脑', [2000, 4000], [4000, 8000], [10000, 20000], 'g'),
G('cloth', '日常饮食', [15000, 24000], [24000, 36000], [45000, 75000], 'g'),
G('cloth', '衣服鞋子', [4000, 8000], [8000, 15000], [20000, 40000], 'g'),
G('pocket', '零花钱', [1500, 4000], [4000, 9000], [10000, 25000], '0'),
G('doc', ['看病和医药', '看病和医药', '私立医疗'], [1500, 3000], [3000, 6000], [10000, 20000], 'm'),
I('眼镜和牙齿', [1500, 4000], [4000, 10000], [15000, 30000], 'm'),
G('ins', ['医保', '医保和医疗险', '高端医疗险和重疾险'], [1200, 1800], [2400, 6000], [24000, 45000], '0'),
I(['周边游玩', '家庭旅行', '出境家庭游'], [3000, 8000], [10000, 20000], [40000, 80000], '0'),
I('生日和节日', [600, 1500], [1500, 4000], [5000, 12000], 'g')
G('trip', ['周边游玩', '家庭旅行', '出境家庭游'], [3000, 8000], [10000, 20000], [40000, 80000], '0'),
G('gift', '生日和节日', [600, 1500], [1500, 4000], [5000, 12000], 'g')
],
// ⑨ 高中 15~18 岁
[
@@ -679,16 +779,16 @@ h1 .mk{background:linear-gradient(transparent 64%,rgba(24,160,88,.24) 0)}
D('extra', ['必要的补习', '学科补习', '学科一对一补习'], [[6000, 24000], [36000, 80000], [120000, 240000]], 's'),
D('extra', ['', '艺术或体育特长', '艺术、体育特长'], [[0, 0], [6000, 15000], [30000, 60000]], 's'),
D('extra', ['', '竞赛和强基辅导', '托福、SAT 和竞赛'], [[0, 0], [3000, 8000], [50000, 120000]], 's'),
I(['假期游玩', '研学', '海外游学'], [1000, 3000], [5000, 12000], [30000, 80000], '0'),
I('电脑和电子设备', [2000, 5000], [5000, 10000], [10000, 20000], 'g'),
G('camp', ['假期游玩', '研学', '海外游学'], [1000, 3000], [5000, 12000], [30000, 80000], '0'),
G('digi', '电脑和电子设备', [2000, 5000], [5000, 10000], [10000, 20000], 'g'),
I('交通和回家路费', [1000, 3000], [2000, 5000], [5000, 12000], 's'),
I('在家饮食和营养', [9000, 15000], [15000, 24000], [30000, 50000], 'g'),
I('衣服鞋子', [4000, 8000], [8000, 15000], [20000, 40000], 'g'),
I('零花钱', [3000, 6000], [6000, 12000], [15000, 30000], '0'),
I(['看病和医药', '看病和医药', '私立医疗'], [1500, 3000], [3000, 6000], [10000, 20000], 'm'),
G('cloth', '在家饮食和营养', [9000, 15000], [15000, 24000], [30000, 50000], 'g'),
G('cloth', '衣服鞋子', [4000, 8000], [8000, 15000], [20000, 40000], 'g'),
G('pocket', '零花钱', [3000, 6000], [6000, 12000], [15000, 30000], '0'),
G('doc', ['看病和医药', '看病和医药', '私立医疗'], [1500, 3000], [3000, 6000], [10000, 20000], 'm'),
G('ins', ['医保', '医保和医疗险', '高端医疗险和重疾险'], [1200, 1800], [2400, 6000], [24000, 45000], '0'),
I(['高考和志愿填报', '高考、志愿和升学咨询', '留学申请和背景提升'], [1000, 3000], [3000, 10000], [50000, 150000], '0'),
I('成人礼和毕业旅行', [1000, 3000], [3000, 8000], [10000, 30000], '0')
G('trip', '成人礼和毕业旅行', [1000, 3000], [3000, 8000], [10000, 30000], '0')
]
];
function college(s) { // 如果还上大学(不计入合计)
@@ -709,10 +809,12 @@ h1 .mk{background:linear-gradient(transparent 64%,rgba(24,160,88,.24) 0)}
function ctx(r, a) {
var d = ROUTES[r].def;
function g(k) { return a[k] != null ? a[k] : d[k] != null ? d[k] : QK[k].d; }
return { T: tierOf(r), city: a.city == null ? 1 : a.city, kid: a.kid || 0,
var o = { T: tierOf(r), city: a.city == null ? 1 : a.city, kid: a.kid || 0,
hosp: g('hosp'), birth: g('birth'), yuezi: g('yuezi'), feed: g('feed'),
care: g('care'), school: g('school'), extra: g('extra'),
screen: g('screen'), gear: g('gear'), party: g('party'), ins: g('ins') };
QS.forEach(function (q) { if (q.p) o[q.k] = g(q.k); });
return o;
}
function calc(r, a, stages) {
var s = ctx(r, a);
@@ -812,7 +914,14 @@ h1 .mk{background:linear-gradient(transparent 64%,rgba(24,160,88,.24) 0)}
$('#goLast').addEventListener('click', function () { renderRes(false); });
/* ================= 问题屏 ================= */
function flow() { var st = sel(); return QS.filter(function (q) { return !q.if || q.if(st); }); }
function flow() {
var st = sel(), list = QS.filter(function (q) { return !q.if || q.if(st); });
if (list.length <= QMAX) return list;
var drop = list.filter(function (q) { return q.p; })
.sort(function (x, y) { return x.p - y.p || list.indexOf(y) - list.indexOf(x); })
.slice(0, list.length - QMAX);
return list.filter(function (q) { return drop.indexOf(q) < 0; });
}
function val(k) { if (A[k] != null) return A[k]; var d = ROUTES[route].def; return d[k] != null ? d[k] : QK[k].d != null ? QK[k].d : null; }
var stTmp = null, incTmp = '';
function renderQ() {
@@ -1288,7 +1397,7 @@ h1 .mk{background:linear-gradient(transparent 64%,rgba(24,160,88,.24) 0)}
if (typeof a.inc === 'number' && a.inc >= 0) A.inc = a.inc;
billNo = o.no || ''; billAt = o.at || '';
if (!A.st) A.st = ALL.slice();
var need = QS.filter(function (q) { return q.o && (!q.if || q.if(A.st)); });
var need = flow().filter(function (q) { return q.o; });
var all = need.every(function (q) { return val(q.k) != null; }); // 新加的题没答过就按默认(旧账单照样能看)
if (all && !billNo) newBill();
return !!o.done && all;