package com.yeshi.fanli.service.impl.tlj;
|
|
import java.math.BigDecimal;
|
import java.text.ParseException;
|
import java.text.SimpleDateFormat;
|
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.tlj.UserTaoLiJinOriginMapper;
|
import com.yeshi.fanli.dto.msg.MsgOtherTaoLiJinContentDTO;
|
import com.yeshi.fanli.entity.bus.tlj.DeviceTaoLiJinRecord;
|
import com.yeshi.fanli.entity.bus.tlj.UserTaoLiJinDetail;
|
import com.yeshi.fanli.entity.bus.tlj.UserTaoLiJinDetail.TaoLiJinDetailTypeEnum;
|
import com.yeshi.fanli.entity.bus.tlj.UserTaoLiJinOrigin;
|
import com.yeshi.fanli.entity.bus.tlj.UserTaoLiJinOrigin.TaoLiJinOriginEnum;
|
import com.yeshi.fanli.entity.bus.tlj.UserTaoLiJinRecord;
|
import com.yeshi.fanli.entity.bus.tlj.UserTaoLiJinReport;
|
import com.yeshi.fanli.entity.bus.user.UserInfoExtra;
|
import com.yeshi.fanli.entity.bus.user.UserRank;
|
import com.yeshi.fanli.exception.tlj.UserTaoLiJinOriginException;
|
import com.yeshi.fanli.log.LogHelper;
|
import com.yeshi.fanli.service.inter.msg.UserOtherMsgNotificationService;
|
import com.yeshi.fanli.service.inter.tlj.ConfigTaoLiJinService;
|
import com.yeshi.fanli.service.inter.tlj.DeviceTaoLiJinRecordService;
|
import com.yeshi.fanli.service.inter.tlj.UserTaoLiJinDetailService;
|
import com.yeshi.fanli.service.inter.tlj.UserTaoLiJinOriginService;
|
import com.yeshi.fanli.service.inter.tlj.UserTaoLiJinRecordService;
|
import com.yeshi.fanli.service.inter.user.UserInfoExtraService;
|
import com.yeshi.fanli.service.inter.user.UserMoneyExtraService;
|
import com.yeshi.fanli.util.MoneyBigDecimalUtil;
|
import com.yeshi.fanli.util.StringUtil;
|
|
@Service
|
public class UserTaoLiJinOriginServiceImpl implements UserTaoLiJinOriginService{
|
|
@Resource(name = "taskExecutor")
|
private TaskExecutor executor;
|
|
@Resource
|
private UserTaoLiJinOriginMapper userTaoLiJinOriginMapper;
|
|
@Resource
|
private UserMoneyExtraService userMoneyExtraService;
|
|
@Resource
|
private UserInfoExtraService userInfoExtraService;
|
|
@Resource
|
private UserTaoLiJinDetailService userTaoLiJinDetailService;
|
|
@Resource
|
private DeviceTaoLiJinRecordService deviceTaoLiJinRecordService;
|
|
@Resource
|
private UserOtherMsgNotificationService userOtherMsgNotificationService;
|
|
@Resource
|
private ConfigTaoLiJinService configTaoLiJinService;
|
|
@Resource
|
private UserTaoLiJinRecordService userTaoLiJinRecordService;
|
|
|
@Override
|
public void updateByPrimaryKeySelective(UserTaoLiJinOrigin record) {
|
userTaoLiJinOriginMapper.updateByPrimaryKeySelective(record);
|
}
|
|
@Override
|
public BigDecimal countMoneyByDate(long uid, int dateType) {
|
return userTaoLiJinOriginMapper.countMoneyByDate(uid, dateType);
|
}
|
|
@Override
|
public long countByUidAndOrigin(long uid, String origin) {
|
return userTaoLiJinOriginMapper.countByUidAndOrigin(uid, origin);
|
}
|
|
@Override
|
public UserTaoLiJinOrigin getByUidAndOrigin(long uid, String origin) {
|
return userTaoLiJinOriginMapper.getByUidAndOrigin(uid, origin);
|
}
|
|
@Override
|
public UserTaoLiJinOrigin getRankByThisMonth(long uid, String type) {
|
return userTaoLiJinOriginMapper.getRankByThisMonth(uid, type);
|
}
|
|
@Override
|
public boolean hasRankHongBao(long uid) {
|
UserInfoExtra userInfoExtra = userInfoExtraService.getUserInfoExtra(uid);
|
if (userInfoExtra == null) {
|
return false;
|
}
|
|
// 等级验证
|
UserRank userRank = userInfoExtra.getUserRank();
|
if (userRank == null || userRank.getId() <= 1) {
|
return false;
|
}
|
|
// 是否已领取
|
long countRan = userTaoLiJinOriginMapper.countRankByThisMonth(uid);
|
if (countRan > 0) {
|
return false;
|
}
|
return true;
|
}
|
|
|
@Override
|
public void synchDeviceHongbao(long uid, String device) {
|
// 是否已领取
|
long count = userTaoLiJinOriginMapper.countByUidAndType(uid, TaoLiJinOriginEnum.newbiesWin.name());
|
if (count > 0) {
|
return;
|
}
|
|
// 设备是否已领取
|
DeviceTaoLiJinRecord record = deviceTaoLiJinRecordService.getByDevice(device);
|
if (record == null) {
|
return;
|
}
|
|
try {
|
addNewbiesWinMoney(uid);
|
} catch (UserTaoLiJinOriginException e) {
|
LogHelper.errorDetailInfo(e);
|
}
|
}
|
|
|
@Override
|
@Transactional
|
public UserTaoLiJinOrigin addNewbiesWinMoney(Long uid) throws UserTaoLiJinOriginException{
|
if (uid == null) {
|
throw new UserTaoLiJinOriginException(1, "参数不能为空");
|
}
|
String value = configTaoLiJinService.getValueByKey("hongbao_newbies");
|
if (StringUtil.isNullOrEmpty(value)) {
|
throw new UserTaoLiJinOriginException(1, "系统红包不存在");
|
}
|
BigDecimal money = new BigDecimal(value);
|
|
// 是否可以自购
|
boolean canSelfBuy = userInfoExtraService.isNewUser(uid);
|
// 添加用户红包
|
userMoneyExtraService.addTaoLiJin(uid, money, canSelfBuy);
|
// 添加新增记录
|
UserTaoLiJinOrigin origin = saveOrigin(uid, canSelfBuy?2:1, money, TaoLiJinOriginEnum.newbiesWin);
|
// 红包明细
|
userTaoLiJinDetailService.createAddDetail(origin);
|
// 消息
|
executor.execute(new Runnable() {
|
@Override
|
public void run() {
|
try {
|
String source = "";
|
if(canSelfBuy) {
|
source = "新人红包";
|
} else {
|
source = "分享红包";
|
}
|
|
MsgOtherTaoLiJinContentDTO content = new MsgOtherTaoLiJinContentDTO();
|
content.setState("红包增加");
|
content.setSource(source);
|
content.setMoney(money);
|
userOtherMsgNotificationService.taoLiJinMsg(uid, "", content);
|
} catch (Exception e) {
|
LogHelper.errorDetailInfo(e);
|
}
|
}
|
});
|
|
return origin;
|
}
|
|
|
@Override
|
@Transactional
|
public UserTaoLiJinOrigin addRankWinMoney(Long uid, UserRank userRank) throws UserTaoLiJinOriginException{
|
if (uid == null || userRank == null) {
|
throw new UserTaoLiJinOriginException(1, "参数不能为空");
|
}
|
|
String key = "";
|
if (userRank.getId() == 2) {
|
key = "hongbao_rank_silver";
|
} else if (userRank.getId() == 3) {
|
key = "hongbao_rank_gold";
|
} else if (userRank.getId() == 4) {
|
key = "hongbao_rank_platinum";
|
} else {
|
throw new UserTaoLiJinOriginException(2, "用户等级不足");
|
}
|
|
String value = configTaoLiJinService.getValueByKey(key);
|
if (StringUtil.isNullOrEmpty(value)) {
|
throw new UserTaoLiJinOriginException(1, "系统红包不存在");
|
}
|
BigDecimal money = new BigDecimal(value);
|
|
// 添加红包余额
|
userMoneyExtraService.addTaoLiJin(uid, money, false);
|
// 添加新增记录
|
UserTaoLiJinOrigin origin = saveOrigin(uid, 1, money, TaoLiJinOriginEnum.rankWin);
|
// 红包明细
|
userTaoLiJinDetailService.createAddDetail(origin);
|
// 消息
|
executor.execute(new Runnable() {
|
@Override
|
public void run() {
|
try {
|
String beizhu = "上月账户等级" + userRank.getName();
|
MsgOtherTaoLiJinContentDTO content = new MsgOtherTaoLiJinContentDTO();
|
content.setState("红包增加");
|
content.setSource("账户等级福利");
|
content.setMoney(money);
|
userOtherMsgNotificationService.taoLiJinMsg(uid, beizhu, content);
|
} catch (Exception e) {
|
LogHelper.errorDetailInfo(e);
|
}
|
}
|
});
|
return origin;
|
}
|
|
|
@Override
|
@Transactional
|
public UserTaoLiJinOrigin addInviteWinMoney(Long uid, String inviteName) throws UserTaoLiJinOriginException{
|
if (uid == null || StringUtil.isNullOrEmpty(inviteName)) {
|
throw new UserTaoLiJinOriginException(1, "参数不能为空");
|
}
|
|
String value = configTaoLiJinService.getValueByKey("hongbao_invite");
|
if (StringUtil.isNullOrEmpty(value)) {
|
throw new UserTaoLiJinOriginException(1, "系统红包不存在");
|
}
|
BigDecimal money = new BigDecimal(value);
|
|
// 添加用户红包
|
userMoneyExtraService.addTaoLiJin(uid, money, false);
|
// 添加新增记录
|
UserTaoLiJinOrigin origin = saveOrigin(uid, 1, money, TaoLiJinOriginEnum.inviteWin);
|
// 红包明细
|
userTaoLiJinDetailService.createAddDetail(origin);
|
// 消息
|
executor.execute(new Runnable() {
|
@Override
|
public void run() {
|
try {
|
String beizhu = "成功邀请队员" + inviteName;
|
MsgOtherTaoLiJinContentDTO content = new MsgOtherTaoLiJinContentDTO();
|
content.setState("红包增加");
|
content.setSource("邀请队员奖励");
|
content.setMoney(money);
|
userOtherMsgNotificationService.taoLiJinMsg(uid, beizhu, content);
|
} catch (Exception e) {
|
LogHelper.errorDetailInfo(e);
|
}
|
}
|
});
|
return origin;
|
}
|
|
|
@Override
|
@Transactional
|
public UserTaoLiJinOrigin addShareWinMoney(Long uid) throws UserTaoLiJinOriginException{
|
if (uid == null) {
|
throw new UserTaoLiJinOriginException(1, "用户未登录");
|
}
|
|
String value = configTaoLiJinService.getValueByKey("hongbao_share");
|
if (StringUtil.isNullOrEmpty(value)) {
|
throw new UserTaoLiJinOriginException(1, "系统红包不存在");
|
}
|
BigDecimal money = new BigDecimal(value);
|
|
// 添加用户红包
|
userMoneyExtraService.addTaoLiJin(uid, money, false);
|
// 添加新增记录
|
UserTaoLiJinOrigin origin = saveOrigin(uid, 1, money, TaoLiJinOriginEnum.shareWin);
|
// 红包明细
|
userTaoLiJinDetailService.createAddDetail(origin);
|
// // 消息
|
// executor.execute(new Runnable() {
|
// @Override
|
// public void run() {
|
// try {
|
// String beizhu = "近30天产生过分享(仅一次奖励)";
|
// MsgOtherTaoLiJinContentDTO content = new MsgOtherTaoLiJinContentDTO();
|
// content.setState("红包增加");
|
// content.setSource("分享订单奖励");
|
// content.setMoney(money);
|
// userOtherMsgNotificationService.taoLiJinMsg(uid, beizhu, content);
|
// } catch (Exception e) {
|
// LogHelper.errorDetailInfo(e);
|
// }
|
// }
|
// });
|
return origin;
|
}
|
|
|
// 添加新增记录
|
public UserTaoLiJinOrigin saveOrigin(Long uid, int type, BigDecimal money, TaoLiJinOriginEnum originEnum) {
|
UserTaoLiJinOrigin taoLiJinOrigin = new UserTaoLiJinOrigin();
|
taoLiJinOrigin.setUid(uid);
|
taoLiJinOrigin.setType(type);
|
taoLiJinOrigin.setOrigin(originEnum);
|
taoLiJinOrigin.setMoney(money);
|
taoLiJinOrigin.setMoneySurplus(money);
|
taoLiJinOrigin.setCreateTime(new Date());
|
taoLiJinOrigin.setUpdateTime(new Date());
|
taoLiJinOrigin.setRemark(originEnum.getDesc());
|
userTaoLiJinOriginMapper.insertSelective(taoLiJinOrigin);
|
return taoLiJinOrigin;
|
}
|
|
|
|
@Override
|
@Transactional
|
public void refundMoney(UserTaoLiJinReport report) throws UserTaoLiJinOriginException{
|
if (report == null) {
|
throw new UserTaoLiJinOriginException(1, "参数不能为空");
|
}
|
String rightsId = report.getId();
|
BigDecimal refundAmount = report.getRefundAmount();
|
|
// 已退回的金额
|
BigDecimal moneyOrigin = userTaoLiJinOriginMapper.countMoneyByOrigin(rightsId, TaoLiJinOriginEnum.refund.name());
|
if (refundAmount.compareTo(moneyOrigin) < 1) {
|
return;
|
}
|
|
// 查询用户信息
|
UserTaoLiJinRecord record = userTaoLiJinRecordService.getByRightsId(rightsId);
|
if (record == null) {
|
return;
|
}
|
Long uid = record.getUid();
|
|
// 计算本次退回的金额
|
BigDecimal money = MoneyBigDecimalUtil.sub(refundAmount, moneyOrigin);
|
|
// 添加用户红包
|
userMoneyExtraService.addTaoLiJin(uid, money, false);
|
|
// 添加新增记录
|
UserTaoLiJinOrigin taoLiJinOrigin = new UserTaoLiJinOrigin();
|
taoLiJinOrigin.setUid(uid);
|
taoLiJinOrigin.setType(1);
|
taoLiJinOrigin.setRightsId(rightsId);
|
taoLiJinOrigin.setMoney(money);
|
taoLiJinOrigin.setMoneySurplus(money);
|
taoLiJinOrigin.setOrigin(TaoLiJinOriginEnum.refund);
|
taoLiJinOrigin.setRemark(TaoLiJinOriginEnum.refund.getDesc());
|
taoLiJinOrigin.setCreateTime(new Date());
|
taoLiJinOrigin.setUpdateTime(new Date());
|
userTaoLiJinOriginMapper.insertSelective(taoLiJinOrigin);
|
|
// 红包明细
|
userTaoLiJinDetailService.createAddDetail(taoLiJinOrigin);
|
|
// 消息
|
executor.execute(new Runnable() {
|
@Override
|
public void run() {
|
try {
|
String beizhu = "共创建:" + record.getTotalNum() + "个,已领取"+report.getWinNum()+"个,剩余"+report.getRefundNum()+ "个退回";
|
SimpleDateFormat sd = new SimpleDateFormat("yyyy.MM.dd hh.mm");
|
String time = sd.format(record.getCreateTime());
|
MsgOtherTaoLiJinContentDTO content = new MsgOtherTaoLiJinContentDTO();
|
content.setState("红包退回");
|
content.setSource(time + " 创建的分享记录");
|
content.setMoney(money);
|
|
userOtherMsgNotificationService.taoLiJinMsg(uid, beizhu, content);
|
} catch (Exception e) {
|
LogHelper.errorDetailInfo(e);
|
}
|
}
|
});
|
}
|
|
|
|
|
@Override
|
public void overdueHongBao(Long uid) {
|
// 15天前过期
|
Date date = null;
|
try {
|
date = DateUtil.reduceDay(15, new Date());
|
} catch (ParseException e) {
|
e.printStackTrace();
|
}
|
|
if (date == null) {
|
return;
|
}
|
|
List<UserTaoLiJinOrigin> list = userTaoLiJinOriginMapper.getOverdueTaoLiJin(uid, date);
|
if (list == null || list.size() == 0) {
|
return;
|
}
|
|
BigDecimal total = new BigDecimal(0);
|
for (UserTaoLiJinOrigin userTaoLiJinOrigin: list) {
|
|
UserTaoLiJinOrigin origin = new UserTaoLiJinOrigin();
|
origin.setId(userTaoLiJinOrigin.getId());
|
origin.setMoneySurplus(new BigDecimal(0));
|
origin.setUpdateTime(new Date());
|
userTaoLiJinOriginMapper.updateByPrimaryKeySelective(origin);
|
|
total = MoneyBigDecimalUtil.add(total, userTaoLiJinOrigin.getMoneySurplus());
|
}
|
|
// 插入明细
|
UserTaoLiJinDetail detail = new UserTaoLiJinDetail();
|
detail.setUid(uid);
|
detail.setMoney(new BigDecimal("-" + total.toString()));
|
detail.setTitle(TaoLiJinDetailTypeEnum.sendBack.getDesc());
|
detail.setType(TaoLiJinDetailTypeEnum.sendBack);
|
detail.setCreateTime(date);
|
userTaoLiJinDetailService.insertSelective(detail);
|
|
// 消息
|
final BigDecimal totalMoney = total;
|
executor.execute(new Runnable() {
|
@Override
|
public void run() {
|
try {
|
MsgOtherTaoLiJinContentDTO content = new MsgOtherTaoLiJinContentDTO();
|
content.setState("红包扣除");
|
content.setSource("15天内未产生过推广红包分享记录");
|
content.setMoney(totalMoney);
|
userOtherMsgNotificationService.taoLiJinMsg(uid, "清除后无法恢复", content);
|
} catch (Exception e) {
|
LogHelper.errorDetailInfo(e);
|
}
|
}
|
});
|
}
|
|
@Override
|
public List<UserTaoLiJinOrigin> getSurplusLiJin(long uid) {
|
return userTaoLiJinOriginMapper.getSurplusLiJin(uid);
|
}
|
|
}
|