package com.lyms.talkonlineweb.controller;
import com.alibaba.fastjson.JSON;
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.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.constants.ErrorCodeConstants;
import com.lyms.talkonlineweb.domain.*;
import com.lyms.talkonlineweb.result.BaseResponse;
import com.lyms.talkonlineweb.service.*;
import com.lyms.talkonlineweb.util.Constant;
import com.lyms.talkonlineweb.util.DateUtil;
import com.lyms.talkonlineweb.util.HXService;
import com.lyms.talkonlineweb.util.StringUtil;
import lombok.extern.log4j.Log4j2;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.nio.charset.Charset;
import java.util.*;
@RestController
@RequestMapping("chat")
@Log4j2
public class ChatGroupController {
@Autowired
private LymsChatgroupService lymsChatgroupService;
@Autowired
private LymsMessageService lymsMessageService;
@Autowired
private PatientInfoService patientInfoService;
@Autowired
private LymsDoctorService lymsDoctorService;
@Autowired
private LymsHdepartService lymsHdepartService;
@Autowired
private LymsDictService lymsDictService;
@Autowired
private HXService hxService;
@Autowired
private LymsTcardService lymsTcardService;
@Autowired
private LymsPatientService lymsPatientService;
@Autowired
private LymsTkrecordService lymsTkrecordService;
@Autowired
private AppgetdoctorlistInfoService appgetdoctorlistInfoService;
/**
* 添加或删除聊天组
*
* @param group
* @return
*/
@PostMapping("saveChatGroup")
@TokenRequired
public BaseResponse saveChatGroup(@RequestBody LymsChatgroup group) {
BaseResponse baseResponse = new BaseResponse();
List<LymsChatgroup> gLst = lymsChatgroupService.list(Wrappers.query(group).orderByDesc("id"));
if (group.getOwnerk() == null) {
group.setOwnerk("test");
}
if (gLst.size() > 0) {
LymsChatgroup group2 = gLst.get(0);
group = group2;
} else {
LymsPatient patient= lymsPatientService.getOne(new QueryWrapper<LymsPatient>()
.lambda().eq(LymsPatient::getIdno, group.getFromp()));
LymsDoctor doctor= lymsDoctorService.getOne(new QueryWrapper<LymsDoctor>()
.lambda().eq(LymsDoctor::getDlogin, group.getTarget()));
List<String> adminDlogins=new ArrayList<>();
adminDlogins.add(group.getFromp());
List<String> groupnames=new ArrayList<>();
groupnames.add(patient.getPname());
//患者注册环信
if (StringUtil.isEmpty(patient.getHxid())) {
JSONObject json = hxService.addUser(patient.getIdno(), Constant.COMMON_PASSWD, patient.getPname());
JSONArray rArr = json.getJSONArray("entities");
if (rArr.size() > 0) {
patient.setHxid(rArr.getJSONObject(0).getString("uuid"));
lymsPatientService.updateById(patient);
}
}
//查询值班医生
List<LymsDoctor> doctorAminList= lymsDoctorService.list(new QueryWrapper<LymsDoctor>()
.lambda().eq(LymsDoctor::getDpid, doctor.getDpid())
.in(LymsDoctor::getAdminType, new int[]{1,2}));
//科室值班医生注册环信
for (LymsDoctor lymsDoctor : doctorAminList) {
if(StringUtil.isEmpty(lymsDoctor.getHxid())) {
JSONObject json = hxService.addUser(lymsDoctor.getDlogin(), Constant.COMMON_PASSWD, lymsDoctor.getDname());
JSONArray rArr = json.getJSONArray("entities");
if (rArr.size() > 0) {
lymsDoctor.setHxid(rArr.getJSONObject(0).getString("uuid"));
lymsDoctorService.updateById(lymsDoctor);
}
}
adminDlogins.add(lymsDoctor.getDlogin());
groupnames.add(lymsDoctor.getDname());
}
if ( ! adminDlogins.contains(doctor.getDlogin())) {
//医生注册环信
if (StringUtil.isEmpty(doctor.getHxid())) {
JSONObject json = hxService.addUser(doctor.getDlogin(), Constant.COMMON_PASSWD, doctor.getDname());
JSONArray rArr = json.getJSONArray("entities");
if (rArr.size() > 0) {
doctor.setHxid(rArr.getJSONObject(0).getString("uuid"));
lymsDoctorService.updateById(doctor);
adminDlogins.add(doctor.getDlogin());
groupnames.add(doctor.getDname());
}
}
}
log.info("创建环信组:{} description:{}", group.getOwnerk(), StringUtils.join(adminDlogins.toArray(), ","));
JSONObject rJson = hxService.addChatGroups(StringUtils.join(adminDlogins.toArray(), ","), group.getOwnerk(), (String[]) adminDlogins.toArray());
log.info("rJson:" + rJson);
group.setHxgroupid(rJson.getJSONObject("data").getString("groupid"));
group.setDescription(StringUtils.join(adminDlogins.toArray(), ","));
//环信群组名称更改为姓名串-用于PC端问诊展示
group.setGroupname(StringUtils.join(groupnames.toArray(), ","));
group.setCtime(new Date());
lymsChatgroupService.saveOrUpdate(group);
}
baseResponse.setObject(group);
return baseResponse;
}
/**
* 保存消息记录
*
* @param message
* @return
*/
@PostMapping("saveMsg")
@TokenRequired
public BaseResponse saveMsg(@RequestBody LymsMessage message) {
BaseResponse baseResponse = new BaseResponse();
message.setSendtime(new Date());
boolean f = lymsMessageService.saveOrUpdate(message);
baseResponse.setErrorcode(f == true ? 0 : 1);
return baseResponse;
}
/**
* 根据群组ID获取患者和医生信息
* @param chatgroup
* @return
*/
@GetMapping("getPatDoc")
@TokenRequired
public BaseResponse getPatDoc(LymsChatgroup chatgroup) {
log.info(">>>>>>>>>>chatgroup:" + chatgroup);
BaseResponse baseResponse = new BaseResponse();
Map<String, Object> rs = new HashMap<>();
//不作为条件查询
Integer type=chatgroup.getType();
chatgroup.setType(null);
// chatgroup = lymsChatgroupService.getOne(Wrappers.query(chatgroup));
List<LymsChatgroup> gLst = lymsChatgroupService.list(Wrappers.query(chatgroup).orderByDesc("id"));
if (gLst.size()>0){
chatgroup = gLst.get(0);
}
LymsDoctor doctor = new LymsDoctor();
doctor = lymsDoctorService.getOne(Wrappers.query(doctor).eq("dlogin", chatgroup.getTarget()));
LymsPatient patient = new LymsPatient();
patient.setIdno(chatgroup.getFromp());
List<LymsPatient> pLst = lymsPatientService.list(Wrappers.query(patient));
conDocCode(doctor);
List<Map<String, Object>> tmpList = lymsChatgroupService.getPinfoBySesson(null, doctor.getDid().toString(), chatgroup.getHxgroupid());
if (tmpList.size() > 0) {
if(null==type) {
rs.put("sess", tmpList.get(0));
}else {
//修改为恢复聊天状态
LymsTkrecord tkrecord=new LymsTkrecord();
tkrecord.setId((Integer) tmpList.get(0).get("rid"));
tkrecord.setStat(0);
lymsTkrecordService.updateById(tkrecord);
tmpList.get(0).put("stat", 0);
rs.put("sess", tmpList.get(0));
}
}else {
//防止重复创建组
if(null!=type && 1==type && CollectionUtils.isNotEmpty(gLst)){
Map<String, Object> map=new HashMap<>();
map.put("stat", 0);
rs.put("sess", tmpList.add(map));
}
}
rs.put("doctor", doctor);
rs.put("patient", pLst);
baseResponse.setObject(rs);
return baseResponse;
}
public void conDocCode(LymsDoctor d) {
Map param = new HashMap();
param.put("vtype", 4);
List<LymsDict> dLst = lymsDictService.listByMap(param);
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 froms 发送人员ID
* @param did 问诊医生ID
* @param groupid 群组ID
* @return
*/
@PostMapping("getPinfoBySession")
@TokenRequired
public BaseResponse getPinfoBySesson(String froms, String did, String groupid) {
BaseResponse baseResponse = new BaseResponse();
List<Map<String, Object>> psList = new ArrayList<>();
List<Map<String, Object>> tmpList = lymsChatgroupService.getPinfoBySesson(null, did, groupid);
if (tmpList.size() > 0) {
psList.add(tmpList.get(0));
}
baseResponse.setObject(psList);
return baseResponse;
}
/**
* 根据环信传入的会话,获取用户信息
* @param request
* @param type 医生回访停止回话用
* @return
*/
@PostMapping("getSessionListInfo")
@TokenRequired
public BaseResponse getSessionListInfo(HttpServletRequest request) {
BaseResponse baseResponse = new BaseResponse();
log.info(">>>>>>>>> getSessionListInfo 根据环信传入的会话,获取用户信息");
JSONArray rs=new JSONArray();
try {
request.setCharacterEncoding("utf-8");
String res=IOUtils.toString(request.getInputStream(),Charset.forName("UTF-8"));
log.info(res);
JSONObject jsonObject= JSON.parseObject(res);
JSONArray channel_infos=jsonObject.getJSONArray("channel_infos");
if(channel_infos.size()>0){
for (int i = 0; i < channel_infos.size(); i++) {
JSONObject row=channel_infos.getJSONObject(i);
if(row.getJSONObject("meta").size()>0){
JSONObject payload=row.getJSONObject("meta").getJSONObject("payload");
System.out.println(payload);
payload.put("unread_num",row.get("unread_num"));
String to=payload.getString("to");
LymsTkrecord tkrecord=new LymsTkrecord();
tkrecord.setHxgroupid(to);
List<LymsTkrecord> rLst=lymsTkrecordService.list(Wrappers.query(tkrecord));
payload.put("stat",0);
if(rLst.size()>0){
payload.put("stat",rLst.get(0).getStat());
}
LymsChatgroup chatgroup=new LymsChatgroup();
chatgroup.setHxgroupid(to);
List<LymsChatgroup> cLst=lymsChatgroupService.list(Wrappers.query(chatgroup));
if(cLst.size()>0){
chatgroup=cLst.get(0);
Map<String,Object> param=new HashMap<>();
param.put("idno",chatgroup.getFromp());
List<LymsPatient> pLst=lymsPatientService.listByMap(param);
if(pLst.size()>0){
payload.put("pat",pLst.get(0));
}
param.clear();
param.put("dlogin",chatgroup.getTarget());
List<AppgetdoctorlistInfo> dLst=appgetdoctorlistInfoService.listByMap(param);
if(dLst.size()>0){
payload.put("doc",dLst.get(0));
}
if(CollectionUtils.isEmpty(rLst)){
if (1==cLst.get(0).getType()) {
payload.put("stat",cLst.get(0).getStat());
}
}
}
payload.put("timestamp",row.getJSONObject("meta").get("timestamp"));
rs.add(payload);
}
}
}
} catch (IOException e) {
e.printStackTrace();
}
baseResponse.setObject(rs);
return baseResponse;
}
/**
* 获取专家组\客服人员信息
* @param request
* @return
*/
@GetMapping("getPreMsg")
@TokenRequired
public BaseResponse getPreMsg(HttpServletRequest request){
BaseResponse baseResponse =new BaseResponse();
Map<String,Object> param=new HashMap<>();
param.put("vtype",998);
List<LymsDict> dLst=lymsDictService.listByMap(param);
if(dLst.size()>0){
baseResponse.setObject(dLst.get(0));
}
return baseResponse;
}
/**
* 医生端获取自己的患者列表
* @param doctorId
* @param current 页数
* @param size 条数
* @param synthesisQuery 综合筛选条件
* @param adminType 0:普通医生 1:科室管理员(用于问诊聊天)
* @return
*/
@GetMapping("getDoctorPatient")
@TokenRequired
public BaseResponse getDoctorPatient(Integer doctorId,Integer current, Integer size,String synthesisQuery,
Integer did){
BaseResponse baseResponse =new BaseResponse();
if((null==doctorId && null==did)||(null!=doctorId && null!=did)){
baseResponse.setErrorcode(ErrorCodeConstants.PARAMETER_ERROR);
baseResponse.setErrormsg("参数错误");
return baseResponse;
}
Page<Map<String,Object>> page=new Page<>(current,size);
QueryWrapper queryWrapper=new QueryWrapper<>();
if(null!=did){
//科室下的患者
queryWrapper.eq("did", did);
}else {
//医生下的患者
queryWrapper.eq("dtid", doctorId);
}
if (StringUtil.isNotEmpty(synthesisQuery)){
queryWrapper.like("pname", synthesisQuery);
}
List<Map<String,Object>> list=lymsChatgroupService.getDoctorPatient(page,queryWrapper);
for (Map<String, Object> map : list) {
if(map.get("sex")!=null) {
map.put("sex",(int)map.get("sex")==1?"男":"女");
}
if(map.get("birth")!=null){
map.put("birth", DateUtil.getAge(DateUtil.parseYMD(map.get("birth").toString())));
}
}
page.setRecords(list);
baseResponse.setObject(page);
return baseResponse;
}
/**
* 前端3秒执行一次调用。聊天室状态(患者、医生分别查询)
* @param request
* @return
*/
@GetMapping("getChatStat")
@TokenRequired
public BaseResponse getChatStat(Integer groupId){
BaseResponse baseResponse =new BaseResponse();
try {
final LymsChatgroup chatgroup = lymsChatgroupService.getOne(new QueryWrapper<LymsChatgroup>()
.lambda().eq(LymsChatgroup::getHxgroupid, groupId));
final LymsTkrecord tkrecord = lymsTkrecordService.getOne(new QueryWrapper<LymsTkrecord>()
.lambda().eq(LymsTkrecord::getHxgroupid, groupId));
Map<String,Object> map= new LinkedHashMap<>();
map.put("groupStat",null==chatgroup?"":chatgroup.getStat());
map.put("tkrecordStat",null==tkrecord?"":tkrecord.getStat());
baseResponse.setObject(map);
} catch (Exception e) {
e.printStackTrace();
}
return baseResponse;
}
}