From e0201ae86d66acd7127a9c01080731ee22e4b974 Mon Sep 17 00:00:00 2001
From: Pu Zhibing <393733352@qq.com>
Date: 星期一, 08 九月 2025 16:41:24 +0800
Subject: [PATCH] 新增加跨城支付

---
 ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/specialTrain/TOrderCrossCityController.java |  423 +++++++++++++++++++++++++++++++++++++++++++---------
 1 files changed, 347 insertions(+), 76 deletions(-)

diff --git a/ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/specialTrain/TOrderCrossCityController.java b/ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/specialTrain/TOrderCrossCityController.java
index 791e5c2..0837007 100644
--- a/ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/specialTrain/TOrderCrossCityController.java
+++ b/ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/specialTrain/TOrderCrossCityController.java
@@ -1,25 +1,25 @@
 package com.stylefeng.guns.modular.system.controller.specialTrain;
 
-import com.alibaba.fastjson.JSONObject;
 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.beetl.ShiroExtUtil;
 import com.stylefeng.guns.core.common.constant.factory.PageFactory;
 import com.stylefeng.guns.core.shiro.ShiroUser;
+import com.stylefeng.guns.core.util.DateUtil;
 import com.stylefeng.guns.core.util.SinataUtil;
 import com.stylefeng.guns.core.util.ToolUtil;
-import com.stylefeng.guns.modular.system.controller.general.TDriverController;
-import com.stylefeng.guns.modular.system.controller.util.GetOpenBodySig;
 import com.stylefeng.guns.modular.system.dao.LineShiftDriverMapper;
 import com.stylefeng.guns.modular.system.dao.OrderCancelMapper;
 import com.stylefeng.guns.modular.system.model.*;
 import com.stylefeng.guns.modular.system.service.*;
+import com.stylefeng.guns.modular.system.util.*;
 import com.stylefeng.guns.modular.system.util.HttpRequestUtil;
 import com.stylefeng.guns.modular.system.util.PayMoneyUtil;
 import com.stylefeng.guns.modular.system.util.PushURL;
 import com.stylefeng.guns.modular.system.util.ResultUtil;
-import org.apache.commons.lang.time.DateFormatUtils;
+import com.stylefeng.guns.modular.system.util.qianyuntong.OrderUtil;
+import com.stylefeng.guns.modular.system.util.qianyuntong.model.*;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.Sort;
@@ -31,11 +31,10 @@
 import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
 import java.math.BigDecimal;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 
 /**
  * 跨城出行订单控制器
@@ -68,8 +67,14 @@
     
     @Resource
     private MongoTemplate mongoTemplate;
-    
-    
+    @Autowired
+    private ShiroExtUtil shiroExtUtil;
+    @Autowired
+    private IUserService sysUserService;
+    @Autowired
+    private ITCompanyService iTCompanyService;
+
+
     /**
      * 跳转到跨城出行订单首页
      */
@@ -102,27 +107,28 @@
         model.addAttribute("tOrderCrossCityId",tOrderCrossCityId);
         return PREFIX + "tOrderCrossCity_track.html";
     }
-
+    
     /**
      * 获取订单轨迹
+     *
      * @param orderDetailId
      * @return
      */
     @ResponseBody
     @RequestMapping(value = "/getOrderTrack", method = RequestMethod.POST)
-    public ResultUtil getOrderTrack(String orderDetailId){
-        if(ToolUtil.isNotEmpty(orderDetailId)){
+    public ResultUtil getOrderTrack(Integer orderDetailId) {
+        if (ToolUtil.isNotEmpty(orderDetailId)) {
             try {
                 Query query = new Query()
                         .addCriteria(Criteria.where("orderId").is(orderDetailId).and("orderType").is(3))
                         .with(new Sort(Sort.Direction.ASC, "insertTime"));
                 List<TOrderPosition> positions = mongoTemplate.find(query, TOrderPosition.class);
                 resultUtil = ResultUtil.success(positions);
-            }catch (Exception e){
+            } catch (Exception e) {
                 e.printStackTrace();
                 resultUtil = ResultUtil.runErr();
             }
-        }else {
+        } else {
             resultUtil = ResultUtil.paranErr();
         }
         return resultUtil;
@@ -143,7 +149,10 @@
                        Integer serverCarModelId,
                        String driver,
                        Integer lineId,
-                       Integer state) {
+                       Integer state,
+                       Integer abnormal,
+                       Integer promotion,
+                       String promotionUser) {
         String beginTime = null;
         String endTime = null;
         if (SinataUtil.isNotEmpty(insertTime)){
@@ -152,9 +161,275 @@
             endTime = timeArray[1];
         }
         Page<Map<String, Object>> page = new PageFactory<Map<String, Object>>().defaultPage();
-        page.setRecords(tOrderCrossCityService.getCrossCityOrderList(page, beginTime, endTime, ShiroExtUtil.getUser().getRoleType(), ShiroExtUtil.getUser().getObjectId(), orderNum, orderSource, userName, userPhone, passengers, passengersPhone, serverCarModelId, driver, lineId, state));
+        page.setRecords(tOrderCrossCityService.getCrossCityOrderList(page, beginTime, endTime, shiroExtUtil.getUser().getRoleType(), shiroExtUtil.getUser().getObjectId(), orderNum, orderSource, userName, userPhone, passengers, passengersPhone, serverCarModelId, driver, lineId, state, abnormal, promotion, promotionUser,null));
         return super.packForBT(page);
     }
+
+
+
+    @GetMapping("/export")
+    @ResponseBody
+    public void export(String insertTime,
+                       String orderNum,
+                       Integer orderSource,
+                       String userName,
+                       String userPhone,
+                       String passengers,
+                       String passengersPhone,
+                       Integer serverCarModelId,
+                       String driver,
+                       Integer lineId,
+                       Integer state,
+                       Integer abnormal,
+                       Integer promotion,
+                       String promotionUser, HttpServletRequest request, HttpServletResponse response) {
+        try {
+            String beginTime = null;
+            String endTime = null;
+            if (SinataUtil.isNotEmpty(insertTime)) {
+                String[] timeArray = insertTime.split(" - ");
+                beginTime = timeArray[0];
+                endTime = timeArray[1];
+            }
+            List<Map<String, Object>> list = tOrderCrossCityService.getCrossCityOrderListExport(null, beginTime, endTime, shiroExtUtil.getUser().getRoleType(), shiroExtUtil.getUser().getObjectId(), orderNum, orderSource, userName, userPhone, passengers, passengersPhone, serverCarModelId, driver, lineId, state, abnormal, promotion, promotionUser,null);
+
+            // 表格数据【封装】
+            List<List<String>> dataList = new ArrayList<>();
+
+            //第一行显示【封装】
+            List<String> twoList = new ArrayList<String>();
+            twoList.add("总计:");
+            twoList.add(String.valueOf(list.size())+"条");
+            dataList.add(twoList);
+
+            // 列【封装】
+            List<String> shellList = new ArrayList<String>();
+            shellList.add("下单时间");
+            shellList.add("订单编号");
+            shellList.add("订单来源");
+            shellList.add("乘车时间");
+            shellList.add("下单用户昵称");
+            shellList.add("下单用户手机");
+            shellList.add("乘车用户姓名");
+            shellList.add("乘车用户手机");
+            shellList.add("起点");
+            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<String,Object> object : list){
+                // 详细数据列【封装】
+                shellList = new ArrayList<String>();
+                if(SinataUtil.isNotEmpty(object.get("insertTime"))){
+                    shellList.add(DateUtil.formatDate(DateUtil.parse(object.get("insertTime").toString(),"YYYY-MM-dd HH:mm:ss.S"), "YYYY-MM-dd HH:mm:ss"));
+                }else{
+                    shellList.add("-");
+                }
+                if(SinataUtil.isNotEmpty(object.get("orderNum"))){
+                    shellList.add(object.get("orderNum").toString());
+                }else{
+                    shellList.add("-");
+                }
+
+                // 1:APP下单,2:扫码下单,3:小程序下单,4:司机下单,5:调度下单
+                if(SinataUtil.isNotEmpty(object.get("orderSource"))){
+                    switch (object.get("orderSource").toString()){
+                        case "1":
+                            shellList.add("APP下单");
+                            break;
+                        case "2":
+                            shellList.add("扫码下单");
+                            break;
+                        case "3":
+                            shellList.add("小程序下单");
+                            break;
+                        case "4":
+                            shellList.add("司机下单");
+                            break;
+                        case "5":
+                            shellList.add("调度下单");
+                            break;
+                        case "6":
+                            shellList.add("道行龙城下单");
+                            break;
+                        default:
+                            shellList.add("-");
+                            break;
+                    }
+
+                }
+
+                if(SinataUtil.isNotEmpty(object.get("travelTime"))){
+                    shellList.add(DateUtil.formatDate(DateUtil.parse(object.get("travelTime").toString(),"YYYY-MM-dd HH:mm:ss.S"), "YYYY-MM-dd HH:mm:ss"));
+                }else{
+                    shellList.add("-");
+                }
+
+
+                if(SinataUtil.isNotEmpty(object.get("userName"))){
+                    shellList.add(object.get("userName").toString());
+                }else{
+                    shellList.add("-");
+                }
+
+                if(SinataUtil.isNotEmpty(object.get("userPhone"))){
+                    shellList.add(object.get("userPhone").toString());
+                }else{
+                    shellList.add("-");
+                }
+
+                if(SinataUtil.isNotEmpty(object.get("passengers"))){
+                    shellList.add(object.get("passengers").toString());
+                }else{
+                    shellList.add("-");
+                }
+
+                if(SinataUtil.isNotEmpty(object.get("passengersPhone"))){
+                    shellList.add(object.get("passengersPhone").toString());
+                }else{
+                    shellList.add("-");
+                }
+
+                if(SinataUtil.isNotEmpty(object.get("contactPersonPhone"))){
+                    shellList.add(object.get("contactPersonPhone").toString());
+                }else{
+                    shellList.add("-");
+                }
+
+                if(SinataUtil.isNotEmpty(object.get("startAddress"))){
+                    shellList.add(object.get("startAddress").toString());
+                }else{
+                    shellList.add("-");
+                }
+
+                if(SinataUtil.isNotEmpty(object.get("endAddress"))){
+                    shellList.add(object.get("endAddress").toString());
+                }else{
+                    shellList.add("-");
+                }
+                if(SinataUtil.isNotEmpty(object.get("lineName"))){
+                    shellList.add(object.get("lineName").toString());
+                }else{
+                    shellList.add("-");
+                }
+                if(SinataUtil.isNotEmpty(object.get("serverCarModelName"))){
+                    shellList.add(object.get("serverCarModelName").toString());
+                }else{
+                    shellList.add("-");
+                }
+
+                if(SinataUtil.isNotEmpty(object.get("driver"))){
+                    shellList.add(object.get("driver").toString());
+                }else{
+                    shellList.add("-");
+                }
+
+                if(SinataUtil.isNotEmpty(object.get("car"))){
+                    shellList.add(object.get("car").toString());
+                }else{
+                    shellList.add("-");
+                }
+
+                if(SinataUtil.isNotEmpty(object.get("orderMoney"))){
+                    shellList.add(object.get("orderMoney").toString());
+                }else{
+                    shellList.add("-");
+                }
+
+                // 1=待接单,2=待出发,3=待到达预约地点,4=待乘客上车,5=服务中,6=完成服务,7=待支付,8=待评价,9=已完成,10=已取消,11=改派中,12=取消待支付
+                if(SinataUtil.isNotEmpty(object.get("state"))){
+                    switch (object.get("state").toString()){
+                        case "1":
+                            shellList.add("待接单");
+                            break;
+                        case "2":
+                            shellList.add("待出发");
+                            break;
+                        case "3":
+                            shellList.add("待到达预约地点");
+                            break;
+                        case "4":
+                            shellList.add("待乘客上车");
+                            break;
+                        case "5":
+                            shellList.add("服务中");
+                            break;
+                        case "6":
+                            shellList.add("完成服务");
+                            break;
+                        case "7":
+                            shellList.add("待支付");
+                            break;
+                        case "8":
+                            shellList.add("待评价");
+                            break;
+                        case "9":
+                            shellList.add("已完成");
+                            break;
+                        case "10":
+                            shellList.add("已取消");
+                            break;
+                        case "11":
+                            shellList.add("改派中");
+                            break;
+                        case "12":
+                            shellList.add("取消待支付");
+                            break;
+                        default:
+                            shellList.add("-");
+                            break;
+                    }
+                }
+
+
+                if(SinataUtil.isNotEmpty(object.get("abnormal"))){
+                    shellList.add(object.get("abnormal").toString().equals("1")?"否":"是");
+                }else{
+                    shellList.add("-");
+                }
+
+
+                if(SinataUtil.isNotEmpty(object.get("promotion"))){
+                    shellList.add(object.get("promotion").toString().equals("1")?"否":"是");
+                }else{
+                    shellList.add("-");
+                }
+
+
+                if(SinataUtil.isNotEmpty(object.get("promotionUser"))){
+                    shellList.add(object.get("promotionUser").toString());
+                }else{
+                    shellList.add("-");
+                }
+                if(SinataUtil.isNotEmpty(object.get("promotionPhone"))){
+                    shellList.add(object.get("promotionPhone").toString());
+                }else{
+                    shellList.add("-");
+                }
+
+
+                dataList.add(shellList);
+            }
+            try {
+                // 调用工具类进行导出
+                ExcelExportUtil.easySheet("订单导出记录"+DateUtil.formatDate(new Date(), "YYYYMMddHHmmss"), "订单导出记录", dataList,request, response);
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
 
     @Autowired
     private ITDriverService tDriverService;
@@ -177,9 +452,6 @@
     @Autowired
     private IIncomeService incomeService;
 
-@Autowired
-private TDriverController tDriverController;
-
 
     /**
      * 取消跨城出行订单
@@ -188,16 +460,16 @@
     @ResponseBody
     public Object cancel(@RequestParam Integer tOrderCrossCityId) throws Exception {
         TOrderCrossCity tOrderCrossCity = tOrderCrossCityService.selectById(tOrderCrossCityId);
-        ShiroUser user = ShiroExtUtil.getUser();
-
+        ShiroUser user = shiroExtUtil.getUser();
+    
         TOrderCrossCity orderCrossCity = tOrderCrossCityService.selectById(tOrderCrossCityId);
-        if(orderCrossCity.getState() > 5 && orderCrossCity.getState() != 11 && orderCrossCity.getState() != 7){
+        if (orderCrossCity.getState() > 5 && orderCrossCity.getState() != 11 && orderCrossCity.getState() != 7) {
             return ResultUtil.error("订单状态不在可取消范围内");
         }
         orderCrossCity.setState(10);
         tOrderCrossCityService.updateById(orderCrossCity);
-
-        if(orderCrossCity.getDriverId() != null){
+    
+        if (orderCrossCity.getDriverId() != null) {
             //修改司机信息
             LineShiftDriver lineShiftDriver = lineShiftDriverMapper.selectById(orderCrossCity.getLineShiftDriverId());
             lineShiftDriver.setLaveSeat(lineShiftDriver.getLaveSeat() + orderCrossCity.getPeopleNumber() > lineShiftDriver.getTotalSeat() ?
@@ -226,6 +498,26 @@
             }
         }
 
+        //中台修改订单状态
+        ModifyTravelItineraryRequest request1 = new ModifyTravelItineraryRequest();
+        request1.setOrderId(orderCrossCity.getTravelId());
+        request1.setStatus(orderCrossCity.getState());
+        if (null != orderCrossCity.getDriverId()) {
+            TDriver driver2 = tDriverService.selectById(orderCrossCity.getDriverId());
+            TCompany company = iTCompanyService.selectById(driver2.getCompanyId());
+            request1.setDriverId(driver2.getEmpId().toString());
+            request1.setSupplierShopId(company.getEnterCode());
+        }
+        if (2 == orderCrossCity.getPromotion() && null != orderCrossCity.getPromotionDriverId()) {
+            TDriver driver2 = tDriverService.selectById(orderCrossCity.getPromotionDriverId());
+            request1.setPromoterId(driver2.getEmpId().toString());
+        }
+        OrderUtil.modifyTravelItinerary(request1);
+
+        //未支付,调取消订单
+        if(null == orderCrossCity.getPayType() && ToolUtil.isNotEmpty(orderCrossCity.getTravelId())){
+            OrderUtil.tradeOrderCancel(orderCrossCity.getTravelId());
+        }
 
         //已支付的情况下进行退款操作
         if(null != orderCrossCity.getPayType() && null != orderCrossCity.getPayMoney()){
@@ -259,9 +551,36 @@
                 }
 
                 if(query.getPayType() == 1){//微信
-                    Map<String, String> map = payMoneyUtil.wxRefund(query.getCode(), tOrderCrossCityId + "_3", query.getAmount().toString(), query.getAmount().toString(), "/base/cancleOrderWXPay");
-                    if(!"SUCCESS".equals(map.get("return_code"))){
-                        return ResultUtil.error(map.get("return_msg"));
+                    //中台订单退款操作
+                    if(ToolUtil.isNotEmpty(orderCrossCity.getTravelId())){
+                        User user1 = sysUserService.selectById(user.getId());
+                        TradeOrderRefundRequest request = new TradeOrderRefundRequest();
+                        request.setPartnerPayId(orderCrossCity.getTravelId());
+                        request.setPayId(query.getCode());
+                        request.setRefundTotalFee(orderCrossCity.getPayMoney().multiply(new BigDecimal(100)).intValue() + "");
+                        request.setRemark("服务商取消订单退款");
+                        request.setRefundType("RF");
+
+                        RefundInfoRequest refundInfo = new RefundInfoRequest();
+                        refundInfo.setPayItemId(orderCrossCity.getTravelId());
+                        refundInfo.setPayId(query.getCode());
+                        refundInfo.setTradeFee(orderCrossCity.getPayMoney().multiply(new BigDecimal(100)).intValue() + "");
+                        request.setRefundInfos(new ArrayList<RefundInfoRequest>(){{
+                            add(refundInfo);
+                        }});
+                        TradeOrderRefund tradeOrderRefund = OrderUtil.tradeOrderRefund(request);
+                        //退款通知
+                        OrderRefundNoticeRequest request2 = new OrderRefundNoticeRequest();
+                        request2.setOrderId(orderCrossCity.getTravelId());
+                        request2.setRefundPayNum(tradeOrderRefund.getRefundId());
+                        request2.setRefundType("5");
+                        request2.setApplyRefundCharge(orderCrossCity.getPayMoney());
+                        request2.setActualRefundCharge(orderCrossCity.getPayMoney());
+                        request2.setRefundAccount(user1.getEnterId().toString());
+                        request2.setRemark("服务商取消订单退款");
+                        OrderUtil.orderRefundNotice(request2);
+                        //添加交易明细
+                        transactionDetailsService.saveData(orderCrossCity.getUserId(), "跨城出行取消退款", query.getAmount(), 1, 1, 1, 3, tOrderCrossCityId);
                     }
                 }else if(query.getPayType()==4){
                     // TODO 退款
@@ -282,24 +601,6 @@
                     //添加交易明细
                     transactionDetailsService.saveData(orderCrossCity.getUserId(), "跨城出行取消退款", query.getAmount(), 1, 1, 1, 3, tOrderCrossCityId);
                 }
-            }
-
-            //添加负的收入明细
-            List<Income> incomes = incomeService.selectList(new EntityWrapper<Income>().eq("type", 2).eq("incomeId", tOrderCrossCityId).eq("orderType", 3));
-            for(Income income : incomes){
-                if(income.getUserType() == 2){//处理司机的收入
-                    TDriver driver = tDriverService.selectById(income.getObjectId());
-                    driver.setBalance(driver.getBalance().subtract(new BigDecimal(income.getMoney())));
-                    driver.setBusinessMoney(driver.getBusinessMoney() - income.getMoney());
-                    driver.setLaveBusinessMoney(driver.getLaveBusinessMoney() - income.getMoney());
-                    tDriverService.updateById(driver);
-                }
-                Income income1 = new Income();
-                BeanUtils.copyProperties(income, income1);
-                income1.setMoney(income.getMoney() * -1);
-                income1.setId(null);
-                income1.setInsertTime(new Date());
-                incomeService.insert(income1);
             }
         }
         //添加取消记录
@@ -337,34 +638,4 @@
         return SUCCESS_TIP;
     }
     
-    
-    public static ResultUtil cancleMoney(BigDecimal amount,String no) throws Exception {
-        JSONObject json = new JSONObject();
-        json.put("requestTimestamp", DateFormatUtils.format(new Date(), "yyyy-MM-dd HH:mm:ss"));    // 报文请求时间
-//        json.put("merOrderId", Util.getMerOrderId("34U0")); // 商户订单号
-        json.put("merOrderId", no); // 商户订单号
-        json.put("mid", "898150841210108"); // 商户号
-        json.put("tid", "84UJWSE8");    // 终端号
-        json.put("instMid", "QRPAYDEFAULT"); // 业务类型
-        BigDecimal multiply = amount.multiply(new BigDecimal(100));
-        int money = multiply.intValue();
-        json.put("refundAmount",money);      // 支付总金额
-        System.err.println("请求报文json:\n" + json);
-        String  url = "https://test-api-open.chinaums.com/v1/netpay/refund";
-//        String  url = "https://api-mop.chinaums.com/v1/netpay/refund";
-        //OPEN-BODY-SIG 方式
-        String result = GetOpenBodySig.sendOpenBodySig(url, json.toString());
-        System.err.println("响应报文json:\n" + result);
-        JSONObject jsonObject = JSONObject.parseObject(result);
-        Object appPayRequest = jsonObject.get("appPayRequest");
-        System.out.println(appPayRequest);
-        return ResultUtil.success(appPayRequest);
-    }
-
-    @Autowired
-    private ITEnterpriseWithdrawalService tEnterpriseWithdrawalService;
-    @Autowired
-    private IUserWithdrawalService userWithdrawalService;
-
-
 }

--
Gitblit v1.7.1