LAPTOP-KB9HII50\70708 1 éve
szülő
commit
2fd2594cde

+ 227 - 0
svr/svr-cloud-care/cron.MD

@ -0,0 +1,227 @@
文章目录
cron表达式介绍
cron有如下两种语法格式
cron表达式标准结构
cron表达式各个字段的含义
cron每个域特殊字符含义
cron常用表达式例子
Java通过时间生成cron表达式
cron表达式介绍
cron表达式是由若干数字、空格、符号按一定的规则,组成一组字符串,从而表达时间的信息。与正则表达式类似,都是一个字符串表示一些信息。
cron表达式是一个字符串,字符串以5或6个空格隔开,分为6或7个域,每一个域代表一个含义。
cron有如下两种语法格式
Seconds Minutes Hours DayofMonth Month DayofWeek Year
Seconds Minutes Hours DayofMonth Month DayofWeek
cron表达式标准结构
corn从左到右(用空格隔开):秒 分 小时 月份中的日期 月份 星期中的日期 年份
cron表达式各个字段的含义
字段
允许值
允许的特殊字符
秒(Seconds)
0~59的整数
, - * / 四个字符
分(Minutes)
0~59的整数
, - * / 四个字符
小时(Hours)
0~23的整数
, - * / 四个字符
日期(DayofMonth)
1~31的整数(但是你需要考虑你月的天数)
,- * ? / L W C 八个字符
月份(Month)
1~12的整数或者 JAN-DEC
, - * / 四个字符
星期(DayofWeek)
1~7的整数或者 SUN-SAT (1=SUN)
, - * ? / L C # 八个字符
年(可选,留空)(Year)
1970~2099
, - * / 四个字符
cron每个域特殊字符含义
特殊字符
含义
*
表示匹配该域的任意值。假如在Minutes域使用*, 即表示每分钟都会触发事件
?
只能用在DayofMonth和DayofWeek两个域。它也匹配域的任意值,但实际不会。因为DayofMonth和DayofWeek会相互影响。例如想在每月的20日触发调度,不管20日到底是星期几,则只能使用如下写法: 13 13 15 20 * ?, 其中最后一位只能用?,而不能使用*,如果使用*表示不管星期几都会触发,实际上并不是这样
-
表示范围。例如在Minutes域使用5-20,表示从5分到20分钟每分钟触发一次
/
表示起始时间开始触发,然后每隔固定时间触发一次。例如在Minutes域使用5/20,则意味着5分钟触发一次,而25,45等分别触发一次
,
表示列出枚举值。例如:在Minutes域使用5,20,则意味着在5和20分每分钟触发一次
L
表示最后,只能出现在DayofWeek和DayofMonth域。如果在DayofWeek域使用5L,意味着在最后的一个星期四触发
W
表示有效工作日(周一到周五),只能出现在DayofMonth域,系统将在离指定日期的最近的有效工作日触发事件。例如:在 DayofMonth使用5W,如果5日是星期六,则将在最近的工作日:星期五,即4日触发。如果5日是星期天,则在6日(周一)触发;如果5日在星期一到星期五中的一天,则就在5日触发。另外一点,W的最近寻找不会跨过月份
LW
这两个字符可以连用,表示在某个月最后一个工作日,即最后一个星期五
#
用于确定每个月第几个星期几,只能出现在DayofMonth域。例如在4#2,表示某月的第二个星期三
cron常用表达式例子
cron表达式
说明
0 0 2 1 * ? *
表示在每月的1日的凌晨2点调整任务
0 15 10 ? * MON-FRI
表示周一到周五每天上午10:15执行作业
0 15 10 ? 6L 2002-2006
表示2002-2006年的每个月的最后一个星期五上午10:15执行作
0 0 10,14,16 * * ?
每天上午10点,下午2点,4点
0 0/30 9-17 * * ?
朝九晚五工作时间内每半小时
0 0 12 ? * WED
表示每个星期三中午12点
0 0 12 * * ?
每天中午12点触发
0 15 10 ? * *
每天上午10:15触发
0 15 10 * * ?
每天上午10:15触发
0 15 10 * * ? *
每天上午10:15触发
0 15 10 * * ? 2005
2005年的每天上午10:15触发
0 * 14 * * ?
在每天下午2点到下午2:59期间的每1分钟触发
0 0/5 14 * * ?
在每天下午2点到下午2:55期间的每5分钟触发
0 0/5 14,18 * * ?
在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发
0 0-5 14 * * ?
在每天下午2点到下午2:05期间的每1分钟触发
0 10,44 14 ? 3 WED
每年三月的星期三的下午2:10和2:44触发
0 15 10 ? * MON-FRI
周一至周五的上午10:15触发
0 15 10 15 * ?
每月15日上午10:15触发
0 15 10 L * ?
每月最后一日的上午10:15触发
0 15 10 ? * 6L
每月的最后一个星期五上午10:15触发
0 15 10 ? * 6L 2002-2005
2002年至2005年的每月的最后一个星期五上午10:15触发
0 15 10 ? * 6#3
每月的第三个星期五上午10:15触发
注意:
(1)有些子表达式能包含一些范围或列表
例如:子表达式(天(星期))可以为 “MON-FRI”,“MON,WED,FRI”,“MON-WED,SAT”
“*”字符代表所有可能的值
因此,“”在子表达式(月)里表示每个月的含义,“”在子表达式(天(星期))表示星期的每一天
“/”字符用来指定数值的增量
例如:在子表达式(分钟)里的“0/15”表示从第0分钟开始,每15分钟
在子表达式(分钟)里的“3/20”表示从第3分钟开始,每20分钟(它和“3,23,43”)的含义一样
“?”字符仅被用于天(月)和天(星期)两个子表达式,表示不指定值
当2个子表达式其中之一被指定了值以后,为了避免冲突,需要将另一个子表达式的值设为“?”
“L” 字符仅被用于天(月)和天(星期)两个子表达式,它是单词“last”的缩写
但是它在两个子表达式里的含义是不同的。
在天(月)子表达式中,“L”表示一个月的最后一天
在天(星期)自表达式中,“L”表示一个星期的最后一天,也就是SAT
如果在“L”前有具体的内容,它就具有其他的含义了
例如:“6L”表示这个月的倒数第6天,“FRIL”表示这个月的最一个星期五
注意:在使用“L”参数时,不要指定列表或范围,因为这会导致问题
-----------------------------------

+ 5 - 1
svr/svr-cloud-care/pom.xml

@ -291,8 +291,12 @@
            <artifactId>org.eclipse.paho.client.mqttv3</artifactId>
            <version>1.2.5</version>
        </dependency>
        <dependency>
            <groupId>org.quartz-scheduler</groupId>
            <artifactId>quartz</artifactId>
            <version>2.3.2</version>
        </dependency>
    </dependencies>
    <build>
        <finalName>svr-cloud-care</finalName>
        <plugins>

+ 3 - 0
svr/svr-cloud-care/src/main/java/com/yihu/jw/care/dao/sign/ServiceItemConfigDao.java

@ -15,4 +15,7 @@ public interface ServiceItemConfigDao extends JpaRepository<ServiceItemConfig, S
    @Query("from ServiceItemConfig w where w.packageId =?1 ")
    List<ServiceItemConfig> findByPackageId(String packageId);
    @Query("from ServiceItemConfig w where w.serverItemId =?1 ")
    List<ServiceItemConfig> findByServerItemId(String serverItemId);
}

+ 20 - 0
svr/svr-cloud-care/src/main/java/com/yihu/jw/care/dao/sign/ServiceItemPlanDao.java

@ -0,0 +1,20 @@
package com.yihu.jw.care.dao.sign;
import com.yihu.jw.entity.base.servicePackage.ServiceItemPlanDO;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Query;
import java.util.List;
/**
 * Created by yeshijie on 2023/10/28.
 */
public interface ServiceItemPlanDao extends JpaRepository<ServiceItemPlanDO, String>, JpaSpecificationExecutor<ServiceItemPlanDO> {
    @Query("from ServiceItemPlanDO w where w.signId =?1 ")
    List<ServiceItemPlanDO> findBySignId(String signId);
    @Query(value = "select * from base_service_item_plan w where w.sign_id =?1 and w.service_item_id=?2 order by w.plan_time desc",nativeQuery = true)
    List<ServiceItemPlanDO> findBySignIdAndServiceItemId(String signId,String serviceItemId);
}

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

@ -31,6 +31,8 @@ public class DoctorMessageEndpoint extends EnvelopRestEndpoint {
    @Autowired
    private PermissionService permissionService;
    @GetMapping(value = "messages")
    @ApiOperation("应用消息")
    public ObjEnvelop messages(@ApiParam(name = "type", value = "消息类型 10床位申请,11安全监护,12紧急救助," +

+ 26 - 0
svr/svr-cloud-care/src/main/java/com/yihu/jw/care/endpoint/sign/SignEndpoint.java

@ -51,6 +51,32 @@ public class SignEndpoint extends EnvelopRestEndpoint {
    @Autowired
    private ServicePackageService servicePackageService;
    @GetMapping(value = "planDetail")
    @ApiOperation(value = "养护计划详情")
    public ObjEnvelop planDetail(
            @ApiParam(name = "signId", value = "签约id", required = true)
            @RequestParam String signId,
            @ApiParam(name = "serviceItemId", value = "服务项id", required = true)
            @RequestParam String serviceItemId) {
        try{
            return ObjEnvelop.getSuccess("查询成功",servicePackageService.planDetail(signId,serviceItemId));
        }catch (Exception e){
            return failedObjEnvelopException2(e);
        }
    }
    @GetMapping(value = "conservePlan")
    @ApiOperation(value = "养护计划")
    public ObjEnvelop conservePlan(
            @ApiParam(name = "signId", value = "签约id", required = true)
            @RequestParam String signId) {
        try{
            return ObjEnvelop.getSuccess("查询成功",servicePackageService.conservePlan(signId));
        }catch (Exception e){
            return failedObjEnvelopException2(e);
        }
    }
    @GetMapping(value = "mySign")
    @ApiOperation(value = "我的签约服务")
    public ObjEnvelop mySign(

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

@ -74,6 +74,11 @@ public class DoctorMessageService {
    @Autowired
    private BasePatientDao basePatientDao;
    public void systemMessagePage(){
    }
    /**
     *
     * @param doctor

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

@ -1,5 +1,6 @@
package com.yihu.jw.care.service.sign;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.ObjectMapper;
@ -23,10 +24,10 @@ import com.yihu.jw.entity.order.BusinessOrderDO;
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.patient.service.BasePatientMedicardCardService;
import com.yihu.jw.restmodel.ResponseContant;
import com.yihu.jw.restmodel.web.PageEnvelop;
import com.yihu.jw.util.common.IdCardUtil;
import com.yihu.jw.util.cron.CronUtils;
import com.yihu.jw.util.date.DateUtil;
import com.yihu.jw.util.entity.ServiceException;
import com.yihu.jw.utils.StringUtil;
@ -41,6 +42,7 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.*;
import java.util.stream.Collectors;
@ -75,7 +77,7 @@ public class ServicePackageService extends BaseJpaService<ServicePackageDO, Serv
    @Autowired
    private ArchiveDao archiveDao;
    @Autowired
    private BasePatientMedicardCardService basePatientMedicardCardService;
    private ServiceItemPlanDao serviceItemPlanDao;
    @Autowired
    private PayService payService;
    @Autowired
@ -239,7 +241,7 @@ public class ServicePackageService extends BaseJpaService<ServicePackageDO, Serv
                " LEFT JOIN wlyy_hospital_sys_dict di2 on di2.dict_name = 'level_conclusion' and di2.dict_code=ar.level_conclusion " +
                " where p.id = '"+patient+"' limit 1";
        List<Map<String,Object>> list = jdbcTemplate.queryForList(sql+filter);
        String packageSql = "SELECT r.id,DATE_FORMAT(r.end_time,'%Y-%m-%d %H:%i:%S') endTime,r.type,p.`name`,p.num,p.org_name orgName " +
        String packageSql = "SELECT r.id,p.id packageId,DATE_FORMAT(r.end_time,'%Y-%m-%d %H:%i:%S') endTime,r.type,p.`name`,p.num,p.org_name orgName " +
                "from base_service_package_sign_record r,base_service_package p " +
                "WHERE r.patient =? and r.`status`=1 and r.service_package_id=p.id ";
        for (Map<String,Object> map:list){
@ -319,6 +321,9 @@ public class ServicePackageService extends BaseJpaService<ServicePackageDO, Serv
    public JSONObject signInfo(String id,String type){
        JSONObject json = new JSONObject();
        ServicePackageSignRecordDO signRecordDO = servicePackageSignRecordDao.findOne(id);
        if(signRecordDO == null){
            return null;
        }
        ServicePackageDO servicePackageDO = servicePackageDao.findOne(signRecordDO.getServicePackageId());
        List<ServicePackageItemDO> itemDOList = null;
        if("1".equals(type)){
@ -457,6 +462,7 @@ public class ServicePackageService extends BaseJpaService<ServicePackageDO, Serv
                    //不需要支付
                    signRecordDO.setStatus(1);//已签约
                    //设置到期时间
                    servicePackageSignRecordDao.save(signRecordDO);
                    setSignDate(servicePackageDO,signRecordDO);
                }else{
                    signRecordDO.setPayTime("10");//10分钟
@ -520,6 +526,115 @@ public class ServicePackageService extends BaseJpaService<ServicePackageDO, Serv
        signRecordDO.setStartTime(new Date());
        sendMessage(servicePackageDO,signRecordDO);
        addPlans(signRecordDO.getId(),signRecordDO.getPatient(),signRecordDO.getServicePackageId());
    }
    //养护计划详情
    public JSONObject planDetail(String signId,String serviceItemId){
        JSONObject result = new JSONObject();
        List<ServiceItemConfig> configList = serviceItemConfigDao.findByServerItemId(serviceItemId);
        if(configList.size()>0){
            result.put("itemConfig",configList.get(0));
        }else {
            result.put("itemConfig",null);
        }
        List<ServiceItemPlanDO> planDOList = serviceItemPlanDao.findBySignIdAndServiceItemId(signId,serviceItemId);
        result.put("planDOList",planDOList);
        return result;
    }
    //养护计划
    public JSONArray conservePlan(String signId){
        JSONArray ja = new JSONArray();
        List<ServiceItemPlanDO> planDOList = serviceItemPlanDao.findBySignId(signId);
        Map<String,List<ServiceItemPlanDO>> planListMap = planDOList.stream().collect(Collectors.groupingBy(ServiceItemPlanDO::getRelationType));
        for (String key:planListMap.keySet()){
            List<ServiceItemPlanDO> planDOS = planListMap.get(key);
            JSONObject json = new JSONObject();
            json.put("signId",signId);
            json.put("serviceItemId",planDOS.get(0).getServiceItemId());
            json.put("code",key);
            json.put("name",planDOS.get(0).getName());
            String completeTime = "";
            String planTime = "";
            int total = planDOS.size();
            int complete = 0;
            for (ServiceItemPlanDO planDO:planDOS){
                if("1".equals(planDO.getStatus())){
                    complete++;
                    if(completeTime.compareTo(planDO.getCompleteTime())<0){
                        completeTime = planDO.getCompleteTime();
                    }
                }else {
                    if("".equals(planTime)){
                        planTime = planDO.getPlanTime();
                    }else if(planTime.compareTo(planDO.getPlanTime())>0){
                        planTime = planDO.getPlanTime();
                    }
                }
            }
            json.put("total",total);
            json.put("complete",complete);
            json.put("completeTime",completeTime);
            json.put("planTime",planTime);
            ja.add(json);
        }
        return ja;
    }
    public static void main(String[] args) {
        String ss = "";
        String time1 = "2023-10-28";
        String time2 = "2023-10-29";
        String time3 = "2023-10-30";
        System.out.println(ss.compareTo(time1));
        System.out.println(time2.compareTo(time1));
        System.out.println(time2.compareTo(time2));
        System.out.println(time2.compareTo(time3));
    }
    //添加项目执行计划
    public void addPlans(String signId,String patient,String packageId){
        try {
            String sql = "SELECT i.name,i.code,c.* from base_service_package_item i,base_service_item_config c " +
                    "WHERE i.service_package_id='"+packageId+"' and i.id = c.server_item_id ";
            List<Map<String,Object>> list = jdbcTemplate.queryForList(sql);
            List<ServiceItemPlanDO> planDOList = new ArrayList<>();
            for (Map<String,Object> map:list){
                String name = map.get("name")+"";
                String id = map.get("id")+"";
                String code = map.get("code")+"";
                String template_code = map.get("template_code")+"";
                String server_item_id = map.get("server_item_id")+"";
                String plan_start_time_type = map.get("plan_start_time_type")+"";//计划开始时间类型
                String server_count = map.get("server_count")+"";//服务次数
                String frequency_code = map.get("frequency_code")+"";//频次
                List<String> timeList = new ArrayList<>();
                if(StringUtils.isBlank(template_code)||"null".equals(template_code)){
                    LocalDateTime localDateTime = LocalDateTime.now();
                    int addNum = Integer.parseInt(plan_start_time_type);
                    localDateTime = localDateTime.plusDays(addNum);
                    timeList = CronUtils.getExecutionTimeByNum(frequency_code,Integer.parseInt(server_count),localDateTime);
                }
                for (String time :timeList){
                    ServiceItemPlanDO planDO = new ServiceItemPlanDO();
                    planDO.setPlanTime(time);
                    planDO.setPatient(patient);
                    planDO.setName(name);
                    planDO.setStatus("0");
                    planDO.setServicePackId(packageId);
                    planDO.setServiceItemId(server_item_id);
                    planDO.setItemConfigId(id);
                    planDO.setRelationType(code);
                    planDO.setSignId(signId);
                    planDOList.add(planDO);
                }
            }
            serviceItemPlanDao.save(planDOList);
        }catch (Exception e){
            e.printStackTrace();
        }
    }
    //给分配者发送消息