| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408 |
- package com.etotem.cfc.controller;
- import com.etotem.cfc.common.Result;
- import com.etotem.cfc.entity.*;
- import com.etotem.cfc.service.*;
- import com.etotem.cfc.service.DanReportParseService.DanParsedReport;
- import io.swagger.v3.oas.annotations.Operation;
- import io.swagger.v3.oas.annotations.tags.Tag;
- import org.springframework.web.bind.annotation.*;
- import org.springframework.web.multipart.MultipartFile;
- import javax.annotation.Resource;
- import java.util.LinkedHashMap;
- import java.util.List;
- import java.util.Map;
- @Tag(name = "DAN测评", description = "DAN专注力测评相关接口")
- @RestController
- @RequestMapping("/api/dan-assessment")
- public class DanAssessmentController {
- @Resource
- private AssessmentService assessmentService;
- @Resource
- private AssessmentAppointmentService appointmentService;
- @Resource
- private AssessmentOrderService orderService;
- @Resource
- private AssessmentPermissionService permissionService;
- @Resource
- private com.etotem.cfc.mapper.DanAssessmentResultMapper danAssessmentResultMapper;
- @Resource
- private com.etotem.cfc.mapper.UserMapper userMapper;
- @Resource
- private DanReportParseService danReportParseService;
- @Resource
- private DimensionScoreService dimensionScoreService;
- @Resource
- private DanReportUploadService danReportUploadService;
- // ===== 测评材料 =====
- @Operation(summary = "获取当前测评材料")
- @PostMapping("/material/active")
- public Result<AssessmentMaterial> getActiveMaterial() {
- AssessmentMaterial material = assessmentService.getActiveMaterial();
- return Result.success(material);
- }
- @Operation(summary = "获取测评材料列表")
- @PostMapping("/material/list")
- public Result<List<AssessmentMaterial>> getMaterialList() {
- return Result.success(assessmentService.getMaterialList());
- }
- // ===== 积分配置 =====
- @Operation(summary = "获取积分配置")
- @PostMapping("/points-config")
- public Result<AssessmentPointsConfig> getPointsConfig() {
- return Result.success(assessmentService.getPointsConfig());
- }
- // ===== 家庭配置 =====
- @Operation(summary = "获取家庭测评配置")
- @PostMapping("/family/config")
- public Result<FamilyAssessmentConfig> getFamilyConfig(@RequestParam Long familyId) {
- return Result.success(assessmentService.getFamilyConfig(familyId));
- }
- @Operation(summary = "启用家庭测评")
- @PostMapping("/family/enable")
- public Result<String> enableFamilyAssessment(@RequestBody Map<String, Object> body) {
- Long familyId = Long.valueOf(body.get("familyId").toString());
- Long materialId = body.get("materialId") != null
- ? Long.valueOf(body.get("materialId").toString()) : null;
- Integer remindMonths = body.get("remindMonths") != null
- ? Integer.valueOf(body.get("remindMonths").toString()) : 6;
- Long createdBy = body.get("createdBy") != null
- ? Long.valueOf(body.get("createdBy").toString()) : null;
- boolean ok = assessmentService.enableFamilyAssessment(familyId, materialId, remindMonths, createdBy);
- return ok ? Result.success("启用成功") : Result.error("启用失败");
- }
- @Operation(summary = "禁用家庭测评")
- @PostMapping("/family/disable")
- public Result<String> disableFamilyAssessment(@RequestBody Map<String, Object> body) {
- Long familyId = Long.valueOf(body.get("familyId").toString());
- boolean ok = assessmentService.disableFamilyAssessment(familyId);
- return ok ? Result.success("禁用成功") : Result.error("禁用失败");
- }
- // ===== 测评记录 =====
- @Operation(summary = "创建测评记录")
- @PostMapping("/record/create")
- public Result<AssessmentRecord> createRecord(@RequestBody Map<String, Object> body) {
- Long familyId = Long.valueOf(body.get("familyId").toString());
- Long childId = Long.valueOf(body.get("childId").toString());
- Long materialId = body.get("materialId") != null
- ? Long.valueOf(body.get("materialId").toString()) : null;
- return Result.success(assessmentService.createRecord(familyId, childId, materialId));
- }
- @Operation(summary = "完成测评记录")
- @PostMapping("/record/complete")
- public Result<String> completeRecord(@RequestBody Map<String, Object> body) {
- Long recordId = Long.valueOf(body.get("recordId").toString());
- boolean ok = assessmentService.completeRecord(recordId);
- return ok ? Result.success("完成成功") : Result.error("记录不存在");
- }
- @Operation(summary = "获取家庭测评记录")
- @PostMapping("/record/family")
- public Result<List<AssessmentRecord>> getFamilyRecords(@RequestParam Long familyId) {
- return Result.success(assessmentService.getFamilyRecords(familyId));
- }
- @Operation(summary = "获取当前测评")
- @PostMapping("/record/current")
- public Result<AssessmentRecord> getCurrentAssessment(@RequestParam Long familyId) {
- return Result.success(assessmentService.getCurrentAssessment(familyId));
- }
- // ===== 测评结果 =====
- @Operation(summary = "记录/提交测评结果")
- @PostMapping("/result/record")
- public Result<DanAssessmentResult> recordResult(@RequestBody DanAssessmentResult result) {
- return Result.success(assessmentService.recordResult(result));
- }
- @Operation(summary = "获取我的测评报告列表")
- @PostMapping("/my-results")
- public Result<List<DanAssessmentResult>> getMyResults(@RequestBody Map<String, Object> body) {
- Long userId = body.get("userId") != null ? Long.valueOf(body.get("userId").toString()) : null;
- if (userId == null) {
- return Result.success(assessmentService.getAccessibleResults(0L, "teacher"));
- }
- // 这里简化为返回该用户相关的报告,实际可根据角色判断
- return Result.success(assessmentService.getAccessibleResults(userId, "teacher"));
- }
- @Operation(summary = "获取下级成长规划师的测评报告")
- @PostMapping("/child-results")
- public Result<List<DanAssessmentResult>> getChildResults(@RequestBody Map<String, Object> body) {
- Long userId = body.get("userId") != null ? Long.valueOf(body.get("userId").toString()) : null;
- List<DanAssessmentResult> results = assessmentService.getAccessibleResults(
- userId != null ? userId : 0L, "teacher");
- return Result.success(results);
- }
- @Operation(summary = "获取测评报告详情")
- @PostMapping("/result/{id}")
- public Result<DanAssessmentResult> getResult(@PathVariable Long id) {
- return Result.success(assessmentService.getByAppointmentId(id));
- }
- // ===== 预约 =====
- @Operation(summary = "创建测评预约")
- @PostMapping("/appointment/create")
- public Result<AssessmentAppointment> createAppointment(@RequestBody Map<String, Object> body) {
- Long userId = body.get("userId") != null ? Long.valueOf(body.get("userId").toString()) : null;
- Long familyId = body.get("familyId") != null ? Long.valueOf(body.get("familyId").toString()) : null;
- Long childId = Long.valueOf(body.get("childId").toString());
- // 兼容前端 teacherId / guideId 字段,允许为 null(系统安排)
- Long guideId = null;
- if (body.get("guideId") != null) {
- guideId = Long.valueOf(body.get("guideId").toString());
- } else if (body.get("teacherId") != null) {
- guideId = Long.valueOf(body.get("teacherId").toString());
- }
- Long packageId = body.get("packageId") != null ? Long.valueOf(body.get("packageId").toString()) : null;
- String appointmentDate = (String) body.get("appointmentDate");
- String appointmentTime = (String) body.get("appointmentTime");
- String appointmentType = body.get("appointmentType") != null ? body.get("appointmentType").toString() : null;
- Integer durationMinutes = body.get("durationMinutes") != null
- ? Integer.valueOf(body.get("durationMinutes").toString()) : null;
- String notes = (String) body.get("notes");
- AssessmentAppointment appointment = appointmentService.createAppointment(
- userId, familyId, childId, guideId, packageId,
- appointmentDate, appointmentTime, appointmentType, durationMinutes, notes);
- return Result.success(appointment);
- }
- @Operation(summary = "确认预约")
- @PostMapping("/appointment/confirm")
- public Result<String> confirmAppointment(@RequestBody Map<String, Object> body) {
- Long id = Long.valueOf(body.get("id").toString());
- Long teacherId = Long.valueOf(body.get("teacherId").toString());
- boolean ok = appointmentService.confirmAppointment(id, teacherId);
- return ok ? Result.success("确认成功") : Result.error("确认失败");
- }
- @Operation(summary = "完成预约")
- @PostMapping("/appointment/complete")
- public Result<String> completeAppointment(@RequestBody Map<String, Object> body) {
- Long id = Long.valueOf(body.get("id").toString());
- Long teacherId = Long.valueOf(body.get("teacherId").toString());
- boolean ok = appointmentService.completeAppointment(id, teacherId);
- return ok ? Result.success("完成成功") : Result.error("完成失败");
- }
- @Operation(summary = "取消预约")
- @PostMapping("/appointment/cancel")
- public Result<String> cancelAppointment(@RequestBody Map<String, Object> body) {
- Long id = Long.valueOf(body.get("id").toString());
- boolean ok = appointmentService.cancelAppointment(id);
- return ok ? Result.success("取消成功") : Result.error("取消失败");
- }
- @Operation(summary = "获取用户的预约列表")
- @PostMapping("/appointment/user")
- public Result<List<Map<String, Object>>> getUserAppointments(@RequestBody Map<String, Object> body) {
- Long userId = body.get("userId") != null ? Long.valueOf(body.get("userId").toString()) : null;
- if (userId == null) return Result.error("userId 不能为空");
- List<AssessmentAppointment> list = appointmentService.getByUserId(userId);
- List<Map<String, Object>> result = new java.util.ArrayList<>();
- for (AssessmentAppointment app : list) {
- Map<String, Object> item = new java.util.LinkedHashMap<>();
- item.put("id", app.getId());
- item.put("userId", app.getUserId());
- item.put("familyId", app.getFamilyId());
- item.put("childId", app.getChildId());
- item.put("guideId", app.getGuideId());
- item.put("packageId", app.getPackageId());
- item.put("appointmentDate", app.getAppointmentDate());
- item.put("appointmentTime", app.getAppointmentTime());
- item.put("durationMinutes", app.getDurationMinutes());
- item.put("status", app.getStatus());
- item.put("appointmentType", app.getAppointmentType());
- item.put("notes", app.getNotes());
- item.put("contactPhone", app.getContactPhone());
- item.put("meetLink", app.getMeetLink());
- item.put("createdAt", app.getCreatedAt());
- // 关联查询规划师名称
- if (app.getGuideId() != null) {
- com.etotem.cfc.entity.User guide = userMapper.selectById(app.getGuideId());
- item.put("guideName", guide != null ? guide.getNickname() : "");
- } else {
- item.put("guideName", "");
- }
- result.add(item);
- }
- return Result.success(result);
- }
- @Operation(summary = "获取规划师的预约列表")
- @PostMapping("/appointment/guide")
- public Result<List<AssessmentAppointment>> getGuideAppointments(@RequestParam Long guideId) {
- return Result.success(appointmentService.getByGuideId(guideId));
- }
- // ===== 订单 =====
- @Operation(summary = "创建测评订单(含预约)")
- @PostMapping("/order/create")
- public Result<AssessmentOrder> createOrder(@RequestBody Map<String, Object> body) {
- Long familyId = body.get("familyId") != null ? Long.valueOf(body.get("familyId").toString()) : null;
- Long userId = body.get("userId") != null ? Long.valueOf(body.get("userId").toString()) : null;
- Long childId = Long.valueOf(body.get("childId").toString());
- Long guideId = Long.valueOf(body.get("guideId").toString());
- Long packageId = body.get("packageId") != null ? Long.valueOf(body.get("packageId").toString()) : null;
- String guideName = (String) body.get("guideName");
- String packageName = (String) body.get("packageName");
- Long totalPrice = body.get("totalPrice") != null ? Long.valueOf(body.get("totalPrice").toString()) : 0L;
- Long discountAmount = body.get("discountAmount") != null
- ? Long.valueOf(body.get("discountAmount").toString()) : 0L;
- AssessmentOrder order = orderService.createOrder(familyId, userId, childId,
- guideId, packageId, guideName, packageName, totalPrice, discountAmount);
- return Result.success(order);
- }
- @Operation(summary = "支付测评订单")
- @PostMapping("/order/pay")
- public Result<String> payOrder(@RequestBody Map<String, Object> body) {
- String orderNo = (String) body.get("orderNo");
- String payType = (String) body.get("payType");
- boolean ok = orderService.payOrder(orderNo, payType);
- return ok ? Result.success("支付成功") : Result.error("支付失败");
- }
- @Operation(summary = "取消订单")
- @PostMapping("/order/cancel")
- public Result<String> cancelOrder(@RequestBody Map<String, Object> body) {
- String orderNo = (String) body.get("orderNo");
- boolean ok = orderService.cancelOrder(orderNo);
- return ok ? Result.success("取消成功") : Result.error("取消失败");
- }
- @Operation(summary = "获取订单详情")
- @PostMapping("/order/detail")
- public Result<AssessmentOrder> getOrderDetail(@RequestParam String orderNo) {
- return Result.success(orderService.getByOrderNo(orderNo));
- }
- @Operation(summary = "获取家庭订单列表")
- @PostMapping("/order/family")
- public Result<List<AssessmentOrder>> getFamilyOrders(@RequestParam Long familyId) {
- return Result.success(orderService.getFamilyOrders(familyId));
- }
- // ===== 结构化报告 =====
- @Operation(summary = "获取测评结果结构化分析")
- @PostMapping("/results/{id}/structured")
- public Result<Map<String, Object>> getStructuredResult(@PathVariable Long id) {
- DanAssessmentResult result = danAssessmentResultMapper.selectById(id);
- if (result == null) {
- return Result.error("测评结果不存在");
- }
- Map<String, Object> data = new java.util.LinkedHashMap<>();
- data.put("resultId", result.getId());
- data.put("childName", result.getChildName());
- data.put("assessmentDate", result.getAssessmentDate());
- data.put("structuredAnalysis", result.getStructuredAnalysis());
- return Result.success(data);
- }
- // ===== DAN 报告上传与解析 =====
- @Operation(summary = "上传 DAN 报告并预览解析结果(Phase 1)— 已迁移到 dan_report_uploads 表")
- @PostMapping("/report/parse-preview")
- public Result<Map<String, Object>> parsePreview(
- @RequestParam("file") MultipartFile file,
- @RequestParam("dimension") String dimension,
- @RequestParam("memberId") Long memberId,
- @RequestAttribute("userId") Long userId) {
- Result<Map<String, Object>> r = danReportUploadService.uploadAndParse(userId, memberId, dimension, file);
- if (r.getCode() == null || r.getCode() != 200 || r.getData() == null) return r;
- // 兼容旧字段名 draftId → uploadId
- Object uploadId = r.getData().get("uploadId");
- r.getData().put("draftId", uploadId);
- return r;
- }
- @Operation(summary = "确认并保存 DAN 报告(Phase 2)— 已迁移到 dan_report_uploads 表")
- @PostMapping("/report/confirm")
- public Result<String> confirmReport(@RequestBody Map<String, Object> body,
- @RequestAttribute("userId") Long userId) {
- Long draftId = body.get("draftId") != null ? Long.valueOf(body.get("draftId").toString()) : null;
- if (draftId == null) {
- return Result.error("draftId 不能为空");
- }
- String childName = (String) body.get("childName");
- String assessmentDateStr = (String) body.get("assessmentDate");
- Result<?> r = danReportUploadService.confirmUpload(draftId, userId, childName, assessmentDateStr);
- if (r.getCode() != null && r.getCode() == 200) {
- return Result.success("报告已确认并保存");
- }
- return Result.error(r.getCode() == null ? 500 : r.getCode(), r.getMessage());
- }
- @Operation(summary = "获取某孩子某维度的 DAN 报告列表")
- @PostMapping("/report/child")
- public Result<List<DanAssessmentResult>> getChildDanReports(@RequestBody Map<String, Object> body) {
- Long memberId = body.get("memberId") != null ? Long.valueOf(body.get("memberId").toString()) : null;
- String dimension = (String) body.get("dimension");
- if (memberId == null || dimension == null) {
- return Result.error("memberId 和 dimension 不能为空");
- }
- List<DanAssessmentResult> list = danAssessmentResultMapper.selectList(
- new com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper<DanAssessmentResult>()
- .eq(DanAssessmentResult::getDimension, dimension)
- .eq(DanAssessmentResult::getDraftStatus, "confirmed")
- .orderByDesc(DanAssessmentResult::getCreatedAt));
- return Result.success(list);
- }
- /**
- * 将 DanParsedReport 序列化为 JSON 字符串
- */
- private String parsedToJson(DanParsedReport parsed) {
- try {
- return new com.fasterxml.jackson.databind.ObjectMapper().writeValueAsString(parsed);
- } catch (Exception e) {
- // fallback: 手动构建简单 JSON
- StringBuilder sb = new StringBuilder();
- sb.append("{\"reportType\":\"").append(parsed.getReportType()).append("\",");
- sb.append("\"dimension\":\"").append(parsed.getDimension()).append("\",");
- sb.append("\"items\":[");
- if (parsed.getItems() != null) {
- boolean first = true;
- for (DanReportParseService.DataItem item : parsed.getItems()) {
- if (!first) sb.append(",");
- sb.append("{\"code\":\"").append(item.getCode()).append("\",");
- sb.append("\"name\":\"").append(item.getName()).append("\",");
- sb.append("\"value\":\"").append(item.getValue()).append("\",");
- sb.append("\"category\":\"").append(item.getCategory()).append("\"}");
- first = false;
- }
- }
- sb.append("],");
- sb.append("\"summary\":\"").append(parsed.getSummary() != null ? parsed.getSummary().replace("\"", "\\\"") : "").append("\",");
- sb.append("\"suggestions\":\"").append(parsed.getSuggestions() != null ? parsed.getSuggestions().replace("\"", "\\\"") : "").append("\"}");
- return sb.toString();
- }
- }
- }
|