package com.stylefeng.guns.modular.crossCity.controller; import cn.hutool.core.io.FileUtil; import cn.hutool.http.HttpRequest; import cn.hutool.http.HttpResponse; import cn.hutool.http.HttpUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.stylefeng.guns.core.common.exception.BizExceptionEnum; import com.stylefeng.guns.core.exception.GunsException; import com.stylefeng.guns.core.util.ToolUtil; import com.stylefeng.guns.modular.account.service.ITEnterpriseWithdrawalService; import com.stylefeng.guns.modular.account.service.UserWithdrawalService; import com.stylefeng.guns.modular.crossCity.model.LineShiftDriver; import com.stylefeng.guns.modular.crossCity.server.ILineShiftDriverService; import com.stylefeng.guns.modular.crossCity.server.IOrderCrossCityService; import com.stylefeng.guns.modular.crossCity.warpper.OrderCrossCityInfoWrapper; import com.stylefeng.guns.modular.crossCity.warpper.OrderCrossCityOnBehalfWarpper; import com.stylefeng.guns.modular.crossCity.warpper.OrderCrossCityWarpper; import com.stylefeng.guns.modular.crossCity.warpper.OrderWarpper; import com.stylefeng.guns.modular.system.model.Reassign; import com.stylefeng.guns.modular.system.service.ICompanyService; import com.stylefeng.guns.modular.system.service.IDriverService; import com.stylefeng.guns.modular.system.service.IReassignService; import com.stylefeng.guns.modular.system.util.PayMoneyUtil; import com.stylefeng.guns.modular.system.util.ResultUtil; import com.stylefeng.guns.modular.system.util.SystemException; import com.stylefeng.guns.modular.system.util.WeChatUtil; import com.stylefeng.guns.modular.system.util.OssUploadUtil; import com.stylefeng.guns.modular.system.warpper.BaseWarpper; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.ByteArrayInputStream; import java.io.File; import java.io.InputStream; import java.io.PrintWriter; import java.math.BigDecimal; import java.security.SecureRandom; import java.util.Map; import java.util.UUID; @Api @RestController @RequestMapping("") public class OrderCrossCityController { @Autowired private IOrderCrossCityService orderCrossCityService; @Autowired private IDriverService driverService; @Autowired private IReassignService reassignService; @Autowired private UserWithdrawalService userWithdrawalService; @Autowired private PayMoneyUtil payMoneyUtil; @Autowired private ICompanyService companyService; @Autowired private ITEnterpriseWithdrawalService enterpriseWithdrawalService; @Autowired private WeChatUtil weChatUtil; @Autowired private ILineShiftDriverService lineShiftDriverService; @Value("${spring.profiles.active}") private String env; @Value("${filePath}") private String filePath; @Value("${qyt.admin_url}") private String adminUrl; /** * 获取服务中页面订单详情 * @param orderId * @return */ @ResponseBody @PostMapping("/api/orderCrossCity/queryOrderInfo") @ApiOperation(value = "获取跨城订单服务中详情", tags = {"司机端-服务中"}, notes = "") @ApiImplicitParams({ @ApiImplicitParam(value = "订单id", name = "orderId", required = true, dataType = "int"), @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....") }) public ResultUtil queryOrderInfo(Integer orderId) { try { Map map = orderCrossCityService.queryOrderInfo(orderId); return ResultUtil.success(OrderWarpper.getOrderWarpper(map)); } catch (Exception e) { e.printStackTrace(); return ResultUtil.runErr(); } } /** * 提交改派申请 * @param reassign * @param orderIds * @param request * @return */ @ResponseBody @PostMapping("/api/orderCrossCity/reassignOrderCrossCityReassign") @ApiOperation(value = "提交改派申请(跨城)", tags = {"司机端-服务中"}, notes = "") @ApiImplicitParams({ @ApiImplicitParam(value = "订单id(多个以逗号分隔)", name = "orderIds", required = true, dataType = "string"), @ApiImplicitParam(value = "改派支付方式(1=微信,2=支付宝,3=余额)", name = "payType", required = false, dataType = "int"), @ApiImplicitParam(value = "改派原因", name = "reason", required = true, dataType = "string"), @ApiImplicitParam(value = "备注", name = "remark", required = false, dataType = "string"), @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....") }) public ResultUtil reassignOrderCrossCityReassign(Reassign reassign, String orderIds, HttpServletRequest request) { try { Integer uid = driverService.getUserIdFormRedis(request); if (null == uid) { return ResultUtil.tokenErr(); } return reassignService.saveData_(reassign, orderIds, uid, null); } catch (SystemException s) { return ResultUtil.error(s.getMsg()); } catch (Exception e) { e.printStackTrace(); return ResultUtil.runErr(); } } /** * 获取已完成订单明细 * @param orderId * @return */ @ResponseBody @PostMapping("/api/orderCrossCity/queryOrderCrossCityInfo") @ApiOperation(value = "获取已完成的订单明细(跨城)", tags = {"司机端-服务中"}, notes = "") @ApiImplicitParams({ @ApiImplicitParam(value = "跨城订单id", name = "orderId", required = true, dataType = "int"), @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....") }) public ResultUtil queryOrderCrossCityInfo(Integer orderId) { try { Map map = orderCrossCityService.queryOrderCrossCityInfo(orderId); return ResultUtil.success(OrderCrossCityInfoWrapper.getOrderInfoWarpper(map)); } catch (Exception e) { e.printStackTrace(); return ResultUtil.runErr(); } } /** * 修改订单顺序 * @param orderId * @return */ @ResponseBody @PostMapping("/api/orderCrossCity/setOrderCrossCitySort") @ApiOperation(value = "修改订单顺序(跨城)", tags = {"司机端-服务中"}, notes = "") @ApiImplicitParams({ @ApiImplicitParam(value = "跨城订单id", name = "orderId", required = true, dataType = "int"), @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....") }) public ResultUtil setOrderCrossCitySort(Integer orderId) { try { orderCrossCityService.setOrderCrossCitySort(orderId); return ResultUtil.success(); } catch (Exception e) { e.printStackTrace(); return ResultUtil.runErr(); } } /** * 跨城出行下单操作 * @param orderCrossCityWarpper * @param request * @return */ @ResponseBody @RequestMapping(value = "/api/order/orderCrossCity", 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 orderCrossCity(OrderCrossCityWarpper orderCrossCityWarpper, HttpServletRequest request) { try { Integer uid = driverService.getUserIdFormRedis(request); if (null == uid) { return ResultUtil.tokenErr(); } return orderCrossCityService.orderCrossCity(orderCrossCityWarpper, uid); } catch (SystemException se) { return ResultUtil.error(se.getMessage()); } catch (Exception e) { e.printStackTrace(); return ResultUtil.runErr(); } } /** * 扫码支付成功回调处理 * @param request * @param response */ @ResponseBody @PostMapping("/base/order/generatePay") public void generatePay(HttpServletRequest request, HttpServletResponse response) { try { // Map map = icbcPayUtil.generatePayCallback(request); // if(null != map){ // String out_trade_no = map.get("out_trade_no"); // String order_id = map.get("order_id"); // String s = icbcPayUtil.queryGeneratePayState("", order_id); // if(s.equals("1")){ // icbcPayUtil.answer(response);//回调应答 // } // if(ToolUtil.isNotEmpty(out_trade_no) && ToolUtil.isNotEmpty(order_id) && s.equals("1")){ // String[] split = out_trade_no.split(","); // Integer id = Integer.valueOf(split[0]); // Integer type = Integer.valueOf(split[1]); // switch (type){ // case 1: // break; // case 2: // break; // case 3: // orderCrossCityService.generatePayCallback(id, order_id); // break; // } // } // } } catch (Exception e) { e.printStackTrace(); } } /** * 订单完成支付订单操作 * @param payType * @param orderId * @param request * @return */ @ResponseBody @PostMapping("/api/order/payTaxiOrder") @ApiOperation(value = "订单完成支付订单操作", tags = {"司机端-首页"}, notes = "") @ApiImplicitParams({ @ApiImplicitParam(value = "支付方式(1=微信,2=支付宝,3=扫码支付,4=云闪付)", name = "payType", required = true, dataType = "int"), @ApiImplicitParam(value = "订单id", name = "orderId", required = true, dataType = "int"), @ApiImplicitParam(value = "订单类型(3=跨城)", name = "orderType", required = true, dataType = "int"), @ApiImplicitParam(value = "优惠券id", name = "couponId", required = false, dataType = "int"), @ApiImplicitParam(value = "支付端(1=用户APP端,2=司机APP端,3=用户小程序端)", name = "type", required = true, dataType = "int"), @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....") }) public ResultUtil payTaxiOrder(Integer payType, Integer orderId, Integer orderType, Integer couponId, Integer type, HttpServletRequest request) { try { Integer uid = driverService.getUserIdFormRedis(request); if (null == uid) { return ResultUtil.tokenErr(); } switch (orderType) { case 3: return orderCrossCityService.payCrossCityOrder(payType, orderId, couponId, type); } return ResultUtil.success(new Object()); } catch (Exception e) { e.printStackTrace(); return ResultUtil.runErr(); } } /** * 完成订单微信支付回调 * @param request */ @ResponseBody @PostMapping("/base/wxPayCrossCity") public void wxPayCrossCity(HttpServletRequest request, HttpServletResponse response) { try { Map map = payMoneyUtil.weixinpayCallback(request); if (null != map) { System.err.println(JSON.toJSONString(map)); String out_trade_no = map.get("out_trade_no"); String transaction_id = map.get("transaction_id"); String result = map.get("result"); if (ToolUtil.isNotEmpty(out_trade_no) && ToolUtil.isNotEmpty(transaction_id)) { System.out.println("完成订单微信支付回调" + map); PrintWriter out = response.getWriter(); out.write(result); out.flush(); out.close(); String[] split = out_trade_no.split("_"); Integer id = Integer.valueOf(split[0]); Integer type = Integer.valueOf(split[1]); // TODO 司机云闪付 跨城出行微信回调支付充值 // OrderCrossCity orderCrossCity = orderCrossCityService.selectById(id); // if(Objects.isNull(orderCrossCity)){ // System.out.println("该订单不存在"); // throw new RuntimeException("该订单不存在"); // } // cloudPay(orderCrossCity.getDriverId(),map.get("total_fee"),map.get("transaction_id"),1); switch (type) { case 3: orderCrossCityService.payOrderCrossCityCallback(id, transaction_id, 1); break; } } } } catch (Exception e) { e.printStackTrace(); } } @ResponseBody @PostMapping("/base/aliPayCrossCity") public void aliPayCrossCity(HttpServletRequest request, HttpServletResponse response) { try { System.err.println("支付宝回调----->"); Map map = payMoneyUtil.alipayCallback(request); System.err.println(JSON.toJSONString(map)); if (null != map) { String out_trade_no = map.get("out_trade_no"); String trade_no = map.get("trade_no"); if (ToolUtil.isNotEmpty(out_trade_no) && ToolUtil.isNotEmpty(trade_no)) { String[] split = out_trade_no.split("_"); Integer id = Integer.valueOf(split[0]); Integer type = Integer.valueOf(split[1]); switch (type) { case 3: orderCrossCityService.payOrderCrossCityCallback(id, trade_no, 2); break; } String uid = map.get("passback_params"); System.out.println("完成订单支付宝支付回调" + map); // TODO 司机云闪付 跨城出行支付宝回调支付充值 // OrderCrossCity orderCrossCity = orderCrossCityService.selectById(id); // if(Objects.isNull(orderCrossCity)){ // System.out.println("该订单不存在"); // throw new RuntimeException("该订单不存在"); // } // cloudPay(orderCrossCity.getDriverId(),map.get("total_amount"),map.get("trade_no"),0); PrintWriter out = response.getWriter(); out.print("success"); out.flush(); out.close(); } } } catch (Exception e) { e.printStackTrace(); } } /** * 生成跨城扫码下单小程序码 * @param lineShiftDriverId 司机排班记录ID(班次ID) * @param otherFee 其他费用金额(可选) * @param request HttpServletRequest * @return 小程序码图片URL */ @ResponseBody @PostMapping("/api/orderCrossCity/generateScanOrderQrCode") @ApiOperation(value = "【202601】生成跨城扫码下单小程序码", tags = {"司机端-服务中"}, notes = "司机展示小程序码给客户扫码下单") @ApiImplicitParams({ @ApiImplicitParam(value = "司机排班记录ID(班次ID)", name = "lineShiftDriverId", required = true, dataType = "int"), @ApiImplicitParam(value = "其他费用金额", name = "otherFee", required = false, dataType = "BigDecimal"), @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....") }) public ResultUtil generateScanOrderQrCode(Integer lineShiftDriverId, BigDecimal otherFee, HttpServletRequest request) { try { // 1. 验证Token获取司机ID Integer driverId = driverService.getUserIdFormRedis(request); if (null == driverId) { return ResultUtil.tokenErr(); } // 2. 校验班次有效性 LineShiftDriver lineShiftDriver = lineShiftDriverService.selectById(lineShiftDriverId); if (null == lineShiftDriver) { return ResultUtil.error("班次信息不存在"); } if (!driverId.equals(lineShiftDriver.getDriverId())) { return ResultUtil.error("无权操作此班次"); } // 3. 构建scene参数(最大32字符) StringBuilder sceneBuilder = new StringBuilder(); sceneBuilder.append("driverId=").append(driverId); String scene = sceneBuilder.toString(); if (scene.length() > 32) { return ResultUtil.error("生成小程序码失败:scene参数超长"); } // 4. 生成小程序码 String page = "pages/home/home"; // 小程序跳转页面 String unlimitQrcodeUrl = weChatUtil.getUnlimitQrcode(page, scene); // 6. 返回结果 BaseWarpper baseWarpper = new BaseWarpper(); baseWarpper.setContent(unlimitQrcodeUrl); return ResultUtil.success(baseWarpper); } catch (Exception e) { e.printStackTrace(); return ResultUtil.runErr(); } } /** * 跨城代客下单 * @param warpper 代客下单参数 * @param request HttpServletRequest * @return 订单ID */ @ResponseBody @PostMapping("/api/orderCrossCity/orderOnBehalf") @ApiOperation(value = "【202601】跨城代客下单", tags = {"司机端-服务中"}, notes = "司机代乘客下单,乘客通过手机号登录小程序支付") @ApiImplicitParams({ @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....") }) public ResultUtil orderCrossCityOnBehalf(OrderCrossCityOnBehalfWarpper warpper, HttpServletRequest request) { try { // 1. 验证Token获取司机ID Integer driverId = driverService.getUserIdFormRedis(request); if (null == driverId) { return ResultUtil.tokenErr(); } // 2. 调用Service执行代客下单 return orderCrossCityService.orderCrossCityOnBehalf(warpper, driverId); } catch (SystemException se) { return ResultUtil.error(se.getMessage()); } catch (Exception e) { e.printStackTrace(); return ResultUtil.runErr(); } } /** * 代客下单支付 */ @ResponseBody @PostMapping("/api/orderCrossCity/orderOnBehalfPay") @ApiOperation(value = "【202601】代客下单支付", tags = {"司机端-服务中"}, notes = "代客下单支付") @ApiImplicitParams({ @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9....."), @ApiImplicitParam(value = "crossCityOrderId", name = "crossCityOrderId", required = true, dataType = "int"), @ApiImplicitParam(value = "1微信支付 2乘客 3线下", name = "type", required = true, dataType = "int") }) public ResultUtil orderOnBehalfPay(int crossCityOrderId,int type, HttpServletRequest request) { try { // 1. 验证Token获取司机ID Integer driverId = driverService.getUserIdFormRedis(request); if (null == driverId) { return ResultUtil.tokenErr(); } return orderCrossCityService.orderOnBehalfPay(crossCityOrderId,type,driverId); }catch (Exception e){ e.printStackTrace(); return ResultUtil.runErr(); } } }