Browse Source

新增建议接口和用户查询接口

chenweida 8 năm trước cách đây
mục cha
commit
6975e4c0c1

+ 1 - 0
patient-co-figure/src/main/java/com/yihu/figure/config/SwaggerConfig.java

@ -41,6 +41,7 @@ public class SwaggerConfig extends WebMvcConfigurerAdapter {
                .select()
                .paths(or(
                        regex("/suggest/.*"),
                        regex("/portrait/.*"),
                        regex("/patient/.*"),
                        regex("/disease/.*"),
                        regex("/health/.*")

+ 0 - 1
patient-co-figure/src/main/java/com/yihu/figure/controller/SuggestController.java

@ -1,6 +1,5 @@
package com.yihu.figure.controller;
import com.yihu.figure.model.PatientInfo;
import com.yihu.figure.model.suggest.Suggest;
import com.yihu.figure.service.SuggestService;
import io.swagger.annotations.Api;

+ 7 - 4
patient-co-figure/src/main/java/com/yihu/figure/controller/PatientController.java

@ -1,9 +1,9 @@
package com.yihu.figure.controller;
package com.yihu.figure.controller.patient;
import com.yihu.figure.model.PatientInfo;
import com.yihu.figure.controller.BaseController;
import com.yihu.figure.model.patient.PatientInfo;
import com.yihu.figure.service.PatientInfoService;
import com.yihu.figure.util.DateUtil;
import com.yihu.figure.util.IdCardUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
@ -21,7 +21,7 @@ import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping(value = "/patient", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
@Api(description = "患者信息")
public class PatientController extends BaseController{
public class PatientController extends BaseController {
    @Autowired
    private PatientInfoService patientInfoService;
@ -43,4 +43,7 @@ public class PatientController extends BaseController{
            return invalidUserException(e, -1, "启动失败:" + e.getMessage());
        }
    }
}

+ 150 - 0
patient-co-figure/src/main/java/com/yihu/figure/controller/patient/PortraitController.java

@ -0,0 +1,150 @@
package com.yihu.figure.controller.patient;
import com.yihu.figure.controller.BaseController;
import com.yihu.figure.model.patient.portrait.UserPortrait;
import com.yihu.figure.service.PortraitService;
import com.yihu.figure.util.DateUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.json.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
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 java.math.BigDecimal;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
 * Created by chenweida on 2017/3/8.
 * 用户标签
 */
@RestController
@RequestMapping(value = "/portrait", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
@Api(description = "用户标签")
public class PortraitController extends BaseController {
    @Autowired
    private PortraitService portraitService;
    @ApiOperation(value = " 生成用户标签")
    @RequestMapping(value = "newPortrait", method = RequestMethod.POST)
    public String newPortrait(
            @ApiParam(name = "category", value = "标签父类", required = true) @RequestParam(value = "category", required = true) String category,
            @ApiParam(name = "subCategory", value = "标签子类", required = true) @RequestParam(value = "subCategory", required = true) String subCategory,
            @ApiParam(name = "value", value = "标签值", required = false) @RequestParam(value = "value", required = false) String value) {
        try {
            portraitService.newPortrait(category, subCategory);
            return success("成功");
        } catch (Exception e) {
            error(e);
            return invalidUserException(e, -1, "启动失败:" + e.getMessage());
        }
    }
    @ApiOperation(value = "获取疾病-所在区域")
    @RequestMapping(value = "getPortraits1002001", method = RequestMethod.GET)
    public String getPortraits1002001(
            @ApiParam(name = "value", value = "疾病名称(糖尿病,高血压)", required = true) @RequestParam(value = "value", required = true) String value) {
        try {
            Map<String, Integer> data = portraitService.getPortraits("1001005", value);
            Map<String, String> returnData = new HashMap<>();
            for (Map.Entry<String, Integer> one : data.entrySet()) {
                if (!one.getKey().equals("allSize")) {
                    returnData.put(one.getKey(), round(one.getValue(), data.get("allSize"), 2) + "");
                }
            }
            return write(200, "获取成功!", "data", returnData);
        } catch (Exception e) {
            error(e);
            return invalidUserException(e, -1, "启动失败:" + e.getMessage());
        }
    }
    @ApiOperation(value = "获取疾病-所在年龄")
    @RequestMapping(value = "getPortraits1002003", method = RequestMethod.GET)
    public String getPortraits1002003(
            @ApiParam(name = "value", value = "疾病名称(糖尿病,高血压)", required = true) @RequestParam(value = "value", required = true) String value) {
        try {
            Map<String, Integer> data = portraitService.getPortraits("1001003", value);
            Map<String, String> returnData = new HashMap<>();
            for (Map.Entry<String, Integer> one : data.entrySet()) {
                if (!one.getKey().equals("allSize")) {
                    returnData.put(one.getKey(), round(one.getValue(), data.get("allSize"), 2) + "");
                }
            }
            return write(200, "获取成功!", "data", returnData);
        } catch (Exception e) {
            error(e);
            return invalidUserException(e, -1, "启动失败:" + e.getMessage());
        }
    }
    @ApiOperation(value = "获取疾病-所在性别")
    @RequestMapping(value = "getPortraits1001001", method = RequestMethod.GET)
    public String getPortraits1001001(
            @ApiParam(name = "value", value = "疾病名称(糖尿病,高血压)", required = true) @RequestParam(value = "value", required = true) String value) {
        try {
            Map<String, Integer> data = portraitService.getPortraits("1001001", value);
            Map<String, String> returnData = new HashMap<>();
            for (Map.Entry<String, Integer> one : data.entrySet()) {
                if (!one.getKey().equals("allSize")) {
                    returnData.put(one.getKey(), round(one.getValue(), data.get("allSize"), 2) + "");
                }
            }
            return write(200, "获取成功!", "data", returnData);
        } catch (Exception e) {
            error(e);
            return invalidUserException(e, -1, "启动失败:" + e.getMessage());
        }
    }
    @ApiOperation(value = "获取一级的标签信息")
    @RequestMapping(value = "getPortraitsLevel1", method = RequestMethod.GET)
    public String getPortraitsLevel1(
            @ApiParam(name = "key", value = "1 疾病 2 健康分布", required = true) @RequestParam(value = "key", required = true) String key) {
        try {
            Map<String, Integer> data = portraitService.getPortraitsLevel1(key);
            JSONObject return1 = new JSONObject();
            for (Map.Entry<String, Integer> one : data.entrySet()) {
                if (!one.getKey().equals("allSize")) {
                    JSONObject return2 = new JSONObject();
                    return2.put("count", one.getValue());
                    return2.put("scale ", round(one.getValue(), data.get("allSize"), 2) + "");
                    return1.put(one.getKey(), return2);
                }
            }
            return write(200, "获取成功!", "data", return1);
        } catch (Exception e) {
            error(e);
            return invalidUserException(e, -1, "启动失败:" + e.getMessage());
        }
    }
    public static double round(Integer up, Integer down, int scale) {
        try {
            if (scale < 0) {
                throw new IllegalArgumentException(
                        "The scale must be a positive integer or zero");
            }
            BigDecimal upB = new BigDecimal(up);
            BigDecimal downB = new BigDecimal(down);
            return upB.divide(downB, scale, BigDecimal.ROUND_HALF_UP).doubleValue();
        } catch (Exception e) {
            return 0;
        }
    }
}

+ 7 - 2
patient-co-figure/src/main/java/com/yihu/figure/dao/PatientInfoDao.java

@ -1,13 +1,18 @@
package com.yihu.figure.dao;
package com.yihu.figure.dao.patient;
import com.yihu.figure.model.PatientInfo;
import com.yihu.figure.model.patient.PatientInfo;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.PagingAndSortingRepository;
import java.util.List;
/**
 * Created by yeshijie on 2017/3/6.
 */
public interface PatientInfoDao extends PagingAndSortingRepository<PatientInfo, Long> {
    @Query("from PatientInfo p where p.code=?1 ")
    PatientInfo findByCode(String patientCode);
    @Query("from PatientInfo p ")
    List<PatientInfo> findAllPatient();
}

+ 6 - 4
patient-co-figure/src/main/java/com/yihu/figure/dao/UserPortraitDao.java

@ -1,7 +1,6 @@
package com.yihu.figure.dao;
package com.yihu.figure.dao.patient.portrait;
import com.yihu.figure.model.UserPortrait;
import com.yihu.figure.model.suggest.Suggest;
import com.yihu.figure.model.patient.portrait.UserPortrait;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.PagingAndSortingRepository;
@ -12,6 +11,9 @@ import java.util.List;
 * Created by chenweida on 2017/3/7.
 */
public interface UserPortraitDao extends PagingAndSortingRepository<UserPortrait, Long>, JpaSpecificationExecutor<UserPortrait> {
   @Query("from UserPortrait u where u.userCode=?1 ")
   @Query(" from UserPortrait u where u.userCode=?1  ")
    List<UserPortrait> findByPatientCode(String patientCode);
    @Query(" from UserPortrait u where u.subCategory=?1  ")
    List<UserPortrait> findBySubCategory(String key);
}

+ 23 - 1
patient-co-figure/src/main/java/com/yihu/figure/model/PatientInfo.java

@ -1,6 +1,8 @@
package com.yihu.figure.model;
package com.yihu.figure.model.patient;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.yihu.figure.model.IdEntity;
import com.yihu.figure.model.patient.portrait.UserPortrait;
import com.yihu.figure.model.suggest.Suggest;
import javax.persistence.Entity;
@ -37,6 +39,26 @@ public class PatientInfo extends IdEntity implements Serializable{
    private String address;
    // 更新時間
    private Date createTime;
    //区代码
    private String town;
    //区名称
    private String townName;
    public String getTown() {
        return town;
    }
    public void setTown(String town) {
        this.town = town;
    }
    public String getTownName() {
        return townName;
    }
    public void setTownName(String townName) {
        this.townName = townName;
    }
    //标签列表
    private List<UserPortrait> userPortraits;

+ 4 - 2
patient-co-figure/src/main/java/com/yihu/figure/model/UserPortrait.java

@ -1,4 +1,6 @@
package com.yihu.figure.model;
package com.yihu.figure.model.patient.portrait;
import com.yihu.figure.model.IdEntity;
import javax.persistence.Entity;
import javax.persistence.Table;
@ -9,7 +11,7 @@ import java.util.Date;
 */
@Entity
@Table(name = "figure_user_portrait")
public class UserPortrait extends IdEntity{
public class UserPortrait extends IdEntity {
    private String userCode;//用户code
    private String category;//标签类别

+ 4 - 4
patient-co-figure/src/main/java/com/yihu/figure/service/PatientInfoService.java

@ -1,10 +1,10 @@
package com.yihu.figure.service;
import com.yihu.figure.dao.PatientInfoDao;
import com.yihu.figure.dao.patient.PatientInfoDao;
import com.yihu.figure.dao.SuggestDao;
import com.yihu.figure.dao.UserPortraitDao;
import com.yihu.figure.model.PatientInfo;
import com.yihu.figure.model.UserPortrait;
import com.yihu.figure.dao.patient.portrait.UserPortraitDao;
import com.yihu.figure.model.patient.PatientInfo;
import com.yihu.figure.model.patient.portrait.UserPortrait;
import com.yihu.figure.model.suggest.Suggest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

+ 188 - 0
patient-co-figure/src/main/java/com/yihu/figure/service/PortraitService.java

@ -0,0 +1,188 @@
package com.yihu.figure.service;
import com.yihu.figure.dao.patient.PatientInfoDao;
import com.yihu.figure.dao.patient.portrait.UserPortraitDao;
import com.yihu.figure.model.disease.Visit;
import com.yihu.figure.model.patient.PatientInfo;
import com.yihu.figure.model.patient.portrait.UserPortrait;
import com.yihu.figure.util.DateUtil;
import com.yihu.figure.util.IdCardUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;
import java.util.*;
/**
 * Created by chenweida on 2017/3/8.
 */
@Service
public class PortraitService {
    @Autowired
    private UserPortraitDao userPortraitDao;
    @Autowired
    private JdbcTemplate jdbcTemplate;
    @Autowired
    private PatientInfoDao patientDao;
    public List<UserPortrait> getPatientInfo(String category, String subCategory, String value) {
        StringBuffer sql = new StringBuffer("select * from figure_user_portrait f where 1=1");
        List params = new ArrayList<>();
        if (!StringUtils.isEmpty(category)) {
            sql.append(" and f.category = ? ");
            params.add(category);
        }
        if (!StringUtils.isEmpty(subCategory)) {
            sql.append(" and f.sub_category = ? ");
            params.add(subCategory);
        }
        if (!StringUtils.isEmpty(value)) {
            sql.append(" and f.value like ? ");
            params.add("%" + value + "%");
        }
        List<UserPortrait> userPortraits = jdbcTemplate.query(sql.toString(), params.toArray(), new BeanPropertyRowMapper(UserPortrait.class));
        return userPortraits;
    }
    @Transactional
    public void newPortrait(String category, String subCategory) {
        List<PatientInfo> patient = patientDao.findAllPatient();
        List<UserPortrait> ups = new ArrayList<>();
        patient.stream().forEach(p -> {
            UserPortrait u = new UserPortrait();
            u.setCategory(category);
            u.setSubCategory(subCategory);
            u.setCzrq(new Date());
            u.setUserCode(p.getCode());
            //年龄
            //ups.add(age(DateUtil.getAgeByBirthday(p.getBirthday()),u));
            //市
            //ups.add(city("厦门市",u));
            //区
            //ups.add(town(p.getTownName(),u));
            //性别标签
            //ups.add(sex(p.getSex(),u));
            //疾病标签
            // ups.add(jibing(p,u));
            //健康分布
            ups.add(jkfb(p, u));
        });
        userPortraitDao.save(ups);
    }
    private UserPortrait jkfb(PatientInfo p, UserPortrait u) {
        Integer age = DateUtil.getAgeByBirthday(p.getBirthday());
        if (age > 25)
            u.setValue("患病人群");
        return u;
    }
    private UserPortrait jibing(PatientInfo p, UserPortrait u) {
        Integer age = DateUtil.getAgeByBirthday(p.getBirthday());
        if (age > 25)
            u.setValue("糖尿病");
        return u;
    }
    private UserPortrait city(String townName, UserPortrait u) {
        u.setValue(townName);
        return u;
    }
    private UserPortrait sex(Integer sex, UserPortrait u) {
        if (sex != null && sex == 2) {
            u.setValue("女");
        } else {
            u.setValue("男");
        }
        return u;
    }
    private UserPortrait town(String townName, UserPortrait u) {
        u.setValue(townName);
        return u;
    }
    private UserPortrait age(int age, UserPortrait u) {
        if (age <= 20) {
            u.setValue("20岁以下");
        } else if (age > 20 && age <= 40) {
            u.setValue("20-40岁");
        } else if (age > 40 && age <= 65) {
            u.setValue("40-65岁");
        } else {
            u.setValue("65岁以上");
        }
        return u;
    }
    /**
     * 根据疾病获取病人区域分布
     *
     * @param subcategory 二级指标的维度
     * @param value       疾病名称 糖尿病 高血压
     * @return
     */
    public Map<String, Integer> getPortraits(String subcategory, String value) {
        //查找除子类别是1002001中的其他类别 例如 查找高血压下的各个年龄段的患者
        String sql = " select * from " +
                " (select DISTINCT(u.user_code) user_code from figure_user_portrait u where u.sub_category='1002001' and u.`value` like ? ) jb," +
                " (select DISTINCT(u.user_code) user_code,u.`value` from figure_user_portrait u where u.sub_category= ?  ) q " +
                " where jb.user_code=q.user_code ";
        List params = new ArrayList<>();
        params.add("%" + value + "%");
        params.add(subcategory);
        List<UserPortrait> userPortraits = jdbcTemplate.query(sql, params.toArray(), new BeanPropertyRowMapper(UserPortrait.class));
        Map<String, Integer> data = new HashMap<>();
        userPortraits.stream().forEach(u -> {
            Integer sum = 1;
            if (data.containsKey(u.getValue())) {
                sum = data.get(u.getValue()) + 1;
            }
            data.put(u.getValue(), sum);
        });
        //总数 用于控制层计算
        data.put("allSize", userPortraits.size());
        return data;
    }
    /**
     * @param key 1 疾病 2 健康分布
     * @return
     */
    public Map<String, Integer> getPortraitsLevel1(String key) {
        //找出对应的子类别代码
        String subCategory = getSubCategory(key);
        //根据子类别找出所有的用户标签
        List<UserPortrait> ups = userPortraitDao.findBySubCategory(subCategory);
        Map<String, Integer> returnMap = new HashMap<>();
        ups.stream().forEach(up -> {
            Integer sum = 1;
            if (returnMap.containsKey(up.getValue())) {
                sum = returnMap.get(up.getValue()) + 1;
            }
            returnMap.put(up.getValue(), sum);
        });
        //总数 用于控制层计算
        returnMap.put("allSize", ups.size());
        return returnMap;
    }
    private String getSubCategory(String key) {
        switch (key) {
            case "1": {
                return "1002001";
            }
            case "2": {
                return "1002006";
            }
        }
        return "";
    }
}

+ 2 - 2
patient-co-figure/src/main/java/com/yihu/figure/service/SuggestService.java

@ -1,8 +1,8 @@
package com.yihu.figure.service;
import com.yihu.figure.dao.SuggestDao;
import com.yihu.figure.dao.UserPortraitDao;
import com.yihu.figure.model.UserPortrait;
import com.yihu.figure.dao.patient.portrait.UserPortraitDao;
import com.yihu.figure.model.patient.portrait.UserPortrait;
import com.yihu.figure.model.suggest.Suggest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;