package com.yeshi.fanli.service.impl.integral;
|
|
import java.text.ParseException;
|
import java.text.SimpleDateFormat;
|
import java.util.ArrayList;
|
import java.util.Date;
|
import java.util.List;
|
|
import javax.annotation.Resource;
|
|
import org.springframework.core.task.TaskExecutor;
|
import org.springframework.stereotype.Service;
|
import org.springframework.transaction.annotation.Transactional;
|
import org.yeshi.utils.DateUtil;
|
|
import com.yeshi.fanli.dao.mybatis.integral.IntegralTaskClassMapper;
|
import com.yeshi.fanli.entity.bus.user.UserInfoExtra;
|
import com.yeshi.fanli.entity.bus.user.UserRank;
|
import com.yeshi.fanli.entity.integral.IntegralTask;
|
import com.yeshi.fanli.entity.integral.IntegralTaskClass;
|
import com.yeshi.fanli.entity.integral.IntegralTaskClass.UniqueKeyEnum;
|
import com.yeshi.fanli.entity.integral.IntegralTaskRank;
|
import com.yeshi.fanli.service.inter.integral.IntegralTaskClassService;
|
import com.yeshi.fanli.service.inter.integral.IntegralTaskRankService;
|
import com.yeshi.fanli.service.inter.integral.IntegralTaskRecordService;
|
import com.yeshi.fanli.service.inter.integral.IntegralTaskService;
|
import com.yeshi.fanli.service.inter.user.UserInfoExtraService;
|
import com.yeshi.fanli.vo.integral.DailySignVO;
|
import com.yeshi.fanli.vo.integral.IntegralTaskClassVO;
|
import com.yeshi.fanli.vo.integral.SignDateVO;
|
|
@Service
|
public class IntegralTaskClassServiceImpl implements IntegralTaskClassService {
|
|
@Resource(name = "taskExecutor")
|
private TaskExecutor executor;
|
|
@Resource
|
private IntegralTaskClassMapper integralTaskClassMapper;
|
|
@Resource
|
private IntegralTaskService integralTaskService;
|
|
@Resource
|
private IntegralTaskRankService integralTaskRankService;
|
|
@Resource
|
private IntegralTaskRecordService integralTaskRecordService;
|
|
@Resource
|
private UserInfoExtraService userInfoExtraService;
|
|
|
@Override
|
public List<IntegralTaskClassVO> getIntegralTaskClassVO(Long uid, long start, int count) {
|
return integralTaskClassMapper.getIntegralTaskClassVO(start, count);
|
}
|
|
|
@Override
|
public Long countTaskClass() {
|
return integralTaskClassMapper.countTaskClass();
|
}
|
|
|
@Override
|
public IntegralTaskClass getByUniqueKey(String uniqueKey) {
|
return integralTaskClassMapper.getByUniqueKey(uniqueKey);
|
}
|
|
/**
|
* 签到
|
* @param uid
|
* @return
|
*/
|
@Transactional
|
public Integer finishedDailySign(long uid) throws Exception{
|
IntegralTaskClass taskClass = getByUniqueKey(UniqueKeyEnum.dailySign.name());
|
if (taskClass == null || taskClass.getState() == null || taskClass.getState() != 1)
|
throw new Exception("抛出异常:任务分类不存在");
|
|
Long cid = taskClass.getId();
|
// 今日已签到完成
|
if (integralTaskRecordService.isToDaySign(uid, cid))
|
return 2;
|
|
// 任务
|
Integer num = integralTaskRecordService.getNowdaySignNum(uid, cid);
|
String uniqueKey = UniqueKeyEnum.dailySign.name() + num;
|
IntegralTask integralTask = integralTaskService.getByCidAndUniqueKey(cid, uniqueKey);
|
if (integralTask == null)
|
throw new Exception("抛出异常:任务不存在");
|
|
UserInfoExtra userInfoExtra = userInfoExtraService.getUserInfoExtra(uid);
|
if (userInfoExtra == null)
|
throw new Exception("抛出异常:额外信息不存在");
|
|
UserRank userRank = userInfoExtra.getUserRank();
|
if (userRank == null)
|
throw new Exception("抛出异常:等级信息不存在");
|
|
Integer goldCoin = integralTask.getGoldCoin();
|
Integer baseDoubleNum = integralTask.getDoubleNum();
|
if (baseDoubleNum != null && baseDoubleNum > 0)
|
goldCoin = goldCoin * baseDoubleNum;
|
|
// 根据等级计算是否增加或加倍
|
Long taskId = integralTask.getId();
|
IntegralTaskRank traskRank = integralTaskRankService.getByTsakIdAndRankId(taskId, userRank.getId());
|
if (traskRank != null) {
|
Integer addCoin = traskRank.getAddCoin();
|
if (addCoin != null && addCoin > 0)
|
goldCoin += addCoin;
|
|
Integer doubleNum = traskRank.getDoubleNum();
|
if (doubleNum != null && doubleNum > 0) {
|
goldCoin = goldCoin * doubleNum;
|
}
|
}
|
// 加入记录
|
integralTaskRecordService.finishedTask(uid, cid, taskId, goldCoin);
|
|
return 1;
|
}
|
|
|
@Override
|
public DailySignVO getDailySignList(Long uid, Long rankId) throws ParseException{
|
IntegralTaskClass taskClass = integralTaskClassMapper.getByUniqueKey(UniqueKeyEnum.dailySign.name());
|
if (taskClass == null || taskClass.getState() == null || taskClass.getState() != 1)
|
return null;
|
|
Long cid = taskClass.getId();
|
List<IntegralTask> listTask = integralTaskService.listByCid(cid);
|
if (listTask == null || listTask.size() == 0) {
|
return null;
|
}
|
|
Date date = new Date();
|
SimpleDateFormat format = new SimpleDateFormat("MM.dd");
|
List<SignDateVO> listSign = new ArrayList<SignDateVO>();
|
|
List<Date> listDays = integralTaskRecordService.getSignDays(uid, cid);
|
for (int i = 0; i < listDays.size(); i ++) {
|
if(i == listDays.size() -1) {
|
SignDateVO signDate = new SignDateVO();
|
signDate.setDate("今日");
|
signDate.setLightUp(true);
|
listSign.add(signDate);
|
break;
|
}
|
|
String before = format.format(listDays.get(i));
|
if (before.startsWith("0"))
|
before = before.substring(1, before.length());
|
SignDateVO signDateVO = new SignDateVO();
|
signDateVO.setDate(before);
|
listSign.add(signDateVO);
|
}
|
|
for (int i = 1; i <= 7- listDays.size(); i ++) {
|
String after = format.format(DateUtil.reduceDay(i, date));
|
if (after.startsWith("0"))
|
after = after.substring(1, after.length());
|
|
SignDateVO signDateVO = new SignDateVO();
|
signDateVO.setDate(after);
|
listSign.add(signDateVO);
|
}
|
|
DailySignVO dailySignVO = new DailySignVO();
|
for (int i = 0; i < listTask.size(); i++) {
|
if (listSign.size() <= i) {
|
break;
|
}
|
SignDateVO signDateVO = listSign.get(i);
|
|
IntegralTask task = listTask.get(i);
|
Integer goldCoin = task.getGoldCoin();
|
Integer baseDoubleNum = task.getDoubleNum();
|
if (baseDoubleNum != null && baseDoubleNum > 0)
|
goldCoin = goldCoin * baseDoubleNum;
|
|
IntegralTaskRank traskRank = integralTaskRankService.getByTsakIdAndRankId(task.getId(), rankId);
|
if (traskRank != null) {
|
Integer addCoin = traskRank.getAddCoin();
|
if (addCoin != null && addCoin > 0)
|
goldCoin += addCoin;
|
|
Integer doubleNum = traskRank.getDoubleNum();
|
if (doubleNum != null && doubleNum > 0) {
|
goldCoin = goldCoin * doubleNum;
|
}
|
}
|
signDateVO.setGoldCoin("+" + goldCoin);
|
|
if("今日".equals(signDateVO.getDate()))
|
dailySignVO.setGoldCoin(goldCoin);
|
|
}
|
|
dailySignVO.setDays(listDays.size());
|
dailySignVO.setListDate(listSign);
|
return dailySignVO;
|
}
|
|
|
|
}
|