|
|
@@ -0,0 +1,98 @@
|
|
|
+package com.etotem.cfc.service.impl;
|
|
|
+
|
|
|
+import com.etotem.cfc.entity.User;
|
|
|
+import com.etotem.cfc.mapper.UserMapper;
|
|
|
+import com.etotem.cfc.service.PortraitService;
|
|
|
+import com.etotem.cfc.service.ProfileReadService;
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
+
|
|
|
+import javax.annotation.Resource;
|
|
|
+import java.util.HashMap;
|
|
|
+import java.util.Map;
|
|
|
+
|
|
|
+@Service
|
|
|
+public class PortraitServiceImpl implements PortraitService {
|
|
|
+
|
|
|
+ @Resource
|
|
|
+ private UserMapper userMapper;
|
|
|
+ @Resource
|
|
|
+ private ProfileReadService profileReadService;
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public String buildPortraitPrompt(Long userId, Long memberId) {
|
|
|
+ User user = userMapper.selectById(userId);
|
|
|
+ if (user == null) return null;
|
|
|
+ String custom = user.getPortraitPrompt();
|
|
|
+ if (custom == null || custom.trim().isEmpty()) {
|
|
|
+ return renderSnapshot(memberId);
|
|
|
+ }
|
|
|
+ String snapshot = renderSnapshot(memberId);
|
|
|
+ if (snapshot == null || snapshot.trim().isEmpty()) {
|
|
|
+ return custom.trim();
|
|
|
+ }
|
|
|
+ return custom.trim() + "\n\n---参考指标---\n" + snapshot;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void updatePortraitPrompt(Long userId, String portraitPrompt) {
|
|
|
+ User user = new User();
|
|
|
+ user.setId(userId);
|
|
|
+ user.setPortraitPrompt(portraitPrompt);
|
|
|
+ userMapper.updateById(user);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public Map<String, Object> getPortrait(Long userId, Long targetUserId, Long memberId) {
|
|
|
+ Long effectiveUserId = (targetUserId != null) ? targetUserId : userId;
|
|
|
+ User user = userMapper.selectById(effectiveUserId);
|
|
|
+ Map<String, Object> result = new HashMap<>();
|
|
|
+ result.put("portraitPrompt", user != null ? user.getPortraitPrompt() : null);
|
|
|
+ if (memberId != null) {
|
|
|
+ Map<String, Object> profile = profileReadService.getProfile(memberId);
|
|
|
+ result.put("renderedSnapshot", renderSnapshotFull(profile));
|
|
|
+ }
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+ private String renderSnapshot(Long memberId) {
|
|
|
+ if (memberId == null) return null;
|
|
|
+ Map<String, Object> profile = profileReadService.getProfile(memberId);
|
|
|
+ return renderSnapshotFull(profile);
|
|
|
+ }
|
|
|
+
|
|
|
+ private String renderSnapshotFull(Map<String, Object> profile) {
|
|
|
+ if (profile == null || profile.containsKey("error")) return null;
|
|
|
+ StringBuilder sb = new StringBuilder();
|
|
|
+ Map<String, Object> member = (Map<String, Object>) profile.get("member");
|
|
|
+ if (member != null) {
|
|
|
+ sb.append("## 画像对象:");
|
|
|
+ sb.append(member.getOrDefault("name", "用户"));
|
|
|
+ sb.append("(").append(member.getOrDefault("age", "?")).append("岁,");
|
|
|
+ String gender = String.valueOf(member.getOrDefault("gender", ""));
|
|
|
+ sb.append("男".equals(gender) ? "男" : "女".equals(gender) ? "女" : "未知");
|
|
|
+ sb.append(")\n");
|
|
|
+ }
|
|
|
+ Map<String, Object> dims = (Map<String, Object>) profile.get("dimension_scores");
|
|
|
+ if (dims != null && !dims.isEmpty()) {
|
|
|
+ sb.append(String.format("五维评分:身 %s 智 %s 心 %s 行 %s 富 %s\n",
|
|
|
+ dims.getOrDefault("body", "?"), dims.getOrDefault("wisdom", "?"),
|
|
|
+ dims.getOrDefault("mind", "?"), dims.getOrDefault("action", "?"),
|
|
|
+ dims.getOrDefault("wealth", "?")));
|
|
|
+ }
|
|
|
+ Map<String, Object> body = (Map<String, Object>) profile.get("body_metrics");
|
|
|
+ if (body != null) {
|
|
|
+ if (body.get("sleep_dur_avg") != null)
|
|
|
+ sb.append(String.format("平均睡眠:%s小时/天\n", body.get("sleep_dur_avg")));
|
|
|
+ if (body.get("exercise_count_week") != null)
|
|
|
+ sb.append(String.format("周运动频次:%s次\n", body.get("exercise_count_week")));
|
|
|
+ }
|
|
|
+ Map<String, Object> mind = (Map<String, Object>) profile.get("mind_metrics");
|
|
|
+ if (mind != null && mind.get("stress_avg") != null)
|
|
|
+ sb.append(String.format("平均压力:%s/10\n", mind.get("stress_avg")));
|
|
|
+ @SuppressWarnings("unchecked")
|
|
|
+ java.util.List<String> problems = (java.util.List<String>) profile.get("problem_domains");
|
|
|
+ if (problems != null && !problems.isEmpty())
|
|
|
+ sb.append("关注问题域:").append(String.join(", ", problems.subList(0, Math.min(5, problems.size())))).append("\n");
|
|
|
+ return sb.toString().trim().isEmpty() ? null : sb.toString().trim();
|
|
|
+ }
|
|
|
+}
|