packagecom.enation.app.javashop.core.trade.deposite.service.impl;importcom.enation.app.javashop.core.client.member.DepositeClient;importcom.enation.app.javashop.core.member.model.dto.DepositeParamDTO;importcom.enation.app.javashop.core.payment.model.dos.PaymentBillDO;importcom.enation.app.javashop.core.payment.service.PaymentBillManager;importcom.enation.app.javashop.core.statistics.util.DateUtil;importcom.enation.app.javashop.core.trade.TradeErrorCode;importcom.enation.app.javashop.core.trade.deposite.model.dos.RechargeDO;importcom.enation.app.javashop.core.trade.deposite.service.RechargeManager;importcom.enation.app.javashop.core.trade.order.model.enums.PayStatusEnum;importcom.enation.app.javashop.core.trade.order.model.enums.TradeTypeEnum;importcom.enation.app.javashop.framework.context.UserContext;importcom.enation.app.javashop.framework.exception.ServiceException;importcom.enation.app.javashop.framework.security.model.Buyer;importcom.enation.app.javashop.framework.util.CurrencyUtil;importcom.enation.app.javashop.framework.util.SqlSplicingUtil;importcom.enation.app.javashop.framework.util.StringUtil;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.beans.factory.annotation.Qualifier;importorg.springframework.stereotype.Service;importorg.springframework.transaction.annotation.Propagation;importorg.springframework.transaction.annotation.Transactional;importcom.enation.app.javashop.framework.database.DaoSupport;importcom.enation.app.javashop.framework.database.Page;importjava.util.ArrayList;importjava.util.Date;importjava.util.List;/*** 充值记录业务类
*@authorliuyulei
*@versionv1.0
*@sincev7.1.5
* 2019-12-30 16:38:45*/@Servicepublic class RechargeManagerImpl implementsRechargeManager {
@Autowired
@Qualifier("tradeDaoSupport")privateDaoSupport daoSupport;
@AutowiredprivatePaymentBillManager paymentBillManager;
@AutowiredprivateDepositeClient depositeClient;
@Override
@Transactional(value= "tradeTransactionManager",propagation = Propagation.REQUIRED,rollbackFor=Exception.class)publicRechargeDO recharge(Double money) {
Buyer buyer=UserContext.getBuyer();//本金额支付次数
int times = 0;//账单编号格式: 年月日+ memberID掩码 + 价格掩码 +支付次数//掩码均为5位数,不足前面补零
String snPrefix = createSn(buyer.getUid(), "D", money);
String sn= snPrefix +times;
RechargeDO rechargeDO= this.getModel(sn);if(rechargeDO == null){//整合充值订单数据
rechargeDO = newRechargeDO(sn,buyer.getUid(),buyer.getUsername(),money);//添加充值订单
createBill(rechargeDO);
}else{//如果是已付款
if(!PayStatusEnum.PAY_NO.name().equals(rechargeDO.getPayStatus())){//获取到已支付次数
times = Integer.parseInt(sn.substring(19, sn.length()));//循环生成sn
while (true) {
times++;
sn= snPrefix +times;
RechargeDO rechargeTemp= this.getModel(sn);//找到一个没有使用过的 就可以break了
if (rechargeTemp == null) {break;
}
}//充值订单已经被支付,则表示当天再次支付
rechargeDO.setRechargeSn(sn);
rechargeDO.setPayStatus(PayStatusEnum.PAY_NO.name());
createBill(rechargeDO);
}//如果没有被支付则不用创建充值订单,再次为此订单支付即可
}returnrechargeDO;
}
@Override
@Transactional(value= "tradeTransactionManager",propagation = Propagation.REQUIRED,rollbackFor=Exception.class)public voidpaySuccess(String sn, Double price) {
RechargeDO rechargeDO= this.getModel(sn);if(!rechargeDO.getRechargeMoney().equals(price)){throw new ServiceException(TradeErrorCode.E454.code(), "付款金额和应付金额不一致");
}this.daoSupport.execute("update es_deposite_recharge set pay_status = ? where recharge_sn = ? ",PayStatusEnum.PAY_YES.name(),sn);//增加会员预存款 余额
depositeClient.increase(price,rechargeDO.getMemberId(),"会员充值,充值单号:" +rechargeDO.getRechargeSn());
}
@Override
@Transactional(value= "tradeTransactionManager",propagation = Propagation.REQUIRED,rollbackFor=Exception.class)public voidupdatePaymentMethod(String subSn, String pluginId, String methodName) {
String sql= "update es_deposite_recharge set payment_plugin_id = ?,recharge_way = ?, pay_time = ? where recharge_sn = ? ";this.daoSupport.execute(sql,pluginId,methodName, DateUtil.getDateline(),subSn);
}
@OverridepublicPage list(DepositeParamDTO paramDTO){
StringBuffer sql= new StringBuffer("select * from es_deposite_recharge ");
List whereSql = new ArrayList<>();
List term = new ArrayList<>();//根据会员名称查询
if(!StringUtil.isEmpty(paramDTO.getMemberName())){
whereSql.add(" member_name = ? ");
term.add(paramDTO.getMemberName());
}//根据会员id查询
if(paramDTO.getMemberId() != null){
whereSql.add(" member_id = ? ");
term.add(paramDTO.getMemberId());
}//根据充值编号查询
if(!StringUtil.isEmpty(paramDTO.getSn()) ){
whereSql.add(" recharge_sn = ? ");
term.add(paramDTO.getSn());
}//根据充值编号查询
if(!StringUtil.isEmpty(paramDTO.getSn()) ){
whereSql.add(" recharge_sn = ? ");
term.add(paramDTO.getSn());
}//根据充值时间查询
if(paramDTO.getStartTime() != null){
whereSql.add(" recharge_time >= ? ");
term.add(paramDTO.getStartTime());
}//根据充值时间查询
if(paramDTO.getStartTime() != null){
whereSql.add(" recharge_time <= ? ");
term.add(paramDTO.getEndTime());
}
whereSql.add(" pay_status = ? ");
term.add(PayStatusEnum.PAY_YES.name());//拼接sql
sql.append(SqlSplicingUtil.sqlSplicing(whereSql));
sql.append("order by recharge_time desc");
Page webPage= this.daoSupport.queryForPage(sql.toString(),paramDTO.getPageNo(), paramDTO.getPageSize() , RechargeDO.class,term.toArray() );returnwebPage;
}
@OverridepublicDouble getPrice(String sn) {return this.daoSupport.queryForDouble("select recharge_money from es_deposite_recharge where recharge_sn = ? ",sn);
}
@OverridepublicRechargeDO getModel(String sn) {return this.daoSupport.queryForObject("select * from es_deposite_recharge where recharge_sn = ? ",RechargeDO.class,sn);
}privateString mask(String str) {
String mask= "000000";
mask= mask +str;
mask= mask.substring(mask.length() - 5);returnmask;
}privateString createSn(Integer memberId,String prefix,Double price) {
String memberMask= mask("" +memberId);
String priceMask= mask("" + CurrencyUtil.mul(price,100).intValue());
String snPrefix= prefix + DateUtil.toString(new Date(), "yyyyMMdd") + memberMask +priceMask;returnsnPrefix;
}private voidcreateBill(RechargeDO rechargeDO) {
daoSupport.insert(rechargeDO);//创建充值 支付 账单数据
PaymentBillDO paymentBillDO = newPaymentBillDO();
paymentBillDO.setSubSn(rechargeDO.getRechargeSn());
paymentBillDO.setTradePrice(rechargeDO.getRechargeMoney());
paymentBillDO.setServiceType(TradeTypeEnum.RECHARGE.name());
paymentBillManager.add(paymentBillDO);
}
}