Pu Zhibing
3 天以前 e0201ae86d66acd7127a9c01080731ee22e4b974
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.*;
/**
 * 跨城出行订单控制器
@@ -70,8 +69,12 @@
    private MongoTemplate mongoTemplate;
    @Autowired
    private ShiroExtUtil shiroExtUtil;
    @Autowired
    private IUserService sysUserService;
    @Autowired
    private ITCompanyService iTCompanyService;
    /**
     * 跳转到跨城出行订单首页
     */
@@ -146,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)){
@@ -155,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;
@@ -179,9 +451,6 @@
    @Autowired
    private IIncomeService incomeService;
@Autowired
private TDriverController tDriverController;
    /**
@@ -229,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()){
@@ -262,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 退款
@@ -285,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);
            }
        }
        //添加取消记录
@@ -340,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;
}