/*
* Powered By zhangyunhua
* Web Site: http://www.hehenian.com
* Since 2008 - 2014
*/
package com.hehenian.biz.component.activity.impl;
import java.util.Date;
import java.util.List;
import java.util.Map;
import org.apache.commons.lang.time.DateFormatUtils;
import org.apache.commons.lang.time.DateUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.hehenian.biz.common.account.dataobject.AccountUserDo;
import com.hehenian.biz.common.activity.dataobject.ActivityAuthDo;
import com.hehenian.biz.common.activity.dataobject.ActivityLockDo;
import com.hehenian.biz.common.activity.dataobject.ActivityOrderDo;
import com.hehenian.biz.common.activity.dataobject.ActivityTradeDo;
import com.hehenian.biz.common.exception.BusinessException;
import com.hehenian.biz.common.util.CalculateUtils;
import com.hehenian.biz.component.account.IUserComponent;
import com.hehenian.biz.component.activity.IActivityTradeComponent;
import com.hehenian.biz.dal.activity.IActivityAuthDao;
import com.hehenian.biz.dal.activity.IActivityLockDao;
import com.hehenian.biz.dal.activity.IActivityOrderDao;
import com.hehenian.biz.dal.activity.IActivityTradeDao;
/**
* @author zhangyunhua
* @version 1.0
* @since 1.0
*/
@Component("activityTradeComponent")
public class ActivityTradeComponentImpl implements IActivityTradeComponent {
@Autowired
private IActivityTradeDao activityTradeDao;
@Autowired
private IActivityAuthDao activityAuthDao;
@Autowired
private IActivityOrderDao activityOrderDao;
@Autowired
private IUserComponent userComponent;
@Autowired
private IActivityLockDao activityLockDao;
/**
* 根据ID 查询
*
* @parameter id
*/
public ActivityTradeDo getById(int id) {
return activityTradeDao.getById(id);
}
/**
* 根据条件查询列表
*/
public List<ActivityTradeDo> selectActivityTrade(Map<String, Object> parameterMap) {
return activityTradeDao.selectActivityTrade(parameterMap);
}
/**
* 更新
*/
public int updateActivityTradeById(ActivityTradeDo newActivityTradeDo) {
int result = activityTradeDao.updateActivityTradeById(newActivityTradeDo);
if (result < 1) {
throw new BusinessException("更新失败");
}
return result;
}
/**
* 新增
*/
public int addActivityTrade(ActivityTradeDo newActivityTradeDo) {
return activityTradeDao.addActivityTrade(newActivityTradeDo);
}
/**
* 删除
*/
public int deleteById(int id) {
return activityTradeDao.deleteById(id);
}
@Override
public boolean addActivityTrades(long ordId) {
ActivityOrderDo orderDo = activityOrderDao.getById(ordId);
if (orderDo == null) {
throw new RuntimeException("活动订单[" + ordId + "]记录不存在!");
}
ActivityAuthDo authDo = activityAuthDao.getByOrdId1(ordId);
if (authDo == null || authDo.getAuthStatus().intValue() != 1) {
throw new RuntimeException("授权[" + ordId + "](订单ID)记录不存在或者授权失败");
}
double totalDedeductAmount = 0.00;// 总扣款金额
int deductPeriods = calDeductPeriods(orderDo.getBeginDate(), orderDo.getEndDate());
Date beginDate = orderDo.getBeginDate();
Date tradeDate = DateUtils.addDays(new Date(), 1);// 交易日期
while (beginDate.before(orderDo.getEndDate())) {
ActivityTradeDo tradeDo = new ActivityTradeDo();
tradeDo.setOrdId(ordId);
tradeDo.setFromUserId(authDo.getFromUserId());
tradeDo.setToUserId(authDo.getToUserId());
tradeDo.setAmount(CalculateUtils.div(orderDo.getDeductAmount(), deductPeriods, 2));
totalDedeductAmount = CalculateUtils.add(totalDedeductAmount, tradeDo.getAmount());
tradeDo.setRealAmount(0d);
tradeDate = DateUtils.addMonths(tradeDate, 1);
tradeDo.setTradeTime(tradeDate);
tradeDo.setTradeStatus(0);// 0-未转账
addActivityTrade(tradeDo);
beginDate = DateUtils.addMonths(beginDate, 1);
}
if (CalculateUtils.gt(totalDedeductAmount, authDo.getAuthAmount())) {
throw new RuntimeException("活动订单[" + ordId + "]的转账金额大于授权金额!");
}
return true;
}
/**
* 计算扣款期数
*
* @param beginDate
* @param endDate
* @return
* @author: liuzgmf
* @date: 2014年10月31日下午4:50:56
*/
private int calDeductPeriods(Date beginDate, Date endDate) {
int deductPeriods = 0;
while (beginDate.before(endDate)) {
deductPeriods++;
beginDate = DateUtils.addMonths(beginDate, 1);
}
return deductPeriods;
}
@Override
public List<ActivityTradeDo> queryNoTransferTrades(Date tradeTime) {
return activityTradeDao.queryNoTransferTrades(tradeTime);
}
public static void main(String[] args) throws Exception {
ActivityTradeComponentImpl tradeComponent = new ActivityTradeComponentImpl();
Date beginDate = DateUtils.parseDate("20141101", new String[] { "yyyyMMdd" });
Date endDate = DateUtils.parseDate("20151102", new String[] { "yyyyMMdd" });
System.out.println(tradeComponent.calDeductPeriods(beginDate, endDate));
System.out.println(DateFormatUtils.format(beginDate, "yyyyMMdd"));
}
@Override
public List<ActivityTradeDo> selectLastUnDeductActivityTrade(Map<String, Object> parameterMap) {
return activityTradeDao.selectLastUnDeductActivityTrade(parameterMap);
}
@Override
public boolean updateActivityTradeTransfer(ActivityTradeDo activityTradeDo) {
// 修改转账记录为转账成功
activityTradeDo.setTradeStatus(1);// 1-已转账
activityTradeDo.setRealTradeTime(new Date());
activityTradeDo.setRemark("转账成功");
activityTradeDao.updateActivityTradeById(activityTradeDo);
// 修改用户账户的锁定金额
AccountUserDo userDo = new AccountUserDo();
userDo.setId(activityTradeDo.getFromUserId());
userDo.setUsableSum(-activityTradeDo.getRealAmount());
userDo.setLockAmount(-activityTradeDo.getRealAmount());
userComponent.updateAmount(userDo);
// 新增解锁记录
ActivityLockDo activityLockDo = new ActivityLockDo();
activityLockDo.setOrdId(activityTradeDo.getOrdId());
activityLockDo.setUserId(activityTradeDo.getFromUserId());
activityLockDo.setAmount(activityTradeDo.getRealAmount());
activityLockDo.setLockType(1);// 1-解锁
activityLockDo.setStatus(1);// 1-成功
activityLockDao.addActivityLock(activityLockDo);
return true;
}
@Override
public List<ActivityTradeDo> queryByIds(List<Long> idList) {
return activityTradeDao.queryByIds(idList);
}
}