瀏覽代碼

즉시, 예약 발송 프로세스 완료

junekeunsong 4 年之前
父節點
當前提交
0d148503df

+ 2 - 5
src/main/java/com/lemon/lifecenter/scheduler/common/HomeController.java

@@ -63,14 +63,11 @@ public class HomeController {
     /**
      * fixedDelay 1초 단위
      * 하루에 한번 결과 테이블이 있는지 확인 후 없으면 생성한다
+     * *(초) *(분) *(시) *(일) *(월) *(요일)
      */
-    @Scheduled(fixedDelay=86400)
+    @Scheduled(cron = "* * 02 * * *", zone = "Asia/Seoul")
     public void createTable() {
         pushController.createResultTable();
     }
     
-//    @Scheduled(fixedDelay=1000)
-//    public void task() {
-//        logger.error("time -- > " + new Date());
-//    }
 }

+ 50 - 51
src/main/java/com/lemon/lifecenter/scheduler/controller/PushController.java

@@ -35,6 +35,10 @@ public class PushController {
     @Autowired
     private PushUtils pushUtils;
     
+    @RequestMapping(value = "/queryTest", method = RequestMethod.POST)
+    public void queryTest() {
+    }
+    
     @RequestMapping(value = "/selectSendPushList", method = RequestMethod.POST)
     @Transactional(propagation=Propagation.REQUIRED)
     public void selectSendPushList() {
@@ -43,68 +47,63 @@ public class PushController {
         } else {
             ArrayList<ScheduleDTO> list = (ArrayList<ScheduleDTO>) service.selectSendPushList();
             for (int i = 0; i < list.size(); i++) {
-                int pushIdx = list.get(i).getPushIdx();
-                String sendType = list.get(i).getSendType();
-                String sendState = list.get(i).getSendState();
-                String targetType = list.get(i).getTargetType();
-                String centerCode = list.get(i).getCenterCode();
-                String pushTitle = list.get(i).getPushTitle();
+                int pushIdx        = list.get(i).getPushIdx();
+                String targetType  = list.get(i).getTargetType();
+                String pushTitle   = list.get(i).getPushTitle();
                 String pushContent = list.get(i).getPushContent();
-                String sendDate = list.get(i).getSendDate();
-                String sendTime = list.get(i).getSendTime();
-                String startDate = "";
+                String sendDate    = list.get(i).getSendDate();
+                String sendTime    = list.get(i).getSendTime();
+                String startDate   = sendDate + " " + sendTime;
+                list.get(i).setStartDate(startDate);
                 
-                // sendType : D(즉시), R(발송중), E(매일 발송)
-                // sendState : W(대기), I(발송중), C(완료)
-                //A(전체), N(건강정보 미엽락자), M(본인관리환자), P(환자개별선택)
-                if (sendType.equals("D") && sendState.equals("W") && targetType.equals("P")) {
-                    startDate = sendDate+ " " + sendTime;
-                    list.get(i).setStartDate(startDate);
-                    int idx = service.insertPushLog(list.get(i));
-                    if (idx == 0) {
-                    } else {
-                        service.updatePushSchedule(list.get(i));
-                        List<DeviceInfoDTO> pushTargetList = service.selectTargetPatient(pushIdx);
-                        for (int j = 0; j <pushTargetList.size(); j++) {
-                            String token = pushTargetList.get(j).getDeviceToken();
-                            int patientIdx = pushTargetList.get(j).getPatientIdx();
-                            
-                            PushResultDTO pushResultDto = new PushResultDTO();
-                            pushResultDto.setYm(pushUtils.getNowYm());
-                            pushResultDto.setPushIdx(pushIdx);
-                            pushResultDto.setPatientIdx(patientIdx);
-                            pushResultDto.setDeviceToken(token);
-                            pushResultDto.setState("W"); // 결과 대기
-                            service.insertPushResult(pushResultDto);
-                            
-                            HashMap<String, String> response = new HashMap<String, String>();
-                            if (!token.equals("")) {
-                                response = pushUtils.sendFcm(token, pushTitle, pushContent);
+                int idx = service.insertPushLog(list.get(i));
+
+                if (idx == 0) {
+                } else {
+                    service.updatePushSchedule(list.get(i));
+                    // sendType : D(즉시), R(발송중), E(매일 발송)
+                    // sendState : W(대기), I(발송중), C(완료)
+                    // targetType : A(전체), N(건강정보 미엽락자), M(본인관리환자), P(환자개별선택)
+                    List<DeviceInfoDTO> pushTargetList = service.selectPushTarget(targetType, list.get(i));
+                    for (int j = 0; j <pushTargetList.size(); j++) {
+                        String token = pushTargetList.get(j).getDeviceToken();
+                        int patientIdx = pushTargetList.get(j).getPatientIdx();
+                        
+                        PushResultDTO pushResultDto = new PushResultDTO();
+                        pushResultDto.setYm(pushUtils.getNowYm());
+                        pushResultDto.setPushIdx(pushIdx);
+                        pushResultDto.setPatientIdx(patientIdx);
+                        pushResultDto.setDeviceToken(token);
+                        pushResultDto.setState("W"); // 결과 대기
+                        service.insertPushResult(pushResultDto);
+                        
+                        HashMap<String, String> response = new HashMap<String, String>();
+                        if (!token.equals("")) {
+                            response = pushUtils.sendFcm(token, pushTitle, pushContent);
+                        } else {
+                            response.put("NOT_FOUND", "Requested entity was not found.");
+                        }
+                        
+                        for (String key : response.keySet()) {
+                            pushResultDto.setSuccessYn("N");
+                            if (key.equals("success")) {
+                                pushResultDto.setSuccessYn("Y");
                             } else {
-                                response.put("NOT_FOUND", "Requested entity was not found.");
+                                pushResultDto.setSuccessYn("N");
+                                pushResultDto.setFailCode(key);
+                                pushResultDto.setNote(response.get(key));
                             }
-                            
-                            for (String key : response.keySet()) {
-                                if (key.equals("success")) {
-                                    pushResultDto.setSuccessYn("Y");
-                                } else {
-                                    pushResultDto.setSuccessYn("N");
-                                    pushResultDto.setFailCode(key);
-                                    pushResultDto.setNote(response.get(key));
-                                }
-                            }
-                            
-                            pushResultDto.setState("C"); // 발송 완료
-                            service.updatePushResult(pushResultDto);
                         }
                         
-                        service.updatePushLog(list.get(i));
+                        pushResultDto.setState("C"); // 발송 완료
+                        service.updatePushResult(pushResultDto);
                     }
+                    
+                    service.updatePushLog(list.get(i));
                 }
             }
             
         }
-
     }
     
     @RequestMapping(value = "/createResultTable", method = RequestMethod.POST)

+ 3 - 3
src/main/java/com/lemon/lifecenter/scheduler/dto/ScheduleDTO.java

@@ -6,7 +6,7 @@ public class ScheduleDTO {
     private String sendType    = "";
     private String sendState   = "";
     private String targetType  = "";
-    private String centerCode  = "";
+    private int centerCode     = 0;
     private String senderIp    = "";
     private String sender      = "";
     private String pushTitle   = "";
@@ -46,10 +46,10 @@ public class ScheduleDTO {
     public void setTargetType(String targetType) {
         this.targetType = targetType;
     }
-    public String getCenterCode() {
+    public int getCenterCode() {
         return centerCode;
     }
-    public void setCenterCode(String centerCode) {
+    public void setCenterCode(int centerCode) {
         this.centerCode = centerCode;
     }
     public String getSenderIp() {

+ 4 - 0
src/main/java/com/lemon/lifecenter/scheduler/mapper/PushMapper.java

@@ -23,4 +23,8 @@ public interface PushMapper {
     public List<DeviceInfoDTO> selectTargetPatient(int pushIdx);
     public int insertPushResult(PushResultDTO dto);
     public int updatePushResult(PushResultDTO dto);
+    
+    public List<DeviceInfoDTO> selectTargetCenter(int centerCode);
+    public List<DeviceInfoDTO> selectTargetUnWritten(int centerCode);
+    public List<DeviceInfoDTO> selectTargetMyPatient(ScheduleDTO dto);
 }

+ 19 - 4
src/main/java/com/lemon/lifecenter/scheduler/service/PushService.java

@@ -1,5 +1,6 @@
 package com.lemon.lifecenter.scheduler.service;
 
+import java.util.ArrayList;
 import java.util.List;
 
 import org.springframework.beans.factory.annotation.Autowired;
@@ -43,10 +44,6 @@ public class PushService {
         return mapper.insertPushLog(dto);
     }
     
-    public List<DeviceInfoDTO> selectTargetPatient(int pushIdx) {
-        return mapper.selectTargetPatient(pushIdx);
-    }
-    
     public int insertPushResult(PushResultDTO dto) {
         return mapper.insertPushResult(dto);
     }
@@ -55,4 +52,22 @@ public class PushService {
         return mapper.updatePushResult(dto);
     }
     
+    public List<DeviceInfoDTO> selectPushTarget(String targetType, ScheduleDTO dto) {
+        int pushIdx = dto.getPushIdx();
+        int centerCode = dto.getCenterCode();
+        List<DeviceInfoDTO> result = new ArrayList<DeviceInfoDTO>();
+        
+        if (targetType.equals("P")) { // 환자 개별선택
+            result = mapper.selectTargetPatient(pushIdx);
+        } else if (targetType.equals("A")) { // 센터 전체
+            result = mapper.selectTargetCenter(centerCode);
+        } else if (targetType.equals("N")) { // 건강정보 미입력자
+            result = mapper.selectTargetUnWritten(centerCode);
+        } else if (targetType.equals("M")) { // 담당환자
+            result = mapper.selectTargetMyPatient(dto);
+        }
+        
+        return result;
+    }
+    
 }

+ 63 - 6
src/main/resources/mybatis/mapper/push/push.xml

@@ -75,20 +75,21 @@
         </selectKey>
         <![CDATA[
             INSERT INTO PUSH_LOG
-                        (push_idx,    send_type,   send_state,    target_type,     center_code,
-                         sender_ip,   sender,      push_title,    push_content,    create_date,
+                        (push_idx,    send_type,   send_state,   target_type,   center_code,
+                         sender_ip,   sender,      push_title,   push_content,  create_date,
                          start_date)
-                 VALUES (#{pushIdx},  #{sendType}, #{sendState},  #{targetType},   #{centerCode},
+                 VALUES (#{pushIdx},  #{sendType}, #{sendState}, #{targetType}, #{centerCode},
                          #{senderIp}, #{sender},   #{pushTitle}, #{pushContent}, NOW(),
                          #{startDate})
         ]]>
     </insert>
     
+    <!-- 환자 개별발송 -->
     <select id="selectTargetPatient" parameterType="int" resultType="DeviceInfoDTO">
         <![CDATA[
             SELECT PTT.PATIENT_IDX AS patientIdx,
-                   PDI.DEVICE_TYPE AS deviceType,
-                   PDI.DEVICE_KEY  AS deviceToken
+                   IFNULL(PDI.DEVICE_TYPE, '') AS deviceType,
+                   IFNULL(PDI.DEVICE_KEY, '')  AS deviceToken
               FROM PUSH_TARGET_TEMP PTT
               LEFT JOIN PUSH_DEVICE_INFO PDI
                 ON PTT.PATIENT_IDX = PDI.PATIENT_IDX
@@ -96,6 +97,61 @@
         ]]>
     </select>
     
+    <!-- 센터 전체 발송 -->
+    <select id="selectTargetCenter" parameterType="int" resultType="DeviceInfoDTO">
+        <![CDATA[
+            SELECT PC.PATIENT_IDX  AS patientIdx,
+                   IFNULL(PDI.DEVICE_TYPE, '') AS deviceType,
+                   IFNULL(PDI.DEVICE_KEY, '')  AS deviceToken
+              FROM PATIENT_CARE PC
+              LEFT JOIN PUSH_DEVICE_INFO PDI
+                ON PC.PATIENT_IDX = PDI.PATIENT_IDX
+             WHERE 1 = 1
+               AND PC.CENTER_CODE = #{centerCode}
+               AND PC.STATE = 'H'
+        ]]>
+    </select>
+    
+    <!-- 센터 건강정보 미입력자 -->
+    <select id="selectTargetUnWritten" parameterType="int" resultType="DeviceInfoDTO">
+        <![CDATA[
+            SELECT PC.PATIENT_IDX              AS patientIdx,
+                   IFNULL(PDI.DEVICE_TYPE, '') AS deviceType,
+                   IFNULL(PDI.DEVICE_KEY, '')  AS deviceToken
+              FROM PATIENT_CARE PC
+              LEFT JOIN PUSH_DEVICE_INFO PDI
+                ON PC.PATIENT_IDX = PDI.PATIENT_IDX
+             WHERE 1 = 1
+               AND PC.CENTER_CODE = #{centerCode}
+               AND PC.STATE = 'H'
+               AND PC.PATIENT_IDX NOT IN (
+                                           SELECT PC.PATIENT_IDX
+                                             FROM PATIENT_CARE PC
+                                             LEFT JOIN PATIENT_PHR_HISTORY PPH
+                                               ON PC.PATIENT_IDX = PPH.PATIENT_IDX
+                                            WHERE  1 = 1
+                                              AND PC.CENTER_CODE = #{centerCode}
+                                              AND DATE_FORMAT(PPH.CREATE_DATE, '%Y-%M-%D') = SYSDATE
+                                            GROUP BY PC.PATIENT_IDX
+                                         )
+        ]]>
+    </select>
+    
+    <select id="selectTargetMyPatient" parameterType="ScheduleDTO" resultType="DeviceInfoDTO">
+        <![CDATA[
+            SELECT PC.PATIENT_IDX  AS patientIdx,
+                   IFNULL(PDI.DEVICE_TYPE, '') AS deviceType,
+                   IFNULL(PDI.DEVICE_KEY, '')  AS deviceToken
+              FROM PATIENT_CARE PC
+              LEFT JOIN PUSH_DEVICE_INFO PDI
+                ON PC.PATIENT_IDX = PDI.PATIENT_IDX
+             WHERE 1 = 1
+               AND PC.CENTER_CODE = #{centerCode}
+               AND PC.STATE = 'H'
+               AND PC.MANAGER_ID = #{sender}
+        ]]>
+    </select>
+    
     <update id="updatePushLog" parameterType="ScheduleDTO">
         <![CDATA[
             UPDATE PUSH_LOG
@@ -104,7 +160,7 @@
              WHERE PUSH_IDX = #{pushIdx}
         ]]>
         <if test='sendType != null and sendType != ""'>
-            <if test='sendType != "E"'>
+            <if test='sendType == "D"'>
                 <![CDATA[
                     DELETE FROM PUSH_SCHEDULE WHERE PUSH_IDX = #{pushIdx}
                     DELETE FROM PUSH_TARGET_TEMP WHERE PUSH_IDX = #{pushIdx}
@@ -135,6 +191,7 @@
         </if>
         <![CDATA[
             WHERE PUSH_IDX = #{pushIdx}
+              AND PATIENT_IDX = #{patientIdx}
         ]]>
     </update>
 </mapper>