|
|
@@ -5,7 +5,10 @@ import com.etotem.cfc.dto.*;
|
|
|
import com.etotem.cfc.entity.*;
|
|
|
import com.etotem.cfc.mapper.FamilyMemberMapper;
|
|
|
import com.etotem.cfc.mapper.FamilyMapper;
|
|
|
+import com.etotem.cfc.mapper.TianpanDailyFortuneMapper;
|
|
|
+import com.etotem.cfc.mapper.TianpanMemberAnnualEnergyMapper;
|
|
|
import com.etotem.cfc.mapper.ZodiacPairingMapper;
|
|
|
+import com.fasterxml.jackson.databind.ObjectMapper;
|
|
|
import org.slf4j.Logger;
|
|
|
import org.slf4j.LoggerFactory;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
@@ -13,6 +16,8 @@ import org.springframework.stereotype.Service;
|
|
|
import javax.annotation.Resource;
|
|
|
import java.util.*;
|
|
|
import java.util.stream.Collectors;
|
|
|
+import java.time.LocalDate;
|
|
|
+import java.util.stream.Collectors;
|
|
|
|
|
|
/**
|
|
|
* 家庭天盘服务
|
|
|
@@ -57,6 +62,14 @@ public class TianpanService {
|
|
|
@Resource
|
|
|
private ZodiacPairingMapper zodiacPairingMapper;
|
|
|
|
|
|
+ @Resource
|
|
|
+ private TianpanDailyFortuneMapper tianpanDailyFortuneMapper;
|
|
|
+
|
|
|
+ @Resource
|
|
|
+ private TianpanMemberAnnualEnergyMapper tianpanMemberAnnualEnergyMapper;
|
|
|
+
|
|
|
+ private final ObjectMapper objectMapper = new ObjectMapper();
|
|
|
+
|
|
|
/**
|
|
|
* 构建家庭天盘仪表盘
|
|
|
*
|
|
|
@@ -306,12 +319,25 @@ public class TianpanService {
|
|
|
|
|
|
/**
|
|
|
* 构建年度能量
|
|
|
- *
|
|
|
- * @param memberId 成员 ID
|
|
|
- * @param year 目标年份
|
|
|
- * @return 年度能量
|
|
|
*/
|
|
|
public MemberAnnualEnergyVO buildAnnualEnergy(Long memberId, Integer year) {
|
|
|
+ LambdaQueryWrapper<TianpanMemberAnnualEnergy> qw = new LambdaQueryWrapper<>();
|
|
|
+ qw.eq(TianpanMemberAnnualEnergy::getMemberId, memberId)
|
|
|
+ .eq(TianpanMemberAnnualEnergy::getYear, year);
|
|
|
+ TianpanMemberAnnualEnergy cached = tianpanMemberAnnualEnergyMapper.selectOne(qw);
|
|
|
+ if (cached != null) {
|
|
|
+ return toMemberAnnualEnergyVO(cached);
|
|
|
+ }
|
|
|
+
|
|
|
+ MemberAnnualEnergyVO vo = computeAnnualEnergy(memberId, year);
|
|
|
+
|
|
|
+ TianpanMemberAnnualEnergy entity = toMemberAnnualEnergyEntity(vo, memberId, year);
|
|
|
+ tianpanMemberAnnualEnergyMapper.insert(entity);
|
|
|
+
|
|
|
+ return vo;
|
|
|
+ }
|
|
|
+
|
|
|
+ private MemberAnnualEnergyVO computeAnnualEnergy(Long memberId, Integer year) {
|
|
|
FamilyMember member = familyMemberMapper.selectById(memberId);
|
|
|
if (member == null) {
|
|
|
return null;
|
|
|
@@ -325,7 +351,6 @@ public class TianpanService {
|
|
|
return null;
|
|
|
}
|
|
|
|
|
|
- // 获取出生信息
|
|
|
Integer birthYear = null;
|
|
|
if (attrs.getBirthDatetime() != null) {
|
|
|
Calendar cal = Calendar.getInstance();
|
|
|
@@ -338,8 +363,7 @@ public class TianpanService {
|
|
|
return null;
|
|
|
}
|
|
|
|
|
|
- // 计算年度能量
|
|
|
- ZodiacAnnualEnergyService.AnnualEnergyResult result =
|
|
|
+ ZodiacAnnualEnergyService.AnnualEnergyResult result =
|
|
|
zodiacAnnualEnergyService.calculate(birthYear, zodiacCode, year);
|
|
|
|
|
|
MemberAnnualEnergyVO vo = new MemberAnnualEnergyVO();
|
|
|
@@ -350,66 +374,114 @@ public class TianpanService {
|
|
|
vo.setJupiterPhase(result.getJupiterPhase());
|
|
|
vo.setSaturnPhase(result.getSaturnPhase());
|
|
|
|
|
|
- // 生成亮点
|
|
|
List<String> highlights = new ArrayList<>();
|
|
|
Map<String, Integer> dims = result.toMap();
|
|
|
- if (dims.get("body") >= 70) {
|
|
|
- highlights.add("身体健康能量充沛");
|
|
|
- }
|
|
|
- if (dims.get("mind") >= 70) {
|
|
|
- highlights.add("心理能量饱满");
|
|
|
- }
|
|
|
- if (dims.get("wisdom") >= 70) {
|
|
|
- highlights.add("智慧能量开启");
|
|
|
- }
|
|
|
- if (dims.get("action") >= 70) {
|
|
|
- highlights.add("行动力强劲");
|
|
|
- }
|
|
|
- if (dims.get("wealth") >= 70) {
|
|
|
- highlights.add("财富能量旺盛");
|
|
|
- }
|
|
|
- if ("benming".equals(result.getYearRelation())) {
|
|
|
- highlights.add("本命年,稳中求进");
|
|
|
+ if (dims.get("body") >= 70) { highlights.add("身体健康能量充沛"); }
|
|
|
+ if (dims.get("mind") >= 70) { highlights.add("心理能量饱满"); }
|
|
|
+ if (dims.get("wisdom") >= 70) { highlights.add("智慧能量开启"); }
|
|
|
+ if (dims.get("action") >= 70) { highlights.add("行动力强劲"); }
|
|
|
+ if (dims.get("wealth") >= 70) { highlights.add("财富能量旺盛"); }
|
|
|
+ if ("benming".equals(result.getYearRelation())) { highlights.add("本命年,稳中求进"); }
|
|
|
+ if ("liuhe".equals(result.getYearRelation())) { highlights.add("六合吉年,贵人相助"); }
|
|
|
+ if ("chong".equals(result.getYearRelation())) { highlights.add("冲太岁,注意调整"); }
|
|
|
+ vo.setHighlights(highlights);
|
|
|
+
|
|
|
+ return vo;
|
|
|
+ }
|
|
|
+
|
|
|
+ private MemberAnnualEnergyVO toMemberAnnualEnergyVO(TianpanMemberAnnualEnergy e) {
|
|
|
+ MemberAnnualEnergyVO vo = new MemberAnnualEnergyVO();
|
|
|
+ vo.setMemberId(e.getMemberId());
|
|
|
+ vo.setYear(e.getYear());
|
|
|
+
|
|
|
+ FamilyMember member = familyMemberMapper.selectById(e.getMemberId());
|
|
|
+ if (member != null) {
|
|
|
+ vo.setNickname(member.getNickname());
|
|
|
}
|
|
|
- if ("liuhe".equals(result.getYearRelation())) {
|
|
|
- highlights.add("六合吉年,贵人相助");
|
|
|
+
|
|
|
+ Map<String, Integer> dims = new LinkedHashMap<>();
|
|
|
+ dims.put("body", e.getDimensionsBody());
|
|
|
+ dims.put("mind", e.getDimensionsMind());
|
|
|
+ dims.put("wisdom", e.getDimensionsWisdom());
|
|
|
+ dims.put("action", e.getDimensionsAction());
|
|
|
+ dims.put("wealth", e.getDimensionsWealth());
|
|
|
+ vo.setDimensions(dims);
|
|
|
+
|
|
|
+ vo.setJupiterPhase(e.getJupiterPhase());
|
|
|
+ vo.setSaturnPhase(e.getSaturnPhase());
|
|
|
+
|
|
|
+ if (e.getHighlights() != null) {
|
|
|
+ try { vo.setHighlights(objectMapper.readValue(e.getHighlights(), List.class)); } catch (Exception ex) { /* ignore */ }
|
|
|
}
|
|
|
- if ("chong".equals(result.getYearRelation())) {
|
|
|
- highlights.add("冲太岁,注意调整");
|
|
|
+ return vo;
|
|
|
+ }
|
|
|
+
|
|
|
+ private TianpanMemberAnnualEnergy toMemberAnnualEnergyEntity(MemberAnnualEnergyVO vo, Long memberId, Integer year) {
|
|
|
+ TianpanMemberAnnualEnergy e = new TianpanMemberAnnualEnergy();
|
|
|
+ e.setMemberId(memberId);
|
|
|
+ e.setYear(year);
|
|
|
+
|
|
|
+ Map<String, Integer> dims = vo.getDimensions();
|
|
|
+ if (dims != null) {
|
|
|
+ e.setDimensionsBody(dims.get("body") != null ? dims.get("body") : 0);
|
|
|
+ e.setDimensionsMind(dims.get("mind") != null ? dims.get("mind") : 0);
|
|
|
+ e.setDimensionsWisdom(dims.get("wisdom") != null ? dims.get("wisdom") : 0);
|
|
|
+ e.setDimensionsAction(dims.get("action") != null ? dims.get("action") : 0);
|
|
|
+ e.setDimensionsWealth(dims.get("wealth") != null ? dims.get("wealth") : 0);
|
|
|
+ } else {
|
|
|
+ e.setDimensionsBody(0);
|
|
|
+ e.setDimensionsMind(0);
|
|
|
+ e.setDimensionsWisdom(0);
|
|
|
+ e.setDimensionsAction(0);
|
|
|
+ e.setDimensionsWealth(0);
|
|
|
}
|
|
|
- vo.setHighlights(highlights);
|
|
|
|
|
|
- return vo;
|
|
|
+ e.setJupiterPhase(vo.getJupiterPhase());
|
|
|
+ e.setSaturnPhase(vo.getSaturnPhase());
|
|
|
+
|
|
|
+ try { e.setHighlights(objectMapper.writeValueAsString(vo.getHighlights())); } catch (Exception ex) { /* ignore */ }
|
|
|
+
|
|
|
+ return e;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 构建每日运势
|
|
|
- *
|
|
|
- * @param familyId 家庭 ID
|
|
|
- * @return 每日运势
|
|
|
*/
|
|
|
public DailyFortuneVO buildDailyFortune(Long familyId) {
|
|
|
- DailyFortuneVO vo = new DailyFortuneVO();
|
|
|
+ String today = formatDate(new Date());
|
|
|
+
|
|
|
+ LambdaQueryWrapper<TianpanDailyFortune> qw = new LambdaQueryWrapper<>();
|
|
|
+ qw.eq(TianpanDailyFortune::getFamilyId, familyId)
|
|
|
+ .eq(TianpanDailyFortune::getDate, today);
|
|
|
+ TianpanDailyFortune cached = tianpanDailyFortuneMapper.selectOne(qw);
|
|
|
+ if (cached != null) {
|
|
|
+ return toDailyFortuneVO(cached);
|
|
|
+ }
|
|
|
+
|
|
|
+ DailyFortuneVO vo = computeDailyFortune(familyId);
|
|
|
+
|
|
|
+ TianpanDailyFortune entity = toDailyFortuneEntity(vo, familyId, today);
|
|
|
+ tianpanDailyFortuneMapper.insert(entity);
|
|
|
+
|
|
|
+ return vo;
|
|
|
+ }
|
|
|
|
|
|
+ private DailyFortuneVO computeDailyFortune(Long familyId) {
|
|
|
+ DailyFortuneVO vo = new DailyFortuneVO();
|
|
|
Calendar cal = Calendar.getInstance();
|
|
|
vo.setDate(formatDate(cal.getTime()));
|
|
|
vo.setLunarDate("农历" + getLunarDate(cal.getTime()));
|
|
|
vo.setDayGanzhi(getDayGanzhi(cal.getTime()));
|
|
|
|
|
|
- // 五行
|
|
|
DailyFortuneVO.FiveElementsVO fiveElements = new DailyFortuneVO.FiveElementsVO();
|
|
|
fiveElements.setMain(getDayElement(cal.getTime()));
|
|
|
fiveElements.setDetail(getDayElementDetail(cal.getTime()));
|
|
|
vo.setFiveElements(fiveElements);
|
|
|
|
|
|
- // 吉凶
|
|
|
vo.setAuspicious(Arrays.asList("宜祭祀", "宜祈福", "宜聚会"));
|
|
|
vo.setInauspicious(Arrays.asList("忌远行", "忌动土"));
|
|
|
-
|
|
|
- // 家庭建议
|
|
|
vo.setFamilyAdvice("今日家庭能量和谐,适合安排家庭活动");
|
|
|
|
|
|
- // 焦点成员提示
|
|
|
DailyFortuneVO.FocusMemberTip focus = new DailyFortuneVO.FocusMemberTip();
|
|
|
focus.setName("家庭中最活跃的成员");
|
|
|
focus.setTip("多倾听他的想法");
|
|
|
@@ -419,6 +491,58 @@ public class TianpanService {
|
|
|
return vo;
|
|
|
}
|
|
|
|
|
|
+ private DailyFortuneVO toDailyFortuneVO(TianpanDailyFortune e) {
|
|
|
+ DailyFortuneVO vo = new DailyFortuneVO();
|
|
|
+ vo.setDate(e.getDate());
|
|
|
+ vo.setLunarDate(e.getLunarDate());
|
|
|
+ vo.setDayGanzhi(e.getDayGanzhi());
|
|
|
+
|
|
|
+ if (e.getFiveElementsMain() != null) {
|
|
|
+ DailyFortuneVO.FiveElementsVO fe = new DailyFortuneVO.FiveElementsVO();
|
|
|
+ fe.setMain(e.getFiveElementsMain());
|
|
|
+ fe.setDetail(e.getFiveElementsDetail());
|
|
|
+ vo.setFiveElements(fe);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (e.getAuspicious() != null) {
|
|
|
+ try { vo.setAuspicious(objectMapper.readValue(e.getAuspicious(), List.class)); } catch (Exception ex) { /* ignore */ }
|
|
|
+ }
|
|
|
+ if (e.getInauspicious() != null) {
|
|
|
+ try { vo.setInauspicious(objectMapper.readValue(e.getInauspicious(), List.class)); } catch (Exception ex) { /* ignore */ }
|
|
|
+ }
|
|
|
+ vo.setFamilyAdvice(e.getFamilyAdvice());
|
|
|
+
|
|
|
+ if (e.getFocusMemberName() != null) {
|
|
|
+ DailyFortuneVO.FocusMemberTip focus = new DailyFortuneVO.FocusMemberTip();
|
|
|
+ focus.setName(e.getFocusMemberName());
|
|
|
+ focus.setTip(e.getFocusMemberTip());
|
|
|
+ focus.setWuxingTip(e.getWuxingTip());
|
|
|
+ vo.setFocusMember(focus);
|
|
|
+ }
|
|
|
+ return vo;
|
|
|
+ }
|
|
|
+
|
|
|
+ private TianpanDailyFortune toDailyFortuneEntity(DailyFortuneVO vo, Long familyId, String today) {
|
|
|
+ TianpanDailyFortune e = new TianpanDailyFortune();
|
|
|
+ e.setFamilyId(familyId);
|
|
|
+ e.setDate(today);
|
|
|
+ e.setLunarDate(vo.getLunarDate());
|
|
|
+ e.setDayGanzhi(vo.getDayGanzhi());
|
|
|
+ if (vo.getFiveElements() != null) {
|
|
|
+ e.setFiveElementsMain(vo.getFiveElements().getMain());
|
|
|
+ e.setFiveElementsDetail(vo.getFiveElements().getDetail());
|
|
|
+ }
|
|
|
+ try { e.setAuspicious(objectMapper.writeValueAsString(vo.getAuspicious())); } catch (Exception ex) { /* ignore */ }
|
|
|
+ try { e.setInauspicious(objectMapper.writeValueAsString(vo.getInauspicious())); } catch (Exception ex) { /* ignore */ }
|
|
|
+ e.setFamilyAdvice(vo.getFamilyAdvice());
|
|
|
+ if (vo.getFocusMember() != null) {
|
|
|
+ e.setFocusMemberName(vo.getFocusMember().getName());
|
|
|
+ e.setFocusMemberTip(vo.getFocusMember().getTip());
|
|
|
+ e.setWuxingTip(vo.getFocusMember().getWuxingTip());
|
|
|
+ }
|
|
|
+ return e;
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* 计算兼容性(Controller 调用入口)
|
|
|
*/
|