223 lines
8.4 KiB
Dart
223 lines
8.4 KiB
Dart
import '../models/divination_params.dart';
|
|
import '../models/divination_result.dart';
|
|
|
|
class DivinationResultBuilder {
|
|
DivinationResultData build({
|
|
required DivinationParams params,
|
|
required List<YaoType> yaoStates,
|
|
}) {
|
|
final binaryCode = params.toBinary(yaoStates);
|
|
final changedBinaryCode = params.toChangedBinary(yaoStates);
|
|
final baseHexagram = _hexagramMap[binaryCode];
|
|
final changedHexagram = _hexagramMap[changedBinaryCode];
|
|
if (baseHexagram == null || changedHexagram == null) {
|
|
throw StateError(
|
|
'Unknown hexagram mapping for binary=$binaryCode changed=$changedBinaryCode',
|
|
);
|
|
}
|
|
|
|
final signType = _signByStates(yaoStates);
|
|
final content = _mockContent(
|
|
params.questionType,
|
|
params.question,
|
|
signType,
|
|
);
|
|
|
|
final lineData = _buildYaoLines(yaoStates, false);
|
|
final targetStates = _toChangedStates(yaoStates);
|
|
final targetLineData = _buildYaoLines(targetStates, true);
|
|
|
|
return DivinationResultData(
|
|
params: params,
|
|
binaryCode: binaryCode,
|
|
changedBinaryCode: changedBinaryCode,
|
|
guaName: baseHexagram.name,
|
|
targetGuaName: changedHexagram.name,
|
|
upperName: baseHexagram.upper,
|
|
lowerName: baseHexagram.lower,
|
|
signType: signType,
|
|
keywords: content.keywords,
|
|
conclusion: content.conclusion,
|
|
analysis: content.analysis,
|
|
suggestion: content.suggestion,
|
|
ganzhi: const GanzhiData(
|
|
yearGanZhi: '丙午',
|
|
monthGanZhi: '甲辰',
|
|
dayGanZhi: '辛亥',
|
|
timeGanZhi: '乙巳',
|
|
yearKongWang: '子丑',
|
|
monthKongWang: '申酉',
|
|
dayKongWang: '寅卯',
|
|
timeKongWang: '午未',
|
|
yueJian: '辰',
|
|
riChen: '亥',
|
|
yuePo: '戌',
|
|
riChong: '巳',
|
|
),
|
|
wuXingStatus: const {'木': '旺', '火': '相', '土': '休', '金': '囚', '水': '死'},
|
|
yaoLines: lineData,
|
|
targetYaoLines: targetLineData,
|
|
);
|
|
}
|
|
|
|
List<YaoLineData> _buildYaoLines(List<YaoType> states, bool target) {
|
|
const spirits = ['龙', '雀', '勾', '蛇', '虎', '玄'];
|
|
const relations = ['父母', '兄弟', '官鬼', '妻财', '子孙', '父母'];
|
|
const branches = ['子', '寅', '辰', '午', '申', '戌'];
|
|
const elements = ['水', '木', '土', '火', '金', '土'];
|
|
return List<YaoLineData>.generate(6, (idx) {
|
|
final mark = switch (idx) {
|
|
1 => '应',
|
|
4 => '世',
|
|
_ => '',
|
|
};
|
|
return YaoLineData(
|
|
index: idx,
|
|
spirit: spirits[idx],
|
|
relation: relations[idx],
|
|
branch: branches[idx],
|
|
element: elements[idx],
|
|
type: states[idx],
|
|
mark: target ? '' : mark,
|
|
);
|
|
});
|
|
}
|
|
|
|
List<YaoType> _toChangedStates(List<YaoType> source) {
|
|
return source.map((state) {
|
|
return switch (state) {
|
|
YaoType.oldYang => YaoType.youngYin,
|
|
YaoType.oldYin => YaoType.youngYang,
|
|
_ => state,
|
|
};
|
|
}).toList();
|
|
}
|
|
|
|
String _signByStates(List<YaoType> states) {
|
|
final dynamicCount = states
|
|
.where((e) => e == YaoType.oldYang || e == YaoType.oldYin)
|
|
.length;
|
|
if (dynamicCount <= 1) {
|
|
return '上上签';
|
|
}
|
|
if (dynamicCount <= 3) {
|
|
return '中上签';
|
|
}
|
|
return '中下签';
|
|
}
|
|
|
|
_MockContent _mockContent(
|
|
QuestionType type,
|
|
String question,
|
|
String signType,
|
|
) {
|
|
final domain = switch (type) {
|
|
QuestionType.career || QuestionType.study => '事业与成长',
|
|
QuestionType.love => '关系与情感',
|
|
QuestionType.wealth => '财富与资源',
|
|
QuestionType.fortune => '阶段运势',
|
|
QuestionType.dream => '潜意识信号',
|
|
QuestionType.health => '身心节律',
|
|
QuestionType.search => '寻物线索',
|
|
QuestionType.other => '综合事项',
|
|
};
|
|
return _MockContent(
|
|
keywords: '$signType · $domain',
|
|
conclusion: '这个卦象的结果为$signType。你关注的“$question”处于可推进阶段,当前节奏重在稳步而行,不宜急进。',
|
|
analysis:
|
|
'本卦显示外在条件逐步成形,内在决心也在增强。若短期遇到反复,通常是资源重组与信息修正,并非方向错误。建议将目标拆分为可验证的小节点,持续复盘。',
|
|
suggestion:
|
|
'建议一:先定三周内可执行动作并按日推进。\n建议二:重要决定留有缓冲期,避免情绪化判断。\n建议三:遇到阻滞先调整节奏,再补关键资源。',
|
|
);
|
|
}
|
|
}
|
|
|
|
class _MockContent {
|
|
const _MockContent({
|
|
required this.keywords,
|
|
required this.conclusion,
|
|
required this.analysis,
|
|
required this.suggestion,
|
|
});
|
|
|
|
final String keywords;
|
|
final String conclusion;
|
|
final String analysis;
|
|
final String suggestion;
|
|
}
|
|
|
|
class _HexagramShort {
|
|
const _HexagramShort(this.name, this.upper, this.lower);
|
|
|
|
final String name;
|
|
final String upper;
|
|
final String lower;
|
|
}
|
|
|
|
const Map<String, _HexagramShort> _hexagramMap = {
|
|
'111111': _HexagramShort('乾为天', '乾', '乾'),
|
|
'011111': _HexagramShort('天风姤', '乾', '巽'),
|
|
'001111': _HexagramShort('天山遁', '乾', '艮'),
|
|
'000111': _HexagramShort('天地否', '乾', '坤'),
|
|
'000011': _HexagramShort('风地观', '巽', '坤'),
|
|
'000001': _HexagramShort('山地剥', '艮', '坤'),
|
|
'000101': _HexagramShort('火地晋', '离', '坤'),
|
|
'111101': _HexagramShort('火天大有', '离', '乾'),
|
|
'010010': _HexagramShort('坎为水', '坎', '坎'),
|
|
'110010': _HexagramShort('水泽节', '坎', '兑'),
|
|
'100010': _HexagramShort('水雷屯', '坎', '震'),
|
|
'101010': _HexagramShort('水火既济', '坎', '离'),
|
|
'101110': _HexagramShort('泽火革', '兑', '离'),
|
|
'101100': _HexagramShort('雷火丰', '震', '离'),
|
|
'101000': _HexagramShort('地火明夷', '坤', '离'),
|
|
'010000': _HexagramShort('地水师', '坤', '坎'),
|
|
'001001': _HexagramShort('艮为山', '艮', '艮'),
|
|
'101001': _HexagramShort('山火贲', '艮', '离'),
|
|
'111001': _HexagramShort('山天大畜', '艮', '乾'),
|
|
'110001': _HexagramShort('山泽损', '艮', '兑'),
|
|
'110101': _HexagramShort('火泽睽', '离', '兑'),
|
|
'110111': _HexagramShort('天泽履', '乾', '兑'),
|
|
'110011': _HexagramShort('风泽中孚', '巽', '兑'),
|
|
'001011': _HexagramShort('风山渐', '巽', '艮'),
|
|
'100100': _HexagramShort('震为雷', '震', '震'),
|
|
'000100': _HexagramShort('雷地豫', '震', '坤'),
|
|
'010100': _HexagramShort('雷水解', '震', '坎'),
|
|
'011100': _HexagramShort('雷风恒', '震', '巽'),
|
|
'011000': _HexagramShort('地风升', '坤', '巽'),
|
|
'011010': _HexagramShort('水风井', '坎', '巽'),
|
|
'011110': _HexagramShort('泽风大过', '兑', '巽'),
|
|
'100110': _HexagramShort('泽雷随', '兑', '震'),
|
|
'011011': _HexagramShort('巽为风', '巽', '巽'),
|
|
'111011': _HexagramShort('风天小畜', '巽', '乾'),
|
|
'101011': _HexagramShort('风火家人', '巽', '离'),
|
|
'100011': _HexagramShort('风雷益', '巽', '震'),
|
|
'100111': _HexagramShort('天雷无妄', '乾', '震'),
|
|
'100101': _HexagramShort('火雷噬嗑', '离', '震'),
|
|
'100001': _HexagramShort('山雷颐', '艮', '震'),
|
|
'011001': _HexagramShort('山风蛊', '艮', '巽'),
|
|
'101101': _HexagramShort('离为火', '离', '离'),
|
|
'001101': _HexagramShort('火山旅', '离', '艮'),
|
|
'011101': _HexagramShort('火风鼎', '离', '巽'),
|
|
'010101': _HexagramShort('火水未济', '离', '坎'),
|
|
'010001': _HexagramShort('山水蒙', '艮', '坎'),
|
|
'010011': _HexagramShort('风水涣', '巽', '坎'),
|
|
'010111': _HexagramShort('天水讼', '乾', '坎'),
|
|
'101111': _HexagramShort('天火同人', '乾', '离'),
|
|
'000000': _HexagramShort('坤为地', '坤', '坤'),
|
|
'100000': _HexagramShort('地雷复', '坤', '震'),
|
|
'110000': _HexagramShort('地泽临', '坤', '兑'),
|
|
'111000': _HexagramShort('地天泰', '坤', '乾'),
|
|
'111100': _HexagramShort('雷天大壮', '震', '乾'),
|
|
'111110': _HexagramShort('泽天夬', '兑', '乾'),
|
|
'111010': _HexagramShort('水天需', '坎', '乾'),
|
|
'000010': _HexagramShort('水地比', '坎', '坤'),
|
|
'110110': _HexagramShort('兑为泽', '兑', '兑'),
|
|
'010110': _HexagramShort('泽水困', '兑', '坎'),
|
|
'000110': _HexagramShort('泽地萃', '兑', '坤'),
|
|
'001110': _HexagramShort('泽山咸', '兑', '艮'),
|
|
'001010': _HexagramShort('水山蹇', '坎', '艮'),
|
|
'001000': _HexagramShort('地山谦', '坤', '艮'),
|
|
'001100': _HexagramShort('雷山小过', '震', '艮'),
|
|
'110100': _HexagramShort('雷泽归妹', '震', '兑'),
|
|
};
|