이지우 - 카카오 환불 수정. 트랜잭션 분리를 위하여 스케줄 Util에서 반복문으로 처리
@dbc1f2335ad5bd9f6b3ee57fc7d3740b449b7674
--- src/main/java/itn/let/kakao/user/kakaoAt/service/KakaoAlimTalkService.java
+++ src/main/java/itn/let/kakao/user/kakaoAt/service/KakaoAlimTalkService.java
... | ... | @@ -34,4 +34,8 @@ |
| 34 | 34 |
//카카오(알림톡, 친구톡 통합) 전송 실패 환불리스트 조회 |
| 35 | 35 |
public void selectKakaoSentRefundList() throws Exception; |
| 36 | 36 |
|
| 37 |
+ //카카오(알림톡, 친구톡 통합) 전송 실패 환불리스트 조회 |
|
| 38 |
+ public List<KakaoVO> selectKakaoSentRefundListForSingle() throws Exception; |
|
| 39 |
+ |
|
| 40 |
+ public void kakaoSingleRefund(KakaoVO kakaoVO) throws Exception; |
|
| 37 | 41 |
} |
--- src/main/java/itn/let/kakao/user/kakaoAt/service/impl/KakaoAlimTalkServiceImpl.java
+++ src/main/java/itn/let/kakao/user/kakaoAt/service/impl/KakaoAlimTalkServiceImpl.java
... | ... | @@ -1,7 +1,6 @@ |
| 1 | 1 |
package itn.let.kakao.user.kakaoAt.service.impl; |
| 2 | 2 |
|
| 3 | 3 |
import java.math.BigDecimal; |
| 4 |
-import java.math.RoundingMode; |
|
| 5 | 4 |
import java.text.SimpleDateFormat; |
| 6 | 5 |
import java.time.Duration; |
| 7 | 6 |
import java.time.Instant; |
... | ... | @@ -11,8 +10,6 @@ |
| 11 | 10 |
import java.util.HashMap; |
| 12 | 11 |
import java.util.List; |
| 13 | 12 |
import java.util.Map; |
| 14 |
-import java.util.Objects; |
|
| 15 |
-import java.util.Set; |
|
| 16 | 13 |
import java.util.stream.Collectors; |
| 17 | 14 |
|
| 18 | 15 |
import javax.annotation.Resource; |
... | ... | @@ -22,12 +19,13 @@ |
| 22 | 19 |
import org.springframework.beans.factory.annotation.Autowired; |
| 23 | 20 |
import org.springframework.http.HttpStatus; |
| 24 | 21 |
import org.springframework.stereotype.Service; |
| 22 |
+import org.springframework.transaction.annotation.Propagation; |
|
| 23 |
+import org.springframework.transaction.annotation.Transactional; |
|
| 25 | 24 |
|
| 26 | 25 |
import egovframework.rte.fdl.cmmn.EgovAbstractServiceImpl; |
| 27 | 26 |
import egovframework.rte.fdl.idgnr.EgovIdGnrService; |
| 28 | 27 |
import egovframework.rte.fdl.security.userdetails.util.EgovUserDetailsHelper; |
| 29 | 28 |
import itn.com.cmm.LoginVO; |
| 30 |
-import itn.com.cmm.MjonMsgSendVO; |
|
| 31 | 29 |
import itn.com.utl.fcc.service.EgovStringUtil; |
| 32 | 30 |
import itn.let.kakao.kakaoComm.BizKakaoPriceVO; |
| 33 | 31 |
import itn.let.kakao.kakaoComm.KakaoSendAdvcVO; |
... | ... | @@ -51,7 +49,6 @@ |
| 51 | 49 |
import itn.let.sym.site.service.JoinSettingVO; |
| 52 | 50 |
import itn.let.sym.site.service.impl.SiteManagerDAO; |
| 53 | 51 |
import itn.let.uss.umt.service.EgovUserManageService; |
| 54 |
-import itn.let.uss.umt.service.UserManageVO; |
|
| 55 | 52 |
import lombok.extern.slf4j.Slf4j; |
| 56 | 53 |
|
| 57 | 54 |
@Slf4j |
... | ... | @@ -946,7 +943,7 @@ |
| 946 | 943 |
private void handleRefund(KakaoVO vo, String msg) throws Exception {
|
| 947 | 944 |
// mj_cash 테이블에 환불 내역 추가 및 회원 금액 업데이트 |
| 948 | 945 |
// eachPrice는 환불될 금액이므로 양수여야 합니다. |
| 949 |
- priceAndPoint.insertCashAndPoint( |
|
| 946 |
+ priceAndPoint.insertCashAndPointNoUpdate( |
|
| 950 | 947 |
vo.getUserId(), |
| 951 | 948 |
Float.parseFloat(vo.getEachPrice()), // 환불 금액은 양수 |
| 952 | 949 |
msg, |
... | ... | @@ -1126,8 +1123,33 @@ |
| 1126 | 1123 |
return statusResponse; |
| 1127 | 1124 |
} |
| 1128 | 1125 |
|
| 1129 |
- |
|
| 1126 |
+ @Override |
|
| 1127 |
+ public List<KakaoVO> selectKakaoSentRefundListForSingle() throws Exception{
|
|
| 1128 |
+ return kakaoAlimTalkDAO.selectKakaoSentRefundList(); |
|
| 1129 |
+ } |
|
| 1130 | 1130 |
|
| 1131 |
+ @Override |
|
| 1132 |
+ public void kakaoSingleRefund(KakaoVO kakaoVO) throws Exception {
|
|
| 1133 |
+ |
|
| 1134 |
+ System.out.println(kakaoVO.getMsgGroupId() +"________결과 : " +kakaoVO.getRsltCode() +" 대체문자 전송 : "+kakaoVO.getSubMsgSendYn()); |
|
| 1135 |
+ kakaoVO.setMsgTypeTxt(AT_MSG_TYPE.equals(kakaoVO.getMsgType()) ? "알림톡" : "친구톡"); |
|
| 1136 |
+ |
|
| 1137 |
+ if(KAKAO_SUCCESS_CODE.equals(kakaoVO.getRsltCode())) {
|
|
| 1138 |
+ //1.카카오톡 발송 성공 |
|
| 1139 |
+ processKakaoSendCharge(kakaoVO); |
|
| 1140 |
+ |
|
| 1141 |
+ }else if(RESEND_YN_YES.equals(kakaoVO.getSubMsgSendYn())) {//카카오톡 발송 실패, 대체문자 발송 신청 O
|
|
| 1142 |
+ //2.카카오톡 발송 실패 + 대체문자 신청 O |
|
| 1143 |
+ handleAlternativeMessageScenario(kakaoVO); |
|
| 1144 |
+ |
|
| 1145 |
+ }else {
|
|
| 1146 |
+ //3.카카오톡 발송 실패 + 대체문자 신청 X : 전액 환불 |
|
| 1147 |
+ handleRefund(kakaoVO, "카카오 " + kakaoVO.getMsgTypeTxt() + " 전송 실패로 인한 결제 금액 환불"); |
|
| 1148 |
+ } |
|
| 1149 |
+ |
|
| 1150 |
+ //모든 유형 환불 완료 처리 |
|
| 1151 |
+ mjonMsgDAO.updateRefundY(kakaoVO); |
|
| 1152 |
+ } |
|
| 1131 | 1153 |
|
| 1132 | 1154 |
// // 보유 금액이 충분한지 확인하는 메서드 |
| 1133 | 1155 |
// private boolean isCashSufficient(String userId, List<KakaoSendAdvcVO> kakaoSendAdvcListVO) throws Exception {
|
... | ... | @@ -1149,35 +1171,6 @@ |
| 1149 | 1171 |
// // 비교 수행 |
| 1150 | 1172 |
// return befCash.compareTo(totalEachPrice) >= 0; |
| 1151 | 1173 |
// } |
| 1152 |
- |
|
| 1153 |
- |
|
| 1154 |
- |
|
| 1155 |
- |
|
| 1156 |
- |
|
| 1157 |
- |
|
| 1158 |
- |
|
| 1159 |
- |
|
| 1160 |
- |
|
| 1161 |
- |
|
| 1162 |
- |
|
| 1163 |
- |
|
| 1164 |
- |
|
| 1165 |
- |
|
| 1166 |
- |
|
| 1167 |
- |
|
| 1168 |
- |
|
| 1169 |
- |
|
| 1170 |
- |
|
| 1171 |
- |
|
| 1172 |
- |
|
| 1173 |
- |
|
| 1174 |
- |
|
| 1175 |
- |
|
| 1176 |
- |
|
| 1177 |
- |
|
| 1178 |
- |
|
| 1179 |
- |
|
| 1180 |
- |
|
| 1181 | 1174 |
|
| 1182 | 1175 |
|
| 1183 | 1176 |
} |
--- src/main/java/itn/let/kakao/user/kakaoAt/web/KakaoAlimTalkSendController.java
+++ src/main/java/itn/let/kakao/user/kakaoAt/web/KakaoAlimTalkSendController.java
... | ... | @@ -9,9 +9,11 @@ |
| 9 | 9 |
import java.util.Calendar; |
| 10 | 10 |
import java.util.Date; |
| 11 | 11 |
import java.util.HashMap; |
| 12 |
+import java.util.HashSet; |
|
| 12 | 13 |
import java.util.List; |
| 13 | 14 |
import java.util.Locale; |
| 14 | 15 |
import java.util.Map; |
| 16 |
+import java.util.Set; |
|
| 15 | 17 |
import java.util.stream.Collectors; |
| 16 | 18 |
|
| 17 | 19 |
import javax.annotation.Resource; |
... | ... | @@ -61,7 +63,6 @@ |
| 61 | 63 |
import itn.com.cmm.util.StringUtil; |
| 62 | 64 |
import itn.com.utl.fcc.service.EgovStringUtil; |
| 63 | 65 |
import itn.let.kakao.kakaoComm.KakaoReturnVO; |
| 64 |
-import itn.let.kakao.kakaoComm.KakaoSendAdvcVO; |
|
| 65 | 66 |
import itn.let.kakao.kakaoComm.KakaoSendUtil; |
| 66 | 67 |
import itn.let.kakao.kakaoComm.KakaoVO; |
| 67 | 68 |
import itn.let.kakao.kakaoComm.kakaoApi.KakaoApiJsonSave; |
... | ... | @@ -79,6 +80,9 @@ |
| 79 | 80 |
import itn.let.mjo.msgholiday.service.MsgAlarmSetVO; |
| 80 | 81 |
import itn.let.mjo.msgholiday.service.MsgHolidayService; |
| 81 | 82 |
import itn.let.mjo.msgholiday.service.MsgHolidayVO; |
| 83 |
+import itn.let.mjo.pay.service.MjonPayService; |
|
| 84 |
+import itn.let.mjo.pay.service.MjonPayVO; |
|
| 85 |
+import itn.let.org.web.OrgChartManageController; |
|
| 82 | 86 |
import itn.let.sym.site.service.EgovSiteManagerService; |
| 83 | 87 |
import itn.let.sym.site.service.JoinSettingVO; |
| 84 | 88 |
import itn.let.uss.umt.service.EgovUserManageService; |
... | ... | @@ -101,6 +105,8 @@ |
| 101 | 105 |
*/ |
| 102 | 106 |
@Controller |
| 103 | 107 |
public class KakaoAlimTalkSendController {
|
| 108 |
+ |
|
| 109 |
+ private final OrgChartManageController orgChartManageController; |
|
| 104 | 110 |
|
| 105 | 111 |
@Resource(name = "egovMjonMsgGroupIdGnrService") |
| 106 | 112 |
private EgovIdGnrService idgenMjonMsgGroupId; |
... | ... | @@ -149,6 +155,13 @@ |
| 149 | 155 |
|
| 150 | 156 |
@Autowired |
| 151 | 157 |
private MjonCommon mjonCommon; |
| 158 |
+ |
|
| 159 |
+ @Resource(name = "mjonPayService") |
|
| 160 |
+ private MjonPayService mjonPayService; |
|
| 161 |
+ |
|
| 162 |
+ KakaoAlimTalkSendController(OrgChartManageController orgChartManageController) {
|
|
| 163 |
+ this.orgChartManageController = orgChartManageController; |
|
| 164 |
+ } |
|
| 152 | 165 |
|
| 153 | 166 |
@RequestMapping(value= {"/web/mjon/alimtalk/kakaoAlimtalkMsgDataView.do"})
|
| 154 | 167 |
public String KakaoAlimtalkMsgDataView(ModelMap model |
... | ... | @@ -1541,6 +1554,25 @@ |
| 1541 | 1554 |
return "web/kakao/msgdata/at/KakaoAlimtalkMsgDataView_tmp"; |
| 1542 | 1555 |
} |
| 1543 | 1556 |
|
| 1557 |
+ public void kakaoRefundSingleTransaction() throws Exception{
|
|
| 1558 |
+ System.out.println("=============카카오 환불 싱글 트랜잭션 수행 =============");
|
|
| 1559 |
+ |
|
| 1560 |
+ List<KakaoVO> kakaoRefundList = kakaoAlimTalkService.selectKakaoSentRefundListForSingle(); |
|
| 1561 |
+ Set<String> targetIdSet = new HashSet<>(); |
|
| 1562 |
+ |
|
| 1563 |
+ for(KakaoVO kakaoVO : kakaoRefundList) {
|
|
| 1564 |
+ kakaoAlimTalkService.kakaoSingleRefund(kakaoVO); |
|
| 1565 |
+ targetIdSet.add(kakaoVO.getUserId()); |
|
| 1566 |
+ } |
|
| 1567 |
+ |
|
| 1568 |
+ MjonPayVO mjonPayVO = new MjonPayVO(); |
|
| 1569 |
+ for(String userId : targetIdSet) {
|
|
| 1570 |
+ mjonPayVO.setUserId(userId); |
|
| 1571 |
+ mjonPayService.updateMemberCash(mjonPayVO); //회원정보 업데이트 |
|
| 1572 |
+ } |
|
| 1573 |
+ |
|
| 1574 |
+ } |
|
| 1575 |
+ |
|
| 1544 | 1576 |
/** |
| 1545 | 1577 |
* @Method Name : kakaoMsgSendRefundTestAjax |
| 1546 | 1578 |
* @작성일 : 2025. 8. 6. |
... | ... | @@ -1555,7 +1587,7 @@ |
| 1555 | 1587 |
ModelAndView modelAndView = new ModelAndView(); |
| 1556 | 1588 |
modelAndView.setViewName("jsonView");
|
| 1557 | 1589 |
|
| 1558 |
- kakaoAlimTalkService.selectKakaoSentRefundList(); |
|
| 1590 |
+ this.kakaoRefundSingleTransaction(); |
|
| 1559 | 1591 |
|
| 1560 | 1592 |
modelAndView.addObject("result", "success");
|
| 1561 | 1593 |
return modelAndView; |
--- src/main/java/itn/let/module/base/PriceAndPoint.java
+++ src/main/java/itn/let/module/base/PriceAndPoint.java
... | ... | @@ -213,6 +213,36 @@ |
| 213 | 213 |
kakaoAlimTalkDAO.insertKakaoSendPrice(kakaoVO); |
| 214 | 214 |
|
| 215 | 215 |
} |
| 216 |
- |
|
| 216 |
+ |
|
| 217 |
+ /** |
|
| 218 |
+ * @methodName : insertCashAndPoint |
|
| 219 |
+ * @author : 이지우 |
|
| 220 |
+ * @date : 2025. 8. 14. |
|
| 221 |
+ * @description : insertCashAndPoint 에서 updateMemberCash 제외 |
|
| 222 |
+ * @return : void |
|
| 223 |
+ * @param userId |
|
| 224 |
+ * @param totPrice |
|
| 225 |
+ * @param memo |
|
| 226 |
+ * @param msgGroupId |
|
| 227 |
+ * @param userData |
|
| 228 |
+ * @throws Exception |
|
| 229 |
+ * |
|
| 230 |
+ */ |
|
| 231 |
+ public void insertCashAndPointNoUpdate( |
|
| 232 |
+ String userId |
|
| 233 |
+ , float totPrice |
|
| 234 |
+ , String memo |
|
| 235 |
+ , String msgGroupId |
|
| 236 |
+ , String userData |
|
| 237 |
+ ) throws Exception {
|
|
| 238 |
+ |
|
| 239 |
+ MjonPayVO mjonPayVO = buildPayVO(userId, totPrice, memo, msgGroupId); |
|
| 240 |
+ |
|
| 241 |
+// 환불로 인해 userData가 추후 사용될 경우 여기에 처리 |
|
| 242 |
+ if (StringUtils.isNotEmpty(userData)) { mjonPayVO.setOrderId(userData); }
|
|
| 243 |
+ |
|
| 244 |
+ mjonPayDAO.insertCash(mjonPayVO); //캐시 |
|
| 245 |
+ |
|
| 246 |
+ } |
|
| 217 | 247 |
|
| 218 | 248 |
}(No newline at end of file) |
--- src/main/java/itn/let/schdlr/service/SchedulerUtil.java
+++ src/main/java/itn/let/schdlr/service/SchedulerUtil.java
... | ... | @@ -1,12 +1,16 @@ |
| 1 | 1 |
package itn.let.schdlr.service; |
| 2 | 2 |
|
| 3 | 3 |
import java.text.SimpleDateFormat; |
| 4 |
+import java.util.ArrayList; |
|
| 4 | 5 |
import java.util.Date; |
| 6 |
+import java.util.HashSet; |
|
| 5 | 7 |
import java.util.List; |
| 8 |
+import java.util.Set; |
|
| 6 | 9 |
|
| 7 | 10 |
import javax.annotation.Resource; |
| 8 | 11 |
import javax.sql.DataSource; |
| 9 | 12 |
|
| 13 |
+import org.springframework.beans.factory.annotation.Autowired; |
|
| 10 | 14 |
import org.springframework.beans.factory.annotation.Value; |
| 11 | 15 |
import org.springframework.context.annotation.Bean; |
| 12 | 16 |
import org.springframework.context.annotation.Profile; |
... | ... | @@ -24,12 +28,15 @@ |
| 24 | 28 |
import itn.let.fax.admin.service.FaxStatVO; |
| 25 | 29 |
import itn.let.kakao.admin.kakaoAt.service.MjonKakaoAtStatVO; |
| 26 | 30 |
import itn.let.kakao.admin.statistics.service.KakaoStatisticsService; |
| 31 |
+import itn.let.kakao.kakaoComm.KakaoVO; |
|
| 32 |
+import itn.let.kakao.user.kakaoAt.service.KakaoAlimTalkService; |
|
| 27 | 33 |
import itn.let.lett.service.LetterService; |
| 28 | 34 |
import itn.let.mail.service.MailTemplateService; |
| 29 | 35 |
import itn.let.mjo.msg.service.MjonMsgService; |
| 30 | 36 |
import itn.let.mjo.msg.service.MjonMsgStatVO; |
| 31 |
-import itn.let.mjo.msg.service.MjonMsgVO; |
|
| 32 | 37 |
import itn.let.mjo.msgdata.service.impl.MjonMsgDataDAO; |
| 38 |
+import itn.let.mjo.pay.service.MjonPayVO; |
|
| 39 |
+import itn.let.mjo.pay.service.impl.MjonPayDAO; |
|
| 33 | 40 |
import itn.let.sts.com.StatsVO; |
| 34 | 41 |
import itn.let.sts.cst.service.EgovConectStatsService; |
| 35 | 42 |
import itn.let.uss.umt.service.EgovUserManageService; |
... | ... | @@ -81,6 +88,12 @@ |
| 81 | 88 |
|
| 82 | 89 |
@Resource(name="MjonMsgDataDAO") |
| 83 | 90 |
private MjonMsgDataDAO mjonMsgDataDAO; |
| 91 |
+ |
|
| 92 |
+ @Resource(name="KakaoAlimTalkService") |
|
| 93 |
+ private KakaoAlimTalkService kakaoAlimTalkService; |
|
| 94 |
+ |
|
| 95 |
+ @Autowired |
|
| 96 |
+ private MjonPayDAO mjonPayDAO; |
|
| 84 | 97 |
|
| 85 | 98 |
/** 설정값 가져오기 */ |
| 86 | 99 |
@Value("#{globalSettings['Globals.Env']}")
|
... | ... | @@ -466,20 +479,26 @@ |
| 466 | 479 |
return new JdbcTemplateLockProvider(dataSource); |
| 467 | 480 |
} |
| 468 | 481 |
|
| 469 |
- /** |
|
| 470 | 482 |
@Scheduled(cron = "0 0/3 * * * ?") // 3분마다 실행 |
| 471 | 483 |
@SchedulerLock(name = "runKakaoOneTime", lockAtMostForString = ONE_MIN, lockAtLeastForString = ONE_MIN) |
| 472 | 484 |
public void runKakaoOneTime() throws Exception {
|
| 473 | 485 |
|
| 474 |
- // do something... |
|
| 475 |
- try {
|
|
| 476 | 486 |
System.out.println("=============SchedulerUtil=====runKakaoOneTime =============>");
|
| 477 |
- schdlrManageService.kakaoFailPayBack(); |
|
| 478 |
- }catch(Exception ex) {
|
|
| 479 |
- ex.printStackTrace(); |
|
| 480 |
- } |
|
| 487 |
+ List<KakaoVO> kakaoRefundList = kakaoAlimTalkService.selectKakaoSentRefundListForSingle(); |
|
| 488 |
+ Set<String> targetIdSet = new HashSet<>(); |
|
| 489 |
+ |
|
| 490 |
+ for(KakaoVO kakaoVO : kakaoRefundList) {
|
|
| 491 |
+ kakaoAlimTalkService.kakaoSingleRefund(kakaoVO); |
|
| 492 |
+ targetIdSet.add(kakaoVO.getUserId()); |
|
| 493 |
+ } |
|
| 494 |
+ |
|
| 495 |
+ MjonPayVO mjonPayVO = new MjonPayVO(); |
|
| 496 |
+ for(String userId : targetIdSet) {
|
|
| 497 |
+ mjonPayVO.setUserId(userId); |
|
| 498 |
+ mjonPayDAO.updateMemberCash(mjonPayVO); //회원정보 업데이트 |
|
| 499 |
+ } |
|
| 500 |
+ |
|
| 481 | 501 |
} |
| 482 |
- */ |
|
| 483 | 502 |
//환불 실행 |
| 484 | 503 |
private void PayBack(String p_type) throws Exception {
|
| 485 | 504 |
|
--- src/main/resources/egovframework/sqlmap/let/mjo/kakao/Kakao_AT_SQL_Mysql.xml
+++ src/main/resources/egovframework/sqlmap/let/mjo/kakao/Kakao_AT_SQL_Mysql.xml
... | ... | @@ -235,6 +235,7 @@ |
| 235 | 235 |
AND MMD.REFUND_YN = 'N' |
| 236 | 236 |
AND MMD.RESERVE_C_YN = 'N' |
| 237 | 237 |
AND MMD.MSG_TYPE IN(8, 9) |
| 238 |
+ ORDER BY MMD.USER_ID ASC |
|
| 238 | 239 |
</select> |
| 239 | 240 |
|
| 240 | 241 |
<select id="kakaoAlimTalkDAO.selectKakaoAtSentRefundList" resultClass="kakaoVO"> |
Add a comment
Delete comment
Once you delete this comment, you won't be able to recover it. Are you sure you want to delete this comment?