고도몰5 마일리지 사용기한 관련 튜닝

·2021년 4월 1일
0

고도몰5 튜닝

목록 보기
4/4

고도몰5 pro / 21년 03월 원본소스 튜닝입니다.

추천인 마일리지 관련 튜닝을 하고나자, 추천인으로 받은 마일리지는 사용기한을 현재 다른 마일리지의 사용기한인 지급 후 1년보다 더 짧게 설정하고 싶다는 주문이 들어왔다.
현재 고도몰 관리자기능에서는 모든 마일리지의 사용기한은 전체적으로 하나만 설정할 수 있고, 지급하는 마일리지별로 사용기한을 다르게 설정하는 기능은 구현되어있지 않다.

우선 기본 관리자기능의 마일리지 지급기한 설정을 들여다보면
es_config테이블에 member.mileageBasic 에 "expiryDays" : "365" 라는 설정을 볼 수 있다.

다음으로 마일리지가 만료되어 소멸되게 하는 기능이 어떻게 작동하는지를 살펴봤다. Mileage 클래스의 expire(). es_memberMileage 테이블에서 deleteScheduleDt(소멸예정일) 값을 통해 해당 데이터들을 SELECT, 소멸예정일이 그 날로 되어있는 마일리지정보들을 가져와서 처리하는 방식이었다. (스케쥴러를 통해 특정 시간대에 코드 동작)
(MileageDAO class에 getListsByExpireDate 메소드 추정 -> 테스트서버에 스케쥴러가 비활성화되어있어 확인을 못해서 라이브서버에서 phpMyAdmin을 통해 deleteScheduleDt값을 임의로 바꿔서 실제 해당 값에 따라 그 날짜에 삭제되는지 동작 확인)

그렇다면 DB에 마일리지 정보 등록시에 deleteScheduleDt값만 조절해서 기본값과 다른 값으로 넣어줄 수 있다면 우리가 원하는 기능을 구현할 수 있을 것으로 판단.

Component/Mileage/Mileage.php 를 운영소스로 복사.

// 원본소스 Mileage 클래스의 public function setMemberMileage 복사
// use 코드도 현재 운영소스에 존재하지 않는 클래스들은 전부 복사해옴

if ($domain->getMileage() > 0) {               
                //마일리지 유효기간을 reasonCd에 따라 다르게 설정하기 위해 조건추가(추천인 마일리지는 일반마일리지보다 사용기한을 줄이기 위해) 
                $recommReasonCds = array('01005006','01005007');
                if(in_array($reasonCd, $recommReasonCds)){
                    // echo "<script>console.log('".$reasonCd."')</script>";
                    // exit;
                    
                    $domain->setDeleteScheduleDt($domain->getMileage() > 0 ? MileageUtil::getRecommDeleteScheduleDate() : '0000-00-00 00:00:00');
                    // getRecommDeleteScheduleDate() 는 튜닝을 위해 새로 생성한 메소드
                    $logger->info(sprintf('Set add mileage delete schedule datetime[%s]', $domain->getDeleteScheduleDt()));             
                } else {
                    $domain->setDeleteScheduleDt($domain->getMileage() > 0 ? MileageUtil::getDeleteScheduleDate() : '0000-00-00 00:00:00');
                    $logger->info(sprintf('Set add mileage delete schedule datetime[%s]', $domain->getDeleteScheduleDt()));
                }
     
            }
            
            
//Component/Mileage/MileageUtil.php 를 운영소스로 복사.
//별도의 사용기한을 설정해줄 수 있는 메소드를 생성(기존 메소드 복사해서 Config에서 가져오는 값만 변경
public static function getRecommDeleteScheduleDate()
    {
        $mileageConfig = gd_policy('member.mileageBasic');
        if ($mileageConfig['expiryFl'] === 'n') {
            return '9999-12-31 00:00:00';
        } else {            
        	//정책에서 expiryDays값을 가져오던 것을 recommExpiryDays를 가져오도록 변경
            $expiryDays = $mileageConfig['recommExpiryDays'];
            // echo "<script>console.log('".$expiryDays."')</script>";

            return DateTimeUtils::dateFormat('Y-m-d G:i:s', '+' . $expiryDays . ' day');
        }
    }

기존 정책의 expiryDays 말고 다른 값을 설정할 수 있도록 관리자페이지 튜닝

admin/member/member_mileage_basic.php를 원본소스에서 운영소스로 복사
아래 HTML코드에 - 추천인 마일리지 부분에 별도 설정값을 설정할 수 있게 코드 복사한 뒤 name, value값만 변경해줌.

: 마일리지 적립일로부터
                    <input type="text" name="expiryDays" value="<?= $data['expiryDays']; ?>" maxlength="4" class="form-control js-number width-2xs" data-number="4,9999,365"/>
                    일 까지<br />
                    - 추천인 마일리지 : 마일리지 적립일로부터
                    <input type="text" name="recommExpiryDays" value="<?= $data['recommExpiryDays']; ?>" maxlength="4" class="form-control js-number width-2xs" data-number="4,9999,365"/>
                    일 까지

문제점: 추천인 마일리지 말고 다른 이벤트 마일리지도 사용기한을 기본과 다르게 설정하고 싶다고 하면 그때마다 코드를 고쳐야한다.
해결방안: 지급하는 마일리지마다 별도의 사용기한을 설정할 수 있도록 튜닝

21.06.24. 현재는 제가 고도몰을 만지지 않고 있는데, 이렇게 했을 때 마일리지를 적용해 구매한 상품을 환불할 때 어떤 문제가 생길 수 있다는 제보가 있었습니다. 근데 직접 확인한 게 아니라서 뭐라고 더 얘기하기가 어렵네요ㅠㅠ

profile
백엔드 개발자. 공동의 목표를 함께 이해한 상태에서 솔직하게 소통하며 일하는 게 가장 즐겁고 효율적이라고 믿는 사람.

0개의 댓글