mingpan 0.1.2 → 0.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +72 -44
- package/dist/core/qimen/FlyingRule.d.ts +60 -0
- package/dist/core/qimen/FlyingRule.d.ts.map +1 -0
- package/dist/core/qimen/FlyingRule.js +94 -0
- package/dist/core/qimen/FlyingRule.js.map +1 -0
- package/dist/core/qimen/GongMapping.d.ts +29 -0
- package/dist/core/qimen/GongMapping.d.ts.map +1 -0
- package/dist/core/qimen/GongMapping.js +83 -0
- package/dist/core/qimen/GongMapping.js.map +1 -0
- package/dist/core/qimen/RotatingRule.d.ts +76 -0
- package/dist/core/qimen/RotatingRule.d.ts.map +1 -0
- package/dist/core/qimen/RotatingRule.js +126 -0
- package/dist/core/qimen/RotatingRule.js.map +1 -0
- package/dist/core/qimen/YinYangDunCalculator.d.ts +28 -0
- package/dist/core/qimen/YinYangDunCalculator.d.ts.map +1 -0
- package/dist/core/qimen/YinYangDunCalculator.js +79 -0
- package/dist/core/qimen/YinYangDunCalculator.js.map +1 -0
- package/dist/core/qimen/index.d.ts +10 -0
- package/dist/core/qimen/index.d.ts.map +1 -0
- package/dist/core/qimen/index.js +58 -0
- package/dist/core/qimen/index.js.map +1 -0
- package/dist/core/qimen/types.d.ts +19 -0
- package/dist/core/qimen/types.d.ts.map +1 -0
- package/dist/core/qimen/types.js +7 -0
- package/dist/core/qimen/types.js.map +1 -0
- package/dist/index.js +269 -2
- package/dist/index.js.map +1 -1
- package/dist/output/qimenTextRenderer.d.ts +40 -0
- package/dist/output/qimenTextRenderer.d.ts.map +1 -0
- package/dist/output/qimenTextRenderer.js +363 -0
- package/dist/output/qimenTextRenderer.js.map +1 -0
- package/dist/services/qimen/QimenService.d.ts +93 -0
- package/dist/services/qimen/QimenService.d.ts.map +1 -0
- package/dist/services/qimen/QimenService.js +427 -0
- package/dist/services/qimen/QimenService.js.map +1 -0
- package/dist/services/qimen/calculators/BaMenCalculator.d.ts +53 -0
- package/dist/services/qimen/calculators/BaMenCalculator.d.ts.map +1 -0
- package/dist/services/qimen/calculators/BaMenCalculator.js +105 -0
- package/dist/services/qimen/calculators/BaMenCalculator.js.map +1 -0
- package/dist/services/qimen/calculators/BaShenCalculator.d.ts +34 -0
- package/dist/services/qimen/calculators/BaShenCalculator.d.ts.map +1 -0
- package/dist/services/qimen/calculators/BaShenCalculator.js +57 -0
- package/dist/services/qimen/calculators/BaShenCalculator.js.map +1 -0
- package/dist/services/qimen/calculators/GeJuCalculator.d.ts +141 -0
- package/dist/services/qimen/calculators/GeJuCalculator.d.ts.map +1 -0
- package/dist/services/qimen/calculators/GeJuCalculator.js +711 -0
- package/dist/services/qimen/calculators/GeJuCalculator.js.map +1 -0
- package/dist/services/qimen/calculators/JiuGongCalculator.d.ts +56 -0
- package/dist/services/qimen/calculators/JiuGongCalculator.d.ts.map +1 -0
- package/dist/services/qimen/calculators/JiuGongCalculator.js +98 -0
- package/dist/services/qimen/calculators/JiuGongCalculator.js.map +1 -0
- package/dist/services/qimen/calculators/JiuXingCalculator.d.ts +54 -0
- package/dist/services/qimen/calculators/JiuXingCalculator.d.ts.map +1 -0
- package/dist/services/qimen/calculators/JiuXingCalculator.js +117 -0
- package/dist/services/qimen/calculators/JiuXingCalculator.js.map +1 -0
- package/dist/services/qimen/calculators/JuShuCalculator.d.ts +57 -0
- package/dist/services/qimen/calculators/JuShuCalculator.d.ts.map +1 -0
- package/dist/services/qimen/calculators/JuShuCalculator.js +115 -0
- package/dist/services/qimen/calculators/JuShuCalculator.js.map +1 -0
- package/dist/services/qimen/calculators/PanTypeCalculator.d.ts +117 -0
- package/dist/services/qimen/calculators/PanTypeCalculator.d.ts.map +1 -0
- package/dist/services/qimen/calculators/PanTypeCalculator.js +237 -0
- package/dist/services/qimen/calculators/PanTypeCalculator.js.map +1 -0
- package/dist/services/qimen/calculators/SanQiLiuYiCalculator.d.ts +50 -0
- package/dist/services/qimen/calculators/SanQiLiuYiCalculator.d.ts.map +1 -0
- package/dist/services/qimen/calculators/SanQiLiuYiCalculator.js +86 -0
- package/dist/services/qimen/calculators/SanQiLiuYiCalculator.js.map +1 -0
- package/dist/services/qimen/calculators/ShenShaCalculator.d.ts +80 -0
- package/dist/services/qimen/calculators/ShenShaCalculator.d.ts.map +1 -0
- package/dist/services/qimen/calculators/ShenShaCalculator.js +300 -0
- package/dist/services/qimen/calculators/ShenShaCalculator.js.map +1 -0
- package/dist/services/qimen/calculators/YongShenCalculator.d.ts +78 -0
- package/dist/services/qimen/calculators/YongShenCalculator.d.ts.map +1 -0
- package/dist/services/qimen/calculators/YongShenCalculator.js +497 -0
- package/dist/services/qimen/calculators/YongShenCalculator.js.map +1 -0
- package/dist/services/qimen/calculators/ZeRiCalculator.d.ts +78 -0
- package/dist/services/qimen/calculators/ZeRiCalculator.d.ts.map +1 -0
- package/dist/services/qimen/calculators/ZeRiCalculator.js +431 -0
- package/dist/services/qimen/calculators/ZeRiCalculator.js.map +1 -0
- package/dist/services/qimen/calculators/ZhuanPanCalculator.d.ts +118 -0
- package/dist/services/qimen/calculators/ZhuanPanCalculator.d.ts.map +1 -0
- package/dist/services/qimen/calculators/ZhuanPanCalculator.js +260 -0
- package/dist/services/qimen/calculators/ZhuanPanCalculator.js.map +1 -0
- package/dist/services/qimen/data/constants.d.ts +105 -0
- package/dist/services/qimen/data/constants.d.ts.map +1 -0
- package/dist/services/qimen/data/constants.js +295 -0
- package/dist/services/qimen/data/constants.js.map +1 -0
- package/dist/services/qimen/data/shensha-rules.d.ts +177 -0
- package/dist/services/qimen/data/shensha-rules.d.ts.map +1 -0
- package/dist/services/qimen/data/shensha-rules.js +397 -0
- package/dist/services/qimen/data/shensha-rules.js.map +1 -0
- package/dist/services/qimen/data/yongshen-rules.d.ts +115 -0
- package/dist/services/qimen/data/yongshen-rules.d.ts.map +1 -0
- package/dist/services/qimen/data/yongshen-rules.js +365 -0
- package/dist/services/qimen/data/yongshen-rules.js.map +1 -0
- package/dist/services/qimen/index.d.ts +20 -0
- package/dist/services/qimen/index.d.ts.map +1 -0
- package/dist/services/qimen/index.js +43 -0
- package/dist/services/qimen/index.js.map +1 -0
- package/dist/services/qimen/types.d.ts +390 -0
- package/dist/services/qimen/types.d.ts.map +1 -0
- package/dist/services/qimen/types.js +20 -0
- package/dist/services/qimen/types.js.map +1 -0
- package/dist/services/qimen/utils/gongUtils.d.ts +80 -0
- package/dist/services/qimen/utils/gongUtils.d.ts.map +1 -0
- package/dist/services/qimen/utils/gongUtils.js +164 -0
- package/dist/services/qimen/utils/gongUtils.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,431 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* 择日计算器
|
|
4
|
+
*
|
|
5
|
+
* 负责根据事类筛选吉时,实现奇门择日功能
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.ZeRiCalculator = void 0;
|
|
9
|
+
const YongShenCalculator_1 = require("./YongShenCalculator");
|
|
10
|
+
const ShenShaCalculator_1 = require("./ShenShaCalculator");
|
|
11
|
+
const shensha_rules_1 = require("../data/shensha-rules");
|
|
12
|
+
// ============= 常量定义 =============
|
|
13
|
+
/** 三吉门 */
|
|
14
|
+
const SAN_JI_MEN = ['开', '休', '生'];
|
|
15
|
+
/** 宫位到方位映射 */
|
|
16
|
+
const GONG_TO_DIRECTION = {
|
|
17
|
+
1: '北', // 坎宫
|
|
18
|
+
2: '西南', // 坤宫
|
|
19
|
+
3: '东', // 震宫
|
|
20
|
+
4: '东南', // 巽宫
|
|
21
|
+
5: '中', // 中宫
|
|
22
|
+
6: '西北', // 乾宫
|
|
23
|
+
7: '西', // 兑宫
|
|
24
|
+
8: '东北', // 艮宫
|
|
25
|
+
9: '南', // 离宫
|
|
26
|
+
};
|
|
27
|
+
/** 评分权重 */
|
|
28
|
+
const SCORE_WEIGHTS = {
|
|
29
|
+
geJu: 0.35, // 格局权重
|
|
30
|
+
yongShen: 0.40, // 用神权重
|
|
31
|
+
shenSha: 0.25, // 神煞权重
|
|
32
|
+
};
|
|
33
|
+
/** 评分相关常量 */
|
|
34
|
+
const SCORE_CONSTANTS = {
|
|
35
|
+
/** 基础分 */
|
|
36
|
+
BASE_SCORE: 60,
|
|
37
|
+
/** 吉格加分 */
|
|
38
|
+
JI_GE_BONUS: 10,
|
|
39
|
+
/** 凶格扣分 */
|
|
40
|
+
XIONG_GE_PENALTY: 15,
|
|
41
|
+
/** 三吉门得位加分 */
|
|
42
|
+
SAN_JI_MEN_BONUS: 5,
|
|
43
|
+
/** 默认用神分 */
|
|
44
|
+
DEFAULT_YONGSHEN_SCORE: 50,
|
|
45
|
+
/** 神煞基础分 */
|
|
46
|
+
SHENSHA_BASE_SCORE: 50,
|
|
47
|
+
/** 用神状态良好阈值 */
|
|
48
|
+
YONGSHEN_GOOD_THRESHOLD: 70,
|
|
49
|
+
/** 优秀评分阈值 */
|
|
50
|
+
GRADE_EXCELLENT: 80,
|
|
51
|
+
/** 良好评分阈值 */
|
|
52
|
+
GRADE_GOOD: 65,
|
|
53
|
+
/** 中等评分阈值 */
|
|
54
|
+
GRADE_MEDIUM: 50,
|
|
55
|
+
};
|
|
56
|
+
/** 输出限制常量 */
|
|
57
|
+
const OUTPUT_LIMITS = {
|
|
58
|
+
/** 最大亮点数 */
|
|
59
|
+
MAX_HIGHLIGHTS: 5,
|
|
60
|
+
/** 最大警告数 */
|
|
61
|
+
MAX_WARNINGS: 5,
|
|
62
|
+
};
|
|
63
|
+
/** 最大日期范围(天) */
|
|
64
|
+
const MAX_DATE_RANGE_DAYS = 365;
|
|
65
|
+
class LRUCache {
|
|
66
|
+
cache;
|
|
67
|
+
maxSize;
|
|
68
|
+
constructor(maxSize = 500) {
|
|
69
|
+
this.cache = new Map();
|
|
70
|
+
this.maxSize = maxSize;
|
|
71
|
+
}
|
|
72
|
+
get(key) {
|
|
73
|
+
const entry = this.cache.get(key);
|
|
74
|
+
if (entry) {
|
|
75
|
+
// 更新访问顺序(移到末尾)
|
|
76
|
+
this.cache.delete(key);
|
|
77
|
+
this.cache.set(key, entry);
|
|
78
|
+
return entry.result;
|
|
79
|
+
}
|
|
80
|
+
return null;
|
|
81
|
+
}
|
|
82
|
+
set(key, result) {
|
|
83
|
+
if (this.cache.size >= this.maxSize) {
|
|
84
|
+
// 删除最老的条目
|
|
85
|
+
const oldestKey = this.cache.keys().next().value;
|
|
86
|
+
if (oldestKey) {
|
|
87
|
+
this.cache.delete(oldestKey);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
this.cache.set(key, { result, timestamp: Date.now() });
|
|
91
|
+
}
|
|
92
|
+
clear() {
|
|
93
|
+
this.cache.clear();
|
|
94
|
+
}
|
|
95
|
+
get size() {
|
|
96
|
+
return this.cache.size;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
// ============= 择日计算器 =============
|
|
100
|
+
class ZeRiCalculator {
|
|
101
|
+
/** 排盘缓存 */
|
|
102
|
+
static cache = new LRUCache(500);
|
|
103
|
+
/** 排盘函数(由外部注入) */
|
|
104
|
+
static calculateFn = null;
|
|
105
|
+
/**
|
|
106
|
+
* 注入排盘函数
|
|
107
|
+
*
|
|
108
|
+
* @param fn 排盘函数
|
|
109
|
+
*/
|
|
110
|
+
static setCalculateFn(fn) {
|
|
111
|
+
this.calculateFn = fn;
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* 查找吉时
|
|
115
|
+
*
|
|
116
|
+
* @param input 择日输入
|
|
117
|
+
* @returns 择日结果列表
|
|
118
|
+
*/
|
|
119
|
+
static findAuspiciousTimes(input) {
|
|
120
|
+
if (!this.calculateFn) {
|
|
121
|
+
throw new Error('ZeRiCalculator: calculateFn not set. Call setCalculateFn first.');
|
|
122
|
+
}
|
|
123
|
+
const results = [];
|
|
124
|
+
const { startDate, endDate, shiLei, limit = 10, minScore = 60, includeDirection = false, excludeJieQiDay = false, excludeSuiPo = false, excludeYuePo = false, panType = '时盘', zhiRunMethod = 'chaibu', } = input;
|
|
125
|
+
// 日期范围验证
|
|
126
|
+
const current = new Date(startDate);
|
|
127
|
+
current.setHours(0, 0, 0, 0);
|
|
128
|
+
const end = new Date(endDate);
|
|
129
|
+
end.setHours(23, 59, 59, 999);
|
|
130
|
+
// 验证日期有效性
|
|
131
|
+
if (isNaN(current.getTime()) || isNaN(end.getTime())) {
|
|
132
|
+
throw new Error('ZeRiCalculator: Invalid date input');
|
|
133
|
+
}
|
|
134
|
+
// 验证结束日期不早于开始日期
|
|
135
|
+
if (end < current) {
|
|
136
|
+
throw new Error('ZeRiCalculator: endDate must not be earlier than startDate');
|
|
137
|
+
}
|
|
138
|
+
// 验证日期范围不超过最大限制
|
|
139
|
+
const diffDays = Math.ceil((end.getTime() - current.getTime()) / (1000 * 60 * 60 * 24));
|
|
140
|
+
if (diffDays > MAX_DATE_RANGE_DAYS) {
|
|
141
|
+
throw new Error(`ZeRiCalculator: Date range exceeds maximum of ${MAX_DATE_RANGE_DAYS} days`);
|
|
142
|
+
}
|
|
143
|
+
while (current <= end) {
|
|
144
|
+
// 遍历12时辰
|
|
145
|
+
for (let hourIdx = 0; hourIdx < 12; hourIdx++) {
|
|
146
|
+
const hour = hourIdx * 2; // 子时=0, 丑时=2, ...
|
|
147
|
+
// 计算排盘
|
|
148
|
+
const qimenResult = this.getCachedResult(current.getFullYear(), current.getMonth() + 1, current.getDate(), hour, panType, zhiRunMethod);
|
|
149
|
+
// 应用过滤条件
|
|
150
|
+
if (!this.passFilters(qimenResult, {
|
|
151
|
+
excludeJieQiDay,
|
|
152
|
+
excludeSuiPo,
|
|
153
|
+
excludeYuePo,
|
|
154
|
+
})) {
|
|
155
|
+
continue;
|
|
156
|
+
}
|
|
157
|
+
// 缓存用神分析结果,避免重复计算
|
|
158
|
+
const yongShenInfo = YongShenCalculator_1.YongShenCalculator.analyze(qimenResult, shiLei);
|
|
159
|
+
// 计算评分
|
|
160
|
+
const scoreResult = this.calculateScoreWithCache(qimenResult, yongShenInfo);
|
|
161
|
+
// 最小评分过滤
|
|
162
|
+
if (scoreResult.totalScore < minScore) {
|
|
163
|
+
continue;
|
|
164
|
+
}
|
|
165
|
+
// 构建结果
|
|
166
|
+
const datetime = new Date(current);
|
|
167
|
+
datetime.setHours(hour, 0, 0, 0);
|
|
168
|
+
const zeRiResult = {
|
|
169
|
+
datetime,
|
|
170
|
+
score: scoreResult,
|
|
171
|
+
grade: this.getGrade(scoreResult.totalScore),
|
|
172
|
+
highlights: this.getHighlightsWithCache(qimenResult, yongShenInfo),
|
|
173
|
+
warnings: this.getWarnings(qimenResult),
|
|
174
|
+
qimenResult,
|
|
175
|
+
};
|
|
176
|
+
// 方位信息
|
|
177
|
+
if (includeDirection) {
|
|
178
|
+
zeRiResult.direction = this.calcDirectionInfoWithCache(qimenResult, yongShenInfo);
|
|
179
|
+
}
|
|
180
|
+
results.push(zeRiResult);
|
|
181
|
+
// 早期终止:找到足够多高分结果
|
|
182
|
+
if (results.length >= limit * 2 && results[results.length - 1].score.totalScore >= 80) {
|
|
183
|
+
break;
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
// 移动到下一天
|
|
187
|
+
current.setDate(current.getDate() + 1);
|
|
188
|
+
}
|
|
189
|
+
// 排序(按评分降序)
|
|
190
|
+
results.sort((a, b) => b.score.totalScore - a.score.totalScore);
|
|
191
|
+
// 限制返回数量
|
|
192
|
+
return results.slice(0, limit);
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* 获取缓存的排盘结果
|
|
196
|
+
*/
|
|
197
|
+
static getCachedResult(year, month, day, hour, panType, zhiRunMethod) {
|
|
198
|
+
const key = `${year}-${month}-${day}-${hour}-${panType}-${zhiRunMethod}`;
|
|
199
|
+
let result = this.cache.get(key);
|
|
200
|
+
if (!result) {
|
|
201
|
+
result = this.calculateFn({
|
|
202
|
+
year,
|
|
203
|
+
month,
|
|
204
|
+
day,
|
|
205
|
+
hour,
|
|
206
|
+
panType,
|
|
207
|
+
zhiRunMethod,
|
|
208
|
+
});
|
|
209
|
+
this.cache.set(key, result);
|
|
210
|
+
}
|
|
211
|
+
return result;
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* 应用过滤条件
|
|
215
|
+
*/
|
|
216
|
+
static passFilters(result, filters) {
|
|
217
|
+
const siZhu = result.timeInfo.siZhu;
|
|
218
|
+
const yearZhi = siZhu.yearGanZhi.charAt(1);
|
|
219
|
+
const monthZhi = siZhu.monthGanZhi.charAt(1);
|
|
220
|
+
const dayZhi = siZhu.dayZhi;
|
|
221
|
+
// 节气交接日过滤
|
|
222
|
+
if (filters.excludeJieQiDay) {
|
|
223
|
+
// 简化判断:检查是否在节气当天(需要更精确实现)
|
|
224
|
+
// 这里暂时跳过,因为需要节气精确时间
|
|
225
|
+
}
|
|
226
|
+
// 岁破过滤
|
|
227
|
+
if (filters.excludeSuiPo && (0, shensha_rules_1.checkSuiPo)(yearZhi, dayZhi)) {
|
|
228
|
+
return false;
|
|
229
|
+
}
|
|
230
|
+
// 月破过滤
|
|
231
|
+
if (filters.excludeYuePo && (0, shensha_rules_1.checkYuePo)(monthZhi, dayZhi)) {
|
|
232
|
+
return false;
|
|
233
|
+
}
|
|
234
|
+
return true;
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* 计算评分(使用缓存的用神信息)
|
|
238
|
+
*/
|
|
239
|
+
static calculateScoreWithCache(result, yongShenInfo) {
|
|
240
|
+
// 格局评分
|
|
241
|
+
const geJuScore = this.calcGeJuScore(result);
|
|
242
|
+
// 用神评分(使用缓存)
|
|
243
|
+
const yongShenScore = this.calcYongShenScoreFromInfo(yongShenInfo);
|
|
244
|
+
// 神煞评分
|
|
245
|
+
const shenShaScore = this.calcShenShaScore(result);
|
|
246
|
+
// 综合评分
|
|
247
|
+
const totalScore = Math.round(geJuScore * SCORE_WEIGHTS.geJu +
|
|
248
|
+
yongShenScore * SCORE_WEIGHTS.yongShen +
|
|
249
|
+
shenShaScore * SCORE_WEIGHTS.shenSha);
|
|
250
|
+
// 生成推荐理由
|
|
251
|
+
const recommendation = this.generateRecommendation(result, yongShenInfo.shiLei, totalScore);
|
|
252
|
+
return {
|
|
253
|
+
totalScore: Math.max(0, Math.min(100, totalScore)),
|
|
254
|
+
geJuScore,
|
|
255
|
+
yongShenScore,
|
|
256
|
+
shenShaScore,
|
|
257
|
+
recommendation,
|
|
258
|
+
};
|
|
259
|
+
}
|
|
260
|
+
/**
|
|
261
|
+
* 格局评分
|
|
262
|
+
*/
|
|
263
|
+
static calcGeJuScore(result) {
|
|
264
|
+
let score = SCORE_CONSTANTS.BASE_SCORE;
|
|
265
|
+
for (const geJu of result.geJu) {
|
|
266
|
+
if (geJu.type === '吉格') {
|
|
267
|
+
score += SCORE_CONSTANTS.JI_GE_BONUS;
|
|
268
|
+
}
|
|
269
|
+
else if (geJu.type === '凶格') {
|
|
270
|
+
score -= SCORE_CONSTANTS.XIONG_GE_PENALTY;
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
// 检查三吉门是否当令
|
|
274
|
+
for (const men of SAN_JI_MEN) {
|
|
275
|
+
for (const gong of [1, 2, 3, 4, 6, 7, 8, 9]) {
|
|
276
|
+
if (result.gongs[gong].men === men && !result.gongs[gong].isKong) {
|
|
277
|
+
score += SCORE_CONSTANTS.SAN_JI_MEN_BONUS;
|
|
278
|
+
break;
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
return Math.max(0, Math.min(100, score));
|
|
283
|
+
}
|
|
284
|
+
/**
|
|
285
|
+
* 用神评分(使用缓存的用神信息)
|
|
286
|
+
*/
|
|
287
|
+
static calcYongShenScoreFromInfo(yongShenInfo) {
|
|
288
|
+
if (yongShenInfo.analysis.length === 0) {
|
|
289
|
+
return SCORE_CONSTANTS.DEFAULT_YONGSHEN_SCORE;
|
|
290
|
+
}
|
|
291
|
+
// 计算所有用神的平均分
|
|
292
|
+
const avgScore = yongShenInfo.analysis.reduce((sum, a) => sum + a.score, 0) / yongShenInfo.analysis.length;
|
|
293
|
+
return Math.round(avgScore);
|
|
294
|
+
}
|
|
295
|
+
/**
|
|
296
|
+
* 神煞评分
|
|
297
|
+
*/
|
|
298
|
+
static calcShenShaScore(result) {
|
|
299
|
+
const shenShaList = ShenShaCalculator_1.ShenShaCalculator.calculateAll(result);
|
|
300
|
+
const shenShaScore = ShenShaCalculator_1.ShenShaCalculator.calcTotalScore(shenShaList);
|
|
301
|
+
return Math.max(0, Math.min(100, SCORE_CONSTANTS.SHENSHA_BASE_SCORE + shenShaScore));
|
|
302
|
+
}
|
|
303
|
+
/**
|
|
304
|
+
* 获取评级
|
|
305
|
+
*/
|
|
306
|
+
static getGrade(score) {
|
|
307
|
+
if (score >= SCORE_CONSTANTS.GRADE_EXCELLENT)
|
|
308
|
+
return '优';
|
|
309
|
+
if (score >= SCORE_CONSTANTS.GRADE_GOOD)
|
|
310
|
+
return '良';
|
|
311
|
+
if (score >= SCORE_CONSTANTS.GRADE_MEDIUM)
|
|
312
|
+
return '中';
|
|
313
|
+
return '差';
|
|
314
|
+
}
|
|
315
|
+
/**
|
|
316
|
+
* 获取有利因素(使用缓存的用神信息)
|
|
317
|
+
*/
|
|
318
|
+
static getHighlightsWithCache(result, yongShenInfo) {
|
|
319
|
+
const highlights = [];
|
|
320
|
+
// 吉格
|
|
321
|
+
for (const geJu of result.geJu) {
|
|
322
|
+
if (geJu.type === '吉格') {
|
|
323
|
+
highlights.push(`${geJu.name}`);
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
// 三吉门不空
|
|
327
|
+
for (const men of SAN_JI_MEN) {
|
|
328
|
+
for (const gong of [1, 2, 3, 4, 6, 7, 8, 9]) {
|
|
329
|
+
if (result.gongs[gong].men === men && !result.gongs[gong].isKong) {
|
|
330
|
+
highlights.push(`${men}门得位`);
|
|
331
|
+
break;
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
// 用神状态好(使用缓存)
|
|
336
|
+
for (const analysis of yongShenInfo.analysis) {
|
|
337
|
+
if (analysis.score >= SCORE_CONSTANTS.YONGSHEN_GOOD_THRESHOLD && !analysis.isKong && !analysis.isRuMu) {
|
|
338
|
+
highlights.push(`${analysis.yongshen}状态佳`);
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
// 马星临宫
|
|
342
|
+
for (const gong of [1, 2, 3, 4, 6, 7, 8, 9]) {
|
|
343
|
+
if (result.gongs[gong].isMa && !result.gongs[gong].isKong) {
|
|
344
|
+
highlights.push('马星临宫');
|
|
345
|
+
break;
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
return highlights.slice(0, OUTPUT_LIMITS.MAX_HIGHLIGHTS);
|
|
349
|
+
}
|
|
350
|
+
/**
|
|
351
|
+
* 获取注意事项
|
|
352
|
+
*/
|
|
353
|
+
static getWarnings(result) {
|
|
354
|
+
const warnings = [];
|
|
355
|
+
// 凶格
|
|
356
|
+
for (const geJu of result.geJu) {
|
|
357
|
+
if (geJu.type === '凶格') {
|
|
358
|
+
warnings.push(`${geJu.name}`);
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
// 日干空亡
|
|
362
|
+
if (result.gongs[result.dayGanGong].isKong) {
|
|
363
|
+
warnings.push('日干落空');
|
|
364
|
+
}
|
|
365
|
+
// 时干空亡
|
|
366
|
+
if (result.gongs[result.hourGanGong].isKong) {
|
|
367
|
+
warnings.push('时干落空');
|
|
368
|
+
}
|
|
369
|
+
return warnings.slice(0, OUTPUT_LIMITS.MAX_WARNINGS);
|
|
370
|
+
}
|
|
371
|
+
/**
|
|
372
|
+
* 生成推荐理由
|
|
373
|
+
*/
|
|
374
|
+
static generateRecommendation(_result, shiLei, score) {
|
|
375
|
+
if (score >= SCORE_CONSTANTS.GRADE_EXCELLENT) {
|
|
376
|
+
return `此时${shiLei}大吉,格局上佳,用神得位`;
|
|
377
|
+
}
|
|
378
|
+
else if (score >= SCORE_CONSTANTS.GRADE_GOOD) {
|
|
379
|
+
return `此时${shiLei}较宜,整体格局良好`;
|
|
380
|
+
}
|
|
381
|
+
else if (score >= SCORE_CONSTANTS.GRADE_MEDIUM) {
|
|
382
|
+
return `此时${shiLei}中平,可酌情选用`;
|
|
383
|
+
}
|
|
384
|
+
else {
|
|
385
|
+
return `此时${shiLei}不宜,建议另择吉时`;
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
/**
|
|
389
|
+
* 计算方位信息(使用缓存的用神信息)
|
|
390
|
+
*/
|
|
391
|
+
static calcDirectionInfoWithCache(result, yongShenInfo) {
|
|
392
|
+
// 三吉门方位
|
|
393
|
+
const sanJiMen = [];
|
|
394
|
+
for (const men of SAN_JI_MEN) {
|
|
395
|
+
for (const gong of [1, 2, 3, 4, 6, 7, 8, 9]) {
|
|
396
|
+
if (result.gongs[gong].men === men) {
|
|
397
|
+
sanJiMen.push({
|
|
398
|
+
men,
|
|
399
|
+
gong,
|
|
400
|
+
direction: GONG_TO_DIRECTION[gong],
|
|
401
|
+
});
|
|
402
|
+
break;
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
// 用神方位(使用缓存)
|
|
407
|
+
const yongShen = [];
|
|
408
|
+
for (const item of yongShenInfo.zhuyong) {
|
|
409
|
+
yongShen.push({
|
|
410
|
+
name: item.name,
|
|
411
|
+
gong: item.gong,
|
|
412
|
+
direction: GONG_TO_DIRECTION[item.gong],
|
|
413
|
+
});
|
|
414
|
+
}
|
|
415
|
+
return { sanJiMen, yongShen };
|
|
416
|
+
}
|
|
417
|
+
/**
|
|
418
|
+
* 清除缓存
|
|
419
|
+
*/
|
|
420
|
+
static clearCache() {
|
|
421
|
+
this.cache.clear();
|
|
422
|
+
}
|
|
423
|
+
/**
|
|
424
|
+
* 获取缓存大小
|
|
425
|
+
*/
|
|
426
|
+
static getCacheSize() {
|
|
427
|
+
return this.cache.size;
|
|
428
|
+
}
|
|
429
|
+
}
|
|
430
|
+
exports.ZeRiCalculator = ZeRiCalculator;
|
|
431
|
+
//# sourceMappingURL=ZeRiCalculator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ZeRiCalculator.js","sourceRoot":"","sources":["../../../../src/services/qimen/calculators/ZeRiCalculator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 转盘式奇门计算器
|
|
3
|
+
* Rotating style Qimen calculator (following《神奇之门》)
|
|
4
|
+
*
|
|
5
|
+
* 转盘式核心规则:
|
|
6
|
+
* 1. 三奇六仪按物理方向旋转(非洛书飞布)
|
|
7
|
+
* 2. 阳遁顺转(物理顺时针):1→8→3→4→9→2→7→6
|
|
8
|
+
* 3. 阴遁逆转(物理逆时针):1→6→7→2→9→4→3→8
|
|
9
|
+
* 4. 八门、九星同样按物理方向转动
|
|
10
|
+
* 5. 中宫寄坤二
|
|
11
|
+
* 6. 天禽星随天芮星(寄坤二宫)
|
|
12
|
+
*/
|
|
13
|
+
import type { GongWei, TianGan, DiZhi, BaMen, JiuXing, YinYangDun } from '../types';
|
|
14
|
+
export interface ZhuanPanTianPanResult {
|
|
15
|
+
gongGan: Record<GongWei, TianGan>;
|
|
16
|
+
ganGong: Record<TianGan, GongWei>;
|
|
17
|
+
}
|
|
18
|
+
export interface ZhuanPanBaMenResult {
|
|
19
|
+
gongMen: Record<GongWei, BaMen>;
|
|
20
|
+
zhiShiMen: BaMen;
|
|
21
|
+
zhiShiGong: GongWei;
|
|
22
|
+
zhiShiLuoGong: GongWei;
|
|
23
|
+
}
|
|
24
|
+
export interface ZhuanPanJiuXingResult {
|
|
25
|
+
gongXing: Record<GongWei, JiuXing>;
|
|
26
|
+
zhiFuXing: JiuXing;
|
|
27
|
+
zhiFuGong: GongWei;
|
|
28
|
+
zhiFuLuoGong: GongWei;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* 转盘式奇门计算器
|
|
32
|
+
* 实现《神奇之门》中的转盘式排盘法
|
|
33
|
+
*/
|
|
34
|
+
export declare class ZhuanPanCalculator {
|
|
35
|
+
/**
|
|
36
|
+
* 计算转盘式天盘布局
|
|
37
|
+
* @param diPanGanGong 地盘干->宫位映射
|
|
38
|
+
* @param ganZhi 时干支(时盘)、日干支(日盘)、月干支(月盘)或年干支(年盘)
|
|
39
|
+
* @param yinYangDun 阴阳遁
|
|
40
|
+
* @returns 天盘各宫的干
|
|
41
|
+
*
|
|
42
|
+
* 原理(转盘式):
|
|
43
|
+
* 1. 找到时干(或日干/月干/年干)在地盘的落宫
|
|
44
|
+
* 2. 计算该宫到值符星原始宫的旋转步数
|
|
45
|
+
* 3. 将整个地盘旋转相应步数
|
|
46
|
+
* 4. 阳遁顺时针旋转,阴遁逆时针旋转
|
|
47
|
+
*/
|
|
48
|
+
static calculateTianPan(diPanGanGong: Record<TianGan, GongWei>, ganZhi: string, yinYangDun: YinYangDun): ZhuanPanTianPanResult;
|
|
49
|
+
/**
|
|
50
|
+
* 计算转盘式八门布局
|
|
51
|
+
* @param zhiFuGong 值符星落宫(旬首遁干在地盘的宫位)
|
|
52
|
+
* @param hourZhi 时支
|
|
53
|
+
* @param yinYangDun 阴阳遁
|
|
54
|
+
* @returns 八门布局
|
|
55
|
+
*
|
|
56
|
+
* 原理(转盘式):
|
|
57
|
+
* 1. 确定值使门(值符星原始宫位对应的门)
|
|
58
|
+
* 2. 值使门从值符星落宫起,按时辰数旋转
|
|
59
|
+
* 3. 阳遁顺时针,阴遁逆时针
|
|
60
|
+
* 4. 其他七门依次排列(按物理方向旋转)
|
|
61
|
+
*/
|
|
62
|
+
static calculateBaMen(zhiFuGong: GongWei, hourZhi: DiZhi, yinYangDun: YinYangDun): ZhuanPanBaMenResult;
|
|
63
|
+
/**
|
|
64
|
+
* 计算转盘式九星布局
|
|
65
|
+
* @param xunShouGong 旬首遁干在地盘的宫位
|
|
66
|
+
* @param hourZhi 时支
|
|
67
|
+
* @param yinYangDun 阴阳遁
|
|
68
|
+
* @returns 九星布局
|
|
69
|
+
*
|
|
70
|
+
* 原理(转盘式):
|
|
71
|
+
* 1. 确定值符星(旬首落宫对应的星)
|
|
72
|
+
* 2. 值符星从地盘旬首落宫起,按时辰数旋转
|
|
73
|
+
* 3. 阳遁顺时针,阴遁逆时针
|
|
74
|
+
* 4. 天禽星(中五宫)随天芮星,或寄坤二
|
|
75
|
+
*/
|
|
76
|
+
static calculateJiuXing(xunShouGong: GongWei, hourZhi: DiZhi, yinYangDun: YinYangDun): ZhuanPanJiuXingResult;
|
|
77
|
+
/**
|
|
78
|
+
* 获取遁甲干
|
|
79
|
+
* 甲遁于六仪之下,需要根据干支确定
|
|
80
|
+
*/
|
|
81
|
+
private static getDunGan;
|
|
82
|
+
/**
|
|
83
|
+
* 根据起始宫位和步数计算目标宫位(转盘式9宫旋转)
|
|
84
|
+
* 包含中宫处理
|
|
85
|
+
*/
|
|
86
|
+
private static getGongByRotation;
|
|
87
|
+
/**
|
|
88
|
+
* 根据宫位获取原始门
|
|
89
|
+
*/
|
|
90
|
+
private static getMenByGong;
|
|
91
|
+
/**
|
|
92
|
+
* 根据宫位获取原始星
|
|
93
|
+
*/
|
|
94
|
+
private static getXingByGong;
|
|
95
|
+
/**
|
|
96
|
+
* 计算所有八门的落宫(转盘式)
|
|
97
|
+
* 整体按物理方向旋转
|
|
98
|
+
*/
|
|
99
|
+
private static calculateAllMenZhuanPan;
|
|
100
|
+
/**
|
|
101
|
+
* 计算所有九星的落宫(转盘式)
|
|
102
|
+
* 整体按物理方向旋转,天禽星随天芮星
|
|
103
|
+
*/
|
|
104
|
+
private static calculateAllXingZhuanPan;
|
|
105
|
+
/**
|
|
106
|
+
* 根据宫位找门
|
|
107
|
+
*/
|
|
108
|
+
static findMenByGong(gongMen: Record<GongWei, BaMen>, gong: GongWei): BaMen;
|
|
109
|
+
/**
|
|
110
|
+
* 根据宫位找星
|
|
111
|
+
*/
|
|
112
|
+
static findXingByGong(gongXing: Record<GongWei, JiuXing>, gong: GongWei): JiuXing;
|
|
113
|
+
/**
|
|
114
|
+
* 根据天干找天盘落宫
|
|
115
|
+
*/
|
|
116
|
+
static findGongByGan(ganGong: Record<TianGan, GongWei>, gan: TianGan): GongWei;
|
|
117
|
+
}
|
|
118
|
+
//# sourceMappingURL=ZhuanPanCalculator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ZhuanPanCalculator.d.ts","sourceRoot":"","sources":["../../../../src/services/qimen/calculators/ZhuanPanCalculator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAoBpF,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAClC,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;CACnC;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IAChC,SAAS,EAAE,KAAK,CAAC;IACjB,UAAU,EAAE,OAAO,CAAC;IACpB,aAAa,EAAE,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IACnC,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;IACnB,YAAY,EAAE,OAAO,CAAC;CACvB;AAID;;;GAGG;AACH,qBAAa,kBAAkB;IAC7B;;;;;;;;;;;;OAYG;IACH,MAAM,CAAC,gBAAgB,CACrB,YAAY,EAAE,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,EACtC,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,UAAU,GACrB,qBAAqB;IA6BxB;;;;;;;;;;;;OAYG;IACH,MAAM,CAAC,cAAc,CACnB,SAAS,EAAE,OAAO,EAClB,OAAO,EAAE,KAAK,EACd,UAAU,EAAE,UAAU,GACrB,mBAAmB;IAwBtB;;;;;;;;;;;;OAYG;IACH,MAAM,CAAC,gBAAgB,CACrB,WAAW,EAAE,OAAO,EACpB,OAAO,EAAE,KAAK,EACd,UAAU,EAAE,UAAU,GACrB,qBAAqB;IA0BxB;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAC,SAAS;IAUxB;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAC,iBAAiB;IAwBhC;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,YAAY;IAY3B;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,aAAa;IAe5B;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAC,uBAAuB;IA6BtC;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAC,wBAAwB;IAoCvC;;OAEG;IACH,MAAM,CAAC,aAAa,CAAC,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,IAAI,EAAE,OAAO,GAAG,KAAK;IAI3E;;OAEG;IACH,MAAM,CAAC,cAAc,CAAC,QAAQ,EAAE,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO;IAOjF;;OAEG;IACH,MAAM,CAAC,aAAa,CAAC,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,OAAO,GAAG,OAAO;CAI/E"}
|