package com.yeshi.fanli.service.impl.redpack;
|
|
import java.math.BigDecimal;
|
import java.text.SimpleDateFormat;
|
import java.util.Date;
|
|
import javax.annotation.Resource;
|
|
import org.springframework.stereotype.Service;
|
import org.springframework.transaction.annotation.Transactional;
|
import org.yeshi.utils.DateUtil;
|
|
import com.aliyun.openservices.ons.api.Message;
|
import com.aliyun.openservices.ons.api.Producer;
|
import com.google.gson.Gson;
|
import com.yeshi.fanli.dao.mybatis.redpack.RedPackGiveRecordMapper;
|
import com.yeshi.fanli.dto.mq.user.UserTopicTagEnum;
|
import com.yeshi.fanli.dto.mq.user.body.UserRedPackGiftMQMsg;
|
import com.yeshi.fanli.dto.msg.MsgRedPackGiveContentDTO;
|
import com.yeshi.fanli.entity.bus.msg.MsgMoneyDetail.MsgTypeMoneyTypeEnum;
|
import com.yeshi.fanli.entity.bus.user.TokenRecord;
|
import com.yeshi.fanli.entity.bus.user.TokenRecord.TokenTypeEnum;
|
import com.yeshi.fanli.entity.redpack.RedPackDetail;
|
import com.yeshi.fanli.entity.redpack.RedPackDetail.RedPackDetailTypeEnum;
|
import com.yeshi.fanli.entity.redpack.RedPackGiveRecord;
|
import com.yeshi.fanli.exception.redpack.RedPackGiveRecordException;
|
import com.yeshi.fanli.service.inter.money.msg.UserMoneyMsgNotificationService;
|
import com.yeshi.fanli.service.inter.redpack.RedPackBalanceService;
|
import com.yeshi.fanli.service.inter.redpack.RedPackConfigService;
|
import com.yeshi.fanli.service.inter.redpack.RedPackDetailService;
|
import com.yeshi.fanli.service.inter.redpack.RedPackForbidService;
|
import com.yeshi.fanli.service.inter.redpack.RedPackGiveRecordService;
|
import com.yeshi.fanli.service.inter.user.TokenRecordService;
|
import com.yeshi.fanli.util.Constant;
|
import com.yeshi.fanli.util.StringUtil;
|
import com.yeshi.fanli.util.TokenUtil;
|
import com.yeshi.fanli.util.annotation.RequestSerializableByKeyService;
|
import com.yeshi.fanli.util.factory.RedPackDetailFactory;
|
import com.yeshi.fanli.util.rocketmq.MQMsgBodyFactory;
|
import com.yeshi.fanli.util.rocketmq.MQTopicName;
|
|
@Service
|
public class RedPackGiveRecordServiceImpl implements RedPackGiveRecordService {
|
|
@Resource
|
private RedPackGiveRecordMapper redPackGiveRecordMapper;
|
|
@Resource
|
private RedPackConfigService redPackConfigService;
|
|
@Resource
|
private RedPackBalanceService redPackBalanceService;
|
|
@Resource
|
private TokenRecordService tokenRecordService;
|
|
@Resource
|
private RedPackDetailService redPackDetailService;
|
|
@Resource
|
private UserMoneyMsgNotificationService userMoneyMsgNotificationService;
|
|
@Resource
|
private RedPackForbidService redPackForbidService;
|
|
@Resource(name = "producer")
|
private Producer producer;
|
|
@Override
|
public RedPackGiveRecord selectByPrimaryKey(Long id) {
|
return redPackGiveRecordMapper.selectByPrimaryKey(id);
|
}
|
|
@Override
|
public void updateByPrimaryKeySelective(RedPackGiveRecord record) {
|
redPackGiveRecordMapper.updateByPrimaryKeySelective(record);
|
}
|
|
@Override
|
@RequestSerializableByKeyService(key = "#id")
|
@Transactional(rollbackFor = Exception.class)
|
public void overdueByPrimaryKey(Long id) throws Exception {
|
if (id == null)
|
return;
|
|
RedPackGiveRecord giveRecord = redPackGiveRecordMapper.selectByPrimaryKey(id);
|
if (giveRecord == null)
|
return;
|
|
if (giveRecord.getState() != null && giveRecord.getState() != RedPackGiveRecord.STATE_INIT)
|
return;
|
|
// 赠送记录失效
|
RedPackGiveRecord updateRecord = new RedPackGiveRecord();
|
updateRecord.setId(giveRecord.getId());
|
updateRecord.setState(RedPackGiveRecord.STATE_OVERDUE);
|
redPackGiveRecordMapper.updateByPrimaryKeySelective(updateRecord);
|
|
// 口令失效
|
tokenRecordService.invalidByRedPack(id);
|
|
// 退回红包
|
redPackBalanceService.addRedPack(giveRecord.getGiveUid(), giveRecord.getAmount(),
|
RedPackDetailFactory.createGiveOthersFail(giveRecord));
|
|
// 退回消息
|
SimpleDateFormat sd = new SimpleDateFormat("yyyy.MM.dd HH:mm");
|
MsgRedPackGiveContentDTO givedto = new MsgRedPackGiveContentDTO();
|
givedto.setTitle("你赠送的红包未被成功领取");
|
givedto.setMoney("¥" + giveRecord.getAmount().setScale(2));
|
givedto.setTime(sd.format(new Date()));
|
givedto.setGiveTime(sd.format(giveRecord.getGiveTime()));
|
userMoneyMsgNotificationService.redPackMsg(giveRecord.getGiveUid(), MsgTypeMoneyTypeEnum.redPackGiveBack,
|
new Gson().toJson(givedto), "请到我的-红包查看");
|
|
}
|
|
@Override
|
@Transactional(rollbackFor = Exception.class)
|
public String giving(Long uid, BigDecimal amount) throws RedPackGiveRecordException {
|
if (uid == null || amount == null)
|
throw new RedPackGiveRecordException(1, "参数不正确");
|
|
if(redPackForbidService.verifyForbid(uid))
|
throw new RedPackGiveRecordException(1, "红包功能已被封禁");
|
|
String giveMin = redPackConfigService.getValueByKey("give_money_min");
|
String giveMax = redPackConfigService.getValueByKey("give_money_max");
|
if (amount.compareTo(new BigDecimal(giveMin)) < 0 || amount.compareTo(new BigDecimal(giveMax)) > 0)
|
throw new RedPackGiveRecordException(1, "赠送金额至少" + giveMin + "元至多" + giveMax + "元");
|
|
BigDecimal balance = redPackBalanceService.getBalance(uid);
|
if (balance == null || amount.compareTo(balance) > 0)
|
throw new RedPackGiveRecordException(1, "余额不足");
|
|
Date nowDate = new Date();
|
Date endTime = DateUtil.plusDayDate(Constant.TOKEN_DAYS, new Date());
|
// 赠送记录
|
RedPackGiveRecord giveRecord = new RedPackGiveRecord();
|
giveRecord.setAmount(amount);
|
giveRecord.setGiveUid(uid);
|
giveRecord.setState(RedPackGiveRecord.STATE_INIT);
|
giveRecord.setGiveTime(nowDate);
|
giveRecord.setEndTime(endTime);
|
redPackGiveRecordMapper.insertSelective(giveRecord);
|
|
// 口令记录
|
TokenRecord tokenRecord = new TokenRecord();
|
tokenRecord.setUid(uid);
|
tokenRecord.setIdentify(giveRecord.getId() + "");
|
tokenRecord.setType(TokenTypeEnum.redPack);
|
tokenRecord.setStartTime(nowDate);
|
tokenRecord.setEndTime(endTime);
|
tokenRecord.setState(0);
|
tokenRecordService.insertSelective(tokenRecord);
|
|
// 创建口令
|
String token = TokenUtil.createToken(tokenRecord.getId());
|
tokenRecord.setToken(token);
|
tokenRecordService.updateByPrimaryKeySelective(tokenRecord);
|
|
String tips = redPackConfigService.getValueByKey("give_tips");
|
String projectChineseName = Constant.systemCommonConfig.getProjectChineseName();
|
while (tips.contains("{APP名称}")) {
|
tips = tips.replace("{APP名称}", projectChineseName);
|
}
|
tips = tips.replace("{口令}", token).replace("{下载链接}", redPackConfigService.getValueByKey("app_down_link"))
|
.replace("{面额}", amount.setScale(2).toString());
|
|
// 减少红包
|
try {
|
redPackBalanceService.subRedPack(uid, amount, RedPackDetailFactory.createGiveOthers(giveRecord));
|
} catch (Exception e) {
|
throw new RedPackGiveRecordException(1, "红包创建失败");
|
}
|
|
UserRedPackGiftMQMsg msg = new UserRedPackGiftMQMsg();
|
msg.setId(giveRecord.getId());
|
msg.setUid(uid);
|
Message message = MQMsgBodyFactory.create(MQTopicName.TOPIC_USER, UserTopicTagEnum.redPackGiftDrawback,
|
msg);
|
// 延迟一分钟
|
message.setStartDeliverTime(endTime.getTime() + 1000 * 60);
|
try {
|
producer.send(message);
|
} catch (Exception e) {
|
throw new RedPackGiveRecordException(1, "红包创建失败");
|
}
|
return tips;
|
}
|
|
@Override
|
@Transactional(rollbackFor = Exception.class)
|
public RedPackGiveRecord receiveFriendsGive(Long uid, Long id) throws RedPackGiveRecordException {
|
RedPackGiveRecord giveRecord = redPackGiveRecordMapper.selectByPrimaryKey(id);
|
if (giveRecord == null || giveRecord.getState() != RedPackGiveRecord.STATE_INIT)
|
throw new RedPackGiveRecordException(1, "赠送记录失效或已被领取");
|
|
Date now = new Date();
|
Date endTime = giveRecord.getEndTime();
|
if (endTime != null && endTime.getTime() < now.getTime())
|
throw new RedPackGiveRecordException(1, "红包已失效了");
|
|
giveRecord.setReceiveUid(uid);
|
giveRecord.setReceiveTime(now);
|
giveRecord.setState(RedPackGiveRecord.STATE_RECEIVE);
|
// 领取人增加红包
|
try {
|
redPackBalanceService.addRedPack(uid, giveRecord.getAmount(),
|
RedPackDetailFactory.createGiveOthersReceive(giveRecord));
|
} catch (Exception e) {
|
throw new RedPackGiveRecordException(1, "红包领取失败");
|
}
|
|
// 更新赠送记录
|
redPackGiveRecordMapper.updateByPrimaryKey(giveRecord);
|
|
try {
|
String identifyCode = StringUtil.Md5(RedPackDetailTypeEnum.giveOthers.name() + ":" + giveRecord.getId());
|
RedPackDetail redPackDetail = redPackDetailService.getByIdentifyCode(identifyCode);
|
|
RedPackDetail updateDetail = RedPackDetailFactory.createGiveOthersSucceed(redPackDetail.getId(),
|
giveRecord);
|
redPackDetailService.updateByPrimaryKeySelective(updateDetail);
|
} catch (Exception e) {
|
throw new RedPackGiveRecordException(1, "更新提现明细出错");
|
}
|
return giveRecord;
|
}
|
|
}
|