package com.stylefeng.guns.modular.system.controller.general; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.baomidou.mybatisplus.plugins.Page; import com.stylefeng.guns.core.base.controller.BaseController; import com.stylefeng.guns.core.common.constant.factory.PageFactory; import com.stylefeng.guns.core.shiro.ShiroKit; import com.stylefeng.guns.core.util.DateUtil; import com.stylefeng.guns.core.util.ExcelExportUtil; import com.stylefeng.guns.core.util.SinataUtil; import com.stylefeng.guns.core.util.ToolUtil; import com.stylefeng.guns.modular.system.util.Tingg.model.*; import com.stylefeng.guns.modular.system.model.TDriver; import com.stylefeng.guns.modular.system.model.TPubWithdrawal; import com.stylefeng.guns.modular.system.model.TSystemNotice; import com.stylefeng.guns.modular.system.model.TUser; import com.stylefeng.guns.modular.system.service.ITDriverService; import com.stylefeng.guns.modular.system.service.ITPubWithdrawalService; import com.stylefeng.guns.modular.system.service.ITSystemNoticeService; import com.stylefeng.guns.modular.system.service.ITUserService; import com.stylefeng.guns.modular.system.util.ResultUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.*; import com.stylefeng.guns.modular.system.util.Tingg.*; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.math.BigDecimal; import java.math.RoundingMode; import java.text.SimpleDateFormat; import java.util.*; /** * 提现列表控制器 * @author fengshuonan * @Date 2020-06-09 09:30:59 */ @Controller @RequestMapping("") public class TPubWithdrawalController extends BaseController { private String PREFIX = "/system/tPubWithdrawal/"; @Autowired private ITPubWithdrawalService tPubWithdrawalService; @Autowired private ITSystemNoticeService tSystemNoticeService; @Autowired private TinggPayoutUtil tinggPayoutUtil; @Autowired private ITUserService userService; @Autowired private ITDriverService driverService; @Value("${callbackPath}") private String callbackPath; /** * 跳转到提现列表首页 */ @RequestMapping("/tPubWithdrawal") public String index() { return PREFIX + "tPubWithdrawal.html"; } /** * 跳转到查看详情 */ @RequestMapping("/tPubWithdrawal/lookDetail/{id}/{type}") public String lookDetail(@PathVariable Integer id, @PathVariable Integer type, Model model) { TPubWithdrawal tPubWithdrawal = tPubWithdrawalService.selectById(id); String str = ""; if (1 == type){ str = tPubWithdrawal.getRemark(); } model.addAttribute("str",str); return "/system/tComplaint/lookDetail.html"; } /** * 跳转到立即处理页面 * ----------改为批量 */ @RequestMapping("/tPubWithdrawal/tPubWithdrawal_immediately/{tPubWithdrawalIds}") public String tPubWithdrawalUpdate(@PathVariable String tPubWithdrawalIds, Model model) { model.addAttribute("tPubWithdrawalIds",tPubWithdrawalIds); return PREFIX + "tPubWithdrawal_immediately.html"; } /** * 获取提现列表列表 */ @RequestMapping(value = "/tPubWithdrawal/list") @ResponseBody public Object list(String insertTime, String name, Integer withdrawalType, Integer userType, Integer type, Integer state) { String beginTime = null; String endTime = null; if (SinataUtil.isNotEmpty(insertTime)){ String[] timeArray = insertTime.split(" - "); beginTime = timeArray[0]; endTime = timeArray[1]; } Page> page = new PageFactory>().defaultPage(); if (ShiroKit.getUser().getRoleType() != 1){ page.setRecords(null); }else{ page.setRecords(tPubWithdrawalService.getWithdrawalList(page,beginTime,endTime,name,withdrawalType,userType,type,state)); } return super.packForBT(page); } /** * 新增提现列表 */ @RequestMapping(value = "/tPubWithdrawal/add") @ResponseBody public Object add(TPubWithdrawal tPubWithdrawal) { tPubWithdrawalService.insert(tPubWithdrawal); return SUCCESS_TIP; } /** * 立即处理操作 */ @RequestMapping(value = "/tPubWithdrawal/immediately") @ResponseBody public Object immediately(@RequestParam Integer id,@RequestParam Integer state,@RequestParam String remark) { TPubWithdrawal tPubWithdrawal = tPubWithdrawalService.selectById(id); if (SinataUtil.isNotEmpty(tPubWithdrawal)){ tPubWithdrawal.setRemark(remark); String serviceCode = ""; String phone = ""; Integer language = null; if(tPubWithdrawal.getUserType() == 1){ TUser tUser = userService.selectById(tPubWithdrawal.getUserId()); language = tUser.getLanguage(); serviceCode = tUser.getPhoneOperator(); phone = tUser.getPhone(); }else{ TDriver tDriver = driverService.selectById(tPubWithdrawal.getUserId()); language = tDriver.getLanguage(); serviceCode = tDriver.getPhoneOperator(); phone = tDriver.getPhone(); } if(2 == state){ SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS"); String payerTransactionID = sdf.format(new Date()) + tPubWithdrawal.getId(); PayoutResponse payoutResponse = tinggPayoutUtil.sendPayout(serviceCode, phone, payerTransactionID, tPubWithdrawal.getMoney().doubleValue(), callbackPath + "/base/withdrawalCallback", remark); AuthStatus authStatus = payoutResponse.getAuthStatus(); Results results = payoutResponse.getResults().get(0); String statusCode = results.getStatusCode(); if(!"131".equals(authStatus.getAuthStatusCode())){ return ResultUtil.error(authStatus.getAuthStatusDescription()); } if(!"139".equals(statusCode)){ return ResultUtil.error(results.getStatusDescription()); } tPubWithdrawal.setSerialNo(results.getBeepTransactionID()); tPubWithdrawal.setState(4); }else{//回退金额 tPubWithdrawal.setHandleTime(new Date()); tPubWithdrawal.setState(state); if(tPubWithdrawal.getUserType() == 1){ TUser tUser = userService.selectById(tPubWithdrawal.getUserId()); tUser.setBalance(tUser.getBalance().add(tPubWithdrawal.getMoney())); userService.updateById(tUser); }else{ TDriver tDriver = driverService.selectById(tPubWithdrawal.getUserId()); tDriver.setBalance(tDriver.getBalance().add(tPubWithdrawal.getMoney())); if(tPubWithdrawal.getType() == 1){//活动提现 tDriver.setLaveActivityMoney(new BigDecimal(tDriver.getLaveActivityMoney()).add(tPubWithdrawal.getMoney()).setScale(2, RoundingMode.HALF_EVEN).doubleValue()); }else{//业务提现 tDriver.setLaveBusinessMoney(new BigDecimal(tDriver.getLaveBusinessMoney()).add(tPubWithdrawal.getMoney()).setScale(2, RoundingMode.HALF_EVEN).doubleValue()); } driverService.updateById(tDriver); } } tPubWithdrawalService.updateById(tPubWithdrawal); //增加系统消息 TSystemNotice notice = new TSystemNotice(); notice.setType(2); notice.setUserType(tPubWithdrawal.getUserType()); notice.setContent((language == 1 ? "提现申请反馈" : language == 2 ? "Feedback on withdrawal requests" : "Réponse à la demande de retrait") + ":【" +remark +"】。"); notice.setUserId(tPubWithdrawal.getUserId()); notice.setInsertTime(new Date()); notice.setRead(1); tSystemNoticeService.insert(notice); } return SUCCESS_TIP; } @ResponseBody @PostMapping("/base/withdrawalCallback") public PayoutCallbackResponse tinggPayoutCallback(@RequestBody PayoutCallbackRequest request){ System.err.println("转账回调>>>>" + JSON.toJSONString(request)); PayoutCallbackResponse payoutCallbackResponse = new PayoutCallbackResponse(); AuthStatus authStatus = new AuthStatus(); authStatus.setAuthStatusCode(131); authStatus.setAuthStatusDescription("Authentication was successful"); payoutCallbackResponse.setAuthStatus(authStatus); Results results = new Results(); PayoutPacket packet = request.getPayload().getPacket(); String statusCode = packet.getStatusCode(); String beepTransactionID = packet.getBeepTransactionID(); String payerTransactionID = packet.getPayerTransactionID(); String id = payerTransactionID.substring(17); TPubWithdrawal tPubWithdrawal = tPubWithdrawalService.selectById(id); tPubWithdrawal.setState(2); tPubWithdrawal.setHandleTime(new Date()); tPubWithdrawal.setSerialNo(beepTransactionID); tPubWithdrawalService.updateById(tPubWithdrawal); results.setBeepTransactionID(beepTransactionID); results.setPayerTransactionID(payerTransactionID); results.setStatusCode("188"); results.setStatusDescription("Response was received"); payoutCallbackResponse.setResults(results); return payoutCallbackResponse; } /** * 修改提现列表 */ @RequestMapping(value = "/tPubWithdrawal/update") @ResponseBody public Object update(TPubWithdrawal tPubWithdrawal) { tPubWithdrawalService.updateById(tPubWithdrawal); return SUCCESS_TIP; } /** * 提现列表详情 */ @RequestMapping(value = "/tPubWithdrawal/detail/{tPubWithdrawalId}") @ResponseBody public Object detail(@PathVariable("tPubWithdrawalId") Integer tPubWithdrawalId) { return tPubWithdrawalService.selectById(tPubWithdrawalId); } /** * 提现列表导出 * @author yxh * @date 2021/4/7 15:59 * @param insertTime * @param name * @param withdrawalType * @param userType * @param type * @param state */ @RequestMapping(value = "/tPubWithdrawal/downloadList",method = RequestMethod.GET) public void downloadList(String insertTime, String name, Integer withdrawalType, Integer userType, Integer type, Integer state, HttpServletRequest request, HttpServletResponse response){ String start = null; String end = null; if(ToolUtil.isNotEmpty(insertTime)){ start = insertTime.split(" - ")[0]; end = insertTime.split(" - ")[1]; } List> list =tPubWithdrawalService.getWithdrawalListNoPage(start,end,name,withdrawalType,userType,type,state); // 表格数据 List> dataList = new ArrayList<>(); // 表头行 List shellList = new ArrayList(); shellList.add("申请时间"); shellList.add("提现人"); shellList.add("提现手机号"); shellList.add("账户类型"); shellList.add("提现金额"); shellList.add("提现类型"); shellList.add("账户余额"); shellList.add("联系人"); shellList.add("联系电话"); shellList.add("备注"); shellList.add("状态"); dataList.add(shellList); for (Map map : list) { //数据行 shellList = new ArrayList(); if(SinataUtil.isNotEmpty(map.get("applyTime"))){ shellList.add(map.get("applyTime").toString()); }else{ shellList.add("-"); } if(SinataUtil.isNotEmpty(map.get("name"))){ shellList.add(map.get("name").toString()); }else{ shellList.add("-"); } if(SinataUtil.isNotEmpty(map.get("code"))){ shellList.add(map.get("code").toString()); }else{ shellList.add("-"); } //userType if(SinataUtil.isNotEmpty(map.get("userType"))){ switch (map.get("userType").toString()){ case "1": shellList.add("用户"); break; case "2": shellList.add("司机"); break; default: shellList.add("-"); } }else{ shellList.add("-"); } //money if(SinataUtil.isNotEmpty(map.get("money"))){ shellList.add(map.get("money").toString()); }else{ shellList.add("-"); } //type if(SinataUtil.isNotEmpty(map.get("type"))){ switch (map.get("type").toString()){ case "1": shellList.add("活动收入提现"); break; case "2": shellList.add("业务收入提现"); break; default: shellList.add("-"); } }else{ shellList.add("-"); } //balance if(SinataUtil.isNotEmpty(map.get("balance"))){ shellList.add(map.get("balance").toString()); }else{ shellList.add("-"); } //userName if(SinataUtil.isNotEmpty(map.get("userName"))){ shellList.add(map.get("userName").toString()); }else{ shellList.add("-"); } //userPhone if(SinataUtil.isNotEmpty(map.get("userPhone"))){ shellList.add(map.get("userPhone").toString()); }else{ shellList.add("-"); } //remark if(SinataUtil.isNotEmpty(map.get("remark"))){ shellList.add(map.get("remark").toString()); }else{ shellList.add("-"); } //state if(SinataUtil.isNotEmpty(map.get("state"))){ switch (map.get("state").toString()){ case "1": shellList.add("待处理"); break; case "2": shellList.add("成功"); break; case "3": shellList.add("失败"); break; default: shellList.add("-"); } }else{ shellList.add("-"); } dataList.add(shellList); } try { // 调用工具类进行导出 ExcelExportUtil.easySheet("提现导出记录"+ DateUtil.formatDate(new Date(), "YYYYMMddHHmmss"), "提现导出记录", dataList,request, response); } catch (Exception e) { e.printStackTrace(); } } }