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<String,Object> sendWxPay(String url,String path,TransfersDto dto, UserAccountModel userAccount,String mobilePhone,String oldMoney){
|
Map<String,Object> 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<String, Object> queryPayInfoDetail(String payOrderId){
|
Map<String, Object> 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);
|
}
|
}
|