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) { // 会員情報テーブル残ポイントを取得する。ここから取得するレコードはpointUseNumが0であるはず。 restPoint += pointGet.pointGetNum - pointGet.pointUseNum; continue; } // 各レコードの使えるポイント // validPointは0以上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(); } }