package com.ibeetl.admin.console.service.pay; import cn.hutool.core.util.IdUtil; import com.ibeetl.admin.console.dao.MoneyConsoleDao; import com.ibeetl.admin.console.dao.PayConsoleDao; import com.ibeetl.admin.console.model.*; import com.ibeetl.admin.console.rabbitmq.MqConstants; import com.ibeetl.admin.console.rabbitmq.MqUtil; import com.ibeetl.admin.console.service.CuserConsoleService; import com.ibeetl.admin.console.service.XzxAccountInfoService; import com.ibeetl.admin.console.service.pay.utils.WechatpayUtil; import com.ibeetl.admin.console.service.pay.utils.entity.ResultEntity; import com.ibeetl.admin.console.service.pay.utils.entity.TransfersDto; import com.ibeetl.admin.core.entity.CoreUser; import com.ibeetl.admin.core.entity.PayLog; import com.ibeetl.admin.core.entity.XzxAccountInfo; import com.ibeetl.admin.core.service.CorePlatformService; import com.ibeetl.admin.core.util.payutil.WxRequestParam; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; import java.math.RoundingMode; import java.text.DecimalFormat; import java.text.SimpleDateFormat; import java.util.Date; import java.util.HashMap; import java.util.Map; @Service @Slf4j public class PayService { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); @Autowired PayConsoleDao dao; @Autowired MoneyConsoleDao moneyConsoleDao; @Autowired WxRequestParam wxRequestParam; @Autowired CuserConsoleService cuserConsoleService; /*@Autowired MqUtil mqUtil;*/ @Autowired XzxAccountInfoService xzxAccountInfoService; @Autowired CorePlatformService platformService; public Map sendWxPay(String url,String path,TransfersDto dto, UserAccountModel userAccount,String mobilePhone,String oldMoney){ Map map = new HashMap<>(); String param=WechatpayUtil.getStringBuild(dto); PayLog payLog =insertLog(dto,userAccount,param); ResultEntity iResult = WechatpayUtil.doTransfers(url,path,dto,userAccount,param); payLog.setResponseData(iResult.getMsg()); if(!"执行成功".equals(iResult.getMsg())){ payLog.setPayStatus("2"); dao.updatePaylogResponseData(payLog); map.put("code",-1); }else{ map.put("code",0); } map.put("data",iResult.getMsg()); String ua = updateAccount(iResult, payLog,dto.getPayOrderId(),mobilePhone,oldMoney); System.out.println(dto.getUserId()+"=== 提现单号==="+dto.getPayOrderId()+"提现操作结果======"+ua); return map; } /** * 企业提现零钱接口 * @param dto * @param userAccount */ private PayLog insertLog(TransfersDto dto, UserAccountModel userAccount, String param){ // 添加账户log请求前信息 PayLog payLog = new PayLog(); payLog.setId(IdUtil.getSnowflake(1, 3).nextId()); payLog.setAccountBeforeMoney(userAccount.getMoney()); payLog.setUserId(dto.getUserId()); payLog.setAccountId(userAccount.getAccountId()); payLog.setWxOpenid(dto.getOpenid()); payLog.setCreateTime(sdf.format(new Date())); payLog.setPayStatus("0"); //因为接口使用的是以分为单位,所以需要转为元 String a = new BigDecimal(dto.getAmount()).divide(new BigDecimal("100"),2, RoundingMode.HALF_UP).toString(); payLog.setMoney(Double.valueOf(a)); payLog.setWithdrawBeforeMoney(Double.parseDouble("0")); payLog.setMchBillno(dto.getPayOrderId()); payLog.setRequestParams(param); if(dao.insertPaylog(payLog) == 0){ return null; }else{ return payLog; } } public static double subDouble(double m1, double m2) { BigDecimal p1 = new BigDecimal(Double.toString(m1)); BigDecimal p2 = new BigDecimal(Double.toString(m2)); BigDecimal p3 =p1.subtract(p2); return p3.setScale(2, BigDecimal.ROUND_DOWN).doubleValue(); } public static void main(String[] args) { } @Transactional String updateAccount(ResultEntity entity, PayLog payLog,String payOrderId,String mobilePhone,String oldMoney){ if(!"执行成功".equals(entity.getMsg())){ payLog.setPayStatus("2"); dao.updatePaylogResponseData(payLog); MoneyModel moneyModel = new MoneyModel(); moneyModel.setPayOrderId(payOrderId); moneyModel.setPayFlag("3"); moneyModel.setUnpassReason(entity.getMsg()); moneyConsoleDao.updateMoneyApi(moneyModel); return entity.getMsg(); } UserAccountModel userAccountModel1 = cuserConsoleService.queryAccountInfo(payLog.getUserId(), mobilePhone); double mm = subDouble(userAccountModel1.getMoney(),payLog.getMoney()); PayLog newPl = new PayLog(); newPl.setAccountId(payLog.getAccountId()); newPl.setMoney(mm); // 更新账号余额 if(dao.updateAccountMoneyDouble(newPl) > 0){ // 更新订单表的状态 MoneyModel moneyModel = new MoneyModel(); moneyModel.setPayOrderId(payOrderId); moneyModel.setPayFlag("2"); moneyModel.setUnpassReason("提现成功"); moneyConsoleDao.updateMoneyApi(moneyModel); payLog.setPayStatus("1"); payLog.setAccountAfterMoney(Double.parseDouble("0")); dao.updatePaylogMoney(payLog); //写入消息列表中 String message = "您的提现已经到了:"+payLog.getMoney()+"元,提现单号:"+payOrderId+",请注意查收."; dao.insertMessage(message,payLog.getUserId(),"","1","提现",sdf.format(new Date())); //写入账户日志表 xzx_account_log //dao.insertAccountLog(); UserAccountModel userAccountModel = cuserConsoleService.queryAccountInfo(payLog.getUserId(), mobilePhone); //BigDecimal oldMoney = new BigDecimal(userAccountModel.getMoney()).add(new BigDecimal(payLog.getMoney())); AccountLogModel model = new AccountLogModel(); model.setAccountId(userAccountModel.getAccountId()); model.setChannelType("2"); model.setCreateTime(sdf.format(new Date())); model.setCreateUserId(userAccountModel.getUserId()); model.setNewFixedLimit(userAccountModel.getFixedLimit()); model.setNewLimit(userAccountModel.getOverdraftLimit()); model.setNewMoney(String.valueOf(userAccountModel.getMoney())); model.setOldFixedLimit(userAccountModel.getFixedLimit()); model.setOldLimit(userAccountModel.getOverdraftLimit()); model.setOldMoney(oldMoney.toString()); model.setOrderId(payOrderId); dao.insertAccountLog(model); return entity.getMsg(); }else{ payLog.setRemark("支付成功,但是余额未扣除成功,原因待查"); dao.updatePaylogRemark(payLog); } return "账户余额更新失败"; } private XzxAccountLogModel getAccountLog(XzxAccountInfo accountInfo,String money){ XzxAccountLogModel model = new XzxAccountLogModel(); model.setOrderId(""); model.setChannelType(9); model.setCreateTime(sdf.format(new Date())); CoreUser user = platformService.getCurrentUser(); model.setCreateUserId(Long.toString(user.getId())); model.setAccountId(accountInfo.getAccountId()); model.setOldMoney(accountInfo.getMoney()); model.setNewMoney(new BigDecimal(accountInfo.getMoney()).add(new BigDecimal(money)).toString()); model.setOldLimit(accountInfo.getOverdraftLimit()); model.setNewLimit(accountInfo.getOverdraftLimit()); model.setOldFixedLimit(accountInfo.getFixedLimit()); model.setNewFixedLimit(accountInfo.getFixedLimit()); return model; } public Map queryPayInfoDetail(String payOrderId){ Map map = moneyConsoleDao.queryPayInfoDetail(payOrderId); if(!"1".equals(map.get("usertype"))){ String roleName = moneyConsoleDao.queryPayInfoUserRole(map.get("usertype").toString()); map.put("roleName",roleName); }else{ map.put("roleName","普通用户"); } if(map.get("status").equals("2")){ map.put("statusName","已审核"); }else if(map.get("status").equals("3")){ map.put("statusName","审核未通过"); }else{ map.put("statusName","待审核"); } return map; } public int addReason(String payOrderId, String userId, String reason){ return dao.addReason(payOrderId,userId,reason); } }