Przeglądaj źródła

Merge branch 'dev' of http://192.168.1.220:10080/Amoy2/wlyy2.0 into dev

wangzhinan 3 lat temu
rodzic
commit
67e9ccaf9f
45 zmienionych plików z 2140 dodań i 489 usunięć
  1. 79 0
      business/im-service/src/main/java/com/yihu/jw/im/service/ImService.java
  2. 14 0
      common/common-entity/sql记录
  3. 1 2
      common/common-entity/src/main/java/com/yihu/jw/entity/care/assistance/EmergencyAssistanceDO.java
  4. 89 0
      common/common-entity/src/main/java/com/yihu/jw/entity/care/device/DeviceDataPushLog.java
  5. 1 1
      common/common-entity/src/main/java/com/yihu/jw/entity/care/lifeCare/LifeCareOrderDO.java
  6. 7 3
      common/common-entity/src/main/java/com/yihu/jw/entity/door/BaseAdminServiceDynamic.java
  7. 19 2
      common/common-rest-model/src/main/java/com/yihu/jw/restmodel/web/endpoint/EnvelopRestEndpoint.java
  8. 1 1
      svr/svr-cloud-care/src/main/java/com/yihu/jw/care/dao/lifeCare/BaseAdminServiceDynamicDao.java
  9. 6 32
      svr/svr-cloud-care/src/main/java/com/yihu/jw/care/endpoint/admin/AdminDoorCoachOrderController.java
  10. 2 4
      svr/svr-cloud-care/src/main/java/com/yihu/jw/care/endpoint/assistance/EmergencyAssistanceEndpoint.java
  11. 5 3
      svr/svr-cloud-care/src/main/java/com/yihu/jw/care/endpoint/consult/PatientConsultEndpoint.java
  12. 2 0
      svr/svr-cloud-care/src/main/java/com/yihu/jw/care/endpoint/family/FamilyMemberEndpoint.java
  13. 1 1
      svr/svr-cloud-care/src/main/java/com/yihu/jw/care/endpoint/lifeCare/DoctorLifeCareEndpoint.java
  14. 1 1
      svr/svr-cloud-care/src/main/java/com/yihu/jw/care/endpoint/lifeCare/PadLifeCareEndpoint.java
  15. 1 1
      svr/svr-cloud-care/src/main/java/com/yihu/jw/care/endpoint/lifeCare/PatientLifeCareEndpoint.java
  16. 5 3
      svr/svr-cloud-care/src/main/java/com/yihu/jw/care/endpoint/message/PatientMessageEndpoint.java
  17. 19 1
      svr/svr-cloud-care/src/main/java/com/yihu/jw/care/endpoint/patient/PatientEndpoint.java
  18. 1 1
      svr/svr-cloud-care/src/main/java/com/yihu/jw/care/endpoint/third/assistance/EmeAsEndpoint.java
  19. 1578 5
      svr/svr-cloud-care/src/main/java/com/yihu/jw/care/service/admin/AdminDoorCoachOrderService.java
  20. 18 11
      svr/svr-cloud-care/src/main/java/com/yihu/jw/care/service/assistance/EmergencyAssistanceService.java
  21. 2 4
      svr/svr-cloud-care/src/main/java/com/yihu/jw/care/service/consult/ConsultService.java
  22. 21 7
      svr/svr-cloud-care/src/main/java/com/yihu/jw/care/service/consult/ConsultTeamService.java
  23. 2 0
      svr/svr-cloud-care/src/main/java/com/yihu/jw/care/service/device/PatientDeviceService.java
  24. 1 1
      svr/svr-cloud-care/src/main/java/com/yihu/jw/care/service/device/YunXunDeviceService.java
  25. 3 3
      svr/svr-cloud-care/src/main/java/com/yihu/jw/care/service/doorCoach/DoctorDoorCoachOrderService.java
  26. 1 1
      svr/svr-cloud-care/src/main/java/com/yihu/jw/care/service/doorCoach/PatientDoorCoachOrderService.java
  27. 7 0
      svr/svr-cloud-care/src/main/java/com/yihu/jw/care/service/family/PatientFamilyMemberService.java
  28. 13 7
      svr/svr-cloud-care/src/main/java/com/yihu/jw/care/service/lifeCare/LifeCareOrderService.java
  29. 13 5
      svr/svr-cloud-care/src/main/java/com/yihu/jw/care/service/message/PatientMessageService.java
  30. 26 2
      svr/svr-cloud-care/src/main/java/com/yihu/jw/care/service/patient/CarePatientService.java
  31. 2 4
      svr/svr-cloud-care/src/main/java/com/yihu/jw/care/service/security/SecurityMonitoringOrderService.java
  32. 12 0
      svr/svr-cloud-device/src/main/java/com/yihu/jw/care/dao/device/DeviceDataPushLogDao.java
  33. 18 14
      svr/svr-cloud-device/src/main/java/com/yihu/jw/care/endpoint/DeviceController.java
  34. 5 2
      svr/svr-cloud-device/src/main/java/com/yihu/jw/care/endpoint/DeviceUploadController.java
  35. 1 0
      svr/svr-cloud-device/src/main/java/com/yihu/jw/care/endpoint/HvDeviceController.java
  36. 0 84
      svr/svr-cloud-device/src/main/java/com/yihu/jw/care/endpoint/SocketClientTest.java
  37. 0 103
      svr/svr-cloud-device/src/main/java/com/yihu/jw/care/endpoint/SocketServerTest.java
  38. 0 151
      svr/svr-cloud-device/src/main/java/com/yihu/jw/care/endpoint/WebSocketServer.java
  39. 0 25
      svr/svr-cloud-device/src/main/java/com/yihu/jw/care/endpoint/YunXinIotController.java
  40. 9 2
      svr/svr-cloud-device/src/main/java/com/yihu/jw/care/service/DeviceUploadService.java
  41. 10 1
      svr/svr-cloud-device/src/main/java/com/yihu/jw/care/service/HvDeviceService.java
  42. 8 0
      svr/svr-cloud-device/src/main/java/com/yihu/jw/care/service/YsDeviceService.java
  43. 52 0
      svr/svr-cloud-device/src/main/java/com/yihu/jw/care/util/DeviceDataPushLogUtil.java
  44. 83 0
      svr/svr-cloud-device/src/main/java/com/yihu/jw/care/util/OneNetUtil.java
  45. 1 1
      svr/svr-cloud-job/src/main/java/com/yihu/jw/care/job/device/YunXunDeviceService.java

+ 79 - 0
business/im-service/src/main/java/com/yihu/jw/im/service/ImService.java

@ -454,6 +454,85 @@ public class ImService {
	}
	/**
	 * 居民咨询发消息(追问接口)
	 * @param consult 咨询标识-咨询CODE
	 * @param content 消息内容
	 * @param type 消息类型
	 * @param times 次数
	 * @param patientcode 发送的居民CODE
	 * @param wechat_appid 微信公众号appid
	 * @return
	 */
	public List<String> append(String consult, String content, Integer type, Integer times,String patientcode,String wechat_appid,String agent) throws Exception {
		List<ConsultTeamLogDo> logs = new ArrayList<ConsultTeamLogDo>();
		ConsultTeamDo consultModel = consultTeamDao.findByConsult(consult);
		if (consultModel == null) {
			throw new Exception("咨询记录不存在!");
		}
		try {
			if (wxId.equalsIgnoreCase("xm_ykyy_wx")){
				prescriptionService.wxTempalteJPush("consult_remind_doctor",null,consultModel,content,"","","");
			}
		}catch (Exception e){
			e.printStackTrace();
		}
		if (consultModel.getEndMsgId() != null) {
			throw new Exception("咨询已结束!");
		}
		String[] arr = null;
		if (type == 3) {//语音文件处理
			ConsultTeamLogDo log = new ConsultTeamLogDo();
			log.setConsult(consult);
			log.setContent(content);
			log.setDel("1");
			log.setChatType(type);
			log.setType(type);
			logs.add(log);
		} else if (type == 2) {
//			// 图片消息
			String[] images = content.split(",");
			for (String image : images) {
				ConsultTeamLogDo log = new ConsultTeamLogDo();
				log.setConsult(consult);
				log.setContent(image);
				log.setDel("1");
				log.setChatType(type);
				log.setType(type);
				logs.add(log);
			}
		} else {
			ConsultTeamLogDo log = new ConsultTeamLogDo();
			log.setConsult(consult);
			log.setContent(content);
			log.setDel("1");
			log.setChatType(type);
			log.setType(type);
			logs.add(log);
			arr = new String[]{content};
		}
//            Patient patient = patientDao.findByCode(getUID());
		BasePatientDO patient = basePatientDao.findById(patientcode);
		int i = 0;
		List<String> failed = new ArrayList<>();
		for (ConsultTeamLogDo log : logs) {
			String response = imUtil.sendTopicIM(patientcode, patient.getName(), consult, String.valueOf(log.getType()), log.getContent(),agent,patient.getName(),Integer.parseInt(IdCardUtil.getSexForIdcard_new(patient.getIdcard())), IdCardUtil.getAgeForIdcard(patient.getIdcard()));
			if (org.apache.commons.lang3.StringUtils.isNotEmpty(response)) {
				JSONObject resObj = JSON.parseObject(response);
				if (resObj.getInteger("status")  == -1) {
					throw new Exception("追问失败!" + resObj.getString("message"));
				}
				failed.add(String.valueOf(resObj.get("data")));
			}
		}
		return failed;
	}
	/**
	 * 居民咨询发消息(追问接口)
	 * @param consult 咨询标识-咨询CODE

+ 14 - 0
common/common-entity/sql记录

@ -1417,3 +1417,17 @@ CREATE TABLE `wlyy_patient_safe_area` (
  `success_flag` tinyint(4) DEFAULT NULL COMMENT '是否同步至设备 -1失败 1成功',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COMMENT='患者设备安全区域';
--2021-09-02
CREATE TABLE `device_data_push_log` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `patient` varchar(50) DEFAULT NULL,
  `patient_name` varchar(50) DEFAULT NULL,
  `device_sn` varchar(50) DEFAULT NULL,
  `device_name` varchar(50) DEFAULT NULL,
  `device_category` varchar(50) DEFAULT NULL,
  `api_name` varchar(50) DEFAULT NULL,
  `data` varchar(1000) DEFAULT NULL,
  `create_time` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=449 DEFAULT CHARSET=utf8mb4 COMMENT='设备项目推送数据日志';

+ 1 - 2
common/common-entity/src/main/java/com/yihu/jw/entity/care/assistance/EmergencyAssistanceDO.java

@ -2,7 +2,6 @@ package com.yihu.jw.entity.care.assistance;
import com.yihu.jw.entity.UuidIdentityEntityWithOperator;
import com.yihu.jw.entity.care.securitymonitoring.EmergencyWarnConclusionDO;
import netscape.javascript.JSObject;
import javax.persistence.Entity;
import javax.persistence.Table;
@ -66,7 +65,7 @@ public class EmergencyAssistanceDO extends UuidIdentityEntityWithOperator {
    private Integer status;
    private Date completeTime;//完成时间
    private String teamCode;
    private Integer type; //发起类型(1本人发起 2家人待预约 3医生代预约)
    private Integer type; //发起类型(1本人发起 2家人待预约 3医生代预约 4家属代预约)
    private Integer orderSource;//工单发起来源状态 1APP 2手环 3居家报警,4拐杖发起
    private Integer emergencyCancel;// 紧急预警工单误报警原因 字典emergency_cancel
    private String deviceSn;//设备sn  设备触发是才有该字段值

+ 89 - 0
common/common-entity/src/main/java/com/yihu/jw/entity/care/device/DeviceDataPushLog.java

@ -0,0 +1,89 @@
package com.yihu.jw.entity.care.device;
import com.yihu.jw.entity.IdEntity;
import javax.persistence.Entity;
import javax.persistence.Table;
import java.util.Date;
/**
 * Created by Bing on 2021/9/2.
 */
@Entity
@Table(name="device_data_push_log")
public class DeviceDataPushLog extends IdEntity {
    private String patient;
    private String patientName;
    private String deviceSn;
    private String deviceName;
    private String deviceCategory;
    private String apiName;
    private String data;//上传数据
    private Date createTime;
    public String getPatient() {
        return patient;
    }
    public void setPatient(String patient) {
        this.patient = patient;
    }
    public String getPatientName() {
        return patientName;
    }
    public void setPatientName(String patientName) {
        this.patientName = patientName;
    }
    public String getDeviceSn() {
        return deviceSn;
    }
    public void setDeviceSn(String deviceSn) {
        this.deviceSn = deviceSn;
    }
    public String getDeviceName() {
        return deviceName;
    }
    public void setDeviceName(String deviceName) {
        this.deviceName = deviceName;
    }
    public String getDeviceCategory() {
        return deviceCategory;
    }
    public void setDeviceCategory(String deviceCategory) {
        this.deviceCategory = deviceCategory;
    }
    public String getApiName() {
        return apiName;
    }
    public void setApiName(String apiName) {
        this.apiName = apiName;
    }
    public String getData() {
        return data;
    }
    public void setData(String data) {
        this.data = data;
    }
    public Date getCreateTime() {
        return createTime;
    }
    public void setCreateTime(Date createTime) {
        this.createTime = createTime;
    }
}

+ 1 - 1
common/common-entity/src/main/java/com/yihu/jw/entity/care/lifeCare/LifeCareOrderDO.java

@ -296,7 +296,7 @@ public class LifeCareOrderDO extends UuidIdentityEntityWithOperator {
     */
    private String hospital;
    private String hospitalName;
    private Integer type;//发起工单类型(1本人发起 2家人待预约 3医生代预约)
    private Integer type;//发起工单类型(1本人发起 2家人待预约 3医生代预约 4家属预约)
    private String relationCode;//业务关联
    /**
     * 医生签到时间

+ 7 - 3
common/common-entity/src/main/java/com/yihu/jw/entity/door/BaseAdminServiceDynamic.java

@ -7,11 +7,14 @@ package com.yihu.jw.entity.door;
 * @Date: 2021/8/31 15:24
 */
import com.fasterxml.jackson.annotation.JsonFormat;
import com.yihu.jw.entity.iot.gateway.IdEntity;
import javax.persistence.Entity;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import java.util.Date;
@Entity
@Table(name = "base_admin_service_dynamic")
@SequenceGenerator(name="id_generated", sequenceName="base_admin_service_dynamic")
@ -22,7 +25,7 @@ public class BaseAdminServiceDynamic extends IdEntity {
    private Integer type;  //1上门辅导   2生活照料
    private String number;
    private String value;
    private String createTime;
    private Date createTime;
    private String doctor;
    private String doctorName;
@ -66,11 +69,12 @@ public class BaseAdminServiceDynamic extends IdEntity {
        this.value = value;
    }
    public String getCreateTime() {
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+08:00")
    public Date getCreateTime() {
        return createTime;
    }
    public void setCreateTime(String createTime) {
    public void setCreateTime(Date createTime) {
        this.createTime = createTime;
    }

+ 19 - 2
common/common-rest-model/src/main/java/com/yihu/jw/restmodel/web/endpoint/EnvelopRestEndpoint.java

@ -9,7 +9,6 @@ import com.yihu.jw.restmodel.exception.dao.BaseExceptionDictDao;
import com.yihu.jw.restmodel.web.*;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataAccessException;
import org.springframework.util.StringUtils;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
@ -19,7 +18,6 @@ import javax.servlet.http.HttpServletResponse;
import java.beans.PropertyDescriptor;
import java.io.IOException;
import java.lang.reflect.Method;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.*;
@ -483,6 +481,25 @@ public abstract class EnvelopRestEndpoint extends Exception {
        }
    }
    /**
     * 获取代理人的code
     * 老人亲属
     * @return
     */
    public String getAgentUID() {
        try {
            HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
            String userAgent = request.getHeader("userAgent");
            if (StringUtils.isEmpty(userAgent)) {
                userAgent = request.getHeader("User-Agent");
            }
            JSONObject json = JSON.parseObject(userAgent);
            return json.getString("agent");
        } catch (Exception e) {
            return null;
        }
    }
    public String getUNAME(){
        try {
            HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();

+ 1 - 1
svr/svr-cloud-care/src/main/java/com/yihu/jw/care/dao/lifeCare/BaseAdminServiceDynamicDao.java

@ -11,5 +11,5 @@ import org.springframework.data.repository.PagingAndSortingRepository;
 * @Auther: shi kejing
 * @Date: 2021/8/31 15:28
 */
public interface BaseAdminServiceDynamicDao extends PagingAndSortingRepository<BaseAdminServiceDynamic, String>, JpaSpecificationExecutor<BaseAdminServiceDynamic> {
public interface BaseAdminServiceDynamicDao extends PagingAndSortingRepository<BaseAdminServiceDynamic, Long>, JpaSpecificationExecutor<BaseAdminServiceDynamic> {
}

+ 6 - 32
svr/svr-cloud-care/src/main/java/com/yihu/jw/care/endpoint/admin/AdminDoorCoachOrderController.java

@ -39,8 +39,6 @@ import java.util.Map;
@Api(description = "管理员调度大屏")
public class AdminDoorCoachOrderController extends EnvelopRestEndpoint {
    @Autowired
    private PatientDoorCoachOrderService patientDoorCoachOrderService;
    @Autowired
    private DoctorDoorCoachOrderService doctorDoorCoachOrderService;
    @Autowired
@ -49,7 +47,7 @@ public class AdminDoorCoachOrderController extends EnvelopRestEndpoint {
    private ConsultTeamService consultTeamService;
    private BaseController baseController = new BaseController();
    @Autowired
    private AdminDoorCoachOrderService adminDoorCoachOrderService;
    private AdminDoorCoachOrderService patientDoorCoachOrderService;
    @GetMapping(value = "getServiceDynamic")
    @ApiOperation(value = "管理员调度实时动态")
@ -57,7 +55,7 @@ public class AdminDoorCoachOrderController extends EnvelopRestEndpoint {
            @ApiParam(name = "page", value = "分页大小", required = true) @RequestParam(value = "page") int page,
            @ApiParam(name = "size", value = "页码", required = true) @RequestParam(value = "size") int size) {
        try{
            return baseController.write(200,"查询成功","data",adminDoorCoachOrderService.getServiceDynamic(page,size));
            return baseController.write(200,"查询成功","data",patientDoorCoachOrderService.getServiceDynamic(page,size));
        }catch (Exception e){
            return baseController.errorResult(e);
        }
@ -386,30 +384,6 @@ public class AdminDoorCoachOrderController extends EnvelopRestEndpoint {
            @ApiParam(value = "每页数目", name = "pageSize",defaultValue = "10",required = true)
            @RequestParam(value = "pageSize", required = true) Integer pageSize) {
        try {
            if(StringUtils.isEmpty(isManage)){
                isManage = baseController.getCurrentRoleIsManange();
            }
            if("0".equals(isManage)){
                if(StringUtils.isEmpty(doctorCode)){
                    doctorCode=getUID();
                }
            }else if ("1".equals(isManage) && StringUtils.isBlank(hospitalCode)){
                //如果是管理员并且未筛选机构,就默认展示其管理下所有机构
                String level = baseController.getCurrentRoleLevel();
                String currentRoleCode = baseController.getCurrentRoleCode();
                if(level.equals("2")) {
                    //市管理员
                    hospitalCode = currentRoleCode.substring(0, currentRoleCode.length() - 2) + "%";
                }else if(level.equals("3")){
                    //区管理员
                    hospitalCode = currentRoleCode + "%";
                }else if (level.equals("4")){
                    //机构管理员
                    hospitalCode = currentRoleCode;
                }
            }else if(StringUtils.isNotBlank(hospitalCode) && hospitalCode.length() < 10 ){
                hospitalCode += "%";
            }
            StringBuffer ss = new StringBuffer();
            if (status != null && status.length > 0){
                int statusLength = status.length;
@ -422,8 +396,8 @@ public class AdminDoorCoachOrderController extends EnvelopRestEndpoint {
            }else {
                ss = null;
            }
            JSONObject result = doctorDoorCoachOrderService.getDoorOrderList(orderId,patientName,patientPhone,hospitalCode,
                    ss,createTimeStart,createTimeEnd,serverDoctorName,doctorCode,page,pageSize, type);
            JSONObject result = doctorDoorCoachOrderService.getDoorOrderList(orderId,patientName,patientPhone,"350200",
                    ss,createTimeStart,createTimeEnd,serverDoctorName,null,page,pageSize, type);
            return baseController.write(200, "获取成功","data",result);
        } catch (Exception e) {
            return baseController.errorResult(e);
@ -625,8 +599,8 @@ public class AdminDoorCoachOrderController extends EnvelopRestEndpoint {
        }
    }
    @GetMapping(value = BaseHospitalRequestMapping.DodtorIM.getConsultInfoAndPatientInfo)
    @ApiOperation(value = "获取咨询问题,图片,居民信息", notes = "获取咨询问题,图片,居民信息")
    @GetMapping(value = "getConsultInfoAndPatientInfo")
    @ApiOperation(value = "获取咨询问题,图片,居民信息")
    public ObjEnvelop getConsultInfoAndPatientInfo(
            @ApiParam(name = "consult", value = "咨询CODE")
            @RequestParam(value = "consult",required = false) String consult,

+ 2 - 4
svr/svr-cloud-care/src/main/java/com/yihu/jw/care/endpoint/assistance/EmergencyAssistanceEndpoint.java

@ -4,9 +4,7 @@ import com.alibaba.fastjson.JSONObject;
import com.yihu.jw.care.aop.ObserverRequired;
import com.yihu.jw.care.aop.ServicesAuth;
import com.yihu.jw.care.service.assistance.EmergencyAssistanceService;
import com.yihu.jw.entity.care.securitymonitoring.BaseEmergencyWarnLogDO;
import com.yihu.jw.restmodel.ResponseContant;
import com.yihu.jw.restmodel.web.Envelop;
import com.yihu.jw.restmodel.web.ListEnvelop;
import com.yihu.jw.restmodel.web.ObjEnvelop;
import com.yihu.jw.restmodel.web.endpoint.EnvelopRestEndpoint;
@ -39,7 +37,7 @@ public class EmergencyAssistanceEndpoint extends EnvelopRestEndpoint {
                               @RequestParam(value = "orderSource",defaultValue = "1") Integer orderSource
                               ){
        try {
            JSONObject result = assistanceService.newOrder(patientId,jsonData,getUID(),orderSource);
            JSONObject result = assistanceService.newOrder(patientId,jsonData,getUID(),orderSource,getAgentUID());
            if (result.getIntValue(ResponseContant.resultFlag) == ResponseContant.fail) {
                return ObjEnvelop.getError(result.getString(ResponseContant.resultMsg));
            }
@ -271,7 +269,7 @@ public class EmergencyAssistanceEndpoint extends EnvelopRestEndpoint {
                                       @ApiParam(name="content",value = "content")
                                       @RequestParam(value = "content") String content){
        try {
            JSONObject result =assistanceService.sendQuickMessage(orderId,patient,content);
            JSONObject result =assistanceService.sendQuickMessage(orderId,patient,content,getAgentUID());
            if (result.getIntValue(ResponseContant.resultFlag) == ResponseContant.fail) {
                return ObjEnvelop.getError(result.getString(ResponseContant.resultMsg));
            }

+ 5 - 3
svr/svr-cloud-care/src/main/java/com/yihu/jw/care/endpoint/consult/PatientConsultEndpoint.java

@ -168,6 +168,8 @@ public class PatientConsultEndpoint extends EnvelopRestEndpoint {
			if (type == null) {
				type = 23;
			}
			String agent = getAgentUID();
			ConsultTeamDo consult = new ConsultTeamDo();
			// 设置咨询类型:23 在线咨询 24老人在线咨询
			consult.setType(type);
@ -182,7 +184,7 @@ public class PatientConsultEndpoint extends EnvelopRestEndpoint {
			// 保存到数据库
			synchronized (patient.intern()){//新增同步方法
				JSONObject re = null;
				re = consultService.addTeamConsult(consult, patient,doctor,source);
				re = consultService.addTeamConsult(consult, patient,doctor,source,agent);
				//发送系统消息
				SystemMessageDO systemMessageDO = new SystemMessageDO();
				systemMessageDO.setTitle("新增在线咨询");
@ -342,8 +344,8 @@ public class PatientConsultEndpoint extends EnvelopRestEndpoint {
					content = fileUploadService.uploadWxImage(imagepath);
				}
			}else{}
			failed = imService.append(consult,content,type,times,patientCode,wechat_appid);
			String agent = getAgentUID();
			failed = imService.append(consult,content,type,times,patientCode,wechat_appid,agent);
			return success(failed);
		}catch (Exception e){
			return failedListEnvelopException2(e);

+ 2 - 0
svr/svr-cloud-care/src/main/java/com/yihu/jw/care/endpoint/family/FamilyMemberEndpoint.java

@ -383,6 +383,8 @@ public class FamilyMemberEndpoint extends EnvelopRestEndpoint {
                return failed( "验证码已过期,请重新获取验证码",-1);
            }else if (result == -7) {
                return failed( "您或家人性别信息未填写无法添加成员",-1);
            }else if (result == -8) {
                return failed( "不能添加非老人亲属类型的成员",-1);
            } else {
                return success( "添加成功");
            }

+ 1 - 1
svr/svr-cloud-care/src/main/java/com/yihu/jw/care/endpoint/lifeCare/DoctorLifeCareEndpoint.java

@ -148,7 +148,7 @@ public class DoctorLifeCareEndpoint extends EnvelopRestEndpoint {
            @ApiParam(name = "doctor", value = "医生id") @RequestParam(value = "doctor", required = true) String doctor,
            @ApiParam(name = "jsonData", value = "Json数据", required = true) @RequestParam String jsonData) {
        try{
            JSONObject result = lifeCareOrderService.create(jsonData,doctor);
            JSONObject result = lifeCareOrderService.create(jsonData,doctor,null);
            if (result.getIntValue(ResponseContant.resultFlag) == ResponseContant.fail) {
                return Envelop.getError(result.getString(ResponseContant.resultMsg),-1);
            }

+ 1 - 1
svr/svr-cloud-care/src/main/java/com/yihu/jw/care/endpoint/lifeCare/PadLifeCareEndpoint.java

@ -36,7 +36,7 @@ public class PadLifeCareEndpoint extends EnvelopRestEndpoint {
    public Envelop create(@ApiParam(name = "jsonData", value = "Json数据", required = true) @RequestParam String jsonData) {
        JSONObject result = new JSONObject();
        try{
            result = lifeCareOrderService.create(jsonData,getUID());
            result = lifeCareOrderService.create(jsonData,getUID(),getAgentUID());
        }catch (Exception e){
            return failedException2(e);
        }

+ 1 - 1
svr/svr-cloud-care/src/main/java/com/yihu/jw/care/endpoint/lifeCare/PatientLifeCareEndpoint.java

@ -33,7 +33,7 @@ public class PatientLifeCareEndpoint  extends EnvelopRestEndpoint {
    public Envelop create(@ApiParam(name = "jsonData", value = "Json数据", required = true) @RequestParam String jsonData) {
        JSONObject result = new JSONObject();
        try{
            result = lifeCareOrderService.create(jsonData,getUID());
            result = lifeCareOrderService.create(jsonData,getUID(),getAgentUID());
        }catch (Exception e){
            return failedException2(e);
        }

+ 5 - 3
svr/svr-cloud-care/src/main/java/com/yihu/jw/care/endpoint/message/PatientMessageEndpoint.java

@ -62,7 +62,7 @@ public class PatientMessageEndpoint extends EnvelopRestEndpoint {
    public ListEnvelop getSystemMessage(@ApiParam(name = "patient",required = true)
                                        @RequestParam(value = "patient")String patient){
        try {
            return ListEnvelop.getSuccess("查询成功",patientMessageService.getSystemMessage(patient));
            return ListEnvelop.getSuccess("查询成功",patientMessageService.getSystemMessage(patient,getAgentUID()));
        }catch (Exception e){
            return failedListEnvelopException2(e);
        }
@ -76,7 +76,9 @@ public class PatientMessageEndpoint extends EnvelopRestEndpoint {
                                            @RequestParam(value = "type")String type
                                            ){
        try {
            return ListEnvelop.getSuccess("查询成功",patientMessageService.getSystemMessageList(patient,type,null));
            return ListEnvelop.getSuccess("查询成功",patientMessageService.getSystemMessageList(patient,type,null,getAgentUID()));
        }catch (Exception e){
            return failedListEnvelopException2(e);
        }
@ -92,7 +94,7 @@ public class PatientMessageEndpoint extends EnvelopRestEndpoint {
                                            @RequestParam(value = "isRead",required = false)String isRead
    ){
        try {
            return ListEnvelop.getSuccess("查询成功",patientMessageService.getSystemMessageList(patient,type,isRead));
            return ListEnvelop.getSuccess("查询成功",patientMessageService.getSystemMessageList(patient,type,isRead,getAgentUID()));
        }catch (Exception e){
            return failedListEnvelopException2(e);
        }

+ 19 - 1
svr/svr-cloud-care/src/main/java/com/yihu/jw/care/endpoint/patient/PatientEndpoint.java

@ -8,6 +8,7 @@ import com.yihu.jw.care.dao.label.WlyyPatientLabelDao;
import com.yihu.jw.care.service.patient.CarePatientService;
import com.yihu.jw.entity.base.patient.BasePatientDO;
import com.yihu.jw.exception.ApiException;
import com.yihu.jw.patient.dao.BasePatientDao;
import com.yihu.jw.restmodel.ResponseContant;
import com.yihu.jw.restmodel.web.Envelop;
import com.yihu.jw.restmodel.web.ListEnvelop;
@ -18,6 +19,7 @@ import com.yihu.jw.rm.base.BaseRequestMapping;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@ -36,6 +38,8 @@ public class PatientEndpoint extends EnvelopRestEndpoint {
    private CarePatientService patientService;
    @Autowired
    private WlyyPatientLabelDao patientLabelDao;
    @Autowired
    private BasePatientDao patientDao;
    public int num = 20;
    @GetMapping(value = "testException")
@ -120,7 +124,21 @@ public class PatientEndpoint extends EnvelopRestEndpoint {
            @ApiParam(name = "isCapacity", value = "是否返回能力评估,1返回其他值不返回,默认不返回", required = false)
            @RequestParam(value = "isCapacity", required = false) String isCapacity) {
        try{
            return success("获取成功",patientService.findPatientById(id,isCapacity));
            String agent = getAgentUID();
            return success("获取成功",patientService.findPatientById(id,agent,isCapacity));
        }catch (Exception e){
            return failedException2(e);
        }
    }
    @GetMapping(value = "findByPateintId")
    @ApiOperation(value = "获取居民信息")
    public Envelop findByPateintId(
            @ApiParam(name = "id", value = "居民id")
            @RequestParam(value = "id", required = true) String id) {
        try{
            BasePatientDO patientDO = patientDao.findById(id);
            return success("获取成功",patientDO);
        }catch (Exception e){
            return failedException2(e);
        }

+ 1 - 1
svr/svr-cloud-care/src/main/java/com/yihu/jw/care/endpoint/third/assistance/EmeAsEndpoint.java

@ -34,7 +34,7 @@ public class EmeAsEndpoint extends EnvelopRestEndpoint {
                               @RequestParam(value = "orderSource",defaultValue = "1") Integer orderSource
    ){
        try {
            JSONObject result = assistanceService.newOrder(patientId,jsonData,getUID(),orderSource);
            JSONObject result = assistanceService.newOrder(patientId,jsonData,getUID(),orderSource,null);
            if (result.getIntValue(ResponseContant.resultFlag) == ResponseContant.fail) {
                return ObjEnvelop.getError(result.getString(ResponseContant.resultMsg));
            }

+ 1578 - 5
svr/svr-cloud-care/src/main/java/com/yihu/jw/care/service/admin/AdminDoorCoachOrderService.java

@ -1,12 +1,48 @@
package com.yihu.jw.care.service.admin;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.yihu.jw.care.dao.doorCoach.*;
import com.yihu.jw.care.dao.lifeCare.BaseAdminServiceDynamicDao;
import com.yihu.jw.care.service.consult.ConsultTeamService;
import com.yihu.jw.care.service.doorCoach.DoctorDoorCoachOrderService;
import com.yihu.jw.care.service.doorCoach.PatientDoorCoachOrderService;
import com.yihu.jw.care.service.message.BaseServiceNewsService;
import com.yihu.jw.care.service.pay.PayService;
import com.yihu.jw.care.util.MessageUtil;
import com.yihu.jw.doctor.dao.BaseDoctorDao;
import com.yihu.jw.entity.base.doctor.BaseDoctorDO;
import com.yihu.jw.entity.base.im.ConsultDo;
import com.yihu.jw.entity.base.im.ConsultTeamDo;
import com.yihu.jw.entity.base.patient.BasePatientDO;
import com.yihu.jw.entity.base.wx.BasePatientWechatDo;
import com.yihu.jw.entity.care.doorCoach.*;
import com.yihu.jw.entity.door.BaseAdminServiceDynamic;
import com.yihu.jw.entity.hospital.message.SystemMessageDO;
import com.yihu.jw.entity.order.BusinessOrderDO;
import com.yihu.jw.hospital.message.dao.SystemMessageDao;
import com.yihu.jw.im.dao.ConsultDao;
import com.yihu.jw.im.util.ImUtil;
import com.yihu.jw.order.dao.BusinessOrderDao;
import com.yihu.jw.patient.dao.BasePatientDao;
import com.yihu.jw.restmodel.ResponseContant;
import com.yihu.jw.util.common.IdCardUtil;
import com.yihu.jw.util.date.DateUtil;
import com.yihu.jw.util.entity.EntityUtils;
import com.yihu.jw.wechat.dao.BasePatientWechatDao;
import com.yihu.mysql.query.BaseJpaService;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
import java.util.Map;
import java.math.BigDecimal;
import java.util.*;
/***
 * @ClassName: AdminDoorCoachOrderService
@ -15,12 +51,63 @@ import java.util.Map;
 * @Date: 2021/8/31 16:40
 */
@Service
public class AdminDoorCoachOrderService {
public class AdminDoorCoachOrderService extends BaseJpaService<BaseDoorCoachOrderDO, BaseDoorCoachOrderDao> {
    private Logger logger = LoggerFactory.getLogger(AdminDoorCoachOrderService.class);
    @Value("${wechat.id}")
    private String wxId;
    @Autowired
    private BaseAdminServiceDynamicDao baseAdminServiceDynamicDao;
    @Autowired
    private JdbcTemplate jdbcTemplate;
    @Autowired
    private BaseDoorCoachOrderDao baseDoorCoachOrderDao;
    @Autowired
    private BaseDoorCoachFeeDetailDao baseDoorCoachFeeDetailDao;
    @Autowired
    private BaseDoctorDao doctorDao;
    @Autowired
    private BaseDoorCoachFeeDetailDao doorFeeDetailDao;
    @Autowired
    private BaseDoorCoachDoctorStatusDao baseDoorCoachDoctorStatusDao;
    @Autowired
    private BaseDoorCoachProcessLogDao baseDoorCoachProcessLogDao;
    @Autowired
    private DoctorDoorCoachOrderService doorOrderService;
    @Autowired
    private BaseDoorCoachCancelLogDao baseDoorCoachCancelLogDao;
    @Autowired
    private BasePatientWechatDao basePatientWechatDao;
    @Autowired
    private BaseDoorCoachPatientConfirmLogDao patientConfirmLogDao;
    @Autowired
    private DoctorDoorCoachOrderService doctorDoorCoachOrderService;
    @Autowired
    private BasePatientDao patientInfoService;
    @Autowired
    private MessageUtil messageUtil;
    @Autowired
    private ImUtil imUtill;
    @Autowired
    private ConsultDao consultDao;
    @Autowired
    private BasePatientDao patientDao;
    @Autowired
    private ConsultTeamService consultTeamService;
    @Autowired
    private SystemMessageDao systemMessageDao;
    @Autowired
    private BaseServiceNewsService serviceNewsService;
    @Autowired
    private PayService payService;
    @Autowired
    private BusinessOrderDao businessOrderDao;
    @Autowired
    private BaseAdminServiceDynamicDao baseAdminServiceDynamicDao;
    public List<Map<String , Object>> getServiceDynamic(Integer page,Integer size){
        page = (page-1)*size;
@ -29,4 +116,1490 @@ public class AdminDoorCoachOrderService {
        return list;
    }
    /**
     * 创建上门辅导服务工单
     *
     * @param jsonData
     * @return
     */
    public JSONObject create(String jsonData) {
        logger.info("创建上门预约jsonData参数:" + jsonData);
        JSONObject result = new JSONObject();
        JSONObject jsonObjectParam;
        try {
            jsonObjectParam = JSONObject.parseObject(jsonData);
        } catch (Exception e) {
            result.put(ResponseContant.resultFlag, ResponseContant.fail);
            String failMsg = "参数转换成JSON对象异常:" + e.getMessage();
            result.put(ResponseContant.resultMsg, failMsg);
            logger.error(failMsg);
            return result;
        }
        BaseDoorCoachOrderDO orderDO = null;
        try {
            orderDO = EntityUtils.jsonToEntity(jsonObjectParam.get("order").toString(), BaseDoorCoachOrderDO.class);
        } catch (Exception e) {
            result.put(ResponseContant.resultFlag, ResponseContant.fail);
            String failMsg = "上门预约工单服务基本信息:" + e.getMessage();
            result.put(ResponseContant.resultMsg, failMsg);
            logger.error(failMsg);
            return result;
        }
        JSONObject dispatcherJson = queryDispatcherInfoByPatient(jsonObjectParam.getJSONObject("hospital").get("code").toString());
        String hospital = jsonObjectParam.getJSONObject("hospital").get("code").toString();
        orderDO.setHospital(hospital);
        orderDO.setNumber(getRandomIntStr());
        orderDO.setCreateTime(new Date());
        orderDO.setCreateUser(orderDO.getProxyPatient());
        orderDO.setCreateUserName(orderDO.getProxyPatientName());
        orderDO.setOrderInfo("0");
        orderDO.setStatus(0);//待付款
        orderDO.setPayStatus(0);//待付款
//        orderDO.setConclusionStatus(1);
        if(StringUtils.isEmpty(orderDO.getPatient())){
            result.put(ResponseContant.resultFlag, ResponseContant.fail);
            String failMsg = "当前服务对象code为空,请联系管理员检查参数!patient = " + orderDO.getPatient();
            result.put(ResponseContant.resultMsg, failMsg);
            logger.error(failMsg);
            return result;
        }
        if(StringUtils.isEmpty(orderDO.getProxyPatient())){
            result.put(ResponseContant.resultFlag, ResponseContant.fail);
            String failMsg = "当前代理对象code为空,请联系管理员检查参数!proxyPatient = " + orderDO.getProxyPatient();
            result.put(ResponseContant.resultMsg, failMsg);
            logger.error(failMsg);
            return result;
        }
        //已取消的订单也可以申请
        boolean bool = baseDoorCoachOrderDao.existsByPatientAndStatusIn(orderDO.getPatient(),
                new Integer[]{
                        BaseDoorCoachOrderDO.Status.waitForPay.getType(),
                        BaseDoorCoachOrderDO.Status.waitForSend.getType(),
                        BaseDoorCoachOrderDO.Status.waitForAccept.getType(),
                        BaseDoorCoachOrderDO.Status.waitForServe.getType(),
                        BaseDoorCoachOrderDO.Status.accept.getType(),
                });
        if(bool){
            String failMsg = "当前服务对象存在未支付或未完成的上门预约,无法再次申请!";
            result.put(ResponseContant.resultFlag, ResponseContant.fail);
            result.put(ResponseContant.resultMsg, failMsg);
            logger.error(failMsg);
            return result;
        }
        orderDO.setHospital(jsonObjectParam.getJSONObject("hospital").get("code").toString());
        orderDO.setCreateTime(new Date());
        //判断创建上门预约类型,发起类型(1本人发起 2家人待预约 3医生代预约)
        if(orderDO.getProxyPatient().equals(orderDO.getPatient())){
            orderDO.setType(1);
        }else if(!orderDO.getProxyPatient().equals(orderDO.getPatient())){
            orderDO.setType(2);
        }
        orderDO.setServiceStatus("1");
        try {
            BaseAdminServiceDynamic baseAdminServiceDynamic = new BaseAdminServiceDynamic();
            baseAdminServiceDynamic.setDoctorName(orderDO.getDoctorName());
            baseAdminServiceDynamic.setDoctor(orderDO.getDoctor());
            baseAdminServiceDynamic.setName(orderDO.getPatientName());
            baseAdminServiceDynamic.setPatient(orderDO.getPatient());
            baseAdminServiceDynamic.setType(1);
            baseAdminServiceDynamic.setValue("创建了上门辅导申请");
            baseAdminServiceDynamic.setCreateTime(new Date());
            baseAdminServiceDynamic.setName(orderDO.getNumber());
            baseAdminServiceDynamicDao.save(baseAdminServiceDynamic);
        }catch (Exception e) {
            logger.info(e.getMessage());
        }
        this.save(orderDO);
        result.put("orderId",orderDO.getId());
        result.put(ResponseContant.resultFlag, ResponseContant.success);
        result.put(ResponseContant.resultMsg, orderDO);
        orderDO.setTotalFee(new BigDecimal(0));
        //新增工单与服务项费用关联关系
        if (orderWithPackageItemFeeAdd(result, jsonObjectParam, orderDO,null)) {return result;}
        //发起支付订单
        payService.submitOrder(orderDO.getPatient(),"3",orderDO.getId(),orderDO.getTotalFee().doubleValue());
        return result;
    }
    @Transactional
    public JSONObject proxyCreate(String jsonData,String doctorCode) {
        JSONObject result = new JSONObject();
        //医养暂无该功能--屏蔽
        result.put(ResponseContant.resultFlag, ResponseContant.fail);
        result.put(ResponseContant.resultMsg, "暂无该功能");
        return result;
        /*
        JSONObject jsonObjectParam;
        try {
            jsonObjectParam = JSONObject.parseObject(jsonData);
        } catch (Exception e) {
            result.put(ResponseContant.resultFlag, ResponseContant.fail);
            String failMsg = "参数转换成JSON对象异常:" + e.getMessage();
            result.put(ResponseContant.resultMsg, failMsg);
            logger.error(failMsg);
            return result;
        }
        BaseDoorCoachOrderDO orderDO = null;
        try {
            orderDO = EntityUtils.jsonToEntity(jsonObjectParam.get("order").toString(), BaseDoorCoachOrderDO.class);
        } catch (Exception e) {
            result.put(ResponseContant.resultFlag, ResponseContant.fail);
            String failMsg = "上门预约工单服务基本信息:" + e.getMessage();
            result.put(ResponseContant.resultMsg, failMsg);
            logger.error(failMsg);
            return result;
        }
        if(StringUtils.isEmpty(orderDO.getPatient())){
            result.put(ResponseContant.resultFlag, ResponseContant.fail);
            String failMsg = "当前服务对象code为空,请联系管理员检查参数!patient = " + orderDO.getPatient();
            result.put(ResponseContant.resultMsg, failMsg);
            logger.error(failMsg);
            return result;
        }
        if(StringUtils.isEmpty(orderDO.getProxyPatient())){
            result.put(ResponseContant.resultFlag, ResponseContant.fail);
            String failMsg = "当前代理对象code为空,请联系管理员检查参数!proxyPatient = " + orderDO.getProxyPatient();
            result.put(ResponseContant.resultMsg, failMsg);
            logger.error(failMsg);
            return result;
        }
        //判断工单是否已存在,新建或者编辑
        if(StringUtils.isBlank(orderDO.getId())) {
            //已取消的订单也可以申请
            boolean bool = baseDoorCoachOrderDao.existsByPatientAndStatusIn(orderDO.getPatient(),
                    new Integer[]{BaseDoorCoachOrderDO.Status.waitForPay.getType(),
                            BaseDoorCoachOrderDO.Status.waitForAccept.getType(),
                            BaseDoorCoachOrderDO.Status.waitForServe.getType(),
                            BaseDoorCoachOrderDO.Status.accept.getType(),
                            BaseDoorCoachOrderDO.Status.waitForSend.getType()
                    });
            if(bool){
                String failMsg = "当前服务对象存在未完成的上门预约,请先完成该服务!";
                result.put(ResponseContant.resultFlag, ResponseContant.fail);
                result.put(ResponseContant.resultMsg, failMsg);
                logger.error(failMsg);
                return result;
            }
            orderDO.setNumber(getRandomIntStr());
            orderDO.setHospital(jsonObjectParam.getJSONObject("hospital").get("code").toString());
            orderDO.setCreateTime(new Date());
            orderDO.setCreateUser(orderDO.getProxyPatient());
            orderDO.setCreateUserName(orderDO.getProxyPatientName());
        }else {
            BaseDoorCoachOrderDO serviceOrderDO = baseDoorCoachOrderDao.findOne(orderDO.getId());
            // 删除出诊医生或服务项
            Boolean b = this.orderWithFeeDelete(jsonObjectParam, serviceOrderDO);
            if(b){
                String failMsg = "删除服务项失败!";
                result.put(ResponseContant.resultFlag, ResponseContant.fail);
                result.put(ResponseContant.resultMsg, failMsg);
                return result;
            }
            orderDO.setNumber(serviceOrderDO.getNumber());
            orderDO.setHospital(serviceOrderDO.getHospital());
            orderDO.setUpdateTime(new Date());
            orderDO.setUpdateUser(orderDO.getProxyPatient());
            orderDO.setUpdateUserName(orderDO.getProxyPatientName());
        }
        orderDO.setStatus(0);//待付款
        orderDO.setPayStatus(0);//待付款
        orderDO.setType(3);
        orderDO.setDispatcherResponseTime(new Date());
        this.save(orderDO);
        result.put("orderId",orderDO.getId());
        orderDO.setTotalFee(new BigDecimal(0));
        //新增工单与服务项费用关联关系
        if (orderWithPackageItemFeeAdd(result, jsonObjectParam, orderDO,doctorCode)) {return result;}
        // 给服务医生发接单消息
        this.createMessage("服务工单待接单","707",orderDO.getProxyPatient(),orderDO.getProxyPatientName(), orderDO.getId(),orderDO.getDoctor(),orderDO.getDoctorName(), null,"您有新的服务工单,请前往处理");
        //发送智能助手消息
        sendWeixinMessage(4,orderDO.getDoctor(),orderDO.getPatient());
        //发起支付订单
        BusinessOrderDO businessOrderDO =  payService.submitOrder(orderDO.getPatient(),"3",orderDO.getId(),orderDO.getTotalFee().doubleValue());
        result.put(ResponseContant.resultFlag, ResponseContant.success);
        return result;
        */
    }
    //支付完成后开始上门辅导订单
    public JSONObject payOrderAfter(String orderId) {
        JSONObject result = new JSONObject();
        try {
            BusinessOrderDO businessOrderDO = businessOrderDao.selectByRelationCode(orderId);
            if (businessOrderDO==null){
                String failMsg = "未查询到该订单";
                result.put(ResponseContant.resultFlag, ResponseContant.fail);
                result.put(ResponseContant.resultMsg, failMsg);
                return result;
            }
            BaseDoorCoachOrderDO orderDO= baseDoorCoachOrderDao.findOne(orderId);
            if (orderDO!=null){
                orderDO.setPayStatus(1);
                orderDO.setPayWay(1);
                orderDO.setPayTime(new Date());
                if (orderDO.getType()== 3){//医生代预约
                    orderDO.setStatus(2);//待接单
                    this.save(orderDO);
                    // 给服务医生发接单消息
                    this.createMessage("服务工单待接单","707",orderDO.getProxyPatient(),orderDO.getProxyPatientName(), orderDO.getId(),orderDO.getDoctor(),orderDO.getDoctorName(), null,"您有新的服务工单,请前往处理");
                    //发送智能助手消息
                    sendWeixinMessage(4,orderDO.getDoctor(),orderDO.getPatient());
                }else {
                    //创建咨询
                    JSONObject successOrNot = null;
                    try {
                        successOrNot = consultTeamService.addDoorCoachServiceConsult(orderDO.getId());
                    } catch (Exception e) {
                        e.printStackTrace();
                        String failMsg = "创建咨询时异常: " + e.getMessage();
                        result.put(ResponseContant.resultFlag, ResponseContant.fail);
                        result.put(ResponseContant.resultMsg, failMsg);
                        logger.error(failMsg);
                        return result;
                    }
                    if (Integer.parseInt(successOrNot.get(ResponseContant.resultFlag).toString()) == ResponseContant.fail) {
                        return JSONObject.parseObject(successOrNot.toString());
                    }
                    ConsultTeamDo consultTeam = (ConsultTeamDo)successOrNot.get(ResponseContant.resultMsg);
                    //发送智能助手消息
                    sendWeixinMessage(4,orderDO.getDoctor(),orderDO.getPatient());
                    //发送 预约卡片信息(2201类型)
                    JSONObject orderInfoContent = this.queryOrderCardInfo(orderDO);
                    orderInfoContent.put("re_msg_type",0);//居民预约
                    this.qucikSendIM(orderDO.getId(), "system", "智能助手", "2201", orderInfoContent.toJSONString());
                    if(StringUtils.isNoneBlank(orderDO.getDoctor())){
                        //期望服务医生存在,直接转派
                        BaseDoctorDO transDoctor = doctorDao.findById(orderDO.getDoctor());
                        sendOrderToDoctor(orderDO.getId(),null,"system","系统",transDoctor.getId(),transDoctor.getName(),transDoctor.getJobTitleName());
                    }else {
                        orderDO.setStatus(1);//待派单
                        this.save(orderDO);
                        JSONObject dispatcherJson = queryDispatcherInfoByPatient(orderDO.getHospital());
                        if (dispatcherJson.getInteger("resultFlag")==1){
                            List<Map<String,Object>> dispatcherInfoList = (List<Map<String, Object>>) dispatcherJson.get(ResponseContant.resultMsg);
                            for(Map<String,Object> map: dispatcherInfoList){
                                String dispatcher = map.get("code").toString();
                                BaseDoctorDO doctorVO = doctorDao.findById(dispatcher);
                                // 派单消息-首页
                                this.createMessage("新增居民预约服务申请","702","system","system", orderDO.getId(), dispatcher,doctorVO.getName() ,doctorVO.getIdcard(), orderDO.getPatientName() + "提交了服务预约申请,请您前往处理");
                                // 派单-实时工单消息  430 居民提交工单申请-- 张三提交了服务工单12345678申请
                                this.createMessage("居民提交工单申请","730","system","system", orderDO.getId(), dispatcher,doctorVO.getName() ,doctorVO.getIdcard(), orderDO.getPatientName() + "提交了服务工单"+orderDO.getNumber()+"申请");
                            }
                        }
                    }
                    serviceNewsService.addServiceNews(orderDO.getPatientName(),orderDO.getPatient(),"1",null);
                    String failMsg = "success";
                    result.put(ResponseContant.resultFlag, ResponseContant.success);
                    result.put(ResponseContant.resultMsg, failMsg);
                }
            }
            else {
                String failMsg = "工单不存在";
                result.put(ResponseContant.resultFlag, ResponseContant.fail);
                result.put(ResponseContant.resultMsg, failMsg);
            }
        }catch (Exception e){
            e.printStackTrace();
        }
        return result;
    }
    //退款后回调
    public JSONObject refundOrderAfter(String orderId) {
        JSONObject result = new JSONObject();
        try {
            BaseDoorCoachOrderDO orderDO= baseDoorCoachOrderDao.findOne(orderId);
            if (orderDO == null){
                String failMsg = "工单不存在";
                result.put(ResponseContant.resultFlag, ResponseContant.fail);
                result.put(ResponseContant.resultMsg, failMsg);
                return result;
            }
            orderDO.setPayStatus(2);
            this.save(orderDO);
            String failMsg = "success";
            result.put(ResponseContant.resultFlag, ResponseContant.fail);
            result.put(ResponseContant.resultMsg, failMsg);
        }catch (Exception e){
            e.printStackTrace();
        }
        return result;
    }
    /**
     * 根据接单医生code获取最近一次服务orderId
     * @return
     */
    public String getOrderIdByPatient(String patient) {
        String sql = "SELECT id as orderId from base_door_coach_order where patient=? and status in(1,2,3,4,5,6) ORDER BY patient_expected_serve_time desc,update_time desc,create_time desc, status ASC limit 1";
        List<String> orderId = jdbcTemplate.queryForList(sql, String.class, new Object[]{patient});
        if (orderId.size()>0){
            return orderId.get(0);
        }
        return null;
    }
    public List<Map<String,Object>> selectItemsByHospital(String hospital,String serverItemName){
        String sql ="select org_code,dict_code code,dict_value name,ext1 fee from base_business_sys_dict where dict_name='DOOR_APPLY_ITEM' ";
        if (StringUtils.isNotBlank(hospital)){
            sql +=" and org_code='"+hospital+"' ";
        }
        if (StringUtils.isNotBlank(serverItemName)){
            sql += " and dict_value like '%"+serverItemName+"%' ";
        }
        List<Map<String,Object>> result = jdbcTemplate.queryForList(sql);
        return result;
    }
    /**
     * 调度员-查询-服务人员列表(医生-可接单状态的)
     *
     * @return
     */
    public JSONObject queryDoctorListWithNotStopped(String hospital,int page, int size) {
        JSONObject result = new JSONObject();
        int start = 0 == page ? page++ : (page - 1) * size;
        int end = 0 == size ? 15 : page * size;
        String sql = "select DISTINCT ds.doctor,d.name, d.job_title_name as jobName, 1 as sortFlag " +
                " from base_door_coach_doctor_status ds " +
                "        JOIN (select b.* from base_doctor b,base_doctor_hospital dh where b.id=dh.doctor_code and dh.del = 1 and dh.org_code='" + hospital + "')  d on ds.doctor = d.id " +
                "  where ds.status in (1,2,3,4)  " +
                " limit " + start + "," + end ;
        String countSql = "select DISTINCT count(ds.id) " +
                "from base_door_coach_doctor_status ds " +
                "         JOIN (select b.* from base_doctor b,base_doctor_hospital dh where b.id=dh.doctor_code and dh.del = 1 and dh.org_code= '" + hospital + "') d on ds.doctor = d.id " +
                " LEFT JOIN base_doctor_role dr ON dr.doctor_code = d.id where ds.status in (1,2,3,4)  ";
        List<Map<String,Object>> doctorList = new ArrayList<>();
        try {
            doctorList = jdbcTemplate.queryForList(sql);
        } catch (Exception e) {
            String failMsg = "从数据库查询 可接单状态的服务医生人员 列表信息失败:" + e.getMessage();
            result.put(ResponseContant.resultFlag, ResponseContant.fail);
            result.put(ResponseContant.resultMsg,failMsg );
            logger.error(failMsg);
            return result;
        }
        Integer count = 0;
        try {
            count = jdbcTemplate.queryForObject(countSql,Integer.class);
        } catch (Exception e) {
            String failMsg = "从数据库统计  可接单状态的服务医生人员 数量失败:" + e.getMessage();
            result.put(ResponseContant.resultFlag, ResponseContant.fail);
            result.put(ResponseContant.resultMsg, failMsg);
            logger.error(failMsg);
            return result;
        }
        result.put(ResponseContant.resultFlag, ResponseContant.success);
        result.put(ResponseContant.resultMsg, doctorList);
        JSONObject countItem = new JSONObject();
        countItem.put("count", count);
        result.putAll(countItem);
        return result;
    }
    /**
     * 修改上门预约工单(包括医生,费用,居民确认信息等)
     *
     * @param jsonData
     * @return
     */
    @Transactional(rollbackFor = Exception.class)
    public JSONObject update(String jsonData) {
        JSONObject result = new JSONObject();
        JSONObject jsonObjectParam;
        try {
            jsonObjectParam = JSONObject.parseObject(jsonData);
        } catch (Exception e) {
            result.put(ResponseContant.resultFlag, ResponseContant.fail);
            String failMsg = "参数转换成JSON对象异常:" + e.getMessage();
            result.put(ResponseContant.resultMsg, failMsg);
            logger.error(failMsg);
            return result;
        }
        BaseDoorCoachOrderDO wlyyDoorServiceOrder = new BaseDoorCoachOrderDO();
        wlyyDoorServiceOrder = jsonToWlyyDoorServiceOrder(result, jsonObjectParam, jsonData);
        this.save(wlyyDoorServiceOrder);
        result.put(ResponseContant.resultFlag, ResponseContant.success);
        result.put(ResponseContant.resultMsg, wlyyDoorServiceOrder);
        return result;
    }
    /**
     * 删除出诊医生或服务项
     * @param jsonObjectParam
     * {
     *     "deleteItemArr":[
     *        {
     *           "id":""
     *       },
     *        {
     *           "id":""
     *      }
     *     ],
     *     "deleteDoctorArr":[
     *     {
     *         "id":""
     *     },
     *      {
     *         "id":""
     *     }
     *     ]
     * }
     * @return
     */
    @Transactional(rollbackFor = Exception.class)
    public boolean orderWithFeeDelete(JSONObject jsonObjectParam, BaseDoorCoachOrderDO orderDO) {
        BigDecimal totalFee = orderDO.getTotalFee();
        //删除的服务项
        JSONArray itemArray = jsonObjectParam.getJSONArray("deleteItemArr");
        if (!CollectionUtils.isEmpty(itemArray)) {
            List<BaseDoorCoachFeeDetailDO> list = new ArrayList<>();
            //删除的服务项要减去服务项费用
            BigDecimal itemFee = new BigDecimal(0);
            for(Object oneId : itemArray) {
                JSONObject oneIdJson = (JSONObject) oneId;
                BaseDoorCoachFeeDetailDO doorFeeDetail = baseDoorCoachFeeDetailDao.findOne(String.valueOf(oneIdJson.get("id")));
                if(doorFeeDetail.getPayStatus()==0){
                    doorFeeDetail.setStatus(3);
                    doorFeeDetail.setUpdateTime(new Date());
                    list.add(doorFeeDetail);
                    itemFee = itemFee.add(doorFeeDetail.getFee().multiply(BigDecimal.valueOf(doorFeeDetail.getNumber())));
                }
            }
            baseDoorCoachFeeDetailDao.save(list);
        }
        return false;
    }
    /**
     * 上门预约工单服务基本信息
     *
     * @param result
     * @param jsonObjectParam
     * @param jsonData
     * @return
     */
    public BaseDoorCoachOrderDO jsonToWlyyDoorServiceOrder(JSONObject result, JSONObject jsonObjectParam, String jsonData) {
        BaseDoorCoachOrderDO wlyyDoorServiceOrder;
        try {
            wlyyDoorServiceOrder = EntityUtils.jsonToEntity(jsonObjectParam.get("order").toString(), BaseDoorCoachOrderDO.class);
        } catch (Exception e) {
            result.put(ResponseContant.resultFlag, ResponseContant.fail);
            String failMsg = "上门预约工单服务基本信息:" + e.getMessage();
            result.put(ResponseContant.resultMsg, failMsg);
            logger.error(failMsg);
            return new BaseDoorCoachOrderDO();
        }
        wlyyDoorServiceOrder.setNumber(getRandomIntStr());
        return wlyyDoorServiceOrder;
    }
    /**
     * 查询预约简要卡片信息
     *
     * 服务时间:2019-01-01   12:30
     * 服务对象:张三
     * 联系电话:13125256565(儿子)
     * 上门地址:福建省厦门市思明区望海路55号
     *
     * @param orderDO
     * @return
     */
    public JSONObject queryOrderCardInfo(BaseDoorCoachOrderDO orderDO){
        JSONObject result = new JSONObject();
        result.put("patientCode", orderDO.getPatient());
        BasePatientDO patientDO = patientDao.findById(orderDO.getPatient());
        result.put("title","预约服务信息如下:");
        result.put("orderId",orderDO.getId());
        result.put("status",orderDO.getStatus());
        result.put("number",orderDO.getNumber());
        result.put("serveDesc",orderDO.getServeDesc());
        result.put("expectedDoctor",orderDO.getExpectedDoctorName());
        result.put("serviceStatus",orderDO.getServiceStatus());
        if(orderDO.getStatus() < 4){
            if(StringUtils.isBlank(orderDO.getPatientExpectedServeTime())){
                result.put("time","工作时间");
            }else {
                result.put("time", orderDO.getPatientExpectedServeTime());
            }
        }else {
            if(StringUtils.isBlank(orderDO.getDoctorArrivingTime())){
                result.put("time","工作时间");
            }else{
                result.put("time", orderDO.getDoctorArrivingTime());
            }
        }
        result.put("patientName",patientDO.getName());
        result.put("patientSex", IdCardUtil.getSexNameForIdcard_new(patientDO.getIdcard()));
        result.put("patientAge", IdCardUtil.getAgeByIdcardOrBirthday(patientDO.getIdcard(),patientDO.getBirthday()));
        result.put("phone",orderDO.getPatientPhone());
        result.put("serveDesc",orderDO.getServeDesc());
        if(StringUtils.equalsIgnoreCase(orderDO.getPatient(),orderDO.getProxyPatient())){
            result.put("relation","");
        }else{
            result.put("relation",orderDO.getPatientRelation());
        }
        result.put("serveTown",orderDO.getServeTown());
        result.put("serveAddress",orderDO.getServeAddress());
        result.put("type",21);
        return result;
    }
    /**
     * 【调度员,医生】快速发送IM消息
     * @param orderId
     * @param sendId
     * @param sendName
     * @param content
     * @return
     */
    public int qucikSendIM(String orderId,String sendId,String sendName,String contentType,String content) {
        int result = -1;
        ConsultDo consult = consultDao.queryByRelationCode(orderId);
        if (null == consult) {
            logger.error("当前工单未关联咨询,工单id:" + orderId);
            return result;
        }
        BaseDoorCoachOrderDO baseDoorCoachOrderDO = null;
        String response = null;
        if(StringUtils.isBlank(sendId)){
            baseDoorCoachOrderDO = baseDoorCoachOrderDao.findOne(orderId);
            String sender = "system";
            if(StringUtils.isNoneBlank(baseDoorCoachOrderDO.getDispatcher())){
                sender = baseDoorCoachOrderDO.getDispatcher();
            }
            response = imUtill.sendTopicIM(sender, "智能助手", consult.getId(), contentType, content, null);
        }else{
            response = imUtill.sendTopicIM(sendId, sendName, consult.getId(), contentType, content, null);
        }
        JSONObject resObj = JSONObject.parseObject(response);
        if (resObj.getIntValue("status") == -1) {
            logger.error("上门预约工单消息发送失败:" + resObj.getString("message"));
            return result;
        }
        result = 1;
        return result;
    }
    /**
     * 调度员(系统)给医生派单
     *
     * @param orderId
     * @param doctor
     * @return
     */
    @Transactional(rollbackFor = Exception.class)
    public JSONObject sendOrderToDoctor(String orderId,String remark,String dispatcher,String dispathcherName,String doctor,String doctorName,String doctorJobName){
        JSONObject result = new JSONObject();
        BaseDoorCoachOrderDO doorServiceOrderDO = baseDoorCoachOrderDao.findOne(orderId);
        if(null == doorServiceOrderDO){
            result.put(ResponseContant.resultFlag, ResponseContant.fail);
            String failMsg = "当前工单不存在,id:" + orderId;
            result.put(ResponseContant.resultMsg, failMsg);
            logger.error(failMsg);
            return result;
        }
        BaseDoorCoachDoctorStatusDO doorDoctorStatusDO = baseDoorCoachDoctorStatusDao.queryByDoctorAndStatusIn(doctor,new Integer[]{BaseDoorCoachOrderDO.Status.waitForSend.getType(),
                BaseDoorCoachDoctorStatusDO.Status.waitForAccept.getType(),
                BaseDoorCoachDoctorStatusDO.Status.waitForServe.getType(),
                BaseDoorCoachDoctorStatusDO.Status.serving.getType(),
        });
        if(null == doorDoctorStatusDO){
            result.put(ResponseContant.resultFlag, ResponseContant.fail);
            String failMsg = "当前派单的医生不存在或禁止接单,doctor:" + doctor;
            result.put(ResponseContant.resultMsg, failMsg);
            logger.error(failMsg);
            return result;
        }
        if (StringUtils.isNotBlank(remark)&&!"null".equals(remark)){
            doorServiceOrderDO.setRemark(remark);
        }
        doorServiceOrderDO.setDoctor(doctor);
        doorServiceOrderDO.setDoctorName(doctorName);
        doorServiceOrderDO.setDoctorType(doctorJobName);
        doorServiceOrderDO.setStatus(BaseDoorCoachOrderDO.Status.waitForAccept.getType());
        doorServiceOrderDO.setUpdateUser(dispatcher);
        doorServiceOrderDO.setUpdateUserName(dispathcherName);
        doorServiceOrderDO.setDispatcherResponseTime(new Date());
        this.save(doorServiceOrderDO);
        // 给医生发派单消息
        if(BaseDoorCoachOrderDO.IsTransOtherOrg.yes.getType().equals(doorServiceOrderDO.getIsTransOtherOrg())){
            this.createMessage("服务工单待接单","707",doorServiceOrderDO.getTransedDispatcher(),doorServiceOrderDO.getTransedDispatcherName(), orderId,doctor,doctorName, null,"您有新的服务工单,请前往处理");
        }else{
            this.createMessage("服务工单待接单","707",doorServiceOrderDO.getDispatcher(),doorServiceOrderDO.getDispatcherName(), orderId,doctor,doctorName, null,"您有新的服务工单,请前往处理");
        }
        //发送智能助手消息//·
        sendWeixinMessage(4,doctor,doorServiceOrderDO.getPatient());
        // 派单时,把医生拉入会话,作为其中一个成员,医生拒单时,退出会话
        ConsultDo consult = consultDao.queryByRelationCode(orderId);
        String sessionId = doorServiceOrderDO.getPatient() + "_" + consult.getId() + "_" + doorServiceOrderDO.getNumber() + "_" + consult.getType();
        imUtill.updateParticipantNew(sessionId,doctor,null);
        if (!dispatcher.equals("System")){
            messageUtil.updateDoorCoachMessage(doorServiceOrderDO,new String[]{"702","703","730","735"},"731",dispatcher,dispatcher);
        }
        // 工单状态变更记录
        BaseDoorCoachProcessLogDO processLogDO = new BaseDoorCoachProcessLogDO();
        processLogDO.setOrderId(orderId);
        processLogDO.setStatus(BaseDoorCoachOrderDO.Status.waitForAccept.getType());
        processLogDO.setDispatcher(dispatcher);
        processLogDO.setDispatcherName(dispathcherName);
        processLogDO.setCreateTime(new Date());
        baseDoorCoachProcessLogDao.save(processLogDO);
        result.put(ResponseContant.resultFlag, ResponseContant.success);
        result.put(ResponseContant.resultMsg, doorServiceOrderDO);
        // 发送IM消息通知患者医生已派单
        String noticeContent = "已分派"+doorServiceOrderDO.getDoctorName()+"医生为您服务,请耐心等待医生接单";
        if (!doorServiceOrderDO.getDispatcher().equals("System")) {
            this.qucikSendIM(doorServiceOrderDO.getId(), doorServiceOrderDO.getDispatcher(), "智能助手","1", noticeContent);
        }
        return result;
    }
    /**
     * 医生给医生派单
     *
     * @param orderId
     * @param doctor
     * @return
     */
    @Transactional(rollbackFor = Exception.class)
    public JSONObject transferOrder(String orderId,String remark,String dispatcher,String dispathcherName,String doctor,String doctorName,String doctorJobName){
        JSONObject result = new JSONObject();
        BaseDoorCoachOrderDO doorServiceOrderDO = baseDoorCoachOrderDao.findOne(orderId);
        if(null == doorServiceOrderDO){
            result.put(ResponseContant.resultFlag, ResponseContant.fail);
            String failMsg = "当前工单不存在,id:" + orderId;
            result.put(ResponseContant.resultMsg, failMsg);
            logger.error(failMsg);
            return result;
        }
        BaseDoorCoachDoctorStatusDO doorDoctorStatusDO = baseDoorCoachDoctorStatusDao.queryByDoctorAndStatusIn(doctor,new Integer[]{BaseDoorCoachDoctorStatusDO.Status.waitForSend.getType(),
                BaseDoorCoachDoctorStatusDO.Status.waitForAccept.getType(),
                BaseDoorCoachDoctorStatusDO.Status.waitForServe.getType(),
                BaseDoorCoachDoctorStatusDO.Status.serving.getType(),
        });
        if(null == doorDoctorStatusDO){
            result.put(ResponseContant.resultFlag, ResponseContant.fail);
            String failMsg = "当前转派单的医生不存在或禁止接单,doctor:" + doctor;
            result.put(ResponseContant.resultMsg, failMsg);
            logger.error(failMsg);
            return result;
        }
        doorServiceOrderDO.setRemark(remark);
        doorServiceOrderDO.setDoctor(doctor);
        doorServiceOrderDO.setDoctorName(doctorName);
        doorServiceOrderDO.setDoctorType(doctorJobName);
        doorServiceOrderDO.setStatus(BaseDoorCoachOrderDO.Status.waitForAccept.getType());
        doorServiceOrderDO.setUpdateUser(dispatcher);
        doorServiceOrderDO.setUpdateUserName(dispathcherName);
        doorServiceOrderDO.setDispatcherResponseTime(new Date());
        System.out.println(dispathcherName+"医生派单给"+doctorName+"医生");
//        String sql = "DELETE FROM wlyy_door_doctor WHERE order_id ='"+orderId+"' AND doctor = '"+dispatcher+"'";
//        jdbcTemplate.execute(sql);
        this.save(doorServiceOrderDO);
        // 给医生发派单消息
        if(BaseDoorCoachOrderDO.IsTransOtherOrg.yes.getType().equals(doorServiceOrderDO.getIsTransOtherOrg())){
            this.createMessage("服务工单待接单","707",doorServiceOrderDO.getTransedDispatcher(),doorServiceOrderDO.getTransedDispatcherName(), orderId,doctor,doctorName, null,"您有新的服务工单,请前往处理");
        }else{
            this.createMessage("服务工单待接单","707",doorServiceOrderDO.getDispatcher(),doorServiceOrderDO.getDispatcherName(), orderId,doctor,doctorName, null,"您有新的服务工单,请前往处理");
        }
        //发送智能助手消息
        sendWeixinMessage(4,doctor,doorServiceOrderDO.getPatient());
        // 派单时,把医生拉入会话,作为其中一个成员,医生拒单时,退出会话
        ConsultDo consult = consultDao.queryByRelationCode(orderId);
        String sessionId = doorServiceOrderDO.getPatient() + "_" + consult.getId() + "_" + doorServiceOrderDO.getNumber() + "_" + consult.getType();
        imUtill.updateParticipantNew(sessionId,doctor,null);
        messageUtil.updateDoorCoachMessage(doorServiceOrderDO,new String[]{"702","703","730","735"},"731",dispatcher,dispatcher);
        // 工单状态变更记录
        BaseDoorCoachProcessLogDO processLogDO = new BaseDoorCoachProcessLogDO();
        processLogDO.setOrderId(orderId);
        processLogDO.setStatus(BaseDoorCoachOrderDO.Status.waitForAccept.getType());
        processLogDO.setDispatcher(dispatcher);
        processLogDO.setDispatcherName(dispathcherName);
        processLogDO.setCreateTime(new Date());
        baseDoorCoachProcessLogDao.save(processLogDO);
        result.put(ResponseContant.resultFlag, ResponseContant.success);
        result.put(ResponseContant.resultMsg, doorServiceOrderDO);
        // 发送IM消息通知患者医生已派单
        String noticeContent = "已转派"+doorServiceOrderDO.getDoctorName()+"医生为您服务,请耐心等待医生接单";
        this.qucikSendIM(doorServiceOrderDO.getId(), dispatcher, "智能助手","1", noticeContent);
        return result;
    }
    /**
     * 取消工单
     * @param orderId
     * @param type 取消类型
     * @param reason 取消理由
     */
    public JSONObject cancelOrder(String orderId,int type,String reason,String dispatcher,String dispatcherName){
        JSONObject result = new JSONObject();
        BaseDoorCoachOrderDO orderDO = baseDoorCoachOrderDao.findOne(orderId);
        if(null == orderDO){
            result.put(ResponseContant.resultFlag, ResponseContant.fail);
            String failMsg = "【取消工单】该工单不存在:," + orderId;
            result.put(ResponseContant.resultMsg, failMsg);
            logger.error(failMsg);
            return result;
        }
        if(type==2){//v0.5.1 患者仅未支付的订单能取消此时未正式开始工单,未创建咨询
            if(orderDO.getStatus() != BaseDoorCoachOrderDO.Status.waitForPay.getType()){
                result.put(ResponseContant.resultFlag, ResponseContant.fail);
                String failMsg = "无法取消工单,已支付的工单需要到我的订单中进行申请退款," + orderId;
                result.put(ResponseContant.resultMsg, failMsg);
                logger.error(failMsg);
                return result;
            }
            BusinessOrderDO businessOrderDO = businessOrderDao.selectByRelationCode(orderDO.getId());
            businessOrderDO.setStatus(2);
            businessOrderDao.save(businessOrderDO);
        }else{//调度员拒单,此时工单已支付抵达调度员
            try {
                if (orderDO.getStatus() > BaseDoorCoachOrderDO.Status.waitForPay.getType()&&1==orderDO.getPayWay()){
                    BusinessOrderDO businessOrderDO = businessOrderDao.selectByRelationCode(orderDO.getId());
                    if (businessOrderDO!=null){
                        if (1 == businessOrderDO.getStatus()){
                            //退款流程
                            try {
                                payService.dispatcherOrderRefund(businessOrderDO.getOrderNo(),"调度员拒单退款");
                                orderDO.setPayStatus(2);
                            }catch (Exception e){
                                e.printStackTrace();
                                result.put(ResponseContant.resultFlag, ResponseContant.fail);
                                result.put(ResponseContant.resultMsg,"退款失败,无法拒绝工单!");
                                return result;
                            }
                        }
                    }
                }
                //如果是调度员取消,推送IM取消工单json消息,
//                if (StringUtils.isNotBlank(dispatcher)){
//                    if (!consultTeamService.finishConsult(orderDO.getId(),orderDO.getPatient(),dispatcher,2)){
//                        String failMsg = "咨询结束失败 无法取消工单";
//                        result.put(ResponseContant.resultFlag, ResponseContant.fail);
//                        result.put(ResponseContant.resultMsg,failMsg);
//                        return result;
//                    }
//                }
                if(!StringUtils.isEmpty(dispatcher)){
                    orderDO.setDoctor(dispatcher);
                    orderDO.setDoctorName(dispatcherName);
                    orderDO.setDispatcher(dispatcher);
                    orderDO.setDispatcherName(dispatcherName);
                }
                if(type == BaseDoorCoachOrderDO.CancelType.dispatcher.getType()){
                    messageUtil.updateDoorCoachMessage(orderDO,new String[]{"702","703","730"},"732",dispatcher,dispatcher);
                }
                else if(type == BaseDoorCoachOrderDO.CancelType.patient.getType()){                   //居民取消,消息列表也应该不显示
                    messageUtil.updateDoorCoachMessage(orderDO,new String[]{"702","703","730"},"patientCancel",dispatcher,dispatcher);
                }
                ConsultDo consult = consultDao.queryByRelationCode(orderId);
                // 发送微信模板消息,通知居民工单已取消(smyyyqx-上门预约已取消)
                String first = "key1您好,您的上门预约订单已退回,点击查看原因";
                BasePatientDO patient = patientDao.findById(orderDO.getPatient());
                first  = first.replace("key1", null != patient.getName() ? patient.getName() : "");
                JSONObject json = new JSONObject();
                json.put("id", orderDO.getId());
                List<BasePatientWechatDo> basePatientWechatDos = basePatientWechatDao.findByWechatIdAndPatientId(wxId,patient.getId());
                if (basePatientWechatDos.size()>0){
                    String openId = basePatientWechatDos.get(0).getOpenid();
                    messageUtil.putTemplateWxMessage(wxId,"template_process_feedback","smyyyqx",openId,first,null,null,2,json, DateUtil.dateToChineseDate(new Date()),"上门预约已取消","已取消");
                }
            }catch (Exception e){
                e.printStackTrace();
                String failMsg = "退款失败,无法取消工单:," + orderId;
                result.put(ResponseContant.resultMsg, failMsg);
                return result;
            }
        }
        orderDO.setCancelType(type);
        orderDO.setCancelTime(new Date());
        orderDO.setCancelReason(reason);
        orderDO.setStatus(BaseDoorCoachOrderDO.Status.cancel.getType());
        this.save(orderDO);
        //保存取消记录
        BaseDoorCoachCancelLogDO cancelLogDO = new BaseDoorCoachCancelLogDO();
        cancelLogDO.setOrderId(orderId);
        cancelLogDO.setPatient(orderDO.getProxyPatient());
        cancelLogDO.setCancelType(type);
        cancelLogDO.setCancelReason(reason);
        cancelLogDO.setTime(orderDO.getCancelTime());
        baseDoorCoachCancelLogDao.save(cancelLogDO);
        //保存居民确认取消记录
        JSONObject confirmInfo = new JSONObject();
        confirmInfo.put("orderId",orderId);
        confirmInfo.put("patient",orderDO.getProxyPatient());
        confirmInfo.put("patientName",orderDO.getProxyPatientName());
        confirmInfo.put("type",4);
        confirmInfo.put("description",reason);
        JSONObject confirmInfoJson = new JSONObject();
        confirmInfoJson.put("confirmInfo",confirmInfo);
        this.orderWithConfirmLogAdd(result,confirmInfo,orderId);
        // 工单状态变更记录
        BaseDoorCoachProcessLogDO processLogDO = new BaseDoorCoachProcessLogDO();
        processLogDO.setOrderId(orderId);
        processLogDO.setStatus(BaseDoorCoachOrderDO.Status.cancel.getType());
        processLogDO.setDispatcher(dispatcher);
        processLogDO.setDispatcherName(dispatcherName);
        baseDoorCoachProcessLogDao.save(processLogDO);
        result.put(ResponseContant.resultFlag, ResponseContant.success);
        result.put(ResponseContant.resultMsg, "工单服务已取消!");
        return result;
    }
    /**
     * 服务工单居民确认操作日志记录
     *
     * {
     *     "confirmInfo":{
     *         "patient":"",
     *         "patientName":"",
     *         "type":"",
     *         "description":""
     *     }
     * }
     *
     * @param result
     * @param jsonObjectParam
     * @param orderId
     * @return
     */
    @Transactional(rollbackFor = Exception.class)
    public boolean orderWithConfirmLogAdd(JSONObject result, JSONObject jsonObjectParam, String orderId) {
        // 确认信息
        JSONObject confirmInfo = jsonObjectParam.getJSONObject("confirmInfo");
        if (null != confirmInfo) {
            BaseDoorCoachPatientConfirmLogDO confirmLogDO = null;
            try {
                confirmLogDO = EntityUtils.jsonToEntity(confirmInfo.toString(), BaseDoorCoachPatientConfirmLogDO.class);
            } catch (Exception e) {
                result.put(ResponseContant.resultFlag, ResponseContant.fail);
                String failMsg = "工单关联【居民确认操作日志记录】时," + e.getMessage();
                result.put(ResponseContant.resultMsg, failMsg);
                logger.error(failMsg);
                return true;
            }
            confirmLogDO.setOrderId(orderId);
            confirmLogDO.setCreateTime(new Date());
            try {
                patientConfirmLogDao.save(confirmLogDO);
            } catch (Exception e) {
                result.put(ResponseContant.resultFlag, ResponseContant.fail);
                String failMsg = "保存工单关联的【居民确认操作日志记录】时:," + e.getMessage();
                result.put(ResponseContant.resultMsg, failMsg);
                logger.error(failMsg);
                return true;
            }
        }
        return false;
    }
    public void sendWeixinMessage(Integer type,String doctorCode,String patient){
        if (type==3){
            //上门预约申请
            try {
/*                WechatTemplateConfig templateConfig = templateConfigDao.findByScene("template_doctor_survey","zztj");
                org.json.JSONObject sendJson = new org.json.JSONObject();
                Patient patient1 =patientDao.findByCode(patient);
                Doctor doctor = doctorDao.findByCode(doctorCode);
                SignFamily signFamily = signFamilyDao.findByPatient(patient);
                String doctorName = doctor.getName();
                String first =doctorName+"医生,您好!"+patient1.getName()+"提交了上门出诊服务预约,请及时登录PC处理";
                String url = doctorAssistant + "/wlyy/feldsher/sendDoctorTemplates";
                List<NameValuePair> params = new ArrayList<>();
                params.add(new BasicNameValuePair("type", "15"));
                params.add(new BasicNameValuePair("url", targetUrl));
                params.add(new BasicNameValuePair("openId", doctor.getOpenid()));
                params.add(new BasicNameValuePair("first", first));
                params.add(new BasicNameValuePair("remark", templateConfig.getRemark()));
                params.add(new BasicNameValuePair("keywords", "上门预约待派单"));
                params.add(new BasicNameValuePair("keywords", signFamily.getHospitalName()));
                params.add(new BasicNameValuePair("keywords", doctorName));
                httpClientUtil.post(url, params, "UTF-8");
                logger.info("sendJson: " + params);*/
            } catch (Exception e) {
                e.printStackTrace();
            }
        }else if (type==4){
            try {
                //社区调度员指派服务工单给家签医生
/*                WechatTemplateConfig templateConfig = templateConfigDao.findByScene("template_doctor_survey","zztj");
                org.json.JSONObject sendJson = new org.json.JSONObject();
                Doctor doctor = doctorDao.findByCode(doctorCode);
                SignFamily signFamily = signFamilyDao.findByPatient(patient);
                String doctorName = doctor.getName();
                String first =doctorName+"医生,您好!您有新的服务工单,请及时登录APP或PC处理";
                String url = doctorAssistant + "/wlyy/feldsher/sendDoctorTemplates";
                List<NameValuePair> params = new ArrayList<>();
                params.add(new BasicNameValuePair("type", "15"));
                params.add(new BasicNameValuePair("url", targetUrl));
                params.add(new BasicNameValuePair("openId", doctor.getOpenid()));
                params.add(new BasicNameValuePair("first", first));
                params.add(new BasicNameValuePair("remark", templateConfig.getRemark()));
                params.add(new BasicNameValuePair("keywords", "上门预约待接单"));
                params.add(new BasicNameValuePair("keywords", signFamily.getHospitalName()));
                params.add(new BasicNameValuePair("keywords", doctorName));
                httpClientUtil.post(url, params, "UTF-8");
                logger.info("sendJson: " + params);*/
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    /**
     * 调度员进入聊天室
     * @param dispatcher
     * @param orderId
     */
    public JSONObject dispatcherIntoTopic(String orderId, String hospitalName, String dispatcher, String dispatcherName) {
        JSONObject result = new JSONObject();
        BaseDoorCoachOrderDO orderDO = baseDoorCoachOrderDao.findOne(orderId);
        if (null == orderDO) {
            String failMsg = "调度员进入聊天室时,找不到对应工单,工单id=" + orderId;
            result.put(ResponseContant.resultFlag, ResponseContant.fail);
            result.put(ResponseContant.resultMsg, failMsg);
            logger.error(failMsg);
            return result;
        }
        ConsultDo consult = consultDao.queryByRelationCode(orderId);
        String sessionId = orderDO.getPatient() + "_" + consult.getId() + "_"  + orderDO.getNumber() +  "_" +  consult.getType();
        // 把调度员拉入会话,作为其中一个成员,第一个进入会话的调度员,系统发送欢迎语和居民的预约卡片信息
        if (org.apache.commons.lang3.StringUtils.isEmpty(orderDO.getDispatcher())) {
            orderDO.setDispatcher(dispatcher);
            orderDO.setDispatcherName(dispatcherName);
            this.save(orderDO);
            // 先进入会话,再聊天
            imUtill.updateParticipantNew(sessionId,dispatcher,null);
            String noticeContent = hospitalName + dispatcherName + "为您服务";
            this.qucikSendIM(orderId, dispatcher, "智能助手", "1", noticeContent);
        }
        // 把调度员拉入会话,作为其中一个成员
        imUtill.updateParticipantNew(sessionId,dispatcher,null);
        result.put(ResponseContant.resultFlag, ResponseContant.success);
        result.put(ResponseContant.resultMsg, "调度员["+dispatcherName+"]进入会话成功");
        return result;
    }
    /**
     * 工单与服务项费用关联关系
     *
     * @param result
     * @param jsonObjectParam
     * @param order
     * {
     *     "packageItemArr":[
     *     {
     *    "type": null,
     *    "code": null,
     *    "name": null,
     *    "fee": null,
     *    "feeDiscount": null,
     *    "number": null,
     *    "status": null
     *  },
     *     ],
     *     "orderId": null,
     *     "status":""
     * }
     *
     * @return
     */
    @Transactional(rollbackFor = Exception.class)
    public boolean orderWithPackageItemFeeAdd(JSONObject result, JSONObject jsonObjectParam, BaseDoorCoachOrderDO order, String doctorId) {
        List<BaseDoorCoachFeeDetailDO> feeDetailDOList = new ArrayList<>();
        BigDecimal totalFee = order.getTotalFee();
        if(null == totalFee){
            totalFee = new BigDecimal(0);
        }
        //新增服务项
        int addNum = 0;
        //服务项费用
        JSONArray packageItemArray = jsonObjectParam.getJSONArray("packageItemArr");
        if (!CollectionUtils.isEmpty(packageItemArray)) {
            for (Object one : packageItemArray) {
                BaseDoorCoachFeeDetailDO feeDetailDO = null;
                JSONObject oneJson = (JSONObject)one;
                try {
                    feeDetailDO = EntityUtils.jsonToEntity(one.toString(), BaseDoorCoachFeeDetailDO.class);
                } catch (Exception e) {
                    result.put(ResponseContant.resultFlag, ResponseContant.fail);
                    String failMsg = "工单与服务费用关联关系时," + e.getMessage();
                    result.put(ResponseContant.resultMsg, failMsg);
                    logger.error(failMsg);
                    return true;
                }
                try {
                    //工单主表中记录总费用
                    totalFee = totalFee.add(feeDetailDO.getFee().multiply(BigDecimal.valueOf(feeDetailDO.getNumber())));
                } catch (Exception e) {
                    result.put(ResponseContant.resultFlag, ResponseContant.fail);
                    String failMsg = "工单主表中记录总费用时," + e.getMessage();
                    result.put(ResponseContant.resultMsg, failMsg);
                    logger.error(failMsg);
                    return true;
                }
                // 服务项可能一开始由居民预约,后期由医生新增或医生删除
                Integer status = jsonObjectParam.getInteger("status");
                if(null == status || status == 1){
                    feeDetailDO.setStatus(BaseDoorCoachFeeDetailDO.Status.patient.getType());
                }else{
                    feeDetailDO.setStatus(status);
                }
//                feeDetailDO.setNumber(1);
                feeDetailDO.setOrderId(order.getId());
                if(StringUtils.isBlank(feeDetailDO.getId())) {
                    feeDetailDO.setCreateTime(new Date());
                }else {
                    feeDetailDO.setUpdateTime(new Date());
                }
                if(StringUtils.isBlank(feeDetailDO.getId())){
                    feeDetailDO.setPayStatus(0);
                    addNum++;
                    feeDetailDOList.add(feeDetailDO);
                }
            }
            try {
                baseDoorCoachFeeDetailDao.save(feeDetailDOList);
            } catch (Exception e) {
                result.put(ResponseContant.resultFlag, ResponseContant.fail);
                String failMsg = "保存服务费用到数据库异常:," + e.getMessage();
                result.put(ResponseContant.resultMsg, failMsg);
                logger.error(failMsg);
                return true;
            }
        }
        order.setTotalFee(totalFee);
        this.save(order);
        return false;
    }
    public List<Map<String,Object>> queryDispatcherInfoByHospital(String hospital){
        String sql ="    SELECT" +
                "                 d.`code`, " +
                "                 d.`name`, " +
                "                 d.`hospital_name` as hospitalName " +
                "                 FROM " +
                "                 base_doctor_role m " +
                "                 JOIN base_doctor_role_dict r ON m.role_code = r.code " +
                "                 JOIN (select a.id code,a.name,o.org_name hospital_name from base_doctor_hospital o,base_doctor a " +
                " where a.id = o.doctor_code and o.del=1 and o.org_code = '"+hospital+"') as d ON m.doctor_code = d.code" +
                "                 WHERE " +
                "                 r.code = 'dispatcher'";
        return jdbcTemplate.queryForList(sql);
    }
    /**
     * 获取居民所签约的机构的调度员(一个机构可以有多个调度员)
     * doctor中,level -- 11-- 调度员
     * @param hospitalCode
     * @return
     */
    @Transactional(rollbackFor = Exception.class)
    public JSONObject queryDispatcherInfoByPatient(String hospitalCode) {
        JSONObject result = new JSONObject();
        List<Map<String,Object>> dispatcherInfoList = queryDispatcherInfoByHospital(hospitalCode);
        if(CollectionUtils.isEmpty(dispatcherInfoList)){
            result.put(ResponseContant.resultFlag, ResponseContant.fail);
            String failMsg = "当前居民所签约机构【" + hospitalCode + "】没有调度员,请联系管理员分配!";
            result.put(ResponseContant.resultMsg, failMsg);
            logger.error(failMsg);
            return result;
        }
        result.put(ResponseContant.resultFlag, ResponseContant.success);
        result.put(ResponseContant.resultMsg, dispatcherInfoList);
        return result;
    }
    /**
     * 顶部状态栏订单各分类总条数
     * @param patient
     * @return
     */
    public Map<String, Integer> getNumGroupByStatus(String patient) throws Exception {
        String sql = "SELECT a.status, COUNT(DISTINCT a.id) as num FROM base_door_coach_order a  where a.patient = '"+patient+"' group BY a.status " ;
        List<Map<String, Object>> list = jdbcTemplate.queryForList(sql);
        Map<String, Integer> map = new HashMap<>();
        Integer all = 0;
        Integer waitForPay = 0;//待付款
        Integer waitForAccept = 0;//待接单
        Integer waitForServe = 0;//待服务
        Integer served = 0;//已完成
        Integer cancel = 0;//已取消
        // -1已取消 [1,4]待服务 [5,6]已服务
        for (Map<String, Object> tmp:list){
            switch (String.valueOf(tmp.get("status"))){
                case "-1":
                    cancel += Integer.valueOf(tmp.get("num").toString()) ;
                    break;
                case "0":
                    waitForPay += Integer.valueOf(tmp.get("num").toString()) ;
                    break;
                case "1":
                    waitForAccept += Integer.valueOf(tmp.get("num").toString()) ;
                    break;
                case "2":
                    waitForAccept += Integer.valueOf(tmp.get("num").toString()) ;
                    break;
                case "3":
                    waitForServe += Integer.valueOf(tmp.get("num").toString()) ;
                    break;
                case "4":
                    waitForServe += Integer.valueOf(tmp.get("num").toString()) ;
                    break;
                case "5":
                    waitForServe += Integer.valueOf(tmp.get("num").toString()) ;
                    break;
                case "6":
                    served += Integer.valueOf(tmp.get("num").toString()) ;
                    break;
                default: {
                    throw new Exception("类型错误!"+String.valueOf(tmp.get("status")));
                }
            }
        }
        all = waitForPay+waitForAccept+waitForServe+served+cancel;
        map.put("all",all);
        map.put("waitForPay",waitForPay);
        map.put("waitForAccept",waitForAccept);
        map.put("waitForServe",waitForServe);
        map.put("served",served);
        map.put("cancel",cancel);
        return map;
    }
    /**
     *
     * @param orderId
     * @param patientName
     * @param patientPhone
     * @param hospitalCode
     * @param status
     * @param createTimeStart
     * @param createTimeEnd
     * @param serverDoctorName
     * @param patientId
     * @param page
     * @param pageSize
     * @param type
     * @return
     * @throws Exception
     */
    public JSONObject getDoorOrderList(String orderId, String patientName, String patientPhone, String hospitalCode,
                                       StringBuffer status, String createTimeStart, String createTimeEnd, String serverDoctorName,
                                       String patientId, Integer page, Integer pageSize, Integer type)throws Exception{
        String sqlList = "select DISTINCT o.id as orderId,o.status,h.code orgCode,h.name as orgName,o.is_trans_other_org," +
                "o.transed_org_code, o.patient_name, o.patient_phone,o.remark,o.serve_desc,o.create_time,o.patient as patientCode," +
                "o.exam_paper_status as examPaperStatus,o.number as serverCode,o.total_fee,h.org_level as hosLevel, o.doctor," +
                "o.doctor_name as doctorName, o.doctor_type as doctorType"
                ;
        String sqlCount = " select count(DISTINCT o.id) as total ";
        String sql = " from base_door_coach_order o LEFT JOIN base_org h on h.code=o.hospital and h.del=1 where 1=1";
        if(!org.apache.commons.lang.StringUtils.isEmpty(orderId)){
            sql+=" and o.number = '"+orderId+"'";
        }
        if(!org.apache.commons.lang.StringUtils.isEmpty(patientName)){
            sql+=" and o.patient_name like '%"+patientName+"%'";
        }
        if(!org.apache.commons.lang.StringUtils.isEmpty(patientPhone)){
            sql+=" and o.patient_phone ='"+patientPhone+"'";
        }
        if(!org.apache.commons.lang.StringUtils.isEmpty(hospitalCode)&&!"350200%".equals(hospitalCode)){
            sql+=" and (o.hospital like '"+hospitalCode+"' or o.transed_org_code like '"+hospitalCode+"') ";
        }
        if(status!=null){
            sql+=" and o.status in ("+status+")";
        }
        if(!org.apache.commons.lang.StringUtils.isEmpty(createTimeStart)){
            sql+=" and o.create_time >='"+createTimeStart+"'";
        }
        if(!org.apache.commons.lang.StringUtils.isEmpty(createTimeEnd)){
            sql+=" and o.create_time <='"+createTimeEnd+"'";
        }
        if(!org.apache.commons.lang.StringUtils.isEmpty(serverDoctorName)){
            sql+=" and o.doctor_name like '%"+serverDoctorName+"%'";
        }
        //获取医生代预约记录
        if (type!=null){
            sql += " and o.type = " + type +" ";
        }
        if(org.apache.commons.lang.StringUtils.isNotBlank(patientId)){
            sql += " and o.patient= '"+patientId+"' ";
        }
        List<Map<String,Object>> rstotal = jdbcTemplate.queryForList(sqlCount+sql);
        sql+=" order by o.create_time desc LIMIT "+(page-1)*pageSize+","+pageSize;
        List<Map<String,Object>> list = jdbcTemplate.queryForList(sqlList+sql);
        Long count = 0L;
        if(rstotal!=null&&rstotal.size()>0){
            count = (Long) rstotal.get(0).get("total");
        }
        JSONArray jsonArray = new JSONArray();
        for(Map<String,Object> one:list){
            JSONObject object = new JSONObject();
            object.put("id",one.get("orderId"));
            object.put("serverCode",one.get("serverCode"));
            Integer statustemp = Integer.valueOf(one.get("status")+"");
            String statusName = "";
            switch (statustemp){
                case -1:statusName="已取消";break;
                case 0:statusName="待付款";break;
                case 1:statusName="待接单";break;
                case 2:statusName="待接单";break;
                case 3:statusName="待服务";break;
                case 4:statusName="待服务";break;
                case 5:statusName="待服务";break;
                case 6:statusName="已完成";break;
            }
            object.put("status",statustemp);
            object.put("statusName",statusName);
            //工单是否转给其他机构,0-不转,1-已转
            String transOtherOrg = one.get("is_trans_other_org")+"";
            Object hospitalName = null;
            Object hospital = null;
            hospital = one.get("orgCode");
            hospitalName = one.get("orgName");//签约表中的机构
            object.put("hospital",hospital);
            object.put("hospitalName",hospitalName);
            object.put("patient",one.get("patientCode"));
            object.put("patientName",one.get("patient_name"));
            object.put("patientPhone",one.get("patient_phone"));
            object.put("remark",one.get("remark"));
            object.put("serveDesc",one.get("serve_desc"));
            object.put("hosLevel",one.get("hosLevel"));
            Date date = (Date)one.get("create_time");
            object.put("createTime",DateUtil.dateToStrLong(date));
            object.put("examPaperStatus",one.get("examPaperStatus"));
            object.put("totalFee",one.get("total_fee"));
            List<BaseDoorCoachFeeDetailDO> feeDetailDOs = doorFeeDetailDao.findByOrderIdAndType(one.get("orderId")+"", 1);
            List<Map<String,Object>> feeDetailResultList = new ArrayList();
            for(BaseDoorCoachFeeDetailDO d:feeDetailDOs){
                Map<String,Object> map = new HashMap<>();
                map.put("code",d.getCode());
                map.put("name",d.getName());
                map.put("fee",d.getFee());
                map.put("number",d.getNumber());
                feeDetailResultList.add(map);
            }
            object.put("feeDetailResultList",feeDetailResultList);
            // 获取或者基本信息
            BasePatientDO patient = patientInfoService.findById(String.valueOf(one.get("patientCode")));
            if (patient != null) {
                object.put("sex", IdCardUtil.getSexForIdcard(patient.getIdcard()));
                object.put("age", IdCardUtil.getAgeByIdcardOrBirthday(patient.getIdcard(),patient.getBirthday()));
                object.put("photo", patient.getPhoto());
//                object.put("typeValue", "儿童");
            }
            String id = one.get("orderId").toString();
            BaseDoorCoachOrderDO doorServiceOrder = this.baseDoorCoachOrderDao.findOne(id);
            //获取咨询
            ConsultDo consult = consultDao.queryByRelationCode(id);
            if (null != consult) {
                doorServiceOrder.setSessionId(doorServiceOrder.getPatient() + "_" + consult.getId() + "_"  + doorServiceOrder.getNumber() +  "_" +  consult.getType());
            }
            object.put("sessionId",doorServiceOrder.getSessionId());
            // 获取服务次数
            Integer serviceCount = doctorDoorCoachOrderService.serviceCount(doorServiceOrder.getPatient());
            object.put("serviceCount", serviceCount);
            //添加服务医生
            object.put("doctorName", doorServiceOrder.getDoctorName());
            object.put("doctorType", doorServiceOrder.getDoctorType());
            object.put("type", doorServiceOrder.getType());
            jsonArray.add(object);
        }
        JSONObject object = new JSONObject();
        object.put("total",count);
        object.put("detailModelList",jsonArray);
        object.put("currPage",page);
        object.put("pageSize",pageSize);
        return object;
    }
    @Transactional(rollbackFor = Exception.class)
    public JSONObject updateOrderCardInfo(String jsonData){
        JSONObject result = new JSONObject();
        JSONObject jsonObjectParam;
        try {
            jsonObjectParam = JSONObject.parseObject(jsonData);
        } catch (Exception e) {
            result.put(ResponseContant.resultFlag, ResponseContant.fail);
            String failMsg = "参数转换成JSON对象异常:" + e.getMessage();
            result.put(ResponseContant.resultMsg, failMsg);
            logger.error(failMsg);
            return result;
        }
        BaseDoorCoachOrderDO wlyyDoorServiceOrder = baseDoorCoachOrderDao.findOne(jsonObjectParam.getString("orderId"));
        wlyyDoorServiceOrder.setPatientName(jsonObjectParam.getString("patientName"));
        // 居民电话
        if(!StringUtils.isEmpty(jsonObjectParam.getString("phone"))){
            wlyyDoorServiceOrder.setPatientPhone(jsonObjectParam.getString("phone"));
        }
        // 医生预计达到时间
        if(!StringUtils.isEmpty(jsonObjectParam.getString("doctorArrivingTime"))){
            wlyyDoorServiceOrder.setDoctorArrivingTime(jsonObjectParam.get("doctorArrivingTime").toString());
        }
        // 居民期望服务时间
        if(!StringUtils.isEmpty(jsonObjectParam.getString("patientExpectedServeTime"))){
            wlyyDoorServiceOrder.setPatientExpectedServeTime(jsonObjectParam.get("patientExpectedServeTime").toString());
        }
        // 服务区
        if(!StringUtils.isEmpty(jsonObjectParam.getString("serveTown"))){
            wlyyDoorServiceOrder.setServeTown(jsonObjectParam.getString("serveTown"));
        }
        // 服务地址
        if(!StringUtils.isEmpty(jsonObjectParam.getString("serveAddress"))){
            wlyyDoorServiceOrder.setServeAddress(jsonObjectParam.getString("serveAddress"));
        }
        wlyyDoorServiceOrder.setServeAddress(jsonObjectParam.getString("serveAddress"));
        if(!StringUtils.isEmpty(jsonObjectParam.getString("serveLat"))){
            wlyyDoorServiceOrder.setServeLat(jsonObjectParam.getString("serveLat"));
        }
        if(!StringUtils.isEmpty(jsonObjectParam.getString("serveLon"))){
            wlyyDoorServiceOrder.setServeLon(jsonObjectParam.getString("serveLon"));
        }
        // 服务描述
        if(!StringUtils.isEmpty(jsonObjectParam.getString("serveDesc"))){
            wlyyDoorServiceOrder.setServeDesc(jsonObjectParam.getString("serveDesc"));
        }
        //服务类型    医生端和居民端公用接口
        if(!StringUtils.isEmpty(jsonObjectParam.getString("serviceStatus"))){
            wlyyDoorServiceOrder.setServiceStatus(jsonObjectParam.getString("serviceStatus"));
        }else {
            wlyyDoorServiceOrder.setServiceStatus("1");//默认为1  预约项目
        }
//        wlyyDoorServiceOrder.setIsPatientConfirm(WlyyDoorServiceOrderDO.IsPatientConfirm.yes.getType());
//        wlyyDoorServiceOrder.setPatientConfirmTime(new Date());
        this.save(wlyyDoorServiceOrder);
        //新增工单居民确认操作日志记录
        if (orderWithConfirmLogAdd(result, jsonObjectParam, wlyyDoorServiceOrder.getId())) {return result;}
        result.put(ResponseContant.resultFlag, ResponseContant.success);
        result.put(ResponseContant.resultMsg, wlyyDoorServiceOrder);
        //发送 预约卡片信息(2101类型)
        JSONObject orderInfoContent = this.queryOrderCardInfo(wlyyDoorServiceOrder);
        orderInfoContent.put("re_msg_type",1);//医生修改待确认
        this.qucikSendIM(wlyyDoorServiceOrder.getId(), wlyyDoorServiceOrder.getDispatcher(), "智能助手", "2201", orderInfoContent.toJSONString());
        return result;
    }
    /**
     * 添加【工单派单,转单】等系统消息
     */
    public void createMessage(String title,String type,String sender,String senderName,String relationCode,String Receiver,String ReceiverName,String idCard,String msg){
        SystemMessageDO messageDO = new SystemMessageDO();
        messageDO.setTitle(title);
        messageDO.setType(type);//401为资质申请审核
        messageDO.setSender(sender);
        messageDO.setSenderName(senderName);
        messageDO.setRelationCode(relationCode);
        messageDO.setReceiver(Receiver);
        messageDO.setReceiverName(ReceiverName);
        messageDO.setOver("1");
        messageDO.setData(msg);
        messageDO.setDel("1");
        messageDO.setCreateTime(new Date());
        systemMessageDao.save(messageDO);
    }
    /**
     * 统计居民已经服务的次数
     * @param patient
     * @return
     */
    public Integer countPatientDoorTimes(String patient){
        Integer count = 0;
        String sql = "SELECT count(o.id) as count FROM base_door_coach_order o where  o.patient = '" + patient + "' and status>="+BaseDoorCoachOrderDO.Status.waitForCommnet.getType();
        count = jdbcTemplate.queryForObject(sql,Integer.class);
        return count;
    }
    private String getRandomIntStr(){
        Random rand = new Random();
        int i = rand.nextInt(); //int范围类的随机数
        i = rand.nextInt(100); //生成0-100以内的随机数
        i = (int)(Math.random() * 100000000); //0-100以内的随机数,用Matn.random()方式
        return String.valueOf(i);
    }
}

+ 18 - 11
svr/svr-cloud-care/src/main/java/com/yihu/jw/care/service/assistance/EmergencyAssistanceService.java

@ -138,7 +138,7 @@ public class EmergencyAssistanceService extends BaseJpaService<EmergencyAssistan
     * @param jsonData
     * @return
     */
    public JSONObject newOrder(String patient,String jsonData,String proxyPatient,Integer orderSource) throws Exception{
    public JSONObject newOrder(String patient,String jsonData,String proxyPatient,Integer orderSource,String agent) throws Exception{
        JSONObject result = new JSONObject();
        EmergencyAssistanceDO assistanceDO = JSON.parseObject(jsonData,EmergencyAssistanceDO.class);
        BasePatientDO patientDO = patientDao.findById(patient);
@ -167,7 +167,16 @@ public class EmergencyAssistanceService extends BaseJpaService<EmergencyAssistan
            assistanceDO.setType(1);
        }
        else{
            if(patient.equals(proxyPatient)) {//本人发起
            if(StringUtils.isNotBlank(agent)){
                BasePatientDO agentPatient = patientDao.findById(agent);
                if (null!=agentPatient){
                    assistanceDO.setProxyPatient(agentPatient.getId());
                    assistanceDO.setProxyPatientName(agentPatient.getName());
                    assistanceDO.setProxyPatientPhone(agentPatient.getMobile());
                }
                assistanceDO.setType(4);
            }
            else if(patient.equals(proxyPatient)) {//本人发起
                assistanceDO.setProxyPatient(patient);
                assistanceDO.setProxyPatientName(patientDO.getName());
                assistanceDO.setProxyPatientPhone(patientDO.getMobile());
@ -215,7 +224,7 @@ public class EmergencyAssistanceService extends BaseJpaService<EmergencyAssistan
        }
        assistanceDO = emergencyAssistanceDao.save(assistanceDO);
        //创建im会话  紧急救助咨询的sessionid  为居民code+(wlyy_consult_team表consult)+20
        JSONObject IMObj = consultTeamService.addServiceConsult(assistanceDO.getId(),patient,proxyPatient,null);
        JSONObject IMObj = consultTeamService.addServiceConsult(assistanceDO.getId(),patient,agent,null);
        String sessionId=patient+"_"+ IMObj.getJSONObject("resultMsg").getString("consult") + "_20";
        assistanceDO.setSessionId(sessionId);
        //向会话中发送一条消息
@ -241,10 +250,8 @@ public class EmergencyAssistanceService extends BaseJpaService<EmergencyAssistan
                if (StringUtils.isNotBlank(doctorDO.getMobile())){
                    messageUtil.sendTXYSJson("1099807",doctorDO.getMobile(),assistanceDO.getPatientName(),"紧急呼叫");
                }
                imUtill.sendMDTSocketMessageToDoctor(doctorDO.getId(),message.toString());
            }catch (Exception e){
                e.printStackTrace();
            }
            }catch (Exception e){}
            imUtill.sendMDTSocketMessageToDoctor(doctorDO.getId(),message.toString());
        }
        //pc管理端端推送消息
        imUtill.sendPcManageMessageToPc("cloudCare_pcManage",message.toString());
@ -459,14 +466,14 @@ public class EmergencyAssistanceService extends BaseJpaService<EmergencyAssistan
            if (StringUtils.isBlank(doctorDO.getDoctorLat()) || StringUtils.isBlank(doctorDO.getDoctorLon())) {
                continue;
            }
            double distanceTmp = countDistance.getDistance(Double.parseDouble(assistanceDO.getServeLat()),Double.parseDouble(assistanceDO.getServeLon()),Double.parseDouble(doctorDO.getDoctorLat()),Double.parseDouble(doctorDO.getDoctorLon()));
//            double distanceTmp = countDistance.getDistance(Double.parseDouble(assistanceDO.getServeLat()),Double.parseDouble(assistanceDO.getServeLon()),Double.parseDouble(doctorDO.getDoctorLat()),Double.parseDouble(doctorDO.getDoctorLon()));
            otherDoctorDistanceObj = new JSONObject();
            otherDoctorDistanceObj.put("doctor",doctorDO.getId());
            otherDoctorDistanceObj.put("doctorName",doctorDO.getName());
            otherDoctorDistanceObj.put("doctorAddress",doctorDO.getDoctorLocateAddress());
            otherDoctorDistanceObj.put("doctorLon",doctorDO.getDoctorLon());
            otherDoctorDistanceObj.put("doctorLat",doctorDO.getDoctorLat());
            otherDoctorDistanceObj.put("distance",distanceTmp);//两点距离
            otherDoctorDistanceObj.put("distance",null);//两点距离
            otherDoctorDistance.add(otherDoctorDistanceObj);
            origins.append(doctorDO.getDoctorLat()+","+doctorDO.getDoctorLon()+"|");
        }
@ -954,7 +961,7 @@ public class EmergencyAssistanceService extends BaseJpaService<EmergencyAssistan
        return result;
    }
    public JSONObject sendQuickMessage(String orderId,String patient,String content){
    public JSONObject sendQuickMessage(String orderId,String patient,String content,String agent){
        JSONObject result = new JSONObject();
        ConsultTeamDo consultTeam = consultTeamDao.queryByRelationCode(orderId);
        BasePatientDO patientDO = patientDao.findById(patient);
@ -965,7 +972,7 @@ public class EmergencyAssistanceService extends BaseJpaService<EmergencyAssistan
            return result;
        }
        if (consultTeam!=null){
            String response = imUtill.sendTopicIM(patient,patientDO.getName(),consultTeam.getConsult(),"1",content,null);
            String response = imUtill.sendTopicIM(patient,patientDO.getName(),consultTeam.getConsult(),"1",content,agent);
            JSONObject jsonObject = JSONObject.parseObject(response);
            if (jsonObject.getInteger("status")==200){
                result.put(ResponseContant.resultFlag, ResponseContant.success);

+ 2 - 4
svr/svr-cloud-care/src/main/java/com/yihu/jw/care/service/consult/ConsultService.java

@ -2,7 +2,6 @@ package com.yihu.jw.care.service.consult;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.yihu.jw.care.dao.course.DoctorPatientTmpDao;
import com.yihu.jw.care.util.EntranceUtil;
import com.yihu.jw.doctor.dao.BaseDoctorDao;
import com.yihu.jw.doctor.dao.BaseDoctorHospitalDao;
@ -12,7 +11,6 @@ import com.yihu.jw.entity.base.im.ConsultDo;
import com.yihu.jw.entity.base.im.ConsultTeamDo;
import com.yihu.jw.entity.base.im.ConsultTeamDoctorDo;
import com.yihu.jw.entity.base.patient.BasePatientDO;
import com.yihu.jw.entity.care.course.DoctorPatientTmpDO;
import com.yihu.jw.entity.hospital.consult.WlyyHospitalSysDictDO;
import com.yihu.jw.entity.hospital.message.SystemMessageDO;
import com.yihu.jw.hospital.message.dao.SystemMessageDao;
@ -498,7 +496,7 @@ public class ConsultService {
     * @return
     * @throws Exception
     */
    public JSONObject addTeamConsult(ConsultTeamDo ct, String patient, String doctor, String source) throws Exception {
    public JSONObject addTeamConsult(ConsultTeamDo ct, String patient, String doctor, String source,String agent) throws Exception {
        JSONObject re = new JSONObject();
        boolean boo = StringUtils.isEmpty(getUnfinishedConsult(patient, doctor,ct.getType()));
        logger.info("boo"+boo);
@ -558,7 +556,7 @@ public class ConsultService {
        jsonObject.put("name",tempPatient.getName());
        //推送给IM去创建议题,取得成员消息
        JSONObject messages = imUtil.getCreateTopicMessage(patient, tempPatient.getName(), consult.getTitle(), jsonObject.toJSONString(), consult.getImages(), doctor);
        JSONObject messages = imUtil.getCreateTopicMessage(patient, tempPatient.getName(), consult.getTitle(), jsonObject.toJSONString(), consult.getImages(), agent);
        users.put(patient, 0);
        users.put(doctor, 0);
        String session_type = ct.getType()+"";//SESSION_TYPE

+ 21 - 7
svr/svr-cloud-care/src/main/java/com/yihu/jw/care/service/consult/ConsultTeamService.java

@ -146,7 +146,7 @@ public class ConsultTeamService {
     * @return
     * @throws Exception
     */
    public JSONObject addServiceConsult(String orderId,String patient,String proxyPatient,String symptoms) throws Exception {
    public JSONObject addServiceConsult(String orderId,String patient,String agent,String symptoms) throws Exception {
        JSONObject result = new JSONObject();
        // 判断居民是否已经签约
@ -197,14 +197,22 @@ public class ConsultTeamService {
        JSONObject participants = new JSONObject();
        participants.put(patient, 0);
        JSONArray familyArr =  familyMemberService.getPatientMembers(patient,null,null,null,null);
        JSONArray agentFamilyArr =  familyMemberService.getPatientMembers(patient,null,null,null,"3");
        for (int i=0;i<familyArr.size();i++){
            JSONObject tmp = familyArr.getJSONObject(i);
            String patientId = tmp.getString("id");
            if (patient.equals(patientId)){
                continue;
            }
            participants.put(patientId, 0);//家庭成员拉入会话
        }
        for (int i=0;i<agentFamilyArr.size();i++){//创建家属系统消息
            JSONObject tmp = familyArr.getJSONObject(i);
            String patientId = tmp.getString("id");
            if (patient.equals(patientId)){
                continue;
            }
            String name = tmp.getString("name");
            //创建家属系统消息
            SystemMessageDO messageDO = new SystemMessageDO();
            messageDO.setTitle("紧急救助");
            messageDO.setType("50");//50 紧急预警通知
@ -220,7 +228,6 @@ public class ConsultTeamService {
            messageDO.setIsRead("0");
            messageDO.setCreateTime(new Date());
            systemMessageDao.save(messageDO);
            participants.put(patientId, 0);
        }
        //加入团队医生
@ -230,7 +237,7 @@ public class ConsultTeamService {
        }
        String content = patientDO.getName() + "发起紧急救助申请";
        JSONObject messages = imUtill.getCreateTopicMessage(patient, patientDO.getName(), consult.getTitle(), content, consult.getImages(), "");
        JSONObject messages = imUtill.getCreateTopicMessage(patient, patientDO.getName(), consult.getTitle(), content, consult.getImages(), agent);
        JSONObject imResponseJson = imUtill.createTopics(sessionId, consult.getId(), content, participants, messages, ImUtil.SESSION_TYPE_EMERGENCY_ASSISTANCE);
        if (imResponseJson == null || imResponseJson.getInteger("status") == -1) {
@ -351,7 +358,7 @@ public class ConsultTeamService {
     * @return
     * @throws Exception
     */
    public JSONObject addSecurityMoConsult(String orderId,String patient,String proxyPatient,String symptoms) throws Exception {
    public JSONObject addSecurityMoConsult(String orderId,String patient,String agent,String symptoms) throws Exception {
        JSONObject result = new JSONObject();
        // 判断居民是否已经签约
@ -403,6 +410,15 @@ public class ConsultTeamService {
        participants.put(patient, 0);
        //家属
        JSONArray familyArr =  familyMemberService.getPatientMembers(patient,null,null,null,null);
        JSONArray agentFamilyArr =  familyMemberService.getPatientMembers(patient,null,null,null,"3");
        for (int i=0;i<familyArr.size();i++){
            JSONObject tmp = familyArr.getJSONObject(i);
            String patientId = tmp.getString("id");
            if (patient.equals(patientId)){
                continue;
            }
            participants.put(patientId, 0);
        }
        for (int i=0;i<familyArr.size();i++){
            JSONObject tmp = familyArr.getJSONObject(i);
            String patientId = tmp.getString("id");
@ -426,10 +442,8 @@ public class ConsultTeamService {
            messageDO.setIsRead("0");
            messageDO.setCreateTime(new Date());
            systemMessageDao.save(messageDO);
            participants.put(patientId, 0);
        }
        //加入团队医生
        List<Map<String,Object>> doctorList = servicePackageService.fingdDoctorByPaitenId(patient);
        for(Map<String,Object> map:doctorList){

+ 2 - 0
svr/svr-cloud-care/src/main/java/com/yihu/jw/care/service/device/PatientDeviceService.java

@ -293,6 +293,8 @@ public class PatientDeviceService extends BaseJpaService<DevicePatientDevice, Pa
            if ("16".equals(type)) {   //判断设备是不是拐杖,如果是拐杖,需要保存围栏地址
                devicePatientDevice.setSafeAreaGz(safeAreaGz);
            }
            DeviceDetail deviceDetail = deviceDetailDao.findBySn(sn);
            devicePatientDevice.setDeviceType(deviceDetail.getDeviceType());
            patientDeviceDao.save(devicePatientDevice);
        }else {

+ 1 - 1
svr/svr-cloud-care/src/main/java/com/yihu/jw/care/service/device/YunXunDeviceService.java

@ -41,7 +41,7 @@ public class YunXunDeviceService {
        if(!StringUtil.isBlank(phone3)){
            order += ","+phone3;
        }
        String instruction = "[IC*"+sn+"*"+hex10To16(order.length())+"]";
        String instruction = "[IC*"+sn+"*"+hex10To16(order.length())+"*"+order+"]";
        sendInstruction(sn,instruction);
    }

+ 3 - 3
svr/svr-cloud-care/src/main/java/com/yihu/jw/care/service/doorCoach/DoctorDoorCoachOrderService.java

@ -406,7 +406,7 @@ public class DoctorDoorCoachOrderService {
        try {
            BaseAdminServiceDynamic adminServiceDynamic = new BaseAdminServiceDynamic();
            adminServiceDynamic.setCreateTime(DateUtil.getTime());
            adminServiceDynamic.setCreateTime(new Date());
            adminServiceDynamic.setName(doorServiceOrder.getPatientName());
            adminServiceDynamic.setPatient(doorServiceOrder.getPatient());
            adminServiceDynamic.setDoctor(doorServiceOrder.getDoctor());
@ -511,7 +511,7 @@ public class DoctorDoorCoachOrderService {
        try {
            BaseAdminServiceDynamic baseAdminServiceDynamic = new BaseAdminServiceDynamic();
            baseAdminServiceDynamic.setCreateTime(DateUtil.getTime());
            baseAdminServiceDynamic.setCreateTime(new Date());
            baseAdminServiceDynamic.setName(doorServiceOrder.getPatientName());
            baseAdminServiceDynamic.setPatient(doorServiceOrder.getPatient());
            baseAdminServiceDynamic.setDoctor(doorServiceOrder.getDoctor());
@ -642,7 +642,7 @@ public class DoctorDoorCoachOrderService {
            baseAdminServiceDynamic.setDoctor(one.getDoctor());
            baseAdminServiceDynamic.setPatient(one.getPatient());
            baseAdminServiceDynamic.setName(one.getPatientName());
            baseAdminServiceDynamic.setCreateTime(DateUtil.getTime());
            baseAdminServiceDynamic.setCreateTime(new Date());
            baseAdminServiceDynamicDao.save(baseAdminServiceDynamic);
        }catch (Exception e){
            logger.info(e.getMessage());

+ 1 - 1
svr/svr-cloud-care/src/main/java/com/yihu/jw/care/service/doorCoach/PatientDoorCoachOrderService.java

@ -203,7 +203,7 @@ public class PatientDoorCoachOrderService extends BaseJpaService<BaseDoorCoachOr
            baseAdminServiceDynamic.setPatient(orderDO.getPatient());
            baseAdminServiceDynamic.setType(1);
            baseAdminServiceDynamic.setValue("创建了上门辅导申请");
            baseAdminServiceDynamic.setCreateTime(DateUtil.getTime());
            baseAdminServiceDynamic.setCreateTime(new Date());
            baseAdminServiceDynamic.setName(orderDO.getNumber());
            baseAdminServiceDynamicDao.save(baseAdminServiceDynamic);
        }catch (Exception e) {

+ 7 - 0
svr/svr-cloud-care/src/main/java/com/yihu/jw/care/service/family/PatientFamilyMemberService.java

@ -856,6 +856,13 @@ public class PatientFamilyMemberService extends BaseJpaService<BasePatientFamily
            patientDao.save(m);
        }
        member = m.getId();
        if(archiveType==3){
            if(m.getArchiveType()==null){
                m.setArchiveType(archiveType);
            }else if(m.getArchiveType()!=3){
                return -8;
            }
        }
        return addMemberFamily(p, m, patient, member, relation);
    }

+ 13 - 7
svr/svr-cloud-care/src/main/java/com/yihu/jw/care/service/lifeCare/LifeCareOrderService.java

@ -137,7 +137,7 @@ public class LifeCareOrderService extends BaseJpaService<LifeCareOrderDO, LifeCa
        try {
            BaseAdminServiceDynamic baseAdminServiceDynamic = new BaseAdminServiceDynamic();
            baseAdminServiceDynamic.setCreateTime(DateUtil.getTime());
            baseAdminServiceDynamic.setCreateTime(new Date());
            baseAdminServiceDynamic.setType(2);
            baseAdminServiceDynamic.setNumber(lifeCareOrderDO.getNumber());
            baseAdminServiceDynamic.setValue("完成了生活照料");
@ -490,7 +490,7 @@ public class LifeCareOrderService extends BaseJpaService<LifeCareOrderDO, LifeCa
     * @return
     */
    @Transactional(rollbackFor = Exception.class)
    public JSONObject create(String jsonData,String proxyPatient) {
    public JSONObject create(String jsonData,String proxyPatient,String agent) {
        logger.info("申请生活照料jsonData参数:" + jsonData);
        JSONObject result = new JSONObject();
        JSONObject jsonObjectParam;
@ -533,7 +533,15 @@ public class LifeCareOrderService extends BaseJpaService<LifeCareOrderDO, LifeCa
                            DateUtil.dateToChineseDate(new Date()),"助老员已为您代预约生活照料","待支付");
                }
            }
            if(StringUtils.isNotBlank(agent)){
                BasePatientDO agentPatient = patientDao.findById(agent);
                if (null!=agentPatient){
                    orderDO.setProxyPatient(agent);
                    orderDO.setProxyPatientPhone(agentPatient.getPhone());
                    orderDO.setProxyPatientName(agentPatient.getName());
                }
                orderDO.setType(4);
            }
        } catch (Exception e) {
            e.printStackTrace();
            result.put(ResponseContant.resultFlag, ResponseContant.fail);
@ -578,7 +586,7 @@ public class LifeCareOrderService extends BaseJpaService<LifeCareOrderDO, LifeCa
            baseAdminServiceDynamic.setDoctor(orderDO.getDoctor());
            baseAdminServiceDynamic.setPatient(orderDO.getPatient());
            baseAdminServiceDynamic.setNumber(orderDO.getPatientName());
            baseAdminServiceDynamic.setCreateTime(DateUtil.getTime());
            baseAdminServiceDynamic.setCreateTime(new Date());
            baseAdminServiceDynamicDao.save(baseAdminServiceDynamic);
        } catch (Exception e) {
            logger.info(e.getMessage());
@ -608,9 +616,7 @@ public class LifeCareOrderService extends BaseJpaService<LifeCareOrderDO, LifeCa
                if (StringUtils.isNotBlank(doctorDO.getMobile())){
                    messageUtil.sendTXYSJson("1099805",doctorDO.getMobile(),orderDO.getPatientName());
                }
            }catch (Exception e){
                e.printStackTrace();
            }
            }catch (Exception e){}
        }
        return result;

+ 13 - 5
svr/svr-cloud-care/src/main/java/com/yihu/jw/care/service/message/PatientMessageService.java

@ -83,12 +83,16 @@ public class PatientMessageService {
     *50 紧急预警系统消息
     *
     */
    public List<Map<String,Object>> getSystemMessage(String patient){
    public List<Map<String,Object>> getSystemMessage(String patient,String agent){
        patient = "'"+patient+"'";
        if (StringUtils.isNotBlank(agent)){
            patient +=",'"+agent+"'";
        }
        String sql = " select A.*,B.notRead from " +
                "(select  count(1) as 'all',type,DATE_FORMAT(create_time,'%Y-%m-%d %H:%i:%S') create_time " +
                "from base_system_message where receiver = '"+patient+"' and del=1  GROUP BY type ORDER BY create_time desc)A " +
                "from base_system_message where receiver in("+patient+") and del=1  GROUP BY type ORDER BY create_time desc)A " +
                "LEFT JOIN (select count(1) notRead,type " +
                "from base_system_message where receiver = '"+patient+"' and is_read=0 and del=1  GROUP BY type)B on A.type = B.type " +
                "from base_system_message where receiver in("+patient+") and is_read=0 and del=1  GROUP BY type)B on A.type = B.type " +
                "ORDER BY A.create_time desc ";
        return jdbcTemplate.queryForList(sql);
    }
@ -103,10 +107,14 @@ public class PatientMessageService {
     *
     * @return
     */
    public List<Map<String,Object>> getSystemMessageList(String patient,String type,String isRead){
    public List<Map<String,Object>> getSystemMessageList(String patient,String type,String isRead,String agent){
        patient = "'"+patient+"'";
        if (StringUtils.isNotBlank(agent)){
            patient +=",'"+agent+"'";
        }
        String typeIn = " '"+type.replace(",","','")+"' ";
        String sql = " select id,title,type,relation_code,sender,content,sender_name,is_read,code,DATE_FORMAT(create_time,'%Y-%m-%d %H:%i:%S') create_time,data " +
                "from base_system_message where receiver = '"+patient+"' and del=1 and type in ("+typeIn+" )  " ;
                "from base_system_message where receiver in ("+patient+") and del=1 and type in ("+typeIn+" )  " ;
        if (StringUtils.isNotBlank(isRead)){
            if ("1".equals(isRead)){
                sql += " and is_read = '1'";

+ 26 - 2
svr/svr-cloud-care/src/main/java/com/yihu/jw/care/service/patient/CarePatientService.java

@ -129,12 +129,36 @@ public class CarePatientService extends BaseJpaService<BasePatientDO, BasePatien
    /**
     * 居民id
     * @param patientId
     * @param agent 代理人id
     * @param patientId 查看居民id
     * @return
     */
    public JSONObject findPatientById(String patientId,String isCapacity) throws Exception{
    public JSONObject findPatientById(String patientId,String agent,String isCapacity) throws Exception{
        JSONObject res = new JSONObject();
        BasePatientDO patientDO = patientDao.findById(patientId);
        if(StringUtils.isNotBlank(agent)||(patientDO.getArchiveType()!=null&&patientDO.getArchiveType()==3)){
            if (StringUtils.isNotBlank(agent)){
                patientDO = patientDao.findById(agent);
            }
            //老人亲属
            String sql = "SELECT p.* from base_patient p, base_patient_family_member m " +
                    "WHERE p.id = m.family_member  and m.patient = '"+patientDO.getId()+"' and p.del = '1' " ;
            if(StringUtils.isNotBlank(agent)&&!patientId.equals(agent)){
                sql+=" and p.id='"+patientId+"' ";
            }
            sql+= " ORDER BY p.login_date desc ";
            List<BasePatientDO> patientDOs = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(BasePatientDO.class));
            if (patientDOs.size()>0){
                res.put("agentPatient",patientDO);
                patientDO = patientDOs.get(0);
                patientId = patientDO.getId();
            }else {
                res.put("agentPatient",null);
            }
        }else{
            res.put("agentPatient",null);
        }
        patientDO = patientDao.findById(patientId);
        if (patientDO.getArchiveStatus()!=null){
            patientDO.setArchiveStatusName(dictService.fingByNameAndCode(ConstantUtil.DICT_ARCHIVESTATUS,String.valueOf(patientDO.getArchiveStatus())));
        }

+ 2 - 4
svr/svr-cloud-care/src/main/java/com/yihu/jw/care/service/security/SecurityMonitoringOrderService.java

@ -243,10 +243,8 @@ public class SecurityMonitoringOrderService extends BaseJpaService<SecurityMonit
                if (StringUtils.isNotBlank(doctorDO.getMobile())){
                    messageUtil.sendTXYSJson("1099807",doctorDO.getMobile(),orderDO.getPatientName(),orderDO.getServeDesc());
                }
                imUtil.sendMDTSocketMessageToDoctor(doctorDO.getId(),message.toString());
            }catch (Exception e){
                e.printStackTrace();
            }
            }catch (Exception e){}
            imUtil.sendMDTSocketMessageToDoctor(doctorDO.getId(),message.toString());
        }
        //pc管理端端推送消息
        imUtil.sendPcManageMessageToPc("cloudCare_pcManage",message.toString());

+ 12 - 0
svr/svr-cloud-device/src/main/java/com/yihu/jw/care/dao/device/DeviceDataPushLogDao.java

@ -0,0 +1,12 @@
package com.yihu.jw.care.dao.device;
import com.yihu.jw.entity.care.device.DeviceDataPushLog;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.repository.PagingAndSortingRepository;
/**
 * Created by Bing on 2021/9/2.
 */
public interface DeviceDataPushLogDao extends PagingAndSortingRepository<DeviceDataPushLog,Long>,
        JpaSpecificationExecutor<DeviceDataPushLog> {
}

+ 18 - 14
svr/svr-cloud-device/src/main/java/com/yihu/jw/care/endpoint/DeviceController.java

@ -6,6 +6,7 @@ import com.fasterxml.jackson.databind.ObjectMapper;
import com.yihu.jw.care.dao.device.DeviceDetailDao;
import com.yihu.jw.care.service.DeviceService;
import com.yihu.jw.care.service.YsDeviceService;
import com.yihu.jw.care.util.DeviceDataPushLogUtil;
import com.yihu.jw.entity.care.device.DeviceDetail;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
@ -44,6 +45,8 @@ public class DeviceController {
    private DeviceDetailDao deviceDetailDao;
    @Autowired
    private YsDeviceService ysDeviceService;
    @Autowired
    private DeviceDataPushLogUtil dataPushLogUtil;
    @RequestMapping(value = "/importDeviceFromExcel", produces = "application/json;charset=UTF-8",method = RequestMethod.POST)
    @ResponseBody
@ -114,10 +117,10 @@ public class DeviceController {
                    continue;
                }else {
                    if ("健康设备".equals(deviceType)){
                        deviceType = "1";
                        deviceType = "0";
                    }
                    else if ("安防设备".equals(deviceType)){
                        deviceType= "0";
                        deviceType= "1";
                    }
                    else {
                        errorMsgMap.put(deviceCode,"不支持该设备种类");
@ -154,7 +157,7 @@ public class DeviceController {
            map.put("failedNum", rows-1 - correctLs.size() );
            map.put("errorData", JSON.toJSONString(errorMsgMap, SerializerFeature.WriteMapNullValue));
            System.out.println(map);
            return success();
            return write(200,JSON.toJSONString(map,SerializerFeature.WriteMapNullValue));
        } catch (Exception e) {
            e.printStackTrace();
            return error(-1, "操作失败!");
@ -182,7 +185,7 @@ public class DeviceController {
            String paraString = JSON.toJSONString(request.getParameterMap());
            deviceService.aqgsos(imei, label_mac, time_begin,request);
            long endTime=System.currentTimeMillis();
            dataPushLogUtil.savePushLog(imei,paraString,"爱牵挂SOS数据接收");
            logger.info("爱牵挂设备sos数据接收,请求参数:\n"+paraString+"\n"+(endTime-startTime)+"ms");
            return success();
        } catch (Exception e) {
@ -206,7 +209,7 @@ public class DeviceController {
        try {
            String paraString = JSON.toJSONString(request.getParameterMap());
            logger.info("爱牵挂设备开关机数据接收,请求参数:\n"+paraString);
            dataPushLogUtil.savePushLog(imei,paraString,"爱牵挂开关机数据接收");
            deviceService.aqgSwitch(imei, time_begin, remaining_power, type,request);
            return success();
        } catch (Exception e) {
@ -230,6 +233,7 @@ public class DeviceController {
            String paraString = JSON.toJSONString(request.getParameterMap());
            deviceService.pushdata(type, deviceid, communityid, request);
            long endTime=System.currentTimeMillis();
            dataPushLogUtil.savePushLog(deviceid,paraString,"爱牵挂消息通知接收");
            logger.info("爱牵挂设备消息通知数据接收,请求参数:\n"+paraString+"\n"+(endTime-startTime)+"ms");
            return success();
        } catch (Exception e) {
@ -264,7 +268,7 @@ public class DeviceController {
        try {
            String paraString = JSON.toJSONString(request.getParameterMap());
            logger.info("爱牵挂位置接收,请求参数:\n"+paraString);
            dataPushLogUtil.savePushLog(imei,paraString,"爱牵挂位置数据接收");
            deviceService.byLocation(imei,time_begin,is_reply,is_track,city,address,lon,lat,type);
            return success();
        } catch (Exception e) {
@ -291,7 +295,7 @@ public class DeviceController {
        try {
            String paraString = JSON.toJSONString(request.getParameterMap());
            logger.info("爱牵挂心率数据接收,请求参数: \n"+paraString);
            dataPushLogUtil.savePushLog(imei,paraString,"爱牵挂心率数据接收");
            deviceService.byHeartRate(imei,time_begin,heartrate,theshold_heartrate_h,theshold_heartrate_l);
            return success();
        } catch (Exception e) {
@ -319,7 +323,7 @@ public class DeviceController {
        try {
            String paraString = JSON.toJSONString(request.getParameterMap());
            logger.info("爱牵挂血压数据,接收请求参数:\n"+paraString);
            dataPushLogUtil.savePushLog(imei,paraString,"爱牵挂血压数据接收");
            deviceService.byBloodPressure(imei,time_begin,dbp,dbp_l,sbp,sbp_h);
            return success();
        } catch (Exception e) {
@ -349,7 +353,7 @@ public class DeviceController {
        try {
            String paraString = JSON.toJSONString(request.getParameterMap());
            logger.info("爱牵挂跌倒数据接收,请求参数: \n"+paraString);
            dataPushLogUtil.savePushLog(imei,paraString,"爱牵挂跌倒数据接收");
            deviceService.byFall(imei,time_begin,city,address,lon,lat,type);
            return success();
        } catch (Exception e) {
@ -371,7 +375,7 @@ public class DeviceController {
        try {
            String paraString = JSON.toJSONString(request.getParameterMap());
            logger.info("爱牵挂步数接收,请求参数:\n"+paraString);
            dataPushLogUtil.savePushLog(imei,paraString,"爱牵挂设备步数数据接收");
            deviceService.bySteps(imei,time_begin,value);
            return success();
        } catch (Exception e) {
@ -405,7 +409,7 @@ public class DeviceController {
            deviceService.bySleep(device,time_begin,heartrate,breath,bed_status,turn_over,is_warn);
            long endTime=System.currentTimeMillis();
            logger.info("爱牵挂-睡眠带接收,请求参数:"+paraString+"\n"+(endTime-startTime)+"ms");
            dataPushLogUtil.savePushLog(device,paraString,"睡眠带数据接收");
            return success();
        } catch (Exception e) {
            e.printStackTrace();
@ -459,8 +463,8 @@ public class DeviceController {
        try {
            String paraString = JSON.toJSONString(request.getParameterMap());
            logger.info("爱牵挂-睡眠带睡眠报考,请求参数:"+paraString);
            logger.info("爱牵挂-睡眠带睡眠报告,请求参数:"+paraString);
            dataPushLogUtil.savePushLog(device,paraString,"睡眠带报告数据接收");
            deviceService.bySleepReport(device,date,fallasleep,sleepTime,restTime,awakeTime,lightTime,remTime,deepTime,bucket,
                    avghr,avgbr,awakePer,remPer,lightPer,efficiency,score);
            return success();
@ -485,7 +489,7 @@ public class DeviceController {
            String paraString = JSON.toJSONString(request.getParameterMap());
            logger.info("爱牵挂-睡眠带wifi在线状态接收:"+paraString);
            dataPushLogUtil.savePushLog(device,paraString,"睡眠带在线状态数据接收");
            deviceService.byOnlineStatus(device,onlinestatu,time_begin);
            return success();
        } catch (Exception e) {

+ 5 - 2
svr/svr-cloud-device/src/main/java/com/yihu/jw/care/endpoint/DeviceUploadController.java

@ -12,6 +12,8 @@ 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;
/**
 * Created by Bing on 2021/7/7.
 */
@ -37,12 +39,12 @@ public class DeviceUploadController {
                    "{\"button\":\"1\",\"data\":\"1.81\",\"deviceSn\":\"16C000337\",\"deviceType\":2,\"id\":2377," +
                            "\"manufacturerCode\":\"threeNod\",\"manufacturerName\":\"三诺\",\"sendTime\":\"2017-03-13 13:47:42\"," +
                            "\"state\":0,\"unit\":\"mmol/L\",\"uploadTime\":\"2017-03-13 13:46:59\"}")
            @RequestParam(value = "data", required = true)  String data)
            @RequestParam(value = "data", required = true)  String data, HttpServletRequest request)
    {
        try{
            logger.info("typeId="+typeId+";data="+data);
            return deviceUploadService.uploadDevicesData(data);
            return deviceUploadService.uploadDevicesData(data,request);
        }
        catch (Exception ex)
        {
@ -59,6 +61,7 @@ public class DeviceUploadController {
        try{
            logger.info("message="+message);
            return deviceUploadService.caneUpload(message);
        }
        catch (Exception ex)

+ 1 - 0
svr/svr-cloud-device/src/main/java/com/yihu/jw/care/endpoint/HvDeviceController.java

@ -5,6 +5,7 @@ import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.yihu.jw.care.service.HvDeviceService;
import com.yihu.jw.care.util.DeviceDataPushLogUtil;
import com.yihu.jw.utils.StringUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;

+ 0 - 84
svr/svr-cloud-device/src/main/java/com/yihu/jw/care/endpoint/SocketClientTest.java

@ -1,84 +0,0 @@
//package com.yihu.jw.care.endpoint;
//
//import java.io.BufferedReader;
//import java.io.BufferedWriter;
//import java.io.InputStreamReader;
//import java.io.OutputStreamWriter;
//import java.net.Socket;
//
///***
// * @ClassName: SocketTest
// * @Description: scoket客户端
// * @Auther: shi kejing
// * @Date: 2021/8/20 11:00
// */
//public class SocketClientTest {
//
//    public static void main(String[] args) {
//        SocketClientTest client=new SocketClientTest();
//        client.startAction();
//    }
//
//    void readSocketInfo(BufferedReader reader){
//        new Thread(new MyRuns(reader)).start();
//    }
//
//    class MyRuns implements Runnable{
//
//        BufferedReader reader;
//
//        public MyRuns(BufferedReader reader) {
//            super();
//            this.reader = reader;
//        }
//
//        public void run() {
//            try {
//                String lineString="";
//                while( (lineString = reader.readLine())!=null ){
//                    System.out.println(lineString);
//                }
//            } catch (Exception e) {
//                e.printStackTrace();
//            }
//        }
//
//    }
//
//    public void startAction(){
//        Socket socket=null;
//        BufferedReader reader=null;
//        BufferedWriter writer=null;
//        BufferedReader reader2=null;
//        try {
//            socket=new Socket("172.26.0.107", 9112);
//            reader = new BufferedReader(new InputStreamReader(System.in));
//            reader2=new BufferedReader(new InputStreamReader(socket.getInputStream()));
//            writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
//            readSocketInfo(reader2);
//            String lineString="";
//            while(!(lineString=reader.readLine()).equals("exit")){
//                writer.write(lineString+"\n");
//                writer.flush();
//            }
//        } catch (Exception e) {
//            e.printStackTrace();
//        } finally {
//            try {
//                if (reader!=null) {
//                    reader.close();
//                }
//                if (writer!=null) {
//                    writer.close();
//                }
//                if (socket!=null) {
//                    socket.close();
//                }
//            } catch (Exception e2) {
//                e2.printStackTrace();
//            }
//        }
//    }
//
//
//}

+ 0 - 103
svr/svr-cloud-device/src/main/java/com/yihu/jw/care/endpoint/SocketServerTest.java

@ -1,103 +0,0 @@
//package com.yihu.jw.care.endpoint;
//
//import com.tencentcloudapi.oceanus.v20190422.models.SystemResourceItem;
//import com.yihu.jw.entity.util.SystemConfEntity;
//import jdk.internal.cmm.SystemResourcePressureImpl;
//import org.slf4j.Logger;
//import org.slf4j.LoggerFactory;
//import org.springframework.core.convert.Property;
//import org.springframework.stereotype.Component;
//
//import javax.annotation.PostConstruct;
//import java.io.BufferedReader;
//import java.io.BufferedWriter;
//import java.io.InputStreamReader;
//import java.io.OutputStreamWriter;
//import java.net.ServerSocket;
//import java.net.Socket;
//
///***
// * @ClassName: SocketServerTest
// * @Description: socket服务器端
// * @Auther: shi kejing
// * @Date: 2021/8/20 11:04
// */
//@Component
//public class SocketServerTest {
//    private final static Logger logger = LoggerFactory.getLogger(SocketServerTest.class);
//
//    public static void main(String[] args) {
//        SocketServerTest st = new SocketServerTest();
//        st.startAction();
//    }
//
////    @PostConstruct
//    public void startAction(){
//        logger.info("服务端服务启动监听:");
//        ServerSocket serverSocket=null;
//        try {
//            serverSocket=new ServerSocket(9112);  //端口号
//            logger.info("服务端服务启动监听:");
//            //通过死循环开启长连接,开启线程去处理消息
//            while(true){
//                Socket socket=serverSocket.accept();
//                new Thread(new SocketServerTest.MyRuns(socket)).start();
//            }
//        } catch (Exception e) {
//            e.printStackTrace();
//        } finally {
//            try {
//                if (serverSocket!=null) {
//                    serverSocket.close();
//                }
//            } catch (Exception e2) {
//                e2.printStackTrace();
//            }
//        }
//    }
//
//    class MyRuns implements Runnable{
//
//        Socket socket;
//        BufferedReader reader;
//        BufferedWriter writer;
//
//        public MyRuns(Socket socket) {
//            super();
//            this.socket = socket;
//        }
//
//        public void run() {
//            try {
//                reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));//读取客户端消息
//                writer=new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));//向客户端写消息
//                String lineString=""; //服务器接受到的消息
//
//                while(!(lineString=reader.readLine()).equals("bye")){
//                    logger.info("收到来自客户端的发送的消息是:" + lineString);
//                    writer.write("服务器返回:"+lineString+"\n");
//                    writer.flush();
//                }
//            } catch (Exception e) {
//                e.printStackTrace();
//            } finally {
//                try {
//                    if (reader!=null) {
//                        reader.close();
//                    }
//                    if (writer!=null) {
//                        writer.close();
//                    }
//                    if (socket!=null) {
//                        socket.close();
//                    }
//                } catch (Exception e2) {
//                    e2.printStackTrace();
//                }
//            }
//        }
//
//    }
//
//
//}

+ 0 - 151
svr/svr-cloud-device/src/main/java/com/yihu/jw/care/endpoint/WebSocketServer.java

@ -1,151 +0,0 @@
//package com.yihu.jw.care.endpoint;
//
//import com.alibaba.fastjson.JSONObject;
//import org.apache.commons.lang.StringUtils;
//import org.slf4j.Logger;
//import org.slf4j.LoggerFactory;
//import org.springframework.stereotype.Component;
//
//
//import javax.websocket.*;
//import javax.websocket.server.PathParam;
//import javax.websocket.server.ServerEndpoint;
//import java.io.IOException;
//import java.util.concurrent.ConcurrentHashMap;
//import com.alibaba.fastjson.JSON;
//
///***
// * @ClassName: WebSocketServer
// * @Description:
// * @Auther: shi kejing
// * @Date: 2021/8/20 14:20
// */
//@ServerEndpoint("/")
//@Component
//public class WebSocketServer {
//
//
//    private final static Logger log = LoggerFactory.getLogger(WebSocketServer.class);
//    /**静态变量,用来记录当前在线连接数。应该把它设计成线程安全的。*/
//    private static int onlineCount = 0;
//    /**concurrent包的线程安全Set,用来存放每个客户端对应的MyWebSocket对象。*/
//    private static ConcurrentHashMap<String,WebSocketServer> webSocketMap = new ConcurrentHashMap<>();
//    /**与某个客户端的连接会话,需要通过它来给客户端发送数据*/
//    private Session session;
//    /**接收userId*/
//    private String userId="ijk";
//
//    /**
//     * 连接建立成功调用的方法*/
//    @OnOpen
//    public void onOpen(Session session,@PathParam("userId") String userId) {
//        userId="ijk";
//        log.info("userId = "+userId);
//        this.session = session;
//        this.userId=userId;
//        if(webSocketMap.containsKey(userId)){
//            webSocketMap.remove(userId);
//            webSocketMap.put(userId,this);
//            //加入set中
//        }else{
//            webSocketMap.put(userId,this);
//            //加入set中
//            addOnlineCount();
//            //在线数加1
//        }
//
//        log.info("用户连接:"+userId+",当前在线人数为:" + getOnlineCount());
//
//        try {
//            sendMessage("连接成功");
//        } catch (IOException e) {
//            log.error("用户:"+userId+",网络异常!!!!!!");
//        }
//    }
//
//    /**
//     * 连接关闭调用的方法
//     */
//    @OnClose
//    public void onClose() {
//        if(webSocketMap.containsKey(userId)){
//            webSocketMap.remove(userId);
//            //从set中删除
//            subOnlineCount();
//        }
//        log.info("用户退出:"+userId+",当前在线人数为:" + getOnlineCount());
//    }
//
//    /**
//     * 收到客户端消息后调用的方法
//     *
//     * @param message 客户端发送过来的消息*/
//    @OnMessage
//    public void onMessage(String message, Session session) {
//        log.info("用户消息:"+userId+",报文:"+message);
//        //可以群发消息
//        //消息保存到数据库、redis
//        if(StringUtils.isNotBlank(message)){
//            try {
//                //解析发送的报文
//                JSONObject jsonObject = JSON.parseObject(message);
//                //追加发送人(防止串改)
//                jsonObject.put("fromUserId",this.userId);
//                String toUserId=jsonObject.getString("toUserId");
//                //传送给对应toUserId用户的websocket
//                if(StringUtils.isNotBlank(toUserId)&&webSocketMap.containsKey(toUserId)){
//                    webSocketMap.get(toUserId).sendMessage(jsonObject.toJSONString());
//                }else{
//                    log.error("请求的userId:"+toUserId+"不在该服务器上");
//                    //否则不在这个服务器上,发送到mysql或者redis
//                }
//            }catch (Exception e){
//                e.printStackTrace();
//            }
//        }
//    }
//
//    /**
//     *
//     * @param session
//     * @param error
//     */
//    @OnError
//    public void onError(Session session, Throwable error) {
//        log.error("用户错误:"+this.userId+",原因:"+error.getMessage());
//        error.printStackTrace();
//    }
//    /**
//     * 实现服务器主动推送
//     */
//    public void sendMessage(String message) throws IOException {
//        this.session.getBasicRemote().sendText(message);
//    }
//
//
//    /**
//     * 发送自定义消息
//     * */
//    public static void sendInfo(String message,@PathParam("userId") String userId) throws IOException {
//        log.info("发送消息到:"+userId+",报文:"+message);
//        if(StringUtils.isNotBlank(userId)&&webSocketMap.containsKey(userId)){
//            webSocketMap.get(userId).sendMessage(message);
//        }else{
//            log.error("用户"+userId+",不在线!");
//        }
//    }
//
//    public static synchronized int getOnlineCount() {
//        return onlineCount;
//    }
//
//    public static synchronized void addOnlineCount() {
//        WebSocketServer.onlineCount++;
//    }
//
//    public static synchronized void subOnlineCount() {
//        WebSocketServer.onlineCount--;
//    }
//
//
//}

+ 0 - 25
svr/svr-cloud-device/src/main/java/com/yihu/jw/care/endpoint/YunXinIotController.java

@ -1,25 +0,0 @@
package com.yihu.jw.care.endpoint;
import com.yihu.jw.care.common.BaseController;
import io.swagger.annotations.Api;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.PostConstruct;
/***
 * @ClassName: YunXinIotController
 * @Description: 云芯 智能拐杖
 * @Auther: shi kejing
 * @Date: 2021/8/20 10:06
 */
@RestController
@RequestMapping(value = "yunxin/device")
@Api(value = "云芯 智能拐杖", description = "云芯 智能拐杖", tags = {"云芯 智能拐杖"})
public class YunXinIotController extends BaseController {
    private final static Logger LOGGER = LoggerFactory.getLogger(YunXinIotController.class);
}

+ 9 - 2
svr/svr-cloud-device/src/main/java/com/yihu/jw/care/service/DeviceUploadService.java

@ -7,6 +7,7 @@ import com.fasterxml.jackson.databind.ObjectMapper;
import com.yihu.jw.care.dao.device.*;
import com.yihu.jw.care.endpoint.Result;
import com.yihu.jw.care.util.CountDistance;
import com.yihu.jw.care.util.DeviceDataPushLogUtil;
import com.yihu.jw.care.util.SecurityOrderUtil;
import com.yihu.jw.entity.base.patient.BasePatientDO;
import com.yihu.jw.entity.care.device.*;
@ -27,6 +28,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;
import javax.servlet.http.HttpServletRequest;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
@ -72,8 +74,10 @@ public class DeviceUploadService {
    private JdbcTemplate jdbcTemplate;
    @Autowired
    private PatientSafeAreaDao safeAreaDao;
    @Autowired
    private DeviceDataPushLogUtil dataPushLogUtil;
    public Result uploadDevicesData(String dataJson)throws Exception {
    public Result uploadDevicesData(String dataJson, HttpServletRequest request)throws Exception {
        try {
            ObjectMapper objectMapper = new ObjectMapper();
            Map<String, Object> map = objectMapper.readValue(dataJson, Map.class);
@ -88,6 +92,8 @@ public class DeviceUploadService {
            String sendTime = map.get("sendTime").toString();//发送时间yyyy-MM-dd HH:mm:ss
            String userType = map.get("button").toString();//按键号 即 userType
            String measurementType=null==map.get("measurementType")?"":map.get("measurementType").toString(); //单个设备的测量类型,deviceType=4智能手表:1心率,2血压
            String paraString = JSON.toJSONString(request.getParameterMap());
            dataPushLogUtil.savePushLog(deviceSn,paraString,"体征数据接收");
            JSONObject json = new JSONObject();
            json.put("deviceSn", deviceSn);
@ -462,6 +468,7 @@ public class DeviceUploadService {
                String inst = instruct[i];
                String tmp[] = inst.split("\\*");
                String sn = tmp[1];
                dataPushLogUtil.savePushLog(sn,"{\"message\":\""+instructions+"\"}","拐杖数据接收");
                String order = tmp[3];
                if(order.contains(",")){
                    String tmp1[] = order.split(",");
@ -548,7 +555,7 @@ public class DeviceUploadService {
                            String sql=" SELECT * FROM base_yxdevice_index WHERE sn = '"+sn+"' " +
                                    "AND create_time LIKE '"+DateUtil.getStringDateShort()+"%' AND lon != 0 AND lat != 0 ORDER BY create_time DESC  ";
                            List<Map<String,Object>> result = jdbcTemplate.queryForList(sql);
                            if (result.size()>0);{
                            if (result.size()>0){
                                dulat = Double.parseDouble(result.get(0).get("lat").toString());
                                dulon = Double.parseDouble(result.get(0).get("lon").toString());

+ 10 - 1
svr/svr-cloud-device/src/main/java/com/yihu/jw/care/service/HvDeviceService.java

@ -9,11 +9,14 @@ import com.yihu.jw.care.dao.device.DeviceHealthIndexDao;
import com.yihu.jw.care.dao.device.HvDeviceRecordDao;
import com.yihu.jw.care.dao.device.HvDeviceSosLogDao;
import com.yihu.jw.care.util.ArtemisPostTest;
import com.yihu.jw.care.util.DeviceDataPushLogUtil;
import com.yihu.jw.care.util.SecurityOrderUtil;
import com.yihu.jw.entity.care.device.DeviceDetail;
import com.yihu.jw.entity.care.device.DeviceHealthIndex;
import com.yihu.jw.entity.care.device.HvDeviceRecord;
import com.yihu.jw.entity.care.device.HvDeviceSosLog;
import com.yihu.jw.utils.StringUtil;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
@ -44,6 +47,8 @@ public class HvDeviceService {
    private HvDeviceRecordDao hvdeviceRecordDao;
    @Autowired
    private DeviceDetailDao deviceDetailDao;
    @Autowired
    private DeviceDataPushLogUtil dataPushLogUtil;
    /**
     * 消息通知接收
@ -110,6 +115,7 @@ public class HvDeviceService {
                JSONObject tmp = new JSONObject();
                tmp.put("gas",monitorValue);
                orderUtil.createSecurityOrder(resourceSerial,null,new JSONObject(),null,6,"11","preventGasLeakage",JSON.toJSONString(tmp, SerializerFeature.WriteMapNullValue));
                dataPushLogUtil.savePushLog(resourceSerial,jsonObject.toJSONString(SerializerFeature.WriteMapNullValue),"可燃气体探测器报警信息接收");
            }
            if("600002".equals(deviceType)){
@ -117,9 +123,9 @@ public class HvDeviceService {
                JSONObject tmp = new JSONObject();
                tmp.put("smoke",monitorValue);
                orderUtil.createSecurityOrder(resourceSerial,null,new JSONObject(),null,7,"10","preventFire",JSON.toJSONString(tmp, SerializerFeature.WriteMapNullValue));
                dataPushLogUtil.savePushLog(resourceSerial,jsonObject.toJSONString(SerializerFeature.WriteMapNullValue),"烟感探测器报警信息接收");
            }
        }
        if(list.size()>0){
            hvdeviceSosLogDao.save(list);
        }
@ -148,12 +154,14 @@ public class HvDeviceService {
                //独立式可燃气体探测器(NB)
                index.setDeviceType("1");
                list.add(index);
                dataPushLogUtil.savePushLog(resourceSerial,jsonObject.toJSONString(SerializerFeature.WriteMapNullValue),"可燃气体探测器监测信息接收");
            }
            if("600002".equals(resourceType)&&"400013".equals(monitorType)){
                //独立式光电感烟探测器(NB)
                index.setDeviceType("2");
                list.add(index);
                dataPushLogUtil.savePushLog(resourceSerial,jsonObject.toJSONString(SerializerFeature.WriteMapNullValue),"烟探测器监测信息接收");
            }
            updContactStatus(resourceSerial,1);
        }
@ -172,6 +180,7 @@ public class HvDeviceService {
            String deviceID = jsonObject.getString("deviceID");
            String deviceStatus = jsonObject.getString("deviceStatus");
            List<HvDeviceRecord> list = hvdeviceRecordDao.findByDeviceId(deviceID);
            dataPushLogUtil.savePushLog(deviceID,jsonObject.toJSONString(SerializerFeature.WriteMapNullValue),"气感烟感探测器监测信息接收");
            if(list.size()>0){
                updContactStatus(list.get(0).getDeviceSn(),Integer.valueOf(deviceStatus));
            }

+ 8 - 0
svr/svr-cloud-device/src/main/java/com/yihu/jw/care/service/YsDeviceService.java

@ -2,12 +2,15 @@ package com.yihu.jw.care.service;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.fasterxml.jackson.databind.node.ObjectNode;
import com.yihu.fastdfs.FastDFSUtil;
import com.yihu.jw.care.config.YsConfig;
import com.yihu.jw.care.dao.device.PatientDeviceDao;
import com.yihu.jw.care.util.DeviceDataPushLogUtil;
import com.yihu.jw.care.util.SecurityOrderUtil;
import com.yihu.jw.entity.base.patient.BasePatientDO;
import com.yihu.jw.entity.care.device.DeviceDetail;
import com.yihu.jw.entity.care.device.DevicePatientDevice;
import com.yihu.jw.entity.util.AesEncryptUtils;
import com.yihu.jw.exception.business.file_upload.*;
@ -78,6 +81,8 @@ public class YsDeviceService {
    private SecurityOrderUtil orderUtil;
    @Autowired
    private StringRedisTemplate redisTemplate;
    @Autowired
    private DeviceDataPushLogUtil dataPushLogUtil;
    /**
     * 获取萤石设备assesToken
@ -204,11 +209,13 @@ public class YsDeviceService {
                                if ("tumble_detection".equals(alarmType)){//tumble_detection跌倒类型    //有人出现SmartHumanDet
                                    fallFlag = true;
                                    deviceSN = bodyJsonObj2.getString("devSerial");//设备SN
                                    dataPushLogUtil.savePushLog(deviceSN,bodyJsonObj.toJSONString(SerializerFeature.WriteMapNullValue),"萤石监控跌倒数据接收");
                                    if (bodyJsonObj2.containsKey("pictureList")&&bodyJsonObj2.getJSONArray("pictureList")!=null){
                                        JSONArray pictureList = bodyJsonObj2.getJSONArray("pictureList");
                                        if (pictureList.size()>0){
                                            JSONObject tmp = pictureList.getJSONObject(0);
                                            sceneUrl = tmp.getString("url");//现场照片
                                            System.out.println("--"+deviceSN+":跌倒图片--"+sceneUrl);
                                            try {
                                            download(sceneUrl, "sceneImg","/data/apps/temp2/work/Tomcat/localhost/ROOT");
                                            String filePath = "/data/apps/temp2/work/Tomcat/localhost/ROOT/sceneImg.jpg";
@ -218,6 +225,7 @@ public class YsDeviceService {
                                            UploadVO uploadVO = orderUtil.uploadImg(multipartFile);
                                            sceneUrl = uploadVO.getFullUri();
                                            }catch (Exception e){
                                                e.printStackTrace();
                                                sceneUrl = null;
                                            }
                                        }

+ 52 - 0
svr/svr-cloud-device/src/main/java/com/yihu/jw/care/util/DeviceDataPushLogUtil.java

@ -0,0 +1,52 @@
package com.yihu.jw.care.util;
import com.yihu.jw.care.dao.device.DeviceDataPushLogDao;
import com.yihu.jw.care.dao.device.PatientDeviceDao;
import com.yihu.jw.entity.base.patient.BasePatientDO;
import com.yihu.jw.entity.care.device.DeviceDataPushLog;
import com.yihu.jw.entity.care.device.DevicePatientDevice;
import com.yihu.jw.patient.dao.BasePatientDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.Date;
import java.util.List;
/**
 * Created by Bing on 2021/9/2.
 * 设备数据推送日志保存
 */
@Component
public class DeviceDataPushLogUtil {
    @Autowired
    private DeviceDataPushLogDao deviceDataPushLogDao;
    @Autowired
    private PatientDeviceDao patientDeviceDao;
    @Autowired
    private BasePatientDao patientDao;
    public void savePushLog(String sn,String data,String apiName){
        try {
            DeviceDataPushLog pushLog = new DeviceDataPushLog();
            pushLog.setDeviceSn(sn);
            pushLog.setData(data);
            pushLog.setApiName(apiName);
            pushLog.setCreateTime(new Date());
            List<DevicePatientDevice> devices= patientDeviceDao.findByDeviceSn(sn);
            if (devices.size()>0){
                DevicePatientDevice tmp = devices.get(0);
                BasePatientDO patientDO = patientDao.findById(tmp.getUser());
                if (null!=patientDO){
                    pushLog.setPatient(tmp.getUser());
                    pushLog.setPatientName(patientDO.getName());
                }
                pushLog.setDeviceName(tmp.getDeviceName());
                pushLog.setDeviceCategory(tmp.getCategoryCode());
            }
            deviceDataPushLogDao.save(pushLog);
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}

+ 83 - 0
svr/svr-cloud-device/src/main/java/com/yihu/jw/care/util/OneNetUtil.java

@ -0,0 +1,83 @@
package com.yihu.jw.care.util;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.Base64;
/**
 * Created with IntelliJ IDEA.
 *
 * @Author: yeshijie
 * @Date: 2021/9/2
 * @Description:
 */
public class OneNetUtil {
    private static final String MasterAPIkey ="Da0iDvhQ5H8OD6phWq=tMubBcBw=";
    private static final String access_key  ="WikrY0Zy/BB308DZhplru4Mc65OijFqH35nMEh4xre0=";
    public static String assembleToken(String version, String resourceName, String expirationTime, String signatureMethod, String accessKey)
            throws UnsupportedEncodingException, NoSuchAlgorithmException, InvalidKeyException {
        StringBuilder sb = new StringBuilder();
        String res = URLEncoder.encode(resourceName, "UTF-8");
        String sig = URLEncoder.encode(generatorSignature(version, resourceName, expirationTime
                , accessKey, signatureMethod), "UTF-8");
        sb.append("version=")
                .append(version)
                .append("&res=")
                .append(res)
                .append("&et=")
                .append(expirationTime)
                .append("&method=")
                .append(signatureMethod)
                .append("&sign=")
                .append(sig);
        return sb.toString();
    }
    public static String generatorSignature(String version, String resourceName, String expirationTime, String accessKey, String signatureMethod)
            throws NoSuchAlgorithmException, InvalidKeyException {
        String encryptText = expirationTime + "\n" + signatureMethod + "\n" + resourceName + "\n" + version;
        String signature;
        byte[] bytes = HmacEncrypt(encryptText, accessKey, signatureMethod);
        signature = Base64.getEncoder().encodeToString(bytes);
        return signature;
    }
    public static byte[] HmacEncrypt(String data, String key, String signatureMethod)
            throws NoSuchAlgorithmException, InvalidKeyException {
        //根据给定的字节数组构造一个密钥,第二参数指定一个密钥算法的名称
        SecretKeySpec signinKey = null;
        signinKey = new SecretKeySpec(Base64.getDecoder().decode(key),
                "Hmac" + signatureMethod.toUpperCase());
        //生成一个指定 Mac 算法 的 Mac 对象
        Mac mac = null;
        mac = Mac.getInstance("Hmac" + signatureMethod.toUpperCase());
        //用给定密钥初始化 Mac 对象
        mac.init(signinKey);
        //完成 Mac 操作
        return mac.doFinal(data.getBytes());
    }
    public enum SignatureMethod {
        SHA1, MD5, SHA256;
    }
    public static void main(String[] args) throws UnsupportedEncodingException, NoSuchAlgorithmException, InvalidKeyException {
        String version = "2018-10-31";
        String resourceName = "mqs/A1EB10110CFA9E06D6209E40C4A6D7976";
        String expirationTime = System.currentTimeMillis() / 1000 + 100 * 24 * 60 * 60 + "";
        String signatureMethod = SignatureMethod.SHA1.name().toLowerCase();
        String accessKey = "KuF3NT/jUBJ62LNBB/A8XZA9CqS3Cu79B/ABmfA1UCw=";
        String token = assembleToken(version, resourceName, expirationTime, signatureMethod, accessKey);
        System.out.println("Authorization:" + token);
    }
}

+ 1 - 1
svr/svr-cloud-job/src/main/java/com/yihu/jw/care/job/device/YunXunDeviceService.java

@ -41,7 +41,7 @@ public class YunXunDeviceService {
        if(!StringUtil.isBlank(phone3)){
            order += ","+phone3;
        }
        String instruction = "[IC*"+sn+"*"+hex10To16(order.length())+"]";
        String instruction = "[IC*"+sn+"*"+hex10To16(order.length())+"*"+order+"]";
        sendInstruction(sn,instruction);
    }