junekeunsong hace 4 años
padre
commit
ebe7040b2d

+ 9 - 1
src/main/java/com/lemon/lifecenter/scheduler/common/HomeController.java

@@ -61,7 +61,6 @@ public class HomeController {
     }
     
     /**
-     * fixedDelay 1초 단위
      * 하루에 한번 결과 테이블이 있는지 확인 후 없으면 생성한다
      * *(초) *(분) *(시) *(일) *(월) *(요일)
      */
@@ -70,4 +69,13 @@ public class HomeController {
         pushController.createResultTable();
     }
     
+    /**
+     * 매분 마다
+     */
+    @Scheduled(cron = "*/5 * * * * *", zone = "Asia/Seoul")
+    public void sendTask() {
+        pushController.selectSendPushList();
+        pushController.everyDayPushSend();
+    }
+    
 }

+ 49 - 0
src/main/java/com/lemon/lifecenter/scheduler/common/PushUtils.java

@@ -3,6 +3,7 @@ package com.lemon.lifecenter.scheduler.common;
 import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.text.DateFormat;
+import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.util.Calendar;
 import java.util.Date;
@@ -125,6 +126,54 @@ public class PushUtils {
         return dateFormat.format(cal.getTime());
     }
     
+    public String getNow() {
+        DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        Date date = new Date();
+
+        return dateFormat.format(date);
+    }
+    
+    public boolean compareDateTime(String dateTime) {
+        boolean result = false;
+        try {
+            DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+            Date date = new Date();
+            Date nowTime  = dateFormat.parse(dateFormat.format(date));
+            Date sendTime = dateFormat.parse(dateTime);
+            logger.error("nowTime  -- > " + nowTime);
+            logger.error("sendTime -- > " + sendTime);
+            
+            result = nowTime.after(sendTime) || nowTime.equals(sendTime);
+            
+        } catch (ParseException e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+            result = false;
+        }
+        return result;
+    }
+    
+    public boolean compareTime(String time) {
+        
+        boolean result = false;
+        try {
+            DateFormat dateFormat = new SimpleDateFormat("HH:mm");
+            Date date = new Date();
+            Date nowTime  = dateFormat.parse(dateFormat.format(date));
+            Date sendTime = dateFormat.parse(time);
+            logger.error("nowTime  -- > " + nowTime);
+            logger.error("sendTime -- > " + sendTime);
+            
+            result = nowTime.equals(sendTime);
+            
+        } catch (ParseException e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+            result = false;
+        }
+        return result;
+    }
+    
     public void apnsSend() {
         ClassPathResource cpr = new ClassPathResource("apns/dev/certify.p12");
         logger.error("name -- > " + cpr.getFilename());

+ 118 - 36
src/main/java/com/lemon/lifecenter/scheduler/controller/PushController.java

@@ -1,7 +1,9 @@
 package com.lemon.lifecenter.scheduler.controller;
 
 import java.text.DateFormat;
+import java.text.ParseException;
 import java.text.SimpleDateFormat;
+import java.time.LocalDateTime;
 import java.util.ArrayList;
 import java.util.Calendar;
 import java.util.Date;
@@ -37,6 +39,7 @@ public class PushController {
     
     @RequestMapping(value = "/queryTest", method = RequestMethod.POST)
     public void queryTest() {
+        pushUtils.compareTime("18:00:01");
     }
     
     @RequestMapping(value = "/selectSendPushList", method = RequestMethod.POST)
@@ -48,61 +51,140 @@ public class PushController {
             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 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   = sendDate + " " + sendTime;
+                
+                if (sendType.equals("D")) {
+                    startDate = pushUtils.getNow();
+                }
+                
                 list.get(i).setStartDate(startDate);
                 
-                int idx = service.insertPushLog(list.get(i));
+                if (pushUtils.compareDateTime(startDate) == true) {
+                    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.");
+                    if (idx == 0) {
+                    } else {
+                        list.get(i).setSendState("I");
+                        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 {
+                                    pushResultDto.setSuccessYn("N");
+                                    pushResultDto.setFailCode(key);
+                                    pushResultDto.setNote(response.get(key));
+                                }
+                            }
+                            
+                            pushResultDto.setState("C"); // 발송 완료
+                            service.updatePushResult(pushResultDto);
                         }
                         
-                        for (String key : response.keySet()) {
-                            pushResultDto.setSuccessYn("N");
-                            if (key.equals("success")) {
-                                pushResultDto.setSuccessYn("Y");
+                        service.updatePushLog(list.get(i));
+                    }
+                }
+                
+            }
+            
+        }
+    }
+    
+//    @RequestMapping(value = "/everyDayPushSend", method = RequestMethod.POST)
+    @Transactional(propagation=Propagation.REQUIRED)
+    public void everyDayPushSend() {
+        int cnt = service.selectEveryDaySendPushCount();
+        if (cnt == 0) {
+        } else {
+            List<ScheduleDTO> list = service.selectEveryDaySendPushList();
+            for (int i = 0; i < list.size(); i++) {
+                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 sendTime    = list.get(i).getSendTime();
+                
+                if (pushUtils.compareTime(sendTime) == true) {
+                    int idx = service.insertEveryDayPushLog(list.get(i));
+                    if (idx == 0) {
+                    } else {
+                        list.get(i).setSendState("I");
+                        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");
-                                pushResultDto.setFailCode(key);
-                                pushResultDto.setNote(response.get(key));
+                                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);
+
                         }
                         
-                        pushResultDto.setState("C"); // 발송 완료
-                        service.updatePushResult(pushResultDto);
+                        service.updatePushLog(list.get(i));
+                        list.get(i).setSendState("W");
+                        service.updatePushSchedule(list.get(i));
                     }
-                    
-                    service.updatePushLog(list.get(i));
                 }
+                
             }
-            
         }
     }
     

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

@@ -27,4 +27,9 @@ public interface PushMapper {
     public List<DeviceInfoDTO> selectTargetCenter(int centerCode);
     public List<DeviceInfoDTO> selectTargetUnWritten(int centerCode);
     public List<DeviceInfoDTO> selectTargetMyPatient(ScheduleDTO dto);
+    
+    /** 매일 **/
+    public int selectEveryDaySendPushCount();
+    public List<ScheduleDTO> selectEveryDaySendPushList();
+    public int insertEveryDayPushLog(ScheduleDTO dto);
 }

+ 13 - 0
src/main/java/com/lemon/lifecenter/scheduler/service/PushService.java

@@ -70,4 +70,17 @@ public class PushService {
         return result;
     }
     
+    /** 매일 **/
+    public int selectEveryDaySendPushCount() {
+        return mapper.selectEveryDaySendPushCount();
+    }
+    
+    public List<ScheduleDTO> selectEveryDaySendPushList() {
+        return mapper.selectEveryDaySendPushList();
+    }
+    
+    public int insertEveryDayPushLog(ScheduleDTO dto) {
+        return mapper.insertEveryDayPushLog(dto);
+    }
+    
 }

+ 2 - 2
src/main/resources/application.properties

@@ -1,6 +1,6 @@
 spring.datasource.driver-class-name=net.sf.log4jdbc.sql.jdbcapi.DriverSpy
-#spring.datasource.url=jdbc:log4jdbc:cubrid:61.97.184.187:30000:LIFE_CENTER:::?charset=UTF-8
-spring.datasource.url=jdbc:log4jdbc:cubrid:localhost:30000:LIFE_CENTER:::?charset=UTF-8
+spring.datasource.url=jdbc:log4jdbc:cubrid:61.97.184.187:30000:LIFE_CENTER:::?charset=UTF-8
+#spring.datasource.url=jdbc:log4jdbc:cubrid:localhost:30000:LIFE_CENTER:::?charset=UTF-8
 
 spring.datasource.username=dba
 spring.datasource.password=#zo240s!

+ 64 - 2
src/main/resources/mybatis/mapper/push/push.xml

@@ -30,6 +30,7 @@
         ]]>
     </update>
     
+    <!-- 즉시, 예약 발송 갯수 -->
     <select id="selectSendPushCount" resultType="int">
         <![CDATA[
             SELECT COUNT(*) AS CNT
@@ -39,6 +40,7 @@
         ]]>
     </select>
 
+    <!-- 즉시, 예약 발송 리스트 -->
     <select id="selectSendPushList" resultType="ScheduleDTO">
         <![CDATA[
             SELECT PUSH_IDX     AS pushIdx,
@@ -59,10 +61,52 @@
         ]]>
     </select>
     
+    <select id="selectEveryDaySendPushCount" resultType="int">
+        <![CDATA[
+            SELECT COUNT(*) AS cnt
+              FROM PUSH_SCHEDULE PS, 
+                       ( SELECT PS.PUSH_IDX AS push_idx,
+                                COUNT(*) TOTAL 
+                           FROM PUSH_LOG
+                          WHERE PUSH_IDX = PS.PUSH_IDX 
+                            AND DATE_FORMAT( START_DATE, '%Y-%M-%D' ) = DATE_FORMAT( NOW(), '%Y-%M-%D' )  ) PL
+             WHERE PS.SEND_STATE = 'W'
+               AND PS.SEND_TYPE = 'E'
+               AND PL.PUSH_IDX = PS.push_idx
+               AND PL.TOTAL = 0
+        ]]>
+    </select>
+    
+    <select id="selectEveryDaySendPushList" resultType="ScheduleDTO">
+        <![CDATA[
+            SELECT PS.PUSH_IDX     AS pushIdx,
+                   PS.SEND_TYPE    AS sendType,
+                   PS.SEND_STATE   AS sendState,
+                   PS.TARGET_TYPE  AS targetType,
+                   PS.CENTER_CODE  AS centerCode,
+                   PS.SENDER_IP    AS senderIp,
+                   PS.SENDER       AS sender,
+                   PS.PUSH_TITLE   AS pushTitle,
+                   PS.PUSH_CONTENT AS pushContent,
+                   PS.SEND_DATE    AS sendDate,
+                   PS.SEND_TIME    AS sendTime
+              FROM PUSH_SCHEDULE PS, 
+                       ( SELECT PS.PUSH_IDX AS push_idx,
+                                COUNT(*) TOTAL 
+                           FROM PUSH_LOG
+                          WHERE PUSH_IDX = PS.PUSH_IDX 
+                            AND DATE_FORMAT( START_DATE, '%Y-%M-%D' ) = DATE_FORMAT( NOW(), '%Y-%M-%D' )  ) PL
+             WHERE PS.SEND_STATE = 'W'
+               AND PS.SEND_TYPE = 'E'
+               AND PL.PUSH_IDX = PS.push_idx
+               AND PL.TOTAL = 0
+        ]]>
+    </select>
+    
     <update id="updatePushSchedule" parameterType="ScheduleDTO">
         <![CDATA[
             UPDATE PUSH_SCHEDULE
-               SET SEND_STATE = 'I'
+               SET SEND_STATE = #{sendState}
              WHERE PUSH_IDX = #{pushIdx}
         ]]>
     </update>
@@ -84,6 +128,23 @@
         ]]>
     </insert>
     
+        <insert id="insertEveryDayPushLog" parameterType="ScheduleDTO">
+        <selectKey keyProperty="idx" resultType="int" order="AFTER">
+            <![CDATA[
+                SELECT CURRENT_VAL AS idx FROM db_serial WHERE NAME = 'push_log_ai_idx';
+            ]]>
+        </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,
+                         start_date)
+                 VALUES (#{pushIdx},  #{sendType}, #{sendState}, #{targetType}, #{centerCode},
+                         #{senderIp}, #{sender},   #{pushTitle}, #{pushContent}, NOW(),
+                         NOW())
+        ]]>
+    </insert>
+    
     <!-- 환자 개별발송 -->
     <select id="selectTargetPatient" parameterType="int" resultType="DeviceInfoDTO">
         <![CDATA[
@@ -94,6 +155,7 @@
               LEFT JOIN PUSH_DEVICE_INFO PDI
                 ON PTT.PATIENT_IDX = PDI.PATIENT_IDX
              WHERE 1 = 1
+               AND PTT.PUSH_IDX = #{pushIdx}
         ]]>
     </select>
     
@@ -160,7 +222,7 @@
              WHERE PUSH_IDX = #{pushIdx}
         ]]>
         <if test='sendType != null and sendType != ""'>
-            <if test='sendType == "D"'>
+            <if test='sendType != "E"'>
                 <![CDATA[
                     DELETE FROM PUSH_SCHEDULE WHERE PUSH_IDX = #{pushIdx}
                     DELETE FROM PUSH_TARGET_TEMP WHERE PUSH_IDX = #{pushIdx}