| | |
| | | package com.yeshi.makemoney.app.service.impl.goldcorn; |
| | | |
| | | import com.google.gson.Gson; |
| | | import com.ks.lib.common.exception.ParamsException; |
| | | import com.ks.push.exception.BPushTaskException; |
| | | import com.yeshi.makemoney.app.dto.mq.GoldCornSettleMQMsg; |
| | | import com.yeshi.makemoney.app.entity.SystemEnum; |
| | | import com.yeshi.makemoney.app.entity.goldcorn.GoldCornConsumeRecord; |
| | | import com.yeshi.makemoney.app.entity.goldcorn.GoldCornConsumeType; |
| | | import com.yeshi.makemoney.app.entity.goldcorn.GoldCornSettleRecord; |
| | | import com.yeshi.makemoney.app.entity.money.UserMoneyRecord; |
| | | import com.yeshi.makemoney.app.entity.user.UserInfo; |
| | | import com.yeshi.makemoney.app.exception.goldcorn.GoldCornConsumeRecordException; |
| | | import com.yeshi.makemoney.app.exception.goldcorn.GoldCornMoneyExchangeRateRecordException; |
| | | import com.yeshi.makemoney.app.exception.goldcorn.GoldCornSettleRecordException; |
| | | import com.yeshi.makemoney.app.exception.money.UserMoneyRecordException; |
| | | import com.yeshi.makemoney.app.exception.user.UserInfoException; |
| | | import com.yeshi.makemoney.app.service.inter.goldcorn.GoldCornConsumeRecordService; |
| | | import com.yeshi.makemoney.app.service.inter.goldcorn.GoldCornGetRecordService; |
| | | import com.yeshi.makemoney.app.service.inter.goldcorn.GoldCornMoneyExchangeRateRecordService; |
| | | import com.yeshi.makemoney.app.service.inter.goldcorn.GoldCornSettleService; |
| | | import com.yeshi.makemoney.app.service.inter.goldcorn.*; |
| | | import com.yeshi.makemoney.app.service.inter.money.UserMoneyService; |
| | | import com.yeshi.makemoney.app.service.inter.msg.UserMsgNotifyService; |
| | | import com.yeshi.makemoney.app.service.inter.user.UserInfoService; |
| | | import com.yeshi.makemoney.app.service.manager.PushManager; |
| | | import com.yeshi.makemoney.app.service.query.goldcorn.GoldCornGetRecordQuery; |
| | | import com.yeshi.makemoney.app.utils.factory.UserMoneyRecordFactory; |
| | | import com.yeshi.makemoney.app.utils.factory.goldcorn.GoldCornConsumeRecordFactory; |
| | | import com.yeshi.makemoney.app.utils.factory.msg.UserMsgFactory; |
| | | import com.yeshi.makemoney.app.utils.goldcorn.GoldCornUtil; |
| | | import com.yeshi.makemoney.app.utils.mq.CMQManager; |
| | | import org.slf4j.Logger; |
| | | import org.slf4j.LoggerFactory; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | import org.yeshi.utils.JsonUtil; |
| | | import org.yeshi.utils.ThreadUtil; |
| | | |
| | | import javax.annotation.Resource; |
| | | import java.math.BigDecimal; |
| | | import java.math.RoundingMode; |
| | | import java.util.ArrayList; |
| | | import java.util.Date; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | |
| | | /** |
| | | * @author hxh |
| | |
| | | */ |
| | | @Service |
| | | public class GoldCornSettleServiceImpl implements GoldCornSettleService { |
| | | Logger settleLogger = LoggerFactory.getLogger("settleLog"); |
| | | |
| | | @Resource |
| | | private GoldCornGetRecordService goldCornGetRecordService; |
| | |
| | | @Resource |
| | | private UserMoneyService userMoneyService; |
| | | |
| | | @Resource |
| | | private UserMsgNotifyService userMsgNotifyService; |
| | | |
| | | @Resource |
| | | private PushManager pushManager; |
| | | |
| | | @Resource |
| | | private GoldCornSettleRecordService goldCornSettleRecordService; |
| | | |
| | | @Override |
| | | public void startSettle(Date date) { |
| | | String day= GoldCornUtil.getFormatDay(date); |
| | | public void startSettle(Date date, String remarks, SystemEnum system) throws Exception { |
| | | String day = GoldCornUtil.getFormatDay(date); |
| | | |
| | | if (GoldCornUtil.convertFormatDay(day).getTime() >= GoldCornUtil.convertFormatDay(GoldCornUtil.getFormatDay(new Date())).getTime()) { |
| | | throw new ParamsException(ParamsException.CODE_PARAMS_NOT_ENOUGH, "只能结算今天以前的日期"); |
| | | } |
| | | |
| | | BigDecimal rate = goldCornMoneyExchangeRateRecordService.getRate(day, system, new Date()); |
| | | if (rate == null) { |
| | | throw new ParamsException(ParamsException.CODE_PARAMS_NOT_ENOUGH, "汇率为空"); |
| | | } |
| | | |
| | | //统计金币数量 |
| | | GoldCornGetRecordQuery query = new GoldCornGetRecordQuery(); |
| | | query.setDay(day); |
| | | Map<String, Long> numMap = goldCornGetRecordService.sumGoldCornNum(query); |
| | | if (numMap.get(day) == null) { |
| | | throw new ParamsException(ParamsException.CODE_PARAMS_NOT_ENOUGH, "金币数量统计出错"); |
| | | } |
| | | |
| | | |
| | | GoldCornSettleRecord record = new GoldCornSettleRecord(); |
| | | record.setSystem(system); |
| | | record.setDay(day); |
| | | record.setRate(rate); |
| | | record.setCornNum(numMap.get(day)); |
| | | record.setTotalMoney(new BigDecimal(0)); |
| | | |
| | | |
| | | long count = goldCornGetRecordService.countUidsByDay(day); |
| | | int pageSize = 1000; |
| | | record.setUserCount(count); |
| | | record.setSettledUserCount(0L); |
| | | goldCornSettleRecordService.add(record); |
| | | |
| | | int pageSize = 16; |
| | | int page = (int) (count % pageSize == 0 ? count / pageSize : count / pageSize + 1); |
| | | for (int i = 0; i < page; i++) { |
| | | List<Long> list = goldCornGetRecordService.getUidsByDay(day, i + 1, pageSize); |
| | | List<Long> list = goldCornGetRecordService.getUidsByDay(record.getDay(), i + 1, pageSize); |
| | | List<GoldCornSettleMQMsg> msgList = new ArrayList<>(); |
| | | for (Long uid : list) { |
| | | //加入到CMQ |
| | | CMQManager.getInstance().addGoldCornSettleMsg(new GoldCornSettleMQMsg(uid, day, System.currentTimeMillis())); |
| | | GoldCornSettleMQMsg msg = new GoldCornSettleMQMsg(record.getId(), uid, day, System.currentTimeMillis()); |
| | | msgList.add(msg); |
| | | settleLogger.info("加入结算队列:{}", new Gson().toJson(msg)); |
| | | } |
| | | //加入到CMQ |
| | | CMQManager.getInstance().addGoldCornSettleMsg(msgList); |
| | | } |
| | | |
| | | } |
| | | |
| | | @Transactional(rollbackFor = Exception.class) |
| | | @Override |
| | | public void settle(Long uid, Date day, BigDecimal rate) throws GoldCornConsumeRecordException, UserMoneyRecordException { |
| | | long cornNum = goldCornGetRecordService.getGoldCornByDay(uid, day); |
| | | public void settle(Long uid, String day, BigDecimal rate, String settleId) throws GoldCornConsumeRecordException, UserMoneyRecordException { |
| | | long cornNum = goldCornGetRecordService.getGoldCornByDay(uid, GoldCornUtil.convertFormatDay(day)); |
| | | //金币数量 |
| | | GoldCornConsumeRecord record = GoldCornConsumeRecordFactory.createExchange(uid,GoldCornUtil.getFormatDay(day),(int) cornNum,rate); |
| | | GoldCornConsumeRecord record = GoldCornConsumeRecordFactory.createExchange(uid, day, (int) cornNum, rate, settleId); |
| | | if (goldCornConsumeRecordService.get(record.getId()) != null) { |
| | | //已经结算过了 |
| | | return; |
| | | } |
| | | |
| | | try { |
| | | UserMoneyRecord moneyRecord = UserMoneyRecordFactory.createGoldCornExchange(record); |
| | | userMoneyService.addUserMoney(moneyRecord); |
| | |
| | | throw new UserMoneyRecordException(e.getCode(), e.getMsg()); |
| | | } |
| | | goldCornConsumeRecordService.add(record); |
| | | //消息通知不需要在主线程 |
| | | ThreadUtil.run(new Runnable() { |
| | | @Override |
| | | public void run() { |
| | | try { |
| | | userMsgNotifyService.notify(UserMsgFactory.createGoldCornExchange(record, userMoneyService.getBalance(uid))); |
| | | //添加站外推送 |
| | | UserInfo user = userInfoService.get(uid); |
| | | if (user == null) { |
| | | return; |
| | | } |
| | | pushManager.pushGoldCornSettle(user.getSystem(), record.getUid(), Math.abs(record.getCornNum()), new BigDecimal(record.getMoney()).divide(new BigDecimal(100), 2, RoundingMode.FLOOR)); |
| | | } catch (Exception e) { |
| | | e.printStackTrace(); |
| | | } |
| | | } |
| | | }); |
| | | } |
| | | |
| | | @Override |
| | | public void settle(Long uid, Date day) throws UserInfoException, GoldCornMoneyExchangeRateRecordException, UserMoneyRecordException, GoldCornConsumeRecordException { |
| | | public void settle(Long uid, String day, String settleId) throws UserInfoException, GoldCornMoneyExchangeRateRecordException, UserMoneyRecordException, GoldCornConsumeRecordException { |
| | | UserInfo user = userInfoService.get(uid); |
| | | if (user == null) { |
| | | throw new UserInfoException(UserInfoException.CODE_NOT_EXIST, "用户不存在"); |
| | |
| | | |
| | | BigDecimal rate = null; |
| | | try { |
| | | rate = goldCornMoneyExchangeRateRecordService.getRate(GoldCornUtil.getFormatDay(day), user.getSystem(), new Date()); |
| | | rate = goldCornMoneyExchangeRateRecordService.getRate(day, user.getSystem(), new Date()); |
| | | } catch (ParamsException e) { |
| | | throw new GoldCornMoneyExchangeRateRecordException(GoldCornMoneyExchangeRateRecordException.CODE_PARAMS_NOT_ENOUGH, e.getMsg()); |
| | | } |
| | |
| | | throw new GoldCornMoneyExchangeRateRecordException(GoldCornMoneyExchangeRateRecordException.CODE_NOT_EXIST, "未获取到汇率"); |
| | | } |
| | | |
| | | settle(uid, day, rate); |
| | | settle(uid, day, rate, settleId); |
| | | } |
| | | } |