package com.stylefeng.guns.modular.account.controller; import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUtil; import cn.hutool.crypto.SecureUtil; import cn.hutool.http.HttpStatus; import cn.hutool.http.HttpUtil; import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.stylefeng.guns.core.shiro.ShiroKit; import com.stylefeng.guns.core.util.ToolUtil; import com.stylefeng.guns.modular.account.model.ElectronicLedger; import com.stylefeng.guns.modular.account.model.TUserBankAccount; import com.stylefeng.guns.modular.account.req.UserWithdrawalReq; import com.stylefeng.guns.modular.account.server.ElectronicLedgerService; import com.stylefeng.guns.modular.account.server.UserBankAccountService; import com.stylefeng.guns.modular.account.server.UserWithdrawalService; import com.stylefeng.guns.modular.account.util.Base64Util; import com.stylefeng.guns.modular.account.util.OssUploadUtil; import com.stylefeng.guns.modular.cloudPayment.example.*; import com.stylefeng.guns.modular.cloudPayment.req.BalanceAcctReq; import com.stylefeng.guns.modular.cloudPayment.req.UserBankAccountReq; import com.stylefeng.guns.modular.huifu.biz.DouGongBasicDataBiz; import com.stylefeng.guns.modular.system.model.*; import com.stylefeng.guns.modular.system.service.IBankCardService; import com.stylefeng.guns.modular.system.service.ICompanyService; import com.stylefeng.guns.modular.system.service.IUserInfoService; import com.stylefeng.guns.modular.system.service.IUserService; import com.stylefeng.guns.modular.system.util.ResultUtil; import com.unionpay.upyzt.exception.UpyztException; import com.unionpay.upyzt.param.FailureMsgParam; import com.unionpay.upyzt.resp.*; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; import org.apache.shiro.util.StringUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import java.io.UnsupportedEncodingException; import java.math.BigDecimal; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.List; import java.util.Map; import java.util.Objects; @Api(tags = "用户进件(提现操作)/创建电子账簿") @RestController @Slf4j @RequestMapping("/api/electronicLedger") public class ElectronicLedgerController { @Autowired private ElectronicLedgerService electronicLedgerService; @Resource private UserWithdrawalService userWithdrawalService; @Resource private UserBankAccountService userBankAccountService; @Resource private IUserService userService; @Autowired private IBankCardService bankCardService; @Autowired private DouGongBasicDataBiz douGongBasicDataBiz; @ResponseBody @RequestMapping(value = "/addElectronicLedger", method = RequestMethod.POST) @ApiOperation(value = "用户进件(提现操作)", tags = {"用户端-用户进件(提现操作)"}, notes = "") @ApiImplicitParams({ @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....") }) @Transactional(rollbackFor = UpyztException.class,propagation = Propagation.REQUIRES_NEW) public ResultUtil addElectronicLedger( UserWithdrawalReq userWithdrawalReq,HttpServletRequest request) { System.out.println("进件信息:"+userWithdrawalReq); // TODO 用户有无提现密码,无则设置开户密码 if(StringUtils.hasLength(userWithdrawalReq.getBankName())){ userWithdrawalReq.setBankName(userWithdrawalReq.getBankName().replace("& #40;","(")); userWithdrawalReq.setBankName(userWithdrawalReq.getBankName().replace("& #41;",")")); } // userWithdrawalReq.setOpenAccountName(new String(userWithdrawalReq.getOpenAccountName().getBytes("ISO-8859-1"),"UTF-8")); // userWithdrawalReq.setBankName(new String(userWithdrawalReq.getBankName().getBytes("ISO-8859-1"),"UTF-8")); // userWithdrawalReq.setCertificateName(new String(userWithdrawalReq.getCertificateName().getBytes("ISO-8859-1"),"UTF-8")); // userWithdrawalReq.setLicenceIssuingAuthority(new String(userWithdrawalReq.getLicenceIssuingAuthority().getBytes("ISO-8859-1"),"UTF-8")); System.out.println("编码后:"+userWithdrawalReq); userWithdrawalReq.setOutRequestNo(ToolUtil.getRandomString(32)); UserWithdrawal userWithdrawal = new UserWithdrawal(); BeanUtils.copyProperties(userWithdrawalReq,userWithdrawal); try { //String password=userWithdrawal.getTransactionAuthorizationCode(); Integer id = userInfoService.getUserIdFormRedis(request); if(null == id){ return ResultUtil.tokenErr(); } System.out.println("验证码:"+userWithdrawalReq.getCode()); userWithdrawalReq.setCopy1(userWithdrawalReq.getCopy1().replaceAll(" ","+")); userWithdrawalReq.setCopy2(userWithdrawalReq.getCopy2().replaceAll(" ","+")); // 用户进件 Map resultMap = douGongBasicDataBiz.userBasicDataIndv(userWithdrawal); String respCode = (String) resultMap.get("resp_code"); //CusApplicationResp cusApplicationResp = CusApplicationExample.create(userWithdrawalReq); if(!"00000000".equals(respCode)) { return ResultUtil.error((String) resultMap.get("resp_desc")); } //userWithdrawal.setTransactionAuthorizationCode(Base64Util.encode(password)); userWithdrawal.setUserType(1); userWithdrawal.setUserId(id); userWithdrawal.setImgUrl(userWithdrawalReq.getIdCardFrontPicture()); userWithdrawal.setImgUrlOne(userWithdrawalReq.getIdCardReversePicture()); userWithdrawal.setIdCardFrontPicture(userWithdrawalReq.getCopy1()); userWithdrawal.setIdCardReversePicture(userWithdrawalReq.getCopy2()); userWithdrawal.setHuifuId((String) resultMap.get("huifu_id")); //调用汇付业务入驻接口 Map map = douGongBasicDataBiz.userBusinessOpen(userWithdrawal); if (!"00000000".equals(map.get("resp_code"))){ return ResultUtil.error((String) map.get("resp_desc")); } String tokenNo = (String) map.get("token_no"); userWithdrawal.setTokenNo(tokenNo); userWithdrawal.setType(1); userWithdrawalService.insert(userWithdrawal); // 开通电子账簿 /* BalanceAcctReq balanceAcctReq = new BalanceAcctReq(); balanceAcctReq.setCusId(userWithdrawal1.getCusId()); balanceAcctReq.setOutRequestNo(ToolUtil.getRandomString(32)); balanceAcctReq.setPassword(password); ElectronicLedger electronicLedger = new ElectronicLedger(); electronicLedger.setBalanceAcctId(cusApplicationResp.getBalanceAcctId()); electronicLedger.setCreateTime(new Date()); electronicLedger.setCusId(cusApplicationResp.getCusId()); electronicLedger.setOutRequestNo(cusApplicationResp.getOutRequestNo()); electronicLedger.setUserId(userWithdrawal.getUserId()); electronicLedger.setPassword(SecureUtil.md5(password)); electronicLedger.setRelAcctNo(cusApplicationResp.getRelAcctNo()); electronicLedger.setUserType(1); electronicLedgerService.insert(electronicLedger);*/ // 绑卡 存卡 UserBankAccount userBankAccount = new UserBankAccount(); userBankAccount.setBankAcctType("1"); userBankAccount.setOutRequestNo(ToolUtil.getRandomString(32)); userBankAccount.setUserType(1); userBankAccount.setCreateTime(new Date()); userBankAccount.setBankCardCode(userWithdrawal.getBankCardCode()); // TODO 页面没有输入地方 需要查询 userBankAccount.setBankCode(userWithdrawal.getBankCode()); // TODO 行联号 userBankAccount.setBankBranchCode(userWithdrawal.getBankBranchCode()); userBankAccount.setPhone(userWithdrawal.getPhone()); userBankAccount.setUserId(userWithdrawal.getUserId()); userBankAccount.setBankName(userWithdrawal.getBankName()); userBankAccount.setOpenAccountName(userWithdrawalReq.getOpenAccountName()); int count = userBankAccountService.selectCount(new EntityWrapper() .eq("bankCardCode", userWithdrawalReq.getBankCardCode()).eq("phone",userWithdrawalReq.getPhone()).eq("status",1)); if(count<1){ userBankAccountService.insert(userBankAccount); } BankCard bankCard = new BankCard(); bankCard.setDriverId(userWithdrawal.getUserId()); bankCard.setBankAcctType("1"); bankCard.setOutRequestNo(ToolUtil.getRandomString(32)); bankCard.setInsertTime(new Date()); bankCard.setCode(userWithdrawal.getBankCardCode()); bankCard.setBankCode(userWithdrawal.getBankCode()); bankCard.setBankBranchCode(userWithdrawal.getBankBranchCode()); bankCard.setBank(userWithdrawal.getBankName()); bankCard.setPhone(userWithdrawal.getPhone()); bankCard.setName(userWithdrawal.getOpenAccountName()); bankCard.setIfDefault(true); bankCardService.insert(bankCard); /* UserBankAccountReq userBankAccountReq = new UserBankAccountReq(); BeanUtils.copyProperties(userBankAccount, userBankAccountReq); System.err.println(userWithdrawalReq.getCode()); userBankAccountReq.setCusId(cusApplicationResp.getCusId()); userBankAccountReq.setCode(userWithdrawalReq.getCode());*/ return ResultUtil.success(); }catch (Exception e){ log.error("用户进件失败", e); String message = e.getMessage(); return ResultUtil.error(message); } } @ResponseBody @RequestMapping(value = "/updateElectronicLedgerInfo", method = RequestMethod.POST) @ApiOperation(value = "用户修改进件信息", tags = {"用户端-用户修改进件信息"}, notes = "") @ApiImplicitParams({ @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....") }) public ResultUtil updateElectronicLedgerInfo(String idCardFrontPicture, String idCardReversePicture, String certificateCode, String certificateName, String certificateExpireTime, String openAccountName, String bankCardCode, String phone, String bankBranchCode, String bankName, String copy1, String copy2, String code, String bankCode, String bankCardProvinceCode, String bankCardCityCode, HttpServletRequest request){ try { Integer driverId = userInfoService.getUserIdFormRedis(request); if(null == driverId){ return ResultUtil.tokenErr(); } UserInfo userInfo = userInfoService.selectById(driverId); UserWithdrawal userWithdrawal1 = userWithdrawalService.selectOne(new EntityWrapper() .eq("phone", userInfo.getPhone()).eq("type", 1) .last("LIMIT 1")); if(userWithdrawal1==null|| userWithdrawal1.getHuifuId()==null){ return ResultUtil.runErr(); } UserWithdrawal userWithdrawal = new UserWithdrawal(); userWithdrawal.setIdCardFrontPicture(copy1); userWithdrawal.setIdCardReversePicture(copy2); userWithdrawal.setCertificateCode(certificateCode); userWithdrawal.setCertificateName(certificateName); userWithdrawal.setCertificateExpireTime(certificateExpireTime); userWithdrawal.setOpenAccountName(openAccountName); userWithdrawal.setBankCardCode(bankCardCode); userWithdrawal.setPhone(phone); userWithdrawal.setCusId(userWithdrawal1.getCusId()); userWithdrawal.setBankBranchCode(bankBranchCode); userWithdrawal.setBankName(bankName); userWithdrawal.setCode(code); userWithdrawal.setBankCode(bankCode); userWithdrawal.setBankCardProvinceCode(bankCardProvinceCode); userWithdrawal.setBankCardCityCode(bankCardCityCode); //CusApplicationResp renew = CusApplicationExample.renew(userWithdrawal); Map resultMap = douGongBasicDataBiz.userBasicDataIndvModify(userWithdrawal); if (!"00000000".equals(resultMap.get("resp_code"))){ return ResultUtil.error((String) resultMap.get("resp_desc")); } //调用用户业务入驻修改 Map map = douGongBasicDataBiz.userBusinessOpenModify(userWithdrawal); if (!"00000000".equals(map.get("resp_code"))){ return ResultUtil.error((String) map.get("resp_desc")); } userWithdrawal1.setIdCardFrontPicture(copy1); userWithdrawal1.setIdCardReversePicture(copy2); userWithdrawal1.setCertificateCode(certificateCode); userWithdrawal1.setCertificateName(certificateName); userWithdrawal1.setCertificateExpireTime(certificateExpireTime); userWithdrawal1.setOpenAccountName(openAccountName); userWithdrawal1.setBankCardCode(bankCardCode); userWithdrawal1.setPhone(phone); userWithdrawal1.setBankName(bankName); userWithdrawal1.setImgUrl(idCardFrontPicture); userWithdrawal1.setImgUrlOne(idCardReversePicture); userWithdrawal1.setHuifuId((String) resultMap.get("huifu_id")); userWithdrawal1.setTokenNo((String) map.get("token_no")); userWithdrawalService.updateById(userWithdrawal1); int count = userBankAccountService.selectCount(new EntityWrapper() .eq("bankCardCode", bankCardCode).eq("userId",driverId).eq("userType",1).eq("status",1)); System.out.println(count); if(count<1){ UserBankAccount userBankAccount = new UserBankAccount(); userBankAccount.setBankAcctType("1"); userBankAccount.setOutRequestNo(ToolUtil.getRandomString(32)); userBankAccount.setUserType(1); userBankAccount.setCreateTime(new Date()); userBankAccount.setBankCardCode(userWithdrawal.getBankCardCode()); userBankAccount.setBankCode(userWithdrawal.getBankCode()); userBankAccount.setBankBranchCode(userWithdrawal.getBankBranchCode()); userBankAccount.setPhone(userWithdrawal.getPhone()); userBankAccount.setUserId(driverId); userBankAccount.setBankName(userWithdrawal.getBankName()); userBankAccountService.insert(userBankAccount); BankCard bankCard = new BankCard(); bankCard.setDriverId(userWithdrawal.getUserId()); bankCard.setBankAcctType("1"); bankCard.setOutRequestNo(ToolUtil.getRandomString(32)); bankCard.setInsertTime(new Date()); bankCard.setCode(userWithdrawal.getBankCardCode()); bankCard.setBankCode(userWithdrawal.getBankCode()); bankCard.setBankBranchCode(userWithdrawal.getBankBranchCode()); bankCard.setBank(userWithdrawal.getBankName()); bankCard.setPhone(userWithdrawal.getPhone()); bankCard.setName(userWithdrawal.getOpenAccountName()); bankCard.setIfDefault(true); bankCardService.insert(bankCard); } return ResultUtil.success(); }catch (Exception e) { e.printStackTrace(); String message = e.getMessage(); return ResultUtil.error(message); } } @Autowired private IUserInfoService userInfoService; @ResponseBody @RequestMapping(value = "/isElectronicLedger", method = RequestMethod.POST) @ApiOperation(value = "用户是否需要创建电子账簿", tags = {"用户端-用户是否需要创建电子账簿"}, notes = "") @ApiImplicitParams({ }) public ResultUtil addElectronicLedger(HttpServletRequest request){ try { Integer id = userInfoService.getUserIdFormRedis(request); if(null == id){ return ResultUtil.tokenErr(); } UserInfo userInfo = userInfoService.selectById(id); List userId = userWithdrawalService.selectList(new EntityWrapper().eq("phone", userInfo.getPhone()).eq("type", 1)); if(userId.size()==0){ return ResultUtil.success("yes"); } return ResultUtil.success("no"); }catch (Exception e){ e.printStackTrace(); return ResultUtil.runErr(); } } @ResponseBody @RequestMapping(value = "/getUserInfo", method = RequestMethod.POST) @ApiOperation(value = "用户进件信息", tags = {"用户端-用户进件信息"}, notes = "") @ApiImplicitParams({ @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....") }) public ResultUtil getUserInfo(HttpServletRequest request){ try { Integer id = userInfoService.getUserIdFormRedis(request); if(null == id){ return ResultUtil.tokenErr(); } UserInfo userInfo = userInfoService.selectById(id); UserWithdrawal userWithdrawal = userWithdrawalService.selectOne(new EntityWrapper().eq("phone", userInfo.getPhone())); return ResultUtil.success(userWithdrawal==null?new UserWithdrawal():userWithdrawal); }catch (Exception e){ e.printStackTrace(); return ResultUtil.runErr(); } } @ResponseBody @RequestMapping(value = "/withdrawDeposit", method = RequestMethod.POST) @ApiOperation(value = "用户提现", tags = {"用户端-用户提现"}, notes = "amount-提现金额,password-交易授权码") @ApiImplicitParams({ }) public ResultUtil withdrawDeposit(Integer amount,String bankAcctNo){ UserInfo user = userInfoService.selectById(Objects.requireNonNull(ShiroKit.getUser()).getId()); UserWithdrawal driverWith = userWithdrawalService.selectOne(new EntityWrapper() .eq("phone", user.getPhone()) .last("LIMIT 1")); Boolean b = userWithdrawalService.withdrawDeposit(amount,bankAcctNo,driverWith.getTransactionAuthorizationCode()); if(b){ return ResultUtil.success(); }else { return ResultUtil.runErr(); } } @ResponseBody @RequestMapping(value = "/withdrawDepositGetMoney", method = RequestMethod.POST) @ApiOperation(value = "用户获取可提现余额", tags = {"用户端-用户获取可提现余额"}, notes = "") @ApiImplicitParams({ }) public ResultUtil withdrawDepositGetMoney(HttpServletRequest request) throws Exception { UserInfo user = userInfoService.selectById(userInfoService.getUserIdFormRedis(request)); UserWithdrawal driverWith = userWithdrawalService.selectOne(new EntityWrapper() .eq("phone", user.getPhone()) .last("LIMIT 1")); if(driverWith==null){ return ResultUtil.error("请先进行进件操作"); } try { BalanceAcctReq balanceAcctReq = new BalanceAcctReq(); balanceAcctReq.setCusId(driverWith.getCusId()); BalanceAcctListResp balanceAcctListResp = BalanceAcctExample.retrieveByUserId(balanceAcctReq); List balanceAccts = balanceAcctListResp.getBalanceAccts(); for (BalanceAcctItem balanceAcct : balanceAccts) { if(balanceAcct.getBalanceAcctId().equals(driverWith.getBalanceAcctId())){ if(balanceAcct.getSettledAmount().doubleValue()==0){ return ResultUtil.success(new BigDecimal(0)); } return ResultUtil.success(new BigDecimal(balanceAcct.getSettledAmount()).divide(new BigDecimal(100))); } } } catch (UpyztException e) { e.printStackTrace(); System.out.println("用户获取可提现余额:"+e); return ResultUtil.error(e.getMessage()); } return ResultUtil.success(new BigDecimal(0)); } @ResponseBody @RequestMapping(value = "/uploadImg", method = RequestMethod.POST) @ApiOperation(value = "进件上传图片", tags = {"用户端-进件上传图片"}, notes = "") @ApiImplicitParams({ @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....") }) public ResultUtil uploadImg(MultipartFile multipartFile,HttpServletRequest request){ try { MediaResp mediaResp = MediaExample.uploadImage(multipartFile); String pictureName = OssUploadUtil.ossUpload(request, multipartFile); String mediaId = mediaResp.getMediaId(); userService.insertImg(mediaId,pictureName); return ResultUtil.success(mediaId); }catch (Exception e){ e.printStackTrace(); return ResultUtil.runErr(); } } }