친구톡 환불 완료

This commit is contained in:
hehihoho3@gmail.com 2025-07-18 09:33:09 +09:00
parent ffd779dd66
commit 936f413ac0
14 changed files with 263 additions and 33 deletions

View File

@ -0,0 +1,34 @@
package itn.let.kakao.kakaoComm;
import java.math.BigDecimal;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
/**
* @ BIZ_KAKAO_PRICE 테이블 관련
*/
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class BizKakaoPriceVO {
private Long bizKakaoPriceId;
private String bizKakaoAtPrice; // 알림톡 단가
private String bizKakaoFtPrice; // 친구톡 단가
private String bizKakaoFtImgPrice; // 친구톡 이미지 단가
private String bizKakaoFtWideImgPrice; // 친구톡 와이드 이미지 단가
private String bizSmsPrice; // SMS 단가
private String bizMmsPrice; // MMS 단가
private String msgGroupId; // 메시지 그룹 ID
// getters and setters 생략
}

View File

@ -108,4 +108,9 @@ public class KakaoAlimTalkDAO extends EgovAbstractDAO {
public void insertKakaoGroupDataTb_advc(KakaoSendAdvcVO sendVO) {
insert("kakaoAlimTalkDAO.insertKakaoGroupDataTb_advc", sendVO);
}
public KakaoVO selectBizLog(String bizUmid) {
return (KakaoVO) select("kakaoAlimTalkDAO.selectBizLog", bizUmid);
// return (KakaoVO) select("kakaoAlimTalkDAO.selectKakaoAtUmid", bizUmid);
}
}

View File

@ -29,6 +29,7 @@ import egovframework.rte.fdl.security.userdetails.util.EgovUserDetailsHelper;
import itn.com.cmm.LoginVO;
import itn.com.cmm.MjonMsgSendVO;
import itn.com.utl.fcc.service.EgovStringUtil;
import itn.let.kakao.kakaoComm.BizKakaoPriceVO;
import itn.let.kakao.kakaoComm.KakaoSendAdvcVO;
import itn.let.kakao.kakaoComm.KakaoSendUtil;
import itn.let.kakao.kakaoComm.KakaoVO;
@ -45,6 +46,7 @@ import itn.let.mjo.msgholiday.service.MsgHolidayVO;
import itn.let.mjo.msgholiday.service.impl.MsgHolidayDAO;
import itn.let.mjo.pay.service.MjonPayService;
import itn.let.mjo.pay.service.MjonPayVO;
import itn.let.mjo.pay.service.impl.MjonPayDAO;
import itn.let.module.base.PriceAndPoint;
import itn.let.sym.site.service.JoinSettingVO;
import itn.let.sym.site.service.impl.SiteManagerDAO;
@ -87,6 +89,9 @@ public class KakaoAlimTalkServiceImpl extends EgovAbstractServiceImpl implements
@Resource(name = "userManageService")
private EgovUserManageService userManageService;
@Autowired
private MjonPayDAO mjonPayDAO;
@Autowired
KakaoSendUtil kakaoSendUtil;
@ -96,6 +101,11 @@ public class KakaoAlimTalkServiceImpl extends EgovAbstractServiceImpl implements
@Autowired
private PriceAndPoint priceAndPoint;
final String KAKAO_SUCCESS_CODE = "7000";
final String RESEND_YN_YES = "Y";
final String SMS_SUCCESS_CODE = "4100"; // SMS 성공 코드
final String MMS_SUCCESS_CODE = "6600"; // MMS 성공 코드
//발신프로필 상태값 변경(삭제/복구 기능)
@Override
public int updateKakaoProfileStatus(KakaoVO kakaoVO) throws Exception{
@ -833,31 +843,97 @@ public class KakaoAlimTalkServiceImpl extends EgovAbstractServiceImpl implements
*/
List<KakaoVO> kakaoFtSentRefundList = kakaoAlimTalkDAO.selectKakaoFtSentRefundList();
for(KakaoVO vo : kakaoFtSentRefundList) {
System.out.println(vo.getMsgGroupId() +"________결과 : " +vo.getRsltCode() +" 대체문자 전송 : "+vo.getSubMsgSendYn());
for(KakaoVO kakaoVO : kakaoFtSentRefundList) {
System.out.println(kakaoVO.getMsgGroupId() +"________결과 : " +kakaoVO.getRsltCode() +" 대체문자 전송 : "+kakaoVO.getSubMsgSendYn());
if("7000".equals(vo.getRsltCode())) {//친구톡 발송 성공시
if(KAKAO_SUCCESS_CODE.equals(kakaoVO.getRsltCode())) {//친구톡 발송 성공시
kakaoAlimTalkDAO.updateKakaoFtSend(vo);
processFtSendCharge(kakaoVO);
}else if("Y".equals(vo.getSubMsgSendYn())) {//친구톡 발송 실패 했을 경우
}else if(RESEND_YN_YES.equals(kakaoVO.getSubMsgSendYn())) {
//친구톡 발송 실패 했고, 대체문자 발송 했을 경우
handleAlternativeMessageScenario(kakaoVO);
//대체문자 발송 UMID 번호 조회 - 알림톡 쿼리 동일하게 사용
KakaoVO info = kakaoAlimTalkDAO.selectKakaoAtUmid(vo);
System.out.println("대체문자 전송 : " + info.getBizUmid());
// if (info.getBizUmid() != null) {//대체문자 발송 완료인 경우
if (StringUtils.isNotEmpty(info.getBizUmid())) {//대체문자 발송 완료인 경우
kakaoAlimTalkDAO.updateKakaoFtSubMsgSend(vo);
}else {
kakaoAlimTalkDAO.updateKakaoFtNotSend(vo);
handleRefund(kakaoVO, "카카오 친구톡 전송 실패로 인한 결재 금액 환불");
}
}
}
private void processFtSendCharge(KakaoVO kakaoVO) throws Exception {
if(RESEND_YN_YES.equals(kakaoVO.getSubMsgSendYn())) {
BizKakaoPriceVO bizKakaoPriceVO = mjonPayDAO.selectBizKakaoPrice(kakaoVO.getMsgGroupId());
BigDecimal sendPrice = null;
if(StringUtils.isEmpty(kakaoVO.getBizKakaoImageType())){
sendPrice = new BigDecimal(bizKakaoPriceVO.getBizKakaoFtPrice());
}else if("I".equals(kakaoVO.getBizKakaoImageType())){
sendPrice = new BigDecimal(bizKakaoPriceVO.getBizKakaoFtImgPrice());
}else if("W".equals(kakaoVO.getBizKakaoImageType())){
sendPrice = new BigDecimal(bizKakaoPriceVO.getBizKakaoFtWideImgPrice());
}
// 예시: 건당 가격이 이미 String 형태라면 변환
BigDecimal eachPrice = new BigDecimal(kakaoVO.getEachPrice());
// 차이 계산
BigDecimal diffPrice = eachPrice.subtract(sendPrice);
if (diffPrice.compareTo(BigDecimal.ZERO) > 0) {
String result = diffPrice.toString();
kakaoVO.setEachPrice(result);
handleRefund(kakaoVO, "카카오 친구톡 전송으로 인한 결재 차액 환불");
}
}else {
kakaoAlimTalkDAO.updateKakaoFtNotSend(vo);
mjonMsgDAO.updateRefundY(kakaoVO);
}
// TODO Auto-generated method stub
}
private void handleAlternativeMessageScenario(KakaoVO kakaoVO) throws Exception {
KakaoVO bizLogVO = kakaoAlimTalkDAO.selectBizLog(kakaoVO.getBizUmid());
log.info("대체문자 전송 UMID: {}", kakaoVO.getBizUmid());
// 대체문자가 성공적으로 발송되었는지 확인 (SMS 또는 MMS 성공)
boolean isAlternativeMessageSuccessful = false;
if (bizLogVO != null && StringUtils.isNotEmpty(bizLogVO.getBizLogCallStatus())) {
if (SMS_SUCCESS_CODE.equals(bizLogVO.getBizLogCallStatus())
|| MMS_SUCCESS_CODE.equals(bizLogVO.getBizLogCallStatus())) {
isAlternativeMessageSuccessful = true;
}
}
// 대체문자 성공이면 환불 완료처리면 한다.
if (isAlternativeMessageSuccessful) {
mjonMsgDAO.updateRefundY(kakaoVO);
} else {
// 대체문자 발송 실패 경우 (친구톡 비용 환불 필요)
handleRefund(kakaoVO, "카카오 친구톡 전송 실패로 인한 결재 금액 환불");
}
}
private void handleRefund(KakaoVO vo, String msg) throws Exception {
// mj_cash 테이블에 환불 내역 추가 회원 금액 업데이트
// eachPrice는 환불될 금액이므로 양수여야 합니다.
priceAndPoint.insertCashAndPoint(
vo.getUserId(),
Float.parseFloat(vo.getEachPrice()), // 환불 금액은 양수
msg,
vo.getMsgGroupId(),
vo.getUserData()
);
// 해당 row 환불 처리 (mj_msg_data.REFUND_YN = 'Y')
mjonMsgDAO.updateRefundY(vo);
}
@Override

View File

@ -112,6 +112,7 @@ public class KakaoSentVO extends UserDefaultVO{
private String successPrice;
private String kakaoResendSuccPrice;
private String bizKakaoImageType;
private String divideYn;

View File

@ -455,6 +455,11 @@ public class MjonMsgDAO extends EgovAbstractDAO {
update("mjonMsgDAO.updateKakaoAtDelayCancelMsgDataFlag", mjonMsgVO);
}
// mj_msg_data 테이블 지연 알림톡 취소 수정
public void updateRefundY(MjonMsgVO mjonMsgVO) {
update("mjonMsgDAO.updateRefundY", mjonMsgVO);
}
// mj_msg_group_data 테이블 지연 알림톡 취소 수정
public void updateKakaoAtDelayCancelMsgGroupDataFlag(MjonMsgVO mjonMsgVO) {
update("mjonMsgDAO.updateKakaoAtDelayCancelMsgGroupDataFlag", mjonMsgVO);

View File

@ -236,6 +236,8 @@ public class MjonPayVO extends ComDefaultVO{
private int remainPoint;
private String userData;
private String totChgPay; // 간편결제분류

View File

@ -5,6 +5,7 @@ import java.util.List;
import org.springframework.stereotype.Repository;
import egovframework.rte.psl.dataaccess.EgovAbstractDAO;
import itn.let.kakao.kakaoComm.BizKakaoPriceVO;
import itn.let.mjo.pay.service.MjonPayVO;
import itn.let.mjo.pay.service.MjonVaMsgLogVO;
import itn.let.mjo.pay.service.RefundVO;
@ -46,6 +47,10 @@ public class MjonPayDAO extends EgovAbstractDAO {
return (MjonPayVO)select("mjonPayDAO.selectCashVO", mjonPayVO);
}
public BizKakaoPriceVO selectBizKakaoPrice(String msgGroupId) throws Exception{
return (BizKakaoPriceVO)select("mjonPayDAO.selectBizKakaoPrice", msgGroupId);
}
public void insertCash(MjonPayVO mjonPayVO) throws Exception{
try {

View File

@ -5,9 +5,11 @@ import java.math.RoundingMode;
import javax.annotation.Resource;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import egovframework.rte.fdl.cmmn.exception.FdlException;
import egovframework.rte.fdl.idgnr.EgovIdGnrService;
import itn.let.kakao.kakaoComm.KakaoSendAdvcVO;
import itn.let.kakao.kakaoComm.KakaoSendUtil;
@ -127,23 +129,69 @@ public class PriceAndPoint {
, String msgGroupId
) throws Exception {
MjonPayVO mjonPayVO = new MjonPayVO();
mjonPayVO.setCashId(idgenMjonCashId.getNextStringId());
mjonPayVO.setUserId(userId);
System.out.println(" + totPrice :: "+ totPrice);
mjonPayVO.setCash(totPrice);
mjonPayVO.setFrstRegisterId(userId);
mjonPayVO.setMemo(memo);
mjonPayVO.setMsgGroupId(msgGroupId);
// MjonPayVO mjonPayVO = new MjonPayVO();
// mjonPayVO.setCashId(idgenMjonCashId.getNextStringId());
// mjonPayVO.setUserId(userId);
// System.out.println(" + totPrice :: "+ totPrice);
// mjonPayVO.setCash(totPrice);
// mjonPayVO.setFrstRegisterId(userId);
// mjonPayVO.setMemo(memo);
// mjonPayVO.setMsgGroupId(msgGroupId);
insertCashAndPoint(userId, totPrice, memo, msgGroupId, null);
// mjonPayDAO.insertCash(mjonPayVO); //캐시
// mjonPayDAO.updateMemberCash(mjonPayVO); //회원정보 업데이트
}
/**
* @methodName : insertCashAndPoint
* @author : 이호영
* @date : 2025. 7. 17.
* @description : insertCashAndPoint 에서 환불으로 인해 userData 추가
* @return : void
* @param userId
* @param totPrice
* @param memo
* @param msgGroupId
* @param userData
* @throws Exception
*
*/
public void insertCashAndPoint(
String userId
, float totPrice
, String memo
, String msgGroupId
, String userData
) throws Exception {
MjonPayVO mjonPayVO = buildPayVO(userId, totPrice, memo, msgGroupId);
// 환불로 인해 userData가 추후 사용될 경우 여기에 처리
if (StringUtils.isNotEmpty(userData)) { mjonPayVO.setOrderId(userData); }
mjonPayDAO.insertCash(mjonPayVO); //캐시
mjonPayDAO.updateMemberCash(mjonPayVO); //회원정보 업데이트
}
private MjonPayVO buildPayVO(String userId, float totPrice, String memo, String msgGroupId) throws FdlException {
MjonPayVO vo = new MjonPayVO();
vo.setCashId(idgenMjonCashId.getNextStringId());
vo.setUserId(userId);
vo.setCash(totPrice);
vo.setFrstRegisterId(userId);
vo.setMemo(memo);
vo.setMsgGroupId(msgGroupId);
System.out.println(" + totPrice :: " + totPrice);
return vo;
}
public void insertBizFtKakaoPrice(String userId, String msgGroupId) throws Exception {
KakaoVO kakaoVO = new KakaoVO();
System.out.println("=======================");
// 사용자 개인 단가 정보 불러오기
MberManageVO mberManageVO = mjonMsgDataDAO.selectMberManageInfo(userId);
// 시스템 기본 단가 정보 불러오기

View File

@ -1398,6 +1398,7 @@
A.BIZ_KAKAO_RESEND_YN AS bizKakaoResendYn,
A.BIZ_KAKAO_RESEND_DATA as bizKakaoResendData,
B.AD_FLAG as adFlag ,
B.BIZ_KAKAO_IMAGE_TYPE as bizKakaoImageType ,
CASE
WHEN B.AT_DELAY_YN = 'Y' AND B.AT_DELAY_COMPLETE_YN = 'N'
THEN DATE_ADD(B.REQ_DATE, INTERVAL -30 MINUTE)

View File

@ -186,6 +186,8 @@
MSG_GROUP_ID
, BIZ_KAKAO_AT_PRICE
, BIZ_KAKAO_FT_PRICE
, BIZ_KAKAO_FT_IMG_PRICE
, BIZ_KAKAO_FT_WIDE_IMG_PRICE
, BIZ_SMS_PRICE
, BIZ_MMS_PRICE
, BIZ_PICTURE_PRICE
@ -195,6 +197,8 @@
#msgGroupId#
,#kakaoAtPrice#
,#kakaoFtPrice#
,#kakaoFtImgPrice#
,#kakaoFtWideImgPrice#
,#smsPrice#
,#mmsPrice#
,#picturePrice#
@ -233,6 +237,7 @@
, MMD.MSG_GROUP_ID AS msgGroupId
, MMD.MSG_SEQ AS msgSeq
, MMGD.BIZ_KAKAO_IMAGE_TYPE AS bizKakaoImageType
, MMGD.EACH_PRICE AS eachPrice
, MMD.USERDATA AS userData
, MMD.REFUND_YN AS refundYn
, MMD.RSLT_CODE AS rsltCode
@ -243,7 +248,7 @@
, MMD.BIZ_KAKAO_RESEND_YN AS subMsgSendYn
, MMD.BIZ_KAKAO_RESEND_TYPE AS subMsgType
, MMD.FILE_CNT AS fileCnt
, MMD.BIZ_KAKAO_RESEND_TYPE AS bizKakaoResendType
, MMD.BIZ_UMID AS bizUmid
FROM
MJ_MSG_DATA MMD
INNER JOIN LETTNGNRLMBER MB
@ -266,6 +271,15 @@
AND USERDATA = #userData#
</select>
<select id="kakaoAlimTalkDAO.selectBizLog" resultClass="kakaoVO" parameterClass="String">
SELECT
CALL_STATUS AS bizLogCallStatus
FROM
BIZ_LOG
WHERE 1=1
AND UMID = #umid#
</select>
<!-- 카카오 전송 환불 프로시저 실행 (카카오 전송 성공 관련) -->
<procedure id="kakaoAlimTalkDAO.updateKakaoAtSend" parameterClass="kakaoVO">
{call kakaoAt_Send(#userId#, #msgGroupId#, #userData#)}

View File

@ -7435,6 +7435,17 @@
</update>
<update id="mjonMsgDAO.updateRefundY" parameterClass="mjonMsgVO">
UPDATE MJ_MSG_DATA
SET REFUND_YN = 'Y'
WHERE
USER_ID = #userId#
AND USERDATA = #userData#
AND MSG_GROUP_ID = #msgGroupId#
</update>
<update id="mjonMsgDAO.updateKakaoAtDelayCancelMsgGroupDataFlag" parameterClass="mjonMsgVO">
UPDATE

View File

@ -3,10 +3,11 @@
========= ======= =================================================
2021.03.01 신명섭
-->
<!DOCTYPE sqlMap PUBLIC "-//iBATIS.com//DTD SQL Map 2.0//EN" "http://www.ibatis.com/dtd/sql-map-config-2.dtd">
<!DOCTYPE sqlMap PUBLIC "-//iBATIS.com//DTD SQL Map 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-2.dtd">
<sqlMap namespace="Pay">
<typeAlias alias="mjonPayVO" type="itn.let.mjo.pay.service.MjonPayVO"/>
<typeAlias alias="stVcVO" type="itn.let.mjo.pay.service.StVcVO"/>
<typeAlias alias="bizKakaoPriceVO" type="itn.let.kakao.kakaoComm.BizKakaoPriceVO"/>
<typeAlias alias="mjonVaMsgLogVO" type="itn.let.mjo.pay.service.MjonVaMsgLogVO"/>
<!-- 공통 쿼리 부분 문자 발송 관련 -->
@ -606,6 +607,7 @@
MEMO,
ORDER_ID,
MSG_GROUP_ID
)VALUES
(
#userId#,
@ -624,6 +626,22 @@
</update>
<select id="mjonPayDAO.selectBizKakaoPrice" resultClass="bizKakaoPriceVO" parameterClass="String">
SELECT
BIZ_KAKAO_PRICE_ID AS bizKakaoPriceId,
BIZ_KAKAO_AT_PRICE AS bizKakaoAtPrice,
BIZ_KAKAO_FT_PRICE AS bizKakaoFtPrice,
BIZ_KAKAO_FT_IMG_PRICE AS bizKakaoFtImgPrice,
BIZ_KAKAO_FT_WIDE_IMG_PRICE AS bizKakaoFtWideImgPrice,
BIZ_SMS_PRICE AS bizSmsPrice,
BIZ_MMS_PRICE AS bizMmsPrice,
MSG_GROUP_ID AS msgGroupId
FROM BIZ_KAKAO_PRICE
WHERE MSG_GROUP_ID = #msgGroupId#
</select>
<insert id="mjonPayDAO.insertMjPg" parameterClass="mjonPayVO">
INSERT INTO MJ_PG
(

View File

@ -1407,9 +1407,10 @@ function thisFnByteString(contents){
$('#msgLeng').html("");
$('#limitLeng').html("");
if ($("#ad_Y").is(":checked")) {
/* if ($("#ad_Y").is(":checked")) {
contents = "(광고)"+contents+"\n무료거부 0808800858"
}
} */
contents = adYChkAndMakeContents(contents);
console.log(contents);
var conLeng = conByteLeng(contents); // 내용 문자 입력 바이트 수 계산하기
@ -1444,6 +1445,7 @@ function thisFnByteString(contents){
$("#subMsgType").val("SMS");
}
totalFtPriceSum(tableL.getRows().length);
}

View File

@ -49,7 +49,10 @@ function totalFtPriceSum(totRows) {
if ($("#send_fail_check").is(":checked")) {
if (imgTypeId === "img_file_0") {
// 장문/단문 여부에 따라 가격 비교 후 더 큰 값으로 설정
var len = conByteLeng($('#smsTxtArea').val());
var contents = adYChkAndMakeContents($('#smsTxtArea').val());
var len = conByteLeng(contents);
var long = parseFloat($("#longPrice").val());
var short = parseFloat($("#shortPrice").val());
price = Math.max(price, len > 90 ? long : short);
@ -76,7 +79,12 @@ function totalFtPriceSum(totRows) {
return totalStr; // 계산된 총 금액 반환
}
function adYChkAndMakeContents(contents){
if ($("#ad_Y").is(":checked")) {
contents = "(광고)"+contents+"\n무료거부 0808800858"
}
return contents;
}
/*