Browse Source

Merge branch 'dev' of liubing/wlyy2.0 into dev

liubing 3 years ago
parent
commit
de5aff40a4
25 changed files with 1028 additions and 47 deletions
  1. 9 1
      common/common-entity/sql记录
  2. 10 0
      common/common-entity/src/main/java/com/yihu/jw/entity/base/patient/BasePatientDO.java
  3. 36 0
      common/common-entity/src/main/java/com/yihu/jw/entity/care/lifeCare/LifeCareItemDictDO.java
  4. 7 0
      common/common-request-mapping/src/main/java/com/yihu/jw/rm/base/BaseRequestMapping.java
  5. 18 0
      svr/svr-base/src/main/java/com/yihu/jw/base/dao/lifeCare/LifeCareItemDictDao.java
  6. 86 0
      svr/svr-base/src/main/java/com/yihu/jw/base/endpoint/lifeCare/LifeCareEndpoint.java
  7. 87 0
      svr/svr-base/src/main/java/com/yihu/jw/base/service/lifeCare/LifeCareService.java
  8. 4 2
      svr/svr-cloud-care/src/main/java/com/yihu/jw/care/dao/lifeCare/LifeCareItemDictDao.java
  9. 3 2
      svr/svr-cloud-care/src/main/java/com/yihu/jw/care/endpoint/lifeCare/PadLifeCareEndpoint.java
  10. 3 2
      svr/svr-cloud-care/src/main/java/com/yihu/jw/care/endpoint/lifeCare/PatientLifeCareEndpoint.java
  11. 3 2
      svr/svr-cloud-care/src/main/java/com/yihu/jw/care/service/lifeCare/LifeCareOrderService.java
  12. 1 1
      svr/svr-cloud-care/src/main/java/com/yihu/jw/care/service/sign/ServicePackageService.java
  13. 3 0
      svr/svr-cloud-care/src/main/java/com/yihu/jw/care/util/MessageUtil.java
  14. 6 0
      svr/svr-cloud-device/pom.xml
  15. 43 3
      svr/svr-cloud-device/src/main/java/com/yihu/jw/care/service/DeviceService.java
  16. 49 0
      svr/svr-cloud-device/src/main/java/com/yihu/jw/care/service/DeviceUploadService.java
  17. 32 0
      svr/svr-cloud-device/src/main/java/com/yihu/jw/care/service/PatientFamilyService.java
  18. 455 0
      svr/svr-cloud-device/src/main/java/com/yihu/jw/care/util/MessageUtil.java
  19. 9 7
      svr/svr-cloud-device/src/main/resources/application.yml
  20. 10 0
      svr/svr-cloud-job/src/main/java/com/yihu/jw/care/event/ApplicationEvent.java
  21. 34 0
      svr/svr-cloud-job/src/main/java/com/yihu/jw/care/job/device/PressureGlucoseNotJob.java
  22. 84 0
      svr/svr-cloud-job/src/main/java/com/yihu/jw/care/service/device/PressureGlucoseNotService.java
  23. 31 13
      svr/svr-cloud-job/src/main/java/com/yihu/jw/care/util/DeviceLostMessageUtil.java
  24. 3 0
      svr/svr-cloud-job/src/main/java/com/yihu/jw/care/util/MessageUtil.java
  25. 2 14
      svr/svr-cloud-job/src/main/resources/system.properties

+ 9 - 1
common/common-entity/sql记录

@ -1663,4 +1663,12 @@ CREATE TABLE `wlyy_sims_voices` (
  `type` int(1) DEFAULT NULL COMMENT '1月统计 2日统计',
  `value` varchar(11) DEFAULT NULL COMMENT '使用量/分钟',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='物联网卡语音使用情况';
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='物联网卡语音使用情况';
-- 2022-03-09
ALTER table base_life_care_item_dict add COLUMN charge_standard VARCHAR(200) DEFAULT null COMMENT '收费标准';
ALTER table base_life_care_item_dict add COLUMN serve_standard VARCHAR(200) DEFAULT null COMMENT '收费标准';
ALTER table base_life_care_item_dict add COLUMN org_code varchar(50) DEFAULT NULL COMMENT '服务机构';
ALTER table base_life_care_item_dict add COLUMN org_name varchar(50) DEFAULT NULL COMMENT '服务机构名称';
ALTER table base_life_care_item_dict MODIFY COLUMN `code` varchar(10) DEFAULT NULL;
ALTER table base_patient add COLUMN `home_state` TINYINT(2) DEFAULT NULL COMMENT '居家状态:1居家0离家';

+ 10 - 0
common/common-entity/src/main/java/com/yihu/jw/entity/base/patient/BasePatientDO.java

@ -293,6 +293,7 @@ public class BasePatientDO extends UuidIdentityEntityWithOperator {
    private String medicalState;//医保授权状态
    private String homeLatLon;//家庭经纬度
    private Integer homeState;//居家状态 1居家0离家;
    @Column(name = "medical_state")
@ -931,4 +932,13 @@ public class BasePatientDO extends UuidIdentityEntityWithOperator {
    public void setHomeLatLon(String homeLatLon) {
        this.homeLatLon = homeLatLon;
    }
    @Column(name = "home_state")
    public Integer getHomeState() {
        return homeState;
    }
    public void setHomeState(Integer homeState) {
        this.homeState = homeState;
    }
}

+ 36 - 0
common/common-entity/src/main/java/com/yihu/jw/entity/care/lifeCare/LifeCareItemDictDO.java

@ -22,6 +22,10 @@ public class LifeCareItemDictDO extends UuidIdentityEntity{
    private Integer del;//删除标志 1正常,0删除
    private String lifeCareImg;//服务项目图片
    private String padIconImg;//pad图标
    private String chargeStandard;//收费标准
    private String serveStandard;//服务标准标准
    private String orgCode;//服务机构
    private String orgName;//服务机构名称
    public String getCode() {
        return code;
@ -87,4 +91,36 @@ public class LifeCareItemDictDO extends UuidIdentityEntity{
    public void setPadIconImg(String padIconImg) {
        this.padIconImg = padIconImg;
    }
    public String getChargeStandard() {
        return chargeStandard;
    }
    public void setChargeStandard(String chargeStandard) {
        this.chargeStandard = chargeStandard;
    }
    public String getServeStandard() {
        return serveStandard;
    }
    public void setServeStandard(String serveStandard) {
        this.serveStandard = serveStandard;
    }
    public String getOrgCode() {
        return orgCode;
    }
    public void setOrgCode(String orgCode) {
        this.orgCode = orgCode;
    }
    public String getOrgName() {
        return orgName;
    }
    public void setOrgName(String orgName) {
        this.orgName = orgName;
    }
}

+ 7 - 0
common/common-request-mapping/src/main/java/com/yihu/jw/rm/base/BaseRequestMapping.java

@ -414,6 +414,13 @@ public class BaseRequestMapping {
        public static final String PREFIX  = "/service_package_normcat";
    }
    /**
     * 生活照料
     */
    public static class LifeCare extends Basic{
        public static final String PREFIX  = "/life_care";
    }
    /**
     * 康复计划
     */

+ 18 - 0
svr/svr-base/src/main/java/com/yihu/jw/base/dao/lifeCare/LifeCareItemDictDao.java

@ -0,0 +1,18 @@
package com.yihu.jw.base.dao.lifeCare;
import com.yihu.jw.entity.care.lifeCare.LifeCareItemDictDO;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.PagingAndSortingRepository;
import java.util.List;
/**
 * Created by yeshijie on 2021/3/26.
 */
public interface LifeCareItemDictDao extends PagingAndSortingRepository<LifeCareItemDictDO, String>, JpaSpecificationExecutor<LifeCareItemDictDO> {
    @Query("from LifeCareItemDictDO w where  w.del=1 order by sort asc")
    List<LifeCareItemDictDO> findByAll();
}

+ 86 - 0
svr/svr-base/src/main/java/com/yihu/jw/base/endpoint/lifeCare/LifeCareEndpoint.java

@ -0,0 +1,86 @@
package com.yihu.jw.base.endpoint.lifeCare;
import com.yihu.jw.base.service.lifeCare.LifeCareService;
import com.yihu.jw.restmodel.web.Envelop;
import com.yihu.jw.restmodel.web.ObjEnvelop;
import com.yihu.jw.restmodel.web.PageEnvelop;
import com.yihu.jw.restmodel.web.endpoint.EnvelopRestEndpoint;
import com.yihu.jw.rm.base.BaseRequestMapping;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
import java.util.Map;
/**
 * Created by Bing on 2022/3/9.
 */
@RestController
@RequestMapping(value = BaseRequestMapping.LifeCare.PREFIX, produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
@Api(value = "生活照料管理", description = "生活照料管理接口", tags = {"wlyy基础服务 - 生活照料管理接口"})
public class LifeCareEndpoint extends EnvelopRestEndpoint {
    @Autowired
    private LifeCareService lifeCareService;
    @ApiOperation("获取生活照料服务项目列表")
    @RequestMapping(value = "/getServeDictList",method = RequestMethod.GET)
    public PageEnvelop<List<Map<String,Object>>> getServeDictList(@ApiParam(name = "orgName",value = "机构名称",required = false)
                                        @RequestParam(value = "orgName",required = false)String orgName,
                                        @ApiParam(name = "itemName",value = "服务项目名称",required = false)
                                        @RequestParam(value = "itemName",required = false)String itemName,
                                        @ApiParam(name = "page", value = "分页大小", required = true, defaultValue = "1")
                                        @RequestParam(value = "page") Integer page,
                                        @ApiParam(name = "size", value = "页码", required = true, defaultValue = "15")
                                        @RequestParam(value = "size") Integer size){
        try {
            return lifeCareService.getServeDictList(orgName,itemName,page,size);
        }catch (Exception e){
            return failedPageEnvelopException2(e);
        }
    }
    @ApiOperation("编辑新增生活照料服务型")
    @RequestMapping(value = "/saveLifeItem",method = RequestMethod.POST)
    public Envelop saveLifeItem(@ApiParam(name = "json",value = "json数据",required = true)
                                @RequestParam(value = "json",required = false)String json){
        try {
            return success(lifeCareService.saveLifeItem(json));
        }catch (Exception e){
            return failedException2(e);
        }
    }
    @ApiOperation("删除生活照料服务项目")
    @RequestMapping(value = "/delLifeItem",method = RequestMethod.POST)
    public Envelop saveLifeItem(@ApiParam(name = "id",value = "机构名称",required = true)
                                @RequestParam(value = "id",required = false)String id,
                                @ApiParam(name = "status",value = "1有效 0无效",required = true)
                                @RequestParam(value = "status",required = false)Integer status){
        try {
            return success(lifeCareService.delLifeItem(id,status));
        }catch (Exception e){
            return failedException2(e);
        }
    }
    @ApiOperation("获取服务详情")
    @RequestMapping(value = "/getLifeItemDetail",method = RequestMethod.GET)
    public ObjEnvelop getLifeItemDetail(@ApiParam(name = "id",value = "机构名称",required = true)
                                    @RequestParam(value = "id",required = false)String id){
        try {
            return success(lifeCareService.getLifeItemDetail(id));
        }catch (Exception e){
            return failedObjEnvelopException2(e);
        }
    }
}

+ 87 - 0
svr/svr-base/src/main/java/com/yihu/jw/base/service/lifeCare/LifeCareService.java

@ -0,0 +1,87 @@
package com.yihu.jw.base.service.lifeCare;
import com.alibaba.fastjson.JSONObject;
import com.yihu.jw.base.dao.lifeCare.LifeCareItemDictDao;
import com.yihu.jw.entity.care.lifeCare.LifeCareItemDictDO;
import com.yihu.jw.restmodel.web.PageEnvelop;
import org.apache.commons.lang3.RandomStringUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Map;
import java.util.Random;
/**
 * Created by Bing on 2022/3/9.
 */
@Service
public class LifeCareService {
    @Autowired
    private JdbcTemplate jdbcTemplate;
    @Autowired
    private LifeCareItemDictDao lifeCareItemDictDao;
    /**
     * 获取服务项目列表
     */
    public PageEnvelop<List<Map<String,Object>>> getServeDictList(String orgName, String itemName, Integer page, Integer size){
        String sql = " select dict.*,cast(dict.del as UNSIGNED INTEGER)as del,cast(org.name as char)as org_name  from base_life_care_item_dict dict INNER JOIN base_org org on dict.org_code = org.code  where dict.del=1 and org.del=1 ";
        String sqlCount = " select count(dict.id) from base_life_care_item_dict dict INNER JOIN base_org org on dict.org_code = org.code  where dict.del=1 and org.del=1  ";
        String filter = " ";
        if (StringUtils.isNotBlank(orgName)){
            filter +=" and org.name like '%"+orgName+"%' ";
        }
        if (StringUtils.isNotBlank(itemName)){
            filter +=" and dict.name like '%"+itemName+"%' ";
        }
        Long count = jdbcTemplate.queryForObject(sqlCount+filter,Long.class);
        filter += " order by dict.org_code,dict.sort asc ";
        filter += " limit "+(page-1)*size+","+size;
        List<Map<String,Object>> list = jdbcTemplate.queryForList(sql+filter);
        return PageEnvelop.getSuccessListWithPage("success",list,page,size,count);
    }
    public String saveLifeItem(String json){
        LifeCareItemDictDO lifeCareItemDictDO = JSONObject.parseObject(json,LifeCareItemDictDO.class);
        if (StringUtils.isBlank(lifeCareItemDictDO.getId())){
            lifeCareItemDictDO.setDel(1);
            String code =" ";
            Boolean notExist=true;
            while (notExist){
                code = RandomStringUtils.randomAlphanumeric(10);
                notExist = findServeItemByCode(code);
            }
            lifeCareItemDictDO.setCode(code);
        }
        lifeCareItemDictDao.save(lifeCareItemDictDO);
        return "success";
    }
    public String delLifeItem(String id,Integer status){
        LifeCareItemDictDO lifeCareItemDictDO = lifeCareItemDictDao.findOne(id);
        if(null == lifeCareItemDictDO){
            return " 未找到改服务项目 ";
        }
        lifeCareItemDictDO.setDel(status);
        lifeCareItemDictDao.save(lifeCareItemDictDO);
        return "success";
    }
    public LifeCareItemDictDO getLifeItemDetail(String id){
        return lifeCareItemDictDao.findOne(id);
    }
    public boolean findServeItemByCode(String code){
        String sql = " select count(id) from base_life_care_item_dict where code='"+code+"' " ;
        Integer exist = jdbcTemplate.queryForObject(sql,Integer.class);
        return exist>0?true:false;
    }
}

+ 4 - 2
svr/svr-cloud-care/src/main/java/com/yihu/jw/care/dao/lifeCare/LifeCareItemDictDao.java

@ -1,6 +1,5 @@
package com.yihu.jw.care.dao.lifeCare;
import com.yihu.jw.entity.base.servicePackage.ServicePackageItemDO;
import com.yihu.jw.entity.care.lifeCare.LifeCareItemDictDO;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Query;
@ -13,7 +12,10 @@ import java.util.List;
 */
public interface LifeCareItemDictDao  extends PagingAndSortingRepository<LifeCareItemDictDO, String>, JpaSpecificationExecutor<LifeCareItemDictDO> {
    @Query("from LifeCareItemDictDO w where  w.del=1 order by sort asc")
    @Query("from LifeCareItemDictDO w where  w.del=1 order by w.sort asc")
    List<LifeCareItemDictDO> findByAll();
    @Query("from LifeCareItemDictDO w where  w.del=1 and w.orgCode=?1 order by w.sort asc")
    List<LifeCareItemDictDO> findByOrgCode(String orgCode);
}

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

@ -102,9 +102,10 @@ public class PadLifeCareEndpoint extends EnvelopRestEndpoint {
    @GetMapping(value = "findItemDict")
    @ApiOperation(value = "查找服务项字典")
    public ListEnvelop findItemDict() {
    public ListEnvelop findItemDict(@ApiParam(value = "orgCode", name = "orgCode")
                                    @RequestParam(value = "orgCode", required = true) String orgCode) {
        try {
            return ListEnvelop.getSuccess("查询成功",lifeCareOrderService.findItemDict());
            return ListEnvelop.getSuccess("查询成功",lifeCareOrderService.findItemDict(orgCode));
        }catch (Exception e){
            return failedListEnvelopException2(e);
        }

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

@ -131,9 +131,10 @@ public class PatientLifeCareEndpoint  extends EnvelopRestEndpoint {
    @GetMapping(value = "findItemDict")
    @ApiOperation(value = "查找服务项字典")
    public ListEnvelop findItemDict() {
    public ListEnvelop findItemDict(@ApiParam(value = "orgCode", name = "orgCode")
                                   @RequestParam(value = "orgCode", required = true) String orgCode) {
        try {
            return ListEnvelop.getSuccess("查询成功",lifeCareOrderService.findItemDict());
            return ListEnvelop.getSuccess("查询成功",lifeCareOrderService.findItemDict(orgCode));
        }catch (Exception e){
            return failedListEnvelopException2(e);
        }

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

@ -347,10 +347,11 @@ public class LifeCareOrderService extends BaseJpaService<LifeCareOrderDO, LifeCa
    /**
     * 查找服务项字典
     *   v1.7.1 机构的生活照料服务项目必须配置才有返回
     * @return
     */
    public List<LifeCareItemDictDO> findItemDict(){
        return lifeCareItemDictDao.findByAll();
    public List<LifeCareItemDictDO> findItemDict(String orgCode){
        return lifeCareItemDictDao.findByOrgCode(orgCode);
    }
    /**

+ 1 - 1
svr/svr-cloud-care/src/main/java/com/yihu/jw/care/service/sign/ServicePackageService.java

@ -664,7 +664,7 @@ public class ServicePackageService extends BaseJpaService<ServicePackageDO, Serv
    }
    public List<Map<String,Object>> getServerDoctorAll(String patient,String onlineFlag,String doctorLevel){
        String sql="SELECT DISTINCT doc.id doctor,doc.name as doctorName,CONCAT(doc.`name`,CASE WHEN doc.doctor_level=1 " +
        String sql="SELECT DISTINCT doc.id doctor,doc.name as doctorName,doc.sex,CONCAT(doc.`name`,CASE WHEN doc.doctor_level=1 " +
                " THEN '(社区医生)' ELSE '(社工)' END) as name,doc.photo,doc.mobile,doc.job_title_name as jobName,doc.job_title_code as job, " +
                " 0 as onLineFlag,org.code,org.name as orgName ,doc.doctor_level doctorLevel " +
                "from base_service_package_sign_record sr,base_service_package_record r,base_team_member m,base_doctor doc, " +

+ 3 - 0
svr/svr-cloud-care/src/main/java/com/yihu/jw/care/util/MessageUtil.java

@ -279,6 +279,9 @@ public class MessageUtil {
            case 36://安防、救助工单详情地址
                wxTemplateConfigDO.setUrl(wxTemplateConfigDO.getUrl()+"?openid=" + openid+"&id="+json.getString("id")+"&OrderType="+json.getString("OrderType"));
                break;
            case 37://居民血压血糖列表详情
                wxTemplateConfigDO.setUrl(wxTemplateConfigDO.getUrl()+"?openid=" + openid+"&patientId="+json.getString("patientId")+"&type="+json.getString("type"));
                break;
        }
        return wxTemplateConfigDO;
    }

+ 6 - 0
svr/svr-cloud-device/pom.xml

@ -144,6 +144,12 @@
            <version>2.7.3</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>com.yihu.jw</groupId>
            <artifactId>push-service</artifactId>
            <version>2.0.0</version>
            <scope>compile</scope>
        </dependency>
    </dependencies>

+ 43 - 3
svr/svr-cloud-device/src/main/java/com/yihu/jw/care/service/DeviceService.java

@ -6,9 +6,7 @@ import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.yihu.jw.care.config.AqgConfig;
import com.yihu.jw.care.dao.device.*;
import com.yihu.jw.care.util.DeviceDataPushLogUtil;
import com.yihu.jw.care.util.DeviceLostMessageUtil;
import com.yihu.jw.care.util.SecurityOrderUtil;
import com.yihu.jw.care.util.*;
import com.yihu.jw.entity.base.patient.BasePatientDO;
import com.yihu.jw.entity.care.device.*;
import com.yihu.jw.entity.hospital.message.SystemMessageDO;
@ -103,6 +101,14 @@ public class DeviceService {
    private BasePatientStepDao stepDao;
    @Autowired
    private BaseSleepX1deviceDao baseSleepX1deviceDao;
    @Autowired
    private CountDistance countDistance;
    @Autowired
    private MessageUtil messageUtil;
    @Value("${wechat.id}")
    private String wxId;
    @Autowired
    private PatientFamilyService patientFamilyService;
    /**
     * 获取爱牵挂管理员cookie
@ -376,6 +382,40 @@ public class DeviceService {
                    BasePatientDO patientDO = patientDao.findById(deviceDO.getUser());
                    JSONObject position = gpsUtil.gcj02_To_Bd09(lat,lon);
                    patientDO.setLatLon(position.getDouble("lat")+","+position.getDouble("lon"));
                    if (StringUtils.isNotBlank(patientDO.getHomeLatLon())){
                        String homeLatLon = patientDO.getHomeLatLon();
                        double homeLat = Double.parseDouble(homeLatLon.split(",")[0]);
                        double homeLon = Double.parseDouble(homeLatLon.split(",")[1]);
                        double homeDistance = countDistance.getDistance(homeLat,homeLon,position.getDouble("lat"), position.getDouble("lon"));
                        Integer homeStateNow = 0;
                        String first = "";
                        String keyword2="";
                        String keyword3="";
                        if (homeDistance * 1000 > 50) {
                            homeStateNow=0;
                            first=patientDO.getName()+"已离家";
                            keyword2="【离家提醒】";
                            keyword3 = patientDO.getName()+"已离家,请及时跟进";
                        } else {
                            homeStateNow=1;
                            first=patientDO.getName()+"已到家";
                            keyword2="【到家提醒】";
                            keyword3 = patientDO.getName()+"已到家,请知悉";
                        }
                        if (null!=patientDO.getHomeState()){
                            if (homeStateNow!=patientDO.getHomeState()){//居民离家/回家
                                List<Map<String,Object>> families = patientFamilyService.getPatientFamilyList(patientDO.getId(),"3");
                                for (Map<String,Object>tmp:families){
                                    if (null!=tmp.get("openid")){
                                        if (StringUtils.isNotBlank(tmp.get("openid").toString())){
                                            boolean success = messageUtil.putTemplateWxMessage(wxId,"template_error_notice","lrjjztgxtz",tmp.get("openid").toString(),first,null,null,null,null,DateUtil.getStringDate(),keyword2,keyword3);
                                        }
                                    }
                                }
                            }
                        }
                        patientDO.setHomeState(homeStateNow);
                    }
                    patientDao.save(patientDO);
                }
            }

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

@ -8,6 +8,7 @@ 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.MessageUtil;
import com.yihu.jw.care.util.SecurityOrderUtil;
import com.yihu.jw.entity.base.patient.BasePatientDO;
import com.yihu.jw.entity.care.device.*;
@ -25,6 +26,7 @@ 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;
@ -76,6 +78,12 @@ public class DeviceUploadService {
    private PatientSafeAreaDao safeAreaDao;
    @Autowired
    private DeviceDataPushLogUtil dataPushLogUtil;
    @Autowired
    private MessageUtil messageUtil;
    @Value("${wechat.id}")
    private String wxId;
    @Autowired
    private PatientFamilyService patientFamilyService;
    public Result uploadDevicesData(String dataJson, HttpServletRequest request)throws Exception {
        try {
@ -199,6 +207,47 @@ public class DeviceUploadService {
                    patientHealthIndexDao.save(result);
                    systemMessageDao.save(messageDO);
                    imUtil.sendPatientSystemMessage(messageDO.getReceiver(),JSON.toJSONString(message,SerializerFeature.WriteMapNullValue));
                    //发送模板消息通知家属
                    List<Map<String,Object>> families = patientFamilyService.getPatientFamilyList(patientDO.getId(),"3");
                    if (families.size()>0){
                        String keyword1 = "";
                        String first ="";
                        com.alibaba.fastjson.JSONObject jsonObject = new com.alibaba.fastjson.JSONObject();
                        jsonObject.put("patientId",patientDO.getId());
                        jsonObject.put("type",result.getType()+"");
                        if ("1".equals(result.getType())){//血糖
                            first = patientDO.getName()+"最新测量血糖值反馈";
                            keyword1 = "【{key1}:"+result.getValue1()+"mmol/L】";
                            String value2 = null==result.getValue2()?"1":result.getValue2();
                            switch (value2){
                                case "1":keyword1 = keyword1.replace("{key1}","早餐前血糖"); break;
                                case "2":keyword1 = keyword1.replace("{key1}","早餐后血糖"); break;
                                case "3":keyword1 = keyword1.replace("{key1}","午餐前血糖"); break;
                                case "4":keyword1 = keyword1.replace("{key1}","午餐后血糖"); break;
                                case "5":keyword1 = keyword1.replace("{key1}","晚餐前血糖"); break;
                                case "6":keyword1 = keyword1.replace("{key1}","晚餐后血糖"); break;
                                case "7":keyword1 = keyword1.replace("{key1}","睡前血糖"); break;
                            }
                            for (Map<String,Object>tmp:families){
                                if (null!=tmp.get("openid")){
                                    if (org.apache.commons.lang.StringUtils.isNotBlank(tmp.get("openid").toString())){
                                        boolean success = messageUtil.putTemplateWxMessage(wxId,"template_measure_result_notice","jktzcljgtz",patientDO.getOpenid(),first,null,null,37,jsonObject,keyword1,"请注意日常饮食");
                                    }
                                }
                            }
                        }
                        if ("2".equals(result.getType())){//血压
                            first= patientDO.getName()+" 最新测量血压值反馈";
                            keyword1 = "【收缩压:"+result.getValue1()+"mmgh 舒张压:"+result.getValue2()+"mmgh】";
                            for (Map<String,Object>tmp:families){
                                if (null!=tmp.get("openid")){
                                    if (org.apache.commons.lang.StringUtils.isNotBlank(tmp.get("openid").toString())){
                                        boolean success = messageUtil.putTemplateWxMessage(wxId,"template_measure_result_notice","jktzcljgtz",patientDO.getOpenid(),first,null,null,37,jsonObject,keyword1,"请注意日常饮食");
                                    }
                                }
                            }
                        }
                    }
                }
            }
        } catch (Exception e) {

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

@ -0,0 +1,32 @@
package com.yihu.jw.care.service;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Map;
/**
 * Created by Bing on 2022/3/10.
 */
@Service
public class PatientFamilyService {
    @Autowired
    private JdbcTemplate jdbcTemplate;
    public List<Map<String,Object>> getPatientFamilyList(String patient,String archive_type){
        String sql = "select t2.* " +
                "from base_patient t2 INNER JOIN base_patient_family_member t1 on t1.family_member = t2.id " +
                "where t1.patient = ? and t2.del=1  ";
        if (StringUtils.isNotBlank(archive_type)){
            sql += " and t2.archive_type in ('"+archive_type.replace(",","','")+"') ";
        }
        sql += " group by t2.id ";
        List<Map<String, Object>> result = jdbcTemplate.queryForList(sql, new Object[]{patient});
        return result;
    }
}

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

@ -0,0 +1,455 @@
package com.yihu.jw.care.util;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.yihu.jw.doctor.dao.BaseDoctorDao;
import com.yihu.jw.entity.base.doctor.BaseDoctorDO;
import com.yihu.jw.entity.base.org.BaseOrgDO;
import com.yihu.jw.entity.base.wx.WxAccessTokenDO;
import com.yihu.jw.entity.base.wx.WxTemplateConfigDO;
import com.yihu.jw.entity.care.common.GetuiClientDO;
import com.yihu.jw.entity.care.doorCoach.BaseDoorCoachOrderDO;
import com.yihu.jw.entity.care.lifeCare.LifeCareOrderDO;
import com.yihu.jw.entity.care.securitymonitoring.SecurityMonitoringOrderDO;
import com.yihu.jw.entity.hospital.message.SystemMessageDO;
import com.yihu.jw.hospital.message.dao.SystemMessageDao;
import com.yihu.jw.org.dao.BaseOrgDao;
import com.yihu.jw.patient.dao.BasePatientDao;
import com.yihu.jw.push.dao.GetuiClientDao;
import com.yihu.jw.push.service.GetuiService;
import com.yihu.jw.sms.service.TXYSmsService;
import com.yihu.jw.util.wechat.WeixinMessagePushUtils;
import com.yihu.jw.wechat.dao.WxAccessTokenDao;
import com.yihu.jw.wechat.dao.WxTemplateConfigDao;
import com.yihu.jw.wechat.service.WxAccessTokenService;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;
import java.util.Date;
import java.util.List;
import java.util.UUID;
/**
 * Created by liub on 2020/12/28.
 */
@Component
public class MessageUtil {
    private static Logger logger = LoggerFactory.getLogger(MessageUtil.class);
    @Autowired
    private WxAccessTokenService wxAccessTokenService;
    @Value("${hospital.url}")
    private String serverUrl;
    @Autowired
    private WeixinMessagePushUtils weixinMessagePushUtils;
    @Autowired
    private WxTemplateConfigDao wxTemplateConfigDao;
    @Autowired
    private JdbcTemplate jdbcTemplate;
    @Autowired
    private SystemMessageDao systemMessageDao;
    @Autowired
    private WxAccessTokenDao wxAccessTokenDao;
    @Autowired
    private BaseDoctorDao baseDoctorDao;
    @Autowired
    private BasePatientDao basePatientDao;
    @Autowired
    private BaseOrgDao orgDao;
    @Autowired
    private TXYSmsService txySmsService;
    @Autowired
    private GetuiService getuiService;
    @Autowired
    private GetuiClientDao getuiClientDao;
    /**
     * 您好{1}有一条新的在线报名申请,请及时前往APP消息应用进行处理。
     * @param orgCode
     */
    @Async
    public void sendOnlineRegistSms(String orgCode){
        BaseOrgDO orgDO = orgDao.findByCode(orgCode);
        if(StringUtils.isNotBlank(orgDO.getMobile())){
            sendTXYSJson("976005",orgDO.getMobile(),orgDO.getName());
        }
    }
    /**
     * 发送医生个推推送消息
     * type 1 安防紧急预警 2紧急呼叫 4im 5生日祝福
     */
    public void sendDoctorGetuiMessage(String doctorCode,String type,String url,String title,String body){
        try {
            List<GetuiClientDO> clientDOS = getuiClientDao.findByUser(doctorCode,2);
            JSONObject payload = new JSONObject();
            payload.put("title",title);
            payload.put("body",body);
            payload.put("url",url);
            JSONObject json = new JSONObject();
            json.put("title",title);
            json.put("body",body);
            json.put("url",url);
//        json.put("clickType","url");
            json.put("platform",getuiService.cloudCareDoctor);
            json.put("payload",payload.toString());
            for(GetuiClientDO clientDO:clientDOS){
                getuiService.push2(clientDO.getClientId(),Integer.valueOf(clientDO.getClientType()),json);
            }
        }catch (Exception e){
            e.printStackTrace();
        }
    }
    /**
     *
     * @param wechatId
     * @param templateName
     * @param scene
     * @param openId
     * @param first
     * @param url 跳转链接
     * @param remark
     * @param type  模板通知类型
     * @param json 用于对跳转连接的修改,
     * @param keywords
     */
    public boolean putTemplateWxMessage(String wechatId, String templateName, String scene, String openId, String first
            ,String url, String remark, Integer type,JSONObject json,String ...keywords) {
        try {
            System.out.println(wechatId);
            WxAccessTokenDO wxAccessTokenDO = wxAccessTokenService.getWxAccessTokenById(wechatId);
            if (wxAccessTokenDO == null) {
                logger.info("wx_access_token表获取为空,wechatId" + wechatId);
                return false;
            }
            WxTemplateConfigDO templateConfig = wxTemplateConfigDao.findByWechatIdAndTemplateNameAndSceneAndStatus(wechatId, templateName, scene, 1);
            WxTemplateConfigDO newConfig = new WxTemplateConfigDO();
            BeanUtils.copyProperties(templateConfig,newConfig);
            if (newConfig == null) {
                logger.info("微信模板不存在!请确认wechatId:" + wechatId + ",templateName:" + templateName + ",scene:" + scene);
                return false;
            }
            logger.info("微信模板推送前");
            if (StringUtils.isNoneBlank(first)){
                newConfig.setFirst(first);
            }
            if (StringUtils.isNoneBlank(url)){
                newConfig.setUrl(url);
            }
            if (StringUtils.isNoneBlank(remark)){
                newConfig.setRemark(remark);
            }
            newConfig = setTemPlateUrl(newConfig,type,openId,json);
            int keyLength = keywords.length;
            if (keyLength >= 1) {
               if(StringUtils.isNoneBlank(keywords[0])){
                   newConfig.setKeyword1(keywords[0]);
                }
            }
            if (keyLength >= 2) {
                if(StringUtils.isNoneBlank(keywords[1])){
                    newConfig.setKeyword2(keywords[1]);
                }
            }
            if (keyLength >= 3) {
                if(StringUtils.isNoneBlank(keywords[2])){
                    newConfig.setKeyword3(keywords[2]);
                }
            }
            if (keyLength >= 4) {
                if(StringUtils.isNoneBlank(keywords[3])){
                    newConfig.setKeyword4(keywords[3]);
                }
            }
            if (keyLength >= 5) {
                if(StringUtils.isNoneBlank(keywords[4])){
                    newConfig.setKeyword5(keywords[4]);
                }
            }
            if (keyLength >= 6) {
                if(StringUtils.isNoneBlank(keywords[5])){
                    newConfig.setKeyword6(keywords[5]);
                }
            }
            if (keyLength >= 7) {
                if(StringUtils.isNoneBlank(keywords[6])){
                    newConfig.setKeyword7(keywords[6]);
                }
            }
            //发起微信消息模板推送
            weixinMessagePushUtils.putWxMsg(wxAccessTokenDO.getAccessToken(), openId, newConfig);
            logger.info("微信模板消息推送后");
            return true;
        } catch (Exception e) {
            logger.info("微信模板推送异常");
            e.printStackTrace();
            return false;
        }
    }
    @Async
    public String sendTXYSJson(String templateCode,String mobile,String ...params){
        JSONObject sendObj = new JSONObject();
        sendObj.put("templateCode",templateCode);
        if (params.length>0){
            JSONArray paramArr =JSONArray.parseArray(JSON.toJSONString(params));
            sendObj.put("templateParamArr",paramArr);
        }else {
            JSONArray paramArr =new JSONArray();
            sendObj.put("templateParamArr",paramArr);
        }
        return txySmsService.sendMessageJson(mobile,sendObj);
    }
    public WxTemplateConfigDO setTemPlateUrl(WxTemplateConfigDO wxTemplateConfigDO,Integer type,String openid,JSONObject json){
        String url =  "taian-wx/html/";
        if (json==null){
            return wxTemplateConfigDO;
        }
        switch (type){
            case 1:
                //咨询回复
                wxTemplateConfigDO.setUrl(wxTemplateConfigDO.getUrl() + "?sessionId=" + json.getString("sessionId")
                        +"&type="+json.getString("consultType")+"&orgCode="+json.getString("orgCode")+"&openid="+openid);
                break;
            case 2:
                wxTemplateConfigDO.setUrl(wxTemplateConfigDO.getUrl() + "?openid=" + openid+"&id="+json.getString("id"));
                break;
            case 3:
                wxTemplateConfigDO.setUrl(wxTemplateConfigDO.getUrl() + "?openid=" + openid);
                break;
            case 19:
                String urlStr= wxTemplateConfigDO.getUrl();
                boolean status = urlStr.contains("openid=");
                if(!status){
                    urlStr=json.getString("url")+"?openid=" + openid;
                }
                wxTemplateConfigDO.setUrl(url + urlStr );
                break;
            case 26://生日祝福
                wxTemplateConfigDO.setUrl(wxTemplateConfigDO.getUrl()+"?openid=" + openid + "&id=" + json.getString("id"));
                break;
            case 28://视频请求
                //?channelName="'&nickName=''&token=' '
                wxTemplateConfigDO.setUrl(wxTemplateConfigDO.getUrl()+"?openid=" + openid + "&channelName=" + json.getString("channelName")
                        + "&nickName=" + json.getString("nickName")+ "&token=" + json.getString("token")
                        + "&userId=" + json.getString("userId")+ "&userName=" + json.getString("userName")
                        + "&sessionId=" + json.getString("sessionId"));
                break;
            case 30:
                //反馈通知 测试 TPbq9m0SAiVfRhXtXq17SDmYIfrJ8Whp2NpSrq9wlfI
                if(json.containsKey("consult")) {
                    wxTemplateConfigDO.setUrl(url + wxTemplateConfigDO.getUrl() + "?openid=" + openid + "&consult=" + json.getString("consult"));
                }else if (json.containsKey("id")){
                    wxTemplateConfigDO.setUrl(url + wxTemplateConfigDO.getUrl() + "?openid=" + openid + "&id=" + json.getString("id"));
                }else if(json.containsKey("relationCode")){
                    wxTemplateConfigDO.setUrl(url + wxTemplateConfigDO.getUrl() + "?openid=" + openid );
                }else if(json.containsKey("resultCode")){
                    wxTemplateConfigDO.setUrl(url + wxTemplateConfigDO.getUrl() + "?resultCode=" + json.getString("resultCode"));
                }
                break;
            case 31:
                //上门服务医生评分
                wxTemplateConfigDO.setUrl(url + wxTemplateConfigDO.getUrl()+"?openid=" + openid + "&id=" + json.getString("id")+ "&finish=" + json.getString("finish"));
                break;
            case 32:
                String url1 = "wx/common/";
                wxTemplateConfigDO.setUrl(url1 + wxTemplateConfigDO.getUrl()+"?openid=" + openid + "&consult=" + json.getString("consult") + "&status=" + json.getInteger("status"));
                break;
            case 34:
                wxTemplateConfigDO.setUrl(url + wxTemplateConfigDO.getUrl() + "?openid=" + openid + "&orderId=" + json.getString("orderId")+ "&authorizeImage=" + json.getString("authorizeImage"));
                break;
            case 35:
                wxTemplateConfigDO.setUrl(url + wxTemplateConfigDO.getUrl()+json.getString("orderId")+"&isMask=1");
                break;
            case 36://安防、救助工单详情地址
                wxTemplateConfigDO.setUrl(wxTemplateConfigDO.getUrl()+"?openid=" + openid+"&id="+json.getString("id")+"&OrderType="+json.getString("OrderType"));
                break;
            case 37://居民血压血糖列表详情
                wxTemplateConfigDO.setUrl(wxTemplateConfigDO.getUrl()+"?openid=" + openid+"&patientId="+json.getString("patientId")+"&type="+json.getString("type"));
                break;
        }
        return wxTemplateConfigDO;
    }
    /**
     *
     */
    public SystemMessageDO saveSystemMessage(String messageId, String relationCode, String title, String type, String sender, String senderName, String receiver, String receiverName, String idCard, String msg, String over) {
        SystemMessageDO messageDO = new SystemMessageDO();
        if (StringUtils.isBlank(messageId)) {
            messageDO.setId(UUID.randomUUID().toString().replace("-", ""));
        }
        messageDO.setTitle(title);
        messageDO.setType(type);
        messageDO.setSender(sender);
        messageDO.setSenderName(senderName);
        messageDO.setRelationCode(relationCode);
        messageDO.setReceiver(receiver);
        messageDO.setReceiverName(receiverName);
        messageDO.setData(msg);
        messageDO.setDel("1");
        messageDO.setOver(over);
        messageDO.setCreateTime(new Date());
        systemMessageDao.save(messageDO);
        return messageDO;
    }
    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);
    }
    public void updateLifeCareMessage(LifeCareOrderDO orderDO, String[] type, String toType){
        String orderId=orderDO.getId();
        List<SystemMessageDO> messages = systemMessageDao.queryByRelationCodeAndTypeIn(orderId,type);
        if (toType.equals("patientCancel")){//居民取消 消息列表也应该不显示
            if(CollectionUtils.isEmpty(messages)){
                logger.error("当前工单没有系统消息!!orderId:" + orderId);
            } else {
                messages.forEach(
                        message -> {
                            message.setOver("0");
                            systemMessageDao.save(message);
                        }
                );
            }
        }
    }
    public void updateSecurityMonitoringOrderMessage(SecurityMonitoringOrderDO orderDO, String[] type, String toType){
        String orderId=orderDO.getId();
        List<SystemMessageDO> messages = systemMessageDao.queryByRelationCodeAndTypeIn(orderId,type);
        if (toType.equals("patientCancel")){//居民取消 消息列表也应该不显示
            if(CollectionUtils.isEmpty(messages)){
                logger.error("当前安防工单没有系统消息!!orderId:" + orderId);
            } else {
                messages.forEach(
                        message -> {
                            message.setOver("0");
                            systemMessageDao.save(message);
                        }
                );
            }
        }
    }
    //上门辅导消息更新
    public void updateDoorCoachMessage(BaseDoorCoachOrderDO doorServiceOrder, String[] type, String toType, String sender, String receiver){
        String orderId=doorServiceOrder.getId();
        List<SystemMessageDO> messages = systemMessageDao.queryByRelationCodeAndTypeIn(orderId,type);
        if (toType.equals("734")){//医生接单
            if (CollectionUtils.isEmpty(messages)){
                logger.error("当前工单没有医生待接单消息!orderId:" + orderId);
            }else {
                messages.forEach(message->{
                    if (message.getType().equals("703") ) {
                        BaseDoctorDO baseDoctorDO = baseDoctorDao.findById(doorServiceOrder.getDispatcher());//·
                        String msg=doorServiceOrder.getDispatcherName() + "接受了服务工单"+ doorServiceOrder.getNumber();
                        saveSystemMessage(message.getId(),message.getRelationCode(),"医生接单","734",doorServiceOrder.getDoctor(),doorServiceOrder.getDoctorName(),
                                doorServiceOrder.getDispatcher(),doorServiceOrder.getDispatcherName(),null,msg,message.getOver());
                    }
                    else{
                        message.setOver("0");
                        systemMessageDao.save(message);
                    }
                });
            }
        }
        if (toType.equals("735")) {//医生拒单
            if (CollectionUtils.isEmpty(messages)) {
                logger.error("当前工单没有医生待接单消息!orderId:" + orderId);
            } else {
                SystemMessageDO message = messages.get(0);
                BaseDoctorDO baseDoctorDO = baseDoctorDao.findById(doorServiceOrder.getDispatcher());
                String msg=doorServiceOrder.getDoctorName() + "拒绝了服务工单" + doorServiceOrder.getNumber() + ", 请重新派单";
                saveSystemMessage(message.getId(),message.getRelationCode(),"医生拒单","735",doorServiceOrder.getDoctor(),doorServiceOrder.getDoctorName(),
                        doorServiceOrder.getDispatcher(),doorServiceOrder.getDispatcherName(),null,msg,message.getOver());
            }
        }
        if (toType.equals("731")) {//调度员派单(派给本社区医生)
            if(CollectionUtils.isEmpty(messages)){
                logger.error("当前工单没有 居民新增预约 消息!!orderId:" + orderId);
            }else{
                // 设置消息处理完毕
                messages.forEach(
                        message -> {
                            String title = "调度员派单(派给本社区医生)";
                            if("system".equals(doorServiceOrder.getUpdateUser())){
                                title = "系统派单(派给服务医生)";
                            }
                            if (message.getType() .equals("730")) {
                                message.setTitle(title);
                                String msg = doorServiceOrder.getDispatcherName() + "已将服务工单" + doorServiceOrder.getNumber() + "指派给" + doorServiceOrder.getDoctorName() + "医生";
                                saveSystemMessage(message.getId(),message.getRelationCode(),title,"731",doorServiceOrder.getUpdateUser(),doorServiceOrder.getUpdateUserName(),
                                        doorServiceOrder.getUpdateUser(),doorServiceOrder.getUpdateUserName(),null,msg,message.getOver());
                            }else{
                                message.setOver("0");
                                systemMessageDao.save(message);
                            }
                        }
                );
            }
        }
        if (toType.equals("732")){//调度员拒单
            if(CollectionUtils.isEmpty(messages)){
                logger.error("当前工单没有系统消息!!orderId:" + orderId);
            } else {
                // 432 调度员拒单即取消工单-- 李四拒绝了张三的服务工单12345678
                messages.forEach(
                        message -> {
                            if (message.getType() .equals("730")) {
                                String msg=doorServiceOrder.getDispatcherName() + "拒绝了"+ doorServiceOrder.getPatientName() +"的服务工单" + doorServiceOrder.getNumber();
                                saveSystemMessage(message.getId(),message.getRelationCode(),"调度员拒单","732",doorServiceOrder.getDispatcher(),doorServiceOrder.getDispatcherName(),
                                        doorServiceOrder.getDispatcher(),doorServiceOrder.getDispatcherName(),null,msg,message.getOver());
                            }else{
                                message.setOver("0");
                                systemMessageDao.save(message);
                            }
                        }
                );
            }
        }
        if (toType.equals("patientCancel")){//居民取消 消息列表也应该不显示
            if(CollectionUtils.isEmpty(messages)){
                logger.error("当前工单没有系统消息!!orderId:" + orderId);
            } else {
                messages.forEach(
                        message -> {
                            message.setOver("0");
                            systemMessageDao.save(message);
                        }
                );
            }
        }
    }
}

+ 9 - 7
svr/svr-cloud-device/src/main/resources/application.yml

@ -316,13 +316,15 @@ hospital:
  SourceSysCode: S60
  TargetSysCode: S01
wechat:
  appId: wxd03f873d
  appSecret: 2935b54b53a950a544f2537
  wechat_token: 27eb3bb24f1bb154b08040
  wechat_base_url: http%3a%n%2fwlyy-dev
  accId: gh0fb21
  id: ijk  # base库中,wx_wechat 的id字段
  flag: false #演示环境  true走Mysql数据库  false走Oracle
  appId: wx2c55f5b7b2f3cb56
  appSecret: 0dd9927e58125ad5f0efb9299860d145
  apiKey: zhongjianxinlianxiamenkejiyouxia
  mchId: 1611059985
  wechat_token: 27eb3bb24f149a7760cf1bb154b08041
  wechat_base_url: https%3A%2F%2Fzhyzh.gongshu.gov.cn%2FcloudCare%2F
  accId: gh_da06ed9e5751
  id: hz_yyyzh_wx  # base库中,wx_wechat 的id字段
  flag: true #演示环境  true走Mysql数据库  false走Oracle
im:
  im_list_get: http://127.0.0.1:3000/

+ 10 - 0
svr/svr-cloud-job/src/main/java/com/yihu/jw/care/event/ApplicationEvent.java

@ -6,6 +6,7 @@ import com.yihu.jw.care.job.consult.FinishConsultJob;
import com.yihu.jw.care.job.data.SaveDataPushJob;
import com.yihu.jw.care.job.device.DeviceLostAssociationJob;
import com.yihu.jw.care.job.device.PatientSosContactsJob;
import com.yihu.jw.care.job.device.PressureGlucoseNotJob;
import com.yihu.jw.care.job.message.DoctorSendUnreadJob;
import com.yihu.jw.care.job.message.PatientSendUnreadJob;
import com.yihu.jw.care.job.order.CancelPayOrderJob;
@ -163,6 +164,15 @@ public class ApplicationEvent implements ApplicationListener<ContextRefreshedEve
                logger.info("GET_SIMS_VOICE_FLOW_MONTH_JOB success");
            }
            //#每天早上10点发送血压(1天)血糖(7天)未测量通知
            if (!quartzHelper.isExistJob("BLOOD_PRESSURE_GLUCOSE_NOT_MEASURED")){
                String trigger = SystemConf.getInstance().getSystemProperties().getProperty("BLOOD_PRESSURE_GLUCOSE_NOT_MEASURED");
                quartzHelper.addJob(PressureGlucoseNotJob.class, trigger, "BLOOD_PRESSURE_GLUCOSE_NOT_MEASURED", new HashMap<String, Object>());
                logger.info("BLOOD_PRESSURE_GLUCOSE_NOT_MEASURED success");
            }else {
                logger.info("BLOOD_PRESSURE_GLUCOSE_NOT_MEASURED success");
            }
        } catch (Exception e) {
            logger.info(" job start failed");
        }

+ 34 - 0
svr/svr-cloud-job/src/main/java/com/yihu/jw/care/job/device/PressureGlucoseNotJob.java

@ -0,0 +1,34 @@
package com.yihu.jw.care.job.device;
import com.yihu.jw.care.service.device.PressureGlucoseNotService;
import org.quartz.DisallowConcurrentExecution;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
/**
 * Created by Bing on 2022/3/10.
 * 患者血压(1天)、血糖(7天)未测量通知
 */
@DisallowConcurrentExecution
public class PressureGlucoseNotJob implements Job {
    private static Logger logger = LoggerFactory.getLogger(PressureGlucoseNotJob.class);
    @Autowired
    private PressureGlucoseNotService pressureGlucoseNotService;
    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        logger.info("BLOOD_PRESSURE_GLUCOSE_NOT_MEASURED job start");
        try {
            pressureGlucoseNotService.sendNotice();
            logger.info("BLOOD_PRESSURE_GLUCOSE_NOT_MEASURED job end");
        }catch (Exception e){
            e.printStackTrace();
            logger.info("BLOOD_PRESSURE_GLUCOSE_NOT_MEASURED job end===ERROE===,message:"+e.getMessage());
        }
    }
}

+ 84 - 0
svr/svr-cloud-job/src/main/java/com/yihu/jw/care/service/device/PressureGlucoseNotService.java

@ -0,0 +1,84 @@
package com.yihu.jw.care.service.device;
import com.alibaba.fastjson.JSONObject;
import com.yihu.jw.care.util.DateUtil;
import com.yihu.jw.care.util.MessageUtil;
import org.apache.commons.lang3.StringUtils;
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 java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Map;
/**
 * Created by Bing on 2022/3/10.
 */
@Service
public class PressureGlucoseNotService {
    @Autowired
    private JdbcTemplate jdbcTemplate;
    @Autowired
    private MessageUtil messageUtil;
    @Value("${wechat.id}")
    private String wxId;
    public void sendNotice(){
        Date date = new Date();
        Date yesDay = DateUtil.getPreDays(date,-1);
        Date Day7pre = DateUtil.getPreDays(date,-7);
        String dateTime = DateUtil.dateToStr(yesDay,DateUtil.YYYY_MM_DD);
        String dateTime7 = DateUtil.dateToStr(Day7pre,DateUtil.YYYY_MM_DD);
        String keyword1 = "【"+DateUtil.dateToStrLong(date)+"】";
        //血压一天内未测量 血糖7天内未测量
        String sql = " select p.id,p.name,pd.category_code from wlyy_patient_device pd INNER JOIN base_patient p on pd.`user` = p.id " +
                " where pd.del=0 and pd.category_code =2 and NOT EXISTS ( " +
                " select phi.id from wlyy_patient_health_index phi where phi.device_sn = pd.device_sn and phi.user = p.id " +
                " and phi.record_date>='"+dateTime+" 00:00:00:00' and phi.record_date<='"+dateTime+" 23:59:59' )GROUP BY p.id " +
                " UNION " +
                " select p.id,p.name,pd.category_code from wlyy_patient_device pd INNER JOIN base_patient p on pd.`user` = p.id " +
                " where pd.del=0 and pd.category_code =1 and NOT EXISTS ( " +
                " select phi.id from wlyy_patient_health_index phi where phi.device_sn = pd.device_sn and phi.user = p.id " +
                " and phi.record_date>='"+dateTime7+" 00:00:00:00' and phi.record_date<='"+dateTime7+" 23:59:59' ) GROUP BY p.id ";
        List<Map<String,Object>> list = jdbcTemplate.queryForList(sql);
        for (Map<String,Object>tmp:list){
            String patient = tmp.get("id").toString();
            sql = "select t2.id,t2.openid " +
                    "from base_patient t2 INNER JOIN base_patient_family_member t1 on t1.family_member = t2.id " +
                    "where t1.patient = '"+patient+"' and t2.del=1 and t2.archive_type=3 group by t2.id  ";
            List<Map<String, Object>> families = jdbcTemplate.queryForList(sql);
            for (Map<String, Object>familyTmo:families){
                if (null!=familyTmo.get("openid")&&StringUtils.isNotBlank(familyTmo.get("openid").toString())){
                    String first = "";
                    String keyword2="";
                    String keyword3="";
                    String patientName = null==tmp.get("name")?"":tmp.get("name").toString();
                    String category_code = tmp.get("category_code").toString();
                    JSONObject jsonObject = new JSONObject();
                    jsonObject.put("patientId",patient);
                    switch (category_code){
                        case "1":
                            first = patientName+"血糖超7天未测量";
                            keyword2="【血糖测量】";
                            keyword3=patientName+"血糖超7天未测量,请及时跟进";
                            jsonObject.put("type","1");
                            break;
                        case "2":
                            first = patientName+"血压未测量";
                            keyword2="【血压测量】";
                            keyword3=patientName+"昨日未测量血压,请及时跟进";
                            jsonObject.put("type","2");
                            break;
                    }
                    messageUtil.putTemplateWxMessage(wxId,"template_error_notice","xyxtwcltz",familyTmo.get("openid").toString(),first,null,null,37,jsonObject,keyword1,keyword2,keyword3);
                }
            }
        }
    }
}

+ 31 - 13
svr/svr-cloud-job/src/main/java/com/yihu/jw/care/util/DeviceLostMessageUtil.java

@ -1,5 +1,6 @@
package com.yihu.jw.care.util;
import com.alibaba.fastjson.JSONObject;
import com.yihu.jw.care.dao.device.PatientDeviceDao;
import com.yihu.jw.entity.base.patient.BasePatientDO;
import com.yihu.jw.entity.care.device.DevicePatientDevice;
@ -7,7 +8,9 @@ import com.yihu.jw.entity.hospital.message.SystemMessageDO;
import com.yihu.jw.hospital.message.dao.SystemMessageDao;
import com.yihu.jw.patient.dao.BasePatientDao;
import com.yihu.jw.rm.base.BaseRequestMapping;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;
@ -30,6 +33,10 @@ public class DeviceLostMessageUtil {
    private JdbcTemplate jdbcTemplate;
    @Autowired
    private BasePatientDao patientDao;
    @Autowired
    private MessageUtil messageUtil;
    @Value("${wechat.id}")
    private String wxId;
    /**
     * 设备离线通知
@ -45,12 +52,12 @@ public class DeviceLostMessageUtil {
            List<DevicePatientDevice> pds =  patientDeviceDao.findByDeviceSn(id);
            if (pds.size()>0){
                DevicePatientDevice deviceDO = pds.get(0);
                String sql = "SELECT DISTINCT d.id,d.name from base_service_package_sign_record sr,base_service_package_record r,base_team_member m,base_doctor d  " +
                String sql = "SELECT DISTINCT d.id,d.name,'doctor' as 'user' from base_service_package_sign_record sr,base_service_package_record r,base_team_member m,base_doctor d  " +
                        "               WHERE sr.status=1 and m.team_code = r.team_code and sr.id=r.sign_id and m.doctor_code = d.id " +
                        "               and m.del = '1' and sr.patient = '"+deviceDO.getUser()+"' and d.doctor_level=2 " ;
                List<Map<String,Object>> doctors = jdbcTemplate.queryForList(sql);
                // 家属
                sql = " select  t2.id,t2.name from  base_patient_family_member t1,  base_patient t2 where  " +
                sql = " select  t2.id,t2.name,t2.openid,'family3' as 'user' from  base_patient_family_member t1,  base_patient t2 where  " +
                         "t2.id in (select family_member from base_patient_family_member where patient = '"+deviceDO.getUser()+"' )  " +
                         " and t1.patient = '"+deviceDO.getUser()+"'  and t1.family_member = t2.id  " +
                         " and t2.archive_type=3 GROUP BY t2.id " ;
@ -61,34 +68,34 @@ public class DeviceLostMessageUtil {
                for (Map<String,Object> docTmp:doctors){
                    switch (deviceDO.getCategoryCode()){
                        case "1":
                            deviceName="血糖仪离线";
                            deviceName="血糖仪";
                            break;
                        case "2":
                            deviceName="血压计离线";
                            deviceName="血压计";
                            break;
                        case "4":
                            deviceName="智能手表离线";
                            deviceName="智能手表";
                            break;
                        case "7":
                            deviceName="居家安全报警器离线";
                            deviceName="居家安全报警器";
                            break;
                        case "12":
                            deviceName="监控器离线";
                            deviceName="监控器";
                            break;
                        case "13":
                            deviceName="睡眠带离线";
                            deviceName="睡眠带";
                            break;
                        case "14":
                            deviceName="气感报警器离线";
                            deviceName="气感报警器";
                            break;
                        case "15":
                            deviceName="烟感报警器离线";
                            deviceName="烟感报警器";
                            break;
                        case "16":
                            deviceName="智能拐杖离线";
                            deviceName="智能拐杖";
                            break;
                        case "17":
                            deviceName="随身WiFi离线";
                            deviceName="随身WiFi";
                            break;
                    }
                    BasePatientDO patientDO = patientDao.findById(deviceDO.getUser());
@ -102,11 +109,22 @@ public class DeviceLostMessageUtil {
                    messageDO.setReceiver(docTmp.get("id").toString());
                    messageDO.setReceiverName(docTmp.get("name").toString());
                    messageDO.setOver("1");
                    messageDO.setData(deviceName);
                    messageDO.setData(deviceName+"离线");
                    messageDO.setDel("1");
                    messageDO.setCreateTime(new Date());
                    messageDO.setSenderPhoto(patientDO.getPhoto());
                    messageDOS.add(messageDO);
                    if ("family3".equals(docTmp.get("user").toString())){//设备离线推送给家属
                        if(null!=docTmp.get("openid")&& StringUtils.isNotBlank(docTmp.get("openid").toString())){
                            String first = patientDO.getName()+" "+deviceName+"设备疑似离线";
                            String keyword1 = "【"+DateUtil.getStringDate()+"】";
                            String keyword2 = "【设备离线】";
                            String keyword3 = patientDO.getName()+" "+deviceName+"设备疑似离线,请及时跟进";
                            messageUtil.putTemplateWxMessage(wxId,"template_error_notice","sblxtz",
                                    docTmp.get("openid").toString(),first,null,null,3,new JSONObject(),keyword1,keyword2,keyword3);
                        }
                    }
                }
            }
        }

+ 3 - 0
svr/svr-cloud-job/src/main/java/com/yihu/jw/care/util/MessageUtil.java

@ -160,6 +160,9 @@ public class MessageUtil {
            case 3:
                wxTemplateConfigDO.setUrl(wxTemplateConfigDO.getUrl() + "?openid=" + openid);
                break;
            case 37://居民血压血糖列表详情
                wxTemplateConfigDO.setUrl(wxTemplateConfigDO.getUrl()+"?openid=" + openid+"&patientId="+json.getString("patientId")+"&type="+json.getString("type"));
                break;
        }
        return wxTemplateConfigDO;
    }

+ 2 - 14
svr/svr-cloud-job/src/main/resources/system.properties

@ -1,42 +1,30 @@
#\u5C45\u6C1124\u5C0F\u65F6\u672A\u56DE\u590D\u7684\u54A8\u8BE2\u81EA\u52A8\u5173\u95ED \u6BCF\u5C0F\u65F659\u5206\u5F00\u59CB\u6267\u884C\u4E00\u6B21
finish_consult_job=0 59 * * * ?
#\u6BCF\u5929\u7684\u65E9\u4E0A9:00\uFF0C\u7ED9\u6240\u6709\u533B\u751F/\u52A9\u8001\u5458/\u6559\u5E08\u53D1\u9001\u4E00\u6761\u77ED\u4FE1
DOCTOR_SEND_UNREAD_MES_JOB=0 0 9 * * ?
#\u6BCF\u5929\u7684\u65E9\u4E0A9:00\uFF0C\u7ED9\u6240\u6709\u5C45\u6C11\u53D1\u9001\u672A\u8BFB\u6D88\u606F\u5FAE\u4FE1\u6A21\u677F
PATIENT_SEND_UNREAD_MES_JOB=0 0 9 * * ?
#\u6BCF\u5929\u7684\u65E9\u4E0A9:00\uFF0C\u751F\u65E5\u795D\u798F\u63D0\u9192\u77ED\u4FE1
BIRTHDAY_REMINDER_JOB=0 0 9 * * ?
#\u53D6\u6D88\u8BA2\u5355\u652F\u4ED8\u8D85\u65F6\u7684\u8BA2\u5355\uFF0C\u6BCF3\u5206\u949F\u6267\u884C\u4E00\u6B21
CANCEL_PAY_ORDER_OVERTIME_JOB=0 0/3 * * * ?
#\u8FC7\u671F\u8D85\u65F6\u7684\u65E5\u5E38\u8D70\u8BBF\uFF0C\u6BCF5\u5206\u949F\u6267\u884C\u4E00\u6B21
OVERTIME_VISIT_JOB=0 0/5 * * * ?
#\u5C45\u6C11\u7D27\u6025\u8054\u7CFB\u4EBA\u6570\u636E\u540C\u6B65\u66F4\u65B0\u6BCF2\u5206\u949F\u6267\u884C\u4E00\u6B21
PATIENT_SOS_CONTACTS_JOB=0 0/2 * * * ?
#\u533B\u517B\u7269\u8054\u7F51\u68C0\u6D4B\u5927\u5C4F\u5931\u8054\u7387
DEVICE_LOST_ASSOCIATION_JOB=0 0 0/2 * * ?
#\u7D27\u6025\u9884\u8B66\u5DE5\u5355\u8D85\u65F6\u672A\u54CD\u5E94\u63A8\u9001\u5F39\u6846
EME_WARNING_OVERTIME_NOT_RESPONSE=0 0 * * * ?
#\u7D27\u6025\u9884\u8B66\u5DE5\u5355\u8D85\u65F6\u672A\u54CD\u5E94\u63A8\u9001\u5F39\u68462
EME_WARNING_OVERTIME_NOT_RESPONSE_DAY=0 30 9 * * ?
#\u5B9A\u65F6\u63A8\u9001\u4FDD\u5B58\u6570\u636E
SAVE_DATA_PUSH_JOB= 0 0 2 * * ? *
#\u5B9A\u65F6\u67E5\u8BE2\u79FB\u52A8\u5E73\u53F0\u7269\u8054\u5361\u4FE1\u606F
UPDATE_SIMS_JOB= 0 30 0 * * ?
#\u5B9A\u65F6\u67E5\u8BE2\u79FB\u52A8\u7269\u8054\u5361\u8BED\u97F3\uFF0C\u6D41\u91CF\u4F7F\u7528\u4FE1\u606F--\u65E5
GET_SIMS_VOICE_FLOW_DAY_JOB= 0 50 1 * * ?
#\u5B9A\u65F6\u67E5\u8BE2\u79FB\u52A8\u7269\u8054\u5361\u8BED\u97F3\uFF0C\u6D41\u91CF\u4F7F\u7528\u4FE1\u606F--\u6708
GET_SIMS_VOICE_FLOW_MONTH_JOB= 0 15 2 * * ?
#\u6BCF\u5929\u65E9\u4E0A10\u70B9\u53D1\u9001\u8840\u538B(1\u5929)\u8840\u7CD6(7\u5929)\u672A\u6D4B\u91CF\u901A\u77E5
BLOOD_PRESSURE_GLUCOSE_NOT_MEASURED= 0 0 10 * * ?