Pu Zhibing
2 天以前 e0201ae86d66acd7127a9c01080731ee22e4b974
新增加跨城支付
4个文件已修改
5个文件已添加
675 ■■■■ 已修改文件
ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/specialTrain/TOrderCrossCityController.java 77 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/specialTrain/TReassignController.java 149 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TOrderCrossCity.java 177 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/OrderUtil.java 128 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/OrderRefundNoticeRequest.java 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/RefundInfoRequest.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/TradeOrderCancelRequest.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/TradeOrderRefund.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/TradeOrderRefundRequest.java 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/specialTrain/TOrderCrossCityController.java
@@ -18,6 +18,8 @@
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 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;
@@ -67,6 +69,10 @@
    private MongoTemplate mongoTemplate;
    @Autowired
    private ShiroExtUtil shiroExtUtil;
    @Autowired
    private IUserService sysUserService;
    @Autowired
    private ITCompanyService iTCompanyService;
    
    
    /**
@@ -492,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()){
@@ -525,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 退款
@@ -548,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);
            }
        }
        //添加取消记录
ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/specialTrain/TReassignController.java
@@ -9,6 +9,7 @@
import com.stylefeng.guns.core.shiro.ShiroUser;
import com.stylefeng.guns.core.util.ExcelUtil;
import com.stylefeng.guns.core.util.SinataUtil;
import com.stylefeng.guns.core.util.ToolUtil;
import com.stylefeng.guns.modular.system.dao.LineShiftDriverMapper;
import com.stylefeng.guns.modular.system.dao.OrderCancelMapper;
import com.stylefeng.guns.modular.system.model.*;
@@ -16,6 +17,9 @@
import com.stylefeng.guns.modular.system.util.HttpRequestUtil;
import com.stylefeng.guns.modular.system.util.PushURL;
import com.stylefeng.guns.modular.system.util.ResultUtil;
import com.stylefeng.guns.modular.system.util.qianyuntong.OrderUtil;
import com.stylefeng.guns.modular.system.util.qianyuntong.model.*;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
@@ -32,10 +36,7 @@
import java.math.BigDecimal;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.*;
/**
 * 快车改派管理控制器
@@ -43,6 +44,7 @@
 * @author fengshuonan
 * @Date 2020-09-03 14:20:27
 */
@Slf4j
@Controller
@RequestMapping("/tReassign")
public class TReassignController extends BaseController {
@@ -89,6 +91,10 @@
    private ITOrderTaxiService orderTaxiService;
    @Autowired
    private ShiroExtUtil shiroExtUtil;
    @Autowired
    private ITCompanyService iTCompanyService;
    @Autowired
    private IUserService sysUserService;
    
    
    /**
@@ -807,6 +813,7 @@
    @ResponseBody
    public Object optCross(@RequestParam Integer tReassignId,@RequestParam Integer optType) {
        try {
            TReassign tReassign = tReassignService.selectById(tReassignId);
            ShiroUser user = shiroExtUtil.getUser();
            if (1 == optType) {
@@ -828,6 +835,23 @@
                TOrderCrossCity tOrderCrossCity = itOrderCrossCityService.selectById(tReassign.getOrderId());
                tOrderCrossCity.setState(tOrderCrossCity.getOldState());
                itOrderCrossCityService.updateById(tOrderCrossCity);
                //中台修改订单状态
                if(ToolUtil.isNotEmpty(tOrderCrossCity.getTravelId())){
                    TCompany company = iTCompanyService.selectById(driver.getCompanyId());
                    //中台修改订单状态
                    ModifyTravelItineraryRequest request = new ModifyTravelItineraryRequest();
                    request.setOrderId(tOrderCrossCity.getTravelId());
                    request.setStatus(tOrderCrossCity.getState());
                    request.setDriverId(driver.getEmpId().toString());
                    if (2 == tOrderCrossCity.getPromotion()) {
                        TDriver driver1 = itDriverService.selectById(tOrderCrossCity.getPromotionDriverId());
                        request.setPromoterId(driver1.getEmpId().toString());
                    }
                    request.setSupplierShopId(company.getEnterCode());
                    OrderUtil.modifyTravelItinerary(request);
                }
            }else if (2 == optType){
                tReassign.setState(4);
                tReassign.setReviewer(user.getId());
@@ -885,45 +909,40 @@
                        //添加交易明细
                        transactionDetailsService.saveData(orderCrossCity.getUserId(), "跨城订单取消退款", orderCrossCity.getPayMoney().doubleValue(), 1, 1, 1, 3, tReassign.getOrderId());
                    }else{
//                        PaymentRecord query = paymentRecordService.query(1, null, null, tReassign.getOrderId(), 3, null, 2).get(0);
//                        if(null == query){
//                            return ResultUtil.error("订单还未进行支付");
//                        }
//                        Map<String, Object> merrefund = icbcPayUtil.merrefund(query.getCode(), "", query.getAmount(), tReassign.getOrderId() + "_3", orderCrossCity.getOrderNum());
//                        if(Integer.valueOf(merrefund.get("code").toString()) == 0){
//                            boolean b = true;
//                            while (b){
//                                Map<String, Object> refundqry = icbcPayUtil.refundqry("", query.getCode(), orderCrossCity.getOrderNum());
//                                if(Integer.valueOf(refundqry.get("code").toString()) == 0 && Integer.valueOf(refundqry.get("pay_status").toString()) == 0){//成功
//                                    //添加交易明细
//                                    transactionDetailsService.saveData(orderCrossCity.getUserId(), "跨城订单取消退款", query.getAmount(), 1, 1, 1, 3, tReassign.getOrderId());
//                                }
//                                if(Integer.valueOf(refundqry.get("code").toString()) == 0 && Integer.valueOf(refundqry.get("pay_status").toString()) == 1){//失败
//                                    return ResultUtil.error("订单取消失败(退款不成功)");
//                                }
//                                if(Integer.valueOf(refundqry.get("code").toString()) == 0 && Integer.valueOf(refundqry.get("pay_status").toString()) == 2){//未知
//                                    return ResultUtil.error("退款返回未知异常");
//                                }
//                            }
//                        }
                    }
                        //中台订单退款操作
                        if(ToolUtil.isNotEmpty(orderCrossCity.getTravelId())){
                            User user1 = sysUserService.selectById(user.getId());
                            List<PaymentRecord> list = paymentRecordService.query(1, orderCrossCity.getUserId(), 1, orderCrossCity.getId(), 3, 1, 2);
                            PaymentRecord query = list.get(0);
                            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");
                    //添加负的收入明细
                    List<Income> incomes = incomeService.selectList(new EntityWrapper<Income>().eq("type", 2).eq("incomeId", tReassign.getOrderId()).eq("orderType", 3));
                    for(Income income : incomes){
                        if(income.getUserType() == 2){//处理司机的收入
                            TDriver driver = itDriverService.selectById(income.getObjectId());
                            driver.setBalance(driver.getBalance().subtract(new BigDecimal(income.getMoney())));
                            driver.setLaveBusinessMoney(new BigDecimal(driver.getLaveBusinessMoney()).subtract(new BigDecimal(income.getMoney())).doubleValue());
                            driver.setBusinessMoney(new BigDecimal(driver.getBusinessMoney()).subtract(new BigDecimal(income.getMoney())).doubleValue());
                            itDriverService.updateById(driver);
                            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 request1 = new OrderRefundNoticeRequest();
                            request1.setOrderId(orderCrossCity.getTravelId());
                            request1.setRefundPayNum(tradeOrderRefund.getRefundId());
                            request1.setRefundType("5");
                            request1.setApplyRefundCharge(orderCrossCity.getPayMoney());
                            request1.setActualRefundCharge(orderCrossCity.getPayMoney());
                            request1.setRefundAccount(user1.getEmpId().toString());
                            request1.setRemark("服务商取消订单退款");
                            OrderUtil.orderRefundNotice(request1);
                            //添加交易明细
                            transactionDetailsService.saveData(orderCrossCity.getUserId(), "跨城订单取消退款", query.getAmount(), 1, 1, 1, 3, tReassign.getOrderId());
                        }
                        Income income1 = new Income();
                        BeanUtils.copyProperties(income, income1);
                        income1.setMoney(income.getMoney() * -1);
                        income1.setId(null);
                        income1.setInsertTime(new Date());
                        incomeService.insert(income1);
                    }
                }
@@ -939,22 +958,6 @@
                orderCancel.setUserId(user.getId());
                orderCancelMapper.insert(orderCancel);
            }
            //返回驾驶员处罚金
            TDriver originalDriver = itDriverService.selectById(tReassign.getOriginalDriverId());
            //增加交易明细
            TPubTransactionDetails details = new TPubTransactionDetails();
            details.setUserId(originalDriver.getId());
            details.setInsertTime(new Date());
            details.setRemark("【跨城改派】:改派失败或订单取消");
            details.setMoney(new BigDecimal(tReassign.getMoney()));
            details.setState(1);
            details.setType(1);
            details.setUserType(2);
            details.setOrderType(3);
            details.setOrderId(tReassign.getOrderId());
            itPubTransactionDetailsService.insert(details);
        }catch (Exception e){
            e.printStackTrace();
        }
@@ -1276,6 +1279,7 @@
        }
        if(driver.getState() == 2){
            driver.setState(3);
            itDriverService.updateById(driver);
        }
        //修改订单数据
@@ -1300,24 +1304,23 @@
        tReassign.setCompleteTime(new Date());
        tReassignService.updateById(tReassign);
        //修改收入明细,转给新司机(因为是先支付金额)
        List<Income> incomes = incomeService.selectList(new EntityWrapper<Income>().eq("userType", 2).eq("objectId", oldDriver.getId()).eq("type", 2).eq("incomeId", tReassign.getOrderId()).eq("orderType", 3));
        if(incomes.size() > 0){
            Income income = incomes.get(0);
            income.setObjectId(driverId);
            incomeService.updateById(income);
        TCompany company = iTCompanyService.selectById(driver.getCompanyId());
            oldDriver.setBusinessMoney(oldDriver.getBusinessMoney() - income.getMoney());
            oldDriver.setLaveBusinessMoney(oldDriver.getLaveBusinessMoney() - income.getMoney());
            oldDriver.setBalance(oldDriver.getBalance().subtract(new BigDecimal(income.getMoney())));
            driver.setBusinessMoney(driver.getBusinessMoney() + income.getMoney());
            driver.setLaveBusinessMoney(driver.getLaveBusinessMoney() + income.getMoney());
            driver.setBalance(driver.getBalance().add(new BigDecimal(income.getMoney())));
        //中台修改订单状态
        if(ToolUtil.isNotEmpty(tOrderCrossCity.getTravelId())){
            ModifyTravelItineraryRequest request1 = new ModifyTravelItineraryRequest();
            request1.setOrderId(tOrderCrossCity.getTravelId());
            request1.setStatus(tOrderCrossCity.getState());
            if (null != tOrderCrossCity.getDriverId()) {
                request1.setDriverId(driver.getEmpId().toString());
                request1.setSupplierShopId(company.getEnterCode());
        }
        itDriverService.updateById(oldDriver);
        itDriverService.updateById(driver);
            if (2 == tOrderCrossCity.getPromotion()) {
                TDriver driver2 = itDriverService.selectById(tOrderCrossCity.getPromotionDriverId());
                request1.setPromoterId(driver2.getEmpId().toString());
            }
            OrderUtil.modifyTravelItinerary(request1);
        }
        //增加推送
        Map<String,String> map = new HashMap<>();
        map.put("orderId", tOrderCrossCity.getId().toString());
ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TOrderCrossCity.java
@@ -314,6 +314,63 @@
    private Date voiceTime;
    /**
     * 是否异常订单 1否 2是
     */
    @TableField("abnormal")
    private Integer abnormal;
    /**
     * 推广订单 1否 2是
     */
    @TableField("promotion")
    private Integer promotion;
    /**
     * 乘客反馈情况
     */
    @TableField("abnormalIntro")
    private String abnormalIntro;
    /**
     * 乘客反馈图片
     */
    @TableField("abnormalImg")
    private String abnormalImg;
    private String splitAllocation;
    private Long promotionActivityId;
    private String promotionUser;
    private String promotionPhone;
    /**
     * 中台行程id
     */
    private String travelId;
    /**
     * 中台是否已创建订单(0=否,1=是)
     */
    private Integer isCreated;
    /**
     * 是否是追缴单(0=否,1=是)
     */
    private Integer recoveryOrder;
    /**
     * 是否生成追缴单(0=否,1=是)
     */
    private Integer isGenerateRecoveryOrder;
    /**
     * 原始订单id
     */
    private Integer oldOrderId;
    private Date recoveryOrderCreateDate;
    private Date payTime;
    public String getVoice() {
        return voice;
    }
@@ -929,6 +986,126 @@
        this.payOrderId = payOrderId;
    }
    public Integer getAbnormal() {
        return abnormal;
    }
    public void setAbnormal(Integer abnormal) {
        this.abnormal = abnormal;
    }
    public Integer getPromotion() {
        return promotion;
    }
    public void setPromotion(Integer promotion) {
        this.promotion = promotion;
    }
    public String getAbnormalIntro() {
        return abnormalIntro;
    }
    public void setAbnormalIntro(String abnormalIntro) {
        this.abnormalIntro = abnormalIntro;
    }
    public String getAbnormalImg() {
        return abnormalImg;
    }
    public void setAbnormalImg(String abnormalImg) {
        this.abnormalImg = abnormalImg;
    }
    public String getSplitAllocation() {
        return splitAllocation;
    }
    public void setSplitAllocation(String splitAllocation) {
        this.splitAllocation = splitAllocation;
    }
    public Long getPromotionActivityId() {
        return promotionActivityId;
    }
    public void setPromotionActivityId(Long promotionActivityId) {
        this.promotionActivityId = promotionActivityId;
    }
    public String getPromotionUser() {
        return promotionUser;
    }
    public void setPromotionUser(String promotionUser) {
        this.promotionUser = promotionUser;
    }
    public String getPromotionPhone() {
        return promotionPhone;
    }
    public void setPromotionPhone(String promotionPhone) {
        this.promotionPhone = promotionPhone;
    }
    public String getTravelId() {
        return travelId;
    }
    public void setTravelId(String travelId) {
        this.travelId = travelId;
    }
    public Integer getIsCreated() {
        return isCreated;
    }
    public void setIsCreated(Integer isCreated) {
        this.isCreated = isCreated;
    }
    public Integer getRecoveryOrder() {
        return recoveryOrder;
    }
    public void setRecoveryOrder(Integer recoveryOrder) {
        this.recoveryOrder = recoveryOrder;
    }
    public Integer getIsGenerateRecoveryOrder() {
        return isGenerateRecoveryOrder;
    }
    public void setIsGenerateRecoveryOrder(Integer isGenerateRecoveryOrder) {
        this.isGenerateRecoveryOrder = isGenerateRecoveryOrder;
    }
    public Integer getOldOrderId() {
        return oldOrderId;
    }
    public void setOldOrderId(Integer oldOrderId) {
        this.oldOrderId = oldOrderId;
    }
    public Date getRecoveryOrderCreateDate() {
        return recoveryOrderCreateDate;
    }
    public void setRecoveryOrderCreateDate(Date recoveryOrderCreateDate) {
        this.recoveryOrderCreateDate = recoveryOrderCreateDate;
    }
    public Date getPayTime() {
        return payTime;
    }
    public void setPayTime(Date payTime) {
        this.payTime = payTime;
    }
    @Override
    protected Serializable pkVal() {
        return this.id;
ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/OrderUtil.java
@@ -678,4 +678,132 @@
    }
    
    
    /**
     * 订单退款
     * @param request
     * @return
     */
    public static TradeOrderRefund tradeOrderRefund(TradeOrderRefundRequest request) {
        request.setPayPartnerId("prod".equals(qianYunTongConfig.getActiveProfile()) ? "5400004" : "5401007");
        //请求路径
        String url = qianYunTongConfig.getApiUrl() + "/openapi/rest/1.0/tradeOrderRefund";
        //私钥文件
        String skprivateKeyFile = qianYunTongConfig.getPrivateKeyPath();
        //注意:私钥文件需要开发者手动新建.pem文件,将委办局提供的私钥串复制进文件里用于sign加密
        String appKey = qianYunTongConfig.getAppkey();//appkey
        Map<String, String> headers = new HashMap<>();
        headers.put("Content-Type", "application/json");
        Map<String, Object> contentMap = new HashMap<String, Object>();
        Date nowdate = new Date();
        SimpleDateFormat date = new SimpleDateFormat("yyyyMMddHHmmss");
        String timeStamp = date.format(nowdate);
        String messageId = UUIDUtil.getRandomCode();
        contentMap.put(SystemParameterNames.getAppKey(), appKey);
        contentMap.put(SystemParameterNames.getMessage_id(), messageId);
        contentMap.put(SystemParameterNames.getUserName(), qianYunTongConfig.getUserName());
        contentMap.put(SystemParameterNames.getStatus(), qianYunTongConfig.getStatus());
        contentMap.put("content", new Gson().toJson(request));
        log.info("【订单退款】请求地址:" + url);
        log.info("【订单退款】请求参数:" + JSON.toJSONString(contentMap));
        String result = OpenApiClient.sendCommonHttpRequst(url, headers, "POST", skprivateKeyFile, timeStamp, contentMap);
        log.info("【订单退款】请求结果:" + result);
        JSONObject jsonObject = JSON.parseObject(result);
        String resCode = jsonObject.getString("resCode");
        if (!"000000".equals(resCode)) {
            log.error("【订单退款】失败:" + jsonObject.getString("resMsg"));
            throw new RuntimeException("【订单退款】失败:" + jsonObject.getString("resMsg"));
        }
        JSONObject refundInfo = jsonObject.getJSONObject("busiResp").getJSONObject("refundInfo");
        String retCode = refundInfo.getString("retCode");
        if(!"".equals(retCode)){
            log.error("【订单退款】失败:" + refundInfo.getString("retMsg"));
            throw new RuntimeException("【订单退款】失败:" + refundInfo.getString("retMsg"));
        }
        TradeOrderRefund tradeOrderRefund = refundInfo.getObject("data", TradeOrderRefund.class);
        return tradeOrderRefund;
    }
    /**
     * 订单退款通知
     * @param request
     */
    public static void orderRefundNotice(OrderRefundNoticeRequest request) {
        request.setScene("TRAFFIC");
        request.setMhltiCenterAppId("52270015");
        //请求路径
        String url = qianYunTongConfig.getApiUrl() + "/openapi/rest/1.0/orderRefundNotice";
        //私钥文件
        String skprivateKeyFile = qianYunTongConfig.getPrivateKeyPath();
        //注意:私钥文件需要开发者手动新建.pem文件,将委办局提供的私钥串复制进文件里用于sign加密
        String appKey = qianYunTongConfig.getAppkey();//appkey
        Map<String, String> headers = new HashMap<>();
        headers.put("Content-Type", "application/json");
        Map<String, Object> contentMap = new HashMap<String, Object>();
        Date nowdate = new Date();
        SimpleDateFormat date = new SimpleDateFormat("yyyyMMddHHmmss");
        String timeStamp = date.format(nowdate);
        String messageId = UUIDUtil.getRandomCode();
        contentMap.put(SystemParameterNames.getAppKey(), appKey);
        contentMap.put(SystemParameterNames.getMessage_id(), messageId);
        contentMap.put(SystemParameterNames.getUserName(), qianYunTongConfig.getUserName());
        contentMap.put(SystemParameterNames.getStatus(), qianYunTongConfig.getStatus());
        contentMap.put("content", new Gson().toJson(request));
        log.info("【订单退款通知】请求地址:" + url);
        log.info("【订单退款通知】请求参数:" + JSON.toJSONString(contentMap));
        String result = OpenApiClient.sendCommonHttpRequst(url, headers, "POST", skprivateKeyFile, timeStamp, contentMap);
        log.info("【订单退款通知】请求结果:" + result);
        JSONObject jsonObject = JSON.parseObject(result);
        String resCode = jsonObject.getString("resCode");
        if (!"000000".equals(resCode)) {
            log.error("【订单退款通知】失败:" + jsonObject.getString("resMsg"));
            throw new RuntimeException("【订单退款通知】失败:" + jsonObject.getString("resMsg"));
        }
    }
    /**
     * 订单取消
     * @param orderId
     */
    public static void tradeOrderCancel(String orderId) {
        TradeOrderCancelRequest request = new TradeOrderCancelRequest();
        request.setScene("TRAFFIC");
        request.setMhltiCenterAppId("52270015");
        request.setOrderId(orderId);
        //请求路径
        String url = qianYunTongConfig.getApiUrl() + "/openapi/rest/1.0/tradeOrderCancel";
        //私钥文件
        String skprivateKeyFile = qianYunTongConfig.getPrivateKeyPath();
        //注意:私钥文件需要开发者手动新建.pem文件,将委办局提供的私钥串复制进文件里用于sign加密
        String appKey = qianYunTongConfig.getAppkey();//appkey
        Map<String, String> headers = new HashMap<>();
        headers.put("Content-Type", "application/json");
        Map<String, Object> contentMap = new HashMap<String, Object>();
        Date nowdate = new Date();
        SimpleDateFormat date = new SimpleDateFormat("yyyyMMddHHmmss");
        String timeStamp = date.format(nowdate);
        String messageId = UUIDUtil.getRandomCode();
        contentMap.put(SystemParameterNames.getAppKey(), appKey);
        contentMap.put(SystemParameterNames.getMessage_id(), messageId);
        contentMap.put(SystemParameterNames.getUserName(), qianYunTongConfig.getUserName());
        contentMap.put(SystemParameterNames.getStatus(), qianYunTongConfig.getStatus());
        contentMap.put("content", new Gson().toJson(request));
        log.info("【订单取消】请求地址:" + url);
        log.info("【订单取消】请求参数:" + JSON.toJSONString(contentMap));
        String result = OpenApiClient.sendCommonHttpRequst(url, headers, "POST", skprivateKeyFile, timeStamp, contentMap);
        log.info("【订单取消】请求结果:" + result);
        JSONObject jsonObject = JSON.parseObject(result);
        String resCode = jsonObject.getString("resCode");
        if (!"000000".equals(resCode)) {
            log.error("【订单取消】失败:" + jsonObject.getString("resMsg"));
            throw new RuntimeException("【订单取消】失败:" + jsonObject.getString("resMsg"));
        }
    }
}
ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/OrderRefundNoticeRequest.java
New file
@@ -0,0 +1,49 @@
package com.stylefeng.guns.modular.system.util.qianyuntong.model;
import lombok.Data;
import java.math.BigDecimal;
@Data
public class OrderRefundNoticeRequest {
    /**
     * 场景标识
     */
    private String scene;
    /**
     * 订单中心订单号
     */
    private String orderId;
    /**
     * 场景应用标识。默认52270015
     */
    private String mhltiCenterAppId;
    /**
     * 退款工单标识
     */
    private String refundPayNum;
    /**
     * 退款类型  1:未发货退款 2:未破损拒收 3:破损拒收 4:部分退款 5:全部退款
     */
    private String refundType;
    /**
     * 申请退款金额
     */
    private BigDecimal applyRefundCharge;
    /**
     * 实际退款金额
     */
    private BigDecimal actualRefundCharge;
    /**
     * 退款人
     */
    private String refundPerson;
    /**
     * 退款账号
     */
    private String refundAccount;
    /**
     * 退款理由
     */
    private String remark;
}
ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/RefundInfoRequest.java
New file
@@ -0,0 +1,19 @@
package com.stylefeng.guns.modular.system.util.qianyuntong.model;
import lombok.Data;
@Data
public class RefundInfoRequest {
    /**
     * 支付交易明细标识
     */
    private String payItemId;
    /**
     * 支付工单标识
     */
    private String payId;
    /**
     * 交易金额,单位分
     */
    private String tradeFee;
}
ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/TradeOrderCancelRequest.java
New file
@@ -0,0 +1,19 @@
package com.stylefeng.guns.modular.system.util.qianyuntong.model;
import lombok.Data;
@Data
public class TradeOrderCancelRequest {
    /**
     * 场景标识
     */
    private String scene;
    /**
     * 订单中心订单号
     */
    private String orderId;
    /**
     * 场景应用标识。默认52270015
     */
    private String mhltiCenterAppId;
}
ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/TradeOrderRefund.java
New file
@@ -0,0 +1,15 @@
package com.stylefeng.guns.modular.system.util.qianyuntong.model;
import lombok.Data;
@Data
public class TradeOrderRefund {
    /**
     * 退款总金额
     */
    private String refundTotalFee;
    /**
     * 退款标识
     */
    private String refundId;
}
ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/TradeOrderRefundRequest.java
New file
@@ -0,0 +1,42 @@
package com.stylefeng.guns.modular.system.util.qianyuntong.model;
import lombok.Data;
import java.util.List;
@Data
public class TradeOrderRefundRequest {
    /**
     * 商户号,由支付中心分配。测试环境5400004,生产环境:5401007
     */
    private String payPartnerId;
    /**
     * 订单中心订单号
     */
    private String partnerPayId;
    /**
     * 支付工单标识
     */
    private String payId;
    /**
     * 退款总金额,单位为分
     * 同一退款单多次发起退款请求时,退款金额必须一致
     */
    private String refundTotalFee;
    /**
     * 退款原因
     */
    private String remark;
    /**
     * 退款类型:
     * RF    退款
     * BR    部分退款(目前仅集团统一支付支持部分退款)
     * CZ    冲正
     */
    private String refundType;
    /**
     * 支付退款单明细集合
     */
    private List<RefundInfoRequest> refundInfos;
}