ReportController.java 12.5 KB
package com.xkl.controller;

import com.wordnik.swagger.annotations.ApiImplicitParam;
import com.wordnik.swagger.annotations.ApiImplicitParams;
import com.wordnik.swagger.annotations.ApiOperation;
import com.xkl.authorization.annotation.Authorization;
import com.xkl.authorization.annotation.CurrentUser;
import com.xkl.authorization.annotation.LogAnnotation;
import com.xkl.authorization.annotation.Sign;
import com.xkl.config.Constants;
import com.xkl.config.ResultStatus;
import com.xkl.domain.*;
import com.xkl.model.*;
import com.xkl.repository.XklAmpReportDetailRespository;
import com.xkl.repository.XklAmpReportHealthScoreRespository;
import com.xkl.repository.XklAmpReportRespository;
import com.xkl.security.AntiXSS;
import com.xkl.service.IScoreService;
import com.xkl.tools.HtmlTools;
import com.xkl.tools.UtilTools;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;
import java.util.*;

/**
 * Created by win7 on 2016/11/20.
 */
@RestController
@RequestMapping("/report")
public class ReportController {
    @Autowired
    private XklAmpReportRespository xklAmpReportRespository;
    @Autowired
    private XklAmpReportDetailRespository xklAmpReportDetailRespository;
    @Autowired
    private XklAmpReportHealthScoreRespository xklAmpReportHealthScoreRespository;

    @Autowired
    private IScoreService scoreService;

    @LogAnnotation
    @AntiXSS
    @Authorization
    @Sign
    @RequestMapping(value="/list",method = RequestMethod.GET)
    @ApiOperation(value = "体检报告列表查询接口")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "authorization", value = "请输入登录返回信息:userId_tokens", required = true, dataType = "string", paramType = "header"),
    })
    public ResponseEntity<ResultModel> getReportList(HttpServletRequest request, @CurrentUser User user,
                                                   @RequestParam String sign, @RequestParam long t, @RequestParam int type) {
        if(!(boolean)request.getAttribute("signAspect"))
            return new ResponseEntity<>(ResultModel.error(ResultStatus.SIGN_ERROR), HttpStatus.OK);

        long member_id=user.getMemberId();
        List<XklAmpReportEntity> xklAmpReportEntity=xklAmpReportRespository.findByMemberIdAndStatus(member_id,1);
        return new ResponseEntity<>(ResultModel.ok(xklAmpReportEntity), HttpStatus.OK);
    }

    @LogAnnotation
    @AntiXSS
    @Authorization
    @Sign
    @RequestMapping(value="/detail",method = RequestMethod.GET)
    @ApiOperation(value = "体检报告详情查询接口")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "authorization", value = "请输入登录返回信息:userId_tokens", required = true, dataType = "string", paramType = "header"),
    })
    public ResponseEntity<ResultModel> getReportDetail(HttpServletRequest request, @CurrentUser User user,@RequestParam long report_id,
                                                       @RequestParam String sign, @RequestParam long t, @RequestParam int type) {
        if(!(boolean)request.getAttribute("signAspect"))
            return new ResponseEntity<>(ResultModel.error(ResultStatus.SIGN_ERROR), HttpStatus.OK);

        XklAmpReportEntity report=xklAmpReportRespository.findOne(report_id);
        List<ReportDetailModel> reportDetailModelList = new ArrayList<>();
        if(report != null ){
            if(report.getScore()==0){//首次调用接口,score为0
                //TODO:可以在上传时直接打分?
                scoreService.getScore(report_id);
            }
            List<XklAmpReportDetailEntity> reportDetailEntityList=xklAmpReportDetailRespository.findAllByReportId(report_id);
            for(XklAmpReportDetailEntity detail:reportDetailEntityList){
                int itemId=detail.getItemId();
                ReportDetailModel reportDetail = new ReportDetailModel();
                reportDetail.setItemId(itemId);
                reportDetail.setItemValue(detail.getItemValue());
                reportDetail.setStatus(detail.getStatus());

                XklAmpReportMetaItemsEntity metaItems=Constants.itemMetaMap.get(itemId);
                if(metaItems!=null){
                    reportDetail.setTitle(metaItems.getTitle());
                    if(report.getSex()==Constants.MALE){
                        reportDetail.setNormalRange(metaItems.getStandardLowMale()+" - "+metaItems.getStandardHighMale());
                    }else{
                        reportDetail.setNormalRange(metaItems.getStandardLowFemale()+ " - "+metaItems.getStandardHighFemale());
                    }
                    reportDetail.setType(metaItems.getType());
                }

                XklAmpReportHealthScoreEntity scoreEntity = xklAmpReportHealthScoreRespository.findByReportIdAndType(report_id,metaItems.getType());
                if(scoreEntity!=null)
                    reportDetail.setTypeHealthScore(scoreEntity.getTypeHealthScore());
                reportDetailModelList.add(reportDetail);
            }
        }
        ReportModel reportModel = new ReportModel(report,reportDetailModelList);
        return new ResponseEntity<>(ResultModel.ok(reportModel), HttpStatus.OK);
    }

    @LogAnnotation
    @AntiXSS
    @Sign
    @RequestMapping(value="/score",method = RequestMethod.GET)
    @ApiOperation(value = "健康评分接口")
    public ResponseEntity<ResultModel> getReportScore(HttpServletRequest request,@RequestParam long report_id,
                                                     @RequestParam String sign, @RequestParam long t, @RequestParam int type) {
        if(!(boolean)request.getAttribute("signAspect"))
            return new ResponseEntity<>(ResultModel.error(ResultStatus.SIGN_ERROR), HttpStatus.OK);
        double score = 0;
        XklAmpReportEntity report=xklAmpReportRespository.findOne(report_id);
        if(report != null ){
            if(report.getScore()==0){//首次调用接口,score为0
                //TODO:可以在上传时直接打分?
                //单独测试需要删除xkl_amp_report_health_scroe表中数据
                score = scoreService.getScore(report_id);
            }else{
                score = report.getScore();
            }
        }
        return new ResponseEntity<>(ResultModel.ok(score), HttpStatus.OK);
    }

    @LogAnnotation
    @AntiXSS
    @Authorization
    @Sign
    @RequestMapping(value="/itemInfo",method = RequestMethod.GET)
    @ApiOperation(value = "指标解释查询接口")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "authorization", value = "请输入登录返回信息:userId_tokens", required = true, dataType = "string", paramType = "header"),
    })
    public ResponseEntity<ResultModel> getReportItemInfo(HttpServletRequest request, @CurrentUser User user,@RequestParam int itemId,@RequestParam int status,@RequestParam boolean isPureHtml,
                                                      @RequestParam String sign, @RequestParam long t, @RequestParam int type) {
        if(!(boolean)request.getAttribute("signAspect"))
            return new ResponseEntity<>(ResultModel.error(ResultStatus.SIGN_ERROR), HttpStatus.OK);

        XklAmpReportMetaItemsEntity metaItems = Constants.itemMetaMap.get(itemId);
        String result="";
        if(metaItems!= null){
            //0, normal,1, lower,2, higher
            if(status == Constants.NORMAL){
                result = metaItems.getExplainNormal();
            }else if(status == Constants.LOWER){
                result = metaItems.getExplainLow();
            }else if(status == Constants.HIGHER){
                result = metaItems.getExplainHigh();
            }else{
                result = "没有此status相关信息";
            }
        }else{
            result = "没有此itemId相关信息";
        }
        if(isPureHtml){
            result = HtmlTools.stripHtml(result);
        }
        return new ResponseEntity<>(ResultModel.ok(result), HttpStatus.OK);
    }

    @LogAnnotation
    @AntiXSS
    @Authorization
    @Sign
    @RequestMapping(value="/itemGraph",method = RequestMethod.GET)
    @ApiOperation(value = "指标曲线查询接口")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "authorization", value = "请输入登录返回信息:userId_tokens", required = true, dataType = "string", paramType = "header"),
    })
    public ResponseEntity<ResultModel> getReportItemGraph(HttpServletRequest request, @CurrentUser User user,@RequestParam int itemId,@RequestParam String stime,@RequestParam String etime,
                                                         @RequestParam String sign, @RequestParam long t, @RequestParam int type) {
        if(!(boolean)request.getAttribute("signAspect"))
            return new ResponseEntity<>(ResultModel.error(ResultStatus.SIGN_ERROR), HttpStatus.OK);

        long member_id=user.getMemberId();
        List<XklAmpReportEntity> xklAmpReportEntity=xklAmpReportRespository.findByMemberIdAndStatus(member_id,1);
        List<ReportItemGraphModel> reportItemGraphModelList =new ArrayList<>();

        if(xklAmpReportEntity!=null && xklAmpReportEntity.size()>0){
            for(XklAmpReportEntity report:xklAmpReportEntity){
                long reportTime= report.getUptime().getTime();
                long stimeLong= UtilTools.getLongTime(stime);
                long etimeLong= UtilTools.getLongTime(etime);
                long reportId= report.getId();
                if(reportTime>=stimeLong&&reportTime<=etimeLong){//在时间范围内
                    XklAmpReportDetailEntity reportDetail = xklAmpReportDetailRespository.findByReportIdAndItemId(reportId,itemId);
                    if(reportDetail!=null){
                        ReportItemGraphModel reportItemGraphModel= new ReportItemGraphModel(reportTime,reportDetail.getItemValue());
                        reportItemGraphModelList.add(reportItemGraphModel);
                    }
                }
            }
        }
        return new ResponseEntity<>(ResultModel.ok(reportItemGraphModelList), HttpStatus.OK);
    }

    @LogAnnotation
    @AntiXSS
    @Authorization
    @Sign
    @RequestMapping(value="/compare",method = RequestMethod.POST)
    @ApiOperation(value = "微信端体检报告分年龄比较接口")
    public ResponseEntity<ResultModel> openIdCompare(HttpServletRequest request, @CurrentUser User user,@RequestParam Long report_id,
                                                     @RequestParam String sign, @RequestParam long t, @RequestParam int type) {
        if(!(boolean)request.getAttribute("signAspect"))
            return new ResponseEntity<>(ResultModel.error(ResultStatus.SIGN_ERROR), HttpStatus.OK);
        List<CompareModel> result = new ArrayList<>();

        XklAmpReportEntity report=xklAmpReportRespository.findOne(report_id);
        double score = 0;
        if(report != null ) {
            if (report.getScore() == 0) {//首次调用接口,score为0
                score = scoreService.getScore(report_id);
            } else {
                score = report.getScore();
            }
            int age = report.getAge();
            String ageId = String.valueOf((age - age % 5) / 5);
            for (Map.Entry<Integer, XklAmpReportCategoryEntity> entry : Constants.weightedScoreMap.entrySet()) {
                //List<XklAmpReportHealthScoreEntity> scoreEntity = xklAmpReportHealthScoreRespository.findByReportIdAndType(report_id);
                int typeId = entry.getKey();
                XklAmpReportCategoryEntity value = entry.getValue();
                String key = ageId +"-"+ typeId;
                double aveScore = Constants.aveScoreMap.get(key);
                double typeScore = 0;
                XklAmpReportHealthScoreEntity scoreEntity = xklAmpReportHealthScoreRespository.findByReportIdAndType(report_id, typeId);
                if (scoreEntity != null) {
                    typeScore = scoreEntity.getTypeHealthScore();
                }else{
                    if(typeId==1){//第一项为测试项目
                        typeScore = score;
                    }
                }
                CompareModel cm = new CompareModel(typeId, value.getName(), typeScore, aveScore);
                result.add(cm);
            }
        }
        return new ResponseEntity<>(ResultModel.ok(result), HttpStatus.OK);
    }

}