PointGet2Service.java.svn-base 4.49 KB
Newer Older
Kim Gyeongeun committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119
package jp.agentec.sinaburocast.service;

import java.sql.Timestamp;
import java.util.Calendar;
import java.util.List;

import jp.agentec.sinaburocast.common.SinaburoConstant;
import jp.agentec.sinaburocast.dto.PointRecoveryDto;
import jp.agentec.sinaburocast.entity.PointGet;
import jp.agentec.sinaburocast.entity.PointPeriod;

import org.apache.velocity.tools.generic.DateTool;
import org.seasar.extension.jdbc.where.SimpleWhere;
import org.seasar.framework.container.annotation.tiger.Component;
import org.seasar.framework.container.annotation.tiger.InstanceType;

@Component(instance = InstanceType.SINGLETON)
public class PointGet2Service extends AbstractService<PointGet> {

	public MemberService memberService;

	public GiftExchangeService giftExchangeService;

	public PointPeriodService pointPeriodService;

	public void clearPointUseNumByMemberId(Integer memberId) {
		String sql = "UPDATE t_point_get SET point_use_num = 0, valid_flg = '1' where member_Id = ?";
		jdbcManager.updateBySql(sql, Integer.class).params(memberId).execute();
	}

	public Integer findPointSumByMemberId(Integer memberId) {
		String sql = "select sum(point_get_num - point_use_num) as point " + "from t_point_get where member_id = ? and valid_flg = 1 ";

		Integer pointSum = jdbcManager.selectBySql(Integer.class, sql, memberId).getSingleResult();
		if (pointSum == null) {
			return 0;
		} else {
			return pointSum;
		}
	}

	/**
	 * ・ポイント取得履歴更新 ポイント交換申請による、消費ポイント数を増加する。
	 * 更新するレコードは複数、対象カラムは「pointUseNum,validFlg ・ポイント交換申請の登録 ・会員情報テーブルの有効ポイント数更新
	 * マイレーション用
	 * 
	 * @param userPoint 減らすポイント
	 * @param member
	 * @return restPoint POINTテーブルに残っているポイント
	 */
	public int cutDownPointLogicForMaigration(int userPoint, Integer memberId, String loginId) {
		// 有効なレコードを取得順に取得
		List<PointGet> pointGetList = select().where(new SimpleWhere().eq("memberId", memberId).eq("validFlg", SinaburoConstant.ValidFlg.VALID)).orderBy("pointGetDate, pointGetid").getResultList();

		int requiredPoint = userPoint;
		// 各レコードごとに使えるポイント
		int validPoint = 0;
		// 消費ポイント
		int usePoint = 0;
		// 残ポイント
		int restPoint = 0;

		// ■ポイント取得履歴の更新
		for (int i = 0; i < pointGetList.size(); i++) {
			PointGet pointGet = pointGetList.get(i);

			if (requiredPoint == 0) {
				// 会員情報テーブル残ポイントを取得する。ここから取得するレコードはpointUseNum0であるはず。
				restPoint += pointGet.pointGetNum - pointGet.pointUseNum;
				continue;
			}

			// 各レコードの使えるポイント
			// validPoint0以上pointGet.pointGetNum以下
			validPoint = pointGet.pointGetNum - pointGet.pointUseNum;

			// 消費ポイントが0になるまで
			usePoint = Math.min(validPoint, requiredPoint);

			requiredPoint = requiredPoint - usePoint;

			pointGet.pointUseNum += usePoint;

			// レコードが消費完了していたら。INVALIDにする。
			if (pointGet.pointGetNum - pointGet.pointUseNum == 0) {
				pointGet.validFlg = SinaburoConstant.ValidFlg.INVALID;
			} else {
				restPoint = pointGet.pointGetNum - pointGet.pointUseNum;
			}

			// 対象レコードを更新
			update(pointGet, loginId);
		}

		return restPoint;
	}

	public void cutExpiredPointBySqlForRecover(Timestamp applyDate, Integer memberId) {
		PointPeriod pointPeriod = pointPeriodService.findByOnRecode();
		Calendar cal = Calendar.getInstance();
		cal.setTime(applyDate);
		cal.add(Calendar.YEAR, -pointPeriod.pointPeriod);
		// cal.add(Calendar.MONTH, 1);
		String strYearsAgoOneMonthAfter = new DateTool().format("yyyyMM", cal);
		String sql = "UPDATE t_point_get SET valid_flg = '0' where point_get_date < ? and member_Id = ?";
		jdbcManager.updateBySql(sql, String.class, Integer.class).params(strYearsAgoOneMonthAfter + "01", memberId).execute();
	}

	public List<PointRecoveryDto> findPointRecoveryDto() {
		StringBuilder sql = new StringBuilder();
		sql.append("select member_id, sum(point_get_num) as amount_point_get_num, sum(point_use_num) as amount_point_use_num ");
		sql.append("from t_point_get ");
		sql.append("group by member_id ");
		sql.append("having sum(point_get_num) <> sum(point_use_num) ");
		sql.append("and sum(point_use_num) > 0 ");

		return jdbcManager.selectBySql(PointRecoveryDto.class, sql.toString()).getResultList();
	}
}