package com.lyms.talkonlineweb.controller;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.Query;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.lyms.talkonlineweb.annotation.TokenRequired;
import com.lyms.talkonlineweb.domain.*;
import com.lyms.talkonlineweb.result.BaseResponse;
import com.lyms.talkonlineweb.service.*;
import com.lyms.talkonlineweb.util.*;
import lombok.extern.log4j.Log4j2;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.DigestUtils;
import org.springframework.validation.BindingResult;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.text.NumberFormat;
import java.util.*;
/**
* 医生管理
*/
@RestController
@RequestMapping("doctor")
@Log4j2
public class DoctorController {
@Autowired
private LymsDoctorService lymsDoctorService;
@Autowired
private LymsHdepartService lymsHdepartService;
@Autowired
private LymsHospitalService lymsHospitalService;
@Autowired
private LymsDictService lymsDictService;
@Autowired
private LymsLogsCrudService lymsLogsCrudService;
@Autowired
private HXService hxService;
@Autowired
private AppgetdoctorlistInfoService appgetdoctorlistInfoService;
@Autowired
private LymsChatgroupService lymsChatgroupService;
@Autowired
private LymsReturnVisitRecordService lymsReturnVisitRecordService;
@Autowired
private LymsMessageService lymsMessageService;
@Autowired
private LymsUserService lymsUserService;
/**
* 获取医生列表
* @param doctor
* @param current
* @param size
* @return
*/
@GetMapping("sltDoctorLst")
@TokenRequired
public BaseResponse sltDoctorLst(LymsDoctor doctor, int current, int size){
BaseResponse baseResponse=new BaseResponse();
LambdaQueryWrapper<LymsDoctor> queryWrapper = new QueryWrapper().lambda();
if(StringUtil.isNotEmpty(doctor.getDname())){
String dname=doctor.getDname();//解决多条件查询时需要某一个值做非等值查询。需要制空,然后在特殊处理
doctor.setDname(null);
queryWrapper.setEntity(doctor).like(LymsDoctor::getDname, dname);
}else {
queryWrapper.setEntity(doctor);
}
Page<LymsDoctor> page=new Page<>(current,size);
Page<LymsDoctor> doctorPagePage=lymsDoctorService.page(page, queryWrapper.orderByDesc(LymsDoctor::getCreatedtime,LymsDoctor::getUpdatedTime));
conDocCode(doctorPagePage);
baseResponse.setObject(doctorPagePage);
return baseResponse;
}
public void conDocCode(Page<LymsDoctor> doctorPagePage){
Map param=new HashMap();
param.put("vtype",4);
List<LymsDict> dLst=lymsDictService.listByMap(param);
doctorPagePage.getRecords().forEach(d->{
param.clear();
param.put("did",d.getDpid());
List<LymsHdepart> departLst=lymsHdepartService.listByMap(param);
if(departLst.size()>0){
LymsHdepart depart=departLst.get(0);
d.setHname(depart.getHname());
d.setDdname(depart.getDname());
dLst.forEach(dd->{
if(dd.getCode()==d.getLvl()){
d.setLname(dd.getValue());
}
});
}
});
}
/**
* 保存或更新医生信息
* @param doctor
* @return
*/
@PostMapping("saveDoctor")
@TokenRequired
public BaseResponse saveDoctor(@Validated LymsDoctor doctor, BindingResult result){
BaseResponse baseResponse=new BaseResponse();
baseResponse.setErrormsg("");
if(Objects.nonNull(doctor.getDlogin())){
doctor.setDlogin(doctor.getDlogin().toLowerCase());
}
LymsDoctor depart2=new LymsDoctor();
depart2.setDlogin(doctor.getDlogin());
List<LymsDoctor> dLst=lymsDoctorService.list(Wrappers.query(depart2));
//操作记录标识
Integer did=0;
if(doctor.getDid()==null){
if (dLst.size()>0) {
baseResponse.setErrormsg("不能创建重复账号");
baseResponse.setErrorcode(1);
return baseResponse;
}
doctor.setCreatedtime(new Date());
}else{
did=1;
doctor.setUpdatedTime(new Date());
//修改医生状态时。变为就诊医生状态(需要移除聊天群组,因为已经不是值班角色)
if (dLst.size()>0 && null!=doctor.getAdminType() && doctor.getAdminType()==0) {
depart2=dLst.get(0);
//变更前是值班医生/值班护士时,变更环信群组及删除环信群组用户(值班医生/值班护士)
if(depart2.getAdminType()==1 || depart2.getAdminType()==2){
final List<LymsChatgroup> chatgroupList = lymsChatgroupService.list(new QueryWrapper<LymsChatgroup>().lambda()
.ne(LymsChatgroup::getTarget, depart2.getDlogin())
.eq(LymsChatgroup::getHdepartId, depart2.getDpid()));
for (LymsChatgroup lymsChatgroup : chatgroupList) {
JSONObject json = hxService.delUserHxGroup(lymsChatgroup.getHxgroupid(),depart2.getDlogin());
JSONObject jsonObject = json.getJSONObject("data");
if (jsonObject.size() > 0 && (boolean) jsonObject.get("result")) {
//更新到数据库群组中
//群组中的账号
List<String> description = new ArrayList<>(Arrays.asList(lymsChatgroup.getDescription().split(",")));
//群组中的医生姓名
List<String> groupname = new ArrayList<>(Arrays.asList(lymsChatgroup.getGroupname().split(",")));
for (String s : description) {
if(s.equals(depart2.getDlogin())){
description.remove(s);
break;
}
}
for (String s : groupname) {
if(s.equals(depart2.getDname())){
groupname.remove(s);
break;
}
}
lymsChatgroup.setDescription(StringUtils.join(description.toArray(),","));
lymsChatgroup.setGroupname(StringUtils.join(groupname.toArray(),","));
lymsChatgroupService.updateById(lymsChatgroup);
}
}
}
}
}
if(result.hasErrors()){
baseResponse.setErrorcode(1);
result.getAllErrors().forEach(e->{
baseResponse.setErrormsg(baseResponse.getErrormsg()+e.getDefaultMessage());
});
return baseResponse;
}
if(StringUtil.isNotEmpty(doctor.getDpasswd())) {
doctor.setDpasswd(DigestUtils.md5DigestAsHex(doctor.getDpasswd().getBytes()));
}
boolean f=lymsDoctorService.saveOrUpdate(doctor);
lymsLogsCrud(doctor,did);
baseResponse.setErrorcode(f==true?0:1);
return baseResponse;
}
/**
* 删除医生
* @return
*/
@GetMapping("delDoctor")
@TokenRequired
public BaseResponse delDoctor(LymsDoctor doctor){
BaseResponse baseResponse=new BaseResponse();
boolean f=lymsDoctorService.removeById(doctor.getDid());
if (f){
final LymsDoctor lymsDoctor = lymsDoctorService.getById(doctor.getDid());
if (StringUtil.isNotEmpty(lymsDoctor.getHxid())) {
JSONObject rs=hxService.delUser(doctor.getDlogin());
log.info(rs);
}
}
//保存操作记录
lymsLogsCrud(doctor,null);
baseResponse.setErrorcode(f==true?0:1);
return baseResponse;
}
/**
* 医生登录
* @param doctor
* @return
*/
@PostMapping("loginDoctor")
public BaseResponse loginDoctor(@RequestBody LymsDoctor doctor){
BaseResponse baseResponse=new BaseResponse();
if(StringUtil.isNotEmpty(doctor.getDpasswd())){
doctor.setDpasswd(DigestUtils.md5DigestAsHex(doctor.getDpasswd().getBytes()));
}
List<LymsDoctor> dLst=lymsDoctorService.list(Wrappers.query(doctor));
baseResponse.setErrorcode(1);
if (dLst.size()>0) {
doctor=dLst.get(0);
doctor.setDpasswd(null);
baseResponse.setObject(doctor);
String jwt = JwtUtils.createJWT("1", doctor.getDlogin(), Constant.JWT_TTL);
Map<String,Object> map=new HashMap<>();
map.put("doctor",doctor);
map.put("token",jwt);
map.put("hxuser",hxService.getHxuser());
if (StringUtil.isEmpty(doctor.getHxid())) {
lymsDoctorService.addDoctorHxId(doctor);
}
baseResponse.setErrorcode(0);
baseResponse.setObject(map);
}
return baseResponse;
}
@PostMapping("/gzopenid")
public BaseResponse gzopenid(@RequestBody LymsDoctor doctor){
try {
if(StringUtil.isNotEmpty(doctor.getCode())&& null!= doctor.getDid()){
String openid = WeiXinUtil.getWxGzOpenId(doctor.getCode());
if(StringUtil.isNotEmpty(openid)){
doctor.setGzopenid(openid);
//更新到登录患者的gzopenid
lymsDoctorService.updateById(doctor);
String subscribe = WeiXinUtil.getIsWxGZH(openid);
if(StringUtil.isNotEmpty(subscribe)){
return BaseResponse.ok();
}
}
}
} catch (Exception e) {
log.error("医生关注公众号异常",e);
}
return BaseResponse.error("失败");
}
@PostMapping("/openid")
public BaseResponse getWxOpenId(@RequestBody LymsDoctor doctor){
try {
if(StringUtil.isNotEmpty(doctor.getCode())&& null!= doctor.getDid()){
String openid = WeiXinUtil.getWxOpenId(doctor.getCode());
if(StringUtil.isNotEmpty(openid)){
doctor.setOpenid(openid);
//更新到登录患者的gzopenid
lymsDoctorService.updateById(doctor);
return BaseResponse.ok();
}
}
} catch (Exception e) {
log.error("医生小程序获取openid异常",e);
}
return BaseResponse.error("失败");
}
/**
* 统计医生信息
* @return
*/
@GetMapping("statDoctor")
@TokenRequired
public BaseResponse statDoctor(Integer hid,Integer dpid,String dname){
BaseResponse baseResponse=new BaseResponse();
Map<String,Object> stat=lymsDoctorService.statDoctor(hid,dpid,dname);
baseResponse.setObject(stat);
return baseResponse;
}
/**
* 操作记录
* @param doctor
* @param did
*/
public void lymsLogsCrud(LymsDoctor doctor,Integer did){
LymsLogsCrud lymsLogsCrud=new LymsLogsCrud();
if(null!=did){
lymsLogsCrud.setCrudtype(did==1?"编辑医生":"新增医生");
}else {
lymsLogsCrud.setCrudtype("删除医生");
}
lymsLogsCrud.setCreatedbyname(doctor.getCreatedbyname());
lymsLogsCrud.setUpdatedbyname(doctor.getUpdatedbyname());
lymsLogsCrud.setHname(doctor.getHname());
lymsLogsCrud.setHdname(doctor.getDdname());
lymsLogsCrud.setDname(doctor.getDname());
lymsLogsCrud.setCreatdata(new Date());
lymsLogsCrud.setType(2);
lymsLogsCrudService.save(lymsLogsCrud);
}
/**
* 查询单个医生的信息
* @param doctor
* @return
*/
@GetMapping("queryDoctor")
@TokenRequired
public BaseResponse queryDoctor(LymsDoctor doctor){
BaseResponse baseResponse=new BaseResponse();
LymsDoctor doctor2=lymsDoctorService.getOne(Wrappers.query(doctor));
LymsHdepart hdepart=lymsHdepartService.getById(doctor2.getDpid());
doctor2.setDdname(hdepart.getDname());
doctor2.setHname(hdepart.getHname());
Map param=new HashMap();
param.put("vtype",4);
param.put("code",doctor2.getLvl());
List<LymsDict> dLst=lymsDictService.listByMap(param);
if (dLst.size()>0){
doctor2.setLname(dLst.get(0).getValue());
}
baseResponse.setObject(doctor2);
return baseResponse;
}
/**
* 小程序用户端-根据医院id获取医生信息
* @param hid
* @param current
* @param size
* @return
*/
@GetMapping("appGetDoctorList")
@TokenRequired
public BaseResponse appGetDoctorList(AppgetdoctorlistInfo appgetdoctorlistInfo, int current, int size){
BaseResponse baseResponse=new BaseResponse();
LambdaQueryWrapper<AppgetdoctorlistInfo> queryWrapper = new QueryWrapper().lambda();
if(StringUtil.isNotEmpty(appgetdoctorlistInfo.getSearchinfo())){
String searchinfo=appgetdoctorlistInfo.getSearchinfo();//解决多条件查询时需要某一个值做非等值查询。需要制空,然后在特殊处理
appgetdoctorlistInfo.setSearchinfo(null);
queryWrapper.setEntity(appgetdoctorlistInfo).like(AppgetdoctorlistInfo::getDname, searchinfo)
.or().like(AppgetdoctorlistInfo::getDpname, searchinfo)
.or().like(AppgetdoctorlistInfo::getLvlname, searchinfo);
}else {
queryWrapper.setEntity(appgetdoctorlistInfo);
}
queryWrapper.orderByDesc(AppgetdoctorlistInfo::getCreatedtime);
Page<AppgetdoctorlistInfo> page=new Page<>(current,size);
Page<AppgetdoctorlistInfo> appgetdoctorlistInfoPage=appgetdoctorlistInfoService.page(page,queryWrapper);
baseResponse.setObject(appgetdoctorlistInfoPage);
return baseResponse;
}
/**
* 医生密码重置
* @param doctor
* @return
*/
@PostMapping("updateDoctorPassword")
@TokenRequired
public BaseResponse updateDoctorPassword(@RequestBody LymsDoctor doctor){
BaseResponse baseResponse=new BaseResponse();
doctor.setDpasswd(DigestUtils.md5DigestAsHex(Constant.COMMON_PASSWD.getBytes()));
boolean f=lymsDoctorService.updateById(doctor);
baseResponse.setErrorcode(f==true?0:1);
baseResponse.setErrormsg(f==true?"成功":"失败");
return baseResponse;
}
/**
* 查询科室值班医生
* @param groupId 群组ID
* @return
*/
@GetMapping("getAdminDoctor")
@TokenRequired
public BaseResponse getAdminDoctor(String groupId){
BaseResponse baseResponse=new BaseResponse();
List<LymsDoctor> doctorAminList= new ArrayList<>();
try {
final LymsChatgroup chatgroup = lymsChatgroupService.getOne(new QueryWrapper<LymsChatgroup>()
.lambda().eq(LymsChatgroup::getHxgroupid, groupId));
if(null!=chatgroup) {
if (StringUtil.isNotEmpty(chatgroup.getDescription())) {
List<String> list = Arrays.asList(chatgroup.getDescription().split(","));
if(CollectionUtils.isNotEmpty(list)){
for (int i=1;i<list.size();i++) {
final LymsDoctor lymsDoctor = lymsDoctorService.getOne(new QueryWrapper<LymsDoctor>()
.lambda().eq(LymsDoctor::getDlogin, list.get(i)));
if(null!=lymsDoctor){
doctorAminList.add(lymsDoctor);
}
}
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
baseResponse.setObject(doctorAminList);
baseResponse.setErrormsg("成功");
return baseResponse;
}
/**
* 小程序回访统计,按医生
* @param
* @return
*/
@GetMapping("getReturnVisit")
@TokenRequired
public BaseResponse getReturnVisit(Integer hid,Integer dpid,String dlogin,String startTime,String endTime){
BaseResponse baseResponse=new BaseResponse();
try {
List<Map<String,Object>> result = new ArrayList<>();
LambdaQueryWrapper<LymsDoctor> wrapper = new QueryWrapper().lambda();
if(null!=hid){
wrapper.eq(LymsDoctor::getHid,hid);
}
if(null!=dpid){
wrapper.eq(LymsDoctor::getDpid,dpid);
}
if(StringUtil.isNotEmpty(dlogin)){
wrapper.eq(LymsDoctor::getDlogin,dlogin);
}
List<LymsDoctor> list = lymsDoctorService.list(wrapper);
for (LymsDoctor lymsDoctor : list) {
Map<String, Object> visitRateMap = getReturn(lymsDoctor.getDlogin(), startTime, endTime);
LymsHdepart hdepart = lymsHdepartService.getById(lymsDoctor.getDpid());
visitRateMap.put("hid", lymsDoctor.getHid());
visitRateMap.put("hname", hdepart.getHname());
visitRateMap.put("dpid", lymsDoctor.getDpid());
visitRateMap.put("ddname", hdepart.getDname());
visitRateMap.put("dname", lymsDoctor.getDname());
result.add(visitRateMap);
}
baseResponse.setObject(result);
baseResponse.setErrorcode(0);
baseResponse.setErrormsg("成功");
} catch (Exception e) {
baseResponse.setErrorcode(1);
e.printStackTrace();
}
return baseResponse;
}
public Map<String,Object> getReturn(String dlogin,String startTime,String endTime) throws Exception{
//总回访数
int visitCount=0;
//有效回访数
int visitRateCount=0;
LambdaQueryWrapper<LymsReturnVisitRecord> wrapper = new QueryWrapper().lambda();
wrapper.eq(LymsReturnVisitRecord::getDlogin, dlogin);
if(StringUtil.isNotEmpty(startTime) && StringUtil.isNotEmpty(endTime)){
wrapper.ge(LymsReturnVisitRecord::getCreatedtime,DateUtil.getYyyyMmDdHhMmSs(DateUtil.getDayFirstSecond(DateUtil.parseYMD(startTime))));
wrapper.le(LymsReturnVisitRecord::getCreatedtime, DateUtil.getYyyyMmDdHhMmSs(DateUtil.getDayLastSecond(DateUtil.parseYMD(endTime))));
}
wrapper.groupBy(LymsReturnVisitRecord::getHxgroupid);
final List<LymsReturnVisitRecord> visitRecordHxgroupid = lymsReturnVisitRecordService.list(wrapper);
for (LymsReturnVisitRecord visitRecord : visitRecordHxgroupid) {
final List<LymsReturnVisitRecord> visitRecords = lymsReturnVisitRecordService.list(new QueryWrapper<LymsReturnVisitRecord>()
.lambda().eq(LymsReturnVisitRecord::getDlogin, dlogin)
.eq(LymsReturnVisitRecord::getHxgroupid,visitRecord.getHxgroupid())
.orderByAsc(LymsReturnVisitRecord::getCreatedtime));
visitCount+=visitRecords.size();
for(int i=0;i<visitRecords.size();i++){
if (i+1==visitRecords.size()) {
final int messageCount = lymsMessageService.count(new QueryWrapper<LymsMessage>()
.lambda().eq(LymsMessage::getTargetid,visitRecord.getHxgroupid())
.eq(LymsMessage::getType,0)
.ge(LymsMessage::getSendtime, visitRecords.get(i).getCreatedtime()));
if (messageCount!=0) {
visitRateCount++;
}
}else {
final int messageCount = lymsMessageService.count(new QueryWrapper<LymsMessage>()
.lambda().eq(LymsMessage::getTargetid,visitRecord.getHxgroupid())
.eq(LymsMessage::getType,0)
.ge(LymsMessage::getSendtime, visitRecords.get(i).getCreatedtime())
.le(LymsMessage::getSendtime,visitRecords.get(i+1).getCreatedtime()));
if (messageCount!=0) {
visitRateCount++;
}
}
}
}
String visitRate="0";
if (visitCount!=0) {
// 创建一个数值格式化对象
NumberFormat numberFormat = NumberFormat.getInstance();
// 设置精确到小数点后2位
numberFormat.setMaximumFractionDigits(2);
visitRate = numberFormat.format((float)visitRateCount/(float)visitCount*100);
}
Map<String,Object> map=new HashMap<>();
map.put("visitCount",visitCount);
map.put("visitRate",visitRate);
return map;
}
/**
* 值班医生/值班护士 添加到现有群组中
* @param doctor
* @return
*/
@PostMapping("addOnDutyDoctor")
@TokenRequired
public BaseResponse addOnDutyDoctor(@RequestBody LymsDoctor doctor){
BaseResponse baseResponse=new BaseResponse();
try {
final List<LymsChatgroup> chatgroupList = lymsChatgroupService.list(new QueryWrapper<LymsChatgroup>().lambda()
.eq(LymsChatgroup::getHdepartId, doctor.getDpid()));
for (LymsChatgroup lymsChatgroup : chatgroupList) {
final List<String> descriptionList = Arrays.asList(lymsChatgroup.getDescription().split(","));
if (!descriptionList.contains(doctor.getDlogin())) {
//注册环信
if (StringUtil.isEmpty(doctor.getHxid())) {
lymsDoctorService.addDoctorHxId(doctor);
}
//添加到环信群组中
JSONObject json = hxService.addUserHxGroup(lymsChatgroup.getHxgroupid(), doctor.getDlogin());
JSONObject jsonObject = json.getJSONObject("data");
if (jsonObject.size() > 0 && (boolean) jsonObject.get("result")) {
//更新到数据库群组中
lymsChatgroup.setDescription(lymsChatgroup.getDescription() + "," + doctor.getDlogin());
lymsChatgroup.setGroupname(lymsChatgroup.getGroupname() + "," + doctor.getDname());
lymsChatgroupService.updateById(lymsChatgroup);
}
}
}
baseResponse.setErrormsg("成功");
} catch (Exception e) {
e.printStackTrace();
baseResponse.setErrorcode(1);
baseResponse.setErrormsg("失败");
}
return baseResponse;
}
/**
* 根据登录用户获取本医院所有医生列表
* @return
*/
@GetMapping("/getHomeAllDoctor")
@TokenRequired
public BaseResponse getLocalHosptialAllDoctor(@RequestHeader String authorization){
LymsUser curUser= lymsUserService.getUserByToken(authorization);
Integer hid = curUser.getHid();
QueryWrapper<LymsDoctor> query = new QueryWrapper();
query.eq("hid",hid);
List<LymsDoctor> list = lymsDoctorService.list(query);
return BaseResponse.ok(list);
}
/**
* 根据登录用户获取本医院所有医生列表
* @return
*/
@GetMapping("/currentUser")
@TokenRequired
public BaseResponse getCurrentUserDoctor(@RequestHeader String authorization){
LymsUser curUser= lymsUserService.getUserByToken(authorization);
Integer did = curUser.getDoctorId();
LymsDoctor lymsDoctor = lymsDoctorService.getById(did);
return BaseResponse.ok(lymsDoctor);
}
/**
* 根据登录用户获取本医院所有医生列表 小程序
* @return
*/
@GetMapping("/getDoctorList")
public BaseResponse getDoctorList(Integer hid,Integer dpid,String dname){
QueryWrapper<LymsDoctor> query = new QueryWrapper();
query.eq("hid",hid);
if (dpid!=null){
query.eq("dpid",dpid);
}
if (StringUtil.isNotEmpty(dname)){
query.like("dname",dname);
}
List<LymsDoctor> list =lymsDoctorService.list(query);
return BaseResponse.ok(list);
}
}