package com.yeshi.fanli.service.impl.tlj;
|
|
import java.math.BigDecimal;
|
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.BigDecimalUtil;
|
|
import com.yeshi.fanli.dao.mybatis.tlj.UserTaoLiJinRecordMapper;
|
import com.yeshi.fanli.dto.msg.MsgOtherTaoLiJinContentDTO;
|
import com.yeshi.fanli.dto.taobao.TaoLiJinDTO;
|
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.UserTaoLiJinRecord;
|
import com.yeshi.fanli.entity.bus.user.UserMoneyExtra;
|
import com.yeshi.fanli.entity.goods.CommonGoods;
|
import com.yeshi.fanli.entity.taobao.TaoBaoGoodsBrief;
|
import com.yeshi.fanli.exception.tlj.UserTaoLiJinRecordException;
|
import com.yeshi.fanli.log.LogHelper;
|
import com.yeshi.fanli.service.inter.goods.CommonGoodsService;
|
import com.yeshi.fanli.service.inter.hongbao.HongBaoManageService;
|
import com.yeshi.fanli.service.inter.msg.UserOtherMsgNotificationService;
|
import com.yeshi.fanli.service.inter.tlj.GoodsTaoLiJinRateService;
|
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.tlj.UserTaoLiJinReportService;
|
import com.yeshi.fanli.service.inter.user.UserMoneyExtraService;
|
import com.yeshi.fanli.util.MoneyBigDecimalUtil;
|
import com.yeshi.fanli.util.RedisManager;
|
import com.yeshi.fanli.util.factory.CommonGoodsFactory;
|
import com.yeshi.fanli.util.taobao.TaoKeApiUtil;
|
import com.yeshi.fanli.vo.msg.ClientTextStyleVO;
|
import com.yeshi.fanli.vo.user.UserTaoLiJinRecordVO;
|
|
@Service
|
public class UserTaoLiJinRecordServiceImpl implements UserTaoLiJinRecordService {
|
|
@Resource(name = "taskExecutor")
|
private TaskExecutor executor;
|
|
@Resource
|
private RedisManager redisManager;
|
|
@Resource
|
private UserTaoLiJinRecordMapper userTaoLiJinRecordMapper;
|
|
@Resource
|
private CommonGoodsService commonGoodsService;
|
|
@Resource
|
private HongBaoManageService hongBaoManageService;
|
|
@Resource
|
private UserMoneyExtraService userMoneyExtraService;
|
|
@Resource
|
private UserTaoLiJinReportService userTaoLiJinReportService;
|
|
@Resource
|
private UserTaoLiJinDetailService userTaoLiJinDetailService;
|
|
@Resource
|
private UserTaoLiJinOriginService userTaoLiJinOriginService;
|
|
@Resource
|
private GoodsTaoLiJinRateService goodsTaoLiJinRateService;
|
|
@Resource
|
private UserOtherMsgNotificationService userOtherMsgNotificationService;
|
|
|
|
@Override
|
public UserTaoLiJinRecord selectByPrimaryKey(Long id){
|
return userTaoLiJinRecordMapper.selectByPrimaryKey(id);
|
}
|
|
|
@Override
|
public UserTaoLiJinRecord createSelfBuyTaoLiJin(Long uid, int totalNum, TaoBaoGoodsBrief goods) throws UserTaoLiJinRecordException{
|
Date date = new Date();
|
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
|
SimpleDateFormat formatStr = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
String date_str = format.format(date);
|
String sendEndTime_str = date_str + " 22:00:00";
|
String useEndTime_str = date_str + " 23:59:59";
|
/* 创建淘礼金 */
|
String name = "自购淘礼金红包";
|
// 发放开始时间
|
Date sendStartTime = date;
|
// 发放截止时间 - 分享当日22:00
|
Date sendEndTime = null;
|
// 使用结束日期 - 分享当日 23:59
|
Date useEndTime = null;
|
try {
|
sendEndTime = formatStr.parse(sendEndTime_str);
|
useEndTime = formatStr.parse(useEndTime_str);
|
} catch (ParseException e2) {
|
e2.printStackTrace();
|
}
|
BigDecimal perface = goodsTaoLiJinRateService.getGoodsSpreadMoney(goods);
|
|
return createUserTaoLiJin(1, uid, goods.getAuctionId(), perface, 1, name, sendStartTime,
|
sendEndTime, null, useEndTime);
|
}
|
|
|
@Override
|
public UserTaoLiJinRecord createShareTaoLiJin(Long uid, int totalNum, TaoBaoGoodsBrief goods) throws UserTaoLiJinRecordException{
|
Date date = new Date();
|
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
|
SimpleDateFormat formatStr = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
String date_str = format.format(date);
|
String sendEndTime_str = date_str + " 22:00:00";
|
String useEndTime_str = date_str + " 23:59:59";
|
/* 创建淘礼金 */
|
String name = "分享淘礼金红包";
|
// 发放开始时间
|
Date sendStartTime = date;
|
// 发放截止时间 - 分享当日22:00
|
Date sendEndTime = null;
|
// 使用结束日期 - 分享当日 23:59
|
Date useEndTime = null;
|
try {
|
sendEndTime = formatStr.parse(sendEndTime_str);
|
useEndTime = formatStr.parse(useEndTime_str);
|
} catch (ParseException e2) {
|
e2.printStackTrace();
|
}
|
|
BigDecimal perface = goodsTaoLiJinRateService.getGoodsSpreadMoney(goods);
|
|
return createUserTaoLiJin(2, uid, goods.getAuctionId(), perface, totalNum, name, sendStartTime,
|
sendEndTime, null, useEndTime);
|
}
|
|
|
@Override
|
@Transactional
|
public UserTaoLiJinRecord createUserTaoLiJin(int origin, Long uid, Long auctionId, BigDecimal perface, int totalNum, String name,
|
Date sendStartTime, Date sendEndTime, Date useStartTime, Date useEndTime) throws UserTaoLiJinRecordException{
|
|
// 用户剩余可以淘礼金验证
|
UserMoneyExtra userMoneyExtra = userMoneyExtraService.selectByPrimaryKey(uid);
|
if (userMoneyExtra == null || userMoneyExtra.getTlj() == null) {
|
throw new UserTaoLiJinRecordException(101, "红包余额不足");
|
}
|
|
// 过期
|
userTaoLiJinOriginService.overdueHongBao(uid);
|
|
BigDecimal tlj = userMoneyExtra.getTlj();
|
BigDecimal totalMoney = MoneyBigDecimalUtil.mul(perface, new BigDecimal(totalNum));
|
if (totalMoney.compareTo(tlj) > 0) {
|
throw new UserTaoLiJinRecordException(101, "红包余额不足");
|
}
|
|
// 创建淘礼金红包
|
TaoLiJinDTO taoLiJinDTO = TaoKeApiUtil.createTaoLiJin(auctionId, name, perface, totalNum, sendStartTime, sendEndTime, useStartTime, useEndTime);
|
if (taoLiJinDTO == null) {
|
throw new UserTaoLiJinRecordException(101, "红包创建失败");
|
}
|
|
// 保存记录
|
UserTaoLiJinRecord record = new UserTaoLiJinRecord();
|
record.setUid(uid);
|
record.setGoodsId(auctionId);
|
record.setName(name);
|
record.setPerFace(perface);
|
record.setTotalNum(totalNum);
|
record.setSendStartTime(sendStartTime);
|
record.setSendEndTime(sendEndTime);
|
record.setUseStartTime(useStartTime);
|
record.setUseEndTime(useEndTime);
|
record.setRightsId(taoLiJinDTO.getRightsId());
|
record.setSendUrl(taoLiJinDTO.getSendUrl());
|
record.setCreateTime(new Date());
|
userTaoLiJinRecordMapper.insertSelective(record);
|
|
// 剩余淘礼金
|
BigDecimal surplusTlj = MoneyBigDecimalUtil.sub(tlj, totalMoney);
|
UserMoneyExtra updateExtra = new UserMoneyExtra();
|
updateExtra.setUid(uid);
|
updateExtra.setTlj(surplusTlj);
|
updateExtra.setUpdateTime(new Date());
|
userMoneyExtraService.updateByPrimaryKeySelective(updateExtra);
|
|
record.setSurplusMoney(surplusTlj);
|
|
// 异步
|
String rightsId = taoLiJinDTO.getRightsId();
|
executor.execute(new Runnable() {
|
@Override
|
public void run() {
|
try {
|
// 插入明细
|
UserTaoLiJinDetail detail = new UserTaoLiJinDetail();
|
detail.setUid(uid);
|
detail.setMoney(new BigDecimal("-" + totalMoney));
|
detail.setTitle(TaoLiJinDetailTypeEnum.reduce.getDesc());
|
detail.setType(TaoLiJinDetailTypeEnum.reduce);
|
detail.setCreateTime(new Date());
|
userTaoLiJinDetailService.insertSelective(detail);
|
} catch (Exception e) {
|
LogHelper.errorDetailInfo(e);
|
}
|
|
|
// 成功使用红包
|
try {
|
BigDecimal total = totalMoney;
|
BigDecimal lastMoney = null;
|
BigDecimal zero = new BigDecimal(0);
|
|
// 修改余额
|
List<UserTaoLiJinOrigin> list = userTaoLiJinOriginService.getSurplusLiJin(uid);
|
if (list != null && list.size() > 0) {
|
for (UserTaoLiJinOrigin taoLiJinOrigin: list) {
|
if (total.compareTo(zero) < 1 ) {
|
break;
|
}
|
BigDecimal moneySurplus = taoLiJinOrigin.getMoneySurplus();
|
lastMoney = total;
|
total = MoneyBigDecimalUtil.sub(total, moneySurplus);
|
if (total.compareTo(zero) >= 0 ) {
|
moneySurplus = zero;
|
} else {
|
moneySurplus = MoneyBigDecimalUtil.sub(moneySurplus, lastMoney);
|
}
|
|
UserTaoLiJinOrigin usertlj = new UserTaoLiJinOrigin();
|
usertlj.setId(taoLiJinOrigin.getId());
|
usertlj.setMoneySurplus(moneySurplus);
|
usertlj.setUpdateTime(new Date());
|
userTaoLiJinOriginService.updateByPrimaryKeySelective(usertlj);
|
}
|
}
|
} catch (Exception e) {
|
LogHelper.errorDetailInfo(e);
|
}
|
|
|
|
// 使用成功消息
|
try {
|
String beizhu = "未被领取/使用的部分将会退回";
|
|
SimpleDateFormat sd = new SimpleDateFormat("yyyy.MM.dd hh.mm");
|
String time = sd.format(new Date());
|
MsgOtherTaoLiJinContentDTO content = new MsgOtherTaoLiJinContentDTO();
|
content.setState("红包扣除");
|
content.setSource(time + " 创建的分享记录");
|
content.setMoney(totalMoney);
|
|
userOtherMsgNotificationService.taoLiJinMsg(uid, beizhu, content);
|
} catch (Exception e) {
|
LogHelper.errorDetailInfo(e);
|
}
|
|
// 创建报告
|
try {
|
userTaoLiJinReportService.insertDefault(rightsId);
|
} catch (Exception e) {
|
LogHelper.errorDetailInfo(e);
|
}
|
|
// 检测商品是否存在
|
try {
|
CommonGoods commonGoods = commonGoodsService.getCommonGoodsByGoodsIdAndGoodsType(auctionId, CommonGoods.GOODS_TYPE_TB);
|
if (commonGoods == null) {
|
TaoBaoGoodsBrief taoBaoGoodsBrief = redisManager.getTaoBaoGoodsBrief(auctionId);
|
if (taoBaoGoodsBrief != null) {
|
commonGoodsService.addCommonGoods(CommonGoodsFactory.create(taoBaoGoodsBrief));
|
}
|
}
|
} catch (Exception e) {
|
LogHelper.errorDetailInfo(e);
|
}
|
}
|
});
|
|
return record;
|
}
|
|
|
@Override
|
public List<UserTaoLiJinRecordVO> getRecordByUid(long start, int count, Long uid){
|
List<UserTaoLiJinRecordVO> list = userTaoLiJinRecordMapper.getRecordByUid(start, count, uid);
|
if (list == null || list.size() == 0) {
|
return list;
|
}
|
|
|
List<Long> listGoodsId = new ArrayList<Long>();
|
for (UserTaoLiJinRecordVO userTaoLiJinRecordVO: list) {
|
listGoodsId.add(userTaoLiJinRecordVO.getAuctionId());
|
}
|
|
if (listGoodsId.size() == 0) {
|
return null;
|
}
|
|
List<CommonGoods> listGoods = commonGoodsService.getByListGoodsId(listGoodsId);
|
if (listGoods == null || listGoods.size() == 0) {
|
return null;
|
}
|
|
|
// 组织相关数据
|
for (UserTaoLiJinRecordVO userTaoLiJinRecordVO: list) {
|
long auctionId = userTaoLiJinRecordVO.getAuctionId().longValue();
|
|
// 商品信息
|
for (int i = 0; i< listGoods.size(); i++) {
|
CommonGoods commonGoods = listGoods.get(i);
|
long goodsId = commonGoods.getGoodsId().longValue();
|
if (auctionId == goodsId) {
|
userTaoLiJinRecordVO.setTitle(commonGoods.getTitle());
|
userTaoLiJinRecordVO.setPictUrl(commonGoods.getPicture());
|
if(CommonGoods.SHOP_TYPE_TB == commonGoods.getShopType()) {
|
userTaoLiJinRecordVO.setUserType(0);
|
} else {
|
userTaoLiJinRecordVO.setUserType(1);
|
}
|
|
listGoods.remove(i);
|
break;
|
}
|
}
|
|
// 计算剩余未领取数量
|
int winNum = userTaoLiJinRecordVO.getWinNum();
|
int totalNum = userTaoLiJinRecordVO.getTotalNum();
|
userTaoLiJinRecordVO.setSurplusNum(totalNum - winNum);
|
|
|
// 计算分享奖金
|
BigDecimal shareMoney = new BigDecimal(0);
|
BigDecimal commission = userTaoLiJinRecordVO.getCommission();
|
if (commission != null && commission.compareTo(shareMoney) > 1) {
|
BigDecimal shareRate = hongBaoManageService.getShareRate();
|
shareMoney = MoneyBigDecimalUtil.mul(MoneyBigDecimalUtil.mul(commission, new BigDecimal("0.01")), MoneyBigDecimalUtil.div(shareRate, new BigDecimal(100)));
|
shareMoney = BigDecimalUtil.getWithNoZera(shareMoney);
|
}
|
|
ClientTextStyleVO desc = new ClientTextStyleVO();
|
desc.setColor("#FFFFFF");
|
desc.setContent("预估分享奖金:¥" + shareMoney);
|
desc.setBottomColor("#E8AE48");
|
userTaoLiJinRecordVO.setDesc(desc);
|
}
|
return list;
|
}
|
|
@Override
|
public long countRecordByUid(Long uid) {
|
return userTaoLiJinRecordMapper.countRecordByUid(uid);
|
}
|
|
@Override
|
public long countTodayNum(Long uid) {
|
return userTaoLiJinRecordMapper.countTodayNum(uid);
|
}
|
|
|
@Override
|
public BigDecimal getShareHongBaoByUidAndGoodsId(Long uid, Long goodsId) {
|
return userTaoLiJinRecordMapper.getShareHongBaoByUidAndGoodsId(uid, goodsId);
|
}
|
|
@Override
|
public UserTaoLiJinRecord getByRightsId(String rightsId) {
|
return userTaoLiJinRecordMapper.getByRightsId(rightsId);
|
}
|
|
}
|