admin
2025-02-25 30d8e227e8d823b6c38c3b9c90ac2df03b63befe
fanli/src/main/java/com/yeshi/fanli/util/factory/UserMoneyDetailFactory.java
@@ -1,602 +1,748 @@
package com.yeshi.fanli.util.factory;
import java.math.BigDecimal;
import java.util.Calendar;
import java.util.Date;
import com.yeshi.fanli.dto.HongBao;
import com.yeshi.fanli.entity.bus.user.AlipayAccountValidNormalHistory;
import com.yeshi.fanli.entity.bus.user.Extract;
import com.yeshi.fanli.entity.bus.user.UserInfo;
import com.yeshi.fanli.entity.money.UserMoneyDetail;
import com.yeshi.fanli.entity.money.UserMoneyDetail.UserMoneyDetailTypeEnum;
import com.yeshi.fanli.entity.taobao.TaoBaoWeiQuanDrawBack;
import com.yeshi.fanli.exception.money.UserMoneyDetailException;
import com.yeshi.fanli.util.Constant;
import com.yeshi.fanli.util.StringUtil;
import com.yeshi.fanli.util.TimeUtil;
import com.yeshi.fanli.util.account.UserUtil;
public class UserMoneyDetailFactory {
   /**
    * 返利资金记录
    *
    * @param hongBaoList
    * @return
    */
   public static UserMoneyDetail createFanLi(Long uid, String orderId, int orderType, String hbIds, BigDecimal money)
         throws UserMoneyDetailException {
      if (StringUtil.isNullOrEmpty(orderId))
         throw new UserMoneyDetailException(1, "订单号为空");
      if (money == null)
         throw new UserMoneyDetailException(1, "返利金额为空");
      if (uid == null)
         throw new UserMoneyDetailException(1, "UID为空");
      UserMoneyDetail detail = new UserMoneyDetail();
      detail.setCreateTime(new Date());
      detail.setIdentifyCode(StringUtil
            .Md5(UserMoneyDetailTypeEnum.fanli.name() + "-" + uid + "-" + orderType + "-" + orderId + "-" + hbIds));
      detail.setMoney(money);
      detail.setTitle(UserMoneyDetailTypeEnum.fanli.getDesc());
      detail.setType(UserMoneyDetailTypeEnum.fanli);
      detail.setDescInfo("订单号:" + orderId);
      detail.setUpdateTime(new Date());
      detail.setUserInfo(new UserInfo(uid));
      detail.setOrderType(orderType);
      return detail;
   }
   /**
    * 饿了么返利
    *
    * @param uid
    * @param orderId
    * @param hbId
    * @param money
    * @return
    * @throws UserMoneyDetailException
    */
   public static UserMoneyDetail createElmeFanLi(Long uid, String orderId, Long hbId, BigDecimal money)
         throws UserMoneyDetailException {
      if (StringUtil.isNullOrEmpty(orderId))
         throw new UserMoneyDetailException(1, "订单号为空");
      if (money == null)
         throw new UserMoneyDetailException(1, "返利金额为空");
      if (uid == null)
         throw new UserMoneyDetailException(1, "UID为空");
      UserMoneyDetail detail = new UserMoneyDetail();
      detail.setCreateTime(new Date());
      detail.setIdentifyCode(StringUtil.Md5(UserMoneyDetailTypeEnum.elmeFanli.name() + "-" + hbId));
      detail.setMoney(money);
      detail.setTitle(UserMoneyDetailTypeEnum.elmeFanli.getDesc());
      detail.setType(UserMoneyDetailTypeEnum.elmeFanli);
      detail.setDescInfo("订单号:" + orderId);
      detail.setUpdateTime(new Date());
      detail.setUserInfo(new UserInfo(uid));
      detail.setOrderType(Constant.SOURCE_TYPE_ELME);
      return detail;
   }
   /**
    * 分享奖金到账
    *
    * @param uid
    * @param validCount
    * @param weiQuanCount
    * @param invalidCount
    * @param money
    * @param time
    * @return
    * @throws UserMoneyDetailException
    */
   public static UserMoneyDetail createShare(Long uid, int orderType, int validCount, int weiQuanCount,
         BigDecimal money, Date time) throws UserMoneyDetailException {
      if (money == null)
         throw new UserMoneyDetailException(1, "返利金额为空");
      if (uid == null)
         throw new UserMoneyDetailException(1, "UID为空");
      if (time == null)
         throw new UserMoneyDetailException(1, "发生时间为空");
      Calendar ca = Calendar.getInstance();
      ca.setTime(time);
      ca.add(Calendar.MONTH, -1);
      String timeF = TimeUtil.getGernalTime(ca.getTimeInMillis(), "yyyy.M");
      UserMoneyDetail detail = new UserMoneyDetail();
      detail.setCreateTime(new Date());
      detail.setIdentifyCode(StringUtil.Md5(UserMoneyDetailTypeEnum.share.name() + "-" + uid + "-" + timeF));
      detail.setMoney(money);
      detail.setTitle(timeF + UserMoneyDetailTypeEnum.share.getDesc());
      detail.setType(UserMoneyDetailTypeEnum.share);
      detail.setDescInfo(String.format("有效订单:%s笔  维权订单:%s笔", validCount, weiQuanCount));
      detail.setUpdateTime(new Date());
      detail.setUserInfo(new UserInfo(uid));
      detail.setOrderType(orderType);
      return detail;
   }
   /**
    * 邀请奖金到账
    *
    * @param uid
    * @param validCount
    * @param weiQuanCount
    * @param invalidCount
    * @param money
    * @param time
    * @return
    * @throws UserMoneyDetailException
    */
   public static UserMoneyDetail createInvite(Long uid, int orderType, int validCount, int weiQuanCount,
         BigDecimal money, Date time) throws UserMoneyDetailException {
      if (money == null)
         throw new UserMoneyDetailException(1, "返利金额为空");
      if (uid == null)
         throw new UserMoneyDetailException(1, "UID为空");
      if (time == null)
         throw new UserMoneyDetailException(1, "发生时间为空");
      Calendar ca = Calendar.getInstance();
      ca.setTime(time);
      ca.add(Calendar.MONTH, -1);
      String timeF = TimeUtil.getGernalTime(ca.getTimeInMillis(), "yyyy.M");
      UserMoneyDetail detail = new UserMoneyDetail();
      detail.setCreateTime(new Date());
      detail.setIdentifyCode(StringUtil.Md5(UserMoneyDetailTypeEnum.invite.name() + "-" + uid + "-" + timeF));
      detail.setMoney(money);
      detail.setTitle(timeF + UserMoneyDetailTypeEnum.invite.getDesc());
      detail.setType(UserMoneyDetailTypeEnum.invite);
      if (validCount != 0 || weiQuanCount != 0)
         detail.setDescInfo(String.format("有效订单:%s笔   维权订单:%s笔", validCount, weiQuanCount));
      detail.setUpdateTime(new Date());
      detail.setUserInfo(new UserInfo(uid));
      detail.setOrderType(orderType);
      return detail;
   }
   /**
    * 返利维权
    *
    * @param uid
    * @param drawBack
    * @param money
    * @return
    * @throws UserMoneyDetailException
    */
   public static UserMoneyDetail createFanLiWeiQuan(Long uid, TaoBaoWeiQuanDrawBack drawBack, BigDecimal money)
         throws UserMoneyDetailException {
      if (drawBack == null)
         throw new UserMoneyDetailException(1, "退款为空");
      if (drawBack.getId() == null)
         throw new UserMoneyDetailException(1, "退款ID为空");
      if (StringUtil.isNullOrEmpty(drawBack.getOrderId()))
         throw new UserMoneyDetailException(1, "订单号为空");
      if (StringUtil.isNullOrEmpty(drawBack.getOrderItemId()))
         throw new UserMoneyDetailException(1, "子订单号为空");
      if (money == null)
         throw new UserMoneyDetailException(1, "退款金额为空");
      if (uid == null)
         throw new UserMoneyDetailException(1, "UID为空");
      UserMoneyDetail detail = new UserMoneyDetail();
      detail.setCreateTime(new Date());
      detail.setIdentifyCode(StringUtil
            .Md5(UserMoneyDetailTypeEnum.fanliWeiQuan.name() + "-" + uid + "-" + drawBack.getOrderItemId()));
      detail.setMoney(new BigDecimal("0").subtract(money));
      detail.setTitle(UserMoneyDetailTypeEnum.fanliWeiQuan.getDesc());
      detail.setSubTitle("订单维权");
      detail.setType(UserMoneyDetailTypeEnum.fanliWeiQuan);
      detail.setSourceIdentifyId(drawBack.getId());
      detail.setDescInfo("订单号:" + drawBack.getOrderId());
      detail.setUpdateTime(new Date());
      detail.setUserInfo(new UserInfo(uid));
      detail.setOrderType(Constant.SOURCE_TYPE_TAOBAO);
      return detail;
   }
   /**
    * 分享赚维权
    *
    * @param uid
    * @param drawBack
    * @param money
    * @return
    * @throws UserMoneyDetailException
    */
   public static UserMoneyDetail createShareWeiQuan(Long uid, TaoBaoWeiQuanDrawBack drawBack, BigDecimal money)
         throws UserMoneyDetailException {
      if (drawBack == null)
         throw new UserMoneyDetailException(1, "退款为空");
      if (drawBack.getId() == null)
         throw new UserMoneyDetailException(1, "退款ID为空");
      if (StringUtil.isNullOrEmpty(drawBack.getOrderId()))
         throw new UserMoneyDetailException(1, "订单号为空");
      if (StringUtil.isNullOrEmpty(drawBack.getOrderItemId()))
         throw new UserMoneyDetailException(1, "子订单号为空");
      if (money == null)
         throw new UserMoneyDetailException(1, "退款金额为空");
      if (uid == null)
         throw new UserMoneyDetailException(1, "UID为空");
      UserMoneyDetail detail = new UserMoneyDetail();
      detail.setCreateTime(new Date());
      detail.setIdentifyCode(StringUtil
            .Md5(UserMoneyDetailTypeEnum.shareWeiQuan.name() + "-" + uid + "-" + drawBack.getOrderItemId()));
      detail.setMoney(new BigDecimal("0").subtract(money));
      detail.setTitle(UserMoneyDetailTypeEnum.shareWeiQuan.getDesc());
      detail.setSubTitle("订单维权");
      detail.setType(UserMoneyDetailTypeEnum.shareWeiQuan);
      detail.setSourceIdentifyId(drawBack.getId());
      detail.setDescInfo("订单号:" + UserUtil.filterOrderId(drawBack.getOrderId()));
      detail.setUpdateTime(new Date());
      detail.setUserInfo(new UserInfo(uid));
      detail.setOrderType(Constant.SOURCE_TYPE_TAOBAO);
      return detail;
   }
   /**
    * 邀请赚维权
    *
    * @param uid
    * @param drawBack
    * @param money
    * @return
    * @throws UserMoneyDetailException
    */
   public static UserMoneyDetail createInviteWeiQuan(Long uid, TaoBaoWeiQuanDrawBack drawBack, BigDecimal money)
         throws UserMoneyDetailException {
      if (drawBack == null)
         throw new UserMoneyDetailException(1, "退款为空");
      if (drawBack.getId() == null)
         throw new UserMoneyDetailException(1, "退款ID为空");
      if (StringUtil.isNullOrEmpty(drawBack.getOrderId()))
         throw new UserMoneyDetailException(1, "订单号为空");
      if (StringUtil.isNullOrEmpty(drawBack.getOrderItemId()))
         throw new UserMoneyDetailException(1, "子订单号为空");
      if (money == null)
         throw new UserMoneyDetailException(1, "退款金额为空");
      if (uid == null)
         throw new UserMoneyDetailException(1, "UID为空");
      UserMoneyDetail detail = new UserMoneyDetail();
      detail.setCreateTime(new Date());
      detail.setIdentifyCode(StringUtil
            .Md5(UserMoneyDetailTypeEnum.inviteWeiQuan.name() + "-" + uid + "-" + drawBack.getOrderItemId()));
      detail.setMoney(new BigDecimal("0").subtract(money));
      detail.setTitle(UserMoneyDetailTypeEnum.inviteWeiQuan.getDesc());
      detail.setSubTitle("订单维权");
      detail.setType(UserMoneyDetailTypeEnum.inviteWeiQuan);
      detail.setSourceIdentifyId(drawBack.getId());
      detail.setDescInfo("订单号:" + UserUtil.filterOrderId(drawBack.getOrderId()));
      detail.setUpdateTime(new Date());
      detail.setUserInfo(new UserInfo(uid));
      detail.setOrderType(Constant.SOURCE_TYPE_TAOBAO);
      return detail;
   }
   /**
    * 提现资金记录
    *
    * @param extract
    * @return
    */
   public static UserMoneyDetail createExtract(Extract extract) throws UserMoneyDetailException {
      if (extract == null)
         throw new UserMoneyDetailException(1, "提现记录不能为空");
      if (extract.getId() == null)
         throw new UserMoneyDetailException(1, "提现记录主键不能为空");
      if (extract.getMoney() == null)
         throw new UserMoneyDetailException(1, "提现金额不能为空");
      if (extract.getUserInfo() == null || extract.getUserInfo().getId() == null)
         throw new UserMoneyDetailException(1, "提现用户不能为空");
      UserMoneyDetail detail = new UserMoneyDetail();
      detail.setCreateTime(new Date());
      detail.setIdentifyCode(StringUtil.Md5(UserMoneyDetailTypeEnum.extract.name() + ":" + extract.getId()));
      detail.setMoney(new BigDecimal("0").subtract(extract.getMoney()));
      detail.setSourceIdentifyId(extract.getId());
      detail.setTitle(UserMoneyDetailTypeEnum.extract.getDesc());
      detail.setType(UserMoneyDetailTypeEnum.extract);
      detail.setUpdateTime(new Date());
      detail.setUserInfo(extract.getUserInfo());
      detail.setShow(false);
      return detail;
   }
   /**
    * 提现账号验证记录
    *
    * @param aa
    * @param money
    * @return
    * @throws UserMoneyDetailException
    */
   public static UserMoneyDetail createExtractAccountValid(AlipayAccountValidNormalHistory aa, BigDecimal money)
         throws UserMoneyDetailException {
      if (aa == null)
         throw new UserMoneyDetailException(1, "验证记录不能为空");
      if (aa.getUid() == null)
         throw new UserMoneyDetailException(1, "UID不能为空");
      if (money == null)
         throw new UserMoneyDetailException(1, "金额不能为空");
      UserMoneyDetail detail = new UserMoneyDetail();
      detail.setCreateTime(new Date());
      detail.setIdentifyCode(StringUtil.Md5(UserMoneyDetailTypeEnum.extractVerify.name() + ":" + aa.getId()));
      detail.setMoney(new BigDecimal("0").subtract(money));
      detail.setSourceIdentifyId(aa.getId());
      detail.setTitle(UserMoneyDetailTypeEnum.extractVerify.getDesc());
      detail.setType(UserMoneyDetailTypeEnum.extractVerify);
      detail.setUpdateTime(new Date());
      detail.setUserInfo(new UserInfo(aa.getUid()));
      return detail;
   }
   /**
    * 提现拒绝
    *
    * @param extract
    * @return
    * @throws UserMoneyDetailException
    */
   public static UserMoneyDetail createExtractReject(Extract extract) throws UserMoneyDetailException {
      if (extract == null)
         throw new UserMoneyDetailException(1, "提现记录不能为空");
      if (extract.getId() == null)
         throw new UserMoneyDetailException(1, "提现记录主键不能为空");
      if (extract.getMoney() == null)
         throw new UserMoneyDetailException(1, "提现金额不能为空");
      if (extract.getUserInfo() == null || extract.getUserInfo().getId() == null)
         throw new UserMoneyDetailException(1, "提现用户不能为空");
      UserMoneyDetail detail = new UserMoneyDetail();
      detail.setCreateTime(new Date());
      detail.setIdentifyCode(StringUtil.Md5(UserMoneyDetailTypeEnum.extractReject.name() + ":" + extract.getId()));
      detail.setMoney(extract.getMoney());
      detail.setSourceIdentifyId(extract.getId());
      detail.setSubTitle("原路退回");
      detail.setTitle(UserMoneyDetailTypeEnum.extractReject.getDesc());
      detail.setType(UserMoneyDetailTypeEnum.extractReject);
      detail.setUpdateTime(new Date());
      detail.setUserInfo(extract.getUserInfo());
      detail.setShow(false);// 隐藏提现失败记录
      return detail;
   }
   /**
    * 系统红包
    *
    * @param hb
    * @return
    * @throws UserMoneyDetailException
    */
   private static UserMoneyDetail createHongBao(HongBao hb, String subTitle) throws UserMoneyDetailException {
      if (hb == null)
         throw new UserMoneyDetailException(1, "红包不能为空");
      if (hb.getUserInfo() == null)
         throw new UserMoneyDetailException(1, "用户不能为空");
      UserMoneyDetail detail = new UserMoneyDetail();
      detail.setCreateTime(new Date());
      detail.setIdentifyCode(
            StringUtil.Md5(UserMoneyDetailTypeEnum.hongbao.name() + "-" + subTitle + "-" + hb.getId()));
      detail.setMoney(hb.getMoney());
      detail.setSourceIdentifyId(hb.getId());
      detail.setTitle(UserMoneyDetailTypeEnum.hongbao.getDesc());
      detail.setSubTitle(subTitle);
      detail.setType(UserMoneyDetailTypeEnum.hongbao);
      detail.setUpdateTime(new Date());
      detail.setUserInfo(hb.getUserInfo());
      return detail;
   }
   private static UserMoneyDetail createHongBaoDeduct(HongBao hb, String subTitle) throws UserMoneyDetailException {
      if (hb == null)
         throw new UserMoneyDetailException(1, "红包不能为空");
      if (hb.getUserInfo() == null)
         throw new UserMoneyDetailException(1, "用户不能为空");
      UserMoneyDetail detail = new UserMoneyDetail();
      detail.setCreateTime(new Date());
      detail.setIdentifyCode(StringUtil.Md5(UserMoneyDetailTypeEnum.hongbaoDeduct.name() + "-" + subTitle + "-"
            + hb.getBeizhu() + "-" + hb.getId()));
      detail.setMoney(hb.getMoney());
      detail.setSourceIdentifyId(hb.getId());
      detail.setTitle(UserMoneyDetailTypeEnum.hongbaoDeduct.getDesc());
      detail.setSubTitle(subTitle);
      detail.setType(UserMoneyDetailTypeEnum.hongbaoDeduct);
      detail.setUpdateTime(new Date());
      detail.setUserInfo(hb.getUserInfo());
      return detail;
   }
   /**
    * 新人红包
    *
    * @param hb
    * @return
    * @throws UserMoneyDetailException
    */
   public static UserMoneyDetail createNewerHongBao(HongBao hb) throws UserMoneyDetailException {
      return createHongBao(hb, "新人红包");
   }
   /**
    * 新人红包扣除
    *
    * @param hb
    * @return
    * @throws UserMoneyDetailException
    */
   public static UserMoneyDetail createNewerHongBaoDeduct(HongBao hb) throws UserMoneyDetailException {
      return createHongBaoDeduct(hb, "新人红包扣除");
   }
   /**
    * 返利奖励
    *
    * @param orderId
    * @param money
    * @param user
    * @return
    * @throws UserMoneyDetailException
    */
   public static UserMoneyDetail createOrderReward(String orderId, int orderType, BigDecimal money, UserInfo user)
         throws UserMoneyDetailException {
      if (StringUtil.isNullOrEmpty(orderId))
         throw new UserMoneyDetailException(1, "订单号不能为空");
      if (user == null)
         throw new UserMoneyDetailException(1, "UID不能为空");
      if (money == null)
         throw new UserMoneyDetailException(1, "金额不能为空");
      UserMoneyDetail detail = new UserMoneyDetail();
      detail.setCreateTime(new Date());
      detail.setIdentifyCode(StringUtil.Md5(UserMoneyDetailTypeEnum.hongbao.name() + "-" + "老版本" + "-" + orderId));
      detail.setMoney(money);
      detail.setTitle(UserMoneyDetailTypeEnum.orderReward.getDesc());
      detail.setType(UserMoneyDetailTypeEnum.orderReward);
      detail.setUpdateTime(new Date());
      detail.setUserInfo(user);
      detail.setOrderType(orderType);
      detail.setDescInfo("订单号:" + orderId);
      return detail;
   }
   /**
    * 订单重复统计退款
    *
    * @param orderId
    * @param money
    * @param user
    * @return
    * @throws UserMoneyDetailException
    */
   public static UserMoneyDetail createRepeatStatistic(String orderId, int orderType, BigDecimal money, UserInfo user)
         throws UserMoneyDetailException {
      if (StringUtil.isNullOrEmpty(orderId))
         throw new UserMoneyDetailException(1, "订单号不能为空");
      if (user == null)
         throw new UserMoneyDetailException(1, "UID不能为空");
      if (money == null)
         throw new UserMoneyDetailException(1, "金额不能为空");
      UserMoneyDetail detail = new UserMoneyDetail();
      detail.setCreateTime(new Date());
      detail.setIdentifyCode(
            StringUtil.Md5(UserMoneyDetailTypeEnum.repeatStatistic.name() + "-" + orderId + "-" + user.getId()));
      detail.setMoney(money);
      detail.setTitle(UserMoneyDetailTypeEnum.repeatStatistic.getDesc());
      detail.setType(UserMoneyDetailTypeEnum.repeatStatistic);
      detail.setUpdateTime(new Date());
      detail.setUserInfo(user);
      detail.setDescInfo("订单号:" + orderId);
      detail.setOrderType(orderType);
      return detail;
   }
   public static UserMoneyDetail createSystemEqualize(String desc, BigDecimal money, UserInfo user)
         throws UserMoneyDetailException {
      if (user == null)
         throw new UserMoneyDetailException(1, "UID不能为空");
      if (money == null)
         throw new UserMoneyDetailException(1, "金额不能为空");
      UserMoneyDetail detail = new UserMoneyDetail();
      detail.setCreateTime(new Date());
      detail.setIdentifyCode(StringUtil.Md5(
            UserMoneyDetailTypeEnum.systemEqualize.name() + "-" + System.currentTimeMillis() + "-" + user.getId()));
      detail.setMoney(money);
      detail.setTitle(UserMoneyDetailTypeEnum.systemEqualize.getDesc());
      detail.setType(UserMoneyDetailTypeEnum.systemEqualize);
      detail.setUpdateTime(new Date());
      detail.setUserInfo(user);
      if (!StringUtil.isNullOrEmpty(desc)) {
         detail.setDescInfo(desc);
      }
      return detail;
   }
   public static UserMoneyDetail createScoreConvert(BigDecimal money, UserInfo user) throws UserMoneyDetailException {
      if (user == null)
         throw new UserMoneyDetailException(1, "UID不能为空");
      if (money == null)
         throw new UserMoneyDetailException(1, "金额不能为空");
      UserMoneyDetail detail = new UserMoneyDetail();
      detail.setCreateTime(new Date());
      detail.setIdentifyCode(StringUtil.Md5(
            UserMoneyDetailTypeEnum.scoreConvert.name() + "-" + System.currentTimeMillis() + "-" + user.getId()));
      detail.setMoney(money);
      detail.setTitle(UserMoneyDetailTypeEnum.scoreConvert.getDesc());
      detail.setType(UserMoneyDetailTypeEnum.scoreConvert);
      detail.setUpdateTime(new Date());
      detail.setUserInfo(user);
      return detail;
   }
   /**
    * 邀请奖金到账
    *
    * @param uid
    * @param validCount
    * @param weiQuanCount
    * @param invalidCount
    * @param money
    * @param time
    * @return
    * @throws UserMoneyDetailException
    */
   public static UserMoneyDetail createInviteSubsidy(Long uid, int orderType, BigDecimal money, Date time)
         throws UserMoneyDetailException {
      if (money == null)
         throw new UserMoneyDetailException(1, "返利金额为空");
      if (uid == null)
         throw new UserMoneyDetailException(1, "UID为空");
      if (time == null)
         throw new UserMoneyDetailException(1, "发生时间为空");
      Calendar ca = Calendar.getInstance();
      ca.setTime(time);
      ca.add(Calendar.MONTH, -1);
      String timeF = TimeUtil.getGernalTime(ca.getTimeInMillis(), "yyyy.M");
      UserMoneyDetail detail = new UserMoneyDetail();
      detail.setCreateTime(new Date());
      detail.setIdentifyCode(
            StringUtil.Md5(UserMoneyDetailTypeEnum.subsidy.name() + "-" + orderType + "-" + uid + "-" + timeF));
      detail.setMoney(money);
      detail.setTitle(
            timeF + UserMoneyDetailTypeEnum.subsidy.getDesc() + "【" + Constant.getSourceName(orderType) + "】");
      detail.setType(UserMoneyDetailTypeEnum.subsidy);
      detail.setDescInfo("邀请订单补贴");
      detail.setUpdateTime(new Date());
      detail.setUserInfo(new UserInfo(uid));
      detail.setOrderType(orderType);
      return detail;
   }
}
package com.yeshi.fanli.util.factory;
import java.math.BigDecimal;
import java.util.*;
import com.yeshi.fanli.dto.HongBao;
import com.yeshi.fanli.entity.bus.user.AlipayAccountValidNormalHistory;
import com.yeshi.fanli.entity.bus.user.Extract;
import com.yeshi.fanli.entity.bus.user.UserInfo;
import com.yeshi.fanli.entity.money.UserMoneyDetail;
import com.yeshi.fanli.entity.money.UserMoneyDetail.UserMoneyDetailTypeEnum;
import com.yeshi.fanli.entity.taobao.TaoBaoWeiQuanDrawBack;
import com.yeshi.fanli.exception.money.UserMoneyDetailException;
import com.yeshi.fanli.util.Constant;
import com.yeshi.fanli.util.StringUtil;
import org.yeshi.utils.TimeUtil;
import com.yeshi.fanli.util.account.UserUtil;
public class UserMoneyDetailFactory {
    /**
     * 返利资金记录
     *
     * @param hongBaoList
     * @return
     */
    public static UserMoneyDetail createFanLi(Long uid, String orderId, int orderType, String hbIds, BigDecimal money)
            throws UserMoneyDetailException {
        if (StringUtil.isNullOrEmpty(orderId))
            throw new UserMoneyDetailException(1, "订单号为空");
        if (money == null)
            throw new UserMoneyDetailException(1, "返利金额为空");
        if (uid == null)
            throw new UserMoneyDetailException(1, "UID为空");
        UserMoneyDetail detail = new UserMoneyDetail();
        detail.setCreateTime(new Date());
        detail.setIdentifyCode(StringUtil
                .Md5(UserMoneyDetailTypeEnum.fanli.name() + "-" + uid + "-" + orderType + "-" + orderId + "-" + hbIds));
        detail.setMoney(money);
        detail.setTitle(UserMoneyDetailTypeEnum.fanliNew.getDesc());
        detail.setType(UserMoneyDetailTypeEnum.fanliNew);
        detail.setDescInfo(Constant.getSourceName(orderType) + ":" + orderId);
        detail.setUpdateTime(new Date());
        detail.setUserInfo(new UserInfo(uid));
        detail.setOrderType(orderType);
        return detail;
    }
    /**
     * 饿了么返利
     *
     * @param uid
     * @param orderId
     * @param hbId
     * @param money
     * @return
     * @throws UserMoneyDetailException
     */
    public static UserMoneyDetail createElmeFanLi(Long uid, String orderId, Long hbId, BigDecimal money)
            throws UserMoneyDetailException {
        if (StringUtil.isNullOrEmpty(orderId))
            throw new UserMoneyDetailException(1, "订单号为空");
        if (money == null)
            throw new UserMoneyDetailException(1, "返利金额为空");
        if (uid == null)
            throw new UserMoneyDetailException(1, "UID为空");
        UserMoneyDetail detail = new UserMoneyDetail();
        detail.setCreateTime(new Date());
        detail.setIdentifyCode(StringUtil.Md5(UserMoneyDetailTypeEnum.elmeFanli.name() + "-" + hbId));
        detail.setMoney(money);
        detail.setTitle(UserMoneyDetailTypeEnum.elmeFanli.getDesc());
        detail.setType(UserMoneyDetailTypeEnum.elmeFanli);
        detail.setDescInfo("订单号:" + orderId);
        detail.setUpdateTime(new Date());
        detail.setUserInfo(new UserInfo(uid));
        detail.setOrderType(Constant.SOURCE_TYPE_ELME);
        return detail;
    }
    /**
     * 分享奖金到账
     *
     * @param uid
     * @param money
     * @param month 月份
     * @return
     * @throws UserMoneyDetailException
     */
    public static UserMoneyDetail createShare(Long uid, int orderType, BigDecimal money, Date recieveMonth)
            throws UserMoneyDetailException {
        if (money == null)
            throw new UserMoneyDetailException(1, "返利金额为空");
        if (uid == null)
            throw new UserMoneyDetailException(1, "UID为空");
        if (recieveMonth == null)
            throw new UserMoneyDetailException(1, "发生时间为空");
        Calendar ca = Calendar.getInstance();
        ca.setTime(recieveMonth);
        ca.add(Calendar.MONTH, -1);
        String timeF = TimeUtil.getGernalTime(ca.getTimeInMillis(), "yyyy年M月");
        UserMoneyDetail detail = new UserMoneyDetail();
        detail.setCreateTime(new Date());
        //暂时处理
//        detail.setIdentifyCode(
//                StringUtil.Md5(UserMoneyDetailTypeEnum.share.name() + "-" + orderType + "-" + uid + "-" +  TimeUtil.getGernalTime(ca.getTimeInMillis(), "yyyy年M月d日")));
        detail.setIdentifyCode(
                StringUtil.Md5(UserMoneyDetailTypeEnum.share.name() + "-" + orderType + "-" + uid + "-" + timeF));
        detail.setMoney(money);
        detail.setTitle(UserMoneyDetailTypeEnum.shareNew.getDesc());
        detail.setType(UserMoneyDetailTypeEnum.shareNew);
        detail.setDescInfo(Constant.getSourceName(orderType) + ":" + timeF);
        detail.setUpdateTime(new Date());
        detail.setUserInfo(new UserInfo(uid));
        detail.setOrderType(orderType);
        return detail;
    }
    /**
     * 邀请奖金到账
     *
     * @param uid
     * @param validCount
     * @param weiQuanCount
     * @param invalidCount
     * @param money
     * @param time
     * @return
     * @throws UserMoneyDetailException
     */
    public static UserMoneyDetail createInvite(Long uid, int orderType, int validCount, int weiQuanCount,
                                               BigDecimal money, Date time) throws UserMoneyDetailException {
        if (money == null)
            throw new UserMoneyDetailException(1, "返利金额为空");
        if (uid == null)
            throw new UserMoneyDetailException(1, "UID为空");
        if (time == null)
            throw new UserMoneyDetailException(1, "发生时间为空");
        Calendar ca = Calendar.getInstance();
        ca.setTime(time);
        ca.add(Calendar.MONTH, -1);
        String timeF = TimeUtil.getGernalTime(ca.getTimeInMillis(), "yyyy.M");
        UserMoneyDetail detail = new UserMoneyDetail();
        detail.setCreateTime(new Date());
        detail.setIdentifyCode(
                StringUtil.Md5(UserMoneyDetailTypeEnum.invite.name() + "-" + orderType + "-" + uid + "-" + timeF));
        detail.setMoney(money);
        detail.setTitle(timeF + UserMoneyDetailTypeEnum.invite.getDesc());
        detail.setType(UserMoneyDetailTypeEnum.invite);
        if (validCount != 0 || weiQuanCount != 0)
            detail.setDescInfo(String.format("有效订单:%s笔   维权订单:%s笔", validCount, weiQuanCount));
        detail.setUpdateTime(new Date());
        detail.setUserInfo(new UserInfo(uid));
        detail.setOrderType(orderType);
        return detail;
    }
    /**
     * 返利维权
     *
     * @param uid
     * @param drawBack
     * @param money
     * @return
     * @throws UserMoneyDetailException
     */
    public static UserMoneyDetail createFanLiWeiQuan(Long uid, TaoBaoWeiQuanDrawBack drawBack, BigDecimal money)
            throws UserMoneyDetailException {
        return createFanLiWeiQuan(uid, drawBack.getOrderId(), Arrays.asList(new TaoBaoWeiQuanDrawBack[]{drawBack}), money);
    }
    public static UserMoneyDetail createFanLiWeiQuan(Long uid, String orderId, List<TaoBaoWeiQuanDrawBack> drawBackList, BigDecimal money)
            throws UserMoneyDetailException {
        if (drawBackList == null || drawBackList.size() == 0)
            throw new UserMoneyDetailException(1, "退款为空");
        for (TaoBaoWeiQuanDrawBack drawBack : drawBackList) {
            if (drawBack.getId() == null)
                throw new UserMoneyDetailException(1, "退款ID为空");
            if (StringUtil.isNullOrEmpty(drawBack.getOrderId()))
                throw new UserMoneyDetailException(1, "订单号为空");
            if (StringUtil.isNullOrEmpty(drawBack.getOrderItemId()))
                throw new UserMoneyDetailException(1, "子订单号为空");
        }
        if (money == null)
            throw new UserMoneyDetailException(1, "退款金额为空");
        if (uid == null)
            throw new UserMoneyDetailException(1, "UID为空");
        Comparator<TaoBaoWeiQuanDrawBack> cm = (o1, o2) ->
                o1.getId() - o2.getId() > 0 ? 1 : -1;
        List<TaoBaoWeiQuanDrawBack> tempList = new ArrayList<>();
        tempList.addAll(drawBackList);
        List<String> orderItemIdList = new ArrayList<>();
        for (TaoBaoWeiQuanDrawBack drawBack : tempList) {
            orderItemIdList.add(drawBack.getOrderItemId());
        }
        UserMoneyDetail detail = new UserMoneyDetail();
        detail.setCreateTime(new Date());
        detail.setIdentifyCode(StringUtil
                .Md5(UserMoneyDetailTypeEnum.fanliWeiQuan.name() + "-" + uid + "-" + StringUtil.concat(orderItemIdList, "#")));
        detail.setMoney(new BigDecimal("0").subtract(money));
        detail.setTitle(UserMoneyDetailTypeEnum.fanliWeiQuanNew.getDesc());
        detail.setType(UserMoneyDetailTypeEnum.fanliWeiQuanNew);
        //暂时只能写入第一个的id
        detail.setSourceIdentifyId(tempList.get(0).getId());
        detail.setDescInfo(
                Constant.getSourceName(Constant.SOURCE_TYPE_TAOBAO) + ":" + orderId + "-部分商品售后");
        detail.setUpdateTime(new Date());
        detail.setUserInfo(new UserInfo(uid));
        detail.setOrderType(Constant.SOURCE_TYPE_TAOBAO);
        return detail;
    }
    /**
     * 分享赚维权
     *
     * @param uid
     * @param drawBack
     * @param money
     * @return
     * @throws UserMoneyDetailException
     */
    public static UserMoneyDetail createShareWeiQuan(Long uid, TaoBaoWeiQuanDrawBack drawBack, BigDecimal money)
            throws UserMoneyDetailException {
        if (drawBack == null)
            throw new UserMoneyDetailException(1, "退款为空");
        if (drawBack.getId() == null)
            throw new UserMoneyDetailException(1, "退款ID为空");
        if (StringUtil.isNullOrEmpty(drawBack.getOrderId()))
            throw new UserMoneyDetailException(1, "订单号为空");
        if (StringUtil.isNullOrEmpty(drawBack.getOrderItemId()))
            throw new UserMoneyDetailException(1, "子订单号为空");
        if (money == null)
            throw new UserMoneyDetailException(1, "退款金额为空");
        if (uid == null)
            throw new UserMoneyDetailException(1, "UID为空");
        UserMoneyDetail detail = new UserMoneyDetail();
        detail.setCreateTime(new Date());
        detail.setIdentifyCode(StringUtil
                .Md5(UserMoneyDetailTypeEnum.shareWeiQuan.name() + "-" + uid + "-" + drawBack.getOrderItemId()));
        detail.setMoney(new BigDecimal("0").subtract(money));
        detail.setTitle(UserMoneyDetailTypeEnum.shareWeiQuan.getDesc());
        detail.setSubTitle("订单售后");
        detail.setType(UserMoneyDetailTypeEnum.shareWeiQuan);
        detail.setSourceIdentifyId(drawBack.getId());
        detail.setDescInfo("订单号:" + drawBack.getOrderId());
        detail.setUpdateTime(new Date());
        detail.setUserInfo(new UserInfo(uid));
        detail.setOrderType(Constant.SOURCE_TYPE_TAOBAO);
        return detail;
    }
    /**
     * 邀请赚维权
     *
     * @param uid
     * @param drawBack
     * @param money
     * @return
     * @throws UserMoneyDetailException
     */
    public static UserMoneyDetail createInviteWeiQuan(Long uid, TaoBaoWeiQuanDrawBack drawBack, BigDecimal money)
            throws UserMoneyDetailException {
        if (drawBack == null)
            throw new UserMoneyDetailException(1, "退款为空");
        if (drawBack.getId() == null)
            throw new UserMoneyDetailException(1, "退款ID为空");
        if (StringUtil.isNullOrEmpty(drawBack.getOrderId()))
            throw new UserMoneyDetailException(1, "订单号为空");
        if (StringUtil.isNullOrEmpty(drawBack.getOrderItemId()))
            throw new UserMoneyDetailException(1, "子订单号为空");
        if (money == null)
            throw new UserMoneyDetailException(1, "退款金额为空");
        if (uid == null)
            throw new UserMoneyDetailException(1, "UID为空");
        UserMoneyDetail detail = new UserMoneyDetail();
        detail.setCreateTime(new Date());
        detail.setIdentifyCode(StringUtil
                .Md5(UserMoneyDetailTypeEnum.inviteWeiQuan.name() + "-" + uid + "-" + drawBack.getOrderItemId()));
        detail.setMoney(new BigDecimal("0").subtract(money));
        detail.setTitle(UserMoneyDetailTypeEnum.inviteWeiQuan.getDesc());
        detail.setSubTitle("订单售后");
        detail.setType(UserMoneyDetailTypeEnum.inviteWeiQuan);
        detail.setSourceIdentifyId(drawBack.getId());
        detail.setDescInfo("订单号:" + UserUtil.filterOrderId(drawBack.getOrderId()));
        detail.setUpdateTime(new Date());
        detail.setUserInfo(new UserInfo(uid));
        detail.setOrderType(Constant.SOURCE_TYPE_TAOBAO);
        return detail;
    }
    /**
     * 提现资金记录
     *
     * @param extract
     * @return
     */
    public static UserMoneyDetail createExtract(Extract extract, String alipayNo) throws UserMoneyDetailException {
        if (extract == null)
            throw new UserMoneyDetailException(1, "提现记录不能为空");
        if (extract.getId() == null)
            throw new UserMoneyDetailException(1, "提现记录主键不能为空");
        if (extract.getMoney() == null)
            throw new UserMoneyDetailException(1, "提现金额不能为空");
        if (extract.getUserInfo() == null || extract.getUserInfo().getId() == null)
            throw new UserMoneyDetailException(1, "提现用户不能为空");
        if (alipayNo != null && alipayNo.length() > 10)
            alipayNo = "*" + alipayNo.substring(alipayNo.length() - 10, alipayNo.length());
        UserMoneyDetail detail = new UserMoneyDetail();
        detail.setCreateTime(new Date());
        detail.setIdentifyCode(StringUtil.Md5(UserMoneyDetailTypeEnum.extract.name() + ":" + extract.getId()));
        detail.setMoney(new BigDecimal("0").subtract(extract.getMoney()));
        detail.setSourceIdentifyId(extract.getId());
        detail.setTitle(UserMoneyDetailTypeEnum.extractNew.getDesc());
        detail.setType(UserMoneyDetailTypeEnum.extractNew);
        detail.setUpdateTime(new Date());
        detail.setDescInfo("支付宝订单号:" + alipayNo);
        detail.setUserInfo(extract.getUserInfo());
        detail.setShow(false);
        return detail;
    }
    /**
     * 提现账号验证记录
     *
     * @param aa
     * @param money
     * @return
     * @throws UserMoneyDetailException
     */
    public static UserMoneyDetail createExtractAccountValid(AlipayAccountValidNormalHistory aa, BigDecimal money)
            throws UserMoneyDetailException {
        if (aa == null)
            throw new UserMoneyDetailException(1, "验证记录不能为空");
        if (aa.getUid() == null)
            throw new UserMoneyDetailException(1, "UID不能为空");
        if (money == null)
            throw new UserMoneyDetailException(1, "金额不能为空");
        UserMoneyDetail detail = new UserMoneyDetail();
        detail.setCreateTime(new Date());
        detail.setIdentifyCode(StringUtil.Md5(UserMoneyDetailTypeEnum.extractVerify.name() + ":" + aa.getId()));
        detail.setMoney(new BigDecimal("0").subtract(money));
        detail.setSourceIdentifyId(aa.getId());
        detail.setTitle(UserMoneyDetailTypeEnum.extractVerifyNew.getDesc());
        detail.setType(UserMoneyDetailTypeEnum.extractVerifyNew);
        detail.setUpdateTime(new Date());
        detail.setUserInfo(new UserInfo(aa.getUid()));
        detail.setDescInfo(String.format("支付宝:%s -姓名-%s", UserUtil.filterAlipayAccount(aa.getAccount()),
                UserUtil.filterAlipayName(aa.getName())));
        return detail;
    }
    /**
     * 系统扣除
     *
     * @param uid
     * @param money
     * @param desc
     * @return
     * @throws UserMoneyDetailException UserMoneyDetail 返回类型
     * @throws
     * @Title: createSystemTakeOff
     * @Description:
     */
    public static UserMoneyDetail createSystemTakeOff(Long uid, BigDecimal money, String desc)
            throws UserMoneyDetailException {
        if (uid == null)
            throw new UserMoneyDetailException(1, "UID不能为空");
        if (money == null)
            throw new UserMoneyDetailException(1, "金额不能为空");
        UserMoneyDetail detail = new UserMoneyDetail();
        detail.setCreateTime(new Date());
        detail.setIdentifyCode(
                StringUtil.Md5(uid + "-" + UserMoneyDetailTypeEnum.systemTakeOff.name() + System.currentTimeMillis()));
        detail.setMoney(new BigDecimal("0").subtract(money));
        detail.setTitle(UserMoneyDetailTypeEnum.systemTakeOff.getDesc());
        detail.setType(UserMoneyDetailTypeEnum.systemTakeOff);
        detail.setUpdateTime(new Date());
        detail.setUserInfo(new UserInfo(uid));
        detail.setDescInfo(desc);
        return detail;
    }
    /**
     * 提现拒绝
     *
     * @param extract
     * @return
     * @throws UserMoneyDetailException
     */
    public static UserMoneyDetail createExtractReject(Extract extract) throws UserMoneyDetailException {
        if (extract == null)
            throw new UserMoneyDetailException(1, "提现记录不能为空");
        if (extract.getId() == null)
            throw new UserMoneyDetailException(1, "提现记录主键不能为空");
        if (extract.getMoney() == null)
            throw new UserMoneyDetailException(1, "提现金额不能为空");
        if (extract.getUserInfo() == null || extract.getUserInfo().getId() == null)
            throw new UserMoneyDetailException(1, "提现用户不能为空");
        UserMoneyDetail detail = new UserMoneyDetail();
        detail.setCreateTime(new Date());
        detail.setIdentifyCode(StringUtil.Md5(UserMoneyDetailTypeEnum.extractReject.name() + ":" + extract.getId()));
        detail.setMoney(extract.getMoney());
        detail.setSourceIdentifyId(extract.getId());
        detail.setSubTitle("原路退回");
        detail.setTitle(UserMoneyDetailTypeEnum.extractReject.getDesc());
        detail.setType(UserMoneyDetailTypeEnum.extractReject);
        detail.setUpdateTime(new Date());
        detail.setUserInfo(extract.getUserInfo());
        detail.setShow(false);// 隐藏提现失败记录
        return detail;
    }
    /**
     * 系统红包
     *
     * @param hb
     * @return
     * @throws UserMoneyDetailException
     */
    private static UserMoneyDetail createHongBao(HongBao hb, String subTitle) throws UserMoneyDetailException {
        if (hb == null)
            throw new UserMoneyDetailException(1, "红包不能为空");
        if (hb.getUserInfo() == null)
            throw new UserMoneyDetailException(1, "用户不能为空");
        UserMoneyDetail detail = new UserMoneyDetail();
        detail.setCreateTime(new Date());
        detail.setIdentifyCode(
                StringUtil.Md5(UserMoneyDetailTypeEnum.hongbao.name() + "-" + subTitle + "-" + hb.getId()));
        detail.setMoney(hb.getMoney());
        detail.setSourceIdentifyId(hb.getId());
        detail.setTitle(UserMoneyDetailTypeEnum.hongbao.getDesc());
        detail.setSubTitle(subTitle);
        detail.setType(UserMoneyDetailTypeEnum.hongbao);
        detail.setUpdateTime(new Date());
        detail.setUserInfo(hb.getUserInfo());
        return detail;
    }
    private static UserMoneyDetail createHongBaoDeduct(HongBao hb, String subTitle) throws UserMoneyDetailException {
        if (hb == null)
            throw new UserMoneyDetailException(1, "红包不能为空");
        if (hb.getUserInfo() == null)
            throw new UserMoneyDetailException(1, "用户不能为空");
        UserMoneyDetail detail = new UserMoneyDetail();
        detail.setCreateTime(new Date());
        detail.setIdentifyCode(StringUtil.Md5(UserMoneyDetailTypeEnum.hongbaoDeduct.name() + "-" + subTitle + "-"
                + hb.getBeizhu() + "-" + hb.getId()));
        detail.setMoney(hb.getMoney());
        detail.setSourceIdentifyId(hb.getId());
        detail.setTitle(UserMoneyDetailTypeEnum.hongbaoDeduct.getDesc());
        detail.setSubTitle(subTitle);
        detail.setType(UserMoneyDetailTypeEnum.hongbaoDeduct);
        detail.setUpdateTime(new Date());
        detail.setUserInfo(hb.getUserInfo());
        return detail;
    }
    /**
     * 新人红包
     *
     * @param hb
     * @return
     * @throws UserMoneyDetailException
     */
    public static UserMoneyDetail createNewerHongBao(HongBao hb) throws UserMoneyDetailException {
        return createHongBao(hb, "新人红包");
    }
    /**
     * 新人红包扣除
     *
     * @param hb
     * @return
     * @throws UserMoneyDetailException
     */
    public static UserMoneyDetail createNewerHongBaoDeduct(HongBao hb) throws UserMoneyDetailException {
        return createHongBaoDeduct(hb, "新人红包扣除");
    }
    /**
     * 返利奖励
     *
     * @param orderId
     * @param money
     * @param user
     * @return
     * @throws UserMoneyDetailException
     */
    public static UserMoneyDetail createOrderReward(String orderId, int orderType, BigDecimal money,
                                                    BigDecimal originalMoney, UserInfo user) throws UserMoneyDetailException {
        if (StringUtil.isNullOrEmpty(orderId))
            throw new UserMoneyDetailException(1, "订单号不能为空");
        if (user == null)
            throw new UserMoneyDetailException(1, "UID不能为空");
        if (money == null)
            throw new UserMoneyDetailException(1, "金额不能为空");
        UserMoneyDetail detail = new UserMoneyDetail();
        detail.setCreateTime(new Date());
        detail.setIdentifyCode(StringUtil.Md5(UserMoneyDetailTypeEnum.hongbao.name() + "-" + "老版本" + "-" + orderId));
        detail.setMoney(money);
        detail.setTitle(UserMoneyDetailTypeEnum.orderRewardNew.getDesc());
        detail.setType(UserMoneyDetailTypeEnum.orderRewardNew);
        detail.setUpdateTime(new Date());
        detail.setUserInfo(user);
        detail.setOrderType(orderType);
        detail.setDescInfo(Constant.getSourceName(orderType) + ":" + orderId + "-原返利:" + originalMoney);
        return detail;
    }
    /**
     * 订单重复统计退款
     *
     * @param orderId
     * @param money
     * @param user
     * @return
     * @throws UserMoneyDetailException
     */
    public static UserMoneyDetail createRepeatStatistic(String orderId, int orderType, BigDecimal money, UserInfo user)
            throws UserMoneyDetailException {
        if (StringUtil.isNullOrEmpty(orderId))
            throw new UserMoneyDetailException(1, "订单号不能为空");
        if (user == null)
            throw new UserMoneyDetailException(1, "UID不能为空");
        if (money == null)
            throw new UserMoneyDetailException(1, "金额不能为空");
        UserMoneyDetail detail = new UserMoneyDetail();
        detail.setCreateTime(new Date());
        detail.setIdentifyCode(
                StringUtil.Md5(UserMoneyDetailTypeEnum.repeatStatistic.name() + "-" + orderId + "-" + user.getId()));
        detail.setMoney(money);
        detail.setTitle(UserMoneyDetailTypeEnum.repeatStatistic.getDesc());
        detail.setType(UserMoneyDetailTypeEnum.repeatStatistic);
        detail.setUpdateTime(new Date());
        detail.setUserInfo(user);
        detail.setDescInfo("订单号:" + orderId);
        detail.setOrderType(orderType);
        return detail;
    }
    public static UserMoneyDetail createSystemEqualize(String desc, BigDecimal money, UserInfo user)
            throws UserMoneyDetailException {
        if (user == null)
            throw new UserMoneyDetailException(1, "UID不能为空");
        if (money == null)
            throw new UserMoneyDetailException(1, "金额不能为空");
        UserMoneyDetail detail = new UserMoneyDetail();
        detail.setCreateTime(new Date());
        detail.setIdentifyCode(StringUtil.Md5(
                UserMoneyDetailTypeEnum.systemEqualize.name() + "-" + System.currentTimeMillis() + "-" + user.getId()));
        detail.setMoney(money);
        detail.setTitle(UserMoneyDetailTypeEnum.systemEqualizeNew.getDesc());
        detail.setType(UserMoneyDetailTypeEnum.systemEqualizeNew);
        detail.setUpdateTime(new Date());
        detail.setUserInfo(user);
        if (!StringUtil.isNullOrEmpty(desc)) {
            detail.setDescInfo(desc);
        }
        return detail;
    }
    public static UserMoneyDetail createScoreConvert(BigDecimal money, UserInfo user) throws UserMoneyDetailException {
        if (user == null)
            throw new UserMoneyDetailException(1, "UID不能为空");
        if (money == null)
            throw new UserMoneyDetailException(1, "金额不能为空");
        UserMoneyDetail detail = new UserMoneyDetail();
        detail.setCreateTime(new Date());
        detail.setIdentifyCode(StringUtil.Md5(
                UserMoneyDetailTypeEnum.scoreConvert.name() + "-" + System.currentTimeMillis() + "-" + user.getId()));
        detail.setMoney(money);
        detail.setTitle(UserMoneyDetailTypeEnum.scoreConvert.getDesc());
        detail.setType(UserMoneyDetailTypeEnum.scoreConvert);
        detail.setUpdateTime(new Date());
        detail.setUserInfo(user);
        return detail;
    }
    /**
     * 邀请奖金到账
     *
     * @param uid
     * @param money
     * @param time
     * @return
     * @throws UserMoneyDetailException
     */
    public static UserMoneyDetail createInviteSubsidy(Long uid, int orderType, BigDecimal money, Date time)
            throws UserMoneyDetailException {
        if (money == null)
            throw new UserMoneyDetailException(1, "返利金额为空");
        if (uid == null)
            throw new UserMoneyDetailException(1, "UID为空");
        if (time == null)
            throw new UserMoneyDetailException(1, "发生时间为空");
        Calendar ca = Calendar.getInstance();
        ca.setTime(time);
        ca.add(Calendar.MONTH, -1);
        String timeF = TimeUtil.getGernalTime(ca.getTimeInMillis(), "yyyy.M");
        UserMoneyDetail detail = new UserMoneyDetail();
        detail.setCreateTime(new Date());
        detail.setIdentifyCode(
                StringUtil.Md5(UserMoneyDetailTypeEnum.subsidy.name() + "-" + orderType + "-" + uid + "-" + timeF));
        detail.setMoney(money);
        detail.setTitle(
                timeF + UserMoneyDetailTypeEnum.subsidy.getDesc() + "【" + Constant.getSourceName(orderType) + "】");
        detail.setType(UserMoneyDetailTypeEnum.subsidy);
        detail.setDescInfo("邀请订单补贴");
        detail.setUpdateTime(new Date());
        detail.setUserInfo(new UserInfo(uid));
        detail.setOrderType(orderType);
        return detail;
    }
    /**
     * 团队收益
     *
     * @param uid
     * @param money
     * @param time
     * @return
     * @throws UserMoneyDetailException UserMoneyDetail 返回类型
     * @throws
     * @Title: createTeamReward
     * @Description:
     */
    public static UserMoneyDetail createTeamReward(Long uid, BigDecimal money, Date time)
            throws UserMoneyDetailException {
        if (money == null)
            throw new UserMoneyDetailException(1, "返利金额为空");
        if (uid == null)
            throw new UserMoneyDetailException(1, "UID为空");
        if (time == null)
            throw new UserMoneyDetailException(1, "发生时间为空");
        Calendar ca = Calendar.getInstance();
        ca.setTime(time);
        ca.add(Calendar.MONTH, -1);
        String timeF = TimeUtil.getGernalTime(ca.getTimeInMillis(), "yyyy年M月");
        UserMoneyDetail detail = new UserMoneyDetail();
        detail.setCreateTime(new Date());
        detail.setIdentifyCode(StringUtil.Md5(UserMoneyDetailTypeEnum.teamReward.name() + "-" + uid + "-" + timeF));
        detail.setMoney(money);
        detail.setTitle(UserMoneyDetailTypeEnum.teamReward.getDesc());
        detail.setType(UserMoneyDetailTypeEnum.teamReward);
        detail.setDescInfo(timeF);
        detail.setUpdateTime(new Date());
        detail.setUserInfo(new UserInfo(uid));
        return detail;
    }
    /**
     * 团队分红
     *
     * @param uid
     * @param money
     * @param time
     * @return
     * @throws UserMoneyDetailException UserMoneyDetail 返回类型
     * @throws
     * @Title: createTeamDividents
     * @Description:
     */
    public static UserMoneyDetail createTeamDividents(Long uid, BigDecimal money, Date time)
            throws UserMoneyDetailException {
        if (money == null)
            throw new UserMoneyDetailException(1, "返利金额为空");
        if (uid == null)
            throw new UserMoneyDetailException(1, "UID为空");
        if (time == null)
            throw new UserMoneyDetailException(1, "发生时间为空");
        Calendar ca = Calendar.getInstance();
        ca.setTime(time);
        ca.add(Calendar.MONTH, -1);
        String timeF = TimeUtil.getGernalTime(ca.getTimeInMillis(), "yyyy年M月");
        UserMoneyDetail detail = new UserMoneyDetail();
        detail.setCreateTime(new Date());
        detail.setIdentifyCode(StringUtil.Md5(UserMoneyDetailTypeEnum.teamDividents.name() + "-" + uid + "-" + timeF));
        detail.setMoney(money);
        detail.setTitle(UserMoneyDetailTypeEnum.teamDividents.getDesc());
        detail.setType(UserMoneyDetailTypeEnum.teamDividents);
        detail.setDescInfo(timeF);
        detail.setUpdateTime(new Date());
        detail.setUserInfo(new UserInfo(uid));
        return detail;
    }
    public static void main(String[] args) {
    }
}